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.
66 lines
1.6 KiB
66 lines
1.6 KiB
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(); |
|
}; |
|
};
|
|
|