| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271 | 
							- var fs         = require("fs");
 
- var path       = require("path");
 
- var pluginTmpl     = templateFile("/plugin.tmpl");
 
- var configTmpl     = templateFile("/config.tmpl");
 
- var configItem     = templateFile("/config.item.tmpl");
 
- var inlineTemp     = templateFile("/inline.template.tmpl");
 
- var pluginItemTmpl = fs.readFileSync(path.resolve(__dirname, "../", "templates/plugin.item.tmpl"), "utf-8");
 
- function templateFile (filepath) {
 
-     return fs.readFileSync(path.join(__dirname, "/../templates", filepath || ""), "utf-8");
 
- }
 
- /**
 
-  * @type {{page: Function, markup: Function, client:js: Function, templates: Function}}
 
-  */
 
- module.exports = {
 
-     /**
 
-      * Create the url config for each section of the ui
 
-      * @param hooks
 
-      * @param ui
 
-      */
 
-     "page": function (hooks, ui) {
 
-         var config = hooks
 
-             .map(transformConfig)
 
-             .reduce(createConfigItem, {});
 
-         return {
 
-             /**
 
-              * pagesConfig - This is the angular configuration such as routes
 
-              */
 
-             pagesConfig: configTmpl
 
-                 .replace("%when%", hooks.reduce(
 
-                     createAngularRoutes,
 
-                     ""
 
-                 ))
 
-                 .replace("%pages%", JSON.stringify(
 
-                     config,
 
-                     null,
 
-                     4
 
-                 )),
 
-             /**
 
-              * pagesConfig in object form
 
-              */
 
-             pagesObj: config,
 
-             pageMarkup: function () {
 
-                 return preAngular(ui.pluginManager.plugins, config, ui);
 
-             }
 
-         };
 
-     },
 
-     /**
 
-      * Controller markup for each plugin
 
-      * @param hooks
 
-      * @returns {*}
 
-      */
 
-     "markup": function (hooks) {
 
-         return hooks.reduce(pluginTemplate, "");
 
-     },
 
-     /**
 
-      * @param hooks
 
-      * @param {UI} ui
 
-      * @returns {*|string}
 
-      */
 
-     "client:js": function (hooks, ui) {
 
-         /**
 
-          * Add client JS from Browsersync Plugins
 
-          */
 
-         ui.bsPlugins.forEach(function (plugin) {
 
-             if (plugin.has("client:js")) {
 
-                 plugin.get("client:js").forEach(function (value) {
 
-                     hooks.push(value);
 
-                 });
 
-             }
 
-         });
 
-         var out = hooks.reduce(function (all, item) {
 
-             if (typeof item === "string") {
 
-                 all += ";" + item;
 
-             } else if (Array.isArray(item)) {
 
-                 item.forEach(function (item) {
 
-                     all += ";" + item;
 
-                 });
 
-             }
 
-             return all;
 
-         }, "");
 
-         return out;
 
-     },
 
-     /**
 
-      * @param hooks
 
-      * @param initial
 
-      * @param {UI} ui
 
-      * @returns {String}
 
-      */
 
-     "templates": function (hooks, initial, ui) {
 
-         /**
 
-          * Add templates from each Browsersync registered plugin
 
-          * @type {string}
 
-          */
 
-         var pluginDirectives = ui.bsPlugins.reduce(function (all, plugin) {
 
-             if (!plugin.has("templates")) {
 
-                 return all;
 
-             }
 
-             /**
 
-              * Slugify-ish the plugin name
 
-              *  eg: Test Browsersync Plugin
 
-              *    = test-browsersync-plugin
 
-              * @type {string}
 
-              */
 
-             var slug = plugin.get("name")
 
-                 .trim()
 
-                 .split(" ")
 
-                 .map(function (word) {
 
-                     return word.trim().toLowerCase();
 
-                 })
 
-                 .join("-");
 
-             /**
 
-              * For every plugin that has templates, wrap
 
-              * the markup in the <script type="text/ng-template" id="{{slug}}"></script>
 
-              * markup to result in the single output string.
 
-              */
 
-             plugin.get("templates").forEach(function (value, key) {
 
-                 all +=  angularWrap([slug, path.basename(key)].join("/"), value);
 
-             });
 
-             return all;
 
-         }, "");
 
-         /**
 
-          * Combine the markup from the plugins done above with any
 
-          * others registered via hooks + initial
 
-          * to create the final markup
 
-          */
 
-         return [pluginDirectives, createInlineTemplates(hooks.concat([initial]))].join("");
 
-     },
 
-     /**
 
-      * Allow plugins to register toggle-able elements
 
-      * @param hooks
 
-      * @returns {{}}
 
-      */
 
-     "elements": function (hooks) {
 
-         var obj = {};
 
-         hooks.forEach(function (elements) {
 
-             elements.forEach(function (item) {
 
-                 if (!obj[item.name]) {
 
-                     obj[item.name] = item;
 
-                 }
 
-             });
 
-         });
 
-         return obj;
 
-     }
 
- };
 
