actionsfilters.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. module.exports = function create_tool(){
  2. var async = require("async");
  3. var actions = {};
  4. var filters = {};
  5. function add_action(actionname, actionfunction, priority) {
  6. var prio = priority || 10;
  7. actions[actionname] = actions[actionname] || [];
  8. actions[actionname].push([prio, actionfunction]);
  9. actions[actionname].sort(function(a, b) {
  10. return a[0] > b[0] ? 1 : a[0] < b[0] ? -1 : 0;
  11. })
  12. }
  13. var actions_applied = {};
  14. function do_action(actionname) {
  15. actions_applied[actionname] = (actions_applied[actionname] || 0) + 1;
  16. var args = Array.prototype.slice.apply(arguments, [1]);
  17. if (actions[actionname]) {
  18. return actions[actionname].map(function(arr) {
  19. var pri = arr[0];
  20. var func = arr[1];
  21. return func.apply({}, args);
  22. })
  23. }
  24. }
  25. function add_filters(filtername, filterfunction, priority, filterinstancenamed) {
  26. filters[filtername] = filters[filtername] || [];
  27. if (typeof(priority) === "string" && typeof(filterinstancenamed) === "undefined") {
  28. filterinstancenamed = priority;
  29. priority = 10;
  30. }
  31. if (filterinstancenamed) {
  32. var cindex = filters[filtername].length;
  33. filters[filtername].map(function(filter, index) {
  34. if (filter[2] === filterinstancenamed) {
  35. cindex = index;
  36. }
  37. })
  38. filters[filtername][cindex] = [priority || 0, filterfunction, filterinstancenamed];
  39. } else {
  40. var cename = "";
  41. filters[filtername].push([priority || 0, filterfunction, cename]);
  42. }
  43. filters[filtername].sort(function(a, b) {
  44. return a[0] > b[0] ? 1 : a[0] < b[0] ? -1 : 0;
  45. })
  46. }
  47. var filters_applied = {};
  48. function apply_filters(filtername, val) {
  49. var restargs = Array.prototype.slice.call(arguments, 2);
  50. filters_applied[filtername] = (filters_applied[filtername] || 0) + 1;
  51. // var oval = $lib._.clone(val);
  52. //$lib.log("apply_filters", filtername, "M:" + (filters[filtername] || []).length);
  53. if (filters[filtername]) {
  54. var index = 0,
  55. mindex = filters[filtername].length;
  56. while (index < mindex) {
  57. val = filters[filtername][index][1].apply(filters[filtername][index][1], [val].concat(restargs));
  58. index++;
  59. }
  60. }
  61. return val;
  62. }
  63. function apply_filters_map(filtername) {
  64. var restargs = Array.prototype.slice.call(arguments, 1);
  65. var cb = restargs.pop();
  66. var arr = [];
  67. if (typeof(filtername) === "object") {
  68. filtername.map(function(name) {
  69. arr = arr.concat(apply_filters(name, []));
  70. })
  71. } else {
  72. arr = apply_filters(filtername, []);
  73. }
  74. console.log("AAAAAAAAAAAAAAAAAAAAAAAAA", filtername);
  75. console.log("AAAAAAAAAAAAAAAAAAAAAAAAA", arr);
  76. console.log("AAAAAAAAAAAAAAAAAAAAAAAAA", restargs);
  77. async.mapSeries(arr, function(func, next) {
  78. func.apply(func, restargs.concat(next));
  79. }, cb)
  80. }
  81. return {
  82. add_action: add_action,
  83. do_action: do_action,
  84. add_filters: add_filters,
  85. apply_filters: apply_filters,
  86. apply_filters_map: apply_filters_map
  87. };
  88. }