@extend-ai/react-docx 0.5.0 → 0.6.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../doc-model/src/index.ts","../../ooxml-core/src/index.ts"],"sourcesContent":["import type { OoxmlPackage } from \"@extend-ai/react-docx-ooxml-core\";\n\nexport type ParagraphAlignment = \"left\" | \"center\" | \"right\" | \"justify\";\nexport type HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;\n\nexport interface TextRunBorderStyle {\n type: string;\n color?: string;\n sizeEighthPt?: number;\n spacePt?: number;\n frame?: boolean;\n shadow?: boolean;\n}\n\nexport interface TextStyle {\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n strike?: boolean;\n color?: string;\n highlight?: string;\n backgroundColor?: string;\n fontSizePt?: number;\n fontFamily?: string;\n characterSpacingTwips?: number;\n verticalAlign?: \"superscript\" | \"subscript\";\n runBorder?: TextRunBorderStyle;\n}\n\nexport interface TextRunNode {\n type: \"text\";\n text: string;\n style?: TextStyle;\n link?: string;\n noteReference?: {\n kind: \"footnote\" | \"endnote\";\n id: number;\n };\n}\n\nexport interface ImageRunNode {\n type: \"image\";\n src?: string;\n alt?: string;\n widthPx?: number;\n heightPx?: number;\n partName?: string;\n contentType?: string;\n data?: Uint8Array;\n sourceXml?: string;\n crop?: {\n leftFraction?: number;\n topFraction?: number;\n rightFraction?: number;\n bottomFraction?: number;\n };\n cssFilter?: string;\n cssOpacity?: number;\n floating?: {\n xPx?: number;\n yPx?: number;\n horizontalAlign?: \"left\" | \"center\" | \"right\" | \"inside\" | \"outside\";\n verticalAlign?: \"top\" | \"center\" | \"bottom\" | \"inside\" | \"outside\";\n horizontalRelativeTo?: string;\n verticalRelativeTo?: string;\n distLPx?: number;\n distRPx?: number;\n distTPx?: number;\n distBPx?: number;\n wrapType?: \"none\" | \"square\" | \"tight\" | \"through\" | \"topAndBottom\";\n wrapText?: \"bothSides\" | \"left\" | \"right\" | \"largest\";\n behindDocument?: boolean;\n zIndex?: number;\n };\n syntheticTextBox?: boolean;\n textBoxText?: string;\n}\n\nexport type FormFieldType = \"checkbox\" | \"text\" | \"date\" | \"dropdown\";\n\nexport type FormFieldSourceKind = \"sdt\" | \"legacy\";\n\nexport interface FormFieldOption {\n displayText: string;\n value?: string;\n}\n\nexport interface FormFieldTextWidgetSettings {\n inputType?:\n | \"regular\"\n | \"number\"\n | \"date\"\n | \"currentDate\"\n | \"currentTime\"\n | \"calculated\"\n | (string & {});\n defaultText?: string;\n maxLength?: number;\n textFormat?: string;\n}\n\nexport interface FormFieldCheckboxWidgetSettings {\n defaultChecked?: boolean;\n sizeMode?: \"auto\" | \"exact\";\n sizePt?: number;\n}\n\nexport interface FormFieldDropdownWidgetSettings {\n defaultValue?: string;\n}\n\nexport interface FormFieldWidgetSettings {\n name?: string;\n enabled?: boolean;\n calcOnExit?: boolean;\n text?: FormFieldTextWidgetSettings;\n checkbox?: FormFieldCheckboxWidgetSettings;\n dropdown?: FormFieldDropdownWidgetSettings;\n}\n\nexport interface FormFieldRunNode {\n type: \"form-field\";\n fieldType: FormFieldType;\n sourceKind?: FormFieldSourceKind;\n id?: number;\n tag?: string;\n title?: string;\n placeholder?: string;\n checked?: boolean;\n value?: string;\n options?: FormFieldOption[];\n widget?: FormFieldWidgetSettings;\n checkedSymbol?: string;\n uncheckedSymbol?: string;\n style?: TextStyle;\n link?: string;\n sourceXml?: string;\n}\n\nexport type ParagraphChildNode = TextRunNode | ImageRunNode | FormFieldRunNode;\n\nexport interface ParagraphNumbering {\n numId: number;\n ilvl: number;\n}\n\nexport interface ParagraphSpacing {\n beforeTwips?: number;\n afterTwips?: number;\n lineTwips?: number;\n lineRule?: \"auto\" | \"exact\" | \"atLeast\";\n}\n\nexport interface ParagraphIndent {\n leftTwips?: number;\n rightTwips?: number;\n firstLineTwips?: number;\n hangingTwips?: number;\n}\n\nexport interface ParagraphBorderStyle {\n type: string;\n color?: string;\n sizeEighthPt?: number;\n spacePt?: number;\n frame?: boolean;\n shadow?: boolean;\n}\n\nexport interface ParagraphBorderSet {\n top?: ParagraphBorderStyle;\n right?: ParagraphBorderStyle;\n bottom?: ParagraphBorderStyle;\n left?: ParagraphBorderStyle;\n between?: ParagraphBorderStyle;\n bar?: ParagraphBorderStyle;\n}\n\nexport interface ParagraphStyle {\n align?: ParagraphAlignment;\n headingLevel?: HeadingLevel;\n styleId?: string;\n styleName?: string;\n numbering?: ParagraphNumbering;\n spacing?: ParagraphSpacing;\n indent?: ParagraphIndent;\n backgroundColor?: string;\n borders?: ParagraphBorderSet;\n tabStops?: ParagraphTabStop[];\n contextualSpacing?: boolean;\n keepNext?: boolean;\n keepLines?: boolean;\n widowControl?: boolean;\n pageBreakBefore?: boolean;\n dropCap?: {\n type: \"drop\" | \"margin\";\n lines?: number;\n wrap?: string;\n horizontalAnchor?: string;\n verticalAnchor?: string;\n xTwips?: number;\n yTwips?: number;\n horizontalSpaceTwips?: number;\n verticalSpaceTwips?: number;\n };\n}\n\nexport interface ParagraphNode {\n type: \"paragraph\";\n children: ParagraphChildNode[];\n style?: ParagraphStyle;\n paragraphMarkDeleted?: boolean;\n sourceXml?: string;\n}\n\nexport interface TableBoxSpacing {\n topTwips?: number;\n rightTwips?: number;\n bottomTwips?: number;\n leftTwips?: number;\n}\n\nexport interface TableBorderStyle {\n type: string;\n color?: string;\n sizeEighthPt?: number;\n}\n\nexport interface TableBorderSet {\n top?: TableBorderStyle;\n right?: TableBorderStyle;\n bottom?: TableBorderStyle;\n left?: TableBorderStyle;\n insideH?: TableBorderStyle;\n insideV?: TableBorderStyle;\n tl2br?: TableBorderStyle;\n tr2bl?: TableBorderStyle;\n}\n\nexport interface TableCellStyle {\n backgroundColor?: string;\n gridSpan?: number;\n rowSpan?: number;\n vMergeContinuation?: boolean;\n widthTwips?: number;\n marginTwips?: TableBoxSpacing;\n verticalAlign?: \"top\" | \"center\" | \"bottom\";\n borders?: TableBorderSet;\n}\n\nexport type TableCellContentNode = ParagraphNode | TableNode;\n\nfunction isParagraphCellContent(\n node: TableCellContentNode\n): node is ParagraphNode {\n return node.type === \"paragraph\";\n}\n\nfunction isTableCellContentTable(\n node: TableCellContentNode\n): node is TableNode {\n return node.type === \"table\";\n}\n\nfunction cellParagraphsFromContent(\n nodes: TableCellContentNode[]\n): ParagraphNode[] {\n const paragraphs: ParagraphNode[] = [];\n\n const walk = (items: TableCellContentNode[]): void => {\n for (const item of items) {\n if (isParagraphCellContent(item)) {\n paragraphs.push(item);\n continue;\n }\n\n if (isTableCellContentTable(item)) {\n for (const row of item.rows) {\n for (const cell of row.cells) {\n walk(cell.nodes);\n }\n }\n }\n }\n };\n\n walk(nodes);\n return paragraphs;\n}\n\nfunction cloneTableCellContent(\n nodes: TableCellContentNode[]\n): TableCellContentNode[] {\n return nodes.map((node) => {\n if (isParagraphCellContent(node)) {\n return cloneParagraph(node);\n }\n\n if (isTableCellContentTable(node)) {\n return cloneTable(node);\n }\n\n return node;\n });\n}\n\nfunction applyRunStyleToTableCellContent(\n nodes: TableCellContentNode[],\n runStyle: TextStyle\n): void {\n for (const node of nodes) {\n if (isParagraphCellContent(node)) {\n applyRunStyleToParagraph(node, runStyle);\n continue;\n }\n\n if (isTableCellContentTable(node)) {\n applyRunStyleToTable(node, runStyle);\n }\n }\n}\n\nfunction applyRunStyleToTable(table: TableNode, runStyle: TextStyle): void {\n for (const row of table.rows) {\n for (const cell of row.cells) {\n applyRunStyleToTableCellContent(cell.nodes, runStyle);\n }\n }\n}\n\nexport interface TableCellNode {\n type: \"table-cell\";\n nodes: TableCellContentNode[];\n style?: TableCellStyle;\n}\n\nexport interface TableRowStyle {\n backgroundColor?: string;\n heightTwips?: number;\n heightRule?: \"auto\" | \"atLeast\" | \"exact\";\n cantSplit?: boolean;\n isHeader?: boolean;\n}\n\nexport interface TableRowNode {\n type: \"table-row\";\n cells: TableCellNode[];\n style?: TableRowStyle;\n}\n\nexport interface TableStyle {\n widthTwips?: number;\n indentTwips?: number;\n layout?: \"fixed\" | \"autofit\";\n cellSpacingTwips?: number;\n cellMarginTwips?: TableBoxSpacing;\n columnWidthsTwips?: number[];\n borders?: TableBorderSet;\n floating?: {\n xTwips?: number;\n yTwips?: number;\n leftFromTextTwips?: number;\n rightFromTextTwips?: number;\n topFromTextTwips?: number;\n bottomFromTextTwips?: number;\n horizontalAnchor?: string;\n verticalAnchor?: string;\n horizontalAlign?: \"left\" | \"center\" | \"right\" | \"inside\" | \"outside\";\n verticalAlign?: \"top\" | \"center\" | \"bottom\" | \"inside\" | \"outside\";\n };\n}\n\nexport interface TableNode {\n type: \"table\";\n rows: TableRowNode[];\n style?: TableStyle;\n sourceXml?: string;\n}\n\nexport type DocNode = ParagraphNode | TableNode;\n\nexport interface HeaderSection {\n partName: string;\n referenceType?: string;\n nodes: DocNode[];\n}\n\nexport interface FooterSection {\n partName: string;\n referenceType?: string;\n nodes: DocNode[];\n}\n\nexport interface DocumentSection {\n startNodeIndex: number;\n sectionPropertiesXml?: string;\n headerSections: HeaderSection[];\n footerSections: FooterSection[];\n}\n\nexport interface ParagraphStyleDefinition {\n id: string;\n name: string;\n basedOnId?: string;\n nextStyleId?: string;\n align?: ParagraphAlignment;\n headingLevel?: HeadingLevel;\n numbering?: ParagraphNumbering;\n spacing?: ParagraphSpacing;\n indent?: ParagraphIndent;\n backgroundColor?: string;\n borders?: ParagraphBorderSet;\n tabStops?: ParagraphTabStop[];\n contextualSpacing?: boolean;\n keepNext?: boolean;\n keepLines?: boolean;\n widowControl?: boolean;\n pageBreakBefore?: boolean;\n runStyle?: TextStyle;\n uiPriority?: number;\n isDefault?: boolean;\n isPrimary?: boolean;\n}\n\nexport interface NumberingLevelDefinition {\n ilvl: number;\n start?: number;\n format?: string;\n text?: string;\n suffix?: \"tab\" | \"space\" | \"nothing\";\n indent?: ParagraphIndent;\n runStyle?: TextStyle;\n bulletFontFamily?: string;\n bulletColor?: string;\n pictureBulletId?: number;\n pictureBullet?: NumberingPictureBulletDefinition;\n}\n\nexport interface NumberingAbstractDefinition {\n abstractNumId: number;\n levels: NumberingLevelDefinition[];\n}\n\nexport interface NumberingInstanceDefinition {\n numId: number;\n abstractNumId: number;\n levelStartOverrides?: Record<string, number>;\n levelOverrides?: NumberingLevelDefinition[];\n}\n\nexport interface NumberingDefinitionSet {\n abstracts: NumberingAbstractDefinition[];\n instances: NumberingInstanceDefinition[];\n}\n\nexport interface NumberingPictureBulletDefinition {\n numPicBulletId: number;\n src?: string;\n widthPx?: number;\n heightPx?: number;\n partName?: string;\n contentType?: string;\n}\n\nexport interface DocumentNoteDefinition {\n id: number;\n text: string;\n nodes?: DocNode[];\n}\n\nexport interface DocumentCompatibilitySettings {\n suppressSpacingBeforeAfterPageBreak?: boolean;\n usePrinterMetrics?: boolean;\n useFixedHtmlParagraphSpacing?: boolean;\n doNotBreakWrappedTables?: boolean;\n doNotBreakConstrainedForcedTable?: boolean;\n evenAndOddHeaders?: boolean;\n}\n\nexport interface DocModel {\n nodes: DocNode[];\n metadata: {\n sourceParts: number;\n warnings: string[];\n documentPageCount?: number;\n documentOpenTag?: string;\n documentBackgroundColor?: string;\n sectionPropertiesXml?: string;\n sections?: DocumentSection[];\n headerSections: HeaderSection[];\n footerSections: FooterSection[];\n paragraphStyles: ParagraphStyleDefinition[];\n defaultParagraphStyleId?: string;\n numberingDefinitions?: NumberingDefinitionSet;\n compatibility?: DocumentCompatibilitySettings;\n footnotes?: DocumentNoteDefinition[];\n endnotes?: DocumentNoteDefinition[];\n };\n}\n\ninterface ContentTypeLookup {\n defaultByExtension: Map<string, string>;\n overrideByPartName: Map<string, string>;\n}\n\ninterface ParseContext {\n relationships: Map<string, string>;\n contentTypes: ContentTypeLookup;\n parts: OoxmlPackage[\"parts\"];\n binaryAssets: Map<string, Uint8Array>;\n styleSheet: ParsedStyleSheet;\n warnings: string[];\n}\n\nfunction parseDocumentBackgroundColor(documentXml: string): string | undefined {\n const backgroundTag = documentXml.match(/<w:background\\b[^>]*>/i)?.[0];\n if (!backgroundTag) {\n return undefined;\n }\n\n return normalizeHexColor(backgroundTag.match(/\\bw:color=\"([^\"]+)\"/i)?.[1]);\n}\n\ninterface RawStyleDefinition {\n id: string;\n type: \"paragraph\" | \"character\" | \"numbering\" | \"table\";\n name: string;\n basedOnId?: string;\n nextStyleId?: string;\n align?: ParagraphAlignment;\n headingLevel?: HeadingLevel;\n numbering?: ParagraphNumbering;\n spacing?: ParagraphSpacing;\n indent?: ParagraphIndent;\n backgroundColor?: string;\n borders?: ParagraphBorderSet;\n tabStops?: ParagraphTabStop[];\n contextualSpacing?: boolean;\n keepNext?: boolean;\n keepLines?: boolean;\n widowControl?: boolean;\n pageBreakBefore?: boolean;\n runStyle?: TextStyle;\n uiPriority?: number;\n isDefault?: boolean;\n isPrimary?: boolean;\n}\n\ninterface ThemeFontMap {\n majorLatin?: string;\n minorLatin?: string;\n majorEastAsia?: string;\n minorEastAsia?: string;\n majorComplexScript?: string;\n minorComplexScript?: string;\n}\n\ntype ThemeColorToken = string;\n\ninterface ThemeColorMap {\n [token: ThemeColorToken]: string;\n}\n\ninterface ParagraphTabStop {\n alignment?: \"left\" | \"center\" | \"right\" | \"decimal\" | \"bar\";\n leader?: \"none\" | \"dot\" | \"hyphen\" | \"underscore\" | \"middleDot\";\n positionTwips?: number;\n}\n\ninterface ParsedStyleSheet {\n paragraphStyles: ParagraphStyleDefinition[];\n paragraphStyleById: Map<string, ParagraphStyleDefinition>;\n runStyleById: Map<string, TextStyle>;\n tableStyleById: Map<string, ParsedTableStyleDefinition>;\n defaultParagraphStyle?: ParagraphStyle;\n defaultParagraphStyleId?: string;\n defaultRunStyle?: TextStyle;\n themeFonts: ThemeFontMap;\n themeColors: ThemeColorMap;\n}\n\ntype TableConditionalStyleType =\n | \"wholeTable\"\n | \"firstRow\"\n | \"lastRow\"\n | \"firstCol\"\n | \"lastCol\"\n | \"band1Horz\"\n | \"band2Horz\"\n | \"band1Vert\"\n | \"band2Vert\"\n | \"nwCell\"\n | \"neCell\"\n | \"swCell\"\n | \"seCell\";\n\ninterface ParsedTableStyleCondition {\n rowBackgroundColor?: string;\n cellBackgroundColor?: string;\n paragraphAlign?: ParagraphAlignment;\n runStyle?: TextStyle;\n tableBorders?: TableBorderSet;\n cellBorders?: TableBorderSet;\n tableProperties?: ParsedTableProperties;\n tableLook?: ParsedTableLook;\n}\n\ninterface ParsedTableStyleDefinition {\n id: string;\n basedOnId?: string;\n name: string;\n conditions: Partial<\n Record<TableConditionalStyleType, ParsedTableStyleCondition>\n >;\n floating?: NonNullable<TableStyle[\"floating\"]>;\n properties?: ParsedTableProperties;\n}\n\ninterface ParsedTableProperties {\n widthTwips?: number;\n indentTwips?: number;\n layout?: \"fixed\" | \"autofit\";\n cellSpacingTwips?: number;\n cellMarginTwips?: TableBoxSpacing;\n floating?: NonNullable<TableStyle[\"floating\"]>;\n}\n\ninterface ParsedTableLook {\n firstRow: boolean;\n lastRow: boolean;\n firstCol: boolean;\n lastCol: boolean;\n noHBand: boolean;\n noVBand: boolean;\n rowBandSize: number;\n colBandSize: number;\n}\n\nconst MIME_BY_EXTENSION: Record<string, string> = {\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n gif: \"image/gif\",\n bmp: \"image/bmp\",\n wmf: \"image/wmf\",\n emf: \"image/emf\",\n webp: \"image/webp\",\n svg: \"image/svg+xml\",\n};\n\nfunction decodeXmlEntities(text: string): string {\n return text\n .replaceAll(\"&lt;\", \"<\")\n .replaceAll(\"&gt;\", \">\")\n .replaceAll(\"&quot;\", '\"')\n .replaceAll(\"&apos;\", \"'\")\n .replaceAll(\"&amp;\", \"&\");\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\ninterface TagRange {\n start: number;\n end: number;\n}\n\nfunction extractBalancedTagRanges(xml: string, tagName: string): TagRange[] {\n const escapedTagName = escapeRegExp(tagName);\n const tokenPattern = new RegExp(\n `<${escapedTagName}\\\\b[^>]*\\\\/?>|<\\\\/${escapedTagName}>`,\n \"gi\"\n );\n const ranges: TagRange[] = [];\n const startStack: number[] = [];\n\n for (const token of xml.matchAll(tokenPattern)) {\n const tokenXml = token[0];\n const tokenIndex = token.index;\n if (tokenIndex === undefined || tokenIndex < 0) {\n continue;\n }\n\n if (tokenXml.startsWith(\"</\")) {\n const start = startStack.pop();\n if (start === undefined) {\n continue;\n }\n\n if (startStack.length === 0) {\n ranges.push({\n start,\n end: tokenIndex + tokenXml.length,\n });\n }\n continue;\n }\n\n const selfClosing = /\\/>\\s*$/i.test(tokenXml);\n if (selfClosing) {\n if (startStack.length === 0) {\n ranges.push({\n start: tokenIndex,\n end: tokenIndex + tokenXml.length,\n });\n }\n continue;\n }\n\n startStack.push(tokenIndex);\n }\n\n return ranges;\n}\n\nfunction extractBalancedTagBlocks(xml: string, tagName: string): string[] {\n return extractBalancedTagRanges(xml, tagName).map((range) =>\n xml.slice(range.start, range.end)\n );\n}\n\ninterface TaggedRange extends TagRange {\n tagName: string;\n}\n\nfunction extractBalancedTagBlocksInOrder(\n xml: string,\n tagNames: string[]\n): TaggedRange[] {\n const ranges = tagNames.flatMap((tagName) =>\n extractBalancedTagRanges(xml, tagName).map((range) => ({\n ...range,\n tagName,\n }))\n );\n\n ranges.sort((left, right) => {\n if (left.start !== right.start) {\n return left.start - right.start;\n }\n return left.end - right.end;\n });\n\n const topLevelRanges: TaggedRange[] = [];\n for (const range of ranges) {\n const nestedInsideParent = topLevelRanges.some(\n (parentRange) =>\n range.start >= parentRange.start && range.end <= parentRange.end\n );\n if (nestedInsideParent) {\n continue;\n }\n topLevelRanges.push(range);\n }\n\n return topLevelRanges;\n}\n\nfunction parseOnOffAttribute(\n xml: string,\n tagName: string\n): boolean | undefined {\n const match = xml.match(new RegExp(`<w:${tagName}\\\\b([^>]*)\\\\/?>`, \"i\"));\n if (!match) {\n return undefined;\n }\n\n const attributes = match[1] ?? \"\";\n const valueMatch = attributes.match(/w:val=\"([^\"]+)\"/i);\n if (!valueMatch) {\n return true;\n }\n\n const value = valueMatch[1].toLowerCase();\n return (\n value !== \"0\" && value !== \"false\" && value !== \"none\" && value !== \"off\"\n );\n}\n\nfunction parseUnderlineAttribute(xml: string): boolean | undefined {\n const match = xml.match(/<w:u\\b([^>]*)\\/?>/i);\n if (!match) {\n return undefined;\n }\n\n const attributes = match[1] ?? \"\";\n const valueMatch = attributes.match(/\\bw:val=\"([^\"]+)\"/i);\n if (valueMatch) {\n const value = valueMatch[1].toLowerCase();\n return (\n value !== \"0\" && value !== \"false\" && value !== \"none\" && value !== \"off\"\n );\n }\n\n const compactAttributes = attributes.replace(/\\s+/g, \"\").replace(/\\/+$/g, \"\");\n if (!compactAttributes) {\n // <w:u/> explicitly enables underline.\n return true;\n }\n\n // Word documents generated by some tools emit color-only underline tags in\n // textbox runs (e.g. <w:u w:color=\"FFFFFF\"/>). Treat these as \"inherit\"\n // rather than forcing underline on.\n const nonDecorationAttributes = compactAttributes\n .replace(/\\bw:color=\"[^\"]*\"/gi, \"\")\n .replace(/\\bw:themeColor=\"[^\"]*\"/gi, \"\")\n .replace(/\\bw:themeTint=\"[^\"]*\"/gi, \"\")\n .replace(/\\bw:themeShade=\"[^\"]*\"/gi, \"\")\n .replace(/\\/+$/g, \"\");\n\n if (!nonDecorationAttributes) {\n return undefined;\n }\n\n return true;\n}\n\nfunction normalizeAlignment(\n rawAlignment?: string\n): ParagraphAlignment | undefined {\n if (!rawAlignment) {\n return undefined;\n }\n\n const value = rawAlignment.toLowerCase();\n if (\n value === \"both\" ||\n value === \"distribute\" ||\n value === \"thaidistribute\"\n ) {\n return \"justify\";\n }\n\n if (\n value === \"left\" ||\n value === \"center\" ||\n value === \"right\" ||\n value === \"justify\"\n ) {\n return value;\n }\n\n return undefined;\n}\n\nfunction normalizeHeadingLevel(value?: string): HeadingLevel | undefined {\n if (!value) {\n return undefined;\n }\n\n const match = value.match(/heading\\s*([1-6])/i);\n if (!match?.[1]) {\n return undefined;\n }\n\n return Number(match[1]) as HeadingLevel;\n}\n\nfunction normalizeHexColor(value?: string): string | undefined {\n if (!value) {\n return undefined;\n }\n\n const normalized = value.trim();\n if (!normalized || normalized.toLowerCase() === \"auto\") {\n return undefined;\n }\n\n if (/^[0-9a-fA-F]{6}$/.test(normalized)) {\n return `#${normalized}`;\n }\n\n if (/^[0-9a-fA-F]{3}$/.test(normalized)) {\n const expanded = normalized\n .split(\"\")\n .map((character) => character + character)\n .join(\"\");\n return `#${expanded}`;\n }\n\n if (/^#[0-9a-fA-F]{6}$/.test(normalized)) {\n return normalized;\n }\n\n return undefined;\n}\n\nconst DEFAULT_DRAWING_SCHEME_COLORS: ThemeColorMap = {\n bg1: \"#ffffff\",\n bg2: \"#f3f4f6\",\n tx1: \"#000000\",\n tx2: \"#1f2937\",\n dk1: \"#000000\",\n dk2: \"#1f2937\",\n lt1: \"#ffffff\",\n lt2: \"#f3f4f6\",\n accent1: \"#4472c4\",\n accent2: \"#ed7d31\",\n accent3: \"#70ad47\",\n accent4: \"#5b9bd5\",\n accent5: \"#7030a0\",\n accent6: \"#ffc000\",\n hlink: \"#0563c1\",\n folhlink: \"#954f72\",\n followedhyperlink: \"#954f72\",\n};\n\nfunction emuToPixels(value: number | string | undefined): number | undefined {\n if (value === undefined || value === null || value === \"\") {\n return undefined;\n }\n\n const parsed = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(parsed)) {\n return undefined;\n }\n\n return Number((parsed / 9525).toFixed(3));\n}\n\nfunction resolveDrawingColorFromXml(\n colorXml: string | undefined,\n themeColors: ThemeColorMap\n): { color: string; opacity?: number } | undefined {\n if (!colorXml) {\n return undefined;\n }\n\n const srgb = normalizeHexColor(\n colorXml.match(/<a:srgbClr\\b[^>]*val=\"([^\"]+)\"/i)?.[1]\n );\n const sys = normalizeHexColor(\n colorXml.match(/<a:sysClr\\b[^>]*lastClr=\"([^\"]+)\"/i)?.[1]\n );\n const schemeToken = colorXml\n .match(/<a:schemeClr\\b[^>]*val=\"([^\"]+)\"/i)?.[1]\n ?.trim()\n .toLowerCase();\n const scheme =\n (schemeToken ? themeColors[schemeToken] : undefined) ??\n (schemeToken ? DEFAULT_DRAWING_SCHEME_COLORS[schemeToken] : undefined);\n const color = srgb ?? sys ?? scheme;\n if (!color) {\n return undefined;\n }\n\n const alphaRaw = colorXml.match(/<a:alpha\\b[^>]*val=\"(\\d+)\"/i)?.[1];\n const alpha = alphaRaw ? Number(alphaRaw) : undefined;\n const opacity =\n Number.isFinite(alpha) && (alpha as number) >= 0\n ? Math.max(0, Math.min(1, (alpha as number) / 100000))\n : undefined;\n\n return {\n color,\n opacity,\n };\n}\n\nfunction gradientVectorForAngle(angleDegrees: number): {\n x1: string;\n y1: string;\n x2: string;\n y2: string;\n} {\n const radians = (angleDegrees * Math.PI) / 180;\n const dx = Math.cos(radians);\n const dy = Math.sin(radians);\n\n return {\n x1: `${50 - dx * 50}%`,\n y1: `${50 - dy * 50}%`,\n x2: `${50 + dx * 50}%`,\n y2: `${50 + dy * 50}%`,\n };\n}\n\nfunction svgRotationTransform(\n rotationDegrees: number | undefined,\n widthPx: number,\n heightPx: number\n): string {\n if (\n !Number.isFinite(rotationDegrees) ||\n Math.abs(rotationDegrees as number) < 0.01\n ) {\n return \"\";\n }\n\n return ` transform=\"rotate(${(rotationDegrees as number).toFixed(\n 3\n )} ${Math.round(widthPx / 2)} ${Math.round(heightPx / 2)})\"`;\n}\n\nfunction svgRotationLayout(\n rotationDegrees: number | undefined,\n widthPx: number,\n heightPx: number\n): {\n transformAttribute: string;\n viewBoxWidthPx: number;\n viewBoxHeightPx: number;\n preserveAspectRatio?: \"none\";\n} {\n const safeWidth = Math.max(1, Math.round(widthPx));\n const safeHeight = Math.max(1, Math.round(heightPx));\n if (\n !Number.isFinite(rotationDegrees) ||\n Math.abs(rotationDegrees as number) < 0.01\n ) {\n return {\n transformAttribute: \"\",\n viewBoxWidthPx: safeWidth,\n viewBoxHeightPx: safeHeight,\n };\n }\n\n const radians = ((rotationDegrees as number) * Math.PI) / 180;\n const cos = Math.cos(radians);\n const sin = Math.sin(radians);\n const centerX = safeWidth / 2;\n const centerY = safeHeight / 2;\n const corners = [\n { x: 0, y: 0 },\n { x: safeWidth, y: 0 },\n { x: safeWidth, y: safeHeight },\n { x: 0, y: safeHeight },\n ].map(({ x, y }) => {\n const deltaX = x - centerX;\n const deltaY = y - centerY;\n return {\n x: centerX + deltaX * cos - deltaY * sin,\n y: centerY + deltaX * sin + deltaY * cos,\n };\n });\n const minX = Math.min(...corners.map((corner) => corner.x));\n const maxX = Math.max(...corners.map((corner) => corner.x));\n const minY = Math.min(...corners.map((corner) => corner.y));\n const maxY = Math.max(...corners.map((corner) => corner.y));\n const viewBoxWidthPx = Math.max(1, Math.ceil(maxX - minX));\n const viewBoxHeightPx = Math.max(1, Math.ceil(maxY - minY));\n\n return {\n transformAttribute: ` transform=\"translate(${(-minX).toFixed(\n 2\n )} ${(-minY).toFixed(2)}) rotate(${(rotationDegrees as number).toFixed(\n 3\n )} ${centerX.toFixed(2)} ${centerY.toFixed(2)})\"`,\n viewBoxWidthPx,\n viewBoxHeightPx,\n preserveAspectRatio: \"none\",\n };\n}\n\nfunction drawingShapeFillMarkup(\n shapePropertiesXml: string,\n themeColors: ThemeColorMap,\n gradientId: string\n): { fillAttribute: string; defs: string[] } {\n const fillScopeXml = shapePropertiesXml\n .replace(/<a:ln\\b[\\s\\S]*?<\\/a:ln>/gi, \"\")\n .replace(/<a:ln\\b[^>]*\\/>/gi, \"\")\n .replace(/<a:extLst\\b[\\s\\S]*?<\\/a:extLst>/gi, \"\")\n .replace(/<a:extLst\\b[^>]*\\/>/gi, \"\");\n const solidFillXml = extractBalancedTagBlocks(fillScopeXml, \"a:solidFill\")[0];\n if (solidFillXml) {\n const resolved = resolveDrawingColorFromXml(solidFillXml, themeColors);\n if (resolved) {\n return {\n fillAttribute: `fill=\"${resolved.color}\"${\n resolved.opacity !== undefined\n ? ` fill-opacity=\"${resolved.opacity}\"`\n : \"\"\n }`,\n defs: [],\n };\n }\n }\n\n const gradientFillXml = extractBalancedTagBlocks(\n fillScopeXml,\n \"a:gradFill\"\n )[0];\n if (gradientFillXml) {\n const gradientStops = extractBalancedTagBlocks(gradientFillXml, \"a:gs\")\n .map((stopXml) => {\n const rawPosition = Number(\n getAttribute(stopXml.match(/<a:gs\\b[^>]*>/i)?.[0] ?? \"\", \"pos\")\n );\n const resolved = resolveDrawingColorFromXml(stopXml, themeColors);\n if (!resolved) {\n return undefined;\n }\n\n const clampedPosition = Number.isFinite(rawPosition)\n ? Math.max(0, Math.min(100, rawPosition / 1000))\n : 0;\n return `<stop offset=\"${clampedPosition}%\" stop-color=\"${\n resolved.color\n }\"${\n resolved.opacity !== undefined\n ? ` stop-opacity=\"${resolved.opacity}\"`\n : \"\"\n }/>`;\n })\n .filter((stop): stop is string => Boolean(stop));\n\n if (gradientStops.length > 0) {\n const angleRaw = Number(\n getAttribute(gradientFillXml.match(/<a:lin\\b[^>]*>/i)?.[0] ?? \"\", \"ang\")\n );\n const angleDegrees = Number.isFinite(angleRaw) ? angleRaw / 60000 : 90;\n const vector = gradientVectorForAngle(angleDegrees);\n\n return {\n fillAttribute: `fill=\"url(#${gradientId})\"`,\n defs: [\n `<linearGradient id=\"${gradientId}\" x1=\"${vector.x1}\" y1=\"${\n vector.y1\n }\" x2=\"${vector.x2}\" y2=\"${vector.y2}\">${gradientStops.join(\n \"\"\n )}</linearGradient>`,\n ],\n };\n }\n }\n\n if (/<a:noFill\\b/i.test(fillScopeXml)) {\n return {\n fillAttribute: 'fill=\"none\"',\n defs: [],\n };\n }\n\n const styleFillRefXml = extractBalancedTagBlocks(\n shapePropertiesXml,\n \"a:fillRef\"\n )[0];\n if (styleFillRefXml) {\n const resolved = resolveDrawingColorFromXml(styleFillRefXml, themeColors);\n if (resolved) {\n return {\n fillAttribute: `fill=\"${resolved.color}\"${\n resolved.opacity !== undefined\n ? ` fill-opacity=\"${resolved.opacity}\"`\n : \"\"\n }`,\n defs: [],\n };\n }\n }\n\n return {\n fillAttribute: 'fill=\"none\"',\n defs: [],\n };\n}\n\nfunction drawingShapeStrokeMarkup(\n shapePropertiesXml: string,\n themeColors: ThemeColorMap\n): string {\n const lineXml =\n extractBalancedTagBlocks(shapePropertiesXml, \"a:ln\")[0] ??\n shapePropertiesXml.match(/<a:ln\\b[^>]*\\/>/i)?.[0] ??\n \"\";\n if (!lineXml || /<a:noFill\\b/i.test(lineXml)) {\n return 'stroke=\"none\"';\n }\n\n const lineWidthEmu = parseIntegerAttribute(\n lineXml.match(/<a:ln\\b[^>]*>/i)?.[0] ?? \"\",\n \"w\"\n );\n if (Number.isFinite(lineWidthEmu) && (lineWidthEmu as number) <= 0) {\n return 'stroke=\"none\"';\n }\n\n const resolved =\n resolveDrawingColorFromXml(lineXml, themeColors) ??\n resolveDrawingColorFromXml(\n extractBalancedTagBlocks(shapePropertiesXml, \"a:lnRef\")[0],\n themeColors\n );\n const widthPx = emuToPixels(lineWidthEmu);\n\n return `stroke=\"${resolved?.color ?? \"#000000\"}\"${\n resolved?.opacity !== undefined\n ? ` stroke-opacity=\"${resolved.opacity}\"`\n : \"\"\n } stroke-width=\"${Math.max(1, widthPx ?? 1)}\"`;\n}\n\nfunction drawingShapePathData(\n pathXml: string,\n widthPx: number,\n heightPx: number\n): string | undefined {\n const pathTag = pathXml.match(/<a:path\\b[^>]*>/i)?.[0] ?? \"\";\n const baseWidth = Math.max(1, parseIntegerAttribute(pathTag, \"w\") ?? 21600);\n const baseHeight = Math.max(1, parseIntegerAttribute(pathTag, \"h\") ?? 21600);\n const commandMatches = [\n ...pathXml.matchAll(\n /<(a:moveTo|a:lnTo|a:cubicBezTo|a:close)\\b[\\s\\S]*?(?:<\\/\\1>|\\/>)/gi\n ),\n ];\n if (commandMatches.length === 0) {\n return undefined;\n }\n\n const scalePoint = (xRaw: string, yRaw: string): string | undefined => {\n const x = Number(xRaw);\n const y = Number(yRaw);\n if (!Number.isFinite(x) || !Number.isFinite(y)) {\n return undefined;\n }\n\n const scaledX = Number(((x / baseWidth) * widthPx).toFixed(2));\n const scaledY = Number(((y / baseHeight) * heightPx).toFixed(2));\n return `${scaledX} ${scaledY}`;\n };\n\n const commands = commandMatches\n .map((match) => {\n const commandType = match[1].toLowerCase();\n const commandXml = match[0];\n if (commandType.includes(\"close\")) {\n return \"Z\";\n }\n\n const pointMatches = [\n ...commandXml.matchAll(\n /<a:pt\\b[^>]*x=\"([^\"]+)\"[^>]*y=\"([^\"]+)\"[^>]*\\/>/gi\n ),\n ];\n if (commandType.includes(\"moveto\") || commandType.includes(\"lnto\")) {\n const point = pointMatches[0];\n if (!point) {\n return undefined;\n }\n const scaledPoint = scalePoint(point[1], point[2]);\n if (!scaledPoint) {\n return undefined;\n }\n return `${commandType.includes(\"moveto\") ? \"M\" : \"L\"}${scaledPoint}`;\n }\n\n if (commandType.includes(\"cubicbezto\")) {\n if (pointMatches.length < 3) {\n return undefined;\n }\n const scaledPoints = pointMatches\n .slice(0, 3)\n .map((point) => scalePoint(point[1], point[2]));\n if (scaledPoints.some((point) => !point)) {\n return undefined;\n }\n return `C${scaledPoints.join(\" \")}`;\n }\n\n return undefined;\n })\n .filter((command): command is string => Boolean(command));\n if (commands.length === 0) {\n return undefined;\n }\n\n return commands.join(\" \");\n}\n\nfunction ellipsePathData(widthPx: number, heightPx: number): string {\n const safeWidth = Math.max(1, Math.round(widthPx));\n const safeHeight = Math.max(1, Math.round(heightPx));\n const rx = safeWidth / 2;\n const ry = safeHeight / 2;\n return `M${rx} 0 C${safeWidth - rx * 0.45} 0 ${safeWidth} ${\n ry * 0.45\n } ${safeWidth} ${ry} C${safeWidth} ${safeHeight - ry * 0.45} ${\n safeWidth - rx * 0.45\n } ${safeHeight} ${rx} ${safeHeight} C${rx * 0.45} ${safeHeight} 0 ${\n safeHeight - ry * 0.45\n } 0 ${ry} C0 ${ry * 0.45} ${rx * 0.45} 0 ${rx} 0 Z`;\n}\n\nfunction capsulePathData(widthPx: number, heightPx: number): string {\n const safeWidth = Math.max(1, Math.round(widthPx));\n const safeHeight = Math.max(1, Math.round(heightPx));\n if (safeHeight >= safeWidth) {\n const rx = safeWidth / 2;\n return `M${rx} 0 C${safeWidth - rx * 0.45} 0 ${safeWidth} ${\n rx * 0.45\n } ${safeWidth} ${rx} L${safeWidth} ${safeHeight - rx} C${safeWidth} ${\n safeHeight - rx * 0.45\n } ${safeWidth - rx * 0.45} ${safeHeight} ${rx} ${safeHeight} C${\n rx * 0.45\n } ${safeHeight} 0 ${safeHeight - rx * 0.45} 0 ${\n safeHeight - rx\n } L0 ${rx} C0 ${rx * 0.45} ${rx * 0.45} 0 ${rx} 0 Z`;\n }\n\n const ry = safeHeight / 2;\n return `M0 ${ry} C0 ${ry * 0.45} ${ry * 0.45} 0 ${ry} 0 L${\n safeWidth - ry\n } 0 C${safeWidth - ry * 0.45} 0 ${safeWidth} ${\n ry * 0.45\n } ${safeWidth} ${ry} C${safeWidth} ${safeHeight - ry * 0.45} ${\n safeWidth - ry * 0.45\n } ${safeHeight} ${safeWidth - ry} ${safeHeight} L${ry} ${safeHeight} C${\n ry * 0.45\n } ${safeHeight} 0 ${safeHeight - ry * 0.45} 0 ${ry} Z`;\n}\n\nfunction drawingShapeHeuristicPathData(\n pathXml: string,\n widthPx: number,\n heightPx: number\n): string | undefined {\n const cubicCount = (pathXml.match(/<a:cubicBezTo\\b/gi) ?? []).length;\n const lineCount = (pathXml.match(/<a:lnTo\\b/gi) ?? []).length;\n if (cubicCount === 0) {\n return undefined;\n }\n\n if (cubicCount >= 4 && lineCount === 0) {\n return ellipsePathData(widthPx, heightPx);\n }\n\n if (cubicCount >= 2 && lineCount === 2) {\n return capsulePathData(widthPx, heightPx);\n }\n\n return undefined;\n}\n\nfunction flowChartDelayPathData(widthPx: number, heightPx: number): string {\n const safeWidth = Math.max(1, Math.round(widthPx));\n const safeHeight = Math.max(1, Math.round(heightPx));\n const radius = Math.max(\n 1,\n Math.min(Math.round(safeHeight / 2), safeWidth - 1)\n );\n const arcX = safeWidth - radius;\n return `M0 0 H${arcX} A${radius} ${radius} 0 0 1 ${arcX} ${safeHeight} H0 Z`;\n}\n\nfunction rightTrianglePathData(widthPx: number, heightPx: number): string {\n const safeWidth = Math.max(1, Math.round(widthPx));\n const safeHeight = Math.max(1, Math.round(heightPx));\n return `M0 ${safeHeight} L${safeWidth} ${safeHeight} L0 0 Z`;\n}\n\nfunction drawingPresetPathData(\n preset: string | undefined,\n widthPx: number,\n heightPx: number\n): string | undefined {\n const normalizedPreset = preset?.trim();\n if (!normalizedPreset) {\n return undefined;\n }\n\n if (normalizedPreset === \"flowChartDelay\") {\n return flowChartDelayPathData(widthPx, heightPx);\n }\n\n if (normalizedPreset === \"rtTriangle\") {\n return rightTrianglePathData(widthPx, heightPx);\n }\n\n return undefined;\n}\n\nfunction svgGroupedShapeTransform(\n x: number,\n y: number,\n widthPx: number,\n heightPx: number,\n transformXml: string | undefined\n): string {\n const transforms = [`translate(${x} ${y})`];\n const flipH = /^(?:1|true)$/i.test(\n getAttribute(transformXml ?? \"\", \"flipH\") ?? \"\"\n );\n const flipV = /^(?:1|true)$/i.test(\n getAttribute(transformXml ?? \"\", \"flipV\") ?? \"\"\n );\n const rotationRaw = Number(getAttribute(transformXml ?? \"\", \"rot\"));\n const rotationDegrees =\n Number.isFinite(rotationRaw) && Math.abs(rotationRaw) > 0\n ? rotationRaw / 60000\n : undefined;\n\n if (flipH || flipV || Number.isFinite(rotationDegrees)) {\n const centerX = Math.round(widthPx / 2);\n const centerY = Math.round(heightPx / 2);\n transforms.push(`translate(${centerX} ${centerY})`);\n if (Number.isFinite(rotationDegrees)) {\n transforms.push(`rotate(${(rotationDegrees as number).toFixed(3)})`);\n }\n if (flipH || flipV) {\n transforms.push(`scale(${flipH ? -1 : 1} ${flipV ? -1 : 1})`);\n }\n transforms.push(`translate(${-centerX} ${-centerY})`);\n }\n\n return ` transform=\"${transforms.join(\" \")}\"`;\n}\n\nfunction renderGroupedPictureSvgElement(\n pictureXml: string,\n childOffsetX: number,\n childOffsetY: number,\n scaleX: number,\n scaleY: number,\n context: ParseContext\n): string | undefined {\n const picturePropertiesXml =\n extractBalancedTagBlocks(pictureXml, \"pic:spPr\")[0] ?? \"\";\n const transformXml =\n extractBalancedTagBlocks(picturePropertiesXml, \"a:xfrm\")[0] ?? \"\";\n const offTag = transformXml.match(/<a:off\\b[^>]*\\/>/i)?.[0] ?? \"\";\n const extTag = transformXml.match(/<a:ext\\b[^>]*\\/>/i)?.[0] ?? \"\";\n const offXPx = (parseIntegerAttribute(offTag, \"x\") ?? 0) - childOffsetX;\n const offYPx = (parseIntegerAttribute(offTag, \"y\") ?? 0) - childOffsetY;\n const extXPx = parseIntegerAttribute(extTag, \"cx\") ?? 0;\n const extYPx = parseIntegerAttribute(extTag, \"cy\") ?? 0;\n const x = Math.round(offXPx * scaleX);\n const y = Math.round(offYPx * scaleY);\n const widthPx = Math.max(1, Math.round(extXPx * scaleX));\n const heightPx = Math.max(1, Math.round(extYPx * scaleY));\n const relationshipId =\n pictureXml.match(/<a:blip\\b[^>]*r:embed=\"([^\"]+)\"/i)?.[1] ??\n pictureXml.match(/<a:blip\\b[^>]*r:link=\"([^\"]+)\"/i)?.[1];\n if (!relationshipId) {\n return undefined;\n }\n\n const partName = context.relationships.get(relationshipId);\n if (!partName) {\n context.warnings.push(`Missing relationship target for ${relationshipId}`);\n return undefined;\n }\n\n const binary = context.binaryAssets.get(partName);\n if (!binary) {\n context.warnings.push(`Missing image asset ${partName}`);\n return undefined;\n }\n\n const mimeType =\n contentTypeForPart(partName, context.contentTypes) ??\n \"application/octet-stream\";\n const src = `data:${mimeType};base64,${bytesToBase64(binary)}`;\n return `<image href=\"${src}\" x=\"${x}\" y=\"${y}\" width=\"${widthPx}\" height=\"${heightPx}\" preserveAspectRatio=\"none\"/>`;\n}\n\nfunction renderStandaloneWordShapeSvg(\n runXml: string,\n widthPx: number | undefined,\n heightPx: number | undefined,\n context: ParseContext\n): string | undefined {\n const groupXml = extractBalancedTagBlocks(runXml, \"wpg:wgp\")[0];\n if (groupXml) {\n const groupTransformXml = extractBalancedTagBlocks(groupXml, \"a:xfrm\")[0];\n const childOffsetTag =\n groupTransformXml.match(/<a:chOff\\b[^>]*\\/?>/i)?.[0] ?? \"\";\n const childExtentTag =\n groupTransformXml.match(/<a:chExt\\b[^>]*\\/?>/i)?.[0] ?? \"\";\n const childOffsetX = parseIntegerAttribute(childOffsetTag, \"x\") ?? 0;\n const childOffsetY = parseIntegerAttribute(childOffsetTag, \"y\") ?? 0;\n const childExtentX = Math.max(\n 1,\n parseIntegerAttribute(childExtentTag, \"cx\") ?? 1\n );\n const childExtentY = Math.max(\n 1,\n parseIntegerAttribute(childExtentTag, \"cy\") ?? 1\n );\n const safeWidth = clamp(Math.round(widthPx ?? 320), 8, 2400);\n const safeHeight = clamp(Math.round(heightPx ?? 120), 8, 2400);\n const scaleX = safeWidth / childExtentX;\n const scaleY = safeHeight / childExtentY;\n const pictureElements = extractBalancedTagBlocks(groupXml, \"pic:pic\")\n .map((pictureXml) =>\n renderGroupedPictureSvgElement(\n pictureXml,\n childOffsetX,\n childOffsetY,\n scaleX,\n scaleY,\n context\n )\n )\n .filter((element): element is string => Boolean(element));\n const shapeElements = extractBalancedTagBlocks(groupXml, \"wps:wsp\")\n .map((shapeXml, shapeIndex) => {\n const shapePropertiesXml =\n extractBalancedTagBlocks(shapeXml, \"wps:spPr\")[0] ?? \"\";\n const transformXml = extractBalancedTagBlocks(\n shapePropertiesXml,\n \"a:xfrm\"\n )[0];\n const offTag = transformXml.match(/<a:off\\b[^>]*\\/?>/i)?.[0] ?? \"\";\n const extTag = transformXml.match(/<a:ext\\b[^>]*\\/?>/i)?.[0] ?? \"\";\n const offXPx = (parseIntegerAttribute(offTag, \"x\") ?? 0) - childOffsetX;\n const offYPx = (parseIntegerAttribute(offTag, \"y\") ?? 0) - childOffsetY;\n const extXPx = parseIntegerAttribute(extTag, \"cx\") ?? 0;\n const extYPx = parseIntegerAttribute(extTag, \"cy\") ?? 0;\n const shapeWidth = Math.max(1, Math.round(extXPx * scaleX));\n const shapeHeight = Math.max(1, Math.round(extYPx * scaleY));\n const x = Math.round(offXPx * scaleX);\n const y = Math.round(offYPx * scaleY);\n const shapeTransform = svgGroupedShapeTransform(\n x,\n y,\n shapeWidth,\n shapeHeight,\n transformXml\n );\n const preset = getAttribute(\n shapePropertiesXml.match(/<a:prstGeom\\b[^>]*>/i)?.[0] ?? \"\",\n \"prst\"\n )?.trim();\n const fill = drawingShapeFillMarkup(\n `${shapePropertiesXml}${\n extractBalancedTagBlocks(shapeXml, \"wps:style\")[0] ?? \"\"\n }`,\n context.styleSheet.themeColors,\n `group-fill-${shapeIndex}`\n );\n const stroke = drawingShapeStrokeMarkup(\n `${shapePropertiesXml}${\n extractBalancedTagBlocks(shapeXml, \"wps:style\")[0] ?? \"\"\n }`,\n context.styleSheet.themeColors\n );\n const textBoxParagraphs = parseTextBoxParagraphs(shapeXml, context);\n const textBoxLayout = parseTextBoxLayout(shapeXml);\n const textBoxSvg =\n textBoxParagraphs.length > 0\n ? renderTextBoxSvg(\n textBoxParagraphs,\n shapeWidth,\n shapeHeight,\n textBoxLayout\n )\n : undefined;\n const localTextBoxSvg = textBoxSvg\n ? textBoxSvg.replace(/^<svg\\b/i, '<svg x=\"0\" y=\"0\"')\n : \"\";\n const presetPathData = drawingPresetPathData(\n preset,\n shapeWidth,\n shapeHeight\n );\n\n if (preset === \"line\") {\n return `<g${shapeTransform}><line x1=\"0\" y1=\"${Math.round(\n shapeHeight / 2\n )}\" x2=\"${shapeWidth}\" y2=\"${Math.round(\n shapeHeight / 2\n )}\" ${stroke} fill=\"none\"/>${localTextBoxSvg}</g>`;\n }\n\n const pathXml = extractBalancedTagBlocks(\n shapePropertiesXml,\n \"a:path\"\n )[0];\n const directPathData = pathXml\n ? drawingShapePathData(pathXml, shapeWidth, shapeHeight)\n : undefined;\n const pathData =\n pathXml &&\n /<a:cubicBezTo\\b/i.test(pathXml) &&\n (!directPathData || !directPathData.includes(\"C\"))\n ? drawingShapeHeuristicPathData(pathXml, shapeWidth, shapeHeight) ??\n directPathData\n : directPathData;\n if (pathData) {\n return `${fill.defs.join(\n \"\"\n )}<g${shapeTransform}><path d=\"${pathData}\" ${\n fill.fillAttribute\n } ${stroke}/>${localTextBoxSvg}</g>`;\n }\n\n if (presetPathData) {\n return `${fill.defs.join(\n \"\"\n )}<g${shapeTransform}><path d=\"${presetPathData}\" ${\n fill.fillAttribute\n } ${stroke}/>${localTextBoxSvg}</g>`;\n }\n\n return `${fill.defs.join(\n \"\"\n )}<g${shapeTransform}><rect x=\"0\" y=\"0\" width=\"${shapeWidth}\" height=\"${shapeHeight}\" ${\n fill.fillAttribute\n } ${stroke}/>${localTextBoxSvg}</g>`;\n })\n .filter((element): element is string => Boolean(element));\n\n const elements = [...pictureElements, ...shapeElements];\n if (elements.length > 0) {\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${safeWidth}\" height=\"${safeHeight}\" viewBox=\"0 0 ${safeWidth} ${safeHeight}\">${elements.join(\n \"\"\n )}</svg>`;\n }\n }\n\n const shapeXml = extractBalancedTagBlocks(runXml, \"wps:wsp\")[0];\n if (!shapeXml || /<w:txbxContent\\b/i.test(shapeXml)) {\n return undefined;\n }\n\n const shapePropertiesXml =\n extractBalancedTagBlocks(shapeXml, \"wps:spPr\")[0] ?? \"\";\n if (!shapePropertiesXml) {\n return undefined;\n }\n\n const safeWidth = clamp(Math.round(widthPx ?? 320), 8, 2400);\n const safeHeight = clamp(Math.round(heightPx ?? 240), 8, 2400);\n const rotationRaw = Number(\n getAttribute(\n extractBalancedTagBlocks(shapePropertiesXml, \"a:xfrm\")[0] ?? \"\",\n \"rot\"\n )\n );\n const rotationDegrees = Number.isFinite(rotationRaw)\n ? rotationRaw / 60000\n : undefined;\n const rotationLayout = svgRotationLayout(\n rotationDegrees,\n safeWidth,\n safeHeight\n );\n const preset = getAttribute(\n shapePropertiesXml.match(/<a:prstGeom\\b[^>]*>/i)?.[0] ?? \"\",\n \"prst\"\n )?.trim();\n const fill = drawingShapeFillMarkup(\n `${shapePropertiesXml}${\n extractBalancedTagBlocks(shapeXml, \"wps:style\")[0] ?? \"\"\n }`,\n context.styleSheet.themeColors,\n \"shape-fill\"\n );\n const stroke = drawingShapeStrokeMarkup(\n `${shapePropertiesXml}${\n extractBalancedTagBlocks(shapeXml, \"wps:style\")[0] ?? \"\"\n }`,\n context.styleSheet.themeColors\n );\n const pathXml = extractBalancedTagBlocks(shapePropertiesXml, \"a:path\")[0];\n const directPathData = pathXml\n ? drawingShapePathData(pathXml, safeWidth, safeHeight)\n : undefined;\n const pathData =\n pathXml &&\n /<a:cubicBezTo\\b/i.test(pathXml) &&\n (!directPathData || !directPathData.includes(\"C\"))\n ? drawingShapeHeuristicPathData(pathXml, safeWidth, safeHeight) ??\n directPathData\n : directPathData;\n const presetPathData = drawingPresetPathData(preset, safeWidth, safeHeight);\n let body = \"\";\n\n if (preset === \"line\") {\n body = `<line x1=\"0\" y1=\"${Math.round(\n safeHeight / 2\n )}\" x2=\"${safeWidth}\" y2=\"${Math.round(\n safeHeight / 2\n )}\" ${stroke} fill=\"none\"${rotationLayout.transformAttribute}/>`;\n } else if (pathData) {\n body = `<path d=\"${pathData}\" ${fill.fillAttribute} ${stroke}${rotationLayout.transformAttribute}/>`;\n } else if (presetPathData) {\n body = `<path d=\"${presetPathData}\" ${fill.fillAttribute} ${stroke}${rotationLayout.transformAttribute}/>`;\n } else {\n body = `<rect x=\"0\" y=\"0\" width=\"${safeWidth}\" height=\"${safeHeight}\" ${fill.fillAttribute} ${stroke}${rotationLayout.transformAttribute}/>`;\n }\n\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${safeWidth}\" height=\"${safeHeight}\" viewBox=\"0 0 ${\n rotationLayout.viewBoxWidthPx\n } ${rotationLayout.viewBoxHeightPx}\"${\n rotationLayout.preserveAspectRatio\n ? ` preserveAspectRatio=\"${rotationLayout.preserveAspectRatio}\"`\n : \"\"\n }><defs>${fill.defs.join(\"\")}</defs>${body}</svg>`;\n}\n\nfunction getAttribute(tagXml: string, attribute: string): string | undefined {\n const escapedAttribute = attribute.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const match = tagXml.match(\n new RegExp(`${escapedAttribute}=(?:\"([^\"]+)\"|'([^']+)')`, \"i\")\n );\n return match?.[1] ?? match?.[2];\n}\n\nfunction parseIntegerAttribute(\n tagXml: string,\n attribute: string\n): number | undefined {\n const raw = getAttribute(tagXml, attribute);\n if (!raw) {\n return undefined;\n }\n\n const parsed = Number(raw);\n if (!Number.isFinite(parsed)) {\n return undefined;\n }\n\n return Math.round(parsed);\n}\n\nfunction parseParagraphNumberingFromXml(\n xml: string\n): ParagraphNumbering | undefined {\n if (!xml) {\n return undefined;\n }\n\n const numberingXml =\n extractBalancedTagBlocks(xml, \"w:numPr\")[0] ??\n xml.match(/<w:numPr\\b[^>]*\\/>/i)?.[0] ??\n \"\";\n if (!numberingXml) {\n return undefined;\n }\n\n const numIdRaw = numberingXml.match(/<w:numId\\b[^>]*w:val=\"(-?\\d+)\"/i)?.[1];\n if (!numIdRaw) {\n return undefined;\n }\n\n const numId = Number(numIdRaw);\n if (!Number.isFinite(numId) || numId <= 0) {\n return undefined;\n }\n\n const ilvlRaw = numberingXml.match(/<w:ilvl\\b[^>]*w:val=\"(-?\\d+)\"/i)?.[1];\n const ilvlValue = ilvlRaw ? Number(ilvlRaw) : 0;\n\n return {\n numId: Math.round(numId),\n ilvl: Number.isFinite(ilvlValue) ? Math.max(0, Math.round(ilvlValue)) : 0,\n };\n}\n\nfunction parseParagraphSpacingFromXml(\n xml: string\n): ParagraphSpacing | undefined {\n if (!xml) {\n return undefined;\n }\n\n const spacingTag = xml.match(/<w:spacing\\b[^>]*\\/?>/i)?.[0];\n if (!spacingTag) {\n return undefined;\n }\n\n const lineRuleRaw = getAttribute(spacingTag, \"w:lineRule\")?.toLowerCase();\n const lineRule =\n lineRuleRaw === \"auto\" ||\n lineRuleRaw === \"exact\" ||\n lineRuleRaw === \"atleast\"\n ? lineRuleRaw === \"atleast\"\n ? \"atLeast\"\n : lineRuleRaw\n : undefined;\n\n const spacing: ParagraphSpacing = {\n beforeTwips: parseIntegerAttribute(spacingTag, \"w:before\"),\n afterTwips: parseIntegerAttribute(spacingTag, \"w:after\"),\n lineTwips: parseIntegerAttribute(spacingTag, \"w:line\"),\n lineRule,\n };\n\n if (\n spacing.beforeTwips === undefined &&\n spacing.afterTwips === undefined &&\n spacing.lineTwips === undefined &&\n spacing.lineRule === undefined\n ) {\n return undefined;\n }\n\n return spacing;\n}\n\nfunction parseParagraphIndentFromXml(xml: string): ParagraphIndent | undefined {\n if (!xml) {\n return undefined;\n }\n\n const indentTag = xml.match(/<w:ind\\b[^>]*\\/?>/i)?.[0];\n if (!indentTag) {\n return undefined;\n }\n\n const indent: ParagraphIndent = {\n leftTwips: parseIntegerAttribute(indentTag, \"w:left\"),\n rightTwips: parseIntegerAttribute(indentTag, \"w:right\"),\n firstLineTwips: parseIntegerAttribute(indentTag, \"w:firstLine\"),\n hangingTwips: parseIntegerAttribute(indentTag, \"w:hanging\"),\n };\n\n if (\n indent.leftTwips === undefined &&\n indent.rightTwips === undefined &&\n indent.firstLineTwips === undefined &&\n indent.hangingTwips === undefined\n ) {\n return undefined;\n }\n\n return indent;\n}\n\nfunction normalizeTabStopAlignment(\n value?: string\n): ParagraphTabStop[\"alignment\"] | undefined {\n if (!value) {\n return undefined;\n }\n\n const normalized = value.toLowerCase();\n if (\n normalized === \"left\" ||\n normalized === \"center\" ||\n normalized === \"right\" ||\n normalized === \"decimal\" ||\n normalized === \"bar\"\n ) {\n return normalized;\n }\n\n return undefined;\n}\n\nfunction normalizeTabStopLeader(\n value?: string\n): ParagraphTabStop[\"leader\"] | undefined {\n if (!value) {\n return undefined;\n }\n\n const normalized = value.toLowerCase();\n if (\n normalized === \"none\" ||\n normalized === \"dot\" ||\n normalized === \"hyphen\" ||\n normalized === \"underscore\" ||\n normalized === \"middleDot\"\n ) {\n return normalized as ParagraphTabStop[\"leader\"];\n }\n\n return undefined;\n}\n\nfunction parseParagraphTabStopsFromXml(xml: string): ParagraphTabStop[] {\n if (!xml) {\n return [];\n }\n\n const tabsTag = xml.match(\n /<w:tabs\\b[^>]*>[\\s\\S]*?<\\/w:tabs>|<w:tabs\\b[^>]*\\/>/i\n )?.[0];\n const tabsXml = tabsTag ?? \"\";\n if (!tabsXml) {\n return [];\n }\n\n const tabStops: ParagraphTabStop[] = [];\n for (const match of tabsXml.matchAll(/<w:tab\\b[^>]*\\/>/gi)) {\n const tabTag = match[0];\n if (!tabTag) {\n continue;\n }\n\n const alignment = normalizeTabStopAlignment(getAttribute(tabTag, \"w:val\"));\n const leader = normalizeTabStopLeader(getAttribute(tabTag, \"w:leader\"));\n const positionTwips = parseIntegerAttribute(tabTag, \"w:pos\");\n if (positionTwips === undefined) {\n continue;\n }\n\n tabStops.push({\n alignment: alignment ?? \"left\",\n leader: leader ?? \"none\",\n positionTwips,\n });\n }\n\n return tabStops.sort(\n (left, right) => (left.positionTwips ?? 0) - (right.positionTwips ?? 0)\n );\n}\n\nfunction parseParagraphShadingFromXml(xml: string): string | undefined {\n if (!xml) {\n return undefined;\n }\n\n const shadingTag = xml.match(/<w:shd\\b[^>]*\\/?>/i)?.[0];\n if (!shadingTag) {\n return undefined;\n }\n\n const fill = getAttribute(shadingTag, \"w:fill\");\n return normalizeHexColor(fill);\n}\n\nfunction parseOnOffValue(value: string | undefined): boolean | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n const normalized = value.trim().toLowerCase();\n return (\n normalized !== \"0\" &&\n normalized !== \"false\" &&\n normalized !== \"none\" &&\n normalized !== \"off\"\n );\n}\n\nfunction parseParagraphBorderStyle(\n tagXml: string | undefined\n): ParagraphBorderStyle | undefined {\n if (!tagXml) {\n return undefined;\n }\n\n const type = getAttribute(tagXml, \"w:val\")?.trim().toLowerCase();\n if (!type) {\n return undefined;\n }\n\n const sizeEighthPt = parseIntegerAttribute(tagXml, \"w:sz\");\n const spacePt = parseIntegerAttribute(tagXml, \"w:space\");\n const rawColor = getAttribute(tagXml, \"w:color\");\n const color =\n rawColor?.trim().toLowerCase() === \"auto\"\n ? \"#000000\"\n : normalizeHexColor(rawColor);\n const frame = parseOnOffValue(getAttribute(tagXml, \"w:frame\"));\n const shadow = parseOnOffValue(getAttribute(tagXml, \"w:shadow\"));\n\n return {\n type,\n ...(sizeEighthPt !== undefined && sizeEighthPt >= 0\n ? { sizeEighthPt }\n : undefined),\n ...(spacePt !== undefined && spacePt >= 0 ? { spacePt } : undefined),\n ...(color ? { color } : undefined),\n ...(frame !== undefined ? { frame } : undefined),\n ...(shadow !== undefined ? { shadow } : undefined),\n };\n}\n\nfunction parseTextRunBorderStyle(\n tagXml: string | undefined\n): TextRunBorderStyle | undefined {\n if (!tagXml) {\n return undefined;\n }\n\n const type = getAttribute(tagXml, \"w:val\")?.trim().toLowerCase();\n if (!type) {\n return undefined;\n }\n\n const sizeEighthPt = parseIntegerAttribute(tagXml, \"w:sz\");\n const spacePt = parseIntegerAttribute(tagXml, \"w:space\");\n const rawColor = getAttribute(tagXml, \"w:color\");\n const color =\n rawColor?.trim().toLowerCase() === \"auto\"\n ? undefined\n : normalizeHexColor(rawColor);\n const frame = parseOnOffValue(getAttribute(tagXml, \"w:frame\"));\n const shadow = parseOnOffValue(getAttribute(tagXml, \"w:shadow\"));\n\n return {\n type,\n ...(sizeEighthPt !== undefined && sizeEighthPt >= 0\n ? { sizeEighthPt }\n : undefined),\n ...(spacePt !== undefined && spacePt >= 0 ? { spacePt } : undefined),\n ...(color ? { color } : undefined),\n ...(frame !== undefined ? { frame } : undefined),\n ...(shadow !== undefined ? { shadow } : undefined),\n };\n}\n\nfunction parseParagraphBorderSetFromXml(\n xml: string\n): ParagraphBorderSet | undefined {\n if (!xml) {\n return undefined;\n }\n\n const paragraphBorderXml =\n extractBalancedTagBlocks(xml, \"w:pBdr\")[0] ??\n xml.match(/<w:pBdr\\b[^>]*\\/?>/i)?.[0] ??\n \"\";\n if (!paragraphBorderXml) {\n return undefined;\n }\n\n const top = parseParagraphBorderStyle(\n paragraphBorderXml.match(/<w:top\\b[^>]*\\/?>/i)?.[0]\n );\n const right = parseParagraphBorderStyle(\n paragraphBorderXml.match(/<w:right\\b[^>]*\\/?>/i)?.[0]\n );\n const bottom = parseParagraphBorderStyle(\n paragraphBorderXml.match(/<w:bottom\\b[^>]*\\/?>/i)?.[0]\n );\n const left = parseParagraphBorderStyle(\n paragraphBorderXml.match(/<w:left\\b[^>]*\\/?>/i)?.[0]\n );\n const between = parseParagraphBorderStyle(\n paragraphBorderXml.match(/<w:between\\b[^>]*\\/?>/i)?.[0]\n );\n const bar = parseParagraphBorderStyle(\n paragraphBorderXml.match(/<w:bar\\b[^>]*\\/?>/i)?.[0]\n );\n\n if (!top && !right && !bottom && !left && !between && !bar) {\n return undefined;\n }\n\n return {\n top,\n right,\n bottom,\n left,\n between,\n bar,\n };\n}\n\nfunction parseTableBoxSpacing(xml: string): TableBoxSpacing | undefined {\n const topMatch = xml.match(/<w:top\\b[^>]*>/i)?.[0];\n const rightMatch = xml.match(/<w:right\\b[^>]*>/i)?.[0];\n const bottomMatch = xml.match(/<w:bottom\\b[^>]*>/i)?.[0];\n const leftMatch = xml.match(/<w:left\\b[^>]*>/i)?.[0];\n\n const spacing: TableBoxSpacing = {\n topTwips: topMatch ? parseIntegerAttribute(topMatch, \"w:w\") : undefined,\n rightTwips: rightMatch\n ? parseIntegerAttribute(rightMatch, \"w:w\")\n : undefined,\n bottomTwips: bottomMatch\n ? parseIntegerAttribute(bottomMatch, \"w:w\")\n : undefined,\n leftTwips: leftMatch ? parseIntegerAttribute(leftMatch, \"w:w\") : undefined,\n };\n\n if (\n spacing.topTwips === undefined &&\n spacing.rightTwips === undefined &&\n spacing.bottomTwips === undefined &&\n spacing.leftTwips === undefined\n ) {\n return undefined;\n }\n\n return spacing;\n}\n\nfunction parseTableBorderStyle(\n tagXml: string | undefined\n): TableBorderStyle | undefined {\n if (!tagXml) {\n return undefined;\n }\n\n const type = getAttribute(tagXml, \"w:val\")?.trim().toLowerCase();\n if (!type) {\n return undefined;\n }\n\n const sizeEighthPt = parseIntegerAttribute(tagXml, \"w:sz\");\n const rawColor = getAttribute(tagXml, \"w:color\");\n const color =\n rawColor?.trim().toLowerCase() === \"auto\"\n ? \"#000000\"\n : normalizeHexColor(rawColor);\n\n return {\n type,\n ...(sizeEighthPt !== undefined && sizeEighthPt >= 0\n ? { sizeEighthPt }\n : undefined),\n ...(color ? { color } : undefined),\n };\n}\n\nfunction parseTableBorderSet(xml: string): TableBorderSet | undefined {\n const top = parseTableBorderStyle(xml.match(/<w:top\\b[^>]*\\/?>/i)?.[0]);\n const right = parseTableBorderStyle(xml.match(/<w:right\\b[^>]*\\/?>/i)?.[0]);\n const bottom = parseTableBorderStyle(xml.match(/<w:bottom\\b[^>]*\\/?>/i)?.[0]);\n const left = parseTableBorderStyle(xml.match(/<w:left\\b[^>]*\\/?>/i)?.[0]);\n const insideH = parseTableBorderStyle(\n xml.match(/<w:insideH\\b[^>]*\\/?>/i)?.[0]\n );\n const insideV = parseTableBorderStyle(\n xml.match(/<w:insideV\\b[^>]*\\/?>/i)?.[0]\n );\n const tl2br = parseTableBorderStyle(xml.match(/<w:tl2br\\b[^>]*\\/?>/i)?.[0]);\n const tr2bl = parseTableBorderStyle(xml.match(/<w:tr2bl\\b[^>]*\\/?>/i)?.[0]);\n\n if (\n !top &&\n !right &&\n !bottom &&\n !left &&\n !insideH &&\n !insideV &&\n !tl2br &&\n !tr2bl\n ) {\n return undefined;\n }\n\n return {\n top,\n right,\n bottom,\n left,\n insideH,\n insideV,\n tl2br,\n tr2bl,\n };\n}\n\nfunction hasTableProperties(\n properties: ParsedTableProperties | undefined\n): boolean {\n if (!properties) {\n return false;\n }\n\n return (\n properties.widthTwips !== undefined ||\n properties.indentTwips !== undefined ||\n properties.layout !== undefined ||\n properties.cellSpacingTwips !== undefined ||\n properties.floating !== undefined ||\n properties.cellMarginTwips !== undefined\n );\n}\n\nfunction parseTableStylePropertiesFromXml(\n tablePropertiesXml: string | undefined\n): ParsedTableProperties | undefined {\n if (!tablePropertiesXml) {\n return undefined;\n }\n\n const tableWidthTag = tablePropertiesXml.match(/<w:tblW\\b[^>]*>/i)?.[0];\n const tableWidthType = tableWidthTag\n ? getAttribute(tableWidthTag, \"w:type\")?.toLowerCase()\n : undefined;\n const tableWidthRaw = tableWidthTag\n ? parseIntegerAttribute(tableWidthTag, \"w:w\")\n : undefined;\n const widthTwips =\n tableWidthType === \"dxa\" && tableWidthRaw !== undefined && tableWidthRaw > 0\n ? tableWidthRaw\n : undefined;\n\n const tableIndentTag = tablePropertiesXml.match(/<w:tblInd\\b[^>]*>/i)?.[0];\n const tableIndentType = tableIndentTag\n ? getAttribute(tableIndentTag, \"w:type\")?.toLowerCase()\n : undefined;\n const tableIndentRaw = tableIndentTag\n ? parseIntegerAttribute(tableIndentTag, \"w:w\")\n : undefined;\n const indentTwips =\n tableIndentType === \"dxa\" &&\n tableIndentRaw !== undefined &&\n tableIndentRaw !== 0\n ? tableIndentRaw\n : undefined;\n\n const tableLayoutTag = tablePropertiesXml.match(/<w:tblLayout\\b[^>]*>/i)?.[0];\n const tableLayoutRaw = tableLayoutTag\n ? getAttribute(tableLayoutTag, \"w:type\")?.toLowerCase()\n : undefined;\n const layout =\n tableLayoutRaw === \"fixed\" || tableLayoutRaw === \"autofit\"\n ? tableLayoutRaw\n : undefined;\n\n const tableCellSpacingTag = tablePropertiesXml.match(\n /<w:tblCellSpacing\\b[^>]*\\/?>/i\n )?.[0];\n const tableCellSpacingType = tableCellSpacingTag\n ? getAttribute(tableCellSpacingTag, \"w:type\")?.toLowerCase()\n : undefined;\n const tableCellSpacingRaw = tableCellSpacingTag\n ? parseIntegerAttribute(tableCellSpacingTag, \"w:w\")\n : undefined;\n const cellSpacingTwips =\n tableCellSpacingType === \"dxa\" &&\n tableCellSpacingRaw !== undefined &&\n tableCellSpacingRaw >= 0\n ? tableCellSpacingRaw\n : undefined;\n\n const tableCellMarginXml = tablePropertiesXml.match(\n /<w:tblCellMar\\b[\\s\\S]*?<\\/w:tblCellMar>|<w:tblCellMar\\b[^>]*\\/>/i\n )?.[0];\n const cellMarginTwips = tableCellMarginXml\n ? parseTableBoxSpacing(tableCellMarginXml)\n : undefined;\n const floating = parseFloatingTableStyle(tablePropertiesXml);\n\n return {\n ...(widthTwips !== undefined ? { widthTwips } : undefined),\n ...(indentTwips !== undefined ? { indentTwips } : undefined),\n ...(layout !== undefined ? { layout } : undefined),\n ...(cellSpacingTwips !== undefined ? { cellSpacingTwips } : undefined),\n ...(cellMarginTwips !== undefined ? { cellMarginTwips } : undefined),\n ...(floating !== undefined ? { floating } : undefined),\n };\n}\n\nfunction mergeTableStyleProperties(\n inherited: ParsedTableProperties | undefined,\n direct: ParsedTableProperties | undefined\n): ParsedTableProperties | undefined {\n if (!inherited && !direct) {\n return undefined;\n }\n\n const merged: ParsedTableProperties = {\n widthTwips: direct?.widthTwips ?? inherited?.widthTwips,\n indentTwips: direct?.indentTwips ?? inherited?.indentTwips,\n layout: direct?.layout ?? inherited?.layout,\n cellSpacingTwips: direct?.cellSpacingTwips ?? inherited?.cellSpacingTwips,\n floating: direct?.floating ?? inherited?.floating,\n cellMarginTwips:\n direct?.cellMarginTwips !== undefined\n ? { ...direct.cellMarginTwips }\n : inherited?.cellMarginTwips !== undefined\n ? { ...inherited.cellMarginTwips }\n : undefined,\n };\n\n if (!hasTableProperties(merged)) {\n return undefined;\n }\n\n return merged;\n}\n\nconst DEFAULT_TABLE_LOOK: ParsedTableLook = {\n firstRow: false,\n lastRow: false,\n firstCol: false,\n lastCol: false,\n noHBand: true,\n noVBand: true,\n rowBandSize: 1,\n colBandSize: 1,\n};\n\nfunction mergeTableLook(\n direct: ParsedTableLook | undefined,\n inherited: ParsedTableLook | undefined\n): ParsedTableLook {\n return {\n ...DEFAULT_TABLE_LOOK,\n ...(inherited ?? {}),\n ...(direct ?? {}),\n };\n}\n\nconst TABLE_CONDITIONAL_STYLE_TYPES: TableConditionalStyleType[] = [\n \"wholeTable\",\n \"firstRow\",\n \"lastRow\",\n \"firstCol\",\n \"lastCol\",\n \"band1Horz\",\n \"band2Horz\",\n \"band1Vert\",\n \"band2Vert\",\n \"nwCell\",\n \"neCell\",\n \"swCell\",\n \"seCell\",\n];\n\nfunction normalizeTableConditionalStyleType(\n value?: string\n): TableConditionalStyleType | undefined {\n const normalized = value?.trim().toLowerCase();\n if (!normalized) {\n return undefined;\n }\n\n switch (normalized) {\n case \"wholtable\":\n case \"wholetable\":\n return \"wholeTable\";\n case \"firstrow\":\n return \"firstRow\";\n case \"lastrow\":\n return \"lastRow\";\n case \"firstcol\":\n return \"firstCol\";\n case \"lastcol\":\n return \"lastCol\";\n case \"band1horz\":\n return \"band1Horz\";\n case \"band2horz\":\n return \"band2Horz\";\n case \"band1vert\":\n return \"band1Vert\";\n case \"band2vert\":\n return \"band2Vert\";\n case \"nwcell\":\n return \"nwCell\";\n case \"necell\":\n return \"neCell\";\n case \"swcell\":\n return \"swCell\";\n case \"secell\":\n return \"seCell\";\n default:\n return undefined;\n }\n}\n\nfunction parseTableConditionalStyleFromXml(\n xml: string,\n themeFonts: ThemeFontMap\n): ParsedTableStyleCondition | undefined {\n if (!xml) {\n return undefined;\n }\n\n const tablePropertiesXml = extractBalancedTagBlocks(xml, \"w:tblPr\")[0] ?? \"\";\n const paragraphPropertiesXml =\n extractBalancedTagBlocks(xml, \"w:pPr\")[0] ?? \"\";\n const rowPropertiesXml = extractBalancedTagBlocks(xml, \"w:trPr\")[0] ?? \"\";\n const cellPropertiesXml = extractBalancedTagBlocks(xml, \"w:tcPr\")[0] ?? \"\";\n const runPropertiesXml = resolveStylePropertiesBlock(xml, \"w:rPr\");\n const tableLook = parseTableLook(tablePropertiesXml);\n const paragraphAlignmentMatch = paragraphPropertiesXml.match(\n /<w:jc\\b[^>]*w:val=\"([^\"]+)\"/i\n );\n const paragraphAlign = normalizeAlignment(paragraphAlignmentMatch?.[1]);\n\n const rowShadingTag = rowPropertiesXml.match(/<w:shd\\b[^>]*\\/?>/i)?.[0];\n const cellShadingTag =\n cellPropertiesXml.match(/<w:shd\\b[^>]*\\/?>/i)?.[0] ??\n tablePropertiesXml.match(/<w:shd\\b[^>]*\\/?>/i)?.[0];\n const rowBackgroundColor = normalizeHexColor(\n rowShadingTag ? getAttribute(rowShadingTag, \"w:fill\") : undefined\n );\n const cellBackgroundColor = normalizeHexColor(\n cellShadingTag ? getAttribute(cellShadingTag, \"w:fill\") : undefined\n );\n const runStyle = parseTextStyleFromXml(runPropertiesXml, themeFonts);\n const tableBordersXml = tablePropertiesXml.match(\n /<w:tblBorders\\b[\\s\\S]*?<\\/w:tblBorders>|<w:tblBorders\\b[^>]*\\/>/i\n )?.[0];\n const cellBordersXml = cellPropertiesXml.match(\n /<w:tcBorders\\b[\\s\\S]*?<\\/w:tcBorders>|<w:tcBorders\\b[^>]*\\/>/i\n )?.[0];\n const tableBorders = tableBordersXml\n ? parseTableBorderSet(tableBordersXml)\n : undefined;\n const cellBorders = cellBordersXml\n ? parseTableBorderSet(cellBordersXml)\n : undefined;\n const tableProperties = parseTableStylePropertiesFromXml(tablePropertiesXml);\n\n if (\n rowBackgroundColor === undefined &&\n cellBackgroundColor === undefined &&\n paragraphAlign === undefined &&\n runStyle === undefined &&\n tableBorders === undefined &&\n cellBorders === undefined &&\n !hasTableProperties(tableProperties) &&\n !tableLook\n ) {\n return undefined;\n }\n\n return {\n rowBackgroundColor,\n cellBackgroundColor,\n paragraphAlign,\n runStyle,\n tableBorders,\n cellBorders,\n tableProperties,\n tableLook,\n };\n}\n\nfunction mergeTableBorderSets(\n inherited: TableBorderSet | undefined,\n direct: TableBorderSet | undefined\n): TableBorderSet | undefined {\n if (!inherited && !direct) {\n return undefined;\n }\n\n const merged: TableBorderSet = {\n top: direct?.top ?? inherited?.top,\n right: direct?.right ?? inherited?.right,\n bottom: direct?.bottom ?? inherited?.bottom,\n left: direct?.left ?? inherited?.left,\n insideH: direct?.insideH ?? inherited?.insideH,\n insideV: direct?.insideV ?? inherited?.insideV,\n tl2br: direct?.tl2br ?? inherited?.tl2br,\n tr2bl: direct?.tr2bl ?? inherited?.tr2bl,\n };\n\n if (\n !merged.top &&\n !merged.right &&\n !merged.bottom &&\n !merged.left &&\n !merged.insideH &&\n !merged.insideV &&\n !merged.tl2br &&\n !merged.tr2bl\n ) {\n return undefined;\n }\n\n return merged;\n}\n\nfunction mergeTableConditionalStyle(\n inherited: ParsedTableStyleCondition | undefined,\n direct: ParsedTableStyleCondition | undefined\n): ParsedTableStyleCondition | undefined {\n if (!inherited && !direct) {\n return undefined;\n }\n\n const merged: ParsedTableStyleCondition = {\n rowBackgroundColor:\n direct?.rowBackgroundColor ?? inherited?.rowBackgroundColor,\n cellBackgroundColor:\n direct?.cellBackgroundColor ?? inherited?.cellBackgroundColor,\n paragraphAlign: direct?.paragraphAlign ?? inherited?.paragraphAlign,\n runStyle: mergeTextStyles(inherited?.runStyle, direct?.runStyle),\n tableBorders: mergeTableBorderSets(\n inherited?.tableBorders,\n direct?.tableBorders\n ),\n cellBorders: mergeTableBorderSets(\n inherited?.cellBorders,\n direct?.cellBorders\n ),\n tableProperties: mergeTableStyleProperties(\n inherited?.tableProperties,\n direct?.tableProperties\n ),\n tableLook: mergeTableLook(direct?.tableLook, inherited?.tableLook),\n };\n\n if (\n merged.rowBackgroundColor === undefined &&\n merged.cellBackgroundColor === undefined &&\n merged.paragraphAlign === undefined &&\n merged.runStyle === undefined &&\n merged.tableBorders === undefined &&\n merged.cellBorders === undefined &&\n merged.tableProperties === undefined &&\n merged.tableLook === undefined\n ) {\n return undefined;\n }\n\n return merged;\n}\n\nconst EMPTY_STYLE_SHEET: ParsedStyleSheet = {\n paragraphStyles: [],\n paragraphStyleById: new Map(),\n runStyleById: new Map(),\n tableStyleById: new Map(),\n themeColors: {},\n themeFonts: {},\n};\n\nfunction mergeTextStyles(\n ...styles: Array<TextStyle | undefined>\n): TextStyle | undefined {\n const merged: TextStyle = {};\n\n for (const style of styles) {\n if (!style) {\n continue;\n }\n\n if (style.bold !== undefined) {\n merged.bold = style.bold;\n }\n if (style.italic !== undefined) {\n merged.italic = style.italic;\n }\n if (style.underline !== undefined) {\n merged.underline = style.underline;\n }\n if (style.strike !== undefined) {\n merged.strike = style.strike;\n }\n if (style.color !== undefined) {\n merged.color = style.color;\n }\n if (style.highlight !== undefined) {\n merged.highlight = style.highlight;\n }\n if (style.backgroundColor !== undefined) {\n merged.backgroundColor = style.backgroundColor;\n }\n if (style.fontSizePt !== undefined) {\n merged.fontSizePt = style.fontSizePt;\n }\n if (style.fontFamily !== undefined) {\n merged.fontFamily = style.fontFamily;\n }\n if (style.characterSpacingTwips !== undefined) {\n merged.characterSpacingTwips = style.characterSpacingTwips;\n }\n if (style.verticalAlign !== undefined) {\n merged.verticalAlign = style.verticalAlign;\n }\n if (style.runBorder !== undefined) {\n merged.runBorder = { ...style.runBorder };\n }\n }\n\n return Object.keys(merged).length > 0 ? merged : undefined;\n}\n\nfunction mergeParagraphSpacing(\n inherited: ParagraphSpacing | undefined,\n direct: ParagraphSpacing | undefined\n): ParagraphSpacing | undefined {\n if (!inherited && !direct) {\n return undefined;\n }\n\n const merged: ParagraphSpacing = {\n beforeTwips: direct?.beforeTwips ?? inherited?.beforeTwips,\n afterTwips: direct?.afterTwips ?? inherited?.afterTwips,\n lineTwips: direct?.lineTwips ?? inherited?.lineTwips,\n lineRule: direct?.lineRule ?? inherited?.lineRule,\n };\n\n if (\n merged.beforeTwips === undefined &&\n merged.afterTwips === undefined &&\n merged.lineTwips === undefined &&\n merged.lineRule === undefined\n ) {\n return undefined;\n }\n\n return merged;\n}\n\nfunction mergeParagraphIndent(\n inherited: ParagraphIndent | undefined,\n direct: ParagraphIndent | undefined\n): ParagraphIndent | undefined {\n if (!inherited && !direct) {\n return undefined;\n }\n\n const merged: ParagraphIndent = {\n leftTwips: direct?.leftTwips ?? inherited?.leftTwips,\n rightTwips: direct?.rightTwips ?? inherited?.rightTwips,\n firstLineTwips: direct?.firstLineTwips ?? inherited?.firstLineTwips,\n hangingTwips: direct?.hangingTwips ?? inherited?.hangingTwips,\n };\n\n if (\n merged.leftTwips === undefined &&\n merged.rightTwips === undefined &&\n merged.firstLineTwips === undefined &&\n merged.hangingTwips === undefined\n ) {\n return undefined;\n }\n\n return merged;\n}\n\nfunction mergeParagraphBackgroundColor(\n inherited: string | undefined,\n direct: string | undefined\n): string | undefined {\n return direct ?? inherited;\n}\n\nfunction mergeParagraphBorderStyle(\n inherited: ParagraphBorderStyle | undefined,\n direct: ParagraphBorderStyle | undefined\n): ParagraphBorderStyle | undefined {\n if (!inherited && !direct) {\n return undefined;\n }\n\n const type = direct?.type ?? inherited?.type;\n if (!type) {\n return undefined;\n }\n\n return {\n type,\n color: direct?.color ?? inherited?.color,\n sizeEighthPt: direct?.sizeEighthPt ?? inherited?.sizeEighthPt,\n spacePt: direct?.spacePt ?? inherited?.spacePt,\n frame: direct?.frame ?? inherited?.frame,\n shadow: direct?.shadow ?? inherited?.shadow,\n };\n}\n\nfunction mergeParagraphBorderSets(\n inherited: ParagraphBorderSet | undefined,\n direct: ParagraphBorderSet | undefined\n): ParagraphBorderSet | undefined {\n if (!inherited && !direct) {\n return undefined;\n }\n\n const merged: ParagraphBorderSet = {\n top: mergeParagraphBorderStyle(inherited?.top, direct?.top),\n right: mergeParagraphBorderStyle(inherited?.right, direct?.right),\n bottom: mergeParagraphBorderStyle(inherited?.bottom, direct?.bottom),\n left: mergeParagraphBorderStyle(inherited?.left, direct?.left),\n between: mergeParagraphBorderStyle(inherited?.between, direct?.between),\n bar: mergeParagraphBorderStyle(inherited?.bar, direct?.bar),\n };\n\n if (\n !merged.top &&\n !merged.right &&\n !merged.bottom &&\n !merged.left &&\n !merged.between &&\n !merged.bar\n ) {\n return undefined;\n }\n\n return merged;\n}\n\nfunction mergeParagraphTabStops(\n inherited: ParagraphTabStop[] | undefined,\n direct: ParagraphTabStop[] | undefined\n): ParagraphTabStop[] | undefined {\n if (!inherited && !direct) {\n return undefined;\n }\n\n const combined: ParagraphTabStop[] = [];\n const byPosition = new Map<number, ParagraphTabStop>();\n\n for (const stop of inherited ?? []) {\n if (stop.positionTwips === undefined) {\n continue;\n }\n byPosition.set(stop.positionTwips, stop);\n }\n\n for (const stop of direct ?? []) {\n if (stop.positionTwips === undefined) {\n continue;\n }\n byPosition.set(stop.positionTwips, stop);\n }\n\n for (const stop of byPosition.values()) {\n combined.push(stop);\n }\n\n return combined.length > 0\n ? combined.sort(\n (left, right) => (left.positionTwips ?? 0) - (right.positionTwips ?? 0)\n )\n : undefined;\n}\n\nfunction mergeParagraphBoolean(\n inherited: boolean | undefined,\n direct: boolean | undefined\n): boolean | undefined {\n if (direct !== undefined) {\n return direct;\n }\n\n return inherited;\n}\n\nfunction parseParagraphDropCapFromXml(\n paragraphPropertiesXml: string\n): NonNullable<ParagraphStyle[\"dropCap\"]> | undefined {\n const framePrTag =\n paragraphPropertiesXml.match(/<w:framePr\\b[^>]*\\/?>/i)?.[0] ?? \"\";\n if (!framePrTag) {\n return undefined;\n }\n\n const dropCapRaw = getAttribute(framePrTag, \"w:dropCap\")\n ?.trim()\n .toLowerCase();\n if (dropCapRaw !== \"drop\" && dropCapRaw !== \"margin\") {\n return undefined;\n }\n\n const lines = parseIntegerAttribute(framePrTag, \"w:lines\");\n const wrap = getAttribute(framePrTag, \"w:wrap\")?.trim();\n const horizontalAnchor = getAttribute(framePrTag, \"w:hAnchor\")?.trim();\n const verticalAnchor = getAttribute(framePrTag, \"w:vAnchor\")?.trim();\n const xTwips = parseIntegerAttribute(framePrTag, \"w:x\");\n const yTwips = parseIntegerAttribute(framePrTag, \"w:y\");\n const horizontalSpaceTwips = parseIntegerAttribute(framePrTag, \"w:hSpace\");\n const verticalSpaceTwips = parseIntegerAttribute(framePrTag, \"w:vSpace\");\n\n return {\n type: dropCapRaw,\n ...(Number.isFinite(lines) && (lines as number) > 0\n ? { lines: Math.round(lines as number) }\n : undefined),\n ...(wrap ? { wrap } : undefined),\n ...(horizontalAnchor ? { horizontalAnchor } : undefined),\n ...(verticalAnchor ? { verticalAnchor } : undefined),\n ...(xTwips !== undefined ? { xTwips } : undefined),\n ...(yTwips !== undefined ? { yTwips } : undefined),\n ...(horizontalSpaceTwips !== undefined\n ? { horizontalSpaceTwips }\n : undefined),\n ...(verticalSpaceTwips !== undefined ? { verticalSpaceTwips } : undefined),\n };\n}\n\nfunction resolveThemeFont(\n themeToken: string | undefined,\n themeFonts: ThemeFontMap\n): string | undefined {\n if (!themeToken) {\n return undefined;\n }\n\n const normalized = themeToken.toLowerCase();\n if (normalized.startsWith(\"major\")) {\n if (normalized.includes(\"eastasia\")) {\n return themeFonts.majorEastAsia ?? themeFonts.majorLatin;\n }\n if (normalized.includes(\"bidi\") || normalized.includes(\"cs\")) {\n return themeFonts.majorComplexScript ?? themeFonts.majorLatin;\n }\n return themeFonts.majorLatin;\n }\n if (normalized.startsWith(\"minor\")) {\n if (normalized.includes(\"eastasia\")) {\n return themeFonts.minorEastAsia ?? themeFonts.minorLatin;\n }\n if (normalized.includes(\"bidi\") || normalized.includes(\"cs\")) {\n return themeFonts.minorComplexScript ?? themeFonts.minorLatin;\n }\n return themeFonts.minorLatin;\n }\n\n return undefined;\n}\n\nfunction parseTextStyleFromXml(\n xml: string,\n themeFonts: ThemeFontMap = {}\n): TextStyle | undefined {\n if (!xml) {\n return undefined;\n }\n\n const bold = parseOnOffAttribute(xml, \"b\");\n const italic = parseOnOffAttribute(xml, \"i\");\n const underline = parseUnderlineAttribute(xml);\n const strike = parseOnOffAttribute(xml, \"strike\");\n\n const colorMatch = xml.match(/<w:color\\b[^>]*w:val=\"([^\"]+)\"/i);\n const highlightMatch = xml.match(/<w:highlight\\b[^>]*w:val=\"([^\"]+)\"/i);\n const shadingTag = xml.match(/<w:shd\\b[^>]*\\/?>/i)?.[0];\n const characterSpacingMatch = xml.match(/<w:spacing\\b[^>]*w:val=\"(-?\\d+)\"/i);\n const sizeMatch =\n xml.match(/<w:sz\\b[^>]*w:val=\"(\\d+)\"/i) ??\n xml.match(/<w:szCs\\b[^>]*w:val=\"(\\d+)\"/i);\n const runFontsTag = xml.match(/<w:rFonts\\b[^>]*\\/?>/i)?.[0] ?? \"\";\n const asciiFont = runFontsTag\n ? getAttribute(runFontsTag, \"w:ascii\")\n : undefined;\n const hAnsiFont = runFontsTag\n ? getAttribute(runFontsTag, \"w:hAnsi\")\n : undefined;\n const eastAsiaFont = runFontsTag\n ? getAttribute(runFontsTag, \"w:eastAsia\")\n : undefined;\n const complexScriptFont = runFontsTag\n ? getAttribute(runFontsTag, \"w:cs\")\n : undefined;\n const asciiThemeFont = runFontsTag\n ? getAttribute(runFontsTag, \"w:asciiTheme\")\n : undefined;\n const hAnsiThemeFont = runFontsTag\n ? getAttribute(runFontsTag, \"w:hAnsiTheme\")\n : undefined;\n const eastAsiaThemeFont = runFontsTag\n ? getAttribute(runFontsTag, \"w:eastAsiaTheme\")\n : undefined;\n const complexScriptThemeFont = runFontsTag\n ? getAttribute(runFontsTag, \"w:csTheme\")\n : undefined;\n const verticalAlignMatch = xml.match(/<w:vertAlign\\b[^>]*w:val=\"([^\"]+)\"/i);\n const drawingBoldMatch = xml.match(/<a:rPr\\b[^>]*\\bb=\"([^\"]+)\"/i);\n const drawingItalicMatch = xml.match(/<a:rPr\\b[^>]*\\bi=\"([^\"]+)\"/i);\n const drawingUnderlineMatch = xml.match(/<a:rPr\\b[^>]*\\bu=\"([^\"]+)\"/i);\n const drawingStrikeMatch = xml.match(\n /<a:rPr\\b[^>]*\\b(?:strike|s)=\"([^\"]+)\"/i\n );\n const drawingColorMatch = xml.match(\n /<a:rPr\\b[\\s\\S]*?<a:(?:solidFill|srgbClr)\\b[\\s\\S]*?<a:srgbClr\\b[^>]*val=\"([^\"]+)\"/i\n );\n const drawingSizeMatch = xml.match(/<a:rPr\\b[^>]*\\bsz=\"(\\d+)\"/i);\n const drawingFontMatch = xml.match(\n /<a:rPr\\b[\\s\\S]*?<a:latin\\b[^>]*typeface=\"([^\"]+)\"/i\n );\n const drawingDefaultFontMatch = xml.match(\n /<a:defRPr\\b[\\s\\S]*?<a:latin\\b[^>]*typeface=\"([^\"]+)\"/i\n );\n const drawingAnyLatinMatch = xml.match(/<a:latin\\b[^>]*typeface=\"([^\"]+)\"/i);\n const runBorderTag = xml.match(/<w:bdr\\b[^>]*\\/?>/i)?.[0];\n const decodedTextSamples = [\n ...xml.matchAll(/<(?:w|a):t\\b[^>]*>([\\s\\S]*?)<\\/(?:w|a):t>/gi),\n ]\n .map((match) => decodeXmlEntities(match[1] ?? \"\"))\n .join(\"\");\n const containsEastAsiaGlyphs =\n /[\\u2e80-\\u9fff\\u3040-\\u30ff\\uac00-\\ud7af]/i.test(decodedTextSamples);\n const containsComplexScriptGlyphs = /[\\u0590-\\u08ff\\ufb1d-\\ufefc]/i.test(\n decodedTextSamples\n );\n\n const style: TextStyle = {};\n if (bold !== undefined) {\n style.bold = bold;\n }\n if (italic !== undefined) {\n style.italic = italic;\n }\n if (underline !== undefined) {\n style.underline = underline;\n }\n if (strike !== undefined) {\n style.strike = strike;\n }\n if (style.bold === undefined && drawingBoldMatch?.[1]) {\n const value = drawingBoldMatch[1].toLowerCase();\n style.bold = value !== \"0\" && value !== \"false\";\n }\n if (style.italic === undefined && drawingItalicMatch?.[1]) {\n const value = drawingItalicMatch[1].toLowerCase();\n style.italic = value !== \"0\" && value !== \"false\";\n }\n if (style.underline === undefined && drawingUnderlineMatch?.[1]) {\n const value = drawingUnderlineMatch[1].toLowerCase();\n style.underline = value !== \"none\" && value !== \"false\" && value !== \"0\";\n }\n if (style.strike === undefined && drawingStrikeMatch?.[1]) {\n const value = drawingStrikeMatch[1].toLowerCase();\n style.strike =\n value !== \"nostrike\" &&\n value !== \"none\" &&\n value !== \"false\" &&\n value !== \"0\";\n }\n\n const color = normalizeHexColor(colorMatch?.[1]);\n if (color) {\n style.color = color;\n } else {\n const drawingColor = normalizeHexColor(drawingColorMatch?.[1]);\n if (drawingColor) {\n style.color = drawingColor;\n }\n }\n\n if (highlightMatch?.[1]) {\n style.highlight = highlightMatch[1];\n }\n\n const shadingFill = normalizeHexColor(\n shadingTag ? getAttribute(shadingTag, \"w:fill\") : undefined\n );\n if (shadingFill) {\n style.backgroundColor = shadingFill;\n }\n\n if (characterSpacingMatch?.[1]) {\n style.characterSpacingTwips = Number(characterSpacingMatch[1]);\n }\n\n if (sizeMatch?.[1]) {\n style.fontSizePt = Number(sizeMatch[1]) / 2;\n } else if (drawingSizeMatch?.[1]) {\n style.fontSizePt = Number(drawingSizeMatch[1]) / 100;\n }\n\n const runFontFamily = asciiFont ?? hAnsiFont;\n const runThemeFontToken = asciiThemeFont ?? hAnsiThemeFont;\n const eastAsiaFallbackFont = containsEastAsiaGlyphs\n ? eastAsiaFont\n : undefined;\n const eastAsiaFallbackThemeToken = containsEastAsiaGlyphs\n ? eastAsiaThemeFont\n : undefined;\n const complexScriptFallbackFont = containsComplexScriptGlyphs\n ? complexScriptFont\n : undefined;\n const complexScriptFallbackThemeToken = containsComplexScriptGlyphs\n ? complexScriptThemeFont\n : undefined;\n const symbolFallbackFont =\n (eastAsiaFont ?? complexScriptFont) &&\n /(symbol|emoji|dingbats?|wingdings|webdings)/i.test(\n eastAsiaFont ?? complexScriptFont ?? \"\"\n )\n ? eastAsiaFont ?? complexScriptFont\n : undefined;\n\n if (runFontFamily) {\n style.fontFamily = runFontFamily;\n } else if (runThemeFontToken) {\n const themeFontFamily = resolveThemeFont(runThemeFontToken, themeFonts);\n if (themeFontFamily) {\n style.fontFamily = themeFontFamily;\n }\n } else if (eastAsiaFallbackFont) {\n style.fontFamily = eastAsiaFallbackFont;\n } else if (eastAsiaFallbackThemeToken) {\n const themeFontFamily = resolveThemeFont(\n eastAsiaFallbackThemeToken,\n themeFonts\n );\n if (themeFontFamily) {\n style.fontFamily = themeFontFamily;\n }\n } else if (complexScriptFallbackFont) {\n style.fontFamily = complexScriptFallbackFont;\n } else if (complexScriptFallbackThemeToken) {\n const themeFontFamily = resolveThemeFont(\n complexScriptFallbackThemeToken,\n themeFonts\n );\n if (themeFontFamily) {\n style.fontFamily = themeFontFamily;\n }\n } else if (symbolFallbackFont) {\n style.fontFamily = symbolFallbackFont;\n } else if (drawingFontMatch?.[1]) {\n style.fontFamily = drawingFontMatch[1];\n } else if (drawingDefaultFontMatch?.[1]) {\n style.fontFamily = drawingDefaultFontMatch[1];\n } else if (drawingAnyLatinMatch?.[1]) {\n style.fontFamily = drawingAnyLatinMatch[1];\n }\n\n const verticalAlignValue = verticalAlignMatch?.[1]?.toLowerCase();\n if (\n verticalAlignValue === \"superscript\" ||\n verticalAlignValue === \"subscript\"\n ) {\n style.verticalAlign = verticalAlignValue;\n }\n\n const runBorder = parseTextRunBorderStyle(runBorderTag);\n if (runBorder) {\n style.runBorder = runBorder;\n }\n\n return Object.keys(style).length > 0 ? style : undefined;\n}\n\nfunction parseParagraphAlignFromXml(\n xml: string\n): ParagraphAlignment | undefined {\n const alignmentMatch = xml.match(/<w:jc\\b[^>]*w:val=\"([^\"]+)\"/i);\n return normalizeAlignment(alignmentMatch?.[1]);\n}\n\nfunction parseHeadingLevelFromOutline(xml: string): HeadingLevel | undefined {\n const outlineMatch = xml.match(/<w:outlineLvl\\b[^>]*w:val=\"([0-5])\"/i);\n if (!outlineMatch?.[1]) {\n return undefined;\n }\n\n const level = Number(outlineMatch[1]) + 1;\n if (level >= 1 && level <= 6) {\n return level as HeadingLevel;\n }\n\n return undefined;\n}\n\nfunction parseStyleType(\n value?: string\n): RawStyleDefinition[\"type\"] | undefined {\n if (!value) {\n return undefined;\n }\n\n const normalized = value.toLowerCase();\n if (\n normalized === \"paragraph\" ||\n normalized === \"character\" ||\n normalized === \"numbering\" ||\n normalized === \"table\"\n ) {\n return normalized;\n }\n\n return undefined;\n}\n\nfunction resolveStylePropertiesBlock(\n styleXml: string,\n tagName: \"w:pPr\" | \"w:rPr\"\n): string {\n const balanced = extractBalancedTagBlocks(styleXml, tagName)[0];\n if (balanced) {\n return balanced;\n }\n\n return styleXml.match(new RegExp(`<${tagName}\\\\b[^>]*\\\\/?>`, \"i\"))?.[0] ?? \"\";\n}\n\nfunction stripTableConditionalStyleBlocks(styleXml: string): string {\n if (!styleXml) {\n return styleXml;\n }\n\n return styleXml\n .replace(/<w:tblStylePr\\b[\\s\\S]*?<\\/w:tblStylePr>/gi, \"\")\n .replace(/<w:tblStylePr\\b[^>]*\\/>/gi, \"\");\n}\n\nfunction parseThemeFonts(pkg: OoxmlPackage): ThemeFontMap {\n const themeXml = pkg.parts.get(\"word/theme/theme1.xml\")?.content;\n if (!themeXml) {\n return {};\n }\n\n const readTypeface = (\n xml: string,\n tagName: \"latin\" | \"ea\" | \"cs\"\n ): string | undefined => {\n const value = xml\n .match(new RegExp(`<a:${tagName}\\\\b[^>]*typeface=\"([^\"]*)\"`, \"i\"))?.[1]\n ?.trim();\n return value ? value : undefined;\n };\n\n const majorFontXml =\n extractBalancedTagBlocks(themeXml, \"a:majorFont\")[0] ?? \"\";\n const minorFontXml =\n extractBalancedTagBlocks(themeXml, \"a:minorFont\")[0] ?? \"\";\n\n return {\n majorLatin: readTypeface(majorFontXml, \"latin\"),\n majorEastAsia: readTypeface(majorFontXml, \"ea\"),\n majorComplexScript: readTypeface(majorFontXml, \"cs\"),\n minorLatin: readTypeface(minorFontXml, \"latin\"),\n minorEastAsia: readTypeface(minorFontXml, \"ea\"),\n minorComplexScript: readTypeface(minorFontXml, \"cs\"),\n };\n}\n\nfunction parseThemeColors(pkg: OoxmlPackage): ThemeColorMap {\n const themeXml = pkg.parts.get(\"word/theme/theme1.xml\")?.content;\n if (!themeXml) {\n return {};\n }\n\n const colorSchemeXml =\n extractBalancedTagBlocks(themeXml, \"a:clrScheme\")[0] ?? \"\";\n if (!colorSchemeXml) {\n return {};\n }\n\n const parseThemeColorFromTag = (colorXml: string): string | undefined => {\n const explicit = colorXml.match(/<a:srgbClr\\b[^>]*\\bw:val=\"([^\"]+)\"/i)?.[1];\n if (explicit) {\n return normalizeHexColor(explicit);\n }\n\n const fallback = colorXml.match(\n /<a:sysClr\\b[^>]*\\blastClr=\"([^\"]+)\"/i\n )?.[1];\n return normalizeHexColor(fallback);\n };\n\n const colorNames = [\n \"dk1\",\n \"lt1\",\n \"dk2\",\n \"lt2\",\n \"accent1\",\n \"accent2\",\n \"accent3\",\n \"accent4\",\n \"accent5\",\n \"accent6\",\n \"hlink\",\n \"folHlink\",\n \"bg1\",\n \"bg2\",\n \"tx1\",\n \"tx2\",\n \"followedHyperlink\",\n ];\n\n const colors: ThemeColorMap = {};\n for (const name of colorNames) {\n const tagMatch = colorSchemeXml.match(\n new RegExp(\n `<a:${name}\\\\b[^>]*>[\\\\s\\\\S]*?<\\\\/a:${name}>|<a:${name}\\\\b[^>]*/>`,\n \"i\"\n )\n )?.[0];\n if (!tagMatch) {\n continue;\n }\n\n const color = parseThemeColorFromTag(tagMatch);\n if (color) {\n colors[name.toLowerCase()] = color;\n }\n }\n\n return colors;\n}\n\nfunction parseStyleSheet(pkg: OoxmlPackage): ParsedStyleSheet {\n const stylesXml = pkg.parts.get(\"word/styles.xml\")?.content;\n if (!stylesXml) {\n return EMPTY_STYLE_SHEET;\n }\n\n const themeFonts = parseThemeFonts(pkg);\n const themeColors = parseThemeColors(pkg);\n const docDefaultsXml =\n extractBalancedTagBlocks(stylesXml, \"w:docDefaults\")[0] ?? \"\";\n const defaultParagraphStyle: ParagraphStyle | undefined = (() => {\n const paragraphDefaults = resolveStylePropertiesBlock(\n docDefaultsXml,\n \"w:pPr\"\n );\n const defaultParagraphHasNumPr = /<w:numPr\\b/i.test(paragraphDefaults);\n const align = parseParagraphAlignFromXml(paragraphDefaults);\n const spacing = parseParagraphSpacingFromXml(paragraphDefaults);\n const indent = parseParagraphIndentFromXml(paragraphDefaults);\n const backgroundColor = parseParagraphShadingFromXml(paragraphDefaults);\n const borders = parseParagraphBorderSetFromXml(paragraphDefaults);\n const tabStops = parseParagraphTabStopsFromXml(paragraphDefaults);\n const parsedDefaultNumbering =\n parseParagraphNumberingFromXml(paragraphDefaults);\n const numbering =\n defaultParagraphHasNumPr && !parsedDefaultNumbering\n ? { numId: 0, ilvl: 0 }\n : parsedDefaultNumbering;\n const contextualSpacing = parseOnOffAttribute(\n paragraphDefaults,\n \"contextualSpacing\"\n );\n const keepNext = parseOnOffAttribute(paragraphDefaults, \"keepNext\");\n const keepLines = parseOnOffAttribute(paragraphDefaults, \"keepLines\");\n const widowControl = parseOnOffAttribute(paragraphDefaults, \"widowControl\");\n const pageBreakBefore = parseOnOffAttribute(\n paragraphDefaults,\n \"pageBreakBefore\"\n );\n\n if (\n !align &&\n !spacing &&\n !indent &&\n !backgroundColor &&\n !borders &&\n (!tabStops || tabStops.length === 0) &&\n !numbering &&\n contextualSpacing === undefined &&\n keepNext === undefined &&\n keepLines === undefined &&\n widowControl === undefined &&\n pageBreakBefore === undefined\n ) {\n return undefined;\n }\n\n return {\n align,\n spacing,\n indent,\n backgroundColor,\n borders,\n tabStops,\n numbering,\n contextualSpacing,\n keepNext,\n keepLines,\n widowControl,\n pageBreakBefore,\n };\n })();\n const defaultRunStyle = parseTextStyleFromXml(\n resolveStylePropertiesBlock(docDefaultsXml, \"w:rPr\"),\n themeFonts\n );\n\n const rawStylesById = new Map<string, RawStyleDefinition>();\n const rawTableStylesById = new Map<string, ParsedTableStyleDefinition>();\n\n for (const styleXml of extractBalancedTagBlocks(stylesXml, \"w:style\")) {\n const styleTag = styleXml.match(/<w:style\\b[^>]*>/i)?.[0] ?? \"\";\n const styleId = getAttribute(styleTag, \"w:styleId\");\n const styleType = parseStyleType(getAttribute(styleTag, \"w:type\"));\n if (!styleId || !styleType) {\n continue;\n }\n\n const nameTag = styleXml.match(/<w:name\\b[^>]*\\/?>/i)?.[0] ?? \"\";\n const basedOnTag = styleXml.match(/<w:basedOn\\b[^>]*\\/?>/i)?.[0] ?? \"\";\n const nextTag = styleXml.match(/<w:next\\b[^>]*\\/?>/i)?.[0] ?? \"\";\n const uiPriorityTag =\n styleXml.match(/<w:uiPriority\\b[^>]*\\/?>/i)?.[0] ?? \"\";\n const paragraphPropertiesXml = resolveStylePropertiesBlock(\n styleXml,\n \"w:pPr\"\n );\n const styleHasParagraphNumPr = /<w:numPr\\b/i.test(paragraphPropertiesXml);\n const runPropertiesXml = resolveStylePropertiesBlock(styleXml, \"w:rPr\");\n\n const headingLevel =\n normalizeHeadingLevel(styleId) ||\n normalizeHeadingLevel(getAttribute(nameTag, \"w:val\")) ||\n parseHeadingLevelFromOutline(paragraphPropertiesXml);\n\n const parsedStyleNumbering = parseParagraphNumberingFromXml(\n paragraphPropertiesXml\n );\n rawStylesById.set(styleId, {\n id: styleId,\n type: styleType,\n name: getAttribute(nameTag, \"w:val\") ?? styleId,\n basedOnId: getAttribute(basedOnTag, \"w:val\"),\n nextStyleId: getAttribute(nextTag, \"w:val\"),\n align: parseParagraphAlignFromXml(paragraphPropertiesXml),\n headingLevel,\n numbering:\n styleHasParagraphNumPr && !parsedStyleNumbering\n ? { numId: 0, ilvl: 0 }\n : parsedStyleNumbering,\n spacing: parseParagraphSpacingFromXml(paragraphPropertiesXml),\n indent: parseParagraphIndentFromXml(paragraphPropertiesXml),\n backgroundColor: parseParagraphShadingFromXml(paragraphPropertiesXml),\n borders: parseParagraphBorderSetFromXml(paragraphPropertiesXml),\n tabStops: parseParagraphTabStopsFromXml(paragraphPropertiesXml),\n contextualSpacing: parseOnOffAttribute(\n paragraphPropertiesXml,\n \"contextualSpacing\"\n ),\n keepNext: parseOnOffAttribute(paragraphPropertiesXml, \"keepNext\"),\n keepLines: parseOnOffAttribute(paragraphPropertiesXml, \"keepLines\"),\n widowControl: parseOnOffAttribute(paragraphPropertiesXml, \"widowControl\"),\n pageBreakBefore: parseOnOffAttribute(\n paragraphPropertiesXml,\n \"pageBreakBefore\"\n ),\n runStyle: parseTextStyleFromXml(runPropertiesXml, themeFonts),\n uiPriority: Number(getAttribute(uiPriorityTag, \"w:val\")),\n isDefault: getAttribute(styleTag, \"w:default\") === \"1\",\n isPrimary: /<w:qFormat\\b[^>]*\\/?>/i.test(styleXml),\n });\n\n if (styleType === \"table\") {\n const conditions: Partial<\n Record<TableConditionalStyleType, ParsedTableStyleCondition>\n > = {};\n const wholeTableSourceXml = stripTableConditionalStyleBlocks(styleXml);\n const wholeTableCondition = parseTableConditionalStyleFromXml(\n wholeTableSourceXml,\n themeFonts\n );\n if (wholeTableCondition) {\n conditions.wholeTable = wholeTableCondition;\n }\n\n for (const conditionalStyleXml of extractBalancedTagBlocks(\n styleXml,\n \"w:tblStylePr\"\n )) {\n const conditionalStyleTag =\n conditionalStyleXml.match(/<w:tblStylePr\\b[^>]*>/i)?.[0] ?? \"\";\n const conditionalType = normalizeTableConditionalStyleType(\n getAttribute(conditionalStyleTag, \"w:type\")\n );\n if (!conditionalType) {\n continue;\n }\n\n const condition = parseTableConditionalStyleFromXml(\n conditionalStyleXml,\n themeFonts\n );\n if (!condition) {\n continue;\n }\n conditions[conditionalType] = condition;\n }\n\n rawTableStylesById.set(styleId, {\n id: styleId,\n basedOnId: getAttribute(basedOnTag, \"w:val\"),\n name: getAttribute(nameTag, \"w:val\") ?? styleId,\n conditions,\n });\n }\n }\n\n const runStyleCache = new Map<string, TextStyle | undefined>();\n const resolveRunStyle = (\n styleId: string,\n stack = new Set<string>()\n ): TextStyle | undefined => {\n if (runStyleCache.has(styleId)) {\n return runStyleCache.get(styleId);\n }\n\n if (stack.has(styleId)) {\n return undefined;\n }\n stack.add(styleId);\n\n const style = rawStylesById.get(styleId);\n if (!style) {\n runStyleCache.set(styleId, undefined);\n stack.delete(styleId);\n return undefined;\n }\n\n const inherited = style.basedOnId\n ? resolveRunStyle(style.basedOnId, stack)\n : undefined;\n const resolved = mergeTextStyles(inherited, style.runStyle);\n runStyleCache.set(styleId, resolved);\n stack.delete(styleId);\n return resolved;\n };\n\n const paragraphStyleCache = new Map<\n string,\n ParagraphStyleDefinition | undefined\n >();\n const resolveParagraphStyle = (\n styleId: string,\n stack = new Set<string>()\n ): ParagraphStyleDefinition | undefined => {\n if (paragraphStyleCache.has(styleId)) {\n return paragraphStyleCache.get(styleId);\n }\n\n if (stack.has(styleId)) {\n return undefined;\n }\n stack.add(styleId);\n\n const style = rawStylesById.get(styleId);\n if (!style || style.type !== \"paragraph\") {\n paragraphStyleCache.set(styleId, undefined);\n stack.delete(styleId);\n return undefined;\n }\n\n const inherited =\n style.basedOnId &&\n rawStylesById.get(style.basedOnId)?.type === \"paragraph\"\n ? resolveParagraphStyle(style.basedOnId, stack)\n : undefined;\n\n const resolved: ParagraphStyleDefinition = {\n id: style.id,\n name: style.name,\n basedOnId: style.basedOnId,\n nextStyleId: style.nextStyleId,\n align: style.align ?? inherited?.align,\n headingLevel: style.headingLevel ?? inherited?.headingLevel,\n numbering: style.numbering ?? inherited?.numbering,\n spacing: mergeParagraphSpacing(inherited?.spacing, style.spacing),\n indent: mergeParagraphIndent(inherited?.indent, style.indent),\n backgroundColor: mergeParagraphBackgroundColor(\n inherited?.backgroundColor,\n style.backgroundColor\n ),\n borders: mergeParagraphBorderSets(inherited?.borders, style.borders),\n tabStops: mergeParagraphTabStops(inherited?.tabStops, style.tabStops),\n contextualSpacing: mergeParagraphBoolean(\n inherited?.contextualSpacing,\n style.contextualSpacing\n ),\n keepNext: mergeParagraphBoolean(inherited?.keepNext, style.keepNext),\n keepLines: mergeParagraphBoolean(inherited?.keepLines, style.keepLines),\n widowControl: mergeParagraphBoolean(\n inherited?.widowControl,\n style.widowControl\n ),\n pageBreakBefore: mergeParagraphBoolean(\n inherited?.pageBreakBefore,\n style.pageBreakBefore\n ),\n runStyle: mergeTextStyles(inherited?.runStyle, style.runStyle),\n uiPriority: Number.isFinite(style.uiPriority)\n ? style.uiPriority\n : inherited?.uiPriority,\n isDefault: style.isDefault,\n isPrimary: style.isPrimary,\n };\n\n paragraphStyleCache.set(styleId, resolved);\n stack.delete(styleId);\n return resolved;\n };\n\n const paragraphStyles = Array.from(rawStylesById.values())\n .filter((style) => style.type === \"paragraph\")\n .map((style) => resolveParagraphStyle(style.id))\n .filter((style): style is ParagraphStyleDefinition => Boolean(style))\n .sort((left, right) => {\n const leftPriority = Number.isFinite(left.uiPriority)\n ? (left.uiPriority as number)\n : 9999;\n const rightPriority = Number.isFinite(right.uiPriority)\n ? (right.uiPriority as number)\n : 9999;\n if (leftPriority !== rightPriority) {\n return leftPriority - rightPriority;\n }\n return left.name.localeCompare(right.name);\n });\n\n const paragraphStyleById = new Map(\n paragraphStyles.map((style) => [style.id, style])\n );\n const runStyleById = new Map<string, TextStyle>();\n for (const styleId of rawStylesById.keys()) {\n const resolved = resolveRunStyle(styleId);\n if (resolved) {\n runStyleById.set(styleId, resolved);\n }\n }\n\n const tableStyleCache = new Map<\n string,\n ParsedTableStyleDefinition | undefined\n >();\n const resolveTableStyle = (\n styleId: string,\n stack = new Set<string>()\n ): ParsedTableStyleDefinition | undefined => {\n if (tableStyleCache.has(styleId)) {\n return tableStyleCache.get(styleId);\n }\n\n if (stack.has(styleId)) {\n return undefined;\n }\n stack.add(styleId);\n\n const style = rawTableStylesById.get(styleId);\n if (!style) {\n tableStyleCache.set(styleId, undefined);\n stack.delete(styleId);\n return undefined;\n }\n\n const inherited = style.basedOnId\n ? resolveTableStyle(style.basedOnId, stack)\n : undefined;\n const conditions: Partial<\n Record<TableConditionalStyleType, ParsedTableStyleCondition>\n > = {};\n for (const conditionalType of TABLE_CONDITIONAL_STYLE_TYPES) {\n const mergedCondition = mergeTableConditionalStyle(\n inherited?.conditions[conditionalType],\n style.conditions[conditionalType]\n );\n if (mergedCondition) {\n conditions[conditionalType] = mergedCondition;\n }\n }\n\n const resolved: ParsedTableStyleDefinition = {\n id: style.id,\n basedOnId: style.basedOnId,\n name: style.name,\n conditions,\n };\n\n tableStyleCache.set(styleId, resolved);\n stack.delete(styleId);\n return resolved;\n };\n\n const tableStyleById = new Map<string, ParsedTableStyleDefinition>();\n for (const styleId of rawTableStylesById.keys()) {\n const resolved = resolveTableStyle(styleId);\n if (resolved) {\n tableStyleById.set(styleId, resolved);\n }\n }\n\n const defaultParagraphStyleId =\n paragraphStyles.find((style) => style.isDefault)?.id ??\n (paragraphStyleById.has(\"Normal\") ? \"Normal\" : undefined);\n const resolvedDefaultParagraphStyle = defaultParagraphStyleId\n ? paragraphStyleById.get(defaultParagraphStyleId)\n : undefined;\n\n return {\n paragraphStyles,\n paragraphStyleById,\n runStyleById,\n tableStyleById,\n defaultParagraphStyle: {\n align:\n resolvedDefaultParagraphStyle?.align ?? defaultParagraphStyle?.align,\n headingLevel: resolvedDefaultParagraphStyle?.headingLevel,\n numbering:\n resolvedDefaultParagraphStyle?.numbering ??\n defaultParagraphStyle?.numbering,\n spacing: mergeParagraphSpacing(\n defaultParagraphStyle?.spacing,\n resolvedDefaultParagraphStyle?.spacing\n ),\n indent: mergeParagraphIndent(\n defaultParagraphStyle?.indent,\n resolvedDefaultParagraphStyle?.indent\n ),\n backgroundColor: mergeParagraphBackgroundColor(\n defaultParagraphStyle?.backgroundColor,\n resolvedDefaultParagraphStyle?.backgroundColor\n ),\n borders: mergeParagraphBorderSets(\n defaultParagraphStyle?.borders,\n resolvedDefaultParagraphStyle?.borders\n ),\n tabStops: mergeParagraphTabStops(\n defaultParagraphStyle?.tabStops,\n resolvedDefaultParagraphStyle?.tabStops\n ),\n keepNext: mergeParagraphBoolean(\n defaultParagraphStyle?.keepNext,\n resolvedDefaultParagraphStyle?.keepNext\n ),\n keepLines: mergeParagraphBoolean(\n defaultParagraphStyle?.keepLines,\n resolvedDefaultParagraphStyle?.keepLines\n ),\n widowControl: mergeParagraphBoolean(\n defaultParagraphStyle?.widowControl,\n resolvedDefaultParagraphStyle?.widowControl\n ),\n pageBreakBefore: mergeParagraphBoolean(\n defaultParagraphStyle?.pageBreakBefore,\n resolvedDefaultParagraphStyle?.pageBreakBefore\n ),\n styleId: defaultParagraphStyleId,\n styleName: resolvedDefaultParagraphStyle?.name,\n },\n defaultParagraphStyleId,\n defaultRunStyle: mergeTextStyles(\n defaultRunStyle,\n resolvedDefaultParagraphStyle?.runStyle\n ),\n themeColors,\n themeFonts,\n };\n}\n\nfunction parseContentTypes(pkg: OoxmlPackage): ContentTypeLookup {\n const defaultByExtension = new Map<string, string>();\n const overrideByPartName = new Map<string, string>();\n\n const xml = pkg.parts.get(\"[Content_Types].xml\")?.content;\n if (!xml) {\n return { defaultByExtension, overrideByPartName };\n }\n\n for (const match of xml.matchAll(/<Default\\b[^>]*>/g)) {\n const tag = match[0];\n const extension = getAttribute(tag, \"Extension\")?.toLowerCase();\n const contentType = getAttribute(tag, \"ContentType\");\n if (!extension || !contentType) {\n continue;\n }\n defaultByExtension.set(extension, contentType);\n }\n\n for (const match of xml.matchAll(/<Override\\b[^>]*>/g)) {\n const tag = match[0];\n const partName = getAttribute(tag, \"PartName\");\n const contentType = getAttribute(tag, \"ContentType\");\n if (!partName || !contentType) {\n continue;\n }\n overrideByPartName.set(partName, contentType);\n if (!partName.startsWith(\"/\")) {\n overrideByPartName.set(`/${partName}`, contentType);\n }\n }\n\n return {\n defaultByExtension,\n overrideByPartName,\n };\n}\n\nfunction resolvePartPath(basePartName: string, target: string): string {\n if (!target) {\n return \"\";\n }\n\n // External relationship targets should not be resolved relative to the part.\n if (/^[a-z][a-z0-9+.-]*:/i.test(target) || target.startsWith(\"#\")) {\n return target;\n }\n\n if (target.startsWith(\"/\")) {\n return target.slice(1);\n }\n\n const baseSegments = basePartName.split(\"/\").slice(0, -1);\n const targetSegments = target.split(\"/\");\n const output: string[] = [...baseSegments];\n\n for (const segment of targetSegments) {\n if (!segment || segment === \".\") {\n continue;\n }\n\n if (segment === \"..\") {\n output.pop();\n continue;\n }\n\n output.push(segment);\n }\n\n return output.join(\"/\");\n}\n\nfunction relationshipPartNameForPart(partName: string): string {\n const segments = partName.split(\"/\");\n const fileName = segments.pop();\n if (!fileName) {\n return \"\";\n }\n\n const folder = segments.join(\"/\");\n return folder.length > 0\n ? `${folder}/_rels/${fileName}.rels`\n : `_rels/${fileName}.rels`;\n}\n\nfunction parsePartRelationships(\n pkg: OoxmlPackage,\n partName: string\n): Map<string, string> {\n const map = new Map<string, string>();\n const relationshipsPartName = relationshipPartNameForPart(partName);\n const relationshipsPart = pkg.parts.get(relationshipsPartName)?.content;\n if (!relationshipsPart) {\n return map;\n }\n\n for (const match of relationshipsPart.matchAll(/<Relationship\\b[^>]*>/g)) {\n const tag = match[0];\n const id = getAttribute(tag, \"Id\");\n const target = getAttribute(tag, \"Target\");\n if (!id || !target) {\n continue;\n }\n map.set(id, resolvePartPath(partName, target));\n }\n\n return map;\n}\n\nfunction extensionFromPartName(partName: string): string | undefined {\n const lastDot = partName.lastIndexOf(\".\");\n if (lastDot < 0 || lastDot === partName.length - 1) {\n return undefined;\n }\n return partName.slice(lastDot + 1).toLowerCase();\n}\n\nfunction contentTypeForPart(\n partName: string,\n contentTypes: ContentTypeLookup\n): string | undefined {\n const override =\n contentTypes.overrideByPartName.get(partName) ||\n contentTypes.overrideByPartName.get(`/${partName}`);\n if (override) {\n return override;\n }\n\n const extension = extensionFromPartName(partName);\n if (!extension) {\n return undefined;\n }\n\n return (\n contentTypes.defaultByExtension.get(extension) ??\n MIME_BY_EXTENSION[extension]\n );\n}\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n if (typeof Buffer !== \"undefined\") {\n return Buffer.from(bytes).toString(\"base64\");\n }\n\n let binary = \"\";\n const chunkSize = 0x8000;\n for (let index = 0; index < bytes.byteLength; index += chunkSize) {\n const chunk = bytes.subarray(index, index + chunkSize);\n binary += String.fromCharCode(...chunk);\n }\n\n if (typeof btoa === \"function\") {\n return btoa(binary);\n }\n\n throw new Error(\"No base64 encoder available in this environment\");\n}\n\nfunction isNodeRuntime(): boolean {\n return Boolean(\n typeof process !== \"undefined\" &&\n process?.versions &&\n typeof process.versions.node === \"string\"\n );\n}\n\nfunction resolveNodeBuiltin<T = unknown>(moduleName: string): T | undefined {\n if (!isNodeRuntime()) {\n return undefined;\n }\n\n const processWithBuiltins = process as typeof process & {\n getBuiltinModule?: (name: string) => unknown;\n };\n if (typeof processWithBuiltins.getBuiltinModule === \"function\") {\n return processWithBuiltins.getBuiltinModule(moduleName) as T | undefined;\n }\n\n try {\n const maybeRequire = Function(\n \"return typeof require !== 'undefined' ? require : undefined;\"\n )() as ((name: string) => T) | undefined;\n return maybeRequire ? maybeRequire(moduleName) : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction isWindowsMetafileContentType(\n contentType: string | undefined,\n partName?: string\n): boolean {\n const normalizedContentType = contentType?.trim().toLowerCase();\n if (\n normalizedContentType === \"image/wmf\" ||\n normalizedContentType === \"image/x-wmf\" ||\n normalizedContentType === \"application/x-wmf\" ||\n normalizedContentType === \"image/emf\" ||\n normalizedContentType === \"image/x-emf\" ||\n normalizedContentType === \"application/x-emf\"\n ) {\n return true;\n }\n\n const extension = partName ? extensionFromPartName(partName) : undefined;\n return extension === \"wmf\" || extension === \"emf\";\n}\n\nfunction rasterizeWindowsMetafileToPngDataUri(\n bytes: Uint8Array,\n partName?: string\n): string | undefined {\n if (!isNodeRuntime()) {\n return undefined;\n }\n\n const fs = resolveNodeBuiltin<{\n mkdtempSync(prefix: string): string;\n writeFileSync(path: string, data: Uint8Array): void;\n existsSync(path: string): boolean;\n readFileSync(path: string): Uint8Array;\n rmSync(\n path: string,\n options?: { recursive?: boolean; force?: boolean }\n ): void;\n }>(\"node:fs\");\n const os = resolveNodeBuiltin<{ tmpdir(): string }>(\"node:os\");\n const path = resolveNodeBuiltin<{\n join(...parts: string[]): string;\n basename(path: string, suffix?: string): string;\n extname(path: string): string;\n }>(\"node:path\");\n const childProcess = resolveNodeBuiltin<{\n execFileSync(\n file: string,\n args: string[],\n options?: {\n stdio?: \"ignore\";\n }\n ): void;\n }>(\"node:child_process\");\n\n if (!fs || !os || !path || !childProcess) {\n return undefined;\n }\n\n const sourceExtension = extensionFromPartName(partName ?? \"\") ?? \"wmf\";\n const baseName = \"metafile-image\";\n const tempDir = fs.mkdtempSync(\n path.join(os.tmpdir(), \"react-docx-metafile-\")\n );\n const sourcePath = path.join(tempDir, `${baseName}.${sourceExtension}`);\n const outputPath = path.join(tempDir, `${baseName}.png`);\n const sofficeCandidates = [\n process.env.SOFFICE_PATH,\n \"soffice\",\n \"/opt/homebrew/bin/soffice\",\n \"/Applications/LibreOffice.app/Contents/MacOS/soffice\",\n ].filter((candidate): candidate is string => Boolean(candidate));\n\n try {\n fs.writeFileSync(sourcePath, bytes);\n\n for (const sofficePath of sofficeCandidates) {\n try {\n childProcess.execFileSync(\n sofficePath,\n [\n \"--headless\",\n \"--convert-to\",\n \"png\",\n \"--outdir\",\n tempDir,\n sourcePath,\n ],\n { stdio: \"ignore\" }\n );\n } catch {\n continue;\n }\n\n if (fs.existsSync(outputPath)) {\n trimRasterizedMetafilePng(outputPath, childProcess);\n const pngBytes = fs.readFileSync(outputPath);\n return `data:image/png;base64,${bytesToBase64(\n new Uint8Array(pngBytes)\n )}`;\n }\n }\n\n return undefined;\n } finally {\n try {\n fs.rmSync(tempDir, { recursive: true, force: true });\n } catch {\n // Best-effort temp cleanup only.\n }\n }\n}\n\nfunction trimRasterizedMetafilePng(\n pngPath: string,\n childProcess: {\n execFileSync(\n file: string,\n args: string[],\n options?: {\n stdio?: \"ignore\";\n }\n ): void;\n }\n): void {\n const pythonCandidates = [process.env.PYTHON, \"python3\", \"python\"].filter(\n (candidate): candidate is string => Boolean(candidate)\n );\n const trimScript = `\nfrom PIL import Image\nimport sys\n\npath = sys.argv[1]\ntry:\n image = Image.open(path).convert(\"RGBA\")\nexcept Exception:\n raise SystemExit(0)\n\nwidth, height = image.size\nif width <= 0 or height <= 0:\n raise SystemExit(0)\n\npixels = image.load()\nleft = width\ntop = height\nright = -1\nbottom = -1\n\nfor y in range(height):\n for x in range(width):\n r, g, b, a = pixels[x, y]\n if a <= 8:\n continue\n if r >= 248 and g >= 248 and b >= 248:\n continue\n if x < left:\n left = x\n if y < top:\n top = y\n if x > right:\n right = x\n if y > bottom:\n bottom = y\n\nif right < left or bottom < top:\n raise SystemExit(0)\n\ntrimmed_width = right - left + 1\ntrimmed_height = bottom - top + 1\nif trimmed_width >= width * 0.96 and trimmed_height >= height * 0.96:\n raise SystemExit(0)\n\noccupancy_x = trimmed_width / width if width else 1\noccupancy_y = trimmed_height / height if height else 1\n\nif occupancy_x < 0.75 or occupancy_y < 0.75:\n target_occupancy = 0.82\n padded_width = min(width, max(trimmed_width, round(trimmed_width / target_occupancy)))\n padded_height = min(height, max(trimmed_height, round(trimmed_height / target_occupancy)))\n pad_x = max(4, round((padded_width - trimmed_width) / 2))\n pad_y = max(4, round((padded_height - trimmed_height) / 2))\nelse:\n pad_x = max(4, round(trimmed_width * 0.03))\n pad_y = max(4, round(trimmed_height * 0.03))\n\ncrop_left = max(0, left - pad_x)\ncrop_top = max(0, top - pad_y)\ncrop_right = min(width, right + pad_x + 1)\ncrop_bottom = min(height, bottom + pad_y + 1)\n\ncropped = image.crop((crop_left, crop_top, crop_right, crop_bottom))\ncropped.save(path, format=\"PNG\")\n`;\n\n for (const pythonPath of pythonCandidates) {\n try {\n childProcess.execFileSync(pythonPath, [\"-c\", trimScript, pngPath], {\n stdio: \"ignore\",\n });\n return;\n } catch {\n continue;\n }\n }\n}\n\nfunction parseRunStyle(\n runXml: string,\n context: ParseContext,\n paragraphStyleId?: string\n): TextStyle | undefined {\n const runStyleId = runXml.match(/<w:rStyle\\b[^>]*w:val=\"([^\"]+)\"/i)?.[1];\n const textBoxRunXml = extractBalancedTagBlocks(\n extractBalancedTagBlocks(\n preferAlternateContentChoice(runXml),\n \"w:txbxContent\"\n )[0] ?? \"\",\n \"w:r\"\n )[0];\n const direct = parseTextStyleFromXml(\n textBoxRunXml ?? runXml,\n context.styleSheet.themeFonts\n );\n const inheritedParagraphRunStyle = paragraphStyleId\n ? context.styleSheet.paragraphStyleById.get(paragraphStyleId)?.runStyle\n : undefined;\n const inheritedRunStyle = runStyleId\n ? context.styleSheet.runStyleById.get(runStyleId)\n : undefined;\n\n return mergeTextStyles(\n context.styleSheet.defaultRunStyle,\n inheritedParagraphRunStyle,\n inheritedRunStyle,\n direct\n );\n}\n\nfunction preferAlternateContentChoice(xml: string): string {\n if (!xml.includes(\"<mc:AlternateContent\")) {\n return xml;\n }\n\n return xml.replace(\n /<mc:AlternateContent\\b[\\s\\S]*?<\\/mc:AlternateContent>/gi,\n (alternateXml) => {\n const choiceXml = alternateXml.match(\n /<mc:Choice\\b[\\s\\S]*?<\\/mc:Choice>/i\n )?.[0];\n if (!choiceXml) {\n return alternateXml;\n }\n\n return choiceXml\n .replace(/<mc:Choice\\b[^>]*>/i, \"\")\n .replace(/<\\/mc:Choice>/i, \"\");\n }\n );\n}\n\ninterface ParsedRunTextToken {\n text: string;\n noteReference?: {\n kind: \"footnote\" | \"endnote\";\n id: number;\n };\n}\n\nfunction parseRunTextTokens(runXml: string): ParsedRunTextToken[] {\n const normalizedRunXml = preferAlternateContentChoice(runXml);\n const tokenPattern =\n /<w:t\\b[^>]*>([\\s\\S]*?)<\\/w:t>|<a:t\\b[^>]*>([\\s\\S]*?)<\\/a:t>|<w:footnoteReference\\b[^>]*w:id=\"(-?\\d+)\"[^>]*\\/>|<w:endnoteReference\\b[^>]*w:id=\"(-?\\d+)\"[^>]*\\/>|<w:tab\\b[^>]*\\/>|<a:tab\\b[^>]*\\/>|<w:br\\b[^>]*\\/>|<w:cr\\b[^>]*\\/>|<a:br\\b[^>]*\\/>|<\\/w:p>/g;\n const tokens = normalizedRunXml.matchAll(tokenPattern);\n const parts: ParsedRunTextToken[] = [];\n\n for (const token of tokens) {\n if (token[1] !== undefined) {\n parts.push({ text: decodeXmlEntities(token[1]) });\n continue;\n }\n if (token[2] !== undefined) {\n parts.push({ text: decodeXmlEntities(token[2]) });\n continue;\n }\n if (token[3] !== undefined) {\n const referenceId = Number.parseInt(token[3], 10);\n const safeId = Number.isFinite(referenceId)\n ? Math.round(referenceId)\n : undefined;\n if (safeId === undefined || safeId <= 0) {\n continue;\n }\n\n parts.push({\n text: \"\",\n noteReference: {\n kind: \"footnote\",\n id: safeId,\n },\n });\n continue;\n }\n if (token[4] !== undefined) {\n const referenceId = Number.parseInt(token[4], 10);\n const safeId = Number.isFinite(referenceId)\n ? Math.round(referenceId)\n : undefined;\n if (safeId === undefined || safeId <= 0) {\n continue;\n }\n\n parts.push({\n text: \"\",\n noteReference: {\n kind: \"endnote\",\n id: safeId,\n },\n });\n continue;\n }\n\n const marker = token[0].toLowerCase();\n if (marker === \"</w:p>\") {\n parts.push({ text: \"\\n\" });\n } else if (marker.startsWith(\"<w:tab\") || marker.startsWith(\"<a:tab\")) {\n parts.push({ text: \"\\t\" });\n } else {\n parts.push({ text: \"\\n\" });\n }\n }\n\n return parts;\n}\n\nfunction parseRunText(runXml: string): string {\n return parseRunTextTokens(runXml)\n .map((token) => token.text)\n .join(\"\");\n}\n\nfunction stripTextBoxContent(xml: string): string {\n return xml.replace(/<w:txbxContent\\b[\\s\\S]*?<\\/w:txbxContent>/gi, \"\");\n}\n\nfunction parseFloatingAnchorFromRunXml(\n runXml: string\n): ImageRunNode[\"floating\"] | undefined {\n const anchorTag = runXml.match(/<wp:anchor\\b[^>]*>/i)?.[0];\n if (!anchorTag) {\n return undefined;\n }\n\n const positionHBlock = runXml.match(\n /<wp:positionH\\b[^>]*>[\\s\\S]*?<\\/wp:positionH>/i\n )?.[0];\n const positionVBlock = runXml.match(\n /<wp:positionV\\b[^>]*>[\\s\\S]*?<\\/wp:positionV>/i\n )?.[0];\n const positionHTag = positionHBlock?.match(/<wp:positionH\\b[^>]*>/i)?.[0];\n const positionVTag = positionVBlock?.match(/<wp:positionV\\b[^>]*>/i)?.[0];\n const wrapTag = runXml.match(\n /<wp:(?:wrapNone|wrapSquare|wrapTight|wrapThrough|wrapTopAndBottom)\\b[^>]*\\/?>/i\n )?.[0];\n\n const xOffsetRaw = positionHBlock?.match(\n /<wp:posOffset>(-?\\d+)<\\/wp:posOffset>/i\n )?.[1];\n const yOffsetRaw = positionVBlock?.match(\n /<wp:posOffset>(-?\\d+)<\\/wp:posOffset>/i\n )?.[1];\n const horizontalAlignRaw = positionHBlock?.match(\n /<wp:align>([^<]+)<\\/wp:align>/i\n )?.[1];\n const verticalAlignRaw = positionVBlock?.match(\n /<wp:align>([^<]+)<\\/wp:align>/i\n )?.[1];\n const distLRaw = getAttribute(anchorTag, \"distL\");\n const distRRaw = getAttribute(anchorTag, \"distR\");\n const distTRaw = getAttribute(anchorTag, \"distT\");\n const distBRaw = getAttribute(anchorTag, \"distB\");\n const zIndexRaw = getAttribute(anchorTag, \"relativeHeight\");\n\n const xPx = emuToPixels(xOffsetRaw);\n const yPx = emuToPixels(yOffsetRaw);\n const toPxFromEmu = (value?: string): number | undefined => {\n const resolved = emuToPixels(value);\n return resolved === undefined ? undefined : Math.max(0, resolved);\n };\n const zIndex =\n zIndexRaw && Number.isFinite(Number(zIndexRaw))\n ? Number(zIndexRaw)\n : undefined;\n const horizontalRelativeTo = positionHTag\n ? getAttribute(positionHTag, \"relativeFrom\")\n : undefined;\n const verticalRelativeTo = positionVTag\n ? getAttribute(positionVTag, \"relativeFrom\")\n : undefined;\n const horizontalAlign = horizontalAlignRaw?.trim().toLowerCase();\n const verticalAlign = verticalAlignRaw?.trim().toLowerCase();\n const distLPx = toPxFromEmu(distLRaw);\n const distRPx = toPxFromEmu(distRRaw);\n const distTPx = toPxFromEmu(distTRaw);\n const distBPx = toPxFromEmu(distBRaw);\n const wrapTypeRaw = wrapTag?.match(\n /<wp:(wrapNone|wrapSquare|wrapTight|wrapThrough|wrapTopAndBottom)\\b/i\n )?.[1];\n const wrapTextRaw = wrapTag\n ? getAttribute(wrapTag, \"wrapText\")?.trim()\n : undefined;\n const behindDocument = getAttribute(anchorTag, \"behindDoc\") === \"1\";\n const wrapType =\n wrapTypeRaw === \"wrapNone\"\n ? \"none\"\n : wrapTypeRaw === \"wrapSquare\"\n ? \"square\"\n : wrapTypeRaw === \"wrapTight\"\n ? \"tight\"\n : wrapTypeRaw === \"wrapThrough\"\n ? \"through\"\n : wrapTypeRaw === \"wrapTopAndBottom\"\n ? \"topAndBottom\"\n : undefined;\n const wrapText =\n wrapTextRaw === \"bothSides\" ||\n wrapTextRaw === \"left\" ||\n wrapTextRaw === \"right\" ||\n wrapTextRaw === \"largest\"\n ? wrapTextRaw\n : undefined;\n\n if (\n xPx === undefined &&\n yPx === undefined &&\n !horizontalAlign &&\n !verticalAlign &&\n !horizontalRelativeTo &&\n !verticalRelativeTo &&\n distLPx === undefined &&\n distRPx === undefined &&\n distTPx === undefined &&\n distBPx === undefined &&\n !wrapType &&\n !wrapText &&\n zIndex === undefined &&\n !behindDocument\n ) {\n return undefined;\n }\n\n return {\n xPx,\n yPx,\n horizontalAlign:\n horizontalAlign === \"left\" ||\n horizontalAlign === \"center\" ||\n horizontalAlign === \"right\" ||\n horizontalAlign === \"inside\" ||\n horizontalAlign === \"outside\"\n ? horizontalAlign\n : undefined,\n verticalAlign:\n verticalAlign === \"top\" ||\n verticalAlign === \"center\" ||\n verticalAlign === \"bottom\" ||\n verticalAlign === \"inside\" ||\n verticalAlign === \"outside\"\n ? verticalAlign\n : undefined,\n horizontalRelativeTo,\n verticalRelativeTo,\n distLPx,\n distRPx,\n distTPx,\n distBPx,\n wrapType,\n wrapText,\n behindDocument,\n zIndex,\n };\n}\n\ninterface ParsedTextBoxParagraph {\n text: string;\n style?: TextStyle;\n align?: ParagraphAlignment;\n}\n\ninterface ParsedTextBoxLayout {\n paddingLeftPx?: number;\n paddingTopPx?: number;\n paddingRightPx?: number;\n paddingBottomPx?: number;\n verticalAnchor?: \"top\" | \"center\" | \"bottom\";\n}\n\nfunction parseTextBoxParagraphs(\n runXml: string,\n context: ParseContext\n): ParsedTextBoxParagraph[] {\n const normalizedRunXml = preferAlternateContentChoice(runXml);\n const textBoxXml = extractBalancedTagBlocks(\n normalizedRunXml,\n \"w:txbxContent\"\n )[0];\n if (!textBoxXml) {\n return [];\n }\n\n const paragraphs = extractBalancedTagBlocks(textBoxXml, \"w:p\");\n const resolved: ParsedTextBoxParagraph[] = [];\n\n for (const paragraphXml of paragraphs) {\n const paragraphText = parseRunText(paragraphXml).replace(/\\n+$/g, \"\");\n if (paragraphText.length === 0) {\n continue;\n }\n\n const paragraphPropertiesXml =\n extractBalancedTagBlocks(paragraphXml, \"w:pPr\")[0] ??\n paragraphXml.match(/<w:pPr\\b[^>]*\\/?>/i)?.[0] ??\n \"\";\n const paragraphStyleId = paragraphPropertiesXml.match(\n /<w:pStyle\\b[^>]*w:val=\"([^\"]+)\"/i\n )?.[1];\n const paragraphStyle = paragraphStyleId\n ? context.styleSheet.paragraphStyleById.get(paragraphStyleId)\n : undefined;\n\n const firstRunXml = extractBalancedTagBlocks(paragraphXml, \"w:r\")[0];\n const runPropertiesXml = firstRunXml\n ? extractBalancedTagBlocks(firstRunXml, \"w:rPr\")[0] ??\n firstRunXml.match(/<w:rPr\\b[^>]*\\/?>/i)?.[0] ??\n \"\"\n : \"\";\n const paragraphRunPropertiesXml =\n extractBalancedTagBlocks(paragraphPropertiesXml, \"w:rPr\")[0] ??\n paragraphPropertiesXml.match(/<w:rPr\\b[^>]*\\/?>/i)?.[0] ??\n \"\";\n\n const style = mergeTextStyles(\n context.styleSheet.defaultRunStyle,\n paragraphStyle?.runStyle,\n parseTextStyleFromXml(\n paragraphRunPropertiesXml,\n context.styleSheet.themeFonts\n ),\n parseTextStyleFromXml(runPropertiesXml, context.styleSheet.themeFonts)\n );\n const align =\n parseParagraphAlignFromXml(paragraphPropertiesXml) ??\n paragraphStyle?.align;\n\n resolved.push({\n text: paragraphText,\n style,\n align,\n });\n }\n\n return resolved;\n}\n\nfunction parseTextBoxLayout(runXml: string): ParsedTextBoxLayout | undefined {\n const normalizedRunXml = preferAlternateContentChoice(runXml);\n const bodyPrXml =\n extractBalancedTagBlocks(normalizedRunXml, \"wps:bodyPr\")[0] ??\n normalizedRunXml.match(/<wps:bodyPr\\b[^>]*\\/?>/i)?.[0] ??\n \"\";\n if (!bodyPrXml) {\n return undefined;\n }\n\n const anchorRaw = getAttribute(bodyPrXml, \"anchor\")?.trim().toLowerCase();\n const verticalAnchor =\n anchorRaw === \"ctr\" ? \"center\" : anchorRaw === \"b\" ? \"bottom\" : \"top\";\n\n return {\n paddingLeftPx: emuToPixels(getAttribute(bodyPrXml, \"lIns\")),\n paddingTopPx: emuToPixels(getAttribute(bodyPrXml, \"tIns\")),\n paddingRightPx: emuToPixels(getAttribute(bodyPrXml, \"rIns\")),\n paddingBottomPx: emuToPixels(getAttribute(bodyPrXml, \"bIns\")),\n verticalAnchor,\n };\n}\n\nfunction parseDrawingImageCssFilter(runXml: string): string | undefined {\n const filters: string[] = [];\n\n if (/<a14:artisticPastelsSmooth\\b/i.test(runXml)) {\n filters.push(\"saturate(0.76)\", \"contrast(0.94)\", \"brightness(1.04)\");\n }\n\n const colorTemperatureRaw = runXml.match(\n /<a14:colorTemperature\\b[^>]*colorTemp=\"(\\d+)\"/i\n )?.[1];\n const colorTemperature = colorTemperatureRaw\n ? Number(colorTemperatureRaw)\n : undefined;\n if (Number.isFinite(colorTemperature)) {\n if ((colorTemperature as number) >= 9000) {\n filters.push(\"hue-rotate(-6deg)\", \"saturate(1.04)\");\n } else if ((colorTemperature as number) <= 4500) {\n filters.push(\"sepia(0.1)\", \"saturate(1.02)\");\n }\n }\n\n const hasDuotoneAccent3 =\n /<a:duotone>[\\s\\S]*?<a:schemeClr\\b[^>]*val=\"accent3\"/i.test(runXml);\n if (hasDuotoneAccent3) {\n filters.push(\n \"grayscale(1)\",\n \"sepia(0.55)\",\n \"hue-rotate(35deg)\",\n \"saturate(1.55)\",\n \"brightness(0.9)\"\n );\n }\n\n return filters.length > 0 ? filters.join(\" \") : undefined;\n}\n\nfunction parseDrawingImageOpacity(runXml: string): number | undefined {\n const alphaRaw = runXml.match(/<a:alphaModFix\\b[^>]*amt=\"(\\d+)\"/i)?.[1];\n if (!alphaRaw) {\n return undefined;\n }\n\n const alpha = Number(alphaRaw);\n if (!Number.isFinite(alpha)) {\n return undefined;\n }\n\n return Math.max(0, Math.min(1, alpha / 100000));\n}\n\nfunction parseDrawingImageCrop(\n runXml: string\n): ImageRunNode[\"crop\"] | undefined {\n const srcRectTag =\n runXml.match(/<a:srcRect\\b[^>]*\\/>/i)?.[0] ??\n runXml.match(/<a:srcRect\\b[^>]*>[\\s\\S]*?<\\/a:srcRect>/i)?.[0];\n if (!srcRectTag) {\n return undefined;\n }\n\n const parseCropFraction = (attributeName: string): number | undefined => {\n const rawValue = getAttribute(srcRectTag, attributeName);\n if (!rawValue) {\n return undefined;\n }\n\n const value = Number(rawValue);\n if (!Number.isFinite(value)) {\n return undefined;\n }\n\n return Math.max(0, Math.min(1, value / 100000));\n };\n\n const crop = {\n leftFraction: parseCropFraction(\"l\"),\n topFraction: parseCropFraction(\"t\"),\n rightFraction: parseCropFraction(\"r\"),\n bottomFraction: parseCropFraction(\"b\"),\n };\n\n return Object.values(crop).some(\n (value) => Number.isFinite(value) && (value as number) > 0\n )\n ? crop\n : undefined;\n}\n\nfunction renderTextBoxSvg(\n paragraphs: ParsedTextBoxParagraph[],\n widthPx: number | undefined,\n heightPx: number | undefined,\n layout?: ParsedTextBoxLayout\n): string {\n const safeWidth = clamp(Math.round(widthPx ?? 320), 80, 2400);\n const lineHeights = paragraphs.map((paragraph) => {\n const fontSizePt = paragraph.style?.fontSizePt ?? 12;\n const fontSizePx = Math.max(10, Math.round((fontSizePt * 96) / 72));\n return Math.max(14, Math.round(fontSizePx * 1.24));\n });\n const estimatedHeight = lineHeights.reduce(\n (sum, lineHeight) => sum + lineHeight,\n 24\n );\n const safeHeight = clamp(Math.round(heightPx ?? estimatedHeight), 48, 2400);\n const horizontalInset = Math.max(\n 8,\n Math.round(layout?.paddingLeftPx ?? safeWidth * 0.03)\n );\n const topInset = Math.max(\n 8,\n Math.round(layout?.paddingTopPx ?? safeHeight * 0.04)\n );\n const rightInset = Math.max(\n 8,\n Math.round(layout?.paddingRightPx ?? horizontalInset)\n );\n const bottomInset = Math.max(\n 8,\n Math.round(layout?.paddingBottomPx ?? topInset)\n );\n const maxTextWidth = Math.max(20, safeWidth - horizontalInset * 2);\n const totalTextHeight = lineHeights.reduce(\n (sum, lineHeight) => sum + lineHeight,\n 0\n );\n const availableHeight = Math.max(0, safeHeight - topInset - bottomInset);\n const startOffsetY =\n layout?.verticalAnchor === \"center\"\n ? topInset +\n Math.max(0, Math.round((availableHeight - totalTextHeight) / 2))\n : layout?.verticalAnchor === \"bottom\"\n ? Math.max(topInset, safeHeight - bottomInset - totalTextHeight)\n : topInset;\n\n let cursorY = startOffsetY;\n const lines: string[] = [];\n\n for (const [paragraphIndex, paragraph] of paragraphs.entries()) {\n const fontSizePt = paragraph.style?.fontSizePt ?? 12;\n const fontSizePx = Math.max(10, Math.round((fontSizePt * 96) / 72));\n const estimatedTextWidth = estimateTextWidthPx(paragraph.text, fontSizePx);\n const overflowRatio =\n estimatedTextWidth > 0 ? maxTextWidth / estimatedTextWidth : 1;\n const fittedFontSizePx =\n overflowRatio < 1\n ? Math.max(10, Math.round(fontSizePx * overflowRatio))\n : fontSizePx;\n const textLengthAttr =\n estimatedTextWidth > maxTextWidth + 1\n ? ` textLength=\"${Math.round(\n maxTextWidth\n )}\" lengthAdjust=\"spacingAndGlyphs\"`\n : \"\";\n const lineHeight =\n lineHeights[paragraphIndex] ??\n Math.max(14, Math.round(fittedFontSizePx * 1.24));\n cursorY += lineHeight;\n if (cursorY > safeHeight - 4) {\n break;\n }\n\n const textAlign = paragraph.align ?? \"left\";\n const anchor =\n textAlign === \"center\"\n ? \"middle\"\n : textAlign === \"right\"\n ? \"end\"\n : \"start\";\n const x =\n textAlign === \"center\"\n ? Math.round(safeWidth / 2)\n : textAlign === \"right\"\n ? safeWidth - rightInset\n : horizontalInset;\n const textDecoration = [\n paragraph.style?.underline ? \"underline\" : \"\",\n paragraph.style?.strike ? \"line-through\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n lines.push(\n `<text xml:space=\"preserve\" x=\"${x}\" y=\"${cursorY}\" text-anchor=\"${anchor}\" font-size=\"${fittedFontSizePx}\" fill=\"${\n paragraph.style?.color ?? \"#111111\"\n }\" font-family=\"${escapeXmlText(\n resolveSvgFontFamily(paragraph.style?.fontFamily)\n )}\" font-weight=\"${paragraph.style?.bold ? \"700\" : \"400\"}\" font-style=\"${\n paragraph.style?.italic ? \"italic\" : \"normal\"\n }\"${\n textDecoration ? ` text-decoration=\"${textDecoration}\"` : \"\"\n }${textLengthAttr}>${escapeXmlText(paragraph.text)}</text>`\n );\n }\n\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${safeWidth}\" height=\"${safeHeight}\" viewBox=\"0 0 ${safeWidth} ${safeHeight}\">\n <rect x=\"0\" y=\"0\" width=\"${safeWidth}\" height=\"${safeHeight}\" fill=\"none\"/>\n ${lines.join(\"\")}\n </svg>`;\n}\n\nfunction cssLengthToPixels(value: string, unit: string): number | undefined {\n const numeric = Number(value);\n if (!Number.isFinite(numeric)) {\n return undefined;\n }\n\n switch (unit.toLowerCase()) {\n case \"px\":\n return Math.round(numeric);\n case \"pt\":\n return Math.round((numeric * 96) / 72);\n case \"in\":\n return Math.round(numeric * 96);\n case \"cm\":\n return Math.round((numeric * 96) / 2.54);\n case \"mm\":\n return Math.round((numeric * 96) / 25.4);\n default:\n return undefined;\n }\n}\n\nfunction parseCssStyleDeclarations(styleValue: string): Map<string, string> {\n const declarations = new Map<string, string>();\n\n styleValue\n .split(\";\")\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0)\n .forEach((entry) => {\n const separatorIndex = entry.indexOf(\":\");\n if (separatorIndex <= 0) {\n return;\n }\n\n const key = entry.slice(0, separatorIndex).trim().toLowerCase();\n const value = entry.slice(separatorIndex + 1).trim();\n if (!key || !value) {\n return;\n }\n\n declarations.set(key, value);\n });\n\n return declarations;\n}\n\nfunction parseCssLengthPixels(\n styleToken: string | undefined\n): number | undefined {\n if (!styleToken) {\n return undefined;\n }\n\n const match = styleToken.match(\n /(-?[0-9]+(?:\\.[0-9]+)?)\\s*(px|pt|in|cm|mm)\\b/i\n );\n if (!match?.[1] || !match?.[2]) {\n return undefined;\n }\n\n return cssLengthToPixels(match[1], match[2]);\n}\n\nfunction parseVmlSize(runXml: string): { widthPx?: number; heightPx?: number } {\n const shapeTagMatch = runXml.match(/<v:shape\\b[^>]*>/i);\n const shapeTag = shapeTagMatch?.[0] ?? \"\";\n const style = getAttribute(shapeTag, \"style\");\n if (!style) {\n return {};\n }\n\n const widthMatch = style.match(/width:\\s*([0-9.]+)\\s*(px|pt|in|cm|mm)/i);\n const heightMatch = style.match(/height:\\s*([0-9.]+)\\s*(px|pt|in|cm|mm)/i);\n\n return {\n widthPx:\n widthMatch?.[1] && widthMatch?.[2]\n ? cssLengthToPixels(widthMatch[1], widthMatch[2])\n : undefined,\n heightPx:\n heightMatch?.[1] && heightMatch?.[2]\n ? cssLengthToPixels(heightMatch[1], heightMatch[2])\n : undefined,\n };\n}\n\nfunction parseVmlFloatingAnchorFromRunXml(\n runXml: string\n): ImageRunNode[\"floating\"] | undefined {\n type Floating = NonNullable<ImageRunNode[\"floating\"]>;\n const shapeTag = runXml.match(/<v:shape\\b[^>]*>/i)?.[0] ?? \"\";\n const styleValue = getAttribute(shapeTag, \"style\");\n if (!styleValue) {\n return undefined;\n }\n\n const declarations = parseCssStyleDeclarations(styleValue);\n if (declarations.size === 0) {\n return undefined;\n }\n\n const normalizeRelativeTo = (\n raw: string | undefined,\n axis: \"horizontal\" | \"vertical\"\n ): string | undefined => {\n const normalized = raw?.trim().toLowerCase();\n if (!normalized) {\n return undefined;\n }\n\n if (\n normalized === \"page\" ||\n normalized === \"margin\" ||\n normalized === \"column\" ||\n normalized === \"paragraph\" ||\n normalized === \"line\"\n ) {\n return normalized;\n }\n\n if (normalized === \"text\") {\n return axis === \"horizontal\" ? \"paragraph\" : \"paragraph\";\n }\n\n if (normalized === \"char\" || normalized === \"character\") {\n return axis === \"horizontal\" ? \"line\" : \"line\";\n }\n\n return undefined;\n };\n\n const normalizeAlign = (\n raw: string | undefined\n ): Floating[\"horizontalAlign\"] | Floating[\"verticalAlign\"] => {\n const normalized = raw?.trim().toLowerCase();\n if (\n normalized === \"left\" ||\n normalized === \"center\" ||\n normalized === \"right\" ||\n normalized === \"inside\" ||\n normalized === \"outside\" ||\n normalized === \"top\" ||\n normalized === \"bottom\"\n ) {\n return normalized as\n | \"left\"\n | \"center\"\n | \"right\"\n | \"inside\"\n | \"outside\"\n | \"top\"\n | \"bottom\";\n }\n\n return undefined;\n };\n\n const normalizeWrapType = (raw: string | undefined): Floating[\"wrapType\"] => {\n const normalized = raw?.trim().toLowerCase();\n if (!normalized) {\n return undefined;\n }\n\n if (normalized === \"square\") {\n return \"square\";\n }\n if (normalized === \"tight\") {\n return \"tight\";\n }\n if (normalized === \"through\") {\n return \"through\";\n }\n if (\n normalized === \"topandbottom\" ||\n normalized === \"top-and-bottom\" ||\n normalized === \"topbottom\"\n ) {\n return \"topAndBottom\";\n }\n if (normalized === \"none\" || normalized === \"inline\") {\n return \"none\";\n }\n\n return undefined;\n };\n\n const parseNumeric = (raw: string | undefined): number | undefined => {\n if (!raw) {\n return undefined;\n }\n const parsed = Number(raw.trim());\n if (!Number.isFinite(parsed)) {\n return undefined;\n }\n return Math.round(parsed);\n };\n\n const xPx =\n parseCssLengthPixels(declarations.get(\"left\")) ??\n parseCssLengthPixels(declarations.get(\"margin-left\"));\n const yPx =\n parseCssLengthPixels(declarations.get(\"top\")) ??\n parseCssLengthPixels(declarations.get(\"margin-top\"));\n const horizontalRelativeTo = normalizeRelativeTo(\n declarations.get(\"mso-position-horizontal-relative\"),\n \"horizontal\"\n );\n const verticalRelativeTo = normalizeRelativeTo(\n declarations.get(\"mso-position-vertical-relative\"),\n \"vertical\"\n );\n const horizontalPositionMode = declarations\n .get(\"mso-position-horizontal\")\n ?.trim()\n .toLowerCase();\n const verticalPositionMode = declarations\n .get(\"mso-position-vertical\")\n ?.trim()\n .toLowerCase();\n const horizontalAlign =\n horizontalPositionMode && horizontalPositionMode !== \"absolute\"\n ? (normalizeAlign(horizontalPositionMode) as Floating[\"horizontalAlign\"])\n : undefined;\n const verticalAlign =\n verticalPositionMode && verticalPositionMode !== \"absolute\"\n ? (normalizeAlign(verticalPositionMode) as Floating[\"verticalAlign\"])\n : undefined;\n const distLPx = parseCssLengthPixels(\n declarations.get(\"mso-wrap-distance-left\")\n );\n const distRPx = parseCssLengthPixels(\n declarations.get(\"mso-wrap-distance-right\")\n );\n const distTPx = parseCssLengthPixels(\n declarations.get(\"mso-wrap-distance-top\")\n );\n const distBPx = parseCssLengthPixels(\n declarations.get(\"mso-wrap-distance-bottom\")\n );\n const wrapType = normalizeWrapType(declarations.get(\"mso-wrap-style\"));\n const zIndex = parseNumeric(declarations.get(\"z-index\"));\n const behindDocument = zIndex !== undefined ? zIndex < 0 : undefined;\n\n if (\n xPx === undefined &&\n yPx === undefined &&\n !horizontalRelativeTo &&\n !verticalRelativeTo &&\n !horizontalAlign &&\n !verticalAlign &&\n distLPx === undefined &&\n distRPx === undefined &&\n distTPx === undefined &&\n distBPx === undefined &&\n !wrapType &&\n zIndex === undefined\n ) {\n return undefined;\n }\n\n return {\n xPx,\n yPx,\n horizontalAlign,\n verticalAlign,\n horizontalRelativeTo,\n verticalRelativeTo,\n distLPx: distLPx !== undefined ? Math.max(0, distLPx) : undefined,\n distRPx: distRPx !== undefined ? Math.max(0, distRPx) : undefined,\n distTPx: distTPx !== undefined ? Math.max(0, distTPx) : undefined,\n distBPx: distBPx !== undefined ? Math.max(0, distBPx) : undefined,\n wrapType,\n behindDocument: behindDocument === true,\n zIndex,\n };\n}\n\ninterface ParsedChartSeries {\n name: string;\n values: number[];\n categories: string[];\n color: string;\n}\n\ninterface ParsedChartData {\n kind: \"bar\" | \"line\" | \"pie\" | \"doughnut\";\n title?: string;\n categories: string[];\n series: ParsedChartSeries[];\n}\n\nconst CHART_COLOR_PALETTE = [\n \"#2563eb\",\n \"#f97316\",\n \"#22c55e\",\n \"#eab308\",\n \"#a855f7\",\n \"#06b6d4\",\n \"#ef4444\",\n \"#14b8a6\",\n];\n\nfunction escapeXmlText(value: string): string {\n return value\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\")\n .replaceAll('\"', \"&quot;\")\n .replaceAll(\"'\", \"&apos;\");\n}\n\nfunction estimateTextWidthPx(text: string, fontSizePx: number): number {\n if (!text) {\n return 0;\n }\n\n let widthUnits = 0;\n for (const char of text) {\n if (/\\s/.test(char)) {\n widthUnits += 0.34;\n } else if (/[A-Z]/.test(char)) {\n widthUnits += 0.66;\n } else if (/[a-z]/.test(char)) {\n widthUnits += 0.55;\n } else if (/[0-9]/.test(char)) {\n widthUnits += 0.57;\n } else if (/[\\u2e80-\\u9fff\\u3040-\\u30ff\\uac00-\\ud7af]/.test(char)) {\n widthUnits += 1;\n } else {\n widthUnits += 0.45;\n }\n }\n\n return widthUnits * fontSizePx;\n}\n\nfunction resolveSvgFontFamily(fontFamily: string | undefined): string {\n const trimmed = (fontFamily ?? \"\").trim();\n if (!trimmed) {\n return \"Calibri, Arial, sans-serif\";\n }\n\n if (trimmed.includes(\",\")) {\n return trimmed;\n }\n\n if (/times|georgia|garamond|serif/i.test(trimmed)) {\n return `${trimmed}, serif`;\n }\n\n return `${trimmed}, Arial, sans-serif`;\n}\n\nfunction chartColor(rawColor: string | undefined, index: number): string {\n const normalized = normalizeHexColor(rawColor);\n if (normalized) {\n return normalized;\n }\n\n return CHART_COLOR_PALETTE[index % CHART_COLOR_PALETTE.length];\n}\n\nfunction parseChartPoints(xml: string): string[] {\n const values = [\n ...xml.matchAll(/<c:pt\\b[\\s\\S]*?<c:v>([\\s\\S]*?)<\\/c:v>[\\s\\S]*?<\\/c:pt>/gi),\n ].map((match) => decodeXmlEntities(match[1] ?? \"\").trim());\n\n if (values.length > 0) {\n return values;\n }\n\n const fallback = [...xml.matchAll(/<c:v>([\\s\\S]*?)<\\/c:v>/gi)].map((match) =>\n decodeXmlEntities(match[1] ?? \"\").trim()\n );\n return fallback;\n}\n\nfunction parseChartTitle(chartXml: string): string | undefined {\n const titleXml = chartXml.match(/<c:title\\b[\\s\\S]*?<\\/c:title>/i)?.[0];\n if (!titleXml) {\n return undefined;\n }\n\n const title = [\n ...titleXml.matchAll(/<(?:a:t|c:v)\\b[^>]*>([\\s\\S]*?)<\\/(?:a:t|c:v)>/gi),\n ]\n .map((match) => decodeXmlEntities(match[1] ?? \"\"))\n .join(\" \")\n .replace(/\\s+/g, \" \")\n .trim();\n\n return title || undefined;\n}\n\nfunction parseChartType(chartXml: string): ParsedChartData[\"kind\"] | undefined {\n if (/<c:barChart\\b/i.test(chartXml)) {\n return \"bar\";\n }\n if (/<c:lineChart\\b/i.test(chartXml)) {\n return \"line\";\n }\n if (/<c:pieChart\\b/i.test(chartXml)) {\n return \"pie\";\n }\n if (/<c:doughnutChart\\b/i.test(chartXml)) {\n return \"doughnut\";\n }\n\n return undefined;\n}\n\nfunction parseChartNumber(rawValue: string): number {\n const parsed = Number(rawValue.replace(/,/g, \"\").trim());\n return Number.isFinite(parsed) ? parsed : 0;\n}\n\nfunction parseChartData(chartXml: string): ParsedChartData | undefined {\n const kind = parseChartType(chartXml);\n if (!kind) {\n return undefined;\n }\n\n const seriesBlocks = extractBalancedTagBlocks(chartXml, \"c:ser\");\n const series = seriesBlocks\n .map((seriesXml, index): ParsedChartSeries | undefined => {\n const name =\n parseChartPoints(\n seriesXml.match(/<c:tx\\b[\\s\\S]*?<\\/c:tx>/i)?.[0] ?? \"\"\n )[0] ?? `Series ${index + 1}`;\n const values = parseChartPoints(\n seriesXml.match(/<c:val\\b[\\s\\S]*?<\\/c:val>/i)?.[0] ?? \"\"\n ).map(parseChartNumber);\n const categories = parseChartPoints(\n seriesXml.match(/<c:cat\\b[\\s\\S]*?<\\/c:cat>/i)?.[0] ?? \"\"\n );\n const color = chartColor(\n seriesXml.match(/<a:srgbClr\\b[^>]*val=\"([^\"]+)\"/i)?.[1],\n index\n );\n\n if (values.length === 0) {\n return undefined;\n }\n\n return {\n name: name.trim() || `Series ${index + 1}`,\n values,\n categories,\n color,\n };\n })\n .filter((item): item is ParsedChartSeries => Boolean(item));\n\n if (series.length === 0) {\n return undefined;\n }\n\n const pointCount = Math.max(\n ...series.map((item) =>\n Math.max(item.values.length, item.categories.length)\n ),\n 0\n );\n const categoriesTemplate =\n series.find((item) => item.categories.length > 0)?.categories ?? [];\n const categories = Array.from({ length: pointCount }, (_, index) => {\n const label = categoriesTemplate[index] ?? `Item ${index + 1}`;\n return label.trim() || `Item ${index + 1}`;\n });\n\n return {\n kind,\n title: parseChartTitle(chartXml),\n categories,\n series: series.map((item) => ({\n ...item,\n values: Array.from({ length: pointCount }, (_, index) =>\n Number.isFinite(item.values[index]) ? item.values[index] : 0\n ),\n })),\n };\n}\n\nfunction svgDataUri(svg: string): string {\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`;\n}\n\nfunction clamp(value: number, minimum: number, maximum: number): number {\n return Math.max(minimum, Math.min(maximum, value));\n}\n\nfunction renderCartesianChartSvg(\n chart: ParsedChartData,\n widthPx: number,\n heightPx: number\n): string {\n const title = chart.title\n ? `<text x=\"16\" y=\"20\" font-size=\"14\" fill=\"#111827\">${escapeXmlText(\n chart.title\n )}</text>`\n : \"\";\n\n const margin = {\n top: chart.title ? 34 : 22,\n right: 20,\n bottom: 54,\n left: 54,\n };\n const plotWidth = Math.max(40, widthPx - margin.left - margin.right);\n const plotHeight = Math.max(40, heightPx - margin.top - margin.bottom);\n\n const allValues = chart.series.flatMap((series) => series.values);\n const maxValue = Math.max(1, ...allValues, 0);\n const gridLines = 4;\n const grid = Array.from({ length: gridLines + 1 }, (_, step) => {\n const value = (maxValue * (gridLines - step)) / gridLines;\n const y = margin.top + (plotHeight * step) / gridLines;\n return `<line x1=\"${margin.left}\" y1=\"${y}\" x2=\"${\n margin.left + plotWidth\n }\" y2=\"${y}\" stroke=\"#e5e7eb\" stroke-width=\"1\"/><text x=\"${\n margin.left - 6\n }\" y=\"${\n y + 4\n }\" text-anchor=\"end\" font-size=\"10\" fill=\"#6b7280\">${value.toFixed(\n 1\n )}</text>`;\n }).join(\"\");\n\n const categoryCount = Math.max(1, chart.categories.length);\n const groupWidth = plotWidth / categoryCount;\n const categoryLabels = chart.categories\n .map((category, index) => {\n const x = margin.left + groupWidth * index + groupWidth / 2;\n return `<text x=\"${x}\" y=\"${\n margin.top + plotHeight + 18\n }\" text-anchor=\"middle\" font-size=\"10\" fill=\"#4b5563\">${escapeXmlText(\n category\n )}</text>`;\n })\n .join(\"\");\n\n let seriesMarkup = \"\";\n if (chart.kind === \"bar\") {\n const seriesCount = Math.max(1, chart.series.length);\n const barGroupWidth = groupWidth * 0.8;\n const barWidth = Math.max(2, barGroupWidth / seriesCount - 2);\n\n seriesMarkup = chart.series\n .map((series, seriesIndex) =>\n series.values\n .map((value, pointIndex) => {\n const safeValue = Math.max(0, value);\n const barHeight = (safeValue / maxValue) * plotHeight;\n const x =\n margin.left +\n pointIndex * groupWidth +\n (groupWidth - barGroupWidth) / 2 +\n seriesIndex * (barGroupWidth / seriesCount);\n const y = margin.top + plotHeight - barHeight;\n return `<rect x=\"${x}\" y=\"${y}\" width=\"${barWidth}\" height=\"${Math.max(\n 1,\n barHeight\n )}\" fill=\"${series.color}\" rx=\"1.5\"/>`;\n })\n .join(\"\")\n )\n .join(\"\");\n } else {\n seriesMarkup = chart.series\n .map((series) => {\n const points = series.values\n .map((value, index) => {\n const safeValue = Math.max(0, value);\n const x = margin.left + groupWidth * index + groupWidth / 2;\n const y =\n margin.top + plotHeight - (safeValue / maxValue) * plotHeight;\n return { x, y };\n })\n .filter(\n (point) => Number.isFinite(point.x) && Number.isFinite(point.y)\n );\n\n if (points.length === 0) {\n return \"\";\n }\n\n const path = points\n .map(\n (point, index) => `${index === 0 ? \"M\" : \"L\"}${point.x} ${point.y}`\n )\n .join(\" \");\n const circles = points\n .map(\n (point) =>\n `<circle cx=\"${point.x}\" cy=\"${point.y}\" r=\"2.5\" fill=\"${series.color}\" />`\n )\n .join(\"\");\n return `<path d=\"${path}\" fill=\"none\" stroke=\"${series.color}\" stroke-width=\"2\" />${circles}`;\n })\n .join(\"\");\n }\n\n const legend = chart.series\n .map((series, index) => {\n const x = margin.left + index * 120;\n const y = 8;\n return `<rect x=\"${x}\" y=\"${y}\" width=\"10\" height=\"10\" rx=\"2\" fill=\"${\n series.color\n }\"/><text x=\"${x + 14}\" y=\"${\n y + 9\n }\" font-size=\"10\" fill=\"#374151\">${escapeXmlText(series.name)}</text>`;\n })\n .join(\"\");\n\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${widthPx}\" height=\"${heightPx}\" viewBox=\"0 0 ${widthPx} ${heightPx}\">\n <rect x=\"0\" y=\"0\" width=\"${widthPx}\" height=\"${heightPx}\" fill=\"#ffffff\"/>\n ${title}\n ${grid}\n <line x1=\"${margin.left}\" y1=\"${margin.top + plotHeight}\" x2=\"${\n margin.left + plotWidth\n }\" y2=\"${margin.top + plotHeight}\" stroke=\"#9ca3af\"/>\n <line x1=\"${margin.left}\" y1=\"${margin.top}\" x2=\"${margin.left}\" y2=\"${\n margin.top + plotHeight\n }\" stroke=\"#9ca3af\"/>\n ${seriesMarkup}\n ${categoryLabels}\n ${legend}\n </svg>`;\n}\n\nfunction polarToCartesian(\n cx: number,\n cy: number,\n radius: number,\n angle: number\n): { x: number; y: number } {\n const radians = ((angle - 90) * Math.PI) / 180;\n return {\n x: cx + radius * Math.cos(radians),\n y: cy + radius * Math.sin(radians),\n };\n}\n\nfunction renderPieChartSvg(\n chart: ParsedChartData,\n widthPx: number,\n heightPx: number\n): string {\n const baseSeries = chart.series[0];\n const values = baseSeries?.values ?? [];\n const total = Math.max(\n 0.0001,\n values.reduce((sum, value) => sum + Math.max(0, value), 0)\n );\n const categories =\n chart.categories.length > 0\n ? chart.categories\n : values.map((_, index) => `Item ${index + 1}`);\n const colors =\n chart.series.length > 1\n ? chart.series.map((item) => item.color)\n : CHART_COLOR_PALETTE;\n\n const centerX = Math.round(widthPx * 0.34);\n const centerY = Math.round(heightPx * 0.56);\n const outerRadius = Math.max(\n 30,\n Math.min(Math.round(Math.min(widthPx, heightPx) * 0.26), 160)\n );\n const innerRadius =\n chart.kind === \"doughnut\" ? Math.round(outerRadius * 0.55) : 0;\n\n let startAngle = 0;\n const slices = values\n .map((value, index) => {\n const safeValue = Math.max(0, value);\n const angle = (safeValue / total) * 360;\n const endAngle = startAngle + Math.max(0.001, angle);\n const largeArcFlag = endAngle - startAngle > 180 ? 1 : 0;\n const fill = colors[index % colors.length];\n\n const startOuter = polarToCartesian(\n centerX,\n centerY,\n outerRadius,\n startAngle\n );\n const endOuter = polarToCartesian(\n centerX,\n centerY,\n outerRadius,\n endAngle\n );\n\n let path = \"\";\n if (innerRadius > 0) {\n const startInner = polarToCartesian(\n centerX,\n centerY,\n innerRadius,\n startAngle\n );\n const endInner = polarToCartesian(\n centerX,\n centerY,\n innerRadius,\n endAngle\n );\n path = `M ${startOuter.x} ${startOuter.y} A ${outerRadius} ${outerRadius} 0 ${largeArcFlag} 1 ${endOuter.x} ${endOuter.y} L ${endInner.x} ${endInner.y} A ${innerRadius} ${innerRadius} 0 ${largeArcFlag} 0 ${startInner.x} ${startInner.y} Z`;\n } else {\n path = `M ${centerX} ${centerY} L ${startOuter.x} ${startOuter.y} A ${outerRadius} ${outerRadius} 0 ${largeArcFlag} 1 ${endOuter.x} ${endOuter.y} Z`;\n }\n\n startAngle = endAngle;\n return `<path d=\"${path}\" fill=\"${fill}\" stroke=\"#ffffff\" stroke-width=\"1\"/>`;\n })\n .join(\"\");\n\n const title = chart.title\n ? `<text x=\"16\" y=\"20\" font-size=\"14\" fill=\"#111827\">${escapeXmlText(\n chart.title\n )}</text>`\n : \"\";\n\n const legend = categories\n .map((category, index) => {\n const x = Math.round(widthPx * 0.63);\n const y = 36 + index * 18;\n const color = colors[index % colors.length];\n const value = values[index] ?? 0;\n return `<rect x=\"${x}\" y=\"${\n y - 8\n }\" width=\"10\" height=\"10\" rx=\"2\" fill=\"${color}\"/><text x=\"${\n x + 14\n }\" y=\"${y}\" font-size=\"10\" fill=\"#374151\">${escapeXmlText(\n category\n )} (${value})</text>`;\n })\n .join(\"\");\n\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${widthPx}\" height=\"${heightPx}\" viewBox=\"0 0 ${widthPx} ${heightPx}\">\n <rect x=\"0\" y=\"0\" width=\"${widthPx}\" height=\"${heightPx}\" fill=\"#ffffff\"/>\n ${title}\n ${slices}\n ${legend}\n </svg>`;\n}\n\nfunction chartXmlToSvgDataUri(\n chartXml: string,\n widthPx: number | undefined,\n heightPx: number | undefined\n): string | undefined {\n const chart = parseChartData(chartXml);\n if (!chart) {\n return undefined;\n }\n\n const safeWidth = clamp(Math.round(widthPx ?? 640), 240, 1600);\n const safeHeight = clamp(Math.round(heightPx ?? 360), 180, 1200);\n\n const svg =\n chart.kind === \"pie\" || chart.kind === \"doughnut\"\n ? renderPieChartSvg(chart, safeWidth, safeHeight)\n : renderCartesianChartSvg(chart, safeWidth, safeHeight);\n\n return svgDataUri(svg);\n}\n\nfunction resolvePreferredDrawingRelationshipId(\n runXml: string\n): string | undefined {\n return (\n runXml.match(\n /<a:ext\\b[^>]*>[\\s\\S]*?<asvg:svgBlip\\b[^>]*r:embed=\"([^\"]+)\"/i\n )?.[1] ??\n runXml.match(\n /<a:ext\\b[^>]*>[\\s\\S]*?<asvg:svgBlip\\b[^>]*r:link=\"([^\"]+)\"/i\n )?.[1] ??\n runXml.match(/<a:blip\\b[^>]*r:embed=\"([^\"]+)\"/i)?.[1] ??\n runXml.match(/<a:blip\\b[^>]*r:link=\"([^\"]+)\"/i)?.[1]\n );\n}\n\nfunction parseRunImageBlock(\n runXml: string,\n context: ParseContext\n): ImageRunNode | undefined {\n const normalizedRunXml = preferAlternateContentChoice(runXml);\n let activeRunXml = normalizedRunXml;\n let extentMatch = activeRunXml.match(\n /<wp:extent\\b[^>]*cx=\"(\\d+)\"[^>]*cy=\"(\\d+)\"/i\n );\n let vmlSize = parseVmlSize(activeRunXml);\n let widthPx = extentMatch?.[1]\n ? emuToPixels(extentMatch[1])\n : vmlSize.widthPx;\n let heightPx = extentMatch?.[2]\n ? emuToPixels(extentMatch[2])\n : vmlSize.heightPx;\n let floating =\n parseFloatingAnchorFromRunXml(activeRunXml) ??\n parseVmlFloatingAnchorFromRunXml(activeRunXml);\n\n const docPrMatch = activeRunXml.match(/<wp:docPr\\b[^>]*>/i);\n const docPrTag = docPrMatch?.[0] ?? \"\";\n const alt =\n getAttribute(docPrTag, \"descr\") ||\n getAttribute(docPrTag, \"title\") ||\n getAttribute(docPrTag, \"name\");\n\n let chartRelationshipId = activeRunXml.match(\n /<c:chart\\b[^>]*r:id=\"([^\"]+)\"/i\n )?.[1];\n let relationshipId =\n resolvePreferredDrawingRelationshipId(activeRunXml) ??\n activeRunXml.match(/<v:imagedata\\b[^>]*r:id=\"([^\"]+)\"/i)?.[1] ??\n chartRelationshipId;\n\n // Prefer the mc:Choice branch when present, but fall back to the full run XML\n // if no image/chart relationship is available there.\n if (!relationshipId && normalizedRunXml !== runXml) {\n activeRunXml = runXml;\n chartRelationshipId = activeRunXml.match(\n /<c:chart\\b[^>]*r:id=\"([^\"]+)\"/i\n )?.[1];\n relationshipId =\n resolvePreferredDrawingRelationshipId(activeRunXml) ??\n activeRunXml.match(/<v:imagedata\\b[^>]*r:id=\"([^\"]+)\"/i)?.[1] ??\n chartRelationshipId;\n\n extentMatch = activeRunXml.match(\n /<wp:extent\\b[^>]*cx=\"(\\d+)\"[^>]*cy=\"(\\d+)\"/i\n );\n vmlSize = parseVmlSize(activeRunXml);\n widthPx = extentMatch?.[1] ? emuToPixels(extentMatch[1]) : vmlSize.widthPx;\n heightPx = extentMatch?.[2]\n ? emuToPixels(extentMatch[2])\n : vmlSize.heightPx;\n floating =\n parseFloatingAnchorFromRunXml(activeRunXml) ??\n parseVmlFloatingAnchorFromRunXml(activeRunXml);\n }\n\n const partName = relationshipId\n ? context.relationships.get(relationshipId)\n : undefined;\n if (relationshipId && !partName) {\n context.warnings.push(`Missing relationship target for ${relationshipId}`);\n }\n\n const contentType = partName\n ? contentTypeForPart(partName, context.contentTypes)\n : undefined;\n const binary = partName ? context.binaryAssets.get(partName) : undefined;\n const crop = parseDrawingImageCrop(activeRunXml);\n const cssFilter = parseDrawingImageCssFilter(activeRunXml);\n const cssOpacity = parseDrawingImageOpacity(activeRunXml);\n\n const likelyChartPart =\n Boolean(chartRelationshipId) ||\n partName?.includes(\"/charts/\") ||\n contentType ===\n \"application/vnd.openxmlformats-officedocument.drawingml.chart+xml\";\n\n const standaloneShapeSvg = renderStandaloneWordShapeSvg(\n activeRunXml,\n widthPx,\n heightPx,\n context\n );\n const containsGroupedOrStandaloneShape = /<wpg:wgp\\b|<wps:wsp\\b/i.test(\n activeRunXml\n );\n const containsTextBoxContent = /<w:txbxContent\\b/i.test(activeRunXml);\n if (\n standaloneShapeSvg &&\n (containsGroupedOrStandaloneShape || !relationshipId)\n ) {\n return {\n type: \"image\",\n src: svgDataUri(standaloneShapeSvg),\n alt: alt ?? (containsTextBoxContent ? \"Text box\" : \"Shape\"),\n widthPx,\n heightPx,\n contentType: \"image/svg+xml\",\n sourceXml: activeRunXml,\n crop,\n cssFilter,\n cssOpacity,\n floating,\n syntheticTextBox: containsTextBoxContent || undefined,\n };\n }\n\n if (likelyChartPart) {\n const chartXml = partName\n ? context.parts.get(partName)?.content\n : undefined;\n if (!chartXml && partName) {\n context.warnings.push(`Missing chart part ${partName}`);\n }\n\n const chartSrc = chartXml\n ? chartXmlToSvgDataUri(chartXml, widthPx, heightPx)\n : undefined;\n if (chartSrc) {\n return {\n type: \"image\",\n src: chartSrc,\n alt: alt ?? \"Chart\",\n widthPx,\n heightPx,\n contentType: \"image/svg+xml\",\n sourceXml: activeRunXml,\n crop,\n cssFilter,\n cssOpacity,\n floating,\n };\n }\n }\n\n if (!relationshipId) {\n const textBoxParagraphs = parseTextBoxParagraphs(activeRunXml, context);\n if (textBoxParagraphs.length === 0) {\n return undefined;\n }\n\n const textBoxSrc = svgDataUri(\n renderTextBoxSvg(\n textBoxParagraphs,\n widthPx,\n heightPx,\n parseTextBoxLayout(activeRunXml)\n )\n );\n return {\n type: \"image\",\n src: textBoxSrc,\n alt: alt ?? \"Text box\",\n widthPx,\n heightPx,\n contentType: \"image/svg+xml\",\n sourceXml: activeRunXml,\n crop,\n cssFilter,\n cssOpacity,\n floating,\n syntheticTextBox: true,\n };\n }\n\n let src: string | undefined;\n let resolvedContentType = contentType;\n let resolvedCssOpacity = cssOpacity;\n if (binary) {\n const mimeType =\n contentTypeForPart(partName ?? \"\", context.contentTypes) ??\n contentType ??\n \"application/octet-stream\";\n if (isWindowsMetafileContentType(mimeType, partName)) {\n src = rasterizeWindowsMetafileToPngDataUri(binary, partName);\n if (src) {\n resolvedContentType = \"image/png\";\n // OOXML alpha modifiers on legacy metafiles do not map cleanly after rasterization.\n // Keeping the CSS opacity as well makes these imports appear doubly faded.\n resolvedCssOpacity = undefined;\n }\n }\n\n if (!src) {\n src = `data:${mimeType};base64,${bytesToBase64(binary)}`;\n resolvedContentType = mimeType;\n }\n }\n\n return {\n type: \"image\",\n src,\n alt,\n widthPx,\n heightPx,\n partName,\n contentType: resolvedContentType,\n data: binary ? new Uint8Array(binary) : undefined,\n sourceXml: activeRunXml,\n crop,\n cssFilter,\n cssOpacity: resolvedCssOpacity,\n floating,\n };\n}\n\nfunction parseRunImages(runXml: string, context: ParseContext): ImageRunNode[] {\n const candidateRanges = extractBalancedTagBlocksInOrder(runXml, [\n \"mc:AlternateContent\",\n \"w:drawing\",\n \"w:pict\",\n \"w:object\",\n ]);\n const candidateXmlBlocks =\n candidateRanges.length > 0\n ? candidateRanges.map((range) => runXml.slice(range.start, range.end))\n : [runXml];\n\n const images: ImageRunNode[] = [];\n const seenKeys = new Set<string>();\n for (const candidateXml of candidateXmlBlocks) {\n const image = parseRunImageBlock(candidateXml, context);\n if (!image) {\n continue;\n }\n\n const dedupeKey = JSON.stringify({\n src: image.src,\n contentType: image.contentType,\n widthPx: image.widthPx,\n heightPx: image.heightPx,\n floating: image.floating,\n syntheticTextBox: image.syntheticTextBox,\n });\n if (seenKeys.has(dedupeKey)) {\n continue;\n }\n seenKeys.add(dedupeKey);\n images.push(image);\n }\n\n return images;\n}\n\nfunction parseRelationshipsFromParts(\n parts: OoxmlPackage[\"parts\"],\n partName: string\n): Map<string, string> {\n const map = new Map<string, string>();\n const relationshipsPartName = relationshipPartNameForPart(partName);\n const relationshipsPart = parts.get(relationshipsPartName)?.content;\n if (!relationshipsPart) {\n return map;\n }\n\n for (const match of relationshipsPart.matchAll(/<Relationship\\b[^>]*>/g)) {\n const tag = match[0];\n const id = getAttribute(tag, \"Id\");\n const target = getAttribute(tag, \"Target\");\n if (!id || !target) {\n continue;\n }\n map.set(id, resolvePartPath(partName, target));\n }\n\n return map;\n}\n\nfunction decodeActiveXBinaryMarkup(binary: Uint8Array): string {\n const utf16 = new TextDecoder(\"utf-16le\", { fatal: false }).decode(binary);\n if (/input\\s+type=/i.test(utf16)) {\n return utf16;\n }\n\n return new TextDecoder(\"latin1\", { fatal: false }).decode(binary);\n}\n\nfunction parseRunActiveXCheckboxField(\n runXml: string,\n context: ParseContext,\n style?: TextStyle,\n link?: string\n): FormFieldRunNode | undefined {\n if (!/<w:object\\b/i.test(runXml) || !/<w:control\\b/i.test(runXml)) {\n return undefined;\n }\n\n const controlTag = runXml.match(/<w:control\\b[^>]*\\/?>/i)?.[0];\n const controlRelationshipId = controlTag\n ? getAttribute(controlTag, \"r:id\")\n : undefined;\n const activeXPartName = controlRelationshipId\n ? context.relationships.get(controlRelationshipId)\n : undefined;\n if (!activeXPartName) {\n return undefined;\n }\n\n const activeXXml = context.parts.get(activeXPartName)?.content;\n if (!activeXXml) {\n return undefined;\n }\n\n const binaryRelationshipId = getAttribute(\n activeXXml.match(/<ax:ocx\\b[^>]*\\/?>/i)?.[0] ?? \"\",\n \"r:id\"\n );\n if (!binaryRelationshipId) {\n return undefined;\n }\n\n const activeXRelationships = parseRelationshipsFromParts(\n context.parts,\n activeXPartName\n );\n const activeXBinaryPartName = activeXRelationships.get(binaryRelationshipId);\n if (!activeXBinaryPartName) {\n return undefined;\n }\n\n const activeXBinary = context.binaryAssets.get(activeXBinaryPartName);\n if (!activeXBinary || activeXBinary.byteLength === 0) {\n return undefined;\n }\n\n const markup = decodeActiveXBinaryMarkup(activeXBinary);\n if (!/input\\s+type\\s*=\\s*\"checkbox\"/i.test(markup)) {\n return undefined;\n }\n\n const name =\n markup.match(/\\bname\\s*=\\s*\"([^\"]+)\"/i)?.[1]?.trim() || undefined;\n\n return {\n type: \"form-field\",\n fieldType: \"checkbox\",\n sourceKind: \"legacy\",\n checked: /\\bchecked\\b/i.test(markup),\n checkedSymbol: \"☒\",\n uncheckedSymbol: \"☐\",\n widget: {\n name,\n },\n style,\n link,\n sourceXml: runXml,\n };\n}\n\ninterface ParagraphRunToken {\n xml: string;\n start: number;\n end: number;\n link?: string;\n}\n\nfunction hyperlinkHrefFromTag(\n hyperlinkTag: string,\n context: ParseContext\n): string | undefined {\n const relationshipId = getAttribute(hyperlinkTag, \"r:id\");\n const anchor = getAttribute(hyperlinkTag, \"w:anchor\");\n\n const relationshipTarget = relationshipId\n ? context.relationships.get(relationshipId)\n : undefined;\n if (relationshipId && !relationshipTarget) {\n context.warnings.push(\n `Missing hyperlink relationship target for ${relationshipId}`\n );\n }\n\n if (anchor && relationshipTarget) {\n return relationshipTarget.includes(\"#\")\n ? relationshipTarget\n : `${relationshipTarget}#${anchor}`;\n }\n if (relationshipTarget) {\n return relationshipTarget;\n }\n if (anchor) {\n return `#${anchor}`;\n }\n\n return undefined;\n}\n\nfunction hyperlinkHrefFromFieldInstruction(\n rawInstruction: string\n): string | undefined {\n if (!rawInstruction) {\n return undefined;\n }\n\n const instruction = decodeXmlEntities(rawInstruction)\n .replace(/\\s+/g, \" \")\n .trim();\n if (!/\\bHYPERLINK\\b/i.test(instruction)) {\n return undefined;\n }\n\n const anchorMatch = instruction.match(/\\\\l\\s+\"([^\"]+)\"/i);\n const explicitTargetMatch = instruction.match(\n /\\bHYPERLINK\\b\\s+(?:\"([^\"]+)\"|([^\\s\\\\]+))/i\n );\n\n const target = explicitTargetMatch?.[1] ?? explicitTargetMatch?.[2];\n if (target) {\n if (anchorMatch?.[1] && !target.includes(\"#\")) {\n return `${target}#${anchorMatch[1]}`;\n }\n return target;\n }\n\n if (anchorMatch?.[1]) {\n return `#${anchorMatch[1]}`;\n }\n\n return undefined;\n}\n\nfunction parseParagraphRuns(\n paragraphXml: string,\n context: ParseContext\n): ParagraphRunToken[] {\n const runRanges = extractBalancedTagRanges(paragraphXml, \"w:r\");\n if (runRanges.length === 0) {\n return [];\n }\n\n const hyperlinkRanges = extractBalancedTagRanges(\n paragraphXml,\n \"w:hyperlink\"\n ).map((range) => {\n const hyperlinkXml = paragraphXml.slice(range.start, range.end);\n const hyperlinkTag = hyperlinkXml.match(/<w:hyperlink\\b[^>]*>/i)?.[0] ?? \"\";\n\n return {\n ...range,\n href: hyperlinkHrefFromTag(hyperlinkTag, context),\n };\n });\n\n const fieldLinksByRun = new Map<number, string>();\n let fieldDepth = 0;\n let instructionParts: string[] = [];\n let activeFieldLink: string | undefined;\n\n runRanges.forEach((range, runIndex) => {\n const runXml = paragraphXml.slice(range.start, range.end);\n\n const beginCount = [\n ...runXml.matchAll(/<w:fldChar\\b[^>]*w:fldCharType=\"begin\"[^>]*\\/?>/gi),\n ].length;\n const separateCount = [\n ...runXml.matchAll(\n /<w:fldChar\\b[^>]*w:fldCharType=\"separate\"[^>]*\\/?>/gi\n ),\n ].length;\n const endCount = [\n ...runXml.matchAll(/<w:fldChar\\b[^>]*w:fldCharType=\"end\"[^>]*\\/?>/gi),\n ].length;\n\n if (beginCount > 0 && fieldDepth === 0) {\n instructionParts = [];\n activeFieldLink = undefined;\n }\n fieldDepth += beginCount;\n\n if (fieldDepth > 0 && activeFieldLink === undefined) {\n for (const instructionMatch of runXml.matchAll(\n /<w:instrText\\b[^>]*>([\\s\\S]*?)<\\/w:instrText>/gi\n )) {\n instructionParts.push(instructionMatch[1] ?? \"\");\n }\n }\n\n if (fieldDepth > 0 && separateCount > 0 && activeFieldLink === undefined) {\n activeFieldLink = hyperlinkHrefFromFieldInstruction(\n instructionParts.join(\" \")\n );\n }\n\n if (fieldDepth > 0 && activeFieldLink) {\n if (\n /<(?:w:t|a:t)\\b/i.test(runXml) ||\n /<w:(?:drawing|pict)\\b/i.test(runXml)\n ) {\n fieldLinksByRun.set(runIndex, activeFieldLink);\n }\n }\n\n if (endCount > 0) {\n fieldDepth = Math.max(0, fieldDepth - endCount);\n if (fieldDepth === 0) {\n instructionParts = [];\n activeFieldLink = undefined;\n }\n }\n });\n\n return runRanges.map((range, runIndex) => {\n const link =\n hyperlinkRanges.find(\n (hyperlinkRange) =>\n range.start >= hyperlinkRange.start &&\n range.end <= hyperlinkRange.end &&\n hyperlinkRange.href\n )?.href ?? fieldLinksByRun.get(runIndex);\n\n return {\n xml: paragraphXml.slice(range.start, range.end),\n start: range.start,\n end: range.end,\n link,\n };\n });\n}\n\ninterface ParagraphFormFieldToken {\n start: number;\n end: number;\n field: FormFieldRunNode;\n}\n\nfunction onOffValueToBoolean(value: string | undefined): boolean | undefined {\n if (!value) {\n return undefined;\n }\n\n const normalized = value.trim().toLowerCase();\n if (!normalized) {\n return undefined;\n }\n\n if ([\"0\", \"false\", \"off\", \"no\"].includes(normalized)) {\n return false;\n }\n\n return true;\n}\n\nfunction decodeHexCodePoint(value: string | undefined): string | undefined {\n if (!value) {\n return undefined;\n }\n\n const normalized = value.trim().replace(/^0x/i, \"\");\n if (!/^[0-9a-f]+$/i.test(normalized)) {\n return undefined;\n }\n\n const codePoint = Number.parseInt(normalized, 16);\n if (!Number.isFinite(codePoint) || codePoint <= 0) {\n return undefined;\n }\n\n try {\n return String.fromCodePoint(codePoint);\n } catch {\n return undefined;\n }\n}\n\nfunction decodeXmlAttribute(value: string | undefined): string | undefined {\n if (!value) {\n return undefined;\n }\n return decodeXmlEntities(value);\n}\n\nfunction parseOnOffTagValue(\n tagXml: string | undefined,\n attributes: string[] = [\"w:val\"]\n): boolean | undefined {\n if (!tagXml) {\n return undefined;\n }\n\n for (const attribute of attributes) {\n const rawValue = getAttribute(tagXml, attribute);\n if (rawValue !== undefined) {\n return onOffValueToBoolean(rawValue);\n }\n }\n\n return true;\n}\n\nfunction normalizeLegacyFormDisplayValue(\n value: string | undefined\n): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n const normalized = value\n .replace(/\\u2002/g, \" \")\n .replace(/\\u2003/g, \" \")\n .replace(/\\u00a0/g, \" \");\n return normalized.trim().length > 0 ? normalized : undefined;\n}\n\nfunction parseLegacyFormFieldFromRange(\n paragraphXml: string,\n runs: ParagraphRunToken[],\n context: ParseContext,\n paragraphStyleId: string | undefined,\n startRunIndex: number,\n separateRunIndex: number | undefined,\n endRunIndex: number,\n rawInstruction: string,\n ffDataXml: string | undefined\n): FormFieldRunNode | undefined {\n const instruction = decodeXmlEntities(rawInstruction)\n .replace(/\\s+/g, \" \")\n .trim();\n const normalizedInstruction = instruction.toUpperCase();\n const fieldType: FormFieldType | undefined = normalizedInstruction.includes(\n \"FORMCHECKBOX\"\n )\n ? \"checkbox\"\n : normalizedInstruction.includes(\"FORMDROPDOWN\")\n ? \"dropdown\"\n : normalizedInstruction.includes(\"FORMTEXT\")\n ? \"text\"\n : undefined;\n\n if (!fieldType) {\n return undefined;\n }\n\n const resultStartRunIndex =\n separateRunIndex !== undefined\n ? separateRunIndex + 1\n : Math.min(endRunIndex, startRunIndex + 1);\n const resultRuns =\n resultStartRunIndex < endRunIndex\n ? runs.slice(resultStartRunIndex, endRunIndex)\n : [];\n const fallbackResultText = normalizeLegacyFormDisplayValue(\n resultRuns.map((run) => parseRunText(run.xml)).join(\"\")\n );\n const styleRunXml =\n resultRuns.find((run) => {\n const text = parseRunText(run.xml);\n return text.trim().length > 0 || /<w:sym\\b/i.test(run.xml);\n })?.xml ?? runs[startRunIndex]?.xml;\n const style = styleRunXml\n ? parseRunStyle(styleRunXml, context, paragraphStyleId)\n : undefined;\n const link = runs\n .slice(startRunIndex, Math.min(runs.length, endRunIndex + 1))\n .map((run) => run.link)\n .find((candidate): candidate is string => typeof candidate === \"string\");\n const fieldXml =\n runs[startRunIndex] && runs[endRunIndex]\n ? paragraphXml.slice(runs[startRunIndex].start, runs[endRunIndex].end)\n : undefined;\n\n const nameTag = ffDataXml?.match(/<w:name\\b[^>]*\\/?>/i)?.[0];\n const enabled = ffDataXml\n ? parseOnOffAttribute(ffDataXml, \"enabled\")\n : undefined;\n const calcOnExit = ffDataXml\n ? parseOnOffAttribute(ffDataXml, \"calcOnExit\")\n : undefined;\n const widgetSettings: FormFieldWidgetSettings = {\n name: decodeXmlAttribute(\n nameTag ? getAttribute(nameTag, \"w:val\") : undefined\n ),\n enabled,\n calcOnExit,\n };\n\n if (fieldType === \"checkbox\") {\n const checkboxXml =\n extractBalancedTagBlocks(ffDataXml ?? \"\", \"w:checkBox\")[0] ??\n ffDataXml?.match(/<w:checkBox\\b[^>]*\\/?>/i)?.[0];\n const defaultTag = checkboxXml?.match(/<w:default\\b[^>]*\\/?>/i)?.[0];\n const checkedTag = checkboxXml?.match(/<w:checked\\b[^>]*\\/?>/i)?.[0];\n const sizeAutoTag = checkboxXml?.match(/<w:sizeAuto\\b[^>]*\\/?>/i)?.[0];\n const sizeTag = checkboxXml?.match(/<w:size\\b[^>]*\\/?>/i)?.[0];\n const defaultChecked = parseOnOffTagValue(defaultTag);\n const checked = parseOnOffTagValue(checkedTag) ?? defaultChecked;\n const sizeValue = sizeTag\n ? parseIntegerAttribute(sizeTag, \"w:val\")\n : undefined;\n const sizePt =\n Number.isFinite(sizeValue) && (sizeValue as number) > 0\n ? Number(((sizeValue as number) / 2).toFixed(2))\n : undefined;\n const sizeMode = sizeAutoTag ? \"auto\" : sizePt ? \"exact\" : undefined;\n\n if (\n defaultChecked !== undefined ||\n sizeMode !== undefined ||\n sizePt !== undefined\n ) {\n widgetSettings.checkbox = {\n defaultChecked,\n sizeMode,\n sizePt,\n };\n }\n\n return {\n type: \"form-field\",\n fieldType: \"checkbox\",\n sourceKind: \"legacy\",\n checked: checked ?? false,\n checkedSymbol: \"☒\",\n uncheckedSymbol: \"☐\",\n widget: widgetSettings,\n style,\n link,\n sourceXml: fieldXml,\n };\n }\n\n if (fieldType === \"dropdown\") {\n const dropdownXml =\n extractBalancedTagBlocks(ffDataXml ?? \"\", \"w:ddList\")[0] ??\n ffDataXml?.match(/<w:ddList\\b[^>]*\\/?>/i)?.[0];\n const options = dropdownXml\n ? [...dropdownXml.matchAll(/<w:listEntry\\b[^>]*\\/?>/gi)]\n .map((match) =>\n decodeXmlAttribute(getAttribute(match[0], \"w:val\"))?.trim()\n )\n .filter((entry): entry is string => Boolean(entry))\n .map((entry) => ({\n displayText: entry,\n value: entry,\n }))\n : [];\n const defaultTag = dropdownXml?.match(/<w:default\\b[^>]*\\/?>/i)?.[0];\n const defaultValue = decodeXmlAttribute(\n defaultTag ? getAttribute(defaultTag, \"w:val\") : undefined\n )?.trim();\n if (defaultValue) {\n widgetSettings.dropdown = {\n defaultValue,\n };\n }\n const value = fallbackResultText ?? defaultValue ?? options[0]?.displayText;\n\n return {\n type: \"form-field\",\n fieldType: \"dropdown\",\n sourceKind: \"legacy\",\n value: value || undefined,\n options: options.length > 0 ? options : undefined,\n widget: widgetSettings,\n style,\n link,\n sourceXml: fieldXml,\n };\n }\n\n const textInputXml =\n extractBalancedTagBlocks(ffDataXml ?? \"\", \"w:textInput\")[0] ??\n ffDataXml?.match(/<w:textInput\\b[^>]*\\/?>/i)?.[0];\n const typeTag = textInputXml?.match(/<w:type\\b[^>]*\\/?>/i)?.[0];\n const defaultTag = textInputXml?.match(/<w:default\\b[^>]*\\/?>/i)?.[0];\n const maxLengthTag = textInputXml?.match(/<w:maxLength\\b[^>]*\\/?>/i)?.[0];\n const formatTag = textInputXml?.match(/<w:format\\b[^>]*\\/?>/i)?.[0];\n const inputTypeRaw = decodeXmlAttribute(\n typeTag ? getAttribute(typeTag, \"w:val\") : undefined\n )?.trim();\n const inputType = inputTypeRaw\n ? (inputTypeRaw as FormFieldTextWidgetSettings[\"inputType\"])\n : undefined;\n const defaultText = decodeXmlAttribute(\n defaultTag ? getAttribute(defaultTag, \"w:val\") : undefined\n );\n const maxLength = maxLengthTag\n ? parseIntegerAttribute(maxLengthTag, \"w:val\")\n : undefined;\n const textFormat = decodeXmlAttribute(\n formatTag ? getAttribute(formatTag, \"w:val\") : undefined\n );\n if (\n inputType !== undefined ||\n defaultText !== undefined ||\n maxLength !== undefined ||\n textFormat !== undefined\n ) {\n widgetSettings.text = {\n inputType,\n defaultText,\n maxLength,\n textFormat,\n };\n }\n const value = fallbackResultText ?? defaultText;\n\n return {\n type: \"form-field\",\n fieldType: \"text\",\n sourceKind: \"legacy\",\n value: value || undefined,\n widget: widgetSettings,\n style,\n link,\n sourceXml: fieldXml,\n };\n}\n\nfunction parseLegacyParagraphFormFieldTokens(\n paragraphXml: string,\n runs: ParagraphRunToken[],\n context: ParseContext,\n paragraphStyleId?: string\n): ParagraphFormFieldToken[] {\n if (runs.length === 0) {\n return [];\n }\n\n const tokens: ParagraphFormFieldToken[] = [];\n const stack: Array<{\n startRunIndex: number;\n separateRunIndex?: number;\n instructionParts: string[];\n ffDataXml?: string;\n }> = [];\n const inlineTokenPattern =\n /<w:fldChar\\b[^>]*\\bw:fldCharType=\"(begin|separate|end)\"[^>]*>([\\s\\S]*?)<\\/w:fldChar>|<w:fldChar\\b[^>]*\\bw:fldCharType=\"(begin|separate|end)\"[^>]*\\/>|<w:instrText\\b[^>]*>([\\s\\S]*?)<\\/w:instrText>/gi;\n\n runs.forEach((run, runIndex) => {\n const runXml = run.xml;\n let match: RegExpExecArray | null;\n while ((match = inlineTokenPattern.exec(runXml)) !== null) {\n const instructionChunk = match[4];\n if (instructionChunk !== undefined) {\n const current = stack[stack.length - 1];\n if (current) {\n current.instructionParts.push(instructionChunk);\n }\n continue;\n }\n\n const fieldType = (match[1] ?? match[3] ?? \"\").toLowerCase();\n if (fieldType === \"begin\") {\n const fieldXml = match[0];\n const ffDataXml =\n extractBalancedTagBlocks(fieldXml, \"w:ffData\")[0] ??\n fieldXml.match(/<w:ffData\\b[^>]*\\/?>/i)?.[0];\n stack.push({\n startRunIndex: runIndex,\n instructionParts: [],\n ffDataXml,\n });\n continue;\n }\n\n if (fieldType === \"separate\") {\n const current = stack[stack.length - 1];\n if (current && current.separateRunIndex === undefined) {\n current.separateRunIndex = runIndex;\n }\n continue;\n }\n\n if (fieldType === \"end\") {\n const current = stack.pop();\n if (!current) {\n continue;\n }\n\n const field = parseLegacyFormFieldFromRange(\n paragraphXml,\n runs,\n context,\n paragraphStyleId,\n current.startRunIndex,\n current.separateRunIndex,\n runIndex,\n current.instructionParts.join(\" \"),\n current.ffDataXml\n );\n if (!field) {\n continue;\n }\n\n const start = runs[current.startRunIndex]?.start;\n const end = runs[runIndex]?.end;\n if (start === undefined || end === undefined || end <= start) {\n continue;\n }\n\n tokens.push({\n start,\n end,\n field,\n });\n }\n }\n });\n\n return tokens;\n}\n\nfunction parseFormFieldFromSdtXml(\n sdtXml: string,\n context: ParseContext,\n paragraphStyleId?: string,\n link?: string\n): FormFieldRunNode | undefined {\n const sdtPropertiesXml =\n extractBalancedTagBlocks(sdtXml, \"w:sdtPr\")[0] ??\n sdtXml.match(/<w:sdtPr\\b[^>]*\\/>/i)?.[0] ??\n \"\";\n const sdtContentXml =\n extractBalancedTagBlocks(sdtXml, \"w:sdtContent\")[0] ?? \"\";\n if (!sdtPropertiesXml) {\n return undefined;\n }\n\n const aliasTag = sdtPropertiesXml.match(/<w:alias\\b[^>]*\\/?>/i)?.[0];\n const tagTag = sdtPropertiesXml.match(/<w:tag\\b[^>]*\\/?>/i)?.[0];\n const idTag = sdtPropertiesXml.match(/<w:id\\b[^>]*\\/?>/i)?.[0];\n const placeholderTag = sdtPropertiesXml.match(\n /<w:placeholder\\b[\\s\\S]*?<\\/w:placeholder>/i\n )?.[0];\n const placeholderDocPartTag = placeholderTag?.match(\n /<w:docPart\\b[^>]*\\/?>/i\n )?.[0];\n const title = decodeXmlAttribute(\n aliasTag ? getAttribute(aliasTag, \"w:val\") : undefined\n );\n const tag = decodeXmlAttribute(\n tagTag ? getAttribute(tagTag, \"w:val\") : undefined\n );\n const idValue = idTag ? parseIntegerAttribute(idTag, \"w:val\") : undefined;\n const placeholder = decodeXmlAttribute(\n placeholderDocPartTag\n ? getAttribute(placeholderDocPartTag, \"w:val\")\n : undefined\n );\n const firstRunXml = extractBalancedTagBlocks(sdtContentXml, \"w:r\")[0];\n const style = firstRunXml\n ? parseRunStyle(firstRunXml, context, paragraphStyleId)\n : undefined;\n const contentText = parseRunText(sdtContentXml);\n const trimmedContentText = contentText.trim();\n\n if (/<w14:checkbox\\b/i.test(sdtPropertiesXml)) {\n const checkedTag = sdtPropertiesXml.match(/<w14:checked\\b[^>]*\\/?>/i)?.[0];\n const checkedValue = checkedTag\n ? getAttribute(checkedTag, \"w14:val\") ?? getAttribute(checkedTag, \"w:val\")\n : undefined;\n const checkedStateTag = sdtPropertiesXml.match(\n /<w14:checkedState\\b[^>]*\\/?>/i\n )?.[0];\n const uncheckedStateTag = sdtPropertiesXml.match(\n /<w14:uncheckedState\\b[^>]*\\/?>/i\n )?.[0];\n const checkedSymbol =\n decodeHexCodePoint(\n checkedStateTag\n ? getAttribute(checkedStateTag, \"w14:val\") ??\n getAttribute(checkedStateTag, \"w:val\")\n : undefined\n ) ?? \"☒\";\n const uncheckedSymbol =\n decodeHexCodePoint(\n uncheckedStateTag\n ? getAttribute(uncheckedStateTag, \"w14:val\") ??\n getAttribute(uncheckedStateTag, \"w:val\")\n : undefined\n ) ?? \"☐\";\n const checked =\n onOffValueToBoolean(checkedValue) ??\n (trimmedContentText\n ? trimmedContentText.includes(checkedSymbol)\n : undefined);\n\n return {\n type: \"form-field\",\n fieldType: \"checkbox\",\n sourceKind: \"sdt\",\n id: idValue,\n tag,\n title,\n placeholder,\n checked: checked ?? false,\n checkedSymbol,\n uncheckedSymbol,\n style,\n link,\n sourceXml: sdtXml,\n };\n }\n\n if (/<w:(?:dropDownList|comboBox)\\b/i.test(sdtPropertiesXml)) {\n const options: FormFieldOption[] = [];\n for (const match of sdtPropertiesXml.matchAll(/<w:listItem\\b[^>]*\\/?>/gi)) {\n const listItemTag = match[0];\n const displayText = decodeXmlAttribute(\n getAttribute(listItemTag, \"w:displayText\")\n );\n const value = decodeXmlAttribute(getAttribute(listItemTag, \"w:value\"));\n const fallbackText = (displayText ?? value ?? \"\").trim();\n if (!fallbackText) {\n continue;\n }\n\n options.push({\n displayText: (displayText ?? value ?? \"\").trim(),\n value: value?.trim() || undefined,\n });\n }\n const lastValueTag = sdtPropertiesXml.match(\n /<w:lastValue\\b[^>]*\\/?>/i\n )?.[0];\n const lastValue = decodeXmlAttribute(\n lastValueTag ? getAttribute(lastValueTag, \"w:val\") : undefined\n )?.trim();\n const selectedValue = trimmedContentText || lastValue;\n\n return {\n type: \"form-field\",\n fieldType: \"dropdown\",\n sourceKind: \"sdt\",\n id: idValue,\n tag,\n title,\n placeholder,\n value: selectedValue || undefined,\n options: options.length > 0 ? options : undefined,\n style,\n link,\n sourceXml: sdtXml,\n };\n }\n\n if (/<w:date\\b/i.test(sdtPropertiesXml)) {\n const fullDateTag = sdtPropertiesXml.match(/<w:fullDate\\b[^>]*\\/?>/i)?.[0];\n const fullDate = decodeXmlAttribute(\n fullDateTag ? getAttribute(fullDateTag, \"w:val\") : undefined\n )?.trim();\n const value = trimmedContentText || fullDate;\n\n return {\n type: \"form-field\",\n fieldType: \"date\",\n sourceKind: \"sdt\",\n id: idValue,\n tag,\n title,\n placeholder,\n value: value || undefined,\n style,\n link,\n sourceXml: sdtXml,\n };\n }\n\n if (/<w:(?:text|richText)\\b/i.test(sdtPropertiesXml)) {\n return {\n type: \"form-field\",\n fieldType: \"text\",\n sourceKind: \"sdt\",\n id: idValue,\n tag,\n title,\n placeholder,\n value: contentText,\n style,\n link,\n sourceXml: sdtXml,\n };\n }\n\n return undefined;\n}\n\nfunction parseParagraphFormFieldTokens(\n paragraphXml: string,\n context: ParseContext,\n paragraphStyleId?: string,\n runs?: ParagraphRunToken[]\n): ParagraphFormFieldToken[] {\n const paragraphRuns = runs ?? parseParagraphRuns(paragraphXml, context);\n const sdtRanges = extractBalancedTagRanges(paragraphXml, \"w:sdt\");\n const sdtTokens: ParagraphFormFieldToken[] = [];\n const legacyTokens = parseLegacyParagraphFormFieldTokens(\n paragraphXml,\n paragraphRuns,\n context,\n paragraphStyleId\n );\n\n if (sdtRanges.length === 0) {\n return legacyTokens;\n }\n\n const hyperlinkRanges = extractBalancedTagRanges(\n paragraphXml,\n \"w:hyperlink\"\n ).map((range) => {\n const hyperlinkXml = paragraphXml.slice(range.start, range.end);\n const hyperlinkTag = hyperlinkXml.match(/<w:hyperlink\\b[^>]*>/i)?.[0] ?? \"\";\n return {\n ...range,\n href: hyperlinkHrefFromTag(hyperlinkTag, context),\n };\n });\n\n sdtRanges\n .map((range) => {\n const sdtXml = paragraphXml.slice(range.start, range.end);\n const link = hyperlinkRanges.find(\n (hyperlinkRange) =>\n range.start >= hyperlinkRange.start &&\n range.end <= hyperlinkRange.end &&\n hyperlinkRange.href\n )?.href;\n const field = parseFormFieldFromSdtXml(\n sdtXml,\n context,\n paragraphStyleId,\n link\n );\n if (!field) {\n return undefined;\n }\n\n return {\n start: range.start,\n end: range.end,\n field,\n };\n })\n .filter((token): token is ParagraphFormFieldToken => token !== undefined)\n .forEach((token) => {\n sdtTokens.push(token);\n });\n\n return [...legacyTokens, ...sdtTokens].sort(\n (left, right) => left.start - right.start\n );\n}\n\nfunction parseParagraphStyle(\n paragraphXml: string,\n context: ParseContext\n): ParagraphStyle | undefined {\n const paragraphPropertiesXml =\n extractBalancedTagBlocks(paragraphXml, \"w:pPr\")[0] ??\n paragraphXml.match(/<w:pPr\\b[^>]*\\/>/i)?.[0] ??\n \"\";\n const alignmentMatch = paragraphPropertiesXml.match(\n /<w:jc\\b[^>]*w:val=\"([^\"]+)\"/i\n );\n const pStyleMatch = paragraphPropertiesXml.match(\n /<w:pStyle\\b[^>]*w:val=\"([^\"]+)\"/i\n );\n const directSpacing = parseParagraphSpacingFromXml(paragraphPropertiesXml);\n const directIndent = parseParagraphIndentFromXml(paragraphPropertiesXml);\n const directBackgroundColor = parseParagraphShadingFromXml(\n paragraphPropertiesXml\n );\n const directBorders = parseParagraphBorderSetFromXml(paragraphPropertiesXml);\n const directNumbering = parseParagraphNumberingFromXml(\n paragraphPropertiesXml\n );\n const directTabStops = parseParagraphTabStopsFromXml(paragraphPropertiesXml);\n const directDropCap = parseParagraphDropCapFromXml(paragraphPropertiesXml);\n const directContextualSpacing = parseOnOffAttribute(\n paragraphPropertiesXml,\n \"contextualSpacing\"\n );\n const directKeepNext = parseOnOffAttribute(\n paragraphPropertiesXml,\n \"keepNext\"\n );\n const directKeepLines = parseOnOffAttribute(\n paragraphPropertiesXml,\n \"keepLines\"\n );\n const directWidowControl = parseOnOffAttribute(\n paragraphPropertiesXml,\n \"widowControl\"\n );\n const directPageBreakBefore = parseOnOffAttribute(\n paragraphPropertiesXml,\n \"pageBreakBefore\"\n );\n const hasDirectNumPr = /<w:numPr\\b/i.test(paragraphPropertiesXml);\n\n const explicitStyleId = pStyleMatch?.[1];\n const styleId = explicitStyleId ?? context.styleSheet.defaultParagraphStyleId;\n const inherited = styleId\n ? context.styleSheet.paragraphStyleById.get(styleId)\n : undefined;\n const defaultParagraphStyle = context.styleSheet.defaultParagraphStyle;\n\n const align =\n normalizeAlignment(alignmentMatch?.[1]) ??\n inherited?.align ??\n defaultParagraphStyle?.align;\n const headingLevel =\n normalizeHeadingLevel(explicitStyleId) ??\n inherited?.headingLevel ??\n defaultParagraphStyle?.headingLevel;\n const numbering = hasDirectNumPr\n ? directNumbering\n : directNumbering ??\n inherited?.numbering ??\n defaultParagraphStyle?.numbering;\n const spacing = mergeParagraphSpacing(\n mergeParagraphSpacing(defaultParagraphStyle?.spacing, inherited?.spacing),\n directSpacing\n );\n const indent = mergeParagraphIndent(\n mergeParagraphIndent(defaultParagraphStyle?.indent, inherited?.indent),\n directIndent\n );\n const backgroundColor = mergeParagraphBackgroundColor(\n mergeParagraphBackgroundColor(\n defaultParagraphStyle?.backgroundColor,\n inherited?.backgroundColor\n ),\n directBackgroundColor\n );\n const borders = mergeParagraphBorderSets(\n mergeParagraphBorderSets(\n defaultParagraphStyle?.borders,\n inherited?.borders\n ),\n directBorders\n );\n const tabStops = mergeParagraphTabStops(\n mergeParagraphTabStops(\n defaultParagraphStyle?.tabStops,\n inherited?.tabStops\n ),\n directTabStops\n );\n const contextualSpacing = mergeParagraphBoolean(\n mergeParagraphBoolean(\n defaultParagraphStyle?.contextualSpacing,\n inherited?.contextualSpacing\n ),\n directContextualSpacing\n );\n const keepNext = mergeParagraphBoolean(\n mergeParagraphBoolean(defaultParagraphStyle?.keepNext, inherited?.keepNext),\n directKeepNext\n );\n const keepLines = mergeParagraphBoolean(\n mergeParagraphBoolean(\n defaultParagraphStyle?.keepLines,\n inherited?.keepLines\n ),\n directKeepLines\n );\n const widowControl = mergeParagraphBoolean(\n mergeParagraphBoolean(\n defaultParagraphStyle?.widowControl,\n inherited?.widowControl\n ),\n directWidowControl\n );\n const pageBreakBefore = mergeParagraphBoolean(\n mergeParagraphBoolean(\n defaultParagraphStyle?.pageBreakBefore,\n inherited?.pageBreakBefore\n ),\n directPageBreakBefore\n );\n const styleName = inherited?.name;\n\n if (\n !align &&\n !headingLevel &&\n !styleId &&\n !styleName &&\n !numbering &&\n !spacing &&\n !indent &&\n !backgroundColor &&\n !borders &&\n (!tabStops || tabStops.length === 0) &&\n !directDropCap &&\n contextualSpacing === undefined &&\n keepNext === undefined &&\n keepLines === undefined &&\n widowControl === undefined &&\n pageBreakBefore === undefined\n ) {\n return undefined;\n }\n\n return {\n align,\n headingLevel,\n styleId,\n styleName,\n numbering,\n spacing,\n indent,\n backgroundColor,\n borders,\n tabStops,\n dropCap: directDropCap,\n contextualSpacing,\n keepNext,\n keepLines,\n widowControl,\n pageBreakBefore,\n };\n}\n\nfunction parseParagraph(\n paragraphXml: string,\n context: ParseContext\n): ParagraphNode {\n const children: ParagraphChildNode[] = [];\n const paragraphStyle = parseParagraphStyle(paragraphXml, context);\n const paragraphMarkDeleted = /<w:pPr\\b[\\s\\S]*?<w:rPr\\b[\\s\\S]*?<w:del\\b/i.test(\n paragraphXml\n );\n const runs = parseParagraphRuns(paragraphXml, context);\n const formFieldTokens = parseParagraphFormFieldTokens(\n paragraphXml,\n context,\n paragraphStyle?.styleId,\n runs\n );\n const contentTokens: Array<\n | {\n kind: \"run\";\n start: number;\n token: ParagraphRunToken;\n }\n | {\n kind: \"form-field\";\n start: number;\n token: ParagraphFormFieldToken;\n }\n > = [];\n\n for (const run of runs) {\n const insideFormField = formFieldTokens.some(\n (formFieldToken) =>\n run.start >= formFieldToken.start && run.end <= formFieldToken.end\n );\n if (insideFormField) {\n continue;\n }\n\n contentTokens.push({\n kind: \"run\",\n start: run.start,\n token: run,\n });\n }\n\n for (const formFieldToken of formFieldTokens) {\n contentTokens.push({\n kind: \"form-field\",\n start: formFieldToken.start,\n token: formFieldToken,\n });\n }\n\n contentTokens.sort((left, right) => left.start - right.start);\n\n for (const contentToken of contentTokens) {\n if (contentToken.kind === \"form-field\") {\n children.push(contentToken.token.field);\n continue;\n }\n\n const run = contentToken.token;\n const style = parseRunStyle(run.xml, context, paragraphStyle?.styleId);\n const activeXCheckboxField = parseRunActiveXCheckboxField(\n run.xml,\n context,\n style,\n run.link\n );\n if (activeXCheckboxField) {\n children.push(activeXCheckboxField);\n continue;\n }\n\n const images = parseRunImages(run.xml, context);\n const parsedTokens = parseRunTextTokens(\n images.some((image) => image.syntheticTextBox)\n ? stripTextBoxContent(run.xml)\n : run.xml\n );\n\n for (const token of parsedTokens) {\n if (token.text.length === 0 && !token.noteReference) {\n continue;\n }\n\n children.push({\n type: \"text\",\n text: token.text,\n style,\n link: run.link,\n noteReference: token.noteReference,\n });\n }\n\n for (const image of images) {\n children.push(image);\n }\n }\n\n if (children.length === 0) {\n children.push({ type: \"text\", text: \"\" });\n }\n\n return {\n type: \"paragraph\",\n style: paragraphStyle,\n paragraphMarkDeleted: paragraphMarkDeleted || undefined,\n children,\n sourceXml: paragraphXml,\n };\n}\n\ninterface ParsedTableCellResult {\n cell: TableCellNode;\n vMerge?: \"restart\" | \"continue\";\n}\n\nfunction parseTableCellContent(\n cellXml: string,\n context: ParseContext\n): TableCellContentNode[] {\n const blockRanges = extractBalancedTagBlocksInOrder(cellXml, [\n \"w:p\",\n \"w:tbl\",\n ]);\n\n const parsed = blockRanges\n .map((block) => {\n const blockXml = cellXml.slice(block.start, block.end);\n if (blockXml.startsWith(\"<w:p\")) {\n return parseParagraph(blockXml, context);\n }\n if (blockXml.startsWith(\"<w:tbl\")) {\n return parseTable(blockXml, context);\n }\n return undefined;\n })\n .filter((block): block is TableCellContentNode => Boolean(block));\n\n if (parsed.length > 0) {\n return parsed;\n }\n\n return [parseParagraph(\"<w:p><w:r><w:t/></w:r></w:p>\", context)];\n}\n\nfunction parseTableCell(\n cellXml: string,\n context: ParseContext\n): ParsedTableCellResult {\n const nodes = parseTableCellContent(cellXml, context);\n\n const cellPropertiesXml =\n extractBalancedTagBlocks(cellXml, \"w:tcPr\")[0] ??\n cellXml.match(/<w:tcPr\\b[^>]*\\/?>/i)?.[0];\n const fillMatch = cellPropertiesXml?.match(/<w:shd\\b[^>]*w:fill=\"([^\"]+)\"/i);\n const backgroundColor = normalizeHexColor(fillMatch?.[1]);\n const gridSpanMatch = cellPropertiesXml?.match(\n /<w:gridSpan\\b[^>]*w:val=\"(\\d+)\"/i\n );\n const gridSpan = gridSpanMatch?.[1] ? Number(gridSpanMatch[1]) : undefined;\n const cellWidthTag = cellPropertiesXml?.match(/<w:tcW\\b[^>]*>/i)?.[0];\n const cellWidthType = cellWidthTag\n ? getAttribute(cellWidthTag, \"w:type\")?.toLowerCase()\n : undefined;\n const widthTwipsRaw = cellWidthTag\n ? parseIntegerAttribute(cellWidthTag, \"w:w\")\n : undefined;\n const widthTwips =\n cellWidthType === \"dxa\" && widthTwipsRaw !== undefined && widthTwipsRaw > 0\n ? widthTwipsRaw\n : undefined;\n const cellMarginXml = cellPropertiesXml?.match(\n /<w:tcMar\\b[\\s\\S]*?<\\/w:tcMar>/i\n )?.[0];\n const marginTwips = cellMarginXml\n ? parseTableBoxSpacing(cellMarginXml)\n : undefined;\n const cellBordersXml = cellPropertiesXml?.match(\n /<w:tcBorders\\b[\\s\\S]*?<\\/w:tcBorders>|<w:tcBorders\\b[^>]*\\/>/i\n )?.[0];\n const borders = cellBordersXml\n ? parseTableBorderSet(cellBordersXml)\n : undefined;\n const verticalAlignTag = cellPropertiesXml?.match(/<w:vAlign\\b[^>]*>/i)?.[0];\n const verticalAlignRaw = verticalAlignTag\n ? getAttribute(verticalAlignTag, \"w:val\")?.toLowerCase()\n : undefined;\n const verticalAlign =\n verticalAlignRaw === \"top\" ||\n verticalAlignRaw === \"center\" ||\n verticalAlignRaw === \"bottom\"\n ? verticalAlignRaw\n : undefined;\n const vMergeTag = cellPropertiesXml?.match(/<w:vMerge\\b[^>]*\\/?>/i)?.[0];\n const vMergeRaw = vMergeTag\n ? getAttribute(vMergeTag, \"w:val\")?.toLowerCase()\n : undefined;\n const vMerge =\n vMergeTag !== undefined\n ? vMergeRaw === \"restart\"\n ? \"restart\"\n : \"continue\"\n : undefined;\n const hasCellStyle =\n backgroundColor !== undefined ||\n (gridSpan !== undefined && gridSpan > 1) ||\n widthTwips !== undefined ||\n marginTwips !== undefined ||\n verticalAlign !== undefined ||\n borders !== undefined;\n return {\n cell: {\n type: \"table-cell\",\n style: hasCellStyle\n ? {\n backgroundColor,\n gridSpan: gridSpan && gridSpan > 1 ? gridSpan : undefined,\n widthTwips,\n marginTwips,\n verticalAlign,\n borders,\n }\n : undefined,\n nodes,\n },\n vMerge,\n };\n}\n\nfunction parseTableLook(\n tablePropertiesXml: string | undefined\n): ParsedTableLook | undefined {\n const tableLookTag =\n tablePropertiesXml?.match(/<w:tblLook\\b[^>]*\\/?>/i)?.[0] ?? \"\";\n if (!tableLookTag) {\n return undefined;\n }\n const lookMaskRaw = getAttribute(tableLookTag, \"w:val\");\n const lookMask = lookMaskRaw ? Number.parseInt(lookMaskRaw, 16) : undefined;\n const rowBandSizeTag =\n tablePropertiesXml?.match(/<w:tblStyleRowBandSize\\b[^>]*\\/?>/i)?.[0] ??\n extractBalancedTagBlocks(\n tablePropertiesXml ?? \"\",\n \"w:tblStyleRowBandSize\"\n )[0];\n const colBandSizeTag =\n tablePropertiesXml?.match(/<w:tblStyleColBandSize\\b[^>]*\\/?>/i)?.[0] ??\n extractBalancedTagBlocks(\n tablePropertiesXml ?? \"\",\n \"w:tblStyleColBandSize\"\n )[0];\n const rowBandSizeRaw =\n parseIntegerAttribute(rowBandSizeTag ?? \"\", \"w:val\") ?? 1;\n const colBandSizeRaw =\n parseIntegerAttribute(colBandSizeTag ?? \"\", \"w:val\") ?? 1;\n const rowBandSize = Math.max(1, rowBandSizeRaw);\n const colBandSize = Math.max(1, colBandSizeRaw);\n\n const resolveOnOffAttribute = (attribute: string): boolean | undefined => {\n const value = getAttribute(tableLookTag, attribute)?.toLowerCase();\n if (!value) {\n return undefined;\n }\n if (value === \"1\" || value === \"true\" || value === \"on\") {\n return true;\n }\n if (value === \"0\" || value === \"false\" || value === \"off\") {\n return false;\n }\n return undefined;\n };\n\n const hasLookMask = Number.isFinite(lookMask);\n const maskValue = hasLookMask ? (lookMask as number) : 0;\n\n return {\n firstRow:\n resolveOnOffAttribute(\"w:firstRow\") ?? Boolean(maskValue & 0x0020),\n lastRow: resolveOnOffAttribute(\"w:lastRow\") ?? Boolean(maskValue & 0x0040),\n firstCol:\n resolveOnOffAttribute(\"w:firstColumn\") ?? Boolean(maskValue & 0x0080),\n lastCol:\n resolveOnOffAttribute(\"w:lastColumn\") ?? Boolean(maskValue & 0x0100),\n noHBand: resolveOnOffAttribute(\"w:noHBand\") ?? Boolean(maskValue & 0x0200),\n noVBand: resolveOnOffAttribute(\"w:noVBand\") ?? Boolean(maskValue & 0x0400),\n rowBandSize,\n colBandSize,\n };\n}\n\nfunction parseFloatingTableStyle(\n tablePropertiesXml: string | undefined\n): NonNullable<TableStyle[\"floating\"]> | undefined {\n const floatingTag = tablePropertiesXml?.match(/<w:tblpPr\\b[^>]*\\/?>/i)?.[0];\n if (!floatingTag) {\n return undefined;\n }\n\n const xTwips = parseIntegerAttribute(floatingTag, \"w:tblpX\");\n const yTwips = parseIntegerAttribute(floatingTag, \"w:tblpY\");\n const leftFromTextTwips = parseIntegerAttribute(\n floatingTag,\n \"w:leftFromText\"\n );\n const rightFromTextTwips = parseIntegerAttribute(\n floatingTag,\n \"w:rightFromText\"\n );\n const topFromTextTwips = parseIntegerAttribute(floatingTag, \"w:topFromText\");\n const bottomFromTextTwips = parseIntegerAttribute(\n floatingTag,\n \"w:bottomFromText\"\n );\n const horizontalAnchor = getAttribute(floatingTag, \"w:horzAnchor\");\n const verticalAnchor = getAttribute(floatingTag, \"w:vertAnchor\");\n const horizontalAlignRaw = getAttribute(floatingTag, \"w:tblpXSpec\")\n ?.trim()\n .toLowerCase();\n const verticalAlignRaw = getAttribute(floatingTag, \"w:tblpYSpec\")\n ?.trim()\n .toLowerCase();\n const horizontalAlign =\n horizontalAlignRaw === \"left\" ||\n horizontalAlignRaw === \"center\" ||\n horizontalAlignRaw === \"right\" ||\n horizontalAlignRaw === \"inside\" ||\n horizontalAlignRaw === \"outside\"\n ? horizontalAlignRaw\n : undefined;\n const verticalAlign =\n verticalAlignRaw === \"top\" ||\n verticalAlignRaw === \"center\" ||\n verticalAlignRaw === \"bottom\" ||\n verticalAlignRaw === \"inside\" ||\n verticalAlignRaw === \"outside\"\n ? verticalAlignRaw\n : undefined;\n\n if (\n xTwips === undefined &&\n yTwips === undefined &&\n leftFromTextTwips === undefined &&\n rightFromTextTwips === undefined &&\n topFromTextTwips === undefined &&\n bottomFromTextTwips === undefined &&\n horizontalAnchor === undefined &&\n verticalAnchor === undefined &&\n horizontalAlign === undefined &&\n verticalAlign === undefined\n ) {\n return undefined;\n }\n\n return {\n xTwips,\n yTwips,\n leftFromTextTwips,\n rightFromTextTwips,\n topFromTextTwips,\n bottomFromTextTwips,\n horizontalAnchor,\n verticalAnchor,\n horizontalAlign,\n verticalAlign,\n };\n}\n\nfunction applyRunStyleToParagraph(\n paragraph: ParagraphNode,\n runStyle: TextStyle\n): void {\n paragraph.children = paragraph.children.map((child) => {\n if (child.type === \"text\") {\n return {\n ...child,\n style: mergeTextStyles(child.style, runStyle),\n };\n }\n\n if (child.type === \"form-field\") {\n return {\n ...child,\n style: mergeTextStyles(child.style, runStyle),\n };\n }\n\n return child;\n });\n}\n\nfunction paragraphHasDirectAlignment(paragraph: ParagraphNode): boolean {\n if (!paragraph.sourceXml) {\n return false;\n }\n\n const paragraphPropertiesXml =\n extractBalancedTagBlocks(paragraph.sourceXml, \"w:pPr\")[0] ??\n paragraph.sourceXml.match(/<w:pPr\\b[^>]*\\/>/i)?.[0] ??\n \"\";\n if (!paragraphPropertiesXml) {\n return false;\n }\n\n return /<w:jc\\b/i.test(paragraphPropertiesXml);\n}\n\nfunction applyParagraphAlignmentToTableCellContent(\n nodes: TableCellContentNode[],\n paragraphAlign: ParagraphAlignment\n): void {\n for (const node of nodes) {\n if (isParagraphCellContent(node)) {\n if (paragraphHasDirectAlignment(node)) {\n continue;\n }\n\n node.style = {\n ...(node.style ?? {}),\n align: paragraphAlign,\n };\n continue;\n }\n\n if (isTableCellContentTable(node)) {\n for (const row of node.rows) {\n for (const cell of row.cells) {\n applyParagraphAlignmentToTableCellContent(cell.nodes, paragraphAlign);\n }\n }\n }\n }\n}\n\nfunction resolveTableConditionForCell(\n tableStyle: ParsedTableStyleDefinition,\n tableLook: ParsedTableLook,\n rowIndex: number,\n rowCount: number,\n startColumnIndex: number,\n endColumnIndex: number,\n columnCount: number\n): ParsedTableStyleCondition | undefined {\n const conditionTypes: TableConditionalStyleType[] = [\"wholeTable\"];\n const isFirstRow = rowIndex === 0;\n const isLastRow = rowIndex === rowCount - 1;\n const isFirstColumn = startColumnIndex === 0;\n const isLastColumn = endColumnIndex >= columnCount - 1;\n const rowBandSize = Math.max(1, tableLook.rowBandSize);\n const colBandSize = Math.max(1, tableLook.colBandSize);\n\n if (!tableLook.noHBand) {\n const bandRowIndex = rowIndex - (tableLook.firstRow ? 1 : 0);\n if (bandRowIndex >= 0) {\n const bandRowGroup = Math.floor(bandRowIndex / rowBandSize);\n conditionTypes.push(bandRowGroup % 2 === 0 ? \"band1Horz\" : \"band2Horz\");\n }\n }\n\n if (!tableLook.noVBand) {\n const bandColumnIndex = startColumnIndex - (tableLook.firstCol ? 1 : 0);\n if (bandColumnIndex >= 0) {\n const bandColumnGroup = Math.floor(bandColumnIndex / colBandSize);\n conditionTypes.push(\n bandColumnGroup % 2 === 0 ? \"band1Vert\" : \"band2Vert\"\n );\n }\n }\n\n if (tableLook.firstRow && isFirstRow) {\n conditionTypes.push(\"firstRow\");\n }\n if (tableLook.lastRow && isLastRow) {\n conditionTypes.push(\"lastRow\");\n }\n if (tableLook.firstCol && isFirstColumn) {\n conditionTypes.push(\"firstCol\");\n }\n if (tableLook.lastCol && isLastColumn) {\n conditionTypes.push(\"lastCol\");\n }\n if (tableLook.firstRow && tableLook.firstCol && isFirstRow && isFirstColumn) {\n conditionTypes.push(\"nwCell\");\n }\n if (tableLook.firstRow && tableLook.lastCol && isFirstRow && isLastColumn) {\n conditionTypes.push(\"neCell\");\n }\n if (tableLook.lastRow && tableLook.firstCol && isLastRow && isFirstColumn) {\n conditionTypes.push(\"swCell\");\n }\n if (tableLook.lastRow && tableLook.lastCol && isLastRow && isLastColumn) {\n conditionTypes.push(\"seCell\");\n }\n\n let resolvedCondition: ParsedTableStyleCondition | undefined;\n for (const conditionType of conditionTypes) {\n resolvedCondition = mergeTableConditionalStyle(\n resolvedCondition,\n tableStyle.conditions[conditionType]\n );\n }\n\n return resolvedCondition;\n}\n\nfunction parseTable(tableXml: string, context: ParseContext): TableNode {\n const tablePropertiesXml =\n extractBalancedTagBlocks(tableXml, \"w:tblPr\")[0] ??\n tableXml.match(/<w:tblPr\\b[^>]*\\/?>/i)?.[0];\n const tableStyleId = tablePropertiesXml?.match(\n /<w:tblStyle\\b[^>]*w:val=\"([^\"]+)\"/i\n )?.[1];\n const tableStyle = tableStyleId\n ? context.styleSheet.tableStyleById.get(tableStyleId)\n : undefined;\n const styleTableProperties =\n tableStyle?.conditions.wholeTable?.tableProperties;\n const styleTableLook = tableStyle?.conditions.wholeTable?.tableLook;\n\n const explicitProperties =\n parseTableStylePropertiesFromXml(tablePropertiesXml);\n const mergedProperties = mergeTableStyleProperties(\n styleTableProperties,\n explicitProperties\n );\n\n const widthTwips = mergedProperties?.widthTwips;\n const indentTwips = mergedProperties?.indentTwips;\n const layout = mergedProperties?.layout;\n const cellSpacingTwips = mergedProperties?.cellSpacingTwips;\n const floating = mergedProperties?.floating;\n const cellMarginTwips = mergedProperties?.cellMarginTwips;\n\n const tableBordersXml = tablePropertiesXml?.match(\n /<w:tblBorders\\b[\\s\\S]*?<\\/w:tblBorders>|<w:tblBorders\\b[^>]*\\/>/i\n )?.[0];\n const explicitBorders = tableBordersXml\n ? parseTableBorderSet(tableBordersXml)\n : undefined;\n const tableGridXml = tableXml.match(\n /<w:tblGrid\\b[\\s\\S]*?<\\/w:tblGrid>/i\n )?.[0];\n const columnWidthsTwips = tableGridXml\n ? [...tableGridXml.matchAll(/<w:gridCol\\b[^>]*>/gi)]\n .map((columnMatch) => parseIntegerAttribute(columnMatch[0], \"w:w\"))\n .filter((width): width is number => width !== undefined && width > 0)\n : [];\n\n const tableLook = mergeTableLook(\n parseTableLook(tablePropertiesXml),\n styleTableLook\n );\n const rows: TableRowNode[] = [];\n const activeVerticalMergeByColumn = new Map<number, TableCellNode>();\n\n for (const rowXml of extractBalancedTagBlocks(tableXml, \"w:tr\")) {\n const rowPropertiesXml =\n extractBalancedTagBlocks(rowXml, \"w:trPr\")[0] ??\n rowXml.match(/<w:trPr\\b[^>]*\\/?>/i)?.[0];\n const rowFillMatch = rowPropertiesXml?.match(\n /<w:shd\\b[^>]*w:fill=\"([^\"]+)\"/i\n );\n const rowBackgroundColor = normalizeHexColor(rowFillMatch?.[1]);\n const rowHeightTag = rowPropertiesXml?.match(/<w:trHeight\\b[^>]*>/i)?.[0];\n const rowHeightRaw = rowHeightTag\n ? parseIntegerAttribute(rowHeightTag, \"w:val\")\n : undefined;\n const rowHeightTwips =\n rowHeightRaw !== undefined && rowHeightRaw > 0 ? rowHeightRaw : undefined;\n const rowHeightRuleRaw = rowHeightTag\n ? getAttribute(rowHeightTag, \"w:hRule\")?.toLowerCase()\n : undefined;\n const rowHeightRule =\n rowHeightRuleRaw === \"atleast\" ||\n rowHeightRuleRaw === \"exact\" ||\n rowHeightRuleRaw === \"auto\"\n ? rowHeightRuleRaw === \"atleast\"\n ? \"atLeast\"\n : rowHeightRuleRaw\n : undefined;\n const rowCantSplit = rowPropertiesXml\n ? parseOnOffAttribute(rowPropertiesXml, \"cantSplit\")\n : undefined;\n const rowIsHeader = rowPropertiesXml\n ? parseOnOffAttribute(rowPropertiesXml, \"tblHeader\")\n : undefined;\n\n const parsedCells = extractBalancedTagBlocks(rowXml, \"w:tc\").map(\n (cellXml) => parseTableCell(cellXml, context)\n );\n if (parsedCells.length === 0) {\n continue;\n }\n\n const cells: TableCellNode[] = [];\n let columnCursor = 0;\n for (const parsedCell of parsedCells) {\n const cell = parsedCell.cell;\n const columnSpan = Math.max(1, cell.style?.gridSpan ?? 1);\n const startColumn = columnCursor;\n const endColumn = startColumn + columnSpan - 1;\n columnCursor += columnSpan;\n\n if (parsedCell.vMerge === \"continue\") {\n const continuationAnchors = new Set<TableCellNode>();\n for (\n let columnIndex = startColumn;\n columnIndex <= endColumn;\n columnIndex += 1\n ) {\n const anchor = activeVerticalMergeByColumn.get(columnIndex);\n if (anchor) {\n continuationAnchors.add(anchor);\n }\n }\n\n if (continuationAnchors.size > 0) {\n continuationAnchors.forEach((anchorCell) => {\n const anchorStyle = anchorCell.style ?? {};\n anchorCell.style = {\n ...anchorStyle,\n rowSpan: Math.max(1, anchorStyle.rowSpan ?? 1) + 1,\n };\n });\n\n cell.style = {\n ...(cell.style ?? {}),\n vMergeContinuation: true,\n };\n cells.push(cell);\n continue;\n }\n }\n\n if (parsedCell.vMerge === \"restart\") {\n cell.style = {\n ...(cell.style ?? {}),\n rowSpan: 1,\n };\n for (\n let columnIndex = startColumn;\n columnIndex <= endColumn;\n columnIndex += 1\n ) {\n activeVerticalMergeByColumn.set(columnIndex, cell);\n }\n } else {\n for (\n let columnIndex = startColumn;\n columnIndex <= endColumn;\n columnIndex += 1\n ) {\n activeVerticalMergeByColumn.delete(columnIndex);\n }\n }\n\n cells.push(cell);\n }\n\n rows.push({\n type: \"table-row\",\n cells,\n style:\n rowBackgroundColor !== undefined ||\n rowHeightTwips !== undefined ||\n rowHeightRule !== undefined ||\n rowCantSplit !== undefined ||\n rowIsHeader !== undefined\n ? {\n backgroundColor: rowBackgroundColor,\n heightTwips: rowHeightTwips,\n ...(rowHeightRule !== undefined\n ? { heightRule: rowHeightRule }\n : undefined),\n ...(rowCantSplit !== undefined\n ? { cantSplit: rowCantSplit }\n : undefined),\n ...(rowIsHeader !== undefined\n ? { isHeader: rowIsHeader }\n : undefined),\n }\n : undefined,\n });\n }\n\n const columnCount = Math.max(\n columnWidthsTwips.length,\n ...rows.map((row) =>\n row.cells.reduce(\n (total, cell) =>\n total +\n (cell.style?.gridSpan && cell.style.gridSpan > 1\n ? cell.style.gridSpan\n : 1),\n 0\n )\n ),\n 1\n );\n\n if (tableStyle) {\n rows.forEach((row, rowIndex) => {\n let columnCursor = 0;\n row.cells.forEach((cell) => {\n const columnSpan = Math.max(1, cell.style?.gridSpan ?? 1);\n const startColumnIndex = columnCursor;\n const endColumnIndex = startColumnIndex + columnSpan - 1;\n columnCursor += columnSpan;\n\n if (cell.style?.vMergeContinuation) {\n return;\n }\n\n const condition = resolveTableConditionForCell(\n tableStyle,\n tableLook,\n rowIndex,\n rows.length,\n startColumnIndex,\n endColumnIndex,\n columnCount\n );\n if (!condition) {\n return;\n }\n\n if (\n condition.rowBackgroundColor &&\n row.style?.backgroundColor === undefined\n ) {\n row.style = {\n ...(row.style ?? {}),\n backgroundColor: condition.rowBackgroundColor,\n };\n }\n\n if (\n condition.cellBackgroundColor &&\n cell.style?.backgroundColor === undefined &&\n row.style?.backgroundColor === undefined\n ) {\n cell.style = {\n ...(cell.style ?? {}),\n backgroundColor: condition.cellBackgroundColor,\n };\n }\n\n if (condition.cellBorders) {\n cell.style = {\n ...(cell.style ?? {}),\n borders: mergeTableBorderSets(\n condition.cellBorders,\n cell.style?.borders\n ),\n };\n }\n\n if (condition.paragraphAlign) {\n applyParagraphAlignmentToTableCellContent(\n cell.nodes,\n condition.paragraphAlign\n );\n }\n\n if (condition.runStyle) {\n applyRunStyleToTableCellContent(\n cell.nodes,\n condition.runStyle as TextStyle\n );\n }\n });\n });\n }\n\n const resolvedTableBorders = mergeTableBorderSets(\n tableStyle?.conditions.wholeTable?.tableBorders,\n explicitBorders\n );\n\n const hasTableStyle =\n widthTwips !== undefined ||\n indentTwips !== undefined ||\n layout !== undefined ||\n cellSpacingTwips !== undefined ||\n floating !== undefined ||\n cellMarginTwips !== undefined ||\n columnWidthsTwips.length > 0 ||\n resolvedTableBorders !== undefined;\n\n return {\n type: \"table\",\n rows,\n style: hasTableStyle\n ? {\n widthTwips,\n indentTwips,\n layout,\n cellSpacingTwips,\n floating,\n cellMarginTwips,\n columnWidthsTwips:\n columnWidthsTwips.length > 0 ? columnWidthsTwips : undefined,\n borders: resolvedTableBorders,\n }\n : undefined,\n sourceXml: tableXml,\n };\n}\n\nfunction extractBodyXml(documentXml: string): string {\n const bodyMatch = documentXml.match(/<w:body\\b[^>]*>([\\s\\S]*?)<\\/w:body>/i);\n return bodyMatch?.[1] ?? documentXml;\n}\n\nfunction extractDocumentOpenTag(documentXml: string): string | undefined {\n const match = documentXml.match(/<w:document\\b[^>]*>/i);\n return match?.[0];\n}\n\nfunction extractSectionPropertiesXml(documentXml: string): string | undefined {\n const bodyXml = extractBodyXml(documentXml);\n const matches = [...bodyXml.matchAll(/<w:sectPr\\b[\\s\\S]*?<\\/w:sectPr>/gi)];\n if (matches.length === 0) {\n return undefined;\n }\n return matches[matches.length - 1][0];\n}\n\nfunction parseReferencedSections(\n pkg: OoxmlPackage,\n documentXml: string,\n documentRelationships: Map<string, string>,\n contentTypes: ContentTypeLookup,\n styleSheet: ParsedStyleSheet,\n relationshipTagName: \"headerReference\" | \"footerReference\",\n missingTargetPrefix: string,\n missingPartPrefix: string,\n warnings: string[]\n): Array<{ partName: string; referenceType?: string; nodes: DocNode[] }> {\n const sections: Array<{\n partName: string;\n referenceType?: string;\n nodes: DocNode[];\n }> = [];\n const seenPartNames = new Set<string>();\n\n const tokenPattern = new RegExp(`<w:${relationshipTagName}\\\\b[^>]*>`, \"gi\");\n for (const reference of documentXml.matchAll(tokenPattern)) {\n const tag = reference[0];\n const relationshipId = getAttribute(tag, \"r:id\");\n if (!relationshipId) {\n continue;\n }\n\n const targetPartName = documentRelationships.get(relationshipId);\n if (!targetPartName) {\n warnings.push(`${missingTargetPrefix} ${relationshipId}`);\n continue;\n }\n\n if (seenPartNames.has(targetPartName)) {\n continue;\n }\n seenPartNames.add(targetPartName);\n\n const headerXml = pkg.parts.get(targetPartName)?.content;\n if (!headerXml) {\n warnings.push(`${missingPartPrefix} ${targetPartName}`);\n continue;\n }\n\n const headerContext: ParseContext = {\n relationships: parsePartRelationships(pkg, targetPartName),\n contentTypes,\n parts: pkg.parts,\n binaryAssets: pkg.binaryAssets,\n styleSheet,\n warnings,\n };\n\n sections.push({\n partName: targetPartName,\n referenceType: getAttribute(tag, \"w:type\"),\n nodes: parseDocumentXml(headerXml, headerContext),\n });\n }\n\n return sections;\n}\n\nfunction parseHeaderSections(\n pkg: OoxmlPackage,\n documentXml: string,\n documentRelationships: Map<string, string>,\n contentTypes: ContentTypeLookup,\n styleSheet: ParsedStyleSheet,\n warnings: string[]\n): HeaderSection[] {\n return parseReferencedSections(\n pkg,\n documentXml,\n documentRelationships,\n contentTypes,\n styleSheet,\n \"headerReference\",\n \"Missing header relationship target for\",\n \"Missing header part\",\n warnings\n );\n}\n\nfunction parseFooterSections(\n pkg: OoxmlPackage,\n documentXml: string,\n documentRelationships: Map<string, string>,\n contentTypes: ContentTypeLookup,\n styleSheet: ParsedStyleSheet,\n warnings: string[]\n): FooterSection[] {\n return parseReferencedSections(\n pkg,\n documentXml,\n documentRelationships,\n contentTypes,\n styleSheet,\n \"footerReference\",\n \"Missing footer relationship target for\",\n \"Missing footer part\",\n warnings\n );\n}\n\nfunction parseSectionReferencesFromProperties(\n sectionPropertiesXml: string | undefined,\n relationshipTagName: \"headerReference\" | \"footerReference\",\n documentRelationships: Map<string, string>,\n resolvePartNodes: (\n partName: string,\n relationshipTagName: \"headerReference\" | \"footerReference\"\n ) => DocNode[] | undefined,\n warnings: string[]\n): Array<{ partName: string; referenceType?: string; nodes: DocNode[] }> {\n if (!sectionPropertiesXml) {\n return [];\n }\n\n const references: Array<{\n partName: string;\n referenceType?: string;\n nodes: DocNode[];\n }> = [];\n const seenReferences = new Set<string>();\n const tokenPattern = new RegExp(\n `<w:${relationshipTagName}\\\\b[^>]*\\\\/?>`,\n \"gi\"\n );\n for (const reference of sectionPropertiesXml.matchAll(tokenPattern)) {\n const tag = reference[0];\n const relationshipId = getAttribute(tag, \"r:id\");\n if (!relationshipId) {\n continue;\n }\n\n const targetPartName = documentRelationships.get(relationshipId);\n if (!targetPartName) {\n warnings.push(\n `${\n relationshipTagName === \"headerReference\"\n ? \"Missing header relationship target for\"\n : \"Missing footer relationship target for\"\n } ${relationshipId}`\n );\n continue;\n }\n\n const referenceType = getAttribute(tag, \"w:type\");\n const dedupeKey = `${targetPartName}::${referenceType ?? \"\"}`;\n if (seenReferences.has(dedupeKey)) {\n continue;\n }\n seenReferences.add(dedupeKey);\n\n const nodes = resolvePartNodes(targetPartName, relationshipTagName);\n if (!nodes) {\n continue;\n }\n\n references.push({\n partName: targetPartName,\n referenceType,\n nodes,\n });\n }\n\n return references;\n}\n\nfunction parseDocumentSections(\n pkg: OoxmlPackage,\n documentXml: string,\n documentRelationships: Map<string, string>,\n contentTypes: ContentTypeLookup,\n styleSheet: ParsedStyleSheet,\n warnings: string[]\n): DocumentSection[] {\n const bodyXml = extractBodyXml(documentXml);\n const tokenRanges = extractBodyTokenRanges(bodyXml);\n const parsedPartNodesByName = new Map<string, DocNode[]>();\n let nodeCount = 0;\n let sectionStartNodeIndex = 0;\n const sections: DocumentSection[] = [];\n\n const resolvePartNodes = (\n partName: string,\n relationshipTagName: \"headerReference\" | \"footerReference\"\n ): DocNode[] | undefined => {\n const cachedNodes = parsedPartNodesByName.get(partName);\n if (cachedNodes) {\n return cachedNodes;\n }\n\n const partXml = pkg.parts.get(partName)?.content;\n if (!partXml) {\n warnings.push(\n `${\n relationshipTagName === \"headerReference\"\n ? \"Missing header part\"\n : \"Missing footer part\"\n } ${partName}`\n );\n return undefined;\n }\n\n const partContext: ParseContext = {\n relationships: parsePartRelationships(pkg, partName),\n contentTypes,\n parts: pkg.parts,\n binaryAssets: pkg.binaryAssets,\n styleSheet,\n warnings,\n };\n\n const nodes = parseDocumentXml(partXml, partContext);\n parsedPartNodesByName.set(partName, nodes);\n return nodes;\n };\n\n for (const token of tokenRanges) {\n const tokenXml = bodyXml.slice(token.start, token.end);\n const producedNode =\n token.kind === \"table\" || !isGoBackBookmarkParagraph(tokenXml);\n if (token.kind === \"paragraph\") {\n const sectionPropertiesXml = tokenXml.match(\n /<w:sectPr\\b[\\s\\S]*?<\\/w:sectPr>/i\n )?.[0];\n if (sectionPropertiesXml) {\n sections.push({\n startNodeIndex: sectionStartNodeIndex,\n sectionPropertiesXml,\n headerSections: parseSectionReferencesFromProperties(\n sectionPropertiesXml,\n \"headerReference\",\n documentRelationships,\n resolvePartNodes,\n warnings\n ),\n footerSections: parseSectionReferencesFromProperties(\n sectionPropertiesXml,\n \"footerReference\",\n documentRelationships,\n resolvePartNodes,\n warnings\n ),\n });\n sectionStartNodeIndex = nodeCount + (producedNode ? 1 : 0);\n }\n }\n\n if (producedNode) {\n nodeCount += 1;\n }\n }\n\n const finalSectionPropertiesXml = extractSectionPropertiesXml(documentXml);\n if (finalSectionPropertiesXml) {\n sections.push({\n startNodeIndex: sectionStartNodeIndex,\n sectionPropertiesXml: finalSectionPropertiesXml,\n headerSections: parseSectionReferencesFromProperties(\n finalSectionPropertiesXml,\n \"headerReference\",\n documentRelationships,\n resolvePartNodes,\n warnings\n ),\n footerSections: parseSectionReferencesFromProperties(\n finalSectionPropertiesXml,\n \"footerReference\",\n documentRelationships,\n resolvePartNodes,\n warnings\n ),\n });\n }\n\n const normalizedSections: DocumentSection[] = [];\n for (const section of sections) {\n if (nodeCount > 0 && section.startNodeIndex > nodeCount) {\n continue;\n }\n\n const previous = normalizedSections[normalizedSections.length - 1];\n if (\n previous &&\n previous.startNodeIndex === section.startNodeIndex &&\n previous.sectionPropertiesXml === section.sectionPropertiesXml\n ) {\n continue;\n }\n normalizedSections.push(section);\n }\n\n if (normalizedSections.length === 0) {\n normalizedSections.push({\n startNodeIndex: 0,\n sectionPropertiesXml: finalSectionPropertiesXml,\n headerSections: [],\n footerSections: [],\n });\n }\n\n normalizedSections.sort(\n (left, right) => left.startNodeIndex - right.startNodeIndex\n );\n return normalizedSections;\n}\n\nfunction paragraphPlainText(paragraph: ParagraphNode): string {\n return paragraph.children\n .map((child) => {\n if (child.type === \"text\") {\n return child.text;\n }\n\n if (child.type === \"form-field\") {\n if (child.fieldType === \"checkbox\") {\n const isChecked =\n child.checked ?? child.widget?.checkbox?.defaultChecked ?? false;\n return isChecked\n ? child.checkedSymbol ?? \"☒\"\n : child.uncheckedSymbol ?? \"☐\";\n }\n if (child.fieldType === \"text\") {\n return child.value ?? child.widget?.text?.defaultText ?? \"\";\n }\n return child.value ?? \"\";\n }\n\n return \"\";\n })\n .join(\"\");\n}\n\nfunction noteTextFromNodes(nodes: DocNode[]): string {\n const lines: string[] = [];\n\n const appendParagraph = (paragraph: ParagraphNode): void => {\n const text = paragraphPlainText(paragraph).trimEnd();\n if (text.length > 0) {\n lines.push(text);\n }\n };\n\n const appendParagraphFromNode = (node: ParagraphNode | TableNode): void => {\n if (node.type === \"paragraph\") {\n appendParagraph(node);\n return;\n }\n\n for (const row of node.rows) {\n for (const cell of row.cells) {\n for (const paragraph of cellParagraphsFromContent(cell.nodes)) {\n appendParagraph(paragraph);\n }\n }\n }\n };\n\n for (const node of nodes) {\n appendParagraphFromNode(node);\n }\n\n const joined = lines.join(\"\\n\").trim();\n return joined.replace(/^\\[[0-9]+\\]\\s*/, \"\");\n}\n\nfunction parseDocumentNotesFromPart(\n pkg: OoxmlPackage,\n partName: string,\n tagName: \"w:footnote\" | \"w:endnote\",\n contentTypes: ContentTypeLookup,\n styleSheet: ParsedStyleSheet,\n warnings: string[]\n): DocumentNoteDefinition[] {\n const notesXml = pkg.parts.get(partName)?.content;\n if (!notesXml) {\n return [];\n }\n\n const context: ParseContext = {\n relationships: parsePartRelationships(pkg, partName),\n contentTypes,\n parts: pkg.parts,\n binaryAssets: pkg.binaryAssets,\n styleSheet,\n warnings,\n };\n\n const notes: DocumentNoteDefinition[] = [];\n for (const noteXml of extractBalancedTagBlocks(notesXml, tagName)) {\n const noteTag =\n noteXml.match(\n new RegExp(`<${escapeRegExp(tagName)}\\\\b[^>]*>`, \"i\")\n )?.[0] ?? \"\";\n if (getAttribute(noteTag, \"w:type\")) {\n continue;\n }\n\n const noteId = parseIntegerAttribute(noteTag, \"w:id\");\n if (noteId === undefined || noteId < 0) {\n continue;\n }\n\n const parsedNodes = parseDocumentXml(noteXml, context);\n const text = noteTextFromNodes(parsedNodes);\n if (!text) {\n continue;\n }\n\n notes.push({\n id: noteId,\n text,\n nodes: parsedNodes,\n });\n }\n\n return notes.sort((left, right) => left.id - right.id);\n}\n\nfunction pointsToPixels(points: number): number {\n return Math.max(1, Math.round((points * 96) / 72));\n}\n\nfunction parseCssPointValue(\n styleValue: string | undefined,\n cssProperty: string\n): number | undefined {\n if (!styleValue) {\n return undefined;\n }\n\n const escapedProperty = escapeRegExp(cssProperty);\n const match = styleValue.match(\n new RegExp(`${escapedProperty}\\\\s*:\\\\s*([0-9]+(?:\\\\.[0-9]+)?)pt`, \"i\")\n );\n if (!match?.[1]) {\n return undefined;\n }\n\n const parsed = Number.parseFloat(match[1]);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n return undefined;\n }\n\n return pointsToPixels(parsed);\n}\n\nfunction parseNumberingPictureBulletDefinitions(\n pkg: OoxmlPackage,\n numberingXml: string,\n contentTypes: ContentTypeLookup\n): Map<number, NumberingPictureBulletDefinition> {\n const pictureBullets = new Map<number, NumberingPictureBulletDefinition>();\n const numberingRelationships = parsePartRelationships(\n pkg,\n \"word/numbering.xml\"\n );\n\n for (const numPicBulletXml of extractBalancedTagBlocks(\n numberingXml,\n \"w:numPicBullet\"\n )) {\n const numPicBulletTag =\n numPicBulletXml.match(/<w:numPicBullet\\b[^>]*>/i)?.[0] ?? \"\";\n const numPicBulletIdRaw = getAttribute(numPicBulletTag, \"w:numPicBulletId\");\n const numPicBulletId = numPicBulletIdRaw\n ? Number(numPicBulletIdRaw)\n : Number.NaN;\n if (!Number.isFinite(numPicBulletId)) {\n continue;\n }\n\n const shapeTag = numPicBulletXml.match(/<v:shape\\b[^>]*>/i)?.[0];\n const shapeStyle = shapeTag ? getAttribute(shapeTag, \"style\") : undefined;\n const widthPx = parseCssPointValue(shapeStyle, \"width\");\n const heightPx = parseCssPointValue(shapeStyle, \"height\");\n\n const imageTag = numPicBulletXml.match(/<v:imagedata\\b[^>]*\\/?>/i)?.[0];\n const relationshipId = imageTag\n ? getAttribute(imageTag, \"r:id\")\n : undefined;\n const imagePartName = relationshipId\n ? numberingRelationships.get(relationshipId)\n : undefined;\n const imageBytes = imagePartName\n ? pkg.binaryAssets.get(imagePartName)\n : undefined;\n const imageContentType = imagePartName\n ? contentTypeForPart(imagePartName, contentTypes)\n : undefined;\n const src =\n imagePartName && imageBytes && imageContentType\n ? `data:${imageContentType};base64,${bytesToBase64(imageBytes)}`\n : undefined;\n\n pictureBullets.set(Math.round(numPicBulletId), {\n numPicBulletId: Math.round(numPicBulletId),\n src,\n widthPx,\n heightPx,\n partName: imagePartName,\n contentType: imageContentType,\n });\n }\n\n return pictureBullets;\n}\n\nfunction parseNumberingLevelDefinition(\n levelXml: string,\n pictureBulletsById: Map<number, NumberingPictureBulletDefinition>\n): NumberingLevelDefinition | undefined {\n if (!levelXml) {\n return undefined;\n }\n\n const levelTag = levelXml.match(/<w:lvl\\b[^>]*>/i)?.[0] ?? \"\";\n const ilvlRaw = getAttribute(levelTag, \"w:ilvl\");\n const ilvl = ilvlRaw ? Number(ilvlRaw) : Number.NaN;\n if (!Number.isFinite(ilvl)) {\n return undefined;\n }\n\n const startTag = levelXml.match(/<w:start\\b[^>]*\\/?>/i)?.[0];\n const numFmtTag = levelXml.match(/<w:numFmt\\b[^>]*\\/?>/i)?.[0];\n const lvlTextTag = levelXml.match(/<w:lvlText\\b[^>]*\\/?>/i)?.[0];\n const suffixTag = levelXml.match(/<w:suff\\b[^>]*\\/?>/i)?.[0];\n const levelRunPropertiesXml =\n extractBalancedTagBlocks(levelXml, \"w:rPr\")[0] ??\n levelXml.match(/<w:rPr\\b[^>]*\\/>/i)?.[0] ??\n \"\";\n const levelParagraphPropertiesXml =\n extractBalancedTagBlocks(levelXml, \"w:pPr\")[0] ??\n levelXml.match(/<w:pPr\\b[^>]*\\/?>/i)?.[0] ??\n \"\";\n const levelFontsTag =\n levelRunPropertiesXml.match(/<w:rFonts\\b[^>]*\\/?>/i)?.[0];\n const levelColorTag =\n levelRunPropertiesXml.match(/<w:color\\b[^>]*\\/?>/i)?.[0];\n const levelRunStyle = parseTextStyleFromXml(levelRunPropertiesXml);\n const pictureBulletTag = levelXml.match(/<w:lvlPicBulletId\\b[^>]*\\/?>/i)?.[0];\n const suffixRaw = suffixTag\n ? getAttribute(suffixTag, \"w:val\")?.toLowerCase()\n : undefined;\n const pictureBulletIdRaw = pictureBulletTag\n ? getAttribute(pictureBulletTag, \"w:val\")\n : undefined;\n const pictureBulletId = pictureBulletIdRaw\n ? Number(pictureBulletIdRaw)\n : Number.NaN;\n const bulletFontFamily = decodeXmlAttribute(\n levelFontsTag\n ? getAttribute(levelFontsTag, \"w:ascii\") ??\n getAttribute(levelFontsTag, \"w:hAnsi\") ??\n getAttribute(levelFontsTag, \"w:eastAsia\") ??\n getAttribute(levelFontsTag, \"w:cs\")\n : undefined\n )?.trim();\n const bulletColor = normalizeHexColor(\n levelColorTag ? getAttribute(levelColorTag, \"w:val\") : undefined\n );\n\n const suffix =\n suffixRaw === \"tab\" || suffixRaw === \"space\" || suffixRaw === \"nothing\"\n ? suffixRaw\n : undefined;\n const indent = levelParagraphPropertiesXml\n ? parseParagraphIndentFromXml(levelParagraphPropertiesXml)\n : undefined;\n\n return {\n ilvl: Math.max(0, Math.round(ilvl)),\n start: startTag ? parseIntegerAttribute(startTag, \"w:val\") : undefined,\n format: numFmtTag ? getAttribute(numFmtTag, \"w:val\") : undefined,\n text: lvlTextTag ? getAttribute(lvlTextTag, \"w:val\") : undefined,\n suffix,\n indent,\n runStyle: levelRunStyle,\n bulletFontFamily,\n bulletColor,\n pictureBulletId: Number.isFinite(pictureBulletId)\n ? Math.round(pictureBulletId)\n : undefined,\n pictureBullet: Number.isFinite(pictureBulletId)\n ? pictureBulletsById.get(Math.round(pictureBulletId))\n : undefined,\n };\n}\n\nfunction parseNumberingDefinitions(\n pkg: OoxmlPackage,\n contentTypes: ContentTypeLookup\n): NumberingDefinitionSet | undefined {\n const numberingXml = pkg.parts.get(\"word/numbering.xml\")?.content;\n if (!numberingXml) {\n return undefined;\n }\n const pictureBulletsById = parseNumberingPictureBulletDefinitions(\n pkg,\n numberingXml,\n contentTypes\n );\n\n const parsedAbstracts = extractBalancedTagBlocks(\n numberingXml,\n \"w:abstractNum\"\n )\n .map((abstractXml) => {\n const abstractTag =\n abstractXml.match(/<w:abstractNum\\b[^>]*>/i)?.[0] ?? \"\";\n const abstractNumIdRaw = getAttribute(abstractTag, \"w:abstractNumId\");\n const abstractNumId = abstractNumIdRaw\n ? Number(abstractNumIdRaw)\n : Number.NaN;\n if (!Number.isFinite(abstractNumId)) {\n return undefined;\n }\n\n const styleLinkTag = abstractXml.match(/<w:styleLink\\b[^>]*\\/?>/i)?.[0];\n const numStyleLinkTag = abstractXml.match(\n /<w:numStyleLink\\b[^>]*\\/?>/i\n )?.[0];\n const levels = extractBalancedTagBlocks(abstractXml, \"w:lvl\")\n .map((levelXml) =>\n parseNumberingLevelDefinition(levelXml, pictureBulletsById)\n )\n .filter((level): level is NumberingLevelDefinition => Boolean(level))\n .sort((left, right) => left.ilvl - right.ilvl);\n\n return {\n abstractNumId: Math.round(abstractNumId),\n styleLink: styleLinkTag\n ? getAttribute(styleLinkTag, \"w:val\")\n : undefined,\n numStyleLink: numStyleLinkTag\n ? getAttribute(numStyleLinkTag, \"w:val\")\n : undefined,\n levels,\n };\n })\n .filter(\n (\n entry\n ): entry is {\n abstractNumId: number;\n styleLink: string | undefined;\n numStyleLink: string | undefined;\n levels: NumberingLevelDefinition[];\n } => Boolean(entry)\n );\n\n const styleLinkedLevels = new Map<string, NumberingLevelDefinition[]>();\n for (const abstractDefinition of parsedAbstracts) {\n if (\n !abstractDefinition.styleLink ||\n abstractDefinition.levels.length === 0\n ) {\n continue;\n }\n styleLinkedLevels.set(\n abstractDefinition.styleLink,\n abstractDefinition.levels\n );\n }\n\n const abstracts: NumberingAbstractDefinition[] = parsedAbstracts.map(\n (abstractDefinition) => {\n const linkedLevels =\n abstractDefinition.levels.length > 0\n ? abstractDefinition.levels\n : abstractDefinition.numStyleLink\n ? styleLinkedLevels.get(abstractDefinition.numStyleLink) ?? []\n : [];\n\n return {\n abstractNumId: abstractDefinition.abstractNumId,\n levels: linkedLevels.map((level) => ({ ...level })),\n };\n }\n );\n\n const instances = extractBalancedTagBlocks(numberingXml, \"w:num\")\n .map((numXml): NumberingInstanceDefinition | undefined => {\n const numTag = numXml.match(/<w:num\\b[^>]*>/i)?.[0] ?? \"\";\n const numIdRaw = getAttribute(numTag, \"w:numId\");\n const numId = numIdRaw ? Number(numIdRaw) : Number.NaN;\n if (!Number.isFinite(numId)) {\n return undefined;\n }\n\n const abstractNumIdTag = numXml.match(\n /<w:abstractNumId\\b[^>]*\\/?>/i\n )?.[0];\n const abstractNumIdRaw = abstractNumIdTag\n ? getAttribute(abstractNumIdTag, \"w:val\")\n : undefined;\n const abstractNumId = abstractNumIdRaw\n ? Number(abstractNumIdRaw)\n : Number.NaN;\n if (!Number.isFinite(abstractNumId)) {\n return undefined;\n }\n\n const levelStartOverrides: Record<string, number> = {};\n const levelOverrides: NumberingLevelDefinition[] = [];\n for (const overrideXml of extractBalancedTagBlocks(\n numXml,\n \"w:lvlOverride\"\n )) {\n const overrideTag =\n overrideXml.match(/<w:lvlOverride\\b[^>]*>/i)?.[0] ?? \"\";\n const overrideLevelRaw = getAttribute(overrideTag, \"w:ilvl\");\n const overrideLevel = overrideLevelRaw\n ? Number(overrideLevelRaw)\n : Number.NaN;\n if (!Number.isFinite(overrideLevel)) {\n continue;\n }\n\n const startOverrideTag = overrideXml.match(\n /<w:startOverride\\b[^>]*\\/?>/i\n )?.[0];\n const startOverride = startOverrideTag\n ? parseIntegerAttribute(startOverrideTag, \"w:val\")\n : undefined;\n if (startOverride !== undefined && startOverride > 0) {\n levelStartOverrides[String(Math.max(0, Math.round(overrideLevel)))] =\n startOverride;\n }\n\n const levelXml = extractBalancedTagBlocks(overrideXml, \"w:lvl\")[0];\n const parsedLevel = levelXml\n ? parseNumberingLevelDefinition(levelXml, pictureBulletsById)\n : undefined;\n if (parsedLevel) {\n levelOverrides.push(parsedLevel);\n }\n }\n\n return {\n numId: Math.round(numId),\n abstractNumId: Math.round(abstractNumId),\n levelStartOverrides:\n Object.keys(levelStartOverrides).length > 0\n ? levelStartOverrides\n : undefined,\n levelOverrides: levelOverrides.length > 0 ? levelOverrides : undefined,\n };\n })\n .filter((instance): instance is NumberingInstanceDefinition =>\n Boolean(instance)\n );\n\n if (abstracts.length === 0 && instances.length === 0) {\n return undefined;\n }\n\n return {\n abstracts,\n instances,\n };\n}\n\nfunction isGoBackBookmarkParagraph(paragraphXml: string): boolean {\n if (!/w:name=\"_GoBack\"/i.test(paragraphXml)) {\n return false;\n }\n\n return !/<w:r\\b/i.test(paragraphXml) && !/<w:drawing\\b/i.test(paragraphXml);\n}\n\ntype BodyTokenRange = {\n start: number;\n end: number;\n kind: \"table\" | \"paragraph\";\n};\n\nfunction extractBodyTokenRanges(bodyXml: string): BodyTokenRange[] {\n return extractBalancedTagBlocksInOrder(bodyXml, [\"w:tbl\", \"w:p\"]).map(\n (range) => ({\n start: range.start,\n end: range.end,\n kind:\n range.tagName === \"w:tbl\" ? (\"table\" as const) : (\"paragraph\" as const),\n })\n );\n}\n\nexport function parseDocumentXml(\n documentXml: string,\n context?: ParseContext\n): DocNode[] {\n const parseContext: ParseContext = context ?? {\n relationships: new Map(),\n contentTypes: {\n defaultByExtension: new Map(),\n overrideByPartName: new Map(),\n },\n parts: new Map(),\n binaryAssets: new Map(),\n styleSheet: EMPTY_STYLE_SHEET,\n warnings: [],\n };\n\n const nodes: DocNode[] = [];\n const bodyXml = extractBodyXml(documentXml);\n const tokenRanges = extractBodyTokenRanges(bodyXml);\n\n for (const token of tokenRanges) {\n const tokenXml = bodyXml.slice(token.start, token.end);\n if (tokenXml.startsWith(\"<w:tbl\")) {\n nodes.push(parseTable(tokenXml, parseContext));\n } else {\n if (isGoBackBookmarkParagraph(tokenXml)) {\n continue;\n }\n nodes.push(parseParagraph(tokenXml, parseContext));\n }\n }\n\n if (nodes.length === 0) {\n nodes.push({\n type: \"paragraph\",\n children: [{ type: \"text\", text: \"\" }],\n });\n }\n\n return nodes;\n}\n\nfunction parseDocumentPageCountFromAppProperties(\n pkg: OoxmlPackage\n): number | undefined {\n const appXml = pkg.parts.get(\"docProps/app.xml\")?.content ?? \"\";\n if (!appXml) {\n return undefined;\n }\n\n const pagesRaw = appXml.match(/<Pages>(\\d+)<\\/Pages>/i)?.[1];\n if (!pagesRaw) {\n return undefined;\n }\n\n const parsed = Number.parseInt(pagesRaw, 10);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : undefined;\n}\n\nfunction parseFirstOnOffSetting(\n settingsXml: string,\n tagNames: string[]\n): boolean | undefined {\n for (const tagName of tagNames) {\n const parsed = parseOnOffAttribute(settingsXml, tagName);\n if (parsed !== undefined) {\n return parsed;\n }\n }\n return undefined;\n}\n\nfunction parseDocumentCompatibilitySettings(\n pkg: OoxmlPackage\n): DocumentCompatibilitySettings | undefined {\n const settingsXml = pkg.parts.get(\"word/settings.xml\")?.content ?? \"\";\n if (!settingsXml) {\n return undefined;\n }\n\n const compatXml =\n extractBalancedTagBlocks(settingsXml, \"w:compat\")[0] ??\n settingsXml.match(/<w:compat\\b[^>]*\\/>/i)?.[0] ??\n \"\";\n if (!compatXml) {\n return undefined;\n }\n\n const suppressSpacingBeforeAfterPageBreak = parseFirstOnOffSetting(\n compatXml,\n [\"suppressSpBfAfterPgBrk\"]\n );\n const usePrinterMetrics = parseFirstOnOffSetting(compatXml, [\n \"usePrinterMetrics\",\n ]);\n const useFixedHtmlParagraphSpacing = parseFirstOnOffSetting(compatXml, [\n \"doNotUseHTMLParagraphAutoSpacing\",\n ]);\n const doNotBreakWrappedTables = parseFirstOnOffSetting(compatXml, [\n \"doNotBreakWrappedTables\",\n \"dontBreakWrappedTables\",\n ]);\n const doNotBreakConstrainedForcedTable = parseFirstOnOffSetting(compatXml, [\n \"doNotBreakConstrainedForcedTable\",\n \"dontBreakConstrainedForcedTable\",\n ]);\n const evenAndOddHeaders = parseFirstOnOffSetting(settingsXml, [\n \"evenAndOddHeaders\",\n ]);\n\n if (\n suppressSpacingBeforeAfterPageBreak === undefined &&\n usePrinterMetrics === undefined &&\n useFixedHtmlParagraphSpacing === undefined &&\n doNotBreakWrappedTables === undefined &&\n doNotBreakConstrainedForcedTable === undefined &&\n evenAndOddHeaders === undefined\n ) {\n return undefined;\n }\n\n return {\n suppressSpacingBeforeAfterPageBreak,\n usePrinterMetrics,\n useFixedHtmlParagraphSpacing,\n doNotBreakWrappedTables,\n doNotBreakConstrainedForcedTable,\n evenAndOddHeaders,\n };\n}\n\nexport function buildDocModel(pkg: OoxmlPackage): DocModel {\n const warnings: string[] = [];\n const documentXml = pkg.parts.get(\"word/document.xml\")?.content;\n if (!documentXml) {\n warnings.push(\"Missing word/document.xml\");\n }\n\n const resolvedDocumentXml = documentXml ?? \"\";\n const documentOpenTag = extractDocumentOpenTag(resolvedDocumentXml);\n const documentBackgroundColor =\n parseDocumentBackgroundColor(resolvedDocumentXml);\n const documentPageCount = parseDocumentPageCountFromAppProperties(pkg);\n const compatibility = parseDocumentCompatibilitySettings(pkg);\n const sectionPropertiesXml = extractSectionPropertiesXml(resolvedDocumentXml);\n const contentTypes = parseContentTypes(pkg);\n const styleSheet = parseStyleSheet(pkg);\n const numberingDefinitions = parseNumberingDefinitions(pkg, contentTypes);\n const documentRelationships = parsePartRelationships(\n pkg,\n \"word/document.xml\"\n );\n\n const context: ParseContext = {\n relationships: documentRelationships,\n contentTypes,\n parts: pkg.parts,\n binaryAssets: pkg.binaryAssets,\n styleSheet,\n warnings,\n };\n const headerSections = parseHeaderSections(\n pkg,\n resolvedDocumentXml,\n documentRelationships,\n contentTypes,\n styleSheet,\n warnings\n );\n const footerSections = parseFooterSections(\n pkg,\n resolvedDocumentXml,\n documentRelationships,\n contentTypes,\n styleSheet,\n warnings\n );\n const sections = parseDocumentSections(\n pkg,\n resolvedDocumentXml,\n documentRelationships,\n contentTypes,\n styleSheet,\n warnings\n );\n const footnotes = parseDocumentNotesFromPart(\n pkg,\n \"word/footnotes.xml\",\n \"w:footnote\",\n contentTypes,\n styleSheet,\n warnings\n );\n const endnotes = parseDocumentNotesFromPart(\n pkg,\n \"word/endnotes.xml\",\n \"w:endnote\",\n contentTypes,\n styleSheet,\n warnings\n );\n\n return {\n nodes: parseDocumentXml(resolvedDocumentXml, context),\n metadata: {\n sourceParts: pkg.parts.size,\n warnings,\n documentPageCount,\n documentOpenTag,\n documentBackgroundColor,\n sectionPropertiesXml,\n sections,\n headerSections,\n footerSections,\n paragraphStyles: styleSheet.paragraphStyles.map((style) => ({\n ...style,\n runStyle: style.runStyle ? { ...style.runStyle } : undefined,\n numbering: style.numbering ? { ...style.numbering } : undefined,\n spacing: style.spacing ? { ...style.spacing } : undefined,\n indent: style.indent ? { ...style.indent } : undefined,\n borders: style.borders\n ? {\n top: style.borders.top ? { ...style.borders.top } : undefined,\n right: style.borders.right\n ? { ...style.borders.right }\n : undefined,\n bottom: style.borders.bottom\n ? { ...style.borders.bottom }\n : undefined,\n left: style.borders.left ? { ...style.borders.left } : undefined,\n between: style.borders.between\n ? { ...style.borders.between }\n : undefined,\n bar: style.borders.bar ? { ...style.borders.bar } : undefined,\n }\n : undefined,\n })),\n defaultParagraphStyleId: styleSheet.defaultParagraphStyleId,\n numberingDefinitions: numberingDefinitions\n ? {\n abstracts: numberingDefinitions.abstracts.map(\n (abstractDefinition) => ({\n abstractNumId: abstractDefinition.abstractNumId,\n levels: abstractDefinition.levels.map((level) => ({\n ...level,\n pictureBullet: level.pictureBullet\n ? { ...level.pictureBullet }\n : undefined,\n })),\n })\n ),\n instances: numberingDefinitions.instances.map(\n (instanceDefinition) => ({\n numId: instanceDefinition.numId,\n abstractNumId: instanceDefinition.abstractNumId,\n levelStartOverrides: instanceDefinition.levelStartOverrides\n ? { ...instanceDefinition.levelStartOverrides }\n : undefined,\n levelOverrides: instanceDefinition.levelOverrides\n ? instanceDefinition.levelOverrides.map((level) => ({\n ...level,\n pictureBullet: level.pictureBullet\n ? { ...level.pictureBullet }\n : undefined,\n }))\n : undefined,\n })\n ),\n }\n : undefined,\n compatibility: compatibility ? { ...compatibility } : undefined,\n footnotes:\n footnotes.length > 0\n ? footnotes.map((note) => ({\n ...note,\n nodes: note.nodes?.map(cloneDocNode),\n }))\n : undefined,\n endnotes:\n endnotes.length > 0\n ? endnotes.map((note) => ({\n ...note,\n nodes: note.nodes?.map(cloneDocNode),\n }))\n : undefined,\n },\n };\n}\n\nfunction cloneParagraphNumbering(\n numbering?: ParagraphNumbering\n): ParagraphNumbering | undefined {\n return numbering ? { ...numbering } : undefined;\n}\n\nfunction cloneParagraphSpacing(\n spacing?: ParagraphSpacing\n): ParagraphSpacing | undefined {\n return spacing ? { ...spacing } : undefined;\n}\n\nfunction cloneParagraphIndent(\n indent?: ParagraphIndent\n): ParagraphIndent | undefined {\n return indent ? { ...indent } : undefined;\n}\n\nfunction cloneParagraphBorderStyle(\n border?: ParagraphBorderStyle\n): ParagraphBorderStyle | undefined {\n return border ? { ...border } : undefined;\n}\n\nfunction cloneParagraphBorderSet(\n borders?: ParagraphBorderSet\n): ParagraphBorderSet | undefined {\n if (!borders) {\n return undefined;\n }\n\n return {\n top: cloneParagraphBorderStyle(borders.top),\n right: cloneParagraphBorderStyle(borders.right),\n bottom: cloneParagraphBorderStyle(borders.bottom),\n left: cloneParagraphBorderStyle(borders.left),\n between: cloneParagraphBorderStyle(borders.between),\n bar: cloneParagraphBorderStyle(borders.bar),\n };\n}\n\nfunction cloneParagraphStyle(\n style?: ParagraphStyle\n): ParagraphStyle | undefined {\n if (!style) {\n return undefined;\n }\n\n return {\n ...style,\n numbering: cloneParagraphNumbering(style.numbering),\n spacing: cloneParagraphSpacing(style.spacing),\n indent: cloneParagraphIndent(style.indent),\n borders: cloneParagraphBorderSet(style.borders),\n dropCap: style.dropCap\n ? {\n ...style.dropCap,\n }\n : undefined,\n };\n}\n\nfunction cloneParagraph(paragraph: ParagraphNode): ParagraphNode {\n return {\n type: \"paragraph\",\n style: cloneParagraphStyle(paragraph.style),\n paragraphMarkDeleted: paragraph.paragraphMarkDeleted,\n sourceXml: paragraph.sourceXml,\n children: paragraph.children.map((child) => {\n if (child.type === \"text\") {\n return {\n type: \"text\" as const,\n text: child.text,\n style: child.style ? { ...child.style } : undefined,\n link: child.link,\n };\n }\n\n if (child.type === \"form-field\") {\n return {\n type: \"form-field\" as const,\n fieldType: child.fieldType,\n sourceKind: child.sourceKind,\n id: child.id,\n tag: child.tag,\n title: child.title,\n placeholder: child.placeholder,\n checked: child.checked,\n value: child.value,\n options: child.options?.map((option) => ({\n displayText: option.displayText,\n value: option.value,\n })),\n widget: child.widget\n ? {\n name: child.widget.name,\n enabled: child.widget.enabled,\n calcOnExit: child.widget.calcOnExit,\n text: child.widget.text\n ? {\n inputType: child.widget.text.inputType,\n defaultText: child.widget.text.defaultText,\n maxLength: child.widget.text.maxLength,\n textFormat: child.widget.text.textFormat,\n }\n : undefined,\n checkbox: child.widget.checkbox\n ? {\n defaultChecked: child.widget.checkbox.defaultChecked,\n sizeMode: child.widget.checkbox.sizeMode,\n sizePt: child.widget.checkbox.sizePt,\n }\n : undefined,\n dropdown: child.widget.dropdown\n ? {\n defaultValue: child.widget.dropdown.defaultValue,\n }\n : undefined,\n }\n : undefined,\n checkedSymbol: child.checkedSymbol,\n uncheckedSymbol: child.uncheckedSymbol,\n style: child.style ? { ...child.style } : undefined,\n link: child.link,\n sourceXml: child.sourceXml,\n };\n }\n\n return {\n type: \"image\" as const,\n src: child.src,\n alt: child.alt,\n widthPx: child.widthPx,\n heightPx: child.heightPx,\n partName: child.partName,\n contentType: child.contentType,\n data: child.data ? new Uint8Array(child.data) : undefined,\n sourceXml: child.sourceXml,\n crop: child.crop ? { ...child.crop } : undefined,\n cssFilter: child.cssFilter,\n cssOpacity: child.cssOpacity,\n floating: child.floating ? { ...child.floating } : undefined,\n syntheticTextBox: child.syntheticTextBox,\n textBoxText: child.textBoxText,\n };\n }),\n };\n}\n\nfunction cloneTableBoxSpacing(\n spacing?: TableBoxSpacing\n): TableBoxSpacing | undefined {\n if (!spacing) {\n return undefined;\n }\n\n return {\n topTwips: spacing.topTwips,\n rightTwips: spacing.rightTwips,\n bottomTwips: spacing.bottomTwips,\n leftTwips: spacing.leftTwips,\n };\n}\n\nfunction cloneTableBorderStyle(\n border?: TableBorderStyle\n): TableBorderStyle | undefined {\n if (!border) {\n return undefined;\n }\n\n return {\n type: border.type,\n color: border.color,\n sizeEighthPt: border.sizeEighthPt,\n };\n}\n\nfunction cloneTableBorderSet(\n borders?: TableBorderSet\n): TableBorderSet | undefined {\n if (!borders) {\n return undefined;\n }\n\n return {\n top: cloneTableBorderStyle(borders.top),\n right: cloneTableBorderStyle(borders.right),\n bottom: cloneTableBorderStyle(borders.bottom),\n left: cloneTableBorderStyle(borders.left),\n insideH: cloneTableBorderStyle(borders.insideH),\n insideV: cloneTableBorderStyle(borders.insideV),\n tl2br: cloneTableBorderStyle(borders.tl2br),\n tr2bl: cloneTableBorderStyle(borders.tr2bl),\n };\n}\n\nfunction cloneTableFloatingStyle(\n floating?: NonNullable<TableStyle[\"floating\"]>\n): NonNullable<TableStyle[\"floating\"]> | undefined {\n if (!floating) {\n return undefined;\n }\n\n return {\n xTwips: floating.xTwips,\n yTwips: floating.yTwips,\n leftFromTextTwips: floating.leftFromTextTwips,\n rightFromTextTwips: floating.rightFromTextTwips,\n topFromTextTwips: floating.topFromTextTwips,\n bottomFromTextTwips: floating.bottomFromTextTwips,\n horizontalAnchor: floating.horizontalAnchor,\n verticalAnchor: floating.verticalAnchor,\n horizontalAlign: floating.horizontalAlign,\n verticalAlign: floating.verticalAlign,\n };\n}\n\nfunction cloneTable(table: TableNode): TableNode {\n return {\n type: \"table\",\n sourceXml: table.sourceXml,\n style: table.style\n ? {\n widthTwips: table.style.widthTwips,\n indentTwips: table.style.indentTwips,\n layout: table.style.layout,\n cellSpacingTwips: table.style.cellSpacingTwips,\n floating: cloneTableFloatingStyle(table.style.floating),\n cellMarginTwips: cloneTableBoxSpacing(table.style.cellMarginTwips),\n columnWidthsTwips: table.style.columnWidthsTwips\n ? [...table.style.columnWidthsTwips]\n : undefined,\n borders: cloneTableBorderSet(table.style.borders),\n }\n : undefined,\n rows: table.rows.map((row) => ({\n type: \"table-row\",\n style: row.style ? { ...row.style } : undefined,\n cells: row.cells.map((cell) => ({\n type: \"table-cell\",\n style: cell.style\n ? {\n ...cell.style,\n marginTwips: cloneTableBoxSpacing(cell.style.marginTwips),\n borders: cloneTableBorderSet(cell.style.borders),\n }\n : undefined,\n nodes: cloneTableCellContent(cell.nodes),\n })),\n })),\n };\n}\n\nfunction cloneDocNode(node: DocNode): DocNode {\n return node.type === \"paragraph\" ? cloneParagraph(node) : cloneTable(node);\n}\n\nfunction cloneNumberingDefinitions(\n numberingDefinitions?: NumberingDefinitionSet\n): NumberingDefinitionSet | undefined {\n if (!numberingDefinitions) {\n return undefined;\n }\n\n return {\n abstracts: numberingDefinitions.abstracts.map((abstractDefinition) => ({\n abstractNumId: abstractDefinition.abstractNumId,\n levels: abstractDefinition.levels.map((level) => ({\n ...level,\n runStyle: level.runStyle ? { ...level.runStyle } : undefined,\n pictureBullet: level.pictureBullet\n ? { ...level.pictureBullet }\n : undefined,\n })),\n })),\n instances: numberingDefinitions.instances.map((instanceDefinition) => ({\n numId: instanceDefinition.numId,\n abstractNumId: instanceDefinition.abstractNumId,\n levelStartOverrides: instanceDefinition.levelStartOverrides\n ? { ...instanceDefinition.levelStartOverrides }\n : undefined,\n levelOverrides: instanceDefinition.levelOverrides\n ? instanceDefinition.levelOverrides.map((level) => ({\n ...level,\n runStyle: level.runStyle ? { ...level.runStyle } : undefined,\n pictureBullet: level.pictureBullet\n ? { ...level.pictureBullet }\n : undefined,\n }))\n : undefined,\n })),\n };\n}\n\nexport function cloneDocModel(model: DocModel): DocModel {\n return {\n nodes: model.nodes.map(cloneDocNode),\n metadata: {\n sourceParts: model.metadata.sourceParts,\n warnings: [...model.metadata.warnings],\n documentPageCount: model.metadata.documentPageCount,\n documentOpenTag: model.metadata.documentOpenTag,\n documentBackgroundColor: model.metadata.documentBackgroundColor,\n sectionPropertiesXml: model.metadata.sectionPropertiesXml,\n sections: model.metadata.sections?.map((section) => ({\n startNodeIndex: section.startNodeIndex,\n sectionPropertiesXml: section.sectionPropertiesXml,\n headerSections: (section.headerSections ?? []).map((headerSection) => ({\n partName: headerSection.partName,\n referenceType: headerSection.referenceType,\n nodes: headerSection.nodes.map(cloneDocNode),\n })),\n footerSections: (section.footerSections ?? []).map((footerSection) => ({\n partName: footerSection.partName,\n referenceType: footerSection.referenceType,\n nodes: footerSection.nodes.map(cloneDocNode),\n })),\n })),\n headerSections: (model.metadata.headerSections ?? []).map((section) => ({\n partName: section.partName,\n referenceType: section.referenceType,\n nodes: section.nodes.map(cloneDocNode),\n })),\n footerSections: (model.metadata.footerSections ?? []).map((section) => ({\n partName: section.partName,\n referenceType: section.referenceType,\n nodes: section.nodes.map(cloneDocNode),\n })),\n paragraphStyles: (model.metadata.paragraphStyles ?? []).map((style) => ({\n ...style,\n runStyle: style.runStyle ? { ...style.runStyle } : undefined,\n numbering: cloneParagraphNumbering(style.numbering),\n spacing: cloneParagraphSpacing(style.spacing),\n indent: cloneParagraphIndent(style.indent),\n borders: cloneParagraphBorderSet(style.borders),\n })),\n defaultParagraphStyleId: model.metadata.defaultParagraphStyleId,\n numberingDefinitions: cloneNumberingDefinitions(\n model.metadata.numberingDefinitions\n ),\n compatibility: model.metadata.compatibility\n ? { ...model.metadata.compatibility }\n : undefined,\n footnotes: model.metadata.footnotes?.map((note) => ({\n ...note,\n nodes: note.nodes?.map(cloneDocNode),\n })),\n endnotes: model.metadata.endnotes?.map((note) => ({\n ...note,\n nodes: note.nodes?.map(cloneDocNode),\n })),\n },\n };\n}\n","export interface OoxmlPart {\n name: string;\n content: string;\n}\n\nexport interface OoxmlPackage {\n parts: Map<string, OoxmlPart>;\n binaryAssets: Map<string, Uint8Array>;\n}\n\ninterface ZipEntry {\n name: string;\n compressionMethod: number;\n compressedSize: number;\n localHeaderOffset: number;\n}\n\nconst ZIP_LOCAL_FILE_HEADER_SIGNATURE = 0x04034b50;\nconst ZIP_CENTRAL_DIRECTORY_SIGNATURE = 0x02014b50;\nconst ZIP_EOCD_SIGNATURE = 0x06054b50;\nconst UTF8_FLAG = 0x0800;\nconst STORE_COMPRESSION = 0;\nconst DEFLATE_COMPRESSION = 8;\n\nconst TEXT_DECODER = new TextDecoder();\nconst TEXT_ENCODER = new TextEncoder();\nlet cachedZlibInflate:\n | ((input: Uint8Array) => Uint8Array)\n | undefined;\n\nconst WORD_MAIN_NS = \"http://schemas.openxmlformats.org/wordprocessingml/2006/main\";\n\nconst DEFAULT_DOCUMENT_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<w:document xmlns:w=\"${WORD_MAIN_NS}\">\n <w:body>\n <w:p><w:r><w:t/></w:r></w:p>\n <w:sectPr>\n <w:pgSz w:w=\"12240\" w:h=\"15840\"/>\n <w:pgMar w:top=\"1440\" w:right=\"1440\" w:bottom=\"1440\" w:left=\"1440\" w:header=\"708\" w:footer=\"708\" w:gutter=\"0\"/>\n </w:sectPr>\n </w:body>\n</w:document>`;\n\nconst DEFAULT_CONTENT_TYPES_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">\n <Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/>\n <Default Extension=\"xml\" ContentType=\"application/xml\"/>\n <Override PartName=\"/word/document.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml\"/>\n</Types>`;\n\nconst DEFAULT_ROOT_RELS_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\n <Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\" Target=\"word/document.xml\"/>\n</Relationships>`;\n\nconst DEFAULT_DOCUMENT_RELS_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"/>`;\n\nfunction dataView(bytes: Uint8Array): DataView {\n return new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n}\n\nfunction decodeZipString(input: Uint8Array): string {\n return TEXT_DECODER.decode(input);\n}\n\nfunction findEocdOffset(bytes: Uint8Array): number {\n const minimumLength = 22;\n if (bytes.byteLength < minimumLength) {\n throw new Error(\"Invalid DOCX ZIP: too small to contain EOCD\");\n }\n\n const view = dataView(bytes);\n const maxCommentLength = 0xffff;\n const searchStart = Math.max(0, bytes.byteLength - minimumLength - maxCommentLength);\n\n for (let index = bytes.byteLength - minimumLength; index >= searchStart; index -= 1) {\n if (view.getUint32(index, true) === ZIP_EOCD_SIGNATURE) {\n return index;\n }\n }\n\n throw new Error(\"Invalid DOCX ZIP: end of central directory not found\");\n}\n\nfunction parseCentralDirectory(bytes: Uint8Array): ZipEntry[] {\n const view = dataView(bytes);\n const eocdOffset = findEocdOffset(bytes);\n\n const totalEntries = view.getUint16(eocdOffset + 10, true);\n const centralDirectoryOffset = view.getUint32(eocdOffset + 16, true);\n\n const entries: ZipEntry[] = [];\n let cursor = centralDirectoryOffset;\n\n for (let index = 0; index < totalEntries; index += 1) {\n if (view.getUint32(cursor, true) !== ZIP_CENTRAL_DIRECTORY_SIGNATURE) {\n throw new Error(\"Invalid DOCX ZIP: malformed central directory\");\n }\n\n const compressionMethod = view.getUint16(cursor + 10, true);\n const compressedSize = view.getUint32(cursor + 20, true);\n const fileNameLength = view.getUint16(cursor + 28, true);\n const extraFieldLength = view.getUint16(cursor + 30, true);\n const fileCommentLength = view.getUint16(cursor + 32, true);\n const localHeaderOffset = view.getUint32(cursor + 42, true);\n\n const fileNameStart = cursor + 46;\n const fileNameEnd = fileNameStart + fileNameLength;\n const nameBytes = bytes.subarray(fileNameStart, fileNameEnd);\n\n entries.push({\n name: decodeZipString(nameBytes),\n compressionMethod,\n compressedSize,\n localHeaderOffset\n });\n\n cursor = fileNameEnd + extraFieldLength + fileCommentLength;\n }\n\n return entries;\n}\n\nasync function inflateRaw(data: Uint8Array): Promise<Uint8Array> {\n if (typeof DecompressionStream !== \"undefined\") {\n const payload = Uint8Array.from(data);\n const stream = new Blob([payload])\n .stream()\n .pipeThrough(new DecompressionStream(\"deflate-raw\"));\n const output = await new Response(stream).arrayBuffer();\n return new Uint8Array(output);\n }\n\n if (!cachedZlibInflate) {\n const dynamicImport = Function(\n \"specifier\",\n \"return import(specifier);\"\n ) as (specifier: string) => Promise<{ inflateRawSync: (input: Uint8Array) => Uint8Array }>;\n const zlib = await dynamicImport(\"node:zlib\");\n cachedZlibInflate = zlib.inflateRawSync;\n }\n\n const inflated = cachedZlibInflate(data);\n return new Uint8Array(inflated.buffer, inflated.byteOffset, inflated.byteLength);\n}\n\nasync function extractEntryData(bytes: Uint8Array, entry: ZipEntry): Promise<Uint8Array> {\n const view = dataView(bytes);\n const localHeaderOffset = entry.localHeaderOffset;\n\n if (view.getUint32(localHeaderOffset, true) !== ZIP_LOCAL_FILE_HEADER_SIGNATURE) {\n throw new Error(`Invalid DOCX ZIP: bad local header for ${entry.name}`);\n }\n\n const fileNameLength = view.getUint16(localHeaderOffset + 26, true);\n const extraFieldLength = view.getUint16(localHeaderOffset + 28, true);\n const payloadOffset = localHeaderOffset + 30 + fileNameLength + extraFieldLength;\n\n const compressedData = bytes.subarray(payloadOffset, payloadOffset + entry.compressedSize);\n\n if (entry.compressionMethod === STORE_COMPRESSION) {\n return new Uint8Array(compressedData);\n }\n\n if (entry.compressionMethod === DEFLATE_COMPRESSION) {\n return inflateRaw(compressedData);\n }\n\n throw new Error(\n `Unsupported DOCX ZIP compression method ${entry.compressionMethod} for ${entry.name}`\n );\n}\n\nfunction isTextPart(partName: string): boolean {\n return (\n partName === \"[Content_Types].xml\" ||\n /\\.xml$/i.test(partName) ||\n /\\.rels$/i.test(partName) ||\n /\\.txt$/i.test(partName)\n );\n}\n\nexport async function parseDocx(input: ArrayBuffer): Promise<OoxmlPackage> {\n if (input.byteLength === 0) {\n throw new Error(\"DOCX input cannot be empty\");\n }\n\n const bytes = new Uint8Array(input);\n const entries = parseCentralDirectory(bytes);\n\n const parts = new Map<string, OoxmlPart>();\n const binaryAssets = new Map<string, Uint8Array>();\n\n const fileEntries = entries.filter((entry) => !entry.name.endsWith(\"/\"));\n const extractedEntries = await Promise.all(\n fileEntries.map(async (entry) => ({\n entry,\n fileBytes: await extractEntryData(bytes, entry)\n }))\n );\n\n for (const extracted of extractedEntries) {\n const { entry, fileBytes } = extracted;\n if (isTextPart(entry.name)) {\n parts.set(entry.name, {\n name: entry.name,\n content: TEXT_DECODER.decode(fileBytes)\n });\n continue;\n }\n\n binaryAssets.set(entry.name, fileBytes);\n }\n\n if (!parts.has(\"word/document.xml\")) {\n throw new Error(\"Invalid DOCX: missing word/document.xml\");\n }\n\n return {\n parts,\n binaryAssets\n };\n}\n\nfunction createCrc32Table(): Uint32Array {\n const table = new Uint32Array(256);\n for (let index = 0; index < 256; index += 1) {\n let value = index;\n for (let bit = 0; bit < 8; bit += 1) {\n value = (value & 1) === 1 ? (value >>> 1) ^ 0xedb88320 : value >>> 1;\n }\n table[index] = value >>> 0;\n }\n return table;\n}\n\nconst CRC32_TABLE = createCrc32Table();\n\nfunction crc32(bytes: Uint8Array): number {\n let value = 0xffffffff;\n for (const byte of bytes) {\n value = (value >>> 8) ^ CRC32_TABLE[(value ^ byte) & 0xff];\n }\n return (value ^ 0xffffffff) >>> 0;\n}\n\nfunction writeUint16(view: DataView, offset: number, value: number): void {\n view.setUint16(offset, value & 0xffff, true);\n}\n\nfunction writeUint32(view: DataView, offset: number, value: number): void {\n view.setUint32(offset, value >>> 0, true);\n}\n\nfunction concatUint8Arrays(chunks: Uint8Array[]): Uint8Array {\n const totalLength = chunks.reduce((sum, chunk) => sum + chunk.byteLength, 0);\n const output = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const chunk of chunks) {\n output.set(chunk, offset);\n offset += chunk.byteLength;\n }\n\n return output;\n}\n\nexport function packageToArrayBuffer(pkg: OoxmlPackage): ArrayBuffer {\n const entries = [\n ...Array.from(pkg.parts.values(), (part) => ({\n name: part.name,\n data: TEXT_ENCODER.encode(part.content)\n })),\n ...Array.from(pkg.binaryAssets.entries(), ([name, data]) => ({\n name,\n data\n }))\n ].sort((left, right) => left.name.localeCompare(right.name));\n\n if (entries.length === 0) {\n throw new Error(\"Cannot create DOCX ZIP from an empty package\");\n }\n\n if (entries.length > 0xffff) {\n throw new Error(\"Too many ZIP entries for non-ZIP64 writer\");\n }\n\n const localChunks: Uint8Array[] = [];\n const centralChunks: Uint8Array[] = [];\n let offset = 0;\n\n for (const entry of entries) {\n const nameBytes = TEXT_ENCODER.encode(entry.name);\n const payload = entry.data;\n const crc = crc32(payload);\n\n const localHeader = new Uint8Array(30 + nameBytes.byteLength + payload.byteLength);\n const localView = dataView(localHeader);\n\n writeUint32(localView, 0, ZIP_LOCAL_FILE_HEADER_SIGNATURE);\n writeUint16(localView, 4, 20);\n writeUint16(localView, 6, UTF8_FLAG);\n writeUint16(localView, 8, STORE_COMPRESSION);\n writeUint16(localView, 10, 0);\n writeUint16(localView, 12, 0);\n writeUint32(localView, 14, crc);\n writeUint32(localView, 18, payload.byteLength);\n writeUint32(localView, 22, payload.byteLength);\n writeUint16(localView, 26, nameBytes.byteLength);\n writeUint16(localView, 28, 0);\n\n localHeader.set(nameBytes, 30);\n localHeader.set(payload, 30 + nameBytes.byteLength);\n\n localChunks.push(localHeader);\n\n const centralHeader = new Uint8Array(46 + nameBytes.byteLength);\n const centralView = dataView(centralHeader);\n\n writeUint32(centralView, 0, ZIP_CENTRAL_DIRECTORY_SIGNATURE);\n writeUint16(centralView, 4, 20);\n writeUint16(centralView, 6, 20);\n writeUint16(centralView, 8, UTF8_FLAG);\n writeUint16(centralView, 10, STORE_COMPRESSION);\n writeUint16(centralView, 12, 0);\n writeUint16(centralView, 14, 0);\n writeUint32(centralView, 16, crc);\n writeUint32(centralView, 20, payload.byteLength);\n writeUint32(centralView, 24, payload.byteLength);\n writeUint16(centralView, 28, nameBytes.byteLength);\n writeUint16(centralView, 30, 0);\n writeUint16(centralView, 32, 0);\n writeUint16(centralView, 34, 0);\n writeUint16(centralView, 36, 0);\n writeUint32(centralView, 38, 0);\n writeUint32(centralView, 42, offset);\n centralHeader.set(nameBytes, 46);\n\n centralChunks.push(centralHeader);\n offset += localHeader.byteLength;\n }\n\n const centralDirectoryOffset = offset;\n const centralDirectory = concatUint8Arrays(centralChunks);\n const localFileData = concatUint8Arrays(localChunks);\n\n const eocd = new Uint8Array(22);\n const eocdView = dataView(eocd);\n writeUint32(eocdView, 0, ZIP_EOCD_SIGNATURE);\n writeUint16(eocdView, 4, 0);\n writeUint16(eocdView, 6, 0);\n writeUint16(eocdView, 8, entries.length);\n writeUint16(eocdView, 10, entries.length);\n writeUint32(eocdView, 12, centralDirectory.byteLength);\n writeUint32(eocdView, 16, centralDirectoryOffset);\n writeUint16(eocdView, 20, 0);\n\n const output = concatUint8Arrays([localFileData, centralDirectory, eocd]);\n return new Uint8Array(output).buffer;\n}\n\nexport function createMinimalDocxPackage(documentXml = DEFAULT_DOCUMENT_XML): OoxmlPackage {\n return {\n parts: new Map([\n [\"[Content_Types].xml\", { name: \"[Content_Types].xml\", content: DEFAULT_CONTENT_TYPES_XML }],\n [\"_rels/.rels\", { name: \"_rels/.rels\", content: DEFAULT_ROOT_RELS_XML }],\n [\"word/document.xml\", { name: \"word/document.xml\", content: documentXml }],\n [\n \"word/_rels/document.xml.rels\",\n { name: \"word/_rels/document.xml.rels\", content: DEFAULT_DOCUMENT_RELS_XML }\n ]\n ]),\n binaryAssets: new Map()\n };\n}\n\nexport function getPart(pkg: OoxmlPackage, partName: string): OoxmlPart | undefined {\n return pkg.parts.get(partName);\n}\n\nexport function withPart(pkg: OoxmlPackage, part: OoxmlPart): OoxmlPackage {\n const parts = new Map(pkg.parts);\n parts.set(part.name, part);\n return {\n parts,\n binaryAssets: new Map(pkg.binaryAssets)\n };\n}\n"],"mappings":"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","names":["safeWidth","safeHeight","shapeXml","shapePropertiesXml","preset","fill","stroke","presetPathData","pathXml","directPathData","pathData","categories","defaultTag","value"]}