123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- 'use strict';
- /**
- * Plugins engine.
- *
- * @module plugins
- *
- * @param {Object} data input data
- * @param {Object} info extra information
- * @param {Object} plugins plugins object from config
- * @return {Object} output data
- */
- module.exports = function(data, info, plugins) {
- plugins.forEach(function(group) {
- switch(group[0].type) {
- case 'perItem':
- data = perItem(data, info, group);
- break;
- case 'perItemReverse':
- data = perItem(data, info, group, true);
- break;
- case 'full':
- data = full(data, info, group);
- break;
- }
- });
- return data;
- };
- /**
- * Direct or reverse per-item loop.
- *
- * @param {Object} data input data
- * @param {Object} info extra information
- * @param {Array} plugins plugins list to process
- * @param {Boolean} [reverse] reverse pass?
- * @return {Object} output data
- */
- function perItem(data, info, plugins, reverse) {
- function monkeys(items) {
- items.content = items.content.filter(function(item) {
- // reverse pass
- if (reverse && item.content) {
- monkeys(item);
- }
- // main filter
- var filter = true;
- for (var i = 0; filter && i < plugins.length; i++) {
- var plugin = plugins[i];
- if (plugin.active && plugin.fn(item, plugin.params, info) === false) {
- filter = false;
- }
- }
- // direct pass
- if (!reverse && item.content) {
- monkeys(item);
- }
- return filter;
- });
- return items;
- }
- return monkeys(data);
- }
- /**
- * "Full" plugins.
- *
- * @param {Object} data input data
- * @param {Object} info extra information
- * @param {Array} plugins plugins list to process
- * @return {Object} output data
- */
- function full(data, info, plugins) {
- plugins.forEach(function(plugin) {
- if (plugin.active) {
- data = plugin.fn(data, plugin.params, info);
- }
- });
- return data;
- }
|