docxtemplater
Version:
docx and pptx generator working with templates and data (like Mustache, for Word and Powerpoint documents)
187 lines (160 loc) • 5.13 kB
JavaScript
"use strict";
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
var wrapper = require("../module-wrapper.js");
var _require = require("../errors.js"),
getScopeCompilationError = _require.getScopeCompilationError;
var _require2 = require("../doc-utils.js"),
utf8ToWord = _require2.utf8ToWord,
hasCorruptCharacters = _require2.hasCorruptCharacters;
var _require3 = require("../errors.js"),
getCorruptCharactersException = _require3.getCorruptCharactersException;
var ftprefix = {
docx: "w",
pptx: "a"
};
var Render = /*#__PURE__*/function () {
function Render() {
_classCallCheck(this, Render);
this.name = "Render";
this.recordRun = false;
this.recordedRun = [];
}
_createClass(Render, [{
key: "set",
value: function set(obj) {
if (obj.compiled) {
this.compiled = obj.compiled;
}
if (obj.data != null) {
this.data = obj.data;
}
}
}, {
key: "getRenderedMap",
value: function getRenderedMap(mapper) {
var _this = this;
return Object.keys(this.compiled).reduce(function (mapper, from) {
mapper[from] = {
from: from,
data: _this.data
};
return mapper;
}, mapper);
}
}, {
key: "optionsTransformer",
value: function optionsTransformer(options, docxtemplater) {
this.parser = docxtemplater.parser;
this.fileType = docxtemplater.fileType;
return options;
}
}, {
key: "postparse",
value: function postparse(postparsed, options) {
var _this2 = this;
var errors = [];
postparsed.forEach(function (p) {
if (p.type === "placeholder") {
var tag = p.value;
try {
options.cachedParsers[p.lIndex] = _this2.parser(tag, {
tag: p
});
} catch (rootError) {
errors.push(getScopeCompilationError({
tag: tag,
rootError: rootError,
offset: p.offset
}));
}
}
});
return {
postparsed: postparsed,
errors: errors
};
}
}, {
key: "recordRuns",
value: function recordRuns(part) {
if (part.tag === "".concat(ftprefix[this.fileType], ":r")) {
this.recordRun = false;
this.recordedRun = [];
} else if (part.tag === "".concat(ftprefix[this.fileType], ":rPr")) {
if (part.position === "start") {
this.recordRun = true;
this.recordedRun = [part.value];
}
if (part.position === "end") {
this.recordedRun.push(part.value);
this.recordRun = false;
}
} else if (this.recordRun) {
this.recordedRun.push(part.value);
}
}
}, {
key: "render",
value: function render(part, _ref) {
var scopeManager = _ref.scopeManager,
linebreaks = _ref.linebreaks,
nullGetter = _ref.nullGetter;
if (linebreaks) {
this.recordRuns(part);
}
if (part.type !== "placeholder" || part.module) {
return;
}
var value;
try {
value = scopeManager.getValue(part.value, {
part: part
});
} catch (e) {
return {
errors: [e]
};
}
if (value == null) {
value = nullGetter(part);
}
if (hasCorruptCharacters(value)) {
return {
errors: [getCorruptCharactersException({
tag: part.value,
value: value,
offset: part.offset
})]
};
}
if (typeof value !== "string") {
value = value.toString();
}
if (linebreaks) {
return this.renderLineBreaks(value);
}
return {
value: utf8ToWord(value)
};
}
}, {
key: "renderLineBreaks",
value: function renderLineBreaks(value) {
var p = ftprefix[this.fileType];
var br = this.fileType === "docx" ? "<w:r><w:br/></w:r>" : "<a:br/>";
var lines = value.split("\n");
var runprops = this.recordedRun.join("");
return {
value: lines.map(function (line) {
return utf8ToWord(line);
}).join("</".concat(p, ":t></").concat(p, ":r>").concat(br, "<").concat(p, ":r>").concat(runprops, "<").concat(p, ":t").concat(this.fileType === "docx" ? ' xml:space="preserve"' : "", ">"))
};
}
}]);
return Render;
}();
module.exports = function () {
return wrapper(new Render());
};