You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
74 lines
1.6 KiB
74 lines
1.6 KiB
var utils = require('../utils') |
|
, path = require('path'); |
|
|
|
/** |
|
* Use the given `plugin` |
|
* |
|
* Examples: |
|
* |
|
* use("plugins/add.js") |
|
* |
|
* width add(10, 100) |
|
* // => width: 110 |
|
*/ |
|
|
|
module.exports = 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)); |
|
}; |
|
|
|
/** |
|
* 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(); |
|
} |
|
} |
|
}
|
|
|