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.
67 lines
1.6 KiB
67 lines
1.6 KiB
4 weeks ago
|
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();
|
||
|
};
|
||
|
};
|