UNPKG

boneyard

Version:

Architectural Toolkit for Web Development

146 lines (131 loc) 3.74 kB
/** * Build HTML Utils * @author Patricio Ferreira <3dimentionar@gmail.com> **/ var fs = require('fs'), path = require('path'), resolve = path.resolve, join = path.join; // Project specific libs var Logger = require('./logger'), Utils = require('./util'); // Third-party libs var _ = require('underscore'); var HTML = { /** * Base Path * @public * @property basePath * @type String **/ basePath: resolve(__dirname, '../../'), /** * AMD template for exporting HTML templates * @public * @property exportTpl * @type String **/ exportTpl: "define(['core/boneyard'], function(Boneyard) { " + "return Boneyard.namespace('templates', <%= tpls %>); });", /** * Initialize HTML Util * @public * @method init * @param cfg {Object} templates config * @return HTML **/ init: function(cfg) { if(!cfg || !_.isObject(cfg) || _.isEmpty(cfg)) return this; return this.setup(cfg); }, /** * Validates Template Config params * @public * @method validate * @param tpl {Object} template params * @return Boolean **/ validate: function(tpl) { return (tpl.src && tpl.target && tpl.src !== '' && tpl.target !== ''); }, /** * Setup Resolved Paths * @public * @method setup * @param cfg {Object} templates Config **/ setup: function(cfg) { _.each(cfg, function(tpl, name) { if(this.validate(tpl)) { var src = resolve(this.basePath, tpl.src), target = resolve(this.basePath, tpl.target), out = {}; this.process({ out: out, name: name, src: src, target: target }); } }, this); return this; }, /** * Get Package namespace Name * @public * @method getPackages * @param cfg {Object} template setup * @param filename {String} full path to filename * @return String **/ getNamespace: function(cfg, filename) { var paths = filename.split(cfg.src); var ns = (paths.length > 1) ? paths[1].split('/') : null, path = (ns && ns.length > 0) ? _.compact(ns).join('.') : null; return (path) ? path.substring(0, path.lastIndexOf('.html')) : null; }, /** * Build a object structure from a String path (dot notation) and assign the content of tpl * to the last object in the namespace chain * @public * @method namespace * @param path {String} path in dot notation format * @param tpl {String} template buffer to be assigned * @return Object **/ namespace: function(output, path, tpl) { var parts = path.split('.'), parent = output; for (var i = 0, pl = parts.length; i < pl; i++) { if (typeof parent[parts[i]] == 'undefined') parent[parts[i]] = {}; if(i == (pl-1)) parent[parts[i]] = tpl; parent = parent[parts[i]]; } return parent; }, /** * Process * @public * @method setup * @param cfg {Object} template setup **/ process: function(cfg) { cfg.out[cfg.name] = {}; var files = Utils.findFiles(cfg.src + '/**/*.html', {}); if(files.length === 0) Logger.warn('[HTML-BUILD] No HTML template files found. Skipping...', { nl: true }); _.each(files, function(f, n) { var ns = this.getNamespace(cfg, f), input = fs.readFileSync(f, 'utf8'); if(ns) this.namespace(cfg.out[cfg.name], ns, input); }, this); return this.export(cfg); }, /** * Export HTML Templates into the target folder * @public * @method export * @param cfg {Object} template setup * @return HTML **/ export: function(cfg) { if(!_.isEmpty(cfg.out[cfg.name])) { Logger.debug('[HTML-BUILD] Exporting Template [' + cfg.name + '] from [' + cfg.src + '] to [' + cfg.target + ']', { nl: true }); var out = _.template(this.exportTpl, { tpls: JSON.stringify(cfg.out, null, '\t') }); Utils.createDir(cfg.target, 'templates'); Utils.createFile(resolve(cfg.target, 'templates', (cfg.name + '.js')), out); } return this; } }; module.exports = HTML;