@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.min.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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"}
|