From 5bca7d155f8220003d3c3aea914c61296177e818 Mon Sep 17 00:00:00 2001 From: Dolan Miu Date: Fri, 28 Feb 2020 18:44:41 +0000 Subject: [PATCH 1/3] Restart page numbering Add separator option --- demo/52-restart-page-numbers.ts | 87 +++++++++++++++++++ .../page-number/page-number.ts | 13 ++- .../section-properties/section-properties.ts | 22 ++--- 3 files changed, 106 insertions(+), 16 deletions(-) create mode 100644 demo/52-restart-page-numbers.ts diff --git a/demo/52-restart-page-numbers.ts b/demo/52-restart-page-numbers.ts new file mode 100644 index 0000000000..d31947625b --- /dev/null +++ b/demo/52-restart-page-numbers.ts @@ -0,0 +1,87 @@ +// Page numbers - Start from 0 on a new section +// Import from 'docx' rather than '../build' if you install from npm +import * as fs from "fs"; +import { AlignmentType, Document, Header, Packer, PageBreak, PageNumber, Paragraph, TextRun } from "../build"; + +const doc = new Document(); + +doc.addSection({ + headers: { + default: new Header({ + children: [ + new Paragraph({ + alignment: AlignmentType.RIGHT, + children: [ + new TextRun("My Title "), + new TextRun({ + children: ["Page ", PageNumber.CURRENT], + }), + ], + }), + ], + }), + first: new Header({ + children: [ + new Paragraph({ + alignment: AlignmentType.RIGHT, + children: [ + new TextRun("First Page Header "), + new TextRun({ + children: ["Page ", PageNumber.CURRENT], + }), + ], + }), + ], + }), + }, + children: [ + new Paragraph({ + children: [new TextRun("First Page"), new PageBreak()], + }), + new Paragraph("Second Page"), + ], +}); + +doc.addSection({ + properties: { + pageNumberStart: 1, + }, + headers: { + default: new Header({ + children: [ + new Paragraph({ + alignment: AlignmentType.RIGHT, + children: [ + new TextRun("My Title "), + new TextRun({ + children: ["Page ", PageNumber.CURRENT], + }), + ], + }), + ], + }), + first: new Header({ + children: [ + new Paragraph({ + alignment: AlignmentType.RIGHT, + children: [ + new TextRun("First Page Header of Second section"), + new TextRun({ + children: ["Page ", PageNumber.CURRENT], + }), + ], + }), + ], + }), + }, + children: [ + new Paragraph({ + children: [new TextRun("Third Page"), new PageBreak()], + }), + new Paragraph("Fourth Page"), + ], +}); + +Packer.toBuffer(doc).then((buffer) => { + fs.writeFileSync("My Document.docx", buffer); +}); diff --git a/src/file/document/body/section-properties/page-number/page-number.ts b/src/file/document/body/section-properties/page-number/page-number.ts index d876c265af..5fe281288c 100644 --- a/src/file/document/body/section-properties/page-number/page-number.ts +++ b/src/file/document/body/section-properties/page-number/page-number.ts @@ -16,25 +16,36 @@ export enum PageNumberFormat { UPPER_ROMAN = "upperRoman", } +export enum PageNumberSeparator { + COLON = "colon", + EM_DASH = "emDash", + EN_DASH = "endash", + HYPHEN = "hyphen", + PERIOD = "period", +} + export interface IPageNumberTypeAttributes { readonly pageNumberStart?: number; readonly pageNumberFormatType?: PageNumberFormat; + readonly pageNumberSeparator?: PageNumberSeparator; } export class PageNumberTypeAttributes extends XmlAttributeComponent { protected readonly xmlKeys = { pageNumberStart: "w:start", pageNumberFormatType: "w:fmt", + pageNumberSeparator: "w:chapSep", }; } export class PageNumberType extends XmlComponent { - constructor(start?: number, numberFormat?: PageNumberFormat) { + constructor(start?: number, numberFormat?: PageNumberFormat, separator?: PageNumberSeparator) { super("w:pgNumType"); this.root.push( new PageNumberTypeAttributes({ pageNumberStart: start, pageNumberFormatType: numberFormat, + pageNumberSeparator: separator, }), ); } diff --git a/src/file/document/body/section-properties/section-properties.ts b/src/file/document/body/section-properties/section-properties.ts index 37e09e4498..d0fc69321b 100644 --- a/src/file/document/body/section-properties/section-properties.ts +++ b/src/file/document/body/section-properties/section-properties.ts @@ -56,12 +56,8 @@ export type SectionPropertiesOptions = IPageSizeAttributes & // Need to decouple this from the attributes export class SectionProperties extends XmlComponent { - private readonly options: SectionPropertiesOptions; - - constructor(options: SectionPropertiesOptions = { column: {} }) { - super("w:sectPr"); - - const { + constructor( + { width = 11906, height = 16838, top = 1440, @@ -79,6 +75,7 @@ export class SectionProperties extends XmlComponent { footers, pageNumberFormatType, pageNumberStart, + pageNumberSeparator, lineNumberCountBy, lineNumberStart, lineNumberRestart, @@ -90,9 +87,10 @@ export class SectionProperties extends XmlComponent { pageBorderLeft, titlePage = false, verticalAlign, - } = options; + }: SectionPropertiesOptions = { column: {} }, + ) { + super("w:sectPr"); - this.options = options; this.root.push(new PageSize(width, height, orientation)); this.root.push(new PageMargin(top, right, bottom, left, header, footer, gutter, mirror)); this.root.push(new Columns(column.space ? column.space : 708, column.count ? column.count : 1)); @@ -101,9 +99,7 @@ export class SectionProperties extends XmlComponent { this.addHeaders(headers); this.addFooters(footers); - if (pageNumberStart || pageNumberFormatType) { - this.root.push(new PageNumberType(pageNumberStart, pageNumberFormatType)); - } + this.root.push(new PageNumberType(pageNumberStart, pageNumberFormatType, pageNumberSeparator)); if (lineNumberCountBy || lineNumberStart || lineNumberRestart || lineNumberDistance) { this.root.push(new LineNumberType(lineNumberCountBy, lineNumberStart, lineNumberRestart, lineNumberDistance)); @@ -191,8 +187,4 @@ export class SectionProperties extends XmlComponent { } } } - - public get Options(): SectionPropertiesOptions { - return this.options; - } } From 57f80e636e01b449e7d932287ee5ae3b8fe08a3a Mon Sep 17 00:00:00 2001 From: Dolan Date: Tue, 9 Mar 2021 22:57:51 +0000 Subject: [PATCH 2/3] Move demos to unique number --- demo/{48-table-xml-styles.ts => 25-table-xml-styles.ts} | 0 demo/{52-restart-page-numbers.ts => 42-restart-page-numbers.ts} | 0 demo/{54-track-revisions.ts => 60-track-revisions.ts} | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename demo/{48-table-xml-styles.ts => 25-table-xml-styles.ts} (100%) rename demo/{52-restart-page-numbers.ts => 42-restart-page-numbers.ts} (100%) rename demo/{54-track-revisions.ts => 60-track-revisions.ts} (100%) diff --git a/demo/48-table-xml-styles.ts b/demo/25-table-xml-styles.ts similarity index 100% rename from demo/48-table-xml-styles.ts rename to demo/25-table-xml-styles.ts diff --git a/demo/52-restart-page-numbers.ts b/demo/42-restart-page-numbers.ts similarity index 100% rename from demo/52-restart-page-numbers.ts rename to demo/42-restart-page-numbers.ts diff --git a/demo/54-track-revisions.ts b/demo/60-track-revisions.ts similarity index 100% rename from demo/54-track-revisions.ts rename to demo/60-track-revisions.ts From cd501bba0a1fe9737adbe9fd93fb04af44a0c852 Mon Sep 17 00:00:00 2001 From: Dolan Date: Tue, 9 Mar 2021 22:59:50 +0000 Subject: [PATCH 3/3] Add tests --- demo/42-restart-page-numbers.ts | 3 ++- .../section-properties.spec.ts | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/demo/42-restart-page-numbers.ts b/demo/42-restart-page-numbers.ts index d31947625b..0ecfcee6cc 100644 --- a/demo/42-restart-page-numbers.ts +++ b/demo/42-restart-page-numbers.ts @@ -1,7 +1,7 @@ // Page numbers - Start from 0 on a new section // Import from 'docx' rather than '../build' if you install from npm import * as fs from "fs"; -import { AlignmentType, Document, Header, Packer, PageBreak, PageNumber, Paragraph, TextRun } from "../build"; +import { AlignmentType, Document, Header, Packer, PageBreak, PageNumber, PageNumberSeparator, Paragraph, TextRun } from "../build"; const doc = new Document(); @@ -45,6 +45,7 @@ doc.addSection({ doc.addSection({ properties: { pageNumberStart: 1, + pageNumberSeparator: PageNumberSeparator.EM_DASH }, headers: { default: new Header({ diff --git a/src/file/document/body/section-properties/section-properties.spec.ts b/src/file/document/body/section-properties/section-properties.spec.ts index 598bf09a48..9bd13aa078 100644 --- a/src/file/document/body/section-properties/section-properties.spec.ts +++ b/src/file/document/body/section-properties/section-properties.spec.ts @@ -5,6 +5,7 @@ import { Formatter } from "export/formatter"; import { FooterWrapper } from "file/footer-wrapper"; import { HeaderWrapper } from "file/header-wrapper"; import { Media } from "file/media"; +import { LineNumberRestartFormat } from "./line-number"; import { PageBorderOffsetFrom } from "./page-border"; import { PageNumberFormat } from "./page-number"; @@ -213,5 +214,20 @@ describe("SectionProperties", () => { "w:type": { _attr: { "w:val": "continuous" } }, }); }); + + it("should create section properties line number type", () => { + const properties = new SectionProperties({ + lineNumberCountBy: 2, + lineNumberStart: 2, + lineNumberRestart: LineNumberRestartFormat.CONTINUOUS, + lineNumberDistance: 4, + }); + const tree = new Formatter().format(properties); + expect(Object.keys(tree)).to.deep.equal(["w:sectPr"]); + const type = tree["w:sectPr"].find((item) => item["w:lnNumType"] !== undefined); + expect(type).to.deep.equal({ + "w:lnNumType": { _attr: { "w:countBy": 2, "w:distance": 4, "w:restart": "continuous", "w:start": 2 } }, + }); + }); }); });