| '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; | 
|   | 
| } |