plugins.js 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. 'use strict';
  2. /**
  3. * Plugins engine.
  4. *
  5. * @module plugins
  6. *
  7. * @param {Object} data input data
  8. * @param {Object} info extra information
  9. * @param {Object} plugins plugins object from config
  10. * @return {Object} output data
  11. */
  12. module.exports = function(data, info, plugins) {
  13. plugins.forEach(function(group) {
  14. switch(group[0].type) {
  15. case 'perItem':
  16. data = perItem(data, info, group);
  17. break;
  18. case 'perItemReverse':
  19. data = perItem(data, info, group, true);
  20. break;
  21. case 'full':
  22. data = full(data, info, group);
  23. break;
  24. }
  25. });
  26. return data;
  27. };
  28. /**
  29. * Direct or reverse per-item loop.
  30. *
  31. * @param {Object} data input data
  32. * @param {Object} info extra information
  33. * @param {Array} plugins plugins list to process
  34. * @param {Boolean} [reverse] reverse pass?
  35. * @return {Object} output data
  36. */
  37. function perItem(data, info, plugins, reverse) {
  38. function monkeys(items) {
  39. items.content = items.content.filter(function(item) {
  40. // reverse pass
  41. if (reverse && item.content) {
  42. monkeys(item);
  43. }
  44. // main filter
  45. var filter = true;
  46. for (var i = 0; filter && i < plugins.length; i++) {
  47. var plugin = plugins[i];
  48. if (plugin.active && plugin.fn(item, plugin.params, info) === false) {
  49. filter = false;
  50. }
  51. }
  52. // direct pass
  53. if (!reverse && item.content) {
  54. monkeys(item);
  55. }
  56. return filter;
  57. });
  58. return items;
  59. }
  60. return monkeys(data);
  61. }
  62. /**
  63. * "Full" plugins.
  64. *
  65. * @param {Object} data input data
  66. * @param {Object} info extra information
  67. * @param {Array} plugins plugins list to process
  68. * @return {Object} output data
  69. */
  70. function full(data, info, plugins) {
  71. plugins.forEach(function(plugin) {
  72. if (plugin.active) {
  73. data = plugin.fn(data, plugin.params, info);
  74. }
  75. });
  76. return data;
  77. }