@apollo-design/docx-preview 0.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/NOTICE +6 -0
- package/README.md +155 -0
- package/dist/docx-preview.cjs +4190 -0
- package/dist/docx-preview.d.ts +57 -0
- package/dist/docx-preview.js +4190 -0
- package/dist/docx-preview.js.map +1 -0
- package/dist/docx-preview.min.js +8 -0
- package/dist/docx-preview.min.js.map +1 -0
- package/dist/docx-preview.min.mjs +8 -0
- package/dist/docx-preview.min.mjs.map +1 -0
- package/dist/docx-preview.mjs +4096 -0
- package/dist/docx-preview.mjs.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docx-preview.mjs","names":[],"sources":["../src/common/relationship.ts","../src/utils.ts","../src/document/common.ts","../src/parser/xml-parser.ts","../src/common/part.ts","../src/font-table/fonts.ts","../src/font-table/font-table.ts","../src/common/content-types.ts","../src/common/open-xml-package.ts","../src/document/document-part.ts","../src/document/border.ts","../src/document/section.ts","../src/document/line-spacing.ts","../src/document/run.ts","../src/document/paragraph.ts","../src/numbering/numbering.ts","../src/numbering/numbering-part.ts","../src/styles/styles-part.ts","../src/document/dom.ts","../src/header-footer/elements.ts","../src/header-footer/parts.ts","../src/document-props/extended-props.ts","../src/document-props/extended-props-part.ts","../src/document-props/core-props.ts","../src/document-props/core-props-part.ts","../src/theme/theme.ts","../src/theme/theme-part.ts","../src/notes/elements.ts","../src/notes/parts.ts","../src/settings/settings.ts","../src/settings/settings-part.ts","../src/document-props/custom-props.ts","../src/document-props/custom-props-part.ts","../src/comments/comments-part.ts","../src/comments/comments-extended-part.ts","../src/word-document.ts","../src/document/bookmarks.ts","../src/vml/vml.ts","../src/comments/elements.ts","../src/document-parser.ts","../src/javascript.ts","../src/html.ts","../src/html-renderer.ts","../src/pagination.ts","../src/docx-preview.ts"],"sourcesContent":["import { XmlParser } from \"../parser/xml-parser\";\r\n\r\nexport interface Relationship {\r\n id: string,\r\n type: RelationshipTypes | string,\r\n target: string\r\n targetMode: \"\" | \"External\" | string \r\n}\r\n\r\nexport enum RelationshipTypes {\r\n OfficeDocument = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\",\r\n FontTable = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable\",\r\n Image = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\",\r\n Numbering = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering\",\r\n Styles = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\",\r\n StylesWithEffects = \"http://schemas.microsoft.com/office/2007/relationships/stylesWithEffects\",\r\n Theme = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme\",\r\n Settings = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings\",\r\n WebSettings = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/webSettings\",\r\n Hyperlink = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink\",\r\n Footnotes = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/footnotes\",\r\n\tEndnotes = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/endnotes\",\r\n Footer = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer\",\r\n Header = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/header\",\r\n ExtendedProperties = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties\",\r\n CoreProperties = \"http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties\",\r\n\tCustomProperties = \"http://schemas.openxmlformats.org/package/2006/relationships/metadata/custom-properties\",\r\n\tComments = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments\",\r\n CommentsExtended = \"http://schemas.microsoft.com/office/2011/relationships/commentsExtended\",\r\n AltChunk = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/aFChunk\"\r\n}\r\n\r\nexport function parseRelationships(root: Element, xml: XmlParser): Relationship[] {\r\n return xml.elements(root).map(e => <Relationship>{\r\n id: xml.attr(e, \"Id\"),\r\n type: xml.attr(e, \"Type\"),\r\n target: xml.attr(e, \"Target\"),\r\n targetMode: xml.attr(e, \"TargetMode\")\r\n });\r\n}","export function escapeClassName(className: string) {\r\n\treturn className?.replace(/[ .]+/g, '-').replace(/[&]+/g, 'and').toLowerCase();\r\n}\r\n\r\nexport function encloseFontFamily(fontFamily: string): string {\r\n return /^[^\"'].*\\s.*[^\"']$/.test(fontFamily) ? `'${fontFamily}'` : fontFamily;\r\n}\r\n\r\nexport function splitPath(path: string): [string, string] {\r\n let si = path.lastIndexOf('/') + 1;\r\n let folder = si == 0 ? \"\" : path.substring(0, si);\r\n let fileName = si == 0 ? path : path.substring(si);\r\n\r\n return [folder, fileName];\r\n}\r\n\r\nexport function resolvePath(path: string, base: string): string {\r\n try {\r\n const prefix = \"http://docx/\";\r\n const url = new URL(path, prefix + base).toString();\r\n return url.substring(prefix.length);\r\n } catch {\r\n return `${base}${path}`;\r\n }\r\n}\r\n\r\nexport function keyBy<T = any>(array: T[], by: (x: T) => any): Record<any, T> {\r\n return array.reduce((a, x) => {\r\n a[by(x)] = x;\r\n return a;\r\n }, {});\r\n}\r\n\r\nexport function blobToBase64(blob: Blob): Promise<string> {\r\n\treturn new Promise((resolve, reject) => {\r\n\t\tconst reader = new FileReader();\r\n\t\treader.onloadend = () => resolve(reader.result as string);\r\n\t\treader.onerror = () => reject();\r\n\t\treader.readAsDataURL(blob);\r\n\t});\r\n}\r\n\r\nexport function isObject(item) {\r\n return item && typeof item === 'object' && !Array.isArray(item);\r\n}\r\n\r\nexport function isString(item: unknown): item is string {\r\n return typeof item === 'string' || item instanceof String;\r\n}\r\n\r\nexport function mergeDeep(target, ...sources) {\r\n if (!sources.length) \r\n return target;\r\n \r\n const source = sources.shift();\r\n\r\n if (isObject(target) && isObject(source)) {\r\n for (const key in source) {\r\n if (isObject(source[key])) {\r\n const val = target[key] ?? (target[key] = {});\r\n mergeDeep(val, source[key]);\r\n } else {\r\n target[key] = source[key];\r\n }\r\n }\r\n }\r\n\r\n return mergeDeep(target, ...sources);\r\n}\r\n\r\nexport function parseCssRules(text: string): Record<string, string> {\r\n\tconst result: Record<string, string> = {};\r\n\r\n\tfor (const rule of text.split(';')) {\r\n\t\tconst [key, val] = rule.split(':');\r\n\t\tresult[key] = val;\r\n\t}\r\n\r\n\treturn result\r\n}\r\n\r\nexport function formatCssRules(style: Record<string, string>): string {\r\n\treturn Object.entries(style).map((k, v) => `${k}: ${v}`).join(';');\r\n}\r\n\r\nexport function asArray<T>(val: T | T[]): T[] {\r\n\treturn Array.isArray(val) ? val : [val];\r\n}\r\n\r\nexport function clamp(val, min, max) {\r\n return min > val ? min : (max < val ? max : val);\r\n}","import { XmlParser } from \"../parser/xml-parser\";\r\nimport { clamp } from \"../utils\";\r\n\r\nexport const ns = {\r\n wordml: \"http://schemas.openxmlformats.org/wordprocessingml/2006/main\",\r\n drawingml: \"http://schemas.openxmlformats.org/drawingml/2006/main\",\r\n picture: \"http://schemas.openxmlformats.org/drawingml/2006/picture\",\r\n\tcompatibility: \"http://schemas.openxmlformats.org/markup-compatibility/2006\",\r\n\tmath: \"http://schemas.openxmlformats.org/officeDocument/2006/math\"\r\n}\r\n\r\nexport type LengthType = \"px\" | \"pt\" | \"%\" | \"\";\r\nexport type Length = string;\r\n\r\nexport interface Font {\r\n name: string;\r\n family: string;\r\n}\r\n\r\nexport interface CommonProperties {\r\n fontSize: Length;\r\n color: string;\r\n}\r\n\r\nexport type LengthUsageType = { mul: number, unit: LengthType, min?: number, max?: number };\r\n\r\nexport const LengthUsage: Record<string, LengthUsageType> = {\r\n Dxa: { mul: 0.05, unit: \"pt\" }, //twips\r\n Emu: { mul: 1 / 12700, unit: \"pt\" },\r\n FontSize: { mul: 0.5, unit: \"pt\" },\r\n Border: { mul: 0.125, unit: \"pt\", min: 0.25, max: 12 }, //NOTE: http://officeopenxml.com/WPtextBorders.php\r\n Point: { mul: 1, unit: \"pt\" },\r\n Percent: { mul: 0.02, unit: \"%\" },\r\n LineHeight: { mul: 1 / 240, unit: \"\" },\r\n VmlEmu: { mul: 1 / 12700, unit: \"\" },\r\n}\r\n\r\nexport function convertLength(val: string, usage: LengthUsageType = LengthUsage.Dxa): string {\r\n //\"simplified\" docx documents use pt's as units\r\n if (val == null || /.+(p[xt]|[%])$/.test(val)) {\r\n return val;\r\n }\r\n\r\n var num = parseInt(val) * usage.mul;\r\n\r\n if (usage.min && usage.max)\r\n num = clamp(num, usage.min, usage.max);\r\n \r\n\treturn `${num.toFixed(2)}${usage.unit}`;\r\n}\r\n\r\nexport function convertBoolean(v: string, defaultValue = false): boolean {\r\n switch (v) {\r\n case \"1\": return true;\r\n case \"0\": return false;\r\n case \"on\": return true;\r\n case \"off\": return false;\r\n case \"true\": return true;\r\n case \"false\": return false;\r\n default: return defaultValue;\r\n }\r\n}\r\n\r\nexport function convertPercentage(val: string): number {\r\n return val ? parseInt(val) / 100 : null;\r\n}\r\n\r\nexport function parseCommonProperty(elem: Element, props: CommonProperties, xml: XmlParser): boolean {\r\n if(elem.namespaceURI != ns.wordml)\r\n return false;\r\n\r\n switch(elem.localName) {\r\n case \"color\": \r\n props.color = xml.attr(elem, \"val\");\r\n break;\r\n\r\n case \"sz\":\r\n props.fontSize = xml.lengthAttr(elem, \"val\", LengthUsage.FontSize);\r\n break;\r\n\r\n default:\r\n return false;\r\n }\r\n\r\n return true;\r\n}","import { Length, LengthUsage, LengthUsageType, convertLength, convertBoolean } from \"../document/common\";\r\n\r\nexport function parseXmlString(xmlString: string, trimXmlDeclaration: boolean = false): Document {\r\n if (trimXmlDeclaration)\r\n xmlString = xmlString.replace(/<[?].*[?]>/, \"\");\r\n \r\n xmlString = removeUTF8BOM(xmlString);\r\n \r\n const result = new DOMParser().parseFromString(xmlString, \"application/xml\"); \r\n const errorText = hasXmlParserError(result);\r\n\r\n if (errorText)\r\n throw new Error(errorText);\r\n\r\n return result;\r\n}\r\n\r\nfunction hasXmlParserError(doc: Document) {\r\n return doc.getElementsByTagName(\"parsererror\")[0]?.textContent;\r\n}\r\n\r\nfunction removeUTF8BOM(data: string) {\r\n return data.charCodeAt(0) === 0xFEFF ? data.substring(1) : data;\r\n}\r\n\r\nexport function serializeXmlString(elem: Node): string {\r\n return new XMLSerializer().serializeToString(elem);\r\n}\r\n\r\nexport class XmlParser {\r\n elements(elem: Element, localName: string = null): Element[] {\r\n const result = [];\r\n\r\n for (let i = 0, l = elem.childNodes.length; i < l; i++) {\r\n let c = elem.childNodes.item(i);\r\n\r\n if (c.nodeType == Node.ELEMENT_NODE && (localName == null || (c as Element).localName == localName))\r\n result.push(c);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n element(elem: Element, localName: string): Element {\r\n for (let i = 0, l = elem.childNodes.length; i < l; i++) {\r\n let c = elem.childNodes.item(i);\r\n\r\n if (c.nodeType == 1 && (c as Element).localName == localName)\r\n return c as Element;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n elementAttr(elem: Element, localName: string, attrLocalName: string): string {\r\n var el = this.element(elem, localName);\r\n return el ? this.attr(el, attrLocalName) : undefined;\r\n }\r\n\r\n\tattrs(elem: Element) {\r\n\t\treturn Array.from(elem.attributes);\r\n\t}\r\n\r\n attr(elem: Element, localName: string): string {\r\n for (let i = 0, l = elem.attributes.length; i < l; i++) {\r\n let a = elem.attributes.item(i);\r\n\r\n if (a.localName == localName)\r\n return a.value;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n intAttr(node: Element, attrName: string, defaultValue: number = null): number {\r\n var val = this.attr(node, attrName);\r\n return val ? parseInt(val) : defaultValue;\r\n }\r\n\r\n\thexAttr(node: Element, attrName: string, defaultValue: number = null): number {\r\n var val = this.attr(node, attrName);\r\n return val ? parseInt(val, 16) : defaultValue;\r\n }\r\n\r\n floatAttr(node: Element, attrName: string, defaultValue: number = null): number {\r\n var val = this.attr(node, attrName);\r\n return val ? parseFloat(val) : defaultValue;\r\n }\r\n\r\n boolAttr(node: Element, attrName: string, defaultValue: boolean = null) {\r\n return convertBoolean(this.attr(node, attrName), defaultValue);\r\n }\r\n\r\n lengthAttr(node: Element, attrName: string, usage: LengthUsageType = LengthUsage.Dxa): Length {\r\n return convertLength(this.attr(node, attrName), usage);\r\n }\r\n}\r\n\r\nconst globalXmlParser = new XmlParser();\r\n\r\nexport default globalXmlParser;","import { serializeXmlString } from \"../parser/xml-parser\";\r\nimport { OpenXmlPackage } from \"./open-xml-package\";\r\nimport { Relationship } from \"./relationship\";\r\n\r\nexport class Part {\r\n protected _xmlDocument: Document;\r\n\r\n rels: Relationship[];\r\n\r\n constructor(protected _package: OpenXmlPackage, public path: string) {\r\n }\r\n\r\n async load(): Promise<any> {\r\n this.rels = await this._package.loadRelationships(this.path);\r\n\r\n const xmlText = await this._package.load(this.path);\r\n const xmlDoc = this._package.parseXmlDocument(xmlText);\r\n\r\n if (this._package.options.keepOrigin) {\r\n this._xmlDocument = xmlDoc;\r\n }\r\n\r\n this.parseXml(xmlDoc.firstElementChild);\r\n }\r\n\r\n save() {\r\n this._package.update(this.path, serializeXmlString(this._xmlDocument));\r\n }\r\n\r\n protected parseXml(root: Element) {\r\n }\r\n}","import { XmlParser } from \"../parser/xml-parser\";\r\n\r\nconst embedFontTypeMap = {\r\n embedRegular: 'regular',\r\n embedBold: 'bold',\r\n embedItalic: 'italic',\r\n embedBoldItalic: 'boldItalic',\r\n}\r\n\r\nexport interface FontDeclaration {\r\n name: string,\r\n altName: string,\r\n family: string,\r\n embedFontRefs: EmbedFontRef[];\r\n}\r\n\r\nexport interface EmbedFontRef {\r\n id: string;\r\n key: string;\r\n type: 'regular' | 'bold' | 'italic' | 'boldItalic';\r\n}\r\n\r\nexport function parseFonts(root: Element, xml: XmlParser): FontDeclaration[] {\r\n return xml.elements(root).map(el => parseFont(el, xml));\r\n}\r\n\r\nexport function parseFont(elem: Element, xml: XmlParser): FontDeclaration {\r\n let result = <FontDeclaration>{\r\n name: xml.attr(elem, \"name\"),\r\n embedFontRefs: []\r\n };\r\n\r\n for (let el of xml.elements(elem)) {\r\n switch (el.localName) {\r\n case \"family\":\r\n result.family = xml.attr(el, \"val\");\r\n break;\r\n\r\n case \"altName\":\r\n result.altName = xml.attr(el, \"val\");\r\n break;\r\n\r\n case \"embedRegular\":\r\n case \"embedBold\":\r\n case \"embedItalic\":\r\n case \"embedBoldItalic\":\r\n result.embedFontRefs.push(parseEmbedFontRef(el, xml));\r\n break;\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport function parseEmbedFontRef(elem: Element, xml: XmlParser): EmbedFontRef {\r\n return { \r\n id: xml.attr(elem, \"id\"), \r\n key: xml.attr(elem, \"fontKey\"),\r\n type: embedFontTypeMap[elem.localName]\r\n };\r\n}","import { Part } from \"../common/part\";\r\nimport { FontDeclaration, parseFonts } from \"./fonts\";\r\n\r\nexport class FontTablePart extends Part {\r\n fonts: FontDeclaration[];\r\n\r\n parseXml(root: Element) {\r\n this.fonts = parseFonts(root, this._package.xmlParser);\r\n }\r\n}","import { XmlParser } from \"../parser/xml-parser\";\r\n\r\nexport interface ContentType {\r\n extension: string,\r\n partName: string,\r\n contentType: string;\r\n}\r\n\r\nexport function parseContentTypes(root: Element, xml: XmlParser): ContentType[] {\r\n return xml.elements(root).map(e => <ContentType>{\r\n extension: xml.attr(e, \"Extension\"),\r\n partName: xml.attr(e, \"PartName\"),\r\n contentType: xml.attr(e, \"ContentType\")\r\n });\r\n}","import JSZip from \"jszip\";\r\nimport { parseXmlString, XmlParser } from \"../parser/xml-parser\";\r\nimport { splitPath } from \"../utils\";\r\nimport { parseRelationships, Relationship } from \"./relationship\";\r\nimport { ContentType, parseContentTypes } from \"./content-types\";\r\n\r\nexport interface OpenXmlPackageOptions {\r\n trimXmlDeclaration: boolean,\r\n keepOrigin: boolean,\r\n}\r\n\r\nexport class OpenXmlPackage {\r\n xmlParser: XmlParser = new XmlParser();\r\n\r\n constructor(private _zip: JSZip, public options: OpenXmlPackageOptions) {\r\n }\r\n\r\n get(path: string): any {\r\n const p = normalizePath(path);\r\n return this._zip.files[p] ?? this._zip.files[p.replace(/\\//g, '\\\\')];\r\n }\r\n\r\n update(path: string, content: any) {\r\n this._zip.file(path, content);\r\n }\r\n\r\n static async load(input: Blob | any, options: OpenXmlPackageOptions): Promise<OpenXmlPackage> {\r\n const zip = await JSZip.loadAsync(input);\r\n\t\treturn new OpenXmlPackage(zip, options);\r\n }\r\n\r\n save(type: any = \"blob\"): Promise<any> {\r\n return this._zip.generateAsync({ type });\r\n }\r\n\r\n load(path: string, type: JSZip.OutputType = \"string\"): Promise<any> {\r\n return this.get(path)?.async(type) ?? Promise.resolve(null);\r\n }\r\n\r\n async loadRelationships(path: string = null): Promise<Relationship[]> {\r\n let relsPath = `_rels/.rels`;\r\n\r\n if (path != null) {\r\n const [f, fn] = splitPath(path);\r\n relsPath = `${f}_rels/${fn}.rels`;\r\n }\r\n\r\n const txt = await this.load(relsPath);\r\n\t\treturn txt ? parseRelationships(this.parseXmlDocument(txt).firstElementChild, this.xmlParser) : null;\r\n }\r\n\r\n async loadContentTypes(): Promise<ContentType[]> {\r\n const txt = await this.load(\"[Content_Types].xml\");\r\n\t\treturn txt ? parseContentTypes(this.parseXmlDocument(txt).firstElementChild, this.xmlParser) : [];\r\n }\r\n\r\n /** @internal */\r\n parseXmlDocument(txt: string): Document {\r\n return parseXmlString(txt, this.options.trimXmlDeclaration);\r\n }\r\n}\r\n\r\nfunction normalizePath(path: string) {\r\n return path.startsWith('/') ? path.substr(1) : path;\r\n}","import { OpenXmlPackage } from \"../common/open-xml-package\";\r\nimport { Part } from \"../common/part\";\r\nimport { DocumentParser } from \"../document-parser\";\r\nimport { DocumentElement } from \"./document\";\r\n\r\nexport class DocumentPart extends Part {\r\n private _documentParser: DocumentParser;\r\n\r\n constructor(pkg: OpenXmlPackage, path: string, parser: DocumentParser) {\r\n super(pkg, path);\r\n this._documentParser = parser;\r\n }\r\n \r\n body: DocumentElement\r\n\r\n parseXml(root: Element) {\r\n this.body = this._documentParser.parseDocumentFile(root);\r\n }\r\n}","import { XmlParser } from \"../parser/xml-parser\";\r\nimport { Length, LengthUsage } from \"./common\";\r\n\r\nexport interface Border {\r\n color: string;\r\n type: string;\r\n size: Length;\r\n frame: boolean;\r\n shadow: boolean;\r\n offset: Length;\r\n}\r\n\r\nexport interface Borders {\r\n top: Border;\r\n left: Border;\r\n right: Border;\r\n bottom: Border;\r\n}\r\n\r\nexport function parseBorder(elem: Element, xml: XmlParser): Border {\r\n return {\r\n type: xml.attr(elem, \"val\"),\r\n color: xml.attr(elem, \"color\"),\r\n size: xml.lengthAttr(elem, \"sz\", LengthUsage.Border),\r\n offset: xml.lengthAttr(elem, \"space\", LengthUsage.Point),\r\n frame: xml.boolAttr(elem, 'frame'),\r\n shadow: xml.boolAttr(elem, 'shadow')\r\n };\r\n}\r\n\r\nexport function parseBorders(elem: Element, xml: XmlParser): Borders {\r\n var result = <Borders>{};\r\n\r\n for (let e of xml.elements(elem)) {\r\n switch (e.localName) {\r\n case \"left\": result.left = parseBorder(e, xml); break;\r\n case \"top\": result.top = parseBorder(e, xml); break;\r\n case \"right\": result.right = parseBorder(e, xml); break;\r\n case \"bottom\": result.bottom = parseBorder(e, xml); break;\r\n }\r\n }\r\n\r\n return result;\r\n}","import globalXmlParser, { XmlParser } from \"../parser/xml-parser\";\r\nimport { Borders, parseBorders } from \"./border\";\r\nimport { Length } from \"./common\";\r\n\r\nexport interface Column {\r\n space: Length;\r\n width: Length;\r\n}\r\n\r\nexport interface Columns {\r\n space: Length;\r\n numberOfColumns: number;\r\n separator: boolean;\r\n equalWidth: boolean;\r\n columns: Column[];\r\n}\r\n\r\nexport interface PageSize {\r\n width: Length, \r\n height: Length, \r\n orientation: \"landscape\" | string \r\n}\r\n\r\nexport interface PageNumber {\r\n start: number;\r\n chapSep: \"colon\" | \"emDash\" | \"endash\" | \"hyphen\" | \"period\" | string;\r\n chapStyle: string;\r\n format: \"none\" | \"cardinalText\" | \"decimal\" | \"decimalEnclosedCircle\" | \"decimalEnclosedFullstop\" \r\n | \"decimalEnclosedParen\" | \"decimalZero\" | \"lowerLetter\" | \"lowerRoman\"\r\n | \"ordinalText\" | \"upperLetter\" | \"upperRoman\" | string;\r\n}\r\n\r\nexport interface PageMargins {\r\n top: Length;\r\n right: Length;\r\n bottom: Length;\r\n left: Length;\r\n header: Length;\r\n footer: Length;\r\n gutter: Length;\r\n}\r\n\r\nexport enum SectionType {\r\n Continuous = \"continuous\",\r\n NextPage = \"nextPage\", \r\n NextColumn = \"nextColumn\",\r\n EvenPage = \"evenPage\",\r\n OddPage = \"oddPage\",\r\n}\r\n\r\nexport interface FooterHeaderReference {\r\n id: string;\r\n type: string | \"first\" | \"even\" | \"default\";\r\n}\r\n\r\nexport interface SectionProperties {\r\n type: SectionType | string;\r\n pageSize: PageSize,\r\n pageMargins: PageMargins,\r\n pageBorders: Borders;\r\n pageNumber: PageNumber;\r\n columns: Columns;\r\n footerRefs: FooterHeaderReference[];\r\n headerRefs: FooterHeaderReference[];\r\n titlePage: boolean;\r\n}\r\n\r\nexport function parseSectionProperties(elem: Element, xml: XmlParser = globalXmlParser): SectionProperties {\r\n var section = <SectionProperties>{};\r\n\r\n for (let e of xml.elements(elem)) {\r\n switch (e.localName) {\r\n case \"pgSz\":\r\n section.pageSize = {\r\n width: xml.lengthAttr(e, \"w\"),\r\n height: xml.lengthAttr(e, \"h\"),\r\n orientation: xml.attr(e, \"orient\")\r\n }\r\n break;\r\n\r\n case \"type\":\r\n section.type = xml.attr(e, \"val\");\r\n break;\r\n\r\n case \"pgMar\":\r\n section.pageMargins = {\r\n left: xml.lengthAttr(e, \"left\"),\r\n right: xml.lengthAttr(e, \"right\"),\r\n top: xml.lengthAttr(e, \"top\"),\r\n bottom: xml.lengthAttr(e, \"bottom\"),\r\n header: xml.lengthAttr(e, \"header\"),\r\n footer: xml.lengthAttr(e, \"footer\"),\r\n gutter: xml.lengthAttr(e, \"gutter\"),\r\n };\r\n break;\r\n\r\n case \"cols\":\r\n section.columns = parseColumns(e, xml);\r\n break;\r\n\r\n case \"headerReference\":\r\n (section.headerRefs ?? (section.headerRefs = [])).push(parseFooterHeaderReference(e, xml)); \r\n break;\r\n \r\n case \"footerReference\":\r\n (section.footerRefs ?? (section.footerRefs = [])).push(parseFooterHeaderReference(e, xml)); \r\n break;\r\n\r\n case \"titlePg\":\r\n section.titlePage = xml.boolAttr(e, \"val\", true);\r\n break;\r\n\r\n case \"pgBorders\":\r\n section.pageBorders = parseBorders(e, xml);\r\n break;\r\n\r\n case \"pgNumType\":\r\n section.pageNumber = parsePageNumber(e, xml);\r\n break;\r\n }\r\n }\r\n\r\n return section;\r\n}\r\n\r\nfunction parseColumns(elem: Element, xml: XmlParser): Columns {\r\n return {\r\n numberOfColumns: xml.intAttr(elem, \"num\"),\r\n space: xml.lengthAttr(elem, \"space\"),\r\n separator: xml.boolAttr(elem, \"sep\"),\r\n equalWidth: xml.boolAttr(elem, \"equalWidth\", true),\r\n columns: xml.elements(elem, \"col\")\r\n .map(e => <Column>{\r\n width: xml.lengthAttr(e, \"w\"),\r\n space: xml.lengthAttr(e, \"space\")\r\n })\r\n };\r\n}\r\n\r\nfunction parsePageNumber(elem: Element, xml: XmlParser): PageNumber {\r\n return {\r\n chapSep: xml.attr(elem, \"chapSep\"),\r\n chapStyle: xml.attr(elem, \"chapStyle\"),\r\n format: xml.attr(elem, \"fmt\"),\r\n start: xml.intAttr(elem, \"start\")\r\n };\r\n}\r\n\r\nfunction parseFooterHeaderReference(elem: Element, xml: XmlParser): FooterHeaderReference {\r\n return {\r\n id: xml.attr(elem, \"id\"),\r\n type: xml.attr(elem, \"type\"),\r\n }\r\n}","import { XmlParser } from \"../parser/xml-parser\";\r\nimport { Length } from \"./common\";\r\n\r\nexport interface LineSpacing {\r\n after: Length;\r\n before: Length;\r\n line: number;\r\n lineRule: \"atLeast\" | \"exactly\" | \"auto\";\r\n}\r\n\r\nexport function parseLineSpacing(elem: Element, xml: XmlParser): LineSpacing {\r\n return {\r\n before: xml.lengthAttr(elem, \"before\"),\r\n after: xml.lengthAttr(elem, \"after\"),\r\n line: xml.intAttr(elem, \"line\"),\r\n lineRule: xml.attr(elem, \"lineRule\")\r\n } as LineSpacing;\r\n}","import { XmlParser } from \"../parser/xml-parser\";\r\nimport { CommonProperties, parseCommonProperty } from \"./common\";\r\nimport { OpenXmlElement } from \"./dom\";\r\n\r\nexport interface WmlRun extends OpenXmlElement, RunProperties {\r\n id?: string;\r\n verticalAlign?: string;\r\n\tfieldRun?: boolean; \r\n}\r\n\r\nexport interface RunProperties extends CommonProperties {\r\n\r\n}\r\n\r\nexport function parseRunProperties(elem: Element, xml: XmlParser): RunProperties {\r\n let result = <RunProperties>{};\r\n\r\n for(let el of xml.elements(elem)) {\r\n parseRunProperty(el, result, xml);\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport function parseRunProperty(elem: Element, props: RunProperties, xml: XmlParser) {\r\n if (parseCommonProperty(elem, props, xml))\r\n return true;\r\n\r\n return false;\r\n}","import { OpenXmlElement } from \"./dom\";\r\nimport { CommonProperties, Length, ns, parseCommonProperty } from \"./common\";\r\nimport { Borders } from \"./border\";\r\nimport { parseSectionProperties, SectionProperties } from \"./section\";\r\nimport { LineSpacing, parseLineSpacing } from \"./line-spacing\";\r\nimport { XmlParser } from \"../parser/xml-parser\";\r\nimport { parseRunProperties, RunProperties } from \"./run\";\r\n\r\nexport interface WmlParagraph extends OpenXmlElement, ParagraphProperties {\r\n}\r\n\r\nexport interface ParagraphProperties extends CommonProperties {\r\n sectionProps: SectionProperties;\r\n tabs: ParagraphTab[];\r\n numbering: ParagraphNumbering;\r\n\r\n border: Borders;\r\n textAlignment: \"auto\" | \"baseline\" | \"bottom\" | \"center\" | \"top\" | string;\r\n lineSpacing: LineSpacing;\r\n keepLines: boolean;\r\n keepNext: boolean;\r\n pageBreakBefore: boolean;\r\n outlineLevel: number;\r\n\tstyleName?: string;\r\n\r\n runProps: RunProperties;\r\n}\r\n\r\nexport interface ParagraphTab {\r\n style: \"bar\" | \"center\" | \"clear\" | \"decimal\" | \"end\" | \"num\" | \"start\" | \"left\" | \"right\";\r\n leader: \"none\" | \"dot\" | \"heavy\" | \"hyphen\" | \"middleDot\" | \"underscore\";\r\n position: Length;\r\n}\r\n\r\nexport interface ParagraphNumbering {\r\n id: string;\r\n level: number;\r\n}\r\n\r\nexport function parseParagraphProperties(elem: Element, xml: XmlParser): ParagraphProperties {\r\n let result = <ParagraphProperties>{};\r\n\r\n for(let el of xml.elements(elem)) {\r\n parseParagraphProperty(el, result, xml);\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport function parseParagraphProperty(elem: Element, props: ParagraphProperties, xml: XmlParser) {\r\n if (elem.namespaceURI != ns.wordml)\r\n return false;\r\n\r\n if(parseCommonProperty(elem, props, xml))\r\n return true;\r\n\r\n switch (elem.localName) {\r\n case \"tabs\":\r\n props.tabs = parseTabs(elem, xml);\r\n break;\r\n\r\n case \"sectPr\":\r\n props.sectionProps = parseSectionProperties(elem, xml);\r\n break;\r\n\r\n case \"numPr\":\r\n props.numbering = parseNumbering(elem, xml);\r\n break;\r\n \r\n case \"spacing\":\r\n props.lineSpacing = parseLineSpacing(elem, xml);\r\n return false; // TODO\r\n break;\r\n\r\n case \"textAlignment\":\r\n props.textAlignment = xml.attr(elem, \"val\");\r\n return false; //TODO\r\n break;\r\n\r\n case \"keepLines\":\r\n props.keepLines = xml.boolAttr(elem, \"val\", true);\r\n break;\r\n \r\n case \"keepNext\":\r\n props.keepNext = xml.boolAttr(elem, \"val\", true);\r\n break;\r\n \r\n case \"pageBreakBefore\":\r\n props.pageBreakBefore = xml.boolAttr(elem, \"val\", true);\r\n break;\r\n \r\n case \"outlineLvl\":\r\n props.outlineLevel = xml.intAttr(elem, \"val\");\r\n break;\r\n\r\n case \"pStyle\":\r\n props.styleName = xml.attr(elem, \"val\");\r\n break;\r\n\r\n case \"rPr\":\r\n props.runProps = parseRunProperties(elem, xml);\r\n break;\r\n \r\n default:\r\n return false;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport function parseTabs(elem: Element, xml: XmlParser): ParagraphTab[] {\r\n return xml.elements(elem, \"tab\")\r\n .map(e => <ParagraphTab>{\r\n position: xml.lengthAttr(e, \"pos\"),\r\n leader: xml.attr(e, \"leader\"),\r\n style: xml.attr(e, \"val\")\r\n });\r\n}\r\n\r\nexport function parseNumbering(elem: Element, xml: XmlParser): ParagraphNumbering {\r\n var result = <ParagraphNumbering>{};\r\n\r\n for (let e of xml.elements(elem)) {\r\n switch (e.localName) {\r\n case \"numId\":\r\n result.id = xml.attr(e, \"val\");\r\n break;\r\n\r\n case \"ilvl\":\r\n result.level = xml.intAttr(e, \"val\");\r\n break;\r\n }\r\n }\r\n\r\n return result;\r\n}","import { NumberingPicBullet } from \"../document/dom\";\r\nimport { ParagraphProperties, parseParagraphProperties } from \"../document/paragraph\";\r\nimport { parseRunProperties, RunProperties } from \"../document/run\";\r\nimport { XmlParser } from \"../parser/xml-parser\";\r\n\r\nexport interface NumberingPartProperties {\r\n numberings: Numbering[];\r\n abstractNumberings: AbstractNumbering[];\r\n bulletPictures: NumberingBulletPicture[];\r\n}\r\n\r\nexport interface Numbering {\r\n id: string;\r\n abstractId: string;\r\n overrides: NumberingLevelOverride[];\r\n}\r\n\r\nexport interface NumberingLevelOverride {\r\n level: number;\r\n start: number;\r\n numberingLevel: NumberingLevel;\r\n}\r\n\r\nexport interface AbstractNumbering {\r\n id: string;\r\n name: string;\r\n multiLevelType: \"singleLevel\" | \"multiLevel\" | \"hybridMultilevel\" | string;\r\n levels: NumberingLevel[];\r\n numberingStyleLink: string;\r\n styleLink: string;\r\n}\r\n\r\nexport interface NumberingLevel {\r\n level: number;\r\n start: string;\r\n restart: number;\r\n format: 'lowerRoman' | 'lowerLetter' | string;\r\n text: string;\r\n justification: string;\r\n bulletPictureId: string;\r\n paragraphStyle: string;\r\n paragraphProps: ParagraphProperties;\r\n runProps: RunProperties;\r\n}\r\n\r\nexport interface NumberingBulletPicture {\r\n id: string;\r\n referenceId: string;\r\n style: string;\r\n}\r\n\r\nexport function parseNumberingPart(elem: Element, xml: XmlParser): NumberingPartProperties {\r\n let result: NumberingPartProperties = {\r\n numberings: [],\r\n abstractNumberings: [],\r\n bulletPictures: []\r\n }\r\n \r\n for (let e of xml.elements(elem)) {\r\n switch (e.localName) {\r\n case \"num\":\r\n result.numberings.push(parseNumbering(e, xml));\r\n break;\r\n case \"abstractNum\":\r\n result.abstractNumberings.push(parseAbstractNumbering(e, xml));\r\n break;\r\n case \"numPicBullet\":\r\n result.bulletPictures.push(parseNumberingBulletPicture(e, xml));\r\n break;\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport function parseNumbering(elem: Element, xml: XmlParser): Numbering {\r\n let result = <Numbering>{\r\n id: xml.attr(elem, 'numId'),\r\n overrides: []\r\n };\r\n\r\n for (let e of xml.elements(elem)) {\r\n switch (e.localName) {\r\n case \"abstractNumId\":\r\n result.abstractId = xml.attr(e, \"val\");\r\n break;\r\n case \"lvlOverride\":\r\n result.overrides.push(parseNumberingLevelOverrride(e, xml));\r\n break;\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport function parseAbstractNumbering(elem: Element, xml: XmlParser): AbstractNumbering {\r\n let result = <AbstractNumbering>{\r\n id: xml.attr(elem, 'abstractNumId'),\r\n levels: []\r\n };\r\n\r\n for (let e of xml.elements(elem)) {\r\n switch (e.localName) {\r\n case \"name\":\r\n result.name = xml.attr(e, \"val\");\r\n break;\r\n case \"multiLevelType\":\r\n result.multiLevelType = xml.attr(e, \"val\");\r\n break;\r\n case \"numStyleLink\":\r\n result.numberingStyleLink = xml.attr(e, \"val\");\r\n break;\r\n case \"styleLink\":\r\n result.styleLink = xml.attr(e, \"val\");\r\n break;\r\n case \"lvl\":\r\n result.levels.push(parseNumberingLevel(e, xml));\r\n break;\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport function parseNumberingLevel(elem: Element, xml: XmlParser): NumberingLevel {\r\n let result = <NumberingLevel>{\r\n level: xml.intAttr(elem, 'ilvl')\r\n };\r\n\r\n for (let e of xml.elements(elem)) {\r\n switch (e.localName) {\r\n case \"start\":\r\n result.start = xml.attr(e, \"val\");\r\n break;\r\n case \"lvlRestart\":\r\n result.restart = xml.intAttr(e, \"val\");\r\n break;\r\n case \"numFmt\":\r\n result.format = xml.attr(e, \"val\");\r\n break;\r\n case \"lvlText\":\r\n result.text = xml.attr(e, \"val\");\r\n break;\r\n case \"lvlJc\":\r\n result.justification = xml.attr(e, \"val\");\r\n break;\r\n case \"lvlPicBulletId\":\r\n result.bulletPictureId = xml.attr(e, \"val\");\r\n break;\r\n case \"pStyle\":\r\n result.paragraphStyle = xml.attr(e, \"val\");\r\n break;\r\n case \"pPr\":\r\n result.paragraphProps = parseParagraphProperties(e, xml);\r\n break;\r\n case \"rPr\":\r\n result.runProps = parseRunProperties(e, xml);\r\n break;\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport function parseNumberingLevelOverrride(elem: Element, xml: XmlParser): NumberingLevelOverride {\r\n let result = <NumberingLevelOverride>{\r\n level: xml.intAttr(elem, 'ilvl')\r\n };\r\n\r\n for (let e of xml.elements(elem)) {\r\n switch (e.localName) {\r\n case \"startOverride\":\r\n result.start = xml.intAttr(e, \"val\");\r\n break;\r\n case \"lvl\":\r\n result.numberingLevel = parseNumberingLevel(e, xml);\r\n break;\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport function parseNumberingBulletPicture(elem: Element, xml: XmlParser): NumberingBulletPicture {\r\n //TODO\r\n var pict = xml.element(elem, \"pict\");\r\n var shape = pict && xml.element(pict, \"shape\");\r\n var imagedata = shape && xml.element(shape, \"imagedata\");\r\n\r\n return imagedata ? {\r\n id: xml.attr(elem, \"numPicBulletId\"),\r\n referenceId: xml.attr(imagedata, \"id\"),\r\n style: xml.attr(shape, \"style\")\r\n } : null;\r\n}","import { OpenXmlPackage } from \"../common/open-xml-package\";\r\nimport { Part } from \"../common/part\";\r\nimport { DocumentParser } from \"../document-parser\";\r\nimport { IDomNumbering } from \"../document/dom\";\r\nimport { AbstractNumbering, Numbering, NumberingBulletPicture, NumberingPartProperties, parseNumberingPart } from \"./numbering\";\r\n\r\nexport class NumberingPart extends Part implements NumberingPartProperties {\r\n private _documentParser: DocumentParser;\r\n\r\n constructor(pkg: OpenXmlPackage, path: string, parser: DocumentParser) {\r\n super(pkg, path);\r\n this._documentParser = parser;\r\n }\r\n\r\n numberings: Numbering[];\r\n abstractNumberings: AbstractNumbering[];\r\n bulletPictures: NumberingBulletPicture[];\r\n \r\n domNumberings: IDomNumbering[];\r\n\r\n parseXml(root: Element) {\r\n Object.assign(this, parseNumberingPart(root, this._package.xmlParser));\r\n this.domNumberings = this._documentParser.parseNumberingFile(root); \r\n }\r\n}","import { OpenXmlPackage } from \"../common/open-xml-package\";\r\nimport { Part } from \"../common/part\";\r\nimport { DocumentParser } from \"../document-parser\";\r\nimport { IDomStyle } from \"../document/style\";\r\n\r\nexport class StylesPart extends Part {\r\n styles: IDomStyle[];\r\n\r\n private _documentParser: DocumentParser;\r\n\r\n constructor(pkg: OpenXmlPackage, path: string, parser: DocumentParser) {\r\n super(pkg, path);\r\n this._documentParser = parser;\r\n }\r\n\r\n parseXml(root: Element) {\r\n this.styles = this._documentParser.parseStylesFile(root); \r\n }\r\n}","export enum DomType {\r\n Document = \"document\",\r\n Paragraph = \"paragraph\",\r\n Run = \"run\",\r\n Break = \"break\",\r\n NoBreakHyphen = \"noBreakHyphen\",\r\n Table = \"table\",\r\n Row = \"row\",\r\n Cell = \"cell\",\r\n Hyperlink = \"hyperlink\",\r\n SmartTag = \"smartTag\",\r\n Drawing = \"drawing\",\r\n Image = \"image\",\r\n Text = \"text\",\r\n Tab = \"tab\",\r\n Symbol = \"symbol\",\r\n BookmarkStart = \"bookmarkStart\",\r\n BookmarkEnd = \"bookmarkEnd\",\r\n Footer = \"footer\",\r\n Header = \"header\",\r\n FootnoteReference = \"footnoteReference\", \r\n\tEndnoteReference = \"endnoteReference\",\r\n Footnote = \"footnote\",\r\n Endnote = \"endnote\",\r\n SimpleField = \"simpleField\",\r\n ComplexField = \"complexField\",\r\n Instruction = \"instruction\",\r\n\tVmlPicture = \"vmlPicture\",\r\n\tMmlMath = \"mmlMath\",\r\n\tMmlMathParagraph = \"mmlMathParagraph\",\r\n\tMmlFraction = \"mmlFraction\",\r\n\tMmlFunction = \"mmlFunction\",\r\n\tMmlFunctionName = \"mmlFunctionName\",\r\n\tMmlNumerator = \"mmlNumerator\",\r\n\tMmlDenominator = \"mmlDenominator\",\r\n\tMmlRadical = \"mmlRadical\",\r\n\tMmlBase = \"mmlBase\",\r\n\tMmlDegree = \"mmlDegree\",\r\n\tMmlSuperscript = \"mmlSuperscript\",\r\n\tMmlSubscript = \"mmlSubscript\",\r\n\tMmlPreSubSuper = \"mmlPreSubSuper\",\r\n\tMmlSubArgument = \"mmlSubArgument\",\r\n\tMmlSuperArgument = \"mmlSuperArgument\",\r\n\tMmlNary = \"mmlNary\",\r\n\tMmlDelimiter = \"mmlDelimiter\",\r\n\tMmlRun = \"mmlRun\",\r\n\tMmlEquationArray = \"mmlEquationArray\",\r\n\tMmlLimit = \"mmlLimit\",\r\n\tMmlLimitLower = \"mmlLimitLower\",\r\n\tMmlMatrix = \"mmlMatrix\",\r\n\tMmlMatrixRow = \"mmlMatrixRow\",\r\n\tMmlBox = \"mmlBox\",\r\n\tMmlBar = \"mmlBar\",\r\n\tMmlGroupChar = \"mmlGroupChar\",\r\n\tVmlElement = \"vmlElement\",\r\n\tInserted = \"inserted\",\r\n\tDeleted = \"deleted\",\r\n\tDeletedText = \"deletedText\",\r\n\tComment = \"comment\",\r\n\tCommentReference = \"commentReference\",\r\n\tCommentRangeStart = \"commentRangeStart\",\r\n\tCommentRangeEnd = \"commentRangeEnd\",\r\n AltChunk = \"altChunk\"\r\n}\r\n\r\nexport interface OpenXmlElement {\r\n type: DomType;\r\n children?: OpenXmlElement[];\r\n cssStyle?: Record<string, string>;\r\n props?: Record<string, any>;\r\n \r\n\tstyleName?: string; //style name\r\n\tclassName?: string; //class mods\r\n\r\n parent?: OpenXmlElement;\r\n}\r\n\r\nexport abstract class OpenXmlElementBase implements OpenXmlElement {\r\n type: DomType;\r\n children?: OpenXmlElement[] = [];\r\n cssStyle?: Record<string, string> = {};\r\n props?: Record<string, any>;\r\n\r\n className?: string;\r\n styleName?: string;\r\n\r\n parent?: OpenXmlElement;\r\n}\r\n\r\nexport interface WmlHyperlink extends OpenXmlElement {\r\n\tid?: string;\r\n anchor?: string;\r\n}\r\n\r\nexport interface WmlAltChunk extends OpenXmlElement {\r\n\tid?: string;\r\n}\r\n\r\nexport interface WmlSmartTag extends OpenXmlElement {\r\n\turi?: string;\r\n element?: string;\r\n}\r\n\r\nexport interface WmlChange extends OpenXmlElement {\r\n id: string;\r\n author: string;\r\n date: string;\r\n}\r\n\r\nexport interface WmlNoteReference extends OpenXmlElement {\r\n id: string;\r\n}\r\n\r\nexport interface WmlBreak extends OpenXmlElement{\r\n break: \"page\" | \"lastRenderedPageBreak\" | \"textWrapping\";\r\n}\r\n\r\nexport interface WmlText extends OpenXmlElement{\r\n text: string;\r\n}\r\n\r\nexport interface WmlSymbol extends OpenXmlElement {\r\n font: string;\r\n char: number;\r\n}\r\n\r\nexport interface WmlTable extends OpenXmlElement {\r\n columns?: WmlTableColumn[];\r\n cellStyle?: Record<string, string>;\r\n\r\n\tcolBandSize?: number;\r\n\trowBandSize?: number;\r\n}\r\n\r\nexport interface WmlTableRow extends OpenXmlElement {\r\n\tisHeader?: boolean;\r\n gridBefore?: number;\r\n gridAfter?: number;\r\n}\r\n\r\nexport interface WmlTableCell extends OpenXmlElement {\r\n\tverticalMerge?: 'restart' | 'continue' | string;\r\n span?: number;\r\n}\r\n\r\nexport interface IDomImage extends OpenXmlElement {\r\n src: string;\r\n srcRect: number[];\r\n rotation: number;\r\n}\r\n\r\nexport interface WmlTableColumn {\r\n width?: string;\r\n}\r\n\r\nexport interface IDomNumbering {\r\n id: string;\r\n level: number;\r\n start: number;\r\n pStyleName: string;\r\n pStyle: Record<string, string>;\r\n rStyle: Record<string, string>;\r\n levelText?: string;\r\n suff: string;\r\n format?: string;\r\n bullet?: NumberingPicBullet;\r\n}\r\n\r\nexport interface NumberingPicBullet {\r\n id: number;\r\n src: string;\r\n style?: string;\r\n}\r\n","import { OpenXmlElementBase, DomType } from \"../document/dom\";\r\n\r\nexport class WmlHeader extends OpenXmlElementBase {\r\n type: DomType = DomType.Header;\r\n}\r\n\r\nexport class WmlFooter extends OpenXmlElementBase {\r\n type: DomType = DomType.Footer;\r\n}","import { OpenXmlPackage } from \"../common/open-xml-package\";\r\nimport { Part } from \"../common/part\";\r\nimport { DocumentParser } from \"../document-parser\";\r\nimport { OpenXmlElement } from \"../document/dom\";\r\nimport { WmlHeader, WmlFooter } from \"./elements\";\r\n\r\nexport abstract class BaseHeaderFooterPart<T extends OpenXmlElement = OpenXmlElement> extends Part {\r\n rootElement: T;\r\n\r\n private _documentParser: DocumentParser;\r\n\r\n constructor(pkg: OpenXmlPackage, path: string, parser: DocumentParser) {\r\n super(pkg, path);\r\n this._documentParser = parser;\r\n }\r\n\r\n parseXml(root: Element) {\r\n this.rootElement = this.createRootElement();\r\n this.rootElement.children = this._documentParser.parseBodyElements(root);\r\n }\r\n\r\n protected abstract createRootElement(): T;\r\n}\r\n\r\nexport class HeaderPart extends BaseHeaderFooterPart<WmlHeader> {\r\n protected createRootElement(): WmlHeader {\r\n return new WmlHeader();\r\n }\r\n}\r\n\r\nexport class FooterPart extends BaseHeaderFooterPart<WmlFooter> {\r\n protected createRootElement(): WmlFooter {\r\n return new WmlFooter();\r\n }\r\n}","import { XmlParser } from \"../parser/xml-parser\";\r\n\r\nexport interface ExtendedPropsDeclaration {\r\n template: string,\r\n totalTime: number,\r\n pages: number,\r\n words: number,\r\n characters: number,\r\n application: string,\r\n lines: number,\r\n paragraphs: number,\r\n company: string,\r\n appVersion: string\r\n}\r\n\r\nexport function parseExtendedProps(root: Element, xmlParser: XmlParser): ExtendedPropsDeclaration {\r\n const result = <ExtendedPropsDeclaration>{\r\n\r\n };\r\n\r\n for (let el of xmlParser.elements(root)) {\r\n switch (el.localName) {\r\n case \"Template\":\r\n result.template = el.textContent;\r\n break;\r\n case \"Pages\":\r\n result.pages = safeParseToInt(el.textContent);\r\n break;\r\n case \"Words\":\r\n result.words = safeParseToInt(el.textContent);\r\n break;\r\n case \"Characters\":\r\n result.characters = safeParseToInt(el.textContent);\r\n break;\r\n case \"Application\":\r\n result.application = el.textContent;\r\n break;\r\n case \"Lines\":\r\n result.lines = safeParseToInt(el.textContent);\r\n break;\r\n case \"Paragraphs\":\r\n result.paragraphs = safeParseToInt(el.textContent);\r\n break;\r\n case \"Company\":\r\n result.company = el.textContent;\r\n break;\r\n case \"AppVersion\":\r\n result.appVersion = el.textContent;\r\n break;\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\nfunction safeParseToInt(value: string): number {\r\n if (typeof value === 'undefined')\r\n return;\r\n return parseInt(value);\r\n}","import { Part } from \"../common/part\";\r\nimport { ExtendedPropsDeclaration, parseExtendedProps } from \"./extended-props\";\r\n\r\nexport class ExtendedPropsPart extends Part {\r\n props: ExtendedPropsDeclaration;\r\n\r\n parseXml(root: Element) {\r\n this.props = parseExtendedProps(root, this._package.xmlParser);\r\n }\r\n}","import { XmlParser } from \"../parser/xml-parser\";\r\n\r\nexport interface CorePropsDeclaration {\r\n title: string,\r\n description: string,\r\n subject: string,\r\n creator: string,\r\n keywords: string,\r\n language: string,\r\n lastModifiedBy: string,\r\n revision: number,\r\n}\r\n\r\nexport function parseCoreProps(root: Element, xmlParser: XmlParser): CorePropsDeclaration {\r\n const result = <CorePropsDeclaration>{};\r\n\r\n for (let el of xmlParser.elements(root)) {\r\n switch (el.localName) {\r\n case \"title\": result.title = el.textContent; break;\r\n case \"description\": result.description = el.textContent; break;\r\n case \"subject\": result.subject = el.textContent; break;\r\n case \"creator\": result.creator = el.textContent; break;\r\n case \"keywords\": result.keywords = el.textContent; break;\r\n case \"language\": result.language = el.textContent; break;\r\n case \"lastModifiedBy\": result.lastModifiedBy = el.textContent; break;\r\n case \"revision\": el.textContent && (result.revision = parseInt(el.textContent)); break;\r\n }\r\n }\r\n\r\n return result;\r\n}","import { Part } from \"../common/part\";\r\nimport { CorePropsDeclaration, parseCoreProps } from \"./core-props\";\r\n\r\nexport class CorePropsPart extends Part {\r\n props: CorePropsDeclaration;\r\n\r\n parseXml(root: Element) {\r\n this.props = parseCoreProps(root, this._package.xmlParser);\r\n }\r\n}","import { XmlParser } from \"../parser/xml-parser\";\r\n\r\nexport class DmlTheme {\r\n colorScheme: DmlColorScheme;\r\n fontScheme: DmlFontScheme;\r\n}\r\n\r\nexport interface DmlColorScheme {\r\n name: string;\r\n colors: Record<string, string>;\r\n}\r\n\r\nexport interface DmlFontScheme {\r\n name: string;\r\n majorFont: DmlFormInfo,\r\n minorFont: DmlFormInfo\r\n}\r\n\r\nexport interface DmlFormInfo {\r\n latinTypeface: string;\r\n eaTypeface: string;\r\n csTypeface: string;\r\n}\r\n\r\nexport function parseTheme(elem: Element, xml: XmlParser) {\r\n var result = new DmlTheme();\r\n var themeElements = xml.element(elem, \"themeElements\");\r\n\r\n for (let el of xml.elements(themeElements)) {\r\n switch(el.localName) {\r\n case \"clrScheme\": result.colorScheme = parseColorScheme(el, xml); break;\r\n case \"fontScheme\": result.fontScheme = parseFontScheme(el, xml); break;\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport function parseColorScheme(elem: Element, xml: XmlParser) {\r\n var result: DmlColorScheme = { \r\n name: xml.attr(elem, \"name\"),\r\n colors: {}\r\n };\r\n\r\n for (let el of xml.elements(elem)) {\r\n var srgbClr = xml.element(el, \"srgbClr\");\r\n var sysClr = xml.element(el, \"sysClr\");\r\n\r\n if (srgbClr) {\r\n result.colors[el.localName] = xml.attr(srgbClr, \"val\");\r\n }\r\n else if (sysClr) {\r\n result.colors[el.localName] = xml.attr(sysClr, \"lastClr\");\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport function parseFontScheme(elem: Element, xml: XmlParser) {\r\n var result: DmlFontScheme = { \r\n name: xml.attr(elem, \"name\"),\r\n } as DmlFontScheme;\r\n\r\n for (let el of xml.elements(elem)) {\r\n switch (el.localName) {\r\n case \"majorFont\": result.majorFont = parseFontInfo(el, xml); break;\r\n case \"minorFont\": result.minorFont = parseFontInfo(el, xml); break;\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport function parseFontInfo(elem: Element, xml: XmlParser): DmlFormInfo {\r\n return {\r\n latinTypeface: xml.elementAttr(elem, \"latin\", \"typeface\"),\r\n eaTypeface: xml.elementAttr(elem, \"ea\", \"typeface\"),\r\n csTypeface: xml.elementAttr(elem, \"cs\", \"typeface\"),\r\n };\r\n}","import { OpenXmlPackage } from \"../common/open-xml-package\";\r\nimport { Part } from \"../common/part\";\r\nimport { DmlTheme, parseTheme } from \"./theme\";\r\n\r\nexport class ThemePart extends Part {\r\n theme: DmlTheme;\r\n\r\n constructor(pkg: OpenXmlPackage, path: string) {\r\n super(pkg, path);\r\n }\r\n\r\n parseXml(root: Element) {\r\n this.theme = parseTheme(root, this._package.xmlParser);\r\n }\r\n}","import { OpenXmlElementBase, DomType } from \"../document/dom\";\r\n\r\nexport abstract class WmlBaseNote implements OpenXmlElementBase {\r\n type: DomType;\r\n id: string;\r\n\tnoteType: string;\r\n}\r\n\r\nexport class WmlFootnote extends WmlBaseNote {\r\n\ttype = DomType.Footnote\r\n}\r\n\r\nexport class WmlEndnote extends WmlBaseNote {\r\n\ttype = DomType.Endnote\r\n}","import { OpenXmlPackage } from \"../common/open-xml-package\";\r\nimport { Part } from \"../common/part\";\r\nimport { DocumentParser } from \"../document-parser\";\r\nimport { WmlBaseNote, WmlEndnote, WmlFootnote } from \"./elements\";\r\n\r\nexport class BaseNotePart<T extends WmlBaseNote> extends Part {\r\n protected _documentParser: DocumentParser;\r\n\r\n notes: T[]\r\n\r\n constructor(pkg: OpenXmlPackage, path: string, parser: DocumentParser) {\r\n super(pkg, path);\r\n this._documentParser = parser;\r\n }\r\n}\r\n\r\nexport class FootnotesPart extends BaseNotePart<WmlFootnote> {\r\n constructor(pkg: OpenXmlPackage, path: string, parser: DocumentParser) {\r\n super(pkg, path, parser);\r\n }\r\n\r\n parseXml(root: Element) {\r\n this.notes = this._documentParser.parseNotes(root, \"footnote\", WmlFootnote);\r\n }\r\n}\r\n\r\nexport class EndnotesPart extends BaseNotePart<WmlEndnote> {\r\n constructor(pkg: OpenXmlPackage, path: string, parser: DocumentParser) {\r\n super(pkg, path, parser);\r\n }\r\n\r\n parseXml(root: Element) {\r\n this.notes = this._documentParser.parseNotes(root, \"endnote\", WmlEndnote);\r\n }\r\n}","import { DocumentParser } from \"../document-parser\";\r\nimport { Length } from \"../document/common\";\r\nimport { XmlParser } from \"../parser/xml-parser\";\r\n\r\nexport interface WmlSettings {\r\n\tdefaultTabStop: Length;\r\n\tfootnoteProps: NoteProperties;\r\n\tendnoteProps: NoteProperties;\r\n\tautoHyphenation: boolean;\r\n\t/** w:compatSetting \"compatibilityMode\"; 11 = Word 2003 layout rules */\r\n\tcompatMode?: number;\r\n}\r\n\r\nexport interface NoteProperties {\r\n\tnummeringFormat: string;\r\n\tdefaultNoteIds: string[];\r\n}\r\n\r\nexport function parseSettings(elem: Element, xml: XmlParser) {\r\n\tvar result = {} as WmlSettings; \r\n\r\n\tfor (let el of xml.elements(elem)) {\r\n\t\tswitch(el.localName) {\r\n\t\t\tcase \"defaultTabStop\": result.defaultTabStop = xml.lengthAttr(el, \"val\"); break;\r\n\t\t\tcase \"footnotePr\": result.footnoteProps = parseNoteProperties(el, xml); break;\r\n\t\t\tcase \"endnotePr\": result.endnoteProps = parseNoteProperties(el, xml); break;\r\n\t\t\tcase \"autoHyphenation\": result.autoHyphenation = xml.boolAttr(el, \"val\"); break;\r\n\t\t\tcase \"compat\":\r\n\t\t\t\tfor (let c of xml.elements(el)) {\r\n\t\t\t\t\tif (c.localName == \"compatSetting\"\r\n\t\t\t\t\t\t&& xml.attr(c, \"name\") == \"compatibilityMode\"\r\n\t\t\t\t\t\t&& (xml.attr(c, \"uri\") ?? \"\").includes(\"schemas.microsoft.com/office/word\")) {\r\n\t\t\t\t\t\tresult.compatMode = xml.intAttr(c, \"val\", null);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n return result;\r\n}\r\n\r\nexport function parseNoteProperties(elem: Element, xml: XmlParser) {\r\n\tvar result = {\r\n\t\tdefaultNoteIds: []\r\n\t} as NoteProperties; \r\n\r\n\tfor (let el of xml.elements(elem)) {\r\n\t\tswitch(el.localName) {\r\n\t\t\tcase \"numFmt\": \r\n\t\t\t\tresult.nummeringFormat = xml.attr(el, \"val\");\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase \"footnote\": \r\n\t\t\tcase \"endnote\": \r\n\t\t\t\tresult.defaultNoteIds.push(xml.attr(el, \"id\"));\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n return result;\r\n}","import { OpenXmlPackage } from \"../common/open-xml-package\";\r\nimport { Part } from \"../common/part\";\r\nimport { WmlSettings, parseSettings } from \"./settings\";\r\n\r\nexport class SettingsPart extends Part {\r\n\tsettings: WmlSettings;\r\n\r\n\tconstructor(pkg: OpenXmlPackage, path: string) {\r\n\t\tsuper(pkg, path);\r\n\t}\r\n\r\n\tparseXml(root: Element) {\r\n\t\tthis.settings = parseSettings(root, this._package.xmlParser);\r\n\t}\r\n}","import { XmlParser } from \"../parser/xml-parser\";\r\n\r\nexport interface CustomProperty {\r\n\tformatId: string;\r\n\tname: string;\r\n\ttype: string;\r\n\tvalue: string;\r\n}\r\n\r\nexport function parseCustomProps(root: Element, xml: XmlParser): CustomProperty[] {\r\n\treturn xml.elements(root, \"property\").map(e => {\r\n\t\tconst firstChild = e.firstChild;\r\n\r\n\t\treturn {\r\n\t\t\tformatId: xml.attr(e, \"fmtid\"),\r\n\t\t\tname: xml.attr(e, \"name\"),\r\n\t\t\ttype: firstChild.nodeName,\r\n\t\t\tvalue: firstChild.textContent\r\n\t\t};\r\n\t});\r\n}","import { Part } from \"../common/part\";\r\nimport { CustomProperty, parseCustomProps } from \"./custom-props\";\r\n\r\nexport class CustomPropsPart extends Part {\r\n props: CustomProperty[];\r\n\r\n parseXml(root: Element) {\r\n this.props = parseCustomProps(root, this._package.xmlParser);\r\n }\r\n}","import { Part } from \"../common/part\";\r\nimport { OpenXmlPackage } from \"../common/open-xml-package\";\r\nimport { DocumentParser } from \"../document-parser\";\r\nimport { WmlComment } from \"./elements\";\r\nimport { keyBy } from \"../utils\";\r\n\r\nexport class CommentsPart extends Part {\r\n protected _documentParser: DocumentParser;\r\n\r\n comments: WmlComment[]\r\n commentMap: Record<string, WmlComment>;\r\n\r\n constructor(pkg: OpenXmlPackage, path: string, parser: DocumentParser) {\r\n super(pkg, path);\r\n this._documentParser = parser;\r\n }\r\n\r\n\tparseXml(root: Element) {\r\n this.comments = this._documentParser.parseComments(root);\r\n\t\tthis.commentMap = keyBy(this.comments, x => x.id);\r\n }\r\n}","import { Part } from \"../common/part\";\r\nimport { OpenXmlPackage } from \"../common/open-xml-package\";\r\nimport { keyBy } from \"../utils\";\r\n\r\nexport type CommentsExtended = {\r\n paraId: string;\r\n paraIdParent?: string;\r\n done: boolean;\r\n}\r\n\r\nexport class CommentsExtendedPart extends Part {\r\n comments: CommentsExtended[] = [];\r\n commentMap: Record<string, CommentsExtended>;\r\n\r\n constructor(pkg: OpenXmlPackage, path: string) {\r\n super(pkg, path);\r\n }\r\n\r\n\tparseXml(root: Element) {\r\n const xml = this._package.xmlParser;\r\n\r\n for (let el of xml.elements(root, \"commentEx\")) {\r\n this.comments.push({\r\n paraId: xml.attr(el, 'paraId'),\r\n paraIdParent: xml.attr(el, 'paraIdParent'),\r\n done: xml.boolAttr(el, 'done')\r\n });\r\n }\r\n\r\n\t\tthis.commentMap = keyBy(this.comments, x => x.paraId);\r\n }\r\n}\r\n","import { OutputType } from \"jszip\";\r\n\r\nimport { DocumentParser } from './document-parser';\r\nimport { Relationship, RelationshipTypes } from './common/relationship';\r\nimport { Part } from './common/part';\r\nimport { FontTablePart } from './font-table/font-table';\r\nimport { OpenXmlPackage } from './common/open-xml-package';\r\nimport { DocumentPart } from './document/document-part';\r\nimport { blobToBase64, resolvePath, splitPath } from './utils';\r\nimport { NumberingPart } from './numbering/numbering-part';\r\nimport { StylesPart } from './styles/styles-part';\r\nimport { FooterPart, HeaderPart } from \"./header-footer/parts\";\r\nimport { ExtendedPropsPart } from \"./document-props/extended-props-part\";\r\nimport { CorePropsPart } from \"./document-props/core-props-part\";\r\nimport { ThemePart } from \"./theme/theme-part\";\r\nimport { EndnotesPart, FootnotesPart } from \"./notes/parts\";\r\nimport { SettingsPart } from \"./settings/settings-part\";\r\nimport { CustomPropsPart } from \"./document-props/custom-props-part\";\r\nimport { CommentsPart } from \"./comments/comments-part\";\r\nimport { CommentsExtendedPart } from \"./comments/comments-extended-part\";\r\nimport { ContentType } from \"./common/content-types\";\r\n\r\nconst topLevelRels = [\r\n\t{ type: RelationshipTypes.OfficeDocument, target: \"word/document.xml\" },\r\n\t{ type: RelationshipTypes.ExtendedProperties, target: \"docProps/app.xml\" },\r\n\t{ type: RelationshipTypes.CoreProperties, target: \"docProps/core.xml\" },\r\n\t{ type: RelationshipTypes.CustomProperties, target: \"docProps/custom.xml\" },\r\n];\r\n\r\nexport class WordDocument {\r\n\tprivate _package: OpenXmlPackage;\r\n\tprivate _parser: DocumentParser;\r\n\tprivate _options: any;\r\n\r\n\trels: Relationship[];\r\n\tparts: Part[] = [];\r\n\tpartsMap: Record<string, Part> = {};\r\n\tcontentTypes: ContentType[] = [];\r\n\r\n\tdocumentPart: DocumentPart;\r\n\tfontTablePart: FontTablePart;\r\n\tnumberingPart: NumberingPart;\r\n\tstylesPart: StylesPart;\r\n\tfootnotesPart: FootnotesPart;\r\n\tendnotesPart: EndnotesPart;\r\n\tthemePart: ThemePart;\r\n\tcorePropsPart: CorePropsPart;\r\n\textendedPropsPart: ExtendedPropsPart;\r\n\tsettingsPart: SettingsPart;\r\n\tcommentsPart: CommentsPart;\r\n\tcommentsExtendedPart: CommentsExtendedPart;\r\n\r\n\tstatic async load(blob: Blob | any, parser: DocumentParser, options: any): Promise<WordDocument> {\r\n\t\tvar d = new WordDocument();\r\n\r\n\t\td._options = options;\r\n\t\td._parser = parser;\r\n\t\td._package = await OpenXmlPackage.load(blob, options);\r\n\t\td.rels = await d._package.loadRelationships();\r\n\t\td.contentTypes = await d._package.loadContentTypes();\r\n\r\n\t\tawait Promise.all(topLevelRels.map(rel => {\r\n\t\t\tconst r = d.rels.find(x => x.type === rel.type) ?? rel; //fallback \r\n\t\t\treturn d.loadRelationshipPart(r.target, r.type);\r\n\t\t}));\r\n\r\n\t\treturn d;\r\n\t}\r\n\r\n\tsave(type = \"blob\"): Promise<any> {\r\n\t\treturn this._package.save(type);\r\n\t}\r\n\r\n\tprivate async loadRelationshipPart(path: string, type: string): Promise<Part> {\r\n\t\tif (this.partsMap[path])\r\n\t\t\treturn this.partsMap[path];\r\n\r\n\t\tif (!this._package.get(path))\r\n\t\t\treturn null;\r\n\r\n\t\tlet part: Part = null;\r\n\r\n\t\tswitch (type) {\r\n\t\t\tcase RelationshipTypes.OfficeDocument:\r\n\t\t\t\tthis.documentPart = part = new DocumentPart(this._package, path, this._parser);\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase RelationshipTypes.FontTable:\r\n\t\t\t\tthis.fontTablePart = part = new FontTablePart(this._package, path);\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase RelationshipTypes.Numbering:\r\n\t\t\t\tthis.numberingPart = part = new NumberingPart(this._package, path, this._parser);\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase RelationshipTypes.Styles:\r\n\t\t\t\tthis.stylesPart = part = new StylesPart(this._package, path, this._parser);\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase RelationshipTypes.Theme:\r\n\t\t\t\tthis.themePart = part = new ThemePart(this._package, path);\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase RelationshipTypes.Footnotes:\r\n\t\t\t\tthis.footnotesPart = part = new FootnotesPart(this._package, path, this._parser);\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase RelationshipTypes.Endnotes:\r\n\t\t\t\tthis.endnotesPart = part = new EndnotesPart(this._package, path, this._parser);\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase RelationshipTypes.Footer:\r\n\t\t\t\tpart = new FooterPart(this._package, path, this._parser);\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase RelationshipTypes.Header:\r\n\t\t\t\tpart = new HeaderPart(this._package, path, this._parser);\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase RelationshipTypes.CoreProperties:\r\n\t\t\t\tthis.corePropsPart = part = new CorePropsPart(this._package, path);\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase RelationshipTypes.ExtendedProperties:\r\n\t\t\t\tthis.extendedPropsPart = part = new ExtendedPropsPart(this._package, path);\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase RelationshipTypes.CustomProperties:\r\n\t\t\t\tpart = new CustomPropsPart(this._package, path);\r\n\t\t\t\tbreak;\r\n\t\r\n\t\t\tcase RelationshipTypes.Settings:\r\n\t\t\t\tthis.settingsPart = part = new SettingsPart(this._package, path);\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase RelationshipTypes.Comments:\r\n\t\t\t\tthis.commentsPart = part = new CommentsPart(this._package, path, this._parser);\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase RelationshipTypes.CommentsExtended:\r\n\t\t\t\tthis.commentsExtendedPart = part = new CommentsExtendedPart(this._package, path);\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tif (part == null)\r\n\t\t\treturn Promise.resolve(null);\r\n\r\n\t\tthis.partsMap[path] = part;\r\n\t\tthis.parts.push(part);\r\n\r\n\t\tawait part.load();\r\n\r\n\t\tif (part.rels?.length > 0) {\r\n\t\t\tconst [folder] = splitPath(part.path);\r\n\t\t\tawait Promise.all(part.rels.map(rel => this.loadRelationshipPart(resolvePath(rel.target, folder), rel.type)));\r\n\t\t}\r\n\r\n\t\treturn part;\r\n\t}\r\n\r\n\tasync loadDocumentImage(id: string, part?: Part): Promise<string> {\r\n\t\tconst path = this.getPathById(part ?? this.documentPart, id);\r\n\t\treturn path ? this.blobToURL(await this._package.load(path, \"blob\"), path) : null;\r\n\t}\r\n\r\n\tasync loadNumberingImage(id: string): Promise<string> {\r\n\t\tconst path = this.getPathById(this.numberingPart, id);\r\n\t\treturn path ? this.blobToURL(await this._package.load(path, \"blob\"), path) : null;\r\n\t}\r\n\r\n\tasync loadFont(id: string, key: string): Promise<string> {\r\n\t\tconst path = this.getPathById(this.fontTablePart, id);\r\n\t\tif (!path) return null;\r\n\t\tconst x = await this._package.load(path, \"uint8array\");\r\n\t\treturn x ? this.blobToURL(new Blob([deobfuscate(x, key)]), path) : x;\r\n\t}\r\n\r\n\tasync loadAltChunk(id: string, part?: Part): Promise<string> {\r\n\t\tconst path = this.getPathById(part ?? this.documentPart, id);\r\n\t\treturn path ? this._package.load(path, \"string\") : Promise.resolve(null);\r\n\t}\r\n\r\n\tprivate blobToURL(blob: Blob, path?: string): string | Promise<string> {\r\n\t\tif (!blob)\r\n\t\t\treturn null;\r\n\r\n\t\tif (path) {\r\n\t\t\tconst ct = this.contentTypes.find(x => x.partName === path || (x.extension && path.endsWith(`.${x.extension}`)));\r\n\t\t\tblob = ct ? new Blob([blob], { type: ct.contentType }) : blob;\r\n\t\t}\r\n\r\n\t\tif (this._options.useBase64URL) {\r\n\t\t\treturn blobToBase64(blob);\r\n\t\t}\r\n\r\n\t\treturn URL.createObjectURL(blob);\r\n\t}\r\n\r\n\tfindPartByRelId(id: string, basePart: Part = null) {\r\n\t\tvar rel = (basePart.rels ?? this.rels).find(r => r.id == id);\r\n\t\tconst folder = basePart ? splitPath(basePart.path)[0] : '';\r\n\t\treturn rel ? this.partsMap[resolvePath(rel.target, folder)] : null;\r\n\t}\r\n\r\n\tgetPathById(part: Part, id: string): string {\r\n\t\tconst rel = part.rels.find(x => x.id == id);\r\n\t\tconst [folder] = splitPath(part.path);\r\n\t\treturn rel ? resolvePath(rel.target, folder) : null;\r\n\t}\r\n}\r\n\r\nexport function deobfuscate(data: Uint8Array, guidKey: string) {\r\n\tconst len = 16;\r\n\tconst trimmed = guidKey.replace(/{|}|-/g, \"\");\r\n\tconst numbers = new Array(len);\r\n\r\n\tfor (let i = 0; i < len; i++)\r\n\t\tnumbers[len - i - 1] = parseInt(trimmed.substring(i * 2, i * 2 + 2), 16);\r\n\r\n\tfor (let i = 0; i < 32; i++)\r\n\t\tdata[i] = data[i] ^ numbers[i % len]\r\n\r\n\t// FIXME: return type\r\n\treturn data as any;\r\n}","import { XmlParser } from \"../parser/xml-parser\";\r\nimport { DomType, OpenXmlElement } from \"./dom\";\r\n\r\nexport interface WmlBookmarkStart extends OpenXmlElement {\r\n id: string;\r\n name: string;\r\n colFirst: number;\r\n colLast: number;\r\n}\r\n\r\nexport interface WmlBookmarkEnd extends OpenXmlElement {\r\n id: string;\r\n}\r\n\r\nexport function parseBookmarkStart(elem: Element, xml: XmlParser): WmlBookmarkStart {\r\n return {\r\n type: DomType.BookmarkStart,\r\n id: xml.attr(elem, \"id\"),\r\n name: xml.attr(elem, \"name\"),\r\n colFirst: xml.intAttr(elem, \"colFirst\"),\r\n colLast: xml.intAttr(elem, \"colLast\")\r\n }\r\n}\r\n\r\nexport function parseBookmarkEnd(elem: Element, xml: XmlParser): WmlBookmarkEnd {\r\n return {\r\n type: DomType.BookmarkEnd,\r\n id: xml.attr(elem, \"id\")\r\n }\r\n}","import { DocumentParser } from '../document-parser';\r\nimport { convertLength, LengthUsage } from '../document/common';\r\nimport { OpenXmlElementBase, DomType } from '../document/dom';\r\nimport xml from '../parser/xml-parser';\r\nimport { formatCssRules, parseCssRules } from '../utils';\r\n\r\nexport class VmlElement extends OpenXmlElementBase {\r\n\ttype: DomType = DomType.VmlElement;\r\n\ttagName: string;\r\n\tcssStyleText?: string;\r\n\tattrs: Record<string, string> = {};\r\n\twrapType?: string;\r\n\timageHref?: {\r\n\t\tid: string,\r\n\t\ttitle: string\r\n\t}\r\n}\r\n\r\nexport function parseVmlElement(elem: Element, parser: DocumentParser): VmlElement {\r\n\tvar result = new VmlElement();\r\n\r\n\tswitch (elem.localName) {\r\n\t\tcase \"rect\":\r\n\t\t\tresult.tagName = \"rect\"; \r\n\t\t\tObject.assign(result.attrs, { width: '100%', height: '100%' });\r\n\t\t\tbreak;\r\n\r\n\t\tcase \"oval\":\r\n\t\t\tresult.tagName = \"ellipse\"; \r\n\t\t\tObject.assign(result.attrs, { cx: \"50%\", cy: \"50%\", rx: \"50%\", ry: \"50%\" });\r\n\t\t\tbreak;\r\n\t\r\n\t\tcase \"line\":\r\n\t\t\tresult.tagName = \"line\"; \r\n\t\t\tbreak;\r\n\r\n\t\tcase \"shape\":\r\n\t\t\tresult.tagName = \"g\"; \r\n\t\t\tbreak;\r\n\r\n\t\tcase \"textbox\":\r\n\t\t\tresult.tagName = \"foreignObject\"; \r\n\t\t\tObject.assign(result.attrs, { width: '100%', height: '100%' });\r\n\t\t\tbreak;\r\n\t\r\n\t\tdefault:\r\n\t\t\treturn null;\r\n\t}\r\n\r\n\tfor (const at of xml.attrs(elem)) {\r\n\t\tswitch(at.localName) {\r\n\t\t\tcase \"style\": \r\n\t\t\t\tresult.cssStyleText = at.value;\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase \"fillcolor\": \r\n\t\t\t\tresult.attrs.fill = at.value; \r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase \"from\":\r\n\t\t\t\tconst [x1, y1] = parsePoint(at.value);\r\n\t\t\t\tObject.assign(result.attrs, { x1, y1 });\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase \"to\":\r\n\t\t\t\tconst [x2, y2] = parsePoint(at.value);\r\n\t\t\t\tObject.assign(result.attrs, { x2, y2 });\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\tfor (const el of xml.elements(elem)) {\r\n\t\tswitch (el.localName) {\r\n\t\t\tcase \"stroke\": \r\n\t\t\t\tObject.assign(result.attrs, parseStroke(el));\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase \"fill\": \r\n\t\t\t\tObject.assign(result.attrs, parseFill(el));\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase \"imagedata\":\r\n\t\t\t\tresult.tagName = \"image\";\r\n\t\t\t\tObject.assign(result.attrs, { width: '100%', height: '100%' });\r\n\t\t\t\tresult.imageHref = {\r\n\t\t\t\t\tid: xml.attr(el, \"id\"),\r\n\t\t\t\t\ttitle: xml.attr(el, \"title\"),\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase \"txbxContent\": \r\n\t\t\t\tresult.children.push(...parser.parseBodyElements(el));\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tdefault:\r\n\t\t\t\tconst child = parseVmlElement(el, parser);\r\n\t\t\t\tchild && result.children.push(child);\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\treturn result;\r\n}\r\n\r\nfunction parseStroke(el: Element): Record<string, string> {\r\n\treturn {\r\n\t\t'stroke': xml.attr(el, \"color\"),\r\n\t\t'stroke-width': xml.lengthAttr(el, \"weight\", LengthUsage.Emu) ?? '1px'\r\n\t};\r\n}\r\n\r\nfunction parseFill(el: Element): Record<string, string> {\r\n\treturn {\r\n\t\t//'fill': xml.attr(el, \"color2\")\r\n\t};\r\n}\r\n\r\nfunction parsePoint(val: string): string[] {\r\n\treturn val.split(\",\");\r\n}\r\n\r\nfunction convertPath(path: string): string {\r\n\treturn path.replace(/([mlxe])|([-\\d]+)|([,])/g, (m) => {\r\n\t\tif (/[-\\d]/.test(m)) return convertLength(m, LengthUsage.VmlEmu);\r\n\t\tif (/[ml,]/.test(m)) return m;\r\n\r\n\t\treturn '';\r\n\t});\r\n}","import { DomType, OpenXmlElementBase } from \"../document/dom\";\r\n\r\nexport class WmlComment extends OpenXmlElementBase {\r\n\ttype = DomType.Comment;\r\n id: string;\r\n\tauthor: string;\r\n\tinitials: string;\r\n\tdate: string;\r\n}\r\n\r\nexport class WmlCommentReference extends OpenXmlElementBase {\r\n\ttype = DomType.CommentReference;\r\n\t\r\n\tconstructor(public id?: string) {\r\n\t\tsuper();\r\n\t}\r\n}\r\n\r\nexport class WmlCommentRangeStart extends OpenXmlElementBase {\r\n\ttype = DomType.CommentRangeStart;\r\n\t\r\n\tconstructor(public id?: string) {\r\n\t\tsuper();\r\n\t}\r\n}\r\nexport class WmlCommentRangeEnd extends OpenXmlElementBase {\r\n\ttype = DomType.CommentRangeEnd;\r\n\r\n\tconstructor(public id?: string) {\r\n\t\tsuper();\r\n\t}\r\n}","import {\r\n\tDomType, WmlTable, IDomNumbering,\r\n\tWmlHyperlink, WmlSmartTag, IDomImage, OpenXmlElement, WmlTableColumn, WmlTableCell,\r\n\tWmlTableRow, NumberingPicBullet, WmlText, WmlSymbol, WmlBreak, WmlNoteReference,\r\n\tWmlAltChunk, WmlChange\r\n} from './document/dom';\r\nimport { DocumentElement } from './document/document';\r\nimport { WmlParagraph, parseParagraphProperties, parseParagraphProperty } from './document/paragraph';\r\nimport { parseSectionProperties, SectionProperties } from './document/section';\r\nimport xml from './parser/xml-parser';\r\nimport { parseRunProperties, WmlRun } from './document/run';\r\nimport { parseBookmarkEnd, parseBookmarkStart } from './document/bookmarks';\r\nimport { IDomStyle, IDomSubStyle } from './document/style';\r\nimport { WmlFieldChar, WmlFieldSimple, WmlInstructionText } from './document/fields';\r\nimport { convertLength, LengthUsage, LengthUsageType } from './document/common';\r\nimport { parseVmlElement } from './vml/vml';\r\nimport { WmlComment, WmlCommentRangeEnd, WmlCommentRangeStart, WmlCommentReference } from './comments/elements';\r\nimport { encloseFontFamily } from './utils';\r\n\r\nexport var autos = {\r\n\tshd: \"inherit\",\r\n\tcolor: \"black\",\r\n\tborderColor: \"black\",\r\n\thighlight: \"transparent\"\r\n};\r\n\r\nconst supportedNamespaceURIs = [];\r\n\r\nconst mmlTagMap = {\r\n\t\"oMath\": DomType.MmlMath,\r\n\t\"oMathPara\": DomType.MmlMathParagraph,\r\n\t\"f\": DomType.MmlFraction,\r\n\t\"func\": DomType.MmlFunction,\r\n\t\"fName\": DomType.MmlFunctionName,\r\n\t\"num\": DomType.MmlNumerator,\r\n\t\"den\": DomType.MmlDenominator,\r\n\t\"rad\": DomType.MmlRadical,\r\n\t\"deg\": DomType.MmlDegree,\r\n\t\"e\": DomType.MmlBase,\r\n\t\"sSup\": DomType.MmlSuperscript,\r\n\t\"sSub\": DomType.MmlSubscript,\r\n\t\"sPre\": DomType.MmlPreSubSuper,\r\n\t\"sup\": DomType.MmlSuperArgument,\r\n\t\"sub\": DomType.MmlSubArgument,\r\n\t\"d\": DomType.MmlDelimiter,\r\n\t\"nary\": DomType.MmlNary,\r\n\t\"eqArr\": DomType.MmlEquationArray,\r\n\t\"lim\": DomType.MmlLimit,\r\n\t\"limLow\": DomType.MmlLimitLower,\r\n\t\"m\": DomType.MmlMatrix,\r\n\t\"mr\": DomType.MmlMatrixRow,\r\n\t\"box\": DomType.MmlBox,\r\n\t\"bar\": DomType.MmlBar,\r\n\t\"groupChr\": DomType.MmlGroupChar\r\n}\r\n\r\nexport interface DocumentParserOptions {\r\n\tignoreWidth: boolean;\r\n\tdebug: boolean;\r\n}\r\n\r\nexport class DocumentParser {\r\n\toptions: DocumentParserOptions;\r\n\r\n\tconstructor(options?: Partial<DocumentParserOptions>) {\r\n\t\tthis.options = {\r\n\t\t\tignoreWidth: false,\r\n\t\t\tdebug: false,\r\n\t\t\t...options\r\n\t\t};\r\n\t}\r\n\r\n\tparseNotes(xmlDoc: Element, elemName: string, elemClass: any): any[] {\r\n\t\tvar result = [];\r\n\r\n\t\tfor (let el of xml.elements(xmlDoc, elemName)) {\r\n\t\t\tconst node = new elemClass();\r\n\t\t\tnode.id = xml.attr(el, \"id\");\r\n\t\t\tnode.noteType = xml.attr(el, \"type\");\r\n\t\t\tnode.children = this.parseBodyElements(el);\r\n\t\t\tresult.push(node);\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tparseComments(xmlDoc: Element): any[] {\r\n\t\tvar result = [];\r\n\r\n\t\tfor (let el of xml.elements(xmlDoc, \"comment\")) {\r\n\t\t\tconst item = new WmlComment();\r\n\t\t\titem.id = xml.attr(el, \"id\");\r\n\t\t\titem.author = xml.attr(el, \"author\");\r\n\t\t\titem.initials = xml.attr(el, \"initials\");\r\n\t\t\titem.date = xml.attr(el, \"date\");\r\n\t\t\titem.children = this.parseBodyElements(el);\r\n\t\t\tresult.push(item);\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tparseDocumentFile(xmlDoc: Element): DocumentElement {\r\n\t\tvar xbody = xml.element(xmlDoc, \"body\");\r\n\t\tvar background = xml.element(xmlDoc, \"background\");\r\n\t\tvar sectPr = xml.element(xbody, \"sectPr\");\r\n\r\n\t\treturn {\r\n\t\t\ttype: DomType.Document,\r\n\t\t\tchildren: this.parseBodyElements(xbody),\r\n\t\t\tprops: sectPr ? parseSectionProperties(sectPr, xml) : {} as SectionProperties,\r\n\t\t\tcssStyle: background ? this.parseBackground(background) : {},\r\n\t\t};\r\n\t}\r\n\r\n\tparseBackground(elem: Element): any {\r\n\t\tvar result = {};\r\n\t\tvar color = xmlUtil.colorAttr(elem, \"color\");\r\n\r\n\t\tif (color) {\r\n\t\t\tresult[\"background-color\"] = color;\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tparseBodyElements(element: Element): OpenXmlElement[] {\r\n\t\tvar children = [];\r\n\r\n\t\tfor (const elem of xml.elements(element)) {\r\n\t\t\tswitch (elem.localName) {\r\n\t\t\t\tcase \"p\":\r\n\t\t\t\t\tchildren.push(this.parseParagraph(elem));\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"altChunk\":\r\n\t\t\t\t\tchildren.push(this.parseAltChunk(elem));\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"tbl\":\r\n\t\t\t\t\tchildren.push(this.parseTable(elem));\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"sdt\":\r\n\t\t\t\t\tchildren.push(...this.parseSdt(elem, e => this.parseBodyElements(e)));\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn children;\r\n\t}\r\n\r\n\tparseStylesFile(xstyles: Element): IDomStyle[] {\r\n\t\tvar result = [];\r\n\r\n\t\tfor (const n of xml.elements(xstyles)) {\r\n\t\t\tswitch (n.localName) {\r\n\t\t\t\tcase \"style\":\r\n\t\t\t\t\tresult.push(this.parseStyle(n));\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"docDefaults\":\r\n\t\t\t\t\tresult.push(this.parseDefaultStyles(n));\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tparseDefaultStyles(node: Element): IDomStyle {\r\n\t\tvar result = <IDomStyle>{\r\n\t\t\tid: null,\r\n\t\t\tname: null,\r\n\t\t\ttarget: null,\r\n\t\t\tbasedOn: null,\r\n\t\t\tstyles: []\r\n\t\t};\r\n\r\n\t\tfor (const c of xml.elements(node)){\r\n\t\t\tswitch (c.localName) {\r\n\t\t\t\tcase \"rPrDefault\":\r\n\t\t\t\t\tvar rPr = xml.element(c, \"rPr\");\r\n\r\n\t\t\t\t\tif (rPr)\r\n\t\t\t\t\t\tresult.styles.push({\r\n\t\t\t\t\t\t\ttarget: \"span\",\r\n\t\t\t\t\t\t\tvalues: this.parseDefaultProperties(rPr, {})\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"pPrDefault\":\r\n\t\t\t\t\tvar pPr = xml.element(c, \"pPr\");\r\n\r\n\t\t\t\t\tif (pPr)\r\n\t\t\t\t\t\tresult.styles.push({\r\n\t\t\t\t\t\t\ttarget: \"p\",\r\n\t\t\t\t\t\t\tvalues: this.parseDefaultProperties(pPr, {})\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tparseStyle(node: Element): IDomStyle {\r\n\t\tvar result = <IDomStyle>{\r\n\t\t\tid: xml.attr(node, \"styleId\"),\r\n\t\t\tisDefault: xml.boolAttr(node, \"default\"),\r\n\t\t\tname: null,\r\n\t\t\ttarget: null,\r\n\t\t\tbasedOn: null,\r\n\t\t\tstyles: [],\r\n\t\t\tlinked: null\r\n\t\t};\r\n\r\n\t\tswitch (xml.attr(node, \"type\")) {\r\n\t\t\tcase \"paragraph\": result.target = \"p\"; break;\r\n\t\t\tcase \"table\": result.target = \"table\"; break;\r\n\t\t\tcase \"character\": result.target = \"span\"; break;\r\n\t\t\t//case \"numbering\": result.target = \"p\"; break;\r\n\t\t}\r\n\r\n\t\tfor (const n of xml.elements(node)) {\r\n\t\t\tswitch (n.localName) {\r\n\t\t\t\tcase \"basedOn\":\r\n\t\t\t\t\tresult.basedOn = xml.attr(n, \"val\");\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"name\":\r\n\t\t\t\t\tresult.name = xml.attr(n, \"val\");\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"link\":\r\n\t\t\t\t\tresult.linked = xml.attr(n, \"val\");\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"next\":\r\n\t\t\t\t\tresult.next = xml.attr(n, \"val\");\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"aliases\":\r\n\t\t\t\t\tresult.aliases = xml.attr(n, \"val\").split(\",\");\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"pPr\":\r\n\t\t\t\t\tresult.styles.push({\r\n\t\t\t\t\t\ttarget: \"p\",\r\n\t\t\t\t\t\tvalues: this.parseDefaultProperties(n, {})\r\n\t\t\t\t\t});\r\n\t\t\t\t\tresult.paragraphProps = parseParagraphProperties(n, xml);\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"rPr\":\r\n\t\t\t\t\tresult.styles.push({\r\n\t\t\t\t\t\ttarget: \"span\",\r\n\t\t\t\t\t\tvalues: this.parseDefaultProperties(n, {})\r\n\t\t\t\t\t});\r\n\t\t\t\t\tresult.runProps = parseRunProperties(n, xml);\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"tblPr\":\r\n\t\t\t\tcase \"tcPr\":\r\n\t\t\t\t\tresult.styles.push({\r\n\t\t\t\t\t\ttarget: \"td\", //TODO: maybe move to processor\r\n\t\t\t\t\t\tvalues: this.parseDefaultProperties(n, {})\r\n\t\t\t\t\t});\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"tblStylePr\":\r\n\t\t\t\t\tfor (let s of this.parseTableStyle(n))\r\n\t\t\t\t\t\tresult.styles.push(s);\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"rsid\":\r\n\t\t\t\tcase \"qFormat\":\r\n\t\t\t\tcase \"hidden\":\r\n\t\t\t\tcase \"semiHidden\":\r\n\t\t\t\tcase \"unhideWhenUsed\":\r\n\t\t\t\tcase \"autoRedefine\":\r\n\t\t\t\tcase \"uiPriority\":\r\n\t\t\t\t\t//TODO: ignore\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tthis.options.debug && console.warn(`DOCX: Unknown style element: ${n.localName}`);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tparseTableStyle(node: Element): IDomSubStyle[] {\r\n\t\tvar result = [];\r\n\r\n\t\tvar type = xml.attr(node, \"type\");\r\n\t\tvar selector = \"\";\r\n\t\tvar modificator = \"\";\r\n\r\n\t\tswitch (type) {\r\n\t\t\tcase \"firstRow\":\r\n\t\t\t\tmodificator = \".first-row\";\r\n\t\t\t\tselector = \"tr.first-row td\";\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"lastRow\":\r\n\t\t\t\tmodificator = \".last-row\";\r\n\t\t\t\tselector = \"tr.last-row td\";\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"firstCol\":\r\n\t\t\t\tmodificator = \".first-col\";\r\n\t\t\t\tselector = \"td.first-col\";\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"lastCol\":\r\n\t\t\t\tmodificator = \".last-col\";\r\n\t\t\t\tselector = \"td.last-col\";\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"band1Vert\":\r\n\t\t\t\tmodificator = \":not(.no-vband)\";\r\n\t\t\t\tselector = \"td.odd-col\";\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"band2Vert\":\r\n\t\t\t\tmodificator = \":not(.no-vband)\";\r\n\t\t\t\tselector = \"td.even-col\";\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"band1Horz\":\r\n\t\t\t\tmodificator = \":not(.no-hband)\";\r\n\t\t\t\tselector = \"tr.odd-row\";\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"band2Horz\":\r\n\t\t\t\tmodificator = \":not(.no-hband)\";\r\n\t\t\t\tselector = \"tr.even-row\";\r\n\t\t\t\tbreak;\r\n\t\t\tdefault: return [];\r\n\t\t}\r\n\r\n\t\tfor (const n of xml.elements(node)) {\r\n\t\t\tswitch (n.localName) {\r\n\t\t\t\tcase \"pPr\":\r\n\t\t\t\t\tresult.push({\r\n\t\t\t\t\t\ttarget: `${selector} p`,\r\n\t\t\t\t\t\tmod: modificator,\r\n\t\t\t\t\t\tvalues: this.parseDefaultProperties(n, {})\r\n\t\t\t\t\t});\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"rPr\":\r\n\t\t\t\t\tresult.push({\r\n\t\t\t\t\t\ttarget: `${selector} span`,\r\n\t\t\t\t\t\tmod: modificator,\r\n\t\t\t\t\t\tvalues: this.parseDefaultProperties(n, {})\r\n\t\t\t\t\t});\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"tblPr\":\r\n\t\t\t\tcase \"tcPr\":\r\n\t\t\t\t\tresult.push({\r\n\t\t\t\t\t\ttarget: selector, //TODO: maybe move to processor\r\n\t\t\t\t\t\tmod: modificator,\r\n\t\t\t\t\t\tvalues: this.parseDefaultProperties(n, {})\r\n\t\t\t\t\t});\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tparseNumberingFile(node: Element): IDomNumbering[] {\r\n\t\tconst levels = [];\r\n\t\tconst nums = [];\r\n\t\tconst bullets = [];\r\n\r\n\t\tfor (const n of xml.elements(node)) {\r\n\t\t\tswitch (n.localName) {\r\n\t\t\t\tcase \"abstractNum\":\r\n\t\t\t\t\tlevels.push(...this.parseAbstractNumbering(n, bullets));\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"numPicBullet\":\r\n\t\t\t\t\tbullets.push(this.parseNumberingPicBullet(n));\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"num\":\r\n\t\t\t\t\tnums.push({\r\n\t\t\t\t\t\tnumId: xml.attr(n, \"numId\"),\r\n\t\t\t\t\t\tabstractNumId: xml.elementAttr(n, \"abstractNumId\", \"val\"),\r\n\t\t\t\t\t});\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn nums.flatMap(x => levels.filter(lvl => x.abstractNumId == lvl.id).map(lvl => ({ ...lvl, id: x.numId })));\r\n\t}\r\n\r\n\tparseNumberingPicBullet(elem: Element): NumberingPicBullet {\r\n\t\tvar pict = xml.element(elem, \"pict\");\r\n\t\tvar shape = pict && xml.element(pict, \"shape\");\r\n\t\tvar imagedata = shape && xml.element(shape, \"imagedata\");\r\n\r\n\t\treturn imagedata ? {\r\n\t\t\tid: xml.intAttr(elem, \"numPicBulletId\"),\r\n\t\t\tsrc: xml.attr(imagedata, \"id\"),\r\n\t\t\tstyle: xml.attr(shape, \"style\")\r\n\t\t} : null;\r\n\t}\r\n\r\n\tparseAbstractNumbering(node: Element, bullets: any[]): IDomNumbering[] {\r\n\t\tvar result = [];\r\n\t\tvar id = xml.attr(node, \"abstractNumId\");\r\n\r\n\t\tfor (const n of xml.elements(node)) {\r\n\t\t\tswitch (n.localName) {\r\n\t\t\t\tcase \"lvl\":\r\n\t\t\t\t\tresult.push(this.parseNumberingLevel(id, n, bullets));\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tparseNumberingLevel(id: string, node: Element, bullets: any[]): IDomNumbering {\r\n\t\tvar result: IDomNumbering = {\r\n\t\t\tid: id,\r\n\t\t\tlevel: xml.intAttr(node, \"ilvl\"),\r\n\t\t\tstart: 1,\r\n\t\t\tpStyleName: undefined,\r\n\t\t\tpStyle: {},\r\n\t\t\trStyle: {},\r\n\t\t\tsuff: \"tab\"\r\n\t\t};\r\n\r\n\t\tfor (const n of xml.elements(node)) {\r\n\t\t\tswitch (n.localName) {\r\n\t\t\t\tcase \"start\":\r\n\t\t\t\t\tresult.start = xml.intAttr(n, \"val\");\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"pPr\":\r\n\t\t\t\t\tthis.parseDefaultProperties(n, result.pStyle);\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"rPr\":\r\n\t\t\t\t\tthis.parseDefaultProperties(n, result.rStyle);\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"lvlPicBulletId\":\r\n\t\t\t\t\tvar bulletId = xml.intAttr(n, \"val\");\r\n\t\t\t\t\tresult.bullet = bullets.find(x => x?.id == bulletId);\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"lvlText\":\r\n\t\t\t\t\tresult.levelText = xml.attr(n, \"val\");\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"pStyle\":\r\n\t\t\t\t\tresult.pStyleName = xml.attr(n, \"val\");\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"numFmt\":\r\n\t\t\t\t\tresult.format = xml.attr(n, \"val\");\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"suff\":\r\n\t\t\t\t\tresult.suff = xml.attr(n, \"val\");\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tparseSdt(node: Element, parser: Function): OpenXmlElement[] {\r\n\t\tconst sdtContent = xml.element(node, \"sdtContent\");\r\n\t\treturn sdtContent ? parser(sdtContent) : [];\r\n\t}\r\n\r\n\tparseChange(type: DomType, node: Element, parentParser: Function): WmlChange {\r\n\t\treturn <WmlChange>{\r\n\t\t\ttype,\r\n\t\t\tchildren: parentParser(node)?.children ?? [],\r\n\t\t\tid: xml.attr(node, \"id\"),\r\n\t\t\tauthor: xml.attr(node, \"author\"),\r\n\t\t\tdate: xml.attr(node, \"date\"),\r\n\t\t};\r\n\t}\r\n\r\n\tparseAltChunk(node: Element): WmlAltChunk {\r\n\t\treturn { type: DomType.AltChunk, children: [], id: xml.attr(node, \"id\") };\r\n\t}\r\n\r\n\tparseParagraph(node: Element): OpenXmlElement {\r\n\t\tvar result = <WmlParagraph>{ type: DomType.Paragraph, children: [] };\r\n\r\n\t\tfor (let el of xml.elements(node)) {\r\n\t\t\tswitch (el.localName) {\r\n\t\t\t\tcase \"pPr\":\r\n\t\t\t\t\tthis.parseParagraphProperties(el, result);\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"r\":\r\n\t\t\t\t\tresult.children.push(this.parseRun(el, result));\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"hyperlink\":\r\n\t\t\t\t\tresult.children.push(this.parseHyperlink(el, result));\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"smartTag\":\r\n\t\t\t\t\tresult.children.push(this.parseSmartTag(el, result));\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"bookmarkStart\":\r\n\t\t\t\t\tresult.children.push(parseBookmarkStart(el, xml));\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"bookmarkEnd\":\r\n\t\t\t\t\tresult.children.push(parseBookmarkEnd(el, xml));\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"commentRangeStart\":\r\n\t\t\t\t\tresult.children.push(new WmlCommentRangeStart(xml.attr(el, \"id\")));\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"commentRangeEnd\":\r\n\t\t\t\t\tresult.children.push(new WmlCommentRangeEnd(xml.attr(el, \"id\")));\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"oMath\":\r\n\t\t\t\tcase \"oMathPara\":\r\n\t\t\t\t\tresult.children.push(this.parseMathElement(el));\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"sdt\":\r\n\t\t\t\t\tresult.children.push(...this.parseSdt(el, e => this.parseParagraph(e).children));\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"ins\":\r\n\t\t\t\t\tresult.children.push(this.parseChange(DomType.Inserted, el, e => this.parseParagraph(e)));\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"del\":\r\n\t\t\t\t\tresult.children.push(this.parseChange(DomType.Deleted, el, e => this.parseParagraph(e)));\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tparseParagraphProperties(elem: Element, paragraph: WmlParagraph) {\r\n\t\tthis.parseDefaultProperties(elem, paragraph.cssStyle = {}, null, c => {\r\n\t\t\tif (parseParagraphProperty(c, paragraph, xml))\r\n\t\t\t\treturn true;\r\n\r\n\t\t\tswitch (c.localName) {\r\n\t\t\t\tcase \"pStyle\":\r\n\t\t\t\t\tparagraph.styleName = xml.attr(c, \"val\");\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"cnfStyle\":\r\n\t\t\t\t\tparagraph.className = values.classNameOfCnfStyle(c);\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"framePr\":\r\n\t\t\t\t\tthis.parseFrame(c, paragraph);\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"rPr\":\r\n\t\t\t\t\t//TODO ignore\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tdefault:\r\n\t\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\treturn true;\r\n\t\t});\r\n\t}\r\n\r\n\tparseFrame(node: Element, paragraph: WmlParagraph) {\r\n\t\tvar dropCap = xml.attr(node, \"dropCap\");\r\n\r\n\t\tif (dropCap == \"drop\")\r\n\t\t\tparagraph.cssStyle[\"float\"] = \"left\";\r\n\t}\r\n\r\n\tparseHyperlink(node: Element, parent?: OpenXmlElement): WmlHyperlink {\r\n\t\tvar result: WmlHyperlink = <WmlHyperlink>{ type: DomType.Hyperlink, parent: parent, children: [] };\r\n\r\n\t\tresult.anchor = xml.attr(node, \"anchor\");\r\n\t\tresult.id = xml.attr(node, \"id\");\r\n\r\n\t\tfor (const c of xml.elements(node)) {\r\n\t\t\tswitch (c.localName) {\r\n\t\t\t\tcase \"r\":\r\n\t\t\t\t\tresult.children.push(this.parseRun(c, result));\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tparseSmartTag(node: Element, parent?: OpenXmlElement): WmlSmartTag {\r\n\t\tvar result: WmlSmartTag = { type: DomType.SmartTag, parent, children: [] };\r\n\t\tvar uri = xml.attr(node, \"uri\");\r\n\t\tvar element = xml.attr(node, \"element\");\r\n\r\n\t\tif (uri)\r\n\t\t\tresult.uri = uri;\r\n\r\n\t\tif (element)\r\n\t\t\tresult.element = element;\r\n\r\n\t\tfor (const c of xml.elements(node)) {\r\n\t\t\tswitch (c.localName) {\r\n\t\t\t\tcase \"r\":\r\n\t\t\t\t\tresult.children.push(this.parseRun(c, result));\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"smartTag\":\r\n\t\t\t\t\tresult.children.push(this.parseSmartTag(c, result));\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tparseRun(node: Element, parent?: OpenXmlElement): WmlRun {\r\n\t\tvar result: WmlRun = <WmlRun>{ type: DomType.Run, parent: parent, children: [] };\r\n\r\n\t\tfor (let c of xml.elements(node)) {\r\n\t\t\tc = this.checkAlternateContent(c);\r\n\r\n\t\t\tswitch (c.localName) {\r\n\t\t\t\tcase \"t\":\r\n\t\t\t\t\tresult.children.push(<WmlText>{\r\n\t\t\t\t\t\ttype: DomType.Text,\r\n\t\t\t\t\t\ttext: c.textContent\r\n\t\t\t\t\t});//.replace(\" \", \"\\u00A0\"); // TODO\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"delText\":\r\n\t\t\t\t\tresult.children.push(<WmlText>{\r\n\t\t\t\t\t\ttype: DomType.DeletedText,\r\n\t\t\t\t\t\ttext: c.textContent\r\n\t\t\t\t\t});\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"commentReference\":\r\n\t\t\t\t\tresult.children.push(new WmlCommentReference(xml.attr(c, \"id\")));\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"fldSimple\":\r\n\t\t\t\t\tresult.children.push(<WmlFieldSimple>{\r\n\t\t\t\t\t\ttype: DomType.SimpleField,\r\n\t\t\t\t\t\tinstruction: xml.attr(c, \"instr\"),\r\n\t\t\t\t\t\tlock: xml.boolAttr(c, \"lock\", false),\r\n\t\t\t\t\t\tdirty: xml.boolAttr(c, \"dirty\", false)\r\n\t\t\t\t\t});\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"instrText\":\r\n\t\t\t\t\tresult.fieldRun = true;\r\n\t\t\t\t\tresult.children.push(<WmlInstructionText>{\r\n\t\t\t\t\t\ttype: DomType.Instruction,\r\n\t\t\t\t\t\ttext: c.textContent\r\n\t\t\t\t\t});\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"fldChar\":\r\n\t\t\t\t\tresult.fieldRun = true;\r\n\t\t\t\t\tresult.children.push(<WmlFieldChar>{\r\n\t\t\t\t\t\ttype: DomType.ComplexField,\r\n\t\t\t\t\t\tcharType: xml.attr(c, \"fldCharType\"),\r\n\t\t\t\t\t\tlock: xml.boolAttr(c, \"lock\", false),\r\n\t\t\t\t\t\tdirty: xml.boolAttr(c, \"dirty\", false)\r\n\t\t\t\t\t});\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"noBreakHyphen\":\r\n\t\t\t\t\tresult.children.push({ type: DomType.NoBreakHyphen });\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"br\":\r\n\t\t\t\t\tresult.children.push(<WmlBreak>{\r\n\t\t\t\t\t\ttype: DomType.Break,\r\n\t\t\t\t\t\tbreak: xml.attr(c, \"type\") || \"textWrapping\"\r\n\t\t\t\t\t});\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"lastRenderedPageBreak\":\r\n\t\t\t\t\tresult.children.push(<WmlBreak>{\r\n\t\t\t\t\t\ttype: DomType.Break,\r\n\t\t\t\t\t\tbreak: \"lastRenderedPageBreak\"\r\n\t\t\t\t\t});\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"sym\":\r\n\t\t\t\t\tresult.children.push(<WmlSymbol>{\r\n\t\t\t\t\t\ttype: DomType.Symbol,\r\n\t\t\t\t\t\tfont: encloseFontFamily(xml.attr(c, \"font\")),\r\n\t\t\t\t\t\tchar: xml.hexAttr(c, \"char\")\r\n\t\t\t\t\t});\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"tab\":\r\n\t\t\t\t\tresult.children.push({ type: DomType.Tab });\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"footnoteReference\":\r\n\t\t\t\t\tresult.children.push(<WmlNoteReference>{\r\n\t\t\t\t\t\ttype: DomType.FootnoteReference,\r\n\t\t\t\t\t\tid: xml.attr(c, \"id\")\r\n\t\t\t\t\t});\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"endnoteReference\":\r\n\t\t\t\t\tresult.children.push(<WmlNoteReference>{\r\n\t\t\t\t\t\ttype: DomType.EndnoteReference,\r\n\t\t\t\t\t\tid: xml.attr(c, \"id\")\r\n\t\t\t\t\t});\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"drawing\":\r\n\t\t\t\t\tlet d = this.parseDrawing(c);\r\n\r\n\t\t\t\t\tif (d)\r\n\t\t\t\t\t\tresult.children.push(d);\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"pict\":\r\n\t\t\t\t\tresult.children.push(this.parseVmlPicture(c));\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"rPr\":\r\n\t\t\t\t\tthis.parseRunProperties(c, result);\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tparseMathElement(elem: Element): OpenXmlElement {\r\n\t\tconst propsTag = `${elem.localName}Pr`;\r\n\t\tconst result = { type: mmlTagMap[elem.localName], children: [] } as OpenXmlElement;\r\n\r\n\t\tfor (const el of xml.elements(elem)) {\r\n\t\t\tconst childType = mmlTagMap[el.localName];\r\n\r\n\t\t\tif (childType) {\r\n\t\t\t\tresult.children.push(this.parseMathElement(el));\r\n\t\t\t} else if (el.localName == \"r\") {\r\n\t\t\t\tvar run = this.parseRun(el);\r\n\t\t\t\trun.type = DomType.MmlRun;\r\n\t\t\t\tresult.children.push(run);\r\n\t\t\t} else if (el.localName == propsTag) {\r\n\t\t\t\tresult.props = this.parseMathProperies(el);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tparseMathProperies(elem: Element): Record<string, any> {\r\n\t\tconst result: Record<string, any> = {};\r\n\r\n\t\tfor (const el of xml.elements(elem)) {\r\n\t\t\tswitch (el.localName) {\r\n\t\t\t\tcase \"chr\": result.char = xml.attr(el, \"val\"); break;\r\n\t\t\t\tcase \"vertJc\": result.verticalJustification = xml.attr(el, \"val\"); break;\r\n\t\t\t\tcase \"pos\": result.position = xml.attr(el, \"val\"); break;\r\n\t\t\t\tcase \"degHide\": result.hideDegree = xml.boolAttr(el, \"val\"); break;\r\n\t\t\t\tcase \"begChr\": result.beginChar = xml.attr(el, \"val\"); break;\r\n\t\t\t\tcase \"endChr\": result.endChar = xml.attr(el, \"val\"); break;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tparseRunProperties(elem: Element, run: WmlRun) {\r\n\t\tthis.parseDefaultProperties(elem, run.cssStyle = {}, null, c => {\r\n\t\t\tswitch (c.localName) {\r\n\t\t\t\tcase \"rStyle\":\r\n\t\t\t\t\trun.styleName = xml.attr(c, \"val\");\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"vertAlign\":\r\n\t\t\t\t\trun.verticalAlign = values.valueOfVertAlign(c, true);\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tdefault:\r\n\t\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\treturn true;\r\n\t\t});\r\n\t}\r\n\r\n\tparseVmlPicture(elem: Element): OpenXmlElement {\r\n\t\tconst result = { type: DomType.VmlPicture, children: [] };\r\n\r\n\t\tfor (const el of xml.elements(elem)) {\r\n\t\t\tconst child = parseVmlElement(el, this);\r\n\t\t\tchild && result.children.push(child);\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tcheckAlternateContent(elem: Element): Element {\r\n\t\tif (elem.localName != 'AlternateContent')\r\n\t\t\treturn elem;\r\n\r\n\t\tvar choice = xml.element(elem, \"Choice\");\r\n\r\n\t\tif (choice) {\r\n\t\t\tvar requires = xml.attr(choice, \"Requires\");\r\n\t\t\tvar namespaceURI = elem.lookupNamespaceURI(requires);\r\n\r\n\t\t\tif (supportedNamespaceURIs.includes(namespaceURI))\r\n\t\t\t\treturn choice.firstElementChild;\r\n\t\t}\r\n\r\n\t\treturn xml.element(elem, \"Fallback\")?.firstElementChild;\r\n\t}\r\n\r\n\tparseDrawing(node: Element): OpenXmlElement {\r\n\t\tfor (var n of xml.elements(node)) {\r\n\t\t\tswitch (n.localName) {\r\n\t\t\t\tcase \"inline\":\r\n\t\t\t\tcase \"anchor\":\r\n\t\t\t\t\treturn this.parseDrawingWrapper(n);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tparseDrawingWrapper(node: Element): OpenXmlElement {\r\n\t\tvar result = <OpenXmlElement>{ type: DomType.Drawing, children: [], cssStyle: {} };\r\n\t\tvar isAnchor = node.localName == \"anchor\";\r\n\r\n\t\t//TODO\r\n\t\t// result.style[\"margin-left\"] = xml.sizeAttr(node, \"distL\", SizeType.Emu);\r\n\t\t// result.style[\"margin-top\"] = xml.sizeAttr(node, \"distT\", SizeType.Emu);\r\n\t\t// result.style[\"margin-right\"] = xml.sizeAttr(node, \"distR\", SizeType.Emu);\r\n\t\t// result.style[\"margin-bottom\"] = xml.sizeAttr(node, \"distB\", SizeType.Emu);\r\n\r\n\t\tlet wrapType: \"wrapTopAndBottom\" | \"wrapNone\" | null = null;\r\n\t\tlet simplePos = xml.boolAttr(node, \"simplePos\");\r\n\t\tlet behindDoc = xml.boolAttr(node, \"behindDoc\");\r\n\r\n\t\tlet posX = { relative: \"page\", align: \"left\", offset: \"0\" };\r\n\t\tlet posY = { relative: \"page\", align: \"top\", offset: \"0\" };\r\n\r\n\t\tfor (var n of xml.elements(node)) {\r\n\t\t\tswitch (n.localName) {\r\n\t\t\t\tcase \"simplePos\":\r\n\t\t\t\t\tif (simplePos) {\r\n\t\t\t\t\t\tposX.offset = xml.lengthAttr(n, \"x\", LengthUsage.Emu);\r\n\t\t\t\t\t\tposY.offset = xml.lengthAttr(n, \"y\", LengthUsage.Emu);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"extent\":\r\n\t\t\t\t\tresult.cssStyle[\"width\"] = xml.lengthAttr(n, \"cx\", LengthUsage.Emu);\r\n\t\t\t\t\tresult.cssStyle[\"height\"] = xml.lengthAttr(n, \"cy\", LengthUsage.Emu);\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"positionH\":\r\n\t\t\t\tcase \"positionV\":\r\n\t\t\t\t\tif (!simplePos) {\r\n\t\t\t\t\t\tlet pos = n.localName == \"positionH\" ? posX : posY;\r\n\t\t\t\t\t\tvar alignNode = xml.element(n, \"align\");\r\n\t\t\t\t\t\tvar offsetNode = xml.element(n, \"posOffset\");\r\n\r\n\t\t\t\t\t\tpos.relative = xml.attr(n, \"relativeFrom\") ?? pos.relative;\r\n\r\n\t\t\t\t\t\tif (alignNode)\r\n\t\t\t\t\t\t\tpos.align = alignNode.textContent;\r\n\r\n\t\t\t\t\t\tif (offsetNode)\r\n\t\t\t\t\t\t\tpos.offset = convertLength(offsetNode.textContent, LengthUsage.Emu);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"wrapTopAndBottom\":\r\n\t\t\t\t\twrapType = \"wrapTopAndBottom\";\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"wrapNone\":\r\n\t\t\t\t\twrapType = \"wrapNone\";\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"graphic\":\r\n\t\t\t\t\tvar g = this.parseGraphic(n);\r\n\r\n\t\t\t\t\tif (g)\r\n\t\t\t\t\t\tresult.children.push(g);\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (wrapType == \"wrapTopAndBottom\") {\r\n\t\t\tresult.cssStyle['display'] = 'block';\r\n\r\n\t\t\tif (posX.align) {\r\n\t\t\t\tresult.cssStyle['text-align'] = posX.align;\r\n\t\t\t\tresult.cssStyle['width'] = \"100%\";\r\n\t\t\t}\r\n\t\t}\r\n\t\telse if (wrapType == \"wrapNone\") {\r\n\t\t\tresult.cssStyle['display'] = 'block';\r\n\t\t\tresult.cssStyle['position'] = 'relative';\r\n\t\t\tresult.cssStyle[\"width\"] = \"0px\";\r\n\t\t\tresult.cssStyle[\"height\"] = \"0px\";\r\n\r\n\t\t\tif (posX.offset)\r\n\t\t\t\tresult.cssStyle[\"left\"] = posX.offset;\r\n\t\t\tif (posY.offset)\r\n\t\t\t\tresult.cssStyle[\"top\"] = posY.offset;\r\n\t\t}\r\n\t\telse if (isAnchor && (posX.align == 'left' || posX.align == 'right')) {\r\n\t\t\tresult.cssStyle[\"float\"] = posX.align;\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tparseGraphic(elem: Element): OpenXmlElement {\r\n\t\tvar graphicData = xml.element(elem, \"graphicData\");\r\n\r\n\t\tfor (let n of xml.elements(graphicData)) {\r\n\t\t\tswitch (n.localName) {\r\n\t\t\t\tcase \"pic\":\r\n\t\t\t\t\treturn this.parsePicture(n);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn null;\r\n\t}\r\n\r\n\tparsePicture(elem: Element): IDomImage {\r\n\t\tvar result = <IDomImage>{ type: DomType.Image, src: \"\", cssStyle: {} };\r\n\t\tvar blipFill = xml.element(elem, \"blipFill\");\r\n\t\tvar blip = xml.element(blipFill, \"blip\");\r\n\t\tvar srcRect = xml.element(blipFill, \"srcRect\");\r\n\r\n\t\tresult.src = xml.attr(blip, \"embed\");\r\n\r\n\t\tif (srcRect) {\r\n\t\t\tresult.srcRect = [\r\n\t\t\t\txml.intAttr(srcRect, \"l\", 0) / 100000,\r\n\t\t\t\txml.intAttr(srcRect, \"t\", 0) / 100000,\r\n\t\t\t\txml.intAttr(srcRect, \"r\", 0) / 100000,\r\n\t\t\t\txml.intAttr(srcRect, \"b\", 0) / 100000,\r\n\t\t\t];\r\n\t\t}\r\n\r\n\t\tvar spPr = xml.element(elem, \"spPr\");\r\n\t\tvar xfrm = xml.element(spPr, \"xfrm\");\r\n\r\n\t\tresult.cssStyle[\"position\"] = \"relative\";\r\n\r\n\t\tif (xfrm) {\r\n\t\t\tresult.rotation = xml.intAttr(xfrm, \"rot\", 0) / 60000;\r\n\r\n\t\t\tfor (var n of xml.elements(xfrm)) {\r\n\t\t\t\tswitch (n.localName) {\r\n\t\t\t\t\tcase \"ext\":\r\n\t\t\t\t\t\tresult.cssStyle[\"width\"] = xml.lengthAttr(n, \"cx\", LengthUsage.Emu);\r\n\t\t\t\t\t\tresult.cssStyle[\"height\"] = xml.lengthAttr(n, \"cy\", LengthUsage.Emu);\r\n\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\tcase \"off\":\r\n\t\t\t\t\t\tresult.cssStyle[\"left\"] = xml.lengthAttr(n, \"x\", LengthUsage.Emu);\r\n\t\t\t\t\t\tresult.cssStyle[\"top\"] = xml.lengthAttr(n, \"y\", LengthUsage.Emu);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tparseTable(node: Element): WmlTable {\r\n\t\tvar result: WmlTable = { type: DomType.Table, children: [] };\r\n\r\n\t\tfor (const c of xml.elements(node)) {\r\n\t\t\tswitch (c.localName) {\r\n\t\t\t\tcase \"tr\":\r\n\t\t\t\t\tresult.children.push(this.parseTableRow(c));\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"tblGrid\":\r\n\t\t\t\t\tresult.columns = this.parseTableColumns(c);\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"tblPr\":\r\n\t\t\t\t\tthis.parseTableProperties(c, result);\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tparseTableColumns(node: Element): WmlTableColumn[] {\r\n\t\tvar result = [];\r\n\r\n\t\tfor (const n of xml.elements(node)) {\r\n\t\t\tswitch (n.localName) {\r\n\t\t\t\tcase \"gridCol\":\r\n\t\t\t\t\tresult.push({ width: xml.lengthAttr(n, \"w\") });\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tparseTableProperties(elem: Element, table: WmlTable) {\r\n\t\ttable.cssStyle = {};\r\n\t\ttable.cellStyle = {};\r\n\r\n\t\tthis.parseDefaultProperties(elem, table.cssStyle, table.cellStyle, c => {\r\n\t\t\tswitch (c.localName) {\r\n\t\t\t\tcase \"tblStyle\":\r\n\t\t\t\t\ttable.styleName = xml.attr(c, \"val\");\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"tblLook\":\r\n\t\t\t\t\ttable.className = values.classNameOftblLook(c);\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"tblpPr\":\r\n\t\t\t\t\tthis.parseTablePosition(c, table);\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"tblStyleColBandSize\":\r\n\t\t\t\t\ttable.colBandSize = xml.intAttr(c, \"val\");\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"tblStyleRowBandSize\":\r\n\t\t\t\t\ttable.rowBandSize = xml.intAttr(c, \"val\");\r\n\t\t\t\t\tbreak;\r\n\r\n\r\n\t\t\t\tcase \"hidden\":\r\n\t\t\t\t\ttable.cssStyle[\"display\"] = \"none\";\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tdefault:\r\n\t\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\treturn true;\r\n\t\t});\r\n\r\n\t\tswitch (table.cssStyle[\"text-align\"]) {\r\n\t\t\tcase \"center\":\r\n\t\t\t\tdelete table.cssStyle[\"text-align\"];\r\n\t\t\t\ttable.cssStyle[\"margin-left\"] = \"auto\";\r\n\t\t\t\ttable.cssStyle[\"margin-right\"] = \"auto\";\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase \"right\":\r\n\t\t\t\tdelete table.cssStyle[\"text-align\"];\r\n\t\t\t\ttable.cssStyle[\"margin-left\"] = \"auto\";\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\tparseTablePosition(node: Element, table: WmlTable) {\r\n\t\tvar topFromText = xml.lengthAttr(node, \"topFromText\");\r\n\t\tvar bottomFromText = xml.lengthAttr(node, \"bottomFromText\");\r\n\t\tvar rightFromText = xml.lengthAttr(node, \"rightFromText\");\r\n\t\tvar leftFromText = xml.lengthAttr(node, \"leftFromText\");\r\n\r\n\t\tvar horzAnchor = xml.attr(node, \"horzAnchor\"); // margin | page | text\r\n\t\tvar vertAnchor = xml.attr(node, \"vertAnchor\");\r\n\t\tvar tblpXSpec = xml.attr(node, \"tblpXSpec\"); // left | center | right | ...\r\n\t\tvar tblpYSpec = xml.attr(node, \"tblpYSpec\"); // top | center | bottom | ...\r\n\r\n\t\t// Bottom-anchored floating tables (公文版记行: vertAnchor=\"margin\" +\r\n\t\t// tblpYSpec=\"bottom\") pin to the bottom of the text area. Page\r\n\t\t// sections are position:relative and expose their paddings as\r\n\t\t// --docx-pad-* variables (see createPageElement), so the table is\r\n\t\t// taken out of normal flow and anchored absolutely.\r\n\t\tif (tblpYSpec == \"bottom\" && vertAnchor != \"text\") {\r\n\t\t\ttable.cssStyle[\"position\"] = \"absolute\";\r\n\t\t\ttable.cssStyle[\"bottom\"] = vertAnchor == \"page\" ? \"0px\" : \"var(--docx-pad-bottom, 0px)\";\r\n\r\n\t\t\tif (tblpXSpec == \"right\") {\r\n\t\t\t\ttable.cssStyle[\"right\"] = horzAnchor == \"page\" ? \"0px\" : \"var(--docx-pad-right, 0px)\";\r\n\t\t\t} else if (tblpXSpec == \"center\") {\r\n\t\t\t\ttable.cssStyle[\"left\"] = \"50%\";\r\n\t\t\t\ttable.cssStyle[\"transform\"] = \"translateX(-50%)\";\r\n\t\t\t} else {\r\n\t\t\t\ttable.cssStyle[\"left\"] = horzAnchor == \"page\" ? \"0px\" : \"var(--docx-pad-left, 0px)\";\r\n\t\t\t}\r\n\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\ttable.cssStyle[\"float\"] = 'left';\r\n\t\ttable.cssStyle[\"margin-bottom\"] = values.addSize(table.cssStyle[\"margin-bottom\"], bottomFromText);\r\n\t\ttable.cssStyle[\"margin-left\"] = values.addSize(table.cssStyle[\"margin-left\"], leftFromText);\r\n\t\ttable.cssStyle[\"margin-right\"] = values.addSize(table.cssStyle[\"margin-right\"], rightFromText);\r\n\t\ttable.cssStyle[\"margin-top\"] = values.addSize(table.cssStyle[\"margin-top\"], topFromText);\r\n\t}\r\n\r\n\tparseTableRow(node: Element): WmlTableRow {\r\n\t\tvar result: WmlTableRow = { type: DomType.Row, children: [] };\r\n\r\n\t\tfor (const c of xml.elements(node)) {\r\n\t\t\tswitch (c.localName) {\r\n\t\t\t\tcase \"tc\":\r\n\t\t\t\t\tresult.children.push(this.parseTableCell(c));\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"trPr\":\r\n\t\t\t\tcase \"tblPrEx\":\r\n\t\t\t\t\tthis.parseTableRowProperties(c, result);\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tparseTableRowProperties(elem: Element, row: WmlTableRow) {\r\n\t\trow.cssStyle = this.parseDefaultProperties(elem, {}, null, c => {\r\n\t\t\tswitch (c.localName) {\r\n\t\t\t\tcase \"cnfStyle\":\r\n\t\t\t\t\trow.className = values.classNameOfCnfStyle(c);\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"tblHeader\":\r\n\t\t\t\t\trow.isHeader = xml.boolAttr(c, \"val\");\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"gridBefore\":\r\n\t\t\t\t\trow.gridBefore = xml.intAttr(c, \"val\");\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"gridAfter\":\r\n\t\t\t\t\trow.gridAfter = xml.intAttr(c, \"val\");\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tdefault:\r\n\t\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\treturn true;\r\n\t\t});\r\n\t}\r\n\r\n\tparseTableCell(node: Element): OpenXmlElement {\r\n\t\tvar result: WmlTableCell = { type: DomType.Cell, children: [] };\r\n\r\n\t\tfor (const c of xml.elements(node)) {\r\n\t\t\tswitch (c.localName) {\r\n\t\t\t\tcase \"tbl\":\r\n\t\t\t\t\tresult.children.push(this.parseTable(c));\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"p\":\r\n\t\t\t\t\tresult.children.push(this.parseParagraph(c));\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"tcPr\":\r\n\t\t\t\t\tthis.parseTableCellProperties(c, result);\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tparseTableCellProperties(elem: Element, cell: WmlTableCell) {\r\n\t\tcell.cssStyle = this.parseDefaultProperties(elem, {}, null, c => {\r\n\t\t\tswitch (c.localName) {\r\n\t\t\t\tcase \"gridSpan\":\r\n\t\t\t\t\tcell.span = xml.intAttr(c, \"val\", null);\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"vMerge\":\r\n\t\t\t\t\tcell.verticalMerge = xml.attr(c, \"val\") ?? \"continue\";\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"cnfStyle\":\r\n\t\t\t\t\tcell.className = values.classNameOfCnfStyle(c);\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tdefault:\r\n\t\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\treturn true;\r\n\t\t});\r\n\r\n\t\tthis.parseTableCellVerticalText(elem, cell);\r\n\t}\r\n\r\n\tparseTableCellVerticalText(elem: Element, cell: WmlTableCell) {\r\n\t\tconst directionMap = {\r\n\t\t\t\"btLr\": {\r\n\t\t\t\twritingMode: \"vertical-rl\",\r\n\t\t\t\ttransform: \"rotate(180deg)\"\r\n\t\t\t},\r\n\t\t\t\"lrTb\": {\r\n\t\t\t\twritingMode: \"vertical-lr\",\r\n\t\t\t\ttransform: \"none\"\r\n\t\t\t},\r\n\t\t\t\"tbRl\": {\r\n\t\t\t\twritingMode: \"vertical-rl\",\r\n\t\t\t\ttransform: \"none\"\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tfor (const c of xml.elements(elem)) {\r\n\t\t\tif (c.localName === \"textDirection\") {\r\n\t\t\t\tconst direction = xml.attr(c, \"val\");\r\n\t\t\t\tconst style = directionMap[direction] || { writingMode: \"horizontal-tb\" };\r\n\t\t\t\tcell.cssStyle[\"writing-mode\"] = style.writingMode;\r\n\t\t\t\tcell.cssStyle[\"transform\"] = style.transform;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tparseDefaultProperties(elem: Element, style: Record<string, string> = null, childStyle: Record<string, string> = null, handler: (prop: Element) => boolean = null): Record<string, string> {\r\n\t\tstyle = style || {};\r\n\r\n\t\tfor (const c of xml.elements(elem)) {\r\n\t\t\tif (handler?.(c))\r\n\t\t\t\tcontinue;\r\n\r\n\t\t\tswitch (c.localName) {\r\n\t\t\t\tcase \"jc\":\r\n\t\t\t\t\tstyle[\"text-align\"] = values.valueOfJc(c);\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"textAlignment\":\r\n\t\t\t\t\tstyle[\"vertical-align\"] = values.valueOfTextAlignment(c);\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"color\":\r\n\t\t\t\t\tstyle[\"color\"] = xmlUtil.colorAttr(c, \"val\", null, autos.color);\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"sz\":\r\n\t\t\t\t\tstyle[\"font-size\"] = style[\"min-height\"] = xml.lengthAttr(c, \"val\", LengthUsage.FontSize);\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"shd\":\r\n\t\t\t\t\tstyle[\"background-color\"] = xmlUtil.colorAttr(c, \"fill\", null, autos.shd);\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"highlight\":\r\n\t\t\t\t\tstyle[\"background-color\"] = xmlUtil.colorAttr(c, \"val\", null, autos.highlight);\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"vertAlign\":\r\n\t\t\t\t\t//TODO\r\n\t\t\t\t\t// style.verticalAlign = values.valueOfVertAlign(c);\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"position\":\r\n\t\t\t\t\tstyle.verticalAlign = xml.lengthAttr(c, \"val\", LengthUsage.FontSize);\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"tcW\":\r\n\t\t\t\t\tif (this.options.ignoreWidth)\r\n\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"tblW\":\r\n\t\t\t\t\tstyle[\"width\"] = values.valueOfSize(c, \"w\");\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"trHeight\":\r\n\t\t\t\t\tthis.parseTrHeight(c, style);\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"strike\":\r\n\t\t\t\t\tstyle[\"text-decoration\"] = xml.boolAttr(c, \"val\", true) ? \"line-through\" : \"none\"\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"b\":\r\n\t\t\t\t\tstyle[\"font-weight\"] = xml.boolAttr(c, \"val\", true) ? \"bold\" : \"normal\";\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"i\":\r\n\t\t\t\t\tstyle[\"font-style\"] = xml.boolAttr(c, \"val\", true) ? \"italic\" : \"normal\";\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"caps\":\r\n\t\t\t\t\tstyle[\"text-transform\"] = xml.boolAttr(c, \"val\", true) ? \"uppercase\" : \"none\";\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"smallCaps\":\r\n\t\t\t\t\tstyle[\"font-variant\"] = xml.boolAttr(c, \"val\", true) ? \"small-caps\" : \"none\";\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"u\":\r\n\t\t\t\t\tthis.parseUnderline(c, style);\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"ind\":\r\n\t\t\t\tcase \"tblInd\":\r\n\t\t\t\t\tthis.parseIndentation(c, style);\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"rFonts\":\r\n\t\t\t\t\tthis.parseFont(c, style);\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"tblBorders\":\r\n\t\t\t\t\tthis.parseBorderProperties(c, childStyle || style);\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"tblCellSpacing\":\r\n\t\t\t\t\tstyle[\"border-spacing\"] = values.valueOfMargin(c);\r\n\t\t\t\t\tstyle[\"border-collapse\"] = \"separate\";\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"pBdr\":\r\n\t\t\t\t\tthis.parseBorderProperties(c, style);\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"bdr\":\r\n\t\t\t\t\tstyle[\"border\"] = values.valueOfBorder(c);\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"tcBorders\":\r\n\t\t\t\t\tthis.parseBorderProperties(c, style);\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"vanish\":\r\n\t\t\t\t\tif (xml.boolAttr(c, \"val\", true))\r\n\t\t\t\t\t\tstyle[\"display\"] = \"none\";\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"kern\":\r\n\t\t\t\t\t//TODO\r\n\t\t\t\t\t//style['letter-spacing'] = xml.lengthAttr(elem, 'val', LengthUsage.FontSize);\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"noWrap\":\r\n\t\t\t\t\t//TODO\r\n\t\t\t\t\t//style[\"white-space\"] = \"nowrap\";\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"tblCellMar\":\r\n\t\t\t\tcase \"tcMar\":\r\n\t\t\t\t\tthis.parseMarginProperties(c, childStyle || style);\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"tblLayout\":\r\n\t\t\t\t\tstyle[\"table-layout\"] = values.valueOfTblLayout(c);\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"vAlign\":\r\n\t\t\t\t\tstyle[\"vertical-align\"] = values.valueOfTextAlignment(c);\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"spacing\":\r\n\t\t\t\t\tif (elem.localName == \"pPr\")\r\n\t\t\t\t\t\tthis.parseSpacing(c, style);\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"wordWrap\":\r\n\t\t\t\t\tif (xml.boolAttr(c, \"val\")) //TODO: test with examples\r\n\t\t\t\t\t\tstyle[\"overflow-wrap\"] = \"break-word\";\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"suppressAutoHyphens\":\r\n\t\t\t\t\tstyle[\"hyphens\"] = xml.boolAttr(c, \"val\", true) ? \"none\" : \"auto\";\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"lang\":\r\n\t\t\t\t\tstyle[\"$lang\"] = xml.attr(c, \"val\");\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"rtl\":\r\n\t\t\t\tcase \"bidi\":\r\n\t\t\t\t\tif (xml.boolAttr(c, \"val\", true))\r\n\t\t\t\t\t\tstyle[\"direction\"] = \"rtl\";\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"bCs\":\r\n\t\t\t\tcase \"iCs\":\r\n\t\t\t\tcase \"szCs\":\r\n\t\t\t\tcase \"tabs\": //ignore - tabs is parsed by other parser\r\n\t\t\t\tcase \"outlineLvl\": //TODO\r\n\t\t\t\tcase \"contextualSpacing\": //TODO\r\n\t\t\t\tcase \"tblStyleColBandSize\": //TODO\r\n\t\t\t\tcase \"tblStyleRowBandSize\": //TODO\r\n\t\t\t\tcase \"webHidden\": //TODO - maybe web-hidden should be implemented\r\n\t\t\t\tcase \"pageBreakBefore\": //TODO - maybe ignore \r\n\t\t\t\tcase \"suppressLineNumbers\": //TODO - maybe ignore\r\n\t\t\t\tcase \"keepLines\": //TODO - maybe ignore\r\n\t\t\t\tcase \"keepNext\": //TODO - maybe ignore\r\n\t\t\t\tcase \"widowControl\": //TODO - maybe ignore \r\n\t\t\t\tcase \"noProof\": //ignore spellcheck\r\n\t\t\t\t\t//TODO ignore\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tif (this.options.debug)\r\n\t\t\t\t\t\tconsole.warn(`DOCX: Unknown document element: ${elem.localName}.${c.localName}`);\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn style;\r\n\t}\r\n\r\n\tparseUnderline(node: Element, style: Record<string, string>) {\r\n\t\tvar val = xml.attr(node, \"val\");\r\n\r\n\t\tif (val == null)\r\n\t\t\treturn;\r\n\r\n\t\tswitch (val) {\r\n\t\t\tcase \"dash\":\r\n\t\t\tcase \"dashDotDotHeavy\":\r\n\t\t\tcase \"dashDotHeavy\":\r\n\t\t\tcase \"dashedHeavy\":\r\n\t\t\tcase \"dashLong\":\r\n\t\t\tcase \"dashLongHeavy\":\r\n\t\t\tcase \"dotDash\":\r\n\t\t\tcase \"dotDotDash\":\r\n\t\t\t\tstyle[\"text-decoration\"] = \"underline dashed\";\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase \"dotted\":\r\n\t\t\tcase \"dottedHeavy\":\r\n\t\t\t\tstyle[\"text-decoration\"] = \"underline dotted\";\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase \"double\":\r\n\t\t\t\tstyle[\"text-decoration\"] = \"underline double\";\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase \"single\":\r\n\t\t\tcase \"thick\":\r\n\t\t\t\tstyle[\"text-decoration\"] = \"underline\";\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase \"wave\":\r\n\t\t\tcase \"wavyDouble\":\r\n\t\t\tcase \"wavyHeavy\":\r\n\t\t\t\tstyle[\"text-decoration\"] = \"underline wavy\";\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase \"words\":\r\n\t\t\t\tstyle[\"text-decoration\"] = \"underline\";\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase \"none\":\r\n\t\t\t\tstyle[\"text-decoration\"] = \"none\";\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tvar col = xmlUtil.colorAttr(node, \"color\");\r\n\r\n\t\tif (col)\r\n\t\t\tstyle[\"text-decoration-color\"] = col;\r\n\t}\r\n\r\n\tparseFont(node: Element, style: Record<string, string>) {\r\n\t\t// Fonts are resolved per script (Latin / East Asian) as CSS custom\r\n\t\t// properties, which inherit independently down the style hierarchy —\r\n\t\t// mirroring Word's per-script font resolution. A run-level rFonts\r\n\t\t// carrying only w:ascii then overrides just the Latin component and\r\n\t\t// keeps the East Asian font inherited from the paragraph style,\r\n\t\t// instead of clobbering the whole font-family. The universal rule in\r\n\t\t// renderDefaultStyle composes the final font-family on every element.\r\n\t\tvar ascii = xml.attr(node, \"ascii\") ?? xml.attr(node, \"hAnsi\")\r\n\t\t\t?? values.themeValue(node, \"asciiTheme\") ?? values.themeValue(node, \"hAnsiTheme\");\r\n\t\tvar eastAsia = xml.attr(node, \"eastAsia\") ?? values.themeValue(node, \"eastAsiaTheme\");\r\n\r\n\t\tif (ascii) style[\"--docx-font-ascii\"] = encloseFontFamily(ascii);\r\n\t\tif (eastAsia) style[\"--docx-font-ea\"] = encloseFontFamily(eastAsia);\r\n\t}\r\n\r\n\tparseIndentation(node: Element, style: Record<string, string>) {\r\n\t\tvar firstLine = xml.lengthAttr(node, \"firstLine\");\r\n\t\tvar hanging = xml.lengthAttr(node, \"hanging\");\r\n\t\tvar left = xml.lengthAttr(node, \"left\");\r\n\t\tvar start = xml.lengthAttr(node, \"start\");\r\n\t\tvar right = xml.lengthAttr(node, \"right\");\r\n\t\tvar end = xml.lengthAttr(node, \"end\");\r\n\r\n\t\tif (firstLine) style[\"text-indent\"] = firstLine;\r\n\t\tif (hanging) style[\"text-indent\"] = `-${hanging}`;\r\n\t\tif (left || start) style[\"margin-inline-start\"] = left || start;\r\n\t\tif (right || end) style[\"margin-inline-end\"] = right || end;\r\n\t}\r\n\r\n\tparseSpacing(node: Element, style: Record<string, string>) {\r\n\t\tvar before = xml.lengthAttr(node, \"before\");\r\n\t\tvar after = xml.lengthAttr(node, \"after\");\r\n\t\tvar beforeLines = xml.intAttr(node, \"beforeLines\", null);\r\n\t\tvar afterLines = xml.intAttr(node, \"afterLines\", null);\r\n\t\tvar line = xml.intAttr(node, \"line\", null);\r\n\t\tvar lineRule = xml.attr(node, \"lineRule\");\r\n\r\n\t\t// beforeLines/afterLines are hundredths of a line; 1em approximates\r\n\t\t// Word's single line height closely enough for preview purposes.\r\n\t\tif (before) style[\"margin-top\"] = before;\r\n\t\telse if (beforeLines != null) style[\"margin-top\"] = `${beforeLines / 100}em`;\r\n\t\tif (after) style[\"margin-bottom\"] = after;\r\n\t\telse if (afterLines != null) style[\"margin-bottom\"] = `${afterLines / 100}em`;\r\n\r\n\t\tif (line !== null) {\r\n\t\t\tswitch (lineRule) {\r\n\t\t\t\tcase \"auto\":\r\n\t\t\t\t\tstyle[\"line-height\"] = `${(line / 240).toFixed(2)}`;\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"atLeast\":\r\n\t\t\t\t\t// Word: line height = max(natural, X). calc(100% + X)\r\n\t\t\t\t\t// renders nearly double that; plain X is the closer\r\n\t\t\t\t\t// approximation for typical (CJK) documents.\r\n\t\t\t\t\tstyle[\"line-height\"] = `${line / 20}pt`;\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tstyle[\"line-height\"] = style[\"min-height\"] = `${line / 20}pt`\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tparseMarginProperties(node: Element, output: Record<string, string>) {\r\n\t\tfor (const c of xml.elements(node)) {\r\n\t\t\tswitch (c.localName) {\r\n\t\t\t\tcase \"left\":\r\n\t\t\t\t\toutput[\"padding-left\"] = values.valueOfMargin(c);\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"right\":\r\n\t\t\t\t\toutput[\"padding-right\"] = values.valueOfMargin(c);\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"top\":\r\n\t\t\t\t\toutput[\"padding-top\"] = values.valueOfMargin(c);\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"bottom\":\r\n\t\t\t\t\toutput[\"padding-bottom\"] = values.valueOfMargin(c);\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tparseTrHeight(node: Element, output: Record<string, string>) {\r\n\t\tswitch (xml.attr(node, \"hRule\")) {\r\n\t\t\tcase \"exact\":\r\n\t\t\t\toutput[\"height\"] = xml.lengthAttr(node, \"val\");\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase \"atLeast\":\r\n\t\t\tdefault:\r\n\t\t\t\toutput[\"height\"] = xml.lengthAttr(node, \"val\");\r\n\t\t\t\t// min-height doesn't work for tr\r\n\t\t\t\t//output[\"min-height\"] = xml.sizeAttr(node, \"val\"); \r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\tparseBorderProperties(node: Element, output: Record<string, string>) {\r\n\t\tfor (const c of xml.elements(node)) {\r\n\t\t\tswitch (c.localName) {\r\n\t\t\t\tcase \"start\":\r\n\t\t\t\tcase \"left\":\r\n\t\t\t\t\toutput[\"border-left\"] = values.valueOfBorder(c);\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"end\":\r\n\t\t\t\tcase \"right\":\r\n\t\t\t\t\toutput[\"border-right\"] = values.valueOfBorder(c);\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"top\":\r\n\t\t\t\t\toutput[\"border-top\"] = values.valueOfBorder(c);\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"bottom\":\r\n\t\t\t\t\toutput[\"border-bottom\"] = values.valueOfBorder(c);\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nconst knownColors = ['black', 'blue', 'cyan', 'darkBlue', 'darkCyan', 'darkGray', 'darkGreen', 'darkMagenta', 'darkRed', 'darkYellow', 'green', 'lightGray', 'magenta', 'none', 'red', 'white', 'yellow'];\r\n\r\nclass xmlUtil {\r\n\tstatic colorAttr(node: Element, attrName: string, defValue: string = null, autoColor: string = 'black') {\r\n\t\tvar v = xml.attr(node, attrName);\r\n\r\n\t\tif (v) {\r\n\t\t\tif (v == \"auto\") {\r\n\t\t\t\treturn autoColor;\r\n\t\t\t} else if (knownColors.includes(v)) {\r\n\t\t\t\treturn v;\r\n\t\t\t}\r\n\r\n\t\t\treturn `#${v}`;\r\n\t\t}\r\n\r\n\t\tvar themeColor = xml.attr(node, \"themeColor\");\r\n\r\n\t\treturn themeColor ? `var(--docx-${themeColor}-color)` : defValue;\r\n\t}\r\n}\r\n\r\nclass values {\r\n\tstatic themeValue(c: Element, attr: string) {\r\n\t\tvar val = xml.attr(c, attr);\r\n\t\treturn val ? `var(--docx-${val}-font)` : null;\r\n\t}\r\n\r\n\tstatic valueOfSize(c: Element, attr: string) {\r\n\t\tvar type = LengthUsage.Dxa;\r\n\r\n\t\tswitch (xml.attr(c, \"type\")) {\r\n\t\t\tcase \"dxa\": break;\r\n\t\t\tcase \"pct\": type = LengthUsage.Percent; break;\r\n\t\t\tcase \"auto\": return \"auto\";\r\n\t\t}\r\n\r\n\t\treturn xml.lengthAttr(c, attr, type);\r\n\t}\r\n\r\n\tstatic valueOfMargin(c: Element) {\r\n\t\treturn xml.lengthAttr(c, \"w\");\r\n\t}\r\n\r\n\tstatic valueOfBorder(c: Element) {\r\n\t\tvar type = values.parseBorderType(xml.attr(c, \"val\"));\r\n\r\n\t\tif (type == \"none\")\r\n\t\t\treturn \"none\";\r\n\r\n\t\tvar color = xmlUtil.colorAttr(c, \"color\");\r\n\t\tvar size = xml.lengthAttr(c, \"sz\", LengthUsage.Border);\r\n\r\n\t\treturn `${size} ${type} ${color == \"auto\" ? autos.borderColor : color}`;\r\n\t}\r\n\r\n\tstatic parseBorderType(type: string) {\r\n\t\tswitch (type) {\r\n\t\t\tcase \"single\": return \"solid\";\r\n\t\t\tcase \"dashDotStroked\": return \"solid\";\r\n\t\t\tcase \"dashed\": return \"dashed\";\r\n\t\t\tcase \"dashSmallGap\": return \"dashed\";\r\n\t\t\tcase \"dotDash\": return \"dotted\";\r\n\t\t\tcase \"dotDotDash\": return \"dotted\";\r\n\t\t\tcase \"dotted\": return \"dotted\";\r\n\t\t\tcase \"double\": return \"double\";\r\n\t\t\tcase \"doubleWave\": return \"double\";\r\n\t\t\tcase \"inset\": return \"inset\";\r\n\t\t\tcase \"nil\": return \"none\";\r\n\t\t\tcase \"none\": return \"none\";\r\n\t\t\tcase \"outset\": return \"outset\";\r\n\t\t\tcase \"thick\": return \"solid\";\r\n\t\t\tcase \"thickThinLargeGap\": return \"solid\";\r\n\t\t\tcase \"thickThinMediumGap\": return \"solid\";\r\n\t\t\tcase \"thickThinSmallGap\": return \"solid\";\r\n\t\t\tcase \"thinThickLargeGap\": return \"solid\";\r\n\t\t\tcase \"thinThickMediumGap\": return \"solid\";\r\n\t\t\tcase \"thinThickSmallGap\": return \"solid\";\r\n\t\t\tcase \"thinThickThinLargeGap\": return \"solid\";\r\n\t\t\tcase \"thinThickThinMediumGap\": return \"solid\";\r\n\t\t\tcase \"thinThickThinSmallGap\": return \"solid\";\r\n\t\t\tcase \"threeDEmboss\": return \"solid\";\r\n\t\t\tcase \"threeDEngrave\": return \"solid\";\r\n\t\t\tcase \"triple\": return \"double\";\r\n\t\t\tcase \"wave\": return \"solid\";\r\n\t\t}\r\n\r\n\t\treturn 'solid';\r\n\t}\r\n\r\n\tstatic valueOfTblLayout(c: Element) {\r\n\t\tvar type = xml.attr(c, \"val\");\r\n\t\treturn type == \"fixed\" ? \"fixed\" : \"auto\";\r\n\t}\r\n\r\n\tstatic classNameOfCnfStyle(c: Element) {\r\n\t\tconst val = xml.attr(c, \"val\");\r\n\t\tconst classes = [\r\n\t\t\t'first-row', 'last-row', 'first-col', 'last-col',\r\n\t\t\t'odd-col', 'even-col', 'odd-row', 'even-row',\r\n\t\t\t'ne-cell', 'nw-cell', 'se-cell', 'sw-cell'\r\n\t\t];\r\n\r\n\t\tif (val)\r\n\t\t\treturn classes.filter((_, i) => val[i] == '1').join(' ');\r\n\r\n\t\tconst attrs = [\r\n\t\t\t'firstRow', 'lastRow', 'firstColumn', 'lastColumn',\r\n\t\t\t'oddVBand', 'evenVBand', 'oddHBand', 'evenHBand',\r\n\t\t\t'firstRowLastColumn', 'firstRowFirstColumn', 'lastRowLastColumn', 'lastRowFirstColumn'\r\n\t\t];\r\n\r\n\t\treturn classes.filter((_, i) => xml.boolAttr(c, attrs[i])).join(' ');\r\n\t}\r\n\r\n\tstatic valueOfJc(c: Element) {\r\n\t\tvar type = xml.attr(c, \"val\");\r\n\r\n\t\tswitch (type) {\r\n\t\t\tcase \"start\":\r\n\t\t\tcase \"left\": return \"left\";\r\n\t\t\tcase \"center\": return \"center\";\r\n\t\t\tcase \"end\":\r\n\t\t\tcase \"right\": return \"right\";\r\n\t\t\tcase \"both\": return \"justify\";\r\n\t\t}\r\n\r\n\t\treturn type;\r\n\t}\r\n\r\n\tstatic valueOfVertAlign(c: Element, asTagName: boolean = false) {\r\n\t\tvar type = xml.attr(c, \"val\");\r\n\r\n\t\tswitch (type) {\r\n\t\t\tcase \"subscript\": return \"sub\";\r\n\t\t\tcase \"superscript\": return asTagName ? \"sup\" : \"super\";\r\n\t\t}\r\n\r\n\t\treturn asTagName ? null : type;\r\n\t}\r\n\r\n\tstatic valueOfTextAlignment(c: Element) {\r\n\t\tvar type = xml.attr(c, \"val\");\r\n\r\n\t\tswitch (type) {\r\n\t\t\tcase \"auto\":\r\n\t\t\tcase \"baseline\": return \"baseline\";\r\n\t\t\tcase \"top\": return \"top\";\r\n\t\t\tcase \"center\": return \"middle\";\r\n\t\t\tcase \"bottom\": return \"bottom\";\r\n\t\t}\r\n\r\n\t\treturn type;\r\n\t}\r\n\r\n\tstatic addSize(a: string, b: string): string {\r\n\t\tif (a == null) return b;\r\n\t\tif (b == null) return a;\r\n\r\n\t\treturn `calc(${a} + ${b})`; //TODO\r\n\t}\r\n\r\n\tstatic classNameOftblLook(c: Element) {\r\n\t\tconst val = xml.hexAttr(c, \"val\", 0);\r\n\t\tlet className = \"\";\r\n\r\n\t\tif (xml.boolAttr(c, \"firstRow\") || (val & 0x0020)) className += \" first-row\";\r\n\t\tif (xml.boolAttr(c, \"lastRow\") || (val & 0x0040)) className += \" last-row\";\r\n\t\tif (xml.boolAttr(c, \"firstColumn\") || (val & 0x0080)) className += \" first-col\";\r\n\t\tif (xml.boolAttr(c, \"lastColumn\") || (val & 0x0100)) className += \" last-col\";\r\n\t\tif (xml.boolAttr(c, \"noHBand\") || (val & 0x0200)) className += \" no-hband\";\r\n\t\tif (xml.boolAttr(c, \"noVBand\") || (val & 0x0400)) className += \" no-vband\";\r\n\r\n\t\treturn className.trim();\r\n\t}\r\n}\r\n","import { Length } from \"./document/common\";\r\nimport { ParagraphTab } from \"./document/paragraph\";\r\n\r\ninterface TabStop {\r\n\tpos: number;\r\n\tleader: string;\r\n\tstyle: string;\r\n}\r\n\r\nconst defaultTab: TabStop = { pos: 0, leader: \"none\", style: \"left\" };\r\nconst maxTabs = 50;\r\n\r\nexport function computePixelToPoint(container: HTMLElement = document.body) {\r\n\tconst temp = document.createElement(\"div\");\r\n\ttemp.style.width = '100pt';\r\n\t\r\n\tcontainer.appendChild(temp);\r\n\tconst result = 100 / temp.offsetWidth;\r\n\tcontainer.removeChild(temp);\r\n\r\n\treturn result\r\n}\r\n\r\nexport function updateTabStop(elem: HTMLElement, tabs: ParagraphTab[], defaultTabSize: Length, pixelToPoint: number = 72 / 96) {\r\n const p = elem.closest(\"p\");\r\n\r\n const ebb = elem.getBoundingClientRect();\r\n const pbb = p.getBoundingClientRect();\r\n const pcs = getComputedStyle(p);\r\n\r\n\tconst tabStops = tabs?.length > 0 ? tabs.map(t => ({\r\n\t\tpos: lengthToPoint(t.position),\r\n\t\tleader: t.leader,\r\n\t\tstyle: t.style\r\n\t})).sort((a, b) => a.pos - b.pos) : [defaultTab];\r\n\r\n\tconst lastTab = tabStops[tabStops.length - 1];\r\n\tconst pWidthPt = pbb.width * pixelToPoint;\r\n\tconst size = lengthToPoint(defaultTabSize);\r\n let pos = lastTab.pos + size;\r\n\r\n if (pos < pWidthPt) {\r\n for (; pos < pWidthPt && tabStops.length < maxTabs; pos += size) {\r\n tabStops.push({ ...defaultTab, pos: pos });\r\n }\r\n }\r\n\r\n const marginLeft = parseFloat(pcs.marginLeft);\r\n const pOffset = pbb.left + marginLeft;\r\n const left = (ebb.left - pOffset) * pixelToPoint;\r\n const tab = tabStops.find(t => t.style != \"clear\" && t.pos > left);\r\n\r\n if(tab == null)\r\n return;\r\n\r\n let width: number = 1;\r\n\r\n if (tab.style == \"right\" || tab.style == \"center\") {\r\n\t\tconst tabStops = Array.from(p.querySelectorAll(`.${elem.className}`));\r\n\t\tconst nextIdx = tabStops.indexOf(elem) + 1;\r\n const range = document.createRange();\r\n range.setStart(elem, 1);\r\n\r\n\t\tif (nextIdx < tabStops.length) {\r\n\t\t\trange.setEndBefore(tabStops[nextIdx]);\r\n\t\t} else {\r\n\t\t\trange.setEndAfter(p);\r\n\t\t}\r\n\r\n\t\tconst mul = tab.style == \"center\" ? 0.5 : 1;\r\n const nextBB = range.getBoundingClientRect();\r\n\t\tconst offset = nextBB.left + mul * nextBB.width - (pbb.left - marginLeft);\r\n\r\n\t\twidth = tab.pos - offset * pixelToPoint;\r\n } else {\r\n width = tab.pos - left;\r\n }\r\n\r\n elem.innerHTML = \" \";\r\n elem.style.textDecoration = \"inherit\";\r\n elem.style.wordSpacing = `${width.toFixed(0)}pt`;\r\n\r\n switch (tab.leader) {\r\n case \"dot\":\r\n case \"middleDot\":\r\n elem.style.textDecoration = \"underline\";\r\n elem.style.textDecorationStyle = \"dotted\";\r\n break;\r\n\r\n case \"hyphen\":\r\n case \"heavy\":\r\n case \"underscore\":\r\n elem.style.textDecoration = \"underline\";\r\n break;\r\n }\r\n}\r\n\r\nfunction lengthToPoint(length: Length): number {\r\n\treturn parseFloat(length);\r\n}","import { isString } from \"./utils\";\r\n\r\nexport enum ns {\r\n html = \"http://www.w3.org/1999/xhtml\",\r\n svg = \"http://www.w3.org/2000/svg\",\r\n mathML = \"http://www.w3.org/1998/Math/MathML\"\r\n}\r\n\r\nexport type HElement = {\r\n ns?: ns;\r\n tagName: \"#fragment\" | \"#comment\" | string;\r\n className?: string;\r\n style?: string | Record<string, string>;\r\n children?: (HElement | Node | string)[];\r\n} & Record<string, any>;\r\n\r\nexport function h(elem: HElement | Node | string) {\r\n if (isString(elem)) return document.createTextNode(elem);\r\n if (elem instanceof Node) return elem;\r\n\r\n const { ns, tagName, className, style, children, ...props } = elem;\r\n\r\n if (tagName === \"#fragment\") return document.createDocumentFragment();\r\n if (tagName === \"#comment\") return document.createComment(children[0] as string);\r\n const result = (ns ? document.createElementNS(ns, tagName) : document.createElement(tagName)) as HTMLElement | SVGElement | MathMLElement;\r\n if (className) result.setAttribute(\"class\", className);\r\n if (style) {\r\n if (isString(style)) {\r\n result.setAttribute(\"style\", style);\r\n } else {\r\n // CSS custom properties (\"--*\") are not members of\r\n // CSSStyleDeclaration — Object.assign drops them, so they must\r\n // go through setProperty.\r\n for (const [key, value] of Object.entries(style)) {\r\n if (key.startsWith(\"--\")) result.style.setProperty(key, value);\r\n else (result.style as any)[key] = value;\r\n }\r\n }\r\n }\r\n if (props) {\r\n for (const [key, value] of Object.entries(props))\r\n if (value !== undefined)\r\n result[key] = value\r\n }\r\n if (children) children.forEach(c => result.appendChild(h(c)));\r\n return result;\r\n}\r\n\r\nexport function cx(...classNames: (string | false | undefined)[]) {\r\n return classNames.filter(Boolean).join(\" \");\r\n}","import { WordDocument } from './word-document';\r\nimport {\r\n\tDomType, WmlTable, IDomNumbering,\r\n\tWmlHyperlink, IDomImage, OpenXmlElement, WmlTableColumn, WmlTableCell, WmlText, WmlSymbol, WmlBreak, WmlNoteReference,\r\n\tWmlSmartTag,\r\n\tWmlAltChunk,\r\n\tWmlTableRow,\r\n\tWmlChange\r\n} from './document/dom';\r\nimport { Options } from './docx-preview';\r\nimport { DocumentElement } from './document/document';\r\nimport { WmlParagraph } from './document/paragraph';\r\nimport { asArray, encloseFontFamily, escapeClassName, isString, keyBy, mergeDeep } from './utils';\r\nimport { computePixelToPoint, updateTabStop } from './javascript';\r\nimport { FontTablePart } from './font-table/font-table';\r\nimport { FooterHeaderReference, SectionProperties } from './document/section';\r\nimport { WmlRun } from './document/run';\r\nimport { WmlBookmarkStart } from './document/bookmarks';\r\nimport { IDomStyle } from './document/style';\r\nimport { WmlBaseNote, WmlFootnote } from './notes/elements';\r\nimport { ThemePart } from './theme/theme-part';\r\nimport { BaseHeaderFooterPart } from './header-footer/parts';\r\nimport { Part } from './common/part';\r\nimport { VmlElement } from './vml/vml';\r\nimport { WmlCommentRangeStart, WmlCommentReference } from './comments/elements';\r\nimport { WmlFieldChar, WmlInstructionText } from './document/fields';\r\nimport { cx, h, ns } from './html';\r\n\r\ninterface CellPos {\r\n\tcol: number;\r\n\trow: number;\r\n}\r\n\r\ninterface Section {\r\n\tsectProps: SectionProperties;\r\n\telements: OpenXmlElement[];\r\n\tpageBreak: boolean;\r\n}\r\n\r\ndeclare const Highlight: any;\r\n\r\ntype CellVerticalMergeType = Record<number, HTMLTableCellElement>;\r\n\r\nexport class HtmlRenderer {\r\n\r\n\tclassName: string = \"docx\";\r\n\trootSelector: string;\r\n\tdocument: WordDocument;\r\n\toptions: Options;\r\n\tstyleMap: Record<string, IDomStyle> = {};\r\n\tcurrentPart: Part = null;\r\n\r\n\ttableVerticalMerges: CellVerticalMergeType[] = [];\r\n\tcurrentVerticalMerge: CellVerticalMergeType = null;\r\n\ttableCellPositions: CellPos[] = [];\r\n\tcurrentCellPosition: CellPos = null;\r\n\r\n\tfootnoteMap: Record<string, WmlFootnote> = {};\r\n\tendnoteMap: Record<string, WmlFootnote> = {};\r\n\tcurrentFootnoteIds: string[];\r\n\tcurrentEndnoteIds: string[] = [];\r\n\tusedHederFooterParts: any[] = [];\r\n\r\n\tdefaultTabSize: string;\r\n\tcurrentTabs: any[] = [];\r\n\r\n\tlegacyCompat: boolean = false;\r\n\tprivate defaultParagraphStyle: IDomStyle;\r\n\tprivate docDefaultsStyle: IDomStyle;\r\n\r\n\tcommentHighlight: any;\r\n\tcommentMap: Record<string, Range> = {};\r\n\r\n\ttasks: Promise<any>[] = [];\r\n\tpostRenderTasks: any[] = [];\r\n\th = h;\r\n\r\n\tasync render(document: WordDocument, options: Options): Promise<Node[]> {\r\n\t\tthis.document = document;\r\n\t\tthis.options = options;\r\n\t\tthis.className = options.className;\r\n\t\tthis.rootSelector = options.inWrapper ? `.${this.className}-wrapper` : ':root';\r\n\t\tthis.h = options.h ?? h;\r\n\t\tthis.styleMap = null;\r\n\t\tthis.tasks = [];\r\n\r\n\t\tif (this.options.renderComments && globalThis.Highlight) {\r\n\t\t\tthis.commentHighlight = new Highlight();\r\n\t\t}\r\n\r\n\t\tconst result: Node[] = [...this.renderDefaultStyle()];\r\n\r\n\t\tif (document.themePart) {\r\n\t\t\tresult.push(...this.renderTheme(document.themePart));\r\n\t\t}\r\n\r\n\t\tif (document.stylesPart != null) {\r\n\t\t\tthis.styleMap = this.processStyles(document.stylesPart.styles);\r\n\t\t\tresult.push(...this.renderStyles(document.stylesPart.styles));\r\n\t\t}\r\n\r\n\t\tif (document.numberingPart) {\r\n\t\t\tthis.prodessNumberings(document.numberingPart.domNumberings);\r\n\r\n\t\t\tresult.push(...await this.renderNumbering(document.numberingPart.domNumberings));\r\n\t\t\t//result.push(...await this.renderNumbering2(document.numberingPart.domNumberings));\r\n\t\t}\r\n\r\n\t\tif (document.footnotesPart) {\r\n\t\t\tthis.footnoteMap = keyBy(document.footnotesPart.notes, x => x.id);\r\n\t\t}\r\n\r\n\t\tif (document.endnotesPart) {\r\n\t\t\tthis.endnoteMap = keyBy(document.endnotesPart.notes, x => x.id);\r\n\t\t}\r\n\r\n\t\tif (document.settingsPart) {\r\n\t\t\tthis.defaultTabSize = document.settingsPart.settings?.defaultTabStop;\r\n\r\n\t\t\t// Word 2003 layout rules (compatMode 11 — typical for WPS-authored\r\n\t\t\t// documents) expand space runs even on the last line of justified\r\n\t\t\t// paragraphs; see renderParagraph for the actual application.\r\n\t\t\tconst compatMode = document.settingsPart.settings?.compatMode;\r\n\t\t\tthis.legacyCompat = compatMode != null && compatMode <= 11;\r\n\t\t}\r\n\r\n\t\tif (!options.ignoreFonts && document.fontTablePart)\r\n\t\t\tresult.push(...await this.renderFontTable(document.fontTablePart));\r\n\r\n\t\tvar sectionElements = this.renderSections(document.documentPart.body);\r\n\r\n\t\tif (this.options.inWrapper) {\r\n\t\t\tresult.push(this.renderWrapper(sectionElements));\r\n\t\t} else {\r\n\t\t\tresult.push(...sectionElements);\r\n\t\t}\r\n\r\n\t\tif (this.commentHighlight && options.renderComments) {\r\n\t\t\t(CSS as any).highlights.set(`${this.className}-comments`, this.commentHighlight);\r\n\t\t}\r\n\r\n\t\tthis.postRenderTasks.forEach(t => t());\r\n\r\n\t\tawait Promise.allSettled(this.tasks);\r\n\r\n\t\tthis.refreshTabStops();\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\trenderTheme(themePart: ThemePart) {\r\n\t\tconst variables = {};\r\n\t\tconst fontScheme = themePart.theme?.fontScheme;\r\n\r\n\t\tif (fontScheme) {\r\n\t\t\tif (fontScheme.majorFont) {\r\n\t\t\t\tvariables['--docx-majorHAnsi-font'] = fontScheme.majorFont.latinTypeface;\r\n\t\t\t\t// An empty East Asian theme typeface falls back to the Latin\r\n\t\t\t\t// one, so var() references never come out undefined (which\r\n\t\t\t\t// would invalidate the whole font-family declaration).\r\n\t\t\t\tvariables['--docx-majorEastAsia-font'] = fontScheme.majorFont.eaTypeface || fontScheme.majorFont.latinTypeface;\r\n\t\t\t}\r\n\r\n\t\t\tif (fontScheme.minorFont) {\r\n\t\t\t\tvariables['--docx-minorHAnsi-font'] = fontScheme.minorFont.latinTypeface;\r\n\t\t\t\tvariables['--docx-minorEastAsia-font'] = fontScheme.minorFont.eaTypeface || fontScheme.minorFont.latinTypeface;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst colorScheme = themePart.theme?.colorScheme;\r\n\r\n\t\tif (colorScheme) {\r\n\t\t\tfor (let [k, v] of Object.entries(colorScheme.colors)) {\r\n\t\t\t\tvariables[`--docx-${k}-color`] = `#${v}`;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst cssText = this.styleToString(`.${this.className}`, variables);\r\n\t\treturn [\r\n\t\t\tthis.h({ tagName: \"#comment\", children: [\"docxjs document theme values\"] }),\r\n\t\t\tthis.h({ tagName: \"style\", children: [cssText] })\r\n\t\t];\r\n\t}\r\n\r\n\tasync renderFontTable(fontsPart: FontTablePart) {\r\n\t\tconst result = [];\r\n\r\n\t\tfor (let f of fontsPart.fonts) {\r\n\t\t\tfor (let ref of f.embedFontRefs) {\r\n\t\t\t\ttry{\r\n\t\t\t\t\tconst fontData = await this.document.loadFont(ref.id, ref.key);\r\n\t\t\t\t\tconst cssValues = {\r\n\t\t\t\t\t\t'font-family': encloseFontFamily(f.name),\r\n\t\t\t\t\t\t'src': `url(${fontData})`\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\tif (ref.type == \"bold\" || ref.type == \"boldItalic\") {\r\n\t\t\t\t\t\tcssValues['font-weight'] = 'bold';\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (ref.type == \"italic\" || ref.type == \"boldItalic\") {\r\n\t\t\t\t\t\tcssValues['font-style'] = 'italic';\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tresult.push(this.h({ tagName: \"#comment\", children: [`docxjs ${f.name} font`] }));\r\n\t\t\t\t\tresult.push(this.h({ tagName: \"style\", children: [this.styleToString(`@font-face`, cssValues)] }));\r\n\t\t\t\t} catch(e) {\r\n\t\t\t\t\tif (this.options.debug) console.warn(`Can't load font with id ${ref.id} and key ${ref.key}`);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tprocessStyleName(className: string): string {\r\n\t\treturn className ? `${this.className}_${escapeClassName(className)}` : this.className;\r\n\t}\r\n\r\n\tprocessStyles(styles: IDomStyle[]) {\r\n\t\tconst stylesMap = keyBy(styles.filter(x => x.id != null), x => x.id);\r\n\r\n\t\tthis.defaultParagraphStyle = styles.find(s => s.isDefault && s.target == \"p\");\r\n\t\tthis.docDefaultsStyle = styles.find(s => s.id == null);\r\n\r\n\t\tfor (const style of styles.filter(x => x.basedOn)) {\r\n\t\t\tvar baseStyle = stylesMap[style.basedOn];\r\n\r\n\t\t\tif (baseStyle) {\r\n\t\t\t\tstyle.paragraphProps = mergeDeep(style.paragraphProps, baseStyle.paragraphProps);\r\n\t\t\t\tstyle.runProps = mergeDeep(style.runProps, baseStyle.runProps);\r\n\r\n\t\t\t\tfor (const baseValues of baseStyle.styles) {\r\n\t\t\t\t\tconst styleValues = style.styles.find(x => x.target == baseValues.target);\r\n\r\n\t\t\t\t\tif (styleValues) {\r\n\t\t\t\t\t\tthis.copyStyleProperties(baseValues.values, styleValues.values);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tstyle.styles.push({ ...baseValues, values: { ...baseValues.values } });\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if (this.options.debug)\r\n\t\t\t\tconsole.warn(`Can't find base style ${style.basedOn}`);\r\n\t\t}\r\n\r\n\t\tfor (let style of styles) {\r\n\t\t\tstyle.cssName = this.processStyleName(style.id);\r\n\t\t}\r\n\r\n\t\treturn stylesMap;\r\n\t}\r\n\r\n\tprodessNumberings(numberings: IDomNumbering[]) {\r\n\t\tfor (let num of numberings.filter(n => n.pStyleName)) {\r\n\t\t\tconst style = this.findStyle(num.pStyleName);\r\n\r\n\t\t\tif (style?.paragraphProps?.numbering) {\r\n\t\t\t\tstyle.paragraphProps.numbering.level = num.level;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tprocessElement(element: OpenXmlElement) {\r\n\t\tif (element.children) {\r\n\t\t\tfor (var e of element.children) {\r\n\t\t\t\te.parent = element;\r\n\r\n\t\t\t\tif (e.type == DomType.Table) {\r\n\t\t\t\t\tthis.processTable(e);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tthis.processElement(e);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tprocessTable(table: WmlTable) {\r\n\t\tfor (var r of table.children) {\r\n\t\t\tfor (var c of r.children) {\r\n\t\t\t\tc.cssStyle = this.copyStyleProperties(table.cellStyle, c.cssStyle, [\r\n\t\t\t\t\t\"border-left\", \"border-right\", \"border-top\", \"border-bottom\",\r\n\t\t\t\t\t\"padding-left\", \"padding-right\", \"padding-top\", \"padding-bottom\"\r\n\t\t\t\t]);\r\n\r\n\t\t\t\tthis.processElement(c);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tcopyStyleProperties(input: Record<string, string>, output: Record<string, string>, attrs: string[] = null): Record<string, string> {\r\n\t\tif (!input)\r\n\t\t\treturn output;\r\n\r\n\t\tif (output == null) output = {};\r\n\t\tif (attrs == null) attrs = Object.getOwnPropertyNames(input);\r\n\r\n\t\tfor (var key of attrs) {\r\n\t\t\tif (input.hasOwnProperty(key) && !output.hasOwnProperty(key))\r\n\t\t\t\toutput[key] = input[key];\r\n\t\t}\r\n\r\n\t\treturn output;\r\n\t}\r\n\r\n\tcreatePageElement(className: string, props: SectionProperties, docStyle: Record<string, any>) {\r\n\t\tconst style: Record<string, string> = { ...docStyle };\r\n\r\n\t\tif (props) {\r\n\t\t\tif (props.pageMargins) {\r\n\t\t\t\tstyle.paddingLeft = props.pageMargins.left;\r\n\t\t\t\tstyle.paddingRight = props.pageMargins.right;\r\n\t\t\t\tstyle.paddingTop = props.pageMargins.top;\r\n\t\t\t\tstyle.paddingBottom = props.pageMargins.bottom;\r\n\r\n\t\t\t\t// Exposed for absolutely-positioned content anchored to the\r\n\t\t\t\t// text area (floating tables with tblpYSpec=\"bottom\" etc.).\r\n\t\t\t\tstyle[\"--docx-pad-left\"] = props.pageMargins.left;\r\n\t\t\t\tstyle[\"--docx-pad-right\"] = props.pageMargins.right;\r\n\t\t\t\tstyle[\"--docx-pad-top\"] = props.pageMargins.top;\r\n\t\t\t\tstyle[\"--docx-pad-bottom\"] = props.pageMargins.bottom;\r\n\t\t\t}\r\n\r\n\t\t\tif (props.pageSize) {\r\n\t\t\t\tif (!this.options.ignoreWidth)\r\n\t\t\t\t\tstyle.width = props.pageSize.width;\r\n\t\t\t\tif (!this.options.ignoreHeight)\r\n\t\t\t\t\tstyle.minHeight = props.pageSize.height;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this.h({ tagName: \"section\", className, style }) as HTMLElement;\r\n\t}\r\n\r\n\tcreateSectionContent(props: SectionProperties) {\r\n\t\tconst style: Record<string, string> = {};\r\n\r\n\t\tif (props.columns && props.columns.numberOfColumns) {\r\n\t\t\tstyle.columnCount = `${props.columns.numberOfColumns}`;\r\n\t\t\tstyle.columnGap = props.columns.space;\r\n\r\n\t\t\tif (props.columns.separator) {\r\n\t\t\t\tstyle.columnRule = \"1px solid black\";\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this.h({ tagName: \"article\", style });\r\n\t}\t\r\n\r\n\trenderSections(document: DocumentElement): HTMLElement[] {\r\n\t\tconst result = [];\r\n\r\n\t\tthis.processElement(document);\r\n\t\tconst sections = this.splitBySection(document.children, document.props);\r\n\t\tconst pages = this.groupByPageBreaks(sections);\r\n\t\tlet prevProps = null;\r\n\r\n\t\tfor (let i = 0, l = pages.length; i < l; i++) {\t\t\t\r\n\t\t\tthis.currentFootnoteIds = [];\r\n\r\n\t\t\tconst section = pages[i][0];\r\n\t\t\tlet props = section.sectProps;\r\n\t\t\tconst pageElement = this.createPageElement(this.className, props, document.cssStyle);\r\n\r\n\t\t\tthis.options.renderHeaders && this.renderHeaderFooter(props.headerRefs, props,\r\n\t\t\t\tresult.length, prevProps != props, pageElement);\r\n\r\n\t\t\tfor (const sect of pages[i]) {\r\n\t\t\t\tvar contentElement = this.createSectionContent(sect.sectProps);\r\n\t\t\t\tthis.renderElements(sect.elements, contentElement);\r\n\t\t\t\tpageElement.appendChild(contentElement);\r\n\t\t\t\tprops = sect.sectProps;\r\n\t\t\t}\r\n\r\n\t\t\tif (this.options.renderFootnotes) {\r\n\t\t\t\tconst notes = this.renderNotes(this.currentFootnoteIds, this.footnoteMap);\r\n\t\t\t\tnotes && pageElement.appendChild(notes);\r\n\t\t\t}\r\n\r\n\t\t\tif (this.options.renderEndnotes && i == l - 1) {\r\n\t\t\t\tconst notes = this.renderNotes(this.currentEndnoteIds, this.endnoteMap);\r\n\t\t\t\tnotes && pageElement.appendChild(notes);\r\n\t\t\t}\r\n\r\n\t\t\tthis.options.renderFooters && this.renderHeaderFooter(props.footerRefs, props,\r\n\t\t\t\tresult.length, prevProps != props, pageElement);\r\n\r\n\t\t\tresult.push(pageElement);\r\n\t\t\tprevProps = props;\r\n\t\t}\r\n\r\n\t\tthis.resolvePageFields(result);\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\trenderHeaderFooter(refs: FooterHeaderReference[], props: SectionProperties, page: number, firstOfSection: boolean, into: HTMLElement) {\r\n\t\tif (!refs) return;\r\n\r\n\t\tvar ref = (props.titlePage && firstOfSection ? refs.find(x => x.type == \"first\") : null)\r\n\t\t\t?? (page % 2 == 1 ? refs.find(x => x.type == \"even\") : null)\r\n\t\t\t?? refs.find(x => x.type == \"default\");\r\n\r\n\t\tvar part = ref && this.document.findPartByRelId(ref.id, this.document.documentPart) as BaseHeaderFooterPart;\r\n\r\n\t\tif (part) {\r\n\t\t\tthis.currentPart = part;\r\n\t\t\tif (!this.usedHederFooterParts.includes(part.path)) {\r\n\t\t\t\tthis.processElement(part.rootElement);\r\n\t\t\t\tthis.usedHederFooterParts.push(part.path);\r\n\t\t\t}\r\n\t\t\tconst [el] = this.renderElements([part.rootElement], into) as HTMLElement[];\r\n\r\n\t\t\tif (props?.pageMargins) {\r\n\t\t\t\tif (part.rootElement.type === DomType.Header) {\r\n\t\t\t\t\tel.style.marginTop = `calc(${props.pageMargins.header} - ${props.pageMargins.top})`;\r\n\t\t\t\t\tel.style.minHeight = `calc(${props.pageMargins.top} - ${props.pageMargins.header})`;\r\n\t\t\t\t}\r\n\t\t\t\telse if (part.rootElement.type === DomType.Footer) {\r\n\t\t\t\t\tel.style.marginBottom = `calc(${props.pageMargins.footer} - ${props.pageMargins.bottom})`;\r\n\t\t\t\t\tel.style.minHeight = `calc(${props.pageMargins.bottom} - ${props.pageMargins.footer})`;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.currentPart = null;\r\n\t\t}\r\n\t}\r\n\r\n\tisPageBreakElement(elem: OpenXmlElement): boolean {\r\n\t\tif (elem.type != DomType.Break)\r\n\t\t\treturn false;\r\n\r\n\t\tif ((elem as WmlBreak).break == \"lastRenderedPageBreak\")\r\n\t\t\treturn !this.options.ignoreLastRenderedPageBreak;\r\n\r\n\t\treturn (elem as WmlBreak).break == \"page\";\r\n\t}\r\n\r\n\tisPageBreakSection(prev: SectionProperties, next: SectionProperties): boolean {\r\n\t\tif (!prev) return false;\r\n\t\tif (!next) return false;\r\n\r\n\t\treturn prev.pageSize?.orientation != next.pageSize?.orientation\r\n\t\t\t|| prev.pageSize?.width != next.pageSize?.width\r\n\t\t\t|| prev.pageSize?.height != next.pageSize?.height;\r\n\t}\r\n\r\n\tsplitBySection(elements: OpenXmlElement[], defaultProps: SectionProperties): Section[] {\r\n\t\tvar current: Section = { sectProps: null, elements: [], pageBreak: false };\r\n\t\tvar result = [current];\r\n\r\n\t\tfor (let elem of elements) {\r\n\t\t\tif (elem.type == DomType.Paragraph) {\r\n\t\t\t\tconst s = this.findStyle((elem as WmlParagraph).styleName);\r\n\r\n\t\t\t\tif (s?.paragraphProps?.pageBreakBefore) {\r\n\t\t\t\t\tcurrent.sectProps = sectProps;\r\n\t\t\t\t\tcurrent.pageBreak = true;\r\n\t\t\t\t\tcurrent = { sectProps: null, elements: [], pageBreak: false };\r\n\t\t\t\t\tresult.push(current);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tcurrent.elements.push(elem);\r\n\r\n\t\t\tif (elem.type == DomType.Paragraph) {\r\n\t\t\t\tconst p = elem as WmlParagraph;\r\n\r\n\t\t\t\tvar sectProps = p.sectionProps;\r\n\t\t\t\tvar pBreakIndex = -1;\r\n\t\t\t\tvar rBreakIndex = -1;\r\n\r\n\t\t\t\tif (this.options.breakPages && p.children) {\r\n\t\t\t\t\tpBreakIndex = p.children.findIndex(r => {\r\n\t\t\t\t\t\trBreakIndex = r.children?.findIndex(this.isPageBreakElement.bind(this)) ?? -1;\r\n\t\t\t\t\t\treturn rBreakIndex != -1;\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (sectProps || pBreakIndex != -1) {\r\n\t\t\t\t\tcurrent.sectProps = sectProps;\r\n\t\t\t\t\tcurrent.pageBreak = pBreakIndex != -1;\r\n\t\t\t\t\tcurrent = { sectProps: null, elements: [], pageBreak: false };\r\n\t\t\t\t\tresult.push(current);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (pBreakIndex != -1) {\r\n\t\t\t\t\tlet breakRun = p.children[pBreakIndex];\r\n\t\t\t\t\tlet splitRun = rBreakIndex < breakRun.children.length - 1;\r\n\r\n\t\t\t\t\tif (pBreakIndex < p.children.length - 1 || splitRun) {\r\n\t\t\t\t\t\tvar children = elem.children;\r\n\t\t\t\t\t\tvar newParagraph = { ...elem, children: children.slice(pBreakIndex) };\r\n\t\t\t\t\t\telem.children = children.slice(0, pBreakIndex);\r\n\t\t\t\t\t\tcurrent.elements.push(newParagraph);\r\n\r\n\t\t\t\t\t\tif (splitRun) {\r\n\t\t\t\t\t\t\tlet runChildren = breakRun.children;\r\n\t\t\t\t\t\t\tlet newRun = { ...breakRun, children: runChildren.slice(0, rBreakIndex) };\r\n\t\t\t\t\t\t\telem.children.push(newRun);\r\n\t\t\t\t\t\t\tbreakRun.children = runChildren.slice(rBreakIndex);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tlet currentSectProps = null;\r\n\r\n\t\tfor (let i = result.length - 1; i >= 0; i--) {\r\n\t\t\tif (result[i].sectProps == null) {\r\n\t\t\t\tresult[i].sectProps = currentSectProps ?? defaultProps;\r\n\t\t\t} else {\r\n\t\t\t\tcurrentSectProps = result[i].sectProps\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tgroupByPageBreaks(sections: Section[]): Section[][] {\r\n\t\tlet current = [];\r\n\t\tlet prev: SectionProperties;\r\n\t\tconst result: Section[][] = [current];\r\n\r\n\t\tfor (let s of sections) {\r\n\t\t\tcurrent.push(s);\r\n\r\n\t\t\tif (this.options.ignoreLastRenderedPageBreak || s.pageBreak || this.isPageBreakSection(prev, s.sectProps))\r\n\t\t\t\tresult.push(current = []);\r\n\r\n\t\t\tprev = s.sectProps;\r\n\t\t}\r\n\r\n\t\treturn result.filter(x => x.length > 0);\r\n\t}\r\n\r\n\trenderWrapper(children: HTMLElement[]) {\r\n\t\treturn this.h({ tagName: \"div\", className: `${this.className}-wrapper`, children });\r\n\t}\r\n\r\n\trenderDefaultStyle() {\r\n\t\tvar c = this.className;\r\n\t\tvar wrapperStyle = `\r\n.${c}-wrapper { background: gray; padding: 30px; padding-bottom: 0px; display: flex; flex-flow: column; align-items: center; } \r\n.${c}-wrapper>section.${c} { background: white; box-shadow: 0 0 10px rgba(0, 0, 0, 0.5); margin-bottom: 30px; }`;\r\n\t\tif (this.options.hideWrapperOnPrint) {\r\n\t\t\twrapperStyle = `@media not print { ${wrapperStyle} }`;\r\n\t\t}\r\n\t\tvar styleText = `${wrapperStyle}\r\n.${c} { color: black; hyphens: auto; text-underline-position: from-font; }\r\n.${c} { --docx-font-ascii: serif; --docx-font-ea: serif; }\r\n.${c}, .${c} * { font-family: var(--docx-font-ascii), var(--docx-font-ea); }\r\nsection.${c} { box-sizing: border-box; display: flex; flex-flow: column nowrap; position: relative; overflow: hidden; }\r\nsection.${c}>article { margin-bottom: auto; z-index: 1; }\r\nsection.${c}>footer { z-index: 1; }\r\n.${c} table { border-collapse: collapse; }\r\n.${c} table td, .${c} table th { vertical-align: top; }\r\n.${c} p { margin: 0pt; min-height: 1em; }\r\n.${c} span { white-space: pre-wrap; overflow-wrap: break-word; }\r\n.${c} a { color: inherit; text-decoration: inherit; }\r\n.${c} svg { fill: transparent; }\r\n`;\r\n\r\n\t\tif (this.options.renderComments) {\r\n\t\t\tstyleText += `\r\n.${c}-comment-ref { cursor: default; }\r\n.${c}-comment-popover { display: none; z-index: 1000; padding: 0.5rem; background: white; position: absolute; box-shadow: 0 0 0.25rem rgba(0, 0, 0, 0.25); width: 30ch; }\r\n.${c}-comment-ref:hover~.${c}-comment-popover { display: block; }\r\n.${c}-comment-author,.${c}-comment-date { font-size: 0.875rem; color: #888; }\r\n`\r\n\t\t};\r\n\r\n\t\treturn [\r\n\t\t\tthis.h({ tagName: \"#comment\", children: [\"docxjs library predefined styles\"] }),\r\n\t\t\tthis.h({ tagName: \"style\", children: [styleText] })\r\n\t\t];\r\n\t}\r\n\r\n\t// renderNumbering2(numberingPart: NumberingPartProperties, container: HTMLElement): HTMLElement {\r\n\t// let css = \"\";\r\n\t// const numberingMap = keyBy(numberingPart.abstractNumberings, x => x.id);\r\n\t// const bulletMap = keyBy(numberingPart.bulletPictures, x => x.id);\r\n\t// const topCounters = [];\r\n\r\n\t// for(let num of numberingPart.numberings) {\r\n\t// const absNum = numberingMap[num.abstractId];\r\n\r\n\t// for(let lvl of absNum.levels) {\r\n\t// const className = this.numberingClass(num.id, lvl.level);\r\n\t// let listStyleType = \"none\";\r\n\r\n\t// if(lvl.text && lvl.format == 'decimal') {\r\n\t// const counter = this.numberingCounter(num.id, lvl.level);\r\n\r\n\t// if (lvl.level > 0) {\r\n\t// css += this.styleToString(`p.${this.numberingClass(num.id, lvl.level - 1)}`, {\r\n\t// \"counter-reset\": counter\r\n\t// });\r\n\t// } else {\r\n\t// topCounters.push(counter);\r\n\t// }\r\n\r\n\t// css += this.styleToString(`p.${className}:before`, {\r\n\t// \"content\": this.levelTextToContent(lvl.text, num.id),\r\n\t// \"counter-increment\": counter\r\n\t// });\r\n\t// } else if(lvl.bulletPictureId) {\r\n\t// let pict = bulletMap[lvl.bulletPictureId];\r\n\t// let variable = `--${this.className}-${pict.referenceId}`.toLowerCase();\r\n\r\n\t// css += this.styleToString(`p.${className}:before`, {\r\n\t// \"content\": \"' '\",\r\n\t// \"display\": \"inline-block\",\r\n\t// \"background\": `var(${variable})`\r\n\t// }, pict.style);\r\n\r\n\t// this.document.loadNumberingImage(pict.referenceId).then(data => {\r\n\t// var text = `.${this.className}-wrapper { ${variable}: url(${data}) }`;\r\n\t// container.appendChild(createStyleElement(text));\r\n\t// });\r\n\t// } else {\r\n\t// listStyleType = this.numFormatToCssValue(lvl.format);\r\n\t// }\r\n\r\n\t// css += this.styleToString(`p.${className}`, {\r\n\t// \"display\": \"list-item\",\r\n\t// \"list-style-position\": \"inside\",\r\n\t// \"list-style-type\": listStyleType,\r\n\t// //TODO\r\n\t// //...num.style\r\n\t// });\r\n\t// }\r\n\t// }\r\n\r\n\t// if (topCounters.length > 0) {\r\n\t// css += this.styleToString(`.${this.className}-wrapper`, {\r\n\t// \"counter-reset\": topCounters.join(\" \")\r\n\t// });\r\n\t// }\r\n\r\n\t// return createStyleElement(css);\r\n\t// }\r\n\r\n\tasync renderNumbering(numberings: IDomNumbering[]) {\r\n\t\tvar styleText = \"\";\r\n\t\tvar resetCounters = [];\r\n\r\n\t\tfor (var num of numberings) {\r\n\t\t\tvar selector = `p.${this.numberingClass(num.id, num.level)}`;\r\n\t\t\tvar listStyleType = \"none\";\r\n\r\n\t\t\tif (num.bullet) {\r\n\t\t\t\tlet valiable = `--${this.className}-${num.bullet.src}`.toLowerCase();\r\n\r\n\t\t\t\tstyleText += this.styleToString(`${selector}:before`, {\r\n\t\t\t\t\t\"content\": \"' '\",\r\n\t\t\t\t\t\"display\": \"inline-block\",\r\n\t\t\t\t\t\"background\": `var(${valiable})`\r\n\t\t\t\t}, num.bullet.style);\r\n\r\n\t\t\t\ttry {\r\n\t\t\t\t\tconst imgData = await this.document.loadNumberingImage(num.bullet.src);\r\n\t\t\t\t\tstyleText += `${this.rootSelector} { ${valiable}: url(${imgData}) }`;\r\n\t\t\t\t} catch(e) {\r\n\t\t\t\t\tif (this.options.debug) console.warn(`Can't load numbering image with src ${num.bullet.src}`);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if (num.levelText) {\r\n\t\t\t\tlet counter = this.numberingCounter(num.id, num.level);\r\n\t\t\t\tconst counterReset = counter + \" \" + (num.start - 1);\r\n\t\t\t\tif (num.level > 0) {\r\n\t\t\t\t\tstyleText += this.styleToString(`p.${this.numberingClass(num.id, num.level - 1)}`, {\r\n\t\t\t\t\t\t\"counter-set\": counterReset\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t\t// reset all level counters with start value\r\n\t\t\t\tresetCounters.push(counterReset);\r\n\r\n\t\t\t\tstyleText += this.styleToString(`${selector}:before`, {\r\n\t\t\t\t\t\"content\": this.levelTextToContent(num.levelText, num.suff, num.id, this.numFormatToCssValue(num.format)),\r\n\t\t\t\t\t\"counter-increment\": counter,\r\n\t\t\t\t\t...num.rStyle,\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tlistStyleType = this.numFormatToCssValue(num.format);\r\n\t\t\t}\r\n\r\n\t\t\tstyleText += this.styleToString(selector, {\r\n\t\t\t\t\"display\": \"list-item\",\r\n\t\t\t\t\"list-style-position\": \"inside\",\r\n\t\t\t\t\"list-style-type\": listStyleType,\r\n\t\t\t\t...num.pStyle\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif (resetCounters.length > 0) {\r\n\t\t\tstyleText += this.styleToString(this.rootSelector, {\r\n\t\t\t\t\"counter-reset\": resetCounters.join(\" \")\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\treturn [\r\n\t\t\tthis.h({ tagName: \"#comment\", children: [\"docxjs document numbering styles\"] }),\r\n\t\t\tthis.h({ tagName: \"style\", children: [styleText] })\r\n\t\t];\r\n\t}\r\n\r\n\trenderStyles(styles: IDomStyle[]) {\r\n\t\tvar styleText = \"\";\r\n\t\tconst stylesMap = this.styleMap;\r\n\t\tconst defautStyles = keyBy(styles.filter(s => s.isDefault), s => s.target);\r\n\r\n\t\tfor (const style of styles) {\r\n\t\t\tvar subStyles = style.styles;\r\n\r\n\t\t\tif (style.linked) {\r\n\t\t\t\tvar linkedStyle = style.linked && stylesMap[style.linked];\r\n\r\n\t\t\t\tif (linkedStyle)\r\n\t\t\t\t\tsubStyles = subStyles.concat(linkedStyle.styles);\r\n\t\t\t\telse if (this.options.debug)\r\n\t\t\t\t\tconsole.warn(`Can't find linked style ${style.linked}`);\r\n\t\t\t}\r\n\r\n\t\t\tfor (const subStyle of subStyles) {\r\n\t\t\t\t//TODO temporary disable modificators until test it well\r\n\t\t\t\tvar selector = `${style.target ?? ''}.${style.cssName}`; //${subStyle.mod ?? ''}\r\n\r\n\t\t\t\tif (style.target != subStyle.target)\r\n\t\t\t\t\tselector += ` ${subStyle.target}`;\r\n\r\n\t\t\t\t// docDefaults run properties must sit at the very bottom of the\r\n\t\t\t\t// cascade. Emitted as \".docx span\" they would directly match\r\n\t\t\t\t// every span and beat fonts inherited from paragraph styles —\r\n\t\t\t\t// the reverse of Word's style hierarchy. Emitted on the root\r\n\t\t\t\t// container they are inherited, so paragraph fonts win.\r\n\t\t\t\tif (style.id == null && subStyle.target == \"span\")\r\n\t\t\t\t\tselector = `.${this.className}`;\r\n\r\n\t\t\t\tif (defautStyles[style.target] == style)\r\n\t\t\t\t\tselector = `.${this.className} ${style.target}, ` + selector;\r\n\r\n\t\t\t\tstyleText += this.styleToString(selector, subStyle.values);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn [\r\n\t\t\tthis.h({ tagName: \"#comment\", children: [\"docxjs document styles\"] }),\r\n\t\t\tthis.h({ tagName: \"style\", children: [styleText] })\r\n\t\t];\r\n\t}\r\n\r\n\trenderNotes(noteIds: string[], notesMap: Record<string, WmlBaseNote>) {\r\n\t\tvar notes = noteIds.map(id => notesMap[id]).filter(x => x);\r\n\r\n\t\tif (notes.length > 0) {\r\n\t\t\treturn this.h({ tagName: \"ol\", children: this.renderElements(notes) });\r\n\t\t}\r\n\t}\r\n\r\n\trenderElement(elem: OpenXmlElement): Node | Node[] {\r\n\t\tswitch (elem.type) {\r\n\t\t\tcase DomType.Paragraph:\r\n\t\t\t\treturn this.renderParagraph(elem as WmlParagraph);\r\n\r\n\t\t\tcase DomType.BookmarkStart:\r\n\t\t\t\treturn this.renderBookmarkStart(elem as WmlBookmarkStart);\r\n\r\n\t\t\tcase DomType.BookmarkEnd:\r\n\t\t\t\treturn null; //ignore bookmark end\r\n\r\n\t\t\tcase DomType.Run:\r\n\t\t\t\treturn this.renderRun(elem as WmlRun);\r\n\r\n\t\t\tcase DomType.Table:\r\n\t\t\t\treturn this.renderTable(elem);\r\n\r\n\t\t\tcase DomType.Row:\r\n\t\t\t\treturn this.renderTableRow(elem);\r\n\r\n\t\t\tcase DomType.Cell:\r\n\t\t\t\treturn this.renderTableCell(elem);\r\n\r\n\t\t\tcase DomType.Hyperlink:\r\n\t\t\t\treturn this.renderHyperlink(elem);\r\n\t\t\t\r\n\t\t\tcase DomType.SmartTag:\r\n\t\t\t\treturn this.renderSmartTag(elem);\r\n\r\n\t\t\tcase DomType.Drawing:\r\n\t\t\t\treturn this.renderDrawing(elem);\r\n\r\n\t\t\tcase DomType.Image:\r\n\t\t\t\treturn this.renderImage(elem as IDomImage);\r\n\r\n\t\t\tcase DomType.Text:\r\n\t\t\t\treturn this.renderText(elem as WmlText);\r\n\r\n\t\t\tcase DomType.Text:\r\n\t\t\t\treturn this.renderText(elem as WmlText);\r\n\r\n\t\t\tcase DomType.DeletedText:\r\n\t\t\t\treturn this.renderDeletedText(elem as WmlText);\r\n\t\r\n\t\t\tcase DomType.Tab:\r\n\t\t\t\treturn this.renderTab(elem);\r\n\r\n\t\t\tcase DomType.Symbol:\r\n\t\t\t\treturn this.renderSymbol(elem as WmlSymbol);\r\n\r\n\t\t\tcase DomType.Break:\r\n\t\t\t\treturn this.renderBreak(elem as WmlBreak);\r\n\r\n\t\t\tcase DomType.Footer:\r\n\t\t\t\treturn this.renderContainer(elem, \"footer\");\r\n\r\n\t\t\tcase DomType.Header:\r\n\t\t\t\treturn this.renderContainer(elem, \"header\");\r\n\r\n\t\t\tcase DomType.Footnote:\r\n\t\t\tcase DomType.Endnote:\r\n\t\t\t\treturn this.renderContainer(elem, \"li\");\r\n\r\n\t\t\tcase DomType.FootnoteReference:\r\n\t\t\t\treturn this.renderFootnoteReference(elem as WmlNoteReference);\r\n\r\n\t\t\tcase DomType.EndnoteReference:\r\n\t\t\t\treturn this.renderEndnoteReference(elem as WmlNoteReference);\r\n\r\n\t\t\tcase DomType.NoBreakHyphen:\r\n\t\t\t\treturn this.h({ tagName: \"wbr\" });\r\n\r\n\t\t\tcase DomType.VmlPicture:\r\n\t\t\t\treturn this.renderVmlPicture(elem);\r\n\r\n\t\t\tcase DomType.VmlElement:\r\n\t\t\t\treturn this.renderVmlElement(elem as VmlElement);\r\n\t\r\n\t\t\tcase DomType.MmlMath:\r\n\t\t\t\treturn this.renderContainerNS(elem, ns.mathML, \"math\", { xmlns: ns.mathML });\r\n\t\r\n\t\t\tcase DomType.MmlMathParagraph:\r\n\t\t\t\treturn this.renderContainer(elem, \"span\");\r\n\r\n\t\t\tcase DomType.MmlFraction:\r\n\t\t\t\treturn this.renderContainerNS(elem, ns.mathML, \"mfrac\");\r\n\r\n\t\t\tcase DomType.MmlBase:\r\n\t\t\t\treturn this.renderContainerNS(elem, ns.mathML, \r\n\t\t\t\t\telem.parent.type == DomType.MmlMatrixRow ? \"mtd\" : \"mrow\");\r\n\r\n\t\t\tcase DomType.MmlNumerator:\r\n\t\t\tcase DomType.MmlDenominator:\r\n\t\t\tcase DomType.MmlFunction:\r\n\t\t\tcase DomType.MmlLimit:\r\n\t\t\tcase DomType.MmlBox:\r\n\t\t\t\treturn this.renderContainerNS(elem, ns.mathML, \"mrow\");\r\n\r\n\t\t\tcase DomType.MmlGroupChar:\r\n\t\t\t\treturn this.renderMmlGroupChar(elem);\r\n\r\n\t\t\tcase DomType.MmlLimitLower:\r\n\t\t\t\treturn this.renderContainerNS(elem, ns.mathML, \"munder\");\r\n\r\n\t\t\tcase DomType.MmlMatrix:\r\n\t\t\t\treturn this.renderContainerNS(elem, ns.mathML, \"mtable\");\r\n\r\n\t\t\tcase DomType.MmlMatrixRow:\r\n\t\t\t\treturn this.renderContainerNS(elem, ns.mathML, \"mtr\");\r\n\t\r\n\t\t\tcase DomType.MmlRadical:\r\n\t\t\t\treturn this.renderMmlRadical(elem);\r\n\r\n\t\t\tcase DomType.MmlSuperscript:\r\n\t\t\t\treturn this.renderContainerNS(elem, ns.mathML, \"msup\");\r\n\r\n\t\t\tcase DomType.MmlSubscript:\r\n\t\t\t\treturn this.renderContainerNS(elem, ns.mathML, \"msub\");\r\n\r\n\t\t\tcase DomType.MmlDegree:\r\n\t\t\tcase DomType.MmlSuperArgument:\r\n\t\t\tcase DomType.MmlSubArgument:\r\n\t\t\t\treturn this.renderContainerNS(elem, ns.mathML, \"mn\");\r\n\r\n\t\t\tcase DomType.MmlFunctionName:\r\n\t\t\t\treturn this.renderContainerNS(elem, ns.mathML, \"ms\");\r\n\t\r\n\t\t\tcase DomType.MmlDelimiter:\r\n\t\t\t\treturn this.renderMmlDelimiter(elem);\r\n\r\n\t\t\tcase DomType.MmlRun:\r\n\t\t\t\treturn this.renderMmlRun(elem);\r\n\r\n\t\t\tcase DomType.MmlNary:\r\n\t\t\t\treturn this.renderMmlNary(elem);\r\n\r\n\t\t\tcase DomType.MmlPreSubSuper:\r\n\t\t\t\treturn this.renderMmlPreSubSuper(elem);\r\n\r\n\t\t\tcase DomType.MmlBar:\r\n\t\t\t\treturn this.renderMmlBar(elem);\r\n\t\r\n\t\t\tcase DomType.MmlEquationArray:\r\n\t\t\t\treturn this.renderMllList(elem);\r\n\r\n\t\t\tcase DomType.Inserted:\r\n\t\t\t\treturn this.renderInserted(elem as WmlChange);\r\n\r\n\t\t\tcase DomType.Deleted:\r\n\t\t\t\treturn this.renderDeleted(elem as WmlChange);\r\n\r\n\t\t\tcase DomType.CommentRangeStart:\r\n\t\t\t\treturn this.renderCommentRangeStart(elem);\r\n\r\n\t\t\tcase DomType.CommentRangeEnd:\r\n\t\t\t\treturn this.renderCommentRangeEnd(elem);\r\n\r\n\t\t\tcase DomType.CommentReference:\r\n\t\t\t\treturn this.renderCommentReference(elem);\r\n\r\n\t\t\tcase DomType.AltChunk:\r\n\t\t\t\treturn this.renderAltChunk(elem);\r\n\t\t}\r\n\r\n\t\treturn null;\r\n\t}\r\n\trenderElements(elems: OpenXmlElement[], into?: Node): Node[] {\r\n\t\tif (elems == null)\r\n\t\t\treturn null;\r\n\r\n\t\tvar result = elems.flatMap(e => this.renderElement(e)).filter(e => e != null);\r\n\r\n\t\tif (into)\r\n\t\t\tresult.forEach(c => into.appendChild(isString(c) ? document.createTextNode(c) : c));\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\trenderContainer<T extends keyof HTMLElementTagNameMap>(elem: OpenXmlElement, tagName: T, props?: Record<string, any>): HTMLElementTagNameMap[T] {\r\n\t\treturn this.h({ tagName, children: this.renderElements(elem.children), ...props }) as any;\r\n\t}\r\n\r\n\trenderContainerNS(elem: OpenXmlElement, ns: ns, tagName: string, props?: Record<string, any>) {\r\n\t\treturn this.h({ ns, tagName, children: this.renderElements(elem.children), ...props });\r\n\t}\r\n\r\n\t/**\r\n\t * Marks the cached-result runs of PAGE / NUMPAGES complex fields with a\r\n\t * marker class (`docx-field-page` / `docx-field-numpages`), so the actual\r\n\t * numbers can be substituted once page layout is final (see the end of\r\n\t * renderSections and pagination.ts). Field runs themselves are skipped\r\n\t * by renderRun, leaving the cached value as a plain run between the\r\n\t * separate and end markers.\r\n\t */\r\n\tprivate markPageFieldRuns(elem: WmlParagraph) {\r\n\t\tlet instruction: string = null;\r\n\t\tlet inResult = false;\r\n\r\n\t\tfor (const run of elem.children ?? []) {\r\n\t\t\tif (run.type != DomType.Run) continue;\r\n\r\n\t\t\tfor (const sub of run.children ?? []) {\r\n\t\t\t\tif (sub.type == DomType.ComplexField) {\r\n\t\t\t\t\tconst charType = (sub as WmlFieldChar).charType;\r\n\t\t\t\t\tif (charType == \"begin\") { instruction = null; inResult = false; }\r\n\t\t\t\t\telse if (charType == \"separate\") inResult = true;\r\n\t\t\t\t\telse if (charType == \"end\") { instruction = null; inResult = false; }\r\n\t\t\t\t} else if (sub.type == DomType.Instruction) {\r\n\t\t\t\t\tinstruction = (sub as WmlInstructionText).text?.trim().split(/\\s/)[0]?.toUpperCase();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (inResult && (instruction == \"PAGE\" || instruction == \"NUMPAGES\") && !(run as WmlRun).fieldRun) {\r\n\t\t\t\trun.className = cx(run.className, `${this.className}-field-${instruction.toLowerCase()}`);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Substitutes final page numbers into PAGE / NUMPAGES field markers\r\n\t * across the given page sections. Numbering is continuous from 1 —\r\n\t * per-section restarts (w:pgNumType) are not modeled yet.\r\n\t */\r\n\tprivate resolvePageFields(pages: HTMLElement[]) {\r\n\t\tconst total = `${pages.length}`;\r\n\r\n\t\tpages.forEach((page, i) => {\r\n\t\t\tfor (const el of Array.from(page.querySelectorAll(`.${this.className}-field-page`)))\r\n\t\t\t\tel.textContent = `${i + 1}`;\r\n\t\t\tfor (const el of Array.from(page.querySelectorAll(`.${this.className}-field-numpages`)))\r\n\t\t\t\tel.textContent = total;\r\n\t\t});\r\n\t}\r\n\r\n\trenderParagraph(elem: WmlParagraph) {\r\n\t\tthis.markPageFieldRuns(elem);\r\n\r\n\t\tvar result = this.toHTML(elem, ns.html, \"p\");\r\n\r\n\t\tconst style = this.findStyle(elem.styleName);\r\n\t\telem.tabs ??= style?.paragraphProps?.tabs; //TODO\r\n\r\n\t\tconst numbering = elem.numbering ?? style?.paragraphProps?.numbering;\r\n\r\n\t\tif (numbering) {\r\n\t\t\tresult.classList.add(this.numberingClass(numbering.id, numbering.level));\r\n\t\t}\r\n\r\n\t\t// Legacy Word 2003 layout (compatMode 11, typical for WPS-authored\r\n\t\t// documents) expands space runs even on the last line of a justified\r\n\t\t// paragraph — e.g. the 密级…发文字号 header line spread across the\r\n\t\t// text width by a run of spaces. CSS justify never stretches the last\r\n\t\t// line, so opt such paragraphs into text-align-last, but only when\r\n\t\t// they actually contain a deliberate interior space gap (otherwise\r\n\t\t// every justified body paragraph's last line would be stretched).\r\n\t\tif (this.legacyCompat && this.textAlignOf(elem) === \"justify\"\r\n\t\t\t&& / {2,}| {2,}| /.test(result.textContent)) {\r\n\t\t\tresult.style.setProperty(\"text-align-last\", \"justify\");\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\t/** Effective text-align of a paragraph: direct formatting, then its\r\n\t * style, then the default paragraph style, then docDefaults. */\r\n\tprivate textAlignOf(elem: WmlParagraph): string | null {\r\n\t\tif (elem.cssStyle?.[\"text-align\"])\r\n\t\t\treturn elem.cssStyle[\"text-align\"];\r\n\r\n\t\tconst from = (s: IDomStyle) =>\r\n\t\t\ts?.styles?.find(x => x.target == \"p\")?.values?.[\"text-align\"];\r\n\r\n\t\treturn from(this.findStyle(elem.styleName))\r\n\t\t\t?? from(this.defaultParagraphStyle)\r\n\t\t\t?? from(this.docDefaultsStyle)\r\n\t\t\t?? null;\r\n\t}\r\n\r\n\trenderHyperlink(elem: WmlHyperlink) {\r\n\t\tconst res = this.toH(elem, ns.html, \"a\");\r\n\t\tres.href = '';\r\n\r\n\t\tif (elem.id) {\r\n\t\t\tconst rel = this.document.documentPart.rels.find(it => it.id == elem.id && it.targetMode === \"External\");\r\n\t\t\tres.href = rel?.target ?? res.href;\r\n\t\t}\r\n\r\n\t\tif (elem.anchor) {\r\n\t\t\tres.href += `#${elem.anchor}`;\r\n\t\t}\r\n\r\n\t\treturn this.h(res);\r\n\t}\r\n\t\r\n\trenderSmartTag(elem: WmlSmartTag) {\r\n\t\treturn this.renderContainer(elem, \"span\");\r\n\t}\r\n\t\r\n\trenderCommentRangeStart(commentStart: WmlCommentRangeStart) {\r\n\t\tif (!this.options.renderComments)\r\n\t\t\treturn null;\r\n\r\n\t\tconst rng = new Range();\r\n\t\tthis.commentHighlight?.add(rng);\r\n\r\n\t\tconst result = this.h({ tagName: \"#comment\", children: [`start of comment #${commentStart.id}`] });\r\n\t\tthis.later(() => rng.setStart(result, 0));\r\n\t\tthis.commentMap[commentStart.id] = rng;\r\n\r\n\t\treturn result\r\n\t}\r\n\r\n\trenderCommentRangeEnd(commentEnd: WmlCommentRangeStart) {\r\n\t\tif (!this.options.renderComments)\r\n\t\t\treturn null;\r\n\r\n\t\tconst rng = this.commentMap[commentEnd.id];\r\n\t\tconst result = this.h({ tagName: \"#comment\", children: [`end of comment #${commentEnd.id}`] });\r\n\t\tthis.later(() => rng?.setEnd(result, 0));\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\trenderCommentReference(commentRef: WmlCommentReference) {\r\n\t\tif (!this.options.renderComments)\r\n\t\t\treturn null;\r\n\r\n\t\tvar comment = this.document.commentsPart?.commentMap[commentRef.id];\r\n\r\n\t\tif (!comment)\r\n\t\t\treturn null;\r\n\r\n\t\tconst commentRefEl = this.h({ tagName: \"span\", className: `${this.className}-comment-ref`, children: ['💬'] });\r\n\t\tconst commentsContainerEl = this.h({\r\n\t\t\ttagName: \"div\", className: `${this.className}-comment-popover`, children: [\r\n\t\t\t\tthis.h({ tagName: 'div', className: `${this.className}-comment-author`, children: [comment.author] }),\r\n\t\t\t\tthis.h({ tagName: 'div', className: `${this.className}-comment-date`, children: [new Date(comment.date).toLocaleString()] }),\r\n\t\t\t\t...this.renderElements(comment.children)\r\n\t\t\t]\r\n\t\t});\r\n\r\n\t\treturn this.h({ tagName: \"#fragment\", children: [\r\n\t\t\tthis.h({ tagName: \"#comment\", children: [`comment #${comment.id} by ${comment.author} on ${comment.date}`] }),\r\n\t\t\tcommentRefEl,\r\n\t\t\tcommentsContainerEl\r\n\t\t] });\r\n\t}\r\n\r\n\trenderAltChunk(elem: WmlAltChunk) {\r\n\t\tif (!this.options.renderAltChunks)\r\n\t\t\treturn null;\r\n\r\n\t\tvar result = this.h({ tagName: \"iframe\" }) as HTMLIFrameElement;\r\n\t\t\r\n\t\tthis.tasks.push(this.document.loadAltChunk(elem.id, this.currentPart).then(x => {\r\n\t\t\tresult.srcdoc = x;\r\n\t\t}));\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\trenderDrawing(elem: OpenXmlElement) {\r\n\t\tvar result = this.toHTML(elem, ns.html, \"div\");\r\n\r\n\t\tresult.style.display = \"inline-block\";\r\n\t\tresult.style.position = \"relative\";\r\n\t\tresult.style.textIndent = \"0px\";\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\trenderImage(elem: IDomImage) {\r\n\t\tlet result = this.toHTML(elem, ns.html, \"img\", []);\r\n\t\tlet transform = elem.cssStyle?.transform;\r\n\r\n\t\tif (elem.srcRect && elem.srcRect.some(x => x != 0)) {\r\n\t\t\tvar [left, top, right, bottom] = elem.srcRect;\r\n\t\t\ttransform = `scale(${1 / (1 - left - right)}, ${1 / (1 - top - bottom)})`;\r\n\t\t\tresult.style['clip-path'] = `rect(${(100 * top).toFixed(2)}% ${(100 * (1 - right)).toFixed(2)}% ${(100 * (1 - bottom)).toFixed(2)}% ${(100 * left).toFixed(2)}%)`;\r\n\t\t}\r\n\r\n\t\tif (elem.rotation)\r\n\t\t\ttransform = `rotate(${elem.rotation}deg) ${transform ?? ''}`;\r\n\r\n\t\tresult.style.transform = transform?.trim();\r\n\r\n\t\tif (this.document) {\r\n\t\t\tthis.tasks.push(this.document.loadDocumentImage(elem.src, this.currentPart).then(x => {\r\n\t\t\t\tresult.src = x;\r\n\t\t\t}));\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\trenderText(elem: WmlText) {\r\n\t\treturn this.h(elem.text);\r\n\t}\r\n\r\n\trenderDeletedText(elem: WmlText) {\r\n\t\treturn this.options.renderChanges ? this.renderText(elem) : null;\r\n\t}\r\n\r\n\trenderBreak(elem: WmlBreak) {\r\n\t\treturn elem.break == \"textWrapping\" ? this.h({ tagName: \"br\" }) : null;\r\n\t}\r\n\r\n\trenderInserted(elem: WmlChange): Node | Node[] {\r\n\t\tif (this.options.renderChanges)\r\n\t\t\treturn this.renderChange(elem, \"ins\");\r\n\r\n\t\treturn this.renderElements(elem.children);\r\n\t}\r\n\r\n\trenderDeleted(elem: WmlChange): Node {\r\n\t\tif (this.options.renderChanges)\r\n\t\t\treturn this.renderChange(elem, \"del\");\r\n\r\n\t\treturn null;\r\n\t}\r\n\r\n\trenderChange(elem: WmlChange, tag: string) {\r\n\t\treturn this.renderContainer(elem, tag as any, {\r\n\t\t\tdateTime: elem.date\t\t\r\n\t\t});\r\n\t}\r\n\r\n\trenderSymbol(elem: WmlSymbol) {\r\n\t\treturn this.h({ tagName: \"span\", children: [String.fromCharCode(elem.char)], style: { fontFamily: elem.font } });\r\n\t}\r\n\r\n\trenderFootnoteReference(elem: WmlNoteReference) {\r\n\t\tthis.currentFootnoteIds.push(elem.id);\r\n\t\treturn this.h({ tagName: \"sup\", children: [`${this.currentFootnoteIds.length}`] });\r\n\t}\r\n\r\n\trenderEndnoteReference(elem: WmlNoteReference) {\r\n\t\tthis.currentEndnoteIds.push(elem.id);\r\n\t\treturn this.h({ tagName: \"sup\", children: [`${this.currentEndnoteIds.length}`] });\r\n\t}\r\n\r\n\trenderTab(elem: OpenXmlElement) {\r\n\t\tvar tabSpan = this.h({ tagName: \"span\", children: [\"\\u2003\"] }) as HTMLElement;//\" \";\r\n\r\n\t\tif (this.options.experimental) {\r\n\t\t\ttabSpan.className = this.tabStopClass();\r\n\t\t\tvar stops = findParent<WmlParagraph>(elem, DomType.Paragraph)?.tabs;\r\n\t\t\tthis.currentTabs.push({ stops, span: tabSpan });\r\n\t\t}\r\n\r\n\t\treturn tabSpan;\r\n\t}\r\n\r\n\trenderBookmarkStart(elem: WmlBookmarkStart) {\r\n\t\treturn this.h({ tagName: \"span\", id: elem.name });\r\n\t}\r\n\r\n\trenderRun(elem: WmlRun) {\r\n\t\tif (elem.fieldRun)\r\n\t\t\treturn null;\r\n\r\n\t\tlet children = this.renderElements(elem.children);\r\n\r\n\t\tif (elem.verticalAlign) {\r\n\t\t\tchildren = [this.h({ tagName: elem.verticalAlign, children: this.renderElements(elem.children) })];\r\n\t\t}\r\n\r\n\t\tconst result = this.toHTML(elem, ns.html, \"span\", children);\r\n\r\n\t\tif (elem.id)\r\n\t\t\tresult.id = elem.id;\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\trenderTable(elem: WmlTable) {\r\n\t\tthis.tableCellPositions.push(this.currentCellPosition);\r\n\t\tthis.tableVerticalMerges.push(this.currentVerticalMerge);\r\n\t\tthis.currentVerticalMerge = {};\r\n\t\tthis.currentCellPosition = { col: 0, row: 0 };\r\n\r\n\t\tconst children = [];\r\n\r\n\t\tif (elem.columns)\r\n\t\t\tchildren.push(this.renderTableColumns(elem.columns));\r\n\r\n\t\tchildren.push(...this.renderElements(elem.children));\r\n\r\n\t\tthis.currentVerticalMerge = this.tableVerticalMerges.pop();\r\n\t\tthis.currentCellPosition = this.tableCellPositions.pop();\r\n\t\treturn this.toHTML(elem, ns.html, \"table\", children);\r\n\t}\r\n\r\n\trenderTableColumns(columns: WmlTableColumn[]) {\r\n\t\tconst children = columns.map(x => this.h({ tagName: \"col\", style: { width: x.width } }));\r\n\t\treturn this.h({ tagName: \"colgroup\", children });\r\n\t}\r\n\r\n\trenderTableRow(elem: WmlTableRow) {\r\n\t\tthis.currentCellPosition.col = 0;\r\n\r\n\t\tconst children = [];\r\n\r\n\t\tif (elem.gridBefore)\r\n\t\t\tchildren.push(this.renderTableCellPlaceholder(elem.gridBefore));\r\n\r\n\t\tchildren.push(...this.renderElements(elem.children));\r\n\r\n\t\tif (elem.gridAfter)\r\n\t\t\tchildren.push(this.renderTableCellPlaceholder(elem.gridAfter));\r\n\r\n\t\tthis.currentCellPosition.row++;\r\n\r\n\t\treturn this.toHTML(elem, ns.html, \"tr\", children) as HTMLTableRowElement;\r\n\t}\r\n\r\n\trenderTableCellPlaceholder(colSpan: number) {\r\n\t\treturn this.h({ tagName: \"td\", colSpan, style: { border: \"none\" } });\r\n\t}\r\n\r\n\trenderTableCell(elem: WmlTableCell) {\r\n\t\tlet result = this.toHTML(elem, ns.html, \"td\");\r\n\r\n\t\tconst key = this.currentCellPosition.col;\r\n\r\n\t\tif (elem.verticalMerge) {\r\n\t\t\tif (elem.verticalMerge == \"restart\") {\r\n\t\t\t\tthis.currentVerticalMerge[key] = result;\r\n\t\t\t\tresult.rowSpan = 1;\r\n\t\t\t} else if (this.currentVerticalMerge[key]) {\r\n\t\t\t\tthis.currentVerticalMerge[key].rowSpan += 1;\r\n\t\t\t\tresult.style.display = \"none\";\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tthis.currentVerticalMerge[key] = null;\r\n\t\t}\r\n\r\n\t\tif (elem.span)\r\n\t\t\tresult.colSpan = elem.span;\r\n\r\n\t\tthis.currentCellPosition.col += result.colSpan;\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\trenderVmlPicture(elem: OpenXmlElement) {\r\n\t\treturn this.renderContainer(elem, \"div\");\r\n\t}\r\n\r\n\trenderVmlElement(elem: VmlElement): SVGElement {\r\n\t\tvar container = this.h({ ns: ns.svg, tagName: \"svg\", style: elem.cssStyleText }) as SVGElement;\r\n\r\n\t\tconst result = this.renderVmlChildElement(elem);\r\n\r\n\t\tif (elem.imageHref?.id) {\r\n\t\t\tthis.tasks.push(this.document?.loadDocumentImage(elem.imageHref.id, this.currentPart)\r\n\t\t\t\t.then(x => result.setAttribute(\"href\", x)));\r\n\t\t}\r\n\r\n\t\tcontainer.appendChild(result);\r\n\r\n\t\trequestAnimationFrame(() => {\r\n\t\t\tconst bb = (container.firstElementChild as any).getBBox();\r\n\r\n\t\t\tcontainer.setAttribute(\"width\", `${Math.ceil(bb.x + bb.width)}`);\r\n\t\t\tcontainer.setAttribute(\"height\", `${Math.ceil(bb.y + bb.height)}`);\r\n\t\t});\r\n\r\n\t\treturn container;\r\n\t}\r\n\r\n\trenderVmlChildElement(elem: VmlElement): any {\r\n\t\tconst result = this.createSvgElement(elem.tagName as any);\r\n\t\tObject.entries(elem.attrs).forEach(([k, v]) => result.setAttribute(k, v));\r\n\r\n\t\tfor (let child of elem.children) {\r\n\t\t\tif (child.type == DomType.VmlElement) {\r\n\t\t\t\tresult.appendChild(this.renderVmlChildElement(child as VmlElement));\r\n\t\t\t} else {\r\n\t\t\t\tresult.appendChild(...asArray(this.renderElement(child as any)));\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\trenderMmlRadical(elem: OpenXmlElement) {\r\n\t\tconst base = elem.children.find(el => el.type == DomType.MmlBase);\r\n\r\n\t\tif (elem.props?.hideDegree) {\r\n\t\t\treturn this.createMathMLElement(\"msqrt\", null, this.renderElements([base]));\r\n\t\t}\r\n\r\n\t\tconst degree = elem.children.find(el => el.type == DomType.MmlDegree);\r\n\t\treturn this.createMathMLElement(\"mroot\", null, this.renderElements([base, degree]));\r\n\t}\r\n\r\n\trenderMmlDelimiter(elem: OpenXmlElement) {\t\t\r\n\t\tconst children = [];\r\n\r\n\t\tchildren.push(this.createMathMLElement(\"mo\", null, [elem.props.beginChar ?? '(']));\r\n\t\tchildren.push(...this.renderElements(elem.children));\r\n\t\tchildren.push(this.createMathMLElement(\"mo\", null, [elem.props.endChar ?? ')']));\r\n\r\n\t\treturn this.createMathMLElement(\"mrow\", null, children);\r\n\t}\r\n\r\n\trenderMmlNary(elem: OpenXmlElement) {\t\t\r\n\t\tconst children = [];\r\n\t\tconst grouped = keyBy(elem.children, x => x.type);\r\n\r\n\t\tconst sup = grouped[DomType.MmlSuperArgument];\r\n\t\tconst sub = grouped[DomType.MmlSubArgument];\r\n\t\tconst supElem = sup ? this.createMathMLElement(\"mo\", null, asArray(this.renderElement(sup))) : null;\r\n\t\tconst subElem = sub ? this.createMathMLElement(\"mo\", null, asArray(this.renderElement(sub))) : null;\r\n\r\n\t\tconst charElem = this.createMathMLElement(\"mo\", null, [elem.props?.char ?? '\\u222B']);\r\n\r\n\t\tif (supElem || subElem) {\r\n\t\t\tchildren.push(this.createMathMLElement(\"munderover\", null, [charElem, subElem, supElem]));\r\n\t\t} else if(supElem) {\r\n\t\t\tchildren.push(this.createMathMLElement(\"mover\", null, [charElem, supElem]));\r\n\t\t} else if(subElem) {\r\n\t\t\tchildren.push(this.createMathMLElement(\"munder\", null, [charElem, subElem]));\r\n\t\t} else {\r\n\t\t\tchildren.push(charElem);\r\n\t\t}\r\n\r\n\t\tchildren.push(...this.renderElements(grouped[DomType.MmlBase].children));\r\n\r\n\t\treturn this.createMathMLElement(\"mrow\", null, children);\r\n\t}\r\n\r\n\trenderMmlPreSubSuper(elem: OpenXmlElement) {\r\n\t\tconst children = [];\r\n\t\tconst grouped = keyBy(elem.children, x => x.type);\r\n\r\n\t\tconst sup = grouped[DomType.MmlSuperArgument];\r\n\t\tconst sub = grouped[DomType.MmlSubArgument];\r\n\t\tconst supElem = sup ? this.createMathMLElement(\"mo\", null, asArray(this.renderElement(sup))) : null;\r\n\t\tconst subElem = sub ? this.createMathMLElement(\"mo\", null, asArray(this.renderElement(sub))) : null;\r\n\t\tconst stubElem = this.createMathMLElement(\"mo\", null);\r\n\r\n\t\tchildren.push(this.createMathMLElement(\"msubsup\", null, [stubElem, subElem, supElem]));\r\n\t\tchildren.push(...this.renderElements(grouped[DomType.MmlBase].children));\r\n\r\n\t\treturn this.createMathMLElement(\"mrow\", null, children);\r\n\t}\r\n\r\n\trenderMmlGroupChar(elem: OpenXmlElement) {\r\n\t\tconst tagName = elem.props.verticalJustification === \"bot\" ? \"mover\" : \"munder\";\r\n\t\tconst result = this.renderContainerNS(elem, ns.mathML, tagName);\r\n\r\n\t\tif (elem.props.char) {\r\n\t\t\tresult.appendChild(this.createMathMLElement(\"mo\", null, [elem.props.char]));\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\trenderMmlBar(elem: OpenXmlElement) {\r\n\t\tconst style = {} as any;\r\n\r\n\t\tswitch(elem.props.position) {\r\n\t\t\tcase \"top\": style.textDecoration = \"overline\"; break\r\n\t\t\tcase \"bottom\": style.textDecoration = \"underline\"; break\r\n\t\t}\r\n\r\n\t\treturn this.renderContainerNS(elem, ns.mathML, \"mrow\", { style }) as MathMLElement;\r\n\t}\r\n\r\n\trenderMmlRun(elem: OpenXmlElement) {\r\n\t\treturn this.toHTML(elem, ns.mathML, \"ms\");\r\n\t}\r\n\r\n\trenderMllList(elem: OpenXmlElement) {\r\n\t\tconst children = this.renderElements(elem.children).map(x => this.createMathMLElement(\"mtr\", null, [\r\n\t\t\tthis.createMathMLElement(\"mtd\", null, [x])\r\n\t\t]));\r\n\r\n\t\treturn this.toHTML(elem, ns.mathML, \"mtable\", children);\r\n\t}\r\n\r\n\ttoH(elem: OpenXmlElement, ns: ns, tagName: string, children: Node[] = null) {\r\n\t\tconst { \"$lang\": lang, ...style } = elem.cssStyle ?? {};\r\n\t\tconst className = cx(elem.className, elem.styleName && this.processStyleName(elem.styleName));\r\n\t\treturn { ns, tagName, className, lang, style, children: children ?? this.renderElements(elem.children) } as any;\r\n\t}\r\n\r\n\ttoHTML(elem: OpenXmlElement, ns: ns, tagName: string, children: Node[] = null) {\r\n\t\treturn this.h(this.toH(elem, ns, tagName, children)) as any;\r\n\t}\r\n\r\n\tfindStyle(styleName: string) {\r\n\t\treturn styleName && this.styleMap?.[styleName];\r\n\t}\r\n\r\n\tnumberingClass(id: string, lvl: number) {\r\n\t\treturn `${this.className}-num-${id}-${lvl}`;\r\n\t}\r\n\r\n\ttabStopClass() {\r\n\t\treturn `${this.className}-tab-stop`;\r\n\t}\r\n\r\n\tstyleToString(selectors: string, values: Record<string, string>, cssText: string = null) {\r\n\t\tlet result = `${selectors} {\\r\\n`;\r\n\r\n\t\tfor (const key in values) {\r\n\t\t\tif (key.startsWith('$'))\r\n\t\t\t\tcontinue;\r\n\t\t\t\r\n\t\t\tresult += ` ${key}: ${values[key]};\\r\\n`;\r\n\t\t}\r\n\r\n\t\tif (cssText)\r\n\t\t\tresult += cssText;\r\n\r\n\t\treturn result + \"}\\r\\n\";\r\n\t}\r\n\r\n\tnumberingCounter(id: string, lvl: number) {\r\n\t\treturn `${this.className}-num-${id}-${lvl}`;\r\n\t}\r\n\r\n\tlevelTextToContent(text: string, suff: string, id: string, numformat: string) {\r\n\t\tconst suffMap = {\r\n\t\t\t\"tab\": \"\\\\9\",\r\n\t\t\t\"space\": \"\\\\a0\",\r\n\t\t};\r\n\r\n\t\tvar result = text.replace(/%\\d*/g, s => {\r\n\t\t\tlet lvl = parseInt(s.substring(1), 10) - 1;\r\n\t\t\treturn `\"counter(${this.numberingCounter(id, lvl)}, ${numformat})\"`;\r\n\t\t});\r\n\r\n\t\treturn `\"${result}${suffMap[suff] ?? \"\"}\"`;\r\n\t}\r\n\r\n\tnumFormatToCssValue(format: string) {\r\n\t\tvar mapping = {\r\n\t\t\tnone: \"none\",\r\n\t\t\tbullet: \"disc\",\r\n\t\t\tdecimal: \"decimal\",\r\n\t\t\tlowerLetter: \"lower-alpha\",\r\n\t\t\tupperLetter: \"upper-alpha\",\r\n\t\t\tlowerRoman: \"lower-roman\",\r\n\t\t\tupperRoman: \"upper-roman\",\r\n\t\t\tdecimalZero: \"decimal-leading-zero\", // 01,02,03,...\r\n\t\t\t// ordinal: \"\", // 1st, 2nd, 3rd,...\r\n\t\t\t// ordinalText: \"\", //First, Second, Third, ...\r\n\t\t\t// cardinalText: \"\", //One,Two Three,...\r\n\t\t\t// numberInDash: \"\", //-1-,-2-,-3-, ...\r\n\t\t\t// hex: \"upper-hexadecimal\",\r\n\t\t\taiueo: \"katakana\",\r\n\t\t\taiueoFullWidth: \"katakana\",\r\n\t\t\tchineseCounting: \"simp-chinese-informal\",\r\n\t\t\tchineseCountingThousand: \"simp-chinese-informal\",\r\n\t\t\tchineseLegalSimplified: \"simp-chinese-formal\", // 中文大写\r\n\t\t\tchosung: \"hangul-consonant\",\r\n\t\t\tideographDigital: \"cjk-ideographic\",\r\n\t\t\tideographTraditional: \"cjk-heavenly-stem\", // 十天干\r\n\t\t\tideographLegalTraditional: \"trad-chinese-formal\",\r\n\t\t\tideographZodiac: \"cjk-earthly-branch\", // 十二地支\r\n\t\t\tiroha: \"katakana-iroha\",\r\n\t\t\tirohaFullWidth: \"katakana-iroha\",\r\n\t\t\tjapaneseCounting: \"japanese-informal\",\r\n\t\t\tjapaneseDigitalTenThousand: \"cjk-decimal\",\r\n\t\t\tjapaneseLegal: \"japanese-formal\",\r\n\t\t\tthaiNumbers: \"thai\",\r\n\t\t\tkoreanCounting: \"korean-hangul-formal\",\r\n\t\t\tkoreanDigital: \"korean-hangul-formal\",\r\n\t\t\tkoreanDigital2: \"korean-hanja-informal\",\r\n\t\t\thebrew1: \"hebrew\",\r\n\t\t\thebrew2: \"hebrew\",\r\n\t\t\thindiNumbers: \"devanagari\",\r\n\t\t\tganada: \"hangul\",\r\n\t\t\ttaiwaneseCounting: \"cjk-ideographic\",\r\n\t\t\ttaiwaneseCountingThousand: \"cjk-ideographic\",\r\n\t\t\ttaiwaneseDigital: \"cjk-decimal\",\r\n\t\t};\r\n\r\n\t\treturn mapping[format] ?? format;\r\n\t}\r\n\r\n\trefreshTabStops() {\r\n\t\tif (!this.options.experimental)\r\n\t\t\treturn;\r\n\r\n\t\tsetTimeout(() => {\r\n\t\t\tconst pixelToPoint = computePixelToPoint();\r\n\r\n\t\t\tfor (let tab of this.currentTabs) {\r\n\t\t\t\tupdateTabStop(tab.span, tab.stops, this.defaultTabSize, pixelToPoint);\r\n\t\t\t}\r\n\t\t}, 500);\r\n\t}\r\n\r\n\tcreateElementNS(ns: any, tagName: string, props?: Partial<Record<any, any>>, children?: any[]) {\r\n\t\treturn this.h({ ns, tagName, children, ...props }) as any;\r\n\t}\r\n\r\n\tcreateElement<T extends keyof HTMLElementTagNameMap>(tagName: T, props?: Partial<Record<keyof HTMLElementTagNameMap[T], any>>, children?: any[]): HTMLElementTagNameMap[T] {\r\n\t\treturn this.createElementNS(ns.html, tagName, props, children);\r\n\t}\r\n\r\n\tcreateMathMLElement<T extends keyof MathMLElementTagNameMap>(tagName: T, props?: Partial<Record<keyof MathMLElementTagNameMap[T], any>>, children?: any[]): MathMLElementTagNameMap[T] {\r\n\t\treturn this.createElementNS(ns.mathML, tagName, props, children);\r\n\t}\r\n\r\n\tcreateSvgElement<T extends keyof SVGElementTagNameMap>(tagName: T, props?: Partial<Record<keyof SVGElementTagNameMap[T], any>>, children?: any[]): SVGElementTagNameMap[T] {\r\n\t\treturn this.createElementNS(ns.svg, tagName, props, children);\r\n\t}\r\n\r\n\tlater(func: Function) { \r\n\t\tthis.postRenderTasks.push(func);\r\n\t}\r\n}\r\n\r\nfunction findParent<T extends OpenXmlElement>(elem: OpenXmlElement, type: DomType): T {\r\n\tvar parent = elem.parent;\r\n\r\n\twhile (parent != null && parent.type != type)\r\n\t\tparent = parent.parent;\r\n\r\n\treturn <T>parent;\r\n}\r\n\r\n","/*\n * Reflow pagination.\n *\n * The renderer only splits pages at explicit breaks (breakPages option);\n * content that Word would flow across multiple physical pages ends up in a\n * single overgrown <section>. This module is a post-render DOM pass (opt-in\n * via the `paginate` option) that re-packs each section's article children\n * into page-sized sections, splitting tables by row and paragraphs by line.\n *\n * It runs after the rendered nodes are attached to a container, so all\n * measurements (offsetHeight, Range rects) reflect real layout. Callers must\n * ensure webfonts are settled first (document.fonts.ready), otherwise split\n * points are computed against fallback-font metrics.\n */\n\nconst FIT_EPSILON = 1; // px of slack for sub-pixel rounding\nconst MAX_PAGES_PER_SECTION = 1000; // runaway-loop backstop\n\nexport function paginateWrapper(container: HTMLElement, className: string): number {\n\tconst sections = Array.from(container.querySelectorAll(`section.${className}`)) as HTMLElement[];\n\tlet pageCount = 0;\n\n\tfor (const section of sections) {\n\t\tpageCount += paginateSection(section, className);\n\t}\n\n\tif (pageCount > 0) {\n\t\t// Continuation fragments produced by splitting a paragraph must not\n\t\t// repeat its first-line indent or its list number.\n\t\tconst style = document.createElement(\"style\");\n\t\tstyle.textContent =\n\t\t\t`.${className} .${className}-continuation { text-indent: 0 !important; }` +\n\t\t\t`.${className} .${className}-continuation::before { content: none !important; }`;\n\t\tcontainer.prepend(style);\n\n\t\t// Pages created by splitting share the original page's header/footer,\n\t\t// whose PAGE/NUMPAGES fields were resolved before the split — renumber\n\t\t// across the final page list.\n\t\tconst pages = container.querySelectorAll(`section.${className}`);\n\t\tconst total = `${pages.length}`;\n\t\tpages.forEach((page, i) => {\n\t\t\tfor (const el of Array.from(page.querySelectorAll(`.${className}-field-page`)))\n\t\t\t\tel.textContent = `${i + 1}`;\n\t\t\tfor (const el of Array.from(page.querySelectorAll(`.${className}-field-numpages`)))\n\t\t\t\tel.textContent = total;\n\t\t});\n\t}\n\n\treturn pageCount;\n}\n\nfunction paginateSection(section: HTMLElement, className: string): number {\n\tconst article = section.querySelector(\":scope > article\") as HTMLElement;\n\tif (!article) return 0;\n\n\tconst sectionStyle = getComputedStyle(section);\n\tconst pageHeight = parseFloat(sectionStyle.minHeight);\n\tif (!pageHeight || Number.isNaN(pageHeight)) return 0; // no fixed page height to paginate against\n\n\tconst columns = getComputedStyle(article).columnCount;\n\tif (columns !== \"auto\" && columns !== \"1\") return 0; // multi-column layouts can't be split reliably\n\n\tconst contentLimit = pageHeight - parseFloat(sectionStyle.paddingTop) - parseFloat(sectionStyle.paddingBottom);\n\tif (!(contentLimit > 0) || article.scrollHeight <= contentLimit + FIT_EPSILON) return 0;\n\n\tconst header = section.querySelector(\":scope > header\");\n\tconst footer = section.querySelector(\":scope > footer\");\n\t// Footnote/endnote lists belong to the section; keep them on the last page.\n\tconst notes = Array.from(section.querySelectorAll(\":scope > ol\"));\n\n\tconst pages: HTMLElement[] = [section]; // the original section becomes page 1\n\tlet currentArticle = article;\n\tlet lastPage = section;\n\n\tfunction newPage(): void {\n\t\tconst shell = section.cloneNode(false) as HTMLElement;\n\t\tif (header) shell.appendChild(header.cloneNode(true));\n\t\tconst pageArticle = article.cloneNode(false) as HTMLElement;\n\t\tshell.appendChild(pageArticle);\n\t\tif (footer) shell.appendChild(footer.cloneNode(true));\n\t\t// Attach immediately: packing the page requires live layout\n\t\t// (scrollHeight/Range rects are all zero on detached nodes).\n\t\tlastPage.after(shell);\n\t\tlastPage = shell;\n\t\tpages.push(shell);\n\t\tcurrentArticle = pageArticle;\n\t}\n\n\tconst fits = () => currentArticle.scrollHeight <= contentLimit + FIT_EPSILON;\n\tconst bottomLimit = () => currentArticle.getBoundingClientRect().top + contentLimit;\n\n\tconst blocks = Array.from(article.children) as HTMLElement[];\n\tfor (const b of blocks) b.remove();\n\n\tfor (let i = 0; i < blocks.length && pages.length < MAX_PAGES_PER_SECTION; i++) {\n\t\tconst block = blocks[i];\n\t\tcurrentArticle.appendChild(block);\n\t\tif (fits()) continue;\n\n\t\t// Overflow: try to split the block at the page boundary.\n\t\tconst tail = splitBlock(block, bottomLimit(), className);\n\t\tif (tail === \"allfit\") continue; // benign box overshoot — keep it here\n\t\tif (tail) {\n\t\t\tblocks.splice(i + 1, 0, tail);\n\t\t\tnewPage();\n\t\t\tcontinue;\n\t\t}\n\t\tif (tail) {\n\t\t\tblocks.splice(i + 1, 0, tail);\n\t\t\tnewPage();\n\t\t\tcontinue;\n\t\t}\n\n\t\tblock.remove();\n\t\tif (currentArticle.childElementCount === 0) {\n\t\t\t// A single block taller than a whole page: place it and let it\n\t\t\t// overflow rather than loop forever.\n\t\t\tcurrentArticle.appendChild(block);\n\t\t\tcontinue;\n\t\t}\n\n\t\tnewPage();\n\t\ti--; // retry the block on a fresh page\n\t}\n\n\t// Attach section-level notes to the last page (before its footer).\n\tif (notes.length > 0 && pages.length > 1) {\n\t\tconst lastFooter = lastPage.querySelector(\":scope > footer\");\n\t\tfor (const ol of notes) lastPage.insertBefore(ol, lastFooter);\n\t}\n\n\tif (pages.length <= 1) return 0;\n\n\treturn pages.length;\n}\n\n/**\n * Splits `block` (already appended to a page and known to overflow) so its\n * head fits above `bottomLimit` (viewport coordinate). Returns the detached\n * tail fragment, \"allfit\" when the block's content doesn't actually\n * overflow (keep it on the current page), or null when the block can't\n * usefully be split here.\n */\nfunction splitBlock(block: HTMLElement, bottomLimit: number, className: string): HTMLElement | \"allfit\" | null {\n\tif (block.tagName === \"TABLE\") {\n\t\treturn splitTable(block as HTMLTableElement, bottomLimit);\n\t}\n\n\tconst pos = findTextSplitOffset(block, bottomLimit);\n\tif (pos === \"allfit\") return \"allfit\";\n\tif (pos === null) return null;\n\n\tconst tail = splitAt(block, pos.node, pos.offset);\n\ttail.classList.add(`${className}-continuation`);\n\treturn tail;\n}\n\nfunction splitTable(table: HTMLTableElement, bottomLimit: number): HTMLElement | null {\n\tconst bodyRows: HTMLTableRowElement[] = [];\n\tfor (const tbody of Array.from(table.tBodies)) {\n\t\tbodyRows.push(...Array.from(tbody.rows));\n\t}\n\tif (bodyRows.length < 2) return null;\n\n\tconst splitIndex = bodyRows.findIndex(r => r.getBoundingClientRect().bottom > bottomLimit);\n\tif (splitIndex <= 0) return null; // no row fits in the remaining space\n\n\tconst tail = table.cloneNode(false) as HTMLTableElement;\n\t// Keep column widths and header rows on the continuation table.\n\tconst colgroup = table.querySelector(\":scope > colgroup\");\n\tif (colgroup) tail.appendChild(colgroup.cloneNode(true));\n\tif (table.tHead) tail.appendChild(table.tHead.cloneNode(true));\n\n\tfor (let i = splitIndex; i < bodyRows.length; i++) {\n\t\ttail.appendChild(bodyRows[i]);\n\t}\n\n\treturn tail as unknown as HTMLElement;\n}\n\n/**\n * Finds the latest text position inside `el` that still renders above\n * `bottomLimit`, by walking text nodes in order and binary-searching each\n * one with Range rects. Returns:\n * - { node, offset } — split here;\n * - \"allfit\" — every text node fits; the overflow comes from the block's\n * own box (min-height overshoot), not its content, so it should stay;\n * - null — even the first character overflows (or there is no text).\n */\nfunction findTextSplitOffset(el: HTMLElement, bottomLimit: number): { node: Text, offset: number } | \"allfit\" | null {\n\tconst doc = el.ownerDocument;\n\tconst walker = doc.createTreeWalker(el, NodeFilter.SHOW_TEXT);\n\tconst range = doc.createRange();\n\tlet hasFittingContent = false;\n\tlet sawText = false;\n\n\tfor (let node = walker.nextNode() as Text; node; node = walker.nextNode() as Text) {\n\t\tif (node.length === 0) continue;\n\t\tsawText = true;\n\n\t\tlet lo = 0, hi = node.length, fit = 0;\n\t\twhile (lo <= hi) {\n\t\t\tconst mid = (lo + hi) >> 1;\n\t\t\trange.setStart(node, 0);\n\t\t\trange.setEnd(node, mid);\n\t\t\tconst rects = range.getClientRects();\n\t\t\tconst last = rects[rects.length - 1];\n\t\t\tif (last && last.bottom <= bottomLimit) {\n\t\t\t\tfit = mid;\n\t\t\t\tlo = mid + 1;\n\t\t\t} else {\n\t\t\t\thi = mid - 1;\n\t\t\t}\n\t\t}\n\n\t\tif (fit === 0) {\n\t\t\t// Nothing of this node fits. Splitting before it only makes sense\n\t\t\t// when earlier content already filled the page.\n\t\t\treturn hasFittingContent ? { node, offset: 0 } : null;\n\t\t}\n\n\t\tif (fit < node.length) {\n\t\t\t// Prefer breaking after whitespace so Latin words aren't cut in\n\t\t\t// half (CJK text may break anywhere, so this is best-effort).\n\t\t\tlet back = fit;\n\t\t\tconst floor = Math.max(0, fit - 30);\n\t\t\twhile (back > floor && !/\\s/.test(node.data[back - 1])) back--;\n\t\t\treturn { node, offset: back > floor ? back : fit };\n\t\t}\n\n\t\thasFittingContent = true;\n\t}\n\n\treturn sawText ? \"allfit\" : null;\n}\n\n/**\n * Splits `el` at (textNode, offset): `el` keeps everything before the point,\n * and the returned element (a shallow clone of `el` with cloned inline\n * ancestors) gets everything from the point on.\n */\nfunction splitAt(el: HTMLElement, textNode: Text, offset: number): HTMLElement {\n\tconst tail = el.cloneNode(false) as HTMLElement;\n\tconst secondHalf = textNode.splitText(offset);\n\tmoveTail(secondHalf, el, tail);\n\treturn tail;\n}\n\n/** Moves the split point's following content into a parallel clone\n * hierarchy under `tailRoot`: `node` and its following siblings go into a\n * clone of their parent, and each ancestor up to `root` contributes a clone\n * plus its following siblings. The ORIGINAL ancestors stay in the head —\n * moving them would rip the head's split-span text out (and reverse the\n * order of the two text halves in the tail). */\nfunction moveTail(node: Node, root: HTMLElement, tailRoot: HTMLElement): void {\n\tlet child = node;\n\tlet container = tailRoot;\n\n\twhile (child.parentNode && child.parentNode !== root) {\n\t\tconst parent = child.parentNode as HTMLElement;\n\t\tconst parentClone = parent.cloneNode(false) as HTMLElement;\n\t\tcontainer.appendChild(parentClone);\n\t\tparentClone.appendChild(child);\n\t\twhile (child.nextSibling) parentClone.appendChild(child.nextSibling);\n\t\tchild = parent;\n\t\tcontainer = parentClone;\n\t}\n\n\t// `child` is now a direct child of root. If the loop never ran, `node`\n\t// itself was that direct child and still needs moving; otherwise its\n\t// clone is already in place and only following siblings move over.\n\tif (child === node) tailRoot.appendChild(child);\n\twhile (child.nextSibling) tailRoot.appendChild(child.nextSibling);\n}\n","import { WordDocument } from './word-document';\r\nimport { DocumentParser } from './document-parser';\r\nimport { HtmlRenderer } from './html-renderer';\r\nimport { h } from './html';\r\nimport { paginateWrapper } from './pagination';\r\n\r\nexport interface FontDefinition {\r\n /** font-family name as used in the document, e.g. \"SimSun\" / \"宋体\" */\r\n name: string;\r\n /** stylesheet src value, e.g. 'url(fonts/simsun.woff2) format(\"woff2\")' */\r\n src: string;\r\n weight?: string | number;\r\n style?: string;\r\n}\r\n\r\nexport interface Options {\r\n inWrapper: boolean;\r\n hideWrapperOnPrint: boolean;\r\n ignoreWidth: boolean;\r\n ignoreHeight: boolean;\r\n ignoreFonts: boolean;\r\n breakPages: boolean;\r\n /** re-flow content into page-sized sections after render (needs DOM layout) */\r\n paginate: boolean;\r\n /** external webfonts injected as @font-face before rendering */\r\n fonts?: FontDefinition[];\r\n debug: boolean;\r\n experimental: boolean;\r\n className: string;\r\n trimXmlDeclaration: boolean;\r\n renderHeaders: boolean;\r\n renderFooters: boolean;\r\n renderFootnotes: boolean;\r\n\trenderEndnotes: boolean;\r\n ignoreLastRenderedPageBreak: boolean;\r\n\tuseBase64URL: boolean;\r\n\trenderChanges: boolean;\r\n renderComments: boolean;\r\n renderAltChunks: boolean;\r\n h: typeof h;\r\n}\r\n\r\nexport const defaultOptions: Options = {\r\n ignoreHeight: false,\r\n ignoreWidth: false,\r\n ignoreFonts: false,\r\n breakPages: true,\r\n paginate: false,\r\n debug: false,\r\n experimental: false,\r\n className: \"docx\",\r\n inWrapper: true,\r\n hideWrapperOnPrint: false,\r\n trimXmlDeclaration: true,\r\n ignoreLastRenderedPageBreak: true,\r\n renderHeaders: true,\r\n renderFooters: true,\r\n renderFootnotes: true,\r\n\trenderEndnotes: true,\r\n\tuseBase64URL: false,\r\n\trenderChanges: false,\r\n renderComments: false,\r\n renderAltChunks: true,\r\n h: h\r\n};\r\n\r\nexport function parseAsync(data: Blob | any, userOptions?: Partial<Options>): Promise<any> {\r\n const ops = { ...defaultOptions, ...userOptions };\r\n return WordDocument.load(data, new DocumentParser(ops), ops);\r\n}\r\n\r\nexport async function renderDocument(document: any, userOptions?: Partial<Options>): Promise<any> {\r\n const ops = { ...defaultOptions, ...userOptions };\r\n const renderer = new HtmlRenderer();\r\n return await renderer.render(document, ops);\r\n}\r\n\r\nfunction renderFontFaces(fonts: FontDefinition[]): HTMLElement {\r\n const css = fonts.map(f => {\r\n const family = f.name.replace(/[\"\\\\\\r\\n]/g, '');\r\n const props = [`font-family: \"${family}\"`, `src: ${f.src}`];\r\n if (f.weight != null) props.push(`font-weight: ${f.weight}`);\r\n if (f.style != null) props.push(`font-style: ${f.style}`);\r\n return `@font-face { ${props.join('; ')}; }`;\r\n }).join('\\n');\r\n\r\n const el = document.createElement(\"style\");\r\n el.textContent = css;\r\n return el;\r\n}\r\n\r\nexport async function renderAsync(data: Blob | any, bodyContainer: HTMLElement, styleContainer?: HTMLElement, userOptions?: Partial<Options>): Promise<any> {\r\n\tconst doc = await parseAsync(data, userOptions);\r\n\tconst nodes = await renderDocument(doc, userOptions);\r\n const ops = { ...defaultOptions, ...userOptions };\r\n\r\n styleContainer ??= bodyContainer;\r\n styleContainer.innerHTML = \"\";\r\n bodyContainer.innerHTML = \"\";\r\n\r\n if (ops.fonts?.length) {\r\n nodes.unshift(renderFontFaces(ops.fonts));\r\n }\r\n\r\n for (let n of nodes) {\r\n const c = n.nodeName === \"STYLE\" ? styleContainer : bodyContainer;\r\n c.appendChild(n);\r\n }\r\n\r\n // Make sure webfonts are actually loaded before the content is measured\r\n // (pagination) or painted, otherwise fallback-font metrics leak in.\r\n const fontSet = typeof document !== \"undefined\" ? (document as any).fonts : null;\r\n if (ops.fonts?.length && fontSet?.load) {\r\n try {\r\n await Promise.all(ops.fonts.map(f =>\r\n fontSet.load(`${f.style ?? 'normal'} ${f.weight ?? 'normal'} 12px \"${f.name.replace(/[\"\\\\\\r\\n]/g, '')}\"`)));\r\n } catch { /* a missing webfont must not break rendering */ }\r\n }\r\n\r\n if (ops.paginate) {\r\n if (fontSet?.ready) {\r\n try { await fontSet.ready; } catch { /* ignore */ }\r\n }\r\n paginateWrapper(bodyContainer, ops.className);\r\n }\r\n\r\n return doc;\r\n}"],"mappings":"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"}
|