Files
docx-js/src/patcher/traverser.spec.ts
Dolan 13cf3eee5a Feature/multiple patch document exports (#2497)
* Turn patch document into options object

Add outputType to options

* Set keep styles to true by default

* Simplify method

* Rename variable

* #2267 Multiple patches of same key

* Remove path which won't be visited
2023-12-31 23:16:48 +00:00

732 lines
39 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { describe, expect, it } from "vitest";
import { findLocationOfText } from "./traverser";
const MOCK_JSON = {
elements: [
{
type: "element",
name: "w:document",
attributes: {
"xmlns:wpc": "http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas",
"xmlns:cx": "http://schemas.microsoft.com/office/drawing/2014/chartex",
"xmlns:cx1": "http://schemas.microsoft.com/office/drawing/2015/9/8/chartex",
"xmlns:cx2": "http://schemas.microsoft.com/office/drawing/2015/10/21/chartex",
"xmlns:cx3": "http://schemas.microsoft.com/office/drawing/2016/5/9/chartex",
"xmlns:cx4": "http://schemas.microsoft.com/office/drawing/2016/5/10/chartex",
"xmlns:cx5": "http://schemas.microsoft.com/office/drawing/2016/5/11/chartex",
"xmlns:cx6": "http://schemas.microsoft.com/office/drawing/2016/5/12/chartex",
"xmlns:cx7": "http://schemas.microsoft.com/office/drawing/2016/5/13/chartex",
"xmlns:cx8": "http://schemas.microsoft.com/office/drawing/2016/5/14/chartex",
"xmlns:mc": "http://schemas.openxmlformats.org/markup-compatibility/2006",
"xmlns:aink": "http://schemas.microsoft.com/office/drawing/2016/ink",
"xmlns:am3d": "http://schemas.microsoft.com/office/drawing/2017/model3d",
"xmlns:o": "urn:schemas-microsoft-com:office:office",
"xmlns:oel": "http://schemas.microsoft.com/office/2019/extlst",
"xmlns:r": "http://schemas.openxmlformats.org/officeDocument/2006/relationships",
"xmlns:m": "http://schemas.openxmlformats.org/officeDocument/2006/math",
"xmlns:v": "urn:schemas-microsoft-com:vml",
"xmlns:wp14": "http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing",
"xmlns:wp": "http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing",
"xmlns:w10": "urn:schemas-microsoft-com:office:word",
"xmlns:w": "http://schemas.openxmlformats.org/wordprocessingml/2006/main",
"xmlns:w14": "http://schemas.microsoft.com/office/word/2010/wordml",
"xmlns:w15": "http://schemas.microsoft.com/office/word/2012/wordml",
"xmlns:w16cex": "http://schemas.microsoft.com/office/word/2018/wordml/cex",
"xmlns:w16cid": "http://schemas.microsoft.com/office/word/2016/wordml/cid",
"xmlns:w16": "http://schemas.microsoft.com/office/word/2018/wordml",
"xmlns:w16sdtdh": "http://schemas.microsoft.com/office/word/2020/wordml/sdtdatahash",
"xmlns:w16se": "http://schemas.microsoft.com/office/word/2015/wordml/symex",
"xmlns:wpg": "http://schemas.microsoft.com/office/word/2010/wordprocessingGroup",
"xmlns:wpi": "http://schemas.microsoft.com/office/word/2010/wordprocessingInk",
"xmlns:wne": "http://schemas.microsoft.com/office/word/2006/wordml",
"xmlns:wps": "http://schemas.microsoft.com/office/word/2010/wordprocessingShape",
},
elements: [
{
type: "element",
name: "w:body",
elements: [
{
type: "element",
name: "w:p",
attributes: {
"w14:paraId": "2499FE9F",
"w14:textId": "0A3D130F",
"w:rsidR": "00B51233",
"w:rsidRDefault": "007B52ED",
"w:rsidP": "007B52ED",
},
elements: [
{
type: "element",
name: "w:pPr",
elements: [{ type: "element", name: "w:pStyle", attributes: { "w:val": "Title" } }],
},
{
type: "element",
name: "w:r",
elements: [{ type: "element", name: "w:t", elements: [{ type: "text", text: "Hello World" }] }],
},
],
},
{
type: "element",
name: "w:p",
attributes: {
"w14:paraId": "6410D9A0",
"w14:textId": "7579AB49",
"w:rsidR": "007B52ED",
"w:rsidRDefault": "007B52ED",
},
},
{
type: "element",
name: "w:p",
attributes: {
"w14:paraId": "57ACF964",
"w14:textId": "315D7A05",
"w:rsidR": "007B52ED",
"w:rsidRDefault": "007B52ED",
},
elements: [
{
type: "element",
name: "w:r",
elements: [{ type: "element", name: "w:t", elements: [{ type: "text", text: "Hello {{name}}," }] }],
},
{
type: "element",
name: "w:r",
attributes: { "w:rsidR": "008126CB" },
elements: [
{
type: "element",
name: "w:t",
attributes: { "xml:space": "preserve" },
elements: [{ type: "text", text: " how are you?" }],
},
],
},
],
},
{
type: "element",
name: "w:p",
attributes: {
"w14:paraId": "38C7DF4A",
"w14:textId": "66CDEC9A",
"w:rsidR": "007B52ED",
"w:rsidRDefault": "007B52ED",
},
},
{
type: "element",
name: "w:p",
attributes: {
"w14:paraId": "04FABE2B",
"w14:textId": "3DACA001",
"w:rsidR": "007B52ED",
"w:rsidRDefault": "007B52ED",
},
elements: [
{
type: "element",
name: "w:r",
elements: [
{ type: "element", name: "w:t", elements: [{ type: "text", text: "{{paragraph_replace}}" }] },
],
},
],
},
{
type: "element",
name: "w:p",
elements: [
{
type: "element",
name: "w:r",
elements: [
{
type: "element",
name: "w:rPr",
elements: [{ type: "element", name: "w:b", attributes: { "w:val": "1" } }],
},
{
type: "element",
name: "w:t",
elements: [{ type: "text", text: "What a {{bold}} text!" }],
},
],
},
],
},
{
type: "element",
name: "w:p",
attributes: {
"w14:paraId": "7AD7975D",
"w14:textId": "77777777",
"w:rsidR": "00EF161F",
"w:rsidRDefault": "00EF161F",
},
},
{
type: "element",
name: "w:p",
attributes: {
"w14:paraId": "3BD6D75A",
"w14:textId": "19AE3121",
"w:rsidR": "00EF161F",
"w:rsidRDefault": "00EF161F",
},
elements: [
{
type: "element",
name: "w:r",
elements: [{ type: "element", name: "w:t", elements: [{ type: "text", text: "{{table}}" }] }],
},
],
},
{
type: "element",
name: "w:p",
attributes: {
"w14:paraId": "76023962",
"w14:textId": "4E606AB9",
"w:rsidR": "007B52ED",
"w:rsidRDefault": "007B52ED",
},
},
{
type: "element",
name: "w:tbl",
elements: [
{
type: "element",
name: "w:tblPr",
elements: [
{ type: "element", name: "w:tblStyle", attributes: { "w:val": "TableGrid" } },
{ type: "element", name: "w:tblW", attributes: { "w:w": "0", "w:type": "auto" } },
{
type: "element",
name: "w:tblLook",
attributes: {
"w:val": "04A0",
"w:firstRow": "1",
"w:lastRow": "0",
"w:firstColumn": "1",
"w:lastColumn": "0",
"w:noHBand": "0",
"w:noVBand": "1",
},
},
],
},
{
type: "element",
name: "w:tblGrid",
elements: [
{ type: "element", name: "w:gridCol", attributes: { "w:w": "3003" } },
{ type: "element", name: "w:gridCol", attributes: { "w:w": "3003" } },
{ type: "element", name: "w:gridCol", attributes: { "w:w": "3004" } },
],
},
{
type: "element",
name: "w:tr",
attributes: {
"w:rsidR": "00EF161F",
"w14:paraId": "1DEC5955",
"w14:textId": "77777777",
"w:rsidTr": "00EF161F",
},
elements: [
{
type: "element",
name: "w:tc",
elements: [
{
type: "element",
name: "w:tcPr",
elements: [
{ type: "element", name: "w:tcW", attributes: { "w:w": "3003", "w:type": "dxa" } },
],
},
{
type: "element",
name: "w:p",
attributes: {
"w14:paraId": "54DA5587",
"w14:textId": "625BAC60",
"w:rsidR": "00EF161F",
"w:rsidRDefault": "00EF161F",
},
elements: [
{
type: "element",
name: "w:r",
elements: [
{
type: "element",
name: "w:t",
elements: [{ type: "text", text: "{{table_heading_1}}" }],
},
],
},
],
},
],
},
{
type: "element",
name: "w:tc",
elements: [
{
type: "element",
name: "w:tcPr",
elements: [
{ type: "element", name: "w:tcW", attributes: { "w:w": "3003", "w:type": "dxa" } },
],
},
{
type: "element",
name: "w:p",
attributes: {
"w14:paraId": "57100910",
"w14:textId": "71FD5616",
"w:rsidR": "00EF161F",
"w:rsidRDefault": "00EF161F",
},
},
],
},
{
type: "element",
name: "w:tc",
elements: [
{
type: "element",
name: "w:tcPr",
elements: [
{ type: "element", name: "w:tcW", attributes: { "w:w": "3004", "w:type": "dxa" } },
],
},
{
type: "element",
name: "w:p",
attributes: {
"w14:paraId": "1D388FAB",
"w14:textId": "77777777",
"w:rsidR": "00EF161F",
"w:rsidRDefault": "00EF161F",
},
},
],
},
],
},
{
type: "element",
name: "w:tr",
attributes: {
"w:rsidR": "00EF161F",
"w14:paraId": "0F53D2DC",
"w14:textId": "77777777",
"w:rsidTr": "00EF161F",
},
elements: [
{
type: "element",
name: "w:tc",
elements: [
{
type: "element",
name: "w:tcPr",
elements: [
{ type: "element", name: "w:tcW", attributes: { "w:w": "3003", "w:type": "dxa" } },
],
},
{
type: "element",
name: "w:p",
attributes: {
"w14:paraId": "0F2BCCED",
"w14:textId": "3C3B6706",
"w:rsidR": "00EF161F",
"w:rsidRDefault": "00EF161F",
},
elements: [
{
type: "element",
name: "w:r",
elements: [
{
type: "element",
name: "w:t",
elements: [{ type: "text", text: "Item: {{item_1}}" }],
},
],
},
],
},
],
},
{
type: "element",
name: "w:tc",
elements: [
{
type: "element",
name: "w:tcPr",
elements: [
{ type: "element", name: "w:tcW", attributes: { "w:w": "3003", "w:type": "dxa" } },
],
},
{
type: "element",
name: "w:p",
attributes: {
"w14:paraId": "1E6158AC",
"w14:textId": "77777777",
"w:rsidR": "00EF161F",
"w:rsidRDefault": "00EF161F",
},
},
],
},
{
type: "element",
name: "w:tc",
elements: [
{
type: "element",
name: "w:tcPr",
elements: [
{ type: "element", name: "w:tcW", attributes: { "w:w": "3004", "w:type": "dxa" } },
],
},
{
type: "element",
name: "w:p",
attributes: {
"w14:paraId": "17937748",
"w14:textId": "77777777",
"w:rsidR": "00EF161F",
"w:rsidRDefault": "00EF161F",
},
},
],
},
],
},
{
type: "element",
name: "w:tr",
attributes: {
"w:rsidR": "00EF161F",
"w14:paraId": "781DAC1A",
"w14:textId": "77777777",
"w:rsidTr": "00EF161F",
},
elements: [
{
type: "element",
name: "w:tc",
elements: [
{
type: "element",
name: "w:tcPr",
elements: [
{ type: "element", name: "w:tcW", attributes: { "w:w": "3003", "w:type": "dxa" } },
],
},
{
type: "element",
name: "w:p",
attributes: {
"w14:paraId": "1DCD0343",
"w14:textId": "77777777",
"w:rsidR": "00EF161F",
"w:rsidRDefault": "00EF161F",
},
},
],
},
{
type: "element",
name: "w:tc",
elements: [
{
type: "element",
name: "w:tcPr",
elements: [
{ type: "element", name: "w:tcW", attributes: { "w:w": "3003", "w:type": "dxa" } },
],
},
{
type: "element",
name: "w:p",
attributes: {
"w14:paraId": "5D02E3CD",
"w14:textId": "77777777",
"w:rsidR": "00EF161F",
"w:rsidRDefault": "00EF161F",
},
},
],
},
{
type: "element",
name: "w:tc",
elements: [
{
type: "element",
name: "w:tcPr",
elements: [
{ type: "element", name: "w:tcW", attributes: { "w:w": "3004", "w:type": "dxa" } },
],
},
{
type: "element",
name: "w:p",
attributes: {
"w14:paraId": "52EA0DBB",
"w14:textId": "77777777",
"w:rsidR": "00EF161F",
"w:rsidRDefault": "00EF161F",
},
},
],
},
],
},
],
},
{
type: "element",
name: "w:p",
attributes: {
"w14:paraId": "47CD1FBC",
"w14:textId": "23474CBC",
"w:rsidR": "007B52ED",
"w:rsidRDefault": "007B52ED",
},
},
{
type: "element",
name: "w:p",
attributes: {
"w14:paraId": "0ACCEE90",
"w14:textId": "67907499",
"w:rsidR": "00EF161F",
"w:rsidRDefault": "0077578F",
},
elements: [
{
type: "element",
name: "w:r",
elements: [{ type: "element", name: "w:t", elements: [{ type: "text", text: "{{image_test}}" }] }],
},
],
},
{
type: "element",
name: "w:p",
attributes: {
"w14:paraId": "23FA9862",
"w14:textId": "77777777",
"w:rsidR": "0077578F",
"w:rsidRDefault": "0077578F",
},
},
{
type: "element",
name: "w:p",
attributes: {
"w14:paraId": "01578F2F",
"w14:textId": "3BDC6C85",
"w:rsidR": "007B52ED",
"w:rsidRDefault": "007B52ED",
},
elements: [
{
type: "element",
name: "w:r",
elements: [{ type: "element", name: "w:t", elements: [{ type: "text", text: "Thank you" }] }],
},
],
},
{
type: "element",
name: "w:p",
attributes: {
"w14:paraId": "3BE1A671",
"w14:textId": "74E856C4",
"w:rsidR": "000D38A7",
"w:rsidRDefault": "000D38A7",
},
elements: [
{
type: "element",
name: "w:pPr",
elements: [{ type: "element", name: "w:pStyle", attributes: { "w:val": "Header" } }],
},
{
type: "element",
name: "w:r",
elements: [{ type: "element", name: "w:t", elements: [{ type: "text", text: "This is a {{head" }] }],
},
{
type: "element",
name: "w:r",
attributes: { "w:rsidR": "004A3A99" },
elements: [{ type: "element", name: "w:t", elements: [{ type: "text", text: "er" }] }],
},
{
type: "element",
name: "w:r",
elements: [
{
type: "element",
name: "w:t",
elements: [{ type: "text", text: "_adjective}} dont you think?" }],
},
],
},
],
},
{
type: "element",
name: "w:sectPr",
attributes: { "w:rsidR": "007B52ED", "w:rsidSect": "0072043F" },
elements: [
{ type: "element", name: "w:headerReference", attributes: { "w:type": "default", "r:id": "rId6" } },
{ type: "element", name: "w:footerReference", attributes: { "w:type": "default", "r:id": "rId7" } },
{ type: "element", name: "w:pgSz", attributes: { "w:w": "11900", "w:h": "16840" } },
{
type: "element",
name: "w:pgMar",
attributes: {
"w:top": "1440",
"w:right": "1440",
"w:bottom": "1440",
"w:left": "1440",
"w:header": "708",
"w:footer": "708",
"w:gutter": "0",
},
},
{ type: "element", name: "w:cols", attributes: { "w:space": "708" } },
{ type: "element", name: "w:docGrid", attributes: { "w:linePitch": "360" } },
],
},
],
},
],
},
],
};
describe("traverser", () => {
describe("findLocationOfText", () => {
it("should find the location of text", () => {
const output = findLocationOfText(MOCK_JSON, "{{table_heading_1}}");
expect(output).to.deep.equal([
{
index: 1,
pathToParagraph: [0, 0, 0, 9, 2, 0, 1],
runs: [
{
end: 18,
index: 0,
parts: [
{
end: 18,
index: 0,
start: 0,
text: "{{table_heading_1}}",
},
],
start: 0,
text: "{{table_heading_1}}",
},
],
text: "{{table_heading_1}}",
},
]);
});
it("should find the location of text", () => {
const output = findLocationOfText(MOCK_JSON, "{{bold}}");
expect(output).to.deep.equal([
{
text: "What a {{bold}} text!",
runs: [
{
text: "What a {{bold}} text!",
parts: [{ text: "What a {{bold}} text!", index: 1, start: 0, end: 20 }],
index: 0,
start: 0,
end: 20,
},
],
index: 5,
pathToParagraph: [0, 0, 0, 5],
},
]);
});
it("should find the location of text", () => {
const output = findLocationOfText(MOCK_JSON, "{{bold}}");
expect(output).to.deep.equal([
{
text: "What a {{bold}} text!",
runs: [
{
text: "What a {{bold}} text!",
parts: [{ text: "What a {{bold}} text!", index: 1, start: 0, end: 20 }],
index: 0,
start: 0,
end: 20,
},
],
index: 5,
pathToParagraph: [0, 0, 0, 5],
},
]);
});
it("should find the location of text", () => {
const output = findLocationOfText(MOCK_JSON, "{{header_adjective}}");
expect(output).to.deep.equal([
{
text: "This is a {{header_adjective}} dont you think?",
runs: [
{
text: "This is a {{head",
parts: [{ text: "This is a {{head", index: 0, start: 0, end: 15 }],
index: 1,
start: 0,
end: 15,
},
{ text: "er", parts: [{ text: "er", index: 0, start: 16, end: 17 }], index: 2, start: 16, end: 17 },
{
text: "_adjective}} dont you think?",
parts: [{ text: "_adjective}} dont you think?", index: 0, start: 18, end: 46 }],
index: 3,
start: 18,
end: 46,
},
],
index: 14,
pathToParagraph: [0, 0, 0, 14],
},
]);
});
});
});