From 23fd3b483f5800ec605bb5b76717d94553d28598 Mon Sep 17 00:00:00 2001 From: askoufis Date: Sat, 18 Sep 2021 22:58:19 +1000 Subject: [PATCH] Add API for specifying columns with different widths --- .../section-properties/properties/column.ts | 26 +++++++++++++ .../properties/columns.spec.ts | 37 +++++++++++++++++++ .../section-properties/properties/columns.ts | 8 +++- .../section-properties/properties/index.ts | 1 + 4 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 src/file/document/body/section-properties/properties/column.ts create mode 100644 src/file/document/body/section-properties/properties/columns.spec.ts diff --git a/src/file/document/body/section-properties/properties/column.ts b/src/file/document/body/section-properties/properties/column.ts new file mode 100644 index 0000000000..943723a6f3 --- /dev/null +++ b/src/file/document/body/section-properties/properties/column.ts @@ -0,0 +1,26 @@ +import { twipsMeasureValue } from "file/values"; +import { XmlAttributeComponent, XmlComponent } from "file/xml-components"; + +export interface IColumnAttributes { + readonly width: number | string; + readonly space?: number | string; +} + +export class ColumnAttributes extends XmlAttributeComponent { + protected readonly xmlKeys = { + width: 'w:w', + space: 'w:space', + } +} + +export class Column extends XmlComponent { + constructor({width, space}: IColumnAttributes) { + super("w:col"); + this.root.push( + new ColumnAttributes({ + width: twipsMeasureValue(width), + space: space === undefined ? undefined : twipsMeasureValue(space), + }) + ) + } +} diff --git a/src/file/document/body/section-properties/properties/columns.spec.ts b/src/file/document/body/section-properties/properties/columns.spec.ts new file mode 100644 index 0000000000..694d917e6e --- /dev/null +++ b/src/file/document/body/section-properties/properties/columns.spec.ts @@ -0,0 +1,37 @@ +import { expect } from "chai"; +import { Columns } from "."; +import { Formatter } from "export/formatter"; +import { Column } from "./column"; + +describe("Columns", () => { + describe("#constructor()", () => { + it("should create columns of equal width if equalWidth is true", () => { + const columns = new Columns({ count: 3, space: 720 }); + const tree = new Formatter().format(columns); + + expect(tree["w:cols"]).to.deep.equal({ _attr: { "w:num": 3, "w:space": 720 } }); + }); + + it("should ignore individual column attributes if equalWidth is true", () => { + const unequalColumns = [new Column({ width: 1000, space: 400 }), new Column({ width: 2000 })]; + const columns = new Columns({ count: 3, space: 720, equalWidth: true, children: unequalColumns }); + const tree = new Formatter().format(columns); + + expect(tree).to.deep.equal({ "w:cols": { _attr: { "w:num": 3, "w:space": 720, "w:equalWidth": true } } }); + }); + + it("should have column children if equalWidth is false and individual columns are provided", () => { + const unequalColumns = [new Column({ width: 1000, space: 400 }), new Column({ width: 2000 })]; + const columns = new Columns({ count: 3, space: 720, equalWidth: false, children: unequalColumns }); + const tree = new Formatter().format(columns); + + expect(tree).to.deep.equal({ + "w:cols": [ + { _attr: { "w:num": 3, "w:space": 720, "w:equalWidth": false } }, + { "w:col": { _attr: { "w:space": 400, "w:w": 1000 } } }, + { "w:col": { _attr: { "w:w": 2000 } } }, + ], + }); + }); + }); +}); diff --git a/src/file/document/body/section-properties/properties/columns.ts b/src/file/document/body/section-properties/properties/columns.ts index 395df4ecae..e418b0ff1f 100644 --- a/src/file/document/body/section-properties/properties/columns.ts +++ b/src/file/document/body/section-properties/properties/columns.ts @@ -1,5 +1,6 @@ import { decimalNumber, twipsMeasureValue } from "file/values"; import { XmlAttributeComponent, XmlComponent } from "file/xml-components"; +import { Column } from "./column"; // // @@ -15,6 +16,7 @@ export interface IColumnsAttributes { readonly count?: number; readonly separate?: boolean; readonly equalWidth?: boolean; + readonly children?: Column[]; } export class ColumnsAttributes extends XmlAttributeComponent { @@ -27,7 +29,7 @@ export class ColumnsAttributes extends XmlAttributeComponent } export class Columns extends XmlComponent { - constructor({ space, count, separate, equalWidth }: IColumnsAttributes) { + constructor({ space, count, separate, equalWidth, children }: IColumnsAttributes) { super("w:cols"); this.root.push( new ColumnsAttributes({ @@ -37,5 +39,9 @@ export class Columns extends XmlComponent { equalWidth, }), ); + + if (!equalWidth && children) { + children.forEach((column) => this.addChildElement(column)); + } } } diff --git a/src/file/document/body/section-properties/properties/index.ts b/src/file/document/body/section-properties/properties/index.ts index 089a005744..3349b2595f 100644 --- a/src/file/document/body/section-properties/properties/index.ts +++ b/src/file/document/body/section-properties/properties/index.ts @@ -1,3 +1,4 @@ +export * from "./column"; export * from "./columns"; export * from "./doc-grid"; // export * from "./header-reference";