Spaces:
Configuration error
Configuration error
; | |
const index = require('../tokenizer/index.cjs'); | |
const sourceMap = require('./sourceMap.cjs'); | |
const tokenBefore = require('./token-before.cjs'); | |
const types = require('../tokenizer/types.cjs'); | |
const REVERSESOLIDUS = 0x005c; // U+005C REVERSE SOLIDUS (\) | |
function processChildren(node, delimeter) { | |
if (typeof delimeter === 'function') { | |
let prev = null; | |
node.children.forEach(node => { | |
if (prev !== null) { | |
delimeter.call(this, prev); | |
} | |
this.node(node); | |
prev = node; | |
}); | |
return; | |
} | |
node.children.forEach(this.node, this); | |
} | |
function processChunk(chunk) { | |
index.tokenize(chunk, (type, start, end) => { | |
this.token(type, chunk.slice(start, end)); | |
}); | |
} | |
function createGenerator(config) { | |
const types$1 = new Map(); | |
for (let name in config.node) { | |
const item = config.node[name]; | |
const fn = item.generate || item; | |
if (typeof fn === 'function') { | |
types$1.set(name, item.generate || item); | |
} | |
} | |
return function(node, options) { | |
let buffer = ''; | |
let prevCode = 0; | |
let handlers = { | |
node(node) { | |
if (types$1.has(node.type)) { | |
types$1.get(node.type).call(publicApi, node); | |
} else { | |
throw new Error('Unknown node type: ' + node.type); | |
} | |
}, | |
tokenBefore: tokenBefore.safe, | |
token(type, value) { | |
prevCode = this.tokenBefore(prevCode, type, value); | |
this.emit(value, type, false); | |
if (type === types.Delim && value.charCodeAt(0) === REVERSESOLIDUS) { | |
this.emit('\n', types.WhiteSpace, true); | |
} | |
}, | |
emit(value) { | |
buffer += value; | |
}, | |
result() { | |
return buffer; | |
} | |
}; | |
if (options) { | |
if (typeof options.decorator === 'function') { | |
handlers = options.decorator(handlers); | |
} | |
if (options.sourceMap) { | |
handlers = sourceMap.generateSourceMap(handlers); | |
} | |
if (options.mode in tokenBefore) { | |
handlers.tokenBefore = tokenBefore[options.mode]; | |
} | |
} | |
const publicApi = { | |
node: (node) => handlers.node(node), | |
children: processChildren, | |
token: (type, value) => handlers.token(type, value), | |
tokenize: processChunk | |
}; | |
handlers.node(node); | |
return handlers.result(); | |
}; | |
} | |
exports.createGenerator = createGenerator; | |