import { AttributeData, AttributePayload, Attributes, NextAttributeComponent, XmlComponent } from "@file/xml-components"; import { PositiveUniversalMeasure, hpsMeasureValue } from "@util/values"; // This represents element type CT_OnOff, which indicate a boolean value. // // A value of 1 or true specifies that the property shall be explicitly applied. // This is the default value for this attribute, and is implied when the parent // element is present, but this attribute is omitted. // A value of 0 or false specifies that the property shall be explicitly turned off. // // // // export class OnOffElement extends XmlComponent { public constructor(name: string, val: boolean | undefined = true) { super(name); if (val !== true) { this.root.push(new Attributes({ val })); } } } // This represents element type CT_HpsMeasure, which indicate an unsigned int or a measurement with unit. // // // // // // // export class HpsMeasureElement extends XmlComponent { public constructor(name: string, val: number | PositiveUniversalMeasure) { super(name); this.root.push(new Attributes({ val: hpsMeasureValue(val) })); } } // This represents element type CT_String, which indicate a string value. // // export class EmptyElement extends XmlComponent {} // This represents element type CT_Empty, which indicate aan empty element. // // // // export class StringValueElement extends XmlComponent { public constructor(name: string, val: string) { super(name); this.root.push(new Attributes({ val })); } } export const createStringElement = (name: string, value: string): XmlComponent => new BuilderElement({ name, attributes: { value: { key: "w:val", value }, }, }); // This represents various number element types. export class NumberValueElement extends XmlComponent { public constructor(name: string, val: number) { super(name); this.root.push(new Attributes({ val })); } } export class StringEnumValueElement extends XmlComponent { public constructor(name: string, val: T) { super(name); this.root.push(new Attributes({ val })); } } // Simple nodes containing text. // // new StringContainer("hello", "world") // world export class StringContainer extends XmlComponent { public constructor(name: string, val: string) { super(name); this.root.push(val); } } // eslint-disable-next-line @typescript-eslint/no-empty-object-type export class BuilderElement extends XmlComponent { public constructor({ name, attributes, children, }: { readonly name: string; readonly attributes?: AttributePayload; readonly children?: readonly XmlComponent[]; }) { super(name); if (attributes) { this.root.push(new NextAttributeComponent(attributes)); } if (children) { this.root.push(...children); } } }