From 1f12e159efe1fe33f274733b9d09a1205c3a57e2 Mon Sep 17 00:00:00 2001 From: Aravind Balla Date: Mon, 4 Feb 2019 18:49:12 +0530 Subject: [PATCH 1/3] add line numbers to section --- .../section-properties/line-number/index.ts | 1 + .../line-number/line-number.ts | 38 +++++++++++++++++++ .../section-properties/section-properties.ts | 10 +++++ 3 files changed, 49 insertions(+) create mode 100644 src/file/document/body/section-properties/line-number/index.ts create mode 100644 src/file/document/body/section-properties/line-number/line-number.ts diff --git a/src/file/document/body/section-properties/line-number/index.ts b/src/file/document/body/section-properties/line-number/index.ts new file mode 100644 index 0000000000..5808fe7f7b --- /dev/null +++ b/src/file/document/body/section-properties/line-number/index.ts @@ -0,0 +1 @@ +export * from "./line-number"; diff --git a/src/file/document/body/section-properties/line-number/line-number.ts b/src/file/document/body/section-properties/line-number/line-number.ts new file mode 100644 index 0000000000..86e3fbb8a2 --- /dev/null +++ b/src/file/document/body/section-properties/line-number/line-number.ts @@ -0,0 +1,38 @@ +// http://officeopenxml.com/WPsectionLineNumbering.php +import { XmlAttributeComponent, XmlComponent } from "file/xml-components"; + +export enum LineNumberRestartFormat { + CONTINUOUS = "continuous", + NEW_SECTION = "newSection", + NEW_PAGE = "newPage", +} + +export interface ILineNumberAttributes { + readonly lineNumberCountBy?: number; + readonly lineNumberStart?: number; + readonly lineNumberRestart?: LineNumberRestartFormat; + readonly lineNumberDistance?: number; +} + +export class LineNumberAttributes extends XmlAttributeComponent { + protected readonly xmlKeys = { + lineNumberCountBy: "w:countBy", + lineNumberStart: "w:start", + lineNumberRestart: "w:restart", + lineNumberDistance: "w:distance", + }; +} + +export class LineNumberType extends XmlComponent { + constructor(countBy?: number, start?: number, restart?: LineNumberRestartFormat, dist?: number) { + super("w:lnNumType"); + this.root.push( + new LineNumberAttributes({ + lineNumberCountBy: countBy, + lineNumberStart: start, + lineNumberRestart: restart, + lineNumberDistance: dist, + }), + ); + } +} diff --git a/src/file/document/body/section-properties/section-properties.ts b/src/file/document/body/section-properties/section-properties.ts index 9ae9e2bfb8..a81978ed3d 100644 --- a/src/file/document/body/section-properties/section-properties.ts +++ b/src/file/document/body/section-properties/section-properties.ts @@ -15,6 +15,7 @@ import { IPageBordersOptions, PageBorders } from "./page-border"; import { PageMargin } from "./page-margin/page-margin"; import { IPageMarginAttributes } from "./page-margin/page-margin-attributes"; import { IPageNumberTypeAttributes, PageNumberType } from "./page-number"; +import { ILineNumberAttributes, LineNumberType } from "./line-number"; import { PageSize } from "./page-size/page-size"; import { IPageSizeAttributes, PageOrientation } from "./page-size/page-size-attributes"; import { TitlePage } from "./title-page/title-page"; @@ -44,6 +45,7 @@ export type SectionPropertiesOptions = IPageSizeAttributes & IHeadersOptions & IFootersOptions & IPageNumberTypeAttributes & + ILineNumberAttributes & IPageBordersOptions & ITitlePageOptions; @@ -71,6 +73,10 @@ export class SectionProperties extends XmlComponent { footers, pageNumberFormatType, pageNumberStart, + lineNumberCountBy, + lineNumberStart, + lineNumberRestart, + lineNumberDistance, pageBorders, pageBorderTop, pageBorderRight, @@ -92,6 +98,10 @@ export class SectionProperties extends XmlComponent { this.root.push(new PageNumberType(pageNumberStart, pageNumberFormatType)); } + if (lineNumberCountBy || lineNumberStart || lineNumberRestart || lineNumberDistance) { + this.root.push(new LineNumberType(lineNumberCountBy, lineNumberStart, lineNumberRestart, lineNumberDistance)); + } + if (pageBorders || pageBorderTop || pageBorderRight || pageBorderBottom || pageBorderLeft) { this.root.push( new PageBorders({ From 8f133ff93a0b8fdad910051d760151d12440db09 Mon Sep 17 00:00:00 2001 From: Aravind Balla Date: Wed, 6 Feb 2019 13:26:18 +0530 Subject: [PATCH 2/3] add example for line numbers --- demo/demo40.ts | 25 +++++++++++++++++++ .../document/body/section-properties/index.ts | 1 + 2 files changed, 26 insertions(+) create mode 100644 demo/demo40.ts diff --git a/demo/demo40.ts b/demo/demo40.ts new file mode 100644 index 0000000000..3dd952fda5 --- /dev/null +++ b/demo/demo40.ts @@ -0,0 +1,25 @@ +// Example demonstrating line numbers. +// Import from 'docx' rather than '../build' if you install from npm +import * as fs from "fs"; +import { Document, Paragraph, Packer, LineNumberRestartFormat } from "../build"; + +const doc = new Document( + {}, + { + lineNumberCountBy: 1, + lineNumberRestart: LineNumberRestartFormat.CONTINUOUS, + }, +); + + + +doc.addParagraph(new Paragraph('Hello').heading1()); +doc.createParagraph("Himenaeos duis luctus nullam fermentum lobortis potenti vivamus non dis, sed facilisis ultricies scelerisque aenean risus hac senectus. Adipiscing id venenatis justo ante gravida placerat, ac curabitur dis pellentesque proin bibendum risus, aliquam porta taciti vulputate primis. Tortor ipsum fermentum quam vel convallis primis nisl praesent tincidunt, lobortis quisque felis vitae condimentum class ut sem nam, aenean potenti pretium ac amet lacinia himenaeos mi. Aliquam nisl turpis hendrerit est morbi malesuada, augue interdum mus inceptos curabitur tristique, parturient feugiat sodales nulla facilisi. Aliquam non pulvinar purus nulla ex integer, velit faucibus vitae at bibendum quam, risus elit aenean adipiscing posuere."); +doc.createParagraph("Sed laoreet id mattis egestas nam mollis elit lacinia convallis dui tincidunt ultricies habitant, pharetra per maximus interdum neque tempor risus efficitur morbi imperdiet senectus. Lectus laoreet senectus finibus inceptos donec potenti fermentum, ultrices eleifend odio suscipit magnis tellus maximus nibh, ac sit nullam eget felis himenaeos. Diam class sem magnis aenean commodo faucibus id proin mi, nullam sodales nec mus parturient ornare ad inceptos velit hendrerit, bibendum placerat eleifend integer facilisis urna dictumst suspendisse."); + + +const packer = new Packer(); + +packer.toBuffer(doc).then((buffer) => { + fs.writeFileSync("My Document.docx", buffer); +}); diff --git a/src/file/document/body/section-properties/index.ts b/src/file/document/body/section-properties/index.ts index cab88ac7c7..a8985b1249 100644 --- a/src/file/document/body/section-properties/index.ts +++ b/src/file/document/body/section-properties/index.ts @@ -4,3 +4,4 @@ export * from "./header-reference"; export * from "./page-size"; export * from "./page-number"; export * from "./page-border"; +export * from "./line-number"; From 2f687125d1517532ec2de70a21c7975e207e415b Mon Sep 17 00:00:00 2001 From: Aravind Balla Date: Wed, 5 Jun 2019 13:01:24 +0530 Subject: [PATCH 3/3] fix lint issue in section-properties.ts --- src/file/document/body/section-properties/section-properties.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/file/document/body/section-properties/section-properties.ts b/src/file/document/body/section-properties/section-properties.ts index a81978ed3d..5a50012578 100644 --- a/src/file/document/body/section-properties/section-properties.ts +++ b/src/file/document/body/section-properties/section-properties.ts @@ -11,11 +11,11 @@ import { FooterReferenceType } from "./footer-reference"; import { FooterReference } from "./footer-reference/footer-reference"; import { HeaderReferenceType } from "./header-reference"; import { HeaderReference } from "./header-reference/header-reference"; +import { ILineNumberAttributes, LineNumberType } from "./line-number"; import { IPageBordersOptions, PageBorders } from "./page-border"; import { PageMargin } from "./page-margin/page-margin"; import { IPageMarginAttributes } from "./page-margin/page-margin-attributes"; import { IPageNumberTypeAttributes, PageNumberType } from "./page-number"; -import { ILineNumberAttributes, LineNumberType } from "./line-number"; import { PageSize } from "./page-size/page-size"; import { IPageSizeAttributes, PageOrientation } from "./page-size/page-size-attributes"; import { TitlePage } from "./title-page/title-page";