docxtemplater/es6/inspect-module.js
2021-09-04 10:15:02 +05:00

110 lines
3.1 KiB
JavaScript

const { merge, cloneDeep } = require("lodash");
function isPlaceholder(part) {
return part.type === "placeholder";
}
function getTags(postParsed) {
return postParsed.filter(isPlaceholder).reduce(function (tags, part) {
tags[part.value] = tags[part.value] || {};
if (part.subparsed) {
tags[part.value] = merge(tags[part.value], getTags(part.subparsed));
}
return tags;
}, {});
}
function getStructuredTags(postParsed) {
return postParsed.filter(isPlaceholder).map(function (part) {
if (part.subparsed) {
part.subparsed = getStructuredTags(part.subparsed);
}
return part;
}, {});
}
class InspectModule {
constructor() {
this.inspect = {};
this.fullInspected = {};
this.filePath = null;
this.nullValues = [];
}
optionsTransformer(options, docxtemplater) {
this.fileTypeConfig = docxtemplater.fileTypeConfig;
this.zip = docxtemplater.zip;
this.targets = docxtemplater.targets;
this.templatedFiles = docxtemplater.getTemplatedFiles();
this.fileType = docxtemplater.fileType;
return options;
}
on(eventName) {
if (eventName === "attached") {
this.attached = false;
this.inspect = {};
this.fullInspected = {};
this.filePath = null;
this.nullValues = [];
}
}
// eslint-disable-next-line complexity
set(obj) {
if (obj.data) {
this.inspect.tags = obj.data;
}
if (obj.inspect) {
if (obj.inspect.filePath) {
this.filePath = obj.inspect.filePath;
this.inspect = this.fullInspected[this.filePath] || {};
} else if (obj.inspect.content) {
this.inspect.content = obj.inspect.content;
} else if (obj.inspect.postparsed) {
this.inspect.postparsed = cloneDeep(obj.inspect.postparsed);
} else if (obj.inspect.parsed) {
this.inspect.parsed = cloneDeep(obj.inspect.parsed);
} else if (obj.inspect.lexed) {
this.inspect.lexed = cloneDeep(obj.inspect.lexed);
} else if (obj.inspect.xmllexed) {
this.inspect.xmllexed = cloneDeep(obj.inspect.xmllexed);
} else if (obj.inspect.resolved) {
this.inspect.resolved = obj.inspect.resolved;
}
this.fullInspected[this.filePath] = this.inspect;
}
}
nullGetter(part, scopeManager, xt) {
const inspected = this.fullInspected[xt.filePath];
inspected.nullValues = inspected.nullValues || { summary: [], detail: [] };
inspected.nullValues.detail.push({ part, scopeManager });
inspected.nullValues.summary.push(
scopeManager.scopePath.concat(part.value)
);
}
getTags(file) {
file = file || this.fileTypeConfig.textPath(this);
return getTags(cloneDeep(this.fullInspected[file].postparsed));
}
getAllTags() {
return Object.keys(this.fullInspected).reduce((result, file) => {
return merge(result, this.getTags(file));
}, {});
}
getStructuredTags(file) {
file = file || this.fileTypeConfig.textPath(this);
return getStructuredTags(cloneDeep(this.fullInspected[file].postparsed));
}
getAllStructuredTags() {
return Object.keys(this.fullInspected).reduce((result, file) => {
return result.concat(this.getStructuredTags(file));
}, []);
}
getFileType() {
return this.fileType;
}
getTemplatedFiles() {
return this.templatedFiles;
}
}
module.exports = () => new InspectModule();