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();
 | |
|     };
 | |
| };
 |