diff --git a/demo/demo40.ts b/demo/demo40.ts new file mode 100644 index 0000000000..b9213d76a1 --- /dev/null +++ b/demo/demo40.ts @@ -0,0 +1,26 @@ +// Example demonstrating line numbers. +// Import from 'docx' rather than '../build' if you install from npm +import * as fs from "fs"; +import { Document, LineNumberRestartFormat, Packer, Paragraph } 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/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": { 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"; 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..5a50012578 100644 --- a/src/file/document/body/section-properties/section-properties.ts +++ b/src/file/document/body/section-properties/section-properties.ts @@ -11,6 +11,7 @@ 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"; @@ -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({