From 1f12e159efe1fe33f274733b9d09a1205c3a57e2 Mon Sep 17 00:00:00 2001 From: Aravind Balla Date: Mon, 4 Feb 2019 18:49:12 +0530 Subject: [PATCH 1/5] 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/5] 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/5] 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"; From 34c3285426d120301a3b6a831ccf8f7ae61fe7de Mon Sep 17 00:00:00 2001 From: Dolan Date: Wed, 12 Jun 2019 01:07:53 +0100 Subject: [PATCH 4/5] Version bump --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 189d94e76a..9044ecdeca 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "docx", - "version": "5.0.0-rc2", + "version": "5.0.0-rc3", "description": "Generate .docx documents with JavaScript (formerly Office-Clippy)", "main": "build/index.js", "scripts": { From 58dc6fe3892d9dd8fa01c0c208184dd7985a7bcd Mon Sep 17 00:00:00 2001 From: Dolan Date: Wed, 12 Jun 2019 01:12:32 +0100 Subject: [PATCH 5/5] Format demo --- demo/demo40.ts | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/demo/demo40.ts b/demo/demo40.ts index 3dd952fda5..b9213d76a1 100644 --- a/demo/demo40.ts +++ b/demo/demo40.ts @@ -1,7 +1,7 @@ // 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"; +import { Document, LineNumberRestartFormat, Packer, Paragraph } from "../build"; const doc = new Document( {}, @@ -11,12 +11,13 @@ const doc = new Document( }, ); - - -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."); - +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();