// http://officeopenxml.com/WPnumbering-numFmt.php import { Attributes, NumberValueElement, XmlAttributeComponent, XmlComponent } from "@file/xml-components"; import { decimalNumber } from "@util/values"; import { AlignmentType } from "../paragraph/formatting"; import { ILevelParagraphStylePropertiesOptions, ParagraphProperties } from "../paragraph/properties"; import { IRunStylePropertiesOptions, RunProperties } from "../paragraph/run/properties"; export enum LevelFormat { BULLET = "bullet", CARDINAL_TEXT = "cardinalText", CHICAGO = "chicago", DECIMAL = "decimal", DECIMAL_ENCLOSED_CIRCLE = "decimalEnclosedCircle", DECIMAL_ENCLOSED_FULLSTOP = "decimalEnclosedFullstop", DECIMAL_ENCLOSED_PARENTHESES = "decimalEnclosedParen", DECIMAL_ZERO = "decimalZero", LOWER_LETTER = "lowerLetter", LOWER_ROMAN = "lowerRoman", NONE = "none", ORDINAL_TEXT = "ordinalText", UPPER_LETTER = "upperLetter", UPPER_ROMAN = "upperRoman", } class LevelAttributes extends XmlAttributeComponent<{ readonly ilvl?: number; readonly tentative?: number; }> { protected readonly xmlKeys = { ilvl: "w:ilvl", tentative: "w15:tentative", }; } // // // // class NumberFormat extends XmlComponent { public constructor(value: string) { super("w:numFmt"); this.root.push( new Attributes({ val: value, }), ); } } // // // // class LevelText extends XmlComponent { public constructor(value: string) { super("w:lvlText"); this.root.push( new Attributes({ val: value, }), ); } } class LevelJc extends XmlComponent { public constructor(value: AlignmentType) { super("w:lvlJc"); this.root.push( new Attributes({ val: value, }), ); } } export enum LevelSuffix { NOTHING = "nothing", SPACE = "space", TAB = "tab", } export interface ILevelsOptions { readonly level: number; readonly format?: LevelFormat; readonly text?: string; readonly alignment?: AlignmentType; readonly start?: number; readonly suffix?: LevelSuffix; readonly isLegalNumberingStyle?: boolean; readonly style?: { readonly run?: IRunStylePropertiesOptions; readonly paragraph?: ILevelParagraphStylePropertiesOptions; }; } // // // // // // // // // // class Suffix extends XmlComponent { public constructor(value: LevelSuffix) { super("w:suff"); this.root.push( new Attributes({ val: value, }), ); } } // http://officeopenxml.com/WPnumbering-isLgl.php // https://docs.microsoft.com/en-us/dotnet/api/documentformat.openxml.wordprocessing.islegalnumberingstyle?view=openxml-2.8.1 class IsLegalNumberingStyle extends XmlComponent { public constructor() { super("w:isLgl"); } } // // // // // // // // // // // // // // // // // // // export class LevelBase extends XmlComponent { private readonly paragraphProperties: ParagraphProperties; private readonly runProperties: RunProperties; public constructor({ level, format, text, alignment = AlignmentType.START, start = 1, style, suffix, isLegalNumberingStyle, }: ILevelsOptions) { super("w:lvl"); this.root.push(new NumberValueElement("w:start", decimalNumber(start))); if (format) { this.root.push(new NumberFormat(format)); } if (suffix) { this.root.push(new Suffix(suffix)); } if (isLegalNumberingStyle) { this.root.push(new IsLegalNumberingStyle()); } if (text) { this.root.push(new LevelText(text)); } this.root.push(new LevelJc(alignment)); this.paragraphProperties = new ParagraphProperties(style && style.paragraph); this.runProperties = new RunProperties(style && style.run); this.root.push(this.paragraphProperties); this.root.push(this.runProperties); if (level > 9) { throw new Error( "Level cannot be greater than 9. Read more here: https://answers.microsoft.com/en-us/msoffice/forum/all/does-word-support-more-than-9-list-levels/d130fdcd-1781-446d-8c84-c6c79124e4d7", ); } this.root.push( new LevelAttributes({ ilvl: decimalNumber(level), tentative: 1, }), ); } } export class Level extends LevelBase { // This is the level that sits under abstractNum. We make a // handful of properties required } export class LevelForOverride extends LevelBase {}