2025-10-01 19:55:38 +02:00

106 lines
4.3 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var reportUtils_1 = require("./reportUtils");
// In-place
// In case of split commands (or even split delimiters), joins all the pieces
// at the starting node
var preprocessTemplate = function (template, delimiter) {
var node = template;
var fCmd = false;
var openNode = null;
var idxDelimiter = 0;
var placeholderCmd = "".concat(delimiter[0], "CMD_NODE").concat(delimiter[1]);
while (node != null) {
// Add `xml:space` attr `preserve` to `w:t` tags
if (!node._fTextNode && node._tag === 'w:t') {
node._attrs['xml:space'] = 'preserve';
}
// Add a space if we reach a new `w:p` tag and there's an open node (hence, in a command)
if (!node._fTextNode && node._tag === 'w:p' && openNode) {
openNode._text += ' ';
}
// Process text nodes inside `w:t` tags
if (node._fTextNode &&
node._parent &&
!node._parent._fTextNode &&
node._parent._tag === 'w:t') {
if (openNode == null)
openNode = node;
var textIn = node._text;
node._text = '';
for (var i = 0; i < textIn.length; i++) {
var c = textIn[i];
// What's the current expected delimiter
var currentDelimiter = fCmd ? delimiter[1] : delimiter[0];
// Matches the expected delimiter character
if (c === currentDelimiter[idxDelimiter]) {
idxDelimiter += 1;
// Finished matching delimiter? Then toggle `fCmd`,
// add a new `w:t` + text node (either before or after the delimiter),
// depending on the case
if (idxDelimiter === currentDelimiter.length) {
fCmd = !fCmd;
var fNodesMatch = node === openNode;
if (fCmd && openNode._text.length) {
openNode = (0, reportUtils_1.insertTextSiblingAfter)(openNode);
if (fNodesMatch)
node = openNode;
}
openNode._text += currentDelimiter;
if (!fCmd && i < textIn.length - 1) {
openNode = (0, reportUtils_1.insertTextSiblingAfter)(openNode);
if (fNodesMatch)
node = openNode;
}
idxDelimiter = 0;
if (!fCmd)
openNode = node; // may switch open node to the current one
}
// Doesn't match the delimiter, but we had some partial match
}
else if (idxDelimiter) {
openNode._text += currentDelimiter.slice(0, idxDelimiter);
idxDelimiter = 0;
if (!fCmd)
openNode = node;
openNode._text += c;
// General case
}
else {
openNode._text += c;
}
}
// Close the text node if nothing's pending
if (!fCmd && !idxDelimiter)
openNode = null;
// If text was present but not any more, add a placeholder, so that this node
// will be purged during report generation
if (textIn.length && !node._text.length)
node._text = placeholderCmd;
}
// Find next node to process
if (node._children.length)
node = node._children[0];
else {
var fFound = false;
while (node._parent != null) {
var nodeParent = node._parent;
var nextSibling = (0, reportUtils_1.getNextSibling)(node);
if (nextSibling) {
fFound = true;
node = nextSibling;
break;
}
node = nodeParent;
}
if (!fFound)
node = null;
}
}
return template;
};
// ==========================================
// Public API
// ==========================================
exports.default = preprocessTemplate;