diff --git a/demo/89-template-document.ts b/demo/89-template-document.ts new file mode 100644 index 0000000000..547c77404d --- /dev/null +++ b/demo/89-template-document.ts @@ -0,0 +1,29 @@ +// Patch a document with patches +// Import from 'docx' rather than '../build' if you install from npm +import * as fs from "fs"; +import { IPatch, patchDocument, PatchType, TextRun } from "../build"; + +export const font = "Trebuchet MS"; +export const getPatches = (fields: { [key: string]: string }) => { + const patches: { [key: string]: IPatch } = {}; + + for (const field in fields) { + patches[field] = { + type: PatchType.PARAGRAPH, + children: [new TextRun({ text: fields[field], font })], + }; + } + + return patches; +}; + +const patches = getPatches({ + salutation: "Mr.", + "first-name": "John", +}); + +patchDocument(fs.readFileSync("demo/assets/simple-template-3.docx"), { + patches, +}).then((doc) => { + fs.writeFileSync("My Document.docx", doc); +}); diff --git a/demo/assets/simple-template-3.docx b/demo/assets/simple-template-3.docx new file mode 100644 index 0000000000..8d8fa9aacf Binary files /dev/null and b/demo/assets/simple-template-3.docx differ diff --git a/src/patcher/paragraph-split-inject.spec.ts b/src/patcher/paragraph-split-inject.spec.ts index 5228a88d2d..7b207ba82b 100644 --- a/src/patcher/paragraph-split-inject.spec.ts +++ b/src/patcher/paragraph-split-inject.spec.ts @@ -86,6 +86,59 @@ describe("paragraph-split-inject", () => { ), ).to.throw(); }); + + it("should continue if text run doesn't have text", () => { + expect(() => + findRunElementIndexWithToken( + { + name: "w:p", + type: "element", + elements: [ + { + name: "w:r", + type: "element", + elements: [ + { + name: "w:t", + type: "element", + }, + ], + }, + ], + }, + "hello", + ), + ).to.throw(); + }); + + it("should continue if text run doesn't have text", () => { + expect(() => + findRunElementIndexWithToken( + { + name: "w:p", + type: "element", + elements: [ + { + name: "w:r", + type: "element", + elements: [ + { + name: "w:t", + type: "element", + elements: [ + { + type: "text", + }, + ], + }, + ], + }, + ], + }, + "hello", + ), + ).to.throw(); + }); }); describe("splitRunElement", () => { diff --git a/src/patcher/paragraph-split-inject.ts b/src/patcher/paragraph-split-inject.ts index a32cea407f..d7485e4991 100644 --- a/src/patcher/paragraph-split-inject.ts +++ b/src/patcher/paragraph-split-inject.ts @@ -8,7 +8,11 @@ export const findRunElementIndexWithToken = (paragraphElement: Element, token: s const textElement = (element.elements ?? []).filter((e) => e.type === "element" && e.name === "w:t"); for (const text of textElement) { - if ((text.elements?.[0].text as string)?.includes(token)) { + if (!text.elements?.[0]) { + continue; + } + + if ((text.elements[0].text as string)?.includes(token)) { return i; } }