67 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			67 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
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();
 | 
						|
    };
 | 
						|
};
 |