docxmlater 10.2.2 → 10.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/DocumentParser.d.ts.map +1 -1
- package/dist/core/DocumentParser.js +44 -0
- package/dist/core/DocumentParser.js.map +1 -1
- package/dist/elements/Field.d.ts.map +1 -1
- package/dist/elements/Field.js +6 -4
- package/dist/elements/Field.js.map +1 -1
- package/dist/utils/InMemoryRevisionAcceptor.d.ts.map +1 -1
- package/dist/utils/InMemoryRevisionAcceptor.js +24 -4
- package/dist/utils/InMemoryRevisionAcceptor.js.map +1 -1
- package/package.json +1 -1
- package/src/core/DocumentParser.ts +50 -1
- package/src/elements/Field.ts +10 -7
- package/src/utils/InMemoryRevisionAcceptor.ts +31 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DocumentParser.js","sourceRoot":"","sources":["../../src/core/DocumentParser.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * DocumentParser - Handles parsing of DOCX files\n * Extracts content from ZIP archives and converts XML to structured data\n */\n\nimport { AlternateContent } from '../elements/AlternateContent';\nimport { Bookmark } from '../elements/Bookmark';\nimport { Endnote, EndnoteType } from '../elements/Endnote';\nimport { Footnote, FootnoteType } from '../elements/Footnote';\nimport { BookmarkManager } from '../elements/BookmarkManager';\nimport { Comment } from '../elements/Comment';\nimport { CustomXmlBlock } from '../elements/CustomXml';\nimport { PreservedElement } from '../elements/PreservedElement';\nimport { MathParagraph } from '../elements/MathElement';\nimport { ComplexField, Field } from '../elements/Field';\nimport { isHyperlinkInstruction, parseHyperlinkInstruction } from '../elements/FieldHelpers';\nimport { Footer } from '../elements/Footer';\nimport { Header } from '../elements/Header';\nimport { Hyperlink } from '../elements/Hyperlink';\nimport { ImageManager } from '../elements/ImageManager';\nimport { ImageRun } from '../elements/ImageRun';\nimport { Paragraph, ParagraphFormatting, ParagraphContent } from '../elements/Paragraph';\nimport { Revision } from '../elements/Revision';\nimport {\n BreakType,\n FormFieldCheckBox,\n FormFieldData,\n FormFieldDropDownList,\n FormFieldTextInput,\n Run,\n RunContent,\n RunFormatting,\n} from '../elements/Run';\nimport { PageNumberFormat, Section, SectionProperties, SectionType } from '../elements/Section';\nimport { StructuredDocumentTag } from '../elements/StructuredDocumentTag';\nimport { Table, TableBorder } from '../elements/Table';\nimport { TableCell } from '../elements/TableCell';\nimport { TableOfContents } from '../elements/TableOfContents';\nimport { TableOfContentsElement } from '../elements/TableOfContentsElement';\nimport { TableRow } from '../elements/TableRow';\nimport { AbstractNumbering } from '../formatting/AbstractNumbering';\nimport { NumberingInstance } from '../formatting/NumberingInstance';\nimport { Style, StyleProperties, StyleType } from '../formatting/Style';\nimport { logParagraphContent, logParsing, logTextDirection } from '../utils/diagnostics';\nimport { getGlobalLogger, createScopedLogger, ILogger, defaultLogger } from '../utils/logger';\nimport { safeParseInt, isExplicitlySet, parseOoxmlBoolean } from '../utils/parsingHelpers';\nimport { halfPointsToPoints } from '../utils/units';\nimport type { ShadingConfig } from '../elements/CommonTypes';\n\n// Create scoped logger for DocumentParser operations\nfunction getLogger(): ILogger {\n return createScopedLogger(getGlobalLogger(), 'DocumentParser');\n}\nimport { XMLBuilder, XMLElement } from '../xml/XMLBuilder';\nimport { XMLParser } from '../xml/XMLParser';\nimport { ZipHandler } from '../zip/ZipHandler';\nimport { DOCX_PATHS } from '../zip/types';\nimport { DocumentProperties } from './Document';\nimport { BodyElement } from './DocumentContent';\nimport { RelationshipManager } from './RelationshipManager';\n\n/**\n * Parse error tracking\n */\nexport interface ParseError {\n element: string;\n error: Error;\n}\n\n/**\n * DocumentParser handles all document parsing logic\n */\nexport class DocumentParser {\n private parseErrors: ParseError[] = [];\n private strictParsing: boolean;\n private bookmarkManager: BookmarkManager | null = null;\n /**\n * Current part name being parsed (e.g., 'header1.xml', 'footer1.xml').\n * Used to create composite keys for image relationship IDs to distinguish\n * between images in different parts (headers/footers have their own .rels files).\n */\n private currentPartName: string | undefined = undefined;\n\n constructor(strictParsing = false) {\n this.strictParsing = strictParsing;\n }\n\n /**\n * Gets accumulated parse errors/warnings\n */\n getParseErrors(): ParseError[] {\n return [...this.parseErrors];\n }\n\n /**\n * Clears accumulated parse errors\n */\n clearParseErrors(): void {\n this.parseErrors = [];\n }\n\n /**\n * Parses the document XML and extracts content\n * @param zipHandler - ZIP handler containing the document\n * @param relationshipManager - Relationship manager to populate\n * @param imageManager - Image manager to register parsed images\n * @returns Parsed body elements, properties, and updated relationship manager\n */\n async parseDocument(\n zipHandler: ZipHandler,\n relationshipManager: RelationshipManager,\n imageManager: ImageManager,\n bookmarkManager?: BookmarkManager\n ): Promise<{\n bodyElements: BodyElement[];\n properties: DocumentProperties;\n relationshipManager: RelationshipManager;\n styles: Style[];\n abstractNumberings: AbstractNumbering[];\n numberingInstances: NumberingInstance[];\n section: Section | null;\n namespaces: Record<string, string>;\n documentBackground?: {\n color?: string;\n themeColor?: string;\n themeTint?: string;\n themeShade?: string;\n };\n }> {\n const logger = getLogger();\n logger.info('Parsing document');\n\n // Store bookmarkManager for use in parsing methods\n this.bookmarkManager = bookmarkManager || null;\n\n // Verify the document exists\n const docXml = zipHandler.getFileAsString(DOCX_PATHS.DOCUMENT);\n if (!docXml) {\n logger.error('Invalid document: word/document.xml not found');\n throw new Error('Invalid document: word/document.xml not found');\n }\n\n logger.info('Parsing document.xml', { xmlSize: docXml.length });\n\n // Parse existing relationships to avoid ID collisions\n const parsedRelationshipManager = this.parseRelationships(zipHandler, relationshipManager);\n\n // Parse document properties\n const properties = this.parseProperties(zipHandler);\n\n // Parse body elements (paragraphs and tables)\n // Now includes image parsing support\n const bodyElements = await this.parseBodyElements(\n docXml,\n parsedRelationshipManager,\n zipHandler,\n imageManager\n );\n\n // Parse styles from styles.xml\n const styles = this.parseStyles(zipHandler);\n logger.info('Parsed styles', { styleCount: styles.length });\n\n // Parse numbering from numbering.xml\n const numbering = this.parseNumbering(zipHandler);\n logger.info('Parsed numbering', {\n abstractCount: numbering.abstractNumberings.length,\n instanceCount: numbering.numberingInstances.length,\n });\n\n // Parse section properties from document.xml\n const section = this.parseSectionProperties(docXml);\n\n // Parse document background (w:background) per ECMA-376 Part 1 §17.2.1\n const documentBackground = this.parseDocumentBackground(docXml);\n\n // Parse and preserve namespaces from the root <w:document> tag\n const namespaces = this.parseNamespaces(docXml);\n\n // Count element types for logging\n let paragraphCount = 0;\n let tableCount = 0;\n for (const elem of bodyElements) {\n if (elem instanceof Paragraph) paragraphCount++;\n else if (elem instanceof Table) tableCount++;\n }\n logger.info('Document parsed', {\n paragraphs: paragraphCount,\n tables: tableCount,\n totalElements: bodyElements.length,\n });\n\n // Log any parse errors\n if (this.parseErrors.length > 0) {\n logger.warn('Parse errors encountered', { errorCount: this.parseErrors.length });\n }\n\n return {\n bodyElements,\n properties,\n relationshipManager: parsedRelationshipManager,\n styles,\n abstractNumberings: numbering.abstractNumberings,\n numberingInstances: numbering.numberingInstances,\n section,\n namespaces,\n documentBackground,\n };\n }\n\n /**\n * Parses body elements from document XML\n * Extracts paragraphs and tables with their formatting\n * Uses XMLParser for safe position-based parsing (prevents ReDoS)\n *\n * CRITICAL: Preserves document order by parsing elements sequentially\n * instead of by type. This prevents massive content loss and corruption.\n */\n private async parseBodyElements(\n docXml: string,\n relationshipManager: RelationshipManager,\n zipHandler: ZipHandler,\n imageManager: ImageManager\n ): Promise<BodyElement[]> {\n const bodyElements: BodyElement[] = [];\n\n // Extract the body content using safe position-based parsing\n const bodyContent = XMLParser.extractBody(docXml);\n if (!bodyContent) {\n return bodyElements;\n }\n\n let pos = 0;\n let pendingBookmarkStarts: Bookmark[] = [];\n while (pos < bodyContent.length) {\n const nextP = this.findNextTopLevelTag(bodyContent, 'w:p', pos);\n const nextTbl = this.findNextTopLevelTag(bodyContent, 'w:tbl', pos);\n const nextSdt = this.findNextTopLevelTag(bodyContent, 'w:sdt', pos);\n const nextAC = this.findNextTopLevelTag(bodyContent, 'mc:AlternateContent', pos);\n const nextMath = this.findNextTopLevelTag(bodyContent, 'm:oMathPara', pos);\n const nextCXml = this.findNextTopLevelTag(bodyContent, 'w:customXml', pos);\n const nextAltChunk = this.findNextTopLevelTag(bodyContent, 'w:altChunk', pos);\n\n const candidates = [];\n if (nextP !== -1) candidates.push({ type: 'p', pos: nextP });\n if (nextTbl !== -1) candidates.push({ type: 'tbl', pos: nextTbl });\n if (nextSdt !== -1) candidates.push({ type: 'sdt', pos: nextSdt });\n if (nextAC !== -1) candidates.push({ type: 'alternateContent', pos: nextAC });\n if (nextMath !== -1) candidates.push({ type: 'mathParagraph', pos: nextMath });\n if (nextCXml !== -1) candidates.push({ type: 'customXml', pos: nextCXml });\n if (nextAltChunk !== -1) candidates.push({ type: 'altChunk', pos: nextAltChunk });\n\n if (candidates.length === 0) break;\n\n candidates.sort((a, b) => a.pos - b.pos);\n const next = candidates[0];\n\n if (next) {\n // Check for body-level bookmarkEnd elements BEFORE this element\n // These appear between the previous element and this one\n if (bodyElements.length > 0 && next.pos > pos) {\n const bookmarkEnds = this.extractBodyLevelBookmarkEnds(bodyContent, pos, next.pos);\n if (bookmarkEnds.length > 0) {\n // Attach to the previous element\n const prevElement = bodyElements[bodyElements.length - 1];\n if (prevElement instanceof Paragraph) {\n for (const bookmark of bookmarkEnds) {\n prevElement.addBookmarkEnd(bookmark);\n }\n } else if (prevElement instanceof Table) {\n // For tables, attach to the last paragraph in the last cell\n const lastPara = prevElement.getLastParagraph();\n if (lastPara) {\n for (const bookmark of bookmarkEnds) {\n lastPara.addBookmarkEnd(bookmark);\n }\n }\n }\n }\n }\n\n // Check for body-level bookmarkStart elements BEFORE this element\n // These appear between the previous element and this one\n // Unlike bookmarkEnds (attached to previous), bookmarkStarts are\n // collected as pending and attached to the NEXT parsed element\n if (next.pos > pos) {\n const bookmarkStarts = this.extractBodyLevelBookmarkStarts(bodyContent, pos, next.pos);\n if (bookmarkStarts.length > 0) {\n pendingBookmarkStarts.push(...bookmarkStarts);\n }\n }\n\n // Check if this element is inside a w:del block (deleted via Track Changes)\n // If so, skip the entire w:del block including all its content\n if (this.isPositionInsideDel(bodyContent, next.pos)) {\n const delEndPos = this.findDelEndPosition(bodyContent, next.pos);\n if (delEndPos > 0) {\n pos = delEndPos;\n } else {\n pos = next.pos + 1;\n }\n continue;\n }\n\n if (next.type === 'p') {\n const elementXml = this.extractSingleElement(bodyContent, 'w:p', next.pos);\n\n if (elementXml) {\n // Parse paragraph with order preservation\n // Use the new method that preserves the exact order of runs and hyperlinks\n const paragraph = await this.parseParagraphWithOrder(\n elementXml,\n relationshipManager,\n zipHandler,\n imageManager\n );\n if (paragraph) bodyElements.push(paragraph);\n pos = next.pos + elementXml.length;\n } else {\n pos = next.pos + 1;\n }\n } else if (next.type === 'tbl') {\n const elementXml = this.extractSingleElement(bodyContent, 'w:tbl', next.pos);\n if (elementXml) {\n // Parse XML to object, then extract the table content\n // IMPORTANT: trimValues: false preserves whitespace from xml:space=\"preserve\" attributes\n const parsed = XMLParser.parseToObject(elementXml, {\n trimValues: false,\n });\n const table = await this.parseTableFromObject(\n parsed['w:tbl'],\n relationshipManager,\n zipHandler,\n imageManager,\n elementXml\n );\n if (table) bodyElements.push(table);\n pos = next.pos + elementXml.length;\n } else {\n pos = next.pos + 1;\n }\n } else if (next.type === 'sdt') {\n const elementXml = this.extractSingleElement(bodyContent, 'w:sdt', next.pos);\n if (elementXml) {\n // Parse XML to object, then extract the SDT content\n // IMPORTANT: trimValues: false preserves whitespace from xml:space=\"preserve\" attributes\n const parsed = XMLParser.parseToObject(elementXml, {\n trimValues: false,\n });\n const sdt = await this.parseSDTFromObject(\n parsed['w:sdt'],\n relationshipManager,\n zipHandler,\n imageManager\n );\n if (sdt) bodyElements.push(sdt);\n pos = next.pos + elementXml.length;\n } else {\n pos = next.pos + 1;\n }\n } else if (next.type === 'alternateContent') {\n // mc:AlternateContent - preserve as raw XML for round-trip fidelity\n const elementXml = this.extractSingleElement(\n bodyContent,\n 'mc:AlternateContent',\n next.pos\n );\n if (elementXml) {\n bodyElements.push(new AlternateContent(elementXml));\n pos = next.pos + elementXml.length;\n } else {\n pos = next.pos + 1;\n }\n } else if (next.type === 'mathParagraph') {\n // m:oMathPara - preserve as raw XML for round-trip fidelity\n const elementXml = this.extractSingleElement(bodyContent, 'm:oMathPara', next.pos);\n if (elementXml) {\n bodyElements.push(new MathParagraph(elementXml));\n pos = next.pos + elementXml.length;\n } else {\n pos = next.pos + 1;\n }\n } else if (next.type === 'customXml') {\n // w:customXml - preserve as raw XML for round-trip fidelity\n const elementXml = this.extractSingleElement(bodyContent, 'w:customXml', next.pos);\n if (elementXml) {\n bodyElements.push(new CustomXmlBlock(elementXml));\n pos = next.pos + elementXml.length;\n } else {\n pos = next.pos + 1;\n }\n } else if (next.type === 'altChunk') {\n // w:altChunk - preserve as raw XML for round-trip fidelity\n const elementXml = this.extractSingleElement(bodyContent, 'w:altChunk', next.pos);\n if (elementXml) {\n bodyElements.push(new PreservedElement(elementXml, 'altChunk', 'block'));\n pos = next.pos + elementXml.length;\n } else {\n pos = next.pos + 1;\n }\n }\n\n // Attach any pending body-level bookmarkStarts to the just-parsed element\n if (pendingBookmarkStarts.length > 0 && bodyElements.length > 0) {\n const currentElement = bodyElements[bodyElements.length - 1];\n if (currentElement instanceof Paragraph) {\n for (const bookmark of pendingBookmarkStarts) {\n currentElement.addBookmarkStart(bookmark);\n }\n } else if (currentElement instanceof Table) {\n // For tables, attach to the first paragraph of the first cell\n const firstPara = currentElement.getFirstParagraph();\n if (firstPara) {\n for (const bookmark of pendingBookmarkStarts) {\n firstPara.addBookmarkStart(bookmark);\n }\n }\n }\n pendingBookmarkStarts = [];\n }\n }\n }\n\n // Check for any trailing body-level bookmarkEnd elements after the last element\n if (bodyElements.length > 0 && pos < bodyContent.length) {\n const trailingBookmarkEnds = this.extractBodyLevelBookmarkEnds(bodyContent, pos, -1);\n if (trailingBookmarkEnds.length > 0) {\n const lastElement = bodyElements[bodyElements.length - 1];\n if (lastElement instanceof Paragraph) {\n for (const bookmark of trailingBookmarkEnds) {\n lastElement.addBookmarkEnd(bookmark);\n }\n } else if (lastElement instanceof Table) {\n const lastPara = lastElement.getLastParagraph();\n if (lastPara) {\n for (const bookmark of trailingBookmarkEnds) {\n lastPara.addBookmarkEnd(bookmark);\n }\n }\n }\n }\n }\n\n // Check for any trailing body-level bookmarkStart elements after the last element\n if (bodyElements.length > 0 && pos < bodyContent.length) {\n const trailingBookmarkStarts = this.extractBodyLevelBookmarkStarts(bodyContent, pos, -1);\n if (trailingBookmarkStarts.length > 0) {\n const lastElement = bodyElements[bodyElements.length - 1];\n if (lastElement instanceof Paragraph) {\n for (const bookmark of trailingBookmarkStarts) {\n lastElement.addBookmarkStart(bookmark);\n }\n } else if (lastElement instanceof Table) {\n const lastPara = lastElement.getLastParagraph();\n if (lastPara) {\n for (const bookmark of trailingBookmarkStarts) {\n lastPara.addBookmarkStart(bookmark);\n }\n }\n }\n }\n }\n\n // Assemble multi-paragraph complex fields (e.g., TOC fields spanning multiple paragraphs)\n this.assembleMultiParagraphFields(bodyElements);\n\n // Validate that we didn't load an empty/corrupted document\n this.validateLoadedContent(bodyElements);\n\n return bodyElements;\n }\n\n /**\n * Extracts body-level bookmarkEnd elements between two positions in the content.\n * These are bookmarkEnd elements that appear outside of paragraphs/tables.\n * @param content - The body content XML\n * @param startPos - Start position to search from\n * @param endPos - End position to search to (or end of content if -1)\n * @returns Array of Bookmark objects for the bookmarkEnd elements\n */\n private extractBodyLevelBookmarkEnds(\n content: string,\n startPos: number,\n endPos: number\n ): Bookmark[] {\n const searchContent = endPos === -1 ? content.slice(startPos) : content.slice(startPos, endPos);\n\n return this.extractBookmarkEndsFromContent(searchContent);\n }\n\n /**\n * Extracts bookmarkEnd elements from any XML content string.\n * Uses position-based parsing via XMLParser (ECMA-376 compliant, ReDoS-safe).\n * @param content - The XML content to search\n * @returns Array of Bookmark objects for the bookmarkEnd elements\n */\n private extractBookmarkEndsFromContent(content: string): Bookmark[] {\n const bookmarks: Bookmark[] = [];\n\n // Use position-based XMLParser instead of regex for ECMA-376 compliance\n // This handles any attribute order and is safe from ReDoS attacks\n const bookmarkEndXmls = XMLParser.extractElements(content, 'w:bookmarkEnd');\n\n for (const bookmarkEndXml of bookmarkEndXmls) {\n const idAttr = XMLParser.extractAttribute(bookmarkEndXml, 'w:id');\n if (idAttr) {\n const id = parseInt(idAttr, 10);\n if (!isNaN(id)) {\n const bookmark = new Bookmark({\n name: `_end_${id}`,\n id: id,\n skipNormalization: true,\n });\n bookmarks.push(bookmark);\n }\n }\n }\n\n return bookmarks;\n }\n\n /**\n * Extracts body-level bookmarkStart elements between two positions in the content.\n * These are bookmarkStart elements that appear outside of paragraphs/tables.\n * @param content - The body content XML\n * @param startPos - Start position to search from\n * @param endPos - End position to search to (or end of content if -1)\n * @returns Array of Bookmark objects for the bookmarkStart elements\n */\n private extractBodyLevelBookmarkStarts(\n content: string,\n startPos: number,\n endPos: number\n ): Bookmark[] {\n const searchContent = endPos === -1 ? content.slice(startPos) : content.slice(startPos, endPos);\n\n return this.extractBookmarkStartsFromContent(searchContent);\n }\n\n /**\n * Extracts bookmarkStart elements from any XML content string.\n * Uses position-based parsing via XMLParser (ECMA-376 compliant, ReDoS-safe).\n * Reuses the existing parseBookmarkStart() method for consistent parsing.\n * @param content - The XML content to search\n * @returns Array of Bookmark objects for the bookmarkStart elements\n */\n private extractBookmarkStartsFromContent(content: string): Bookmark[] {\n const bookmarks: Bookmark[] = [];\n\n const bookmarkStartXmls = XMLParser.extractElements(content, 'w:bookmarkStart');\n\n for (const bookmarkStartXml of bookmarkStartXmls) {\n const bookmark = this.parseBookmarkStart(bookmarkStartXml);\n if (bookmark) {\n bookmarks.push(bookmark);\n }\n }\n\n return bookmarks;\n }\n\n /**\n * Finds the next occurrence of a tag in the content\n * Returns the position of the opening '<' or -1 if not found\n */\n private findNextTag(content: string, tagName: string, startPos: number): number {\n const tag = `<${tagName}`;\n let pos = content.indexOf(tag, startPos);\n\n while (pos !== -1) {\n // Verify this is the exact tag (not a prefix match like <w:p matching <w:pPr>)\n // The character after the tag name must be either '>', '/' or whitespace\n const charAfterTag = content[pos + tag.length];\n if (\n charAfterTag &&\n charAfterTag !== '>' &&\n charAfterTag !== '/' &&\n charAfterTag !== ' ' &&\n charAfterTag !== '\\t' &&\n charAfterTag !== '\\n' &&\n charAfterTag !== '\\r'\n ) {\n // This is a prefix match (e.g., <w:pPr> when looking for <w:p>), skip it\n pos = content.indexOf(tag, pos + tag.length);\n continue;\n }\n return pos;\n }\n return -1;\n }\n\n /**\n * Finds the next TOP-LEVEL occurrence of a tag (not nested inside tables)\n * This prevents paragraphs inside table cells from being extracted as body paragraphs\n * Returns the position of the opening '<' or -1 if not found\n */\n private findNextTopLevelTag(content: string, tagName: string, startPos: number): number {\n let pos = startPos;\n\n while (pos < content.length) {\n // Find the next occurrence of the tag\n const tagPos = this.findNextTag(content, tagName, pos);\n if (tagPos === -1) {\n return -1; // No more tags found\n }\n\n // Check if this tag is nested inside a table\n // Look backwards from tagPos to see if we're inside an unclosed <w:tbl>\n const isInsideTable = this.isPositionInsideTable(content, tagPos);\n\n if (!isInsideTable) {\n // This is a top-level tag\n return tagPos;\n }\n\n // This tag is inside a table, skip past it and continue searching\n pos = tagPos + 1;\n }\n\n return -1;\n }\n\n /**\n * Counts unclosed opening tags of a specific element type in content.\n * Uses position-based parsing instead of regex for ECMA-376 compliance.\n * @param content - XML content to search\n * @param tagName - Element name (e.g., \"w:tbl\", \"w:p\", \"w:sdt\")\n * @returns Number of unclosed opening tags (opens - closes)\n */\n private countUnclosedTags(content: string, tagName: string): number {\n let opens = 0;\n let closes = 0;\n let pos = 0;\n\n // Count opening tags (handles self-closing correctly)\n while (pos < content.length) {\n const openPos = content.indexOf(`<${tagName}`, pos);\n if (openPos === -1) break;\n\n // Check the character after the tag name to ensure exact match\n const afterTagName = openPos + tagName.length + 1;\n if (afterTagName < content.length) {\n const charAfter = content.charAt(afterTagName);\n // Valid tag terminators: space, >, /, tab, newline\n if (\n charAfter === ' ' ||\n charAfter === '>' ||\n charAfter === '/' ||\n charAfter === '\\t' ||\n charAfter === '\\n' ||\n charAfter === '\\r'\n ) {\n // Find the end of this tag\n const tagEnd = content.indexOf('>', openPos);\n if (tagEnd !== -1) {\n // Check if self-closing (ends with />)\n const isSelfClosing = content.charAt(tagEnd - 1) === '/';\n if (!isSelfClosing) {\n opens++;\n }\n }\n }\n }\n pos = openPos + 1;\n }\n\n // Count closing tags\n pos = 0;\n const closeTag = `</${tagName}>`;\n while (pos < content.length) {\n const closePos = content.indexOf(closeTag, pos);\n if (closePos === -1) break;\n closes++;\n pos = closePos + closeTag.length;\n }\n\n return opens - closes;\n }\n\n /**\n * Checks if a position in the content is inside a table element\n * Returns true if there's an unclosed <w:tbl> before this position\n */\n private isPositionInsideTable(content: string, position: number): boolean {\n const beforeContent = content.substring(0, position);\n return this.countUnclosedTags(beforeContent, 'w:tbl') > 0;\n }\n\n /**\n * Checks if a position in the content is inside a BODY-LEVEL w:del element\n * This is used to skip body-level elements that were deleted via Track Changes.\n *\n * IMPORTANT: This only detects body-level deletions (direct children of w:body).\n * Paragraph-level deletions (w:del inside w:p wrapping w:r runs) are NOT detected\n * because those are handled separately during run parsing.\n *\n * @param content - The body content XML\n * @param position - Position to check\n * @returns true if the position is inside a body-level <w:del> element\n */\n private isPositionInsideDel(content: string, position: number): boolean {\n // Look backward to find the most recent <w:del opening tag\n const beforeContent = content.substring(0, position);\n const lastDelOpen = beforeContent.lastIndexOf('<w:del');\n\n if (lastDelOpen === -1) return false;\n\n // Check if there's a </w:del> between the <w:del and our position\n const betweenContent = content.substring(lastDelOpen, position);\n if (betweenContent.includes('</w:del>')) return false;\n\n // Check if this <w:del is a self-closing tag (no content to skip)\n // Self-closing format: <w:del ... />\n const tagEnd = content.indexOf('>', lastDelOpen);\n if (tagEnd !== -1 && content.charAt(tagEnd - 1) === '/') return false;\n\n // Now check if this <w:del is BODY-LEVEL (not inside a w:p or w:tbl)\n // If the <w:del is inside a paragraph or table, it's NOT body-level\n const contentBeforeDel = content.substring(0, lastDelOpen);\n\n // Check if inside a paragraph using position-based parsing\n if (this.countUnclosedTags(contentBeforeDel, 'w:p') > 0) return false;\n\n // Check if inside a table\n if (this.countUnclosedTags(contentBeforeDel, 'w:tbl') > 0) return false;\n\n // Check if inside an SDT (structured document tag)\n if (this.countUnclosedTags(contentBeforeDel, 'w:sdt') > 0) return false;\n\n return true; // This is a body-level <w:del>\n }\n\n /**\n * Finds the end position of the w:del element that contains the given position\n * Returns the position after the closing </w:del> tag\n * @param content - The body content XML\n * @param startPos - Position inside the w:del element\n * @returns Position after the </w:del> tag, or -1 if not found\n */\n private findDelEndPosition(content: string, startPos: number): number {\n // Find the closing </w:del> tag after startPos\n // We need to handle nested w:del elements correctly\n let depth = 1;\n let pos = startPos;\n\n while (pos < content.length && depth > 0) {\n const nextOpen = content.indexOf('<w:del', pos);\n const nextClose = content.indexOf('</w:del>', pos);\n\n if (nextClose === -1) {\n // No closing tag found - malformed XML\n return -1;\n }\n\n if (nextOpen !== -1 && nextOpen < nextClose) {\n // Found another opening tag before the close\n depth++;\n pos = nextOpen + 6; // Move past \"<w:del\"\n } else {\n // Found a closing tag\n depth--;\n if (depth === 0) {\n // This is our closing tag\n return nextClose + '</w:del>'.length;\n }\n pos = nextClose + '</w:del>'.length;\n }\n }\n\n return -1;\n }\n\n /**\n * Extracts a single element from the content starting at the given position\n * Returns the complete element XML including opening and closing tags\n *\n * FIX (v1.3.1): Uses XMLParser.extractElements to ensure consistent extraction\n * behavior and prevent loss of self-closing elements like <w:tab/>\n * This fixes the TOC tab preservation bug where tabs were lost during extraction.\n */\n private extractSingleElement(content: string, tagName: string, startPos: number): string {\n // Extract the substring starting from the position\n const remainingContent = content.substring(startPos);\n\n // Use XMLParser.extractElements to get all elements of this type\n // This ensures we use the same proven extraction logic throughout\n const elements = XMLParser.extractElements(remainingContent, tagName);\n\n // Return the first element (which starts at position 0 in remainingContent)\n // This is the element at the specified startPos in the original content\n const extracted = elements.length > 0 ? elements[0]! : '';\n\n return extracted;\n }\n\n /**\n * Validates loaded content to detect corrupted or empty documents\n * Adds warnings if the document appears to have lost text content\n */\n private validateLoadedContent(bodyElements: BodyElement[]): void {\n const paragraphs = bodyElements.filter((el): el is Paragraph => el instanceof Paragraph);\n\n if (paragraphs.length === 0) {\n return; // Empty document is valid\n }\n\n // Count total runs and empty runs\n let totalRuns = 0;\n let emptyRuns = 0;\n let runsWithText = 0;\n\n for (const para of paragraphs) {\n const runs = para.getRuns();\n totalRuns += runs.length;\n\n for (const run of runs) {\n const text = run.getText();\n if (text.length === 0) {\n emptyRuns++;\n } else {\n runsWithText++;\n }\n }\n }\n\n // If more than 90% of runs are empty, warn about potential corruption\n if (totalRuns > 0) {\n const emptyPercentage = (emptyRuns / totalRuns) * 100;\n\n if (emptyPercentage > 90 && emptyRuns > 10) {\n const warning = new Error(\n `WARNING: Document appears to be corrupted or empty. ` +\n `${emptyRuns} out of ${totalRuns} runs (${emptyPercentage.toFixed(\n 1\n )}%) have no text content. ` +\n `This may indicate:\\n` +\n ` - The document was already corrupted before loading\\n` +\n ` - Text content was stripped by another application\\n` +\n ` - Encoding issues during document creation\\n` +\n `Original document structure is preserved, but text may be lost.`\n );\n this.parseErrors.push({\n element: 'document-validation',\n error: warning,\n });\n\n // Always warn to console, even in non-strict mode\n defaultLogger.warn(`\\nDocXML Load Warning:\\n${warning.message}\\n`);\n } else if (emptyPercentage > 50 && emptyRuns > 5) {\n const warning = new Error(\n `Document has ${emptyRuns} out of ${totalRuns} runs (${emptyPercentage.toFixed(\n 1\n )}%) with no text. ` + `This is higher than normal and may indicate partial data loss.`\n );\n this.parseErrors.push({\n element: 'document-validation',\n error: warning,\n });\n defaultLogger.warn(`\\nDocXML Load Warning:\\n${warning.message}\\n`);\n }\n }\n }\n\n /**\n * Extracts paragraph children (runs and hyperlinks) in document order\n * This ensures we preserve the original ordering of text and hyperlinks\n */\n\n private async parseParagraphWithOrder(\n paraXml: string,\n relationshipManager: RelationshipManager,\n zipHandler?: ZipHandler,\n imageManager?: ImageManager\n ): Promise<Paragraph | null> {\n try {\n const paragraph = new Paragraph();\n\n // Parse the paragraph object with order preservation\n // IMPORTANT: trimValues: false preserves whitespace from xml:space=\"preserve\" attributes\n const paraObj = XMLParser.parseToObject(paraXml, { trimValues: false });\n const pElement = paraObj['w:p'] as any;\n if (!pElement) {\n return null;\n }\n\n // Parse paragraph properties\n const pPr = pElement['w:pPr'];\n this.parseParagraphPropertiesFromObject(pPr, paragraph);\n\n // If the paragraph has inline sectPr, extract the raw XML for round-trip fidelity.\n // The parsed object from parseParagraphPropertiesFromObject is a complex structure that\n // cannot be serialized correctly by XMLBuilder.wSelf (which expects flat attributes).\n // Using raw XML passthrough prevents corruption from malformed sectPr serialization.\n if (paragraph.formatting.sectPr) {\n const pPrElements = XMLParser.extractElements(paraXml, 'w:pPr');\n const pPrXml = pPrElements[0];\n if (pPrXml) {\n const sectPrElements = XMLParser.extractElements(pPrXml, 'w:sectPr');\n const rawSectPr = sectPrElements[0];\n if (rawSectPr) {\n // Store as raw XML string (including the <w:sectPr>...</w:sectPr> wrapper)\n paragraph.setSectionProperties(rawSectPr);\n }\n }\n }\n\n // Parse w14:paraId if present\n const paraId = pElement['w14:paraId'];\n if (paraId) {\n paragraph.formatting.paraId = paraId as string;\n }\n\n // CRITICAL FIX: Preserve document order of paragraph children (runs, hyperlinks, fields)\n // When XMLParser.parseToObject groups multiple runs/hyperlinks, it creates arrays\n // We need to reconstruct the original sequence by scanning the raw XML\n // This prevents punctuation from being reordered (e.g., \"Heading.\" becoming \".Heading\")\n await this.parseOrderedParagraphChildren(\n paraXml,\n pElement,\n paragraph,\n relationshipManager,\n zipHandler,\n imageManager\n );\n\n // NOTE: Complex field assembly (both single and multi-paragraph) is now handled\n // at the parseBodyElements level via assembleMultiParagraphFields(), which calls\n // assembleComplexFields() for single-paragraph fields after processing multi-paragraph ones.\n\n // Diagnostic logging for paragraph\n const runs = paragraph.getRuns();\n const runData = runs.map((run) => ({\n text: run.getText(),\n rtl: run.isRTL(),\n }));\n const bidi = paragraph.getFormatting().bidi;\n\n logParagraphContent('parsing', -1, runData, bidi);\n\n if (bidi) {\n logTextDirection(`Paragraph has BiDi enabled`);\n }\n\n // Merge consecutive hyperlinks with the same URL (handles Google Docs fragmentation)\n this.mergeConsecutiveHyperlinks(paragraph);\n\n return paragraph;\n } catch (error: unknown) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.parseErrors.push({ element: 'paragraph', error: err });\n\n if (this.strictParsing) {\n throw new Error(`Failed to parse paragraph: ${err.message}`);\n }\n\n return null;\n }\n }\n\n /**\n * CRITICAL FIX: Parses paragraph children in document order\n * This preserves the original sequence of runs, hyperlinks, and fields\n * Fixes issues where punctuation appears at the beginning instead of end\n * Example: \".Aetna\" becomes \"Aetna.\" by respecting original XML order\n *\n * @param paraXml - Raw paragraph XML\n * @param pElement - Parsed paragraph object\n * @param paragraph - Paragraph instance to populate\n * @param relationshipManager - Relationship manager\n * @param zipHandler - ZIP handler for resources\n * @param imageManager - Image manager for images\n */\n private async parseOrderedParagraphChildren(\n paraXml: string,\n pElement: any,\n paragraph: Paragraph,\n relationshipManager: RelationshipManager,\n zipHandler?: ZipHandler,\n imageManager?: ImageManager\n ): Promise<void> {\n // Extract the body portion (between pPr and closing tag) to scan for child elements\n // Find where w:pPr ends\n const pPrEnd = paraXml.indexOf('</w:pPr>');\n const contentStart = pPrEnd !== -1 ? pPrEnd + 8 : paraXml.indexOf('>') + 1;\n const contentEnd = paraXml.lastIndexOf('</w:p>');\n\n if (contentEnd <= contentStart) {\n return; // Empty paragraph\n }\n\n const paraContent = paraXml.substring(contentStart, contentEnd);\n\n // Track children by scanning XML for opening tags\n interface ChildMarker {\n type:\n | 'w:r'\n | 'w:hyperlink'\n | 'w:fldSimple'\n | 'w:ins'\n | 'w:del'\n | 'w:moveFrom'\n | 'w:moveTo'\n | 'w:bookmarkStart'\n | 'w:bookmarkEnd'\n | 'w:proofErr'\n | 'w:permStart'\n | 'w:permEnd'\n | 'm:oMath'\n | 'w:ruby'\n | 'w:commentRangeStart'\n | 'w:commentRangeEnd';\n pos: number;\n index: number;\n }\n\n const children: ChildMarker[] = [];\n let runIndex = 0;\n let hyperlinkIndex = 0;\n let fieldIndex = 0;\n let insIndex = 0;\n let delIndex = 0;\n let moveFromIndex = 0;\n let moveToIndex = 0;\n let bookmarkStartIndex = 0;\n let bookmarkEndIndex = 0;\n let proofErrIndex = 0;\n let permStartIndex = 0;\n let permEndIndex = 0;\n let oMathIndex = 0;\n let rubyIndex = 0;\n let commentRangeStartIndex = 0;\n let commentRangeEndIndex = 0;\n\n // Helper to find closing tag position for a given tag name starting from position\n const findClosingTagEnd = (content: string, tagName: string, startPos: number): number => {\n const closingTag = `</${tagName}>`;\n const closingPos = content.indexOf(closingTag, startPos);\n if (closingPos === -1) return startPos; // Fallback if not found\n return closingPos + closingTag.length;\n };\n\n // Helper to check if tag is self-closing\n const isSelfClosing = (tagContent: string): boolean => {\n return tagContent.endsWith('/');\n };\n\n // Scan for all first-level child elements in document order\n let searchPos = 0;\n while (searchPos < paraContent.length) {\n // Find the next opening tag\n const tagStart = paraContent.indexOf('<', searchPos);\n if (tagStart === -1) break;\n\n // Extract tag name\n const tagEnd = paraContent.indexOf('>', tagStart);\n if (tagEnd === -1) break;\n\n const tagContent = paraContent.substring(tagStart + 1, tagEnd);\n const tagName = tagContent.split(/[\\s\\/>]/)[0];\n const selfClosing = isSelfClosing(tagContent);\n\n if (tagName === 'w:r') {\n children.push({ type: 'w:r', pos: tagStart, index: runIndex++ });\n // Skip past closing tag to avoid counting nested elements\n searchPos = selfClosing ? tagEnd + 1 : findClosingTagEnd(paraContent, 'w:r', tagEnd);\n } else if (tagName === 'w:hyperlink') {\n children.push({\n type: 'w:hyperlink',\n pos: tagStart,\n index: hyperlinkIndex++,\n });\n // Skip past closing tag - hyperlinks contain nested runs we shouldn't count\n searchPos = selfClosing\n ? tagEnd + 1\n : findClosingTagEnd(paraContent, 'w:hyperlink', tagEnd);\n } else if (tagName === 'w:fldSimple') {\n children.push({\n type: 'w:fldSimple',\n pos: tagStart,\n index: fieldIndex++,\n });\n // Skip past closing tag\n searchPos = selfClosing\n ? tagEnd + 1\n : findClosingTagEnd(paraContent, 'w:fldSimple', tagEnd);\n } else if (tagName === 'w:ins') {\n children.push({\n type: 'w:ins',\n pos: tagStart,\n index: insIndex++,\n });\n // Skip past closing tag - ins contains nested runs\n searchPos = selfClosing ? tagEnd + 1 : findClosingTagEnd(paraContent, 'w:ins', tagEnd);\n } else if (tagName === 'w:del') {\n children.push({\n type: 'w:del',\n pos: tagStart,\n index: delIndex++,\n });\n // Skip past closing tag - del contains nested runs\n searchPos = selfClosing ? tagEnd + 1 : findClosingTagEnd(paraContent, 'w:del', tagEnd);\n } else if (tagName === 'w:moveFrom') {\n children.push({\n type: 'w:moveFrom',\n pos: tagStart,\n index: moveFromIndex++,\n });\n // Skip past closing tag\n searchPos = selfClosing ? tagEnd + 1 : findClosingTagEnd(paraContent, 'w:moveFrom', tagEnd);\n } else if (tagName === 'w:moveTo') {\n children.push({\n type: 'w:moveTo',\n pos: tagStart,\n index: moveToIndex++,\n });\n // Skip past closing tag\n searchPos = selfClosing ? tagEnd + 1 : findClosingTagEnd(paraContent, 'w:moveTo', tagEnd);\n } else if (tagName === 'w:bookmarkStart') {\n // Bookmark start markers - always self-closing\n children.push({\n type: 'w:bookmarkStart',\n pos: tagStart,\n index: bookmarkStartIndex++,\n });\n searchPos = tagEnd + 1;\n } else if (tagName === 'w:bookmarkEnd') {\n // Bookmark end markers - always self-closing\n children.push({\n type: 'w:bookmarkEnd',\n pos: tagStart,\n index: bookmarkEndIndex++,\n });\n searchPos = tagEnd + 1;\n } else if (tagName === 'w:commentRangeStart') {\n // Comment range start markers - always self-closing\n children.push({\n type: 'w:commentRangeStart',\n pos: tagStart,\n index: commentRangeStartIndex++,\n });\n searchPos = tagEnd + 1;\n } else if (tagName === 'w:commentRangeEnd') {\n // Comment range end markers - always self-closing\n children.push({\n type: 'w:commentRangeEnd',\n pos: tagStart,\n index: commentRangeEndIndex++,\n });\n searchPos = tagEnd + 1;\n } else if (tagName === 'w:proofErr') {\n // Proofing error markers - always self-closing\n children.push({\n type: 'w:proofErr',\n pos: tagStart,\n index: proofErrIndex++,\n });\n searchPos = tagEnd + 1;\n } else if (tagName === 'w:permStart') {\n // Permission range start - always self-closing\n children.push({\n type: 'w:permStart',\n pos: tagStart,\n index: permStartIndex++,\n });\n searchPos = tagEnd + 1;\n } else if (tagName === 'w:permEnd') {\n // Permission range end - always self-closing\n children.push({\n type: 'w:permEnd',\n pos: tagStart,\n index: permEndIndex++,\n });\n searchPos = tagEnd + 1;\n } else if (tagName === 'm:oMath') {\n // Inline math expression - preserve as raw XML\n children.push({\n type: 'm:oMath',\n pos: tagStart,\n index: oMathIndex++,\n });\n searchPos = selfClosing ? tagEnd + 1 : findClosingTagEnd(paraContent, 'm:oMath', tagEnd);\n } else if (tagName === 'w:ruby') {\n // Ruby text (phonetic guides) - preserve as raw XML\n children.push({\n type: 'w:ruby',\n pos: tagStart,\n index: rubyIndex++,\n });\n searchPos = selfClosing ? tagEnd + 1 : findClosingTagEnd(paraContent, 'w:ruby', tagEnd);\n } else {\n searchPos = tagEnd + 1;\n }\n }\n\n // Helper to extract raw run XML from paraContent using position\n const extractRunXmlAtPosition = (pos: number): string | null => {\n // Find the end of this run element\n const closeTag = '</w:r>';\n let depth = 1;\n let searchPos = paraContent.indexOf('>', pos) + 1;\n while (depth > 0 && searchPos < paraContent.length) {\n const nextOpen = paraContent.indexOf('<w:r', searchPos);\n const nextClose = paraContent.indexOf(closeTag, searchPos);\n if (nextClose === -1) break;\n if (nextOpen !== -1 && nextOpen < nextClose) {\n // Check if it's actually <w:r> not <w:rPr> etc\n const charAfter = paraContent[nextOpen + 4];\n if (charAfter === '>' || charAfter === ' ' || charAfter === '/') {\n depth++;\n }\n searchPos = nextOpen + 4;\n } else {\n depth--;\n if (depth === 0) {\n return paraContent.substring(pos, nextClose + closeTag.length);\n }\n searchPos = nextClose + closeTag.length;\n }\n }\n return null;\n };\n\n // Helper to extract element XML at a known position, depth-aware\n const extractElementXmlAtPosition = (pos: number, tagName: string): string => {\n const openTag = `<${tagName}`;\n const closeTag = `</${tagName}>`;\n const openEnd = paraContent.indexOf('>', pos);\n if (openEnd === -1) return '';\n // Self-closing\n if (paraContent[openEnd - 1] === '/') {\n return paraContent.substring(pos, openEnd + 1);\n }\n let depth = 1;\n let searchFrom = openEnd + 1;\n while (depth > 0 && searchFrom < paraContent.length) {\n const nextOpen = paraContent.indexOf(openTag, searchFrom);\n const nextClose = paraContent.indexOf(closeTag, searchFrom);\n if (nextClose === -1) break;\n if (nextOpen !== -1 && nextOpen < nextClose) {\n const charAfter = paraContent[nextOpen + openTag.length];\n if (\n charAfter === '>' ||\n charAfter === ' ' ||\n charAfter === '/' ||\n charAfter === '\\t' ||\n charAfter === '\\n' ||\n charAfter === '\\r'\n ) {\n depth++;\n }\n searchFrom = nextOpen + openTag.length;\n } else {\n depth--;\n if (depth === 0) {\n return paraContent.substring(pos, nextClose + closeTag.length);\n }\n searchFrom = nextClose + closeTag.length;\n }\n }\n return '';\n };\n\n // Now process children in the order they were found\n for (const child of children) {\n if (child.type === 'w:r') {\n const runs = pElement['w:r'];\n const runArray = Array.isArray(runs) ? runs : runs ? [runs] : [];\n if (child.index < runArray.length) {\n const runObj = runArray[child.index];\n if (runObj['w:commentReference']) {\n // Comment reference run — preserve as raw XML so the\n // w:commentReference element inside survives round-trip.\n // Without this, Word can't link comment ranges to comments.xml.\n const runXml = extractRunXmlAtPosition(child.pos);\n if (runXml) {\n paragraph.addContent(new PreservedElement(runXml, 'w:r', 'inline'));\n }\n } else if (runObj['w:drawing']) {\n if (zipHandler && imageManager) {\n const imageRun = await this.parseDrawingFromObject(\n runObj['w:drawing'],\n zipHandler,\n relationshipManager,\n imageManager\n );\n if (imageRun) {\n paragraph.addRun(imageRun);\n }\n }\n } else if (runObj['w:pict']) {\n // VML graphics - preserve as raw XML for passthrough\n // Extract the raw run XML using position to get the exact w:pict content\n const runXml = extractRunXmlAtPosition(child.pos);\n if (runXml) {\n const pictXmls = XMLParser.extractElements(runXml, 'w:pict');\n if (pictXmls.length > 0 && pictXmls[0]) {\n const run = Run.createFromContent([{ type: 'vml', rawXml: pictXmls[0] }]);\n // Apply any run properties (formatting) to the VML run\n this.parseRunPropertiesFromObject(runObj['w:rPr'], run);\n paragraph.addRun(run);\n }\n }\n } else if (runObj['w:object']) {\n // Embedded OLE object - preserve as raw XML for round-trip fidelity\n // Per ECMA-376 Part 1 §17.3.3.19\n const runXml = extractRunXmlAtPosition(child.pos);\n if (runXml) {\n const objectXmls = XMLParser.extractElements(runXml, 'w:object');\n if (objectXmls.length > 0 && objectXmls[0]) {\n const run = Run.createFromContent([\n { type: 'embeddedObject', rawXml: objectXmls[0] },\n ]);\n this.parseRunPropertiesFromObject(runObj['w:rPr'], run);\n paragraph.addRun(run);\n }\n }\n } else {\n const run = this.parseRunFromObject(runObj);\n if (run) {\n paragraph.addRun(run);\n }\n }\n }\n } else if (child.type === 'w:hyperlink') {\n const hyperlinks = pElement['w:hyperlink'];\n const hyperlinkArray = Array.isArray(hyperlinks)\n ? hyperlinks\n : hyperlinks\n ? [hyperlinks]\n : [];\n if (child.index < hyperlinkArray.length) {\n const hyperlinkObj = hyperlinkArray[child.index];\n\n // Hyperlinks containing tracked changes (w:del/w:ins inside w:hyperlink)\n // cannot survive parseHyperlinkFromObject round-trip — preserve as raw XML\n const hasRevisionChildren =\n hyperlinkObj['w:del'] ||\n hyperlinkObj['w:ins'] ||\n hyperlinkObj['w:moveFrom'] ||\n hyperlinkObj['w:moveTo'];\n if (hasRevisionChildren) {\n const rawXml = extractElementXmlAtPosition(child.pos, 'w:hyperlink');\n if (rawXml) {\n paragraph.addContent(new PreservedElement(rawXml, 'w:hyperlink', 'inline'));\n }\n } else {\n const result = this.parseHyperlinkFromObject(hyperlinkObj, relationshipManager);\n if (result.hyperlink) {\n paragraph.addHyperlink(result.hyperlink);\n }\n // Add any bookmarks found inside the hyperlink\n for (const bookmark of result.bookmarkStarts) {\n paragraph.addBookmarkStart(bookmark);\n }\n for (const bookmark of result.bookmarkEnds) {\n paragraph.addBookmarkEnd(bookmark);\n }\n }\n }\n } else if (child.type === 'w:fldSimple') {\n const fields = pElement['w:fldSimple'];\n const fieldArray = Array.isArray(fields) ? fields : fields ? [fields] : [];\n if (child.index < fieldArray.length) {\n const field = this.parseSimpleFieldFromObject(fieldArray[child.index]);\n if (field) {\n paragraph.addField(field);\n }\n }\n } else if (\n child.type === 'w:ins' ||\n child.type === 'w:del' ||\n child.type === 'w:moveFrom' ||\n child.type === 'w:moveTo'\n ) {\n const revisionXml = extractElementXmlAtPosition(child.pos, child.type);\n if (revisionXml) {\n // Detect nested revision elements (e.g., w:del inside w:ins)\n const innerContent = revisionXml.substring(revisionXml.indexOf('>') + 1);\n const hasNestedRevision = /<w:(del|moveFrom|moveTo|ins)\\s/.test(innerContent);\n if (hasNestedRevision) {\n // Preserve entire nested structure as raw XML for round-trip fidelity\n paragraph.addContent(new PreservedElement(revisionXml, child.type, 'inline'));\n } else {\n const revResult = await this.parseRevisionFromXml(\n revisionXml,\n child.type,\n relationshipManager,\n zipHandler,\n imageManager\n );\n if (revResult.revision) {\n paragraph.addRevision(revResult.revision);\n }\n for (const bookmark of revResult.bookmarkStarts) {\n paragraph.addBookmarkStart(bookmark);\n }\n for (const bookmark of revResult.bookmarkEnds) {\n paragraph.addBookmarkEnd(bookmark);\n }\n }\n }\n } else if (child.type === 'w:bookmarkStart') {\n const endPos = paraContent.indexOf('>', child.pos);\n if (endPos !== -1) {\n const bookmarkXml = paraContent.substring(child.pos, endPos + 1);\n const bookmark = this.parseBookmarkStart(bookmarkXml);\n if (bookmark) {\n paragraph.addBookmarkStart(bookmark);\n }\n }\n } else if (child.type === 'w:bookmarkEnd') {\n const endPos = paraContent.indexOf('>', child.pos);\n if (endPos !== -1) {\n const bookmarkXml = paraContent.substring(child.pos, endPos + 1);\n const bookmark = this.parseBookmarkEnd(bookmarkXml);\n if (bookmark) {\n paragraph.addBookmarkEnd(bookmark);\n }\n }\n } else if (child.type === 'w:commentRangeStart' || child.type === 'w:commentRangeEnd') {\n // Preserve comment range markers as raw XML for round-trip fidelity.\n // Without these, comments.xml references become orphaned and Word\n // flags the document as corrupt (\"unreadable content\").\n const selfCloseEnd = paraContent.indexOf('>', child.pos);\n if (selfCloseEnd !== -1) {\n const rawXml = paraContent.substring(child.pos, selfCloseEnd + 1);\n paragraph.addContent(new PreservedElement(rawXml, child.type, 'inline'));\n }\n } else if (\n child.type === 'w:proofErr' ||\n child.type === 'w:permStart' ||\n child.type === 'w:permEnd'\n ) {\n // Preserve proofing errors and permission ranges as raw XML\n // These are self-closing elements: extract from pos to end of tag\n const selfCloseEnd = paraContent.indexOf('>', child.pos);\n if (selfCloseEnd !== -1) {\n const rawXml = paraContent.substring(child.pos, selfCloseEnd + 1);\n paragraph.addContent(new PreservedElement(rawXml, child.type, 'inline'));\n }\n } else if (child.type === 'm:oMath' || child.type === 'w:ruby') {\n // Preserve inline math and ruby elements as raw XML for round-trip fidelity\n const elementXml = this.extractSingleElement(paraContent, child.type, child.pos);\n if (elementXml) {\n paragraph.addContent(new PreservedElement(elementXml, child.type, 'inline'));\n }\n }\n }\n }\n\n /**\n * Parses a revision element from raw XML\n * Extracts revision metadata (id, author, date), contained runs, and any bookmarks\n * @param revisionXml - Raw XML of the revision element\n * @param tagName - Tag name (w:ins, w:del, w:moveFrom, w:moveTo)\n * @param relationshipManager - Relationship manager for image relationships\n * @param zipHandler - ZIP handler for loading image data\n * @param imageManager - Image manager for registering images\n * @returns Object with parsed Revision and any bookmarks found inside, or null\n */\n private async parseRevisionFromXml(\n revisionXml: string,\n tagName: string,\n relationshipManager: RelationshipManager,\n zipHandler?: ZipHandler,\n imageManager?: ImageManager\n ): Promise<{\n revision: Revision | null;\n bookmarkStarts: Bookmark[];\n bookmarkEnds: Bookmark[];\n }> {\n const result: {\n revision: Revision | null;\n bookmarkStarts: Bookmark[];\n bookmarkEnds: Bookmark[];\n } = { revision: null, bookmarkStarts: [], bookmarkEnds: [] };\n try {\n // Map XML tag to RevisionType\n let revisionType: import('../elements/Revision').RevisionType;\n switch (tagName) {\n case 'w:ins':\n revisionType = 'insert';\n break;\n case 'w:del':\n revisionType = 'delete';\n break;\n case 'w:moveFrom':\n revisionType = 'moveFrom';\n break;\n case 'w:moveTo':\n revisionType = 'moveTo';\n break;\n default:\n return result;\n }\n\n // Extract attributes\n const idAttr = XMLParser.extractAttribute(revisionXml, 'w:id');\n const author = XMLParser.extractAttribute(revisionXml, 'w:author');\n const dateAttr = XMLParser.extractAttribute(revisionXml, 'w:date');\n const moveId = XMLParser.extractAttribute(revisionXml, 'w:moveId');\n\n if (!idAttr || !author) {\n return result; // Required attributes missing\n }\n\n const id = parseInt(idAttr, 10);\n const date = dateAttr ? new Date(dateAttr) : new Date();\n\n // Extract content from revision element (runs and hyperlinks)\n // IMPORTANT: Extract hyperlinks FIRST, then extract runs from content\n // that is NOT inside hyperlinks to avoid duplicate content\n const hyperlinkXmls = XMLParser.extractElements(revisionXml, 'w:hyperlink');\n\n // Create a version of the XML with hyperlinks removed to extract standalone runs\n // Use split().join() instead of replace() to remove ALL occurrences of identical hyperlinks\n // (replace() only removes the first match, causing duplicate content)\n let xmlWithoutHyperlinks = revisionXml;\n for (const hyperlinkXml of hyperlinkXmls) {\n xmlWithoutHyperlinks = xmlWithoutHyperlinks.split(hyperlinkXml).join('');\n }\n\n // Extract runs from the XML without hyperlinks (these are standalone runs)\n const runXmls = XMLParser.extractElements(xmlWithoutHyperlinks, 'w:r');\n\n // Use RevisionContent to hold both Run and Hyperlink objects\n const content: import('../elements/RevisionContent').RevisionContent[] = [];\n\n // Parse standalone runs (not inside hyperlinks)\n for (const runXml of runXmls) {\n // Parse the run object\n const runObj = XMLParser.parseToObject(runXml, { trimValues: false });\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const runElement = runObj['w:r'] as any;\n\n // Check if this run contains a drawing (image)\n if (runElement?.['w:drawing']) {\n if (zipHandler && imageManager) {\n const imageRun = await this.parseDrawingFromObject(\n runElement['w:drawing'],\n zipHandler,\n relationshipManager,\n imageManager\n );\n if (imageRun) {\n content.push(imageRun);\n }\n }\n } else {\n // Parse as regular text run\n const run = this.parseRunFromObject(runElement);\n if (run) {\n content.push(run);\n }\n }\n }\n\n // Parse hyperlinks inside revision (for tracked hyperlink changes)\n for (const hyperlinkXml of hyperlinkXmls) {\n const hyperlinkObj = XMLParser.parseToObject(hyperlinkXml, { trimValues: false });\n const hyperlinkResult = this.parseHyperlinkFromObject(\n hyperlinkObj['w:hyperlink'],\n relationshipManager\n );\n if (hyperlinkResult.hyperlink) {\n content.push(hyperlinkResult.hyperlink);\n }\n // Collect bookmarks from hyperlinks inside revisions\n result.bookmarkStarts.push(...hyperlinkResult.bookmarkStarts);\n result.bookmarkEnds.push(...hyperlinkResult.bookmarkEnds);\n }\n\n // Extract bookmarks directly inside the revision (not nested in hyperlinks)\n const bookmarkStartXmls = XMLParser.extractElements(xmlWithoutHyperlinks, 'w:bookmarkStart');\n const bookmarkEndXmls = XMLParser.extractElements(xmlWithoutHyperlinks, 'w:bookmarkEnd');\n\n for (const bookmarkXml of bookmarkStartXmls) {\n const bookmark = this.parseBookmarkStart(bookmarkXml);\n if (bookmark) {\n result.bookmarkStarts.push(bookmark);\n }\n }\n\n for (const bookmarkXml of bookmarkEndXmls) {\n const bookmark = this.parseBookmarkEnd(bookmarkXml);\n if (bookmark) {\n result.bookmarkEnds.push(bookmark);\n }\n }\n\n if (content.length === 0) {\n // Log debug info for empty revisions (may indicate malformed XML)\n defaultLogger.debug('[DocumentParser] Empty revision content skipped', {\n tagName,\n id: idAttr,\n author,\n });\n // Still return any bookmarks found even if revision has no content\n return result;\n }\n\n // Create Revision instance\n const revision = new Revision({\n id,\n author,\n date,\n type: revisionType,\n content,\n moveId,\n });\n\n result.revision = revision;\n return result;\n } catch (error: unknown) {\n defaultLogger.warn(\n '[DocumentParser] Failed to parse revision:',\n error instanceof Error\n ? { message: error.message, stack: error.stack }\n : { error: String(error) }\n );\n return result;\n }\n }\n\n /**\n * Parses comments from word/comments.xml\n * @param commentsXml - Raw XML content of comments.xml\n * @returns Array of parsed Comment objects\n */\n parseCommentsXml(commentsXml: string): Comment[] {\n const comments: Comment[] = [];\n\n // Extract all w:comment elements\n const commentXmls = XMLParser.extractElements(commentsXml, 'w:comment');\n\n for (const commentXml of commentXmls) {\n const comment = this.parseCommentFromXml(commentXml);\n if (comment) {\n comments.push(comment);\n }\n }\n\n return comments;\n }\n\n /**\n * Parses a single comment element from XML\n * @param commentXml - XML string for one w:comment element\n * @returns Parsed Comment or null\n */\n private parseCommentFromXml(commentXml: string): Comment | null {\n try {\n // Extract attributes\n const idAttr = XMLParser.extractAttribute(commentXml, 'w:id');\n const author = XMLParser.extractAttribute(commentXml, 'w:author') || 'Unknown';\n const dateAttr = XMLParser.extractAttribute(commentXml, 'w:date');\n const initials = XMLParser.extractAttribute(commentXml, 'w:initials');\n const parentIdAttr =\n XMLParser.extractAttribute(commentXml, 'w15:parentId') ||\n XMLParser.extractAttribute(commentXml, 'w:parentId');\n const doneAttr =\n XMLParser.extractAttribute(commentXml, 'w15:done') ||\n XMLParser.extractAttribute(commentXml, 'w:done');\n\n if (!idAttr) {\n return null; // ID is required\n }\n\n const id = parseInt(idAttr, 10);\n const date = dateAttr ? new Date(dateAttr) : new Date();\n const parentId = parentIdAttr ? parseInt(parentIdAttr, 10) : undefined;\n // Per ECMA-376, w:done=\"1\" or \"true\" indicates resolved\n const done = doneAttr === '1' || doneAttr === 'true';\n\n // Parse content (runs from paragraphs within the comment)\n const runs: Run[] = [];\n const runXmls = XMLParser.extractElements(commentXml, 'w:r');\n\n for (const runXml of runXmls) {\n const runObj = XMLParser.parseToObject(runXml, { trimValues: false });\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const run = this.parseRunFromObject(runObj['w:r'] as any);\n if (run) {\n runs.push(run);\n }\n }\n\n // Create comment with parsed data\n const comment = new Comment({\n id,\n author,\n initials: initials || undefined,\n date,\n content: runs.length > 0 ? runs : '',\n parentId,\n done,\n });\n\n return comment;\n } catch (error: unknown) {\n defaultLogger.warn(\n '[DocumentParser] Failed to parse comment:',\n error instanceof Error ? { message: error.message } : { error: String(error) }\n );\n return null;\n }\n }\n\n /**\n * Parses footnotes.xml into Footnote array\n */\n parseFootnotesXml(footnotesXml: string): Footnote[] {\n const footnotes: Footnote[] = [];\n const footnoteXmls = XMLParser.extractElements(footnotesXml, 'w:footnote');\n\n for (const footnoteXml of footnoteXmls) {\n const footnote = this.parseFootnoteFromXml(footnoteXml);\n if (footnote) {\n footnotes.push(footnote);\n }\n }\n\n return footnotes;\n }\n\n private parseFootnoteFromXml(footnoteXml: string): Footnote | null {\n try {\n const idAttr = XMLParser.extractAttribute(footnoteXml, 'w:id');\n const typeAttr = XMLParser.extractAttribute(footnoteXml, 'w:type');\n\n if (idAttr === undefined) {\n return null;\n }\n\n const id = parseInt(idAttr, 10);\n\n let type: FootnoteType | undefined;\n if (typeAttr === 'separator') {\n type = FootnoteType.Separator;\n } else if (typeAttr === 'continuationSeparator') {\n type = FootnoteType.ContinuationSeparator;\n } else if (typeAttr === 'continuationNotice') {\n type = FootnoteType.ContinuationNotice;\n }\n\n const footnote = new Footnote({ id, type });\n\n const paraXmls = XMLParser.extractElements(footnoteXml, 'w:p');\n for (const paraXml of paraXmls) {\n const para = this.parseNoteParaFromXml(paraXml);\n if (para) {\n footnote.addParagraph(para);\n }\n }\n\n return footnote;\n } catch (error: unknown) {\n defaultLogger.warn(\n '[DocumentParser] Failed to parse footnote:',\n error instanceof Error ? { message: error.message } : { error: String(error) }\n );\n return null;\n }\n }\n\n /**\n * Parses endnotes.xml into Endnote array\n */\n parseEndnotesXml(endnotesXml: string): Endnote[] {\n const endnotes: Endnote[] = [];\n const endnoteXmls = XMLParser.extractElements(endnotesXml, 'w:endnote');\n\n for (const endnoteXml of endnoteXmls) {\n const endnote = this.parseEndnoteFromXml(endnoteXml);\n if (endnote) {\n endnotes.push(endnote);\n }\n }\n\n return endnotes;\n }\n\n private parseEndnoteFromXml(endnoteXml: string): Endnote | null {\n try {\n const idAttr = XMLParser.extractAttribute(endnoteXml, 'w:id');\n const typeAttr = XMLParser.extractAttribute(endnoteXml, 'w:type');\n\n if (idAttr === undefined) {\n return null;\n }\n\n const id = parseInt(idAttr, 10);\n\n let type: EndnoteType | undefined;\n if (typeAttr === 'separator') {\n type = EndnoteType.Separator;\n } else if (typeAttr === 'continuationSeparator') {\n type = EndnoteType.ContinuationSeparator;\n } else if (typeAttr === 'continuationNotice') {\n type = EndnoteType.ContinuationNotice;\n }\n\n const endnote = new Endnote({ id, type });\n\n const paraXmls = XMLParser.extractElements(endnoteXml, 'w:p');\n for (const paraXml of paraXmls) {\n const para = this.parseNoteParaFromXml(paraXml);\n if (para) {\n endnote.addParagraph(para);\n }\n }\n\n return endnote;\n } catch (error: unknown) {\n defaultLogger.warn(\n '[DocumentParser] Failed to parse endnote:',\n error instanceof Error ? { message: error.message } : { error: String(error) }\n );\n return null;\n }\n }\n\n /**\n * Parses a paragraph from a footnote or endnote element.\n * Uses run-level parsing (like comments) to avoid async dependency on relationship manager.\n */\n private parseNoteParaFromXml(paraXml: string): Paragraph | null {\n try {\n const para = new Paragraph();\n const runXmls = XMLParser.extractElements(paraXml, 'w:r');\n for (const runXml of runXmls) {\n const runObj = XMLParser.parseToObject(runXml, { trimValues: false });\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const run = this.parseRunFromObject(runObj['w:r'] as any);\n if (run) {\n para.addRun(run);\n }\n }\n return para;\n } catch {\n return null;\n }\n }\n\n /**\n * Parses a bookmark start element from XML\n * @param bookmarkXml - Raw XML of the w:bookmarkStart element\n * @returns Bookmark instance or null\n */\n private parseBookmarkStart(bookmarkXml: string): Bookmark | null {\n try {\n const idAttr = XMLParser.extractAttribute(bookmarkXml, 'w:id');\n const nameAttr = XMLParser.extractAttribute(bookmarkXml, 'w:name');\n\n if (!idAttr || !nameAttr) {\n return null; // Required attributes missing\n }\n\n const id = parseInt(idAttr, 10);\n\n // Create bookmark with skipNormalization to preserve original name exactly\n // (Word allows special characters like = and . in bookmark names)\n const bookmark = new Bookmark({\n name: nameAttr,\n id: id,\n skipNormalization: true,\n });\n\n // Register with BookmarkManager to enable hasBookmark() checks\n // This prevents duplicate bookmarks when Template_UI adds bookmarks\n if (this.bookmarkManager) {\n try {\n this.bookmarkManager.registerExisting(bookmark);\n } catch (e) {\n // Bookmark might already be registered (duplicate in source doc)\n // Just log debug, don't fail - the bookmark is still valid for output\n defaultLogger.debug('[DocumentParser] Bookmark already registered:', {\n name: nameAttr,\n id: id,\n });\n }\n }\n\n return bookmark;\n } catch (error: unknown) {\n defaultLogger.warn(\n '[DocumentParser] Failed to parse bookmark start:',\n error instanceof Error ? { message: error.message } : { error: String(error) }\n );\n return null;\n }\n }\n\n /**\n * Parses a bookmark end element from XML\n * @param bookmarkXml - Raw XML of the w:bookmarkEnd element\n * @returns Bookmark instance or null\n */\n private parseBookmarkEnd(bookmarkXml: string): Bookmark | null {\n try {\n const idAttr = XMLParser.extractAttribute(bookmarkXml, 'w:id');\n\n if (!idAttr) {\n return null; // Required attribute missing\n }\n\n const id = parseInt(idAttr, 10);\n\n // Create a placeholder bookmark for the end marker\n // The name doesn't matter for bookmarkEnd as it only uses the ID\n const bookmark = new Bookmark({\n name: `_end_${id}`,\n id: id,\n skipNormalization: true,\n });\n\n return bookmark;\n } catch (error: unknown) {\n defaultLogger.warn(\n '[DocumentParser] Failed to parse bookmark end:',\n error instanceof Error ? { message: error.message } : { error: String(error) }\n );\n return null;\n }\n }\n\n private async parseParagraphFromObject(\n paraObj: any,\n relationshipManager: RelationshipManager,\n zipHandler?: ZipHandler,\n imageManager?: ImageManager\n ): Promise<Paragraph | null> {\n try {\n const paragraph = new Paragraph();\n\n // Parse w14:paraId attribute from paragraph element (Word 2010+ requirement)\n const paraId = paraObj['w14:paraId'];\n if (paraId) {\n paragraph.formatting.paraId = paraId;\n }\n\n // Parse paragraph properties\n this.parseParagraphPropertiesFromObject(paraObj['w:pPr'], paragraph);\n\n // Check if we have ordered children metadata from the enhanced parser\n const orderedChildren = paraObj._orderedChildren as\n | { type: string; index: number }[]\n | undefined;\n\n if (orderedChildren && orderedChildren.length > 0) {\n // Use the preserved order from the parser\n for (const childInfo of orderedChildren) {\n const elementType = childInfo.type;\n const elementIndex = childInfo.index;\n\n if (elementType === 'w:r') {\n const runs = paraObj['w:r'];\n const runArray = Array.isArray(runs) ? runs : runs ? [runs] : [];\n if (elementIndex < runArray.length) {\n const child = runArray[elementIndex];\n if (child['w:drawing']) {\n if (zipHandler && imageManager) {\n const imageRun = await this.parseDrawingFromObject(\n child['w:drawing'],\n zipHandler,\n relationshipManager,\n imageManager\n );\n if (imageRun) {\n paragraph.addRun(imageRun);\n }\n }\n } else {\n const run = this.parseRunFromObject(child);\n if (run) {\n paragraph.addRun(run);\n }\n }\n }\n } else if (elementType === 'w:hyperlink') {\n const hyperlinks = paraObj['w:hyperlink'];\n const hyperlinkArray = Array.isArray(hyperlinks)\n ? hyperlinks\n : hyperlinks\n ? [hyperlinks]\n : [];\n if (elementIndex < hyperlinkArray.length) {\n const result = this.parseHyperlinkFromObject(\n hyperlinkArray[elementIndex],\n relationshipManager\n );\n if (result.hyperlink) {\n paragraph.addHyperlink(result.hyperlink);\n }\n // Add any bookmarks found inside the hyperlink\n for (const bookmark of result.bookmarkStarts) {\n paragraph.addBookmarkStart(bookmark);\n }\n for (const bookmark of result.bookmarkEnds) {\n paragraph.addBookmarkEnd(bookmark);\n }\n }\n } else if (elementType === 'w:fldSimple') {\n const fields = paraObj['w:fldSimple'];\n const fieldArray = Array.isArray(fields) ? fields : fields ? [fields] : [];\n if (elementIndex < fieldArray.length) {\n const field = this.parseSimpleFieldFromObject(fieldArray[elementIndex]);\n if (field) {\n paragraph.addField(field);\n }\n }\n }\n }\n } else {\n // Fallback to sequential processing if no order metadata\n // Handle runs (w:r)\n const runs = paraObj['w:r'];\n const runChildren = Array.isArray(runs) ? runs : runs ? [runs] : [];\n\n for (const child of runChildren) {\n if (child['w:drawing']) {\n if (zipHandler && imageManager) {\n // Parse as image run\n const imageRun = await this.parseDrawingFromObject(\n child['w:drawing'],\n zipHandler,\n relationshipManager,\n imageManager\n );\n if (imageRun) {\n paragraph.addRun(imageRun);\n }\n }\n } else {\n // Parse as normal text run\n const run = this.parseRunFromObject(child);\n if (run) {\n paragraph.addRun(run);\n }\n }\n }\n\n // Handle hyperlinks (w:hyperlink)\n const hyperlinks = paraObj['w:hyperlink'];\n const hyperlinkChildren = Array.isArray(hyperlinks)\n ? hyperlinks\n : hyperlinks\n ? [hyperlinks]\n : [];\n\n for (const hyperlinkObj of hyperlinkChildren) {\n const result = this.parseHyperlinkFromObject(hyperlinkObj, relationshipManager);\n if (result.hyperlink) {\n paragraph.addHyperlink(result.hyperlink);\n }\n // Add any bookmarks found inside the hyperlink\n for (const bookmark of result.bookmarkStarts) {\n paragraph.addBookmarkStart(bookmark);\n }\n for (const bookmark of result.bookmarkEnds) {\n paragraph.addBookmarkEnd(bookmark);\n }\n }\n\n // Handle simple fields (w:fldSimple)\n const fields = paraObj['w:fldSimple'];\n const fieldChildren = Array.isArray(fields) ? fields : fields ? [fields] : [];\n\n for (const fieldObj of fieldChildren) {\n const field = this.parseSimpleFieldFromObject(fieldObj);\n if (field) {\n paragraph.addField(field);\n }\n }\n }\n\n // Merge consecutive hyperlinks with the same URL (handles Google Docs fragmentation)\n this.mergeConsecutiveHyperlinks(paragraph);\n\n return paragraph;\n } catch (error: unknown) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.parseErrors.push({ element: 'paragraph', error: err });\n\n if (this.strictParsing) {\n throw new Error(`Failed to parse paragraph: ${err.message}`);\n }\n\n // In lenient mode, log warning and continue\n return null;\n }\n }\n\n private parseParagraphPropertiesFromObject(pPrObj: any, paragraph: Paragraph): void {\n if (!pPrObj) return;\n\n // Paragraph mark run properties (w:rPr within w:pPr) per ECMA-376 Part 1 §17.3.1.29\n // This controls formatting of the paragraph mark (¶ symbol) itself\n if (pPrObj['w:rPr']) {\n const rPrObj = pPrObj['w:rPr'];\n // Create a temporary Run to use the existing parseRunPropertiesFromObject method\n const tempRun = new Run('');\n this.parseRunPropertiesFromObject(rPrObj, tempRun);\n // Extract the formatting and set it as paragraph mark properties\n paragraph.setParagraphMarkFormatting(tempRun.getFormatting());\n\n // Parse paragraph mark deletion tracking (w:del in w:pPr/w:rPr)\n // Per ECMA-376 Part 1 §17.13.5.14 - indicates the paragraph mark was deleted\n if (rPrObj['w:del']) {\n // Handle array case (malformed XML with duplicate w:del elements)\n const rawDel = rPrObj['w:del'];\n const delObj = Array.isArray(rawDel) ? rawDel[0] : rawDel;\n if (delObj && typeof delObj === 'object') {\n const id = parseInt(delObj['@_w:id'] || '0', 10) || 0;\n const author = String(delObj['@_w:author'] ?? '');\n const dateStr = delObj['@_w:date'];\n const parsedDate = dateStr ? new Date(String(dateStr)) : new Date();\n const date = isNaN(parsedDate.getTime()) ? new Date() : parsedDate;\n paragraph.markParagraphMarkAsDeleted(id, author, date);\n }\n }\n\n // Parse paragraph mark insertion tracking (w:ins in w:pPr/w:rPr)\n // Per ECMA-376 Part 1 §17.13.5.18 - indicates the paragraph mark was inserted\n if (rPrObj['w:ins']) {\n // Handle array case (malformed XML with duplicate w:ins elements)\n const rawIns = rPrObj['w:ins'];\n const insObj = Array.isArray(rawIns) ? rawIns[0] : rawIns;\n if (insObj && typeof insObj === 'object') {\n const id = parseInt(insObj['@_w:id'] || '0', 10) || 0;\n const author = String(insObj['@_w:author'] ?? '');\n const dateStr = insObj['@_w:date'];\n const parsedDate = dateStr ? new Date(String(dateStr)) : new Date();\n const date = isNaN(parsedDate.getTime()) ? new Date() : parsedDate;\n paragraph.markParagraphMarkAsInserted(id, author, date);\n }\n }\n }\n\n // Alignment\n // XMLParser adds @_ prefix to attributes\n if (pPrObj['w:jc']?.['@_w:val']) {\n paragraph.setAlignment(pPrObj['w:jc']['@_w:val']);\n }\n\n // Style\n if (pPrObj['w:pStyle']?.['@_w:val']) {\n paragraph.setStyle(pPrObj['w:pStyle']['@_w:val']);\n }\n\n // Indentation\n // Note: XMLParser converts numeric strings to numbers, so \"0\" becomes 0 (falsy)\n // Must use !== undefined check instead of truthy check to handle left=\"0\"\n if (pPrObj['w:ind']) {\n const ind = pPrObj['w:ind'];\n // Use isExplicitlySet and safeParseInt for robust zero-value handling\n if (isExplicitlySet(ind['@_w:left'])) paragraph.setLeftIndent(safeParseInt(ind['@_w:left']));\n if (isExplicitlySet(ind['@_w:right']))\n paragraph.setRightIndent(safeParseInt(ind['@_w:right']));\n if (isExplicitlySet(ind['@_w:firstLine']))\n paragraph.setFirstLineIndent(safeParseInt(ind['@_w:firstLine']));\n // Parse hanging indent per ECMA-376 Part 1 §17.3.1.17\n if (isExplicitlySet(ind['@_w:hanging']))\n paragraph.setHangingIndent(safeParseInt(ind['@_w:hanging']));\n }\n\n // Spacing\n if (pPrObj['w:spacing']) {\n const spacing = pPrObj['w:spacing'];\n // Use isExplicitlySet to properly handle 0 values (0 spacing is valid)\n if (isExplicitlySet(spacing['@_w:before']))\n paragraph.setSpaceBefore(safeParseInt(spacing['@_w:before']));\n if (isExplicitlySet(spacing['@_w:after']))\n paragraph.setSpaceAfter(safeParseInt(spacing['@_w:after']));\n if (isExplicitlySet(spacing['@_w:line'])) {\n paragraph.setLineSpacing(safeParseInt(spacing['@_w:line']), spacing['@_w:lineRule']);\n }\n }\n\n // Keep properties - parse pageBreakBefore FIRST, then apply keep properties\n // This triggers automatic conflict resolution per ECMA-376 v0.28.2\n if (pPrObj['w:pageBreakBefore']) paragraph.formatting.pageBreakBefore = true;\n\n // Keep properties - these will automatically clear pageBreakBefore if both are set\n if (pPrObj['w:keepNext']) paragraph.setKeepNext(true);\n if (pPrObj['w:keepLines']) paragraph.setKeepLines(true);\n\n // Contextual spacing\n if (pPrObj['w:contextualSpacing']) paragraph.setContextualSpacing(true);\n\n // Numbering\n // Note: When track changes are present (w:pPrChange), XMLParser merges the\n // current numPr and the old numPr from pPrChange into an array. The first\n // element is always the current value per _orderedChildren ordering.\n if (pPrObj['w:numPr']) {\n const numPrRaw = pPrObj['w:numPr'];\n // Handle both single object and array (when pPrChange is present)\n const numPr = Array.isArray(numPrRaw) ? numPrRaw[0] : numPrRaw;\n const numId = numPr?.['w:numId']?.['@_w:val'];\n const ilvl = numPr?.['w:ilvl']?.['@_w:val'] || '0';\n if (numId !== undefined && numId !== null) {\n const parsedNumId = parseInt(numId, 10);\n const parsedIlvl = parseInt(ilvl, 10);\n if (!isNaN(parsedNumId) && !isNaN(parsedIlvl)) {\n if (parsedNumId === 0) {\n paragraph.formatting.numberingSuppressed = true;\n } else {\n paragraph.setNumbering(parsedNumId, parsedIlvl);\n }\n }\n }\n }\n\n // Borders per ECMA-376 Part 1 §17.3.1.24\n if (pPrObj['w:pBdr']) {\n const pBdr = pPrObj['w:pBdr'];\n const borders: any = {};\n\n // Helper function to parse border definition\n const parseBorder = (borderObj: any): any => {\n if (!borderObj) return undefined;\n const border: any = {};\n if (borderObj['@_w:val']) border.style = borderObj['@_w:val'];\n if (borderObj['@_w:sz'] !== undefined) border.size = safeParseInt(borderObj['@_w:sz']);\n if (borderObj['@_w:color']) border.color = borderObj['@_w:color'];\n if (borderObj['@_w:space'] !== undefined)\n border.space = safeParseInt(borderObj['@_w:space']);\n return Object.keys(border).length > 0 ? border : undefined;\n };\n\n // Parse each border side\n if (pBdr['w:top']) borders.top = parseBorder(pBdr['w:top']);\n if (pBdr['w:bottom']) borders.bottom = parseBorder(pBdr['w:bottom']);\n if (pBdr['w:left']) borders.left = parseBorder(pBdr['w:left']);\n if (pBdr['w:right']) borders.right = parseBorder(pBdr['w:right']);\n if (pBdr['w:between']) borders.between = parseBorder(pBdr['w:between']);\n if (pBdr['w:bar']) borders.bar = parseBorder(pBdr['w:bar']);\n\n if (Object.keys(borders).length > 0) {\n paragraph.setBorder(borders);\n }\n }\n\n // Shading per ECMA-376 Part 1 §17.3.1.32\n if (pPrObj['w:shd']) {\n const shading = this.parseShadingFromObj(pPrObj['w:shd']);\n if (shading) {\n paragraph.setShading(shading);\n }\n }\n\n // Tab stops per ECMA-376 Part 1 §17.3.1.38\n if (pPrObj['w:tabs']) {\n const tabsObj = pPrObj['w:tabs'];\n const tabs: any[] = [];\n\n // Handle both single tab and array of tabs\n const tabElements = Array.isArray(tabsObj['w:tab'])\n ? tabsObj['w:tab']\n : tabsObj['w:tab']\n ? [tabsObj['w:tab']]\n : [];\n\n for (const tabObj of tabElements) {\n const tab: any = {};\n if (tabObj['@_w:pos']) tab.position = parseInt(tabObj['@_w:pos'], 10);\n if (tabObj['@_w:val']) tab.val = tabObj['@_w:val'];\n if (tabObj['@_w:leader']) tab.leader = tabObj['@_w:leader'];\n\n if (tab.position !== undefined) {\n tabs.push(tab);\n }\n }\n\n if (tabs.length > 0) {\n paragraph.setTabs(tabs);\n }\n }\n\n // Widow control per ECMA-376 Part 1 §17.3.1.40\n if (pPrObj['w:widowControl'] !== undefined) {\n const widowControlVal = pPrObj['w:widowControl']?.['@_w:val'];\n // Parse w:val attribute - can be \"0\"/\"1\" or \"false\"/\"true\"\n if (\n widowControlVal === '0' ||\n widowControlVal === 'false' ||\n widowControlVal === false ||\n widowControlVal === 0\n ) {\n paragraph.setWidowControl(false);\n } else {\n // If w:val is \"1\", \"true\", true, 1, or undefined (element present without val), default to true\n paragraph.setWidowControl(true);\n }\n }\n\n // Outline level per ECMA-376 Part 1 §17.3.1.19\n if (pPrObj['w:outlineLvl'] !== undefined && pPrObj['w:outlineLvl']['@_w:val'] !== undefined) {\n const level = parseInt(pPrObj['w:outlineLvl']['@_w:val'], 10);\n if (!isNaN(level) && level >= 0 && level <= 9) {\n paragraph.setOutlineLevel(level);\n }\n }\n\n // Suppress line numbers per ECMA-376 Part 1 §17.3.1.34\n if (pPrObj['w:suppressLineNumbers']) {\n paragraph.setSuppressLineNumbers(true);\n }\n\n // Bidirectional layout per ECMA-376 Part 1 §17.3.1.6\n if (pPrObj['w:bidi'] !== undefined) {\n const bidiVal = pPrObj['w:bidi']?.['@_w:val'];\n if (bidiVal === '0' || bidiVal === 'false' || bidiVal === false || bidiVal === 0) {\n paragraph.setBidi(false);\n } else {\n // Default is true when element present without val attribute or val=\"1\"\n paragraph.setBidi(true);\n }\n }\n\n // Text direction per ECMA-376 Part 1 §17.3.1.36\n if (pPrObj['w:textDirection']?.['@_w:val']) {\n paragraph.setTextDirection(pPrObj['w:textDirection']['@_w:val']);\n }\n\n // Text vertical alignment per ECMA-376 Part 1 §17.3.1.35\n if (pPrObj['w:textAlignment']?.['@_w:val']) {\n paragraph.setTextAlignment(pPrObj['w:textAlignment']['@_w:val']);\n }\n\n // Mirror indents per ECMA-376 Part 1 §17.3.1.18\n if (pPrObj['w:mirrorIndents']) {\n paragraph.setMirrorIndents(true);\n }\n\n // Auto-adjust right indent per ECMA-376 Part 1 §17.3.1.1\n if (pPrObj['w:adjustRightInd'] !== undefined) {\n const adjustRightIndVal = pPrObj['w:adjustRightInd']?.['@_w:val'];\n if (\n adjustRightIndVal === '0' ||\n adjustRightIndVal === 'false' ||\n adjustRightIndVal === false ||\n adjustRightIndVal === 0\n ) {\n paragraph.setAdjustRightInd(false);\n } else {\n // Default is true when element present without val attribute or val=\"1\"\n paragraph.setAdjustRightInd(true);\n }\n }\n\n // Text frame properties per ECMA-376 Part 1 §17.3.1.11\n if (pPrObj['w:framePr']) {\n const framePr = pPrObj['w:framePr'];\n const frameProps: any = {};\n // Use isExplicitlySet for numeric values to properly handle 0\n if (isExplicitlySet(framePr['@_w:w'])) frameProps.w = safeParseInt(framePr['@_w:w']);\n if (isExplicitlySet(framePr['@_w:h'])) frameProps.h = safeParseInt(framePr['@_w:h']);\n if (framePr['@_w:hRule']) frameProps.hRule = framePr['@_w:hRule'];\n if (isExplicitlySet(framePr['@_w:x'])) frameProps.x = safeParseInt(framePr['@_w:x']);\n if (isExplicitlySet(framePr['@_w:y'])) frameProps.y = safeParseInt(framePr['@_w:y']);\n if (framePr['@_w:xAlign']) frameProps.xAlign = framePr['@_w:xAlign'];\n if (framePr['@_w:yAlign']) frameProps.yAlign = framePr['@_w:yAlign'];\n if (framePr['@_w:hAnchor']) frameProps.hAnchor = framePr['@_w:hAnchor'];\n if (framePr['@_w:vAnchor']) frameProps.vAnchor = framePr['@_w:vAnchor'];\n if (isExplicitlySet(framePr['@_w:hSpace']))\n frameProps.hSpace = safeParseInt(framePr['@_w:hSpace']);\n if (isExplicitlySet(framePr['@_w:vSpace']))\n frameProps.vSpace = safeParseInt(framePr['@_w:vSpace']);\n if (framePr['@_w:wrap']) frameProps.wrap = framePr['@_w:wrap'];\n if (framePr['@_w:dropCap']) frameProps.dropCap = framePr['@_w:dropCap'];\n if (isExplicitlySet(framePr['@_w:lines']))\n frameProps.lines = safeParseInt(framePr['@_w:lines']);\n if (isExplicitlySet(framePr['@_w:anchorLock'])) {\n // Use parseOoxmlBoolean-style check for attribute value\n const val = framePr['@_w:anchorLock'];\n frameProps.anchorLock =\n val === '1' || val === 1 || val === 'true' || val === true || val === 'on';\n }\n if (Object.keys(frameProps).length > 0) {\n paragraph.setFrameProperties(frameProps);\n }\n }\n\n // Suppress automatic hyphenation per ECMA-376 Part 1 §17.3.1.33\n if (pPrObj['w:suppressAutoHyphens']) {\n paragraph.setSuppressAutoHyphens(true);\n }\n\n // CJK paragraph properties per ECMA-376 Part 1\n if (pPrObj['w:kinsoku']) {\n paragraph.setKinsoku(parseOoxmlBoolean(pPrObj['w:kinsoku']));\n }\n if (pPrObj['w:wordWrap']) {\n paragraph.setWordWrap(parseOoxmlBoolean(pPrObj['w:wordWrap']));\n }\n if (pPrObj['w:overflowPunct']) {\n paragraph.setOverflowPunct(parseOoxmlBoolean(pPrObj['w:overflowPunct']));\n }\n if (pPrObj['w:topLinePunct']) {\n paragraph.setTopLinePunct(parseOoxmlBoolean(pPrObj['w:topLinePunct']));\n }\n if (pPrObj['w:autoSpaceDE']) {\n paragraph.setAutoSpaceDE(parseOoxmlBoolean(pPrObj['w:autoSpaceDE']));\n }\n if (pPrObj['w:autoSpaceDN']) {\n paragraph.setAutoSpaceDN(parseOoxmlBoolean(pPrObj['w:autoSpaceDN']));\n }\n\n // Suppress text frame overlap per ECMA-376 Part 1 §17.3.1.34\n if (pPrObj['w:suppressOverlap']) {\n paragraph.setSuppressOverlap(true);\n }\n\n // Textbox tight wrap per ECMA-376 Part 1 §17.3.1.37\n if (pPrObj['w:textboxTightWrap']) {\n const wrapVal = pPrObj['w:textboxTightWrap']?.['@_w:val'];\n if (wrapVal) {\n paragraph.setTextboxTightWrap(wrapVal);\n }\n }\n\n // HTML div ID per ECMA-376 Part 1 §17.3.1.9\n if (pPrObj['w:divId']) {\n const divIdVal = pPrObj['w:divId']?.['@_w:val'];\n if (divIdVal) {\n paragraph.setDivId(parseInt(divIdVal, 10));\n }\n }\n\n // Conditional table style formatting per ECMA-376 Part 1 §17.3.1.8\n if (pPrObj['w:cnfStyle']) {\n const cnfStyleVal = pPrObj['w:cnfStyle']?.['@_w:val'];\n if (cnfStyleVal !== undefined) {\n // Ensure it's a string and pad to 12 characters (standard bitmask length)\n // XML parser may convert to number, removing leading zeros\n const bitmask = String(cnfStyleVal).padStart(12, '0');\n paragraph.setConditionalFormatting(bitmask);\n }\n }\n\n // Paragraph property change tracking per ECMA-376 Part 1 §17.3.1.27\n if (pPrObj['w:pPrChange']) {\n const changeObj = pPrObj['w:pPrChange'];\n const change: any = {};\n if (changeObj['@_w:author']) change.author = String(changeObj['@_w:author']);\n if (changeObj['@_w:date']) change.date = String(changeObj['@_w:date']);\n if (changeObj['@_w:id']) change.id = String(changeObj['@_w:id']);\n\n // Parse child w:pPr for previousProperties to preserve tracked change history\n if (changeObj['w:pPr']) {\n const prevPPr = changeObj['w:pPr'];\n const previousProperties: any = {};\n\n // Parse previous style\n if (prevPPr['w:pStyle']?.['@_w:val']) {\n previousProperties.style = String(prevPPr['w:pStyle']['@_w:val']);\n }\n\n // Parse previous numbering\n if (prevPPr['w:numPr']) {\n const numPr = prevPPr['w:numPr'];\n previousProperties.numbering = {};\n if (numPr['w:ilvl']?.['@_w:val'] !== undefined) {\n const parsedLevel = parseInt(numPr['w:ilvl']['@_w:val'], 10);\n if (!isNaN(parsedLevel)) {\n previousProperties.numbering.level = parsedLevel;\n }\n }\n if (numPr['w:numId']?.['@_w:val'] !== undefined) {\n const parsedNumId = parseInt(numPr['w:numId']['@_w:val'], 10);\n if (!isNaN(parsedNumId)) {\n previousProperties.numbering.numId = parsedNumId;\n }\n }\n }\n\n // Parse previous indentation\n if (prevPPr['w:ind']) {\n const ind = prevPPr['w:ind'];\n previousProperties.indentation = {};\n if (ind['@_w:left'] !== undefined)\n previousProperties.indentation.left = parseInt(ind['@_w:left'], 10);\n if (ind['@_w:right'] !== undefined)\n previousProperties.indentation.right = parseInt(ind['@_w:right'], 10);\n if (ind['@_w:firstLine'] !== undefined)\n previousProperties.indentation.firstLine = parseInt(ind['@_w:firstLine'], 10);\n if (ind['@_w:hanging'] !== undefined)\n previousProperties.indentation.hanging = parseInt(ind['@_w:hanging'], 10);\n }\n\n // Parse previous alignment\n if (prevPPr['w:jc']?.['@_w:val']) {\n previousProperties.alignment = String(prevPPr['w:jc']['@_w:val']);\n }\n\n // Parse previous spacing\n if (prevPPr['w:spacing']) {\n const spacing = prevPPr['w:spacing'];\n previousProperties.spacing = {};\n if (spacing['@_w:before'] !== undefined)\n previousProperties.spacing.before = parseInt(spacing['@_w:before'], 10);\n if (spacing['@_w:after'] !== undefined)\n previousProperties.spacing.after = parseInt(spacing['@_w:after'], 10);\n if (spacing['@_w:line'] !== undefined)\n previousProperties.spacing.line = parseInt(spacing['@_w:line'], 10);\n if (spacing['@_w:lineRule'])\n previousProperties.spacing.lineRule = String(spacing['@_w:lineRule']);\n }\n\n // Parse previous keepNext/keepLines/pageBreakBefore\n if (prevPPr['w:keepNext']) {\n previousProperties.keepNext = prevPPr['w:keepNext']['@_w:val'] !== '0';\n }\n if (prevPPr['w:keepLines']) {\n previousProperties.keepLines = prevPPr['w:keepLines']['@_w:val'] !== '0';\n }\n if (prevPPr['w:pageBreakBefore']) {\n previousProperties.pageBreakBefore = prevPPr['w:pageBreakBefore']['@_w:val'] !== '0';\n }\n\n // === Extended paragraph property parsing per ECMA-376 Part 1 §17.3.1 ===\n\n // Parse widowControl (w:widowControl) - orphan/widow control\n if (prevPPr['w:widowControl']) {\n previousProperties.widowControl = prevPPr['w:widowControl']['@_w:val'] !== '0';\n }\n\n // Parse suppressAutoHyphens (w:suppressAutoHyphens)\n if (prevPPr['w:suppressAutoHyphens']) {\n previousProperties.suppressAutoHyphens =\n prevPPr['w:suppressAutoHyphens']['@_w:val'] !== '0';\n }\n\n // Parse contextualSpacing (w:contextualSpacing)\n if (prevPPr['w:contextualSpacing']) {\n previousProperties.contextualSpacing = prevPPr['w:contextualSpacing']['@_w:val'] !== '0';\n }\n\n // Parse mirrorIndents (w:mirrorIndents)\n if (prevPPr['w:mirrorIndents']) {\n previousProperties.mirrorIndents = prevPPr['w:mirrorIndents']['@_w:val'] !== '0';\n }\n\n // Parse outlineLevel (w:outlineLvl @w:val)\n if (prevPPr['w:outlineLvl']?.['@_w:val'] !== undefined) {\n previousProperties.outlineLevel = parseInt(prevPPr['w:outlineLvl']['@_w:val'], 10);\n }\n\n // Parse bidi (w:bidi) - right-to-left paragraph\n if (prevPPr['w:bidi']) {\n previousProperties.bidi = prevPPr['w:bidi']['@_w:val'] !== '0';\n }\n\n // Parse suppressLineNumbers (w:suppressLineNumbers)\n if (prevPPr['w:suppressLineNumbers']) {\n previousProperties.suppressLineNumbers =\n prevPPr['w:suppressLineNumbers']['@_w:val'] !== '0';\n }\n\n // Parse adjustRightInd (w:adjustRightInd)\n if (prevPPr['w:adjustRightInd']) {\n previousProperties.adjustRightInd = prevPPr['w:adjustRightInd']['@_w:val'] !== '0';\n }\n\n // Parse snapToGrid (w:snapToGrid)\n if (prevPPr['w:snapToGrid']) {\n previousProperties.snapToGrid = prevPPr['w:snapToGrid']['@_w:val'] !== '0';\n }\n\n // Parse wordWrap (w:wordWrap)\n if (prevPPr['w:wordWrap']) {\n previousProperties.wordWrap = prevPPr['w:wordWrap']['@_w:val'] !== '0';\n }\n\n // Parse autoSpaceDE (w:autoSpaceDE) - East Asian/numeric spacing\n if (prevPPr['w:autoSpaceDE']) {\n previousProperties.autoSpaceDE = prevPPr['w:autoSpaceDE']['@_w:val'] !== '0';\n }\n\n // Parse autoSpaceDN (w:autoSpaceDN) - East Asian/Western spacing\n if (prevPPr['w:autoSpaceDN']) {\n previousProperties.autoSpaceDN = prevPPr['w:autoSpaceDN']['@_w:val'] !== '0';\n }\n\n // Parse textDirection (w:textDirection @w:val)\n if (prevPPr['w:textDirection']?.['@_w:val']) {\n previousProperties.textDirection = String(prevPPr['w:textDirection']['@_w:val']);\n }\n\n // Parse textAlignment (w:textAlignment @w:val) per ECMA-376 Part 1 §17.3.1.39\n if (prevPPr['w:textAlignment']?.['@_w:val']) {\n previousProperties.textAlignment = String(prevPPr['w:textAlignment']['@_w:val']);\n }\n\n // Parse paragraph borders (w:pBdr) per ECMA-376 Part 1 §17.3.1.24\n if (prevPPr['w:pBdr']) {\n const pBdr = prevPPr['w:pBdr'];\n previousProperties.borders = {};\n\n const parseBorder = (borderObj: any) => {\n if (!borderObj) return undefined;\n return {\n val: borderObj['@_w:val'],\n sz: borderObj['@_w:sz'] !== undefined ? parseInt(borderObj['@_w:sz'], 10) : undefined,\n space:\n borderObj['@_w:space'] !== undefined\n ? parseInt(borderObj['@_w:space'], 10)\n : undefined,\n color: borderObj['@_w:color'],\n themeColor: borderObj['@_w:themeColor'],\n };\n };\n\n if (pBdr['w:top']) previousProperties.borders.top = parseBorder(pBdr['w:top']);\n if (pBdr['w:bottom']) previousProperties.borders.bottom = parseBorder(pBdr['w:bottom']);\n if (pBdr['w:left']) previousProperties.borders.left = parseBorder(pBdr['w:left']);\n if (pBdr['w:right']) previousProperties.borders.right = parseBorder(pBdr['w:right']);\n if (pBdr['w:between'])\n previousProperties.borders.between = parseBorder(pBdr['w:between']);\n if (pBdr['w:bar']) previousProperties.borders.bar = parseBorder(pBdr['w:bar']);\n\n // Clean up empty borders object\n if (Object.keys(previousProperties.borders).length === 0) {\n delete previousProperties.borders;\n }\n }\n\n // Parse paragraph shading (w:shd) per ECMA-376 Part 1 §17.3.1.32\n if (prevPPr['w:shd']) {\n const shading = this.parseShadingFromObj(prevPPr['w:shd']);\n if (shading) {\n previousProperties.shading = shading;\n }\n }\n\n // Parse tab stops (w:tabs) per ECMA-376 Part 1 §17.3.1.38\n if (prevPPr['w:tabs']) {\n const tabsObj = prevPPr['w:tabs'];\n const tabArray = tabsObj['w:tab'];\n if (tabArray) {\n const tabs = Array.isArray(tabArray) ? tabArray : [tabArray];\n previousProperties.tabs = tabs.map((tab: any) => ({\n val: tab['@_w:val'],\n pos: tab['@_w:pos'] !== undefined ? parseInt(tab['@_w:pos'], 10) : undefined,\n leader: tab['@_w:leader'],\n }));\n }\n }\n\n if (Object.keys(previousProperties).length > 0) {\n change.previousProperties = previousProperties;\n }\n }\n\n if (Object.keys(change).length > 0) {\n paragraph.setParagraphPropertiesChange(change);\n }\n }\n\n // Section properties per ECMA-376 Part 1 §17.3.1.30\n // Note: sectPr is set as raw XML string by callers that have access to the raw paragraph XML.\n // The parsed object is stored as a marker; callers override with raw XML for round-trip fidelity.\n if (pPrObj['w:sectPr']) {\n paragraph.setSectionProperties(pPrObj['w:sectPr']);\n }\n }\n\n /**\n * NEW: Assemble complex fields from run tokens\n * Groups begin→instr→sep→result→end sequences into ComplexField objects\n * Also handles Revision objects (w:ins, w:del) that appear in the result section of complex fields\n *\n * @param paragraph The paragraph containing runs to process\n */\n private assembleComplexFields(paragraph: Paragraph): void {\n // Skip if this paragraph is part of a multi-paragraph field (e.g., TOC)\n // These paragraphs have already been processed and their field structure\n // should be preserved - re-processing would corrupt the field runs\n if (paragraph._isPartOfMultiParagraphField) {\n defaultLogger.debug(\n '[DocumentParser] Skipping assembleComplexFields for paragraph marked as part of multi-paragraph field'\n );\n return;\n }\n\n const content = paragraph.getContent();\n const groupedContent: any[] = [];\n let fieldRuns: Run[] = [];\n let fieldRevisions: Revision[] = []; // Track revisions inside field result section\n let instructionRevisions: Revision[] = []; // Track revisions in instruction area\n let fieldState: 'begin' | 'instruction' | 'separate' | 'result' | 'end' | null = null;\n let nestingDepth = 0;\n let hasNestedFields = false;\n let fieldStartIndex = -1;\n\n for (let i = 0; i < content.length; i++) {\n const item = content[i];\n\n if (item instanceof Run) {\n const runContent = item.getContent();\n const hasFieldContent = runContent.some(\n (c: any) => c.type === 'fieldChar' || c.type === 'instructionText'\n );\n\n if (hasFieldContent) {\n // This run is part of a field\n fieldRuns.push(item);\n const fieldChar = runContent.find((c: any) => c.type === 'fieldChar');\n\n if (fieldChar) {\n switch (fieldChar.fieldCharType) {\n case 'begin':\n nestingDepth++;\n if (nestingDepth === 1) {\n fieldState = 'begin';\n fieldStartIndex = i;\n } else {\n hasNestedFields = true;\n }\n break;\n case 'separate':\n if (nestingDepth <= 1) {\n fieldState = 'separate';\n }\n break;\n case 'end':\n nestingDepth--;\n if (nestingDepth > 0) {\n // Still inside a nested field - continue collecting\n break;\n }\n fieldState = 'end';\n\n // Complete field assembly\n if (fieldRuns.length > 0) {\n // NESTED FIELD: preserve raw structure to maintain field balance\n // Nested fields (e.g. INCLUDEPICTURE multiplication from email-pasted images)\n // have properly balanced begin/separate/end markers across nesting levels.\n // Flattening them into a single ComplexField would collapse all instrTexts\n // into one instruction and orphan the inner end markers, corrupting the document.\n if (hasNestedFields) {\n for (let j = fieldStartIndex; j <= i; j++) {\n groupedContent.push(content[j]);\n }\n defaultLogger.debug(\n `Preserved raw structure for nested field spanning ${i - fieldStartIndex + 1} content items`\n );\n fieldRuns = [];\n instructionRevisions = [];\n fieldRevisions = [];\n fieldState = null;\n hasNestedFields = false;\n fieldStartIndex = -1;\n nestingDepth = 0;\n break;\n }\n // If there are revisions in the instruction area, we MUST preserve raw structure\n // The instruction text is INSIDE the revisions, so we can't extract it\n // This happens with field code hyperlinks inside tracked changes (w:ins/w:del)\n if (instructionRevisions.length > 0) {\n // Output field structure in original order: runs interleaved with revisions\n // We need to reconstruct the original order based on field state transitions\n let hasSep = false;\n for (const run of fieldRuns) {\n const runContent = run.getContent();\n const fieldCharToken = runContent.find((c: any) => c.type === 'fieldChar');\n\n // Output begin run\n if (fieldCharToken?.fieldCharType === 'begin') {\n groupedContent.push(run);\n // Instruction revisions come after begin\n for (const rev of instructionRevisions) {\n groupedContent.push(rev);\n }\n } else if (fieldCharToken?.fieldCharType === 'separate') {\n // Separator\n groupedContent.push(run);\n hasSep = true;\n // Result revisions come after separator\n for (const rev of fieldRevisions) {\n groupedContent.push(rev);\n }\n } else if (fieldCharToken?.fieldCharType === 'end') {\n // End marker - if no separator was found, output revisions first\n if (!hasSep) {\n for (const rev of fieldRevisions) {\n groupedContent.push(rev);\n }\n }\n groupedContent.push(run);\n } else {\n // Other runs (instruction text, result text outside revisions)\n groupedContent.push(run);\n }\n }\n\n defaultLogger.debug(\n `Preserved raw structure for field with ${instructionRevisions.length} instruction revisions`\n );\n fieldRuns = [];\n instructionRevisions = [];\n fieldRevisions = [];\n fieldState = null;\n break;\n }\n\n // Extract instruction to determine field type\n let instruction = '';\n let resultText = '';\n let resultFormatting: RunFormatting | undefined;\n let hasSeparate = false;\n\n for (const run of fieldRuns) {\n const runContent = run.getContent();\n const instrText = runContent.find((c: any) => c.type === 'instructionText');\n if (instrText) {\n instruction += instrText.value || '';\n }\n const fieldCharToken = runContent.find((c: any) => c.type === 'fieldChar');\n if (fieldCharToken?.fieldCharType === 'separate') {\n hasSeparate = true;\n }\n const textContent = runContent.find((c: any) => c.type === 'text');\n if (textContent && hasSeparate) {\n resultText += textContent.value || '';\n resultFormatting = run.getFormatting();\n }\n }\n\n instruction = instruction.trim();\n\n // Check if this is a HYPERLINK field code - convert to Hyperlink element\n if (isHyperlinkInstruction(instruction)) {\n const parsed = parseHyperlinkInstruction(instruction);\n if (parsed && resultText) {\n // HYPERLINK fields with tracked changes in the result region cannot be\n // converted to Hyperlink objects — the revisions would become orphaned\n // standalone paragraph content. Keep as ComplexField instead.\n if (fieldRevisions.length > 0) {\n const complexField = this.createComplexFieldFromRuns(fieldRuns);\n if (complexField) {\n for (const rev of fieldRevisions) {\n rev.setFieldContext({\n field: complexField,\n instruction: complexField.getInstruction(),\n position: 'result',\n });\n }\n complexField.setResultRevisions(fieldRevisions);\n groupedContent.push(complexField);\n } else {\n fieldRuns.forEach((run) => groupedContent.push(run));\n for (const revision of fieldRevisions) {\n groupedContent.push(revision);\n }\n }\n fieldRuns = [];\n instructionRevisions = [];\n fieldRevisions = [];\n fieldState = null;\n break;\n }\n\n // Normal path (no revisions) — convert to Hyperlink object\n let hyperlink: Hyperlink;\n if (parsed.url && parsed.url.trim() !== '') {\n // External hyperlink (or combined external + anchor)\n hyperlink = Hyperlink.createExternal(parsed.fullUrl, resultText, {\n ...resultFormatting,\n color: resultFormatting?.color || '0000FF',\n underline: resultFormatting?.underline || 'single',\n });\n } else if (parsed.anchor) {\n // Internal hyperlink (anchor only)\n hyperlink = Hyperlink.createInternal(parsed.anchor, resultText, {\n ...resultFormatting,\n color: resultFormatting?.color || '0000FF',\n underline: resultFormatting?.underline || 'single',\n });\n } else {\n // Fallback to ComplexField if we can't determine link type\n const complexField = this.createComplexFieldFromRuns(fieldRuns);\n if (complexField) {\n // Attach revisions to ComplexField for proper serialization\n if (fieldRevisions.length > 0) {\n // Update field context on each revision with field reference and instruction\n for (const rev of fieldRevisions) {\n rev.setFieldContext({\n field: complexField,\n instruction: complexField.getInstruction(),\n position: 'result',\n });\n }\n complexField.setResultRevisions(fieldRevisions);\n }\n groupedContent.push(complexField);\n } else {\n fieldRuns.forEach((run) => groupedContent.push(run));\n // Only push revisions separately if ComplexField creation failed\n for (const revision of fieldRevisions) {\n groupedContent.push(revision);\n }\n }\n fieldRuns = [];\n instructionRevisions = [];\n fieldRevisions = [];\n fieldState = null;\n break;\n }\n\n // Set tooltip if present\n if (parsed.tooltip) {\n hyperlink.setTooltip(parsed.tooltip);\n }\n\n groupedContent.push(hyperlink);\n for (const revision of fieldRevisions) {\n groupedContent.push(revision);\n }\n defaultLogger.debug(\n `Converted single-paragraph HYPERLINK field to Hyperlink element`\n );\n fieldRuns = [];\n instructionRevisions = [];\n fieldRevisions = [];\n fieldState = null;\n break;\n }\n }\n\n // Non-HYPERLINK field: create ComplexField as usual\n const complexField = this.createComplexFieldFromRuns(fieldRuns);\n if (complexField) {\n // Attach any revisions that were inside the field result section\n // These are tracked changes within the field's display content\n // They MUST be serialized before the end marker per ECMA-376\n if (fieldRevisions.length > 0) {\n // Update field context on each revision with field reference and instruction\n for (const rev of fieldRevisions) {\n rev.setFieldContext({\n field: complexField,\n instruction: complexField.getInstruction(),\n position: 'result',\n });\n }\n complexField.setResultRevisions(fieldRevisions);\n }\n groupedContent.push(complexField);\n } else {\n // If assembly failed, add individual runs\n fieldRuns.forEach((run) => groupedContent.push(run));\n // Still add the revisions\n for (const revision of fieldRevisions) {\n groupedContent.push(revision);\n }\n }\n fieldRuns = [];\n instructionRevisions = [];\n fieldRevisions = [];\n fieldState = null;\n }\n break;\n }\n } else {\n // Instruction text run\n if (fieldState === 'begin' || fieldState === 'instruction') {\n fieldState = 'instruction';\n }\n }\n } else {\n // Regular run - check if we're inside a field result section\n if (nestingDepth > 0) {\n // Inside a nested field - collect all runs to preserve raw structure\n fieldRuns.push(item);\n } else if (fieldState === 'separate' || fieldState === 'result') {\n // This run is part of the field result - collect it\n fieldRuns.push(item);\n fieldState = 'result';\n } else if (fieldState === 'begin' || fieldState === 'instruction') {\n // We're in the middle of parsing field instruction\n // Empty runs between begin and separate should be preserved as part of the field\n // (Word sometimes inserts empty formatting runs in field code sections)\n fieldRuns.push(item);\n } else if (fieldRuns.length > 0) {\n // Incomplete field - add as individual runs\n fieldRuns.forEach((run) => groupedContent.push(run));\n for (const revision of instructionRevisions) {\n groupedContent.push(revision);\n }\n for (const revision of fieldRevisions) {\n groupedContent.push(revision);\n }\n fieldRuns = [];\n instructionRevisions = [];\n fieldRevisions = [];\n fieldState = null;\n groupedContent.push(item);\n } else {\n groupedContent.push(item);\n }\n }\n } else if (item instanceof Revision) {\n // Handle Revision objects (w:ins, w:del) that may appear inside field sections\n if (nestingDepth > 1) {\n // Inside a nested field (depth 2+) - collect revision to preserve raw structure\n fieldRevisions.push(item);\n } else if (fieldState === 'separate' || fieldState === 'result') {\n // This revision is inside the field result section - track it\n // Set preliminary field context (field reference will be set when ComplexField is created)\n item.setFieldContext({ position: 'result' });\n fieldRevisions.push(item);\n fieldState = 'result';\n defaultLogger.debug(\n `Found revision inside complex field result: type=${item.getType()}, id=${item.getId()}`\n );\n } else if (fieldState === 'begin' || fieldState === 'instruction') {\n // Revision in instruction area - track separately and continue field assembly\n // This happens with field code hyperlinks inside tracked changes\n // The instruction text is INSIDE the revision, so we can't extract it into ComplexField\n // Set preliminary field context (field reference will be set when ComplexField is created)\n item.setFieldContext({ position: 'instruction' });\n instructionRevisions.push(item);\n fieldState = 'instruction';\n defaultLogger.debug(\n `Found revision inside complex field instruction: type=${item.getType()}, id=${item.getId()}`\n );\n } else if (fieldRuns.length > 0) {\n // Revision appears in unexpected location during field assembly\n // Add incomplete field runs and the revision\n fieldRuns.forEach((run) => groupedContent.push(run));\n for (const revision of instructionRevisions) {\n groupedContent.push(revision);\n }\n for (const revision of fieldRevisions) {\n groupedContent.push(revision);\n }\n fieldRuns = [];\n instructionRevisions = [];\n fieldRevisions = [];\n fieldState = null;\n groupedContent.push(item);\n } else {\n // Normal revision outside of any field\n groupedContent.push(item);\n }\n } else {\n // Non-run content (hyperlinks, images, etc.)\n if (nestingDepth > 0) {\n // Inside a nested field - keep collecting\n fieldRuns.push(item as any);\n } else if (fieldRuns.length > 0) {\n // Incomplete field - add as individual runs\n fieldRuns.forEach((run) => groupedContent.push(run));\n for (const revision of instructionRevisions) {\n groupedContent.push(revision);\n }\n for (const revision of fieldRevisions) {\n groupedContent.push(revision);\n }\n fieldRuns = [];\n instructionRevisions = [];\n fieldRevisions = [];\n fieldState = null;\n }\n groupedContent.push(item);\n }\n }\n\n // Handle any remaining incomplete field\n if (fieldRuns.length > 0) {\n fieldRuns.forEach((run) => groupedContent.push(run));\n for (const revision of instructionRevisions) {\n groupedContent.push(revision);\n }\n for (const revision of fieldRevisions) {\n groupedContent.push(revision);\n }\n }\n\n // Replace paragraph content with grouped content using setContent\n paragraph.setContent(groupedContent as ParagraphContent[]);\n\n defaultLogger.debug(\n `Assembled ${groupedContent.length - content.length} complex fields in paragraph`\n );\n }\n\n /**\n * Assembles complex fields that span multiple paragraphs (e.g., TOC fields)\n *\n * In Word documents, complex fields like TOC can have their begin/separate/end\n * markers distributed across multiple paragraphs. This method:\n * 1. Scans all paragraphs for field markers\n * 2. When a field spans multiple paragraphs, creates a ComplexField marked as multiParagraph\n * 3. Places the ComplexField in the first paragraph and removes field tokens from subsequent paragraphs\n *\n * For single-paragraph fields, delegates to assembleComplexFields for efficiency.\n *\n * @param bodyElements All parsed body elements (paragraphs, tables, SDTs)\n */\n private assembleMultiParagraphFields(bodyElements: BodyElement[]): void {\n // Extract all paragraphs (including those nested in tables and SDTs)\n const allParagraphs = this.collectAllParagraphs(bodyElements);\n\n if (allParagraphs.length === 0) {\n return;\n }\n\n // Track field state across paragraphs\n interface FieldTracker {\n startParagraphIndex: number;\n startRunIndex: number;\n fieldRuns: { paragraphIndex: number; runIndex: number; run: Run }[];\n hasBegin: boolean;\n hasSeparate: boolean;\n hasEnd: boolean;\n }\n\n let currentField: FieldTracker | null = null;\n const completedFields: FieldTracker[] = [];\n\n // First pass: identify multi-paragraph fields\n for (let pIdx = 0; pIdx < allParagraphs.length; pIdx++) {\n const paragraph = allParagraphs[pIdx]!;\n const content = paragraph.getContent();\n\n for (let rIdx = 0; rIdx < content.length; rIdx++) {\n const item = content[rIdx];\n\n if (!(item instanceof Run)) {\n continue;\n }\n\n const runContent = item.getContent();\n const fieldChar = runContent.find((c: any) => c.type === 'fieldChar');\n\n if (fieldChar) {\n switch (fieldChar.fieldCharType) {\n case 'begin':\n // Start tracking a new field\n currentField = {\n startParagraphIndex: pIdx,\n startRunIndex: rIdx,\n fieldRuns: [{ paragraphIndex: pIdx, runIndex: rIdx, run: item }],\n hasBegin: true,\n hasSeparate: false,\n hasEnd: false,\n };\n break;\n\n case 'separate':\n if (currentField) {\n currentField.hasSeparate = true;\n currentField.fieldRuns.push({ paragraphIndex: pIdx, runIndex: rIdx, run: item });\n }\n break;\n\n case 'end':\n if (currentField) {\n currentField.hasEnd = true;\n currentField.fieldRuns.push({ paragraphIndex: pIdx, runIndex: rIdx, run: item });\n\n // Check if this field spans multiple paragraphs\n const startPIdx = currentField.startParagraphIndex;\n const endPIdx = pIdx;\n\n if (endPIdx > startPIdx) {\n // Multi-paragraph field - add to completed list for processing\n completedFields.push(currentField);\n }\n // Single-paragraph fields will be handled by assembleComplexFields\n currentField = null;\n }\n break;\n }\n } else {\n // Check for instruction text or result text (part of field)\n const hasFieldContent = runContent.some((c: any) => c.type === 'instructionText');\n if (hasFieldContent && currentField) {\n currentField.fieldRuns.push({ paragraphIndex: pIdx, runIndex: rIdx, run: item });\n } else if (currentField && runContent.some((c: any) => c.type === 'text')) {\n // Text between separate and end is result text\n if (currentField.hasSeparate && !currentField.hasEnd) {\n currentField.fieldRuns.push({ paragraphIndex: pIdx, runIndex: rIdx, run: item });\n }\n }\n }\n }\n }\n\n // Process completed multi-paragraph fields\n for (const fieldTracker of completedFields) {\n this.processMultiParagraphField(fieldTracker, allParagraphs);\n }\n\n // Now handle single-paragraph fields in remaining paragraphs\n for (const paragraph of allParagraphs) {\n this.assembleComplexFields(paragraph);\n }\n\n const multiFieldCount = completedFields.length;\n if (multiFieldCount > 0) {\n defaultLogger.info(`Assembled ${multiFieldCount} multi-paragraph complex field(s)`);\n }\n }\n\n /**\n * Collects all paragraphs from body elements, including those nested in tables and SDTs\n */\n private collectAllParagraphs(bodyElements: BodyElement[]): Paragraph[] {\n const paragraphs: Paragraph[] = [];\n\n for (const element of bodyElements) {\n if (element instanceof Paragraph) {\n paragraphs.push(element);\n } else if (element instanceof Table) {\n // Extract paragraphs from table cells\n for (const row of element.getRows()) {\n for (const cell of row.getCells()) {\n paragraphs.push(...cell.getParagraphs());\n }\n }\n } else if (element instanceof StructuredDocumentTag) {\n // SDT content may contain paragraphs\n const sdtContent = element.getContent();\n for (const item of sdtContent) {\n if (item instanceof Paragraph) {\n paragraphs.push(item);\n }\n }\n }\n }\n\n return paragraphs;\n }\n\n /**\n * Processes a multi-paragraph field by:\n * 1. Creating a ComplexField from the collected runs\n * 2. Placing it in the first paragraph\n * 3. Removing field-related runs from subsequent paragraphs\n */\n private processMultiParagraphField(\n fieldTracker: {\n startParagraphIndex: number;\n fieldRuns: { paragraphIndex: number; runIndex: number; run: Run }[];\n },\n allParagraphs: Paragraph[]\n ): void {\n const runs = fieldTracker.fieldRuns.map((fr) => fr.run);\n\n // Extract field instruction and result text to determine field type\n let instruction = '';\n let resultText = '';\n let resultFormatting: RunFormatting | undefined;\n let hasSeparate = false;\n let resultParagraphIndex: number | undefined;\n\n for (let i = 0; i < fieldTracker.fieldRuns.length; i++) {\n const fr = fieldTracker.fieldRuns[i]!;\n const runContent = fr.run.getContent();\n\n // Check for fieldChar tokens\n const fieldCharToken = runContent.find((c: any) => c.type === 'fieldChar');\n if (fieldCharToken) {\n if (fieldCharToken.fieldCharType === 'separate') {\n hasSeparate = true;\n }\n }\n\n // Check for instruction text\n const instrText = runContent.find((c: any) => c.type === 'instructionText');\n if (instrText) {\n instruction += instrText.value || '';\n }\n\n // Check for result text (between separate and end)\n const textContent = runContent.find((c: any) => c.type === 'text');\n if (textContent && hasSeparate) {\n resultText += textContent.value || '';\n resultFormatting = fr.run.getFormatting();\n resultParagraphIndex = fr.paragraphIndex;\n }\n }\n\n instruction = instruction.trim();\n\n // Check if this is a HYPERLINK field code - convert to Hyperlink element\n if (isHyperlinkInstruction(instruction)) {\n const parsed = parseHyperlinkInstruction(instruction);\n if (parsed && resultText) {\n // Determine target paragraph: where result text resides (not first paragraph)\n const targetParagraphIndex = resultParagraphIndex ?? fieldTracker.startParagraphIndex;\n const targetParagraph = allParagraphs[targetParagraphIndex];\n\n if (targetParagraph) {\n // Create Hyperlink element with proper styling\n // If there's a URL, it's external; if only anchor, it's internal\n let hyperlink: Hyperlink;\n if (parsed.url && parsed.url.trim() !== '') {\n // External hyperlink (or combined external + anchor)\n hyperlink = Hyperlink.createExternal(parsed.fullUrl, resultText, {\n ...resultFormatting,\n // Ensure hyperlink styling if not already present\n color: resultFormatting?.color || '0000FF',\n underline: resultFormatting?.underline || 'single',\n });\n } else if (parsed.anchor) {\n // Internal hyperlink (anchor only)\n hyperlink = Hyperlink.createInternal(parsed.anchor, resultText, {\n ...resultFormatting,\n color: resultFormatting?.color || '0000FF',\n underline: resultFormatting?.underline || 'single',\n });\n } else {\n // Fallback: create as ComplexField if we can't determine the link type\n defaultLogger.debug(\n 'HYPERLINK field missing URL and anchor, falling back to ComplexField'\n );\n this.processMultiParagraphFieldAsComplexField(fieldTracker, allParagraphs, runs);\n return;\n }\n\n // Set tooltip if present\n if (parsed.tooltip) {\n hyperlink.setTooltip(parsed.tooltip);\n }\n\n // Group field runs by paragraph index\n const runsByParagraph = new Map<number, Set<number>>();\n for (const fr of fieldTracker.fieldRuns) {\n if (!runsByParagraph.has(fr.paragraphIndex)) {\n runsByParagraph.set(fr.paragraphIndex, new Set());\n }\n runsByParagraph.get(fr.paragraphIndex)!.add(fr.runIndex);\n }\n\n // Process each affected paragraph\n const affectedParagraphIndices = Array.from(runsByParagraph.keys()).sort((a, b) => a - b);\n\n for (const pIdx of affectedParagraphIndices) {\n const paragraph = allParagraphs[pIdx]!;\n const runIndicesToRemove = runsByParagraph.get(pIdx)!;\n const content = paragraph.getContent();\n\n if (pIdx === targetParagraphIndex) {\n // Target paragraph: replace field runs with Hyperlink\n const newContent: ParagraphContent[] = [];\n let hyperlinkInserted = false;\n\n for (let rIdx = 0; rIdx < content.length; rIdx++) {\n if (runIndicesToRemove.has(rIdx)) {\n // Insert Hyperlink at position of first field run in this paragraph\n if (!hyperlinkInserted) {\n newContent.push(hyperlink);\n hyperlinkInserted = true;\n }\n // Skip this run (it's part of the field)\n } else {\n newContent.push(content[rIdx]!);\n }\n }\n\n paragraph.setContent(newContent);\n } else {\n // Other paragraphs: remove field runs entirely\n const newContent = content.filter(\n (_: ParagraphContent, rIdx: number) => !runIndicesToRemove.has(rIdx)\n );\n paragraph.setContent(newContent);\n }\n }\n\n defaultLogger.debug(\n `Converted multi-paragraph HYPERLINK field to Hyperlink element in paragraph ${targetParagraphIndex}`\n );\n return;\n }\n }\n }\n\n // For non-HYPERLINK fields (or if HYPERLINK conversion failed), use standard ComplexField handling\n this.processMultiParagraphFieldAsComplexField(fieldTracker, allParagraphs, runs);\n }\n\n /**\n * Process a multi-paragraph field as a ComplexField (standard behavior for non-HYPERLINK fields)\n * For fields like TOC that span multiple paragraphs with content in between (begin → entries → end),\n * we preserve the original runs instead of creating a ComplexField.\n */\n private processMultiParagraphFieldAsComplexField(\n fieldTracker: {\n startParagraphIndex: number;\n fieldRuns: { paragraphIndex: number; runIndex: number; run: Run }[];\n },\n allParagraphs: Paragraph[],\n runs: Run[]\n ): void {\n // Mark all affected paragraphs so assembleComplexFields() skips them\n // This is critical for TOC and other multi-paragraph fields to preserve\n // the original field structure (fldChar begin/separate/end + instrText)\n const affectedParaIndices = new Set<number>();\n for (const fr of fieldTracker.fieldRuns) {\n affectedParaIndices.add(fr.paragraphIndex);\n }\n\n // Get first and last paragraph indices\n const sortedIndices = Array.from(affectedParaIndices).sort((a, b) => a - b);\n const firstParaIdx = sortedIndices[0]!;\n const lastParaIdx = sortedIndices[sortedIndices.length - 1]!;\n\n // For fields spanning more than 2 consecutive paragraphs (like TOC),\n // preserve the original runs instead of creating a ComplexField.\n // This is because the field content (e.g., TOC entries) is in the intermediate\n // paragraphs between begin/separate and end markers.\n if (lastParaIdx - firstParaIdx > 1) {\n // Mark ALL paragraphs in the range (including intermediate ones with field content)\n // For TOC: para 2 has begin/sep, paras 3-5 have TOC entries, para 6 has end\n for (let pIdx = firstParaIdx; pIdx <= lastParaIdx; pIdx++) {\n const paragraph = allParagraphs[pIdx];\n if (paragraph) {\n paragraph._isPartOfMultiParagraphField = true;\n }\n }\n defaultLogger.debug(\n `Preserving original runs for multi-paragraph field spanning paragraphs ${firstParaIdx} to ${lastParaIdx} (gap > 1)`\n );\n return;\n }\n\n // For fields spanning exactly 2 consecutive paragraphs, proceed with ComplexField\n for (const pIdx of affectedParaIndices) {\n const paragraph = allParagraphs[pIdx];\n if (paragraph) {\n paragraph._isPartOfMultiParagraphField = true;\n }\n }\n\n // Create the ComplexField\n const complexField = this.createComplexFieldFromRuns(runs);\n if (!complexField) {\n defaultLogger.debug('Failed to create ComplexField from multi-paragraph runs');\n return;\n }\n\n // Mark as multi-paragraph\n complexField.setMultiParagraph(true);\n\n // Group field runs by paragraph index\n const runsByParagraph = new Map<number, Set<number>>();\n for (const fr of fieldTracker.fieldRuns) {\n if (!runsByParagraph.has(fr.paragraphIndex)) {\n runsByParagraph.set(fr.paragraphIndex, new Set());\n }\n runsByParagraph.get(fr.paragraphIndex)!.add(fr.runIndex);\n }\n\n // Process each affected paragraph\n const affectedParagraphIndices = Array.from(runsByParagraph.keys()).sort((a, b) => a - b);\n\n for (let i = 0; i < affectedParagraphIndices.length; i++) {\n const pIdx = affectedParagraphIndices[i]!;\n const paragraph = allParagraphs[pIdx]!;\n const runIndicesToRemove = runsByParagraph.get(pIdx)!;\n const content = paragraph.getContent();\n\n if (i === 0) {\n // First paragraph: replace field runs with ComplexField\n const newContent: ParagraphContent[] = [];\n let fieldInserted = false;\n\n for (let rIdx = 0; rIdx < content.length; rIdx++) {\n if (runIndicesToRemove.has(rIdx)) {\n // Insert ComplexField at position of first field run\n if (!fieldInserted) {\n newContent.push(complexField);\n fieldInserted = true;\n }\n // Skip this run (it's part of the field)\n } else {\n newContent.push(content[rIdx]!);\n }\n }\n\n paragraph.setContent(newContent);\n } else {\n // Subsequent paragraphs: remove field runs entirely\n const newContent = content.filter(\n (_: ParagraphContent, rIdx: number) => !runIndicesToRemove.has(rIdx)\n );\n paragraph.setContent(newContent);\n }\n }\n\n defaultLogger.debug(\n `Processed multi-paragraph field spanning paragraphs ${fieldTracker.startParagraphIndex} to ${affectedParagraphIndices[affectedParagraphIndices.length - 1]}`\n );\n }\n\n /**\n * NEW: Create ComplexField from sequence of field runs\n * Extracts instruction from instrText runs and result from text runs\n *\n * @param fieldRuns Array of runs containing field tokens\n * @returns ComplexField or null if invalid sequence\n */\n private createComplexFieldFromRuns(fieldRuns: Run[]): ComplexField | null {\n if (fieldRuns.length < 2) {\n // LENIENT: Just log debug message, don't prevent document loading\n defaultLogger.debug(\n 'Skipping ComplexField assembly: insufficient runs (minimum 2: begin and instr)'\n );\n return null;\n }\n\n let instruction = '';\n let resultText = '';\n let instructionFormatting: RunFormatting | undefined;\n let resultFormatting: RunFormatting | undefined;\n let hasBegin = false;\n let hasEnd = false;\n let hasSeparate = false;\n let formFieldData: any = undefined;\n\n for (const run of fieldRuns) {\n const runContent = run.getContent();\n\n // Check for fieldChar tokens\n const fieldCharToken = runContent.find((c: any) => c.type === 'fieldChar');\n if (fieldCharToken) {\n switch (fieldCharToken.fieldCharType) {\n case 'begin':\n hasBegin = true;\n // Capture formatting from begin run\n instructionFormatting = run.getFormatting();\n // Capture form field data from begin field char\n if (fieldCharToken.formFieldData) {\n formFieldData = fieldCharToken.formFieldData;\n }\n break;\n case 'separate':\n hasSeparate = true;\n break;\n case 'end':\n hasEnd = true;\n break;\n }\n }\n\n // Check for instruction text\n const instrText = runContent.find((c: any) => c.type === 'instructionText');\n if (instrText) {\n instruction += instrText.value || '';\n }\n\n // Check for result text (between separate and end)\n const textContent = runContent.find((c: any) => c.type === 'text');\n if (textContent && hasSeparate) {\n resultText += textContent.value || '';\n resultFormatting = run.getFormatting();\n }\n }\n\n // Second pass: collect non-text result content (e.g., ImageRuns with drawings)\n // These runs are in the result section (past separator) but don't contribute text.\n // Their XML representation must be stored as resultContent so it survives round-trip.\n const resultContentElements: XMLElement[] = [];\n let pastSeparator = false;\n for (const run of fieldRuns) {\n const rc = run.getContent();\n const fc = rc.find((c: any) => c.type === 'fieldChar');\n if (fc?.fieldCharType === 'separate') {\n pastSeparator = true;\n continue;\n }\n if (fc?.fieldCharType === 'end') break;\n if (fc) continue; // skip begin runs\n if (rc.some((c: any) => c.type === 'instructionText')) continue; // skip instrText runs\n if (pastSeparator) {\n // Check if this is a non-text result run (e.g., ImageRun with drawing content)\n const hasNonEmptyText = rc.some(\n (c: any) => c.type === 'text' && c.value && c.value.length > 0\n );\n if (!hasNonEmptyText && run instanceof ImageRun) {\n resultContentElements.push(run.toXML());\n }\n }\n }\n\n // Validate field structure with detailed diagnostics\n if (!hasBegin) {\n const instrPreview = instruction ? instruction.substring(0, 50) : '<none>';\n defaultLogger.warn(`ComplexField missing 'begin' marker. Instruction: \"${instrPreview}...\"`);\n this.parseErrors.push({\n element: 'complex-field-structure',\n error: new Error('Missing field begin marker'),\n });\n return null;\n }\n\n if (!hasEnd) {\n const instrPreview = instruction ? instruction.substring(0, 50) : '<none>';\n defaultLogger.warn(`ComplexField missing 'end' marker. Instruction: \"${instrPreview}...\"`);\n this.parseErrors.push({\n element: 'complex-field-structure',\n error: new Error('Missing field end marker'),\n });\n return null;\n }\n\n if (!instruction.trim()) {\n defaultLogger.warn(`ComplexField has no instruction content`);\n this.parseErrors.push({\n element: 'complex-field-structure',\n error: new Error('Empty field instruction'),\n });\n return null;\n }\n\n // Trim and clean instruction\n instruction = instruction.trim();\n\n defaultLogger.debug(\n `Created ComplexField: ${instruction.substring(0, 50)}... (result: \"${resultText}\")`\n );\n\n const properties: any = {\n instruction,\n result: resultText,\n resultContent: resultContentElements.length > 0 ? resultContentElements : undefined,\n instructionFormatting,\n resultFormatting,\n multiParagraph: false, // Default - can be set later if needed\n hasResult: hasSeparate, // Track if field had a separator/result section per ECMA-376\n formFieldData,\n };\n\n return new ComplexField(properties);\n }\n\n private parseRunFromObject(runObj: any): Run | null {\n try {\n // Extract all run content elements (text, tabs, breaks, etc.)\n // Per ECMA-376 §17.3.3 EG_RunInnerContent, runs can contain multiple content types\n const content: RunContent[] = [];\n\n const toArray = <T>(value: T | T[] | undefined | null): T[] =>\n Array.isArray(value) ? value : value !== undefined && value !== null ? [value] : [];\n\n const extractTextValue = (node: any): string => {\n if (node === undefined || node === null) {\n return '';\n }\n if (typeof node === 'object') {\n return XMLBuilder.unescapeXml(node['#text'] || '');\n }\n return XMLBuilder.unescapeXml(String(node));\n };\n\n const parseBooleanAttr = (value: any): boolean | undefined => {\n if (value === undefined || value === null) {\n return undefined;\n }\n return value === '1' || value === 1 || value === true || value === 'true';\n };\n\n // Parse w:ffData from a fldChar object (form field data per ECMA-376 §17.16.17)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n type XmlNode = Record<string, any>;\n\n const parseFormFieldData = (fldCharObj: XmlNode): FormFieldData | undefined => {\n const ffDataObj: XmlNode | undefined = fldCharObj['w:ffData'];\n if (!ffDataObj || typeof ffDataObj !== 'object') return undefined;\n const ffd: FormFieldData = {};\n // w:name\n if (ffDataObj['w:name']?.['@_w:val'] !== undefined) {\n ffd.name = String(ffDataObj['w:name']['@_w:val']);\n }\n // w:enabled (presence = true, w:val=\"0\" = false)\n if (ffDataObj['w:enabled'] !== undefined) {\n const enabledVal = ffDataObj['w:enabled']?.['@_w:val'];\n ffd.enabled = enabledVal === '0' || enabledVal === 0 ? false : true;\n }\n // w:calcOnExit\n if (ffDataObj['w:calcOnExit'] !== undefined) {\n const calcVal = ffDataObj['w:calcOnExit']?.['@_w:val'];\n ffd.calcOnExit = calcVal === '1' || calcVal === 1 || calcVal === true;\n }\n // w:helpText\n if (ffDataObj['w:helpText']?.['@_w:val'] !== undefined) {\n ffd.helpText = String(ffDataObj['w:helpText']['@_w:val']);\n }\n // w:statusText\n if (ffDataObj['w:statusText']?.['@_w:val'] !== undefined) {\n ffd.statusText = String(ffDataObj['w:statusText']['@_w:val']);\n }\n // w:entryMacro\n if (ffDataObj['w:entryMacro']?.['@_w:val'] !== undefined) {\n ffd.entryMacro = String(ffDataObj['w:entryMacro']['@_w:val']);\n }\n // w:exitMacro\n if (ffDataObj['w:exitMacro']?.['@_w:val'] !== undefined) {\n ffd.exitMacro = String(ffDataObj['w:exitMacro']['@_w:val']);\n }\n // w:textInput\n if (ffDataObj['w:textInput'] !== undefined) {\n const ti: XmlNode = ffDataObj['w:textInput'];\n const textInput: FormFieldTextInput = { type: 'textInput' };\n if (ti['w:type']?.['@_w:val'] !== undefined)\n textInput.inputType = String(ti['w:type']['@_w:val']);\n if (ti['w:default']?.['@_w:val'] !== undefined)\n textInput.defaultValue = String(ti['w:default']['@_w:val']);\n if (ti['w:maxLength']?.['@_w:val'] !== undefined)\n textInput.maxLength = Number(ti['w:maxLength']['@_w:val']);\n if (ti['w:format']?.['@_w:val'] !== undefined)\n textInput.format = String(ti['w:format']['@_w:val']);\n ffd.fieldType = textInput;\n }\n // w:checkBox\n if (ffDataObj['w:checkBox'] !== undefined) {\n const cb: XmlNode = ffDataObj['w:checkBox'];\n const checkBox: FormFieldCheckBox = { type: 'checkBox' };\n if (cb['w:default']?.['@_w:val'] !== undefined) {\n checkBox.defaultChecked =\n cb['w:default']['@_w:val'] === '1' || cb['w:default']['@_w:val'] === 1;\n }\n if (cb['w:checked']?.['@_w:val'] !== undefined) {\n checkBox.checked =\n cb['w:checked']['@_w:val'] === '1' || cb['w:checked']['@_w:val'] === 1;\n }\n if (cb['w:size']?.['@_w:val'] !== undefined) {\n checkBox.size = Number(cb['w:size']['@_w:val']);\n } else if (cb['w:sizeAuto'] !== undefined) {\n checkBox.size = 'auto';\n }\n ffd.fieldType = checkBox;\n }\n // w:ddList\n if (ffDataObj['w:ddList'] !== undefined) {\n const dd: XmlNode = ffDataObj['w:ddList'];\n const ddList: FormFieldDropDownList = { type: 'dropDownList' };\n if (dd['w:result']?.['@_w:val'] !== undefined)\n ddList.result = Number(dd['w:result']['@_w:val']);\n if (dd['w:default']?.['@_w:val'] !== undefined)\n ddList.defaultResult = Number(dd['w:default']['@_w:val']);\n if (dd['w:listEntry'] !== undefined) {\n const entries = Array.isArray(dd['w:listEntry'])\n ? dd['w:listEntry']\n : [dd['w:listEntry']];\n ddList.listEntries = entries.map((e: XmlNode) => String(e?.['@_w:val'] ?? e ?? ''));\n }\n ffd.fieldType = ddList;\n }\n return Object.keys(ffd).length > 0 ? ffd : undefined;\n };\n\n // Use _orderedChildren to preserve element order (critical for TOC entries)\n // TOC entries have structure: text → tab → text (heading, tab, page number)\n if (runObj._orderedChildren) {\n // Process elements in their original order\n for (const child of runObj._orderedChildren) {\n const elementType = child.type;\n const elementIndex = child.index;\n\n switch (elementType) {\n case 'w:t': {\n const textElements = toArray(runObj['w:t']);\n // Bounds check with debug logging for malformed documents\n if (elementIndex >= textElements.length) {\n defaultLogger.debug('[DocumentParser] Invalid _orderedChildren index for w:t', {\n index: elementIndex,\n arrayLength: textElements.length,\n });\n break;\n }\n const te = textElements[elementIndex];\n if (te !== undefined && te !== null) {\n const text = extractTextValue(te);\n if (text) {\n content.push({ type: 'text', value: text });\n }\n }\n break;\n }\n\n case 'w:instrText': {\n const instrElements = toArray(runObj['w:instrText']);\n // Bounds check with debug logging for malformed documents\n if (elementIndex >= instrElements.length) {\n defaultLogger.debug(\n '[DocumentParser] Invalid _orderedChildren index for w:instrText',\n { index: elementIndex, arrayLength: instrElements.length }\n );\n break;\n }\n const instr = instrElements[elementIndex];\n if (instr !== undefined && instr !== null) {\n const text = extractTextValue(instr);\n content.push({ type: 'instructionText', value: text });\n }\n break;\n }\n\n // Deleted text element (w:delText) - inside w:del tracked changes\n // Per ECMA-376 Part 1 §22.1.2.27, deleted text uses w:delText instead of w:t\n case 'w:delText': {\n const delTextElements = toArray(runObj['w:delText']);\n if (elementIndex >= delTextElements.length) {\n defaultLogger.debug(\n '[DocumentParser] Invalid _orderedChildren index for w:delText',\n { index: elementIndex, arrayLength: delTextElements.length }\n );\n break;\n }\n const te = delTextElements[elementIndex];\n if (te !== undefined && te !== null) {\n const text = extractTextValue(te);\n if (text) {\n // Store as deleted text - same as regular text for content purposes\n content.push({ type: 'text', value: text, isDeleted: true });\n }\n }\n break;\n }\n\n // Deleted instruction text (w:delInstrText) - inside w:del for field codes\n // Per ECMA-376 Part 1 §22.1.2.26, deleted field instructions use w:delInstrText\n case 'w:delInstrText': {\n const delInstrElements = toArray(runObj['w:delInstrText']);\n if (elementIndex >= delInstrElements.length) {\n defaultLogger.debug(\n '[DocumentParser] Invalid _orderedChildren index for w:delInstrText',\n { index: elementIndex, arrayLength: delInstrElements.length }\n );\n break;\n }\n const instr = delInstrElements[elementIndex];\n if (instr !== undefined && instr !== null) {\n const text = extractTextValue(instr);\n // Store as instruction text - field assembly will handle it\n content.push({ type: 'instructionText', value: text, isDeleted: true });\n }\n break;\n }\n\n case 'w:fldChar': {\n const fldChars = toArray(runObj['w:fldChar']);\n // Bounds check with debug logging for malformed documents\n if (elementIndex >= fldChars.length) {\n defaultLogger.debug(\n '[DocumentParser] Invalid _orderedChildren index for w:fldChar',\n { index: elementIndex, arrayLength: fldChars.length }\n );\n break;\n }\n const fldChar = fldChars[elementIndex];\n if (fldChar && typeof fldChar === 'object') {\n const charType = (fldChar['@_w:fldCharType'] || fldChar['@_fldCharType']) as\n | 'begin'\n | 'separate'\n | 'end'\n | undefined;\n if (charType) {\n const fldContent: any = {\n type: 'fieldChar',\n fieldCharType: charType,\n fieldCharDirty: parseBooleanAttr(fldChar['@_w:dirty']),\n fieldCharLocked: parseBooleanAttr(\n fldChar['@_w:fldLock'] ?? fldChar['@_w:lock']\n ),\n };\n if (charType === 'begin') {\n const ffData = parseFormFieldData(fldChar);\n if (ffData) fldContent.formFieldData = ffData;\n }\n content.push(fldContent);\n }\n }\n break;\n }\n\n case 'w:tab':\n content.push({ type: 'tab' });\n break;\n\n case 'w:br': {\n const brElements = toArray(runObj['w:br']);\n const brElement = brElements[elementIndex] || brElements[0];\n const breakType = brElement?.['@_w:type'] as BreakType | undefined;\n content.push({ type: 'break', breakType });\n break;\n }\n\n case 'w:cr':\n content.push({ type: 'carriageReturn' });\n break;\n\n case 'w:softHyphen':\n content.push({ type: 'softHyphen' });\n break;\n\n case 'w:noBreakHyphen':\n content.push({ type: 'noBreakHyphen' });\n break;\n\n // Simple marker elements per ECMA-376 Part 1 §17.3.3\n case 'w:lastRenderedPageBreak':\n content.push({ type: 'lastRenderedPageBreak' });\n break;\n\n case 'w:separator':\n content.push({ type: 'separator' });\n break;\n\n case 'w:continuationSeparator':\n content.push({ type: 'continuationSeparator' });\n break;\n\n case 'w:pgNum':\n content.push({ type: 'pageNumber' });\n break;\n\n case 'w:annotationRef':\n content.push({ type: 'annotationRef' });\n break;\n\n // Footnote reference (w:footnoteReference) per ECMA-376 Part 1 §17.11.13\n case 'w:footnoteReference': {\n const fnRefElements = toArray(runObj['w:footnoteReference']);\n const fnRef = fnRefElements[elementIndex] || fnRefElements[0];\n const fnId = fnRef?.['@_w:id'];\n content.push({\n type: 'footnoteReference',\n footnoteId: fnId !== undefined ? parseInt(fnId, 10) : undefined,\n });\n break;\n }\n\n // Endnote reference (w:endnoteReference) per ECMA-376 Part 1 §17.11.2\n case 'w:endnoteReference': {\n const enRefElements = toArray(runObj['w:endnoteReference']);\n const enRef = enRefElements[elementIndex] || enRefElements[0];\n const enId = enRef?.['@_w:id'];\n content.push({\n type: 'endnoteReference',\n endnoteId: enId !== undefined ? parseInt(enId, 10) : undefined,\n });\n break;\n }\n\n case 'w:dayShort':\n content.push({ type: 'dayShort' });\n break;\n\n case 'w:dayLong':\n content.push({ type: 'dayLong' });\n break;\n\n case 'w:monthShort':\n content.push({ type: 'monthShort' });\n break;\n\n case 'w:monthLong':\n content.push({ type: 'monthLong' });\n break;\n\n case 'w:yearShort':\n content.push({ type: 'yearShort' });\n break;\n\n case 'w:yearLong':\n content.push({ type: 'yearLong' });\n break;\n\n // Symbol character (w:sym) per ECMA-376 Part 1 §17.3.3.30\n case 'w:sym': {\n const symElements = toArray(runObj['w:sym']);\n const sym = symElements[elementIndex] || symElements[0];\n if (sym && typeof sym === 'object') {\n content.push({\n type: 'symbol',\n symbolFont: sym['@_w:font'],\n symbolChar: sym['@_w:char'],\n });\n } else {\n content.push({ type: 'symbol' });\n }\n break;\n }\n\n // Absolute position tab (w:ptab) per ECMA-376 Part 1 §17.3.3.23\n case 'w:ptab': {\n const ptabElements = toArray(runObj['w:ptab']);\n const ptab = ptabElements[elementIndex] || ptabElements[0];\n if (ptab && typeof ptab === 'object') {\n content.push({\n type: 'positionTab',\n ptabAlignment: ptab['@_w:alignment'],\n ptabRelativeTo: ptab['@_w:relativeTo'],\n ptabLeader: ptab['@_w:leader'],\n });\n } else {\n content.push({ type: 'positionTab' });\n }\n break;\n }\n\n // Ignore formatting elements (w:rPr) - handled separately\n case 'w:rPr':\n break;\n }\n }\n } else {\n // Fallback: No _orderedChildren (older parser or simple run with single text)\n defaultLogger.warn(\n '[DocumentParser] _orderedChildren missing - using fallback element ordering which may affect tab/break positions'\n );\n // Extract text elements (can be array if multiple <w:t> in one run)\n const textElement = runObj['w:t'];\n if (textElement !== undefined && textElement !== null) {\n const textElements = toArray(textElement);\n\n for (const te of textElements) {\n const text = extractTextValue(te);\n if (text) {\n content.push({ type: 'text', value: text });\n }\n }\n }\n\n const instrTextElement = runObj['w:instrText'];\n if (instrTextElement !== undefined && instrTextElement !== null) {\n const instrElements = toArray(instrTextElement);\n for (const instr of instrElements) {\n const text = extractTextValue(instr);\n content.push({ type: 'instructionText', value: text });\n }\n }\n\n // Handle deleted text (w:delText) - inside w:del tracked changes\n // Per ECMA-376 Part 1 §22.1.2.27\n const delTextElement = runObj['w:delText'];\n if (delTextElement !== undefined && delTextElement !== null) {\n const delTextElements = toArray(delTextElement);\n for (const te of delTextElements) {\n const text = extractTextValue(te);\n if (text) {\n content.push({ type: 'text', value: text, isDeleted: true });\n }\n }\n }\n\n // Handle deleted instruction text (w:delInstrText) - inside w:del for field codes\n // Per ECMA-376 Part 1 §22.1.2.26\n const delInstrTextElement = runObj['w:delInstrText'];\n if (delInstrTextElement !== undefined && delInstrTextElement !== null) {\n const delInstrElements = toArray(delInstrTextElement);\n for (const instr of delInstrElements) {\n const text = extractTextValue(instr);\n content.push({ type: 'instructionText', value: text, isDeleted: true });\n }\n }\n\n const fldCharElement = runObj['w:fldChar'];\n if (fldCharElement !== undefined && fldCharElement !== null) {\n const fldChars = toArray(fldCharElement);\n for (const fldChar of fldChars) {\n if (fldChar && typeof fldChar === 'object') {\n const charType = (fldChar['@_w:fldCharType'] || fldChar['@_fldCharType']) as\n | 'begin'\n | 'separate'\n | 'end'\n | undefined;\n if (charType) {\n const fldContent: any = {\n type: 'fieldChar',\n fieldCharType: charType,\n fieldCharDirty: parseBooleanAttr(fldChar['@_w:dirty']),\n fieldCharLocked: parseBooleanAttr(fldChar['@_w:fldLock'] ?? fldChar['@_w:lock']),\n };\n if (charType === 'begin') {\n const ffData = parseFormFieldData(fldChar);\n if (ffData) fldContent.formFieldData = ffData;\n }\n content.push(fldContent);\n }\n }\n }\n }\n\n // Extract other elements (order doesn't matter in simple case)\n if (runObj['w:tab'] !== undefined) {\n content.push({ type: 'tab' });\n }\n\n if (runObj['w:br'] !== undefined) {\n const brElement = runObj['w:br'];\n const breakType = brElement?.['@_w:type'] as BreakType | undefined;\n content.push({ type: 'break', breakType });\n }\n\n if (runObj['w:cr'] !== undefined) {\n content.push({ type: 'carriageReturn' });\n }\n\n if (runObj['w:softHyphen'] !== undefined) {\n content.push({ type: 'softHyphen' });\n }\n\n if (runObj['w:noBreakHyphen'] !== undefined) {\n content.push({ type: 'noBreakHyphen' });\n }\n\n // Simple marker elements (fallback path)\n if (runObj['w:lastRenderedPageBreak'] !== undefined) {\n content.push({ type: 'lastRenderedPageBreak' });\n }\n if (runObj['w:separator'] !== undefined) {\n content.push({ type: 'separator' });\n }\n if (runObj['w:continuationSeparator'] !== undefined) {\n content.push({ type: 'continuationSeparator' });\n }\n if (runObj['w:pgNum'] !== undefined) {\n content.push({ type: 'pageNumber' });\n }\n if (runObj['w:annotationRef'] !== undefined) {\n content.push({ type: 'annotationRef' });\n }\n // Footnote/endnote reference fallback\n if (runObj['w:footnoteReference'] !== undefined) {\n const fnRefElements = toArray(runObj['w:footnoteReference']);\n for (const fnRef of fnRefElements) {\n const fnId = fnRef?.['@_w:id'];\n content.push({\n type: 'footnoteReference',\n footnoteId: fnId !== undefined ? parseInt(fnId, 10) : undefined,\n });\n }\n }\n if (runObj['w:endnoteReference'] !== undefined) {\n const enRefElements = toArray(runObj['w:endnoteReference']);\n for (const enRef of enRefElements) {\n const enId = enRef?.['@_w:id'];\n content.push({\n type: 'endnoteReference',\n endnoteId: enId !== undefined ? parseInt(enId, 10) : undefined,\n });\n }\n }\n if (runObj['w:dayShort'] !== undefined) {\n content.push({ type: 'dayShort' });\n }\n if (runObj['w:dayLong'] !== undefined) {\n content.push({ type: 'dayLong' });\n }\n if (runObj['w:monthShort'] !== undefined) {\n content.push({ type: 'monthShort' });\n }\n if (runObj['w:monthLong'] !== undefined) {\n content.push({ type: 'monthLong' });\n }\n if (runObj['w:yearShort'] !== undefined) {\n content.push({ type: 'yearShort' });\n }\n if (runObj['w:yearLong'] !== undefined) {\n content.push({ type: 'yearLong' });\n }\n\n // Symbol character (w:sym) - fallback path\n if (runObj['w:sym'] !== undefined) {\n const symElements = toArray(runObj['w:sym']);\n for (const sym of symElements) {\n if (sym && typeof sym === 'object') {\n content.push({\n type: 'symbol',\n symbolFont: sym['@_w:font'],\n symbolChar: sym['@_w:char'],\n });\n } else {\n content.push({ type: 'symbol' });\n }\n }\n }\n\n // Absolute position tab (w:ptab) - fallback path\n if (runObj['w:ptab'] !== undefined) {\n const ptabElements = toArray(runObj['w:ptab']);\n for (const ptab of ptabElements) {\n if (ptab && typeof ptab === 'object') {\n content.push({\n type: 'positionTab',\n ptabAlignment: ptab['@_w:alignment'],\n ptabRelativeTo: ptab['@_w:relativeTo'],\n ptabLeader: ptab['@_w:leader'],\n });\n } else {\n content.push({ type: 'positionTab' });\n }\n }\n }\n }\n\n // Create run from content elements\n const run = Run.createFromContent(content, { cleanXmlFromText: false });\n\n // Parse and apply run properties (formatting)\n this.parseRunPropertiesFromObject(runObj['w:rPr'], run);\n\n // Diagnostic logging\n const text = run.getText();\n const formatting = run.getFormatting();\n if (formatting.rtl) {\n logTextDirection(`Run with RTL: \"${text}\"`);\n }\n logParsing(`Parsed run: \"${text}\" (${content.length} content element(s))`, {\n rtl: formatting.rtl || false,\n });\n\n return run;\n } catch (error: unknown) {\n return null;\n }\n }\n\n private parseHyperlinkFromObject(\n hyperlinkObj: any,\n relationshipManager: RelationshipManager\n ): {\n hyperlink: Hyperlink | null;\n bookmarkStarts: Bookmark[];\n bookmarkEnds: Bookmark[];\n } {\n const result: {\n hyperlink: Hyperlink | null;\n bookmarkStarts: Bookmark[];\n bookmarkEnds: Bookmark[];\n } = { hyperlink: null, bookmarkStarts: [], bookmarkEnds: [] };\n\n try {\n // Extract bookmark elements inside the hyperlink\n // These need to be added to the containing paragraph\n if (hyperlinkObj['w:bookmarkStart']) {\n const bookmarkStarts = Array.isArray(hyperlinkObj['w:bookmarkStart'])\n ? hyperlinkObj['w:bookmarkStart']\n : [hyperlinkObj['w:bookmarkStart']];\n for (const bs of bookmarkStarts) {\n const id = bs['@_w:id'];\n const name = bs['@_w:name'];\n if (id !== undefined && name) {\n const bookmark = new Bookmark({\n name: name,\n id: typeof id === 'number' ? id : parseInt(id, 10),\n skipNormalization: true,\n });\n result.bookmarkStarts.push(bookmark);\n // Also register with BookmarkManager\n if (this.bookmarkManager) {\n try {\n this.bookmarkManager.registerExisting(bookmark);\n } catch (e) {\n getLogger().debug('Bookmark already registered', { id: bookmark.getId?.() });\n }\n }\n }\n }\n }\n\n if (hyperlinkObj['w:bookmarkEnd']) {\n const bookmarkEnds = Array.isArray(hyperlinkObj['w:bookmarkEnd'])\n ? hyperlinkObj['w:bookmarkEnd']\n : [hyperlinkObj['w:bookmarkEnd']];\n for (const be of bookmarkEnds) {\n const id = be['@_w:id'];\n if (id !== undefined) {\n const bookmark = new Bookmark({\n name: `_end_${id}`,\n id: typeof id === 'number' ? id : parseInt(id, 10),\n skipNormalization: true,\n });\n result.bookmarkEnds.push(bookmark);\n }\n }\n }\n\n // Extract hyperlink attributes\n const relationshipId = hyperlinkObj['@_r:id'];\n const anchor = hyperlinkObj['@_w:anchor'];\n const tooltip = hyperlinkObj['@_w:tooltip'];\n const tgtFrame = hyperlinkObj['@_w:tgtFrame'];\n const history = hyperlinkObj['@_w:history'];\n const docLocation = hyperlinkObj['@_w:docLocation'];\n\n // Parse runs inside the hyperlink\n const runs = hyperlinkObj['w:r'];\n const runChildren = Array.isArray(runs) ? runs : runs ? [runs] : [];\n\n // Parse ALL runs to handle multi-run hyperlinks (e.g., varied formatting within one hyperlink)\n // Google Docs often splits hyperlinks by formatting changes, creating multiple runs\n const parsedRuns: Run[] = [];\n let text = '';\n let formatting: RunFormatting = {};\n\n if (runChildren.length > 0) {\n // Parse all runs, not just the first one\n for (const runChild of runChildren) {\n const parsedRun = this.parseRunFromObject(runChild);\n if (parsedRun) {\n parsedRuns.push(parsedRun);\n text += parsedRun.getText();\n }\n }\n\n // Use the first run's formatting as the base formatting\n if (parsedRuns.length > 0 && parsedRuns[0]) {\n formatting = parsedRuns[0].getFormatting();\n }\n }\n\n // For TOC hyperlinks with tabs/breaks, use the first parsed run\n const parsedRun = parsedRuns.length > 0 ? parsedRuns[0] : null;\n\n // Resolve URL from relationship if external hyperlink\n let url: string | undefined;\n if (relationshipId) {\n const relationship = relationshipManager.getRelationship(relationshipId);\n if (relationship) {\n url = relationship.getTarget();\n // Decode URL-encoded characters (e.g., %23 -> #, %20 -> space)\n // This ensures proper handling of URLs with fragments and special characters\n if (url) {\n try {\n url = decodeURIComponent(url);\n } catch {\n // If decoding fails, use the original URL\n defaultLogger.debug(`[DocumentParser] Failed to decode URL: ${url}`);\n }\n }\n }\n }\n\n // Handle external hyperlinks with anchor fragments\n // Microsoft Word can store URLs with the base in relationships and fragment in w:anchor\n // Example: rels has \"https://example.com/\", anchor has \"!/view?docid=abc-123\"\n // Combined: \"https://example.com/#!/view?docid=abc-123\"\n // This is common for single-page applications with hash-based routing (theSource, etc.)\n let finalAnchor = anchor;\n let finalRelationshipId = relationshipId;\n if (url && anchor) {\n // Combine URL and anchor for external hyperlinks with fragments\n url = url + '#' + anchor;\n finalAnchor = undefined; // Clear anchor since it's now part of URL\n // Clear relationshipId since the relationship points to the old base URL\n // On save, a new relationship will be created with the combined URL\n finalRelationshipId = undefined;\n defaultLogger.debug(`[DocumentParser] Combined external URL with anchor fragment: ${url}`);\n }\n\n // Skip hyperlinks that have no destination (neither URL nor anchor nor relationship ID)\n // This can happen with malformed HYPERLINK field codes or corrupted documents\n // Note: If there's a relationshipId but the relationship is missing, we still keep the hyperlink\n // (it has text and a reference that might be resolved later or is just broken)\n if (!url && !finalAnchor && !finalRelationshipId) {\n defaultLogger.debug(\n `[DocumentParser] Skipping hyperlink with no URL, anchor, or relationship ID. Text: \"${text}\"`\n );\n return result;\n }\n\n // Skip self-closing external hyperlinks (no runs at all)\n // These are invisible hyperlinks that exist in the document structure but have no visible content\n // They should be removed rather than having URLs appear as text\n const isSelfClosingHyperlink = runChildren.length === 0;\n const isExternalLink = (url || finalRelationshipId) && !finalAnchor;\n\n if (isSelfClosingHyperlink && isExternalLink) {\n // Skip self-closing external hyperlink - it has no visible content\n defaultLogger.debug(\n `[DocumentParser] Skipping self-closing external hyperlink with no display text. URL: \"${url}\"`\n );\n return result;\n }\n\n // Create hyperlink with display text\n // NOTE: Do NOT use anchor (bookmark ID) as display text - it should only be used for navigation\n const displayText = text || url || '[Link]';\n\n // Warn if hyperlink has no display text (possible TOC corruption or malformed hyperlink)\n if (!text && finalAnchor) {\n defaultLogger.warn(\n `[DocumentParser] Hyperlink to anchor \"${finalAnchor}\" has no display text. ` +\n `Using placeholder \"[Link]\" to prevent bookmark ID from appearing as visible text. ` +\n `This may indicate a corrupted TOC or malformed hyperlink in the source document.`\n );\n }\n\n const hyperlink = new Hyperlink({\n url,\n anchor: finalAnchor,\n text: displayText,\n formatting,\n tooltip,\n relationshipId: finalRelationshipId,\n tgtFrame,\n history,\n docLocation,\n });\n\n // If we successfully parsed a run with tabs/breaks, use it instead of the default run\n // This preserves TOC structure (text → tab → text)\n if (parsedRun && parsedRun.getContent().length > 1) {\n hyperlink.setRun(parsedRun);\n }\n\n result.hyperlink = hyperlink;\n return result;\n } catch (error: unknown) {\n defaultLogger.warn(\n '[DocumentParser] Failed to parse hyperlink:',\n error instanceof Error\n ? { message: error.message, stack: error.stack }\n : { error: String(error) }\n );\n return result;\n }\n }\n\n /**\n * Merges TRULY consecutive hyperlinks with the same URL into a single hyperlink\n * This handles Google Docs-style hyperlinks that are split by formatting changes\n *\n * IMPORTANT: Only merges hyperlinks that are IMMEDIATELY adjacent (no content between them).\n * Hyperlinks with the same URL but with intervening text/runs are NOT merged.\n *\n * @param paragraph - Paragraph containing hyperlinks to merge\n * @param resetFormatting - Whether to reset hyperlinks to standard formatting\n * @private\n */\n private mergeConsecutiveHyperlinks(paragraph: Paragraph, resetFormatting = false): void {\n const content = paragraph.getContent();\n if (!content || content.length < 2) return;\n\n // Guard: Skip merge when tracking is enabled - it corrupts field structures\n // The clearContent() + addHyperlink() pattern creates new revisions\n // that end up at the wrong position in the content array, placing them\n // OUTSIDE field boundaries when field codes are present\n const trackingEnabled = (paragraph as any).trackingContext?.isEnabled();\n if (trackingEnabled) {\n const hasFieldContent = content.some((item) => {\n if (item instanceof Run) {\n const runContent = item.getContent();\n return runContent.some(\n (c: any) => c.type === 'fieldChar' || c.type === 'instructionText'\n );\n }\n // Also check inside Revisions for field content\n if (item instanceof Revision) {\n const revContent = item.getContent();\n for (const inner of revContent) {\n if (inner instanceof Run) {\n const innerRunContent = inner.getContent();\n if (\n innerRunContent.some(\n (c: any) => c.type === 'fieldChar' || c.type === 'instructionText'\n )\n ) {\n return true;\n }\n }\n }\n }\n return false;\n });\n\n if (hasFieldContent) {\n defaultLogger.debug(\n 'Skipping hyperlink merge: tracking enabled with field content present'\n );\n return;\n }\n }\n\n const mergedContent: any[] = [];\n let i = 0;\n let contentChanged = false;\n\n while (i < content.length) {\n const item = content[i];\n\n if (item instanceof Hyperlink) {\n // Look ahead to find CONSECUTIVE hyperlinks with the same URL/anchor\n const url = item.getUrl() || '';\n const anchor = item.getAnchor() || '';\n const consecutiveHyperlinks: Hyperlink[] = [item];\n let j = i + 1;\n\n // Only merge if IMMEDIATELY adjacent (next item is also a hyperlink with same URL)\n while (j < content.length) {\n const nextItem = content[j];\n if (\n nextItem instanceof Hyperlink &&\n (nextItem.getUrl() || '') === url &&\n (nextItem.getAnchor() || '') === anchor\n ) {\n consecutiveHyperlinks.push(nextItem);\n j++;\n } else {\n // Stop at first non-matching item (including non-hyperlink items)\n break;\n }\n }\n\n if (consecutiveHyperlinks.length > 1) {\n // Merge consecutive hyperlinks\n const mergedText = consecutiveHyperlinks.map((h) => h.getText()).join('');\n\n const mergedHyperlink = new Hyperlink({\n url: item.getUrl(),\n anchor: item.getAnchor(),\n text: mergedText,\n formatting: resetFormatting\n ? this.getStandardHyperlinkFormatting()\n : item.getFormatting(),\n tooltip: item.getTooltip(),\n relationshipId: item.getRelationshipId(),\n });\n mergedContent.push(mergedHyperlink);\n contentChanged = true;\n } else {\n // Single hyperlink (no consecutive ones to merge)\n if (resetFormatting) {\n const resetHyperlink = new Hyperlink({\n url: item.getUrl(),\n anchor: item.getAnchor(),\n text: item.getText(),\n formatting: this.getStandardHyperlinkFormatting(),\n tooltip: item.getTooltip(),\n relationshipId: item.getRelationshipId(),\n });\n mergedContent.push(resetHyperlink);\n contentChanged = true;\n } else {\n mergedContent.push(item);\n }\n }\n i = j;\n } else {\n // Not a hyperlink, keep as-is\n mergedContent.push(item);\n i++;\n }\n }\n\n // Update paragraph content only if we actually changed something\n if (contentChanged) {\n // Clear current content\n paragraph.clearContent();\n\n // Add merged content back\n for (const item of mergedContent) {\n if (item instanceof Hyperlink) {\n paragraph.addHyperlink(item);\n } else if (item instanceof Run) {\n paragraph.addRun(item);\n } else if (item instanceof Field) {\n paragraph.addField(item);\n } else {\n // Preserve all other content types: Revision, RangeMarker, Shape, TextBox, PreservedElement\n paragraph.addContent(item);\n }\n }\n }\n }\n\n /**\n * Get standard hyperlink formatting (blue, underline)\n * @private\n */\n private getStandardHyperlinkFormatting(): any {\n return {\n color: '0000FF', // Standard hyperlink blue\n underline: 'single',\n };\n }\n\n /**\n * Parses a simple field (w:fldSimple) from XML object\n * @param fieldObj - Field XML object\n * @returns Parsed Field or null if parsing fails\n * @private\n */\n private parseSimpleFieldFromObject(fieldObj: any): Field | null {\n try {\n // Extract field instruction from w:instr attribute\n const instruction = fieldObj['@_w:instr'];\n if (!instruction) {\n return null;\n }\n\n // Extract field type from instruction (first word)\n const typeMatch = instruction.trim().match(/^(\\w+)/);\n const type = (typeMatch?.[1] || 'PAGE') as import('../elements/Field').FieldType;\n\n // Parse run formatting from w:rPr if present\n let formatting: RunFormatting | undefined;\n if (fieldObj['w:rPr']) {\n const tempRun = new Run('');\n this.parseRunPropertiesFromObject(fieldObj['w:rPr'], tempRun);\n formatting = tempRun.getFormatting();\n }\n\n // Create field with instruction\n const field = Field.create({\n type,\n instruction,\n formatting,\n });\n\n return field;\n } catch (error: unknown) {\n defaultLogger.warn(\n '[DocumentParser] Failed to parse field:',\n error instanceof Error\n ? { message: error.message, stack: error.stack }\n : { error: String(error) }\n );\n return null;\n }\n }\n\n private parseRunPropertiesFromObject(rPrObj: any, run: Run): void {\n if (!rPrObj) return;\n\n // Parse character style reference (w:rStyle) per ECMA-376 Part 1 §17.3.2.36\n if (rPrObj['w:rStyle']) {\n const styleId = rPrObj['w:rStyle']['@_w:val'];\n if (styleId) {\n run.setCharacterStyle(styleId);\n }\n }\n\n // Parse text border (w:bdr) per ECMA-376 Part 1 §17.3.2.5\n if (rPrObj['w:bdr']) {\n const bdr = rPrObj['w:bdr'];\n const border: any = {};\n if (bdr['@_w:val']) border.style = bdr['@_w:val'];\n if (bdr['@_w:sz']) border.size = parseInt(bdr['@_w:sz'], 10);\n if (bdr['@_w:color']) border.color = bdr['@_w:color'];\n if (bdr['@_w:space']) border.space = parseInt(bdr['@_w:space'], 10);\n if (Object.keys(border).length > 0) {\n run.setBorder(border);\n }\n }\n\n // Parse character shading (w:shd) per ECMA-376 Part 1 §17.3.2.32\n if (rPrObj['w:shd']) {\n const shading = this.parseShadingFromObj(rPrObj['w:shd']);\n if (shading) {\n run.setShading(shading);\n }\n }\n\n // Parse emphasis marks (w:em) per ECMA-376 Part 1 §17.3.2.13\n if (rPrObj['w:em']) {\n const val = rPrObj['w:em']['@_w:val'];\n if (val) run.setEmphasis(val);\n }\n\n // Parse outline text effect (w:outline) per ECMA-376 Part 1 §17.3.2.23\n if (rPrObj['w:outline']) run.setOutline(true);\n\n // Parse shadow text effect (w:shadow) per ECMA-376 Part 1 §17.3.2.32\n if (rPrObj['w:shadow']) run.setShadow(true);\n\n // Parse emboss text effect (w:emboss) per ECMA-376 Part 1 §17.3.2.13\n if (rPrObj['w:emboss']) run.setEmboss(true);\n\n // Parse imprint text effect (w:imprint) per ECMA-376 Part 1 §17.3.2.18\n if (rPrObj['w:imprint']) run.setImprint(true);\n\n // Parse no proofing (w:noProof) per ECMA-376 Part 1 §17.3.2.21\n if (rPrObj['w:noProof']) run.setNoProof(true);\n\n // Parse snap to grid (w:snapToGrid) per ECMA-376 Part 1 §17.3.2.35\n if (rPrObj['w:snapToGrid']) run.setSnapToGrid(true);\n\n // Parse vanish/hidden (w:vanish) per ECMA-376 Part 1 §17.3.2.42\n if (rPrObj['w:vanish']) run.setVanish(true);\n\n // Parse special vanish (w:specVanish) per ECMA-376 Part 1 §17.3.2.36\n if (rPrObj['w:specVanish']) run.setSpecVanish(true);\n\n // Boolean properties - use parseOoxmlBoolean helper\n // Per ECMA-376: <w:b/> or <w:b w:val=\"1\"/> or <w:b w:val=\"true\"/> means true\n // <w:b w:val=\"0\"/> or <w:b w:val=\"false\"/> means false (omit from document)\n\n // Parse RTL text (w:rtl) per ECMA-376 Part 1 §17.3.2.30\n if (parseOoxmlBoolean(rPrObj['w:rtl'])) run.setRTL(true);\n\n if (parseOoxmlBoolean(rPrObj['w:b'])) run.setBold(true);\n if (parseOoxmlBoolean(rPrObj['w:bCs'])) run.setComplexScriptBold(true);\n if (parseOoxmlBoolean(rPrObj['w:i'])) run.setItalic(true);\n if (parseOoxmlBoolean(rPrObj['w:iCs'])) run.setComplexScriptItalic(true);\n if (parseOoxmlBoolean(rPrObj['w:strike'])) run.setStrike(true);\n if (parseOoxmlBoolean(rPrObj['w:dstrike'])) {\n (run as any).formatting.dstrike = true;\n }\n if (parseOoxmlBoolean(rPrObj['w:smallCaps'])) run.setSmallCaps(true);\n if (parseOoxmlBoolean(rPrObj['w:caps'])) run.setAllCaps(true);\n\n // Parse complex script flag (w:cs) per ECMA-376 Part 1 §17.3.2.7\n if (parseOoxmlBoolean(rPrObj['w:cs'])) run.setComplexScript(true);\n\n // Parse web hidden (w:webHidden) per ECMA-376 Part 1 §17.3.2.44\n if (parseOoxmlBoolean(rPrObj['w:webHidden'])) run.setWebHidden(true);\n\n if (rPrObj['w:u']) {\n // XMLParser adds @_ prefix to attributes\n const uVal = rPrObj['w:u']['@_w:val'];\n run.setUnderline(uVal || true);\n // Parse underline color attributes per ECMA-376 Part 1 §17.3.2.40\n const uColor = rPrObj['w:u']['@_w:color'];\n if (uColor) run.setUnderlineColor(uColor);\n const uThemeColor = rPrObj['w:u']['@_w:themeColor'];\n if (uThemeColor)\n run.setUnderlineThemeColor(\n uThemeColor,\n rPrObj['w:u']['@_w:themeTint'] ? parseInt(rPrObj['w:u']['@_w:themeTint'], 16) : undefined,\n rPrObj['w:u']['@_w:themeShade']\n ? parseInt(rPrObj['w:u']['@_w:themeShade'], 16)\n : undefined\n );\n }\n\n // Parse character spacing (w:spacing) per ECMA-376 Part 1 §17.3.2.33\n if (rPrObj['w:spacing']) {\n const val = rPrObj['w:spacing']['@_w:val'];\n if (val) run.setCharacterSpacing(parseInt(val, 10));\n }\n\n // Parse horizontal scaling (w:w) per ECMA-376 Part 1 §17.3.2.43\n if (rPrObj['w:w']) {\n const val = rPrObj['w:w']['@_w:val'];\n if (val) run.setScaling(parseInt(val, 10));\n }\n\n // Parse vertical position (w:position) per ECMA-376 Part 1 §17.3.2.31\n if (rPrObj['w:position']) {\n const val = rPrObj['w:position']['@_w:val'];\n if (val) run.setPosition(parseInt(val, 10));\n }\n\n // Parse kerning (w:kern) per ECMA-376 Part 1 §17.3.2.20\n if (rPrObj['w:kern']) {\n const val = rPrObj['w:kern']['@_w:val'];\n if (val) run.setKerning(parseInt(val, 10));\n }\n\n // Parse language (w:lang) per ECMA-376 Part 1 §17.3.2.20\n if (rPrObj['w:lang']) {\n const val = rPrObj['w:lang']['@_w:val'];\n if (val) run.setLanguage(val);\n }\n\n // Parse East Asian layout (w:eastAsianLayout) per ECMA-376 Part 1 §17.3.2.10\n if (rPrObj['w:eastAsianLayout']) {\n const layoutObj = rPrObj['w:eastAsianLayout'];\n const layout: any = {};\n if (layoutObj['@_w:id'] !== undefined) layout.id = Number(layoutObj['@_w:id']);\n if (layoutObj['@_w:vert']) layout.vert = true;\n if (layoutObj['@_w:vertCompress']) layout.vertCompress = true;\n if (layoutObj['@_w:combine']) layout.combine = true;\n if (layoutObj['@_w:combineBrackets'])\n layout.combineBrackets = layoutObj['@_w:combineBrackets'];\n\n if (Object.keys(layout).length > 0) {\n run.setEastAsianLayout(layout);\n }\n }\n\n // Parse fit text (w:fitText) per ECMA-376 Part 1 §17.3.2.15\n if (rPrObj['w:fitText']) {\n const val = rPrObj['w:fitText']['@_w:val'];\n if (val !== undefined) run.setFitText(Number(val));\n }\n\n // Parse text effect (w:effect) per ECMA-376 Part 1 §17.3.2.12\n if (rPrObj['w:effect']) {\n const val = rPrObj['w:effect']['@_w:val'];\n if (val) run.setEffect(val);\n }\n\n if (rPrObj['w:vertAlign']) {\n const val = rPrObj['w:vertAlign']['@_w:val'];\n if (val === 'subscript') run.setSubscript(true);\n if (val === 'superscript') run.setSuperscript(true);\n }\n\n if (rPrObj['w:rFonts']) {\n const rFonts = rPrObj['w:rFonts'];\n if (rFonts['@_w:ascii']) run.setFont(rFonts['@_w:ascii']);\n // Parse additional font variants per ECMA-376 Part 1 §17.3.2.26\n if (rFonts['@_w:hAnsi']) run.setFontHAnsi(rFonts['@_w:hAnsi']);\n if (rFonts['@_w:eastAsia']) run.setFontEastAsia(rFonts['@_w:eastAsia']);\n if (rFonts['@_w:cs']) run.setFontCs(rFonts['@_w:cs']);\n if (rFonts['@_w:hint']) run.setFontHint(rFonts['@_w:hint']);\n // Parse theme font references per ECMA-376 Part 1 §17.3.2.26\n if (rFonts['@_w:asciiTheme']) run.setFontAsciiTheme(rFonts['@_w:asciiTheme']);\n if (rFonts['@_w:hAnsiTheme']) run.setFontHAnsiTheme(rFonts['@_w:hAnsiTheme']);\n if (rFonts['@_w:eastAsiaTheme']) run.setFontEastAsiaTheme(rFonts['@_w:eastAsiaTheme']);\n if (rFonts['@_w:cstheme']) run.setFontCsTheme(rFonts['@_w:cstheme']);\n }\n\n if (rPrObj['w:sz']) {\n run.setSize(halfPointsToPoints(parseInt(rPrObj['w:sz']['@_w:val'], 10)));\n }\n\n // Parse complex script font size (w:szCs) per ECMA-376 Part 1 §17.3.2.40\n // This is separate from regular size to support RTL languages\n if (rPrObj['w:szCs']) {\n const szCsVal = halfPointsToPoints(parseInt(rPrObj['w:szCs']['@_w:val'], 10));\n // Only set sizeCs if it differs from size (to avoid redundant storage)\n // When sz is not present (undefined), always store szCs\n const sizeVal = rPrObj['w:sz']\n ? halfPointsToPoints(parseInt(rPrObj['w:sz']['@_w:val'], 10))\n : undefined;\n if (sizeVal === undefined || szCsVal !== sizeVal) {\n run.setSizeCs(szCsVal);\n }\n }\n\n if (rPrObj['w:color']) {\n const colorObj = rPrObj['w:color'];\n const colorVal = colorObj['@_w:val'];\n // Skip special OOXML values like \"auto\" (automatic/inherit from style)\n // \"auto\" is a valid OOXML color that means inherit - not a hex color\n if (colorVal && colorVal !== 'auto') {\n run.setColor(colorVal);\n }\n // Parse theme color attributes per ECMA-376 Part 1 Section 17.3.2.6\n if (colorObj['@_w:themeColor']) {\n run.setThemeColor(colorObj['@_w:themeColor']);\n }\n if (colorObj['@_w:themeTint']) {\n // Theme tint is stored as hex string, convert to number\n run.setThemeTint(parseInt(colorObj['@_w:themeTint'], 16));\n }\n if (colorObj['@_w:themeShade']) {\n // Theme shade is stored as hex string, convert to number\n run.setThemeShade(parseInt(colorObj['@_w:themeShade'], 16));\n }\n }\n\n if (rPrObj['w:highlight']) {\n run.setHighlight(rPrObj['w:highlight']['@_w:val']);\n }\n\n // Collect w14: namespace elements from rPr for passthrough (Word 2010+ text effects)\n // w14:textOutline, w14:shadow, w14:reflection, w14:glow, w14:ligatures,\n // w14:numForm, w14:numSpacing, w14:cntxtAlts, w14:stylisticSets\n for (const key of Object.keys(rPrObj)) {\n if (key.startsWith('w14:')) {\n const rawXml = this.objectToXml({ [key]: rPrObj[key] });\n if (rawXml) {\n run.addRawW14Property(rawXml);\n }\n }\n }\n\n // Parse run property change tracking (w:rPrChange) per ECMA-376 Part 1 §17.13.5.30\n // This records what the run formatting was BEFORE a change was made\n if (rPrObj['w:rPrChange']) {\n const changeObj = rPrObj['w:rPrChange'];\n const propChange: import('../elements/PropertyChangeTypes').RunPropertyChange = {\n id: changeObj['@_w:id'] !== undefined ? parseInt(String(changeObj['@_w:id']), 10) : 0,\n author: changeObj['@_w:author'] ? String(changeObj['@_w:author']) : '',\n date: changeObj['@_w:date'] ? new Date(String(changeObj['@_w:date'])) : new Date(),\n previousProperties: {},\n };\n\n // Parse previous run properties from child w:rPr element\n if (changeObj['w:rPr']) {\n const prevRPr = changeObj['w:rPr'];\n const prevProps: Partial<import('../elements/Run').RunFormatting> = {};\n\n // Parse previous bold\n if (prevRPr['w:b']) {\n prevProps.bold = parseOoxmlBoolean(prevRPr['w:b']);\n }\n\n // Parse previous italic\n if (prevRPr['w:i']) {\n prevProps.italic = parseOoxmlBoolean(prevRPr['w:i']);\n }\n\n // Parse previous underline\n if (prevRPr['w:u']) {\n const uVal = prevRPr['w:u']['@_w:val'];\n prevProps.underline = uVal || true;\n }\n\n // Parse previous strikethrough\n if (prevRPr['w:strike']) {\n prevProps.strike = parseOoxmlBoolean(prevRPr['w:strike']);\n }\n\n // Parse previous font (all w:rFonts attributes per ECMA-376 Part 1 §17.3.2.26)\n if (prevRPr['w:rFonts']) {\n const rFonts = prevRPr['w:rFonts'];\n if (rFonts['@_w:ascii']) prevProps.font = rFonts['@_w:ascii'];\n if (rFonts['@_w:hAnsi']) prevProps.fontHAnsi = rFonts['@_w:hAnsi'];\n if (rFonts['@_w:eastAsia']) prevProps.fontEastAsia = rFonts['@_w:eastAsia'];\n if (rFonts['@_w:cs']) prevProps.fontCs = rFonts['@_w:cs'];\n if (rFonts['@_w:hint']) prevProps.fontHint = rFonts['@_w:hint'];\n }\n\n // Parse previous size (half-points to points)\n if (prevRPr['w:sz']) {\n prevProps.size = halfPointsToPoints(safeParseInt(prevRPr['w:sz']['@_w:val']));\n }\n\n // Parse previous complex script size (w:szCs) per ECMA-376 Part 1 §17.3.2.40\n if (prevRPr['w:szCs']) {\n const szCsVal = halfPointsToPoints(safeParseInt(prevRPr['w:szCs']['@_w:val']));\n // Only store if different from regular size\n if (!prevRPr['w:sz'] || szCsVal !== prevProps.size) {\n prevProps.sizeCs = szCsVal;\n }\n }\n\n // Parse previous color (per ECMA-376 Part 1 Section 17.3.2.6)\n if (prevRPr['w:color']) {\n const colorObj = prevRPr['w:color'];\n const colorVal = colorObj['@_w:val'];\n if (colorVal && colorVal !== 'auto') {\n prevProps.color = colorVal;\n }\n // Parse theme color attributes\n if (colorObj['@_w:themeColor']) {\n prevProps.themeColor = colorObj['@_w:themeColor'];\n }\n if (colorObj['@_w:themeTint']) {\n prevProps.themeTint = parseInt(colorObj['@_w:themeTint'], 16);\n }\n if (colorObj['@_w:themeShade']) {\n prevProps.themeShade = parseInt(colorObj['@_w:themeShade'], 16);\n }\n }\n\n // Parse previous highlight\n if (prevRPr['w:highlight']) {\n prevProps.highlight = prevRPr['w:highlight']['@_w:val'];\n }\n\n // Parse previous subscript/superscript\n if (prevRPr['w:vertAlign']) {\n const val = prevRPr['w:vertAlign']['@_w:val'];\n if (val === 'subscript') prevProps.subscript = true;\n if (val === 'superscript') prevProps.superscript = true;\n }\n\n // Parse previous smallCaps/allCaps\n if (prevRPr['w:smallCaps']) {\n prevProps.smallCaps = parseOoxmlBoolean(prevRPr['w:smallCaps']);\n }\n if (prevRPr['w:caps']) {\n prevProps.allCaps = parseOoxmlBoolean(prevRPr['w:caps']);\n }\n\n // === Extended run property parsing per ECMA-376 Part 1 §17.3.2 ===\n\n // Parse double strikethrough (w:dstrike)\n if (prevRPr['w:dstrike']) {\n prevProps.dstrike = parseOoxmlBoolean(prevRPr['w:dstrike']);\n }\n\n // Parse text effects (w:outline, w:shadow, w:emboss, w:imprint)\n if (prevRPr['w:outline']) {\n prevProps.outline = parseOoxmlBoolean(prevRPr['w:outline']);\n }\n if (prevRPr['w:shadow']) {\n prevProps.shadow = parseOoxmlBoolean(prevRPr['w:shadow']);\n }\n if (prevRPr['w:emboss']) {\n prevProps.emboss = parseOoxmlBoolean(prevRPr['w:emboss']);\n }\n if (prevRPr['w:imprint']) {\n prevProps.imprint = parseOoxmlBoolean(prevRPr['w:imprint']);\n }\n\n // Parse vanish/hidden text (w:vanish, w:specVanish)\n if (prevRPr['w:vanish']) {\n prevProps.vanish = parseOoxmlBoolean(prevRPr['w:vanish']);\n }\n if (prevRPr['w:specVanish']) {\n prevProps.specVanish = parseOoxmlBoolean(prevRPr['w:specVanish']);\n }\n\n // Parse web hidden (w:webHidden) per ECMA-376 Part 1 §17.3.2.44\n if (prevRPr['w:webHidden']) {\n prevProps.webHidden = parseOoxmlBoolean(prevRPr['w:webHidden']);\n }\n\n // Parse RTL and no-proofing (w:rtl, w:noProof)\n if (prevRPr['w:rtl']) {\n prevProps.rtl = parseOoxmlBoolean(prevRPr['w:rtl']);\n }\n if (prevRPr['w:noProof']) {\n prevProps.noProof = parseOoxmlBoolean(prevRPr['w:noProof']);\n }\n\n // Parse snap to grid (w:snapToGrid)\n if (prevRPr['w:snapToGrid']) {\n prevProps.snapToGrid = parseOoxmlBoolean(prevRPr['w:snapToGrid']);\n }\n\n // Parse complex script bold/italic (w:bCs, w:iCs)\n if (prevRPr['w:bCs']) {\n prevProps.complexScriptBold = parseOoxmlBoolean(prevRPr['w:bCs']);\n }\n if (prevRPr['w:iCs']) {\n prevProps.complexScriptItalic = parseOoxmlBoolean(prevRPr['w:iCs']);\n }\n\n // Parse complex script flag (w:cs) per ECMA-376 Part 1 §17.3.2.7\n if (prevRPr['w:cs']) {\n prevProps.complexScript = parseOoxmlBoolean(prevRPr['w:cs']);\n }\n\n // Parse character spacing (w:spacing @w:val in twips)\n if (prevRPr['w:spacing']) {\n const spacingVal = prevRPr['w:spacing']['@_w:val'];\n if (spacingVal !== undefined) {\n prevProps.characterSpacing = safeParseInt(spacingVal);\n }\n }\n\n // Parse horizontal scaling (w:w @w:val as percentage)\n if (prevRPr['w:w']) {\n const scaleVal = prevRPr['w:w']['@_w:val'];\n if (scaleVal !== undefined) {\n prevProps.scaling = safeParseInt(scaleVal);\n }\n }\n\n // Parse vertical position (w:position @w:val in half-points)\n if (prevRPr['w:position']) {\n const posVal = prevRPr['w:position']['@_w:val'];\n if (posVal !== undefined) {\n prevProps.position = safeParseInt(posVal);\n }\n }\n\n // Parse kerning threshold (w:kern @w:val in half-points)\n if (prevRPr['w:kern']) {\n const kernVal = prevRPr['w:kern']['@_w:val'];\n if (kernVal !== undefined) {\n prevProps.kerning = safeParseInt(kernVal);\n }\n }\n\n // Parse language (w:lang @w:val)\n if (prevRPr['w:lang']) {\n const langVal = prevRPr['w:lang']['@_w:val'];\n if (langVal) {\n prevProps.language = String(langVal);\n }\n }\n\n // Parse character style reference (w:rStyle @w:val)\n if (prevRPr['w:rStyle']) {\n const styleVal = prevRPr['w:rStyle']['@_w:val'];\n if (styleVal) {\n prevProps.characterStyle = String(styleVal);\n }\n }\n\n // Parse text effect/animation (w:effect @w:val)\n if (prevRPr['w:effect']) {\n const effectVal = prevRPr['w:effect']['@_w:val'];\n if (effectVal) {\n prevProps.effect = effectVal as RunFormatting['effect'];\n }\n }\n\n // Parse fit text width (w:fitText @w:val in twips)\n if (prevRPr['w:fitText']) {\n const fitVal = prevRPr['w:fitText']['@_w:val'];\n if (fitVal !== undefined) {\n prevProps.fitText = safeParseInt(fitVal);\n }\n }\n\n // Parse emphasis mark (w:em @w:val)\n if (prevRPr['w:em']) {\n const emVal = prevRPr['w:em']['@_w:val'];\n if (emVal) {\n prevProps.emphasis = emVal as RunFormatting['emphasis'];\n }\n }\n\n // Parse text border (w:bdr) per ECMA-376 Part 1 §17.3.2.4\n // Maps to TextBorder interface: style, size, color, space\n if (prevRPr['w:bdr']) {\n const bdrObj = prevRPr['w:bdr'];\n prevProps.border = {\n style: bdrObj['@_w:val'] as import('../elements/Run').TextBorderStyle,\n size: bdrObj['@_w:sz'] !== undefined ? safeParseInt(bdrObj['@_w:sz']) : undefined,\n space:\n bdrObj['@_w:space'] !== undefined ? safeParseInt(bdrObj['@_w:space']) : undefined,\n color: bdrObj['@_w:color'],\n };\n }\n\n // Parse character shading (w:shd) per ECMA-376 Part 1 §17.3.2.32\n if (prevRPr['w:shd']) {\n const shading = this.parseShadingFromObj(prevRPr['w:shd']);\n if (shading) {\n prevProps.shading = shading;\n }\n }\n\n // Parse East Asian layout (w:eastAsianLayout) per ECMA-376 Part 1 §17.3.2.10\n if (prevRPr['w:eastAsianLayout']) {\n const eaObj = prevRPr['w:eastAsianLayout'];\n prevProps.eastAsianLayout = {\n id: eaObj['@_w:id'] !== undefined ? safeParseInt(eaObj['@_w:id']) : undefined,\n combine: eaObj['@_w:combine']\n ? parseOoxmlBoolean({ '@_w:val': eaObj['@_w:combine'] })\n : undefined,\n combineBrackets: eaObj['@_w:combineBrackets'],\n vert: eaObj['@_w:vert']\n ? parseOoxmlBoolean({ '@_w:val': eaObj['@_w:vert'] })\n : undefined,\n vertCompress: eaObj['@_w:vertCompress']\n ? parseOoxmlBoolean({ '@_w:val': eaObj['@_w:vertCompress'] })\n : undefined,\n };\n }\n\n propChange.previousProperties = prevProps;\n }\n\n run.setPropertyChangeRevision(propChange);\n }\n }\n\n private async parseDrawingFromObject(\n drawingObj: any,\n zipHandler: ZipHandler,\n relationshipManager: RelationshipManager,\n imageManager: ImageManager\n ): Promise<ImageRun | null> {\n const logger = getLogger();\n try {\n // Drawing can contain either wp:inline (inline image) or wp:anchor (floating image)\n const inlineObj = drawingObj['wp:inline'];\n const anchorObj = drawingObj['wp:anchor'];\n const imageObj = inlineObj || anchorObj;\n\n if (!imageObj) {\n logger.debug('Drawing found but no wp:inline or wp:anchor element');\n return null;\n }\n\n const isFloating = !!anchorObj;\n\n // Extract dimensions from wp:extent\n const extentObj = imageObj['wp:extent'];\n let width = 0;\n let height = 0;\n if (extentObj) {\n width = parseInt(extentObj['@_cx'] || '0', 10);\n height = parseInt(extentObj['@_cy'] || '0', 10);\n }\n\n // Extract effect extent\n const effectExtentObj = imageObj['wp:effectExtent'];\n let effectExtent = undefined;\n if (effectExtentObj) {\n effectExtent = {\n left: parseInt(effectExtentObj['@_l'] || '0', 10),\n top: parseInt(effectExtentObj['@_t'] || '0', 10),\n right: parseInt(effectExtentObj['@_r'] || '0', 10),\n bottom: parseInt(effectExtentObj['@_b'] || '0', 10),\n };\n }\n\n // --- Group A: Parse inline dist attributes ---\n let inlineDistT = 0;\n let inlineDistB = 0;\n let inlineDistL = 0;\n let inlineDistR = 0;\n if (inlineObj) {\n const toInt = (v: any) =>\n v !== undefined && v !== null ? parseInt(String(v), 10) || 0 : 0;\n inlineDistT = toInt(inlineObj['@_distT']);\n inlineDistB = toInt(inlineObj['@_distB']);\n inlineDistL = toInt(inlineObj['@_distL']);\n inlineDistR = toInt(inlineObj['@_distR']);\n }\n\n // Extract name, description, title, hidden, and ID from wp:docPr\n const docPrObj = imageObj['wp:docPr'];\n let name = 'image';\n let description = 'Image';\n let title: string | undefined = undefined;\n let docPrId = 1;\n let hidden = false;\n if (docPrObj) {\n name = docPrObj['@_name'] || 'image';\n description = docPrObj['@_descr'] || 'Image';\n if (docPrObj['@_title']) {\n title = String(docPrObj['@_title']);\n }\n const idAttr = docPrObj['@_id'];\n if (idAttr) {\n docPrId = parseInt(String(idAttr), 10);\n }\n // Group A: hidden attribute\n if (\n docPrObj['@_hidden'] === '1' ||\n docPrObj['@_hidden'] === 1 ||\n docPrObj['@_hidden'] === true\n ) {\n hidden = true;\n }\n }\n\n // --- Group A: Parse noChangeAspect from wp:cNvGraphicFramePr ---\n let noChangeAspect = true; // default\n const cNvGfPrObj = imageObj['wp:cNvGraphicFramePr'];\n if (cNvGfPrObj) {\n const gfLocks = cNvGfPrObj['a:graphicFrameLocks'];\n if (gfLocks) {\n const val = gfLocks['@_noChangeAspect'];\n noChangeAspect = val === '1' || val === 1 || val === true;\n }\n }\n\n // Parse wrap settings (for floating images)\n let wrap = undefined;\n if (isFloating) {\n wrap = this.parseWrapSettings(anchorObj);\n }\n\n // Parse position (for floating images)\n let position = undefined;\n if (isFloating) {\n position = this.parseImagePosition(anchorObj);\n }\n\n // Parse anchor configuration (for floating images)\n let anchor = undefined;\n if (isFloating && anchorObj) {\n const toBool = (val: any) => val === '1' || val === 1 || val === true;\n const toOptInt = (val: any): number | undefined => {\n if (val === undefined || val === null) return undefined;\n const n = parseInt(String(val), 10);\n return isNaN(n) ? undefined : n;\n };\n\n anchor = {\n behindDoc: toBool(anchorObj['@_behindDoc']),\n locked: toBool(anchorObj['@_locked']),\n layoutInCell: toBool(anchorObj['@_layoutInCell']),\n allowOverlap: toBool(anchorObj['@_allowOverlap']),\n relativeHeight: parseInt(anchorObj['@_relativeHeight'] || '251658240', 10),\n simplePos: toBool(anchorObj['@_simplePos']),\n distT: toOptInt(anchorObj['@_distT']),\n distB: toOptInt(anchorObj['@_distB']),\n distL: toOptInt(anchorObj['@_distL']),\n distR: toOptInt(anchorObj['@_distR']),\n };\n\n // Also check anchor hidden attribute\n if (\n anchorObj['@_hidden'] === '1' ||\n anchorObj['@_hidden'] === 1 ||\n anchorObj['@_hidden'] === true\n ) {\n hidden = true;\n }\n }\n\n // Navigate through the graphic structure to find the relationship ID\n const graphicObj = imageObj['a:graphic'];\n if (!graphicObj) return null;\n const graphicDataObj = graphicObj['a:graphicData'];\n if (!graphicDataObj) return null;\n const picPicObj = graphicDataObj['pic:pic'];\n if (!picPicObj) return null;\n const blipFillObj = picPicObj['pic:blipFill'];\n if (!blipFillObj) return null;\n const blipObj = blipFillObj['a:blip'];\n if (!blipObj) return null;\n\n // Parse crop settings\n const crop = this.parseImageCrop(blipFillObj);\n\n // Parse effects (includes transparency via a:alphaModFix)\n const effects = this.parseImageEffects(blipObj);\n\n // --- Group A: Parse blip attributes ---\n const compressionState = blipObj['@_cstate'] || 'none';\n\n // --- Group A: Parse blipFill attributes ---\n const blipFillDpi =\n blipFillObj['@_dpi'] !== undefined ? parseInt(String(blipFillObj['@_dpi']), 10) : undefined;\n let blipFillRotWithShape: boolean | undefined;\n if (blipFillObj['@_rotWithShape'] !== undefined) {\n const rws = blipFillObj['@_rotWithShape'];\n blipFillRotWithShape = rws === '1' || rws === 1 || rws === true;\n }\n\n // --- Group A: Parse pic:nvPicPr (non-visual properties and locks) ---\n const nvPicPrObj = picPicObj['pic:nvPicPr'];\n let picNonVisualProps = { id: '0', name: '', descr: '' };\n let picLocks: Record<string, boolean> = { noChangeAspect: true, noChangeArrowheads: true };\n if (nvPicPrObj) {\n const cNvPr = nvPicPrObj['pic:cNvPr'];\n if (cNvPr) {\n picNonVisualProps = {\n id: String(cNvPr['@_id'] ?? '0'),\n name: String(cNvPr['@_name'] ?? ''),\n descr: String(cNvPr['@_descr'] ?? ''),\n };\n }\n const cNvPicPr = nvPicPrObj['pic:cNvPicPr'];\n if (cNvPicPr) {\n const locks = cNvPicPr['a:picLocks'];\n if (locks) {\n picLocks = {};\n const lockAttrs = [\n 'noChangeAspect',\n 'noChangeArrowheads',\n 'noSelect',\n 'noMove',\n 'noResize',\n 'noEditPoints',\n 'noAdjustHandles',\n 'noRot',\n 'noChangeShapeType',\n 'noCrop',\n 'noGrp',\n ];\n for (const attr of lockAttrs) {\n const val = locks[`@_${attr}`];\n if (val === '1' || val === 1 || val === true) {\n picLocks[attr] = true;\n }\n }\n }\n }\n }\n\n // --- Group A & C: Parse pic:spPr (shape properties) ---\n const spPrObj = picPicObj['pic:spPr'];\n let border: any = undefined;\n let rotation = 0;\n let flipH = false;\n let flipV = false;\n let presetGeometry = 'rect';\n let bwMode = 'auto';\n if (spPrObj) {\n // Group A: bwMode\n if (spPrObj['@_bwMode']) {\n bwMode = String(spPrObj['@_bwMode']);\n }\n\n // Group A: presetGeometry\n const prstGeom = spPrObj['a:prstGeom'];\n if (prstGeom?.['@_prst']) {\n presetGeometry = String(prstGeom['@_prst']);\n }\n\n // Group C: Enhanced border parsing (a:ln)\n const lnObj = spPrObj['a:ln'];\n if (lnObj) {\n const widthEmu = parseInt(lnObj['@_w'] || '0', 10);\n if (widthEmu > 0) {\n border = { width: widthEmu / 12700 } as any;\n // Parse additional a:ln attributes\n if (lnObj['@_cap']) border.cap = String(lnObj['@_cap']);\n if (lnObj['@_cmpd']) border.compound = String(lnObj['@_cmpd']);\n if (lnObj['@_algn']) border.alignment = String(lnObj['@_algn']);\n // Parse fill\n const solidFill = lnObj['a:solidFill'];\n if (solidFill) {\n const srgbClr = solidFill['a:srgbClr'];\n const schemeClr = solidFill['a:schemeClr'];\n if (srgbClr) {\n border.fill = { type: 'srgbClr', value: String(srgbClr['@_val'] || '') };\n border.fill.modifiers = this.parseColorModifiers(srgbClr);\n } else if (schemeClr) {\n border.fill = { type: 'schemeClr', value: String(schemeClr['@_val'] || '') };\n border.fill.modifiers = this.parseColorModifiers(schemeClr);\n }\n } else {\n // Non-solid fill — store as raw XML passthrough\n const fillKeys = ['a:gradFill', 'a:pattFill', 'a:noFill'];\n for (const fk of fillKeys) {\n if (lnObj[fk]) {\n border.rawFillXml = this.objectToXml({ [fk]: lnObj[fk] });\n break;\n }\n }\n }\n // Parse dash pattern\n const prstDash = lnObj['a:prstDash'];\n if (prstDash?.['@_val']) border.dashPattern = String(prstDash['@_val']);\n // Parse join\n if (lnObj['a:round']) border.join = 'round';\n else if (lnObj['a:bevel']) border.join = 'bevel';\n else if (lnObj['a:miter']) {\n border.join = 'miter';\n if (lnObj['a:miter']['@_lim'])\n border.miterLimit = parseInt(String(lnObj['a:miter']['@_lim']), 10);\n }\n // Parse head/tail end\n if (lnObj['a:headEnd']) {\n border.headEnd = {};\n if (lnObj['a:headEnd']['@_type'])\n border.headEnd.type = String(lnObj['a:headEnd']['@_type']);\n if (lnObj['a:headEnd']['@_w'])\n border.headEnd.width = String(lnObj['a:headEnd']['@_w']);\n if (lnObj['a:headEnd']['@_len'])\n border.headEnd.length = String(lnObj['a:headEnd']['@_len']);\n }\n if (lnObj['a:tailEnd']) {\n border.tailEnd = {};\n if (lnObj['a:tailEnd']['@_type'])\n border.tailEnd.type = String(lnObj['a:tailEnd']['@_type']);\n if (lnObj['a:tailEnd']['@_w'])\n border.tailEnd.width = String(lnObj['a:tailEnd']['@_w']);\n if (lnObj['a:tailEnd']['@_len'])\n border.tailEnd.length = String(lnObj['a:tailEnd']['@_len']);\n }\n }\n }\n\n // Parse rotation and flip from a:xfrm\n const xfrmObj = spPrObj['a:xfrm'];\n if (xfrmObj?.['@_rot']) {\n rotation = parseInt(xfrmObj['@_rot'], 10) / 60000;\n }\n if (\n xfrmObj?.['@_flipH'] === '1' ||\n xfrmObj?.['@_flipH'] === 1 ||\n xfrmObj?.['@_flipH'] === true\n ) {\n flipH = true;\n }\n if (\n xfrmObj?.['@_flipV'] === '1' ||\n xfrmObj?.['@_flipV'] === 1 ||\n xfrmObj?.['@_flipV'] === true\n ) {\n flipV = true;\n }\n }\n\n // --- Linked vs embedded image (r:embed or r:link) ---\n let relationshipId = blipObj['@_r:embed'];\n let isLinked = false;\n if (!relationshipId) {\n relationshipId = blipObj['@_r:link'];\n if (relationshipId) {\n isLinked = true;\n } else {\n logger.debug('Drawing has no r:embed or r:link relationship ID');\n return null;\n }\n }\n\n // --- SVG detection: asvg:svgBlip in a:extLst ---\n let svgRelationshipId: string | undefined;\n const blipExtLst = blipObj['a:extLst'];\n if (blipExtLst) {\n const exts = Array.isArray(blipExtLst['a:ext'])\n ? blipExtLst['a:ext']\n : blipExtLst['a:ext']\n ? [blipExtLst['a:ext']]\n : [];\n for (const ext of exts) {\n const svgBlip = ext?.['asvg:svgBlip'];\n if (svgBlip?.['@_r:embed']) {\n svgRelationshipId = String(svgBlip['@_r:embed']);\n }\n }\n }\n\n // Get the image from the relationship\n const partContext = this.currentPartName ? ` (part: ${this.currentPartName})` : '';\n\n let imageData: Buffer;\n let imagePath: string;\n let originalFilename: string | undefined;\n\n if (isLinked) {\n // Linked image: no data in package, create empty buffer\n imageData = Buffer.alloc(0);\n imagePath = '';\n originalFilename = undefined;\n } else {\n const relationship = relationshipManager.getRelationship(relationshipId);\n if (!relationship) {\n logger.warn(`Image relationship not found: ${relationshipId}${partContext}`);\n return null;\n }\n const imageTarget = relationship.getTarget();\n if (!imageTarget) {\n logger.warn(`Image relationship has no target: ${relationshipId}${partContext}`);\n return null;\n }\n imagePath = `word/${imageTarget}`;\n const data = zipHandler.getFileAsBuffer(imagePath);\n if (!data) {\n logger.warn(`Image file not found in ZIP: ${imagePath}${partContext}`);\n return null;\n }\n imageData = data;\n originalFilename = imageTarget.split('/').pop();\n }\n\n logger.debug(\n `Parsing image: ${imagePath || '(linked)'}, relId: ${relationshipId}${partContext}`\n );\n\n // Create image from buffer with all properties\n const { Image: ImageClass } = await import('../elements/Image');\n const image = await ImageClass.create({\n source: imageData,\n width,\n height,\n name,\n description,\n title,\n effectExtent,\n wrap,\n position,\n anchor,\n crop,\n effects,\n border,\n rotation,\n flipH,\n flipV,\n presetGeometry,\n compressionState,\n bwMode,\n inlineDistT,\n inlineDistB,\n inlineDistL,\n inlineDistR,\n noChangeAspect,\n hidden,\n blipFillDpi,\n blipFillRotWithShape,\n picLocks,\n picNonVisualProps,\n isLinked,\n svgRelationshipId,\n });\n\n // --- Group B: Collect raw passthrough for unmodeled XML subtrees ---\n // Blip effects (children of a:blip that aren't modeled)\n const blipEffectsRaw = this.collectUnmodeledChildren(blipObj, [\n 'a:lum',\n 'a:grayscl',\n 'a:alphaModFix',\n 'a:extLst',\n ]);\n if (blipEffectsRaw) image._setRawPassthrough('blip-effects', blipEffectsRaw);\n\n // Blip extLst (must come last per schema)\n if (blipExtLst && !svgRelationshipId) {\n // Only pass through if we're not already handling SVG\n const extLstXml = this.objectToXml({ 'a:extLst': blipExtLst });\n if (extLstXml) image._setRawPassthrough('blip-extLst', extLstXml);\n } else if (blipExtLst && svgRelationshipId) {\n // Preserve the full extLst including SVG ref\n const extLstXml = this.objectToXml({ 'a:extLst': blipExtLst });\n if (extLstXml) image._setRawPassthrough('blip-extLst', extLstXml);\n }\n\n // BlipFill extras (a:tile instead of a:stretch)\n if (blipFillObj['a:tile']) {\n const tileXml = this.objectToXml({ 'a:tile': blipFillObj['a:tile'] });\n if (tileXml) image._setRawPassthrough('blipFill-extra', tileXml);\n }\n\n // Geometry passthrough (a:custGeom, or prstGeom with non-empty avLst)\n if (spPrObj) {\n if (spPrObj['a:custGeom']) {\n const geomXml = this.objectToXml({ 'a:custGeom': spPrObj['a:custGeom'] });\n if (geomXml) image._setRawPassthrough('geometry', geomXml);\n } else if (spPrObj['a:prstGeom']) {\n const prstGeom = spPrObj['a:prstGeom'];\n const avLst = prstGeom['a:avLst'];\n // Check if avLst has actual children (not just empty element)\n if (\n avLst &&\n typeof avLst === 'object' &&\n Object.keys(avLst).some((k) => !k.startsWith('@_') && k !== '_orderedChildren')\n ) {\n const geomXml = this.objectToXml({ 'a:prstGeom': prstGeom });\n if (geomXml) image._setRawPassthrough('geometry', geomXml);\n }\n }\n\n // spPr effects passthrough (effectLst, effectDag, scene3d, sp3d, extLst)\n const spPrEffects = this.collectUnmodeledChildren(spPrObj, [\n 'a:xfrm',\n 'a:prstGeom',\n 'a:custGeom',\n 'a:noFill',\n 'a:solidFill',\n 'a:ln',\n ]);\n if (spPrEffects) image._setRawPassthrough('spPr-effects', spPrEffects);\n }\n\n // Wrap polygon passthrough\n if (isFloating) {\n const wrapTypes = ['wp:wrapTight', 'wp:wrapThrough'];\n for (const wt of wrapTypes) {\n const wrapObj = anchorObj[wt];\n if (wrapObj?.['wp:wrapPolygon']) {\n const polyXml = this.objectToXml({ 'wp:wrapPolygon': wrapObj['wp:wrapPolygon'] });\n if (polyXml) image._setRawPassthrough('wrap-polygon', polyXml);\n break;\n }\n }\n\n // Anchor extras (wp14:sizeRelH, wp14:sizeRelV)\n const anchorExtras = this.collectUnmodeledChildren(anchorObj, [\n 'wp:simplePos',\n 'wp:positionH',\n 'wp:positionV',\n 'wp:extent',\n 'wp:effectExtent',\n 'wp:wrapSquare',\n 'wp:wrapTight',\n 'wp:wrapThrough',\n 'wp:wrapTopAndBottom',\n 'wp:wrapNone',\n 'wp:docPr',\n 'wp:cNvGraphicFramePr',\n 'a:graphic',\n ]);\n if (anchorExtras) image._setRawPassthrough('anchor-extra', anchorExtras);\n }\n\n // DocPr extras (a:hlinkClick, a:hlinkHover, a:extLst)\n if (docPrObj) {\n const docPrExtras = this.collectUnmodeledChildren(docPrObj, []);\n if (docPrExtras) image._setRawPassthrough('docPr-extra', docPrExtras);\n }\n\n // cNvPr extras from pic:nvPicPr > pic:cNvPr\n if (nvPicPrObj?.['pic:cNvPr']) {\n const cNvPrExtras = this.collectUnmodeledChildren(nvPicPrObj['pic:cNvPr'], []);\n if (cNvPrExtras) image._setRawPassthrough('cNvPr-extra', cNvPrExtras);\n }\n\n // Register image\n if (!isLinked) {\n imageManager.registerImage(image, relationshipId, originalFilename, this.currentPartName);\n }\n image.setRelationshipId(relationshipId);\n image.setDocPrId(docPrId);\n\n logger.debug(\n `Image registered: ${originalFilename || '(linked)'}, relId: ${relationshipId}${partContext}`\n );\n\n return new ImageRun(image);\n } catch (error: unknown) {\n const partContext = this.currentPartName ? ` (part: ${this.currentPartName})` : '';\n logger.warn(\n `Failed to parse drawing${partContext}:`,\n error instanceof Error\n ? { message: error.message, stack: error.stack }\n : { error: String(error) }\n );\n return null;\n }\n }\n\n /**\n * Parses text wrap settings from anchor object\n * @private\n */\n private parseWrapSettings(anchorObj: any): any {\n // Check for different wrap types\n const wrapSquare = anchorObj['wp:wrapSquare'];\n const wrapTight = anchorObj['wp:wrapTight'];\n const wrapThrough = anchorObj['wp:wrapThrough'];\n const wrapTopBottom = anchorObj['wp:wrapTopAndBottom'];\n const wrapNone = anchorObj['wp:wrapNone'];\n\n const wrapObj = wrapSquare || wrapTight || wrapThrough || wrapTopBottom || wrapNone;\n if (!wrapObj) {\n return undefined;\n }\n\n // Determine wrap type\n let type: any = 'square';\n if (wrapTight) type = 'tight';\n else if (wrapThrough) type = 'through';\n else if (wrapTopBottom) type = 'topAndBottom';\n else if (wrapNone) type = 'none';\n\n return {\n type,\n side: wrapObj['@_wrapText'] || 'bothSides',\n // Distance attributes are on the wrap element, not the anchor\n distanceTop: wrapObj['@_distT'] ? parseInt(wrapObj['@_distT'], 10) : undefined,\n distanceBottom: wrapObj['@_distB'] ? parseInt(wrapObj['@_distB'], 10) : undefined,\n distanceLeft: wrapObj['@_distL'] ? parseInt(wrapObj['@_distL'], 10) : undefined,\n distanceRight: wrapObj['@_distR'] ? parseInt(wrapObj['@_distR'], 10) : undefined,\n };\n }\n\n /**\n * Parses image position from anchor object\n * @private\n */\n private parseImagePosition(anchorObj: any): any {\n const posH = anchorObj['wp:positionH'];\n const posV = anchorObj['wp:positionV'];\n\n if (!posH || !posV) {\n return undefined;\n }\n\n // Parse horizontal position\n const horizontal: any = {\n anchor: posH['@_relativeFrom'] || 'page',\n };\n\n if (posH['wp:posOffset']) {\n const offsetText = Array.isArray(posH['wp:posOffset'])\n ? posH['wp:posOffset'][0]\n : posH['wp:posOffset'];\n horizontal.offset = parseInt(\n typeof offsetText === 'string' ? offsetText : offsetText?.['#text'] || '0',\n 10\n );\n } else if (posH['wp:align']) {\n const alignText = Array.isArray(posH['wp:align']) ? posH['wp:align'][0] : posH['wp:align'];\n horizontal.alignment = typeof alignText === 'string' ? alignText : alignText?.['#text'];\n }\n\n // Parse vertical position\n const vertical: any = {\n anchor: posV['@_relativeFrom'] || 'page',\n };\n\n if (posV['wp:posOffset']) {\n const offsetText = Array.isArray(posV['wp:posOffset'])\n ? posV['wp:posOffset'][0]\n : posV['wp:posOffset'];\n vertical.offset = parseInt(\n typeof offsetText === 'string' ? offsetText : offsetText?.['#text'] || '0',\n 10\n );\n } else if (posV['wp:align']) {\n const alignText = Array.isArray(posV['wp:align']) ? posV['wp:align'][0] : posV['wp:align'];\n vertical.alignment = typeof alignText === 'string' ? alignText : alignText?.['#text'];\n }\n\n return { horizontal, vertical };\n }\n\n /**\n * Parses image crop from blip object\n * @private\n */\n private parseImageCrop(blipObj: any): any {\n const srcRect = blipObj['a:srcRect'];\n if (!srcRect) {\n return undefined;\n }\n\n return {\n left: parseInt(srcRect['@_l'] || '0', 10) / 1000, // Convert from per-mille to percentage\n top: parseInt(srcRect['@_t'] || '0', 10) / 1000,\n right: parseInt(srcRect['@_r'] || '0', 10) / 1000,\n bottom: parseInt(srcRect['@_b'] || '0', 10) / 1000,\n };\n }\n\n /**\n * Parses image effects from blip object\n * Per ECMA-376, effects are direct children of a:blip (not in a:extLst)\n * @private\n */\n private parseImageEffects(blipObj: any): any {\n const effects: any = {};\n\n // Look for lum (luminance) element for brightness/contrast\n // Per ECMA-376: a:lum is a direct child of a:blip with bright/contrast attributes\n const lum = blipObj['a:lum'];\n if (lum) {\n if (lum['@_bright']) {\n effects.brightness = parseInt(lum['@_bright'], 10) / 1000;\n }\n if (lum['@_contrast']) {\n effects.contrast = parseInt(lum['@_contrast'], 10) / 1000;\n }\n }\n\n // Check for grayscale (direct child of a:blip)\n if (blipObj['a:grayscl']) {\n effects.grayscale = true;\n }\n\n // Parse transparency via a:alphaModFix (ECMA-376 §20.1.8.4)\n const alphaModFix = blipObj['a:alphaModFix'];\n if (alphaModFix?.['@_amt'] !== undefined) {\n // amt is in 1/1000ths of percent (e.g., 50000 = 50% opacity = 50% transparency)\n const amt = parseInt(String(alphaModFix['@_amt']), 10);\n const transparency = Math.round(100 - amt / 1000);\n if (transparency > 0) {\n effects.transparency = transparency;\n }\n }\n\n return Object.keys(effects).length > 0 ? effects : undefined;\n }\n\n /**\n * Collects unmodeled children from a parsed XML object as raw XML strings.\n * Used for Group B passthrough — preserves XML subtrees that the framework\n * doesn't model, preventing data loss during round-trip.\n * @private\n */\n private collectUnmodeledChildren(parentObj: any, modeledKeys: string[]): string | null {\n if (!parentObj || typeof parentObj !== 'object') return null;\n const parts: string[] = [];\n for (const key of Object.keys(parentObj)) {\n if (key.startsWith('@_') || key === '#text' || key === '_orderedChildren') continue;\n if (modeledKeys.includes(key)) continue;\n const child = parentObj[key];\n if (Array.isArray(child)) {\n for (const item of child) {\n parts.push(this.objectToXml({ [key]: item }));\n }\n } else {\n parts.push(this.objectToXml({ [key]: child }));\n }\n }\n return parts.length > 0 ? parts.join('') : null;\n }\n\n /**\n * Parses color modifier children from a color element (a:srgbClr or a:schemeClr).\n * Returns array of { name, val } for modifiers like lumMod, lumOff, satMod, etc.\n * @private\n */\n private parseColorModifiers(colorObj: any): { name: string; val: string }[] | undefined {\n if (!colorObj || typeof colorObj !== 'object') return undefined;\n const modifiers: { name: string; val: string }[] = [];\n const modNames = ['a:lumMod', 'a:lumOff', 'a:satMod', 'a:shade', 'a:tint', 'a:alpha'];\n for (const mod of modNames) {\n const modObj = colorObj[mod];\n if (modObj?.['@_val'] !== undefined) {\n modifiers.push({ name: mod.replace('a:', ''), val: String(modObj['@_val']) });\n }\n }\n return modifiers.length > 0 ? modifiers : undefined;\n }\n\n /**\n * Parse a single border element from a parsed XML object.\n * Shared by table border and cell border parsing.\n */\n private parseBorderElement(borderObj: any): TableBorder | undefined {\n if (!borderObj) return undefined;\n const border: TableBorder = {\n style: (borderObj['@_w:val'] || 'single') as TableBorder['style'],\n };\n if (borderObj['@_w:sz'] !== undefined) border.size = safeParseInt(borderObj['@_w:sz']);\n if (borderObj['@_w:space'] !== undefined) border.space = safeParseInt(borderObj['@_w:space']);\n if (borderObj['@_w:color']) border.color = borderObj['@_w:color'];\n return border;\n }\n\n private async parseTableFromObject(\n tableObj: any,\n relationshipManager: RelationshipManager,\n zipHandler: ZipHandler,\n imageManager: ImageManager,\n rawTableXml?: string\n ): Promise<Table | null> {\n try {\n // Create empty table\n const table = new Table();\n\n // Parse table properties (w:tblPr)\n if (tableObj['w:tblPr']) {\n this.parseTablePropertiesFromObject(tableObj['w:tblPr'], table);\n }\n\n // Parse table grid (w:tblGrid) - column widths\n if (tableObj['w:tblGrid']?.['w:gridCol']) {\n const gridCols = tableObj['w:tblGrid']['w:gridCol'];\n const gridColArray = Array.isArray(gridCols) ? gridCols : [gridCols];\n const widths = gridColArray.map((col: any) => {\n const w = col['@_w:w'];\n // Use isExplicitlySet to properly handle 0 values\n return isExplicitlySet(w) ? safeParseInt(w, 2880) : 2880; // default to 2 inches\n });\n if (widths.length > 0) {\n table.setTableGrid(widths);\n }\n }\n\n // Parse table rows (w:tr)\n const rows = tableObj['w:tr'];\n const rowChildren = Array.isArray(rows) ? rows : rows ? [rows] : [];\n\n // Extract row XMLs from raw table XML if available\n let rowXmls: string[] = [];\n if (rawTableXml) {\n rowXmls = XMLParser.extractElements(rawTableXml, 'w:tr');\n }\n\n // Track row positions in raw XML for bookmarkEnd extraction between rows\n const rowPositions: { start: number; end: number }[] = [];\n if (rawTableXml) {\n let searchPos = 0;\n for (const rowXml of rowXmls) {\n const rowStart = rawTableXml.indexOf(rowXml, searchPos);\n if (rowStart !== -1) {\n rowPositions.push({\n start: rowStart,\n end: rowStart + rowXml.length,\n });\n searchPos = rowStart + rowXml.length;\n }\n }\n }\n\n for (let i = 0; i < rowChildren.length; i++) {\n const rowObj = rowChildren[i];\n const rawRowXml = i < rowXmls.length ? rowXmls[i] : undefined;\n\n const row = await this.parseTableRowFromObject(\n rowObj,\n relationshipManager,\n zipHandler,\n imageManager,\n rawRowXml\n );\n if (row) {\n table.addRow(row);\n\n // Check for bookmarkEnd elements AFTER this row (between rows)\n if (rawTableXml && i < rowPositions.length) {\n const currentRowEnd = rowPositions[i]?.end || 0;\n const nextRowStart =\n i + 1 < rowPositions.length ? rowPositions[i + 1]?.start : rawTableXml.length;\n\n if (nextRowStart && currentRowEnd < nextRowStart) {\n const betweenContent = rawTableXml.slice(currentRowEnd, nextRowStart);\n const bookmarkEnds = this.extractBookmarkEndsFromContent(betweenContent);\n\n if (bookmarkEnds.length > 0) {\n // Attach to last paragraph in last cell of this row\n const cells = row.getCells();\n const lastCell = cells[cells.length - 1];\n if (lastCell) {\n const paras = lastCell.getParagraphs();\n const lastPara = paras[paras.length - 1];\n if (lastPara) {\n for (const bookmark of bookmarkEnds) {\n lastPara.addBookmarkEnd(bookmark);\n }\n }\n }\n }\n }\n }\n }\n }\n\n // Note: StylesManager is injected by Document.parseDocument() after styles are loaded\n\n return table;\n } catch (error: unknown) {\n defaultLogger.warn(\n '[DocumentParser] Failed to parse table:',\n error instanceof Error\n ? { message: error.message, stack: error.stack }\n : { error: String(error) }\n );\n return null;\n }\n }\n\n /**\n * Parses table properties from XML object and applies to table\n */\n private parseTablePropertiesFromObject(tblPrObj: any, table: Table): void {\n if (!tblPrObj) return;\n\n // Parse table style reference (w:tblStyle)\n if (tblPrObj['w:tblStyle']) {\n const styleId = tblPrObj['w:tblStyle']['@_w:val'];\n if (styleId) {\n table.setStyle(styleId);\n }\n }\n\n // Parse table look flags (w:tblLook) - for conditional formatting\n // Supports both hex string format (w:val=\"04A0\") and individual attributes\n if (tblPrObj['w:tblLook']) {\n const look = tblPrObj['w:tblLook'];\n if (look['@_w:val']) {\n // Hex string format\n table.setTblLook(look['@_w:val']);\n } else {\n // Individual attribute format - construct hex value\n // Per ECMA-376: bit 0=firstRow, 1=lastRow, 2=firstCol, 3=lastCol, 4=noHBand, 5=noVBand\n let value = 0;\n if (look['@_w:firstRow'] === '1') value |= 0x0020;\n if (look['@_w:lastRow'] === '1') value |= 0x0040;\n if (look['@_w:firstColumn'] === '1') value |= 0x0080;\n if (look['@_w:lastColumn'] === '1') value |= 0x0100;\n if (look['@_w:noHBand'] === '1') value |= 0x0200;\n if (look['@_w:noVBand'] === '1') value |= 0x0400;\n table.setTblLook(value.toString(16).toUpperCase().padStart(4, '0'));\n }\n }\n\n // Parse table positioning (tblpPr) - for floating tables\n if (tblPrObj['w:tblpPr']) {\n const tblpPr = tblPrObj['w:tblpPr'];\n const position: any = {};\n\n if (tblpPr['@_w:tblpX']) position.x = parseInt(tblpPr['@_w:tblpX'], 10);\n if (tblpPr['@_w:tblpY']) position.y = parseInt(tblpPr['@_w:tblpY'], 10);\n if (tblpPr['@_w:horzAnchor']) position.horizontalAnchor = tblpPr['@_w:horzAnchor'];\n if (tblpPr['@_w:vertAnchor']) position.verticalAnchor = tblpPr['@_w:vertAnchor'];\n if (tblpPr['@_w:tblpXSpec']) position.horizontalAlignment = tblpPr['@_w:tblpXSpec'];\n if (tblpPr['@_w:tblpYSpec']) position.verticalAlignment = tblpPr['@_w:tblpYSpec'];\n if (tblpPr['@_w:leftFromText'])\n position.leftFromText = parseInt(tblpPr['@_w:leftFromText'], 10);\n if (tblpPr['@_w:rightFromText'])\n position.rightFromText = parseInt(tblpPr['@_w:rightFromText'], 10);\n if (tblpPr['@_w:topFromText']) position.topFromText = parseInt(tblpPr['@_w:topFromText'], 10);\n if (tblpPr['@_w:bottomFromText'])\n position.bottomFromText = parseInt(tblpPr['@_w:bottomFromText'], 10);\n\n if (Object.keys(position).length > 0) {\n table.setPosition(position);\n }\n }\n\n // Parse table overlap\n if (tblPrObj['w:tblOverlap']) {\n const val = tblPrObj['w:tblOverlap']['@_w:val'];\n table.setOverlap(val === 'overlap');\n }\n\n // Parse bidirectional visual layout\n if (tblPrObj['w:bidiVisual']) {\n table.setBidiVisual(true);\n }\n\n // Parse table width — always set when w:tblW is present, including w:w=\"0\" w:type=\"auto\"\n // (auto-sized tables). Skipping w:w=\"0\" would leave the constructor default (9360/dxa),\n // causing tblPrChange snapshots to capture wrong \"previous\" width values.\n if (tblPrObj['w:tblW']) {\n const width = safeParseInt(tblPrObj['w:tblW']['@_w:w'], 0);\n const widthType = tblPrObj['w:tblW']['@_w:type'] || 'dxa';\n table.setWidth(width);\n table.setWidthType(widthType);\n }\n\n // Parse table caption\n if (tblPrObj['w:tblCaption']) {\n const caption = tblPrObj['w:tblCaption']['@_w:val'];\n if (caption) table.setCaption(caption);\n }\n\n // Parse table description\n if (tblPrObj['w:tblDescription']) {\n const description = tblPrObj['w:tblDescription']['@_w:val'];\n if (description) table.setDescription(description);\n }\n\n // Parse cell spacing\n if (tblPrObj['w:tblCellSpacing']) {\n const spacing = parseInt(tblPrObj['w:tblCellSpacing']['@_w:w'] || '0', 10);\n const spacingType = tblPrObj['w:tblCellSpacing']['@_w:type'] || 'dxa';\n if (spacing > 0) {\n table.setCellSpacing(spacing);\n table.setCellSpacingType(spacingType);\n }\n }\n\n // Parse table layout (w:tblLayout) per ECMA-376 Part 1 §17.4.52\n if (tblPrObj['w:tblLayout']) {\n const layoutType = tblPrObj['w:tblLayout']['@_w:type'];\n if (layoutType) {\n table.setLayout(layoutType);\n }\n }\n\n // Parse table indentation (w:tblInd) per ECMA-376 Part 1 §17.4.43\n if (tblPrObj['w:tblInd']) {\n const indentVal = safeParseInt(tblPrObj['w:tblInd']['@_w:w'], 0);\n table.setIndent(indentVal);\n }\n\n // Parse table cell margins (w:tblCellMar) per ECMA-376 Part 1 §17.4.42\n if (tblPrObj['w:tblCellMar']) {\n const cellMar = tblPrObj['w:tblCellMar'];\n const margins: { top?: number; bottom?: number; left?: number; right?: number } = {};\n\n if (cellMar['w:top']) {\n const w = cellMar['w:top']['@_w:w'];\n if (w !== undefined) margins.top = parseInt(w, 10);\n }\n if (cellMar['w:bottom']) {\n const w = cellMar['w:bottom']['@_w:w'];\n if (w !== undefined) margins.bottom = parseInt(w, 10);\n }\n if (cellMar['w:left']) {\n const w = cellMar['w:left']['@_w:w'];\n if (w !== undefined) margins.left = parseInt(w, 10);\n }\n if (cellMar['w:right']) {\n const w = cellMar['w:right']['@_w:w'];\n if (w !== undefined) margins.right = parseInt(w, 10);\n }\n\n if (Object.keys(margins).length > 0) {\n table.setCellMargins(margins);\n }\n }\n\n // Parse table alignment (w:jc) - IMPORTANT for preserving table centering\n if (tblPrObj['w:jc']) {\n const alignment = tblPrObj['w:jc']['@_w:val'];\n if (alignment) {\n table.setAlignment(alignment as 'left' | 'center' | 'right');\n }\n }\n\n // Parse table style row band size (w:tblStyleRowBandSize) per ECMA-376 Part 1 §17.4.52\n if (tblPrObj['w:tblStyleRowBandSize']) {\n const val = parseInt(tblPrObj['w:tblStyleRowBandSize']['@_w:val'] || '0', 10);\n if (val > 0) {\n table.setStyleRowBandSize(val);\n }\n }\n\n // Parse table style column band size (w:tblStyleColBandSize) per ECMA-376 Part 1 §17.4.51\n if (tblPrObj['w:tblStyleColBandSize']) {\n const val = parseInt(tblPrObj['w:tblStyleColBandSize']['@_w:val'] || '0', 10);\n if (val > 0) {\n table.setStyleColBandSize(val);\n }\n }\n\n // Parse table shading (w:shd) per ECMA-376 Part 1 §17.4.56\n if (tblPrObj['w:shd']) {\n const shading = this.parseShadingFromObj(tblPrObj['w:shd']);\n if (shading) {\n table.setShading(shading);\n }\n }\n\n // Parse table borders (w:tblBorders) per ECMA-376 Part 1 §17.4.40\n if (tblPrObj['w:tblBorders']) {\n const bordersObj = tblPrObj['w:tblBorders'];\n const borders: import('../elements/Table').TableBorders = {};\n\n if (bordersObj['w:top']) borders.top = this.parseBorderElement(bordersObj['w:top']);\n if (bordersObj['w:bottom']) borders.bottom = this.parseBorderElement(bordersObj['w:bottom']);\n if (bordersObj['w:left']) borders.left = this.parseBorderElement(bordersObj['w:left']);\n if (bordersObj['w:right']) borders.right = this.parseBorderElement(bordersObj['w:right']);\n if (bordersObj['w:insideH'])\n borders.insideH = this.parseBorderElement(bordersObj['w:insideH']);\n if (bordersObj['w:insideV'])\n borders.insideV = this.parseBorderElement(bordersObj['w:insideV']);\n\n if (Object.keys(borders).length > 0) {\n table.setBorders(borders);\n }\n }\n\n // Parse table property change (w:tblPrChange) per ECMA-376 Part 1 §17.13.5.36\n if (tblPrObj['w:tblPrChange']) {\n const changeObj = tblPrObj['w:tblPrChange'];\n table.setTblPrChange({\n id: String(changeObj['@_w:id'] || '0'),\n author: changeObj['@_w:author'] || '',\n date: changeObj['@_w:date'] || '',\n previousProperties: this.parseGenericPreviousProperties(changeObj['w:tblPr']),\n });\n }\n }\n\n private async parseTableRowFromObject(\n rowObj: any,\n relationshipManager: RelationshipManager,\n zipHandler: ZipHandler,\n imageManager: ImageManager,\n rawRowXml?: string\n ): Promise<TableRow | null> {\n try {\n // Create empty row\n const row = new TableRow();\n\n // Parse row properties (w:trPr) per ECMA-376 Part 1 §17.4.82\n const trPr = rowObj['w:trPr'];\n if (trPr) {\n this.parseTableRowPropertiesFromObject(trPr, row);\n }\n\n // Parse table property exceptions (w:tblPrEx) per ECMA-376 Part 1 §17.4.61\n const tblPrEx = rowObj['w:tblPrEx'];\n if (tblPrEx) {\n const exceptions = this.parseTablePropertyExceptionsFromObject(tblPrEx);\n if (exceptions) {\n row.setTablePropertyExceptions(exceptions);\n }\n }\n\n // Parse table cells (w:tc)\n const cells = rowObj['w:tc'];\n const cellChildren = Array.isArray(cells) ? cells : cells ? [cells] : [];\n\n // Extract cell XMLs from raw row XML if available\n let cellXmls: string[] = [];\n if (rawRowXml) {\n cellXmls = XMLParser.extractElements(rawRowXml, 'w:tc');\n }\n\n for (let i = 0; i < cellChildren.length; i++) {\n const cellObj = cellChildren[i];\n const rawCellXml = i < cellXmls.length ? cellXmls[i] : undefined;\n\n const cell = await this.parseTableCellFromObject(\n cellObj,\n relationshipManager,\n zipHandler,\n imageManager,\n rawCellXml\n );\n if (cell) {\n row.addCell(cell);\n }\n }\n\n return row;\n } catch (error: unknown) {\n defaultLogger.warn(\n '[DocumentParser] Failed to parse table row:',\n error instanceof Error\n ? { message: error.message, stack: error.stack }\n : { error: String(error) }\n );\n return null;\n }\n }\n\n /**\n * Parses table row properties from XML object and applies to row\n * Per ECMA-376 Part 1 §17.4.82 (w:trPr - Table Row Properties)\n */\n private parseTableRowPropertiesFromObject(trPrObj: any, row: TableRow): void {\n if (!trPrObj) return;\n\n // Parse row height (w:trHeight) per ECMA-376 Part 1 §17.4.81\n if (trPrObj['w:trHeight']) {\n const heightVal = parseInt(trPrObj['w:trHeight']['@_w:val'] || '0', 10);\n const heightRule = trPrObj['w:trHeight']['@_w:hRule'] || 'atLeast';\n if (heightVal > 0) {\n row.setHeight(heightVal, heightRule);\n }\n }\n\n // Parse table header row (w:tblHeader) per ECMA-376 Part 1 §17.4.49\n if (trPrObj['w:tblHeader']) {\n row.setHeader(true);\n }\n\n // Parse can't split (w:cantSplit) per ECMA-376 Part 1 §17.4.5\n if (trPrObj['w:cantSplit']) {\n row.setCantSplit(true);\n }\n\n // Parse row justification (w:jc) per ECMA-376 Part 1 §17.4.79\n if (trPrObj['w:jc']) {\n const val = trPrObj['w:jc']['@_w:val'];\n if (val) {\n row.setJustification(val);\n }\n }\n\n // Parse hidden (w:hidden) per ECMA-376 Part 1 §17.4.23\n if (trPrObj['w:hidden']) {\n row.setHidden(true);\n }\n\n // Parse grid before (w:gridBefore) per ECMA-376 Part 1 §17.4.15\n if (trPrObj['w:gridBefore']) {\n const val = parseInt(trPrObj['w:gridBefore']['@_w:val'] || '0', 10);\n if (val > 0) {\n row.setGridBefore(val);\n }\n }\n\n // Parse grid after (w:gridAfter) per ECMA-376 Part 1 §17.4.14\n if (trPrObj['w:gridAfter']) {\n const val = parseInt(trPrObj['w:gridAfter']['@_w:val'] || '0', 10);\n if (val > 0) {\n row.setGridAfter(val);\n }\n }\n\n // Parse width before (w:wBefore) per ECMA-376 Part 1 §17.4.83\n if (trPrObj['w:wBefore']) {\n const w = parseInt(trPrObj['w:wBefore']['@_w:w'] || '0', 10);\n const type = trPrObj['w:wBefore']['@_w:type'] || 'dxa';\n if (w > 0) {\n row.setWBefore(w, type);\n }\n }\n\n // Parse width after (w:wAfter) per ECMA-376 Part 1 §17.4.82\n if (trPrObj['w:wAfter']) {\n const w = parseInt(trPrObj['w:wAfter']['@_w:w'] || '0', 10);\n const type = trPrObj['w:wAfter']['@_w:type'] || 'dxa';\n if (w > 0) {\n row.setWAfter(w, type);\n }\n }\n\n // Parse row-level cell spacing (w:tblCellSpacing)\n if (trPrObj['w:tblCellSpacing']) {\n const w = parseInt(trPrObj['w:tblCellSpacing']['@_w:w'] || '0', 10);\n const type = trPrObj['w:tblCellSpacing']['@_w:type'] || 'dxa';\n if (w > 0) {\n row.setRowCellSpacing(w, type);\n }\n }\n\n // Parse conditional formatting (w:cnfStyle) per ECMA-376 Part 1 §17.3.1.8\n if (trPrObj['w:cnfStyle']) {\n const val = trPrObj['w:cnfStyle']['@_w:val'];\n if (val) {\n row.setCnfStyle(val);\n }\n }\n\n // Parse divId (w:divId) per ECMA-376 Part 1 §17.4.9\n if (trPrObj['w:divId']) {\n const val = parseInt(trPrObj['w:divId']['@_w:val'] || '0', 10);\n if (val > 0) {\n row.setDivId(val);\n }\n }\n\n // Parse table row property change (w:trPrChange) per ECMA-376 Part 1 §17.13.5.38\n if (trPrObj['w:trPrChange']) {\n const changeObj = trPrObj['w:trPrChange'];\n row.setTrPrChange({\n id: String(changeObj['@_w:id'] || '0'),\n author: changeObj['@_w:author'] || '',\n date: changeObj['@_w:date'] || '',\n previousProperties: this.parseGenericPreviousProperties(changeObj['w:trPr']),\n });\n }\n }\n\n /**\n * Parses table property exceptions from row XML object\n * Per ECMA-376 Part 1 §17.4.61 (w:tblPrEx)\n * @private\n */\n private parseTablePropertyExceptionsFromObject(tblPrExObj: any): any {\n if (!tblPrExObj) return undefined;\n\n const exceptions: any = {};\n\n // Parse table width exception (w:tblW)\n if (tblPrExObj['w:tblW']) {\n const widthVal = parseInt(tblPrExObj['w:tblW']['@_w:w'] || '0', 10);\n if (widthVal > 0) {\n exceptions.width = widthVal;\n }\n }\n\n // Parse table justification exception (w:jc)\n if (tblPrExObj['w:jc']) {\n const val = tblPrExObj['w:jc']['@_w:val'];\n if (val) {\n exceptions.justification = val;\n }\n }\n\n // Parse cell spacing exception (w:tblCellSpacing)\n if (tblPrExObj['w:tblCellSpacing']) {\n const val = parseInt(tblPrExObj['w:tblCellSpacing']['@_w:w'] || '0', 10);\n if (val > 0) {\n exceptions.cellSpacing = val;\n }\n }\n\n // Parse table indentation exception (w:tblInd)\n if (tblPrExObj['w:tblInd']) {\n const val = parseInt(tblPrExObj['w:tblInd']['@_w:w'] || '0', 10);\n if (val > 0) {\n exceptions.indentation = val;\n }\n }\n\n // Parse table borders exception (w:tblBorders)\n if (tblPrExObj['w:tblBorders']) {\n exceptions.borders = this.parseTableBordersFromObject(tblPrExObj['w:tblBorders']);\n }\n\n // Parse shading exception (w:shd)\n if (tblPrExObj['w:shd']) {\n const shading = this.parseShadingFromObj(tblPrExObj['w:shd']);\n if (shading) {\n exceptions.shading = shading;\n }\n }\n\n return Object.keys(exceptions).length > 0 ? exceptions : undefined;\n }\n\n /**\n * Parses table borders from XML object\n * @private\n */\n private parseTableBordersFromObject(bordersObj: any): any {\n if (!bordersObj) return undefined;\n\n const borders: any = {};\n const borderNames = ['top', 'bottom', 'left', 'right', 'insideH', 'insideV'];\n\n for (const name of borderNames) {\n const borderKey = `w:${name}`;\n if (bordersObj[borderKey]) {\n const borderObj = bordersObj[borderKey];\n borders[name] = {};\n\n if (borderObj['@_w:val']) borders[name].style = borderObj['@_w:val'];\n if (borderObj['@_w:sz']) borders[name].size = parseInt(borderObj['@_w:sz'], 10);\n if (borderObj['@_w:space']) borders[name].space = parseInt(borderObj['@_w:space'], 10);\n if (borderObj['@_w:color']) borders[name].color = borderObj['@_w:color'];\n }\n }\n\n return Object.keys(borders).length > 0 ? borders : undefined;\n }\n\n private async parseTableCellFromObject(\n cellObj: any,\n relationshipManager: RelationshipManager,\n zipHandler: ZipHandler,\n imageManager: ImageManager,\n rawCellXml?: string\n ): Promise<TableCell | null> {\n try {\n // Create empty cell\n const cell = new TableCell();\n\n // Parse cell properties (w:tcPr) per ECMA-376 Part 1 §17.4.42\n const tcPr = cellObj['w:tcPr'];\n if (tcPr) {\n // Parse cell width (w:tcW) with type per ECMA-376 Part 1 §17.4.81\n if (tcPr['w:tcW']) {\n const widthVal = parseInt(tcPr['w:tcW']['@_w:w'] || '0', 10);\n const widthType = tcPr['w:tcW']['@_w:type'] || 'dxa';\n if (widthVal > 0 || widthType === 'auto') {\n cell.setWidthType(widthVal, widthType);\n }\n }\n\n // Parse conditional style (w:cnfStyle) per ECMA-376 Part 1 §17.4.7\n if (tcPr['w:cnfStyle']) {\n const cnfStyle = tcPr['w:cnfStyle']['@_w:val'];\n if (cnfStyle) {\n cell.setConditionalStyle(cnfStyle);\n }\n }\n\n // Parse cell borders (w:tcBorders)\n if (tcPr['w:tcBorders']) {\n const bordersObj = tcPr['w:tcBorders'];\n const borders: any = {};\n\n if (bordersObj['w:top']) borders.top = this.parseBorderElement(bordersObj['w:top']);\n if (bordersObj['w:bottom'])\n borders.bottom = this.parseBorderElement(bordersObj['w:bottom']);\n if (bordersObj['w:left']) borders.left = this.parseBorderElement(bordersObj['w:left']);\n if (bordersObj['w:right']) borders.right = this.parseBorderElement(bordersObj['w:right']);\n if (bordersObj['w:tl2br']) borders.tl2br = this.parseBorderElement(bordersObj['w:tl2br']);\n if (bordersObj['w:tr2bl']) borders.tr2bl = this.parseBorderElement(bordersObj['w:tr2bl']);\n\n if (Object.keys(borders).length > 0) {\n cell.setBorders(borders);\n }\n }\n\n // Parse cell shading (w:shd)\n if (tcPr['w:shd']) {\n const shading = this.parseShadingFromObj(tcPr['w:shd']);\n if (shading) {\n cell.setShading(shading);\n }\n }\n\n // Parse cell margins (w:tcMar) per ECMA-376 Part 1 §17.4.43\n if (tcPr['w:tcMar']) {\n const tcMar = tcPr['w:tcMar'];\n const margins: any = {};\n\n if (tcMar['w:top']) {\n margins.top = parseInt(tcMar['w:top']['@_w:w'] || '0', 10);\n }\n if (tcMar['w:bottom']) {\n margins.bottom = parseInt(tcMar['w:bottom']['@_w:w'] || '0', 10);\n }\n if (tcMar['w:left']) {\n margins.left = parseInt(tcMar['w:left']['@_w:w'] || '0', 10);\n }\n if (tcMar['w:right']) {\n margins.right = parseInt(tcMar['w:right']['@_w:w'] || '0', 10);\n }\n\n if (Object.keys(margins).length > 0) {\n cell.setMargins(margins);\n }\n }\n\n // Parse vertical alignment (w:vAlign)\n if (tcPr['w:vAlign']) {\n const valign = tcPr['w:vAlign']['@_w:val'];\n if (valign && (valign === 'top' || valign === 'center' || valign === 'bottom')) {\n cell.setVerticalAlignment(valign);\n }\n }\n\n // Parse column span (w:gridSpan)\n if (tcPr['w:gridSpan']) {\n const span = parseInt(tcPr['w:gridSpan']['@_w:val'] || '1', 10);\n if (span > 1) {\n cell.setColumnSpan(span);\n }\n }\n\n // Parse text direction (w:textDirection) per ECMA-376 Part 1 §17.4.72\n if (tcPr['w:textDirection']) {\n const direction = tcPr['w:textDirection']['@_w:val'];\n if (direction) {\n cell.setTextDirection(direction);\n }\n }\n\n // Parse no wrap (w:noWrap) per ECMA-376 Part 1 §17.4.34\n if (tcPr['w:noWrap']) {\n cell.setNoWrap(true);\n }\n\n // Parse hide mark (w:hideMark) per ECMA-376 Part 1 §17.4.24\n if (tcPr['w:hideMark']) {\n cell.setHideMark(true);\n }\n\n // Parse headers (w:headers) per ECMA-376 Part 1 §17.4.26\n if (tcPr['w:headers']) {\n const headersVal = tcPr['w:headers']['@_w:val'];\n if (headersVal) {\n cell.setHeaders(headersVal);\n }\n }\n\n // Parse fit text (w:tcFitText) per ECMA-376 Part 1 §17.4.68\n if (tcPr['w:tcFitText']) {\n cell.setFitText(true);\n }\n\n // Parse vertical merge (w:vMerge) per ECMA-376 Part 1 §17.4.85\n if (tcPr['w:vMerge']) {\n const vMergeVal = tcPr['w:vMerge']['@_w:val'];\n // Empty element or \"continue\" means continue, \"restart\" means restart\n if (vMergeVal === 'restart') {\n cell.setVerticalMerge('restart');\n } else {\n cell.setVerticalMerge('continue');\n }\n }\n\n // Parse legacy horizontal merge (w:hMerge) per ECMA-376 Part 1 §17.4.22\n if (tcPr['w:hMerge']) {\n const hMergeVal = tcPr['w:hMerge']['@_w:val'];\n if (hMergeVal === 'restart') {\n cell.setHorizontalMerge('restart');\n } else {\n cell.setHorizontalMerge('continue');\n }\n }\n\n // Parse table cell insertion marker (w:cellIns) per ECMA-376 Part 1 §17.13.5.5\n if (tcPr['w:cellIns']) {\n const cellIns = tcPr['w:cellIns'];\n const id = parseInt(cellIns['@_w:id'] || '0', 10);\n const author = cellIns['@_w:author'] || 'Unknown';\n const dateAttr = cellIns['@_w:date'];\n const date = dateAttr ? new Date(dateAttr) : new Date();\n\n const revision = new Revision({\n id,\n author,\n date,\n type: 'tableCellInsert',\n content: [],\n });\n cell.setCellRevision(revision);\n }\n\n // Parse table cell deletion marker (w:cellDel) per ECMA-376 Part 1 §17.13.5.6\n if (tcPr['w:cellDel']) {\n const cellDel = tcPr['w:cellDel'];\n const id = parseInt(cellDel['@_w:id'] || '0', 10);\n const author = cellDel['@_w:author'] || 'Unknown';\n const dateAttr = cellDel['@_w:date'];\n const date = dateAttr ? new Date(dateAttr) : new Date();\n\n const revision = new Revision({\n id,\n author,\n date,\n type: 'tableCellDelete',\n content: [],\n });\n cell.setCellRevision(revision);\n }\n\n // Parse table cell merge marker (w:cellMerge) per ECMA-376 Part 1 §17.13.5.4\n if (tcPr['w:cellMerge']) {\n const cellMerge = tcPr['w:cellMerge'];\n const id = parseInt(cellMerge['@_w:id'] || '0', 10);\n const author = cellMerge['@_w:author'] || 'Unknown';\n const dateAttr = cellMerge['@_w:date'];\n const date = dateAttr ? new Date(dateAttr) : new Date();\n const vMergeAttr = cellMerge['@_w:vMerge'];\n const vMergeOrigAttr = cellMerge['@_w:vMergeOrig'];\n // ST_AnnotationVMerge uses \"rest\"/\"cont\" but API uses \"restart\"/\"continue\"\n const mergeRevMap: Record<string, string> = { rest: 'restart', cont: 'continue' };\n\n const revision = new Revision({\n id,\n author,\n date,\n type: 'tableCellMerge',\n content: [],\n previousProperties: {\n vMerge: (vMergeAttr && mergeRevMap[vMergeAttr]) || vMergeAttr,\n vMergeOrig: (vMergeOrigAttr && mergeRevMap[vMergeOrigAttr]) || vMergeOrigAttr,\n },\n });\n cell.setCellRevision(revision);\n }\n\n // Parse table cell property change (w:tcPrChange) per ECMA-376 Part 1 §17.13.5.37\n if (tcPr['w:tcPrChange']) {\n const changeObj = tcPr['w:tcPrChange'];\n cell.setTcPrChange({\n id: String(changeObj['@_w:id'] || '0'),\n author: changeObj['@_w:author'] || '',\n date: changeObj['@_w:date'] || '',\n previousProperties: this.parseGenericPreviousProperties(changeObj['w:tcPr']),\n });\n }\n }\n\n // Parse cell content - use order-preserving extraction if raw XML available\n // This is critical for preserving nested tables and SDTs\n if (rawCellXml) {\n // Extract all cell content in order (paragraphs, nested tables, SDTs, bookmarkEnds)\n const cellContent = this.extractCellContentInOrder(rawCellXml);\n let paragraphIndex = 0;\n let lastParagraph: Paragraph | null = null;\n\n for (const item of cellContent) {\n if (item.type === 'paragraph') {\n // Parse paragraph using raw XML to preserve revisions\n const paragraph = await this.parseParagraphWithOrder(\n item.xml,\n relationshipManager,\n zipHandler,\n imageManager\n );\n if (paragraph) {\n cell.addParagraph(paragraph);\n lastParagraph = paragraph;\n paragraphIndex++;\n }\n } else if (item.type === 'table' || item.type === 'sdt') {\n // Store nested tables and SDTs as raw XML for passthrough\n // These are preserved exactly as-is to avoid any modifications\n cell.addRawNestedContent(paragraphIndex, item.xml, item.type);\n } else if (item.type === 'bookmarkEnd') {\n // BookmarkEnd between paragraphs in cell - attach to previous paragraph\n if (lastParagraph) {\n const bookmarkEnds = this.extractBookmarkEndsFromContent(item.xml);\n for (const bookmark of bookmarkEnds) {\n lastParagraph.addBookmarkEnd(bookmark);\n }\n }\n }\n }\n } else {\n // Fallback: Parse paragraphs from object (no raw XML available)\n const paragraphs = cellObj['w:p'];\n const paraChildren = Array.isArray(paragraphs)\n ? paragraphs\n : paragraphs\n ? [paragraphs]\n : [];\n\n for (const paraObj of paraChildren) {\n const paragraph = await this.parseParagraphFromObject(\n paraObj,\n relationshipManager,\n zipHandler,\n imageManager\n );\n if (paragraph) {\n cell.addParagraph(paragraph);\n }\n }\n }\n\n return cell;\n } catch (error: unknown) {\n defaultLogger.warn(\n '[DocumentParser] Failed to parse table cell:',\n error instanceof Error\n ? { message: error.message, stack: error.stack }\n : { error: String(error) }\n );\n return null;\n }\n }\n\n /**\n * Extracts cell content elements in order, preserving sequence of paragraphs, nested tables, and SDTs\n * Used to properly handle nested tables in table cells\n * @param cellXml - Raw XML of the cell (w:tc element)\n * @returns Array of content items with type and XML\n */\n private extractCellContentInOrder(\n cellXml: string\n ): { type: 'paragraph' | 'table' | 'sdt' | 'bookmarkEnd'; xml: string }[] {\n const result: {\n type: 'paragraph' | 'table' | 'sdt' | 'bookmarkEnd';\n xml: string;\n }[] = [];\n\n // Find the start of cell content (after w:tcPr if present)\n let contentStart = 0;\n const tcPrStart = cellXml.indexOf('<w:tcPr');\n if (tcPrStart !== -1) {\n // Skip past the tcPr element\n const tcPrEnd = this.findClosingTag(cellXml, 'w:tcPr', tcPrStart);\n if (tcPrEnd !== -1) {\n contentStart = tcPrEnd;\n }\n }\n\n // Find end of cell (before closing </w:tc>)\n const contentEnd = cellXml.lastIndexOf('</w:tc>');\n if (contentEnd === -1) return result;\n\n const content = cellXml.substring(contentStart, contentEnd);\n\n // Scan for w:p, w:tbl, w:sdt, and w:bookmarkEnd elements at the current level\n let pos = 0;\n while (pos < content.length) {\n // Find next element start\n const pStart = content.indexOf('<w:p', pos);\n const tblStart = content.indexOf('<w:tbl', pos);\n const sdtStart = content.indexOf('<w:sdt', pos);\n const bookmarkEndStart = content.indexOf('<w:bookmarkEnd', pos);\n\n // Find which comes first\n let nextStart = -1;\n let nextType: 'paragraph' | 'table' | 'sdt' | 'bookmarkEnd' | null = null;\n let nextTag = '';\n\n if (\n pStart !== -1 &&\n this.isExactTag(content, pStart, 'w:p') &&\n (nextStart === -1 || pStart < nextStart)\n ) {\n nextStart = pStart;\n nextType = 'paragraph';\n nextTag = 'w:p';\n }\n if (\n tblStart !== -1 &&\n this.isExactTag(content, tblStart, 'w:tbl') &&\n (nextStart === -1 || tblStart < nextStart)\n ) {\n nextStart = tblStart;\n nextType = 'table';\n nextTag = 'w:tbl';\n }\n if (\n sdtStart !== -1 &&\n this.isExactTag(content, sdtStart, 'w:sdt') &&\n (nextStart === -1 || sdtStart < nextStart)\n ) {\n nextStart = sdtStart;\n nextType = 'sdt';\n nextTag = 'w:sdt';\n }\n if (bookmarkEndStart !== -1 && (nextStart === -1 || bookmarkEndStart < nextStart)) {\n nextStart = bookmarkEndStart;\n nextType = 'bookmarkEnd';\n nextTag = 'w:bookmarkEnd';\n }\n\n if (nextStart === -1 || nextType === null) break;\n\n // Extract the complete element\n if (nextType === 'bookmarkEnd') {\n // Self-closing tag - find the end of this element\n const elementEnd = content.indexOf('>', nextStart) + 1;\n if (elementEnd === 0) {\n pos = nextStart + 1;\n continue;\n }\n const elementXml = content.substring(nextStart, elementEnd);\n result.push({ type: nextType, xml: elementXml });\n pos = elementEnd;\n } else {\n const elementEnd = this.findClosingTag(content, nextTag, nextStart);\n if (elementEnd === -1) {\n pos = nextStart + 1;\n continue;\n }\n const elementXml = content.substring(nextStart, elementEnd);\n result.push({ type: nextType, xml: elementXml });\n pos = elementEnd;\n }\n }\n\n return result;\n }\n\n /**\n * Checks if a tag at the given position is an exact match (not a prefix like w:pPr for w:p)\n */\n private isExactTag(content: string, position: number, tagName: string): boolean {\n const afterTag = content[position + 1 + tagName.length];\n return (\n afterTag === '>' ||\n afterTag === '/' ||\n afterTag === ' ' ||\n afterTag === '\\t' ||\n afterTag === '\\n' ||\n afterTag === '\\r'\n );\n }\n\n /**\n * Finds the closing tag for an element, handling nested elements of the same type\n */\n private findClosingTag(content: string, tagName: string, startPos: number): number {\n const openTag = `<${tagName}`;\n const closeTag = `</${tagName}>`;\n\n // Check for self-closing tag first\n const openTagEnd = content.indexOf('>', startPos);\n if (openTagEnd !== -1 && content[openTagEnd - 1] === '/') {\n return openTagEnd + 1;\n }\n\n let depth = 1;\n let pos = openTagEnd + 1;\n\n while (pos < content.length && depth > 0) {\n const nextOpen = content.indexOf(openTag, pos);\n const nextClose = content.indexOf(closeTag, pos);\n\n if (nextClose === -1) break;\n\n if (nextOpen !== -1 && nextOpen < nextClose) {\n // Check if it's an exact tag match\n if (this.isExactTag(content, nextOpen, tagName)) {\n depth++;\n }\n pos = nextOpen + openTag.length;\n } else {\n depth--;\n pos = nextClose + closeTag.length;\n }\n }\n\n return depth === 0 ? pos : -1;\n }\n\n private async parseSDTFromObject(\n sdtObj: any,\n relationshipManager: RelationshipManager,\n zipHandler: ZipHandler,\n imageManager: ImageManager\n ): Promise<StructuredDocumentTag | TableOfContentsElement | null> {\n try {\n if (!sdtObj) return null;\n\n const properties: any = {};\n\n // Parse SDT properties (sdtPr)\n const sdtPr = sdtObj['w:sdtPr'];\n if (sdtPr) {\n // Parse ID\n const idElement = sdtPr['w:id'];\n if (idElement?.['@_w:val']) {\n properties.id = parseInt(idElement['@_w:val'], 10);\n }\n\n // Parse tag\n const tagElement = sdtPr['w:tag'];\n if (tagElement?.['@_w:val']) {\n properties.tag = tagElement['@_w:val'];\n }\n\n // Parse lock\n const lockElement = sdtPr['w:lock'];\n if (lockElement?.['@_w:val']) {\n properties.lock = lockElement['@_w:val'];\n }\n\n // Parse alias\n const aliasElement = sdtPr['w:alias'];\n if (aliasElement?.['@_w:val']) {\n properties.alias = aliasElement['@_w:val'];\n }\n\n // Parse control type from various elements\n if (sdtPr['w:richText']) {\n properties.controlType = 'richText';\n } else if (sdtPr['w:text']) {\n properties.controlType = 'plainText';\n const textElement = sdtPr['w:text'];\n properties.plainText = {\n multiLine:\n textElement?.['@_w:multiLine'] === '1' || textElement?.['@_w:multiLine'] === 'true',\n };\n } else if (sdtPr['w:comboBox']) {\n properties.controlType = 'comboBox';\n const comboBoxElement = sdtPr['w:comboBox'];\n properties.comboBox = this.parseListItems(comboBoxElement);\n } else if (sdtPr['w:dropDownList']) {\n properties.controlType = 'dropDownList';\n const dropDownElement = sdtPr['w:dropDownList'];\n properties.dropDownList = this.parseListItems(dropDownElement);\n } else if (sdtPr['w:date']) {\n properties.controlType = 'datePicker';\n const dateElement = sdtPr['w:date'];\n // Date properties can be either attributes on w:date or nested elements\n properties.datePicker = {\n // Check attribute first, then nested element\n dateFormat:\n dateElement?.['@_w:dateFormat'] || dateElement?.['w:dateFormat']?.['@_w:val'],\n fullDate:\n dateElement?.['@_w:fullDate'] || dateElement?.['w:fullDate']?.['@_w:val']\n ? new Date(dateElement['@_w:fullDate'] || dateElement['w:fullDate']['@_w:val'])\n : undefined,\n lid: dateElement?.['@_w:lid'] || dateElement?.['w:lid']?.['@_w:val'],\n calendar: dateElement?.['@_w:calendar'] || dateElement?.['w:calendar']?.['@_w:val'],\n };\n } else if (sdtPr['w14:checkbox']) {\n properties.controlType = 'checkbox';\n const checkboxElement = sdtPr['w14:checkbox'];\n // Handle both string and numeric values from XML parser\n const checkedVal = checkboxElement?.['w14:checked']?.['@_w14:val'];\n properties.checkbox = {\n checked:\n checkedVal === 1 ||\n checkedVal === '1' ||\n checkedVal === true ||\n checkedVal === 'true',\n checkedState: String(checkboxElement?.['w14:checkedState']?.['@_w14:val'] ?? ''),\n uncheckedState: String(checkboxElement?.['w14:uncheckedState']?.['@_w14:val'] ?? ''),\n };\n } else if (sdtPr['w:picture']) {\n properties.controlType = 'picture';\n } else if (sdtPr['w:docPartObj']) {\n properties.controlType = 'buildingBlock';\n const docPartObj = sdtPr['w:docPartObj'];\n properties.buildingBlock = {\n gallery: docPartObj?.['w:docPartGallery']?.['@_w:val'],\n category: docPartObj?.['w:docPartCategory']?.['@_w:val'],\n };\n } else if (sdtPr['w:group']) {\n properties.controlType = 'group';\n } else if (sdtPr['w:citation']) {\n properties.controlType = 'citation';\n } else if (sdtPr['w:bibliography']) {\n properties.controlType = 'bibliography';\n } else if (sdtPr['w:equation']) {\n properties.controlType = 'equation';\n } else if (sdtPr['w:docPartList']) {\n properties.controlType = 'docPartList';\n const docPartList = sdtPr['w:docPartList'];\n properties.buildingBlock = {\n gallery: docPartList?.['w:docPartGallery']?.['@_w:val'],\n category: docPartList?.['w:docPartCategory']?.['@_w:val'],\n isList: true,\n };\n }\n\n // Parse placeholder (w:placeholder/w:docPart)\n const placeholderElement = sdtPr['w:placeholder'];\n if (placeholderElement) {\n const docPartVal = placeholderElement?.['w:docPart']?.['@_w:val'];\n if (docPartVal) {\n properties.placeholder = { docPart: docPartVal };\n }\n }\n\n // Parse data binding (w:dataBinding)\n const dataBindingElement = sdtPr['w:dataBinding'];\n if (dataBindingElement) {\n properties.dataBinding = {\n xpath: dataBindingElement['@_w:xpath'] || '',\n prefixMappings: dataBindingElement['@_w:prefixMappings'],\n storeItemId: dataBindingElement['@_w:storeItemID'],\n };\n }\n\n // Parse showing placeholder flag (w:showingPlcHdr)\n const showingPlcHdr = sdtPr['w:showingPlcHdr'];\n if (showingPlcHdr) {\n const val = showingPlcHdr['@_w:val'];\n properties.showingPlcHdr = val === '1' || val === 'true' || val === true;\n }\n }\n\n // Parse SDT content (sdtContent)\n const content: any[] = [];\n const sdtContent = sdtObj['w:sdtContent'];\n if (sdtContent) {\n // Check for ordered children (preserves element order)\n const orderedChildren = sdtContent._orderedChildren as\n | { type: string; index: number }[]\n | undefined;\n\n if (orderedChildren && orderedChildren.length > 0) {\n // Process in original order\n for (const childInfo of orderedChildren) {\n const elementType = childInfo.type;\n const elementIndex = childInfo.index;\n\n if (elementType === 'w:p') {\n const paragraphs = sdtContent['w:p'];\n const paraArray = Array.isArray(paragraphs)\n ? paragraphs\n : paragraphs\n ? [paragraphs]\n : [];\n if (elementIndex < paraArray.length) {\n // Reconstruct XML for paragraph parsing\n const paraXml = this.objectToXml({\n 'w:p': paraArray[elementIndex],\n });\n const para = await this.parseParagraphWithOrder(\n paraXml,\n relationshipManager,\n zipHandler,\n imageManager\n );\n if (para) content.push(para);\n }\n } else if (elementType === 'w:tbl') {\n const tables = sdtContent['w:tbl'];\n const tableArray = Array.isArray(tables) ? tables : tables ? [tables] : [];\n if (elementIndex < tableArray.length) {\n const tableObj = tableArray[elementIndex];\n const table = await this.parseTableFromObject(\n tableObj,\n relationshipManager,\n zipHandler,\n imageManager\n );\n if (table) content.push(table);\n }\n } else if (elementType === 'w:sdt') {\n const sdts = sdtContent['w:sdt'];\n const sdtArray = Array.isArray(sdts) ? sdts : sdts ? [sdts] : [];\n if (elementIndex < sdtArray.length) {\n const nestedSdt = await this.parseSDTFromObject(\n sdtArray[elementIndex],\n relationshipManager,\n zipHandler,\n imageManager\n );\n if (nestedSdt) content.push(nestedSdt);\n }\n }\n }\n } else {\n // Fallback: process sequentially\n // Parse paragraphs\n const paragraphs = sdtContent['w:p'];\n const paraArray = Array.isArray(paragraphs) ? paragraphs : paragraphs ? [paragraphs] : [];\n for (const paraObj of paraArray) {\n const paraXml = this.objectToXml({ 'w:p': paraObj });\n const para = await this.parseParagraphWithOrder(\n paraXml,\n relationshipManager,\n zipHandler,\n imageManager\n );\n if (para) content.push(para);\n }\n\n // Parse tables\n const tables = sdtContent['w:tbl'];\n const tableArray = Array.isArray(tables) ? tables : tables ? [tables] : [];\n for (const tableObj of tableArray) {\n const table = await this.parseTableFromObject(\n tableObj,\n relationshipManager,\n zipHandler,\n imageManager\n );\n if (table) content.push(table);\n }\n\n // Parse nested SDTs\n const nestedSdts = sdtContent['w:sdt'];\n const sdtArray = Array.isArray(nestedSdts) ? nestedSdts : nestedSdts ? [nestedSdts] : [];\n for (const nestedSdtObj of sdtArray) {\n const nestedSdt = await this.parseSDTFromObject(\n nestedSdtObj,\n relationshipManager,\n zipHandler,\n imageManager\n );\n if (nestedSdt) content.push(nestedSdt);\n }\n }\n }\n\n // Check if this is a Table of Contents SDT\n if (properties.buildingBlock?.gallery === 'Table of Contents') {\n // This is a TOC - create TableOfContentsElement instead\n const toc = this.parseTOCFromSDTContent(content, properties, sdtContent);\n if (toc) {\n return new TableOfContentsElement(toc);\n }\n }\n\n return new StructuredDocumentTag(properties, content);\n } catch (error: unknown) {\n defaultLogger.warn(\n '[DocumentParser] Failed to parse SDT:',\n error instanceof Error\n ? { message: error.message, stack: error.stack }\n : { error: String(error) }\n );\n return null;\n }\n }\n\n /**\n * Extracts TOC field instruction from assembled ComplexField objects\n * This is the preferred method as it uses already-assembled fields\n * @private\n */\n private extractInstructionFromContent(content: any[]): string | undefined {\n defaultLogger.debug(\n `[TOC Parser] Searching ${content.length} content elements for TOC ComplexField`\n );\n\n for (const element of content) {\n if (element instanceof Paragraph) {\n const paragraphContent = element.getContent();\n\n for (const item of paragraphContent) {\n // Check for ComplexField (assembled field with begin/sep/end)\n if (item instanceof ComplexField) {\n const instruction = item.getInstruction();\n\n // Check if this is a TOC field\n if (instruction && instruction.trim().startsWith('TOC')) {\n defaultLogger.debug(\n `[TOC Parser] Found ComplexField with TOC instruction: \"${instruction.substring(\n 0,\n 100\n )}...\"`\n );\n return instruction.trim();\n }\n }\n }\n }\n }\n\n defaultLogger.debug(\n '[TOC Parser] No ComplexField with TOC instruction found in assembled content'\n );\n return undefined;\n }\n\n /**\n * Fallback: Extracts TOC instruction from raw XML when ComplexField not available\n * Handles instructions split across multiple runs by concatenating all runs between begin/separate markers\n * @private\n */\n private extractInstructionFromRawXML(sdtContent: any): string | undefined {\n const paragraphs = sdtContent['w:p'];\n const paraArray = Array.isArray(paragraphs) ? paragraphs : paragraphs ? [paragraphs] : [];\n\n defaultLogger.debug(\n `[TOC Parser] Fallback: Parsing raw XML from ${paraArray.length} paragraph(s)`\n );\n\n // Track field state across paragraphs (TOC fields can span multiple paragraphs)\n let inField = false;\n let instructionParts: string[] = [];\n let foundTOCInstruction: string | undefined;\n\n for (let pIdx = 0; pIdx < paraArray.length; pIdx++) {\n const paraObj = paraArray[pIdx];\n const runs = paraObj['w:r'];\n const runArray = Array.isArray(runs) ? runs : runs ? [runs] : [];\n\n defaultLogger.debug(`[TOC Parser] Paragraph ${pIdx + 1}: ${runArray.length} runs`);\n\n for (let rIdx = 0; rIdx < runArray.length; rIdx++) {\n const runObj = runArray[rIdx];\n\n // Check for field character(s) - can be single object or array\n const fldChar = runObj['w:fldChar'];\n if (fldChar) {\n // Handle both single object and array of objects\n const fldCharArray = Array.isArray(fldChar) ? fldChar : [fldChar];\n\n defaultLogger.debug(\n `[TOC Parser] Paragraph ${pIdx + 1}, Run ${rIdx + 1}: Found ${\n fldCharArray.length\n } fldChar element(s)`\n );\n\n // Process each fldChar in the array\n for (const fldCharObj of fldCharArray) {\n const charType = fldCharObj['@_w:fldCharType'] || fldCharObj['@_fldCharType'];\n\n if (!charType) {\n defaultLogger.debug(`[TOC Parser] Warning: fldChar without charType attribute`);\n continue;\n }\n\n defaultLogger.debug(\n `[TOC Parser] Paragraph ${pIdx + 1}, Run ${rIdx + 1}: fldChar type = \"${charType}\"`\n );\n\n if (charType === 'begin') {\n inField = true;\n instructionParts = [];\n defaultLogger.debug(\n '[TOC Parser] Found field begin marker, starting instruction collection'\n );\n continue;\n }\n\n // Check for field end/separate marker\n if (charType === 'end' || charType === 'separate') {\n // If we collected instruction parts, join and check if TOC\n const fullInstruction = instructionParts.join('').trim();\n defaultLogger.debug(\n `[TOC Parser] Field ${charType} marker found. Collected instruction: \"${fullInstruction.substring(\n 0,\n 100\n )}...\"`\n );\n\n if (fullInstruction.startsWith('TOC')) {\n foundTOCInstruction = fullInstruction;\n defaultLogger.debug(\n `[TOC Parser] ✓ Extracted complete TOC instruction from ${instructionParts.length} part(s)`\n );\n // Don't return yet - field might have more content after separate\n // But save it in case we don't find end marker\n }\n\n // Only reset on \"end\", not \"separate\" (there's content between separate and end)\n if (charType === 'end') {\n inField = false;\n instructionParts = [];\n\n // If we found a TOC instruction, return it now\n if (foundTOCInstruction) {\n return foundTOCInstruction;\n }\n }\n continue;\n }\n }\n }\n\n // Collect instruction text while inside field\n if (inField) {\n const instrText = runObj['w:instrText'];\n if (instrText) {\n // Extract text value and decode XML entities\n let text = '';\n if (typeof instrText === 'string') {\n text = instrText;\n } else if (instrText['#text']) {\n text = instrText['#text'];\n } else {\n // Sometimes the text is directly in the object\n text = String(instrText);\n }\n\n instructionParts.push(text);\n defaultLogger.debug(\n `[TOC Parser] Paragraph ${pIdx + 1}, Run ${\n rIdx + 1\n }: Collected instrText = \"${text.substring(0, 50)}...\"`\n );\n }\n }\n }\n }\n\n // If we found a TOC instruction but never hit the end marker, return it anyway\n if (foundTOCInstruction) {\n defaultLogger.debug(\n `[TOC Parser] Returning TOC instruction (no end marker found): \"${foundTOCInstruction.substring(\n 0,\n 100\n )}...\"`\n );\n return foundTOCInstruction;\n }\n\n defaultLogger.debug('[TOC Parser] No TOC instruction found in raw XML fallback');\n return undefined;\n }\n\n /**\n * Normalizes TOC field instructions by converting incomplete \\t switches\n * that reference only standard heading styles to the equivalent \\o switch format.\n *\n * This fixes documents where TOC was created with \\t \"Heading 2,2,\" instead of\n * the correct \\o \"1-3\" format, which causes the TOC to only capture one heading level.\n *\n * @param instruction - The original TOC field instruction\n * @returns Normalized instruction with \\o switch if applicable, otherwise original\n * @private\n */\n private normalizeTOCFieldInstruction(instruction: string): string {\n // Check if instruction uses \\t switch\n if (!instruction.includes('\\\\t')) {\n return instruction; // Already using \\o or no style switch\n }\n\n // Extract all \\t switches\n const tSwitchPattern = /\\\\t\\s+\"([^\"]+)\"/g;\n const matches = [...instruction.matchAll(tSwitchPattern)];\n\n if (matches.length === 0) {\n return instruction; // No \\t switches found\n }\n\n // Parse all styles from \\t switches\n const styles: { styleName: string; level: number }[] = [];\n for (const match of matches) {\n const stylesStr = match[1];\n if (!stylesStr) continue;\n\n const parts = stylesStr.split(',').filter((p: string) => p.trim());\n for (let i = 0; i < parts.length; i += 2) {\n const styleName = parts[i];\n const levelStr = parts[i + 1];\n if (styleName && levelStr) {\n styles.push({\n styleName: styleName.trim(),\n level: parseInt(levelStr.trim(), 10),\n });\n }\n }\n }\n\n // Check if all styles are standard headings (Heading1, Heading2, etc.)\n const standardHeadingPattern = /^Heading\\s*(\\d+)$/i;\n const allStandardHeadings = styles.every((style) =>\n standardHeadingPattern.test(style.styleName)\n );\n\n if (!allStandardHeadings) {\n return instruction; // Contains custom styles, keep \\t switches\n }\n\n // Extract heading numbers and find the range\n const headingLevels = styles\n .map((style) => {\n const match = standardHeadingPattern.exec(style.styleName);\n return match ? parseInt(match[1]!, 10) : 0;\n })\n .filter((level) => level > 0)\n .sort((a, b) => a - b);\n\n if (headingLevels.length === 0) {\n return instruction; // No valid heading levels found\n }\n\n const minLevel = headingLevels[0]!;\n const maxLevel = headingLevels[headingLevels.length - 1]!;\n\n // Check if we should normalize (e.g., only \"Heading 2,2,\" should become \"1-3\")\n // We normalize if:\n // 1. Only one heading style is referenced, OR\n // 2. The heading levels don't form a complete sequence from 1\n const shouldNormalize =\n headingLevels.length === 1 || // Single heading style\n minLevel !== 1 || // Doesn't start at Heading 1\n headingLevels.length !== maxLevel - minLevel + 1; // Not a complete sequence\n\n if (!shouldNormalize) {\n return instruction; // Already a complete sequence, keep as-is\n }\n\n // FIX: Use actual min/max levels from the \\t switch, not hardcoded \"1-N\"\n // If \\t \"Heading 2,2,\" was specified, output should be \\o \"2-2\", not \\o \"1-3\"\n\n // Remove all \\t switches and replace with \\o switch\n let normalized = instruction.replace(tSwitchPattern, '').trim();\n\n // Insert \\o switch after \"TOC\" using the actual min/max levels\n normalized = normalized.replace(/^TOC\\s*/, `TOC \\\\o \"${minLevel}-${maxLevel}\" `);\n\n defaultLogger.debug(\n `[TOC Parser] Normalized field instruction from \"${instruction}\" to \"${normalized}\"`\n );\n\n return normalized;\n }\n\n /**\n * Helper to parse TOC from SDT content\n * Now uses two-tier extraction: ComplexField objects first, then raw XML fallback\n * Automatically normalizes incomplete \\t switches to \\o format for standard headings\n */\n private parseTOCFromSDTContent(\n content: any[],\n properties: any,\n sdtContent: any\n ): TableOfContents | null {\n try {\n let title: string | undefined;\n let fieldInstruction: string | undefined;\n\n // Extract title from parsed content\n for (const element of content) {\n if (element instanceof Paragraph) {\n const style = element.getStyle();\n if (style === 'TOCHeading') {\n // Extract title text\n const runs = element.getRuns();\n title = runs.map((r) => r.getText()).join('');\n }\n }\n }\n\n // NEW: Extract field instruction from assembled ComplexField objects first\n fieldInstruction = this.extractInstructionFromContent(content);\n\n // FALLBACK: Use raw XML parsing if no ComplexField found\n if (!fieldInstruction) {\n defaultLogger.debug(\n '[TOC Parser] ComplexField extraction failed, falling back to raw XML parsing'\n );\n fieldInstruction = this.extractInstructionFromRawXML(sdtContent);\n }\n\n if (!fieldInstruction) {\n defaultLogger.warn(\n '[DocumentParser] No TOC field instruction found in SDT content (tried both ComplexField and raw XML)'\n );\n return null;\n }\n\n defaultLogger.debug(`[TOC Parser] Successfully extracted instruction: \"${fieldInstruction}\"`);\n\n // Decode HTML entities before parsing switches\n // XML stores quotes as " which need to be converted for regex matching\n const decodedInstruction = fieldInstruction\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/&/g, '&');\n\n defaultLogger.debug(`[TOC Parser] Decoded instruction: \"${decodedInstruction}\"`);\n\n // NORMALIZATION: Convert incomplete \\t switches to \\o format for standard headings\n const normalizedInstruction = this.normalizeTOCFieldInstruction(decodedInstruction);\n\n // Parse field switches from normalized instruction\n const tocOptions: any = {\n title,\n originalFieldInstruction: normalizedInstruction.trim(), // Store normalized version\n };\n\n // Check for \\h (hyperlinks)\n if (normalizedInstruction.includes('\\\\h')) {\n tocOptions.useHyperlinks = true;\n }\n\n // Check for \\n (omit page numbers)\n if (normalizedInstruction.includes('\\\\n')) {\n tocOptions.showPageNumbers = false;\n }\n\n // Check for \\z (hide in web layout)\n if (normalizedInstruction.includes('\\\\z')) {\n tocOptions.hideInWebLayout = true;\n }\n\n // Check for \\o \"x-y\" (outline levels) - supports quoted and unquoted formats\n const outlineMatch = /\\\\o\\s+(?:\"(\\d+)-(\\d+)\"|'(\\d+)-(\\d+)'|(\\d+)-(\\d+))/.exec(\n normalizedInstruction\n );\n if (outlineMatch) {\n // Extract captured groups from whichever format matched\n const minLevel = outlineMatch[1] || outlineMatch[3] || outlineMatch[5];\n const maxLevel = outlineMatch[2] || outlineMatch[4] || outlineMatch[6];\n if (minLevel && maxLevel) {\n tocOptions.minLevel = parseInt(minLevel, 10);\n tocOptions.maxLevel = parseInt(maxLevel, 10);\n }\n }\n\n // Check for \\t \"styles...\" (include styles)\n const stylesMatch = /\\\\t\\s+\"([^\"]+)\"/.exec(normalizedInstruction);\n if (stylesMatch?.[1]) {\n const stylesStr = stylesMatch[1];\n const styles: { styleName: string; level: number }[] = [];\n\n // Parse \"StyleName,Level,StyleName2,Level2,...\"\n const parts = stylesStr.split(',').filter((p) => p.trim());\n for (let i = 0; i < parts.length; i += 2) {\n const styleName = parts[i];\n const levelStr = parts[i + 1];\n if (styleName && levelStr) {\n styles.push({\n styleName: styleName.trim(),\n level: parseInt(levelStr.trim(), 10),\n });\n }\n }\n\n if (styles.length > 0) {\n tocOptions.includeStyles = styles;\n }\n }\n\n return new TableOfContents(tocOptions);\n } catch (error: unknown) {\n defaultLogger.warn(\n '[DocumentParser] Failed to parse TOC from SDT content:',\n error instanceof Error\n ? { message: error.message, stack: error.stack }\n : { error: String(error) }\n );\n return null;\n }\n }\n\n /**\n * Helper to parse list items for combo box / dropdown\n */\n private parseListItems(element: any): any {\n const items: any[] = [];\n const listItems = element?.['w:listItem'];\n const itemArray = Array.isArray(listItems) ? listItems : listItems ? [listItems] : [];\n\n for (const item of itemArray) {\n if (item['@_w:displayText'] && item['@_w:value']) {\n items.push({\n displayText: item['@_w:displayText'],\n value: item['@_w:value'],\n });\n }\n }\n\n return {\n items,\n lastValue: element?.['@_w:lastValue'],\n };\n }\n\n /**\n * Helper to convert object back to XML string\n */\n private objectToXml(obj: any): string {\n // XML reconstruction that preserves element order using _orderedChildren\n // FIX (v1.3.1): Use _orderedChildren to maintain document order of elements\n // This fixes TOC tab preservation - tabs must be in correct position\n const buildXml = (o: any, name?: string): string => {\n if (typeof o === 'string') return o;\n if (typeof o !== 'object') return String(o);\n\n const keys = Object.keys(o);\n\n // FIX: If a name is provided, we're building a specific element (possibly self-closing)\n // Don't return empty string for empty objects with a name - they should become self-closing tags\n if (keys.length === 0 && !name) return '';\n\n const tagName = name || keys[0]!; // keys[0] is guaranteed to exist due to length check (or name is provided)\n const element = name ? o : o[tagName];\n\n let xml = `<${tagName}`;\n\n // Add attributes\n if (element && typeof element === 'object') {\n for (const key of Object.keys(element)) {\n if (key.startsWith('@_')) {\n const attrName = key.substring(2);\n xml += ` ${attrName}=\"${element[key]}\"`;\n }\n }\n }\n\n // Check for children\n const hasChildren =\n element &&\n typeof element === 'object' &&\n Object.keys(element).some(\n (k) => !k.startsWith('@_') && k !== '#text' && k !== '_orderedChildren'\n );\n\n if (!hasChildren && !element?.['#text']) {\n xml += '/>';\n } else {\n xml += '>';\n\n // Add text content\n if (element?.['#text']) {\n xml += element['#text'];\n }\n\n // Add child elements using _orderedChildren if available\n if (element && typeof element === 'object') {\n const orderedChildren = element._orderedChildren as\n | { type: string; index: number }[]\n | undefined;\n\n if (orderedChildren && orderedChildren.length > 0) {\n // Use _orderedChildren to preserve element order\n for (const childInfo of orderedChildren) {\n const childType = childInfo.type;\n const childIndex = childInfo.index;\n\n if (element[childType] !== undefined) {\n const children = element[childType];\n\n if (Array.isArray(children)) {\n if (childIndex < children.length) {\n const childXml = buildXml(children[childIndex], childType);\n xml += childXml;\n }\n } else {\n // Single child element\n if (childIndex === 0) {\n const childXml = buildXml(children, childType);\n xml += childXml;\n }\n }\n }\n }\n } else {\n // Fallback: iterate through keys if no _orderedChildren\n for (const key of Object.keys(element)) {\n if (!key.startsWith('@_') && key !== '#text' && key !== '_orderedChildren') {\n const children = element[key];\n if (Array.isArray(children)) {\n for (const child of children) {\n xml += buildXml(child, key);\n }\n } else {\n xml += buildXml(children, key);\n }\n }\n }\n }\n }\n\n xml += `</${tagName}>`;\n }\n\n return xml;\n };\n\n return buildXml(obj);\n }\n\n /**\n * Parses existing relationships from word/_rels/document.xml.rels\n * This ensures new relationships don't collide with existing IDs\n * Returns the parsed RelationshipManager if found, otherwise returns the provided one\n */\n private parseRelationships(\n zipHandler: ZipHandler,\n relationshipManager: RelationshipManager\n ): RelationshipManager {\n const relsPath = 'word/_rels/document.xml.rels';\n const relsXml = zipHandler.getFileAsString(relsPath);\n\n if (relsXml) {\n // Parse and replace the relationship manager with populated one\n return RelationshipManager.fromXml(relsXml);\n }\n\n // No existing relationships - return the provided manager\n // The Document class will add default relationships\n return relationshipManager;\n }\n\n /**\n * Parses document properties from core.xml, app.xml, and custom.xml\n */\n private parseProperties(zipHandler: ZipHandler): DocumentProperties {\n const extractTag = (xml: string, tag: string): string | undefined => {\n const tagContent = XMLParser.extractBetweenTags(xml, `<${tag}`, `</${tag}>`);\n return tagContent ? XMLBuilder.unescapeXml(tagContent) : undefined;\n };\n\n const properties: DocumentProperties = {};\n\n // Parse core.xml (core properties)\n const coreXml = zipHandler.getFileAsString(DOCX_PATHS.CORE_PROPS);\n if (coreXml) {\n properties.title = extractTag(coreXml, 'dc:title');\n properties.subject = extractTag(coreXml, 'dc:subject');\n properties.creator = extractTag(coreXml, 'dc:creator');\n properties.keywords = extractTag(coreXml, 'cp:keywords');\n properties.description = extractTag(coreXml, 'dc:description');\n properties.lastModifiedBy = extractTag(coreXml, 'cp:lastModifiedBy');\n\n // Phase 5.5 - Extended core properties\n properties.category = extractTag(coreXml, 'cp:category');\n properties.contentStatus = extractTag(coreXml, 'cp:contentStatus');\n properties.language = extractTag(coreXml, 'dc:language');\n\n // Parse revision as number\n const revisionStr = extractTag(coreXml, 'cp:revision');\n if (revisionStr) {\n properties.revision = parseInt(revisionStr, 10);\n }\n\n // Parse dates\n const createdStr = extractTag(coreXml, 'dcterms:created');\n if (createdStr) {\n properties.created = new Date(createdStr);\n }\n\n const modifiedStr = extractTag(coreXml, 'dcterms:modified');\n if (modifiedStr) {\n properties.modified = new Date(modifiedStr);\n }\n }\n\n // Parse app.xml (extended properties)\n const appXml = zipHandler.getFileAsString(DOCX_PATHS.APP_PROPS);\n if (appXml) {\n properties.application = extractTag(appXml, 'Application');\n properties.appVersion = extractTag(appXml, 'AppVersion');\n properties.company = extractTag(appXml, 'Company');\n properties.manager = extractTag(appXml, 'Manager');\n\n // Also check for version field\n if (!properties.appVersion) {\n properties.version = extractTag(appXml, 'Version');\n }\n }\n\n // Parse custom.xml (custom properties)\n const customXml = zipHandler.getFileAsString('docProps/custom.xml');\n if (customXml) {\n properties.customProperties = this.parseCustomProperties(customXml);\n }\n\n return properties;\n }\n\n /**\n * Parses custom properties from custom.xml\n */\n private parseCustomProperties(xml: string): Record<string, string | number | boolean | Date> {\n const customProps: Record<string, string | number | boolean | Date> = {};\n\n // Extract all property elements\n const propertyElements = XMLParser.extractElements(xml, 'property');\n\n for (const propXml of propertyElements) {\n // Extract name attribute\n const nameMatch = /name=\"([^\"]+)\"/.exec(propXml);\n if (!nameMatch?.[1]) continue;\n const name = XMLBuilder.unescapeXml(nameMatch[1]);\n\n // Determine value type and extract value\n if (propXml.includes('<vt:lpwstr>')) {\n const value = XMLParser.extractBetweenTags(propXml, '<vt:lpwstr>', '</vt:lpwstr>');\n if (value !== undefined) {\n customProps[name] = XMLBuilder.unescapeXml(value);\n }\n } else if (propXml.includes('<vt:r8>')) {\n const value = XMLParser.extractBetweenTags(propXml, '<vt:r8>', '</vt:r8>');\n if (value !== undefined) {\n customProps[name] = parseFloat(value);\n }\n } else if (propXml.includes('<vt:bool>')) {\n const value = XMLParser.extractBetweenTags(propXml, '<vt:bool>', '</vt:bool>');\n if (value !== undefined) {\n customProps[name] = value === 'true';\n }\n } else if (propXml.includes('<vt:filetime>')) {\n const value = XMLParser.extractBetweenTags(propXml, '<vt:filetime>', '</vt:filetime>');\n if (value !== undefined) {\n customProps[name] = new Date(value);\n }\n }\n }\n\n return customProps;\n }\n\n /**\n * Parses styles from styles.xml\n * @param zipHandler - ZIP handler containing the document\n * @returns Array of parsed Style objects\n */\n private parseStyles(zipHandler: ZipHandler): Style[] {\n const styles: Style[] = [];\n const stylesXml = zipHandler.getFileAsString(DOCX_PATHS.STYLES);\n\n if (!stylesXml) {\n return styles; // No styles.xml file\n }\n\n try {\n // Extract all <w:style> elements using XMLParser\n const styleElements = XMLParser.extractElements(stylesXml, 'w:style');\n\n for (const styleXml of styleElements) {\n try {\n const style = this.parseStyle(styleXml);\n if (style) {\n styles.push(style);\n }\n } catch (error: unknown) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.parseErrors.push({ element: 'style', error: err });\n\n if (this.strictParsing) {\n throw error;\n }\n // In lenient mode, continue parsing other styles\n }\n }\n } catch (error: unknown) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.parseErrors.push({ element: 'styles.xml', error: err });\n\n if (this.strictParsing) {\n throw new Error(`Failed to parse styles.xml: ${err.message}`);\n }\n }\n\n return styles;\n }\n\n /**\n * Parses numbering definitions from numbering.xml\n * Extracts abstract numbering definitions and numbering instances\n * @param zipHandler - ZIP handler containing the document\n * @returns Object containing abstractNumberings and numberingInstances arrays\n */\n private parseNumbering(zipHandler: ZipHandler): {\n abstractNumberings: AbstractNumbering[];\n numberingInstances: NumberingInstance[];\n } {\n const abstractNumberings: AbstractNumbering[] = [];\n const numberingInstances: NumberingInstance[] = [];\n\n const numberingXml = zipHandler.getFileAsString(DOCX_PATHS.NUMBERING);\n\n if (!numberingXml) {\n return { abstractNumberings, numberingInstances }; // No numbering.xml file\n }\n\n try {\n // Extract all <w:abstractNum> elements\n const abstractNumElements = XMLParser.extractElements(numberingXml, 'w:abstractNum');\n\n for (const abstractNumXml of abstractNumElements) {\n try {\n const abstractNum = AbstractNumbering.fromXML(abstractNumXml);\n abstractNumberings.push(abstractNum);\n } catch (error: unknown) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.parseErrors.push({ element: 'abstractNum', error: err });\n\n if (this.strictParsing) {\n throw error;\n }\n // In lenient mode, continue parsing other abstract numberings\n }\n }\n\n // Extract all <w:num> elements (numbering instances)\n const numElements = XMLParser.extractElements(numberingXml, 'w:num');\n\n for (const numXml of numElements) {\n try {\n const instance = NumberingInstance.fromXML(numXml);\n numberingInstances.push(instance);\n } catch (error: unknown) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.parseErrors.push({ element: 'num', error: err });\n\n if (this.strictParsing) {\n throw error;\n }\n // In lenient mode, continue parsing other instances\n }\n }\n } catch (error: unknown) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.parseErrors.push({ element: 'numbering.xml', error: err });\n\n if (this.strictParsing) {\n throw new Error(`Failed to parse numbering.xml: ${err.message}`);\n }\n }\n\n return { abstractNumberings, numberingInstances };\n }\n\n /**\n * Parses section properties from document XML\n * @param docXml - Document XML content\n * @returns Parsed Section object or null if not found\n */\n private parseSectionProperties(docXml: string): Section | null {\n try {\n // Extract the final <w:sectPr> from <w:body>\n const bodyElements = XMLParser.extractElements(docXml, 'w:body');\n if (bodyElements.length === 0) {\n return null;\n }\n const bodyContent = bodyElements[0];\n if (!bodyContent) {\n return null;\n }\n\n // Find the body-level sectPr (direct child of w:body), NOT inline sectPr inside w:pPr.\n // Per ECMA-376, the body-level sectPr appears as the last child of w:body,\n // after all paragraphs and tables. Inline sectPr elements inside w:pPr define\n // section breaks and must not be confused with the document-level section properties.\n // Search only in the content after the last block-level element to avoid picking up\n // inline sectPr from paragraph properties.\n const lastPClose = bodyContent.lastIndexOf('</w:p>');\n const lastTblClose = bodyContent.lastIndexOf('</w:tbl>');\n const lastSdtClose = bodyContent.lastIndexOf('</w:sdt>');\n const lastBlockEnd = Math.max(lastPClose, lastTblClose, lastSdtClose);\n\n let sectPr: string | undefined;\n if (lastBlockEnd !== -1) {\n // Search for sectPr only after the last block element\n const tailContent = bodyContent.substring(lastBlockEnd);\n const sectPrElements = XMLParser.extractElements(tailContent, 'w:sectPr');\n if (sectPrElements.length > 0) {\n sectPr = sectPrElements[0];\n }\n }\n if (!sectPr) {\n // Fallback: no block elements found, or sectPr not found after last block.\n // Search the entire body content (covers edge cases like empty documents).\n const sectPrElements = XMLParser.extractElements(bodyContent, 'w:sectPr');\n if (sectPrElements.length === 0) {\n return null;\n }\n sectPr = sectPrElements[sectPrElements.length - 1];\n if (!sectPr) {\n return null;\n }\n }\n\n const sectionProps: SectionProperties = {};\n\n // Parse page size\n const pgSzElements = XMLParser.extractElements(sectPr, 'w:pgSz');\n if (pgSzElements.length > 0) {\n const pgSz = pgSzElements[0];\n if (pgSz) {\n const width = XMLParser.extractAttribute(pgSz, 'w:w');\n const height = XMLParser.extractAttribute(pgSz, 'w:h');\n const orient = XMLParser.extractAttribute(pgSz, 'w:orient');\n\n if (width && height) {\n sectionProps.pageSize = {\n width: parseInt(width, 10),\n height: parseInt(height, 10),\n orientation: orient === 'landscape' ? 'landscape' : 'portrait',\n };\n }\n }\n }\n\n // Parse margins\n const pgMarElements = XMLParser.extractElements(sectPr, 'w:pgMar');\n if (pgMarElements.length > 0) {\n const pgMar = pgMarElements[0];\n if (pgMar) {\n const top = XMLParser.extractAttribute(pgMar, 'w:top');\n const bottom = XMLParser.extractAttribute(pgMar, 'w:bottom');\n const left = XMLParser.extractAttribute(pgMar, 'w:left');\n const right = XMLParser.extractAttribute(pgMar, 'w:right');\n const header = XMLParser.extractAttribute(pgMar, 'w:header');\n const footer = XMLParser.extractAttribute(pgMar, 'w:footer');\n const gutter = XMLParser.extractAttribute(pgMar, 'w:gutter');\n\n if (top && bottom && left && right) {\n sectionProps.margins = {\n top: parseInt(top, 10),\n bottom: parseInt(bottom, 10),\n left: parseInt(left, 10),\n right: parseInt(right, 10),\n header: header ? parseInt(header, 10) : undefined,\n footer: footer ? parseInt(footer, 10) : undefined,\n gutter: gutter ? parseInt(gutter, 10) : undefined,\n };\n }\n }\n }\n\n // Parse page borders (w:pgBorders) per ECMA-376 Part 1 §17.6.10\n const pgBordersElements = XMLParser.extractElements(sectPr, 'w:pgBorders');\n if (pgBordersElements.length > 0) {\n const pgBordersXml = pgBordersElements[0];\n if (pgBordersXml) {\n const pageBorders: any = {};\n const offsetFrom = XMLParser.extractAttribute(pgBordersXml, 'w:offsetFrom');\n if (offsetFrom) pageBorders.offsetFrom = offsetFrom;\n const display = XMLParser.extractAttribute(pgBordersXml, 'w:display');\n if (display) pageBorders.display = display;\n const zOrder = XMLParser.extractAttribute(pgBordersXml, 'w:zOrder');\n if (zOrder) pageBorders.zOrder = zOrder;\n\n const parseBorder = (sideXml: string): any | undefined => {\n if (!sideXml) return undefined;\n const border: any = {};\n const val = XMLParser.extractAttribute(sideXml, 'w:val');\n if (val) border.style = val;\n const sz = XMLParser.extractAttribute(sideXml, 'w:sz');\n if (sz) border.size = parseInt(sz.toString(), 10);\n const color = XMLParser.extractAttribute(sideXml, 'w:color');\n if (color) border.color = color;\n const space = XMLParser.extractAttribute(sideXml, 'w:space');\n if (space) border.space = parseInt(space.toString(), 10);\n const shadow = XMLParser.extractAttribute(sideXml, 'w:shadow');\n if (shadow === '1' || shadow === 'true') border.shadow = true;\n const frame = XMLParser.extractAttribute(sideXml, 'w:frame');\n if (frame === '1' || frame === 'true') border.frame = true;\n const themeColor = XMLParser.extractAttribute(sideXml, 'w:themeColor');\n if (themeColor) border.themeColor = themeColor;\n const artId = XMLParser.extractAttribute(sideXml, 'w:id');\n if (artId) border.artId = parseInt(artId.toString(), 10);\n return Object.keys(border).length > 0 ? border : undefined;\n };\n\n const sides = ['top', 'left', 'bottom', 'right'];\n for (const side of sides) {\n const sideElements = XMLParser.extractElements(pgBordersXml, `w:${side}`);\n if (sideElements.length > 0 && sideElements[0]) {\n const border = parseBorder(sideElements[0]);\n if (border) pageBorders[side] = border;\n }\n }\n\n if (Object.keys(pageBorders).length > 0) {\n sectionProps.pageBorders = pageBorders;\n }\n }\n }\n\n // Parse columns (enhanced with separator and custom widths)\n const colsElements = XMLParser.extractElements(sectPr, 'w:cols');\n if (colsElements.length > 0) {\n const cols = colsElements[0];\n if (cols) {\n const num = XMLParser.extractAttribute(cols, 'w:num');\n const space = XMLParser.extractAttribute(cols, 'w:space');\n const equalWidth = XMLParser.extractAttribute(cols, 'w:equalWidth');\n const sep = XMLParser.extractAttribute(cols, 'w:sep');\n\n // Extract individual column widths\n const colElements = XMLParser.extractElements(cols, 'w:col');\n const columnWidths: number[] = [];\n for (const col of colElements) {\n const width = XMLParser.extractAttribute(col, 'w:w');\n if (width) {\n columnWidths.push(parseInt(width.toString(), 10));\n }\n }\n\n // Helper to handle boolean conversion (XMLParser may return string or number)\n const toBool = (val: any) => val === '1' || val === 1 || val === 'true' || val === true;\n\n if (num) {\n sectionProps.columns = {\n count: parseInt(num.toString(), 10),\n space: space ? parseInt(space.toString(), 10) : undefined,\n equalWidth: equalWidth ? toBool(equalWidth) : undefined,\n separator: sep ? toBool(sep) : undefined,\n columnWidths: columnWidths.length > 0 ? columnWidths : undefined,\n };\n }\n }\n }\n\n // Parse section type\n const typeElements = XMLParser.extractElements(sectPr, 'w:type');\n if (typeElements.length > 0) {\n const type = typeElements[0];\n if (type) {\n const typeVal = XMLParser.extractAttribute(type, 'w:val') as SectionType;\n if (typeVal) {\n sectionProps.type = typeVal;\n }\n }\n }\n\n // Parse page numbering\n const pgNumTypeElements = XMLParser.extractElements(sectPr, 'w:pgNumType');\n if (pgNumTypeElements.length > 0) {\n const pgNumType = pgNumTypeElements[0];\n if (pgNumType) {\n const start = XMLParser.extractAttribute(pgNumType, 'w:start');\n const fmt = XMLParser.extractAttribute(pgNumType, 'w:fmt')!;\n\n sectionProps.pageNumbering = {\n start: start ? parseInt(start, 10) : undefined,\n format: fmt,\n };\n\n // Parse chapter numbering (w:chapStyle, w:chapSep)\n const chapStyle = XMLParser.extractAttribute(pgNumType, 'w:chapStyle');\n if (chapStyle) {\n sectionProps.chapStyle = parseInt(chapStyle, 10);\n }\n const chapSep = XMLParser.extractAttribute(pgNumType, 'w:chapSep');\n if (chapSep) {\n sectionProps.chapSep = chapSep as any;\n }\n }\n }\n\n // Parse title page flag\n if (XMLParser.hasSelfClosingTag(sectPr, 'w:titlePg')) {\n sectionProps.titlePage = true;\n }\n\n // Parse header references\n const headerRefs = XMLParser.extractElements(sectPr, 'w:headerReference');\n if (headerRefs.length > 0) {\n sectionProps.headers = {};\n for (const headerRef of headerRefs) {\n const type = XMLParser.extractAttribute(headerRef, 'w:type');\n const rId = XMLParser.extractAttribute(headerRef, 'r:id');\n if (type && rId) {\n if (type === 'default') sectionProps.headers.default = rId;\n else if (type === 'first') sectionProps.headers.first = rId;\n else if (type === 'even') sectionProps.headers.even = rId;\n }\n }\n }\n\n // Parse footer references\n const footerRefs = XMLParser.extractElements(sectPr, 'w:footerReference');\n if (footerRefs.length > 0) {\n sectionProps.footers = {};\n for (const footerRef of footerRefs) {\n const type = XMLParser.extractAttribute(footerRef, 'w:type');\n const rId = XMLParser.extractAttribute(footerRef, 'r:id');\n if (type && rId) {\n if (type === 'default') sectionProps.footers.default = rId;\n else if (type === 'first') sectionProps.footers.first = rId;\n else if (type === 'even') sectionProps.footers.even = rId;\n }\n }\n }\n\n // Parse vertical alignment\n const vAlignElements = XMLParser.extractElements(sectPr, 'w:vAlign');\n if (vAlignElements.length > 0) {\n const vAlign = vAlignElements[0];\n if (vAlign) {\n const val = XMLParser.extractAttribute(vAlign, 'w:val');\n if (val) {\n sectionProps.verticalAlignment = val as 'top' | 'center' | 'bottom' | 'both';\n }\n }\n }\n\n // Parse paper source\n const paperSrcElements = XMLParser.extractElements(sectPr, 'w:paperSrc');\n if (paperSrcElements.length > 0) {\n const paperSrc = paperSrcElements[0];\n if (paperSrc) {\n const first = XMLParser.extractAttribute(paperSrc, 'w:first');\n const other = XMLParser.extractAttribute(paperSrc, 'w:other');\n\n if (first || other) {\n sectionProps.paperSource = {\n first: first ? parseInt(first.toString(), 10) : undefined,\n other: other ? parseInt(other.toString(), 10) : undefined,\n };\n }\n }\n }\n\n // Parse text direction\n const textDirElements = XMLParser.extractElements(sectPr, 'w:textDirection');\n if (textDirElements.length > 0) {\n const textDir = textDirElements[0];\n if (textDir) {\n const val = XMLParser.extractAttribute(textDir, 'w:val');\n if (val) {\n // Reverse-map OOXML value \"lrTb\" to API shorthand \"ltr\".\n // \"tbRl\" and \"btLr\" are used directly in both OOXML and API.\n const reverseTextDirMap: Record<string, string> = {\n lrTb: 'ltr',\n };\n sectionProps.textDirection = (reverseTextDirMap[val] || val) as\n | 'ltr'\n | 'rtl'\n | 'tbRl'\n | 'btLr';\n }\n }\n }\n\n // Parse bidi (right-to-left section layout)\n if (XMLParser.hasSelfClosingTag(sectPr, 'w:bidi')) {\n sectionProps.bidi = true;\n }\n\n // Parse RTL gutter\n if (XMLParser.hasSelfClosingTag(sectPr, 'w:rtlGutter')) {\n sectionProps.rtlGutter = true;\n }\n\n // Parse document grid (w:docGrid)\n const docGridElements = XMLParser.extractElements(sectPr, 'w:docGrid');\n if (docGridElements.length > 0) {\n const docGrid = docGridElements[0];\n if (docGrid) {\n const gridType = XMLParser.extractAttribute(docGrid, 'w:type');\n const linePitch = XMLParser.extractAttribute(docGrid, 'w:linePitch');\n const charSpace = XMLParser.extractAttribute(docGrid, 'w:charSpace');\n sectionProps.docGrid = {};\n if (gridType) sectionProps.docGrid.type = gridType as any;\n if (linePitch) sectionProps.docGrid.linePitch = parseInt(linePitch, 10);\n if (charSpace) sectionProps.docGrid.charSpace = parseInt(charSpace, 10);\n }\n }\n\n // Parse line numbering (w:lnNumType)\n const lnNumElements = XMLParser.extractElements(sectPr, 'w:lnNumType');\n if (lnNumElements.length > 0) {\n const lnNum = lnNumElements[0];\n if (lnNum) {\n const countBy = XMLParser.extractAttribute(lnNum, 'w:countBy');\n const start = XMLParser.extractAttribute(lnNum, 'w:start');\n const distance = XMLParser.extractAttribute(lnNum, 'w:distance');\n const restart = XMLParser.extractAttribute(lnNum, 'w:restart');\n sectionProps.lineNumbering = {};\n if (countBy) sectionProps.lineNumbering.countBy = parseInt(countBy, 10);\n if (start) sectionProps.lineNumbering.start = parseInt(start, 10);\n if (distance) sectionProps.lineNumbering.distance = parseInt(distance, 10);\n if (restart) sectionProps.lineNumbering.restart = restart as any;\n }\n }\n\n // Helper to extract a single attribute from a child element\n const extractChildAttr = (\n parentXml: string,\n childTag: string,\n attr: string\n ): string | undefined => {\n const els = XMLParser.extractElements(parentXml, childTag);\n if (els.length > 0 && els[0]) return XMLParser.extractAttribute(els[0], attr);\n return undefined;\n };\n\n // Parse footnote properties (w:footnotePr)\n const footnotePrElements = XMLParser.extractElements(sectPr, 'w:footnotePr');\n if (footnotePrElements.length > 0 && footnotePrElements[0]) {\n const fnPr = footnotePrElements[0];\n const props: any = {};\n const pos = extractChildAttr(fnPr, 'w:pos', 'w:val');\n if (pos) props.position = pos;\n const fmt = extractChildAttr(fnPr, 'w:numFmt', 'w:val');\n if (fmt) props.numberFormat = fmt;\n const startVal = extractChildAttr(fnPr, 'w:numStart', 'w:val');\n if (startVal) props.startNumber = parseInt(startVal, 10);\n const restart = extractChildAttr(fnPr, 'w:numRestart', 'w:val');\n if (restart) props.restart = restart;\n if (Object.keys(props).length > 0) sectionProps.footnotePr = props;\n }\n\n // Parse endnote properties (w:endnotePr)\n const endnotePrElements = XMLParser.extractElements(sectPr, 'w:endnotePr');\n if (endnotePrElements.length > 0 && endnotePrElements[0]) {\n const enPr = endnotePrElements[0];\n const props: any = {};\n const pos = extractChildAttr(enPr, 'w:pos', 'w:val');\n if (pos) props.position = pos;\n const fmt = extractChildAttr(enPr, 'w:numFmt', 'w:val');\n if (fmt) props.numberFormat = fmt;\n const startVal = extractChildAttr(enPr, 'w:numStart', 'w:val');\n if (startVal) props.startNumber = parseInt(startVal, 10);\n const restart = extractChildAttr(enPr, 'w:numRestart', 'w:val');\n if (restart) props.restart = restart;\n if (Object.keys(props).length > 0) sectionProps.endnotePr = props;\n }\n\n // Parse noEndnote\n if (XMLParser.hasSelfClosingTag(sectPr, 'w:noEndnote')) {\n sectionProps.noEndnote = true;\n }\n\n // Parse form protection\n if (XMLParser.hasSelfClosingTag(sectPr, 'w:formProt')) {\n sectionProps.formProt = true;\n }\n\n // Parse printer settings (w:printerSettings r:id)\n const printerElements = XMLParser.extractElements(sectPr, 'w:printerSettings');\n if (printerElements.length > 0) {\n const printer = printerElements[0];\n if (printer) {\n const rId = XMLParser.extractAttribute(printer, 'r:id');\n if (rId) sectionProps.printerSettingsId = rId;\n }\n }\n\n const section = new Section(sectionProps);\n\n // Parse section property change (w:sectPrChange) per ECMA-376 Part 1 §17.13.5.32\n const sectPrChangeElements = XMLParser.extractElements(sectPr, 'w:sectPrChange');\n if (sectPrChangeElements.length > 0 && sectPrChangeElements[0]) {\n const changeXml = sectPrChangeElements[0];\n const id = XMLParser.extractAttribute(changeXml, 'w:id') || '0';\n const author = XMLParser.extractAttribute(changeXml, 'w:author') || '';\n const date = XMLParser.extractAttribute(changeXml, 'w:date') || '';\n\n // Extract the previous w:sectPr child\n const prevSectPrElements = XMLParser.extractElements(changeXml, 'w:sectPr');\n const prevSectPrXml = prevSectPrElements.length > 0 ? prevSectPrElements[0] : undefined;\n const prevProps = prevSectPrXml ? this.parsePreviousSectionProperties(prevSectPrXml) : {};\n\n section.setSectPrChange({ id, author, date, previousProperties: prevProps });\n }\n\n return section;\n } catch (error: unknown) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.parseErrors.push({ element: 'sectPr', error: err });\n\n if (this.strictParsing) {\n throw new Error(`Failed to parse section properties: ${err.message}`);\n }\n\n return null;\n }\n }\n\n /**\n * Parses a single style element from XML\n * @param styleXml - XML string of a single w:style element\n * @returns Parsed Style object or null if invalid\n */\n private parseStyle(styleXml: string): Style | null {\n // Extract style attributes\n const typeAttr = XMLParser.extractAttribute(styleXml, 'w:type') as StyleType;\n const styleId = XMLParser.extractAttribute(styleXml, 'w:styleId') || '';\n const defaultAttr = XMLParser.extractAttribute(styleXml, 'w:default');\n const customStyleAttr = XMLParser.extractAttribute(styleXml, 'w:customStyle');\n\n if (!styleId || !typeAttr) {\n return null; // Invalid style, missing required attributes\n }\n\n // Extract style name (handles both self-closing and non-self-closing tags)\n // First try self-closing tag: <w:name w:val=\"List Paragraph\"/>\n let name: string = styleId;\n const selfClosingNameAttrs = XMLParser.extractSelfClosingTag(styleXml, 'w:name');\n if (selfClosingNameAttrs) {\n // Got attributes like: ' w:val=\"List Paragraph\"'\n const extractedName = XMLParser.extractAttribute(`<w:name${selfClosingNameAttrs}/>`, 'w:val');\n if (extractedName) {\n name = extractedName;\n }\n } else {\n // Try non-self-closing: <w:name w:val=\"...\"></w:name>\n const nameElement = XMLParser.extractBetweenTags(styleXml, '<w:name', '</w:name>');\n if (nameElement) {\n const extractedName = XMLParser.extractAttribute(`<w:name${nameElement}`, 'w:val');\n if (extractedName) {\n name = extractedName;\n }\n }\n }\n\n // Extract basedOn\n const basedOnElement = XMLParser.extractBetweenTags(styleXml, '<w:basedOn', '</w:basedOn>');\n const basedOn = basedOnElement\n ? XMLParser.extractAttribute(`<w:basedOn${basedOnElement}`, 'w:val')\n : undefined;\n\n // Extract next\n const nextElement = XMLParser.extractBetweenTags(styleXml, '<w:next', '</w:next>');\n const next = nextElement\n ? XMLParser.extractAttribute(`<w:next${nextElement}`, 'w:val')\n : undefined;\n\n // Parse paragraph formatting (w:pPr)\n let paragraphFormatting: ParagraphFormatting | undefined;\n let styleNumPr: { numId?: number; ilvl?: number } | undefined;\n const pPrXml = XMLParser.extractBetweenTags(styleXml, '<w:pPr>', '</w:pPr>');\n if (pPrXml) {\n paragraphFormatting = this.parseParagraphFormattingFromXml(pPrXml);\n\n // Parse numPr (numbering properties) from style's paragraph properties\n // Styles like ListParagraph can inherit list formatting via numPr\n const numPrXml = XMLParser.extractBetweenTags(pPrXml, '<w:numPr>', '</w:numPr>');\n if (numPrXml) {\n styleNumPr = {};\n const numIdMatch = /<w:numId[^>]*w:val=\"(\\d+)\"/.exec(numPrXml);\n if (numIdMatch?.[1]) {\n styleNumPr.numId = parseInt(numIdMatch[1], 10);\n }\n const ilvlMatch = /<w:ilvl[^>]*w:val=\"(\\d+)\"/.exec(numPrXml);\n if (ilvlMatch?.[1]) {\n styleNumPr.ilvl = parseInt(ilvlMatch[1], 10);\n }\n }\n }\n\n // Parse run formatting (w:rPr)\n let runFormatting: RunFormatting | undefined;\n const rPrXml = XMLParser.extractBetweenTags(styleXml, '<w:rPr>', '</w:rPr>');\n if (rPrXml) {\n runFormatting = this.parseRunFormattingFromXml(rPrXml);\n }\n\n // Parse metadata properties (Phase 5.3)\n // qFormat - Quick style gallery\n const qFormat = styleXml.includes('<w:qFormat/>') || styleXml.includes('<w:qFormat ');\n\n // semiHidden - Hide from recommended list\n const semiHidden = styleXml.includes('<w:semiHidden/>') || styleXml.includes('<w:semiHidden ');\n\n // unhideWhenUsed - Auto-show when applied\n const unhideWhenUsed =\n styleXml.includes('<w:unhideWhenUsed/>') || styleXml.includes('<w:unhideWhenUsed ');\n\n // locked - Prevent modification\n const locked = styleXml.includes('<w:locked/>') || styleXml.includes('<w:locked ');\n\n // personal - User-specific style\n const personal = styleXml.includes('<w:personal/>') || styleXml.includes('<w:personal ');\n\n // personalCompose - Style for composing new messages\n const personalCompose =\n styleXml.includes('<w:personalCompose/>') || styleXml.includes('<w:personalCompose ');\n\n // personalReply - Style for replying to messages\n const personalReply =\n styleXml.includes('<w:personalReply/>') || styleXml.includes('<w:personalReply ');\n\n // autoRedefine - Update style from formatting\n const autoRedefine =\n styleXml.includes('<w:autoRedefine/>') || styleXml.includes('<w:autoRedefine ');\n\n // uiPriority - Sort order\n let uiPriority: number | undefined;\n if (styleXml.includes('<w:uiPriority')) {\n const uiPriorityStart = styleXml.indexOf('<w:uiPriority');\n const uiPriorityEnd = styleXml.indexOf('/>', uiPriorityStart);\n if (uiPriorityEnd !== -1) {\n const uiPriorityTag = styleXml.substring(uiPriorityStart, uiPriorityEnd + 2);\n const valStr = XMLParser.extractAttribute(uiPriorityTag, 'w:val');\n if (valStr) {\n uiPriority = parseInt(valStr, 10);\n }\n }\n }\n\n // link - Linked character/paragraph style\n let link: string | undefined;\n if (styleXml.includes('<w:link')) {\n const linkStart = styleXml.indexOf('<w:link');\n const linkEnd = styleXml.indexOf('/>', linkStart);\n if (linkEnd !== -1) {\n const linkTag = styleXml.substring(linkStart, linkEnd + 2);\n link = XMLParser.extractAttribute(linkTag, 'w:val') || undefined;\n }\n }\n\n // aliases - Alternative names\n let aliases: string | undefined;\n if (styleXml.includes('<w:aliases')) {\n const aliasesStart = styleXml.indexOf('<w:aliases');\n const aliasesEnd = styleXml.indexOf('/>', aliasesStart);\n if (aliasesEnd !== -1) {\n const aliasesTag = styleXml.substring(aliasesStart, aliasesEnd + 2);\n aliases = XMLParser.extractAttribute(aliasesTag, 'w:val') || undefined;\n }\n }\n\n // Parse table style properties (Phase 5.1)\n let tableStyle: import('../formatting/Style').TableStyleProperties | undefined;\n if (typeAttr === 'table') {\n tableStyle = this.parseTableStyleProperties(styleXml);\n }\n\n // Create style properties\n const properties: StyleProperties = {\n styleId,\n name,\n type: typeAttr,\n basedOn,\n next,\n isDefault: defaultAttr === '1' || defaultAttr === 'true',\n customStyle: customStyleAttr === '1' || customStyleAttr === 'true',\n paragraphFormatting,\n numPr: styleNumPr,\n runFormatting,\n tableStyle,\n // Metadata properties (Phase 5.3)\n qFormat: qFormat || undefined,\n semiHidden: semiHidden || undefined,\n unhideWhenUsed: unhideWhenUsed || undefined,\n locked: locked || undefined,\n personal: personal || undefined,\n personalCompose: personalCompose || undefined,\n personalReply: personalReply || undefined,\n autoRedefine: autoRedefine || undefined,\n uiPriority,\n link,\n aliases,\n };\n\n return Style.create(properties);\n }\n\n /**\n * Parses paragraph formatting from XML (w:pPr element content)\n * @param pPrXml - XML content inside w:pPr tags\n * @returns ParagraphFormatting object\n */\n private parseParagraphFormattingFromXml(pPrXml: string): ParagraphFormatting {\n const formatting: ParagraphFormatting = {};\n\n // Parse alignment (w:jc)\n const jcElement = XMLParser.extractSelfClosingTag(pPrXml, 'w:jc');\n if (jcElement) {\n const alignment = XMLParser.extractAttribute(`<w:jc${jcElement}`, 'w:val');\n if (alignment) {\n formatting.alignment = alignment as 'left' | 'center' | 'right' | 'justify';\n }\n }\n\n // Parse spacing (w:spacing)\n const spacingElement = XMLParser.extractSelfClosingTag(pPrXml, 'w:spacing');\n if (spacingElement) {\n const before = XMLParser.extractAttribute(`<w:spacing${spacingElement}`, 'w:before');\n const after = XMLParser.extractAttribute(`<w:spacing${spacingElement}`, 'w:after');\n const line = XMLParser.extractAttribute(`<w:spacing${spacingElement}`, 'w:line');\n const lineRule = XMLParser.extractAttribute(`<w:spacing${spacingElement}`, 'w:lineRule');\n\n // Validate lineRule\n let validatedLineRule: 'auto' | 'exact' | 'atLeast' | undefined;\n if (lineRule) {\n const validLineRules = ['auto', 'exact', 'atLeast'];\n if (validLineRules.includes(lineRule)) {\n validatedLineRule = lineRule as 'auto' | 'exact' | 'atLeast';\n }\n }\n\n formatting.spacing = {\n before: before ? parseInt(before, 10) : undefined,\n after: after ? parseInt(after, 10) : undefined,\n // If lineRule exists without line, use default 240 twips\n line: line ? parseInt(line, 10) : validatedLineRule ? 240 : undefined,\n lineRule: validatedLineRule,\n };\n }\n\n // Parse indentation (w:ind)\n const indElement = XMLParser.extractSelfClosingTag(pPrXml, 'w:ind');\n if (indElement) {\n const left = XMLParser.extractAttribute(`<w:ind${indElement}`, 'w:left');\n const right = XMLParser.extractAttribute(`<w:ind${indElement}`, 'w:right');\n const firstLine = XMLParser.extractAttribute(`<w:ind${indElement}`, 'w:firstLine');\n const hanging = XMLParser.extractAttribute(`<w:ind${indElement}`, 'w:hanging');\n\n formatting.indentation = {\n left: left ? parseInt(left, 10) : undefined,\n right: right ? parseInt(right, 10) : undefined,\n firstLine: firstLine ? parseInt(firstLine, 10) : undefined,\n hanging: hanging ? parseInt(hanging, 10) : undefined,\n };\n }\n\n // Parse boolean properties\n if (pPrXml.includes('<w:keepNext/>') || pPrXml.includes('<w:keepNext ')) {\n formatting.keepNext = true;\n }\n if (pPrXml.includes('<w:keepLines/>') || pPrXml.includes('<w:keepLines ')) {\n formatting.keepLines = true;\n }\n if (pPrXml.includes('<w:pageBreakBefore/>') || pPrXml.includes('<w:pageBreakBefore ')) {\n formatting.pageBreakBefore = true;\n }\n\n // Contextual spacing per ECMA-376 Part 1 §17.3.1.8\n // \"Don't add space between paragraphs of the same style\"\n if (pPrXml.includes('<w:contextualSpacing/>') || pPrXml.includes('<w:contextualSpacing ')) {\n formatting.contextualSpacing = true;\n }\n\n // Parse outline level (w:outlineLvl) - used for TOC generation\n // Per ECMA-376 Part 1 §17.3.1.20: val is 0-8 (heading levels 1-9)\n const outlineLvlElement = XMLParser.extractSelfClosingTag(pPrXml, 'w:outlineLvl');\n if (outlineLvlElement) {\n const outlineVal = XMLParser.extractAttribute(`<w:outlineLvl${outlineLvlElement}`, 'w:val');\n if (outlineVal) {\n const level = parseInt(outlineVal, 10);\n if (!isNaN(level) && level >= 0 && level <= 8) {\n formatting.outlineLevel = level;\n }\n }\n }\n\n // Parse shading (w:shd) per ECMA-376 Part 1 §17.3.1.32\n const shading = this.parseShadingFromXml(pPrXml);\n if (shading) {\n formatting.shading = shading;\n }\n\n return formatting;\n }\n\n /**\n * Parses run formatting from XML (w:rPr element content)\n * @param rPrXml - XML content inside w:rPr tags\n * @returns RunFormatting object\n */\n private parseRunFormattingFromXml(rPrXml: string): RunFormatting {\n const formatting: RunFormatting = {};\n\n // Parse boolean properties\n if (rPrXml.includes('<w:b/>') || rPrXml.includes('<w:b ')) {\n formatting.bold = true;\n }\n if (rPrXml.includes('<w:i/>') || rPrXml.includes('<w:i ')) {\n formatting.italic = true;\n }\n if (rPrXml.includes('<w:strike/>') || rPrXml.includes('<w:strike ')) {\n formatting.strike = true;\n }\n if (rPrXml.includes('<w:smallCaps/>') || rPrXml.includes('<w:smallCaps ')) {\n formatting.smallCaps = true;\n }\n if (rPrXml.includes('<w:caps/>') || rPrXml.includes('<w:caps ')) {\n formatting.allCaps = true;\n }\n\n // Parse underline - use extractSelfClosingTag for accuracy\n const uElement = XMLParser.extractSelfClosingTag(rPrXml, 'w:u');\n if (uElement) {\n const uVal = XMLParser.extractAttribute(`<w:u${uElement}`, 'w:val');\n if (\n uVal === 'single' ||\n uVal === 'double' ||\n uVal === 'thick' ||\n uVal === 'dotted' ||\n uVal === 'dash' ||\n uVal === 'none'\n ) {\n formatting.underline = uVal;\n } else {\n formatting.underline = true;\n }\n }\n\n // Parse subscript/superscript - use extractSelfClosingTag\n const vertAlignElement = XMLParser.extractSelfClosingTag(rPrXml, 'w:vertAlign');\n if (vertAlignElement) {\n const val = XMLParser.extractAttribute(`<w:vertAlign${vertAlignElement}`, 'w:val');\n if (val === 'subscript') {\n formatting.subscript = true;\n } else if (val === 'superscript') {\n formatting.superscript = true;\n }\n }\n\n // Parse font (w:rFonts) - use extractSelfClosingTag\n const rFontsElement = XMLParser.extractSelfClosingTag(rPrXml, 'w:rFonts');\n if (rFontsElement) {\n const ascii = XMLParser.extractAttribute(`<w:rFonts${rFontsElement}`, 'w:ascii');\n if (ascii) {\n formatting.font = ascii;\n }\n }\n\n // Parse size (w:sz) - size is in half-points\n // Use extractSelfClosingTag to avoid matching w:szCs\n const szElement = XMLParser.extractSelfClosingTag(rPrXml, 'w:sz');\n if (szElement) {\n const val = XMLParser.extractAttribute(`<w:sz${szElement}`, 'w:val');\n if (val) {\n formatting.size = halfPointsToPoints(parseInt(val, 10));\n }\n }\n\n // Parse color (w:color)\n // Use extractSelfClosingTag to avoid matching other tags\n const colorElement = XMLParser.extractSelfClosingTag(rPrXml, 'w:color');\n if (colorElement) {\n const val = XMLParser.extractAttribute(`<w:color${colorElement}`, 'w:val');\n if (val && val !== 'auto') {\n formatting.color = val;\n }\n }\n\n // Parse highlight (w:highlight) - use extractSelfClosingTag\n const highlightElement = XMLParser.extractSelfClosingTag(rPrXml, 'w:highlight');\n if (highlightElement) {\n const val = XMLParser.extractAttribute(`<w:highlight${highlightElement}`, 'w:val');\n if (val) {\n const validHighlights = [\n 'yellow',\n 'green',\n 'cyan',\n 'magenta',\n 'blue',\n 'red',\n 'darkBlue',\n 'darkCyan',\n 'darkGreen',\n 'darkMagenta',\n 'darkRed',\n 'darkYellow',\n 'darkGray',\n 'lightGray',\n 'black',\n 'white',\n ];\n if (validHighlights.includes(val)) {\n formatting.highlight = val as\n | 'yellow'\n | 'green'\n | 'cyan'\n | 'magenta'\n | 'blue'\n | 'red'\n | 'darkBlue'\n | 'darkCyan'\n | 'darkGreen'\n | 'darkMagenta'\n | 'darkRed'\n | 'darkYellow'\n | 'darkGray'\n | 'lightGray'\n | 'black'\n | 'white';\n }\n }\n }\n\n // Parse shading (w:shd) per ECMA-376 Part 1 §17.3.2.32\n const shading = this.parseShadingFromXml(rPrXml);\n if (shading) {\n formatting.shading = shading;\n }\n\n return formatting;\n }\n\n /**\n * Parses table style properties from style XML (Phase 5.1)\n * @param styleXml - XML string of a table style element\n * @returns TableStyleProperties object\n */\n private parseTableStyleProperties(\n styleXml: string\n ): import('../formatting/Style').TableStyleProperties {\n const tableStyle: import('../formatting/Style').TableStyleProperties = {};\n\n // Parse tblPr (table properties)\n const tblPrXml = XMLParser.extractBetweenTags(styleXml, '<w:tblPr>', '</w:tblPr>');\n if (tblPrXml) {\n tableStyle.table = this.parseTableFormattingFromXml(tblPrXml);\n\n // Row band size\n if (tblPrXml.includes('<w:tblStyleRowBandSize')) {\n const tag = XMLParser.extractSelfClosingTag(tblPrXml, 'w:tblStyleRowBandSize');\n if (tag) {\n const val = XMLParser.extractAttribute(`<w:tblStyleRowBandSize${tag}`, 'w:val');\n if (val) {\n tableStyle.rowBandSize = parseInt(val, 10);\n }\n }\n }\n\n // Column band size\n if (tblPrXml.includes('<w:tblStyleColBandSize')) {\n const tag = XMLParser.extractSelfClosingTag(tblPrXml, 'w:tblStyleColBandSize');\n if (tag) {\n const val = XMLParser.extractAttribute(`<w:tblStyleColBandSize${tag}`, 'w:val');\n if (val) {\n tableStyle.colBandSize = parseInt(val, 10);\n }\n }\n }\n }\n\n // Parse tcPr (cell properties)\n const tcPrXml = XMLParser.extractBetweenTags(styleXml, '<w:tcPr>', '</w:tcPr>');\n if (tcPrXml) {\n tableStyle.cell = this.parseTableCellFormattingFromXml(tcPrXml);\n }\n\n // Parse trPr (row properties)\n const trPrXml = XMLParser.extractBetweenTags(styleXml, '<w:trPr>', '</w:trPr>');\n if (trPrXml) {\n tableStyle.row = this.parseTableRowFormattingFromXml(trPrXml);\n }\n\n // Parse tblStylePr (conditional formatting)\n tableStyle.conditionalFormatting = this.parseConditionalFormattingFromXml(styleXml);\n\n return tableStyle;\n }\n\n /**\n * Parses table formatting from tblPr XML (Phase 5.1)\n */\n private parseTableFormattingFromXml(\n tblPrXml: string\n ): import('../formatting/Style').TableStyleFormatting {\n const formatting: import('../formatting/Style').TableStyleFormatting = {};\n\n // Parse indent\n if (tblPrXml.includes('<w:tblInd')) {\n const tag = XMLParser.extractSelfClosingTag(tblPrXml, 'w:tblInd');\n if (tag) {\n const w = XMLParser.extractAttribute(`<w:tblInd${tag}`, 'w:w');\n if (w) {\n formatting.indent = parseInt(w, 10);\n }\n }\n }\n\n // Parse alignment\n if (tblPrXml.includes('<w:jc')) {\n const tag = XMLParser.extractSelfClosingTag(tblPrXml, 'w:jc');\n if (tag) {\n const val = XMLParser.extractAttribute(`<w:jc${tag}`, 'w:val');\n if (val === 'left' || val === 'center' || val === 'right') {\n formatting.alignment = val;\n }\n }\n }\n\n // Parse cell spacing\n if (tblPrXml.includes('<w:tblCellSpacing')) {\n const tag = XMLParser.extractSelfClosingTag(tblPrXml, 'w:tblCellSpacing');\n if (tag) {\n const w = XMLParser.extractAttribute(`<w:tblCellSpacing${tag}`, 'w:w');\n if (w) {\n formatting.cellSpacing = parseInt(w, 10);\n }\n }\n }\n\n // Parse borders\n const bordersXml = XMLParser.extractBetweenTags(tblPrXml, '<w:tblBorders>', '</w:tblBorders>');\n if (bordersXml) {\n formatting.borders = this.parseBordersFromXml(bordersXml, false);\n }\n\n // Parse shading\n if (tblPrXml.includes('<w:shd')) {\n formatting.shading = this.parseShadingFromXml(tblPrXml);\n }\n\n // Parse cell margins\n const marginXml = XMLParser.extractBetweenTags(tblPrXml, '<w:tblCellMar>', '</w:tblCellMar>');\n if (marginXml) {\n formatting.cellMargins = this.parseCellMarginsFromXml(marginXml);\n }\n\n return formatting;\n }\n\n /**\n * Parses table cell formatting from tcPr XML (Phase 5.1)\n */\n private parseTableCellFormattingFromXml(\n tcPrXml: string\n ): import('../formatting/Style').TableCellStyleFormatting {\n const formatting: import('../formatting/Style').TableCellStyleFormatting = {};\n\n // Parse borders\n const bordersXml = XMLParser.extractBetweenTags(tcPrXml, '<w:tcBorders>', '</w:tcBorders>');\n if (bordersXml) {\n formatting.borders = this.parseBordersFromXml(\n bordersXml,\n true\n ) as import('../formatting/Style').CellBorders;\n }\n\n // Parse shading\n if (tcPrXml.includes('<w:shd')) {\n formatting.shading = this.parseShadingFromXml(tcPrXml);\n }\n\n // Parse margins\n const marginXml = XMLParser.extractBetweenTags(tcPrXml, '<w:tcMar>', '</w:tcMar>');\n if (marginXml) {\n formatting.margins = this.parseCellMarginsFromXml(marginXml);\n }\n\n // Parse vertical alignment\n if (tcPrXml.includes('<w:vAlign')) {\n const tag = XMLParser.extractSelfClosingTag(tcPrXml, 'w:vAlign');\n if (tag) {\n const val = XMLParser.extractAttribute(`<w:vAlign${tag}`, 'w:val');\n if (val === 'top' || val === 'center' || val === 'bottom') {\n formatting.verticalAlignment = val;\n }\n }\n }\n\n return formatting;\n }\n\n /**\n * Parses table row formatting from trPr XML (Phase 5.1)\n */\n private parseTableRowFormattingFromXml(\n trPrXml: string\n ): import('../formatting/Style').TableRowStyleFormatting {\n const formatting: import('../formatting/Style').TableRowStyleFormatting = {};\n\n // Parse height\n if (trPrXml.includes('<w:trHeight')) {\n const tag = XMLParser.extractSelfClosingTag(trPrXml, 'w:trHeight');\n if (tag) {\n const val = XMLParser.extractAttribute(`<w:trHeight${tag}`, 'w:val');\n const hRule = XMLParser.extractAttribute(`<w:trHeight${tag}`, 'w:hRule');\n if (val) {\n formatting.height = parseInt(val, 10);\n }\n if (hRule === 'auto' || hRule === 'exact' || hRule === 'atLeast') {\n formatting.heightRule = hRule;\n }\n }\n }\n\n // Parse cantSplit\n if (trPrXml.includes('<w:cantSplit/>') || trPrXml.includes('<w:cantSplit ')) {\n formatting.cantSplit = true;\n }\n\n // Parse tblHeader (isHeader)\n if (trPrXml.includes('<w:tblHeader/>') || trPrXml.includes('<w:tblHeader ')) {\n formatting.isHeader = true;\n }\n\n return formatting;\n }\n\n /**\n * Parses conditional formatting from style XML (Phase 5.1)\n */\n private parseConditionalFormattingFromXml(\n styleXml: string\n ): import('../formatting/Style').ConditionalTableFormatting[] | undefined {\n const conditionalFormatting: import('../formatting/Style').ConditionalTableFormatting[] = [];\n\n // Find all tblStylePr elements\n let searchFrom = 0;\n while (true) {\n const startIdx = styleXml.indexOf('<w:tblStylePr', searchFrom);\n if (startIdx === -1) break;\n\n const endIdx = styleXml.indexOf('</w:tblStylePr>', startIdx);\n if (endIdx === -1) break;\n\n const tblStylePrXml = styleXml.substring(startIdx, endIdx + 15); // 15 = length of \"</w:tblStylePr>\"\n\n // Extract type attribute\n const typeAttr = XMLParser.extractAttribute(tblStylePrXml, 'w:type');\n if (typeAttr) {\n const conditional: import('../formatting/Style').ConditionalTableFormatting = {\n type: typeAttr as import('../formatting/Style').ConditionalFormattingType,\n };\n\n // Parse pPr\n const pPrXml = XMLParser.extractBetweenTags(tblStylePrXml, '<w:pPr>', '</w:pPr>');\n if (pPrXml) {\n conditional.paragraphFormatting = this.parseParagraphFormattingFromXml(pPrXml);\n }\n\n // Parse rPr\n const rPrXml = XMLParser.extractBetweenTags(tblStylePrXml, '<w:rPr>', '</w:rPr>');\n if (rPrXml) {\n conditional.runFormatting = this.parseRunFormattingFromXml(rPrXml);\n }\n\n // Parse tblPr\n const tblPrXml = XMLParser.extractBetweenTags(tblStylePrXml, '<w:tblPr>', '</w:tblPr>');\n if (tblPrXml) {\n conditional.tableFormatting = this.parseTableFormattingFromXml(tblPrXml);\n }\n\n // Parse tcPr\n const tcPrXml = XMLParser.extractBetweenTags(tblStylePrXml, '<w:tcPr>', '</w:tcPr>');\n if (tcPrXml) {\n conditional.cellFormatting = this.parseTableCellFormattingFromXml(tcPrXml);\n }\n\n // Parse trPr\n const trPrXml = XMLParser.extractBetweenTags(tblStylePrXml, '<w:trPr>', '</w:trPr>');\n if (trPrXml) {\n conditional.rowFormatting = this.parseTableRowFormattingFromXml(trPrXml);\n }\n\n conditionalFormatting.push(conditional);\n }\n\n searchFrom = endIdx + 15;\n }\n\n return conditionalFormatting.length > 0 ? conditionalFormatting : undefined;\n }\n\n /**\n * Parses borders from XML (Phase 5.1)\n * @param bordersXml - XML content from tblBorders or tcBorders\n * @param includeDiagonals - Whether to include diagonal borders (for cells)\n */\n private parseBordersFromXml(\n bordersXml: string,\n includeDiagonals: boolean\n ): import('../formatting/Style').TableBorders | import('../formatting/Style').CellBorders {\n const borders: any = {};\n\n const borderTypes = ['top', 'bottom', 'left', 'right', 'insideH', 'insideV'];\n for (const type of borderTypes) {\n if (bordersXml.includes(`<w:${type}`)) {\n const tag = XMLParser.extractSelfClosingTag(bordersXml, `w:${type}`);\n if (tag) {\n const style = XMLParser.extractAttribute(`<w:${type}${tag}`, 'w:val');\n const size = XMLParser.extractAttribute(`<w:${type}${tag}`, 'w:sz');\n const space = XMLParser.extractAttribute(`<w:${type}${tag}`, 'w:space');\n const color = XMLParser.extractAttribute(`<w:${type}${tag}`, 'w:color');\n\n const border: import('../formatting/Style').BorderProperties = {};\n if (style) border.style = style as any;\n if (size) border.size = parseInt(size, 10);\n if (space) border.space = parseInt(space, 10);\n if (color) border.color = color;\n\n if (Object.keys(border).length > 0) {\n borders[type] = border;\n }\n }\n }\n }\n\n // Add diagonal borders for cells\n if (includeDiagonals) {\n const diagonalTypes = ['tl2br', 'tr2bl'];\n for (const type of diagonalTypes) {\n if (bordersXml.includes(`<w:${type}`)) {\n const tag = XMLParser.extractSelfClosingTag(bordersXml, `w:${type}`);\n if (tag) {\n const style = XMLParser.extractAttribute(`<w:${type}${tag}`, 'w:val');\n const size = XMLParser.extractAttribute(`<w:${type}${tag}`, 'w:sz');\n const space = XMLParser.extractAttribute(`<w:${type}${tag}`, 'w:space');\n const color = XMLParser.extractAttribute(`<w:${type}${tag}`, 'w:color');\n\n const border: import('../formatting/Style').BorderProperties = {};\n if (style) border.style = style as any;\n if (size) border.size = parseInt(size, 10);\n if (space) border.space = parseInt(space, 10);\n if (color) border.color = color;\n\n if (Object.keys(border).length > 0) {\n borders[type] = border;\n }\n }\n }\n }\n }\n\n return borders;\n }\n\n /**\n * Parses shading from an object-based XML representation (parseToObject format).\n * Extracts all 9 ECMA-376 shading attributes including theme colors.\n */\n private parseShadingFromObj(shd: any): ShadingConfig | undefined {\n const shading: ShadingConfig = {};\n if (shd['@_w:val']) shading.pattern = shd['@_w:val'];\n if (shd['@_w:fill']) shading.fill = shd['@_w:fill'];\n if (shd['@_w:color']) shading.color = shd['@_w:color'];\n if (shd['@_w:themeFill']) shading.themeFill = shd['@_w:themeFill'];\n if (shd['@_w:themeColor']) shading.themeColor = shd['@_w:themeColor'];\n if (shd['@_w:themeFillTint']) shading.themeFillTint = shd['@_w:themeFillTint'];\n if (shd['@_w:themeFillShade']) shading.themeFillShade = shd['@_w:themeFillShade'];\n if (shd['@_w:themeTint']) shading.themeTint = shd['@_w:themeTint'];\n if (shd['@_w:themeShade']) shading.themeShade = shd['@_w:themeShade'];\n return Object.keys(shading).length > 0 ? shading : undefined;\n }\n\n /**\n * Parses shading from XML (Phase 5.1)\n */\n private parseShadingFromXml(xml: string): ShadingConfig | undefined {\n const tag = XMLParser.extractSelfClosingTag(xml, 'w:shd');\n if (!tag) return undefined;\n\n const shading: ShadingConfig = {};\n const fullTag = `<w:shd${tag}`;\n const val = XMLParser.extractAttribute(fullTag, 'w:val');\n const color = XMLParser.extractAttribute(fullTag, 'w:color');\n const fill = XMLParser.extractAttribute(fullTag, 'w:fill');\n const themeFill = XMLParser.extractAttribute(fullTag, 'w:themeFill');\n const themeColor = XMLParser.extractAttribute(fullTag, 'w:themeColor');\n const themeFillTint = XMLParser.extractAttribute(fullTag, 'w:themeFillTint');\n const themeFillShade = XMLParser.extractAttribute(fullTag, 'w:themeFillShade');\n const themeTint = XMLParser.extractAttribute(fullTag, 'w:themeTint');\n const themeShade = XMLParser.extractAttribute(fullTag, 'w:themeShade');\n\n if (val) shading.pattern = val as ShadingConfig['pattern'];\n if (color) shading.color = color;\n if (fill) shading.fill = fill;\n if (themeFill) shading.themeFill = themeFill;\n if (themeColor) shading.themeColor = themeColor;\n if (themeFillTint) shading.themeFillTint = themeFillTint;\n if (themeFillShade) shading.themeFillShade = themeFillShade;\n if (themeTint) shading.themeTint = themeTint;\n if (themeShade) shading.themeShade = themeShade;\n\n return Object.keys(shading).length > 0 ? shading : undefined;\n }\n\n /**\n * Parses cell margins from XML (Phase 5.1)\n */\n private parseCellMarginsFromXml(\n marginXml: string\n ): import('../formatting/Style').CellMargins | undefined {\n const margins: import('../formatting/Style').CellMargins = {};\n\n const marginTypes = ['top', 'bottom', 'left', 'right'];\n for (const type of marginTypes) {\n if (marginXml.includes(`<w:${type}`)) {\n const tag = XMLParser.extractSelfClosingTag(marginXml, `w:${type}`);\n if (tag) {\n const w = XMLParser.extractAttribute(`<w:${type}${tag}`, 'w:w');\n if (w) {\n margins[type as keyof import('../formatting/Style').CellMargins] = parseInt(w, 10);\n }\n }\n }\n }\n\n return Object.keys(margins).length > 0 ? margins : undefined;\n }\n\n /**\n * Helper: Gets raw XML string from a document part\n * Utility function for parser to retrieve unparsed XML content\n * @param zipHandler - ZIP handler containing the document\n * @param partName - Part path (e.g., 'word/document.xml')\n * @returns Raw XML string or null if not found\n */\n static getRawXml(zipHandler: ZipHandler, partName: string): string | null {\n try {\n const file = zipHandler.getFile(partName);\n if (!file) {\n return null;\n }\n\n // If already a string, return as-is\n if (typeof file.content === 'string') {\n return file.content;\n }\n\n // If Buffer, decode as UTF-8\n if (Buffer.isBuffer(file.content)) {\n return file.content.toString('utf8');\n }\n\n return null;\n } catch (error: unknown) {\n return null;\n }\n }\n\n /**\n * Helper: Updates raw XML content in a document part\n * Utility function for parser to set unparsed XML content\n * @param zipHandler - ZIP handler containing the document\n * @param partName - Part path (e.g., 'word/document.xml')\n * @param xmlContent - Raw XML string to set\n * @returns True if successful, false otherwise\n */\n static setRawXml(zipHandler: ZipHandler, partName: string, xmlContent: string): boolean {\n try {\n if (typeof xmlContent !== 'string') {\n return false;\n }\n\n // Add or update the file in the ZIP handler\n // Convert string to UTF-8 Buffer for consistent encoding\n zipHandler.addFile(partName, Buffer.from(xmlContent, 'utf8'), {\n binary: true,\n });\n return true;\n } catch (error: unknown) {\n return false;\n }\n }\n\n /**\n * Helper: Gets relationships for a specific document part\n * Utility function for parser to access .rels files\n * @param zipHandler - ZIP handler containing the document\n * @param partName - Part name to get relationships for (e.g., 'word/document.xml')\n * @returns Array of relationships for that part, or empty array if none found\n */\n static getRelationships(\n zipHandler: ZipHandler,\n partName: string\n ): {\n id?: string;\n type?: string;\n target?: string;\n targetMode?: string;\n }[] {\n try {\n // Construct the .rels path from the part name\n // For 'word/document.xml' -> 'word/_rels/document.xml.rels'\n const lastSlash = partName.lastIndexOf('/');\n const relsPath =\n lastSlash === -1\n ? `_rels/${partName}.rels`\n : `${partName.substring(0, lastSlash)}/_rels/${partName.substring(lastSlash + 1)}.rels`;\n\n const relsContent = zipHandler.getFileAsString(relsPath);\n if (!relsContent) {\n return [];\n }\n\n interface ParsedRelationship {\n id?: string;\n type?: string;\n target?: string;\n targetMode?: string;\n }\n\n const relationships: ParsedRelationship[] = [];\n\n // Parse relationship XML\n const relPattern = /<Relationship\\s+([^>]+)\\/>/g;\n let match;\n\n while ((match = relPattern.exec(relsContent)) !== null) {\n const attrs = match[1];\n if (!attrs) continue;\n\n const rel: ParsedRelationship = {};\n\n // Extract attributes\n const idMatch = /Id=\"([^\"]+)\"/.exec(attrs);\n const typeMatch = /Type=\"([^\"]+)\"/.exec(attrs);\n const targetMatch = /Target=\"([^\"]+)\"/.exec(attrs);\n const modeMatch = /TargetMode=\"([^\"]+)\"/.exec(attrs);\n\n if (idMatch) rel.id = idMatch[1];\n if (typeMatch) rel.type = typeMatch[1];\n if (targetMatch) rel.target = targetMatch[1];\n if (modeMatch) rel.targetMode = modeMatch[1];\n\n relationships.push(rel);\n }\n\n return relationships;\n } catch (error: unknown) {\n return [];\n }\n }\n\n /**\n * Parses and extracts all namespace declarations from the root <w:document> tag\n *\n * @param docXml - The full XML content of word/document.xml\n * @returns A record of namespace prefixes to their URIs\n *\n * **Known Limitation - Default Namespace Not Extracted:**\n *\n * This method intentionally does NOT extract the default namespace (`xmlns=\"...\"`).\n * Only prefixed namespaces (`xmlns:w`, `xmlns:r`, etc.) are extracted.\n *\n * **Rationale:**\n * 1. Word documents use prefixed namespaces exclusively (w:p, w:r, w:t)\n * 2. Adding a default namespace to <w:document> causes document corruption\n * 3. Microsoft Word and LibreOffice reject documents with default namespaces\n * 4. ECMA-376 examples show only prefixed namespace declarations\n *\n * **Impact:**\n * - If an input document has a default namespace, it will be lost during round-trip\n * - This is rare (valid OOXML documents don't use default namespaces)\n * - Documents using default namespace are likely non-standard or corrupted\n *\n * **Per ECMA-376 Part 1 Section 11.3.4:**\n * The document element should use the WordprocessingML namespace with prefix.\n *\n * @see ECMA-376-1:2016 Part 1, Section 11.3.4\n */\n private parseNamespaces(docXml: string): Record<string, string> {\n const namespaces: Record<string, string> = {};\n const docTagMatch = /<w:document([^>]+)>/.exec(docXml);\n\n if (docTagMatch?.[1]) {\n const attributes = docTagMatch[1];\n const nsPattern = /xmlns:([^=]+)=\"([^\"]+)\"/g;\n let match;\n\n while ((match = nsPattern.exec(attributes)) !== null) {\n if (match[1] && match[2]) {\n namespaces[`xmlns:${match[1]}`] = match[2];\n }\n }\n\n // Capture mc:Ignorable attribute (critical for w14/w15/etc. compatibility).\n // Without this, Word treats extended namespace attributes (w14:paraId etc.)\n // in raw XML passthrough zones as invalid content and reports corruption.\n const ignorableMatch = /mc:Ignorable=\"([^\"]+)\"/.exec(attributes);\n if (ignorableMatch?.[1]) {\n namespaces['mc:Ignorable'] = ignorableMatch[1];\n }\n }\n\n return namespaces;\n }\n\n /**\n * Parses document background (w:background) per ECMA-376 Part 1 §17.2.1\n * The w:background element appears as a child of w:document, before w:body\n */\n private parseDocumentBackground(\n docXml: string\n ): { color?: string; themeColor?: string; themeTint?: string; themeShade?: string } | undefined {\n const bgMatch = /<w:background([^>]*?)\\/>/.exec(docXml);\n if (!bgMatch?.[1]) return undefined;\n\n const attrStr = bgMatch[1];\n const result: { color?: string; themeColor?: string; themeTint?: string; themeShade?: string } =\n {};\n\n const colorMatch = /w:color=\"([^\"]+)\"/.exec(attrStr);\n if (colorMatch?.[1]) result.color = colorMatch[1];\n\n const themeColorMatch = /w:themeColor=\"([^\"]+)\"/.exec(attrStr);\n if (themeColorMatch?.[1]) result.themeColor = themeColorMatch[1];\n\n const themeTintMatch = /w:themeTint=\"([^\"]+)\"/.exec(attrStr);\n if (themeTintMatch?.[1]) result.themeTint = themeTintMatch[1];\n\n const themeShadeMatch = /w:themeShade=\"([^\"]+)\"/.exec(attrStr);\n if (themeShadeMatch?.[1]) result.themeShade = themeShadeMatch[1];\n\n return Object.keys(result).length > 0 ? result : undefined;\n }\n\n /**\n * Parses headers and footers from a loaded document\n * Extracts header/footer XML files and creates Header/Footer objects\n * @param zipHandler - ZIP handler containing the document\n * @param section - Parsed section with header/footer references\n * @param relationshipManager - Relationship manager to lookup targets\n * @param imageManager - Image manager for parsing images in headers/footers\n * @returns Object with parsed headers and footers\n */\n async parseHeadersAndFooters(\n zipHandler: ZipHandler,\n section: Section | null,\n relationshipManager: RelationshipManager,\n imageManager: ImageManager\n ): Promise<{\n headers: {\n header: import('../elements/Header').Header;\n relationshipId: string;\n filename: string;\n }[];\n footers: {\n footer: import('../elements/Footer').Footer;\n relationshipId: string;\n filename: string;\n }[];\n }> {\n const headers: {\n header: import('../elements/Header').Header;\n relationshipId: string;\n filename: string;\n }[] = [];\n const footers: {\n footer: import('../elements/Footer').Footer;\n relationshipId: string;\n filename: string;\n }[] = [];\n\n if (!section) {\n return { headers, footers };\n }\n\n const sectionProps = section.getProperties();\n\n // Parse headers\n // Track already-parsed headers by rId to avoid creating duplicates\n // when multiple section property types (default, first, even) reference the same header file\n const parsedHeadersByRId = new Map<string, import('../elements/Header').Header>();\n\n if (sectionProps.headers) {\n for (const [type, rId] of Object.entries(sectionProps.headers)) {\n if (!rId) continue;\n\n // Get relationship to find header filename\n const rel = relationshipManager.getRelationship(rId);\n if (!rel) continue;\n\n const headerTarget = rel.getTarget();\n\n // Reuse already-parsed header if same rId was already processed\n const existingHeader = parsedHeadersByRId.get(rId);\n if (existingHeader) {\n headers.push({\n header: existingHeader,\n relationshipId: rId,\n filename: headerTarget,\n });\n continue;\n }\n\n const headerPath = `word/${headerTarget}`;\n const headerXml = zipHandler.getFileAsString(headerPath);\n if (!headerXml) continue;\n\n // Load header-specific relationships (for images in headers)\n // Header relationships are in word/_rels/header1.xml.rels for word/header1.xml\n const headerRelsPath = `word/_rels/${headerTarget}.rels`;\n const headerRelsXml = zipHandler.getFileAsString(headerRelsPath);\n const headerRelManager = headerRelsXml\n ? RelationshipManager.fromXml(headerRelsXml)\n : relationshipManager;\n\n // Set current part name for image registration (distinguishes header images from body images)\n this.currentPartName = headerTarget;\n try {\n // Create Header object using header-specific relationship manager\n const header = await this.parseHeader(\n headerXml,\n type as 'default' | 'first' | 'even',\n zipHandler,\n headerRelManager,\n imageManager\n );\n if (header) {\n parsedHeadersByRId.set(rId, header);\n headers.push({\n header,\n relationshipId: rId,\n filename: headerTarget,\n });\n }\n } finally {\n this.currentPartName = undefined;\n }\n }\n }\n\n // Parse footers\n // Track already-parsed footers by rId to avoid creating duplicates\n // when multiple section property types (default, first, even) reference the same footer file\n const parsedFootersByRId = new Map<string, import('../elements/Footer').Footer>();\n\n if (sectionProps.footers) {\n for (const [type, rId] of Object.entries(sectionProps.footers)) {\n if (!rId) continue;\n\n // Get relationship to find footer filename\n const rel = relationshipManager.getRelationship(rId);\n if (!rel) continue;\n\n const footerTarget = rel.getTarget();\n\n // Reuse already-parsed footer if same rId was already processed\n const existingFooter = parsedFootersByRId.get(rId);\n if (existingFooter) {\n footers.push({\n footer: existingFooter,\n relationshipId: rId,\n filename: footerTarget,\n });\n continue;\n }\n\n const footerPath = `word/${footerTarget}`;\n const footerXml = zipHandler.getFileAsString(footerPath);\n if (!footerXml) continue;\n\n // Load footer-specific relationships (for images in footers)\n // Footer relationships are in word/_rels/footer1.xml.rels for word/footer1.xml\n const footerRelsPath = `word/_rels/${footerTarget}.rels`;\n const footerRelsXml = zipHandler.getFileAsString(footerRelsPath);\n const footerRelManager = footerRelsXml\n ? RelationshipManager.fromXml(footerRelsXml)\n : relationshipManager;\n\n // Set current part name for image registration (distinguishes footer images from body images)\n this.currentPartName = footerTarget;\n try {\n // Create Footer object using footer-specific relationship manager\n const footer = await this.parseFooter(\n footerXml,\n type as 'default' | 'first' | 'even',\n zipHandler,\n footerRelManager,\n imageManager\n );\n if (footer) {\n parsedFootersByRId.set(rId, footer);\n footers.push({\n footer,\n relationshipId: rId,\n filename: footerTarget,\n });\n }\n } finally {\n this.currentPartName = undefined;\n }\n }\n }\n\n return { headers, footers };\n }\n\n /**\n * Parses a single header XML file\n * @param headerXml - Header XML content\n * @param type - Header type (default, first, even)\n * @param zipHandler - ZIP handler for accessing resources\n * @param relationshipManager - Relationship manager for resolving links\n * @param imageManager - Image manager for registering images\n * @returns Parsed Header object or null\n */\n private async parseHeader(\n headerXml: string,\n type: 'default' | 'first' | 'even',\n zipHandler: ZipHandler,\n relationshipManager: RelationshipManager,\n imageManager: ImageManager\n ): Promise<Header | null> {\n try {\n const header = new Header({ type });\n\n // Store raw XML for preservation when saving\n header.setRawXML(headerXml);\n\n // Extract w:hdr content\n const hdrContent = XMLParser.extractBetweenTags(headerXml, '<w:hdr', '</w:hdr>');\n if (!hdrContent) {\n return header; // Empty header\n }\n\n // Parse paragraphs and tables within header\n const elements = await this.parseBodyElements(\n `<w:body>${hdrContent}</w:body>`,\n relationshipManager,\n zipHandler,\n imageManager\n );\n\n for (const element of elements) {\n if (element instanceof Paragraph) {\n header.addParagraph(element);\n } else if (element instanceof Table) {\n header.addTable(element);\n }\n }\n\n return header;\n } catch (error: unknown) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.parseErrors.push({ element: 'header', error: err });\n\n if (this.strictParsing) {\n throw new Error(`Failed to parse header: ${err.message}`);\n }\n\n return null;\n }\n }\n\n /**\n * Parses a single footer XML file\n * @param footerXml - Footer XML content\n * @param type - Footer type (default, first, even)\n * @param zipHandler - ZIP handler for accessing resources\n * @param relationshipManager - Relationship manager for resolving links\n * @param imageManager - Image manager for registering images\n * @returns Parsed Footer object or null\n */\n private async parseFooter(\n footerXml: string,\n type: 'default' | 'first' | 'even',\n zipHandler: ZipHandler,\n relationshipManager: RelationshipManager,\n imageManager: ImageManager\n ): Promise<Footer | null> {\n try {\n const footer = new Footer({ type });\n\n // Store raw XML for preservation when saving\n footer.setRawXML(footerXml);\n\n // Extract w:ftr content\n const ftrContent = XMLParser.extractBetweenTags(footerXml, '<w:ftr', '</w:ftr>');\n if (!ftrContent) {\n return footer; // Empty footer\n }\n\n // Parse paragraphs and tables within footer\n const elements = await this.parseBodyElements(\n `<w:body>${ftrContent}</w:body>`,\n relationshipManager,\n zipHandler,\n imageManager\n );\n\n for (const element of elements) {\n if (element instanceof Paragraph) {\n footer.addParagraph(element);\n } else if (element instanceof Table) {\n footer.addTable(element);\n }\n }\n\n return footer;\n } catch (error: unknown) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.parseErrors.push({ element: 'footer', error: err });\n\n if (this.strictParsing) {\n throw new Error(`Failed to parse footer: ${err.message}`);\n }\n\n return null;\n }\n }\n\n /**\n * Parse previous properties from a *PrChange child element (parsed object format).\n * Handles w:tblPr, w:trPr, and w:tcPr children by extracting known property keys\n * into the Record<string, any> format expected by toXML() serialization.\n * Per ECMA-376 Part 1 §17.13.5.36-38\n */\n private parseGenericPreviousProperties(propsObj: any): Record<string, any> {\n if (!propsObj) return {};\n const result: Record<string, any> = {};\n\n // Table-level properties (w:tblPr context)\n if (propsObj['w:tblStyle']) {\n result.style = propsObj['w:tblStyle']['@_w:val'] || '';\n }\n if (propsObj['w:tblW']) {\n result.width = parseInt(propsObj['w:tblW']['@_w:w'] || '0', 10);\n result.widthType = propsObj['w:tblW']['@_w:type'] || 'dxa';\n }\n if (propsObj['w:tblLayout']) {\n result.layout = propsObj['w:tblLayout']['@_w:type'];\n }\n if (propsObj['w:tblInd']) {\n result.indent = parseInt(propsObj['w:tblInd']['@_w:w'] || '0', 10);\n }\n if (propsObj['w:tblCellSpacing']) {\n result.cellSpacing = parseInt(propsObj['w:tblCellSpacing']['@_w:w'] || '0', 10);\n }\n if (propsObj['w:tblBorders']) {\n const borders: any = {};\n const bordersObj = propsObj['w:tblBorders'];\n for (const side of ['top', 'bottom', 'left', 'right', 'insideH', 'insideV']) {\n if (bordersObj[`w:${side}`]) {\n borders[side] = this.parseBorderElement(bordersObj[`w:${side}`]);\n }\n }\n if (Object.keys(borders).length > 0) result.borders = borders;\n }\n\n // Row-level properties (w:trPr context)\n if (propsObj['w:trHeight']) {\n result.height = parseInt(propsObj['w:trHeight']['@_w:val'] || '0', 10);\n const rule = propsObj['w:trHeight']['@_w:hRule'];\n if (rule) result.heightRule = rule;\n }\n if (propsObj['w:tblHeader']) {\n result.isHeader = true;\n }\n if (propsObj['w:cantSplit']) {\n result.cantSplit = true;\n }\n if (propsObj['w:hidden']) {\n result.hidden = true;\n }\n\n // Cell-level properties (w:tcPr context)\n if (propsObj['w:tcW']) {\n result.width = parseInt(propsObj['w:tcW']['@_w:w'] || '0', 10);\n result.widthType = propsObj['w:tcW']['@_w:type'] || 'dxa';\n }\n if (propsObj['w:vAlign']) {\n result.verticalAlignment = propsObj['w:vAlign']['@_w:val'];\n }\n if (propsObj['w:tcBorders']) {\n const borders: any = {};\n const bordersObj = propsObj['w:tcBorders'];\n for (const side of ['top', 'bottom', 'left', 'right', 'tl2br', 'tr2bl']) {\n if (bordersObj[`w:${side}`]) {\n borders[side] = this.parseBorderElement(bordersObj[`w:${side}`]);\n }\n }\n if (Object.keys(borders).length > 0) result.borders = borders;\n }\n\n // Shared properties (appear in multiple contexts)\n if (propsObj['w:jc']) {\n const val = propsObj['w:jc']['@_w:val'];\n if (val) {\n result.alignment = val; // Table context\n result.justification = val; // Row context\n }\n }\n if (propsObj['w:shd']) {\n const shading = this.parseShadingFromObj(propsObj['w:shd']);\n if (shading) result.shading = shading;\n }\n\n return result;\n }\n\n /**\n * Parse previous section properties from raw XML within w:sectPrChange.\n * Per ECMA-376 Part 1 §17.13.5.32\n */\n private parsePreviousSectionProperties(sectPrXml: string): Record<string, any> {\n if (!sectPrXml) return {};\n const result: Record<string, any> = {};\n\n // Page size\n const pgSzElements = XMLParser.extractElements(sectPrXml, 'w:pgSz');\n if (pgSzElements.length > 0 && pgSzElements[0]) {\n const pgSz = pgSzElements[0];\n const width = XMLParser.extractAttribute(pgSz, 'w:w');\n const height = XMLParser.extractAttribute(pgSz, 'w:h');\n const orient = XMLParser.extractAttribute(pgSz, 'w:orient');\n if (width || height) {\n result.pageSize = {\n width: width ? parseInt(width, 10) : undefined,\n height: height ? parseInt(height, 10) : undefined,\n orientation: orient === 'landscape' ? 'landscape' : 'portrait',\n };\n }\n }\n\n // Margins\n const pgMarElements = XMLParser.extractElements(sectPrXml, 'w:pgMar');\n if (pgMarElements.length > 0 && pgMarElements[0]) {\n const pgMar = pgMarElements[0];\n const margins: any = {};\n const top = XMLParser.extractAttribute(pgMar, 'w:top');\n if (top) margins.top = parseInt(top, 10);\n const bottom = XMLParser.extractAttribute(pgMar, 'w:bottom');\n if (bottom) margins.bottom = parseInt(bottom, 10);\n const left = XMLParser.extractAttribute(pgMar, 'w:left');\n if (left) margins.left = parseInt(left, 10);\n const right = XMLParser.extractAttribute(pgMar, 'w:right');\n if (right) margins.right = parseInt(right, 10);\n const header = XMLParser.extractAttribute(pgMar, 'w:header');\n if (header) margins.header = parseInt(header, 10);\n const footer = XMLParser.extractAttribute(pgMar, 'w:footer');\n if (footer) margins.footer = parseInt(footer, 10);\n if (Object.keys(margins).length > 0) result.margins = margins;\n }\n\n // Section type\n const typeElements = XMLParser.extractElements(sectPrXml, 'w:type');\n if (typeElements.length > 0 && typeElements[0]) {\n const val = XMLParser.extractAttribute(typeElements[0], 'w:val');\n if (val) result.type = val;\n }\n\n // Columns\n const colsElements = XMLParser.extractElements(sectPrXml, 'w:cols');\n if (colsElements.length > 0 && colsElements[0]) {\n const cols = colsElements[0];\n const num = XMLParser.extractAttribute(cols, 'w:num');\n const space = XMLParser.extractAttribute(cols, 'w:space');\n if (num) {\n result.columns = {\n count: parseInt(num, 10),\n space: space ? parseInt(space, 10) : undefined,\n };\n }\n }\n\n return result;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"DocumentParser.js","sourceRoot":"","sources":["../../src/core/DocumentParser.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * DocumentParser - Handles parsing of DOCX files\n * Extracts content from ZIP archives and converts XML to structured data\n */\n\nimport { AlternateContent } from '../elements/AlternateContent';\nimport { Bookmark } from '../elements/Bookmark';\nimport { Endnote, EndnoteType } from '../elements/Endnote';\nimport { Footnote, FootnoteType } from '../elements/Footnote';\nimport { BookmarkManager } from '../elements/BookmarkManager';\nimport { Comment } from '../elements/Comment';\nimport { CustomXmlBlock } from '../elements/CustomXml';\nimport { PreservedElement } from '../elements/PreservedElement';\nimport { MathParagraph } from '../elements/MathElement';\nimport { ComplexField, Field } from '../elements/Field';\nimport { isHyperlinkInstruction, parseHyperlinkInstruction } from '../elements/FieldHelpers';\nimport { Footer } from '../elements/Footer';\nimport { Header } from '../elements/Header';\nimport { Hyperlink } from '../elements/Hyperlink';\nimport { ImageManager } from '../elements/ImageManager';\nimport { ImageRun } from '../elements/ImageRun';\nimport { Paragraph, ParagraphFormatting, ParagraphContent } from '../elements/Paragraph';\nimport { Revision } from '../elements/Revision';\nimport {\n BreakType,\n FormFieldCheckBox,\n FormFieldData,\n FormFieldDropDownList,\n FormFieldTextInput,\n Run,\n RunContent,\n RunFormatting,\n} from '../elements/Run';\nimport { PageNumberFormat, Section, SectionProperties, SectionType } from '../elements/Section';\nimport { StructuredDocumentTag } from '../elements/StructuredDocumentTag';\nimport { Table, TableBorder } from '../elements/Table';\nimport { TableCell } from '../elements/TableCell';\nimport { TableOfContents } from '../elements/TableOfContents';\nimport { TableOfContentsElement } from '../elements/TableOfContentsElement';\nimport { TableRow } from '../elements/TableRow';\nimport { AbstractNumbering } from '../formatting/AbstractNumbering';\nimport { NumberingInstance } from '../formatting/NumberingInstance';\nimport { Style, StyleProperties, StyleType } from '../formatting/Style';\nimport { logParagraphContent, logParsing, logTextDirection } from '../utils/diagnostics';\nimport { getGlobalLogger, createScopedLogger, ILogger, defaultLogger } from '../utils/logger';\nimport { safeParseInt, isExplicitlySet, parseOoxmlBoolean } from '../utils/parsingHelpers';\nimport { halfPointsToPoints } from '../utils/units';\nimport type { ShadingConfig } from '../elements/CommonTypes';\n\n// Create scoped logger for DocumentParser operations\nfunction getLogger(): ILogger {\n return createScopedLogger(getGlobalLogger(), 'DocumentParser');\n}\nimport { XMLBuilder, XMLElement } from '../xml/XMLBuilder';\nimport { XMLParser } from '../xml/XMLParser';\nimport { ZipHandler } from '../zip/ZipHandler';\nimport { DOCX_PATHS } from '../zip/types';\nimport { DocumentProperties } from './Document';\nimport { BodyElement } from './DocumentContent';\nimport { RelationshipManager } from './RelationshipManager';\n\n/**\n * Parse error tracking\n */\nexport interface ParseError {\n element: string;\n error: Error;\n}\n\n/**\n * DocumentParser handles all document parsing logic\n */\nexport class DocumentParser {\n private parseErrors: ParseError[] = [];\n private strictParsing: boolean;\n private bookmarkManager: BookmarkManager | null = null;\n /**\n * Current part name being parsed (e.g., 'header1.xml', 'footer1.xml').\n * Used to create composite keys for image relationship IDs to distinguish\n * between images in different parts (headers/footers have their own .rels files).\n */\n private currentPartName: string | undefined = undefined;\n\n constructor(strictParsing = false) {\n this.strictParsing = strictParsing;\n }\n\n /**\n * Gets accumulated parse errors/warnings\n */\n getParseErrors(): ParseError[] {\n return [...this.parseErrors];\n }\n\n /**\n * Clears accumulated parse errors\n */\n clearParseErrors(): void {\n this.parseErrors = [];\n }\n\n /**\n * Parses the document XML and extracts content\n * @param zipHandler - ZIP handler containing the document\n * @param relationshipManager - Relationship manager to populate\n * @param imageManager - Image manager to register parsed images\n * @returns Parsed body elements, properties, and updated relationship manager\n */\n async parseDocument(\n zipHandler: ZipHandler,\n relationshipManager: RelationshipManager,\n imageManager: ImageManager,\n bookmarkManager?: BookmarkManager\n ): Promise<{\n bodyElements: BodyElement[];\n properties: DocumentProperties;\n relationshipManager: RelationshipManager;\n styles: Style[];\n abstractNumberings: AbstractNumbering[];\n numberingInstances: NumberingInstance[];\n section: Section | null;\n namespaces: Record<string, string>;\n documentBackground?: {\n color?: string;\n themeColor?: string;\n themeTint?: string;\n themeShade?: string;\n };\n }> {\n const logger = getLogger();\n logger.info('Parsing document');\n\n // Store bookmarkManager for use in parsing methods\n this.bookmarkManager = bookmarkManager || null;\n\n // Verify the document exists\n const docXml = zipHandler.getFileAsString(DOCX_PATHS.DOCUMENT);\n if (!docXml) {\n logger.error('Invalid document: word/document.xml not found');\n throw new Error('Invalid document: word/document.xml not found');\n }\n\n logger.info('Parsing document.xml', { xmlSize: docXml.length });\n\n // Parse existing relationships to avoid ID collisions\n const parsedRelationshipManager = this.parseRelationships(zipHandler, relationshipManager);\n\n // Parse document properties\n const properties = this.parseProperties(zipHandler);\n\n // Parse body elements (paragraphs and tables)\n // Now includes image parsing support\n const bodyElements = await this.parseBodyElements(\n docXml,\n parsedRelationshipManager,\n zipHandler,\n imageManager\n );\n\n // Parse styles from styles.xml\n const styles = this.parseStyles(zipHandler);\n logger.info('Parsed styles', { styleCount: styles.length });\n\n // Parse numbering from numbering.xml\n const numbering = this.parseNumbering(zipHandler);\n logger.info('Parsed numbering', {\n abstractCount: numbering.abstractNumberings.length,\n instanceCount: numbering.numberingInstances.length,\n });\n\n // Parse section properties from document.xml\n const section = this.parseSectionProperties(docXml);\n\n // Parse document background (w:background) per ECMA-376 Part 1 §17.2.1\n const documentBackground = this.parseDocumentBackground(docXml);\n\n // Parse and preserve namespaces from the root <w:document> tag\n const namespaces = this.parseNamespaces(docXml);\n\n // Count element types for logging\n let paragraphCount = 0;\n let tableCount = 0;\n for (const elem of bodyElements) {\n if (elem instanceof Paragraph) paragraphCount++;\n else if (elem instanceof Table) tableCount++;\n }\n logger.info('Document parsed', {\n paragraphs: paragraphCount,\n tables: tableCount,\n totalElements: bodyElements.length,\n });\n\n // Log any parse errors\n if (this.parseErrors.length > 0) {\n logger.warn('Parse errors encountered', { errorCount: this.parseErrors.length });\n }\n\n return {\n bodyElements,\n properties,\n relationshipManager: parsedRelationshipManager,\n styles,\n abstractNumberings: numbering.abstractNumberings,\n numberingInstances: numbering.numberingInstances,\n section,\n namespaces,\n documentBackground,\n };\n }\n\n /**\n * Parses body elements from document XML\n * Extracts paragraphs and tables with their formatting\n * Uses XMLParser for safe position-based parsing (prevents ReDoS)\n *\n * CRITICAL: Preserves document order by parsing elements sequentially\n * instead of by type. This prevents massive content loss and corruption.\n */\n private async parseBodyElements(\n docXml: string,\n relationshipManager: RelationshipManager,\n zipHandler: ZipHandler,\n imageManager: ImageManager\n ): Promise<BodyElement[]> {\n const bodyElements: BodyElement[] = [];\n\n // Extract the body content using safe position-based parsing\n const bodyContent = XMLParser.extractBody(docXml);\n if (!bodyContent) {\n return bodyElements;\n }\n\n let pos = 0;\n let pendingBookmarkStarts: Bookmark[] = [];\n while (pos < bodyContent.length) {\n const nextP = this.findNextTopLevelTag(bodyContent, 'w:p', pos);\n const nextTbl = this.findNextTopLevelTag(bodyContent, 'w:tbl', pos);\n const nextSdt = this.findNextTopLevelTag(bodyContent, 'w:sdt', pos);\n const nextAC = this.findNextTopLevelTag(bodyContent, 'mc:AlternateContent', pos);\n const nextMath = this.findNextTopLevelTag(bodyContent, 'm:oMathPara', pos);\n const nextCXml = this.findNextTopLevelTag(bodyContent, 'w:customXml', pos);\n const nextAltChunk = this.findNextTopLevelTag(bodyContent, 'w:altChunk', pos);\n\n const candidates = [];\n if (nextP !== -1) candidates.push({ type: 'p', pos: nextP });\n if (nextTbl !== -1) candidates.push({ type: 'tbl', pos: nextTbl });\n if (nextSdt !== -1) candidates.push({ type: 'sdt', pos: nextSdt });\n if (nextAC !== -1) candidates.push({ type: 'alternateContent', pos: nextAC });\n if (nextMath !== -1) candidates.push({ type: 'mathParagraph', pos: nextMath });\n if (nextCXml !== -1) candidates.push({ type: 'customXml', pos: nextCXml });\n if (nextAltChunk !== -1) candidates.push({ type: 'altChunk', pos: nextAltChunk });\n\n if (candidates.length === 0) break;\n\n candidates.sort((a, b) => a.pos - b.pos);\n const next = candidates[0];\n\n if (next) {\n // Check for body-level bookmarkEnd elements BEFORE this element\n // These appear between the previous element and this one\n if (bodyElements.length > 0 && next.pos > pos) {\n const bookmarkEnds = this.extractBodyLevelBookmarkEnds(bodyContent, pos, next.pos);\n if (bookmarkEnds.length > 0) {\n // Attach to the previous element\n const prevElement = bodyElements[bodyElements.length - 1];\n if (prevElement instanceof Paragraph) {\n for (const bookmark of bookmarkEnds) {\n prevElement.addBookmarkEnd(bookmark);\n }\n } else if (prevElement instanceof Table) {\n // For tables, attach to the last paragraph in the last cell\n const lastPara = prevElement.getLastParagraph();\n if (lastPara) {\n for (const bookmark of bookmarkEnds) {\n lastPara.addBookmarkEnd(bookmark);\n }\n }\n }\n }\n }\n\n // Check for body-level bookmarkStart elements BEFORE this element\n // These appear between the previous element and this one\n // Unlike bookmarkEnds (attached to previous), bookmarkStarts are\n // collected as pending and attached to the NEXT parsed element\n if (next.pos > pos) {\n const bookmarkStarts = this.extractBodyLevelBookmarkStarts(bodyContent, pos, next.pos);\n if (bookmarkStarts.length > 0) {\n pendingBookmarkStarts.push(...bookmarkStarts);\n }\n }\n\n // Check if this element is inside a w:del block (deleted via Track Changes)\n // If so, skip the entire w:del block including all its content\n if (this.isPositionInsideDel(bodyContent, next.pos)) {\n const delEndPos = this.findDelEndPosition(bodyContent, next.pos);\n if (delEndPos > 0) {\n pos = delEndPos;\n } else {\n pos = next.pos + 1;\n }\n continue;\n }\n\n if (next.type === 'p') {\n const elementXml = this.extractSingleElement(bodyContent, 'w:p', next.pos);\n\n if (elementXml) {\n // Parse paragraph with order preservation\n // Use the new method that preserves the exact order of runs and hyperlinks\n const paragraph = await this.parseParagraphWithOrder(\n elementXml,\n relationshipManager,\n zipHandler,\n imageManager\n );\n if (paragraph) bodyElements.push(paragraph);\n pos = next.pos + elementXml.length;\n } else {\n pos = next.pos + 1;\n }\n } else if (next.type === 'tbl') {\n const elementXml = this.extractSingleElement(bodyContent, 'w:tbl', next.pos);\n if (elementXml) {\n // Parse XML to object, then extract the table content\n // IMPORTANT: trimValues: false preserves whitespace from xml:space=\"preserve\" attributes\n const parsed = XMLParser.parseToObject(elementXml, {\n trimValues: false,\n });\n const table = await this.parseTableFromObject(\n parsed['w:tbl'],\n relationshipManager,\n zipHandler,\n imageManager,\n elementXml\n );\n if (table) bodyElements.push(table);\n pos = next.pos + elementXml.length;\n } else {\n pos = next.pos + 1;\n }\n } else if (next.type === 'sdt') {\n const elementXml = this.extractSingleElement(bodyContent, 'w:sdt', next.pos);\n if (elementXml) {\n // Parse XML to object, then extract the SDT content\n // IMPORTANT: trimValues: false preserves whitespace from xml:space=\"preserve\" attributes\n const parsed = XMLParser.parseToObject(elementXml, {\n trimValues: false,\n });\n const sdt = await this.parseSDTFromObject(\n parsed['w:sdt'],\n relationshipManager,\n zipHandler,\n imageManager\n );\n if (sdt) bodyElements.push(sdt);\n pos = next.pos + elementXml.length;\n } else {\n pos = next.pos + 1;\n }\n } else if (next.type === 'alternateContent') {\n // mc:AlternateContent - preserve as raw XML for round-trip fidelity\n const elementXml = this.extractSingleElement(\n bodyContent,\n 'mc:AlternateContent',\n next.pos\n );\n if (elementXml) {\n bodyElements.push(new AlternateContent(elementXml));\n pos = next.pos + elementXml.length;\n } else {\n pos = next.pos + 1;\n }\n } else if (next.type === 'mathParagraph') {\n // m:oMathPara - preserve as raw XML for round-trip fidelity\n const elementXml = this.extractSingleElement(bodyContent, 'm:oMathPara', next.pos);\n if (elementXml) {\n bodyElements.push(new MathParagraph(elementXml));\n pos = next.pos + elementXml.length;\n } else {\n pos = next.pos + 1;\n }\n } else if (next.type === 'customXml') {\n // w:customXml - preserve as raw XML for round-trip fidelity\n const elementXml = this.extractSingleElement(bodyContent, 'w:customXml', next.pos);\n if (elementXml) {\n bodyElements.push(new CustomXmlBlock(elementXml));\n pos = next.pos + elementXml.length;\n } else {\n pos = next.pos + 1;\n }\n } else if (next.type === 'altChunk') {\n // w:altChunk - preserve as raw XML for round-trip fidelity\n const elementXml = this.extractSingleElement(bodyContent, 'w:altChunk', next.pos);\n if (elementXml) {\n bodyElements.push(new PreservedElement(elementXml, 'altChunk', 'block'));\n pos = next.pos + elementXml.length;\n } else {\n pos = next.pos + 1;\n }\n }\n\n // Attach any pending body-level bookmarkStarts to the just-parsed element\n if (pendingBookmarkStarts.length > 0 && bodyElements.length > 0) {\n const currentElement = bodyElements[bodyElements.length - 1];\n if (currentElement instanceof Paragraph) {\n for (const bookmark of pendingBookmarkStarts) {\n currentElement.addBookmarkStart(bookmark);\n }\n } else if (currentElement instanceof Table) {\n // For tables, attach to the first paragraph of the first cell\n const firstPara = currentElement.getFirstParagraph();\n if (firstPara) {\n for (const bookmark of pendingBookmarkStarts) {\n firstPara.addBookmarkStart(bookmark);\n }\n }\n }\n pendingBookmarkStarts = [];\n }\n }\n }\n\n // Check for any trailing body-level bookmarkEnd elements after the last element\n if (bodyElements.length > 0 && pos < bodyContent.length) {\n const trailingBookmarkEnds = this.extractBodyLevelBookmarkEnds(bodyContent, pos, -1);\n if (trailingBookmarkEnds.length > 0) {\n const lastElement = bodyElements[bodyElements.length - 1];\n if (lastElement instanceof Paragraph) {\n for (const bookmark of trailingBookmarkEnds) {\n lastElement.addBookmarkEnd(bookmark);\n }\n } else if (lastElement instanceof Table) {\n const lastPara = lastElement.getLastParagraph();\n if (lastPara) {\n for (const bookmark of trailingBookmarkEnds) {\n lastPara.addBookmarkEnd(bookmark);\n }\n }\n }\n }\n }\n\n // Check for any trailing body-level bookmarkStart elements after the last element\n if (bodyElements.length > 0 && pos < bodyContent.length) {\n const trailingBookmarkStarts = this.extractBodyLevelBookmarkStarts(bodyContent, pos, -1);\n if (trailingBookmarkStarts.length > 0) {\n const lastElement = bodyElements[bodyElements.length - 1];\n if (lastElement instanceof Paragraph) {\n for (const bookmark of trailingBookmarkStarts) {\n lastElement.addBookmarkStart(bookmark);\n }\n } else if (lastElement instanceof Table) {\n const lastPara = lastElement.getLastParagraph();\n if (lastPara) {\n for (const bookmark of trailingBookmarkStarts) {\n lastPara.addBookmarkStart(bookmark);\n }\n }\n }\n }\n }\n\n // Assemble multi-paragraph complex fields (e.g., TOC fields spanning multiple paragraphs)\n this.assembleMultiParagraphFields(bodyElements);\n\n // Validate that we didn't load an empty/corrupted document\n this.validateLoadedContent(bodyElements);\n\n return bodyElements;\n }\n\n /**\n * Extracts body-level bookmarkEnd elements between two positions in the content.\n * These are bookmarkEnd elements that appear outside of paragraphs/tables.\n * @param content - The body content XML\n * @param startPos - Start position to search from\n * @param endPos - End position to search to (or end of content if -1)\n * @returns Array of Bookmark objects for the bookmarkEnd elements\n */\n private extractBodyLevelBookmarkEnds(\n content: string,\n startPos: number,\n endPos: number\n ): Bookmark[] {\n const searchContent = endPos === -1 ? content.slice(startPos) : content.slice(startPos, endPos);\n\n return this.extractBookmarkEndsFromContent(searchContent);\n }\n\n /**\n * Extracts bookmarkEnd elements from any XML content string.\n * Uses position-based parsing via XMLParser (ECMA-376 compliant, ReDoS-safe).\n * @param content - The XML content to search\n * @returns Array of Bookmark objects for the bookmarkEnd elements\n */\n private extractBookmarkEndsFromContent(content: string): Bookmark[] {\n const bookmarks: Bookmark[] = [];\n\n // Use position-based XMLParser instead of regex for ECMA-376 compliance\n // This handles any attribute order and is safe from ReDoS attacks\n const bookmarkEndXmls = XMLParser.extractElements(content, 'w:bookmarkEnd');\n\n for (const bookmarkEndXml of bookmarkEndXmls) {\n const idAttr = XMLParser.extractAttribute(bookmarkEndXml, 'w:id');\n if (idAttr) {\n const id = parseInt(idAttr, 10);\n if (!isNaN(id)) {\n const bookmark = new Bookmark({\n name: `_end_${id}`,\n id: id,\n skipNormalization: true,\n });\n bookmarks.push(bookmark);\n }\n }\n }\n\n return bookmarks;\n }\n\n /**\n * Extracts body-level bookmarkStart elements between two positions in the content.\n * These are bookmarkStart elements that appear outside of paragraphs/tables.\n * @param content - The body content XML\n * @param startPos - Start position to search from\n * @param endPos - End position to search to (or end of content if -1)\n * @returns Array of Bookmark objects for the bookmarkStart elements\n */\n private extractBodyLevelBookmarkStarts(\n content: string,\n startPos: number,\n endPos: number\n ): Bookmark[] {\n const searchContent = endPos === -1 ? content.slice(startPos) : content.slice(startPos, endPos);\n\n return this.extractBookmarkStartsFromContent(searchContent);\n }\n\n /**\n * Extracts bookmarkStart elements from any XML content string.\n * Uses position-based parsing via XMLParser (ECMA-376 compliant, ReDoS-safe).\n * Reuses the existing parseBookmarkStart() method for consistent parsing.\n * @param content - The XML content to search\n * @returns Array of Bookmark objects for the bookmarkStart elements\n */\n private extractBookmarkStartsFromContent(content: string): Bookmark[] {\n const bookmarks: Bookmark[] = [];\n\n const bookmarkStartXmls = XMLParser.extractElements(content, 'w:bookmarkStart');\n\n for (const bookmarkStartXml of bookmarkStartXmls) {\n const bookmark = this.parseBookmarkStart(bookmarkStartXml);\n if (bookmark) {\n bookmarks.push(bookmark);\n }\n }\n\n return bookmarks;\n }\n\n /**\n * Finds the next occurrence of a tag in the content\n * Returns the position of the opening '<' or -1 if not found\n */\n private findNextTag(content: string, tagName: string, startPos: number): number {\n const tag = `<${tagName}`;\n let pos = content.indexOf(tag, startPos);\n\n while (pos !== -1) {\n // Verify this is the exact tag (not a prefix match like <w:p matching <w:pPr>)\n // The character after the tag name must be either '>', '/' or whitespace\n const charAfterTag = content[pos + tag.length];\n if (\n charAfterTag &&\n charAfterTag !== '>' &&\n charAfterTag !== '/' &&\n charAfterTag !== ' ' &&\n charAfterTag !== '\\t' &&\n charAfterTag !== '\\n' &&\n charAfterTag !== '\\r'\n ) {\n // This is a prefix match (e.g., <w:pPr> when looking for <w:p>), skip it\n pos = content.indexOf(tag, pos + tag.length);\n continue;\n }\n return pos;\n }\n return -1;\n }\n\n /**\n * Finds the next TOP-LEVEL occurrence of a tag (not nested inside tables)\n * This prevents paragraphs inside table cells from being extracted as body paragraphs\n * Returns the position of the opening '<' or -1 if not found\n */\n private findNextTopLevelTag(content: string, tagName: string, startPos: number): number {\n let pos = startPos;\n\n while (pos < content.length) {\n // Find the next occurrence of the tag\n const tagPos = this.findNextTag(content, tagName, pos);\n if (tagPos === -1) {\n return -1; // No more tags found\n }\n\n // Check if this tag is nested inside a table\n // Look backwards from tagPos to see if we're inside an unclosed <w:tbl>\n const isInsideTable = this.isPositionInsideTable(content, tagPos);\n\n if (!isInsideTable) {\n // This is a top-level tag\n return tagPos;\n }\n\n // This tag is inside a table, skip past it and continue searching\n pos = tagPos + 1;\n }\n\n return -1;\n }\n\n /**\n * Counts unclosed opening tags of a specific element type in content.\n * Uses position-based parsing instead of regex for ECMA-376 compliance.\n * @param content - XML content to search\n * @param tagName - Element name (e.g., \"w:tbl\", \"w:p\", \"w:sdt\")\n * @returns Number of unclosed opening tags (opens - closes)\n */\n private countUnclosedTags(content: string, tagName: string): number {\n let opens = 0;\n let closes = 0;\n let pos = 0;\n\n // Count opening tags (handles self-closing correctly)\n while (pos < content.length) {\n const openPos = content.indexOf(`<${tagName}`, pos);\n if (openPos === -1) break;\n\n // Check the character after the tag name to ensure exact match\n const afterTagName = openPos + tagName.length + 1;\n if (afterTagName < content.length) {\n const charAfter = content.charAt(afterTagName);\n // Valid tag terminators: space, >, /, tab, newline\n if (\n charAfter === ' ' ||\n charAfter === '>' ||\n charAfter === '/' ||\n charAfter === '\\t' ||\n charAfter === '\\n' ||\n charAfter === '\\r'\n ) {\n // Find the end of this tag\n const tagEnd = content.indexOf('>', openPos);\n if (tagEnd !== -1) {\n // Check if self-closing (ends with />)\n const isSelfClosing = content.charAt(tagEnd - 1) === '/';\n if (!isSelfClosing) {\n opens++;\n }\n }\n }\n }\n pos = openPos + 1;\n }\n\n // Count closing tags\n pos = 0;\n const closeTag = `</${tagName}>`;\n while (pos < content.length) {\n const closePos = content.indexOf(closeTag, pos);\n if (closePos === -1) break;\n closes++;\n pos = closePos + closeTag.length;\n }\n\n return opens - closes;\n }\n\n /**\n * Checks if a position in the content is inside a table element\n * Returns true if there's an unclosed <w:tbl> before this position\n */\n private isPositionInsideTable(content: string, position: number): boolean {\n const beforeContent = content.substring(0, position);\n return this.countUnclosedTags(beforeContent, 'w:tbl') > 0;\n }\n\n /**\n * Checks if a position in the content is inside a BODY-LEVEL w:del element\n * This is used to skip body-level elements that were deleted via Track Changes.\n *\n * IMPORTANT: This only detects body-level deletions (direct children of w:body).\n * Paragraph-level deletions (w:del inside w:p wrapping w:r runs) are NOT detected\n * because those are handled separately during run parsing.\n *\n * @param content - The body content XML\n * @param position - Position to check\n * @returns true if the position is inside a body-level <w:del> element\n */\n private isPositionInsideDel(content: string, position: number): boolean {\n // Look backward to find the most recent <w:del opening tag\n const beforeContent = content.substring(0, position);\n const lastDelOpen = beforeContent.lastIndexOf('<w:del');\n\n if (lastDelOpen === -1) return false;\n\n // Check if there's a </w:del> between the <w:del and our position\n const betweenContent = content.substring(lastDelOpen, position);\n if (betweenContent.includes('</w:del>')) return false;\n\n // Check if this <w:del is a self-closing tag (no content to skip)\n // Self-closing format: <w:del ... />\n const tagEnd = content.indexOf('>', lastDelOpen);\n if (tagEnd !== -1 && content.charAt(tagEnd - 1) === '/') return false;\n\n // Now check if this <w:del is BODY-LEVEL (not inside a w:p or w:tbl)\n // If the <w:del is inside a paragraph or table, it's NOT body-level\n const contentBeforeDel = content.substring(0, lastDelOpen);\n\n // Check if inside a paragraph using position-based parsing\n if (this.countUnclosedTags(contentBeforeDel, 'w:p') > 0) return false;\n\n // Check if inside a table\n if (this.countUnclosedTags(contentBeforeDel, 'w:tbl') > 0) return false;\n\n // Check if inside an SDT (structured document tag)\n if (this.countUnclosedTags(contentBeforeDel, 'w:sdt') > 0) return false;\n\n return true; // This is a body-level <w:del>\n }\n\n /**\n * Finds the end position of the w:del element that contains the given position\n * Returns the position after the closing </w:del> tag\n * @param content - The body content XML\n * @param startPos - Position inside the w:del element\n * @returns Position after the </w:del> tag, or -1 if not found\n */\n private findDelEndPosition(content: string, startPos: number): number {\n // Find the closing </w:del> tag after startPos\n // We need to handle nested w:del elements correctly\n let depth = 1;\n let pos = startPos;\n\n while (pos < content.length && depth > 0) {\n const nextOpen = content.indexOf('<w:del', pos);\n const nextClose = content.indexOf('</w:del>', pos);\n\n if (nextClose === -1) {\n // No closing tag found - malformed XML\n return -1;\n }\n\n if (nextOpen !== -1 && nextOpen < nextClose) {\n // Found another opening tag before the close\n depth++;\n pos = nextOpen + 6; // Move past \"<w:del\"\n } else {\n // Found a closing tag\n depth--;\n if (depth === 0) {\n // This is our closing tag\n return nextClose + '</w:del>'.length;\n }\n pos = nextClose + '</w:del>'.length;\n }\n }\n\n return -1;\n }\n\n /**\n * Extracts a single element from the content starting at the given position\n * Returns the complete element XML including opening and closing tags\n *\n * FIX (v1.3.1): Uses XMLParser.extractElements to ensure consistent extraction\n * behavior and prevent loss of self-closing elements like <w:tab/>\n * This fixes the TOC tab preservation bug where tabs were lost during extraction.\n */\n private extractSingleElement(content: string, tagName: string, startPos: number): string {\n // Extract the substring starting from the position\n const remainingContent = content.substring(startPos);\n\n // Use XMLParser.extractElements to get all elements of this type\n // This ensures we use the same proven extraction logic throughout\n const elements = XMLParser.extractElements(remainingContent, tagName);\n\n // Return the first element (which starts at position 0 in remainingContent)\n // This is the element at the specified startPos in the original content\n const extracted = elements.length > 0 ? elements[0]! : '';\n\n return extracted;\n }\n\n /**\n * Validates loaded content to detect corrupted or empty documents\n * Adds warnings if the document appears to have lost text content\n */\n private validateLoadedContent(bodyElements: BodyElement[]): void {\n const paragraphs = bodyElements.filter((el): el is Paragraph => el instanceof Paragraph);\n\n if (paragraphs.length === 0) {\n return; // Empty document is valid\n }\n\n // Count total runs and empty runs\n let totalRuns = 0;\n let emptyRuns = 0;\n let runsWithText = 0;\n\n for (const para of paragraphs) {\n const runs = para.getRuns();\n totalRuns += runs.length;\n\n for (const run of runs) {\n const text = run.getText();\n if (text.length === 0) {\n emptyRuns++;\n } else {\n runsWithText++;\n }\n }\n }\n\n // If more than 90% of runs are empty, warn about potential corruption\n if (totalRuns > 0) {\n const emptyPercentage = (emptyRuns / totalRuns) * 100;\n\n if (emptyPercentage > 90 && emptyRuns > 10) {\n const warning = new Error(\n `WARNING: Document appears to be corrupted or empty. ` +\n `${emptyRuns} out of ${totalRuns} runs (${emptyPercentage.toFixed(\n 1\n )}%) have no text content. ` +\n `This may indicate:\\n` +\n ` - The document was already corrupted before loading\\n` +\n ` - Text content was stripped by another application\\n` +\n ` - Encoding issues during document creation\\n` +\n `Original document structure is preserved, but text may be lost.`\n );\n this.parseErrors.push({\n element: 'document-validation',\n error: warning,\n });\n\n // Always warn to console, even in non-strict mode\n defaultLogger.warn(`\\nDocXML Load Warning:\\n${warning.message}\\n`);\n } else if (emptyPercentage > 50 && emptyRuns > 5) {\n const warning = new Error(\n `Document has ${emptyRuns} out of ${totalRuns} runs (${emptyPercentage.toFixed(\n 1\n )}%) with no text. ` + `This is higher than normal and may indicate partial data loss.`\n );\n this.parseErrors.push({\n element: 'document-validation',\n error: warning,\n });\n defaultLogger.warn(`\\nDocXML Load Warning:\\n${warning.message}\\n`);\n }\n }\n }\n\n /**\n * Extracts paragraph children (runs and hyperlinks) in document order\n * This ensures we preserve the original ordering of text and hyperlinks\n */\n\n private async parseParagraphWithOrder(\n paraXml: string,\n relationshipManager: RelationshipManager,\n zipHandler?: ZipHandler,\n imageManager?: ImageManager\n ): Promise<Paragraph | null> {\n try {\n const paragraph = new Paragraph();\n\n // Parse the paragraph object with order preservation\n // IMPORTANT: trimValues: false preserves whitespace from xml:space=\"preserve\" attributes\n const paraObj = XMLParser.parseToObject(paraXml, { trimValues: false });\n const pElement = paraObj['w:p'] as any;\n if (!pElement) {\n return null;\n }\n\n // Parse paragraph properties\n const pPr = pElement['w:pPr'];\n this.parseParagraphPropertiesFromObject(pPr, paragraph);\n\n // If the paragraph has inline sectPr, extract the raw XML for round-trip fidelity.\n // The parsed object from parseParagraphPropertiesFromObject is a complex structure that\n // cannot be serialized correctly by XMLBuilder.wSelf (which expects flat attributes).\n // Using raw XML passthrough prevents corruption from malformed sectPr serialization.\n if (paragraph.formatting.sectPr) {\n const pPrElements = XMLParser.extractElements(paraXml, 'w:pPr');\n const pPrXml = pPrElements[0];\n if (pPrXml) {\n const sectPrElements = XMLParser.extractElements(pPrXml, 'w:sectPr');\n const rawSectPr = sectPrElements[0];\n if (rawSectPr) {\n // Store as raw XML string (including the <w:sectPr>...</w:sectPr> wrapper)\n paragraph.setSectionProperties(rawSectPr);\n }\n }\n }\n\n // Parse w14:paraId if present\n const paraId = pElement['w14:paraId'];\n if (paraId) {\n paragraph.formatting.paraId = paraId as string;\n }\n\n // CRITICAL FIX: Preserve document order of paragraph children (runs, hyperlinks, fields)\n // When XMLParser.parseToObject groups multiple runs/hyperlinks, it creates arrays\n // We need to reconstruct the original sequence by scanning the raw XML\n // This prevents punctuation from being reordered (e.g., \"Heading.\" becoming \".Heading\")\n await this.parseOrderedParagraphChildren(\n paraXml,\n pElement,\n paragraph,\n relationshipManager,\n zipHandler,\n imageManager\n );\n\n // NOTE: Complex field assembly (both single and multi-paragraph) is now handled\n // at the parseBodyElements level via assembleMultiParagraphFields(), which calls\n // assembleComplexFields() for single-paragraph fields after processing multi-paragraph ones.\n\n // Diagnostic logging for paragraph\n const runs = paragraph.getRuns();\n const runData = runs.map((run) => ({\n text: run.getText(),\n rtl: run.isRTL(),\n }));\n const bidi = paragraph.getFormatting().bidi;\n\n logParagraphContent('parsing', -1, runData, bidi);\n\n if (bidi) {\n logTextDirection(`Paragraph has BiDi enabled`);\n }\n\n // Merge consecutive hyperlinks with the same URL (handles Google Docs fragmentation)\n this.mergeConsecutiveHyperlinks(paragraph);\n\n return paragraph;\n } catch (error: unknown) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.parseErrors.push({ element: 'paragraph', error: err });\n\n if (this.strictParsing) {\n throw new Error(`Failed to parse paragraph: ${err.message}`);\n }\n\n return null;\n }\n }\n\n /**\n * CRITICAL FIX: Parses paragraph children in document order\n * This preserves the original sequence of runs, hyperlinks, and fields\n * Fixes issues where punctuation appears at the beginning instead of end\n * Example: \".Aetna\" becomes \"Aetna.\" by respecting original XML order\n *\n * @param paraXml - Raw paragraph XML\n * @param pElement - Parsed paragraph object\n * @param paragraph - Paragraph instance to populate\n * @param relationshipManager - Relationship manager\n * @param zipHandler - ZIP handler for resources\n * @param imageManager - Image manager for images\n */\n private async parseOrderedParagraphChildren(\n paraXml: string,\n pElement: any,\n paragraph: Paragraph,\n relationshipManager: RelationshipManager,\n zipHandler?: ZipHandler,\n imageManager?: ImageManager\n ): Promise<void> {\n // Extract the body portion (between pPr and closing tag) to scan for child elements\n // Find where w:pPr ends\n const pPrEnd = paraXml.indexOf('</w:pPr>');\n const contentStart = pPrEnd !== -1 ? pPrEnd + 8 : paraXml.indexOf('>') + 1;\n const contentEnd = paraXml.lastIndexOf('</w:p>');\n\n if (contentEnd <= contentStart) {\n return; // Empty paragraph\n }\n\n const paraContent = paraXml.substring(contentStart, contentEnd);\n\n // Track children by scanning XML for opening tags\n interface ChildMarker {\n type:\n | 'w:r'\n | 'w:hyperlink'\n | 'w:fldSimple'\n | 'w:ins'\n | 'w:del'\n | 'w:moveFrom'\n | 'w:moveTo'\n | 'w:bookmarkStart'\n | 'w:bookmarkEnd'\n | 'w:proofErr'\n | 'w:permStart'\n | 'w:permEnd'\n | 'm:oMath'\n | 'w:ruby'\n | 'w:commentRangeStart'\n | 'w:commentRangeEnd';\n pos: number;\n index: number;\n }\n\n const children: ChildMarker[] = [];\n let runIndex = 0;\n let hyperlinkIndex = 0;\n let fieldIndex = 0;\n let insIndex = 0;\n let delIndex = 0;\n let moveFromIndex = 0;\n let moveToIndex = 0;\n let bookmarkStartIndex = 0;\n let bookmarkEndIndex = 0;\n let proofErrIndex = 0;\n let permStartIndex = 0;\n let permEndIndex = 0;\n let oMathIndex = 0;\n let rubyIndex = 0;\n let commentRangeStartIndex = 0;\n let commentRangeEndIndex = 0;\n\n // Helper to find closing tag position for a given tag name starting from position\n const findClosingTagEnd = (content: string, tagName: string, startPos: number): number => {\n const closingTag = `</${tagName}>`;\n const closingPos = content.indexOf(closingTag, startPos);\n if (closingPos === -1) return startPos; // Fallback if not found\n return closingPos + closingTag.length;\n };\n\n // Helper to check if tag is self-closing\n const isSelfClosing = (tagContent: string): boolean => {\n return tagContent.endsWith('/');\n };\n\n // Scan for all first-level child elements in document order\n let searchPos = 0;\n while (searchPos < paraContent.length) {\n // Find the next opening tag\n const tagStart = paraContent.indexOf('<', searchPos);\n if (tagStart === -1) break;\n\n // Extract tag name\n const tagEnd = paraContent.indexOf('>', tagStart);\n if (tagEnd === -1) break;\n\n const tagContent = paraContent.substring(tagStart + 1, tagEnd);\n const tagName = tagContent.split(/[\\s\\/>]/)[0];\n const selfClosing = isSelfClosing(tagContent);\n\n if (tagName === 'w:r') {\n children.push({ type: 'w:r', pos: tagStart, index: runIndex++ });\n // Skip past closing tag to avoid counting nested elements\n searchPos = selfClosing ? tagEnd + 1 : findClosingTagEnd(paraContent, 'w:r', tagEnd);\n } else if (tagName === 'w:hyperlink') {\n children.push({\n type: 'w:hyperlink',\n pos: tagStart,\n index: hyperlinkIndex++,\n });\n // Skip past closing tag - hyperlinks contain nested runs we shouldn't count\n searchPos = selfClosing\n ? tagEnd + 1\n : findClosingTagEnd(paraContent, 'w:hyperlink', tagEnd);\n } else if (tagName === 'w:fldSimple') {\n children.push({\n type: 'w:fldSimple',\n pos: tagStart,\n index: fieldIndex++,\n });\n // Skip past closing tag\n searchPos = selfClosing\n ? tagEnd + 1\n : findClosingTagEnd(paraContent, 'w:fldSimple', tagEnd);\n } else if (tagName === 'w:ins') {\n children.push({\n type: 'w:ins',\n pos: tagStart,\n index: insIndex++,\n });\n // Skip past closing tag - ins contains nested runs\n searchPos = selfClosing ? tagEnd + 1 : findClosingTagEnd(paraContent, 'w:ins', tagEnd);\n } else if (tagName === 'w:del') {\n children.push({\n type: 'w:del',\n pos: tagStart,\n index: delIndex++,\n });\n // Skip past closing tag - del contains nested runs\n searchPos = selfClosing ? tagEnd + 1 : findClosingTagEnd(paraContent, 'w:del', tagEnd);\n } else if (tagName === 'w:moveFrom') {\n children.push({\n type: 'w:moveFrom',\n pos: tagStart,\n index: moveFromIndex++,\n });\n // Skip past closing tag\n searchPos = selfClosing ? tagEnd + 1 : findClosingTagEnd(paraContent, 'w:moveFrom', tagEnd);\n } else if (tagName === 'w:moveTo') {\n children.push({\n type: 'w:moveTo',\n pos: tagStart,\n index: moveToIndex++,\n });\n // Skip past closing tag\n searchPos = selfClosing ? tagEnd + 1 : findClosingTagEnd(paraContent, 'w:moveTo', tagEnd);\n } else if (tagName === 'w:bookmarkStart') {\n // Bookmark start markers - always self-closing\n children.push({\n type: 'w:bookmarkStart',\n pos: tagStart,\n index: bookmarkStartIndex++,\n });\n searchPos = tagEnd + 1;\n } else if (tagName === 'w:bookmarkEnd') {\n // Bookmark end markers - always self-closing\n children.push({\n type: 'w:bookmarkEnd',\n pos: tagStart,\n index: bookmarkEndIndex++,\n });\n searchPos = tagEnd + 1;\n } else if (tagName === 'w:commentRangeStart') {\n // Comment range start markers - always self-closing\n children.push({\n type: 'w:commentRangeStart',\n pos: tagStart,\n index: commentRangeStartIndex++,\n });\n searchPos = tagEnd + 1;\n } else if (tagName === 'w:commentRangeEnd') {\n // Comment range end markers - always self-closing\n children.push({\n type: 'w:commentRangeEnd',\n pos: tagStart,\n index: commentRangeEndIndex++,\n });\n searchPos = tagEnd + 1;\n } else if (tagName === 'w:proofErr') {\n // Proofing error markers - always self-closing\n children.push({\n type: 'w:proofErr',\n pos: tagStart,\n index: proofErrIndex++,\n });\n searchPos = tagEnd + 1;\n } else if (tagName === 'w:permStart') {\n // Permission range start - always self-closing\n children.push({\n type: 'w:permStart',\n pos: tagStart,\n index: permStartIndex++,\n });\n searchPos = tagEnd + 1;\n } else if (tagName === 'w:permEnd') {\n // Permission range end - always self-closing\n children.push({\n type: 'w:permEnd',\n pos: tagStart,\n index: permEndIndex++,\n });\n searchPos = tagEnd + 1;\n } else if (tagName === 'm:oMath') {\n // Inline math expression - preserve as raw XML\n children.push({\n type: 'm:oMath',\n pos: tagStart,\n index: oMathIndex++,\n });\n searchPos = selfClosing ? tagEnd + 1 : findClosingTagEnd(paraContent, 'm:oMath', tagEnd);\n } else if (tagName === 'w:ruby') {\n // Ruby text (phonetic guides) - preserve as raw XML\n children.push({\n type: 'w:ruby',\n pos: tagStart,\n index: rubyIndex++,\n });\n searchPos = selfClosing ? tagEnd + 1 : findClosingTagEnd(paraContent, 'w:ruby', tagEnd);\n } else {\n searchPos = tagEnd + 1;\n }\n }\n\n // Helper to extract raw run XML from paraContent using position\n const extractRunXmlAtPosition = (pos: number): string | null => {\n // Find the end of this run element\n const closeTag = '</w:r>';\n let depth = 1;\n let searchPos = paraContent.indexOf('>', pos) + 1;\n while (depth > 0 && searchPos < paraContent.length) {\n const nextOpen = paraContent.indexOf('<w:r', searchPos);\n const nextClose = paraContent.indexOf(closeTag, searchPos);\n if (nextClose === -1) break;\n if (nextOpen !== -1 && nextOpen < nextClose) {\n // Check if it's actually <w:r> not <w:rPr> etc\n const charAfter = paraContent[nextOpen + 4];\n if (charAfter === '>' || charAfter === ' ' || charAfter === '/') {\n depth++;\n }\n searchPos = nextOpen + 4;\n } else {\n depth--;\n if (depth === 0) {\n return paraContent.substring(pos, nextClose + closeTag.length);\n }\n searchPos = nextClose + closeTag.length;\n }\n }\n return null;\n };\n\n // Helper to extract element XML at a known position, depth-aware\n const extractElementXmlAtPosition = (pos: number, tagName: string): string => {\n const openTag = `<${tagName}`;\n const closeTag = `</${tagName}>`;\n const openEnd = paraContent.indexOf('>', pos);\n if (openEnd === -1) return '';\n // Self-closing\n if (paraContent[openEnd - 1] === '/') {\n return paraContent.substring(pos, openEnd + 1);\n }\n let depth = 1;\n let searchFrom = openEnd + 1;\n while (depth > 0 && searchFrom < paraContent.length) {\n const nextOpen = paraContent.indexOf(openTag, searchFrom);\n const nextClose = paraContent.indexOf(closeTag, searchFrom);\n if (nextClose === -1) break;\n if (nextOpen !== -1 && nextOpen < nextClose) {\n const charAfter = paraContent[nextOpen + openTag.length];\n if (\n charAfter === '>' ||\n charAfter === ' ' ||\n charAfter === '/' ||\n charAfter === '\\t' ||\n charAfter === '\\n' ||\n charAfter === '\\r'\n ) {\n depth++;\n }\n searchFrom = nextOpen + openTag.length;\n } else {\n depth--;\n if (depth === 0) {\n return paraContent.substring(pos, nextClose + closeTag.length);\n }\n searchFrom = nextClose + closeTag.length;\n }\n }\n return '';\n };\n\n // Now process children in the order they were found\n for (const child of children) {\n if (child.type === 'w:r') {\n const runs = pElement['w:r'];\n const runArray = Array.isArray(runs) ? runs : runs ? [runs] : [];\n if (child.index < runArray.length) {\n const runObj = runArray[child.index];\n if (runObj['w:commentReference']) {\n // Comment reference run — preserve as raw XML so the\n // w:commentReference element inside survives round-trip.\n // Without this, Word can't link comment ranges to comments.xml.\n const runXml = extractRunXmlAtPosition(child.pos);\n if (runXml) {\n paragraph.addContent(new PreservedElement(runXml, 'w:r', 'inline'));\n }\n } else if (runObj['w:drawing']) {\n if (zipHandler && imageManager) {\n const imageRun = await this.parseDrawingFromObject(\n runObj['w:drawing'],\n zipHandler,\n relationshipManager,\n imageManager\n );\n if (imageRun) {\n paragraph.addRun(imageRun);\n }\n }\n } else if (runObj['w:pict']) {\n // VML graphics - preserve as raw XML for passthrough\n // Extract the raw run XML using position to get the exact w:pict content\n const runXml = extractRunXmlAtPosition(child.pos);\n if (runXml) {\n const pictXmls = XMLParser.extractElements(runXml, 'w:pict');\n if (pictXmls.length > 0 && pictXmls[0]) {\n const run = Run.createFromContent([{ type: 'vml', rawXml: pictXmls[0] }]);\n // Apply any run properties (formatting) to the VML run\n this.parseRunPropertiesFromObject(runObj['w:rPr'], run);\n paragraph.addRun(run);\n }\n }\n } else if (runObj['w:object']) {\n // Embedded OLE object - preserve as raw XML for round-trip fidelity\n // Per ECMA-376 Part 1 §17.3.3.19\n const runXml = extractRunXmlAtPosition(child.pos);\n if (runXml) {\n const objectXmls = XMLParser.extractElements(runXml, 'w:object');\n if (objectXmls.length > 0 && objectXmls[0]) {\n const run = Run.createFromContent([\n { type: 'embeddedObject', rawXml: objectXmls[0] },\n ]);\n this.parseRunPropertiesFromObject(runObj['w:rPr'], run);\n paragraph.addRun(run);\n }\n }\n } else {\n const run = this.parseRunFromObject(runObj);\n if (run) {\n paragraph.addRun(run);\n }\n }\n }\n } else if (child.type === 'w:hyperlink') {\n const hyperlinks = pElement['w:hyperlink'];\n const hyperlinkArray = Array.isArray(hyperlinks)\n ? hyperlinks\n : hyperlinks\n ? [hyperlinks]\n : [];\n if (child.index < hyperlinkArray.length) {\n const hyperlinkObj = hyperlinkArray[child.index];\n\n // Hyperlinks containing tracked changes (w:del/w:ins inside w:hyperlink)\n // cannot survive parseHyperlinkFromObject round-trip — preserve as raw XML\n const hasRevisionChildren =\n hyperlinkObj['w:del'] ||\n hyperlinkObj['w:ins'] ||\n hyperlinkObj['w:moveFrom'] ||\n hyperlinkObj['w:moveTo'];\n if (hasRevisionChildren) {\n const rawXml = extractElementXmlAtPosition(child.pos, 'w:hyperlink');\n if (rawXml) {\n paragraph.addContent(new PreservedElement(rawXml, 'w:hyperlink', 'inline'));\n }\n } else {\n const result = this.parseHyperlinkFromObject(hyperlinkObj, relationshipManager);\n if (result.hyperlink) {\n paragraph.addHyperlink(result.hyperlink);\n }\n // Add any bookmarks found inside the hyperlink\n for (const bookmark of result.bookmarkStarts) {\n paragraph.addBookmarkStart(bookmark);\n }\n for (const bookmark of result.bookmarkEnds) {\n paragraph.addBookmarkEnd(bookmark);\n }\n }\n }\n } else if (child.type === 'w:fldSimple') {\n const fields = pElement['w:fldSimple'];\n const fieldArray = Array.isArray(fields) ? fields : fields ? [fields] : [];\n if (child.index < fieldArray.length) {\n const field = this.parseSimpleFieldFromObject(fieldArray[child.index]);\n if (field) {\n paragraph.addField(field);\n }\n }\n } else if (\n child.type === 'w:ins' ||\n child.type === 'w:del' ||\n child.type === 'w:moveFrom' ||\n child.type === 'w:moveTo'\n ) {\n const revisionXml = extractElementXmlAtPosition(child.pos, child.type);\n if (revisionXml) {\n // Detect nested revision elements (e.g., w:del inside w:ins)\n const innerContent = revisionXml.substring(revisionXml.indexOf('>') + 1);\n const hasNestedRevision = /<w:(del|moveFrom|moveTo|ins)\\s/.test(innerContent);\n if (hasNestedRevision) {\n // Preserve entire nested structure as raw XML for round-trip fidelity\n paragraph.addContent(new PreservedElement(revisionXml, child.type, 'inline'));\n } else {\n const revResult = await this.parseRevisionFromXml(\n revisionXml,\n child.type,\n relationshipManager,\n zipHandler,\n imageManager\n );\n if (revResult.revision) {\n paragraph.addRevision(revResult.revision);\n }\n for (const bookmark of revResult.bookmarkStarts) {\n paragraph.addBookmarkStart(bookmark);\n }\n for (const bookmark of revResult.bookmarkEnds) {\n paragraph.addBookmarkEnd(bookmark);\n }\n }\n }\n } else if (child.type === 'w:bookmarkStart') {\n const endPos = paraContent.indexOf('>', child.pos);\n if (endPos !== -1) {\n const bookmarkXml = paraContent.substring(child.pos, endPos + 1);\n const bookmark = this.parseBookmarkStart(bookmarkXml);\n if (bookmark) {\n paragraph.addBookmarkStart(bookmark);\n }\n }\n } else if (child.type === 'w:bookmarkEnd') {\n const endPos = paraContent.indexOf('>', child.pos);\n if (endPos !== -1) {\n const bookmarkXml = paraContent.substring(child.pos, endPos + 1);\n const bookmark = this.parseBookmarkEnd(bookmarkXml);\n if (bookmark) {\n paragraph.addBookmarkEnd(bookmark);\n }\n }\n } else if (child.type === 'w:commentRangeStart' || child.type === 'w:commentRangeEnd') {\n // Preserve comment range markers as raw XML for round-trip fidelity.\n // Without these, comments.xml references become orphaned and Word\n // flags the document as corrupt (\"unreadable content\").\n const selfCloseEnd = paraContent.indexOf('>', child.pos);\n if (selfCloseEnd !== -1) {\n const rawXml = paraContent.substring(child.pos, selfCloseEnd + 1);\n paragraph.addContent(new PreservedElement(rawXml, child.type, 'inline'));\n }\n } else if (\n child.type === 'w:proofErr' ||\n child.type === 'w:permStart' ||\n child.type === 'w:permEnd'\n ) {\n // Preserve proofing errors and permission ranges as raw XML\n // These are self-closing elements: extract from pos to end of tag\n const selfCloseEnd = paraContent.indexOf('>', child.pos);\n if (selfCloseEnd !== -1) {\n const rawXml = paraContent.substring(child.pos, selfCloseEnd + 1);\n paragraph.addContent(new PreservedElement(rawXml, child.type, 'inline'));\n }\n } else if (child.type === 'm:oMath' || child.type === 'w:ruby') {\n // Preserve inline math and ruby elements as raw XML for round-trip fidelity\n const elementXml = this.extractSingleElement(paraContent, child.type, child.pos);\n if (elementXml) {\n paragraph.addContent(new PreservedElement(elementXml, child.type, 'inline'));\n }\n }\n }\n }\n\n /**\n * Parses a revision element from raw XML\n * Extracts revision metadata (id, author, date), contained runs, and any bookmarks\n * @param revisionXml - Raw XML of the revision element\n * @param tagName - Tag name (w:ins, w:del, w:moveFrom, w:moveTo)\n * @param relationshipManager - Relationship manager for image relationships\n * @param zipHandler - ZIP handler for loading image data\n * @param imageManager - Image manager for registering images\n * @returns Object with parsed Revision and any bookmarks found inside, or null\n */\n private async parseRevisionFromXml(\n revisionXml: string,\n tagName: string,\n relationshipManager: RelationshipManager,\n zipHandler?: ZipHandler,\n imageManager?: ImageManager\n ): Promise<{\n revision: Revision | null;\n bookmarkStarts: Bookmark[];\n bookmarkEnds: Bookmark[];\n }> {\n const result: {\n revision: Revision | null;\n bookmarkStarts: Bookmark[];\n bookmarkEnds: Bookmark[];\n } = { revision: null, bookmarkStarts: [], bookmarkEnds: [] };\n try {\n // Map XML tag to RevisionType\n let revisionType: import('../elements/Revision').RevisionType;\n switch (tagName) {\n case 'w:ins':\n revisionType = 'insert';\n break;\n case 'w:del':\n revisionType = 'delete';\n break;\n case 'w:moveFrom':\n revisionType = 'moveFrom';\n break;\n case 'w:moveTo':\n revisionType = 'moveTo';\n break;\n default:\n return result;\n }\n\n // Extract attributes\n const idAttr = XMLParser.extractAttribute(revisionXml, 'w:id');\n const author = XMLParser.extractAttribute(revisionXml, 'w:author');\n const dateAttr = XMLParser.extractAttribute(revisionXml, 'w:date');\n const moveId = XMLParser.extractAttribute(revisionXml, 'w:moveId');\n\n if (!idAttr || !author) {\n return result; // Required attributes missing\n }\n\n const id = parseInt(idAttr, 10);\n const date = dateAttr ? new Date(dateAttr) : new Date();\n\n // Extract content from revision element (runs and hyperlinks)\n // IMPORTANT: Extract hyperlinks FIRST, then extract runs from content\n // that is NOT inside hyperlinks to avoid duplicate content\n const hyperlinkXmls = XMLParser.extractElements(revisionXml, 'w:hyperlink');\n\n // Create a version of the XML with hyperlinks removed to extract standalone runs\n // Use split().join() instead of replace() to remove ALL occurrences of identical hyperlinks\n // (replace() only removes the first match, causing duplicate content)\n let xmlWithoutHyperlinks = revisionXml;\n for (const hyperlinkXml of hyperlinkXmls) {\n xmlWithoutHyperlinks = xmlWithoutHyperlinks.split(hyperlinkXml).join('');\n }\n\n // Extract runs from the XML without hyperlinks (these are standalone runs)\n const runXmls = XMLParser.extractElements(xmlWithoutHyperlinks, 'w:r');\n\n // Use RevisionContent to hold both Run and Hyperlink objects\n const content: import('../elements/RevisionContent').RevisionContent[] = [];\n\n // Parse standalone runs (not inside hyperlinks)\n for (const runXml of runXmls) {\n // Parse the run object\n const runObj = XMLParser.parseToObject(runXml, { trimValues: false });\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const runElement = runObj['w:r'] as any;\n\n // Check if this run contains a drawing (image)\n if (runElement?.['w:drawing']) {\n if (zipHandler && imageManager) {\n const imageRun = await this.parseDrawingFromObject(\n runElement['w:drawing'],\n zipHandler,\n relationshipManager,\n imageManager\n );\n if (imageRun) {\n content.push(imageRun);\n }\n }\n } else {\n // Parse as regular text run\n const run = this.parseRunFromObject(runElement);\n if (run) {\n content.push(run);\n }\n }\n }\n\n // Parse hyperlinks inside revision (for tracked hyperlink changes)\n for (const hyperlinkXml of hyperlinkXmls) {\n const hyperlinkObj = XMLParser.parseToObject(hyperlinkXml, { trimValues: false });\n const hyperlinkResult = this.parseHyperlinkFromObject(\n hyperlinkObj['w:hyperlink'],\n relationshipManager\n );\n if (hyperlinkResult.hyperlink) {\n content.push(hyperlinkResult.hyperlink);\n }\n // Collect bookmarks from hyperlinks inside revisions\n result.bookmarkStarts.push(...hyperlinkResult.bookmarkStarts);\n result.bookmarkEnds.push(...hyperlinkResult.bookmarkEnds);\n }\n\n // Extract bookmarks directly inside the revision (not nested in hyperlinks)\n const bookmarkStartXmls = XMLParser.extractElements(xmlWithoutHyperlinks, 'w:bookmarkStart');\n const bookmarkEndXmls = XMLParser.extractElements(xmlWithoutHyperlinks, 'w:bookmarkEnd');\n\n for (const bookmarkXml of bookmarkStartXmls) {\n const bookmark = this.parseBookmarkStart(bookmarkXml);\n if (bookmark) {\n result.bookmarkStarts.push(bookmark);\n }\n }\n\n for (const bookmarkXml of bookmarkEndXmls) {\n const bookmark = this.parseBookmarkEnd(bookmarkXml);\n if (bookmark) {\n result.bookmarkEnds.push(bookmark);\n }\n }\n\n if (content.length === 0) {\n // Log debug info for empty revisions (may indicate malformed XML)\n defaultLogger.debug('[DocumentParser] Empty revision content skipped', {\n tagName,\n id: idAttr,\n author,\n });\n // Still return any bookmarks found even if revision has no content\n return result;\n }\n\n // Create Revision instance\n const revision = new Revision({\n id,\n author,\n date,\n type: revisionType,\n content,\n moveId,\n });\n\n result.revision = revision;\n return result;\n } catch (error: unknown) {\n defaultLogger.warn(\n '[DocumentParser] Failed to parse revision:',\n error instanceof Error\n ? { message: error.message, stack: error.stack }\n : { error: String(error) }\n );\n return result;\n }\n }\n\n /**\n * Parses comments from word/comments.xml\n * @param commentsXml - Raw XML content of comments.xml\n * @returns Array of parsed Comment objects\n */\n parseCommentsXml(commentsXml: string): Comment[] {\n const comments: Comment[] = [];\n\n // Extract all w:comment elements\n const commentXmls = XMLParser.extractElements(commentsXml, 'w:comment');\n\n for (const commentXml of commentXmls) {\n const comment = this.parseCommentFromXml(commentXml);\n if (comment) {\n comments.push(comment);\n }\n }\n\n return comments;\n }\n\n /**\n * Parses a single comment element from XML\n * @param commentXml - XML string for one w:comment element\n * @returns Parsed Comment or null\n */\n private parseCommentFromXml(commentXml: string): Comment | null {\n try {\n // Extract attributes\n const idAttr = XMLParser.extractAttribute(commentXml, 'w:id');\n const author = XMLParser.extractAttribute(commentXml, 'w:author') || 'Unknown';\n const dateAttr = XMLParser.extractAttribute(commentXml, 'w:date');\n const initials = XMLParser.extractAttribute(commentXml, 'w:initials');\n const parentIdAttr =\n XMLParser.extractAttribute(commentXml, 'w15:parentId') ||\n XMLParser.extractAttribute(commentXml, 'w:parentId');\n const doneAttr =\n XMLParser.extractAttribute(commentXml, 'w15:done') ||\n XMLParser.extractAttribute(commentXml, 'w:done');\n\n if (!idAttr) {\n return null; // ID is required\n }\n\n const id = parseInt(idAttr, 10);\n const date = dateAttr ? new Date(dateAttr) : new Date();\n const parentId = parentIdAttr ? parseInt(parentIdAttr, 10) : undefined;\n // Per ECMA-376, w:done=\"1\" or \"true\" indicates resolved\n const done = doneAttr === '1' || doneAttr === 'true';\n\n // Parse content (runs from paragraphs within the comment)\n const runs: Run[] = [];\n const runXmls = XMLParser.extractElements(commentXml, 'w:r');\n\n for (const runXml of runXmls) {\n const runObj = XMLParser.parseToObject(runXml, { trimValues: false });\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const run = this.parseRunFromObject(runObj['w:r'] as any);\n if (run) {\n runs.push(run);\n }\n }\n\n // Create comment with parsed data\n const comment = new Comment({\n id,\n author,\n initials: initials || undefined,\n date,\n content: runs.length > 0 ? runs : '',\n parentId,\n done,\n });\n\n return comment;\n } catch (error: unknown) {\n defaultLogger.warn(\n '[DocumentParser] Failed to parse comment:',\n error instanceof Error ? { message: error.message } : { error: String(error) }\n );\n return null;\n }\n }\n\n /**\n * Parses footnotes.xml into Footnote array\n */\n parseFootnotesXml(footnotesXml: string): Footnote[] {\n const footnotes: Footnote[] = [];\n const footnoteXmls = XMLParser.extractElements(footnotesXml, 'w:footnote');\n\n for (const footnoteXml of footnoteXmls) {\n const footnote = this.parseFootnoteFromXml(footnoteXml);\n if (footnote) {\n footnotes.push(footnote);\n }\n }\n\n return footnotes;\n }\n\n private parseFootnoteFromXml(footnoteXml: string): Footnote | null {\n try {\n const idAttr = XMLParser.extractAttribute(footnoteXml, 'w:id');\n const typeAttr = XMLParser.extractAttribute(footnoteXml, 'w:type');\n\n if (idAttr === undefined) {\n return null;\n }\n\n const id = parseInt(idAttr, 10);\n\n let type: FootnoteType | undefined;\n if (typeAttr === 'separator') {\n type = FootnoteType.Separator;\n } else if (typeAttr === 'continuationSeparator') {\n type = FootnoteType.ContinuationSeparator;\n } else if (typeAttr === 'continuationNotice') {\n type = FootnoteType.ContinuationNotice;\n }\n\n const footnote = new Footnote({ id, type });\n\n const paraXmls = XMLParser.extractElements(footnoteXml, 'w:p');\n for (const paraXml of paraXmls) {\n const para = this.parseNoteParaFromXml(paraXml);\n if (para) {\n footnote.addParagraph(para);\n }\n }\n\n return footnote;\n } catch (error: unknown) {\n defaultLogger.warn(\n '[DocumentParser] Failed to parse footnote:',\n error instanceof Error ? { message: error.message } : { error: String(error) }\n );\n return null;\n }\n }\n\n /**\n * Parses endnotes.xml into Endnote array\n */\n parseEndnotesXml(endnotesXml: string): Endnote[] {\n const endnotes: Endnote[] = [];\n const endnoteXmls = XMLParser.extractElements(endnotesXml, 'w:endnote');\n\n for (const endnoteXml of endnoteXmls) {\n const endnote = this.parseEndnoteFromXml(endnoteXml);\n if (endnote) {\n endnotes.push(endnote);\n }\n }\n\n return endnotes;\n }\n\n private parseEndnoteFromXml(endnoteXml: string): Endnote | null {\n try {\n const idAttr = XMLParser.extractAttribute(endnoteXml, 'w:id');\n const typeAttr = XMLParser.extractAttribute(endnoteXml, 'w:type');\n\n if (idAttr === undefined) {\n return null;\n }\n\n const id = parseInt(idAttr, 10);\n\n let type: EndnoteType | undefined;\n if (typeAttr === 'separator') {\n type = EndnoteType.Separator;\n } else if (typeAttr === 'continuationSeparator') {\n type = EndnoteType.ContinuationSeparator;\n } else if (typeAttr === 'continuationNotice') {\n type = EndnoteType.ContinuationNotice;\n }\n\n const endnote = new Endnote({ id, type });\n\n const paraXmls = XMLParser.extractElements(endnoteXml, 'w:p');\n for (const paraXml of paraXmls) {\n const para = this.parseNoteParaFromXml(paraXml);\n if (para) {\n endnote.addParagraph(para);\n }\n }\n\n return endnote;\n } catch (error: unknown) {\n defaultLogger.warn(\n '[DocumentParser] Failed to parse endnote:',\n error instanceof Error ? { message: error.message } : { error: String(error) }\n );\n return null;\n }\n }\n\n /**\n * Parses a paragraph from a footnote or endnote element.\n * Uses run-level parsing (like comments) to avoid async dependency on relationship manager.\n */\n private parseNoteParaFromXml(paraXml: string): Paragraph | null {\n try {\n const para = new Paragraph();\n const runXmls = XMLParser.extractElements(paraXml, 'w:r');\n for (const runXml of runXmls) {\n const runObj = XMLParser.parseToObject(runXml, { trimValues: false });\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const run = this.parseRunFromObject(runObj['w:r'] as any);\n if (run) {\n para.addRun(run);\n }\n }\n return para;\n } catch {\n return null;\n }\n }\n\n /**\n * Parses a bookmark start element from XML\n * @param bookmarkXml - Raw XML of the w:bookmarkStart element\n * @returns Bookmark instance or null\n */\n private parseBookmarkStart(bookmarkXml: string): Bookmark | null {\n try {\n const idAttr = XMLParser.extractAttribute(bookmarkXml, 'w:id');\n const nameAttr = XMLParser.extractAttribute(bookmarkXml, 'w:name');\n\n if (!idAttr || !nameAttr) {\n return null; // Required attributes missing\n }\n\n const id = parseInt(idAttr, 10);\n\n // Create bookmark with skipNormalization to preserve original name exactly\n // (Word allows special characters like = and . in bookmark names)\n const bookmark = new Bookmark({\n name: nameAttr,\n id: id,\n skipNormalization: true,\n });\n\n // Register with BookmarkManager to enable hasBookmark() checks\n // This prevents duplicate bookmarks when Template_UI adds bookmarks\n if (this.bookmarkManager) {\n try {\n this.bookmarkManager.registerExisting(bookmark);\n } catch (e) {\n // Bookmark might already be registered (duplicate in source doc)\n // Just log debug, don't fail - the bookmark is still valid for output\n defaultLogger.debug('[DocumentParser] Bookmark already registered:', {\n name: nameAttr,\n id: id,\n });\n }\n }\n\n return bookmark;\n } catch (error: unknown) {\n defaultLogger.warn(\n '[DocumentParser] Failed to parse bookmark start:',\n error instanceof Error ? { message: error.message } : { error: String(error) }\n );\n return null;\n }\n }\n\n /**\n * Parses a bookmark end element from XML\n * @param bookmarkXml - Raw XML of the w:bookmarkEnd element\n * @returns Bookmark instance or null\n */\n private parseBookmarkEnd(bookmarkXml: string): Bookmark | null {\n try {\n const idAttr = XMLParser.extractAttribute(bookmarkXml, 'w:id');\n\n if (!idAttr) {\n return null; // Required attribute missing\n }\n\n const id = parseInt(idAttr, 10);\n\n // Create a placeholder bookmark for the end marker\n // The name doesn't matter for bookmarkEnd as it only uses the ID\n const bookmark = new Bookmark({\n name: `_end_${id}`,\n id: id,\n skipNormalization: true,\n });\n\n return bookmark;\n } catch (error: unknown) {\n defaultLogger.warn(\n '[DocumentParser] Failed to parse bookmark end:',\n error instanceof Error ? { message: error.message } : { error: String(error) }\n );\n return null;\n }\n }\n\n private async parseParagraphFromObject(\n paraObj: any,\n relationshipManager: RelationshipManager,\n zipHandler?: ZipHandler,\n imageManager?: ImageManager\n ): Promise<Paragraph | null> {\n try {\n const paragraph = new Paragraph();\n\n // Parse w14:paraId attribute from paragraph element (Word 2010+ requirement)\n const paraId = paraObj['w14:paraId'];\n if (paraId) {\n paragraph.formatting.paraId = paraId;\n }\n\n // Parse paragraph properties\n this.parseParagraphPropertiesFromObject(paraObj['w:pPr'], paragraph);\n\n // Check if we have ordered children metadata from the enhanced parser\n const orderedChildren = paraObj._orderedChildren as\n | { type: string; index: number }[]\n | undefined;\n\n if (orderedChildren && orderedChildren.length > 0) {\n // Use the preserved order from the parser\n for (const childInfo of orderedChildren) {\n const elementType = childInfo.type;\n const elementIndex = childInfo.index;\n\n if (elementType === 'w:r') {\n const runs = paraObj['w:r'];\n const runArray = Array.isArray(runs) ? runs : runs ? [runs] : [];\n if (elementIndex < runArray.length) {\n const child = runArray[elementIndex];\n if (child['w:drawing']) {\n if (zipHandler && imageManager) {\n const imageRun = await this.parseDrawingFromObject(\n child['w:drawing'],\n zipHandler,\n relationshipManager,\n imageManager\n );\n if (imageRun) {\n paragraph.addRun(imageRun);\n }\n }\n } else {\n const run = this.parseRunFromObject(child);\n if (run) {\n paragraph.addRun(run);\n }\n }\n }\n } else if (elementType === 'w:hyperlink') {\n const hyperlinks = paraObj['w:hyperlink'];\n const hyperlinkArray = Array.isArray(hyperlinks)\n ? hyperlinks\n : hyperlinks\n ? [hyperlinks]\n : [];\n if (elementIndex < hyperlinkArray.length) {\n const result = this.parseHyperlinkFromObject(\n hyperlinkArray[elementIndex],\n relationshipManager\n );\n if (result.hyperlink) {\n paragraph.addHyperlink(result.hyperlink);\n }\n // Add any bookmarks found inside the hyperlink\n for (const bookmark of result.bookmarkStarts) {\n paragraph.addBookmarkStart(bookmark);\n }\n for (const bookmark of result.bookmarkEnds) {\n paragraph.addBookmarkEnd(bookmark);\n }\n }\n } else if (elementType === 'w:fldSimple') {\n const fields = paraObj['w:fldSimple'];\n const fieldArray = Array.isArray(fields) ? fields : fields ? [fields] : [];\n if (elementIndex < fieldArray.length) {\n const field = this.parseSimpleFieldFromObject(fieldArray[elementIndex]);\n if (field) {\n paragraph.addField(field);\n }\n }\n }\n }\n } else {\n // Fallback to sequential processing if no order metadata\n // Handle runs (w:r)\n const runs = paraObj['w:r'];\n const runChildren = Array.isArray(runs) ? runs : runs ? [runs] : [];\n\n for (const child of runChildren) {\n if (child['w:drawing']) {\n if (zipHandler && imageManager) {\n // Parse as image run\n const imageRun = await this.parseDrawingFromObject(\n child['w:drawing'],\n zipHandler,\n relationshipManager,\n imageManager\n );\n if (imageRun) {\n paragraph.addRun(imageRun);\n }\n }\n } else {\n // Parse as normal text run\n const run = this.parseRunFromObject(child);\n if (run) {\n paragraph.addRun(run);\n }\n }\n }\n\n // Handle hyperlinks (w:hyperlink)\n const hyperlinks = paraObj['w:hyperlink'];\n const hyperlinkChildren = Array.isArray(hyperlinks)\n ? hyperlinks\n : hyperlinks\n ? [hyperlinks]\n : [];\n\n for (const hyperlinkObj of hyperlinkChildren) {\n const result = this.parseHyperlinkFromObject(hyperlinkObj, relationshipManager);\n if (result.hyperlink) {\n paragraph.addHyperlink(result.hyperlink);\n }\n // Add any bookmarks found inside the hyperlink\n for (const bookmark of result.bookmarkStarts) {\n paragraph.addBookmarkStart(bookmark);\n }\n for (const bookmark of result.bookmarkEnds) {\n paragraph.addBookmarkEnd(bookmark);\n }\n }\n\n // Handle simple fields (w:fldSimple)\n const fields = paraObj['w:fldSimple'];\n const fieldChildren = Array.isArray(fields) ? fields : fields ? [fields] : [];\n\n for (const fieldObj of fieldChildren) {\n const field = this.parseSimpleFieldFromObject(fieldObj);\n if (field) {\n paragraph.addField(field);\n }\n }\n }\n\n // Merge consecutive hyperlinks with the same URL (handles Google Docs fragmentation)\n this.mergeConsecutiveHyperlinks(paragraph);\n\n return paragraph;\n } catch (error: unknown) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.parseErrors.push({ element: 'paragraph', error: err });\n\n if (this.strictParsing) {\n throw new Error(`Failed to parse paragraph: ${err.message}`);\n }\n\n // In lenient mode, log warning and continue\n return null;\n }\n }\n\n private parseParagraphPropertiesFromObject(pPrObj: any, paragraph: Paragraph): void {\n if (!pPrObj) return;\n\n // Paragraph mark run properties (w:rPr within w:pPr) per ECMA-376 Part 1 §17.3.1.29\n // This controls formatting of the paragraph mark (¶ symbol) itself\n if (pPrObj['w:rPr']) {\n const rPrObj = pPrObj['w:rPr'];\n // Create a temporary Run to use the existing parseRunPropertiesFromObject method\n const tempRun = new Run('');\n this.parseRunPropertiesFromObject(rPrObj, tempRun);\n // Extract the formatting and set it as paragraph mark properties\n paragraph.setParagraphMarkFormatting(tempRun.getFormatting());\n\n // Parse paragraph mark deletion tracking (w:del in w:pPr/w:rPr)\n // Per ECMA-376 Part 1 §17.13.5.14 - indicates the paragraph mark was deleted\n if (rPrObj['w:del']) {\n // Handle array case (malformed XML with duplicate w:del elements)\n const rawDel = rPrObj['w:del'];\n const delObj = Array.isArray(rawDel) ? rawDel[0] : rawDel;\n if (delObj && typeof delObj === 'object') {\n const id = parseInt(delObj['@_w:id'] || '0', 10) || 0;\n const author = String(delObj['@_w:author'] ?? '');\n const dateStr = delObj['@_w:date'];\n const parsedDate = dateStr ? new Date(String(dateStr)) : new Date();\n const date = isNaN(parsedDate.getTime()) ? new Date() : parsedDate;\n paragraph.markParagraphMarkAsDeleted(id, author, date);\n }\n }\n\n // Parse paragraph mark insertion tracking (w:ins in w:pPr/w:rPr)\n // Per ECMA-376 Part 1 §17.13.5.18 - indicates the paragraph mark was inserted\n if (rPrObj['w:ins']) {\n // Handle array case (malformed XML with duplicate w:ins elements)\n const rawIns = rPrObj['w:ins'];\n const insObj = Array.isArray(rawIns) ? rawIns[0] : rawIns;\n if (insObj && typeof insObj === 'object') {\n const id = parseInt(insObj['@_w:id'] || '0', 10) || 0;\n const author = String(insObj['@_w:author'] ?? '');\n const dateStr = insObj['@_w:date'];\n const parsedDate = dateStr ? new Date(String(dateStr)) : new Date();\n const date = isNaN(parsedDate.getTime()) ? new Date() : parsedDate;\n paragraph.markParagraphMarkAsInserted(id, author, date);\n }\n }\n }\n\n // Alignment\n // XMLParser adds @_ prefix to attributes\n if (pPrObj['w:jc']?.['@_w:val']) {\n paragraph.setAlignment(pPrObj['w:jc']['@_w:val']);\n }\n\n // Style\n if (pPrObj['w:pStyle']?.['@_w:val']) {\n paragraph.setStyle(pPrObj['w:pStyle']['@_w:val']);\n }\n\n // Indentation\n // Note: XMLParser converts numeric strings to numbers, so \"0\" becomes 0 (falsy)\n // Must use !== undefined check instead of truthy check to handle left=\"0\"\n if (pPrObj['w:ind']) {\n const ind = pPrObj['w:ind'];\n // Use isExplicitlySet and safeParseInt for robust zero-value handling\n if (isExplicitlySet(ind['@_w:left'])) paragraph.setLeftIndent(safeParseInt(ind['@_w:left']));\n if (isExplicitlySet(ind['@_w:right']))\n paragraph.setRightIndent(safeParseInt(ind['@_w:right']));\n if (isExplicitlySet(ind['@_w:firstLine']))\n paragraph.setFirstLineIndent(safeParseInt(ind['@_w:firstLine']));\n // Parse hanging indent per ECMA-376 Part 1 §17.3.1.17\n if (isExplicitlySet(ind['@_w:hanging']))\n paragraph.setHangingIndent(safeParseInt(ind['@_w:hanging']));\n }\n\n // Spacing\n if (pPrObj['w:spacing']) {\n const spacing = pPrObj['w:spacing'];\n // Use isExplicitlySet to properly handle 0 values (0 spacing is valid)\n if (isExplicitlySet(spacing['@_w:before']))\n paragraph.setSpaceBefore(safeParseInt(spacing['@_w:before']));\n if (isExplicitlySet(spacing['@_w:after']))\n paragraph.setSpaceAfter(safeParseInt(spacing['@_w:after']));\n if (isExplicitlySet(spacing['@_w:line'])) {\n paragraph.setLineSpacing(safeParseInt(spacing['@_w:line']), spacing['@_w:lineRule']);\n }\n }\n\n // Keep properties - parse pageBreakBefore FIRST, then apply keep properties\n // This triggers automatic conflict resolution per ECMA-376 v0.28.2\n if (pPrObj['w:pageBreakBefore']) paragraph.formatting.pageBreakBefore = true;\n\n // Keep properties - these will automatically clear pageBreakBefore if both are set\n if (pPrObj['w:keepNext']) paragraph.setKeepNext(true);\n if (pPrObj['w:keepLines']) paragraph.setKeepLines(true);\n\n // Contextual spacing\n if (pPrObj['w:contextualSpacing']) paragraph.setContextualSpacing(true);\n\n // Numbering\n // Note: When track changes are present (w:pPrChange), XMLParser merges the\n // current numPr and the old numPr from pPrChange into an array. The first\n // element is always the current value per _orderedChildren ordering.\n if (pPrObj['w:numPr']) {\n const numPrRaw = pPrObj['w:numPr'];\n // Handle both single object and array (when pPrChange is present)\n const numPr = Array.isArray(numPrRaw) ? numPrRaw[0] : numPrRaw;\n const numId = numPr?.['w:numId']?.['@_w:val'];\n const ilvl = numPr?.['w:ilvl']?.['@_w:val'] || '0';\n if (numId !== undefined && numId !== null) {\n const parsedNumId = parseInt(numId, 10);\n const parsedIlvl = parseInt(ilvl, 10);\n if (!isNaN(parsedNumId) && !isNaN(parsedIlvl)) {\n if (parsedNumId === 0) {\n paragraph.formatting.numberingSuppressed = true;\n } else {\n paragraph.setNumbering(parsedNumId, parsedIlvl);\n }\n }\n }\n }\n\n // Borders per ECMA-376 Part 1 §17.3.1.24\n if (pPrObj['w:pBdr']) {\n const pBdr = pPrObj['w:pBdr'];\n const borders: any = {};\n\n // Helper function to parse border definition\n const parseBorder = (borderObj: any): any => {\n if (!borderObj) return undefined;\n const border: any = {};\n if (borderObj['@_w:val']) border.style = borderObj['@_w:val'];\n if (borderObj['@_w:sz'] !== undefined) border.size = safeParseInt(borderObj['@_w:sz']);\n if (borderObj['@_w:color']) border.color = borderObj['@_w:color'];\n if (borderObj['@_w:space'] !== undefined)\n border.space = safeParseInt(borderObj['@_w:space']);\n return Object.keys(border).length > 0 ? border : undefined;\n };\n\n // Parse each border side\n if (pBdr['w:top']) borders.top = parseBorder(pBdr['w:top']);\n if (pBdr['w:bottom']) borders.bottom = parseBorder(pBdr['w:bottom']);\n if (pBdr['w:left']) borders.left = parseBorder(pBdr['w:left']);\n if (pBdr['w:right']) borders.right = parseBorder(pBdr['w:right']);\n if (pBdr['w:between']) borders.between = parseBorder(pBdr['w:between']);\n if (pBdr['w:bar']) borders.bar = parseBorder(pBdr['w:bar']);\n\n if (Object.keys(borders).length > 0) {\n paragraph.setBorder(borders);\n }\n }\n\n // Shading per ECMA-376 Part 1 §17.3.1.32\n if (pPrObj['w:shd']) {\n const shading = this.parseShadingFromObj(pPrObj['w:shd']);\n if (shading) {\n paragraph.setShading(shading);\n }\n }\n\n // Tab stops per ECMA-376 Part 1 §17.3.1.38\n if (pPrObj['w:tabs']) {\n const tabsObj = pPrObj['w:tabs'];\n const tabs: any[] = [];\n\n // Handle both single tab and array of tabs\n const tabElements = Array.isArray(tabsObj['w:tab'])\n ? tabsObj['w:tab']\n : tabsObj['w:tab']\n ? [tabsObj['w:tab']]\n : [];\n\n for (const tabObj of tabElements) {\n const tab: any = {};\n if (tabObj['@_w:pos']) tab.position = parseInt(tabObj['@_w:pos'], 10);\n if (tabObj['@_w:val']) tab.val = tabObj['@_w:val'];\n if (tabObj['@_w:leader']) tab.leader = tabObj['@_w:leader'];\n\n if (tab.position !== undefined) {\n tabs.push(tab);\n }\n }\n\n if (tabs.length > 0) {\n paragraph.setTabs(tabs);\n }\n }\n\n // Widow control per ECMA-376 Part 1 §17.3.1.40\n if (pPrObj['w:widowControl'] !== undefined) {\n const widowControlVal = pPrObj['w:widowControl']?.['@_w:val'];\n // Parse w:val attribute - can be \"0\"/\"1\" or \"false\"/\"true\"\n if (\n widowControlVal === '0' ||\n widowControlVal === 'false' ||\n widowControlVal === false ||\n widowControlVal === 0\n ) {\n paragraph.setWidowControl(false);\n } else {\n // If w:val is \"1\", \"true\", true, 1, or undefined (element present without val), default to true\n paragraph.setWidowControl(true);\n }\n }\n\n // Outline level per ECMA-376 Part 1 §17.3.1.19\n if (pPrObj['w:outlineLvl'] !== undefined && pPrObj['w:outlineLvl']['@_w:val'] !== undefined) {\n const level = parseInt(pPrObj['w:outlineLvl']['@_w:val'], 10);\n if (!isNaN(level) && level >= 0 && level <= 9) {\n paragraph.setOutlineLevel(level);\n }\n }\n\n // Suppress line numbers per ECMA-376 Part 1 §17.3.1.34\n if (pPrObj['w:suppressLineNumbers']) {\n paragraph.setSuppressLineNumbers(true);\n }\n\n // Bidirectional layout per ECMA-376 Part 1 §17.3.1.6\n if (pPrObj['w:bidi'] !== undefined) {\n const bidiVal = pPrObj['w:bidi']?.['@_w:val'];\n if (bidiVal === '0' || bidiVal === 'false' || bidiVal === false || bidiVal === 0) {\n paragraph.setBidi(false);\n } else {\n // Default is true when element present without val attribute or val=\"1\"\n paragraph.setBidi(true);\n }\n }\n\n // Text direction per ECMA-376 Part 1 §17.3.1.36\n if (pPrObj['w:textDirection']?.['@_w:val']) {\n paragraph.setTextDirection(pPrObj['w:textDirection']['@_w:val']);\n }\n\n // Text vertical alignment per ECMA-376 Part 1 §17.3.1.35\n if (pPrObj['w:textAlignment']?.['@_w:val']) {\n paragraph.setTextAlignment(pPrObj['w:textAlignment']['@_w:val']);\n }\n\n // Mirror indents per ECMA-376 Part 1 §17.3.1.18\n if (pPrObj['w:mirrorIndents']) {\n paragraph.setMirrorIndents(true);\n }\n\n // Auto-adjust right indent per ECMA-376 Part 1 §17.3.1.1\n if (pPrObj['w:adjustRightInd'] !== undefined) {\n const adjustRightIndVal = pPrObj['w:adjustRightInd']?.['@_w:val'];\n if (\n adjustRightIndVal === '0' ||\n adjustRightIndVal === 'false' ||\n adjustRightIndVal === false ||\n adjustRightIndVal === 0\n ) {\n paragraph.setAdjustRightInd(false);\n } else {\n // Default is true when element present without val attribute or val=\"1\"\n paragraph.setAdjustRightInd(true);\n }\n }\n\n // Text frame properties per ECMA-376 Part 1 §17.3.1.11\n if (pPrObj['w:framePr']) {\n const framePr = pPrObj['w:framePr'];\n const frameProps: any = {};\n // Use isExplicitlySet for numeric values to properly handle 0\n if (isExplicitlySet(framePr['@_w:w'])) frameProps.w = safeParseInt(framePr['@_w:w']);\n if (isExplicitlySet(framePr['@_w:h'])) frameProps.h = safeParseInt(framePr['@_w:h']);\n if (framePr['@_w:hRule']) frameProps.hRule = framePr['@_w:hRule'];\n if (isExplicitlySet(framePr['@_w:x'])) frameProps.x = safeParseInt(framePr['@_w:x']);\n if (isExplicitlySet(framePr['@_w:y'])) frameProps.y = safeParseInt(framePr['@_w:y']);\n if (framePr['@_w:xAlign']) frameProps.xAlign = framePr['@_w:xAlign'];\n if (framePr['@_w:yAlign']) frameProps.yAlign = framePr['@_w:yAlign'];\n if (framePr['@_w:hAnchor']) frameProps.hAnchor = framePr['@_w:hAnchor'];\n if (framePr['@_w:vAnchor']) frameProps.vAnchor = framePr['@_w:vAnchor'];\n if (isExplicitlySet(framePr['@_w:hSpace']))\n frameProps.hSpace = safeParseInt(framePr['@_w:hSpace']);\n if (isExplicitlySet(framePr['@_w:vSpace']))\n frameProps.vSpace = safeParseInt(framePr['@_w:vSpace']);\n if (framePr['@_w:wrap']) frameProps.wrap = framePr['@_w:wrap'];\n if (framePr['@_w:dropCap']) frameProps.dropCap = framePr['@_w:dropCap'];\n if (isExplicitlySet(framePr['@_w:lines']))\n frameProps.lines = safeParseInt(framePr['@_w:lines']);\n if (isExplicitlySet(framePr['@_w:anchorLock'])) {\n // Use parseOoxmlBoolean-style check for attribute value\n const val = framePr['@_w:anchorLock'];\n frameProps.anchorLock =\n val === '1' || val === 1 || val === 'true' || val === true || val === 'on';\n }\n if (Object.keys(frameProps).length > 0) {\n paragraph.setFrameProperties(frameProps);\n }\n }\n\n // Suppress automatic hyphenation per ECMA-376 Part 1 §17.3.1.33\n if (pPrObj['w:suppressAutoHyphens']) {\n paragraph.setSuppressAutoHyphens(true);\n }\n\n // CJK paragraph properties per ECMA-376 Part 1\n if (pPrObj['w:kinsoku']) {\n paragraph.setKinsoku(parseOoxmlBoolean(pPrObj['w:kinsoku']));\n }\n if (pPrObj['w:wordWrap']) {\n paragraph.setWordWrap(parseOoxmlBoolean(pPrObj['w:wordWrap']));\n }\n if (pPrObj['w:overflowPunct']) {\n paragraph.setOverflowPunct(parseOoxmlBoolean(pPrObj['w:overflowPunct']));\n }\n if (pPrObj['w:topLinePunct']) {\n paragraph.setTopLinePunct(parseOoxmlBoolean(pPrObj['w:topLinePunct']));\n }\n if (pPrObj['w:autoSpaceDE']) {\n paragraph.setAutoSpaceDE(parseOoxmlBoolean(pPrObj['w:autoSpaceDE']));\n }\n if (pPrObj['w:autoSpaceDN']) {\n paragraph.setAutoSpaceDN(parseOoxmlBoolean(pPrObj['w:autoSpaceDN']));\n }\n\n // Suppress text frame overlap per ECMA-376 Part 1 §17.3.1.34\n if (pPrObj['w:suppressOverlap']) {\n paragraph.setSuppressOverlap(true);\n }\n\n // Textbox tight wrap per ECMA-376 Part 1 §17.3.1.37\n if (pPrObj['w:textboxTightWrap']) {\n const wrapVal = pPrObj['w:textboxTightWrap']?.['@_w:val'];\n if (wrapVal) {\n paragraph.setTextboxTightWrap(wrapVal);\n }\n }\n\n // HTML div ID per ECMA-376 Part 1 §17.3.1.9\n if (pPrObj['w:divId']) {\n const divIdVal = pPrObj['w:divId']?.['@_w:val'];\n if (divIdVal) {\n paragraph.setDivId(parseInt(divIdVal, 10));\n }\n }\n\n // Conditional table style formatting per ECMA-376 Part 1 §17.3.1.8\n if (pPrObj['w:cnfStyle']) {\n const cnfStyleVal = pPrObj['w:cnfStyle']?.['@_w:val'];\n if (cnfStyleVal !== undefined) {\n // Ensure it's a string and pad to 12 characters (standard bitmask length)\n // XML parser may convert to number, removing leading zeros\n const bitmask = String(cnfStyleVal).padStart(12, '0');\n paragraph.setConditionalFormatting(bitmask);\n }\n }\n\n // Paragraph property change tracking per ECMA-376 Part 1 §17.3.1.27\n if (pPrObj['w:pPrChange']) {\n const changeObj = pPrObj['w:pPrChange'];\n const change: any = {};\n if (changeObj['@_w:author']) change.author = String(changeObj['@_w:author']);\n if (changeObj['@_w:date']) change.date = String(changeObj['@_w:date']);\n if (changeObj['@_w:id']) change.id = String(changeObj['@_w:id']);\n\n // Parse child w:pPr for previousProperties to preserve tracked change history\n if (changeObj['w:pPr']) {\n const prevPPr = changeObj['w:pPr'];\n const previousProperties: any = {};\n\n // Parse previous style\n if (prevPPr['w:pStyle']?.['@_w:val']) {\n previousProperties.style = String(prevPPr['w:pStyle']['@_w:val']);\n }\n\n // Parse previous numbering\n if (prevPPr['w:numPr']) {\n const numPr = prevPPr['w:numPr'];\n previousProperties.numbering = {};\n if (numPr['w:ilvl']?.['@_w:val'] !== undefined) {\n const parsedLevel = parseInt(numPr['w:ilvl']['@_w:val'], 10);\n if (!isNaN(parsedLevel)) {\n previousProperties.numbering.level = parsedLevel;\n }\n }\n if (numPr['w:numId']?.['@_w:val'] !== undefined) {\n const parsedNumId = parseInt(numPr['w:numId']['@_w:val'], 10);\n if (!isNaN(parsedNumId)) {\n previousProperties.numbering.numId = parsedNumId;\n }\n }\n }\n\n // Parse previous indentation\n if (prevPPr['w:ind']) {\n const ind = prevPPr['w:ind'];\n previousProperties.indentation = {};\n if (ind['@_w:left'] !== undefined)\n previousProperties.indentation.left = parseInt(ind['@_w:left'], 10);\n if (ind['@_w:right'] !== undefined)\n previousProperties.indentation.right = parseInt(ind['@_w:right'], 10);\n if (ind['@_w:firstLine'] !== undefined)\n previousProperties.indentation.firstLine = parseInt(ind['@_w:firstLine'], 10);\n if (ind['@_w:hanging'] !== undefined)\n previousProperties.indentation.hanging = parseInt(ind['@_w:hanging'], 10);\n }\n\n // Parse previous alignment\n if (prevPPr['w:jc']?.['@_w:val']) {\n previousProperties.alignment = String(prevPPr['w:jc']['@_w:val']);\n }\n\n // Parse previous spacing\n if (prevPPr['w:spacing']) {\n const spacing = prevPPr['w:spacing'];\n previousProperties.spacing = {};\n if (spacing['@_w:before'] !== undefined)\n previousProperties.spacing.before = parseInt(spacing['@_w:before'], 10);\n if (spacing['@_w:after'] !== undefined)\n previousProperties.spacing.after = parseInt(spacing['@_w:after'], 10);\n if (spacing['@_w:line'] !== undefined)\n previousProperties.spacing.line = parseInt(spacing['@_w:line'], 10);\n if (spacing['@_w:lineRule'])\n previousProperties.spacing.lineRule = String(spacing['@_w:lineRule']);\n }\n\n // Parse previous keepNext/keepLines/pageBreakBefore\n if (prevPPr['w:keepNext']) {\n previousProperties.keepNext = prevPPr['w:keepNext']['@_w:val'] !== '0';\n }\n if (prevPPr['w:keepLines']) {\n previousProperties.keepLines = prevPPr['w:keepLines']['@_w:val'] !== '0';\n }\n if (prevPPr['w:pageBreakBefore']) {\n previousProperties.pageBreakBefore = prevPPr['w:pageBreakBefore']['@_w:val'] !== '0';\n }\n\n // === Extended paragraph property parsing per ECMA-376 Part 1 §17.3.1 ===\n\n // Parse widowControl (w:widowControl) - orphan/widow control\n if (prevPPr['w:widowControl']) {\n previousProperties.widowControl = prevPPr['w:widowControl']['@_w:val'] !== '0';\n }\n\n // Parse suppressAutoHyphens (w:suppressAutoHyphens)\n if (prevPPr['w:suppressAutoHyphens']) {\n previousProperties.suppressAutoHyphens =\n prevPPr['w:suppressAutoHyphens']['@_w:val'] !== '0';\n }\n\n // Parse contextualSpacing (w:contextualSpacing)\n if (prevPPr['w:contextualSpacing']) {\n previousProperties.contextualSpacing = prevPPr['w:contextualSpacing']['@_w:val'] !== '0';\n }\n\n // Parse mirrorIndents (w:mirrorIndents)\n if (prevPPr['w:mirrorIndents']) {\n previousProperties.mirrorIndents = prevPPr['w:mirrorIndents']['@_w:val'] !== '0';\n }\n\n // Parse outlineLevel (w:outlineLvl @w:val)\n if (prevPPr['w:outlineLvl']?.['@_w:val'] !== undefined) {\n previousProperties.outlineLevel = parseInt(prevPPr['w:outlineLvl']['@_w:val'], 10);\n }\n\n // Parse bidi (w:bidi) - right-to-left paragraph\n if (prevPPr['w:bidi']) {\n previousProperties.bidi = prevPPr['w:bidi']['@_w:val'] !== '0';\n }\n\n // Parse suppressLineNumbers (w:suppressLineNumbers)\n if (prevPPr['w:suppressLineNumbers']) {\n previousProperties.suppressLineNumbers =\n prevPPr['w:suppressLineNumbers']['@_w:val'] !== '0';\n }\n\n // Parse adjustRightInd (w:adjustRightInd)\n if (prevPPr['w:adjustRightInd']) {\n previousProperties.adjustRightInd = prevPPr['w:adjustRightInd']['@_w:val'] !== '0';\n }\n\n // Parse snapToGrid (w:snapToGrid)\n if (prevPPr['w:snapToGrid']) {\n previousProperties.snapToGrid = prevPPr['w:snapToGrid']['@_w:val'] !== '0';\n }\n\n // Parse wordWrap (w:wordWrap)\n if (prevPPr['w:wordWrap']) {\n previousProperties.wordWrap = prevPPr['w:wordWrap']['@_w:val'] !== '0';\n }\n\n // Parse autoSpaceDE (w:autoSpaceDE) - East Asian/numeric spacing\n if (prevPPr['w:autoSpaceDE']) {\n previousProperties.autoSpaceDE = prevPPr['w:autoSpaceDE']['@_w:val'] !== '0';\n }\n\n // Parse autoSpaceDN (w:autoSpaceDN) - East Asian/Western spacing\n if (prevPPr['w:autoSpaceDN']) {\n previousProperties.autoSpaceDN = prevPPr['w:autoSpaceDN']['@_w:val'] !== '0';\n }\n\n // Parse textDirection (w:textDirection @w:val)\n if (prevPPr['w:textDirection']?.['@_w:val']) {\n previousProperties.textDirection = String(prevPPr['w:textDirection']['@_w:val']);\n }\n\n // Parse textAlignment (w:textAlignment @w:val) per ECMA-376 Part 1 §17.3.1.39\n if (prevPPr['w:textAlignment']?.['@_w:val']) {\n previousProperties.textAlignment = String(prevPPr['w:textAlignment']['@_w:val']);\n }\n\n // Parse paragraph borders (w:pBdr) per ECMA-376 Part 1 §17.3.1.24\n if (prevPPr['w:pBdr']) {\n const pBdr = prevPPr['w:pBdr'];\n previousProperties.borders = {};\n\n const parseBorder = (borderObj: any) => {\n if (!borderObj) return undefined;\n return {\n val: borderObj['@_w:val'],\n sz: borderObj['@_w:sz'] !== undefined ? parseInt(borderObj['@_w:sz'], 10) : undefined,\n space:\n borderObj['@_w:space'] !== undefined\n ? parseInt(borderObj['@_w:space'], 10)\n : undefined,\n color: borderObj['@_w:color'],\n themeColor: borderObj['@_w:themeColor'],\n };\n };\n\n if (pBdr['w:top']) previousProperties.borders.top = parseBorder(pBdr['w:top']);\n if (pBdr['w:bottom']) previousProperties.borders.bottom = parseBorder(pBdr['w:bottom']);\n if (pBdr['w:left']) previousProperties.borders.left = parseBorder(pBdr['w:left']);\n if (pBdr['w:right']) previousProperties.borders.right = parseBorder(pBdr['w:right']);\n if (pBdr['w:between'])\n previousProperties.borders.between = parseBorder(pBdr['w:between']);\n if (pBdr['w:bar']) previousProperties.borders.bar = parseBorder(pBdr['w:bar']);\n\n // Clean up empty borders object\n if (Object.keys(previousProperties.borders).length === 0) {\n delete previousProperties.borders;\n }\n }\n\n // Parse paragraph shading (w:shd) per ECMA-376 Part 1 §17.3.1.32\n if (prevPPr['w:shd']) {\n const shading = this.parseShadingFromObj(prevPPr['w:shd']);\n if (shading) {\n previousProperties.shading = shading;\n }\n }\n\n // Parse tab stops (w:tabs) per ECMA-376 Part 1 §17.3.1.38\n if (prevPPr['w:tabs']) {\n const tabsObj = prevPPr['w:tabs'];\n const tabArray = tabsObj['w:tab'];\n if (tabArray) {\n const tabs = Array.isArray(tabArray) ? tabArray : [tabArray];\n previousProperties.tabs = tabs.map((tab: any) => ({\n val: tab['@_w:val'],\n pos: tab['@_w:pos'] !== undefined ? parseInt(tab['@_w:pos'], 10) : undefined,\n leader: tab['@_w:leader'],\n }));\n }\n }\n\n if (Object.keys(previousProperties).length > 0) {\n change.previousProperties = previousProperties;\n }\n }\n\n if (Object.keys(change).length > 0) {\n paragraph.setParagraphPropertiesChange(change);\n }\n }\n\n // Section properties per ECMA-376 Part 1 §17.3.1.30\n // Note: sectPr is set as raw XML string by callers that have access to the raw paragraph XML.\n // The parsed object is stored as a marker; callers override with raw XML for round-trip fidelity.\n if (pPrObj['w:sectPr']) {\n paragraph.setSectionProperties(pPrObj['w:sectPr']);\n }\n }\n\n /**\n * NEW: Assemble complex fields from run tokens\n * Groups begin→instr→sep→result→end sequences into ComplexField objects\n * Also handles Revision objects (w:ins, w:del) that appear in the result section of complex fields\n *\n * @param paragraph The paragraph containing runs to process\n */\n private assembleComplexFields(paragraph: Paragraph): void {\n // Skip if this paragraph is part of a multi-paragraph field (e.g., TOC)\n // These paragraphs have already been processed and their field structure\n // should be preserved - re-processing would corrupt the field runs\n if (paragraph._isPartOfMultiParagraphField) {\n defaultLogger.debug(\n '[DocumentParser] Skipping assembleComplexFields for paragraph marked as part of multi-paragraph field'\n );\n return;\n }\n\n const content = paragraph.getContent();\n const groupedContent: any[] = [];\n let fieldRuns: Run[] = [];\n let fieldRevisions: Revision[] = []; // Track revisions inside field result section\n let instructionRevisions: Revision[] = []; // Track revisions in instruction area\n let orderedResultItems: Array<Run | Revision> = []; // Track interleaved order of result runs + revisions\n let fieldState: 'begin' | 'instruction' | 'separate' | 'result' | 'end' | null = null;\n let nestingDepth = 0;\n let hasNestedFields = false;\n let fieldStartIndex = -1;\n\n for (let i = 0; i < content.length; i++) {\n const item = content[i];\n\n if (item instanceof Run) {\n const runContent = item.getContent();\n const hasFieldContent = runContent.some(\n (c: any) => c.type === 'fieldChar' || c.type === 'instructionText'\n );\n\n if (hasFieldContent) {\n // This run is part of a field\n fieldRuns.push(item);\n const fieldChar = runContent.find((c: any) => c.type === 'fieldChar');\n\n if (fieldChar) {\n switch (fieldChar.fieldCharType) {\n case 'begin':\n nestingDepth++;\n if (nestingDepth === 1) {\n fieldState = 'begin';\n fieldStartIndex = i;\n } else {\n hasNestedFields = true;\n }\n break;\n case 'separate':\n if (nestingDepth <= 1) {\n fieldState = 'separate';\n }\n break;\n case 'end':\n nestingDepth--;\n if (nestingDepth > 0) {\n // Still inside a nested field - continue collecting\n break;\n }\n fieldState = 'end';\n\n // Complete field assembly\n if (fieldRuns.length > 0) {\n // NESTED FIELD: preserve raw structure to maintain field balance\n // Nested fields (e.g. INCLUDEPICTURE multiplication from email-pasted images)\n // have properly balanced begin/separate/end markers across nesting levels.\n // Flattening them into a single ComplexField would collapse all instrTexts\n // into one instruction and orphan the inner end markers, corrupting the document.\n if (hasNestedFields) {\n for (let j = fieldStartIndex; j <= i; j++) {\n groupedContent.push(content[j]);\n }\n defaultLogger.debug(\n `Preserved raw structure for nested field spanning ${i - fieldStartIndex + 1} content items`\n );\n fieldRuns = [];\n instructionRevisions = [];\n fieldRevisions = [];\n orderedResultItems = [];\n fieldState = null;\n hasNestedFields = false;\n fieldStartIndex = -1;\n nestingDepth = 0;\n break;\n }\n // If there are revisions in the instruction area, we MUST preserve raw structure\n // The instruction text is INSIDE the revisions, so we can't extract it\n // This happens with field code hyperlinks inside tracked changes (w:ins/w:del)\n if (instructionRevisions.length > 0) {\n // Output field structure in original order: runs interleaved with revisions\n // We need to reconstruct the original order based on field state transitions\n let hasSep = false;\n for (const run of fieldRuns) {\n const runContent = run.getContent();\n const fieldCharToken = runContent.find((c: any) => c.type === 'fieldChar');\n\n // Output begin run\n if (fieldCharToken?.fieldCharType === 'begin') {\n groupedContent.push(run);\n // Instruction revisions come after begin\n for (const rev of instructionRevisions) {\n groupedContent.push(rev);\n }\n } else if (fieldCharToken?.fieldCharType === 'separate') {\n // Separator\n groupedContent.push(run);\n hasSep = true;\n // Result revisions come after separator\n for (const rev of fieldRevisions) {\n groupedContent.push(rev);\n }\n } else if (fieldCharToken?.fieldCharType === 'end') {\n // End marker - if no separator was found, output revisions first\n if (!hasSep) {\n for (const rev of fieldRevisions) {\n groupedContent.push(rev);\n }\n }\n groupedContent.push(run);\n } else {\n // Other runs (instruction text, result text outside revisions)\n groupedContent.push(run);\n }\n }\n\n defaultLogger.debug(\n `Preserved raw structure for field with ${instructionRevisions.length} instruction revisions`\n );\n fieldRuns = [];\n instructionRevisions = [];\n fieldRevisions = [];\n orderedResultItems = [];\n fieldState = null;\n break;\n }\n\n // Extract instruction to determine field type\n let instruction = '';\n let resultText = '';\n let resultFormatting: RunFormatting | undefined;\n let hasSeparate = false;\n\n for (const run of fieldRuns) {\n const runContent = run.getContent();\n const instrText = runContent.find((c: any) => c.type === 'instructionText');\n if (instrText) {\n instruction += instrText.value || '';\n }\n const fieldCharToken = runContent.find((c: any) => c.type === 'fieldChar');\n if (fieldCharToken?.fieldCharType === 'separate') {\n hasSeparate = true;\n }\n const textContent = runContent.find((c: any) => c.type === 'text');\n if (textContent && hasSeparate) {\n resultText += textContent.value || '';\n resultFormatting = run.getFormatting();\n }\n }\n\n instruction = instruction.trim();\n\n // Check if this is a HYPERLINK field code - convert to Hyperlink element\n if (isHyperlinkInstruction(instruction)) {\n const parsed = parseHyperlinkInstruction(instruction);\n if (parsed && resultText) {\n // HYPERLINK fields with tracked changes in the result region cannot be\n // converted to Hyperlink objects — the revisions would become orphaned\n // standalone paragraph content. Keep as ComplexField instead.\n if (fieldRevisions.length > 0) {\n const complexField = this.createComplexFieldFromRuns(fieldRuns);\n if (complexField) {\n // Build ordered resultContent for correct round-trip serialization\n if (orderedResultItems.length > 0) {\n const orderedContent: XMLElement[] = [];\n for (const resultItem of orderedResultItems) {\n if (resultItem instanceof Run) {\n orderedContent.push(resultItem.toXML());\n } else if (resultItem instanceof Revision) {\n const xml = resultItem.toXML();\n if (xml) orderedContent.push(xml);\n }\n }\n // Compute accepted text (non-revision runs + insertion text)\n let acceptedText = '';\n for (const resultItem of orderedResultItems) {\n if (resultItem instanceof Run) {\n acceptedText += resultItem.getText() || '';\n } else if (\n resultItem instanceof Revision &&\n resultItem.getType() === 'insert'\n ) {\n for (const child of resultItem.getRuns()) {\n acceptedText += child.getText() || '';\n }\n }\n }\n // Set accepted text as the result (for getResult() API)\n complexField.setResult(acceptedText || complexField.getResult() || '');\n // Add ordered content for serialization (overrides the text-based path)\n for (const xmlEl of orderedContent) {\n complexField.addResultContent(xmlEl);\n }\n }\n // Attach revisions for tracking/acceptance\n for (const rev of fieldRevisions) {\n rev.setFieldContext({\n field: complexField,\n instruction: complexField.getInstruction(),\n position: 'result',\n });\n }\n complexField.setResultRevisions(fieldRevisions);\n groupedContent.push(complexField);\n } else {\n fieldRuns.forEach((run) => groupedContent.push(run));\n for (const revision of fieldRevisions) {\n groupedContent.push(revision);\n }\n }\n fieldRuns = [];\n instructionRevisions = [];\n fieldRevisions = [];\n orderedResultItems = [];\n fieldState = null;\n break;\n }\n\n // Normal path (no revisions) — convert to Hyperlink object\n let hyperlink: Hyperlink;\n if (parsed.url && parsed.url.trim() !== '') {\n // External hyperlink (or combined external + anchor)\n hyperlink = Hyperlink.createExternal(parsed.fullUrl, resultText, {\n ...resultFormatting,\n color: resultFormatting?.color || '0000FF',\n underline: resultFormatting?.underline || 'single',\n });\n } else if (parsed.anchor) {\n // Internal hyperlink (anchor only)\n hyperlink = Hyperlink.createInternal(parsed.anchor, resultText, {\n ...resultFormatting,\n color: resultFormatting?.color || '0000FF',\n underline: resultFormatting?.underline || 'single',\n });\n } else {\n // Fallback to ComplexField if we can't determine link type\n const complexField = this.createComplexFieldFromRuns(fieldRuns);\n if (complexField) {\n // Attach revisions to ComplexField for proper serialization\n if (fieldRevisions.length > 0) {\n // Update field context on each revision with field reference and instruction\n for (const rev of fieldRevisions) {\n rev.setFieldContext({\n field: complexField,\n instruction: complexField.getInstruction(),\n position: 'result',\n });\n }\n complexField.setResultRevisions(fieldRevisions);\n }\n groupedContent.push(complexField);\n } else {\n fieldRuns.forEach((run) => groupedContent.push(run));\n // Only push revisions separately if ComplexField creation failed\n for (const revision of fieldRevisions) {\n groupedContent.push(revision);\n }\n }\n fieldRuns = [];\n instructionRevisions = [];\n fieldRevisions = [];\n orderedResultItems = [];\n fieldState = null;\n break;\n }\n\n // Set tooltip if present\n if (parsed.tooltip) {\n hyperlink.setTooltip(parsed.tooltip);\n }\n\n groupedContent.push(hyperlink);\n for (const revision of fieldRevisions) {\n groupedContent.push(revision);\n }\n defaultLogger.debug(\n `Converted single-paragraph HYPERLINK field to Hyperlink element`\n );\n fieldRuns = [];\n instructionRevisions = [];\n fieldRevisions = [];\n orderedResultItems = [];\n fieldState = null;\n break;\n }\n }\n\n // Non-HYPERLINK field: create ComplexField as usual\n const complexField = this.createComplexFieldFromRuns(fieldRuns);\n if (complexField) {\n // Attach any revisions that were inside the field result section\n // These are tracked changes within the field's display content\n // They MUST be serialized before the end marker per ECMA-376\n if (fieldRevisions.length > 0) {\n // Update field context on each revision with field reference and instruction\n for (const rev of fieldRevisions) {\n rev.setFieldContext({\n field: complexField,\n instruction: complexField.getInstruction(),\n position: 'result',\n });\n }\n complexField.setResultRevisions(fieldRevisions);\n }\n groupedContent.push(complexField);\n } else {\n // If assembly failed, add individual runs\n fieldRuns.forEach((run) => groupedContent.push(run));\n // Still add the revisions\n for (const revision of fieldRevisions) {\n groupedContent.push(revision);\n }\n }\n fieldRuns = [];\n instructionRevisions = [];\n fieldRevisions = [];\n orderedResultItems = [];\n fieldState = null;\n }\n break;\n }\n } else {\n // Instruction text run\n if (fieldState === 'begin' || fieldState === 'instruction') {\n fieldState = 'instruction';\n }\n }\n } else {\n // Regular run - check if we're inside a field result section\n if (nestingDepth > 0) {\n // Inside a field - collect all runs to preserve raw structure\n fieldRuns.push(item);\n // Track result runs for interleaved ordering (only outer field level)\n if (nestingDepth === 1 && (fieldState === 'separate' || fieldState === 'result')) {\n orderedResultItems.push(item);\n }\n } else if (fieldState === 'separate' || fieldState === 'result') {\n // This run is part of the field result - collect it\n fieldRuns.push(item);\n orderedResultItems.push(item);\n fieldState = 'result';\n } else if (fieldState === 'begin' || fieldState === 'instruction') {\n // We're in the middle of parsing field instruction\n // Empty runs between begin and separate should be preserved as part of the field\n // (Word sometimes inserts empty formatting runs in field code sections)\n fieldRuns.push(item);\n } else if (fieldRuns.length > 0) {\n // Incomplete field - add as individual runs\n fieldRuns.forEach((run) => groupedContent.push(run));\n for (const revision of instructionRevisions) {\n groupedContent.push(revision);\n }\n for (const revision of fieldRevisions) {\n groupedContent.push(revision);\n }\n fieldRuns = [];\n instructionRevisions = [];\n fieldRevisions = [];\n orderedResultItems = [];\n fieldState = null;\n groupedContent.push(item);\n } else {\n groupedContent.push(item);\n }\n }\n } else if (item instanceof Revision) {\n // Handle Revision objects (w:ins, w:del) that may appear inside field sections\n if (nestingDepth > 1) {\n // Inside a nested field (depth 2+) - collect revision to preserve raw structure\n fieldRevisions.push(item);\n } else if (fieldState === 'separate' || fieldState === 'result') {\n // This revision is inside the field result section - track it\n // Set preliminary field context (field reference will be set when ComplexField is created)\n item.setFieldContext({ position: 'result' });\n fieldRevisions.push(item);\n orderedResultItems.push(item);\n fieldState = 'result';\n defaultLogger.debug(\n `Found revision inside complex field result: type=${item.getType()}, id=${item.getId()}`\n );\n } else if (fieldState === 'begin' || fieldState === 'instruction') {\n // Revision in instruction area - track separately and continue field assembly\n // This happens with field code hyperlinks inside tracked changes\n // The instruction text is INSIDE the revision, so we can't extract it into ComplexField\n // Set preliminary field context (field reference will be set when ComplexField is created)\n item.setFieldContext({ position: 'instruction' });\n instructionRevisions.push(item);\n fieldState = 'instruction';\n defaultLogger.debug(\n `Found revision inside complex field instruction: type=${item.getType()}, id=${item.getId()}`\n );\n } else if (fieldRuns.length > 0) {\n // Revision appears in unexpected location during field assembly\n // Add incomplete field runs and the revision\n fieldRuns.forEach((run) => groupedContent.push(run));\n for (const revision of instructionRevisions) {\n groupedContent.push(revision);\n }\n for (const revision of fieldRevisions) {\n groupedContent.push(revision);\n }\n fieldRuns = [];\n instructionRevisions = [];\n fieldRevisions = [];\n orderedResultItems = [];\n fieldState = null;\n groupedContent.push(item);\n } else {\n // Normal revision outside of any field\n groupedContent.push(item);\n }\n } else {\n // Non-run content (hyperlinks, images, etc.)\n if (nestingDepth > 0) {\n // Inside a nested field - keep collecting\n fieldRuns.push(item as any);\n } else if (fieldRuns.length > 0) {\n // Incomplete field - add as individual runs\n fieldRuns.forEach((run) => groupedContent.push(run));\n for (const revision of instructionRevisions) {\n groupedContent.push(revision);\n }\n for (const revision of fieldRevisions) {\n groupedContent.push(revision);\n }\n fieldRuns = [];\n instructionRevisions = [];\n fieldRevisions = [];\n orderedResultItems = [];\n fieldState = null;\n }\n groupedContent.push(item);\n }\n }\n\n // Handle any remaining incomplete field\n if (fieldRuns.length > 0) {\n fieldRuns.forEach((run) => groupedContent.push(run));\n for (const revision of instructionRevisions) {\n groupedContent.push(revision);\n }\n for (const revision of fieldRevisions) {\n groupedContent.push(revision);\n }\n }\n\n // Replace paragraph content with grouped content using setContent\n paragraph.setContent(groupedContent as ParagraphContent[]);\n\n defaultLogger.debug(\n `Assembled ${groupedContent.length - content.length} complex fields in paragraph`\n );\n }\n\n /**\n * Assembles complex fields that span multiple paragraphs (e.g., TOC fields)\n *\n * In Word documents, complex fields like TOC can have their begin/separate/end\n * markers distributed across multiple paragraphs. This method:\n * 1. Scans all paragraphs for field markers\n * 2. When a field spans multiple paragraphs, creates a ComplexField marked as multiParagraph\n * 3. Places the ComplexField in the first paragraph and removes field tokens from subsequent paragraphs\n *\n * For single-paragraph fields, delegates to assembleComplexFields for efficiency.\n *\n * @param bodyElements All parsed body elements (paragraphs, tables, SDTs)\n */\n private assembleMultiParagraphFields(bodyElements: BodyElement[]): void {\n // Extract all paragraphs (including those nested in tables and SDTs)\n const allParagraphs = this.collectAllParagraphs(bodyElements);\n\n if (allParagraphs.length === 0) {\n return;\n }\n\n // Track field state across paragraphs\n interface FieldTracker {\n startParagraphIndex: number;\n startRunIndex: number;\n fieldRuns: { paragraphIndex: number; runIndex: number; run: Run }[];\n hasBegin: boolean;\n hasSeparate: boolean;\n hasEnd: boolean;\n }\n\n let currentField: FieldTracker | null = null;\n const completedFields: FieldTracker[] = [];\n\n // First pass: identify multi-paragraph fields\n for (let pIdx = 0; pIdx < allParagraphs.length; pIdx++) {\n const paragraph = allParagraphs[pIdx]!;\n const content = paragraph.getContent();\n\n for (let rIdx = 0; rIdx < content.length; rIdx++) {\n const item = content[rIdx];\n\n if (!(item instanceof Run)) {\n continue;\n }\n\n const runContent = item.getContent();\n const fieldChar = runContent.find((c: any) => c.type === 'fieldChar');\n\n if (fieldChar) {\n switch (fieldChar.fieldCharType) {\n case 'begin':\n // Start tracking a new field\n currentField = {\n startParagraphIndex: pIdx,\n startRunIndex: rIdx,\n fieldRuns: [{ paragraphIndex: pIdx, runIndex: rIdx, run: item }],\n hasBegin: true,\n hasSeparate: false,\n hasEnd: false,\n };\n break;\n\n case 'separate':\n if (currentField) {\n currentField.hasSeparate = true;\n currentField.fieldRuns.push({ paragraphIndex: pIdx, runIndex: rIdx, run: item });\n }\n break;\n\n case 'end':\n if (currentField) {\n currentField.hasEnd = true;\n currentField.fieldRuns.push({ paragraphIndex: pIdx, runIndex: rIdx, run: item });\n\n // Check if this field spans multiple paragraphs\n const startPIdx = currentField.startParagraphIndex;\n const endPIdx = pIdx;\n\n if (endPIdx > startPIdx) {\n // Multi-paragraph field - add to completed list for processing\n completedFields.push(currentField);\n }\n // Single-paragraph fields will be handled by assembleComplexFields\n currentField = null;\n }\n break;\n }\n } else {\n // Check for instruction text or result text (part of field)\n const hasFieldContent = runContent.some((c: any) => c.type === 'instructionText');\n if (hasFieldContent && currentField) {\n currentField.fieldRuns.push({ paragraphIndex: pIdx, runIndex: rIdx, run: item });\n } else if (currentField && runContent.some((c: any) => c.type === 'text')) {\n // Text between separate and end is result text\n if (currentField.hasSeparate && !currentField.hasEnd) {\n currentField.fieldRuns.push({ paragraphIndex: pIdx, runIndex: rIdx, run: item });\n }\n }\n }\n }\n }\n\n // Process completed multi-paragraph fields\n for (const fieldTracker of completedFields) {\n this.processMultiParagraphField(fieldTracker, allParagraphs);\n }\n\n // Now handle single-paragraph fields in remaining paragraphs\n for (const paragraph of allParagraphs) {\n this.assembleComplexFields(paragraph);\n }\n\n const multiFieldCount = completedFields.length;\n if (multiFieldCount > 0) {\n defaultLogger.info(`Assembled ${multiFieldCount} multi-paragraph complex field(s)`);\n }\n }\n\n /**\n * Collects all paragraphs from body elements, including those nested in tables and SDTs\n */\n private collectAllParagraphs(bodyElements: BodyElement[]): Paragraph[] {\n const paragraphs: Paragraph[] = [];\n\n for (const element of bodyElements) {\n if (element instanceof Paragraph) {\n paragraphs.push(element);\n } else if (element instanceof Table) {\n // Extract paragraphs from table cells\n for (const row of element.getRows()) {\n for (const cell of row.getCells()) {\n paragraphs.push(...cell.getParagraphs());\n }\n }\n } else if (element instanceof StructuredDocumentTag) {\n // SDT content may contain paragraphs\n const sdtContent = element.getContent();\n for (const item of sdtContent) {\n if (item instanceof Paragraph) {\n paragraphs.push(item);\n }\n }\n }\n }\n\n return paragraphs;\n }\n\n /**\n * Processes a multi-paragraph field by:\n * 1. Creating a ComplexField from the collected runs\n * 2. Placing it in the first paragraph\n * 3. Removing field-related runs from subsequent paragraphs\n */\n private processMultiParagraphField(\n fieldTracker: {\n startParagraphIndex: number;\n fieldRuns: { paragraphIndex: number; runIndex: number; run: Run }[];\n },\n allParagraphs: Paragraph[]\n ): void {\n const runs = fieldTracker.fieldRuns.map((fr) => fr.run);\n\n // Extract field instruction and result text to determine field type\n let instruction = '';\n let resultText = '';\n let resultFormatting: RunFormatting | undefined;\n let hasSeparate = false;\n let resultParagraphIndex: number | undefined;\n\n for (let i = 0; i < fieldTracker.fieldRuns.length; i++) {\n const fr = fieldTracker.fieldRuns[i]!;\n const runContent = fr.run.getContent();\n\n // Check for fieldChar tokens\n const fieldCharToken = runContent.find((c: any) => c.type === 'fieldChar');\n if (fieldCharToken) {\n if (fieldCharToken.fieldCharType === 'separate') {\n hasSeparate = true;\n }\n }\n\n // Check for instruction text\n const instrText = runContent.find((c: any) => c.type === 'instructionText');\n if (instrText) {\n instruction += instrText.value || '';\n }\n\n // Check for result text (between separate and end)\n const textContent = runContent.find((c: any) => c.type === 'text');\n if (textContent && hasSeparate) {\n resultText += textContent.value || '';\n resultFormatting = fr.run.getFormatting();\n resultParagraphIndex = fr.paragraphIndex;\n }\n }\n\n instruction = instruction.trim();\n\n // Check if this is a HYPERLINK field code - convert to Hyperlink element\n if (isHyperlinkInstruction(instruction)) {\n const parsed = parseHyperlinkInstruction(instruction);\n if (parsed && resultText) {\n // Determine target paragraph: where result text resides (not first paragraph)\n const targetParagraphIndex = resultParagraphIndex ?? fieldTracker.startParagraphIndex;\n const targetParagraph = allParagraphs[targetParagraphIndex];\n\n if (targetParagraph) {\n // Create Hyperlink element with proper styling\n // If there's a URL, it's external; if only anchor, it's internal\n let hyperlink: Hyperlink;\n if (parsed.url && parsed.url.trim() !== '') {\n // External hyperlink (or combined external + anchor)\n hyperlink = Hyperlink.createExternal(parsed.fullUrl, resultText, {\n ...resultFormatting,\n // Ensure hyperlink styling if not already present\n color: resultFormatting?.color || '0000FF',\n underline: resultFormatting?.underline || 'single',\n });\n } else if (parsed.anchor) {\n // Internal hyperlink (anchor only)\n hyperlink = Hyperlink.createInternal(parsed.anchor, resultText, {\n ...resultFormatting,\n color: resultFormatting?.color || '0000FF',\n underline: resultFormatting?.underline || 'single',\n });\n } else {\n // Fallback: create as ComplexField if we can't determine the link type\n defaultLogger.debug(\n 'HYPERLINK field missing URL and anchor, falling back to ComplexField'\n );\n this.processMultiParagraphFieldAsComplexField(fieldTracker, allParagraphs, runs);\n return;\n }\n\n // Set tooltip if present\n if (parsed.tooltip) {\n hyperlink.setTooltip(parsed.tooltip);\n }\n\n // Group field runs by paragraph index\n const runsByParagraph = new Map<number, Set<number>>();\n for (const fr of fieldTracker.fieldRuns) {\n if (!runsByParagraph.has(fr.paragraphIndex)) {\n runsByParagraph.set(fr.paragraphIndex, new Set());\n }\n runsByParagraph.get(fr.paragraphIndex)!.add(fr.runIndex);\n }\n\n // Process each affected paragraph\n const affectedParagraphIndices = Array.from(runsByParagraph.keys()).sort((a, b) => a - b);\n\n for (const pIdx of affectedParagraphIndices) {\n const paragraph = allParagraphs[pIdx]!;\n const runIndicesToRemove = runsByParagraph.get(pIdx)!;\n const content = paragraph.getContent();\n\n if (pIdx === targetParagraphIndex) {\n // Target paragraph: replace field runs with Hyperlink\n const newContent: ParagraphContent[] = [];\n let hyperlinkInserted = false;\n\n for (let rIdx = 0; rIdx < content.length; rIdx++) {\n if (runIndicesToRemove.has(rIdx)) {\n // Insert Hyperlink at position of first field run in this paragraph\n if (!hyperlinkInserted) {\n newContent.push(hyperlink);\n hyperlinkInserted = true;\n }\n // Skip this run (it's part of the field)\n } else {\n newContent.push(content[rIdx]!);\n }\n }\n\n paragraph.setContent(newContent);\n } else {\n // Other paragraphs: remove field runs entirely\n const newContent = content.filter(\n (_: ParagraphContent, rIdx: number) => !runIndicesToRemove.has(rIdx)\n );\n paragraph.setContent(newContent);\n }\n }\n\n defaultLogger.debug(\n `Converted multi-paragraph HYPERLINK field to Hyperlink element in paragraph ${targetParagraphIndex}`\n );\n return;\n }\n }\n }\n\n // For non-HYPERLINK fields (or if HYPERLINK conversion failed), use standard ComplexField handling\n this.processMultiParagraphFieldAsComplexField(fieldTracker, allParagraphs, runs);\n }\n\n /**\n * Process a multi-paragraph field as a ComplexField (standard behavior for non-HYPERLINK fields)\n * For fields like TOC that span multiple paragraphs with content in between (begin → entries → end),\n * we preserve the original runs instead of creating a ComplexField.\n */\n private processMultiParagraphFieldAsComplexField(\n fieldTracker: {\n startParagraphIndex: number;\n fieldRuns: { paragraphIndex: number; runIndex: number; run: Run }[];\n },\n allParagraphs: Paragraph[],\n runs: Run[]\n ): void {\n // Mark all affected paragraphs so assembleComplexFields() skips them\n // This is critical for TOC and other multi-paragraph fields to preserve\n // the original field structure (fldChar begin/separate/end + instrText)\n const affectedParaIndices = new Set<number>();\n for (const fr of fieldTracker.fieldRuns) {\n affectedParaIndices.add(fr.paragraphIndex);\n }\n\n // Get first and last paragraph indices\n const sortedIndices = Array.from(affectedParaIndices).sort((a, b) => a - b);\n const firstParaIdx = sortedIndices[0]!;\n const lastParaIdx = sortedIndices[sortedIndices.length - 1]!;\n\n // For fields spanning more than 2 consecutive paragraphs (like TOC),\n // preserve the original runs instead of creating a ComplexField.\n // This is because the field content (e.g., TOC entries) is in the intermediate\n // paragraphs between begin/separate and end markers.\n if (lastParaIdx - firstParaIdx > 1) {\n // Mark ALL paragraphs in the range (including intermediate ones with field content)\n // For TOC: para 2 has begin/sep, paras 3-5 have TOC entries, para 6 has end\n for (let pIdx = firstParaIdx; pIdx <= lastParaIdx; pIdx++) {\n const paragraph = allParagraphs[pIdx];\n if (paragraph) {\n paragraph._isPartOfMultiParagraphField = true;\n }\n }\n defaultLogger.debug(\n `Preserving original runs for multi-paragraph field spanning paragraphs ${firstParaIdx} to ${lastParaIdx} (gap > 1)`\n );\n return;\n }\n\n // For fields spanning exactly 2 consecutive paragraphs, proceed with ComplexField\n for (const pIdx of affectedParaIndices) {\n const paragraph = allParagraphs[pIdx];\n if (paragraph) {\n paragraph._isPartOfMultiParagraphField = true;\n }\n }\n\n // Create the ComplexField\n const complexField = this.createComplexFieldFromRuns(runs);\n if (!complexField) {\n defaultLogger.debug('Failed to create ComplexField from multi-paragraph runs');\n return;\n }\n\n // Mark as multi-paragraph\n complexField.setMultiParagraph(true);\n\n // Group field runs by paragraph index\n const runsByParagraph = new Map<number, Set<number>>();\n for (const fr of fieldTracker.fieldRuns) {\n if (!runsByParagraph.has(fr.paragraphIndex)) {\n runsByParagraph.set(fr.paragraphIndex, new Set());\n }\n runsByParagraph.get(fr.paragraphIndex)!.add(fr.runIndex);\n }\n\n // Process each affected paragraph\n const affectedParagraphIndices = Array.from(runsByParagraph.keys()).sort((a, b) => a - b);\n\n for (let i = 0; i < affectedParagraphIndices.length; i++) {\n const pIdx = affectedParagraphIndices[i]!;\n const paragraph = allParagraphs[pIdx]!;\n const runIndicesToRemove = runsByParagraph.get(pIdx)!;\n const content = paragraph.getContent();\n\n if (i === 0) {\n // First paragraph: replace field runs with ComplexField\n const newContent: ParagraphContent[] = [];\n let fieldInserted = false;\n\n for (let rIdx = 0; rIdx < content.length; rIdx++) {\n if (runIndicesToRemove.has(rIdx)) {\n // Insert ComplexField at position of first field run\n if (!fieldInserted) {\n newContent.push(complexField);\n fieldInserted = true;\n }\n // Skip this run (it's part of the field)\n } else {\n newContent.push(content[rIdx]!);\n }\n }\n\n paragraph.setContent(newContent);\n } else {\n // Subsequent paragraphs: remove field runs entirely\n const newContent = content.filter(\n (_: ParagraphContent, rIdx: number) => !runIndicesToRemove.has(rIdx)\n );\n paragraph.setContent(newContent);\n }\n }\n\n defaultLogger.debug(\n `Processed multi-paragraph field spanning paragraphs ${fieldTracker.startParagraphIndex} to ${affectedParagraphIndices[affectedParagraphIndices.length - 1]}`\n );\n }\n\n /**\n * NEW: Create ComplexField from sequence of field runs\n * Extracts instruction from instrText runs and result from text runs\n *\n * @param fieldRuns Array of runs containing field tokens\n * @returns ComplexField or null if invalid sequence\n */\n private createComplexFieldFromRuns(fieldRuns: Run[]): ComplexField | null {\n if (fieldRuns.length < 2) {\n // LENIENT: Just log debug message, don't prevent document loading\n defaultLogger.debug(\n 'Skipping ComplexField assembly: insufficient runs (minimum 2: begin and instr)'\n );\n return null;\n }\n\n let instruction = '';\n let resultText = '';\n let instructionFormatting: RunFormatting | undefined;\n let resultFormatting: RunFormatting | undefined;\n let hasBegin = false;\n let hasEnd = false;\n let hasSeparate = false;\n let formFieldData: any = undefined;\n\n for (const run of fieldRuns) {\n const runContent = run.getContent();\n\n // Check for fieldChar tokens\n const fieldCharToken = runContent.find((c: any) => c.type === 'fieldChar');\n if (fieldCharToken) {\n switch (fieldCharToken.fieldCharType) {\n case 'begin':\n hasBegin = true;\n // Capture formatting from begin run\n instructionFormatting = run.getFormatting();\n // Capture form field data from begin field char\n if (fieldCharToken.formFieldData) {\n formFieldData = fieldCharToken.formFieldData;\n }\n break;\n case 'separate':\n hasSeparate = true;\n break;\n case 'end':\n hasEnd = true;\n break;\n }\n }\n\n // Check for instruction text\n const instrText = runContent.find((c: any) => c.type === 'instructionText');\n if (instrText) {\n instruction += instrText.value || '';\n }\n\n // Check for result text (between separate and end)\n const textContent = runContent.find((c: any) => c.type === 'text');\n if (textContent && hasSeparate) {\n resultText += textContent.value || '';\n resultFormatting = run.getFormatting();\n }\n }\n\n // Second pass: collect non-text result content (e.g., ImageRuns with drawings)\n // These runs are in the result section (past separator) but don't contribute text.\n // Their XML representation must be stored as resultContent so it survives round-trip.\n const resultContentElements: XMLElement[] = [];\n let pastSeparator = false;\n for (const run of fieldRuns) {\n const rc = run.getContent();\n const fc = rc.find((c: any) => c.type === 'fieldChar');\n if (fc?.fieldCharType === 'separate') {\n pastSeparator = true;\n continue;\n }\n if (fc?.fieldCharType === 'end') break;\n if (fc) continue; // skip begin runs\n if (rc.some((c: any) => c.type === 'instructionText')) continue; // skip instrText runs\n if (pastSeparator) {\n // Check if this is a non-text result run (e.g., ImageRun with drawing content)\n const hasNonEmptyText = rc.some(\n (c: any) => c.type === 'text' && c.value && c.value.length > 0\n );\n if (!hasNonEmptyText && run instanceof ImageRun) {\n resultContentElements.push(run.toXML());\n }\n }\n }\n\n // Validate field structure with detailed diagnostics\n if (!hasBegin) {\n const instrPreview = instruction ? instruction.substring(0, 50) : '<none>';\n defaultLogger.warn(`ComplexField missing 'begin' marker. Instruction: \"${instrPreview}...\"`);\n this.parseErrors.push({\n element: 'complex-field-structure',\n error: new Error('Missing field begin marker'),\n });\n return null;\n }\n\n if (!hasEnd) {\n const instrPreview = instruction ? instruction.substring(0, 50) : '<none>';\n defaultLogger.warn(`ComplexField missing 'end' marker. Instruction: \"${instrPreview}...\"`);\n this.parseErrors.push({\n element: 'complex-field-structure',\n error: new Error('Missing field end marker'),\n });\n return null;\n }\n\n if (!instruction.trim()) {\n defaultLogger.warn(`ComplexField has no instruction content`);\n this.parseErrors.push({\n element: 'complex-field-structure',\n error: new Error('Empty field instruction'),\n });\n return null;\n }\n\n // Trim and clean instruction\n instruction = instruction.trim();\n\n defaultLogger.debug(\n `Created ComplexField: ${instruction.substring(0, 50)}... (result: \"${resultText}\")`\n );\n\n const properties: any = {\n instruction,\n result: resultText,\n resultContent: resultContentElements.length > 0 ? resultContentElements : undefined,\n instructionFormatting,\n resultFormatting,\n multiParagraph: false, // Default - can be set later if needed\n hasResult: hasSeparate, // Track if field had a separator/result section per ECMA-376\n formFieldData,\n };\n\n return new ComplexField(properties);\n }\n\n private parseRunFromObject(runObj: any): Run | null {\n try {\n // Extract all run content elements (text, tabs, breaks, etc.)\n // Per ECMA-376 §17.3.3 EG_RunInnerContent, runs can contain multiple content types\n const content: RunContent[] = [];\n\n const toArray = <T>(value: T | T[] | undefined | null): T[] =>\n Array.isArray(value) ? value : value !== undefined && value !== null ? [value] : [];\n\n const extractTextValue = (node: any): string => {\n if (node === undefined || node === null) {\n return '';\n }\n if (typeof node === 'object') {\n return XMLBuilder.unescapeXml(node['#text'] || '');\n }\n return XMLBuilder.unescapeXml(String(node));\n };\n\n const parseBooleanAttr = (value: any): boolean | undefined => {\n if (value === undefined || value === null) {\n return undefined;\n }\n return value === '1' || value === 1 || value === true || value === 'true';\n };\n\n // Parse w:ffData from a fldChar object (form field data per ECMA-376 §17.16.17)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n type XmlNode = Record<string, any>;\n\n const parseFormFieldData = (fldCharObj: XmlNode): FormFieldData | undefined => {\n const ffDataObj: XmlNode | undefined = fldCharObj['w:ffData'];\n if (!ffDataObj || typeof ffDataObj !== 'object') return undefined;\n const ffd: FormFieldData = {};\n // w:name\n if (ffDataObj['w:name']?.['@_w:val'] !== undefined) {\n ffd.name = String(ffDataObj['w:name']['@_w:val']);\n }\n // w:enabled (presence = true, w:val=\"0\" = false)\n if (ffDataObj['w:enabled'] !== undefined) {\n const enabledVal = ffDataObj['w:enabled']?.['@_w:val'];\n ffd.enabled = enabledVal === '0' || enabledVal === 0 ? false : true;\n }\n // w:calcOnExit\n if (ffDataObj['w:calcOnExit'] !== undefined) {\n const calcVal = ffDataObj['w:calcOnExit']?.['@_w:val'];\n ffd.calcOnExit = calcVal === '1' || calcVal === 1 || calcVal === true;\n }\n // w:helpText\n if (ffDataObj['w:helpText']?.['@_w:val'] !== undefined) {\n ffd.helpText = String(ffDataObj['w:helpText']['@_w:val']);\n }\n // w:statusText\n if (ffDataObj['w:statusText']?.['@_w:val'] !== undefined) {\n ffd.statusText = String(ffDataObj['w:statusText']['@_w:val']);\n }\n // w:entryMacro\n if (ffDataObj['w:entryMacro']?.['@_w:val'] !== undefined) {\n ffd.entryMacro = String(ffDataObj['w:entryMacro']['@_w:val']);\n }\n // w:exitMacro\n if (ffDataObj['w:exitMacro']?.['@_w:val'] !== undefined) {\n ffd.exitMacro = String(ffDataObj['w:exitMacro']['@_w:val']);\n }\n // w:textInput\n if (ffDataObj['w:textInput'] !== undefined) {\n const ti: XmlNode = ffDataObj['w:textInput'];\n const textInput: FormFieldTextInput = { type: 'textInput' };\n if (ti['w:type']?.['@_w:val'] !== undefined)\n textInput.inputType = String(ti['w:type']['@_w:val']);\n if (ti['w:default']?.['@_w:val'] !== undefined)\n textInput.defaultValue = String(ti['w:default']['@_w:val']);\n if (ti['w:maxLength']?.['@_w:val'] !== undefined)\n textInput.maxLength = Number(ti['w:maxLength']['@_w:val']);\n if (ti['w:format']?.['@_w:val'] !== undefined)\n textInput.format = String(ti['w:format']['@_w:val']);\n ffd.fieldType = textInput;\n }\n // w:checkBox\n if (ffDataObj['w:checkBox'] !== undefined) {\n const cb: XmlNode = ffDataObj['w:checkBox'];\n const checkBox: FormFieldCheckBox = { type: 'checkBox' };\n if (cb['w:default']?.['@_w:val'] !== undefined) {\n checkBox.defaultChecked =\n cb['w:default']['@_w:val'] === '1' || cb['w:default']['@_w:val'] === 1;\n }\n if (cb['w:checked']?.['@_w:val'] !== undefined) {\n checkBox.checked =\n cb['w:checked']['@_w:val'] === '1' || cb['w:checked']['@_w:val'] === 1;\n }\n if (cb['w:size']?.['@_w:val'] !== undefined) {\n checkBox.size = Number(cb['w:size']['@_w:val']);\n } else if (cb['w:sizeAuto'] !== undefined) {\n checkBox.size = 'auto';\n }\n ffd.fieldType = checkBox;\n }\n // w:ddList\n if (ffDataObj['w:ddList'] !== undefined) {\n const dd: XmlNode = ffDataObj['w:ddList'];\n const ddList: FormFieldDropDownList = { type: 'dropDownList' };\n if (dd['w:result']?.['@_w:val'] !== undefined)\n ddList.result = Number(dd['w:result']['@_w:val']);\n if (dd['w:default']?.['@_w:val'] !== undefined)\n ddList.defaultResult = Number(dd['w:default']['@_w:val']);\n if (dd['w:listEntry'] !== undefined) {\n const entries = Array.isArray(dd['w:listEntry'])\n ? dd['w:listEntry']\n : [dd['w:listEntry']];\n ddList.listEntries = entries.map((e: XmlNode) => String(e?.['@_w:val'] ?? e ?? ''));\n }\n ffd.fieldType = ddList;\n }\n return Object.keys(ffd).length > 0 ? ffd : undefined;\n };\n\n // Use _orderedChildren to preserve element order (critical for TOC entries)\n // TOC entries have structure: text → tab → text (heading, tab, page number)\n if (runObj._orderedChildren) {\n // Process elements in their original order\n for (const child of runObj._orderedChildren) {\n const elementType = child.type;\n const elementIndex = child.index;\n\n switch (elementType) {\n case 'w:t': {\n const textElements = toArray(runObj['w:t']);\n // Bounds check with debug logging for malformed documents\n if (elementIndex >= textElements.length) {\n defaultLogger.debug('[DocumentParser] Invalid _orderedChildren index for w:t', {\n index: elementIndex,\n arrayLength: textElements.length,\n });\n break;\n }\n const te = textElements[elementIndex];\n if (te !== undefined && te !== null) {\n const text = extractTextValue(te);\n if (text) {\n content.push({ type: 'text', value: text });\n }\n }\n break;\n }\n\n case 'w:instrText': {\n const instrElements = toArray(runObj['w:instrText']);\n // Bounds check with debug logging for malformed documents\n if (elementIndex >= instrElements.length) {\n defaultLogger.debug(\n '[DocumentParser] Invalid _orderedChildren index for w:instrText',\n { index: elementIndex, arrayLength: instrElements.length }\n );\n break;\n }\n const instr = instrElements[elementIndex];\n if (instr !== undefined && instr !== null) {\n const text = extractTextValue(instr);\n content.push({ type: 'instructionText', value: text });\n }\n break;\n }\n\n // Deleted text element (w:delText) - inside w:del tracked changes\n // Per ECMA-376 Part 1 §22.1.2.27, deleted text uses w:delText instead of w:t\n case 'w:delText': {\n const delTextElements = toArray(runObj['w:delText']);\n if (elementIndex >= delTextElements.length) {\n defaultLogger.debug(\n '[DocumentParser] Invalid _orderedChildren index for w:delText',\n { index: elementIndex, arrayLength: delTextElements.length }\n );\n break;\n }\n const te = delTextElements[elementIndex];\n if (te !== undefined && te !== null) {\n const text = extractTextValue(te);\n if (text) {\n // Store as deleted text - same as regular text for content purposes\n content.push({ type: 'text', value: text, isDeleted: true });\n }\n }\n break;\n }\n\n // Deleted instruction text (w:delInstrText) - inside w:del for field codes\n // Per ECMA-376 Part 1 §22.1.2.26, deleted field instructions use w:delInstrText\n case 'w:delInstrText': {\n const delInstrElements = toArray(runObj['w:delInstrText']);\n if (elementIndex >= delInstrElements.length) {\n defaultLogger.debug(\n '[DocumentParser] Invalid _orderedChildren index for w:delInstrText',\n { index: elementIndex, arrayLength: delInstrElements.length }\n );\n break;\n }\n const instr = delInstrElements[elementIndex];\n if (instr !== undefined && instr !== null) {\n const text = extractTextValue(instr);\n // Store as instruction text - field assembly will handle it\n content.push({ type: 'instructionText', value: text, isDeleted: true });\n }\n break;\n }\n\n case 'w:fldChar': {\n const fldChars = toArray(runObj['w:fldChar']);\n // Bounds check with debug logging for malformed documents\n if (elementIndex >= fldChars.length) {\n defaultLogger.debug(\n '[DocumentParser] Invalid _orderedChildren index for w:fldChar',\n { index: elementIndex, arrayLength: fldChars.length }\n );\n break;\n }\n const fldChar = fldChars[elementIndex];\n if (fldChar && typeof fldChar === 'object') {\n const charType = (fldChar['@_w:fldCharType'] || fldChar['@_fldCharType']) as\n | 'begin'\n | 'separate'\n | 'end'\n | undefined;\n if (charType) {\n const fldContent: any = {\n type: 'fieldChar',\n fieldCharType: charType,\n fieldCharDirty: parseBooleanAttr(fldChar['@_w:dirty']),\n fieldCharLocked: parseBooleanAttr(\n fldChar['@_w:fldLock'] ?? fldChar['@_w:lock']\n ),\n };\n if (charType === 'begin') {\n const ffData = parseFormFieldData(fldChar);\n if (ffData) fldContent.formFieldData = ffData;\n }\n content.push(fldContent);\n }\n }\n break;\n }\n\n case 'w:tab':\n content.push({ type: 'tab' });\n break;\n\n case 'w:br': {\n const brElements = toArray(runObj['w:br']);\n const brElement = brElements[elementIndex] || brElements[0];\n const breakType = brElement?.['@_w:type'] as BreakType | undefined;\n content.push({ type: 'break', breakType });\n break;\n }\n\n case 'w:cr':\n content.push({ type: 'carriageReturn' });\n break;\n\n case 'w:softHyphen':\n content.push({ type: 'softHyphen' });\n break;\n\n case 'w:noBreakHyphen':\n content.push({ type: 'noBreakHyphen' });\n break;\n\n // Simple marker elements per ECMA-376 Part 1 §17.3.3\n case 'w:lastRenderedPageBreak':\n content.push({ type: 'lastRenderedPageBreak' });\n break;\n\n case 'w:separator':\n content.push({ type: 'separator' });\n break;\n\n case 'w:continuationSeparator':\n content.push({ type: 'continuationSeparator' });\n break;\n\n case 'w:pgNum':\n content.push({ type: 'pageNumber' });\n break;\n\n case 'w:annotationRef':\n content.push({ type: 'annotationRef' });\n break;\n\n // Footnote reference (w:footnoteReference) per ECMA-376 Part 1 §17.11.13\n case 'w:footnoteReference': {\n const fnRefElements = toArray(runObj['w:footnoteReference']);\n const fnRef = fnRefElements[elementIndex] || fnRefElements[0];\n const fnId = fnRef?.['@_w:id'];\n content.push({\n type: 'footnoteReference',\n footnoteId: fnId !== undefined ? parseInt(fnId, 10) : undefined,\n });\n break;\n }\n\n // Endnote reference (w:endnoteReference) per ECMA-376 Part 1 §17.11.2\n case 'w:endnoteReference': {\n const enRefElements = toArray(runObj['w:endnoteReference']);\n const enRef = enRefElements[elementIndex] || enRefElements[0];\n const enId = enRef?.['@_w:id'];\n content.push({\n type: 'endnoteReference',\n endnoteId: enId !== undefined ? parseInt(enId, 10) : undefined,\n });\n break;\n }\n\n case 'w:dayShort':\n content.push({ type: 'dayShort' });\n break;\n\n case 'w:dayLong':\n content.push({ type: 'dayLong' });\n break;\n\n case 'w:monthShort':\n content.push({ type: 'monthShort' });\n break;\n\n case 'w:monthLong':\n content.push({ type: 'monthLong' });\n break;\n\n case 'w:yearShort':\n content.push({ type: 'yearShort' });\n break;\n\n case 'w:yearLong':\n content.push({ type: 'yearLong' });\n break;\n\n // Symbol character (w:sym) per ECMA-376 Part 1 §17.3.3.30\n case 'w:sym': {\n const symElements = toArray(runObj['w:sym']);\n const sym = symElements[elementIndex] || symElements[0];\n if (sym && typeof sym === 'object') {\n content.push({\n type: 'symbol',\n symbolFont: sym['@_w:font'],\n symbolChar: sym['@_w:char'],\n });\n } else {\n content.push({ type: 'symbol' });\n }\n break;\n }\n\n // Absolute position tab (w:ptab) per ECMA-376 Part 1 §17.3.3.23\n case 'w:ptab': {\n const ptabElements = toArray(runObj['w:ptab']);\n const ptab = ptabElements[elementIndex] || ptabElements[0];\n if (ptab && typeof ptab === 'object') {\n content.push({\n type: 'positionTab',\n ptabAlignment: ptab['@_w:alignment'],\n ptabRelativeTo: ptab['@_w:relativeTo'],\n ptabLeader: ptab['@_w:leader'],\n });\n } else {\n content.push({ type: 'positionTab' });\n }\n break;\n }\n\n // Ignore formatting elements (w:rPr) - handled separately\n case 'w:rPr':\n break;\n }\n }\n } else {\n // Fallback: No _orderedChildren (older parser or simple run with single text)\n defaultLogger.warn(\n '[DocumentParser] _orderedChildren missing - using fallback element ordering which may affect tab/break positions'\n );\n // Extract text elements (can be array if multiple <w:t> in one run)\n const textElement = runObj['w:t'];\n if (textElement !== undefined && textElement !== null) {\n const textElements = toArray(textElement);\n\n for (const te of textElements) {\n const text = extractTextValue(te);\n if (text) {\n content.push({ type: 'text', value: text });\n }\n }\n }\n\n const instrTextElement = runObj['w:instrText'];\n if (instrTextElement !== undefined && instrTextElement !== null) {\n const instrElements = toArray(instrTextElement);\n for (const instr of instrElements) {\n const text = extractTextValue(instr);\n content.push({ type: 'instructionText', value: text });\n }\n }\n\n // Handle deleted text (w:delText) - inside w:del tracked changes\n // Per ECMA-376 Part 1 §22.1.2.27\n const delTextElement = runObj['w:delText'];\n if (delTextElement !== undefined && delTextElement !== null) {\n const delTextElements = toArray(delTextElement);\n for (const te of delTextElements) {\n const text = extractTextValue(te);\n if (text) {\n content.push({ type: 'text', value: text, isDeleted: true });\n }\n }\n }\n\n // Handle deleted instruction text (w:delInstrText) - inside w:del for field codes\n // Per ECMA-376 Part 1 §22.1.2.26\n const delInstrTextElement = runObj['w:delInstrText'];\n if (delInstrTextElement !== undefined && delInstrTextElement !== null) {\n const delInstrElements = toArray(delInstrTextElement);\n for (const instr of delInstrElements) {\n const text = extractTextValue(instr);\n content.push({ type: 'instructionText', value: text, isDeleted: true });\n }\n }\n\n const fldCharElement = runObj['w:fldChar'];\n if (fldCharElement !== undefined && fldCharElement !== null) {\n const fldChars = toArray(fldCharElement);\n for (const fldChar of fldChars) {\n if (fldChar && typeof fldChar === 'object') {\n const charType = (fldChar['@_w:fldCharType'] || fldChar['@_fldCharType']) as\n | 'begin'\n | 'separate'\n | 'end'\n | undefined;\n if (charType) {\n const fldContent: any = {\n type: 'fieldChar',\n fieldCharType: charType,\n fieldCharDirty: parseBooleanAttr(fldChar['@_w:dirty']),\n fieldCharLocked: parseBooleanAttr(fldChar['@_w:fldLock'] ?? fldChar['@_w:lock']),\n };\n if (charType === 'begin') {\n const ffData = parseFormFieldData(fldChar);\n if (ffData) fldContent.formFieldData = ffData;\n }\n content.push(fldContent);\n }\n }\n }\n }\n\n // Extract other elements (order doesn't matter in simple case)\n if (runObj['w:tab'] !== undefined) {\n content.push({ type: 'tab' });\n }\n\n if (runObj['w:br'] !== undefined) {\n const brElement = runObj['w:br'];\n const breakType = brElement?.['@_w:type'] as BreakType | undefined;\n content.push({ type: 'break', breakType });\n }\n\n if (runObj['w:cr'] !== undefined) {\n content.push({ type: 'carriageReturn' });\n }\n\n if (runObj['w:softHyphen'] !== undefined) {\n content.push({ type: 'softHyphen' });\n }\n\n if (runObj['w:noBreakHyphen'] !== undefined) {\n content.push({ type: 'noBreakHyphen' });\n }\n\n // Simple marker elements (fallback path)\n if (runObj['w:lastRenderedPageBreak'] !== undefined) {\n content.push({ type: 'lastRenderedPageBreak' });\n }\n if (runObj['w:separator'] !== undefined) {\n content.push({ type: 'separator' });\n }\n if (runObj['w:continuationSeparator'] !== undefined) {\n content.push({ type: 'continuationSeparator' });\n }\n if (runObj['w:pgNum'] !== undefined) {\n content.push({ type: 'pageNumber' });\n }\n if (runObj['w:annotationRef'] !== undefined) {\n content.push({ type: 'annotationRef' });\n }\n // Footnote/endnote reference fallback\n if (runObj['w:footnoteReference'] !== undefined) {\n const fnRefElements = toArray(runObj['w:footnoteReference']);\n for (const fnRef of fnRefElements) {\n const fnId = fnRef?.['@_w:id'];\n content.push({\n type: 'footnoteReference',\n footnoteId: fnId !== undefined ? parseInt(fnId, 10) : undefined,\n });\n }\n }\n if (runObj['w:endnoteReference'] !== undefined) {\n const enRefElements = toArray(runObj['w:endnoteReference']);\n for (const enRef of enRefElements) {\n const enId = enRef?.['@_w:id'];\n content.push({\n type: 'endnoteReference',\n endnoteId: enId !== undefined ? parseInt(enId, 10) : undefined,\n });\n }\n }\n if (runObj['w:dayShort'] !== undefined) {\n content.push({ type: 'dayShort' });\n }\n if (runObj['w:dayLong'] !== undefined) {\n content.push({ type: 'dayLong' });\n }\n if (runObj['w:monthShort'] !== undefined) {\n content.push({ type: 'monthShort' });\n }\n if (runObj['w:monthLong'] !== undefined) {\n content.push({ type: 'monthLong' });\n }\n if (runObj['w:yearShort'] !== undefined) {\n content.push({ type: 'yearShort' });\n }\n if (runObj['w:yearLong'] !== undefined) {\n content.push({ type: 'yearLong' });\n }\n\n // Symbol character (w:sym) - fallback path\n if (runObj['w:sym'] !== undefined) {\n const symElements = toArray(runObj['w:sym']);\n for (const sym of symElements) {\n if (sym && typeof sym === 'object') {\n content.push({\n type: 'symbol',\n symbolFont: sym['@_w:font'],\n symbolChar: sym['@_w:char'],\n });\n } else {\n content.push({ type: 'symbol' });\n }\n }\n }\n\n // Absolute position tab (w:ptab) - fallback path\n if (runObj['w:ptab'] !== undefined) {\n const ptabElements = toArray(runObj['w:ptab']);\n for (const ptab of ptabElements) {\n if (ptab && typeof ptab === 'object') {\n content.push({\n type: 'positionTab',\n ptabAlignment: ptab['@_w:alignment'],\n ptabRelativeTo: ptab['@_w:relativeTo'],\n ptabLeader: ptab['@_w:leader'],\n });\n } else {\n content.push({ type: 'positionTab' });\n }\n }\n }\n }\n\n // Create run from content elements\n const run = Run.createFromContent(content, { cleanXmlFromText: false });\n\n // Parse and apply run properties (formatting)\n this.parseRunPropertiesFromObject(runObj['w:rPr'], run);\n\n // Diagnostic logging\n const text = run.getText();\n const formatting = run.getFormatting();\n if (formatting.rtl) {\n logTextDirection(`Run with RTL: \"${text}\"`);\n }\n logParsing(`Parsed run: \"${text}\" (${content.length} content element(s))`, {\n rtl: formatting.rtl || false,\n });\n\n return run;\n } catch (error: unknown) {\n return null;\n }\n }\n\n private parseHyperlinkFromObject(\n hyperlinkObj: any,\n relationshipManager: RelationshipManager\n ): {\n hyperlink: Hyperlink | null;\n bookmarkStarts: Bookmark[];\n bookmarkEnds: Bookmark[];\n } {\n const result: {\n hyperlink: Hyperlink | null;\n bookmarkStarts: Bookmark[];\n bookmarkEnds: Bookmark[];\n } = { hyperlink: null, bookmarkStarts: [], bookmarkEnds: [] };\n\n try {\n // Extract bookmark elements inside the hyperlink\n // These need to be added to the containing paragraph\n if (hyperlinkObj['w:bookmarkStart']) {\n const bookmarkStarts = Array.isArray(hyperlinkObj['w:bookmarkStart'])\n ? hyperlinkObj['w:bookmarkStart']\n : [hyperlinkObj['w:bookmarkStart']];\n for (const bs of bookmarkStarts) {\n const id = bs['@_w:id'];\n const name = bs['@_w:name'];\n if (id !== undefined && name) {\n const bookmark = new Bookmark({\n name: name,\n id: typeof id === 'number' ? id : parseInt(id, 10),\n skipNormalization: true,\n });\n result.bookmarkStarts.push(bookmark);\n // Also register with BookmarkManager\n if (this.bookmarkManager) {\n try {\n this.bookmarkManager.registerExisting(bookmark);\n } catch (e) {\n getLogger().debug('Bookmark already registered', { id: bookmark.getId?.() });\n }\n }\n }\n }\n }\n\n if (hyperlinkObj['w:bookmarkEnd']) {\n const bookmarkEnds = Array.isArray(hyperlinkObj['w:bookmarkEnd'])\n ? hyperlinkObj['w:bookmarkEnd']\n : [hyperlinkObj['w:bookmarkEnd']];\n for (const be of bookmarkEnds) {\n const id = be['@_w:id'];\n if (id !== undefined) {\n const bookmark = new Bookmark({\n name: `_end_${id}`,\n id: typeof id === 'number' ? id : parseInt(id, 10),\n skipNormalization: true,\n });\n result.bookmarkEnds.push(bookmark);\n }\n }\n }\n\n // Extract hyperlink attributes\n const relationshipId = hyperlinkObj['@_r:id'];\n const anchor = hyperlinkObj['@_w:anchor'];\n const tooltip = hyperlinkObj['@_w:tooltip'];\n const tgtFrame = hyperlinkObj['@_w:tgtFrame'];\n const history = hyperlinkObj['@_w:history'];\n const docLocation = hyperlinkObj['@_w:docLocation'];\n\n // Parse runs inside the hyperlink\n const runs = hyperlinkObj['w:r'];\n const runChildren = Array.isArray(runs) ? runs : runs ? [runs] : [];\n\n // Parse ALL runs to handle multi-run hyperlinks (e.g., varied formatting within one hyperlink)\n // Google Docs often splits hyperlinks by formatting changes, creating multiple runs\n const parsedRuns: Run[] = [];\n let text = '';\n let formatting: RunFormatting = {};\n\n if (runChildren.length > 0) {\n // Parse all runs, not just the first one\n for (const runChild of runChildren) {\n const parsedRun = this.parseRunFromObject(runChild);\n if (parsedRun) {\n parsedRuns.push(parsedRun);\n text += parsedRun.getText();\n }\n }\n\n // Use the first run's formatting as the base formatting\n if (parsedRuns.length > 0 && parsedRuns[0]) {\n formatting = parsedRuns[0].getFormatting();\n }\n }\n\n // For TOC hyperlinks with tabs/breaks, use the first parsed run\n const parsedRun = parsedRuns.length > 0 ? parsedRuns[0] : null;\n\n // Resolve URL from relationship if external hyperlink\n let url: string | undefined;\n if (relationshipId) {\n const relationship = relationshipManager.getRelationship(relationshipId);\n if (relationship) {\n url = relationship.getTarget();\n // Decode URL-encoded characters (e.g., %23 -> #, %20 -> space)\n // This ensures proper handling of URLs with fragments and special characters\n if (url) {\n try {\n url = decodeURIComponent(url);\n } catch {\n // If decoding fails, use the original URL\n defaultLogger.debug(`[DocumentParser] Failed to decode URL: ${url}`);\n }\n }\n }\n }\n\n // Handle external hyperlinks with anchor fragments\n // Microsoft Word can store URLs with the base in relationships and fragment in w:anchor\n // Example: rels has \"https://example.com/\", anchor has \"!/view?docid=abc-123\"\n // Combined: \"https://example.com/#!/view?docid=abc-123\"\n // This is common for single-page applications with hash-based routing (theSource, etc.)\n let finalAnchor = anchor;\n let finalRelationshipId = relationshipId;\n if (url && anchor) {\n // Combine URL and anchor for external hyperlinks with fragments\n url = url + '#' + anchor;\n finalAnchor = undefined; // Clear anchor since it's now part of URL\n // Clear relationshipId since the relationship points to the old base URL\n // On save, a new relationship will be created with the combined URL\n finalRelationshipId = undefined;\n defaultLogger.debug(`[DocumentParser] Combined external URL with anchor fragment: ${url}`);\n }\n\n // Skip hyperlinks that have no destination (neither URL nor anchor nor relationship ID)\n // This can happen with malformed HYPERLINK field codes or corrupted documents\n // Note: If there's a relationshipId but the relationship is missing, we still keep the hyperlink\n // (it has text and a reference that might be resolved later or is just broken)\n if (!url && !finalAnchor && !finalRelationshipId) {\n defaultLogger.debug(\n `[DocumentParser] Skipping hyperlink with no URL, anchor, or relationship ID. Text: \"${text}\"`\n );\n return result;\n }\n\n // Skip self-closing external hyperlinks (no runs at all)\n // These are invisible hyperlinks that exist in the document structure but have no visible content\n // They should be removed rather than having URLs appear as text\n const isSelfClosingHyperlink = runChildren.length === 0;\n const isExternalLink = (url || finalRelationshipId) && !finalAnchor;\n\n if (isSelfClosingHyperlink && isExternalLink) {\n // Skip self-closing external hyperlink - it has no visible content\n defaultLogger.debug(\n `[DocumentParser] Skipping self-closing external hyperlink with no display text. URL: \"${url}\"`\n );\n return result;\n }\n\n // Create hyperlink with display text\n // NOTE: Do NOT use anchor (bookmark ID) as display text - it should only be used for navigation\n const displayText = text || url || '[Link]';\n\n // Warn if hyperlink has no display text (possible TOC corruption or malformed hyperlink)\n if (!text && finalAnchor) {\n defaultLogger.warn(\n `[DocumentParser] Hyperlink to anchor \"${finalAnchor}\" has no display text. ` +\n `Using placeholder \"[Link]\" to prevent bookmark ID from appearing as visible text. ` +\n `This may indicate a corrupted TOC or malformed hyperlink in the source document.`\n );\n }\n\n const hyperlink = new Hyperlink({\n url,\n anchor: finalAnchor,\n text: displayText,\n formatting,\n tooltip,\n relationshipId: finalRelationshipId,\n tgtFrame,\n history,\n docLocation,\n });\n\n // If we successfully parsed a run with tabs/breaks, use it instead of the default run\n // This preserves TOC structure (text → tab → text)\n if (parsedRun && parsedRun.getContent().length > 1) {\n hyperlink.setRun(parsedRun);\n }\n\n result.hyperlink = hyperlink;\n return result;\n } catch (error: unknown) {\n defaultLogger.warn(\n '[DocumentParser] Failed to parse hyperlink:',\n error instanceof Error\n ? { message: error.message, stack: error.stack }\n : { error: String(error) }\n );\n return result;\n }\n }\n\n /**\n * Merges TRULY consecutive hyperlinks with the same URL into a single hyperlink\n * This handles Google Docs-style hyperlinks that are split by formatting changes\n *\n * IMPORTANT: Only merges hyperlinks that are IMMEDIATELY adjacent (no content between them).\n * Hyperlinks with the same URL but with intervening text/runs are NOT merged.\n *\n * @param paragraph - Paragraph containing hyperlinks to merge\n * @param resetFormatting - Whether to reset hyperlinks to standard formatting\n * @private\n */\n private mergeConsecutiveHyperlinks(paragraph: Paragraph, resetFormatting = false): void {\n const content = paragraph.getContent();\n if (!content || content.length < 2) return;\n\n // Guard: Skip merge when tracking is enabled - it corrupts field structures\n // The clearContent() + addHyperlink() pattern creates new revisions\n // that end up at the wrong position in the content array, placing them\n // OUTSIDE field boundaries when field codes are present\n const trackingEnabled = (paragraph as any).trackingContext?.isEnabled();\n if (trackingEnabled) {\n const hasFieldContent = content.some((item) => {\n if (item instanceof Run) {\n const runContent = item.getContent();\n return runContent.some(\n (c: any) => c.type === 'fieldChar' || c.type === 'instructionText'\n );\n }\n // Also check inside Revisions for field content\n if (item instanceof Revision) {\n const revContent = item.getContent();\n for (const inner of revContent) {\n if (inner instanceof Run) {\n const innerRunContent = inner.getContent();\n if (\n innerRunContent.some(\n (c: any) => c.type === 'fieldChar' || c.type === 'instructionText'\n )\n ) {\n return true;\n }\n }\n }\n }\n return false;\n });\n\n if (hasFieldContent) {\n defaultLogger.debug(\n 'Skipping hyperlink merge: tracking enabled with field content present'\n );\n return;\n }\n }\n\n const mergedContent: any[] = [];\n let i = 0;\n let contentChanged = false;\n\n while (i < content.length) {\n const item = content[i];\n\n if (item instanceof Hyperlink) {\n // Look ahead to find CONSECUTIVE hyperlinks with the same URL/anchor\n const url = item.getUrl() || '';\n const anchor = item.getAnchor() || '';\n const consecutiveHyperlinks: Hyperlink[] = [item];\n let j = i + 1;\n\n // Only merge if IMMEDIATELY adjacent (next item is also a hyperlink with same URL)\n while (j < content.length) {\n const nextItem = content[j];\n if (\n nextItem instanceof Hyperlink &&\n (nextItem.getUrl() || '') === url &&\n (nextItem.getAnchor() || '') === anchor\n ) {\n consecutiveHyperlinks.push(nextItem);\n j++;\n } else {\n // Stop at first non-matching item (including non-hyperlink items)\n break;\n }\n }\n\n if (consecutiveHyperlinks.length > 1) {\n // Merge consecutive hyperlinks\n const mergedText = consecutiveHyperlinks.map((h) => h.getText()).join('');\n\n const mergedHyperlink = new Hyperlink({\n url: item.getUrl(),\n anchor: item.getAnchor(),\n text: mergedText,\n formatting: resetFormatting\n ? this.getStandardHyperlinkFormatting()\n : item.getFormatting(),\n tooltip: item.getTooltip(),\n relationshipId: item.getRelationshipId(),\n });\n mergedContent.push(mergedHyperlink);\n contentChanged = true;\n } else {\n // Single hyperlink (no consecutive ones to merge)\n if (resetFormatting) {\n const resetHyperlink = new Hyperlink({\n url: item.getUrl(),\n anchor: item.getAnchor(),\n text: item.getText(),\n formatting: this.getStandardHyperlinkFormatting(),\n tooltip: item.getTooltip(),\n relationshipId: item.getRelationshipId(),\n });\n mergedContent.push(resetHyperlink);\n contentChanged = true;\n } else {\n mergedContent.push(item);\n }\n }\n i = j;\n } else {\n // Not a hyperlink, keep as-is\n mergedContent.push(item);\n i++;\n }\n }\n\n // Update paragraph content only if we actually changed something\n if (contentChanged) {\n // Clear current content\n paragraph.clearContent();\n\n // Add merged content back\n for (const item of mergedContent) {\n if (item instanceof Hyperlink) {\n paragraph.addHyperlink(item);\n } else if (item instanceof Run) {\n paragraph.addRun(item);\n } else if (item instanceof Field) {\n paragraph.addField(item);\n } else {\n // Preserve all other content types: Revision, RangeMarker, Shape, TextBox, PreservedElement\n paragraph.addContent(item);\n }\n }\n }\n }\n\n /**\n * Get standard hyperlink formatting (blue, underline)\n * @private\n */\n private getStandardHyperlinkFormatting(): any {\n return {\n color: '0000FF', // Standard hyperlink blue\n underline: 'single',\n };\n }\n\n /**\n * Parses a simple field (w:fldSimple) from XML object\n * @param fieldObj - Field XML object\n * @returns Parsed Field or null if parsing fails\n * @private\n */\n private parseSimpleFieldFromObject(fieldObj: any): Field | null {\n try {\n // Extract field instruction from w:instr attribute\n const instruction = fieldObj['@_w:instr'];\n if (!instruction) {\n return null;\n }\n\n // Extract field type from instruction (first word)\n const typeMatch = instruction.trim().match(/^(\\w+)/);\n const type = (typeMatch?.[1] || 'PAGE') as import('../elements/Field').FieldType;\n\n // Parse run formatting from w:rPr if present\n let formatting: RunFormatting | undefined;\n if (fieldObj['w:rPr']) {\n const tempRun = new Run('');\n this.parseRunPropertiesFromObject(fieldObj['w:rPr'], tempRun);\n formatting = tempRun.getFormatting();\n }\n\n // Create field with instruction\n const field = Field.create({\n type,\n instruction,\n formatting,\n });\n\n return field;\n } catch (error: unknown) {\n defaultLogger.warn(\n '[DocumentParser] Failed to parse field:',\n error instanceof Error\n ? { message: error.message, stack: error.stack }\n : { error: String(error) }\n );\n return null;\n }\n }\n\n private parseRunPropertiesFromObject(rPrObj: any, run: Run): void {\n if (!rPrObj) return;\n\n // Parse character style reference (w:rStyle) per ECMA-376 Part 1 §17.3.2.36\n if (rPrObj['w:rStyle']) {\n const styleId = rPrObj['w:rStyle']['@_w:val'];\n if (styleId) {\n run.setCharacterStyle(styleId);\n }\n }\n\n // Parse text border (w:bdr) per ECMA-376 Part 1 §17.3.2.5\n if (rPrObj['w:bdr']) {\n const bdr = rPrObj['w:bdr'];\n const border: any = {};\n if (bdr['@_w:val']) border.style = bdr['@_w:val'];\n if (bdr['@_w:sz']) border.size = parseInt(bdr['@_w:sz'], 10);\n if (bdr['@_w:color']) border.color = bdr['@_w:color'];\n if (bdr['@_w:space']) border.space = parseInt(bdr['@_w:space'], 10);\n if (Object.keys(border).length > 0) {\n run.setBorder(border);\n }\n }\n\n // Parse character shading (w:shd) per ECMA-376 Part 1 §17.3.2.32\n if (rPrObj['w:shd']) {\n const shading = this.parseShadingFromObj(rPrObj['w:shd']);\n if (shading) {\n run.setShading(shading);\n }\n }\n\n // Parse emphasis marks (w:em) per ECMA-376 Part 1 §17.3.2.13\n if (rPrObj['w:em']) {\n const val = rPrObj['w:em']['@_w:val'];\n if (val) run.setEmphasis(val);\n }\n\n // Parse outline text effect (w:outline) per ECMA-376 Part 1 §17.3.2.23\n if (rPrObj['w:outline']) run.setOutline(true);\n\n // Parse shadow text effect (w:shadow) per ECMA-376 Part 1 §17.3.2.32\n if (rPrObj['w:shadow']) run.setShadow(true);\n\n // Parse emboss text effect (w:emboss) per ECMA-376 Part 1 §17.3.2.13\n if (rPrObj['w:emboss']) run.setEmboss(true);\n\n // Parse imprint text effect (w:imprint) per ECMA-376 Part 1 §17.3.2.18\n if (rPrObj['w:imprint']) run.setImprint(true);\n\n // Parse no proofing (w:noProof) per ECMA-376 Part 1 §17.3.2.21\n if (rPrObj['w:noProof']) run.setNoProof(true);\n\n // Parse snap to grid (w:snapToGrid) per ECMA-376 Part 1 §17.3.2.35\n if (rPrObj['w:snapToGrid']) run.setSnapToGrid(true);\n\n // Parse vanish/hidden (w:vanish) per ECMA-376 Part 1 §17.3.2.42\n if (rPrObj['w:vanish']) run.setVanish(true);\n\n // Parse special vanish (w:specVanish) per ECMA-376 Part 1 §17.3.2.36\n if (rPrObj['w:specVanish']) run.setSpecVanish(true);\n\n // Boolean properties - use parseOoxmlBoolean helper\n // Per ECMA-376: <w:b/> or <w:b w:val=\"1\"/> or <w:b w:val=\"true\"/> means true\n // <w:b w:val=\"0\"/> or <w:b w:val=\"false\"/> means false (omit from document)\n\n // Parse RTL text (w:rtl) per ECMA-376 Part 1 §17.3.2.30\n if (parseOoxmlBoolean(rPrObj['w:rtl'])) run.setRTL(true);\n\n if (parseOoxmlBoolean(rPrObj['w:b'])) run.setBold(true);\n if (parseOoxmlBoolean(rPrObj['w:bCs'])) run.setComplexScriptBold(true);\n if (parseOoxmlBoolean(rPrObj['w:i'])) run.setItalic(true);\n if (parseOoxmlBoolean(rPrObj['w:iCs'])) run.setComplexScriptItalic(true);\n if (parseOoxmlBoolean(rPrObj['w:strike'])) run.setStrike(true);\n if (parseOoxmlBoolean(rPrObj['w:dstrike'])) {\n (run as any).formatting.dstrike = true;\n }\n if (parseOoxmlBoolean(rPrObj['w:smallCaps'])) run.setSmallCaps(true);\n if (parseOoxmlBoolean(rPrObj['w:caps'])) run.setAllCaps(true);\n\n // Parse complex script flag (w:cs) per ECMA-376 Part 1 §17.3.2.7\n if (parseOoxmlBoolean(rPrObj['w:cs'])) run.setComplexScript(true);\n\n // Parse web hidden (w:webHidden) per ECMA-376 Part 1 §17.3.2.44\n if (parseOoxmlBoolean(rPrObj['w:webHidden'])) run.setWebHidden(true);\n\n if (rPrObj['w:u']) {\n // XMLParser adds @_ prefix to attributes\n const uVal = rPrObj['w:u']['@_w:val'];\n run.setUnderline(uVal || true);\n // Parse underline color attributes per ECMA-376 Part 1 §17.3.2.40\n const uColor = rPrObj['w:u']['@_w:color'];\n if (uColor) run.setUnderlineColor(uColor);\n const uThemeColor = rPrObj['w:u']['@_w:themeColor'];\n if (uThemeColor)\n run.setUnderlineThemeColor(\n uThemeColor,\n rPrObj['w:u']['@_w:themeTint'] ? parseInt(rPrObj['w:u']['@_w:themeTint'], 16) : undefined,\n rPrObj['w:u']['@_w:themeShade']\n ? parseInt(rPrObj['w:u']['@_w:themeShade'], 16)\n : undefined\n );\n }\n\n // Parse character spacing (w:spacing) per ECMA-376 Part 1 §17.3.2.33\n if (rPrObj['w:spacing']) {\n const val = rPrObj['w:spacing']['@_w:val'];\n if (val) run.setCharacterSpacing(parseInt(val, 10));\n }\n\n // Parse horizontal scaling (w:w) per ECMA-376 Part 1 §17.3.2.43\n if (rPrObj['w:w']) {\n const val = rPrObj['w:w']['@_w:val'];\n if (val) run.setScaling(parseInt(val, 10));\n }\n\n // Parse vertical position (w:position) per ECMA-376 Part 1 §17.3.2.31\n if (rPrObj['w:position']) {\n const val = rPrObj['w:position']['@_w:val'];\n if (val) run.setPosition(parseInt(val, 10));\n }\n\n // Parse kerning (w:kern) per ECMA-376 Part 1 §17.3.2.20\n if (rPrObj['w:kern']) {\n const val = rPrObj['w:kern']['@_w:val'];\n if (val) run.setKerning(parseInt(val, 10));\n }\n\n // Parse language (w:lang) per ECMA-376 Part 1 §17.3.2.20\n if (rPrObj['w:lang']) {\n const val = rPrObj['w:lang']['@_w:val'];\n if (val) run.setLanguage(val);\n }\n\n // Parse East Asian layout (w:eastAsianLayout) per ECMA-376 Part 1 §17.3.2.10\n if (rPrObj['w:eastAsianLayout']) {\n const layoutObj = rPrObj['w:eastAsianLayout'];\n const layout: any = {};\n if (layoutObj['@_w:id'] !== undefined) layout.id = Number(layoutObj['@_w:id']);\n if (layoutObj['@_w:vert']) layout.vert = true;\n if (layoutObj['@_w:vertCompress']) layout.vertCompress = true;\n if (layoutObj['@_w:combine']) layout.combine = true;\n if (layoutObj['@_w:combineBrackets'])\n layout.combineBrackets = layoutObj['@_w:combineBrackets'];\n\n if (Object.keys(layout).length > 0) {\n run.setEastAsianLayout(layout);\n }\n }\n\n // Parse fit text (w:fitText) per ECMA-376 Part 1 §17.3.2.15\n if (rPrObj['w:fitText']) {\n const val = rPrObj['w:fitText']['@_w:val'];\n if (val !== undefined) run.setFitText(Number(val));\n }\n\n // Parse text effect (w:effect) per ECMA-376 Part 1 §17.3.2.12\n if (rPrObj['w:effect']) {\n const val = rPrObj['w:effect']['@_w:val'];\n if (val) run.setEffect(val);\n }\n\n if (rPrObj['w:vertAlign']) {\n const val = rPrObj['w:vertAlign']['@_w:val'];\n if (val === 'subscript') run.setSubscript(true);\n if (val === 'superscript') run.setSuperscript(true);\n }\n\n if (rPrObj['w:rFonts']) {\n const rFonts = rPrObj['w:rFonts'];\n if (rFonts['@_w:ascii']) run.setFont(rFonts['@_w:ascii']);\n // Parse additional font variants per ECMA-376 Part 1 §17.3.2.26\n if (rFonts['@_w:hAnsi']) run.setFontHAnsi(rFonts['@_w:hAnsi']);\n if (rFonts['@_w:eastAsia']) run.setFontEastAsia(rFonts['@_w:eastAsia']);\n if (rFonts['@_w:cs']) run.setFontCs(rFonts['@_w:cs']);\n if (rFonts['@_w:hint']) run.setFontHint(rFonts['@_w:hint']);\n // Parse theme font references per ECMA-376 Part 1 §17.3.2.26\n if (rFonts['@_w:asciiTheme']) run.setFontAsciiTheme(rFonts['@_w:asciiTheme']);\n if (rFonts['@_w:hAnsiTheme']) run.setFontHAnsiTheme(rFonts['@_w:hAnsiTheme']);\n if (rFonts['@_w:eastAsiaTheme']) run.setFontEastAsiaTheme(rFonts['@_w:eastAsiaTheme']);\n if (rFonts['@_w:cstheme']) run.setFontCsTheme(rFonts['@_w:cstheme']);\n }\n\n if (rPrObj['w:sz']) {\n run.setSize(halfPointsToPoints(parseInt(rPrObj['w:sz']['@_w:val'], 10)));\n }\n\n // Parse complex script font size (w:szCs) per ECMA-376 Part 1 §17.3.2.40\n // This is separate from regular size to support RTL languages\n if (rPrObj['w:szCs']) {\n const szCsVal = halfPointsToPoints(parseInt(rPrObj['w:szCs']['@_w:val'], 10));\n // Only set sizeCs if it differs from size (to avoid redundant storage)\n // When sz is not present (undefined), always store szCs\n const sizeVal = rPrObj['w:sz']\n ? halfPointsToPoints(parseInt(rPrObj['w:sz']['@_w:val'], 10))\n : undefined;\n if (sizeVal === undefined || szCsVal !== sizeVal) {\n run.setSizeCs(szCsVal);\n }\n }\n\n if (rPrObj['w:color']) {\n const colorObj = rPrObj['w:color'];\n const colorVal = colorObj['@_w:val'];\n // Skip special OOXML values like \"auto\" (automatic/inherit from style)\n // \"auto\" is a valid OOXML color that means inherit - not a hex color\n if (colorVal && colorVal !== 'auto') {\n run.setColor(colorVal);\n }\n // Parse theme color attributes per ECMA-376 Part 1 Section 17.3.2.6\n if (colorObj['@_w:themeColor']) {\n run.setThemeColor(colorObj['@_w:themeColor']);\n }\n if (colorObj['@_w:themeTint']) {\n // Theme tint is stored as hex string, convert to number\n run.setThemeTint(parseInt(colorObj['@_w:themeTint'], 16));\n }\n if (colorObj['@_w:themeShade']) {\n // Theme shade is stored as hex string, convert to number\n run.setThemeShade(parseInt(colorObj['@_w:themeShade'], 16));\n }\n }\n\n if (rPrObj['w:highlight']) {\n run.setHighlight(rPrObj['w:highlight']['@_w:val']);\n }\n\n // Collect w14: namespace elements from rPr for passthrough (Word 2010+ text effects)\n // w14:textOutline, w14:shadow, w14:reflection, w14:glow, w14:ligatures,\n // w14:numForm, w14:numSpacing, w14:cntxtAlts, w14:stylisticSets\n for (const key of Object.keys(rPrObj)) {\n if (key.startsWith('w14:')) {\n const rawXml = this.objectToXml({ [key]: rPrObj[key] });\n if (rawXml) {\n run.addRawW14Property(rawXml);\n }\n }\n }\n\n // Parse run property change tracking (w:rPrChange) per ECMA-376 Part 1 §17.13.5.30\n // This records what the run formatting was BEFORE a change was made\n if (rPrObj['w:rPrChange']) {\n const changeObj = rPrObj['w:rPrChange'];\n const propChange: import('../elements/PropertyChangeTypes').RunPropertyChange = {\n id: changeObj['@_w:id'] !== undefined ? parseInt(String(changeObj['@_w:id']), 10) : 0,\n author: changeObj['@_w:author'] ? String(changeObj['@_w:author']) : '',\n date: changeObj['@_w:date'] ? new Date(String(changeObj['@_w:date'])) : new Date(),\n previousProperties: {},\n };\n\n // Parse previous run properties from child w:rPr element\n if (changeObj['w:rPr']) {\n const prevRPr = changeObj['w:rPr'];\n const prevProps: Partial<import('../elements/Run').RunFormatting> = {};\n\n // Parse previous bold\n if (prevRPr['w:b']) {\n prevProps.bold = parseOoxmlBoolean(prevRPr['w:b']);\n }\n\n // Parse previous italic\n if (prevRPr['w:i']) {\n prevProps.italic = parseOoxmlBoolean(prevRPr['w:i']);\n }\n\n // Parse previous underline\n if (prevRPr['w:u']) {\n const uVal = prevRPr['w:u']['@_w:val'];\n prevProps.underline = uVal || true;\n }\n\n // Parse previous strikethrough\n if (prevRPr['w:strike']) {\n prevProps.strike = parseOoxmlBoolean(prevRPr['w:strike']);\n }\n\n // Parse previous font (all w:rFonts attributes per ECMA-376 Part 1 §17.3.2.26)\n if (prevRPr['w:rFonts']) {\n const rFonts = prevRPr['w:rFonts'];\n if (rFonts['@_w:ascii']) prevProps.font = rFonts['@_w:ascii'];\n if (rFonts['@_w:hAnsi']) prevProps.fontHAnsi = rFonts['@_w:hAnsi'];\n if (rFonts['@_w:eastAsia']) prevProps.fontEastAsia = rFonts['@_w:eastAsia'];\n if (rFonts['@_w:cs']) prevProps.fontCs = rFonts['@_w:cs'];\n if (rFonts['@_w:hint']) prevProps.fontHint = rFonts['@_w:hint'];\n }\n\n // Parse previous size (half-points to points)\n if (prevRPr['w:sz']) {\n prevProps.size = halfPointsToPoints(safeParseInt(prevRPr['w:sz']['@_w:val']));\n }\n\n // Parse previous complex script size (w:szCs) per ECMA-376 Part 1 §17.3.2.40\n if (prevRPr['w:szCs']) {\n const szCsVal = halfPointsToPoints(safeParseInt(prevRPr['w:szCs']['@_w:val']));\n // Only store if different from regular size\n if (!prevRPr['w:sz'] || szCsVal !== prevProps.size) {\n prevProps.sizeCs = szCsVal;\n }\n }\n\n // Parse previous color (per ECMA-376 Part 1 Section 17.3.2.6)\n if (prevRPr['w:color']) {\n const colorObj = prevRPr['w:color'];\n const colorVal = colorObj['@_w:val'];\n if (colorVal && colorVal !== 'auto') {\n prevProps.color = colorVal;\n }\n // Parse theme color attributes\n if (colorObj['@_w:themeColor']) {\n prevProps.themeColor = colorObj['@_w:themeColor'];\n }\n if (colorObj['@_w:themeTint']) {\n prevProps.themeTint = parseInt(colorObj['@_w:themeTint'], 16);\n }\n if (colorObj['@_w:themeShade']) {\n prevProps.themeShade = parseInt(colorObj['@_w:themeShade'], 16);\n }\n }\n\n // Parse previous highlight\n if (prevRPr['w:highlight']) {\n prevProps.highlight = prevRPr['w:highlight']['@_w:val'];\n }\n\n // Parse previous subscript/superscript\n if (prevRPr['w:vertAlign']) {\n const val = prevRPr['w:vertAlign']['@_w:val'];\n if (val === 'subscript') prevProps.subscript = true;\n if (val === 'superscript') prevProps.superscript = true;\n }\n\n // Parse previous smallCaps/allCaps\n if (prevRPr['w:smallCaps']) {\n prevProps.smallCaps = parseOoxmlBoolean(prevRPr['w:smallCaps']);\n }\n if (prevRPr['w:caps']) {\n prevProps.allCaps = parseOoxmlBoolean(prevRPr['w:caps']);\n }\n\n // === Extended run property parsing per ECMA-376 Part 1 §17.3.2 ===\n\n // Parse double strikethrough (w:dstrike)\n if (prevRPr['w:dstrike']) {\n prevProps.dstrike = parseOoxmlBoolean(prevRPr['w:dstrike']);\n }\n\n // Parse text effects (w:outline, w:shadow, w:emboss, w:imprint)\n if (prevRPr['w:outline']) {\n prevProps.outline = parseOoxmlBoolean(prevRPr['w:outline']);\n }\n if (prevRPr['w:shadow']) {\n prevProps.shadow = parseOoxmlBoolean(prevRPr['w:shadow']);\n }\n if (prevRPr['w:emboss']) {\n prevProps.emboss = parseOoxmlBoolean(prevRPr['w:emboss']);\n }\n if (prevRPr['w:imprint']) {\n prevProps.imprint = parseOoxmlBoolean(prevRPr['w:imprint']);\n }\n\n // Parse vanish/hidden text (w:vanish, w:specVanish)\n if (prevRPr['w:vanish']) {\n prevProps.vanish = parseOoxmlBoolean(prevRPr['w:vanish']);\n }\n if (prevRPr['w:specVanish']) {\n prevProps.specVanish = parseOoxmlBoolean(prevRPr['w:specVanish']);\n }\n\n // Parse web hidden (w:webHidden) per ECMA-376 Part 1 §17.3.2.44\n if (prevRPr['w:webHidden']) {\n prevProps.webHidden = parseOoxmlBoolean(prevRPr['w:webHidden']);\n }\n\n // Parse RTL and no-proofing (w:rtl, w:noProof)\n if (prevRPr['w:rtl']) {\n prevProps.rtl = parseOoxmlBoolean(prevRPr['w:rtl']);\n }\n if (prevRPr['w:noProof']) {\n prevProps.noProof = parseOoxmlBoolean(prevRPr['w:noProof']);\n }\n\n // Parse snap to grid (w:snapToGrid)\n if (prevRPr['w:snapToGrid']) {\n prevProps.snapToGrid = parseOoxmlBoolean(prevRPr['w:snapToGrid']);\n }\n\n // Parse complex script bold/italic (w:bCs, w:iCs)\n if (prevRPr['w:bCs']) {\n prevProps.complexScriptBold = parseOoxmlBoolean(prevRPr['w:bCs']);\n }\n if (prevRPr['w:iCs']) {\n prevProps.complexScriptItalic = parseOoxmlBoolean(prevRPr['w:iCs']);\n }\n\n // Parse complex script flag (w:cs) per ECMA-376 Part 1 §17.3.2.7\n if (prevRPr['w:cs']) {\n prevProps.complexScript = parseOoxmlBoolean(prevRPr['w:cs']);\n }\n\n // Parse character spacing (w:spacing @w:val in twips)\n if (prevRPr['w:spacing']) {\n const spacingVal = prevRPr['w:spacing']['@_w:val'];\n if (spacingVal !== undefined) {\n prevProps.characterSpacing = safeParseInt(spacingVal);\n }\n }\n\n // Parse horizontal scaling (w:w @w:val as percentage)\n if (prevRPr['w:w']) {\n const scaleVal = prevRPr['w:w']['@_w:val'];\n if (scaleVal !== undefined) {\n prevProps.scaling = safeParseInt(scaleVal);\n }\n }\n\n // Parse vertical position (w:position @w:val in half-points)\n if (prevRPr['w:position']) {\n const posVal = prevRPr['w:position']['@_w:val'];\n if (posVal !== undefined) {\n prevProps.position = safeParseInt(posVal);\n }\n }\n\n // Parse kerning threshold (w:kern @w:val in half-points)\n if (prevRPr['w:kern']) {\n const kernVal = prevRPr['w:kern']['@_w:val'];\n if (kernVal !== undefined) {\n prevProps.kerning = safeParseInt(kernVal);\n }\n }\n\n // Parse language (w:lang @w:val)\n if (prevRPr['w:lang']) {\n const langVal = prevRPr['w:lang']['@_w:val'];\n if (langVal) {\n prevProps.language = String(langVal);\n }\n }\n\n // Parse character style reference (w:rStyle @w:val)\n if (prevRPr['w:rStyle']) {\n const styleVal = prevRPr['w:rStyle']['@_w:val'];\n if (styleVal) {\n prevProps.characterStyle = String(styleVal);\n }\n }\n\n // Parse text effect/animation (w:effect @w:val)\n if (prevRPr['w:effect']) {\n const effectVal = prevRPr['w:effect']['@_w:val'];\n if (effectVal) {\n prevProps.effect = effectVal as RunFormatting['effect'];\n }\n }\n\n // Parse fit text width (w:fitText @w:val in twips)\n if (prevRPr['w:fitText']) {\n const fitVal = prevRPr['w:fitText']['@_w:val'];\n if (fitVal !== undefined) {\n prevProps.fitText = safeParseInt(fitVal);\n }\n }\n\n // Parse emphasis mark (w:em @w:val)\n if (prevRPr['w:em']) {\n const emVal = prevRPr['w:em']['@_w:val'];\n if (emVal) {\n prevProps.emphasis = emVal as RunFormatting['emphasis'];\n }\n }\n\n // Parse text border (w:bdr) per ECMA-376 Part 1 §17.3.2.4\n // Maps to TextBorder interface: style, size, color, space\n if (prevRPr['w:bdr']) {\n const bdrObj = prevRPr['w:bdr'];\n prevProps.border = {\n style: bdrObj['@_w:val'] as import('../elements/Run').TextBorderStyle,\n size: bdrObj['@_w:sz'] !== undefined ? safeParseInt(bdrObj['@_w:sz']) : undefined,\n space:\n bdrObj['@_w:space'] !== undefined ? safeParseInt(bdrObj['@_w:space']) : undefined,\n color: bdrObj['@_w:color'],\n };\n }\n\n // Parse character shading (w:shd) per ECMA-376 Part 1 §17.3.2.32\n if (prevRPr['w:shd']) {\n const shading = this.parseShadingFromObj(prevRPr['w:shd']);\n if (shading) {\n prevProps.shading = shading;\n }\n }\n\n // Parse East Asian layout (w:eastAsianLayout) per ECMA-376 Part 1 §17.3.2.10\n if (prevRPr['w:eastAsianLayout']) {\n const eaObj = prevRPr['w:eastAsianLayout'];\n prevProps.eastAsianLayout = {\n id: eaObj['@_w:id'] !== undefined ? safeParseInt(eaObj['@_w:id']) : undefined,\n combine: eaObj['@_w:combine']\n ? parseOoxmlBoolean({ '@_w:val': eaObj['@_w:combine'] })\n : undefined,\n combineBrackets: eaObj['@_w:combineBrackets'],\n vert: eaObj['@_w:vert']\n ? parseOoxmlBoolean({ '@_w:val': eaObj['@_w:vert'] })\n : undefined,\n vertCompress: eaObj['@_w:vertCompress']\n ? parseOoxmlBoolean({ '@_w:val': eaObj['@_w:vertCompress'] })\n : undefined,\n };\n }\n\n propChange.previousProperties = prevProps;\n }\n\n run.setPropertyChangeRevision(propChange);\n }\n }\n\n private async parseDrawingFromObject(\n drawingObj: any,\n zipHandler: ZipHandler,\n relationshipManager: RelationshipManager,\n imageManager: ImageManager\n ): Promise<ImageRun | null> {\n const logger = getLogger();\n try {\n // Drawing can contain either wp:inline (inline image) or wp:anchor (floating image)\n const inlineObj = drawingObj['wp:inline'];\n const anchorObj = drawingObj['wp:anchor'];\n const imageObj = inlineObj || anchorObj;\n\n if (!imageObj) {\n logger.debug('Drawing found but no wp:inline or wp:anchor element');\n return null;\n }\n\n const isFloating = !!anchorObj;\n\n // Extract dimensions from wp:extent\n const extentObj = imageObj['wp:extent'];\n let width = 0;\n let height = 0;\n if (extentObj) {\n width = parseInt(extentObj['@_cx'] || '0', 10);\n height = parseInt(extentObj['@_cy'] || '0', 10);\n }\n\n // Extract effect extent\n const effectExtentObj = imageObj['wp:effectExtent'];\n let effectExtent = undefined;\n if (effectExtentObj) {\n effectExtent = {\n left: parseInt(effectExtentObj['@_l'] || '0', 10),\n top: parseInt(effectExtentObj['@_t'] || '0', 10),\n right: parseInt(effectExtentObj['@_r'] || '0', 10),\n bottom: parseInt(effectExtentObj['@_b'] || '0', 10),\n };\n }\n\n // --- Group A: Parse inline dist attributes ---\n let inlineDistT = 0;\n let inlineDistB = 0;\n let inlineDistL = 0;\n let inlineDistR = 0;\n if (inlineObj) {\n const toInt = (v: any) =>\n v !== undefined && v !== null ? parseInt(String(v), 10) || 0 : 0;\n inlineDistT = toInt(inlineObj['@_distT']);\n inlineDistB = toInt(inlineObj['@_distB']);\n inlineDistL = toInt(inlineObj['@_distL']);\n inlineDistR = toInt(inlineObj['@_distR']);\n }\n\n // Extract name, description, title, hidden, and ID from wp:docPr\n const docPrObj = imageObj['wp:docPr'];\n let name = 'image';\n let description = 'Image';\n let title: string | undefined = undefined;\n let docPrId = 1;\n let hidden = false;\n if (docPrObj) {\n name = docPrObj['@_name'] || 'image';\n description = docPrObj['@_descr'] || 'Image';\n if (docPrObj['@_title']) {\n title = String(docPrObj['@_title']);\n }\n const idAttr = docPrObj['@_id'];\n if (idAttr) {\n docPrId = parseInt(String(idAttr), 10);\n }\n // Group A: hidden attribute\n if (\n docPrObj['@_hidden'] === '1' ||\n docPrObj['@_hidden'] === 1 ||\n docPrObj['@_hidden'] === true\n ) {\n hidden = true;\n }\n }\n\n // --- Group A: Parse noChangeAspect from wp:cNvGraphicFramePr ---\n let noChangeAspect = true; // default\n const cNvGfPrObj = imageObj['wp:cNvGraphicFramePr'];\n if (cNvGfPrObj) {\n const gfLocks = cNvGfPrObj['a:graphicFrameLocks'];\n if (gfLocks) {\n const val = gfLocks['@_noChangeAspect'];\n noChangeAspect = val === '1' || val === 1 || val === true;\n }\n }\n\n // Parse wrap settings (for floating images)\n let wrap = undefined;\n if (isFloating) {\n wrap = this.parseWrapSettings(anchorObj);\n }\n\n // Parse position (for floating images)\n let position = undefined;\n if (isFloating) {\n position = this.parseImagePosition(anchorObj);\n }\n\n // Parse anchor configuration (for floating images)\n let anchor = undefined;\n if (isFloating && anchorObj) {\n const toBool = (val: any) => val === '1' || val === 1 || val === true;\n const toOptInt = (val: any): number | undefined => {\n if (val === undefined || val === null) return undefined;\n const n = parseInt(String(val), 10);\n return isNaN(n) ? undefined : n;\n };\n\n anchor = {\n behindDoc: toBool(anchorObj['@_behindDoc']),\n locked: toBool(anchorObj['@_locked']),\n layoutInCell: toBool(anchorObj['@_layoutInCell']),\n allowOverlap: toBool(anchorObj['@_allowOverlap']),\n relativeHeight: parseInt(anchorObj['@_relativeHeight'] || '251658240', 10),\n simplePos: toBool(anchorObj['@_simplePos']),\n distT: toOptInt(anchorObj['@_distT']),\n distB: toOptInt(anchorObj['@_distB']),\n distL: toOptInt(anchorObj['@_distL']),\n distR: toOptInt(anchorObj['@_distR']),\n };\n\n // Also check anchor hidden attribute\n if (\n anchorObj['@_hidden'] === '1' ||\n anchorObj['@_hidden'] === 1 ||\n anchorObj['@_hidden'] === true\n ) {\n hidden = true;\n }\n }\n\n // Navigate through the graphic structure to find the relationship ID\n const graphicObj = imageObj['a:graphic'];\n if (!graphicObj) return null;\n const graphicDataObj = graphicObj['a:graphicData'];\n if (!graphicDataObj) return null;\n const picPicObj = graphicDataObj['pic:pic'];\n if (!picPicObj) return null;\n const blipFillObj = picPicObj['pic:blipFill'];\n if (!blipFillObj) return null;\n const blipObj = blipFillObj['a:blip'];\n if (!blipObj) return null;\n\n // Parse crop settings\n const crop = this.parseImageCrop(blipFillObj);\n\n // Parse effects (includes transparency via a:alphaModFix)\n const effects = this.parseImageEffects(blipObj);\n\n // --- Group A: Parse blip attributes ---\n const compressionState = blipObj['@_cstate'] || 'none';\n\n // --- Group A: Parse blipFill attributes ---\n const blipFillDpi =\n blipFillObj['@_dpi'] !== undefined ? parseInt(String(blipFillObj['@_dpi']), 10) : undefined;\n let blipFillRotWithShape: boolean | undefined;\n if (blipFillObj['@_rotWithShape'] !== undefined) {\n const rws = blipFillObj['@_rotWithShape'];\n blipFillRotWithShape = rws === '1' || rws === 1 || rws === true;\n }\n\n // --- Group A: Parse pic:nvPicPr (non-visual properties and locks) ---\n const nvPicPrObj = picPicObj['pic:nvPicPr'];\n let picNonVisualProps = { id: '0', name: '', descr: '' };\n let picLocks: Record<string, boolean> = { noChangeAspect: true, noChangeArrowheads: true };\n if (nvPicPrObj) {\n const cNvPr = nvPicPrObj['pic:cNvPr'];\n if (cNvPr) {\n picNonVisualProps = {\n id: String(cNvPr['@_id'] ?? '0'),\n name: String(cNvPr['@_name'] ?? ''),\n descr: String(cNvPr['@_descr'] ?? ''),\n };\n }\n const cNvPicPr = nvPicPrObj['pic:cNvPicPr'];\n if (cNvPicPr) {\n const locks = cNvPicPr['a:picLocks'];\n if (locks) {\n picLocks = {};\n const lockAttrs = [\n 'noChangeAspect',\n 'noChangeArrowheads',\n 'noSelect',\n 'noMove',\n 'noResize',\n 'noEditPoints',\n 'noAdjustHandles',\n 'noRot',\n 'noChangeShapeType',\n 'noCrop',\n 'noGrp',\n ];\n for (const attr of lockAttrs) {\n const val = locks[`@_${attr}`];\n if (val === '1' || val === 1 || val === true) {\n picLocks[attr] = true;\n }\n }\n }\n }\n }\n\n // --- Group A & C: Parse pic:spPr (shape properties) ---\n const spPrObj = picPicObj['pic:spPr'];\n let border: any = undefined;\n let rotation = 0;\n let flipH = false;\n let flipV = false;\n let presetGeometry = 'rect';\n let bwMode = 'auto';\n if (spPrObj) {\n // Group A: bwMode\n if (spPrObj['@_bwMode']) {\n bwMode = String(spPrObj['@_bwMode']);\n }\n\n // Group A: presetGeometry\n const prstGeom = spPrObj['a:prstGeom'];\n if (prstGeom?.['@_prst']) {\n presetGeometry = String(prstGeom['@_prst']);\n }\n\n // Group C: Enhanced border parsing (a:ln)\n const lnObj = spPrObj['a:ln'];\n if (lnObj) {\n const widthEmu = parseInt(lnObj['@_w'] || '0', 10);\n if (widthEmu > 0) {\n border = { width: widthEmu / 12700 } as any;\n // Parse additional a:ln attributes\n if (lnObj['@_cap']) border.cap = String(lnObj['@_cap']);\n if (lnObj['@_cmpd']) border.compound = String(lnObj['@_cmpd']);\n if (lnObj['@_algn']) border.alignment = String(lnObj['@_algn']);\n // Parse fill\n const solidFill = lnObj['a:solidFill'];\n if (solidFill) {\n const srgbClr = solidFill['a:srgbClr'];\n const schemeClr = solidFill['a:schemeClr'];\n if (srgbClr) {\n border.fill = { type: 'srgbClr', value: String(srgbClr['@_val'] || '') };\n border.fill.modifiers = this.parseColorModifiers(srgbClr);\n } else if (schemeClr) {\n border.fill = { type: 'schemeClr', value: String(schemeClr['@_val'] || '') };\n border.fill.modifiers = this.parseColorModifiers(schemeClr);\n }\n } else {\n // Non-solid fill — store as raw XML passthrough\n const fillKeys = ['a:gradFill', 'a:pattFill', 'a:noFill'];\n for (const fk of fillKeys) {\n if (lnObj[fk]) {\n border.rawFillXml = this.objectToXml({ [fk]: lnObj[fk] });\n break;\n }\n }\n }\n // Parse dash pattern\n const prstDash = lnObj['a:prstDash'];\n if (prstDash?.['@_val']) border.dashPattern = String(prstDash['@_val']);\n // Parse join\n if (lnObj['a:round']) border.join = 'round';\n else if (lnObj['a:bevel']) border.join = 'bevel';\n else if (lnObj['a:miter']) {\n border.join = 'miter';\n if (lnObj['a:miter']['@_lim'])\n border.miterLimit = parseInt(String(lnObj['a:miter']['@_lim']), 10);\n }\n // Parse head/tail end\n if (lnObj['a:headEnd']) {\n border.headEnd = {};\n if (lnObj['a:headEnd']['@_type'])\n border.headEnd.type = String(lnObj['a:headEnd']['@_type']);\n if (lnObj['a:headEnd']['@_w'])\n border.headEnd.width = String(lnObj['a:headEnd']['@_w']);\n if (lnObj['a:headEnd']['@_len'])\n border.headEnd.length = String(lnObj['a:headEnd']['@_len']);\n }\n if (lnObj['a:tailEnd']) {\n border.tailEnd = {};\n if (lnObj['a:tailEnd']['@_type'])\n border.tailEnd.type = String(lnObj['a:tailEnd']['@_type']);\n if (lnObj['a:tailEnd']['@_w'])\n border.tailEnd.width = String(lnObj['a:tailEnd']['@_w']);\n if (lnObj['a:tailEnd']['@_len'])\n border.tailEnd.length = String(lnObj['a:tailEnd']['@_len']);\n }\n }\n }\n\n // Parse rotation and flip from a:xfrm\n const xfrmObj = spPrObj['a:xfrm'];\n if (xfrmObj?.['@_rot']) {\n rotation = parseInt(xfrmObj['@_rot'], 10) / 60000;\n }\n if (\n xfrmObj?.['@_flipH'] === '1' ||\n xfrmObj?.['@_flipH'] === 1 ||\n xfrmObj?.['@_flipH'] === true\n ) {\n flipH = true;\n }\n if (\n xfrmObj?.['@_flipV'] === '1' ||\n xfrmObj?.['@_flipV'] === 1 ||\n xfrmObj?.['@_flipV'] === true\n ) {\n flipV = true;\n }\n }\n\n // --- Linked vs embedded image (r:embed or r:link) ---\n let relationshipId = blipObj['@_r:embed'];\n let isLinked = false;\n if (!relationshipId) {\n relationshipId = blipObj['@_r:link'];\n if (relationshipId) {\n isLinked = true;\n } else {\n logger.debug('Drawing has no r:embed or r:link relationship ID');\n return null;\n }\n }\n\n // --- SVG detection: asvg:svgBlip in a:extLst ---\n let svgRelationshipId: string | undefined;\n const blipExtLst = blipObj['a:extLst'];\n if (blipExtLst) {\n const exts = Array.isArray(blipExtLst['a:ext'])\n ? blipExtLst['a:ext']\n : blipExtLst['a:ext']\n ? [blipExtLst['a:ext']]\n : [];\n for (const ext of exts) {\n const svgBlip = ext?.['asvg:svgBlip'];\n if (svgBlip?.['@_r:embed']) {\n svgRelationshipId = String(svgBlip['@_r:embed']);\n }\n }\n }\n\n // Get the image from the relationship\n const partContext = this.currentPartName ? ` (part: ${this.currentPartName})` : '';\n\n let imageData: Buffer;\n let imagePath: string;\n let originalFilename: string | undefined;\n\n if (isLinked) {\n // Linked image: no data in package, create empty buffer\n imageData = Buffer.alloc(0);\n imagePath = '';\n originalFilename = undefined;\n } else {\n const relationship = relationshipManager.getRelationship(relationshipId);\n if (!relationship) {\n logger.warn(`Image relationship not found: ${relationshipId}${partContext}`);\n return null;\n }\n const imageTarget = relationship.getTarget();\n if (!imageTarget) {\n logger.warn(`Image relationship has no target: ${relationshipId}${partContext}`);\n return null;\n }\n imagePath = `word/${imageTarget}`;\n const data = zipHandler.getFileAsBuffer(imagePath);\n if (!data) {\n logger.warn(`Image file not found in ZIP: ${imagePath}${partContext}`);\n return null;\n }\n imageData = data;\n originalFilename = imageTarget.split('/').pop();\n }\n\n logger.debug(\n `Parsing image: ${imagePath || '(linked)'}, relId: ${relationshipId}${partContext}`\n );\n\n // Create image from buffer with all properties\n const { Image: ImageClass } = await import('../elements/Image');\n const image = await ImageClass.create({\n source: imageData,\n width,\n height,\n name,\n description,\n title,\n effectExtent,\n wrap,\n position,\n anchor,\n crop,\n effects,\n border,\n rotation,\n flipH,\n flipV,\n presetGeometry,\n compressionState,\n bwMode,\n inlineDistT,\n inlineDistB,\n inlineDistL,\n inlineDistR,\n noChangeAspect,\n hidden,\n blipFillDpi,\n blipFillRotWithShape,\n picLocks,\n picNonVisualProps,\n isLinked,\n svgRelationshipId,\n });\n\n // --- Group B: Collect raw passthrough for unmodeled XML subtrees ---\n // Blip effects (children of a:blip that aren't modeled)\n const blipEffectsRaw = this.collectUnmodeledChildren(blipObj, [\n 'a:lum',\n 'a:grayscl',\n 'a:alphaModFix',\n 'a:extLst',\n ]);\n if (blipEffectsRaw) image._setRawPassthrough('blip-effects', blipEffectsRaw);\n\n // Blip extLst (must come last per schema)\n if (blipExtLst && !svgRelationshipId) {\n // Only pass through if we're not already handling SVG\n const extLstXml = this.objectToXml({ 'a:extLst': blipExtLst });\n if (extLstXml) image._setRawPassthrough('blip-extLst', extLstXml);\n } else if (blipExtLst && svgRelationshipId) {\n // Preserve the full extLst including SVG ref\n const extLstXml = this.objectToXml({ 'a:extLst': blipExtLst });\n if (extLstXml) image._setRawPassthrough('blip-extLst', extLstXml);\n }\n\n // BlipFill extras (a:tile instead of a:stretch)\n if (blipFillObj['a:tile']) {\n const tileXml = this.objectToXml({ 'a:tile': blipFillObj['a:tile'] });\n if (tileXml) image._setRawPassthrough('blipFill-extra', tileXml);\n }\n\n // Geometry passthrough (a:custGeom, or prstGeom with non-empty avLst)\n if (spPrObj) {\n if (spPrObj['a:custGeom']) {\n const geomXml = this.objectToXml({ 'a:custGeom': spPrObj['a:custGeom'] });\n if (geomXml) image._setRawPassthrough('geometry', geomXml);\n } else if (spPrObj['a:prstGeom']) {\n const prstGeom = spPrObj['a:prstGeom'];\n const avLst = prstGeom['a:avLst'];\n // Check if avLst has actual children (not just empty element)\n if (\n avLst &&\n typeof avLst === 'object' &&\n Object.keys(avLst).some((k) => !k.startsWith('@_') && k !== '_orderedChildren')\n ) {\n const geomXml = this.objectToXml({ 'a:prstGeom': prstGeom });\n if (geomXml) image._setRawPassthrough('geometry', geomXml);\n }\n }\n\n // spPr effects passthrough (effectLst, effectDag, scene3d, sp3d, extLst)\n const spPrEffects = this.collectUnmodeledChildren(spPrObj, [\n 'a:xfrm',\n 'a:prstGeom',\n 'a:custGeom',\n 'a:noFill',\n 'a:solidFill',\n 'a:ln',\n ]);\n if (spPrEffects) image._setRawPassthrough('spPr-effects', spPrEffects);\n }\n\n // Wrap polygon passthrough\n if (isFloating) {\n const wrapTypes = ['wp:wrapTight', 'wp:wrapThrough'];\n for (const wt of wrapTypes) {\n const wrapObj = anchorObj[wt];\n if (wrapObj?.['wp:wrapPolygon']) {\n const polyXml = this.objectToXml({ 'wp:wrapPolygon': wrapObj['wp:wrapPolygon'] });\n if (polyXml) image._setRawPassthrough('wrap-polygon', polyXml);\n break;\n }\n }\n\n // Anchor extras (wp14:sizeRelH, wp14:sizeRelV)\n const anchorExtras = this.collectUnmodeledChildren(anchorObj, [\n 'wp:simplePos',\n 'wp:positionH',\n 'wp:positionV',\n 'wp:extent',\n 'wp:effectExtent',\n 'wp:wrapSquare',\n 'wp:wrapTight',\n 'wp:wrapThrough',\n 'wp:wrapTopAndBottom',\n 'wp:wrapNone',\n 'wp:docPr',\n 'wp:cNvGraphicFramePr',\n 'a:graphic',\n ]);\n if (anchorExtras) image._setRawPassthrough('anchor-extra', anchorExtras);\n }\n\n // DocPr extras (a:hlinkClick, a:hlinkHover, a:extLst)\n if (docPrObj) {\n const docPrExtras = this.collectUnmodeledChildren(docPrObj, []);\n if (docPrExtras) image._setRawPassthrough('docPr-extra', docPrExtras);\n }\n\n // cNvPr extras from pic:nvPicPr > pic:cNvPr\n if (nvPicPrObj?.['pic:cNvPr']) {\n const cNvPrExtras = this.collectUnmodeledChildren(nvPicPrObj['pic:cNvPr'], []);\n if (cNvPrExtras) image._setRawPassthrough('cNvPr-extra', cNvPrExtras);\n }\n\n // Register image\n if (!isLinked) {\n imageManager.registerImage(image, relationshipId, originalFilename, this.currentPartName);\n }\n image.setRelationshipId(relationshipId);\n image.setDocPrId(docPrId);\n\n logger.debug(\n `Image registered: ${originalFilename || '(linked)'}, relId: ${relationshipId}${partContext}`\n );\n\n return new ImageRun(image);\n } catch (error: unknown) {\n const partContext = this.currentPartName ? ` (part: ${this.currentPartName})` : '';\n logger.warn(\n `Failed to parse drawing${partContext}:`,\n error instanceof Error\n ? { message: error.message, stack: error.stack }\n : { error: String(error) }\n );\n return null;\n }\n }\n\n /**\n * Parses text wrap settings from anchor object\n * @private\n */\n private parseWrapSettings(anchorObj: any): any {\n // Check for different wrap types\n const wrapSquare = anchorObj['wp:wrapSquare'];\n const wrapTight = anchorObj['wp:wrapTight'];\n const wrapThrough = anchorObj['wp:wrapThrough'];\n const wrapTopBottom = anchorObj['wp:wrapTopAndBottom'];\n const wrapNone = anchorObj['wp:wrapNone'];\n\n const wrapObj = wrapSquare || wrapTight || wrapThrough || wrapTopBottom || wrapNone;\n if (!wrapObj) {\n return undefined;\n }\n\n // Determine wrap type\n let type: any = 'square';\n if (wrapTight) type = 'tight';\n else if (wrapThrough) type = 'through';\n else if (wrapTopBottom) type = 'topAndBottom';\n else if (wrapNone) type = 'none';\n\n return {\n type,\n side: wrapObj['@_wrapText'] || 'bothSides',\n // Distance attributes are on the wrap element, not the anchor\n distanceTop: wrapObj['@_distT'] ? parseInt(wrapObj['@_distT'], 10) : undefined,\n distanceBottom: wrapObj['@_distB'] ? parseInt(wrapObj['@_distB'], 10) : undefined,\n distanceLeft: wrapObj['@_distL'] ? parseInt(wrapObj['@_distL'], 10) : undefined,\n distanceRight: wrapObj['@_distR'] ? parseInt(wrapObj['@_distR'], 10) : undefined,\n };\n }\n\n /**\n * Parses image position from anchor object\n * @private\n */\n private parseImagePosition(anchorObj: any): any {\n const posH = anchorObj['wp:positionH'];\n const posV = anchorObj['wp:positionV'];\n\n if (!posH || !posV) {\n return undefined;\n }\n\n // Parse horizontal position\n const horizontal: any = {\n anchor: posH['@_relativeFrom'] || 'page',\n };\n\n if (posH['wp:posOffset']) {\n const offsetText = Array.isArray(posH['wp:posOffset'])\n ? posH['wp:posOffset'][0]\n : posH['wp:posOffset'];\n horizontal.offset = parseInt(\n typeof offsetText === 'string' ? offsetText : offsetText?.['#text'] || '0',\n 10\n );\n } else if (posH['wp:align']) {\n const alignText = Array.isArray(posH['wp:align']) ? posH['wp:align'][0] : posH['wp:align'];\n horizontal.alignment = typeof alignText === 'string' ? alignText : alignText?.['#text'];\n }\n\n // Parse vertical position\n const vertical: any = {\n anchor: posV['@_relativeFrom'] || 'page',\n };\n\n if (posV['wp:posOffset']) {\n const offsetText = Array.isArray(posV['wp:posOffset'])\n ? posV['wp:posOffset'][0]\n : posV['wp:posOffset'];\n vertical.offset = parseInt(\n typeof offsetText === 'string' ? offsetText : offsetText?.['#text'] || '0',\n 10\n );\n } else if (posV['wp:align']) {\n const alignText = Array.isArray(posV['wp:align']) ? posV['wp:align'][0] : posV['wp:align'];\n vertical.alignment = typeof alignText === 'string' ? alignText : alignText?.['#text'];\n }\n\n return { horizontal, vertical };\n }\n\n /**\n * Parses image crop from blip object\n * @private\n */\n private parseImageCrop(blipObj: any): any {\n const srcRect = blipObj['a:srcRect'];\n if (!srcRect) {\n return undefined;\n }\n\n return {\n left: parseInt(srcRect['@_l'] || '0', 10) / 1000, // Convert from per-mille to percentage\n top: parseInt(srcRect['@_t'] || '0', 10) / 1000,\n right: parseInt(srcRect['@_r'] || '0', 10) / 1000,\n bottom: parseInt(srcRect['@_b'] || '0', 10) / 1000,\n };\n }\n\n /**\n * Parses image effects from blip object\n * Per ECMA-376, effects are direct children of a:blip (not in a:extLst)\n * @private\n */\n private parseImageEffects(blipObj: any): any {\n const effects: any = {};\n\n // Look for lum (luminance) element for brightness/contrast\n // Per ECMA-376: a:lum is a direct child of a:blip with bright/contrast attributes\n const lum = blipObj['a:lum'];\n if (lum) {\n if (lum['@_bright']) {\n effects.brightness = parseInt(lum['@_bright'], 10) / 1000;\n }\n if (lum['@_contrast']) {\n effects.contrast = parseInt(lum['@_contrast'], 10) / 1000;\n }\n }\n\n // Check for grayscale (direct child of a:blip)\n if (blipObj['a:grayscl']) {\n effects.grayscale = true;\n }\n\n // Parse transparency via a:alphaModFix (ECMA-376 §20.1.8.4)\n const alphaModFix = blipObj['a:alphaModFix'];\n if (alphaModFix?.['@_amt'] !== undefined) {\n // amt is in 1/1000ths of percent (e.g., 50000 = 50% opacity = 50% transparency)\n const amt = parseInt(String(alphaModFix['@_amt']), 10);\n const transparency = Math.round(100 - amt / 1000);\n if (transparency > 0) {\n effects.transparency = transparency;\n }\n }\n\n return Object.keys(effects).length > 0 ? effects : undefined;\n }\n\n /**\n * Collects unmodeled children from a parsed XML object as raw XML strings.\n * Used for Group B passthrough — preserves XML subtrees that the framework\n * doesn't model, preventing data loss during round-trip.\n * @private\n */\n private collectUnmodeledChildren(parentObj: any, modeledKeys: string[]): string | null {\n if (!parentObj || typeof parentObj !== 'object') return null;\n const parts: string[] = [];\n for (const key of Object.keys(parentObj)) {\n if (key.startsWith('@_') || key === '#text' || key === '_orderedChildren') continue;\n if (modeledKeys.includes(key)) continue;\n const child = parentObj[key];\n if (Array.isArray(child)) {\n for (const item of child) {\n parts.push(this.objectToXml({ [key]: item }));\n }\n } else {\n parts.push(this.objectToXml({ [key]: child }));\n }\n }\n return parts.length > 0 ? parts.join('') : null;\n }\n\n /**\n * Parses color modifier children from a color element (a:srgbClr or a:schemeClr).\n * Returns array of { name, val } for modifiers like lumMod, lumOff, satMod, etc.\n * @private\n */\n private parseColorModifiers(colorObj: any): { name: string; val: string }[] | undefined {\n if (!colorObj || typeof colorObj !== 'object') return undefined;\n const modifiers: { name: string; val: string }[] = [];\n const modNames = ['a:lumMod', 'a:lumOff', 'a:satMod', 'a:shade', 'a:tint', 'a:alpha'];\n for (const mod of modNames) {\n const modObj = colorObj[mod];\n if (modObj?.['@_val'] !== undefined) {\n modifiers.push({ name: mod.replace('a:', ''), val: String(modObj['@_val']) });\n }\n }\n return modifiers.length > 0 ? modifiers : undefined;\n }\n\n /**\n * Parse a single border element from a parsed XML object.\n * Shared by table border and cell border parsing.\n */\n private parseBorderElement(borderObj: any): TableBorder | undefined {\n if (!borderObj) return undefined;\n const border: TableBorder = {\n style: (borderObj['@_w:val'] || 'single') as TableBorder['style'],\n };\n if (borderObj['@_w:sz'] !== undefined) border.size = safeParseInt(borderObj['@_w:sz']);\n if (borderObj['@_w:space'] !== undefined) border.space = safeParseInt(borderObj['@_w:space']);\n if (borderObj['@_w:color']) border.color = borderObj['@_w:color'];\n return border;\n }\n\n private async parseTableFromObject(\n tableObj: any,\n relationshipManager: RelationshipManager,\n zipHandler: ZipHandler,\n imageManager: ImageManager,\n rawTableXml?: string\n ): Promise<Table | null> {\n try {\n // Create empty table\n const table = new Table();\n\n // Parse table properties (w:tblPr)\n if (tableObj['w:tblPr']) {\n this.parseTablePropertiesFromObject(tableObj['w:tblPr'], table);\n }\n\n // Parse table grid (w:tblGrid) - column widths\n if (tableObj['w:tblGrid']?.['w:gridCol']) {\n const gridCols = tableObj['w:tblGrid']['w:gridCol'];\n const gridColArray = Array.isArray(gridCols) ? gridCols : [gridCols];\n const widths = gridColArray.map((col: any) => {\n const w = col['@_w:w'];\n // Use isExplicitlySet to properly handle 0 values\n return isExplicitlySet(w) ? safeParseInt(w, 2880) : 2880; // default to 2 inches\n });\n if (widths.length > 0) {\n table.setTableGrid(widths);\n }\n }\n\n // Parse table rows (w:tr)\n const rows = tableObj['w:tr'];\n const rowChildren = Array.isArray(rows) ? rows : rows ? [rows] : [];\n\n // Extract row XMLs from raw table XML if available\n let rowXmls: string[] = [];\n if (rawTableXml) {\n rowXmls = XMLParser.extractElements(rawTableXml, 'w:tr');\n }\n\n // Track row positions in raw XML for bookmarkEnd extraction between rows\n const rowPositions: { start: number; end: number }[] = [];\n if (rawTableXml) {\n let searchPos = 0;\n for (const rowXml of rowXmls) {\n const rowStart = rawTableXml.indexOf(rowXml, searchPos);\n if (rowStart !== -1) {\n rowPositions.push({\n start: rowStart,\n end: rowStart + rowXml.length,\n });\n searchPos = rowStart + rowXml.length;\n }\n }\n }\n\n for (let i = 0; i < rowChildren.length; i++) {\n const rowObj = rowChildren[i];\n const rawRowXml = i < rowXmls.length ? rowXmls[i] : undefined;\n\n const row = await this.parseTableRowFromObject(\n rowObj,\n relationshipManager,\n zipHandler,\n imageManager,\n rawRowXml\n );\n if (row) {\n table.addRow(row);\n\n // Check for bookmarkEnd elements AFTER this row (between rows)\n if (rawTableXml && i < rowPositions.length) {\n const currentRowEnd = rowPositions[i]?.end || 0;\n const nextRowStart =\n i + 1 < rowPositions.length ? rowPositions[i + 1]?.start : rawTableXml.length;\n\n if (nextRowStart && currentRowEnd < nextRowStart) {\n const betweenContent = rawTableXml.slice(currentRowEnd, nextRowStart);\n const bookmarkEnds = this.extractBookmarkEndsFromContent(betweenContent);\n\n if (bookmarkEnds.length > 0) {\n // Attach to last paragraph in last cell of this row\n const cells = row.getCells();\n const lastCell = cells[cells.length - 1];\n if (lastCell) {\n const paras = lastCell.getParagraphs();\n const lastPara = paras[paras.length - 1];\n if (lastPara) {\n for (const bookmark of bookmarkEnds) {\n lastPara.addBookmarkEnd(bookmark);\n }\n }\n }\n }\n }\n }\n }\n }\n\n // Note: StylesManager is injected by Document.parseDocument() after styles are loaded\n\n return table;\n } catch (error: unknown) {\n defaultLogger.warn(\n '[DocumentParser] Failed to parse table:',\n error instanceof Error\n ? { message: error.message, stack: error.stack }\n : { error: String(error) }\n );\n return null;\n }\n }\n\n /**\n * Parses table properties from XML object and applies to table\n */\n private parseTablePropertiesFromObject(tblPrObj: any, table: Table): void {\n if (!tblPrObj) return;\n\n // Parse table style reference (w:tblStyle)\n if (tblPrObj['w:tblStyle']) {\n const styleId = tblPrObj['w:tblStyle']['@_w:val'];\n if (styleId) {\n table.setStyle(styleId);\n }\n }\n\n // Parse table look flags (w:tblLook) - for conditional formatting\n // Supports both hex string format (w:val=\"04A0\") and individual attributes\n if (tblPrObj['w:tblLook']) {\n const look = tblPrObj['w:tblLook'];\n if (look['@_w:val']) {\n // Hex string format\n table.setTblLook(look['@_w:val']);\n } else {\n // Individual attribute format - construct hex value\n // Per ECMA-376: bit 0=firstRow, 1=lastRow, 2=firstCol, 3=lastCol, 4=noHBand, 5=noVBand\n let value = 0;\n if (look['@_w:firstRow'] === '1') value |= 0x0020;\n if (look['@_w:lastRow'] === '1') value |= 0x0040;\n if (look['@_w:firstColumn'] === '1') value |= 0x0080;\n if (look['@_w:lastColumn'] === '1') value |= 0x0100;\n if (look['@_w:noHBand'] === '1') value |= 0x0200;\n if (look['@_w:noVBand'] === '1') value |= 0x0400;\n table.setTblLook(value.toString(16).toUpperCase().padStart(4, '0'));\n }\n }\n\n // Parse table positioning (tblpPr) - for floating tables\n if (tblPrObj['w:tblpPr']) {\n const tblpPr = tblPrObj['w:tblpPr'];\n const position: any = {};\n\n if (tblpPr['@_w:tblpX']) position.x = parseInt(tblpPr['@_w:tblpX'], 10);\n if (tblpPr['@_w:tblpY']) position.y = parseInt(tblpPr['@_w:tblpY'], 10);\n if (tblpPr['@_w:horzAnchor']) position.horizontalAnchor = tblpPr['@_w:horzAnchor'];\n if (tblpPr['@_w:vertAnchor']) position.verticalAnchor = tblpPr['@_w:vertAnchor'];\n if (tblpPr['@_w:tblpXSpec']) position.horizontalAlignment = tblpPr['@_w:tblpXSpec'];\n if (tblpPr['@_w:tblpYSpec']) position.verticalAlignment = tblpPr['@_w:tblpYSpec'];\n if (tblpPr['@_w:leftFromText'])\n position.leftFromText = parseInt(tblpPr['@_w:leftFromText'], 10);\n if (tblpPr['@_w:rightFromText'])\n position.rightFromText = parseInt(tblpPr['@_w:rightFromText'], 10);\n if (tblpPr['@_w:topFromText']) position.topFromText = parseInt(tblpPr['@_w:topFromText'], 10);\n if (tblpPr['@_w:bottomFromText'])\n position.bottomFromText = parseInt(tblpPr['@_w:bottomFromText'], 10);\n\n if (Object.keys(position).length > 0) {\n table.setPosition(position);\n }\n }\n\n // Parse table overlap\n if (tblPrObj['w:tblOverlap']) {\n const val = tblPrObj['w:tblOverlap']['@_w:val'];\n table.setOverlap(val === 'overlap');\n }\n\n // Parse bidirectional visual layout\n if (tblPrObj['w:bidiVisual']) {\n table.setBidiVisual(true);\n }\n\n // Parse table width — always set when w:tblW is present, including w:w=\"0\" w:type=\"auto\"\n // (auto-sized tables). Skipping w:w=\"0\" would leave the constructor default (9360/dxa),\n // causing tblPrChange snapshots to capture wrong \"previous\" width values.\n if (tblPrObj['w:tblW']) {\n const width = safeParseInt(tblPrObj['w:tblW']['@_w:w'], 0);\n const widthType = tblPrObj['w:tblW']['@_w:type'] || 'dxa';\n table.setWidth(width);\n table.setWidthType(widthType);\n }\n\n // Parse table caption\n if (tblPrObj['w:tblCaption']) {\n const caption = tblPrObj['w:tblCaption']['@_w:val'];\n if (caption) table.setCaption(caption);\n }\n\n // Parse table description\n if (tblPrObj['w:tblDescription']) {\n const description = tblPrObj['w:tblDescription']['@_w:val'];\n if (description) table.setDescription(description);\n }\n\n // Parse cell spacing\n if (tblPrObj['w:tblCellSpacing']) {\n const spacing = parseInt(tblPrObj['w:tblCellSpacing']['@_w:w'] || '0', 10);\n const spacingType = tblPrObj['w:tblCellSpacing']['@_w:type'] || 'dxa';\n if (spacing > 0) {\n table.setCellSpacing(spacing);\n table.setCellSpacingType(spacingType);\n }\n }\n\n // Parse table layout (w:tblLayout) per ECMA-376 Part 1 §17.4.52\n if (tblPrObj['w:tblLayout']) {\n const layoutType = tblPrObj['w:tblLayout']['@_w:type'];\n if (layoutType) {\n table.setLayout(layoutType);\n }\n }\n\n // Parse table indentation (w:tblInd) per ECMA-376 Part 1 §17.4.43\n if (tblPrObj['w:tblInd']) {\n const indentVal = safeParseInt(tblPrObj['w:tblInd']['@_w:w'], 0);\n table.setIndent(indentVal);\n }\n\n // Parse table cell margins (w:tblCellMar) per ECMA-376 Part 1 §17.4.42\n if (tblPrObj['w:tblCellMar']) {\n const cellMar = tblPrObj['w:tblCellMar'];\n const margins: { top?: number; bottom?: number; left?: number; right?: number } = {};\n\n if (cellMar['w:top']) {\n const w = cellMar['w:top']['@_w:w'];\n if (w !== undefined) margins.top = parseInt(w, 10);\n }\n if (cellMar['w:bottom']) {\n const w = cellMar['w:bottom']['@_w:w'];\n if (w !== undefined) margins.bottom = parseInt(w, 10);\n }\n if (cellMar['w:left']) {\n const w = cellMar['w:left']['@_w:w'];\n if (w !== undefined) margins.left = parseInt(w, 10);\n }\n if (cellMar['w:right']) {\n const w = cellMar['w:right']['@_w:w'];\n if (w !== undefined) margins.right = parseInt(w, 10);\n }\n\n if (Object.keys(margins).length > 0) {\n table.setCellMargins(margins);\n }\n }\n\n // Parse table alignment (w:jc) - IMPORTANT for preserving table centering\n if (tblPrObj['w:jc']) {\n const alignment = tblPrObj['w:jc']['@_w:val'];\n if (alignment) {\n table.setAlignment(alignment as 'left' | 'center' | 'right');\n }\n }\n\n // Parse table style row band size (w:tblStyleRowBandSize) per ECMA-376 Part 1 §17.4.52\n if (tblPrObj['w:tblStyleRowBandSize']) {\n const val = parseInt(tblPrObj['w:tblStyleRowBandSize']['@_w:val'] || '0', 10);\n if (val > 0) {\n table.setStyleRowBandSize(val);\n }\n }\n\n // Parse table style column band size (w:tblStyleColBandSize) per ECMA-376 Part 1 §17.4.51\n if (tblPrObj['w:tblStyleColBandSize']) {\n const val = parseInt(tblPrObj['w:tblStyleColBandSize']['@_w:val'] || '0', 10);\n if (val > 0) {\n table.setStyleColBandSize(val);\n }\n }\n\n // Parse table shading (w:shd) per ECMA-376 Part 1 §17.4.56\n if (tblPrObj['w:shd']) {\n const shading = this.parseShadingFromObj(tblPrObj['w:shd']);\n if (shading) {\n table.setShading(shading);\n }\n }\n\n // Parse table borders (w:tblBorders) per ECMA-376 Part 1 §17.4.40\n if (tblPrObj['w:tblBorders']) {\n const bordersObj = tblPrObj['w:tblBorders'];\n const borders: import('../elements/Table').TableBorders = {};\n\n if (bordersObj['w:top']) borders.top = this.parseBorderElement(bordersObj['w:top']);\n if (bordersObj['w:bottom']) borders.bottom = this.parseBorderElement(bordersObj['w:bottom']);\n if (bordersObj['w:left']) borders.left = this.parseBorderElement(bordersObj['w:left']);\n if (bordersObj['w:right']) borders.right = this.parseBorderElement(bordersObj['w:right']);\n if (bordersObj['w:insideH'])\n borders.insideH = this.parseBorderElement(bordersObj['w:insideH']);\n if (bordersObj['w:insideV'])\n borders.insideV = this.parseBorderElement(bordersObj['w:insideV']);\n\n if (Object.keys(borders).length > 0) {\n table.setBorders(borders);\n }\n }\n\n // Parse table property change (w:tblPrChange) per ECMA-376 Part 1 §17.13.5.36\n if (tblPrObj['w:tblPrChange']) {\n const changeObj = tblPrObj['w:tblPrChange'];\n table.setTblPrChange({\n id: String(changeObj['@_w:id'] || '0'),\n author: changeObj['@_w:author'] || '',\n date: changeObj['@_w:date'] || '',\n previousProperties: this.parseGenericPreviousProperties(changeObj['w:tblPr']),\n });\n }\n }\n\n private async parseTableRowFromObject(\n rowObj: any,\n relationshipManager: RelationshipManager,\n zipHandler: ZipHandler,\n imageManager: ImageManager,\n rawRowXml?: string\n ): Promise<TableRow | null> {\n try {\n // Create empty row\n const row = new TableRow();\n\n // Parse row properties (w:trPr) per ECMA-376 Part 1 §17.4.82\n const trPr = rowObj['w:trPr'];\n if (trPr) {\n this.parseTableRowPropertiesFromObject(trPr, row);\n }\n\n // Parse table property exceptions (w:tblPrEx) per ECMA-376 Part 1 §17.4.61\n const tblPrEx = rowObj['w:tblPrEx'];\n if (tblPrEx) {\n const exceptions = this.parseTablePropertyExceptionsFromObject(tblPrEx);\n if (exceptions) {\n row.setTablePropertyExceptions(exceptions);\n }\n }\n\n // Parse table cells (w:tc)\n const cells = rowObj['w:tc'];\n const cellChildren = Array.isArray(cells) ? cells : cells ? [cells] : [];\n\n // Extract cell XMLs from raw row XML if available\n let cellXmls: string[] = [];\n if (rawRowXml) {\n cellXmls = XMLParser.extractElements(rawRowXml, 'w:tc');\n }\n\n for (let i = 0; i < cellChildren.length; i++) {\n const cellObj = cellChildren[i];\n const rawCellXml = i < cellXmls.length ? cellXmls[i] : undefined;\n\n const cell = await this.parseTableCellFromObject(\n cellObj,\n relationshipManager,\n zipHandler,\n imageManager,\n rawCellXml\n );\n if (cell) {\n row.addCell(cell);\n }\n }\n\n return row;\n } catch (error: unknown) {\n defaultLogger.warn(\n '[DocumentParser] Failed to parse table row:',\n error instanceof Error\n ? { message: error.message, stack: error.stack }\n : { error: String(error) }\n );\n return null;\n }\n }\n\n /**\n * Parses table row properties from XML object and applies to row\n * Per ECMA-376 Part 1 §17.4.82 (w:trPr - Table Row Properties)\n */\n private parseTableRowPropertiesFromObject(trPrObj: any, row: TableRow): void {\n if (!trPrObj) return;\n\n // Parse row height (w:trHeight) per ECMA-376 Part 1 §17.4.81\n if (trPrObj['w:trHeight']) {\n const heightVal = parseInt(trPrObj['w:trHeight']['@_w:val'] || '0', 10);\n const heightRule = trPrObj['w:trHeight']['@_w:hRule'] || 'atLeast';\n if (heightVal > 0) {\n row.setHeight(heightVal, heightRule);\n }\n }\n\n // Parse table header row (w:tblHeader) per ECMA-376 Part 1 §17.4.49\n if (trPrObj['w:tblHeader']) {\n row.setHeader(true);\n }\n\n // Parse can't split (w:cantSplit) per ECMA-376 Part 1 §17.4.5\n if (trPrObj['w:cantSplit']) {\n row.setCantSplit(true);\n }\n\n // Parse row justification (w:jc) per ECMA-376 Part 1 §17.4.79\n if (trPrObj['w:jc']) {\n const val = trPrObj['w:jc']['@_w:val'];\n if (val) {\n row.setJustification(val);\n }\n }\n\n // Parse hidden (w:hidden) per ECMA-376 Part 1 §17.4.23\n if (trPrObj['w:hidden']) {\n row.setHidden(true);\n }\n\n // Parse grid before (w:gridBefore) per ECMA-376 Part 1 §17.4.15\n if (trPrObj['w:gridBefore']) {\n const val = parseInt(trPrObj['w:gridBefore']['@_w:val'] || '0', 10);\n if (val > 0) {\n row.setGridBefore(val);\n }\n }\n\n // Parse grid after (w:gridAfter) per ECMA-376 Part 1 §17.4.14\n if (trPrObj['w:gridAfter']) {\n const val = parseInt(trPrObj['w:gridAfter']['@_w:val'] || '0', 10);\n if (val > 0) {\n row.setGridAfter(val);\n }\n }\n\n // Parse width before (w:wBefore) per ECMA-376 Part 1 §17.4.83\n if (trPrObj['w:wBefore']) {\n const w = parseInt(trPrObj['w:wBefore']['@_w:w'] || '0', 10);\n const type = trPrObj['w:wBefore']['@_w:type'] || 'dxa';\n if (w > 0) {\n row.setWBefore(w, type);\n }\n }\n\n // Parse width after (w:wAfter) per ECMA-376 Part 1 §17.4.82\n if (trPrObj['w:wAfter']) {\n const w = parseInt(trPrObj['w:wAfter']['@_w:w'] || '0', 10);\n const type = trPrObj['w:wAfter']['@_w:type'] || 'dxa';\n if (w > 0) {\n row.setWAfter(w, type);\n }\n }\n\n // Parse row-level cell spacing (w:tblCellSpacing)\n if (trPrObj['w:tblCellSpacing']) {\n const w = parseInt(trPrObj['w:tblCellSpacing']['@_w:w'] || '0', 10);\n const type = trPrObj['w:tblCellSpacing']['@_w:type'] || 'dxa';\n if (w > 0) {\n row.setRowCellSpacing(w, type);\n }\n }\n\n // Parse conditional formatting (w:cnfStyle) per ECMA-376 Part 1 §17.3.1.8\n if (trPrObj['w:cnfStyle']) {\n const val = trPrObj['w:cnfStyle']['@_w:val'];\n if (val) {\n row.setCnfStyle(val);\n }\n }\n\n // Parse divId (w:divId) per ECMA-376 Part 1 §17.4.9\n if (trPrObj['w:divId']) {\n const val = parseInt(trPrObj['w:divId']['@_w:val'] || '0', 10);\n if (val > 0) {\n row.setDivId(val);\n }\n }\n\n // Parse table row property change (w:trPrChange) per ECMA-376 Part 1 §17.13.5.38\n if (trPrObj['w:trPrChange']) {\n const changeObj = trPrObj['w:trPrChange'];\n row.setTrPrChange({\n id: String(changeObj['@_w:id'] || '0'),\n author: changeObj['@_w:author'] || '',\n date: changeObj['@_w:date'] || '',\n previousProperties: this.parseGenericPreviousProperties(changeObj['w:trPr']),\n });\n }\n }\n\n /**\n * Parses table property exceptions from row XML object\n * Per ECMA-376 Part 1 §17.4.61 (w:tblPrEx)\n * @private\n */\n private parseTablePropertyExceptionsFromObject(tblPrExObj: any): any {\n if (!tblPrExObj) return undefined;\n\n const exceptions: any = {};\n\n // Parse table width exception (w:tblW)\n if (tblPrExObj['w:tblW']) {\n const widthVal = parseInt(tblPrExObj['w:tblW']['@_w:w'] || '0', 10);\n if (widthVal > 0) {\n exceptions.width = widthVal;\n }\n }\n\n // Parse table justification exception (w:jc)\n if (tblPrExObj['w:jc']) {\n const val = tblPrExObj['w:jc']['@_w:val'];\n if (val) {\n exceptions.justification = val;\n }\n }\n\n // Parse cell spacing exception (w:tblCellSpacing)\n if (tblPrExObj['w:tblCellSpacing']) {\n const val = parseInt(tblPrExObj['w:tblCellSpacing']['@_w:w'] || '0', 10);\n if (val > 0) {\n exceptions.cellSpacing = val;\n }\n }\n\n // Parse table indentation exception (w:tblInd)\n if (tblPrExObj['w:tblInd']) {\n const val = parseInt(tblPrExObj['w:tblInd']['@_w:w'] || '0', 10);\n if (val > 0) {\n exceptions.indentation = val;\n }\n }\n\n // Parse table borders exception (w:tblBorders)\n if (tblPrExObj['w:tblBorders']) {\n exceptions.borders = this.parseTableBordersFromObject(tblPrExObj['w:tblBorders']);\n }\n\n // Parse shading exception (w:shd)\n if (tblPrExObj['w:shd']) {\n const shading = this.parseShadingFromObj(tblPrExObj['w:shd']);\n if (shading) {\n exceptions.shading = shading;\n }\n }\n\n return Object.keys(exceptions).length > 0 ? exceptions : undefined;\n }\n\n /**\n * Parses table borders from XML object\n * @private\n */\n private parseTableBordersFromObject(bordersObj: any): any {\n if (!bordersObj) return undefined;\n\n const borders: any = {};\n const borderNames = ['top', 'bottom', 'left', 'right', 'insideH', 'insideV'];\n\n for (const name of borderNames) {\n const borderKey = `w:${name}`;\n if (bordersObj[borderKey]) {\n const borderObj = bordersObj[borderKey];\n borders[name] = {};\n\n if (borderObj['@_w:val']) borders[name].style = borderObj['@_w:val'];\n if (borderObj['@_w:sz']) borders[name].size = parseInt(borderObj['@_w:sz'], 10);\n if (borderObj['@_w:space']) borders[name].space = parseInt(borderObj['@_w:space'], 10);\n if (borderObj['@_w:color']) borders[name].color = borderObj['@_w:color'];\n }\n }\n\n return Object.keys(borders).length > 0 ? borders : undefined;\n }\n\n private async parseTableCellFromObject(\n cellObj: any,\n relationshipManager: RelationshipManager,\n zipHandler: ZipHandler,\n imageManager: ImageManager,\n rawCellXml?: string\n ): Promise<TableCell | null> {\n try {\n // Create empty cell\n const cell = new TableCell();\n\n // Parse cell properties (w:tcPr) per ECMA-376 Part 1 §17.4.42\n const tcPr = cellObj['w:tcPr'];\n if (tcPr) {\n // Parse cell width (w:tcW) with type per ECMA-376 Part 1 §17.4.81\n if (tcPr['w:tcW']) {\n const widthVal = parseInt(tcPr['w:tcW']['@_w:w'] || '0', 10);\n const widthType = tcPr['w:tcW']['@_w:type'] || 'dxa';\n if (widthVal > 0 || widthType === 'auto') {\n cell.setWidthType(widthVal, widthType);\n }\n }\n\n // Parse conditional style (w:cnfStyle) per ECMA-376 Part 1 §17.4.7\n if (tcPr['w:cnfStyle']) {\n const cnfStyle = tcPr['w:cnfStyle']['@_w:val'];\n if (cnfStyle) {\n cell.setConditionalStyle(cnfStyle);\n }\n }\n\n // Parse cell borders (w:tcBorders)\n if (tcPr['w:tcBorders']) {\n const bordersObj = tcPr['w:tcBorders'];\n const borders: any = {};\n\n if (bordersObj['w:top']) borders.top = this.parseBorderElement(bordersObj['w:top']);\n if (bordersObj['w:bottom'])\n borders.bottom = this.parseBorderElement(bordersObj['w:bottom']);\n if (bordersObj['w:left']) borders.left = this.parseBorderElement(bordersObj['w:left']);\n if (bordersObj['w:right']) borders.right = this.parseBorderElement(bordersObj['w:right']);\n if (bordersObj['w:tl2br']) borders.tl2br = this.parseBorderElement(bordersObj['w:tl2br']);\n if (bordersObj['w:tr2bl']) borders.tr2bl = this.parseBorderElement(bordersObj['w:tr2bl']);\n\n if (Object.keys(borders).length > 0) {\n cell.setBorders(borders);\n }\n }\n\n // Parse cell shading (w:shd)\n if (tcPr['w:shd']) {\n const shading = this.parseShadingFromObj(tcPr['w:shd']);\n if (shading) {\n cell.setShading(shading);\n }\n }\n\n // Parse cell margins (w:tcMar) per ECMA-376 Part 1 §17.4.43\n if (tcPr['w:tcMar']) {\n const tcMar = tcPr['w:tcMar'];\n const margins: any = {};\n\n if (tcMar['w:top']) {\n margins.top = parseInt(tcMar['w:top']['@_w:w'] || '0', 10);\n }\n if (tcMar['w:bottom']) {\n margins.bottom = parseInt(tcMar['w:bottom']['@_w:w'] || '0', 10);\n }\n if (tcMar['w:left']) {\n margins.left = parseInt(tcMar['w:left']['@_w:w'] || '0', 10);\n }\n if (tcMar['w:right']) {\n margins.right = parseInt(tcMar['w:right']['@_w:w'] || '0', 10);\n }\n\n if (Object.keys(margins).length > 0) {\n cell.setMargins(margins);\n }\n }\n\n // Parse vertical alignment (w:vAlign)\n if (tcPr['w:vAlign']) {\n const valign = tcPr['w:vAlign']['@_w:val'];\n if (valign && (valign === 'top' || valign === 'center' || valign === 'bottom')) {\n cell.setVerticalAlignment(valign);\n }\n }\n\n // Parse column span (w:gridSpan)\n if (tcPr['w:gridSpan']) {\n const span = parseInt(tcPr['w:gridSpan']['@_w:val'] || '1', 10);\n if (span > 1) {\n cell.setColumnSpan(span);\n }\n }\n\n // Parse text direction (w:textDirection) per ECMA-376 Part 1 §17.4.72\n if (tcPr['w:textDirection']) {\n const direction = tcPr['w:textDirection']['@_w:val'];\n if (direction) {\n cell.setTextDirection(direction);\n }\n }\n\n // Parse no wrap (w:noWrap) per ECMA-376 Part 1 §17.4.34\n if (tcPr['w:noWrap']) {\n cell.setNoWrap(true);\n }\n\n // Parse hide mark (w:hideMark) per ECMA-376 Part 1 §17.4.24\n if (tcPr['w:hideMark']) {\n cell.setHideMark(true);\n }\n\n // Parse headers (w:headers) per ECMA-376 Part 1 §17.4.26\n if (tcPr['w:headers']) {\n const headersVal = tcPr['w:headers']['@_w:val'];\n if (headersVal) {\n cell.setHeaders(headersVal);\n }\n }\n\n // Parse fit text (w:tcFitText) per ECMA-376 Part 1 §17.4.68\n if (tcPr['w:tcFitText']) {\n cell.setFitText(true);\n }\n\n // Parse vertical merge (w:vMerge) per ECMA-376 Part 1 §17.4.85\n if (tcPr['w:vMerge']) {\n const vMergeVal = tcPr['w:vMerge']['@_w:val'];\n // Empty element or \"continue\" means continue, \"restart\" means restart\n if (vMergeVal === 'restart') {\n cell.setVerticalMerge('restart');\n } else {\n cell.setVerticalMerge('continue');\n }\n }\n\n // Parse legacy horizontal merge (w:hMerge) per ECMA-376 Part 1 §17.4.22\n if (tcPr['w:hMerge']) {\n const hMergeVal = tcPr['w:hMerge']['@_w:val'];\n if (hMergeVal === 'restart') {\n cell.setHorizontalMerge('restart');\n } else {\n cell.setHorizontalMerge('continue');\n }\n }\n\n // Parse table cell insertion marker (w:cellIns) per ECMA-376 Part 1 §17.13.5.5\n if (tcPr['w:cellIns']) {\n const cellIns = tcPr['w:cellIns'];\n const id = parseInt(cellIns['@_w:id'] || '0', 10);\n const author = cellIns['@_w:author'] || 'Unknown';\n const dateAttr = cellIns['@_w:date'];\n const date = dateAttr ? new Date(dateAttr) : new Date();\n\n const revision = new Revision({\n id,\n author,\n date,\n type: 'tableCellInsert',\n content: [],\n });\n cell.setCellRevision(revision);\n }\n\n // Parse table cell deletion marker (w:cellDel) per ECMA-376 Part 1 §17.13.5.6\n if (tcPr['w:cellDel']) {\n const cellDel = tcPr['w:cellDel'];\n const id = parseInt(cellDel['@_w:id'] || '0', 10);\n const author = cellDel['@_w:author'] || 'Unknown';\n const dateAttr = cellDel['@_w:date'];\n const date = dateAttr ? new Date(dateAttr) : new Date();\n\n const revision = new Revision({\n id,\n author,\n date,\n type: 'tableCellDelete',\n content: [],\n });\n cell.setCellRevision(revision);\n }\n\n // Parse table cell merge marker (w:cellMerge) per ECMA-376 Part 1 §17.13.5.4\n if (tcPr['w:cellMerge']) {\n const cellMerge = tcPr['w:cellMerge'];\n const id = parseInt(cellMerge['@_w:id'] || '0', 10);\n const author = cellMerge['@_w:author'] || 'Unknown';\n const dateAttr = cellMerge['@_w:date'];\n const date = dateAttr ? new Date(dateAttr) : new Date();\n const vMergeAttr = cellMerge['@_w:vMerge'];\n const vMergeOrigAttr = cellMerge['@_w:vMergeOrig'];\n // ST_AnnotationVMerge uses \"rest\"/\"cont\" but API uses \"restart\"/\"continue\"\n const mergeRevMap: Record<string, string> = { rest: 'restart', cont: 'continue' };\n\n const revision = new Revision({\n id,\n author,\n date,\n type: 'tableCellMerge',\n content: [],\n previousProperties: {\n vMerge: (vMergeAttr && mergeRevMap[vMergeAttr]) || vMergeAttr,\n vMergeOrig: (vMergeOrigAttr && mergeRevMap[vMergeOrigAttr]) || vMergeOrigAttr,\n },\n });\n cell.setCellRevision(revision);\n }\n\n // Parse table cell property change (w:tcPrChange) per ECMA-376 Part 1 §17.13.5.37\n if (tcPr['w:tcPrChange']) {\n const changeObj = tcPr['w:tcPrChange'];\n cell.setTcPrChange({\n id: String(changeObj['@_w:id'] || '0'),\n author: changeObj['@_w:author'] || '',\n date: changeObj['@_w:date'] || '',\n previousProperties: this.parseGenericPreviousProperties(changeObj['w:tcPr']),\n });\n }\n }\n\n // Parse cell content - use order-preserving extraction if raw XML available\n // This is critical for preserving nested tables and SDTs\n if (rawCellXml) {\n // Extract all cell content in order (paragraphs, nested tables, SDTs, bookmarkEnds)\n const cellContent = this.extractCellContentInOrder(rawCellXml);\n let paragraphIndex = 0;\n let lastParagraph: Paragraph | null = null;\n\n for (const item of cellContent) {\n if (item.type === 'paragraph') {\n // Parse paragraph using raw XML to preserve revisions\n const paragraph = await this.parseParagraphWithOrder(\n item.xml,\n relationshipManager,\n zipHandler,\n imageManager\n );\n if (paragraph) {\n cell.addParagraph(paragraph);\n lastParagraph = paragraph;\n paragraphIndex++;\n }\n } else if (item.type === 'table' || item.type === 'sdt') {\n // Store nested tables and SDTs as raw XML for passthrough\n // These are preserved exactly as-is to avoid any modifications\n cell.addRawNestedContent(paragraphIndex, item.xml, item.type);\n } else if (item.type === 'bookmarkEnd') {\n // BookmarkEnd between paragraphs in cell - attach to previous paragraph\n if (lastParagraph) {\n const bookmarkEnds = this.extractBookmarkEndsFromContent(item.xml);\n for (const bookmark of bookmarkEnds) {\n lastParagraph.addBookmarkEnd(bookmark);\n }\n }\n }\n }\n } else {\n // Fallback: Parse paragraphs from object (no raw XML available)\n const paragraphs = cellObj['w:p'];\n const paraChildren = Array.isArray(paragraphs)\n ? paragraphs\n : paragraphs\n ? [paragraphs]\n : [];\n\n for (const paraObj of paraChildren) {\n const paragraph = await this.parseParagraphFromObject(\n paraObj,\n relationshipManager,\n zipHandler,\n imageManager\n );\n if (paragraph) {\n cell.addParagraph(paragraph);\n }\n }\n }\n\n return cell;\n } catch (error: unknown) {\n defaultLogger.warn(\n '[DocumentParser] Failed to parse table cell:',\n error instanceof Error\n ? { message: error.message, stack: error.stack }\n : { error: String(error) }\n );\n return null;\n }\n }\n\n /**\n * Extracts cell content elements in order, preserving sequence of paragraphs, nested tables, and SDTs\n * Used to properly handle nested tables in table cells\n * @param cellXml - Raw XML of the cell (w:tc element)\n * @returns Array of content items with type and XML\n */\n private extractCellContentInOrder(\n cellXml: string\n ): { type: 'paragraph' | 'table' | 'sdt' | 'bookmarkEnd'; xml: string }[] {\n const result: {\n type: 'paragraph' | 'table' | 'sdt' | 'bookmarkEnd';\n xml: string;\n }[] = [];\n\n // Find the start of cell content (after w:tcPr if present)\n let contentStart = 0;\n const tcPrStart = cellXml.indexOf('<w:tcPr');\n if (tcPrStart !== -1) {\n // Skip past the tcPr element\n const tcPrEnd = this.findClosingTag(cellXml, 'w:tcPr', tcPrStart);\n if (tcPrEnd !== -1) {\n contentStart = tcPrEnd;\n }\n }\n\n // Find end of cell (before closing </w:tc>)\n const contentEnd = cellXml.lastIndexOf('</w:tc>');\n if (contentEnd === -1) return result;\n\n const content = cellXml.substring(contentStart, contentEnd);\n\n // Scan for w:p, w:tbl, w:sdt, and w:bookmarkEnd elements at the current level\n let pos = 0;\n while (pos < content.length) {\n // Find next element start\n const pStart = content.indexOf('<w:p', pos);\n const tblStart = content.indexOf('<w:tbl', pos);\n const sdtStart = content.indexOf('<w:sdt', pos);\n const bookmarkEndStart = content.indexOf('<w:bookmarkEnd', pos);\n\n // Find which comes first\n let nextStart = -1;\n let nextType: 'paragraph' | 'table' | 'sdt' | 'bookmarkEnd' | null = null;\n let nextTag = '';\n\n if (\n pStart !== -1 &&\n this.isExactTag(content, pStart, 'w:p') &&\n (nextStart === -1 || pStart < nextStart)\n ) {\n nextStart = pStart;\n nextType = 'paragraph';\n nextTag = 'w:p';\n }\n if (\n tblStart !== -1 &&\n this.isExactTag(content, tblStart, 'w:tbl') &&\n (nextStart === -1 || tblStart < nextStart)\n ) {\n nextStart = tblStart;\n nextType = 'table';\n nextTag = 'w:tbl';\n }\n if (\n sdtStart !== -1 &&\n this.isExactTag(content, sdtStart, 'w:sdt') &&\n (nextStart === -1 || sdtStart < nextStart)\n ) {\n nextStart = sdtStart;\n nextType = 'sdt';\n nextTag = 'w:sdt';\n }\n if (bookmarkEndStart !== -1 && (nextStart === -1 || bookmarkEndStart < nextStart)) {\n nextStart = bookmarkEndStart;\n nextType = 'bookmarkEnd';\n nextTag = 'w:bookmarkEnd';\n }\n\n if (nextStart === -1 || nextType === null) break;\n\n // Extract the complete element\n if (nextType === 'bookmarkEnd') {\n // Self-closing tag - find the end of this element\n const elementEnd = content.indexOf('>', nextStart) + 1;\n if (elementEnd === 0) {\n pos = nextStart + 1;\n continue;\n }\n const elementXml = content.substring(nextStart, elementEnd);\n result.push({ type: nextType, xml: elementXml });\n pos = elementEnd;\n } else {\n const elementEnd = this.findClosingTag(content, nextTag, nextStart);\n if (elementEnd === -1) {\n pos = nextStart + 1;\n continue;\n }\n const elementXml = content.substring(nextStart, elementEnd);\n result.push({ type: nextType, xml: elementXml });\n pos = elementEnd;\n }\n }\n\n return result;\n }\n\n /**\n * Checks if a tag at the given position is an exact match (not a prefix like w:pPr for w:p)\n */\n private isExactTag(content: string, position: number, tagName: string): boolean {\n const afterTag = content[position + 1 + tagName.length];\n return (\n afterTag === '>' ||\n afterTag === '/' ||\n afterTag === ' ' ||\n afterTag === '\\t' ||\n afterTag === '\\n' ||\n afterTag === '\\r'\n );\n }\n\n /**\n * Finds the closing tag for an element, handling nested elements of the same type\n */\n private findClosingTag(content: string, tagName: string, startPos: number): number {\n const openTag = `<${tagName}`;\n const closeTag = `</${tagName}>`;\n\n // Check for self-closing tag first\n const openTagEnd = content.indexOf('>', startPos);\n if (openTagEnd !== -1 && content[openTagEnd - 1] === '/') {\n return openTagEnd + 1;\n }\n\n let depth = 1;\n let pos = openTagEnd + 1;\n\n while (pos < content.length && depth > 0) {\n const nextOpen = content.indexOf(openTag, pos);\n const nextClose = content.indexOf(closeTag, pos);\n\n if (nextClose === -1) break;\n\n if (nextOpen !== -1 && nextOpen < nextClose) {\n // Check if it's an exact tag match\n if (this.isExactTag(content, nextOpen, tagName)) {\n depth++;\n }\n pos = nextOpen + openTag.length;\n } else {\n depth--;\n pos = nextClose + closeTag.length;\n }\n }\n\n return depth === 0 ? pos : -1;\n }\n\n private async parseSDTFromObject(\n sdtObj: any,\n relationshipManager: RelationshipManager,\n zipHandler: ZipHandler,\n imageManager: ImageManager\n ): Promise<StructuredDocumentTag | TableOfContentsElement | null> {\n try {\n if (!sdtObj) return null;\n\n const properties: any = {};\n\n // Parse SDT properties (sdtPr)\n const sdtPr = sdtObj['w:sdtPr'];\n if (sdtPr) {\n // Parse ID\n const idElement = sdtPr['w:id'];\n if (idElement?.['@_w:val']) {\n properties.id = parseInt(idElement['@_w:val'], 10);\n }\n\n // Parse tag\n const tagElement = sdtPr['w:tag'];\n if (tagElement?.['@_w:val']) {\n properties.tag = tagElement['@_w:val'];\n }\n\n // Parse lock\n const lockElement = sdtPr['w:lock'];\n if (lockElement?.['@_w:val']) {\n properties.lock = lockElement['@_w:val'];\n }\n\n // Parse alias\n const aliasElement = sdtPr['w:alias'];\n if (aliasElement?.['@_w:val']) {\n properties.alias = aliasElement['@_w:val'];\n }\n\n // Parse control type from various elements\n if (sdtPr['w:richText']) {\n properties.controlType = 'richText';\n } else if (sdtPr['w:text']) {\n properties.controlType = 'plainText';\n const textElement = sdtPr['w:text'];\n properties.plainText = {\n multiLine:\n textElement?.['@_w:multiLine'] === '1' || textElement?.['@_w:multiLine'] === 'true',\n };\n } else if (sdtPr['w:comboBox']) {\n properties.controlType = 'comboBox';\n const comboBoxElement = sdtPr['w:comboBox'];\n properties.comboBox = this.parseListItems(comboBoxElement);\n } else if (sdtPr['w:dropDownList']) {\n properties.controlType = 'dropDownList';\n const dropDownElement = sdtPr['w:dropDownList'];\n properties.dropDownList = this.parseListItems(dropDownElement);\n } else if (sdtPr['w:date']) {\n properties.controlType = 'datePicker';\n const dateElement = sdtPr['w:date'];\n // Date properties can be either attributes on w:date or nested elements\n properties.datePicker = {\n // Check attribute first, then nested element\n dateFormat:\n dateElement?.['@_w:dateFormat'] || dateElement?.['w:dateFormat']?.['@_w:val'],\n fullDate:\n dateElement?.['@_w:fullDate'] || dateElement?.['w:fullDate']?.['@_w:val']\n ? new Date(dateElement['@_w:fullDate'] || dateElement['w:fullDate']['@_w:val'])\n : undefined,\n lid: dateElement?.['@_w:lid'] || dateElement?.['w:lid']?.['@_w:val'],\n calendar: dateElement?.['@_w:calendar'] || dateElement?.['w:calendar']?.['@_w:val'],\n };\n } else if (sdtPr['w14:checkbox']) {\n properties.controlType = 'checkbox';\n const checkboxElement = sdtPr['w14:checkbox'];\n // Handle both string and numeric values from XML parser\n const checkedVal = checkboxElement?.['w14:checked']?.['@_w14:val'];\n properties.checkbox = {\n checked:\n checkedVal === 1 ||\n checkedVal === '1' ||\n checkedVal === true ||\n checkedVal === 'true',\n checkedState: String(checkboxElement?.['w14:checkedState']?.['@_w14:val'] ?? ''),\n uncheckedState: String(checkboxElement?.['w14:uncheckedState']?.['@_w14:val'] ?? ''),\n };\n } else if (sdtPr['w:picture']) {\n properties.controlType = 'picture';\n } else if (sdtPr['w:docPartObj']) {\n properties.controlType = 'buildingBlock';\n const docPartObj = sdtPr['w:docPartObj'];\n properties.buildingBlock = {\n gallery: docPartObj?.['w:docPartGallery']?.['@_w:val'],\n category: docPartObj?.['w:docPartCategory']?.['@_w:val'],\n };\n } else if (sdtPr['w:group']) {\n properties.controlType = 'group';\n } else if (sdtPr['w:citation']) {\n properties.controlType = 'citation';\n } else if (sdtPr['w:bibliography']) {\n properties.controlType = 'bibliography';\n } else if (sdtPr['w:equation']) {\n properties.controlType = 'equation';\n } else if (sdtPr['w:docPartList']) {\n properties.controlType = 'docPartList';\n const docPartList = sdtPr['w:docPartList'];\n properties.buildingBlock = {\n gallery: docPartList?.['w:docPartGallery']?.['@_w:val'],\n category: docPartList?.['w:docPartCategory']?.['@_w:val'],\n isList: true,\n };\n }\n\n // Parse placeholder (w:placeholder/w:docPart)\n const placeholderElement = sdtPr['w:placeholder'];\n if (placeholderElement) {\n const docPartVal = placeholderElement?.['w:docPart']?.['@_w:val'];\n if (docPartVal) {\n properties.placeholder = { docPart: docPartVal };\n }\n }\n\n // Parse data binding (w:dataBinding)\n const dataBindingElement = sdtPr['w:dataBinding'];\n if (dataBindingElement) {\n properties.dataBinding = {\n xpath: dataBindingElement['@_w:xpath'] || '',\n prefixMappings: dataBindingElement['@_w:prefixMappings'],\n storeItemId: dataBindingElement['@_w:storeItemID'],\n };\n }\n\n // Parse showing placeholder flag (w:showingPlcHdr)\n const showingPlcHdr = sdtPr['w:showingPlcHdr'];\n if (showingPlcHdr) {\n const val = showingPlcHdr['@_w:val'];\n properties.showingPlcHdr = val === '1' || val === 'true' || val === true;\n }\n }\n\n // Parse SDT content (sdtContent)\n const content: any[] = [];\n const sdtContent = sdtObj['w:sdtContent'];\n if (sdtContent) {\n // Check for ordered children (preserves element order)\n const orderedChildren = sdtContent._orderedChildren as\n | { type: string; index: number }[]\n | undefined;\n\n if (orderedChildren && orderedChildren.length > 0) {\n // Process in original order\n for (const childInfo of orderedChildren) {\n const elementType = childInfo.type;\n const elementIndex = childInfo.index;\n\n if (elementType === 'w:p') {\n const paragraphs = sdtContent['w:p'];\n const paraArray = Array.isArray(paragraphs)\n ? paragraphs\n : paragraphs\n ? [paragraphs]\n : [];\n if (elementIndex < paraArray.length) {\n // Reconstruct XML for paragraph parsing\n const paraXml = this.objectToXml({\n 'w:p': paraArray[elementIndex],\n });\n const para = await this.parseParagraphWithOrder(\n paraXml,\n relationshipManager,\n zipHandler,\n imageManager\n );\n if (para) content.push(para);\n }\n } else if (elementType === 'w:tbl') {\n const tables = sdtContent['w:tbl'];\n const tableArray = Array.isArray(tables) ? tables : tables ? [tables] : [];\n if (elementIndex < tableArray.length) {\n const tableObj = tableArray[elementIndex];\n const table = await this.parseTableFromObject(\n tableObj,\n relationshipManager,\n zipHandler,\n imageManager\n );\n if (table) content.push(table);\n }\n } else if (elementType === 'w:sdt') {\n const sdts = sdtContent['w:sdt'];\n const sdtArray = Array.isArray(sdts) ? sdts : sdts ? [sdts] : [];\n if (elementIndex < sdtArray.length) {\n const nestedSdt = await this.parseSDTFromObject(\n sdtArray[elementIndex],\n relationshipManager,\n zipHandler,\n imageManager\n );\n if (nestedSdt) content.push(nestedSdt);\n }\n }\n }\n } else {\n // Fallback: process sequentially\n // Parse paragraphs\n const paragraphs = sdtContent['w:p'];\n const paraArray = Array.isArray(paragraphs) ? paragraphs : paragraphs ? [paragraphs] : [];\n for (const paraObj of paraArray) {\n const paraXml = this.objectToXml({ 'w:p': paraObj });\n const para = await this.parseParagraphWithOrder(\n paraXml,\n relationshipManager,\n zipHandler,\n imageManager\n );\n if (para) content.push(para);\n }\n\n // Parse tables\n const tables = sdtContent['w:tbl'];\n const tableArray = Array.isArray(tables) ? tables : tables ? [tables] : [];\n for (const tableObj of tableArray) {\n const table = await this.parseTableFromObject(\n tableObj,\n relationshipManager,\n zipHandler,\n imageManager\n );\n if (table) content.push(table);\n }\n\n // Parse nested SDTs\n const nestedSdts = sdtContent['w:sdt'];\n const sdtArray = Array.isArray(nestedSdts) ? nestedSdts : nestedSdts ? [nestedSdts] : [];\n for (const nestedSdtObj of sdtArray) {\n const nestedSdt = await this.parseSDTFromObject(\n nestedSdtObj,\n relationshipManager,\n zipHandler,\n imageManager\n );\n if (nestedSdt) content.push(nestedSdt);\n }\n }\n }\n\n // Check if this is a Table of Contents SDT\n if (properties.buildingBlock?.gallery === 'Table of Contents') {\n // This is a TOC - create TableOfContentsElement instead\n const toc = this.parseTOCFromSDTContent(content, properties, sdtContent);\n if (toc) {\n return new TableOfContentsElement(toc);\n }\n }\n\n return new StructuredDocumentTag(properties, content);\n } catch (error: unknown) {\n defaultLogger.warn(\n '[DocumentParser] Failed to parse SDT:',\n error instanceof Error\n ? { message: error.message, stack: error.stack }\n : { error: String(error) }\n );\n return null;\n }\n }\n\n /**\n * Extracts TOC field instruction from assembled ComplexField objects\n * This is the preferred method as it uses already-assembled fields\n * @private\n */\n private extractInstructionFromContent(content: any[]): string | undefined {\n defaultLogger.debug(\n `[TOC Parser] Searching ${content.length} content elements for TOC ComplexField`\n );\n\n for (const element of content) {\n if (element instanceof Paragraph) {\n const paragraphContent = element.getContent();\n\n for (const item of paragraphContent) {\n // Check for ComplexField (assembled field with begin/sep/end)\n if (item instanceof ComplexField) {\n const instruction = item.getInstruction();\n\n // Check if this is a TOC field\n if (instruction && instruction.trim().startsWith('TOC')) {\n defaultLogger.debug(\n `[TOC Parser] Found ComplexField with TOC instruction: \"${instruction.substring(\n 0,\n 100\n )}...\"`\n );\n return instruction.trim();\n }\n }\n }\n }\n }\n\n defaultLogger.debug(\n '[TOC Parser] No ComplexField with TOC instruction found in assembled content'\n );\n return undefined;\n }\n\n /**\n * Fallback: Extracts TOC instruction from raw XML when ComplexField not available\n * Handles instructions split across multiple runs by concatenating all runs between begin/separate markers\n * @private\n */\n private extractInstructionFromRawXML(sdtContent: any): string | undefined {\n const paragraphs = sdtContent['w:p'];\n const paraArray = Array.isArray(paragraphs) ? paragraphs : paragraphs ? [paragraphs] : [];\n\n defaultLogger.debug(\n `[TOC Parser] Fallback: Parsing raw XML from ${paraArray.length} paragraph(s)`\n );\n\n // Track field state across paragraphs (TOC fields can span multiple paragraphs)\n let inField = false;\n let instructionParts: string[] = [];\n let foundTOCInstruction: string | undefined;\n\n for (let pIdx = 0; pIdx < paraArray.length; pIdx++) {\n const paraObj = paraArray[pIdx];\n const runs = paraObj['w:r'];\n const runArray = Array.isArray(runs) ? runs : runs ? [runs] : [];\n\n defaultLogger.debug(`[TOC Parser] Paragraph ${pIdx + 1}: ${runArray.length} runs`);\n\n for (let rIdx = 0; rIdx < runArray.length; rIdx++) {\n const runObj = runArray[rIdx];\n\n // Check for field character(s) - can be single object or array\n const fldChar = runObj['w:fldChar'];\n if (fldChar) {\n // Handle both single object and array of objects\n const fldCharArray = Array.isArray(fldChar) ? fldChar : [fldChar];\n\n defaultLogger.debug(\n `[TOC Parser] Paragraph ${pIdx + 1}, Run ${rIdx + 1}: Found ${\n fldCharArray.length\n } fldChar element(s)`\n );\n\n // Process each fldChar in the array\n for (const fldCharObj of fldCharArray) {\n const charType = fldCharObj['@_w:fldCharType'] || fldCharObj['@_fldCharType'];\n\n if (!charType) {\n defaultLogger.debug(`[TOC Parser] Warning: fldChar without charType attribute`);\n continue;\n }\n\n defaultLogger.debug(\n `[TOC Parser] Paragraph ${pIdx + 1}, Run ${rIdx + 1}: fldChar type = \"${charType}\"`\n );\n\n if (charType === 'begin') {\n inField = true;\n instructionParts = [];\n defaultLogger.debug(\n '[TOC Parser] Found field begin marker, starting instruction collection'\n );\n continue;\n }\n\n // Check for field end/separate marker\n if (charType === 'end' || charType === 'separate') {\n // If we collected instruction parts, join and check if TOC\n const fullInstruction = instructionParts.join('').trim();\n defaultLogger.debug(\n `[TOC Parser] Field ${charType} marker found. Collected instruction: \"${fullInstruction.substring(\n 0,\n 100\n )}...\"`\n );\n\n if (fullInstruction.startsWith('TOC')) {\n foundTOCInstruction = fullInstruction;\n defaultLogger.debug(\n `[TOC Parser] ✓ Extracted complete TOC instruction from ${instructionParts.length} part(s)`\n );\n // Don't return yet - field might have more content after separate\n // But save it in case we don't find end marker\n }\n\n // Only reset on \"end\", not \"separate\" (there's content between separate and end)\n if (charType === 'end') {\n inField = false;\n instructionParts = [];\n\n // If we found a TOC instruction, return it now\n if (foundTOCInstruction) {\n return foundTOCInstruction;\n }\n }\n continue;\n }\n }\n }\n\n // Collect instruction text while inside field\n if (inField) {\n const instrText = runObj['w:instrText'];\n if (instrText) {\n // Extract text value and decode XML entities\n let text = '';\n if (typeof instrText === 'string') {\n text = instrText;\n } else if (instrText['#text']) {\n text = instrText['#text'];\n } else {\n // Sometimes the text is directly in the object\n text = String(instrText);\n }\n\n instructionParts.push(text);\n defaultLogger.debug(\n `[TOC Parser] Paragraph ${pIdx + 1}, Run ${\n rIdx + 1\n }: Collected instrText = \"${text.substring(0, 50)}...\"`\n );\n }\n }\n }\n }\n\n // If we found a TOC instruction but never hit the end marker, return it anyway\n if (foundTOCInstruction) {\n defaultLogger.debug(\n `[TOC Parser] Returning TOC instruction (no end marker found): \"${foundTOCInstruction.substring(\n 0,\n 100\n )}...\"`\n );\n return foundTOCInstruction;\n }\n\n defaultLogger.debug('[TOC Parser] No TOC instruction found in raw XML fallback');\n return undefined;\n }\n\n /**\n * Normalizes TOC field instructions by converting incomplete \\t switches\n * that reference only standard heading styles to the equivalent \\o switch format.\n *\n * This fixes documents where TOC was created with \\t \"Heading 2,2,\" instead of\n * the correct \\o \"1-3\" format, which causes the TOC to only capture one heading level.\n *\n * @param instruction - The original TOC field instruction\n * @returns Normalized instruction with \\o switch if applicable, otherwise original\n * @private\n */\n private normalizeTOCFieldInstruction(instruction: string): string {\n // Check if instruction uses \\t switch\n if (!instruction.includes('\\\\t')) {\n return instruction; // Already using \\o or no style switch\n }\n\n // Extract all \\t switches\n const tSwitchPattern = /\\\\t\\s+\"([^\"]+)\"/g;\n const matches = [...instruction.matchAll(tSwitchPattern)];\n\n if (matches.length === 0) {\n return instruction; // No \\t switches found\n }\n\n // Parse all styles from \\t switches\n const styles: { styleName: string; level: number }[] = [];\n for (const match of matches) {\n const stylesStr = match[1];\n if (!stylesStr) continue;\n\n const parts = stylesStr.split(',').filter((p: string) => p.trim());\n for (let i = 0; i < parts.length; i += 2) {\n const styleName = parts[i];\n const levelStr = parts[i + 1];\n if (styleName && levelStr) {\n styles.push({\n styleName: styleName.trim(),\n level: parseInt(levelStr.trim(), 10),\n });\n }\n }\n }\n\n // Check if all styles are standard headings (Heading1, Heading2, etc.)\n const standardHeadingPattern = /^Heading\\s*(\\d+)$/i;\n const allStandardHeadings = styles.every((style) =>\n standardHeadingPattern.test(style.styleName)\n );\n\n if (!allStandardHeadings) {\n return instruction; // Contains custom styles, keep \\t switches\n }\n\n // Extract heading numbers and find the range\n const headingLevels = styles\n .map((style) => {\n const match = standardHeadingPattern.exec(style.styleName);\n return match ? parseInt(match[1]!, 10) : 0;\n })\n .filter((level) => level > 0)\n .sort((a, b) => a - b);\n\n if (headingLevels.length === 0) {\n return instruction; // No valid heading levels found\n }\n\n const minLevel = headingLevels[0]!;\n const maxLevel = headingLevels[headingLevels.length - 1]!;\n\n // Check if we should normalize (e.g., only \"Heading 2,2,\" should become \"1-3\")\n // We normalize if:\n // 1. Only one heading style is referenced, OR\n // 2. The heading levels don't form a complete sequence from 1\n const shouldNormalize =\n headingLevels.length === 1 || // Single heading style\n minLevel !== 1 || // Doesn't start at Heading 1\n headingLevels.length !== maxLevel - minLevel + 1; // Not a complete sequence\n\n if (!shouldNormalize) {\n return instruction; // Already a complete sequence, keep as-is\n }\n\n // FIX: Use actual min/max levels from the \\t switch, not hardcoded \"1-N\"\n // If \\t \"Heading 2,2,\" was specified, output should be \\o \"2-2\", not \\o \"1-3\"\n\n // Remove all \\t switches and replace with \\o switch\n let normalized = instruction.replace(tSwitchPattern, '').trim();\n\n // Insert \\o switch after \"TOC\" using the actual min/max levels\n normalized = normalized.replace(/^TOC\\s*/, `TOC \\\\o \"${minLevel}-${maxLevel}\" `);\n\n defaultLogger.debug(\n `[TOC Parser] Normalized field instruction from \"${instruction}\" to \"${normalized}\"`\n );\n\n return normalized;\n }\n\n /**\n * Helper to parse TOC from SDT content\n * Now uses two-tier extraction: ComplexField objects first, then raw XML fallback\n * Automatically normalizes incomplete \\t switches to \\o format for standard headings\n */\n private parseTOCFromSDTContent(\n content: any[],\n properties: any,\n sdtContent: any\n ): TableOfContents | null {\n try {\n let title: string | undefined;\n let fieldInstruction: string | undefined;\n\n // Extract title from parsed content\n for (const element of content) {\n if (element instanceof Paragraph) {\n const style = element.getStyle();\n if (style === 'TOCHeading') {\n // Extract title text\n const runs = element.getRuns();\n title = runs.map((r) => r.getText()).join('');\n }\n }\n }\n\n // NEW: Extract field instruction from assembled ComplexField objects first\n fieldInstruction = this.extractInstructionFromContent(content);\n\n // FALLBACK: Use raw XML parsing if no ComplexField found\n if (!fieldInstruction) {\n defaultLogger.debug(\n '[TOC Parser] ComplexField extraction failed, falling back to raw XML parsing'\n );\n fieldInstruction = this.extractInstructionFromRawXML(sdtContent);\n }\n\n if (!fieldInstruction) {\n defaultLogger.warn(\n '[DocumentParser] No TOC field instruction found in SDT content (tried both ComplexField and raw XML)'\n );\n return null;\n }\n\n defaultLogger.debug(`[TOC Parser] Successfully extracted instruction: \"${fieldInstruction}\"`);\n\n // Decode HTML entities before parsing switches\n // XML stores quotes as " which need to be converted for regex matching\n const decodedInstruction = fieldInstruction\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/&/g, '&');\n\n defaultLogger.debug(`[TOC Parser] Decoded instruction: \"${decodedInstruction}\"`);\n\n // NORMALIZATION: Convert incomplete \\t switches to \\o format for standard headings\n const normalizedInstruction = this.normalizeTOCFieldInstruction(decodedInstruction);\n\n // Parse field switches from normalized instruction\n const tocOptions: any = {\n title,\n originalFieldInstruction: normalizedInstruction.trim(), // Store normalized version\n };\n\n // Check for \\h (hyperlinks)\n if (normalizedInstruction.includes('\\\\h')) {\n tocOptions.useHyperlinks = true;\n }\n\n // Check for \\n (omit page numbers)\n if (normalizedInstruction.includes('\\\\n')) {\n tocOptions.showPageNumbers = false;\n }\n\n // Check for \\z (hide in web layout)\n if (normalizedInstruction.includes('\\\\z')) {\n tocOptions.hideInWebLayout = true;\n }\n\n // Check for \\o \"x-y\" (outline levels) - supports quoted and unquoted formats\n const outlineMatch = /\\\\o\\s+(?:\"(\\d+)-(\\d+)\"|'(\\d+)-(\\d+)'|(\\d+)-(\\d+))/.exec(\n normalizedInstruction\n );\n if (outlineMatch) {\n // Extract captured groups from whichever format matched\n const minLevel = outlineMatch[1] || outlineMatch[3] || outlineMatch[5];\n const maxLevel = outlineMatch[2] || outlineMatch[4] || outlineMatch[6];\n if (minLevel && maxLevel) {\n tocOptions.minLevel = parseInt(minLevel, 10);\n tocOptions.maxLevel = parseInt(maxLevel, 10);\n }\n }\n\n // Check for \\t \"styles...\" (include styles)\n const stylesMatch = /\\\\t\\s+\"([^\"]+)\"/.exec(normalizedInstruction);\n if (stylesMatch?.[1]) {\n const stylesStr = stylesMatch[1];\n const styles: { styleName: string; level: number }[] = [];\n\n // Parse \"StyleName,Level,StyleName2,Level2,...\"\n const parts = stylesStr.split(',').filter((p) => p.trim());\n for (let i = 0; i < parts.length; i += 2) {\n const styleName = parts[i];\n const levelStr = parts[i + 1];\n if (styleName && levelStr) {\n styles.push({\n styleName: styleName.trim(),\n level: parseInt(levelStr.trim(), 10),\n });\n }\n }\n\n if (styles.length > 0) {\n tocOptions.includeStyles = styles;\n }\n }\n\n return new TableOfContents(tocOptions);\n } catch (error: unknown) {\n defaultLogger.warn(\n '[DocumentParser] Failed to parse TOC from SDT content:',\n error instanceof Error\n ? { message: error.message, stack: error.stack }\n : { error: String(error) }\n );\n return null;\n }\n }\n\n /**\n * Helper to parse list items for combo box / dropdown\n */\n private parseListItems(element: any): any {\n const items: any[] = [];\n const listItems = element?.['w:listItem'];\n const itemArray = Array.isArray(listItems) ? listItems : listItems ? [listItems] : [];\n\n for (const item of itemArray) {\n if (item['@_w:displayText'] && item['@_w:value']) {\n items.push({\n displayText: item['@_w:displayText'],\n value: item['@_w:value'],\n });\n }\n }\n\n return {\n items,\n lastValue: element?.['@_w:lastValue'],\n };\n }\n\n /**\n * Helper to convert object back to XML string\n */\n private objectToXml(obj: any): string {\n // XML reconstruction that preserves element order using _orderedChildren\n // FIX (v1.3.1): Use _orderedChildren to maintain document order of elements\n // This fixes TOC tab preservation - tabs must be in correct position\n const buildXml = (o: any, name?: string): string => {\n if (typeof o === 'string') return o;\n if (typeof o !== 'object') return String(o);\n\n const keys = Object.keys(o);\n\n // FIX: If a name is provided, we're building a specific element (possibly self-closing)\n // Don't return empty string for empty objects with a name - they should become self-closing tags\n if (keys.length === 0 && !name) return '';\n\n const tagName = name || keys[0]!; // keys[0] is guaranteed to exist due to length check (or name is provided)\n const element = name ? o : o[tagName];\n\n let xml = `<${tagName}`;\n\n // Add attributes\n if (element && typeof element === 'object') {\n for (const key of Object.keys(element)) {\n if (key.startsWith('@_')) {\n const attrName = key.substring(2);\n xml += ` ${attrName}=\"${element[key]}\"`;\n }\n }\n }\n\n // Check for children\n const hasChildren =\n element &&\n typeof element === 'object' &&\n Object.keys(element).some(\n (k) => !k.startsWith('@_') && k !== '#text' && k !== '_orderedChildren'\n );\n\n if (!hasChildren && !element?.['#text']) {\n xml += '/>';\n } else {\n xml += '>';\n\n // Add text content\n if (element?.['#text']) {\n xml += element['#text'];\n }\n\n // Add child elements using _orderedChildren if available\n if (element && typeof element === 'object') {\n const orderedChildren = element._orderedChildren as\n | { type: string; index: number }[]\n | undefined;\n\n if (orderedChildren && orderedChildren.length > 0) {\n // Use _orderedChildren to preserve element order\n for (const childInfo of orderedChildren) {\n const childType = childInfo.type;\n const childIndex = childInfo.index;\n\n if (element[childType] !== undefined) {\n const children = element[childType];\n\n if (Array.isArray(children)) {\n if (childIndex < children.length) {\n const childXml = buildXml(children[childIndex], childType);\n xml += childXml;\n }\n } else {\n // Single child element\n if (childIndex === 0) {\n const childXml = buildXml(children, childType);\n xml += childXml;\n }\n }\n }\n }\n } else {\n // Fallback: iterate through keys if no _orderedChildren\n for (const key of Object.keys(element)) {\n if (!key.startsWith('@_') && key !== '#text' && key !== '_orderedChildren') {\n const children = element[key];\n if (Array.isArray(children)) {\n for (const child of children) {\n xml += buildXml(child, key);\n }\n } else {\n xml += buildXml(children, key);\n }\n }\n }\n }\n }\n\n xml += `</${tagName}>`;\n }\n\n return xml;\n };\n\n return buildXml(obj);\n }\n\n /**\n * Parses existing relationships from word/_rels/document.xml.rels\n * This ensures new relationships don't collide with existing IDs\n * Returns the parsed RelationshipManager if found, otherwise returns the provided one\n */\n private parseRelationships(\n zipHandler: ZipHandler,\n relationshipManager: RelationshipManager\n ): RelationshipManager {\n const relsPath = 'word/_rels/document.xml.rels';\n const relsXml = zipHandler.getFileAsString(relsPath);\n\n if (relsXml) {\n // Parse and replace the relationship manager with populated one\n return RelationshipManager.fromXml(relsXml);\n }\n\n // No existing relationships - return the provided manager\n // The Document class will add default relationships\n return relationshipManager;\n }\n\n /**\n * Parses document properties from core.xml, app.xml, and custom.xml\n */\n private parseProperties(zipHandler: ZipHandler): DocumentProperties {\n const extractTag = (xml: string, tag: string): string | undefined => {\n const tagContent = XMLParser.extractBetweenTags(xml, `<${tag}`, `</${tag}>`);\n return tagContent ? XMLBuilder.unescapeXml(tagContent) : undefined;\n };\n\n const properties: DocumentProperties = {};\n\n // Parse core.xml (core properties)\n const coreXml = zipHandler.getFileAsString(DOCX_PATHS.CORE_PROPS);\n if (coreXml) {\n properties.title = extractTag(coreXml, 'dc:title');\n properties.subject = extractTag(coreXml, 'dc:subject');\n properties.creator = extractTag(coreXml, 'dc:creator');\n properties.keywords = extractTag(coreXml, 'cp:keywords');\n properties.description = extractTag(coreXml, 'dc:description');\n properties.lastModifiedBy = extractTag(coreXml, 'cp:lastModifiedBy');\n\n // Phase 5.5 - Extended core properties\n properties.category = extractTag(coreXml, 'cp:category');\n properties.contentStatus = extractTag(coreXml, 'cp:contentStatus');\n properties.language = extractTag(coreXml, 'dc:language');\n\n // Parse revision as number\n const revisionStr = extractTag(coreXml, 'cp:revision');\n if (revisionStr) {\n properties.revision = parseInt(revisionStr, 10);\n }\n\n // Parse dates\n const createdStr = extractTag(coreXml, 'dcterms:created');\n if (createdStr) {\n properties.created = new Date(createdStr);\n }\n\n const modifiedStr = extractTag(coreXml, 'dcterms:modified');\n if (modifiedStr) {\n properties.modified = new Date(modifiedStr);\n }\n }\n\n // Parse app.xml (extended properties)\n const appXml = zipHandler.getFileAsString(DOCX_PATHS.APP_PROPS);\n if (appXml) {\n properties.application = extractTag(appXml, 'Application');\n properties.appVersion = extractTag(appXml, 'AppVersion');\n properties.company = extractTag(appXml, 'Company');\n properties.manager = extractTag(appXml, 'Manager');\n\n // Also check for version field\n if (!properties.appVersion) {\n properties.version = extractTag(appXml, 'Version');\n }\n }\n\n // Parse custom.xml (custom properties)\n const customXml = zipHandler.getFileAsString('docProps/custom.xml');\n if (customXml) {\n properties.customProperties = this.parseCustomProperties(customXml);\n }\n\n return properties;\n }\n\n /**\n * Parses custom properties from custom.xml\n */\n private parseCustomProperties(xml: string): Record<string, string | number | boolean | Date> {\n const customProps: Record<string, string | number | boolean | Date> = {};\n\n // Extract all property elements\n const propertyElements = XMLParser.extractElements(xml, 'property');\n\n for (const propXml of propertyElements) {\n // Extract name attribute\n const nameMatch = /name=\"([^\"]+)\"/.exec(propXml);\n if (!nameMatch?.[1]) continue;\n const name = XMLBuilder.unescapeXml(nameMatch[1]);\n\n // Determine value type and extract value\n if (propXml.includes('<vt:lpwstr>')) {\n const value = XMLParser.extractBetweenTags(propXml, '<vt:lpwstr>', '</vt:lpwstr>');\n if (value !== undefined) {\n customProps[name] = XMLBuilder.unescapeXml(value);\n }\n } else if (propXml.includes('<vt:r8>')) {\n const value = XMLParser.extractBetweenTags(propXml, '<vt:r8>', '</vt:r8>');\n if (value !== undefined) {\n customProps[name] = parseFloat(value);\n }\n } else if (propXml.includes('<vt:bool>')) {\n const value = XMLParser.extractBetweenTags(propXml, '<vt:bool>', '</vt:bool>');\n if (value !== undefined) {\n customProps[name] = value === 'true';\n }\n } else if (propXml.includes('<vt:filetime>')) {\n const value = XMLParser.extractBetweenTags(propXml, '<vt:filetime>', '</vt:filetime>');\n if (value !== undefined) {\n customProps[name] = new Date(value);\n }\n }\n }\n\n return customProps;\n }\n\n /**\n * Parses styles from styles.xml\n * @param zipHandler - ZIP handler containing the document\n * @returns Array of parsed Style objects\n */\n private parseStyles(zipHandler: ZipHandler): Style[] {\n const styles: Style[] = [];\n const stylesXml = zipHandler.getFileAsString(DOCX_PATHS.STYLES);\n\n if (!stylesXml) {\n return styles; // No styles.xml file\n }\n\n try {\n // Extract all <w:style> elements using XMLParser\n const styleElements = XMLParser.extractElements(stylesXml, 'w:style');\n\n for (const styleXml of styleElements) {\n try {\n const style = this.parseStyle(styleXml);\n if (style) {\n styles.push(style);\n }\n } catch (error: unknown) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.parseErrors.push({ element: 'style', error: err });\n\n if (this.strictParsing) {\n throw error;\n }\n // In lenient mode, continue parsing other styles\n }\n }\n } catch (error: unknown) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.parseErrors.push({ element: 'styles.xml', error: err });\n\n if (this.strictParsing) {\n throw new Error(`Failed to parse styles.xml: ${err.message}`);\n }\n }\n\n return styles;\n }\n\n /**\n * Parses numbering definitions from numbering.xml\n * Extracts abstract numbering definitions and numbering instances\n * @param zipHandler - ZIP handler containing the document\n * @returns Object containing abstractNumberings and numberingInstances arrays\n */\n private parseNumbering(zipHandler: ZipHandler): {\n abstractNumberings: AbstractNumbering[];\n numberingInstances: NumberingInstance[];\n } {\n const abstractNumberings: AbstractNumbering[] = [];\n const numberingInstances: NumberingInstance[] = [];\n\n const numberingXml = zipHandler.getFileAsString(DOCX_PATHS.NUMBERING);\n\n if (!numberingXml) {\n return { abstractNumberings, numberingInstances }; // No numbering.xml file\n }\n\n try {\n // Extract all <w:abstractNum> elements\n const abstractNumElements = XMLParser.extractElements(numberingXml, 'w:abstractNum');\n\n for (const abstractNumXml of abstractNumElements) {\n try {\n const abstractNum = AbstractNumbering.fromXML(abstractNumXml);\n abstractNumberings.push(abstractNum);\n } catch (error: unknown) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.parseErrors.push({ element: 'abstractNum', error: err });\n\n if (this.strictParsing) {\n throw error;\n }\n // In lenient mode, continue parsing other abstract numberings\n }\n }\n\n // Extract all <w:num> elements (numbering instances)\n const numElements = XMLParser.extractElements(numberingXml, 'w:num');\n\n for (const numXml of numElements) {\n try {\n const instance = NumberingInstance.fromXML(numXml);\n numberingInstances.push(instance);\n } catch (error: unknown) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.parseErrors.push({ element: 'num', error: err });\n\n if (this.strictParsing) {\n throw error;\n }\n // In lenient mode, continue parsing other instances\n }\n }\n } catch (error: unknown) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.parseErrors.push({ element: 'numbering.xml', error: err });\n\n if (this.strictParsing) {\n throw new Error(`Failed to parse numbering.xml: ${err.message}`);\n }\n }\n\n return { abstractNumberings, numberingInstances };\n }\n\n /**\n * Parses section properties from document XML\n * @param docXml - Document XML content\n * @returns Parsed Section object or null if not found\n */\n private parseSectionProperties(docXml: string): Section | null {\n try {\n // Extract the final <w:sectPr> from <w:body>\n const bodyElements = XMLParser.extractElements(docXml, 'w:body');\n if (bodyElements.length === 0) {\n return null;\n }\n const bodyContent = bodyElements[0];\n if (!bodyContent) {\n return null;\n }\n\n // Find the body-level sectPr (direct child of w:body), NOT inline sectPr inside w:pPr.\n // Per ECMA-376, the body-level sectPr appears as the last child of w:body,\n // after all paragraphs and tables. Inline sectPr elements inside w:pPr define\n // section breaks and must not be confused with the document-level section properties.\n // Search only in the content after the last block-level element to avoid picking up\n // inline sectPr from paragraph properties.\n const lastPClose = bodyContent.lastIndexOf('</w:p>');\n const lastTblClose = bodyContent.lastIndexOf('</w:tbl>');\n const lastSdtClose = bodyContent.lastIndexOf('</w:sdt>');\n const lastBlockEnd = Math.max(lastPClose, lastTblClose, lastSdtClose);\n\n let sectPr: string | undefined;\n if (lastBlockEnd !== -1) {\n // Search for sectPr only after the last block element\n const tailContent = bodyContent.substring(lastBlockEnd);\n const sectPrElements = XMLParser.extractElements(tailContent, 'w:sectPr');\n if (sectPrElements.length > 0) {\n sectPr = sectPrElements[0];\n }\n }\n if (!sectPr) {\n // Fallback: no block elements found, or sectPr not found after last block.\n // Search the entire body content (covers edge cases like empty documents).\n const sectPrElements = XMLParser.extractElements(bodyContent, 'w:sectPr');\n if (sectPrElements.length === 0) {\n return null;\n }\n sectPr = sectPrElements[sectPrElements.length - 1];\n if (!sectPr) {\n return null;\n }\n }\n\n const sectionProps: SectionProperties = {};\n\n // Parse page size\n const pgSzElements = XMLParser.extractElements(sectPr, 'w:pgSz');\n if (pgSzElements.length > 0) {\n const pgSz = pgSzElements[0];\n if (pgSz) {\n const width = XMLParser.extractAttribute(pgSz, 'w:w');\n const height = XMLParser.extractAttribute(pgSz, 'w:h');\n const orient = XMLParser.extractAttribute(pgSz, 'w:orient');\n\n if (width && height) {\n sectionProps.pageSize = {\n width: parseInt(width, 10),\n height: parseInt(height, 10),\n orientation: orient === 'landscape' ? 'landscape' : 'portrait',\n };\n }\n }\n }\n\n // Parse margins\n const pgMarElements = XMLParser.extractElements(sectPr, 'w:pgMar');\n if (pgMarElements.length > 0) {\n const pgMar = pgMarElements[0];\n if (pgMar) {\n const top = XMLParser.extractAttribute(pgMar, 'w:top');\n const bottom = XMLParser.extractAttribute(pgMar, 'w:bottom');\n const left = XMLParser.extractAttribute(pgMar, 'w:left');\n const right = XMLParser.extractAttribute(pgMar, 'w:right');\n const header = XMLParser.extractAttribute(pgMar, 'w:header');\n const footer = XMLParser.extractAttribute(pgMar, 'w:footer');\n const gutter = XMLParser.extractAttribute(pgMar, 'w:gutter');\n\n if (top && bottom && left && right) {\n sectionProps.margins = {\n top: parseInt(top, 10),\n bottom: parseInt(bottom, 10),\n left: parseInt(left, 10),\n right: parseInt(right, 10),\n header: header ? parseInt(header, 10) : undefined,\n footer: footer ? parseInt(footer, 10) : undefined,\n gutter: gutter ? parseInt(gutter, 10) : undefined,\n };\n }\n }\n }\n\n // Parse page borders (w:pgBorders) per ECMA-376 Part 1 §17.6.10\n const pgBordersElements = XMLParser.extractElements(sectPr, 'w:pgBorders');\n if (pgBordersElements.length > 0) {\n const pgBordersXml = pgBordersElements[0];\n if (pgBordersXml) {\n const pageBorders: any = {};\n const offsetFrom = XMLParser.extractAttribute(pgBordersXml, 'w:offsetFrom');\n if (offsetFrom) pageBorders.offsetFrom = offsetFrom;\n const display = XMLParser.extractAttribute(pgBordersXml, 'w:display');\n if (display) pageBorders.display = display;\n const zOrder = XMLParser.extractAttribute(pgBordersXml, 'w:zOrder');\n if (zOrder) pageBorders.zOrder = zOrder;\n\n const parseBorder = (sideXml: string): any | undefined => {\n if (!sideXml) return undefined;\n const border: any = {};\n const val = XMLParser.extractAttribute(sideXml, 'w:val');\n if (val) border.style = val;\n const sz = XMLParser.extractAttribute(sideXml, 'w:sz');\n if (sz) border.size = parseInt(sz.toString(), 10);\n const color = XMLParser.extractAttribute(sideXml, 'w:color');\n if (color) border.color = color;\n const space = XMLParser.extractAttribute(sideXml, 'w:space');\n if (space) border.space = parseInt(space.toString(), 10);\n const shadow = XMLParser.extractAttribute(sideXml, 'w:shadow');\n if (shadow === '1' || shadow === 'true') border.shadow = true;\n const frame = XMLParser.extractAttribute(sideXml, 'w:frame');\n if (frame === '1' || frame === 'true') border.frame = true;\n const themeColor = XMLParser.extractAttribute(sideXml, 'w:themeColor');\n if (themeColor) border.themeColor = themeColor;\n const artId = XMLParser.extractAttribute(sideXml, 'w:id');\n if (artId) border.artId = parseInt(artId.toString(), 10);\n return Object.keys(border).length > 0 ? border : undefined;\n };\n\n const sides = ['top', 'left', 'bottom', 'right'];\n for (const side of sides) {\n const sideElements = XMLParser.extractElements(pgBordersXml, `w:${side}`);\n if (sideElements.length > 0 && sideElements[0]) {\n const border = parseBorder(sideElements[0]);\n if (border) pageBorders[side] = border;\n }\n }\n\n if (Object.keys(pageBorders).length > 0) {\n sectionProps.pageBorders = pageBorders;\n }\n }\n }\n\n // Parse columns (enhanced with separator and custom widths)\n const colsElements = XMLParser.extractElements(sectPr, 'w:cols');\n if (colsElements.length > 0) {\n const cols = colsElements[0];\n if (cols) {\n const num = XMLParser.extractAttribute(cols, 'w:num');\n const space = XMLParser.extractAttribute(cols, 'w:space');\n const equalWidth = XMLParser.extractAttribute(cols, 'w:equalWidth');\n const sep = XMLParser.extractAttribute(cols, 'w:sep');\n\n // Extract individual column widths\n const colElements = XMLParser.extractElements(cols, 'w:col');\n const columnWidths: number[] = [];\n for (const col of colElements) {\n const width = XMLParser.extractAttribute(col, 'w:w');\n if (width) {\n columnWidths.push(parseInt(width.toString(), 10));\n }\n }\n\n // Helper to handle boolean conversion (XMLParser may return string or number)\n const toBool = (val: any) => val === '1' || val === 1 || val === 'true' || val === true;\n\n if (num) {\n sectionProps.columns = {\n count: parseInt(num.toString(), 10),\n space: space ? parseInt(space.toString(), 10) : undefined,\n equalWidth: equalWidth ? toBool(equalWidth) : undefined,\n separator: sep ? toBool(sep) : undefined,\n columnWidths: columnWidths.length > 0 ? columnWidths : undefined,\n };\n }\n }\n }\n\n // Parse section type\n const typeElements = XMLParser.extractElements(sectPr, 'w:type');\n if (typeElements.length > 0) {\n const type = typeElements[0];\n if (type) {\n const typeVal = XMLParser.extractAttribute(type, 'w:val') as SectionType;\n if (typeVal) {\n sectionProps.type = typeVal;\n }\n }\n }\n\n // Parse page numbering\n const pgNumTypeElements = XMLParser.extractElements(sectPr, 'w:pgNumType');\n if (pgNumTypeElements.length > 0) {\n const pgNumType = pgNumTypeElements[0];\n if (pgNumType) {\n const start = XMLParser.extractAttribute(pgNumType, 'w:start');\n const fmt = XMLParser.extractAttribute(pgNumType, 'w:fmt')!;\n\n sectionProps.pageNumbering = {\n start: start ? parseInt(start, 10) : undefined,\n format: fmt,\n };\n\n // Parse chapter numbering (w:chapStyle, w:chapSep)\n const chapStyle = XMLParser.extractAttribute(pgNumType, 'w:chapStyle');\n if (chapStyle) {\n sectionProps.chapStyle = parseInt(chapStyle, 10);\n }\n const chapSep = XMLParser.extractAttribute(pgNumType, 'w:chapSep');\n if (chapSep) {\n sectionProps.chapSep = chapSep as any;\n }\n }\n }\n\n // Parse title page flag\n if (XMLParser.hasSelfClosingTag(sectPr, 'w:titlePg')) {\n sectionProps.titlePage = true;\n }\n\n // Parse header references\n const headerRefs = XMLParser.extractElements(sectPr, 'w:headerReference');\n if (headerRefs.length > 0) {\n sectionProps.headers = {};\n for (const headerRef of headerRefs) {\n const type = XMLParser.extractAttribute(headerRef, 'w:type');\n const rId = XMLParser.extractAttribute(headerRef, 'r:id');\n if (type && rId) {\n if (type === 'default') sectionProps.headers.default = rId;\n else if (type === 'first') sectionProps.headers.first = rId;\n else if (type === 'even') sectionProps.headers.even = rId;\n }\n }\n }\n\n // Parse footer references\n const footerRefs = XMLParser.extractElements(sectPr, 'w:footerReference');\n if (footerRefs.length > 0) {\n sectionProps.footers = {};\n for (const footerRef of footerRefs) {\n const type = XMLParser.extractAttribute(footerRef, 'w:type');\n const rId = XMLParser.extractAttribute(footerRef, 'r:id');\n if (type && rId) {\n if (type === 'default') sectionProps.footers.default = rId;\n else if (type === 'first') sectionProps.footers.first = rId;\n else if (type === 'even') sectionProps.footers.even = rId;\n }\n }\n }\n\n // Parse vertical alignment\n const vAlignElements = XMLParser.extractElements(sectPr, 'w:vAlign');\n if (vAlignElements.length > 0) {\n const vAlign = vAlignElements[0];\n if (vAlign) {\n const val = XMLParser.extractAttribute(vAlign, 'w:val');\n if (val) {\n sectionProps.verticalAlignment = val as 'top' | 'center' | 'bottom' | 'both';\n }\n }\n }\n\n // Parse paper source\n const paperSrcElements = XMLParser.extractElements(sectPr, 'w:paperSrc');\n if (paperSrcElements.length > 0) {\n const paperSrc = paperSrcElements[0];\n if (paperSrc) {\n const first = XMLParser.extractAttribute(paperSrc, 'w:first');\n const other = XMLParser.extractAttribute(paperSrc, 'w:other');\n\n if (first || other) {\n sectionProps.paperSource = {\n first: first ? parseInt(first.toString(), 10) : undefined,\n other: other ? parseInt(other.toString(), 10) : undefined,\n };\n }\n }\n }\n\n // Parse text direction\n const textDirElements = XMLParser.extractElements(sectPr, 'w:textDirection');\n if (textDirElements.length > 0) {\n const textDir = textDirElements[0];\n if (textDir) {\n const val = XMLParser.extractAttribute(textDir, 'w:val');\n if (val) {\n // Reverse-map OOXML value \"lrTb\" to API shorthand \"ltr\".\n // \"tbRl\" and \"btLr\" are used directly in both OOXML and API.\n const reverseTextDirMap: Record<string, string> = {\n lrTb: 'ltr',\n };\n sectionProps.textDirection = (reverseTextDirMap[val] || val) as\n | 'ltr'\n | 'rtl'\n | 'tbRl'\n | 'btLr';\n }\n }\n }\n\n // Parse bidi (right-to-left section layout)\n if (XMLParser.hasSelfClosingTag(sectPr, 'w:bidi')) {\n sectionProps.bidi = true;\n }\n\n // Parse RTL gutter\n if (XMLParser.hasSelfClosingTag(sectPr, 'w:rtlGutter')) {\n sectionProps.rtlGutter = true;\n }\n\n // Parse document grid (w:docGrid)\n const docGridElements = XMLParser.extractElements(sectPr, 'w:docGrid');\n if (docGridElements.length > 0) {\n const docGrid = docGridElements[0];\n if (docGrid) {\n const gridType = XMLParser.extractAttribute(docGrid, 'w:type');\n const linePitch = XMLParser.extractAttribute(docGrid, 'w:linePitch');\n const charSpace = XMLParser.extractAttribute(docGrid, 'w:charSpace');\n sectionProps.docGrid = {};\n if (gridType) sectionProps.docGrid.type = gridType as any;\n if (linePitch) sectionProps.docGrid.linePitch = parseInt(linePitch, 10);\n if (charSpace) sectionProps.docGrid.charSpace = parseInt(charSpace, 10);\n }\n }\n\n // Parse line numbering (w:lnNumType)\n const lnNumElements = XMLParser.extractElements(sectPr, 'w:lnNumType');\n if (lnNumElements.length > 0) {\n const lnNum = lnNumElements[0];\n if (lnNum) {\n const countBy = XMLParser.extractAttribute(lnNum, 'w:countBy');\n const start = XMLParser.extractAttribute(lnNum, 'w:start');\n const distance = XMLParser.extractAttribute(lnNum, 'w:distance');\n const restart = XMLParser.extractAttribute(lnNum, 'w:restart');\n sectionProps.lineNumbering = {};\n if (countBy) sectionProps.lineNumbering.countBy = parseInt(countBy, 10);\n if (start) sectionProps.lineNumbering.start = parseInt(start, 10);\n if (distance) sectionProps.lineNumbering.distance = parseInt(distance, 10);\n if (restart) sectionProps.lineNumbering.restart = restart as any;\n }\n }\n\n // Helper to extract a single attribute from a child element\n const extractChildAttr = (\n parentXml: string,\n childTag: string,\n attr: string\n ): string | undefined => {\n const els = XMLParser.extractElements(parentXml, childTag);\n if (els.length > 0 && els[0]) return XMLParser.extractAttribute(els[0], attr);\n return undefined;\n };\n\n // Parse footnote properties (w:footnotePr)\n const footnotePrElements = XMLParser.extractElements(sectPr, 'w:footnotePr');\n if (footnotePrElements.length > 0 && footnotePrElements[0]) {\n const fnPr = footnotePrElements[0];\n const props: any = {};\n const pos = extractChildAttr(fnPr, 'w:pos', 'w:val');\n if (pos) props.position = pos;\n const fmt = extractChildAttr(fnPr, 'w:numFmt', 'w:val');\n if (fmt) props.numberFormat = fmt;\n const startVal = extractChildAttr(fnPr, 'w:numStart', 'w:val');\n if (startVal) props.startNumber = parseInt(startVal, 10);\n const restart = extractChildAttr(fnPr, 'w:numRestart', 'w:val');\n if (restart) props.restart = restart;\n if (Object.keys(props).length > 0) sectionProps.footnotePr = props;\n }\n\n // Parse endnote properties (w:endnotePr)\n const endnotePrElements = XMLParser.extractElements(sectPr, 'w:endnotePr');\n if (endnotePrElements.length > 0 && endnotePrElements[0]) {\n const enPr = endnotePrElements[0];\n const props: any = {};\n const pos = extractChildAttr(enPr, 'w:pos', 'w:val');\n if (pos) props.position = pos;\n const fmt = extractChildAttr(enPr, 'w:numFmt', 'w:val');\n if (fmt) props.numberFormat = fmt;\n const startVal = extractChildAttr(enPr, 'w:numStart', 'w:val');\n if (startVal) props.startNumber = parseInt(startVal, 10);\n const restart = extractChildAttr(enPr, 'w:numRestart', 'w:val');\n if (restart) props.restart = restart;\n if (Object.keys(props).length > 0) sectionProps.endnotePr = props;\n }\n\n // Parse noEndnote\n if (XMLParser.hasSelfClosingTag(sectPr, 'w:noEndnote')) {\n sectionProps.noEndnote = true;\n }\n\n // Parse form protection\n if (XMLParser.hasSelfClosingTag(sectPr, 'w:formProt')) {\n sectionProps.formProt = true;\n }\n\n // Parse printer settings (w:printerSettings r:id)\n const printerElements = XMLParser.extractElements(sectPr, 'w:printerSettings');\n if (printerElements.length > 0) {\n const printer = printerElements[0];\n if (printer) {\n const rId = XMLParser.extractAttribute(printer, 'r:id');\n if (rId) sectionProps.printerSettingsId = rId;\n }\n }\n\n const section = new Section(sectionProps);\n\n // Parse section property change (w:sectPrChange) per ECMA-376 Part 1 §17.13.5.32\n const sectPrChangeElements = XMLParser.extractElements(sectPr, 'w:sectPrChange');\n if (sectPrChangeElements.length > 0 && sectPrChangeElements[0]) {\n const changeXml = sectPrChangeElements[0];\n const id = XMLParser.extractAttribute(changeXml, 'w:id') || '0';\n const author = XMLParser.extractAttribute(changeXml, 'w:author') || '';\n const date = XMLParser.extractAttribute(changeXml, 'w:date') || '';\n\n // Extract the previous w:sectPr child\n const prevSectPrElements = XMLParser.extractElements(changeXml, 'w:sectPr');\n const prevSectPrXml = prevSectPrElements.length > 0 ? prevSectPrElements[0] : undefined;\n const prevProps = prevSectPrXml ? this.parsePreviousSectionProperties(prevSectPrXml) : {};\n\n section.setSectPrChange({ id, author, date, previousProperties: prevProps });\n }\n\n return section;\n } catch (error: unknown) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.parseErrors.push({ element: 'sectPr', error: err });\n\n if (this.strictParsing) {\n throw new Error(`Failed to parse section properties: ${err.message}`);\n }\n\n return null;\n }\n }\n\n /**\n * Parses a single style element from XML\n * @param styleXml - XML string of a single w:style element\n * @returns Parsed Style object or null if invalid\n */\n private parseStyle(styleXml: string): Style | null {\n // Extract style attributes\n const typeAttr = XMLParser.extractAttribute(styleXml, 'w:type') as StyleType;\n const styleId = XMLParser.extractAttribute(styleXml, 'w:styleId') || '';\n const defaultAttr = XMLParser.extractAttribute(styleXml, 'w:default');\n const customStyleAttr = XMLParser.extractAttribute(styleXml, 'w:customStyle');\n\n if (!styleId || !typeAttr) {\n return null; // Invalid style, missing required attributes\n }\n\n // Extract style name (handles both self-closing and non-self-closing tags)\n // First try self-closing tag: <w:name w:val=\"List Paragraph\"/>\n let name: string = styleId;\n const selfClosingNameAttrs = XMLParser.extractSelfClosingTag(styleXml, 'w:name');\n if (selfClosingNameAttrs) {\n // Got attributes like: ' w:val=\"List Paragraph\"'\n const extractedName = XMLParser.extractAttribute(`<w:name${selfClosingNameAttrs}/>`, 'w:val');\n if (extractedName) {\n name = extractedName;\n }\n } else {\n // Try non-self-closing: <w:name w:val=\"...\"></w:name>\n const nameElement = XMLParser.extractBetweenTags(styleXml, '<w:name', '</w:name>');\n if (nameElement) {\n const extractedName = XMLParser.extractAttribute(`<w:name${nameElement}`, 'w:val');\n if (extractedName) {\n name = extractedName;\n }\n }\n }\n\n // Extract basedOn\n const basedOnElement = XMLParser.extractBetweenTags(styleXml, '<w:basedOn', '</w:basedOn>');\n const basedOn = basedOnElement\n ? XMLParser.extractAttribute(`<w:basedOn${basedOnElement}`, 'w:val')\n : undefined;\n\n // Extract next\n const nextElement = XMLParser.extractBetweenTags(styleXml, '<w:next', '</w:next>');\n const next = nextElement\n ? XMLParser.extractAttribute(`<w:next${nextElement}`, 'w:val')\n : undefined;\n\n // Parse paragraph formatting (w:pPr)\n let paragraphFormatting: ParagraphFormatting | undefined;\n let styleNumPr: { numId?: number; ilvl?: number } | undefined;\n const pPrXml = XMLParser.extractBetweenTags(styleXml, '<w:pPr>', '</w:pPr>');\n if (pPrXml) {\n paragraphFormatting = this.parseParagraphFormattingFromXml(pPrXml);\n\n // Parse numPr (numbering properties) from style's paragraph properties\n // Styles like ListParagraph can inherit list formatting via numPr\n const numPrXml = XMLParser.extractBetweenTags(pPrXml, '<w:numPr>', '</w:numPr>');\n if (numPrXml) {\n styleNumPr = {};\n const numIdMatch = /<w:numId[^>]*w:val=\"(\\d+)\"/.exec(numPrXml);\n if (numIdMatch?.[1]) {\n styleNumPr.numId = parseInt(numIdMatch[1], 10);\n }\n const ilvlMatch = /<w:ilvl[^>]*w:val=\"(\\d+)\"/.exec(numPrXml);\n if (ilvlMatch?.[1]) {\n styleNumPr.ilvl = parseInt(ilvlMatch[1], 10);\n }\n }\n }\n\n // Parse run formatting (w:rPr)\n let runFormatting: RunFormatting | undefined;\n const rPrXml = XMLParser.extractBetweenTags(styleXml, '<w:rPr>', '</w:rPr>');\n if (rPrXml) {\n runFormatting = this.parseRunFormattingFromXml(rPrXml);\n }\n\n // Parse metadata properties (Phase 5.3)\n // qFormat - Quick style gallery\n const qFormat = styleXml.includes('<w:qFormat/>') || styleXml.includes('<w:qFormat ');\n\n // semiHidden - Hide from recommended list\n const semiHidden = styleXml.includes('<w:semiHidden/>') || styleXml.includes('<w:semiHidden ');\n\n // unhideWhenUsed - Auto-show when applied\n const unhideWhenUsed =\n styleXml.includes('<w:unhideWhenUsed/>') || styleXml.includes('<w:unhideWhenUsed ');\n\n // locked - Prevent modification\n const locked = styleXml.includes('<w:locked/>') || styleXml.includes('<w:locked ');\n\n // personal - User-specific style\n const personal = styleXml.includes('<w:personal/>') || styleXml.includes('<w:personal ');\n\n // personalCompose - Style for composing new messages\n const personalCompose =\n styleXml.includes('<w:personalCompose/>') || styleXml.includes('<w:personalCompose ');\n\n // personalReply - Style for replying to messages\n const personalReply =\n styleXml.includes('<w:personalReply/>') || styleXml.includes('<w:personalReply ');\n\n // autoRedefine - Update style from formatting\n const autoRedefine =\n styleXml.includes('<w:autoRedefine/>') || styleXml.includes('<w:autoRedefine ');\n\n // uiPriority - Sort order\n let uiPriority: number | undefined;\n if (styleXml.includes('<w:uiPriority')) {\n const uiPriorityStart = styleXml.indexOf('<w:uiPriority');\n const uiPriorityEnd = styleXml.indexOf('/>', uiPriorityStart);\n if (uiPriorityEnd !== -1) {\n const uiPriorityTag = styleXml.substring(uiPriorityStart, uiPriorityEnd + 2);\n const valStr = XMLParser.extractAttribute(uiPriorityTag, 'w:val');\n if (valStr) {\n uiPriority = parseInt(valStr, 10);\n }\n }\n }\n\n // link - Linked character/paragraph style\n let link: string | undefined;\n if (styleXml.includes('<w:link')) {\n const linkStart = styleXml.indexOf('<w:link');\n const linkEnd = styleXml.indexOf('/>', linkStart);\n if (linkEnd !== -1) {\n const linkTag = styleXml.substring(linkStart, linkEnd + 2);\n link = XMLParser.extractAttribute(linkTag, 'w:val') || undefined;\n }\n }\n\n // aliases - Alternative names\n let aliases: string | undefined;\n if (styleXml.includes('<w:aliases')) {\n const aliasesStart = styleXml.indexOf('<w:aliases');\n const aliasesEnd = styleXml.indexOf('/>', aliasesStart);\n if (aliasesEnd !== -1) {\n const aliasesTag = styleXml.substring(aliasesStart, aliasesEnd + 2);\n aliases = XMLParser.extractAttribute(aliasesTag, 'w:val') || undefined;\n }\n }\n\n // Parse table style properties (Phase 5.1)\n let tableStyle: import('../formatting/Style').TableStyleProperties | undefined;\n if (typeAttr === 'table') {\n tableStyle = this.parseTableStyleProperties(styleXml);\n }\n\n // Create style properties\n const properties: StyleProperties = {\n styleId,\n name,\n type: typeAttr,\n basedOn,\n next,\n isDefault: defaultAttr === '1' || defaultAttr === 'true',\n customStyle: customStyleAttr === '1' || customStyleAttr === 'true',\n paragraphFormatting,\n numPr: styleNumPr,\n runFormatting,\n tableStyle,\n // Metadata properties (Phase 5.3)\n qFormat: qFormat || undefined,\n semiHidden: semiHidden || undefined,\n unhideWhenUsed: unhideWhenUsed || undefined,\n locked: locked || undefined,\n personal: personal || undefined,\n personalCompose: personalCompose || undefined,\n personalReply: personalReply || undefined,\n autoRedefine: autoRedefine || undefined,\n uiPriority,\n link,\n aliases,\n };\n\n return Style.create(properties);\n }\n\n /**\n * Parses paragraph formatting from XML (w:pPr element content)\n * @param pPrXml - XML content inside w:pPr tags\n * @returns ParagraphFormatting object\n */\n private parseParagraphFormattingFromXml(pPrXml: string): ParagraphFormatting {\n const formatting: ParagraphFormatting = {};\n\n // Parse alignment (w:jc)\n const jcElement = XMLParser.extractSelfClosingTag(pPrXml, 'w:jc');\n if (jcElement) {\n const alignment = XMLParser.extractAttribute(`<w:jc${jcElement}`, 'w:val');\n if (alignment) {\n formatting.alignment = alignment as 'left' | 'center' | 'right' | 'justify';\n }\n }\n\n // Parse spacing (w:spacing)\n const spacingElement = XMLParser.extractSelfClosingTag(pPrXml, 'w:spacing');\n if (spacingElement) {\n const before = XMLParser.extractAttribute(`<w:spacing${spacingElement}`, 'w:before');\n const after = XMLParser.extractAttribute(`<w:spacing${spacingElement}`, 'w:after');\n const line = XMLParser.extractAttribute(`<w:spacing${spacingElement}`, 'w:line');\n const lineRule = XMLParser.extractAttribute(`<w:spacing${spacingElement}`, 'w:lineRule');\n\n // Validate lineRule\n let validatedLineRule: 'auto' | 'exact' | 'atLeast' | undefined;\n if (lineRule) {\n const validLineRules = ['auto', 'exact', 'atLeast'];\n if (validLineRules.includes(lineRule)) {\n validatedLineRule = lineRule as 'auto' | 'exact' | 'atLeast';\n }\n }\n\n formatting.spacing = {\n before: before ? parseInt(before, 10) : undefined,\n after: after ? parseInt(after, 10) : undefined,\n // If lineRule exists without line, use default 240 twips\n line: line ? parseInt(line, 10) : validatedLineRule ? 240 : undefined,\n lineRule: validatedLineRule,\n };\n }\n\n // Parse indentation (w:ind)\n const indElement = XMLParser.extractSelfClosingTag(pPrXml, 'w:ind');\n if (indElement) {\n const left = XMLParser.extractAttribute(`<w:ind${indElement}`, 'w:left');\n const right = XMLParser.extractAttribute(`<w:ind${indElement}`, 'w:right');\n const firstLine = XMLParser.extractAttribute(`<w:ind${indElement}`, 'w:firstLine');\n const hanging = XMLParser.extractAttribute(`<w:ind${indElement}`, 'w:hanging');\n\n formatting.indentation = {\n left: left ? parseInt(left, 10) : undefined,\n right: right ? parseInt(right, 10) : undefined,\n firstLine: firstLine ? parseInt(firstLine, 10) : undefined,\n hanging: hanging ? parseInt(hanging, 10) : undefined,\n };\n }\n\n // Parse boolean properties\n if (pPrXml.includes('<w:keepNext/>') || pPrXml.includes('<w:keepNext ')) {\n formatting.keepNext = true;\n }\n if (pPrXml.includes('<w:keepLines/>') || pPrXml.includes('<w:keepLines ')) {\n formatting.keepLines = true;\n }\n if (pPrXml.includes('<w:pageBreakBefore/>') || pPrXml.includes('<w:pageBreakBefore ')) {\n formatting.pageBreakBefore = true;\n }\n\n // Contextual spacing per ECMA-376 Part 1 §17.3.1.8\n // \"Don't add space between paragraphs of the same style\"\n if (pPrXml.includes('<w:contextualSpacing/>') || pPrXml.includes('<w:contextualSpacing ')) {\n formatting.contextualSpacing = true;\n }\n\n // Parse outline level (w:outlineLvl) - used for TOC generation\n // Per ECMA-376 Part 1 §17.3.1.20: val is 0-8 (heading levels 1-9)\n const outlineLvlElement = XMLParser.extractSelfClosingTag(pPrXml, 'w:outlineLvl');\n if (outlineLvlElement) {\n const outlineVal = XMLParser.extractAttribute(`<w:outlineLvl${outlineLvlElement}`, 'w:val');\n if (outlineVal) {\n const level = parseInt(outlineVal, 10);\n if (!isNaN(level) && level >= 0 && level <= 8) {\n formatting.outlineLevel = level;\n }\n }\n }\n\n // Parse shading (w:shd) per ECMA-376 Part 1 §17.3.1.32\n const shading = this.parseShadingFromXml(pPrXml);\n if (shading) {\n formatting.shading = shading;\n }\n\n return formatting;\n }\n\n /**\n * Parses run formatting from XML (w:rPr element content)\n * @param rPrXml - XML content inside w:rPr tags\n * @returns RunFormatting object\n */\n private parseRunFormattingFromXml(rPrXml: string): RunFormatting {\n const formatting: RunFormatting = {};\n\n // Parse boolean properties\n if (rPrXml.includes('<w:b/>') || rPrXml.includes('<w:b ')) {\n formatting.bold = true;\n }\n if (rPrXml.includes('<w:i/>') || rPrXml.includes('<w:i ')) {\n formatting.italic = true;\n }\n if (rPrXml.includes('<w:strike/>') || rPrXml.includes('<w:strike ')) {\n formatting.strike = true;\n }\n if (rPrXml.includes('<w:smallCaps/>') || rPrXml.includes('<w:smallCaps ')) {\n formatting.smallCaps = true;\n }\n if (rPrXml.includes('<w:caps/>') || rPrXml.includes('<w:caps ')) {\n formatting.allCaps = true;\n }\n\n // Parse underline - use extractSelfClosingTag for accuracy\n const uElement = XMLParser.extractSelfClosingTag(rPrXml, 'w:u');\n if (uElement) {\n const uVal = XMLParser.extractAttribute(`<w:u${uElement}`, 'w:val');\n if (\n uVal === 'single' ||\n uVal === 'double' ||\n uVal === 'thick' ||\n uVal === 'dotted' ||\n uVal === 'dash' ||\n uVal === 'none'\n ) {\n formatting.underline = uVal;\n } else {\n formatting.underline = true;\n }\n }\n\n // Parse subscript/superscript - use extractSelfClosingTag\n const vertAlignElement = XMLParser.extractSelfClosingTag(rPrXml, 'w:vertAlign');\n if (vertAlignElement) {\n const val = XMLParser.extractAttribute(`<w:vertAlign${vertAlignElement}`, 'w:val');\n if (val === 'subscript') {\n formatting.subscript = true;\n } else if (val === 'superscript') {\n formatting.superscript = true;\n }\n }\n\n // Parse font (w:rFonts) - use extractSelfClosingTag\n const rFontsElement = XMLParser.extractSelfClosingTag(rPrXml, 'w:rFonts');\n if (rFontsElement) {\n const ascii = XMLParser.extractAttribute(`<w:rFonts${rFontsElement}`, 'w:ascii');\n if (ascii) {\n formatting.font = ascii;\n }\n }\n\n // Parse size (w:sz) - size is in half-points\n // Use extractSelfClosingTag to avoid matching w:szCs\n const szElement = XMLParser.extractSelfClosingTag(rPrXml, 'w:sz');\n if (szElement) {\n const val = XMLParser.extractAttribute(`<w:sz${szElement}`, 'w:val');\n if (val) {\n formatting.size = halfPointsToPoints(parseInt(val, 10));\n }\n }\n\n // Parse color (w:color)\n // Use extractSelfClosingTag to avoid matching other tags\n const colorElement = XMLParser.extractSelfClosingTag(rPrXml, 'w:color');\n if (colorElement) {\n const val = XMLParser.extractAttribute(`<w:color${colorElement}`, 'w:val');\n if (val && val !== 'auto') {\n formatting.color = val;\n }\n }\n\n // Parse highlight (w:highlight) - use extractSelfClosingTag\n const highlightElement = XMLParser.extractSelfClosingTag(rPrXml, 'w:highlight');\n if (highlightElement) {\n const val = XMLParser.extractAttribute(`<w:highlight${highlightElement}`, 'w:val');\n if (val) {\n const validHighlights = [\n 'yellow',\n 'green',\n 'cyan',\n 'magenta',\n 'blue',\n 'red',\n 'darkBlue',\n 'darkCyan',\n 'darkGreen',\n 'darkMagenta',\n 'darkRed',\n 'darkYellow',\n 'darkGray',\n 'lightGray',\n 'black',\n 'white',\n ];\n if (validHighlights.includes(val)) {\n formatting.highlight = val as\n | 'yellow'\n | 'green'\n | 'cyan'\n | 'magenta'\n | 'blue'\n | 'red'\n | 'darkBlue'\n | 'darkCyan'\n | 'darkGreen'\n | 'darkMagenta'\n | 'darkRed'\n | 'darkYellow'\n | 'darkGray'\n | 'lightGray'\n | 'black'\n | 'white';\n }\n }\n }\n\n // Parse shading (w:shd) per ECMA-376 Part 1 §17.3.2.32\n const shading = this.parseShadingFromXml(rPrXml);\n if (shading) {\n formatting.shading = shading;\n }\n\n return formatting;\n }\n\n /**\n * Parses table style properties from style XML (Phase 5.1)\n * @param styleXml - XML string of a table style element\n * @returns TableStyleProperties object\n */\n private parseTableStyleProperties(\n styleXml: string\n ): import('../formatting/Style').TableStyleProperties {\n const tableStyle: import('../formatting/Style').TableStyleProperties = {};\n\n // Parse tblPr (table properties)\n const tblPrXml = XMLParser.extractBetweenTags(styleXml, '<w:tblPr>', '</w:tblPr>');\n if (tblPrXml) {\n tableStyle.table = this.parseTableFormattingFromXml(tblPrXml);\n\n // Row band size\n if (tblPrXml.includes('<w:tblStyleRowBandSize')) {\n const tag = XMLParser.extractSelfClosingTag(tblPrXml, 'w:tblStyleRowBandSize');\n if (tag) {\n const val = XMLParser.extractAttribute(`<w:tblStyleRowBandSize${tag}`, 'w:val');\n if (val) {\n tableStyle.rowBandSize = parseInt(val, 10);\n }\n }\n }\n\n // Column band size\n if (tblPrXml.includes('<w:tblStyleColBandSize')) {\n const tag = XMLParser.extractSelfClosingTag(tblPrXml, 'w:tblStyleColBandSize');\n if (tag) {\n const val = XMLParser.extractAttribute(`<w:tblStyleColBandSize${tag}`, 'w:val');\n if (val) {\n tableStyle.colBandSize = parseInt(val, 10);\n }\n }\n }\n }\n\n // Parse tcPr (cell properties)\n const tcPrXml = XMLParser.extractBetweenTags(styleXml, '<w:tcPr>', '</w:tcPr>');\n if (tcPrXml) {\n tableStyle.cell = this.parseTableCellFormattingFromXml(tcPrXml);\n }\n\n // Parse trPr (row properties)\n const trPrXml = XMLParser.extractBetweenTags(styleXml, '<w:trPr>', '</w:trPr>');\n if (trPrXml) {\n tableStyle.row = this.parseTableRowFormattingFromXml(trPrXml);\n }\n\n // Parse tblStylePr (conditional formatting)\n tableStyle.conditionalFormatting = this.parseConditionalFormattingFromXml(styleXml);\n\n return tableStyle;\n }\n\n /**\n * Parses table formatting from tblPr XML (Phase 5.1)\n */\n private parseTableFormattingFromXml(\n tblPrXml: string\n ): import('../formatting/Style').TableStyleFormatting {\n const formatting: import('../formatting/Style').TableStyleFormatting = {};\n\n // Parse indent\n if (tblPrXml.includes('<w:tblInd')) {\n const tag = XMLParser.extractSelfClosingTag(tblPrXml, 'w:tblInd');\n if (tag) {\n const w = XMLParser.extractAttribute(`<w:tblInd${tag}`, 'w:w');\n if (w) {\n formatting.indent = parseInt(w, 10);\n }\n }\n }\n\n // Parse alignment\n if (tblPrXml.includes('<w:jc')) {\n const tag = XMLParser.extractSelfClosingTag(tblPrXml, 'w:jc');\n if (tag) {\n const val = XMLParser.extractAttribute(`<w:jc${tag}`, 'w:val');\n if (val === 'left' || val === 'center' || val === 'right') {\n formatting.alignment = val;\n }\n }\n }\n\n // Parse cell spacing\n if (tblPrXml.includes('<w:tblCellSpacing')) {\n const tag = XMLParser.extractSelfClosingTag(tblPrXml, 'w:tblCellSpacing');\n if (tag) {\n const w = XMLParser.extractAttribute(`<w:tblCellSpacing${tag}`, 'w:w');\n if (w) {\n formatting.cellSpacing = parseInt(w, 10);\n }\n }\n }\n\n // Parse borders\n const bordersXml = XMLParser.extractBetweenTags(tblPrXml, '<w:tblBorders>', '</w:tblBorders>');\n if (bordersXml) {\n formatting.borders = this.parseBordersFromXml(bordersXml, false);\n }\n\n // Parse shading\n if (tblPrXml.includes('<w:shd')) {\n formatting.shading = this.parseShadingFromXml(tblPrXml);\n }\n\n // Parse cell margins\n const marginXml = XMLParser.extractBetweenTags(tblPrXml, '<w:tblCellMar>', '</w:tblCellMar>');\n if (marginXml) {\n formatting.cellMargins = this.parseCellMarginsFromXml(marginXml);\n }\n\n return formatting;\n }\n\n /**\n * Parses table cell formatting from tcPr XML (Phase 5.1)\n */\n private parseTableCellFormattingFromXml(\n tcPrXml: string\n ): import('../formatting/Style').TableCellStyleFormatting {\n const formatting: import('../formatting/Style').TableCellStyleFormatting = {};\n\n // Parse borders\n const bordersXml = XMLParser.extractBetweenTags(tcPrXml, '<w:tcBorders>', '</w:tcBorders>');\n if (bordersXml) {\n formatting.borders = this.parseBordersFromXml(\n bordersXml,\n true\n ) as import('../formatting/Style').CellBorders;\n }\n\n // Parse shading\n if (tcPrXml.includes('<w:shd')) {\n formatting.shading = this.parseShadingFromXml(tcPrXml);\n }\n\n // Parse margins\n const marginXml = XMLParser.extractBetweenTags(tcPrXml, '<w:tcMar>', '</w:tcMar>');\n if (marginXml) {\n formatting.margins = this.parseCellMarginsFromXml(marginXml);\n }\n\n // Parse vertical alignment\n if (tcPrXml.includes('<w:vAlign')) {\n const tag = XMLParser.extractSelfClosingTag(tcPrXml, 'w:vAlign');\n if (tag) {\n const val = XMLParser.extractAttribute(`<w:vAlign${tag}`, 'w:val');\n if (val === 'top' || val === 'center' || val === 'bottom') {\n formatting.verticalAlignment = val;\n }\n }\n }\n\n return formatting;\n }\n\n /**\n * Parses table row formatting from trPr XML (Phase 5.1)\n */\n private parseTableRowFormattingFromXml(\n trPrXml: string\n ): import('../formatting/Style').TableRowStyleFormatting {\n const formatting: import('../formatting/Style').TableRowStyleFormatting = {};\n\n // Parse height\n if (trPrXml.includes('<w:trHeight')) {\n const tag = XMLParser.extractSelfClosingTag(trPrXml, 'w:trHeight');\n if (tag) {\n const val = XMLParser.extractAttribute(`<w:trHeight${tag}`, 'w:val');\n const hRule = XMLParser.extractAttribute(`<w:trHeight${tag}`, 'w:hRule');\n if (val) {\n formatting.height = parseInt(val, 10);\n }\n if (hRule === 'auto' || hRule === 'exact' || hRule === 'atLeast') {\n formatting.heightRule = hRule;\n }\n }\n }\n\n // Parse cantSplit\n if (trPrXml.includes('<w:cantSplit/>') || trPrXml.includes('<w:cantSplit ')) {\n formatting.cantSplit = true;\n }\n\n // Parse tblHeader (isHeader)\n if (trPrXml.includes('<w:tblHeader/>') || trPrXml.includes('<w:tblHeader ')) {\n formatting.isHeader = true;\n }\n\n return formatting;\n }\n\n /**\n * Parses conditional formatting from style XML (Phase 5.1)\n */\n private parseConditionalFormattingFromXml(\n styleXml: string\n ): import('../formatting/Style').ConditionalTableFormatting[] | undefined {\n const conditionalFormatting: import('../formatting/Style').ConditionalTableFormatting[] = [];\n\n // Find all tblStylePr elements\n let searchFrom = 0;\n while (true) {\n const startIdx = styleXml.indexOf('<w:tblStylePr', searchFrom);\n if (startIdx === -1) break;\n\n const endIdx = styleXml.indexOf('</w:tblStylePr>', startIdx);\n if (endIdx === -1) break;\n\n const tblStylePrXml = styleXml.substring(startIdx, endIdx + 15); // 15 = length of \"</w:tblStylePr>\"\n\n // Extract type attribute\n const typeAttr = XMLParser.extractAttribute(tblStylePrXml, 'w:type');\n if (typeAttr) {\n const conditional: import('../formatting/Style').ConditionalTableFormatting = {\n type: typeAttr as import('../formatting/Style').ConditionalFormattingType,\n };\n\n // Parse pPr\n const pPrXml = XMLParser.extractBetweenTags(tblStylePrXml, '<w:pPr>', '</w:pPr>');\n if (pPrXml) {\n conditional.paragraphFormatting = this.parseParagraphFormattingFromXml(pPrXml);\n }\n\n // Parse rPr\n const rPrXml = XMLParser.extractBetweenTags(tblStylePrXml, '<w:rPr>', '</w:rPr>');\n if (rPrXml) {\n conditional.runFormatting = this.parseRunFormattingFromXml(rPrXml);\n }\n\n // Parse tblPr\n const tblPrXml = XMLParser.extractBetweenTags(tblStylePrXml, '<w:tblPr>', '</w:tblPr>');\n if (tblPrXml) {\n conditional.tableFormatting = this.parseTableFormattingFromXml(tblPrXml);\n }\n\n // Parse tcPr\n const tcPrXml = XMLParser.extractBetweenTags(tblStylePrXml, '<w:tcPr>', '</w:tcPr>');\n if (tcPrXml) {\n conditional.cellFormatting = this.parseTableCellFormattingFromXml(tcPrXml);\n }\n\n // Parse trPr\n const trPrXml = XMLParser.extractBetweenTags(tblStylePrXml, '<w:trPr>', '</w:trPr>');\n if (trPrXml) {\n conditional.rowFormatting = this.parseTableRowFormattingFromXml(trPrXml);\n }\n\n conditionalFormatting.push(conditional);\n }\n\n searchFrom = endIdx + 15;\n }\n\n return conditionalFormatting.length > 0 ? conditionalFormatting : undefined;\n }\n\n /**\n * Parses borders from XML (Phase 5.1)\n * @param bordersXml - XML content from tblBorders or tcBorders\n * @param includeDiagonals - Whether to include diagonal borders (for cells)\n */\n private parseBordersFromXml(\n bordersXml: string,\n includeDiagonals: boolean\n ): import('../formatting/Style').TableBorders | import('../formatting/Style').CellBorders {\n const borders: any = {};\n\n const borderTypes = ['top', 'bottom', 'left', 'right', 'insideH', 'insideV'];\n for (const type of borderTypes) {\n if (bordersXml.includes(`<w:${type}`)) {\n const tag = XMLParser.extractSelfClosingTag(bordersXml, `w:${type}`);\n if (tag) {\n const style = XMLParser.extractAttribute(`<w:${type}${tag}`, 'w:val');\n const size = XMLParser.extractAttribute(`<w:${type}${tag}`, 'w:sz');\n const space = XMLParser.extractAttribute(`<w:${type}${tag}`, 'w:space');\n const color = XMLParser.extractAttribute(`<w:${type}${tag}`, 'w:color');\n\n const border: import('../formatting/Style').BorderProperties = {};\n if (style) border.style = style as any;\n if (size) border.size = parseInt(size, 10);\n if (space) border.space = parseInt(space, 10);\n if (color) border.color = color;\n\n if (Object.keys(border).length > 0) {\n borders[type] = border;\n }\n }\n }\n }\n\n // Add diagonal borders for cells\n if (includeDiagonals) {\n const diagonalTypes = ['tl2br', 'tr2bl'];\n for (const type of diagonalTypes) {\n if (bordersXml.includes(`<w:${type}`)) {\n const tag = XMLParser.extractSelfClosingTag(bordersXml, `w:${type}`);\n if (tag) {\n const style = XMLParser.extractAttribute(`<w:${type}${tag}`, 'w:val');\n const size = XMLParser.extractAttribute(`<w:${type}${tag}`, 'w:sz');\n const space = XMLParser.extractAttribute(`<w:${type}${tag}`, 'w:space');\n const color = XMLParser.extractAttribute(`<w:${type}${tag}`, 'w:color');\n\n const border: import('../formatting/Style').BorderProperties = {};\n if (style) border.style = style as any;\n if (size) border.size = parseInt(size, 10);\n if (space) border.space = parseInt(space, 10);\n if (color) border.color = color;\n\n if (Object.keys(border).length > 0) {\n borders[type] = border;\n }\n }\n }\n }\n }\n\n return borders;\n }\n\n /**\n * Parses shading from an object-based XML representation (parseToObject format).\n * Extracts all 9 ECMA-376 shading attributes including theme colors.\n */\n private parseShadingFromObj(shd: any): ShadingConfig | undefined {\n const shading: ShadingConfig = {};\n if (shd['@_w:val']) shading.pattern = shd['@_w:val'];\n if (shd['@_w:fill']) shading.fill = shd['@_w:fill'];\n if (shd['@_w:color']) shading.color = shd['@_w:color'];\n if (shd['@_w:themeFill']) shading.themeFill = shd['@_w:themeFill'];\n if (shd['@_w:themeColor']) shading.themeColor = shd['@_w:themeColor'];\n if (shd['@_w:themeFillTint']) shading.themeFillTint = shd['@_w:themeFillTint'];\n if (shd['@_w:themeFillShade']) shading.themeFillShade = shd['@_w:themeFillShade'];\n if (shd['@_w:themeTint']) shading.themeTint = shd['@_w:themeTint'];\n if (shd['@_w:themeShade']) shading.themeShade = shd['@_w:themeShade'];\n return Object.keys(shading).length > 0 ? shading : undefined;\n }\n\n /**\n * Parses shading from XML (Phase 5.1)\n */\n private parseShadingFromXml(xml: string): ShadingConfig | undefined {\n const tag = XMLParser.extractSelfClosingTag(xml, 'w:shd');\n if (!tag) return undefined;\n\n const shading: ShadingConfig = {};\n const fullTag = `<w:shd${tag}`;\n const val = XMLParser.extractAttribute(fullTag, 'w:val');\n const color = XMLParser.extractAttribute(fullTag, 'w:color');\n const fill = XMLParser.extractAttribute(fullTag, 'w:fill');\n const themeFill = XMLParser.extractAttribute(fullTag, 'w:themeFill');\n const themeColor = XMLParser.extractAttribute(fullTag, 'w:themeColor');\n const themeFillTint = XMLParser.extractAttribute(fullTag, 'w:themeFillTint');\n const themeFillShade = XMLParser.extractAttribute(fullTag, 'w:themeFillShade');\n const themeTint = XMLParser.extractAttribute(fullTag, 'w:themeTint');\n const themeShade = XMLParser.extractAttribute(fullTag, 'w:themeShade');\n\n if (val) shading.pattern = val as ShadingConfig['pattern'];\n if (color) shading.color = color;\n if (fill) shading.fill = fill;\n if (themeFill) shading.themeFill = themeFill;\n if (themeColor) shading.themeColor = themeColor;\n if (themeFillTint) shading.themeFillTint = themeFillTint;\n if (themeFillShade) shading.themeFillShade = themeFillShade;\n if (themeTint) shading.themeTint = themeTint;\n if (themeShade) shading.themeShade = themeShade;\n\n return Object.keys(shading).length > 0 ? shading : undefined;\n }\n\n /**\n * Parses cell margins from XML (Phase 5.1)\n */\n private parseCellMarginsFromXml(\n marginXml: string\n ): import('../formatting/Style').CellMargins | undefined {\n const margins: import('../formatting/Style').CellMargins = {};\n\n const marginTypes = ['top', 'bottom', 'left', 'right'];\n for (const type of marginTypes) {\n if (marginXml.includes(`<w:${type}`)) {\n const tag = XMLParser.extractSelfClosingTag(marginXml, `w:${type}`);\n if (tag) {\n const w = XMLParser.extractAttribute(`<w:${type}${tag}`, 'w:w');\n if (w) {\n margins[type as keyof import('../formatting/Style').CellMargins] = parseInt(w, 10);\n }\n }\n }\n }\n\n return Object.keys(margins).length > 0 ? margins : undefined;\n }\n\n /**\n * Helper: Gets raw XML string from a document part\n * Utility function for parser to retrieve unparsed XML content\n * @param zipHandler - ZIP handler containing the document\n * @param partName - Part path (e.g., 'word/document.xml')\n * @returns Raw XML string or null if not found\n */\n static getRawXml(zipHandler: ZipHandler, partName: string): string | null {\n try {\n const file = zipHandler.getFile(partName);\n if (!file) {\n return null;\n }\n\n // If already a string, return as-is\n if (typeof file.content === 'string') {\n return file.content;\n }\n\n // If Buffer, decode as UTF-8\n if (Buffer.isBuffer(file.content)) {\n return file.content.toString('utf8');\n }\n\n return null;\n } catch (error: unknown) {\n return null;\n }\n }\n\n /**\n * Helper: Updates raw XML content in a document part\n * Utility function for parser to set unparsed XML content\n * @param zipHandler - ZIP handler containing the document\n * @param partName - Part path (e.g., 'word/document.xml')\n * @param xmlContent - Raw XML string to set\n * @returns True if successful, false otherwise\n */\n static setRawXml(zipHandler: ZipHandler, partName: string, xmlContent: string): boolean {\n try {\n if (typeof xmlContent !== 'string') {\n return false;\n }\n\n // Add or update the file in the ZIP handler\n // Convert string to UTF-8 Buffer for consistent encoding\n zipHandler.addFile(partName, Buffer.from(xmlContent, 'utf8'), {\n binary: true,\n });\n return true;\n } catch (error: unknown) {\n return false;\n }\n }\n\n /**\n * Helper: Gets relationships for a specific document part\n * Utility function for parser to access .rels files\n * @param zipHandler - ZIP handler containing the document\n * @param partName - Part name to get relationships for (e.g., 'word/document.xml')\n * @returns Array of relationships for that part, or empty array if none found\n */\n static getRelationships(\n zipHandler: ZipHandler,\n partName: string\n ): {\n id?: string;\n type?: string;\n target?: string;\n targetMode?: string;\n }[] {\n try {\n // Construct the .rels path from the part name\n // For 'word/document.xml' -> 'word/_rels/document.xml.rels'\n const lastSlash = partName.lastIndexOf('/');\n const relsPath =\n lastSlash === -1\n ? `_rels/${partName}.rels`\n : `${partName.substring(0, lastSlash)}/_rels/${partName.substring(lastSlash + 1)}.rels`;\n\n const relsContent = zipHandler.getFileAsString(relsPath);\n if (!relsContent) {\n return [];\n }\n\n interface ParsedRelationship {\n id?: string;\n type?: string;\n target?: string;\n targetMode?: string;\n }\n\n const relationships: ParsedRelationship[] = [];\n\n // Parse relationship XML\n const relPattern = /<Relationship\\s+([^>]+)\\/>/g;\n let match;\n\n while ((match = relPattern.exec(relsContent)) !== null) {\n const attrs = match[1];\n if (!attrs) continue;\n\n const rel: ParsedRelationship = {};\n\n // Extract attributes\n const idMatch = /Id=\"([^\"]+)\"/.exec(attrs);\n const typeMatch = /Type=\"([^\"]+)\"/.exec(attrs);\n const targetMatch = /Target=\"([^\"]+)\"/.exec(attrs);\n const modeMatch = /TargetMode=\"([^\"]+)\"/.exec(attrs);\n\n if (idMatch) rel.id = idMatch[1];\n if (typeMatch) rel.type = typeMatch[1];\n if (targetMatch) rel.target = targetMatch[1];\n if (modeMatch) rel.targetMode = modeMatch[1];\n\n relationships.push(rel);\n }\n\n return relationships;\n } catch (error: unknown) {\n return [];\n }\n }\n\n /**\n * Parses and extracts all namespace declarations from the root <w:document> tag\n *\n * @param docXml - The full XML content of word/document.xml\n * @returns A record of namespace prefixes to their URIs\n *\n * **Known Limitation - Default Namespace Not Extracted:**\n *\n * This method intentionally does NOT extract the default namespace (`xmlns=\"...\"`).\n * Only prefixed namespaces (`xmlns:w`, `xmlns:r`, etc.) are extracted.\n *\n * **Rationale:**\n * 1. Word documents use prefixed namespaces exclusively (w:p, w:r, w:t)\n * 2. Adding a default namespace to <w:document> causes document corruption\n * 3. Microsoft Word and LibreOffice reject documents with default namespaces\n * 4. ECMA-376 examples show only prefixed namespace declarations\n *\n * **Impact:**\n * - If an input document has a default namespace, it will be lost during round-trip\n * - This is rare (valid OOXML documents don't use default namespaces)\n * - Documents using default namespace are likely non-standard or corrupted\n *\n * **Per ECMA-376 Part 1 Section 11.3.4:**\n * The document element should use the WordprocessingML namespace with prefix.\n *\n * @see ECMA-376-1:2016 Part 1, Section 11.3.4\n */\n private parseNamespaces(docXml: string): Record<string, string> {\n const namespaces: Record<string, string> = {};\n const docTagMatch = /<w:document([^>]+)>/.exec(docXml);\n\n if (docTagMatch?.[1]) {\n const attributes = docTagMatch[1];\n const nsPattern = /xmlns:([^=]+)=\"([^\"]+)\"/g;\n let match;\n\n while ((match = nsPattern.exec(attributes)) !== null) {\n if (match[1] && match[2]) {\n namespaces[`xmlns:${match[1]}`] = match[2];\n }\n }\n\n // Capture mc:Ignorable attribute (critical for w14/w15/etc. compatibility).\n // Without this, Word treats extended namespace attributes (w14:paraId etc.)\n // in raw XML passthrough zones as invalid content and reports corruption.\n const ignorableMatch = /mc:Ignorable=\"([^\"]+)\"/.exec(attributes);\n if (ignorableMatch?.[1]) {\n namespaces['mc:Ignorable'] = ignorableMatch[1];\n }\n }\n\n return namespaces;\n }\n\n /**\n * Parses document background (w:background) per ECMA-376 Part 1 §17.2.1\n * The w:background element appears as a child of w:document, before w:body\n */\n private parseDocumentBackground(\n docXml: string\n ): { color?: string; themeColor?: string; themeTint?: string; themeShade?: string } | undefined {\n const bgMatch = /<w:background([^>]*?)\\/>/.exec(docXml);\n if (!bgMatch?.[1]) return undefined;\n\n const attrStr = bgMatch[1];\n const result: { color?: string; themeColor?: string; themeTint?: string; themeShade?: string } =\n {};\n\n const colorMatch = /w:color=\"([^\"]+)\"/.exec(attrStr);\n if (colorMatch?.[1]) result.color = colorMatch[1];\n\n const themeColorMatch = /w:themeColor=\"([^\"]+)\"/.exec(attrStr);\n if (themeColorMatch?.[1]) result.themeColor = themeColorMatch[1];\n\n const themeTintMatch = /w:themeTint=\"([^\"]+)\"/.exec(attrStr);\n if (themeTintMatch?.[1]) result.themeTint = themeTintMatch[1];\n\n const themeShadeMatch = /w:themeShade=\"([^\"]+)\"/.exec(attrStr);\n if (themeShadeMatch?.[1]) result.themeShade = themeShadeMatch[1];\n\n return Object.keys(result).length > 0 ? result : undefined;\n }\n\n /**\n * Parses headers and footers from a loaded document\n * Extracts header/footer XML files and creates Header/Footer objects\n * @param zipHandler - ZIP handler containing the document\n * @param section - Parsed section with header/footer references\n * @param relationshipManager - Relationship manager to lookup targets\n * @param imageManager - Image manager for parsing images in headers/footers\n * @returns Object with parsed headers and footers\n */\n async parseHeadersAndFooters(\n zipHandler: ZipHandler,\n section: Section | null,\n relationshipManager: RelationshipManager,\n imageManager: ImageManager\n ): Promise<{\n headers: {\n header: import('../elements/Header').Header;\n relationshipId: string;\n filename: string;\n }[];\n footers: {\n footer: import('../elements/Footer').Footer;\n relationshipId: string;\n filename: string;\n }[];\n }> {\n const headers: {\n header: import('../elements/Header').Header;\n relationshipId: string;\n filename: string;\n }[] = [];\n const footers: {\n footer: import('../elements/Footer').Footer;\n relationshipId: string;\n filename: string;\n }[] = [];\n\n if (!section) {\n return { headers, footers };\n }\n\n const sectionProps = section.getProperties();\n\n // Parse headers\n // Track already-parsed headers by rId to avoid creating duplicates\n // when multiple section property types (default, first, even) reference the same header file\n const parsedHeadersByRId = new Map<string, import('../elements/Header').Header>();\n\n if (sectionProps.headers) {\n for (const [type, rId] of Object.entries(sectionProps.headers)) {\n if (!rId) continue;\n\n // Get relationship to find header filename\n const rel = relationshipManager.getRelationship(rId);\n if (!rel) continue;\n\n const headerTarget = rel.getTarget();\n\n // Reuse already-parsed header if same rId was already processed\n const existingHeader = parsedHeadersByRId.get(rId);\n if (existingHeader) {\n headers.push({\n header: existingHeader,\n relationshipId: rId,\n filename: headerTarget,\n });\n continue;\n }\n\n const headerPath = `word/${headerTarget}`;\n const headerXml = zipHandler.getFileAsString(headerPath);\n if (!headerXml) continue;\n\n // Load header-specific relationships (for images in headers)\n // Header relationships are in word/_rels/header1.xml.rels for word/header1.xml\n const headerRelsPath = `word/_rels/${headerTarget}.rels`;\n const headerRelsXml = zipHandler.getFileAsString(headerRelsPath);\n const headerRelManager = headerRelsXml\n ? RelationshipManager.fromXml(headerRelsXml)\n : relationshipManager;\n\n // Set current part name for image registration (distinguishes header images from body images)\n this.currentPartName = headerTarget;\n try {\n // Create Header object using header-specific relationship manager\n const header = await this.parseHeader(\n headerXml,\n type as 'default' | 'first' | 'even',\n zipHandler,\n headerRelManager,\n imageManager\n );\n if (header) {\n parsedHeadersByRId.set(rId, header);\n headers.push({\n header,\n relationshipId: rId,\n filename: headerTarget,\n });\n }\n } finally {\n this.currentPartName = undefined;\n }\n }\n }\n\n // Parse footers\n // Track already-parsed footers by rId to avoid creating duplicates\n // when multiple section property types (default, first, even) reference the same footer file\n const parsedFootersByRId = new Map<string, import('../elements/Footer').Footer>();\n\n if (sectionProps.footers) {\n for (const [type, rId] of Object.entries(sectionProps.footers)) {\n if (!rId) continue;\n\n // Get relationship to find footer filename\n const rel = relationshipManager.getRelationship(rId);\n if (!rel) continue;\n\n const footerTarget = rel.getTarget();\n\n // Reuse already-parsed footer if same rId was already processed\n const existingFooter = parsedFootersByRId.get(rId);\n if (existingFooter) {\n footers.push({\n footer: existingFooter,\n relationshipId: rId,\n filename: footerTarget,\n });\n continue;\n }\n\n const footerPath = `word/${footerTarget}`;\n const footerXml = zipHandler.getFileAsString(footerPath);\n if (!footerXml) continue;\n\n // Load footer-specific relationships (for images in footers)\n // Footer relationships are in word/_rels/footer1.xml.rels for word/footer1.xml\n const footerRelsPath = `word/_rels/${footerTarget}.rels`;\n const footerRelsXml = zipHandler.getFileAsString(footerRelsPath);\n const footerRelManager = footerRelsXml\n ? RelationshipManager.fromXml(footerRelsXml)\n : relationshipManager;\n\n // Set current part name for image registration (distinguishes footer images from body images)\n this.currentPartName = footerTarget;\n try {\n // Create Footer object using footer-specific relationship manager\n const footer = await this.parseFooter(\n footerXml,\n type as 'default' | 'first' | 'even',\n zipHandler,\n footerRelManager,\n imageManager\n );\n if (footer) {\n parsedFootersByRId.set(rId, footer);\n footers.push({\n footer,\n relationshipId: rId,\n filename: footerTarget,\n });\n }\n } finally {\n this.currentPartName = undefined;\n }\n }\n }\n\n return { headers, footers };\n }\n\n /**\n * Parses a single header XML file\n * @param headerXml - Header XML content\n * @param type - Header type (default, first, even)\n * @param zipHandler - ZIP handler for accessing resources\n * @param relationshipManager - Relationship manager for resolving links\n * @param imageManager - Image manager for registering images\n * @returns Parsed Header object or null\n */\n private async parseHeader(\n headerXml: string,\n type: 'default' | 'first' | 'even',\n zipHandler: ZipHandler,\n relationshipManager: RelationshipManager,\n imageManager: ImageManager\n ): Promise<Header | null> {\n try {\n const header = new Header({ type });\n\n // Store raw XML for preservation when saving\n header.setRawXML(headerXml);\n\n // Extract w:hdr content\n const hdrContent = XMLParser.extractBetweenTags(headerXml, '<w:hdr', '</w:hdr>');\n if (!hdrContent) {\n return header; // Empty header\n }\n\n // Parse paragraphs and tables within header\n const elements = await this.parseBodyElements(\n `<w:body>${hdrContent}</w:body>`,\n relationshipManager,\n zipHandler,\n imageManager\n );\n\n for (const element of elements) {\n if (element instanceof Paragraph) {\n header.addParagraph(element);\n } else if (element instanceof Table) {\n header.addTable(element);\n }\n }\n\n return header;\n } catch (error: unknown) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.parseErrors.push({ element: 'header', error: err });\n\n if (this.strictParsing) {\n throw new Error(`Failed to parse header: ${err.message}`);\n }\n\n return null;\n }\n }\n\n /**\n * Parses a single footer XML file\n * @param footerXml - Footer XML content\n * @param type - Footer type (default, first, even)\n * @param zipHandler - ZIP handler for accessing resources\n * @param relationshipManager - Relationship manager for resolving links\n * @param imageManager - Image manager for registering images\n * @returns Parsed Footer object or null\n */\n private async parseFooter(\n footerXml: string,\n type: 'default' | 'first' | 'even',\n zipHandler: ZipHandler,\n relationshipManager: RelationshipManager,\n imageManager: ImageManager\n ): Promise<Footer | null> {\n try {\n const footer = new Footer({ type });\n\n // Store raw XML for preservation when saving\n footer.setRawXML(footerXml);\n\n // Extract w:ftr content\n const ftrContent = XMLParser.extractBetweenTags(footerXml, '<w:ftr', '</w:ftr>');\n if (!ftrContent) {\n return footer; // Empty footer\n }\n\n // Parse paragraphs and tables within footer\n const elements = await this.parseBodyElements(\n `<w:body>${ftrContent}</w:body>`,\n relationshipManager,\n zipHandler,\n imageManager\n );\n\n for (const element of elements) {\n if (element instanceof Paragraph) {\n footer.addParagraph(element);\n } else if (element instanceof Table) {\n footer.addTable(element);\n }\n }\n\n return footer;\n } catch (error: unknown) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.parseErrors.push({ element: 'footer', error: err });\n\n if (this.strictParsing) {\n throw new Error(`Failed to parse footer: ${err.message}`);\n }\n\n return null;\n }\n }\n\n /**\n * Parse previous properties from a *PrChange child element (parsed object format).\n * Handles w:tblPr, w:trPr, and w:tcPr children by extracting known property keys\n * into the Record<string, any> format expected by toXML() serialization.\n * Per ECMA-376 Part 1 §17.13.5.36-38\n */\n private parseGenericPreviousProperties(propsObj: any): Record<string, any> {\n if (!propsObj) return {};\n const result: Record<string, any> = {};\n\n // Table-level properties (w:tblPr context)\n if (propsObj['w:tblStyle']) {\n result.style = propsObj['w:tblStyle']['@_w:val'] || '';\n }\n if (propsObj['w:tblW']) {\n result.width = parseInt(propsObj['w:tblW']['@_w:w'] || '0', 10);\n result.widthType = propsObj['w:tblW']['@_w:type'] || 'dxa';\n }\n if (propsObj['w:tblLayout']) {\n result.layout = propsObj['w:tblLayout']['@_w:type'];\n }\n if (propsObj['w:tblInd']) {\n result.indent = parseInt(propsObj['w:tblInd']['@_w:w'] || '0', 10);\n }\n if (propsObj['w:tblCellSpacing']) {\n result.cellSpacing = parseInt(propsObj['w:tblCellSpacing']['@_w:w'] || '0', 10);\n }\n if (propsObj['w:tblBorders']) {\n const borders: any = {};\n const bordersObj = propsObj['w:tblBorders'];\n for (const side of ['top', 'bottom', 'left', 'right', 'insideH', 'insideV']) {\n if (bordersObj[`w:${side}`]) {\n borders[side] = this.parseBorderElement(bordersObj[`w:${side}`]);\n }\n }\n if (Object.keys(borders).length > 0) result.borders = borders;\n }\n\n // Row-level properties (w:trPr context)\n if (propsObj['w:trHeight']) {\n result.height = parseInt(propsObj['w:trHeight']['@_w:val'] || '0', 10);\n const rule = propsObj['w:trHeight']['@_w:hRule'];\n if (rule) result.heightRule = rule;\n }\n if (propsObj['w:tblHeader']) {\n result.isHeader = true;\n }\n if (propsObj['w:cantSplit']) {\n result.cantSplit = true;\n }\n if (propsObj['w:hidden']) {\n result.hidden = true;\n }\n\n // Cell-level properties (w:tcPr context)\n if (propsObj['w:tcW']) {\n result.width = parseInt(propsObj['w:tcW']['@_w:w'] || '0', 10);\n result.widthType = propsObj['w:tcW']['@_w:type'] || 'dxa';\n }\n if (propsObj['w:vAlign']) {\n result.verticalAlignment = propsObj['w:vAlign']['@_w:val'];\n }\n if (propsObj['w:tcBorders']) {\n const borders: any = {};\n const bordersObj = propsObj['w:tcBorders'];\n for (const side of ['top', 'bottom', 'left', 'right', 'tl2br', 'tr2bl']) {\n if (bordersObj[`w:${side}`]) {\n borders[side] = this.parseBorderElement(bordersObj[`w:${side}`]);\n }\n }\n if (Object.keys(borders).length > 0) result.borders = borders;\n }\n\n // Shared properties (appear in multiple contexts)\n if (propsObj['w:jc']) {\n const val = propsObj['w:jc']['@_w:val'];\n if (val) {\n result.alignment = val; // Table context\n result.justification = val; // Row context\n }\n }\n if (propsObj['w:shd']) {\n const shading = this.parseShadingFromObj(propsObj['w:shd']);\n if (shading) result.shading = shading;\n }\n\n return result;\n }\n\n /**\n * Parse previous section properties from raw XML within w:sectPrChange.\n * Per ECMA-376 Part 1 §17.13.5.32\n */\n private parsePreviousSectionProperties(sectPrXml: string): Record<string, any> {\n if (!sectPrXml) return {};\n const result: Record<string, any> = {};\n\n // Page size\n const pgSzElements = XMLParser.extractElements(sectPrXml, 'w:pgSz');\n if (pgSzElements.length > 0 && pgSzElements[0]) {\n const pgSz = pgSzElements[0];\n const width = XMLParser.extractAttribute(pgSz, 'w:w');\n const height = XMLParser.extractAttribute(pgSz, 'w:h');\n const orient = XMLParser.extractAttribute(pgSz, 'w:orient');\n if (width || height) {\n result.pageSize = {\n width: width ? parseInt(width, 10) : undefined,\n height: height ? parseInt(height, 10) : undefined,\n orientation: orient === 'landscape' ? 'landscape' : 'portrait',\n };\n }\n }\n\n // Margins\n const pgMarElements = XMLParser.extractElements(sectPrXml, 'w:pgMar');\n if (pgMarElements.length > 0 && pgMarElements[0]) {\n const pgMar = pgMarElements[0];\n const margins: any = {};\n const top = XMLParser.extractAttribute(pgMar, 'w:top');\n if (top) margins.top = parseInt(top, 10);\n const bottom = XMLParser.extractAttribute(pgMar, 'w:bottom');\n if (bottom) margins.bottom = parseInt(bottom, 10);\n const left = XMLParser.extractAttribute(pgMar, 'w:left');\n if (left) margins.left = parseInt(left, 10);\n const right = XMLParser.extractAttribute(pgMar, 'w:right');\n if (right) margins.right = parseInt(right, 10);\n const header = XMLParser.extractAttribute(pgMar, 'w:header');\n if (header) margins.header = parseInt(header, 10);\n const footer = XMLParser.extractAttribute(pgMar, 'w:footer');\n if (footer) margins.footer = parseInt(footer, 10);\n if (Object.keys(margins).length > 0) result.margins = margins;\n }\n\n // Section type\n const typeElements = XMLParser.extractElements(sectPrXml, 'w:type');\n if (typeElements.length > 0 && typeElements[0]) {\n const val = XMLParser.extractAttribute(typeElements[0], 'w:val');\n if (val) result.type = val;\n }\n\n // Columns\n const colsElements = XMLParser.extractElements(sectPrXml, 'w:cols');\n if (colsElements.length > 0 && colsElements[0]) {\n const cols = colsElements[0];\n const num = XMLParser.extractAttribute(cols, 'w:num');\n const space = XMLParser.extractAttribute(cols, 'w:space');\n if (num) {\n result.columns = {\n count: parseInt(num, 10),\n space: space ? parseInt(space, 10) : undefined,\n };\n }\n }\n\n return result;\n }\n}\n"]}
|