docx-rs/docx-wasm/js/style.ts

322 lines
6.4 KiB
TypeScript
Raw Normal View History

import * as wasm from "./pkg";
import {
createDefaultTableCellMargins,
setTableProperty,
TableAlignmentType,
TableLayoutType,
TableProperty,
} from "./table";
import {
RunProperty,
createDefaultRunProperty,
VertAlignType,
RunFonts,
setRunProperty,
} from "./run-property";
import {
AlignmentType,
createDefaultParagraphProperty,
createParagraphProperty,
LineSpacing,
ParagraphProperty,
SpecialIndentKind,
} from "./paragraph-property";
import { BorderType } from "./border";
import { WidthType } from ".";
export type StyleType = "paragraph" | "character" | "numbering" | "table";
export class Style {
_styleId: string;
_name: string;
_styleType: StyleType;
_runProperty: RunProperty;
_paragraphProperty: ParagraphProperty;
_tableProperty: TableProperty;
_basedOn: string | null;
_link: string | null;
constructor(id: string, type: StyleType) {
this._styleId = id;
this._styleType = type;
this._name = "";
this._runProperty;
this._tableProperty = { cellMargins: createDefaultTableCellMargins() };
this._runProperty = createDefaultRunProperty();
this._paragraphProperty = createDefaultParagraphProperty();
this._basedOn = null;
this._link = null;
}
name = (n: string) => {
this._name = n;
return this;
};
2022-01-10 17:39:38 +02:00
basedOn = (n: string) => {
this._basedOn = n;
return this;
};
link = (n: string) => {
this._link = n;
return this;
};
// run property
style(style: string) {
this._runProperty.style(style);
return this;
}
size(size: number) {
this._runProperty.size(size);
return this;
}
color(color: string) {
this._runProperty.color(color);
return this;
}
highlight(color: string) {
this._runProperty.highlight(color);
return this;
}
vertAlign(vertAlign: VertAlignType) {
this._runProperty.vertAlign(vertAlign);
return this;
}
bold() {
this._runProperty.bold();
return this;
}
strike() {
this._runProperty.strike();
return this;
}
dstrike() {
this._runProperty.dstrike();
return this;
}
italic() {
this._runProperty.italic();
return this;
}
underline(type: string) {
this._runProperty.underline(type);
return this;
}
vanish() {
this._runProperty.vanish();
return this;
}
fonts(fonts: RunFonts) {
this._runProperty.fonts(fonts);
return this;
}
characterSpacing(characterSpacing: number) {
this._runProperty.spacing(characterSpacing);
return this;
}
delete(author: string, date: string) {
this._runProperty.delete(author, date);
return this;
}
insert(author: string, date: string) {
this._runProperty.insert(author, date);
return this;
}
textBorder(type: BorderType, size: number, space: number, color: string) {
this._runProperty.textBorder(type, size, space, color);
return this;
}
paragraphProperty = (p: ParagraphProperty) => {
this._paragraphProperty = p;
return this;
};
runProperty = (p: RunProperty) => {
this._runProperty = p;
return this;
};
2022-01-10 17:39:38 +02:00
// paragraph property
align(type: AlignmentType) {
this._paragraphProperty._align = type;
2022-01-10 17:39:38 +02:00
return this;
}
indent(
left: number,
specialIndentKind?: SpecialIndentKind,
specialIndentSize?: number
) {
this._paragraphProperty.indent = {
left,
specialIndentKind,
specialIndentSize,
};
return this;
}
numbering(id: number, level: number) {
this._paragraphProperty.numbering = { id, level };
return this;
}
lineSpacing(spacing: LineSpacing) {
this._paragraphProperty.lineSpacing = spacing;
return this;
}
keepNext(v: boolean) {
this._paragraphProperty.keepNext = v;
return this;
}
keepLines(v: boolean) {
this._paragraphProperty.keepLines = v;
return this;
}
2025-02-27 08:53:59 +02:00
snapToGrid(v: boolean) {
this._paragraphProperty._snapToGrid = v;
return this;
}
pageBreakBefore(v: boolean) {
this._paragraphProperty.pageBreakBefore = v;
return this;
}
widowControl(v: boolean) {
this._paragraphProperty.widowControl = v;
return this;
}
outlineLevel(v: number) {
this._paragraphProperty.outlineLvl = v;
return this;
}
// TODO:
// tableProperty = (n: TableProperty) => {
// this._tableProperty = n;
// return this;
// };
// tableProperty
tableIndent(v: number) {
this._tableProperty.indent = v;
return this;
}
tableAlign(v: TableAlignmentType) {
this._tableProperty.align = v;
return this;
}
layout(l: TableLayoutType) {
this._tableProperty.layout = l;
return this;
}
width(w: number) {
this._tableProperty.width = w;
return this;
}
cellMargins(top: number, right: number, bottom: number, left: number) {
this._tableProperty.cellMargins = {
top: { val: top, type: "dxa" },
left: { val: left, type: "dxa" },
bottom: { val: bottom, type: "dxa" },
right: { val: right, type: "dxa" },
};
return this;
}
cellMarginTop(v: number, t: WidthType) {
this._tableProperty.cellMargins.top = { val: v, type: t };
return this;
}
cellMarginLeft(v: number, t: WidthType) {
this._tableProperty.cellMargins.left = { val: v, type: t };
return this;
}
cellMarginRight(v: number, t: WidthType) {
this._tableProperty.cellMargins.right = { val: v, type: t };
return this;
}
cellMarginBottom(v: number, t: WidthType) {
this._tableProperty.cellMargins.bottom = { val: v, type: t };
return this;
}
2022-01-10 17:39:38 +02:00
buildStyleType = () => {
switch (this._styleType) {
case "character":
return wasm.StyleType.Character;
case "numbering":
return wasm.StyleType.Numbering;
case "paragraph":
return wasm.StyleType.Paragraph;
case "table":
return wasm.StyleType.Table;
}
return wasm.StyleType.Paragraph;
};
buildWasmObject = () => {
const styleType = this.buildStyleType();
let s = wasm.createStyle(this._styleId, styleType);
if (this._name) {
s = s.name(this._name);
}
2022-01-10 17:39:38 +02:00
if (this._basedOn) {
s = s.based_on(this._basedOn);
}
if (this._link) {
s = s.link(this._link);
}
if (this._runProperty) {
s = setRunProperty(s, this._runProperty);
}
if (this._paragraphProperty) {
s = s.paragraph_property(
createParagraphProperty(this._paragraphProperty)
);
}
if (this._tableProperty) {
s = setTableProperty(s, this._tableProperty);
}
return s;
};
}