diff --git a/src/file/paragraph/paragraph.ts b/src/file/paragraph/paragraph.ts index c4a9c4ee60..a54698e837 100644 --- a/src/file/paragraph/paragraph.ts +++ b/src/file/paragraph/paragraph.ts @@ -10,7 +10,7 @@ import { PageBreak } from "./formatting/page-break"; import { Bookmark, ConcreteHyperlink, ExternalHyperlink, InternalHyperlink } from "./links"; import { Math } from "./math"; import { IParagraphPropertiesOptions, ParagraphProperties } from "./properties"; -import { ImageRun, Run, SequentialIdentifier, SymbolRun, TextRun } from "./run"; +import { ImageRun, Run, SequentialIdentifier, SimpleField, SimpleMailMergeField, SymbolRun, TextRun } from "./run"; export type ParagraphChild = | TextRun @@ -24,7 +24,9 @@ export type ParagraphChild = | ExternalHyperlink | InsertedTextRun | DeletedTextRun - | Math; + | Math + | SimpleField + | SimpleMailMergeField; export interface IParagraphOptions extends IParagraphPropertiesOptions { readonly text?: string; diff --git a/src/file/paragraph/run/index.ts b/src/file/paragraph/run/index.ts index 4179af7cfc..da4b9e4f2e 100644 --- a/src/file/paragraph/run/index.ts +++ b/src/file/paragraph/run/index.ts @@ -8,3 +8,4 @@ export * from "./sequential-identifier"; export * from "./underline"; export * from "./emphasis-mark"; export * from "./tab"; +export * from "./simple-field"; diff --git a/src/file/paragraph/run/simple-field.spec.ts b/src/file/paragraph/run/simple-field.spec.ts new file mode 100644 index 0000000000..4368c1f47c --- /dev/null +++ b/src/file/paragraph/run/simple-field.spec.ts @@ -0,0 +1,38 @@ +import { expect } from "chai"; + +import { Formatter } from "export/formatter"; + +import { SimpleField, SimpleMailMergeField } from "./simple-field"; + +describe("SimpleField", () => { + describe("#constructor()", () => { + it("uses the instruction given", () => { + const tree = new Formatter().format(new SimpleField("FILENAME")); + expect(tree).to.deep.equal({ "w:fldSimple": { _attr: { "w:instr": "FILENAME" } } }); + }); + + it("accepts a cached value", () => { + const tree = new Formatter().format(new SimpleField("FILENAME", "ExampleDoc.docx")); + expect(tree).to.deep.equal({ + "w:fldSimple": [ + { _attr: { "w:instr": "FILENAME" } }, + { "w:r": [{ "w:t": [{ _attr: { "xml:space": "preserve" } }, "ExampleDoc.docx"] }] }, + ], + }); + }); + }); +}); + +describe("SimpleMailMergeField", () => { + describe("#constructor()", () => { + it("creates a simple field", () => { + const tree = new Formatter().format(new SimpleMailMergeField("Name")); + expect(tree).to.deep.equal({ + "w:fldSimple": [ + { _attr: { "w:instr": " MERGEFIELD Name " } }, + { "w:r": [{ "w:t": [{ _attr: { "xml:space": "preserve" } }, "«Name»"] }] }, + ], + }); + }); + }); +}); diff --git a/src/file/paragraph/run/simple-field.ts b/src/file/paragraph/run/simple-field.ts new file mode 100644 index 0000000000..719c2dded5 --- /dev/null +++ b/src/file/paragraph/run/simple-field.ts @@ -0,0 +1,23 @@ +// http://www.datypic.com/sc/ooxml/e-w_fldSimple-1.html +import { XmlAttributeComponent, XmlComponent } from "file/xml-components"; +import { TextRun } from "./text-run"; + +class FldSimpleAttrs extends XmlAttributeComponent<{ readonly instr: string }> { + protected readonly xmlKeys = { instr: "w:instr" }; +} + +export class SimpleField extends XmlComponent { + constructor(instruction: string, cachedValue?: string) { + super("w:fldSimple"); + this.root.push(new FldSimpleAttrs({ instr: instruction })); + if (cachedValue !== undefined) { + this.root.push(new TextRun(cachedValue)); + } + } +} + +export class SimpleMailMergeField extends SimpleField { + constructor(fieldName: string) { + super(` MERGEFIELD ${fieldName} `, `«${fieldName}»`); + } +}