- /**
 
-  * @param hooks
 
-  * @returns {String}
 
-  */
 
- function createInlineTemplates (hooks) {
 
-     return hooks.reduce(function (combined, item) {
 
-         return combined + item.reduce(function (all, filepath) {
 
-             return all + angularWrap(
 
-                 path.basename(filepath),
 
-                 fs.readFileSync(filepath));
 
-         }, "");
 
-     }, "");
 
- }
 
- /**
 
-  * @param item
 
-  * @returns {*}
 
-  */
 
- function transformConfig (item) {
 
-     return item;
 
- }
 
- /**
 
-  * @param {String} all
 
-  * @param {Object} item
 
-  * @returns {*}
 
-  */
 
- function createAngularRoutes(all, item) {
 
-     return all + configItem.replace(/%(.+)%/g, function () {
 
-         var key = arguments[1];
 
-         if (item[key]) {
 
-             return item[key];
 
-         }
 
-     });
 
- }
 
- /**
 
-  * @param joined
 
-  * @param item
 
-  * @returns {*}
 
-  */
 
- function createConfigItem (joined, item) {
 
-     if (item.path === "/") {
 
-         joined["overview"] = item;
 
-     } else {
 
-         joined[item.path.slice(1)] = item;
 
-     }
 
-     return joined;
 
- }
 
- /**
 
-  * @returns {*}
 
-  */
 
- function pluginTemplate (combined, item) {
 
-     return [combined, pluginTmpl.replace("%markup%", item)].join("\n");
 
- }
 
- /**
 
-  * @param plugins
 
-  * @param config
 
-  * @returns {*}
 
-  */
 
- function preAngular (plugins, config, ui) {
 
-     return Object.keys(plugins)
 
-         .filter(function (key) {
 
-             return config[key]; // only work on plugins that have pages
 
-         })
 
-         .map(function (key) {
 
-             if (key === "plugins") {
 
-                 var pluginMarkup = ui.bsPlugins.reduce(function (all, item, i) {
 
-                     all += pluginItemTmpl
 
-                         .replace("%content%", item.get("markup") || "")
 
-                         .replace(/%index%/g, i)
 
-                         .replace(/%name%/g, item.get("name"));
 
-                     return all;
 
-                 }, "");
 
-                 plugins[key].hooks.markup = plugins[key].hooks.markup.replace("%pluginlist%", pluginMarkup);
 
-             }
 
-             return angularWrap(config[key].template, bindOnce(plugins[key].hooks.markup, config[key]));
 
-         })
 
-         .reduce(function (combined, item) {
 
-             return combined + item;
 
-         }, "");
 
- }
 
- /**
 
-  * @param templateName
 
-  * @param markup
 
-  * @returns {*}
 
-  */
 
- function angularWrap (templateName, markup) {
 
-     return inlineTemp
 
-         .replace("%content%", markup)
 
-         .replace("%id%", templateName);
 
- }
 
- /**
 
-  * @param markup
 
-  * @param config
 
-  * @returns {*|string}
 
-  */
 
- function bindOnce (markup, config) {
 
-     return markup.toString().replace(/\{\{ctrl.section\.(.+?)\}\}/g, function ($1, $2) {
 
-         return config[$2] || "";
 
-     });
 
- }
 
- module.exports.bindOnce = bindOnce;
 
 
  |