diff --git a/ts/docx/index.ts b/ts/docx/index.ts index ad1049df20..875821c29a 100644 --- a/ts/docx/index.ts +++ b/ts/docx/index.ts @@ -2,4 +2,4 @@ export { Document } from "./document"; export { Paragraph } from "./paragraph"; export { Run } from "./run"; export { TextRun } from "./run/text-run"; -export { Table } from './table'; +export { Table } from "./table"; diff --git a/ts/docx/table/grid.ts b/ts/docx/table/grid.ts index 70404104c0..91c38ddd21 100644 --- a/ts/docx/table/grid.ts +++ b/ts/docx/table/grid.ts @@ -1,17 +1,19 @@ -import {XmlComponent, Attributes} from "../xml-components"; +import { XmlAttributeComponent, XmlComponent } from "../xml-components"; export class TableGrid extends XmlComponent { - private cols: Array; - constructor(cols: Array) { - super('w:tblGrid'); - this.cols = cols; - cols.forEach(col => this.root.push(col)); + constructor(cols: number[]) { + super("w:tblGrid"); + cols.forEach((col) => this.root.push(new GridCol(col))); } } +class GridColAttributes extends XmlAttributeComponent<{w: number}> { + protected xmlKeys = {w: "w:w"}; +} + export class GridCol extends XmlComponent { constructor(width?: number) { - super('w:gridCol'); - this.root.push(new Attributes({w: width.toString()})) + super("w:gridCol"); + this.root.push(new GridColAttributes({w: width})); } } diff --git a/ts/docx/table/index.ts b/ts/docx/table/index.ts index 757af155eb..15656c6e45 100644 --- a/ts/docx/table/index.ts +++ b/ts/docx/table/index.ts @@ -1,21 +1,22 @@ -import {XmlComponent, Attributes} from "../xml-components"; -import {Paragraph} from "../paragraph"; -import {TableProperties} from "./properties"; -import {TableGrid, GridCol} from './grid'; +import { Paragraph } from "../paragraph"; +import { XmlComponent } from "../xml-components"; + +import { GridCol, TableGrid } from "./grid"; +import { TableProperties } from "./properties"; export class Table extends XmlComponent { - properties: TableProperties; - private rows: Array; + private properties: TableProperties; + private rows: TableRow[]; private grid: TableGrid; constructor(rows: number, cols: number) { - super('w:tbl'); + super("w:tbl"); this.properties = new TableProperties(); this.root.push(this.properties); - const gridCols = []; + const gridCols: number[] = []; for (let i = 0; i++; i < cols) { - gridCols.push(new GridCol()); + gridCols.push(0); } this.grid = new TableGrid(gridCols); this.root.push(this.grid); @@ -32,43 +33,46 @@ export class Table extends XmlComponent { } } - getRow(ix: number): TableRow { + public getRow(ix: number): TableRow { return this.rows[ix]; } + + public getCell(row: number, col: number): TableCell { + return this.getRow(row).getCell(col); + } } class TableRow extends XmlComponent { private properties: TableRowProperties; - private cells: Array; + private cells: TableCell[]; - constructor(cells: Array) { - super('w:tr'); + constructor(cells: TableCell[]) { + super("w:tr"); this.properties = new TableRowProperties(); this.root.push(this.properties); this.cells = cells; - cells.forEach(c => this.root.push(c)) + cells.forEach((c) => this.root.push(c)); } - getCell(ix: number): TableCell { + public getCell(ix: number): TableCell { return this.cells[ix]; } } class TableRowProperties extends XmlComponent { constructor() { - super('w:trPr'); + super("w:trPr"); } } class TableCell extends XmlComponent { + public content: XmlComponent; private properties: TableCellProperties; - content: any; constructor() { - super('w:tc'); + super("w:tc"); this.properties = new TableCellProperties(); this.root.push(this.properties); - this.root.push() // Table cells can have any block-level content, but for now // we only allow a single paragraph: this.content = new Paragraph(); @@ -78,6 +82,6 @@ class TableCell extends XmlComponent { class TableCellProperties extends XmlComponent { constructor() { - super('w:tcPr'); + super("w:tcPr"); } } diff --git a/ts/docx/table/properties.ts b/ts/docx/table/properties.ts index d37fef0c1b..7890f47696 100644 --- a/ts/docx/table/properties.ts +++ b/ts/docx/table/properties.ts @@ -1,24 +1,30 @@ -import {XmlComponent, Attributes} from "../xml-components"; +import { XmlAttributeComponent, XmlComponent } from "../xml-components"; + +type widthTypes = "dxa" | "pct" | "nil" | "auto"; export class TableProperties extends XmlComponent { - private width: PreferredTableWidth; - constructor() { - super('w:tblPr'); + super("w:tblPr"); } - setWidth(type: string, w: string) { - this.width = new PreferredTableWidth(type, w); - this.root.push(this.width); + public setWidth(type: widthTypes, w: number | string): TableProperties { + this.root.push(new PreferredTableWidth(type, w)); + return this; } } +interface ITableWidth { + type: widthTypes; + w: number | string; +} + +class TableWidthAttributes extends XmlAttributeComponent { + protected xmlKeys = {type: "w:type", w: "w:w"}; +} + class PreferredTableWidth extends XmlComponent { - constructor(type: string, w: string) { - super('w:tblW'); - this.root.push(new Attributes({ - type, - w, - })) + constructor(type: widthTypes, w: number | string) { + super("w:tblW"); + this.root.push(new TableWidthAttributes({type, w})); } }