110 lines
3.1 KiB
JavaScript
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();
|