From ce485dbc29d39ada9569cd672967bd3756411da5 Mon Sep 17 00:00:00 2001 From: Dolan Miu Date: Sat, 25 Feb 2023 22:18:31 +0000 Subject: [PATCH] Simplify patcher Use map notation --- demo/85-template-document.ts | 28 ++-- demo/86-generate-template.ts | 20 +++ demo/assets/simple-template.docx | Bin 19659 -> 16661 bytes package-lock.json | 212 ------------------------------- src/patcher/from-docx.ts | 13 +- src/patcher/replacer.ts | 47 +++---- 6 files changed, 52 insertions(+), 268 deletions(-) create mode 100644 demo/86-generate-template.ts diff --git a/demo/85-template-document.ts b/demo/85-template-document.ts index b4f674b967..b36e6be4c3 100644 --- a/demo/85-template-document.ts +++ b/demo/85-template-document.ts @@ -1,4 +1,4 @@ -// Simple template example +// Patch a document with patches // Import from 'docx' rather than '../build' if you install from npm import * as fs from "fs"; import { @@ -15,38 +15,32 @@ import { } from "../src"; patchDocument(fs.readFileSync("demo/assets/simple-template.docx"), { - patches: [ - { + patches: { + "name":{ type: PatchType.PARAGRAPH, children: [new TextRun("Sir. "), new TextRun("John Doe"), new TextRun("(The Conqueror)")], - text: "{{ name }}", }, - { + "table_heading_1": { type: PatchType.PARAGRAPH, children: [new TextRun("Heading wow!")], - text: "{{ table_heading_1 }}", }, - { + "item_1": { type: PatchType.PARAGRAPH, children: [new TextRun("#657")], - text: "{{ item_1 }}", }, - { + "paragraph_replace": { type: PatchType.DOCUMENT, children: [new Paragraph("Lorem ipsum paragraph"), new Paragraph("Another paragraph")], - text: "{{ paragraph_replace }}", }, - { + "header_adjective": { type: PatchType.PARAGRAPH, children: [new TextRun("Delightful Header")], - text: "{{ header_adjective }}", }, - { + "footer_text": { type: PatchType.PARAGRAPH, children: [new TextRun("replaced just as well")], - text: "{{ footer_text }}", }, - { + "table": { type: PatchType.DOCUMENT, children: [ new Table({ @@ -108,11 +102,11 @@ patchDocument(fs.readFileSync("demo/assets/simple-template.docx"), { ], }), ], + }), ], - text: "{{ table }}", }, - ], + }, }).then((doc) => { fs.writeFileSync("My Document.docx", doc); }); diff --git a/demo/86-generate-template.ts b/demo/86-generate-template.ts new file mode 100644 index 0000000000..4af0a2dfd8 --- /dev/null +++ b/demo/86-generate-template.ts @@ -0,0 +1,20 @@ +// Generate a template document +// Import from 'docx' rather than '../build' if you install from npm +import * as fs from "fs"; +import { Document, Packer, Paragraph, TextRun } from "../build"; + +const doc = new Document({ + sections: [ + { + children: [ + new Paragraph({ + children: [new TextRun("{{ template }}")], + }), + ], + }, + ], +}); + +Packer.toBuffer(doc).then((buffer) => { + fs.writeFileSync("My Document.docx", buffer); +}); diff --git a/demo/assets/simple-template.docx b/demo/assets/simple-template.docx index dab8b9e7c235bc4aa16db95fd84d816a3422952c..83f972c48acaf56cb49f81a80939785c46e028c8 100644 GIT binary patch delta 7459 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 diff --git a/package-lock.json b/package-lock.json index 2b5728e020..13f3f32f2b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1669,23 +1669,6 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.51.0.tgz", - "integrity": "sha512-gNpxRdlx5qw3yaHA0SFuTjW4rxeYhpHxt491PEcKF8Z6zpq0kMhe0Tolxt0qjlojS+/wArSDlj/LtE69xUJphQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.51.0", - "@typescript-eslint/visitor-keys": "5.51.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/type-utils": { "version": "5.52.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.52.0.tgz", @@ -1826,102 +1809,6 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, - "node_modules/@typescript-eslint/types": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.51.0.tgz", - "integrity": "sha512-SqOn0ANn/v6hFn0kjvLwiDi4AzR++CBZz0NV5AnusT2/3y32jdc0G4woXPWHCumWtUXZKPAS27/9vziSsC9jnw==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.51.0.tgz", - "integrity": "sha512-TSkNupHvNRkoH9FMA3w7TazVFcBPveAAmb7Sz+kArY6sLT86PA5Vx80cKlYmd8m3Ha2SwofM1KwraF24lM9FvA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.51.0", - "@typescript-eslint/visitor-keys": "5.51.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/@typescript-eslint/utils": { "version": "5.52.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.52.0.tgz", @@ -2078,23 +1965,6 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.51.0.tgz", - "integrity": "sha512-Oh2+eTdjHjOFjKA27sxESlA87YPSOJafGCR0md5oeMdh1ZcCfAGCIOL216uTBAkAIptvLIfKQhl7lHxMJet4GQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.51.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@webassemblyjs/ast": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", @@ -13041,16 +12911,6 @@ } } }, - "@typescript-eslint/scope-manager": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.51.0.tgz", - "integrity": "sha512-gNpxRdlx5qw3yaHA0SFuTjW4rxeYhpHxt491PEcKF8Z6zpq0kMhe0Tolxt0qjlojS+/wArSDlj/LtE69xUJphQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.51.0", - "@typescript-eslint/visitor-keys": "5.51.0" - } - }, "@typescript-eslint/type-utils": { "version": "5.52.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.52.0.tgz", @@ -13135,68 +12995,6 @@ } } }, - "@typescript-eslint/types": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.51.0.tgz", - "integrity": "sha512-SqOn0ANn/v6hFn0kjvLwiDi4AzR++CBZz0NV5AnusT2/3y32jdc0G4woXPWHCumWtUXZKPAS27/9vziSsC9jnw==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.51.0.tgz", - "integrity": "sha512-TSkNupHvNRkoH9FMA3w7TazVFcBPveAAmb7Sz+kArY6sLT86PA5Vx80cKlYmd8m3Ha2SwofM1KwraF24lM9FvA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.51.0", - "@typescript-eslint/visitor-keys": "5.51.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, "@typescript-eslint/utils": { "version": "5.52.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.52.0.tgz", @@ -13295,16 +13093,6 @@ } } }, - "@typescript-eslint/visitor-keys": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.51.0.tgz", - "integrity": "sha512-Oh2+eTdjHjOFjKA27sxESlA87YPSOJafGCR0md5oeMdh1ZcCfAGCIOL216uTBAkAIptvLIfKQhl7lHxMJet4GQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.51.0", - "eslint-visitor-keys": "^3.3.0" - } - }, "@webassemblyjs/ast": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", diff --git a/src/patcher/from-docx.ts b/src/patcher/from-docx.ts index e380d9973e..0dd38f91c3 100644 --- a/src/patcher/from-docx.ts +++ b/src/patcher/from-docx.ts @@ -26,12 +26,10 @@ type FilePatch = { readonly children: readonly FileChild[]; }; -export type IPatch = { - readonly text: string; -} & (ParagraphPatch | FilePatch); +export type IPatch = ParagraphPatch | FilePatch; export interface PatchDocumentOptions { - readonly patches: readonly IPatch[]; + readonly patches: { readonly [key: string]: IPatch }; } export const patchDocument = async (data: InputDataType, options: PatchDocumentOptions): Promise => { @@ -42,9 +40,10 @@ export const patchDocument = async (data: InputDataType, options: PatchDocumentO for (const [key, value] of Object.entries(zipContent.files)) { const json = toJson(await value.async("text")); if (key.startsWith("word/")) { - for (const patch of options.patches) { - const renderedParagraphs = findLocationOfText(json, patch.text); - replacer(json, patch, renderedParagraphs); + for (const [patchKey, patchValue] of Object.entries(options.patches)) { + const patchText = `{{${patchKey}}}`; + const renderedParagraphs = findLocationOfText(json, patchText); + replacer(json, patchValue, patchText, renderedParagraphs); } } diff --git a/src/patcher/replacer.ts b/src/patcher/replacer.ts index 95e607a777..ce6e987d62 100644 --- a/src/patcher/replacer.ts +++ b/src/patcher/replacer.ts @@ -14,48 +14,31 @@ const formatter = new Formatter(); const SPLIT_TOKEN = "ɵ"; -export const replacer = (json: Element, options: IPatch, renderedParagraphs: readonly IRenderedParagraphNode[]): Element => { +export const replacer = (json: Element, patch: IPatch, patchText: string, renderedParagraphs: readonly IRenderedParagraphNode[]): Element => { for (const renderedParagraph of renderedParagraphs) { - const textJson = options.children.map((c) => toJson(xml(formatter.format(c as XmlComponent)))).map((c) => c.elements![0]); + const textJson = patch.children.map((c) => toJson(xml(formatter.format(c as XmlComponent)))).map((c) => c.elements![0]); - if (options.type === PatchType.DOCUMENT) { + if (patch.type === PatchType.DOCUMENT) { const parentElement = goToParentElementFromPath(json, renderedParagraph.path); const elementIndex = getLastElementIndexFromPath(renderedParagraph.path); - // Easy case where the text is the entire paragraph - // We can assume that the Paragraph/Table only has one element // eslint-disable-next-line functional/immutable-data, prefer-destructuring parentElement.elements?.splice(elementIndex, 1, ...textJson); - // console.log(JSON.stringify(renderedParagraphs, null, 2)); - // console.log(JSON.stringify(textJson, null, 2)); - // console.log("paragraphElement after", JSON.stringify(parentElement.elements![elementIndex], null, 2)); - } else if (options.type === PatchType.PARAGRAPH) { + } else if (patch.type === PatchType.PARAGRAPH) { + // Hard case where the text is only part of the paragraph const paragraphElement = goToElementFromPath(json, renderedParagraph.path); - const startIndex = renderedParagraph.text.indexOf(options.text); - const endIndex = startIndex + options.text.length - 1; - if (startIndex === 0 && endIndex === renderedParagraph.text.length - 1) { - // Easy case where the text is the entire paragraph - // eslint-disable-next-line functional/immutable-data - paragraphElement.elements = textJson; - console.log(JSON.stringify(paragraphElement, null, 2)); - } else { - // Hard case where the text is only part of the paragraph + replaceTokenInParagraphElement({ + paragraphElement, + renderedParagraph, + originalText: patchText, + replacementText: SPLIT_TOKEN, + }); - replaceTokenInParagraphElement({ - paragraphElement, - renderedParagraph, - originalText: options.text, - replacementText: SPLIT_TOKEN, - }); + const index = findRunElementIndexWithToken(paragraphElement, SPLIT_TOKEN); - const index = findRunElementIndexWithToken(paragraphElement, SPLIT_TOKEN); - - const { left, right } = splitRunElement(paragraphElement.elements![index], SPLIT_TOKEN); - // eslint-disable-next-line functional/immutable-data - paragraphElement.elements!.splice(index, 1, left, ...textJson, right); - // console.log(index, JSON.stringify(paragraphElement.elements![index], null, 2)); - // console.log("paragraphElement after", JSON.stringify(paragraphElement, null, 2)); - } + const { left, right } = splitRunElement(paragraphElement.elements![index], SPLIT_TOKEN); + // eslint-disable-next-line functional/immutable-data + paragraphElement.elements!.splice(index, 1, left, ...textJson, right); } }