docxtemplater
Version:
.docx generator working with templates and data (like Mustache)
66 lines (61 loc) • 1.67 kB
JavaScript
const DocUtils = require("./doc-utils");
const parser = {
postparse(parsed, modules) {
function getTraits(traitName, parsed) {
return modules.map(function (module) {
return module.getTraits(traitName, parsed);
});
}
function postparse(parsed) {
return modules.reduce(function (parsed, module) {
return module.postparse(parsed, {postparse, getTraits});
}, parsed);
}
return postparse(parsed);
},
parse(lexed, modules) {
function moduleParse(placeHolderContent, parsed) {
let moduleParsed;
for (let i = 0, l = modules.length; i < l; i++) {
const module = modules[i];
moduleParsed = module.parse(placeHolderContent);
if (moduleParsed) {
parsed.push(moduleParsed);
return moduleParsed;
}
}
return null;
}
let inPlaceHolder = false;
let placeHolderContent;
let tailParts = [];
return lexed.reduce(function (parsed, token) {
if (token.type === "delimiter") {
inPlaceHolder = token.position === "start";
if (token.position === "end") {
placeHolderContent = DocUtils.wordToUtf8(placeHolderContent);
if (!moduleParse(placeHolderContent, parsed)) {
parsed.push({type: "placeholder", value: placeHolderContent});
}
Array.prototype.push.apply(parsed, tailParts);
tailParts = [];
return parsed;
}
placeHolderContent = "";
return parsed;
}
if (inPlaceHolder) {
if (token.type === "content" && token.position === "insidetag") {
placeHolderContent += token.value;
}
else {
tailParts.push(token);
}
return parsed;
}
parsed.push(token);
return parsed;
}, []);
},
};
module.exports = parser;