diff --git a/demo/demo10.js b/demo/demo10.js index 2b986dbf65..3ffac93f32 100644 --- a/demo/demo10.js +++ b/demo/demo10.js @@ -135,7 +135,7 @@ class DocumentCreator { for (const education of educations) { document.addParagraph( - this.createInstitutionHeader(education.schoolName, `${education.startDate.year} - ${education.endDate.year}`), + this.createInstitutionHeader(education.schoolName, `${education.startDate.year} - ${education.endDate.year}`) ); document.addParagraph(this.createRoleText(`${education.fieldOfStudy} - ${education.degree}`)); @@ -151,8 +151,8 @@ class DocumentCreator { document.addParagraph( this.createInstitutionHeader( position.company.name, - this.createPositionDateText(position.startDate, position.endDate, position.isCurrent), - ), + this.createPositionDateText(position.startDate, position.endDate, position.isCurrent) + ) ); document.addParagraph(this.createRoleText(position.title)); @@ -182,14 +182,14 @@ class DocumentCreator { document.addParagraph( new docx.Paragraph( - "Dr. Dean Mohamedally Director of Postgraduate Studies Department of Computer Science, University College London Malet Place, Bloomsbury, London WC1E d.mohamedally@ucl.ac.uk", - ), + "Dr. Dean Mohamedally Director of Postgraduate Studies Department of Computer Science, University College London Malet Place, Bloomsbury, London WC1E d.mohamedally@ucl.ac.uk" + ) ); document.addParagraph(new docx.Paragraph("More references upon request")); document.addParagraph( new docx.Paragraph( - "This CV was generated in real-time based on my Linked-In profile from my personal website www.dolan.bio.", - ).center(), + "This CV was generated in real-time based on my Linked-In profile from my personal website www.dolan.bio." + ).center() ); return document; } diff --git a/demo/demo26.js b/demo/demo26.js new file mode 100644 index 0000000000..566c3ea419 --- /dev/null +++ b/demo/demo26.js @@ -0,0 +1,23 @@ +/* + * Creates two paragraphs, one with a border and one without + */ + +const docx = require("../build"); + +let doc = new docx.Document(); + +let paragraph = new docx.Paragraph("No border!"); + +doc.addParagraph(paragraph); + +let borderParagraph = new docx.Paragraph("I have a border on all but one side!"); +console.log(borderParagraph.Borders); +borderParagraph.Borders.addTopBorder(); +borderParagraph.Borders.addBottomBorder(); +borderParagraph.Borders.addLeftBorder(); +console.log(borderParagraph.Borders); + +doc.addParagraph(borderParagraph); + +let exporter = new docx.LocalPacker(doc); +exporter.packPdf('My Document'); \ No newline at end of file diff --git a/src/file/paragraph/formatting/border.ts b/src/file/paragraph/formatting/border.ts index 9ceb0c1336..5a07774024 100644 --- a/src/file/paragraph/formatting/border.ts +++ b/src/file/paragraph/formatting/border.ts @@ -1,23 +1,61 @@ // http://officeopenxml.com/WPborders.php import { Attributes, XmlComponent } from "file/xml-components"; -class Border extends XmlComponent { +class BorderProperty extends XmlComponent { + public setProperties(space: string, value: string, size: string): XmlComponent { + const attrs = new Attributes({ + space: space, + val: value, + sz: size + }); + this.root.push(attrs); + + return this; + } +} + +export class Border extends XmlComponent { constructor() { - super("w:bottom"); - this.root.push( - new Attributes({ - color: "auto", - space: "1", - val: "single", - sz: "6", - }), - ); + super("w:pBdr"); + } + + public addTopBorder(space: string = "1", value: string = "single", size: string = "6"): XmlComponent { + const top = new BorderProperty("w:top"); + top.setProperties(space, value, size); + this.root.push(top); + + return this; + } + + public addBottomBorder(space: string = "1", value: string = "single", size: string = "6"): XmlComponent { + const bottom = new BorderProperty("w:bottom"); + bottom.setProperties(space, value, size); + this.root.push(bottom); + + return this; + } + + public addLeftBorder(space: string = "1", value: string = "single", size: string = "6"): XmlComponent { + const left = new BorderProperty("w:left"); + left.setProperties(space, value, size); + this.root.push(left); + + return this; + } + + public addRightBorder(space: string = "1", value: string = "single", size: string = "6"): XmlComponent { + const right = new BorderProperty("w:right"); + right.setProperties(space, value, size); + this.root.push(right); + + return this; } } export class ThematicBreak extends XmlComponent { constructor() { super("w:pBdr"); - this.root.push(new Border()); + const bottom = new BorderProperty("w:bottom"); + this.root.push(bottom); } } diff --git a/src/file/paragraph/paragraph.ts b/src/file/paragraph/paragraph.ts index b21e2c3ac0..45693f3cf5 100644 --- a/src/file/paragraph/paragraph.ts +++ b/src/file/paragraph/paragraph.ts @@ -6,7 +6,7 @@ import { XmlComponent } from "file/xml-components"; import { Alignment } from "./formatting/alignment"; import { Bidirectional } from "./formatting/bidirectional"; -import { ThematicBreak } from "./formatting/border"; +import { ThematicBreak, Border } from "./formatting/border"; import { Indent } from "./formatting/indent"; import { KeepLines, KeepNext } from "./formatting/keep"; import { PageBreak, PageBreakBefore } from "./formatting/page-break"; @@ -30,6 +30,10 @@ export class Paragraph extends XmlComponent { } } + public get Borders(): Border { + return this.properties.paragraphBorder; + } + public addRun(run: Run): Paragraph { this.root.push(run); return this; diff --git a/src/file/paragraph/properties.ts b/src/file/paragraph/properties.ts index 93fba4ce31..a006c40d27 100644 --- a/src/file/paragraph/properties.ts +++ b/src/file/paragraph/properties.ts @@ -1,9 +1,14 @@ // http://officeopenxml.com/WPparagraphProperties.php import { XmlComponent } from "file/xml-components"; +import { Border } from "./formatting/border"; export class ParagraphProperties extends XmlComponent { + public paragraphBorder: Border; + constructor() { super("w:pPr"); + this.paragraphBorder = new Border(); + this.push(this.paragraphBorder); } public push(item: XmlComponent): void {