Simplify handling of internal lineMetadata array (slightly faster now).

This commit is contained in:
David Anson 2019-01-12 16:29:10 -08:00
parent 51a57a07c8
commit b77dd5ccd3

View file

@ -137,28 +137,24 @@ function makeTokenCache(params) {
}
// Initialize line metadata array
// 0x7: inCode
// 0x6: onFence (start)
// 0x2: onFence (end)
// 0x1: code body
// 0x8: inTable
const lineMetadata = new Array(params.lines.length);
lineMetadata.fill(0);
const lineMetadata = params.lines.map(function mapLine(line, index) {
return [ line, index, false, 0, false ];
});
filterTokens(params, "fence", function forToken(token) {
lineMetadata[token.map[0]] = 6;
lineMetadata[token.map[1] - 1] = 2;
lineMetadata[token.map[0]][3] = 1;
lineMetadata[token.map[1] - 1][3] = -1;
for (let i = token.map[0] + 1; i < token.map[1] - 1; i++) {
lineMetadata[i] = 1;
lineMetadata[i][2] = true;
}
});
filterTokens(params, "code_block", function forToken(token) {
for (let i = token.map[0]; i < token.map[1]; i++) {
lineMetadata[i] = 1;
lineMetadata[i][2] = true;
}
});
filterTokens(params, "table_open", function forToken(token) {
for (let i = token.map[0]; i < token.map[1]; i++) {
lineMetadata[i] += 8;
lineMetadata[i][4] = true;
}
});
@ -211,18 +207,9 @@ module.exports.makeTokenCache = makeTokenCache;
// Calls the provided function for each line (with context)
module.exports.forEachLine = function forEachLine(callback) {
// Invoke callback
tokenCache.params.lines.forEach(function forLine(line, lineIndex) {
const metadata = tokenCache.lineMetadata[lineIndex];
const inCode = !!(metadata & 7);
const onFence = (((metadata & 6) >> 1) || 2) - 2;
const inTable = !!(metadata & 8);
callback(
line,
lineIndex,
inCode,
onFence,
inTable);
tokenCache.lineMetadata.forEach(function forMetadata(metadata) {
// Parameters: line, lineIndex, inCode, onFence, inTable
callback.apply(this, metadata);
});
};