plugins.js 1.9 KB

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