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