var utils = require('../utils') , path = require('path'); /** * Use the given `plugin` * * Examples: * * use("plugins/add.js") * * width add(10, 100) * // => width: 110 */ function use(plugin, options){ utils.assertString(plugin, 'plugin'); if (options) { utils.assertType(options, 'object', 'options'); options = parseObject(options); } // lookup plugin = plugin.string; var found = utils.lookup(plugin, this.options.paths, this.options.filename); if (!found) throw new Error('failed to locate plugin file "' + plugin + '"'); // use var fn = require(path.resolve(found)); if ('function' != typeof fn) { throw new Error('plugin "' + plugin + '" does not export a function'); } this.renderer.use(fn(options || this.options)); } use.params = ['plugin', 'options']; module.exports = use; /** * Attempt to parse object node to the javascript object. * * @param {Object} obj * @return {Object} * @api private */ function parseObject(obj){ obj = obj.vals; for (var key in obj) { var nodes = obj[key].nodes[0].nodes; if (nodes && nodes.length) { obj[key] = []; for (var i = 0, len = nodes.length; i < len; ++i) { obj[key].push(convert(nodes[i])); } } else { obj[key] = convert(obj[key].first); } } return obj; function convert(node){ switch (node.nodeName) { case 'object': return parseObject(node); case 'boolean': return node.isTrue; case 'unit': return node.type ? node.toString() : +node.val; case 'string': case 'literal': return node.val; default: return node.toString(); } } }