UNPKG

docxtemplater

Version:

docx and pptx generator working with templates and data (like Mustache, for Word and Powerpoint documents)

279 lines (224 loc) 9.21 kB
"use strict"; function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } var _require = require("./doc-utils.js"), getRightOrNull = _require.getRightOrNull, getRight = _require.getRight, getLeft = _require.getLeft, getLeftOrNull = _require.getLeftOrNull, chunkBy = _require.chunkBy, isTagStart = _require.isTagStart, isTagEnd = _require.isTagEnd, isContent = _require.isContent, last = _require.last, first = _require.first; var _require2 = require("./errors.js"), XTTemplateError = _require2.XTTemplateError, throwExpandNotFound = _require2.throwExpandNotFound, getLoopPositionProducesInvalidXMLError = _require2.getLoopPositionProducesInvalidXMLError; function lastTagIsOpenTag(tags, tag) { if (tags.length === 0) { return false; } var innerLastTag = last(tags).tag.substr(1); var innerCurrentTag = tag.substr(2, tag.length - 3); return innerLastTag.indexOf(innerCurrentTag) === 0; } function addTag(tags, tag) { tags.push({ tag: tag }); return tags; } function getListXmlElements(parts) { /* get the different closing and opening tags between two texts (doesn't take into account tags that are opened then closed (those that are closed then opened are returned)): returns:[{"tag":"</w:r>","offset":13},{"tag":"</w:p>","offset":265},{"tag":"</w:tc>","offset":271},{"tag":"<w:tc>","offset":828},{"tag":"<w:p>","offset":883},{"tag":"<w:r>","offset":1483}] */ var tags = parts.filter(function (part) { return part.type === "tag"; }); var result = []; for (var i = 0, tag; i < tags.length; i++) { tag = tags[i].value; // closing tag if (tag[1] === "/") { if (lastTagIsOpenTag(result, tag)) { result.pop(); } else { result = addTag(result, tag); } } else if (tag[tag.length - 2] !== "/") { result = addTag(result, tag); } } return result; } function has(name, xmlElements) { for (var i = 0; i < xmlElements.length; i++) { var xmlElement = xmlElements[i]; if (xmlElement.tag.indexOf("<".concat(name)) === 0) { return true; } } return false; } function getExpandToDefault(postparsed, pair, expandTags) { var parts = postparsed.slice(pair[0].offset, pair[1].offset); var xmlElements = getListXmlElements(parts); var closingTagCount = xmlElements.filter(function (xmlElement) { return xmlElement.tag[1] === "/"; }).length; var startingTagCount = xmlElements.filter(function (xmlElement) { var tag = xmlElement.tag; return tag[1] !== "/" && tag[tag.length - 2] !== "/"; }).length; if (closingTagCount !== startingTagCount) { return { error: getLoopPositionProducesInvalidXMLError({ tag: first(pair).part.value, offset: [first(pair).part.offset, last(pair).part.offset] }) }; } var _loop = function _loop(i, len) { var _expandTags$i = expandTags[i], contains = _expandTags$i.contains, expand = _expandTags$i.expand, onlyTextInTag = _expandTags$i.onlyTextInTag; if (has(contains, xmlElements)) { if (onlyTextInTag) { var left = getLeftOrNull(postparsed, contains, pair[0].offset); var right = getRightOrNull(postparsed, contains, pair[1].offset); if (left === null || right === null) { return "continue"; } var chunks = chunkBy(postparsed.slice(left, right), function (p) { if (isTagStart(contains, p)) { return "start"; } if (isTagEnd(contains, p)) { return "end"; } return null; }); if (chunks.length <= 2) { return "continue"; } var firstChunk = first(chunks); var lastChunk = last(chunks); var firstContent = firstChunk.filter(isContent); var lastContent = lastChunk.filter(isContent); if (firstContent.length !== 1 || lastContent.length !== 1) { return "continue"; } } return { v: { value: expand } }; } }; for (var i = 0, len = expandTags.length; i < len; i++) { var _ret = _loop(i, len); if (_ret === "continue") continue; if (_typeof(_ret) === "object") return _ret.v; } return false; } function expandOne(part, index, postparsed, options) { var expandTo = part.expandTo || options.expandTo; if (!expandTo) { return postparsed; } var right, left; try { left = getLeft(postparsed, expandTo, index); right = getRight(postparsed, expandTo, index); } catch (rootError) { if (rootError instanceof XTTemplateError) { throwExpandNotFound(_objectSpread({ part: part, rootError: rootError, postparsed: postparsed, expandTo: expandTo, index: index }, options.error)); } throw rootError; } var leftParts = postparsed.slice(left, index); var rightParts = postparsed.slice(index + 1, right + 1); var inner = options.getInner({ postparse: options.postparse, index: index, part: part, leftParts: leftParts, rightParts: rightParts, left: left, right: right, postparsed: postparsed }); if (!inner.length) { inner.expanded = [leftParts, rightParts]; inner = [inner]; } return { left: left, right: right, inner: inner }; } function expandToOne(postparsed, options) { var errors = []; if (postparsed.errors) { errors = postparsed.errors; postparsed = postparsed.postparsed; } var results = []; for (var i = 0, len = postparsed.length; i < len; i++) { var part = postparsed[i]; if (part.type === "placeholder" && part.module === options.moduleName) { try { var result = expandOne(part, i, postparsed, options); i = result.right; results.push(result); } catch (error) { if (error instanceof XTTemplateError) { errors.push(error); } else { throw error; } } } } var newParsed = []; var currentResult = 0; for (var _i = 0, _len = postparsed.length; _i < _len; _i++) { var _part = postparsed[_i]; var _result = results[currentResult]; if (_result && _result.left === _i) { newParsed.push.apply(newParsed, _toConsumableArray(results[currentResult].inner)); currentResult++; _i = _result.right; } else { newParsed.push(_part); } } return { postparsed: newParsed, errors: errors }; } module.exports = { expandToOne: expandToOne, getExpandToDefault: getExpandToDefault };