134 lines
2.9 KiB
TypeScript
134 lines
2.9 KiB
TypeScript
import { Paragraph } from "./paragraph";
|
|
import { Table } from "./table";
|
|
import { Shading } from "./shading";
|
|
import { TableCellBorders, PositionKeys } from "./table-cell-borders";
|
|
import { TableCellBorderPosition, TableCellBorder } from "./table-cell-border";
|
|
import * as wasm from "./pkg";
|
|
|
|
export type VMergeType = "restart" | "continue";
|
|
|
|
export type VAlignType = "top" | "center" | "bottom";
|
|
|
|
export type TextDirectionType =
|
|
| "lr"
|
|
| "lrV"
|
|
| "rl"
|
|
| "rlV"
|
|
| "tb"
|
|
| "tbV"
|
|
| "tbRlV"
|
|
| "tbRl"
|
|
| "btLr"
|
|
| "lrTbV";
|
|
|
|
export const toTextDirectionWasmType = (
|
|
t: TextDirectionType
|
|
): wasm.TextDirectionType => {
|
|
switch (t) {
|
|
case "lr":
|
|
return wasm.TextDirectionType.Lr;
|
|
case "lrV":
|
|
return wasm.TextDirectionType.LrV;
|
|
case "rl":
|
|
return wasm.TextDirectionType.Rl;
|
|
case "rlV":
|
|
return wasm.TextDirectionType.RlV;
|
|
case "tb":
|
|
return wasm.TextDirectionType.Tb;
|
|
case "tbV":
|
|
return wasm.TextDirectionType.TbV;
|
|
case "tbRlV":
|
|
return wasm.TextDirectionType.TbRlV;
|
|
case "tbRl":
|
|
return wasm.TextDirectionType.TbRl;
|
|
case "btLr":
|
|
return wasm.TextDirectionType.BtLr;
|
|
case "lrTbV":
|
|
return wasm.TextDirectionType.LrTbV;
|
|
default:
|
|
throw new Error("unreachable");
|
|
}
|
|
};
|
|
|
|
export type CellProperty = {
|
|
borders: TableCellBorders;
|
|
verticalMerge?: VMergeType;
|
|
verticalAlign?: VAlignType;
|
|
gridSpan?: number;
|
|
width?: number;
|
|
textDirection?: TextDirectionType;
|
|
shading?: Shading;
|
|
};
|
|
|
|
export class TableCell {
|
|
children: (Paragraph | Table)[] = [];
|
|
hasNumberings = false;
|
|
property: CellProperty = {
|
|
borders: new TableCellBorders(),
|
|
};
|
|
|
|
addParagraph(p: Paragraph) {
|
|
if (p.hasNumberings) {
|
|
this.hasNumberings = true;
|
|
}
|
|
this.children.push(p);
|
|
return this;
|
|
}
|
|
|
|
addTable(t: Table) {
|
|
if (t.hasNumberings) {
|
|
this.hasNumberings = true;
|
|
}
|
|
this.children.push(t);
|
|
return this;
|
|
}
|
|
|
|
verticalMerge(t: VMergeType) {
|
|
this.property.verticalMerge = t;
|
|
return this;
|
|
}
|
|
|
|
verticalAlign(t: VAlignType) {
|
|
this.property.verticalAlign = t;
|
|
return this;
|
|
}
|
|
|
|
gridSpan(v: number) {
|
|
this.property.gridSpan = v;
|
|
return this;
|
|
}
|
|
|
|
width(v: number) {
|
|
this.property.width = v;
|
|
return this;
|
|
}
|
|
|
|
shading(type: string, color: string, fill: string) {
|
|
const s = new Shading();
|
|
s.color(color);
|
|
s.fill(fill);
|
|
s.type(type);
|
|
this.property.shading = s;
|
|
return this;
|
|
}
|
|
|
|
textDirection(t: TextDirectionType) {
|
|
this.property.textDirection = t;
|
|
return this;
|
|
}
|
|
|
|
setBorder(border: TableCellBorder) {
|
|
this.property.borders[
|
|
border.position.toLowerCase() as PositionKeys
|
|
] = border;
|
|
return this;
|
|
}
|
|
|
|
clearBorder(position: TableCellBorderPosition) {
|
|
this.property.borders[
|
|
position.toLowerCase() as PositionKeys
|
|
] = new TableCellBorder(position).border_type("nil");
|
|
return this;
|
|
}
|
|
}
|