| var sourceMap = require('./sourceMap'); |
| var hasOwnProperty = Object.prototype.hasOwnProperty; |
| |
| function processChildren(node, delimeter) { |
| var list = node.children; |
| var prev = null; |
| |
| if (typeof delimeter !== 'function') { |
| list.forEach(this.node, this); |
| } else { |
| list.forEach(function(node) { |
| if (prev !== null) { |
| delimeter.call(this, prev); |
| } |
| |
| this.node(node); |
| prev = node; |
| }, this); |
| } |
| } |
| |
| module.exports = function createGenerator(config) { |
| function processNode(node) { |
| if (hasOwnProperty.call(types, node.type)) { |
| types[node.type].call(this, node); |
| } else { |
| throw new Error('Unknown node type: ' + node.type); |
| } |
| } |
| |
| var types = {}; |
| |
| if (config.node) { |
| for (var name in config.node) { |
| types[name] = config.node[name].generate; |
| } |
| } |
| |
| return function(node, options) { |
| var buffer = ''; |
| var handlers = { |
| children: processChildren, |
| node: processNode, |
| chunk: function(chunk) { |
| buffer += chunk; |
| }, |
| result: function() { |
| return buffer; |
| } |
| }; |
| |
| if (options) { |
| if (typeof options.decorator === 'function') { |
| handlers = options.decorator(handlers); |
| } |
| |
| if (options.sourceMap) { |
| handlers = sourceMap(handlers); |
| } |
| } |
| |
| handlers.node(node); |
| |
| return handlers.result(); |
| }; |
| }; |