123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- module.exports = function create_tool() {
- var async = require("async");
- var actions = {};
- var filters = {};
- function add_action(actionname, actionfunction, priority) {
- var prio = priority || 10;
- actions[actionname] = actions[actionname] || [];
- actions[actionname].push([prio, actionfunction]);
- actions[actionname].sort(function(a, b) {
- return a[0] > b[0] ? 1 : a[0] < b[0] ? -1 : 0;
- })
- }
- var actions_applied = {};
- function do_action(actionname) {
- actions_applied[actionname] = (actions_applied[actionname] || 0) + 1;
- var args = Array.prototype.slice.apply(arguments, [1]);
- if (actions[actionname]) {
- return actions[actionname].map(function(arr) {
- var pri = arr[0];
- var func = arr[1];
- return func.apply({}, args);
- })
- }
- }
- function add_filters(filtername, filterfunction, priority, filterinstancenamed) {
- filters[filtername] = filters[filtername] || [];
- if (typeof(priority) === "string" && typeof(filterinstancenamed) === "undefined") {
- filterinstancenamed = priority;
- priority = 10;
- }
- if (filterinstancenamed) {
- var cindex = filters[filtername].length;
- filters[filtername].map(function(filter, index) {
- if (filter[2] === filterinstancenamed) {
- cindex = index;
- }
- })
- filters[filtername][cindex] = [priority || 0, filterfunction, filterinstancenamed];
- } else {
- var cename = "";
- filters[filtername].push([priority || 0, filterfunction, cename]);
- }
- filters[filtername].sort(function(a, b) {
- return a[0] > b[0] ? 1 : a[0] < b[0] ? -1 : 0;
- })
- }
- var filters_applied = {};
- function apply_filters(filtername, val) {
- var restargs = Array.prototype.slice.call(arguments, 2);
- filters_applied[filtername] = (filters_applied[filtername] || 0) + 1;
- // var oval = $lib._.clone(val);
- //$lib.log("apply_filters", filtername, "M:" + (filters[filtername] || []).length);
- if (filters[filtername]) {
- var index = 0,
- mindex = filters[filtername].length;
- while (index < mindex) {
- val = filters[filtername][index][1].apply(filters[filtername][index][1], [val].concat(restargs));
- index++;
- }
- }
- return val;
- }
- function apply_filters_map(filtername) {
- var restargs = Array.prototype.slice.call(arguments, 1);
- var cb = restargs.pop();
- var arr = [];
- if (typeof(filtername) === "object") {
- filtername.map(function(name) {
- arr = arr.concat(apply_filters(name, []));
- })
- } else {
- arr = apply_filters(filtername, []);
- }
- async.mapSeries(arr, function(func, next) {
- func.apply(func, restargs.concat(next));
- }, cb)
- }
- function list_filters_and_actions() {
- return {
- "filters": filters,
- "actions": actions,
- "actions_applied": actions_applied,
- "filters_applied": filters_applied
- }
- }
- return {
- add_action: add_action,
- do_action: do_action,
- add_filters: add_filters,
- apply_filters: apply_filters,
- apply_filters_map: apply_filters_map,
- list_filters_and_actions: list_filters_and_actions
- };
- }
|