From c3a617fefdc831106374f6def2c350ca55c441d7 Mon Sep 17 00:00:00 2001 From: Dolan Miu Date: Fri, 31 Mar 2023 00:13:36 +0100 Subject: [PATCH 1/3] #2028 - Null check --- demo/89-template-document.ts | 29 ++++++++++++++++++++++++++ demo/assets/simple-template-3.docx | Bin 0 -> 16452 bytes src/patcher/paragraph-split-inject.ts | 4 ++++ 3 files changed, 33 insertions(+) create mode 100644 demo/89-template-document.ts create mode 100644 demo/assets/simple-template-3.docx diff --git a/demo/89-template-document.ts b/demo/89-template-document.ts new file mode 100644 index 0000000000..1220a6a8f6 --- /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 "../src"; + +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 0000000000000000000000000000000000000000..8d8fa9aacfe5700030d91465fa8c7be52e9e29dd GIT binary patch literal 16452 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 e.type === "element" && e.name === "w:t"); for (const text of textElement) { + if (!text.elements?.[0]) { + continue; + } + if ((text.elements?.[0].text as string)?.includes(token)) { return i; } From 10c866bdea248ee839aec7391f9715309a0c7e5b Mon Sep 17 00:00:00 2001 From: Dolan Miu Date: Fri, 31 Mar 2023 17:16:05 +0100 Subject: [PATCH 2/3] Add tests --- src/patcher/paragraph-split-inject.spec.ts | 23 ++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/patcher/paragraph-split-inject.spec.ts b/src/patcher/paragraph-split-inject.spec.ts index 5228a88d2d..c0b8eec459 100644 --- a/src/patcher/paragraph-split-inject.spec.ts +++ b/src/patcher/paragraph-split-inject.spec.ts @@ -86,6 +86,29 @@ describe("paragraph-split-inject", () => { ), ).to.throw(); }); + + it("should continue if text run doesn't have text", () => { + const output = findRunElementIndexWithToken( + { + name: "w:p", + type: "element", + elements: [ + { + name: "w:r", + type: "element", + elements: [ + { + name: "w:t", + type: "element", + }, + ], + }, + ], + }, + "hello", + ); + expect(output).to.deep.equal(0); + }); }); describe("splitRunElement", () => { From 03868107141a422ca41ad242c95d5f7c59dd581f Mon Sep 17 00:00:00 2001 From: Dolan Miu Date: Tue, 4 Apr 2023 22:21:01 +0100 Subject: [PATCH 3/3] Write tests and simplify logic --- demo/89-template-document.ts | 2 +- src/patcher/paragraph-split-inject.spec.ts | 70 +++++++++++++++------- src/patcher/paragraph-split-inject.ts | 2 +- 3 files changed, 52 insertions(+), 22 deletions(-) diff --git a/demo/89-template-document.ts b/demo/89-template-document.ts index 1220a6a8f6..547c77404d 100644 --- a/demo/89-template-document.ts +++ b/demo/89-template-document.ts @@ -1,7 +1,7 @@ // 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 "../src"; +import { IPatch, patchDocument, PatchType, TextRun } from "../build"; export const font = "Trebuchet MS"; export const getPatches = (fields: { [key: string]: string }) => { diff --git a/src/patcher/paragraph-split-inject.spec.ts b/src/patcher/paragraph-split-inject.spec.ts index c0b8eec459..7b207ba82b 100644 --- a/src/patcher/paragraph-split-inject.spec.ts +++ b/src/patcher/paragraph-split-inject.spec.ts @@ -88,26 +88,56 @@ describe("paragraph-split-inject", () => { }); it("should continue if text run doesn't have text", () => { - const output = findRunElementIndexWithToken( - { - name: "w:p", - type: "element", - elements: [ - { - name: "w:r", - type: "element", - elements: [ - { - name: "w:t", - type: "element", - }, - ], - }, - ], - }, - "hello", - ); - expect(output).to.deep.equal(0); + 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(); }); }); diff --git a/src/patcher/paragraph-split-inject.ts b/src/patcher/paragraph-split-inject.ts index 3cb3a9705d..d7485e4991 100644 --- a/src/patcher/paragraph-split-inject.ts +++ b/src/patcher/paragraph-split-inject.ts @@ -12,7 +12,7 @@ export const findRunElementIndexWithToken = (paragraphElement: Element, token: s continue; } - if ((text.elements?.[0].text as string)?.includes(token)) { + if ((text.elements[0].text as string)?.includes(token)) { return i; } }