docxmlater 10.2.2 → 10.2.4

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.
@@ -1 +1 @@
1
- {"version":3,"file":"Document.js","sourceRoot":"","sources":["../../src/core/Document.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Document - High-level API for creating and managing Word documents\n * Provides a simple interface for creating DOCX files without managing ZIP and XML manually\n */\n\nimport { AlternateContent } from '../elements/AlternateContent';\nimport { Bookmark } from '../elements/Bookmark';\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 { CommentManager } from '../elements/CommentManager';\nimport { Endnote } from '../elements/Endnote';\nimport { EndnoteManager } from '../elements/EndnoteManager';\nimport { Field } from '../elements/Field';\nimport { Footnote } from '../elements/Footnote';\nimport { FootnoteManager } from '../elements/FootnoteManager';\nimport { Footer } from '../elements/Footer';\nimport { Header } from '../elements/Header';\nimport { HeaderFooterManager } from '../elements/HeaderFooterManager';\nimport { Hyperlink } from '../elements/Hyperlink';\nimport { Image } from '../elements/Image';\nimport { ImageManager } from '../elements/ImageManager';\nimport { ImageRun } from '../elements/ImageRun';\nimport { Paragraph, ParagraphContent, FieldLike } from '../elements/Paragraph';\nimport { RangeMarker } from '../elements/RangeMarker';\nimport { Revision, RevisionType } from '../elements/Revision';\nimport { RevisionManager } from '../elements/RevisionManager';\nimport { RevisionLocation } from '../elements/PropertyChangeTypes';\nimport { Run, RunFormatting } from '../elements/Run';\nimport { Shape } from '../elements/Shape';\nimport { TextBox } from '../elements/TextBox';\nimport {\n RevisionValidator,\n RevisionAutoFixer,\n ValidationOptions,\n AutoFixOptions,\n ValidationResult,\n AutoFixResult,\n} from '../validation';\nimport { Section } from '../elements/Section';\nimport { StructuredDocumentTag } from '../elements/StructuredDocumentTag';\nimport { Table, TableBorder } from '../elements/Table';\nimport { TableCell } from '../elements/TableCell';\nimport { TableOfContentsElement } from '../elements/TableOfContentsElement';\nimport { resolveCellShading } from '../utils/ShadingResolver';\nimport {\n NumberingManager,\n NumberingConsolidationOptions,\n NumberingConsolidationResult,\n} from '../formatting/NumberingManager';\nimport { Style, StyleProperties } from '../formatting/Style';\nimport { StylesManager } from '../formatting/StylesManager';\nimport { FormatOptions, StyleApplyOptions } from '../types/formatting';\nimport { CompatibilityMode, CompatibilityInfo, CompatSetting } from '../types/compatibility-types';\nimport { DocumentProtection, RevisionViewSettings, WebSettingsInfo } from '../types/settings-types';\nimport { CompatibilityUpgrader, UpgradeReport } from '../utils/CompatibilityUpgrader';\nimport { MODERN_COMPAT_SETTINGS } from '../constants/legacyCompatFlags';\n// ListNormalizationOptions and ListNormalizationReport removed - normalizeTableLists moved to consumer\nimport {\n ApplyStylesOptions,\n Heading2Config,\n StyleConfig,\n StyleRunFormatting,\n StyleParagraphFormatting,\n} from '../types/styleConfig';\n// ListNormalizer import removed - moved to consumer\nimport { defaultLogger, ILogger, getGlobalLogger, createScopedLogger } from '../utils/logger';\nimport { UNITS } from '../utils/units';\n\n// Create scoped logger for Document operations\nfunction getLogger(): ILogger {\n return createScopedLogger(getGlobalLogger(), 'Document');\n}\n// Raw XML revision acceptance - used at load time BEFORE parsing\n// cleanupRevisionMetadata - cleanup metadata files after in-memory acceptance\nimport { acceptAllRevisions, cleanupRevisionMetadata } from '../utils/acceptRevisions';\n// In-memory revision acceptance - used AFTER parsing, allows subsequent modifications\nimport { acceptRevisionsInMemory, AcceptRevisionsResult } from '../utils/InMemoryRevisionAcceptor';\nimport { stripTrackedChanges } from '../utils/stripTrackedChanges';\nimport { diffText, diffHasUnchangedParts } from '../utils/textDiff';\nimport { XMLBuilder } from '../xml/XMLBuilder';\nimport { XMLParser } from '../xml/XMLParser';\nimport { DocumentTrackingContext } from '../tracking/DocumentTrackingContext';\nimport type { TrackingContext } from '../tracking/TrackingContext';\nimport { ZipHandler } from '../zip/ZipHandler';\nimport { DOCX_PATHS } from '../zip/types';\nimport { DocumentGenerator } from './DocumentGenerator';\nimport { DocumentIdManager } from './DocumentIdManager';\nimport { DocumentParser } from './DocumentParser';\nimport { DocumentValidator } from './DocumentValidator';\nimport { RelationshipManager } from './RelationshipManager';\nimport { RelationshipType } from './Relationship';\nimport { BodyElement } from './DocumentContent';\nimport { optimizeImage, ImageOptimizationResult } from '../images/ImageOptimizer';\n\n/**\n * Document properties (core and extended)\n */\nexport interface DocumentProperties {\n // Core Properties (docProps/core.xml)\n title?: string;\n subject?: string;\n creator?: string;\n keywords?: string;\n description?: string;\n lastModifiedBy?: string;\n revision?: number;\n created?: Date;\n modified?: Date;\n language?: string;\n category?: string;\n contentStatus?: string;\n\n // Extended Properties (docProps/app.xml)\n application?: string;\n appVersion?: string;\n company?: string;\n manager?: string;\n version?: string;\n\n // Custom Properties (docProps/custom.xml)\n customProperties?: Record<string, string | number | boolean | Date>;\n}\n\n/**\n * Document part representation\n * Represents any part within a DOCX package (XML, binary, etc.)\n */\nexport interface DocumentPart {\n /** Part name/path within the package */\n name: string;\n /** Part content (string for XML/text, Buffer for binary) */\n content: string | Buffer;\n /** MIME content type */\n contentType?: string;\n /** Whether the part is binary */\n isBinary?: boolean;\n /** Part size in bytes */\n size?: number;\n}\n\n/**\n * Document creation options\n */\nexport interface DocumentOptions {\n properties?: DocumentProperties;\n /** Maximum memory usage percentage (0-100) before throwing error. Default: 80 */\n maxMemoryUsagePercent?: number;\n /** Maximum absolute RSS (Resident Set Size) in MB. Default: 2048 (2GB) */\n maxRssMB?: number;\n /** Enable absolute RSS limit checking. Default: true */\n useAbsoluteMemoryLimit?: boolean;\n /** Strict parsing mode - throw errors instead of collecting warnings. Default: false */\n strictParsing?: boolean;\n /** Maximum number of images allowed in document. Default: 1000 */\n maxImageCount?: number;\n /** Maximum total size of all images in MB. Default: 100 */\n maxTotalImageSizeMB?: number;\n /** Maximum size of a single image in MB. Default: 20 */\n maxSingleImageSizeMB?: number;\n /**\n * Logger instance for framework messages\n * Allows control over how warnings, info, and debug messages are handled\n * If not provided, uses ConsoleLogger with WARN minimum level\n * Use SilentLogger to suppress all logging\n * @example\n * // Use custom logger\n * const doc = Document.create({ logger: myCustomLogger });\n *\n * // Suppress all logging\n * import { SilentLogger } from 'docxmlater';\n * const doc = Document.create({ logger: new SilentLogger() });\n */\n logger?: ILogger;\n}\n\n/**\n * Document loading options\n */\nexport interface DocumentLoadOptions extends DocumentOptions {\n /**\n * How to handle tracked changes during document load\n *\n * - 'preserve': Keep tracked changes as-is (may cause corruption if IDs conflict)\n * - 'accept': Accept all changes - removes revision markup, keeps inserted content, removes deleted content (default)\n * - 'strip': Remove all revision markup completely\n *\n * Default: 'accept' (prevents corruption from revision ID conflicts)\n *\n * @default 'accept'\n *\n * @example\n * ```typescript\n * // Default: accept all changes (recommended)\n * const doc = await Document.load('file.docx');\n *\n * // Explicit accept\n * const doc = await Document.load('file.docx', { revisionHandling: 'accept' });\n *\n * // Strip all tracked changes\n * const doc = await Document.load('file.docx', { revisionHandling: 'strip' });\n *\n * // Preserve tracked changes (may cause corruption)\n * const doc = await Document.load('file.docx', { revisionHandling: 'preserve' });\n * ```\n */\n revisionHandling?: 'preserve' | 'accept' | 'strip';\n\n /**\n * Accept all tracked changes after parsing using in-memory transformation.\n *\n * Unlike `revisionHandling: 'accept'` which uses raw XML transformation before parsing,\n * this option parses the document first (so revisions are available for inspection),\n * then accepts them using in-memory DOM transformation.\n *\n * Key difference: This allows subsequent document modifications to be saved correctly,\n * whereas raw XML acceptance may cause modifications to be lost.\n *\n * When `true`:\n * - Document is loaded with revisions preserved\n * - Revisions are parsed into the model (available for ChangelogGenerator)\n * - After parsing, `acceptAllRevisions()` is called automatically\n * - Document is clean and ready for modifications\n *\n * Recommended for Template_UI workflow when auto-accept is enabled.\n *\n * @default false\n *\n * @example\n * ```typescript\n * // Load and accept revisions (clean document, modifications work)\n * const doc = await Document.load('file.docx', { acceptRevisions: true });\n * doc.enableTrackChanges({ author: 'Doc Hub' });\n * // ... make modifications ...\n * await doc.save('output.docx'); // Modifications are saved correctly\n * ```\n */\n acceptRevisions?: boolean;\n}\n\n/**\n * Represents a Word document\n */\nexport class Document {\n constructor(zipHandler?: ZipHandler, options: DocumentOptions = {}, initDefaults = true) {\n this.zipHandler = zipHandler || new ZipHandler();\n this.bodyElements = [];\n this.properties = options.properties || {};\n this.namespaces = {};\n this.stylesManager = StylesManager.create();\n this.numberingManager = NumberingManager.create();\n this.section = new Section();\n this.imageManager = ImageManager.create();\n this.relationshipManager = initDefaults\n ? RelationshipManager.createForDocument()\n : RelationshipManager.create();\n this.headerFooterManager = HeaderFooterManager.create();\n this.bookmarkManager = BookmarkManager.create();\n this.revisionManager = RevisionManager.create();\n this.commentManager = CommentManager.create();\n this.footnoteManager = FootnoteManager.create();\n this.endnoteManager = EndnoteManager.create();\n this.documentIdManager = DocumentIdManager.create();\n\n // Wire up centralized ID allocation for all annotation managers\n // This ensures bookmark, revision, and comment IDs are globally unique (ECMA-376 requirement)\n this.bookmarkManager.setIdProvider(\n () => this.documentIdManager.getNextId(),\n (existingId) => this.documentIdManager.ensureNextIdAbove(existingId)\n );\n this.revisionManager.setIdProvider(\n () => this.documentIdManager.getNextId(),\n (existingId) => this.documentIdManager.ensureNextIdAbove(existingId)\n );\n this.commentManager.setIdProvider(\n () => this.documentIdManager.getNextId(),\n (existingId) => this.documentIdManager.ensureNextIdAbove(existingId)\n );\n\n this.trackingContext = new DocumentTrackingContext(this.revisionManager);\n this.parser = new DocumentParser();\n this.generator = new DocumentGenerator();\n this.validator = new DocumentValidator();\n this.logger = options.logger || defaultLogger;\n this.trackChangesEnabled = false;\n this.trackFormatting = true;\n this.revisionViewSettings = {\n showInsertionsAndDeletions: true,\n showFormatting: true,\n showInkAnnotations: true,\n };\n this.autoPopulateTOCs = false;\n this.rsids = new Set();\n if (initDefaults) {\n this.initializeRequiredFiles();\n }\n }\n private zipHandler: ZipHandler;\n private bodyElements: BodyElement[] = [];\n private properties: DocumentProperties;\n public namespaces: Record<string, string> = {};\n private stylesManager: StylesManager;\n private numberingManager: NumberingManager;\n private section: Section;\n private imageManager: ImageManager;\n private relationshipManager: RelationshipManager;\n private headerFooterManager: HeaderFooterManager;\n private bookmarkManager: BookmarkManager;\n private revisionManager: RevisionManager;\n private commentManager: CommentManager;\n private documentIdManager: DocumentIdManager;\n private trackingContext: DocumentTrackingContext;\n private footnoteManager: FootnoteManager;\n private endnoteManager: EndnoteManager;\n\n // Helper classes for parsing, generation, and validation\n private parser: DocumentParser;\n private generator: DocumentGenerator;\n private validator: DocumentValidator;\n private logger: ILogger;\n\n // Track changes settings\n private trackChangesEnabled = false;\n private trackFormatting = true;\n private revisionViewSettings: RevisionViewSettings = {\n showInsertionsAndDeletions: true,\n showFormatting: true,\n showInkAnnotations: true,\n };\n\n // TOC auto-population setting\n private autoPopulateTOCs = false;\n\n // TOC field instruction sync setting (default: OFF to preserve original instructions)\n private autoSyncTOCStyles = false;\n\n // Flag to skip document.xml regeneration after stripping tracked changes\n // When true, save() and toBuffer() will preserve the manually cleaned XML\n private skipDocumentXmlRegeneration = false;\n\n // Flag to accept all revisions before save\n // When true, acceptAllRevisions() is called after flushPendingChanges() but before XML generation\n // This ensures ALL revisions (including those created during save) are accepted\n private acceptRevisionsBeforeSave = false;\n\n // Store original [Content_Types].xml entries to preserve during save\n // This ensures round-trip fidelity for documents with features the framework doesn't track\n // (VBA macros, custom UI, embedded objects, etc.)\n private _originalContentTypes?: { defaults: Set<string>; overrides: Set<string> };\n\n // Store original styles.xml, numbering.xml, and settings.xml to preserve formatting during save\n // Prevents loss of formatting details not captured by parsers (bullet indentation, cell padding, etc.)\n private _originalStylesXml?: string;\n private _originalNumberingXml?: string;\n private _originalSettingsXml?: string;\n private _originalAppPropsXml?: string;\n private _originalFootnotesXml?: string;\n private _originalEndnotesXml?: string;\n private _originalCommentsXml?: string;\n private _commentsModified = false;\n private _originalCommentCompanionFiles = new Map<string, string>();\n /** Parts explicitly removed via removePart() — skip regeneration during save */\n private _removedParts = new Set<string>();\n\n // Track whether app properties have been programmatically modified since load\n private _appPropsModified = false;\n\n // Track whether footnotes/endnotes have been programmatically modified since load\n private _footnotesModified = false;\n private _endnotesModified = false;\n\n // Track whether settings have been programmatically modified since load\n // When true, mergeSettingsWithOriginal() will apply in-memory state to the preserved XML\n private _settingsModified = false;\n /** Tracks which individual boolean settings were modified via setters (not just parsed) */\n private _modifiedBooleanSettings = new Set<string>();\n\n // webSettings.xml round-trip preservation\n private _originalWebSettingsXml?: string;\n private _webSettingsModified = false;\n private _webSettings: {\n optimizeForBrowser: boolean;\n allowPNG: boolean;\n relyOnVML: boolean;\n doNotRelyOnCSS: boolean;\n doNotSaveAsSingleFile: boolean;\n doNotOrganizeInFolder: boolean;\n doNotUseLongFileNames: boolean;\n pixelsPerInch?: number;\n targetScreenSz?: string;\n encoding?: string;\n } = {\n optimizeForBrowser: true,\n allowPNG: true,\n relyOnVML: false,\n doNotRelyOnCSS: false,\n doNotSaveAsSingleFile: false,\n doNotOrganizeInFolder: false,\n doNotUseLongFileNames: false,\n };\n\n // Parsed compatibility mode info from w:compat block in settings.xml\n // Per MS-DOCX spec, default when absent is mode 12 (Word 2007)\n private _compatInfo?: CompatibilityInfo;\n\n private rsidRoot?: string;\n private rsids = new Set<string>();\n private documentProtection?: DocumentProtection;\n\n /** Document background (w:background) per ECMA-376 Part 1 §17.2.1 */\n private _documentBackground?: {\n color?: string;\n themeColor?: string;\n themeTint?: string;\n themeShade?: string;\n };\n\n /** Even and odd headers setting (w:evenAndOddHeaders) per ECMA-376 Part 1 §17.15.1.28 */\n private _evenAndOddHeaders?: boolean;\n /** Mirror margins setting (w:mirrorMargins) per ECMA-376 Part 1 §17.15.1.57 */\n private _mirrorMargins?: boolean;\n /** Auto hyphenation setting (w:autoHyphenation) per ECMA-376 Part 1 §17.15.1.10 */\n private _autoHyphenation?: boolean;\n /** Hide spelling errors (w:hideSpellingErrors) per ECMA-376 Part 1 §17.15.1.43 */\n private _hideSpellingErrors?: boolean;\n /** Hide grammatical errors (w:hideGrammaticalErrors) per ECMA-376 Part 1 §17.15.1.42 */\n private _hideGrammaticalErrors?: boolean;\n /** Default tab stop (w:defaultTabStop) per ECMA-376 Part 1 §17.15.1.25 */\n private _defaultTabStop?: number;\n /** Update fields on open (w:updateFields) per ECMA-376 Part 1 §17.15.1.85 */\n private _updateFields?: boolean;\n /** Embed TrueType fonts (w:embedTrueTypeFonts) per ECMA-376 Part 1 §17.15.1.24 */\n private _embedTrueTypeFonts?: boolean;\n /** Save subset of fonts (w:saveSubsetFonts) per ECMA-376 Part 1 §17.15.1.78 */\n private _saveSubsetFonts?: boolean;\n /** Do not track moves (w:doNotTrackMoves) per ECMA-376 Part 1 §17.15.1.35 */\n private _doNotTrackMoves?: boolean;\n /** Decimal symbol for locale (w:decimalSymbol) per ECMA-376 Part 1 §17.15.1.23 */\n private _decimalSymbol?: string;\n /** List separator for locale (w:listSeparator) per ECMA-376 Part 1 §17.15.1.55 */\n private _listSeparator?: string;\n /** Document view type (w:view) per ECMA-376 Part 1 §17.15.1.92 — element #1 in CT_Settings */\n private _documentView?: string;\n\n /** When true, _postProcessDocumentXml() strips INCLUDEPICTURE field markup from document.xml */\n private _flattenIncludePictureFields = false;\n /** When true, _postProcessDocumentXml() removes RSIDs not referenced in document.xml */\n private _stripOrphanRSIDs = false;\n /** When set, _postProcessDocumentXml() removes direct w:spacing from paragraphs with these styles */\n private _clearDirectSpacingStyles: string[] | null = null;\n /** Tracks numPicBullet IDs removed during numbering merge, for rels cleanup */\n private _removedNumPicBulletIds = new Set<number>();\n\n /**\n * Snapshot of save-related state for rollback on failure\n * @private\n */\n private saveStateSnapshot?: {\n preservedParagraphs: Set<Paragraph>;\n acceptRevisionsBeforeSave: boolean;\n flattenIncludePictureFields: boolean;\n stripOrphanRSIDs: boolean;\n clearDirectSpacingStyles: string[] | null;\n };\n\n /**\n * Creates a snapshot of mutable state before save operations\n * This allows rollback if save fails after state modifications\n * @private\n */\n private createSaveStateSnapshot(): void {\n const preservedParagraphs = new Set<Paragraph>();\n for (const para of this.getAllParagraphs()) {\n if (para.isPreserved()) {\n preservedParagraphs.add(para);\n }\n }\n this.saveStateSnapshot = {\n preservedParagraphs,\n acceptRevisionsBeforeSave: this.acceptRevisionsBeforeSave,\n flattenIncludePictureFields: this._flattenIncludePictureFields,\n stripOrphanRSIDs: this._stripOrphanRSIDs,\n clearDirectSpacingStyles: this._clearDirectSpacingStyles,\n };\n }\n\n /**\n * Restores mutable state from snapshot after a failed save\n * @private\n */\n private restoreSaveStateSnapshot(): void {\n if (!this.saveStateSnapshot) return;\n\n // Restore preserve flags\n for (const para of this.saveStateSnapshot.preservedParagraphs) {\n para.setPreserved(true);\n }\n\n // Restore acceptRevisionsBeforeSave flag\n this.acceptRevisionsBeforeSave = this.saveStateSnapshot.acceptRevisionsBeforeSave;\n\n // Restore post-processing flags (consumed during _postProcessDocumentXml)\n this._flattenIncludePictureFields = this.saveStateSnapshot.flattenIncludePictureFields;\n this._stripOrphanRSIDs = this.saveStateSnapshot.stripOrphanRSIDs;\n this._clearDirectSpacingStyles = this.saveStateSnapshot.clearDirectSpacingStyles;\n\n // Clear snapshot\n this.saveStateSnapshot = undefined;\n }\n\n /**\n * Clears the save state snapshot (called after successful save)\n * @private\n */\n private clearSaveStateSnapshot(): void {\n this.saveStateSnapshot = undefined;\n }\n\n /**\n * Creates a new empty Word document\n *\n * Creates a new DOCX document with all required files initialized and ready for content.\n * The document includes default styles, numbering definitions, and required relationships.\n *\n * @param options - Optional document configuration\n * @param options.properties - Document metadata (title, author, subject, etc.)\n * @param options.maxMemoryUsagePercent - Maximum memory usage percentage (0-100) before throwing error (default: 80)\n * @param options.maxRssMB - Maximum absolute RSS in MB (default: 2048)\n * @param options.strictParsing - Throw errors instead of collecting warnings (default: false)\n * @param options.logger - Custom logger for framework messages\n * @returns A new Document instance ready for adding content\n *\n * @example\n * ```typescript\n * // Create a basic document\n * const doc = Document.create();\n * doc.createParagraph('Hello World');\n * await doc.save('output.docx');\n * ```\n *\n * @example\n * ```typescript\n * // Create with metadata\n * const doc = Document.create({\n * properties: {\n * title: 'My Document',\n * creator: 'John Doe',\n * subject: 'Report'\n * }\n * });\n * ```\n */\n static create(options?: DocumentOptions): Document {\n const doc = new Document(undefined, options);\n doc.initializeRequiredFiles();\n return doc;\n }\n\n /**\n * Loads an existing Word document from a file path\n *\n * Reads and parses an existing DOCX file, preserving all content, formatting,\n * styles, numbering, headers, footers, images, and other document elements.\n *\n * @param filePath - Absolute or relative path to the DOCX file to load\n * @param options - Optional document configuration (see {@link DocumentOptions})\n * @param options.strictParsing - If true, throws errors on malformed content; if false, collects warnings (default: false)\n * @param options.logger - Custom logger for warnings and errors during parsing\n * @returns Promise that resolves to a Document instance with all parsed content\n *\n * @throws Error if file doesn't exist, is not a valid DOCX, or is corrupted\n *\n * @example\n * ```typescript\n * // Load and modify a document\n * const doc = await Document.load('input.docx');\n * doc.createParagraph('Additional content');\n * await doc.save('modified.docx');\n * ```\n *\n * @example\n * ```typescript\n * // Load with strict parsing\n * try {\n * const doc = await Document.load('input.docx', { strictParsing: true });\n * } catch (error) {\n * console.error('Document is corrupted:', error);\n * }\n * ```\n */\n static async load(filePath: string, options?: DocumentLoadOptions): Promise<Document> {\n const logger = getLogger();\n logger.info('Loading document from file', { path: filePath });\n\n const zipHandler = new ZipHandler();\n await zipHandler.load(filePath);\n\n return Document.initializeFromZip(zipHandler, options);\n }\n\n /**\n * Loads an existing Word document from a Buffer\n *\n * Reads and parses a DOCX file from an in-memory Buffer, useful for processing\n * documents from HTTP requests, database blobs, or other non-filesystem sources.\n *\n * @param buffer - Buffer containing the complete DOCX file data\n * @param options - Optional document configuration (see {@link DocumentOptions})\n * @returns Promise that resolves to a Document instance with all parsed content\n *\n * @throws Error if buffer doesn't contain valid DOCX data or is corrupted\n *\n * @example\n * ```typescript\n * // Load from HTTP response\n * const response = await fetch('https://example.com/doc.docx');\n * const buffer = Buffer.from(await response.arrayBuffer());\n * const doc = await Document.loadFromBuffer(buffer);\n * ```\n *\n * @example\n * ```typescript\n * // Load from file system buffer\n * import { promises as fs } from 'fs';\n * const buffer = await fs.readFile('input.docx');\n * const doc = await Document.loadFromBuffer(buffer);\n * ```\n */\n static async loadFromBuffer(buffer: Buffer, options?: DocumentLoadOptions): Promise<Document> {\n const logger = getLogger();\n logger.info('Loading document from buffer', { bufferSize: buffer.length });\n\n const zipHandler = new ZipHandler();\n await zipHandler.loadFromBuffer(buffer);\n\n return Document.initializeFromZip(zipHandler, options);\n }\n\n /**\n * Common initialization logic for load() and loadFromBuffer().\n * Handles revision strategy, preserves original XML, parses content, and optionally accepts revisions.\n */\n private static async initializeFromZip(\n zipHandler: ZipHandler,\n options?: DocumentLoadOptions\n ): Promise<Document> {\n const logger = getLogger();\n\n // Determine revision handling strategy\n // If acceptRevisions is true, we need to preserve revisions during parsing\n // so they can be accepted using in-memory transformation after parsing\n const useInMemoryAccept = options?.acceptRevisions === true;\n const revisionHandling = useInMemoryAccept\n ? 'preserve' // Force preserve so revisions are parsed into model\n : (options?.revisionHandling ?? 'accept'); // Default to accept\n\n // Handle tracked changes BEFORE parsing (unless using in-memory accept)\n if (revisionHandling === 'accept') {\n // Accept all tracked changes to prevent corruption (raw XML approach)\n await acceptAllRevisions(zipHandler);\n } else if (revisionHandling === 'strip') {\n // Strip all tracked changes completely\n await stripTrackedChanges(zipHandler);\n } else if (revisionHandling === 'preserve') {\n // Check if document has tracked changes and warn (unless intentionally accepting later)\n if (!useInMemoryAccept) {\n const documentXml = zipHandler.getFileAsString('word/document.xml');\n if (\n documentXml &&\n (documentXml.includes('<w:ins') ||\n documentXml.includes('<w:del') ||\n documentXml.includes('<w:moveFrom') ||\n documentXml.includes('<w:moveTo'))\n ) {\n logger.warn('Document contains tracked changes in preserve mode');\n }\n }\n }\n\n // Create document without default relationships (will parse from file)\n const doc = new Document(zipHandler, options, false);\n\n // Parse and preserve original [Content_Types].xml entries for round-trip fidelity\n const contentTypesXml = zipHandler.getFileAsString('[Content_Types].xml');\n if (contentTypesXml) {\n doc._originalContentTypes = doc.parseContentTypes(contentTypesXml);\n }\n\n // Parse and preserve original styles.xml and numbering.xml for formatting fidelity\n const stylesXml = zipHandler.getFileAsString(DOCX_PATHS.STYLES);\n if (stylesXml) {\n doc._originalStylesXml = stylesXml;\n }\n\n const numberingXml = zipHandler.getFileAsString(DOCX_PATHS.NUMBERING);\n if (numberingXml) {\n doc._originalNumberingXml = numberingXml;\n }\n\n // Preserve original settings.xml and parse managed settings into in-memory state\n // This ensures round-trip fidelity and accurate merge logic on save\n const settingsXml = zipHandler.getFileAsString(DOCX_PATHS.SETTINGS);\n if (settingsXml) {\n doc._originalSettingsXml = settingsXml;\n doc.parseSettingsFromXml(settingsXml);\n }\n\n // Preserve original app.xml for round-trip fidelity (HeadingPairs, TotalTime, etc.)\n const appPropsXml = zipHandler.getFileAsString(DOCX_PATHS.APP_PROPS);\n if (appPropsXml) {\n doc._originalAppPropsXml = appPropsXml;\n }\n\n // Preserve original webSettings.xml for round-trip fidelity (w:divs, flags, etc.)\n const webSettingsXml = zipHandler.getFileAsString(DOCX_PATHS.WEB_SETTINGS);\n if (webSettingsXml) {\n doc._originalWebSettingsXml = webSettingsXml;\n doc.parseWebSettingsFromXml(webSettingsXml);\n }\n\n await doc.parseDocument();\n\n // Surface parse warnings so users know about partial parsing issues\n const parseWarnings = doc.getParseWarnings();\n if (parseWarnings.length > 0) {\n logger.warn('Document loaded with parse warnings', {\n warningCount: parseWarnings.length,\n elements: parseWarnings.map((w) => w.element).join(', '),\n });\n }\n\n // If acceptRevisions option was set, accept revisions using in-memory transformation\n // This happens AFTER parsing so revisions were available for inspection (e.g., ChangelogGenerator)\n // and allows subsequent document modifications to be saved correctly\n if (useInMemoryAccept) {\n logger.info('Accepting revisions using in-memory transformation');\n await doc.acceptAllRevisions();\n logger.info('Revisions accepted', { paragraphs: doc.getParagraphCount() });\n }\n\n logger.info('Document loaded', { paragraphs: doc.getParagraphCount() });\n\n return doc;\n }\n\n /**\n * Parses managed settings from settings.xml into in-memory state.\n *\n * This populates trackChangesEnabled, trackFormatting, revisionViewSettings,\n * documentProtection, rsidRoot, and rsids from the original settings.xml so that\n * the merge logic on save has accurate state to work with.\n *\n * Without this, calling protectDocument() on a loaded doc could accidentally\n * strip <w:trackRevisions/> during the merge because trackChangesEnabled would\n * still be false (constructor default) rather than the value from the file.\n *\n * @param settingsXml - The raw settings.xml content\n * @private\n */\n private parseSettingsFromXml(settingsXml: string): void {\n // Parse w:trackRevisions - presence means tracking is enabled\n // Both <w:trackRevisions/> and <w:trackRevisions w:val=\"true\"/> mean enabled\n // <w:trackRevisions w:val=\"false\"/> or <w:trackRevisions w:val=\"0\"/> means disabled\n const trackRevisionsMatch = /<w:trackRevisions\\b([^>]*)\\/?>/.exec(settingsXml);\n if (trackRevisionsMatch) {\n const attrs = trackRevisionsMatch[1] ?? '';\n const valMatch = /w:val\\s*=\\s*\"([^\"]*)\"/.exec(attrs);\n if (valMatch?.[1] !== undefined) {\n const val = valMatch[1].toLowerCase();\n this.trackChangesEnabled = val !== 'false' && val !== '0' && val !== 'off';\n } else {\n // Self-closing without val attribute means enabled\n this.trackChangesEnabled = true;\n }\n }\n\n // Parse w:doNotTrackFormatting - presence means formatting tracking is disabled\n const hasDoNotTrackFormatting = /<w:doNotTrackFormatting\\b[^>]*\\/?>/.test(settingsXml);\n if (hasDoNotTrackFormatting) {\n this.trackFormatting = false;\n }\n // Parse w:trackFormatting - explicit presence means formatting tracking is enabled\n const hasTrackFormatting = /<w:trackFormatting\\b[^>]*\\/?>/.test(settingsXml);\n if (hasTrackFormatting) {\n this.trackFormatting = true;\n }\n\n // Parse w:revisionView\n const revisionViewMatch = /<w:revisionView\\b([^>]*)\\/?>/.exec(settingsXml);\n if (revisionViewMatch) {\n const attrs = revisionViewMatch[1] || '';\n const insDelMatch = /w:insDel\\s*=\\s*\"([^\"]*)\"/.exec(attrs);\n const formattingMatch = /w:formatting\\s*=\\s*\"([^\"]*)\"/.exec(attrs);\n const inkMatch = /w:inkAnnotations\\s*=\\s*\"([^\"]*)\"/.exec(attrs);\n if (insDelMatch?.[1] !== undefined) {\n this.revisionViewSettings.showInsertionsAndDeletions = insDelMatch[1] !== '0';\n }\n if (formattingMatch?.[1] !== undefined) {\n this.revisionViewSettings.showFormatting = formattingMatch[1] !== '0';\n }\n if (inkMatch?.[1] !== undefined) {\n this.revisionViewSettings.showInkAnnotations = inkMatch[1] !== '0';\n }\n }\n\n // Parse w:documentProtection\n const protMatch = /<w:documentProtection\\b([^>]*)\\/?>/.exec(settingsXml);\n if (protMatch) {\n const attrs = protMatch[1] || '';\n const editMatch = /w:edit\\s*=\\s*\"([^\"]*)\"/.exec(attrs);\n const enforcementMatch = /w:enforcement\\s*=\\s*\"([^\"]*)\"/.exec(attrs);\n if (editMatch?.[1]) {\n const edit = editMatch[1] as 'readOnly' | 'comments' | 'trackedChanges' | 'forms';\n const enforcement = enforcementMatch?.[1] ? enforcementMatch[1] !== '0' : true;\n this.documentProtection = { edit, enforcement };\n\n // Parse optional crypto attributes\n const cryptProviderMatch = /w:cryptProviderType\\s*=\\s*\"([^\"]*)\"/.exec(attrs);\n const cryptAlgClassMatch = /w:cryptAlgorithmClass\\s*=\\s*\"([^\"]*)\"/.exec(attrs);\n const cryptAlgTypeMatch = /w:cryptAlgorithmType\\s*=\\s*\"([^\"]*)\"/.exec(attrs);\n const cryptAlgSidMatch = /w:cryptAlgorithmSid\\s*=\\s*\"([^\"]*)\"/.exec(attrs);\n const cryptSpinMatch = /w:cryptSpinCount\\s*=\\s*\"([^\"]*)\"/.exec(attrs);\n const hashMatch = /w:hash\\s*=\\s*\"([^\"]*)\"/.exec(attrs);\n const saltMatch = /w:salt\\s*=\\s*\"([^\"]*)\"/.exec(attrs);\n\n if (cryptProviderMatch?.[1])\n this.documentProtection.cryptProviderType = cryptProviderMatch[1];\n if (cryptAlgClassMatch?.[1])\n this.documentProtection.cryptAlgorithmClass = cryptAlgClassMatch[1];\n if (cryptAlgTypeMatch?.[1])\n this.documentProtection.cryptAlgorithmType = cryptAlgTypeMatch[1];\n if (cryptAlgSidMatch?.[1])\n this.documentProtection.cryptAlgorithmSid = parseInt(cryptAlgSidMatch[1], 10);\n if (cryptSpinMatch?.[1])\n this.documentProtection.cryptSpinCount = parseInt(cryptSpinMatch[1], 10);\n if (hashMatch?.[1]) this.documentProtection.hash = hashMatch[1];\n if (saltMatch?.[1]) this.documentProtection.salt = saltMatch[1];\n }\n }\n\n // Parse w:rsids block\n const rsidsBlockMatch = /<w:rsids>([\\s\\S]*?)<\\/w:rsids>/.exec(settingsXml);\n if (rsidsBlockMatch?.[1]) {\n const rsidsBlock = rsidsBlockMatch[1];\n\n // Parse rsidRoot\n const rsidRootMatch = /<w:rsidRoot\\s+w:val\\s*=\\s*\"([^\"]*)\"\\s*\\/?>/.exec(rsidsBlock);\n if (rsidRootMatch?.[1]) {\n this.rsidRoot = rsidRootMatch[1].toUpperCase();\n }\n\n // Parse all rsid entries\n const rsidRegex = /<w:rsid\\s+w:val\\s*=\\s*\"([^\"]*)\"\\s*\\/?>/g;\n let rsidMatch;\n while ((rsidMatch = rsidRegex.exec(rsidsBlock)) !== null) {\n if (rsidMatch[1]) this.rsids.add(rsidMatch[1].toUpperCase());\n }\n\n // Ensure rsidRoot is also in the rsids set\n if (this.rsidRoot) {\n this.rsids.add(this.rsidRoot);\n }\n }\n\n // Parse w:view per ECMA-376 Part 1 §17.15.1.92 (element #1 in CT_Settings)\n const viewMatch = /<w:view\\s+w:val\\s*=\\s*\"([^\"]*)\"[^>]*\\/?>/.exec(settingsXml);\n if (viewMatch?.[1]) {\n this._documentView = viewMatch[1];\n }\n\n // Parse w:evenAndOddHeaders per ECMA-376 Part 1 §17.15.1.28\n if (/<w:evenAndOddHeaders\\b[^>]*\\/?>/.test(settingsXml)) {\n this._evenAndOddHeaders = true;\n }\n\n // Parse w:mirrorMargins per ECMA-376 Part 1 §17.15.1.57\n if (/<w:mirrorMargins\\b[^>]*\\/?>/.test(settingsXml)) {\n this._mirrorMargins = true;\n }\n\n // Parse w:autoHyphenation per ECMA-376 Part 1 §17.15.1.10\n if (/<w:autoHyphenation\\b[^>]*\\/?>/.test(settingsXml)) {\n this._autoHyphenation = true;\n }\n\n // Parse w:hideSpellingErrors per ECMA-376 Part 1 §17.15.1.43\n if (/<w:hideSpellingErrors\\b[^>]*\\/?>/.test(settingsXml)) {\n this._hideSpellingErrors = true;\n }\n\n // Parse w:hideGrammaticalErrors per ECMA-376 Part 1 §17.15.1.42\n if (/<w:hideGrammaticalErrors\\b[^>]*\\/?>/.test(settingsXml)) {\n this._hideGrammaticalErrors = true;\n }\n\n // Parse w:defaultTabStop per ECMA-376 Part 1 §17.15.1.25\n const defaultTabStopMatch = /<w:defaultTabStop\\s+w:val\\s*=\\s*\"(\\d+)\"\\s*\\/?>/.exec(settingsXml);\n if (defaultTabStopMatch?.[1]) {\n this._defaultTabStop = parseInt(defaultTabStopMatch[1], 10);\n }\n\n // Parse w:updateFields per ECMA-376 Part 1 §17.15.1.85\n if (/<w:updateFields\\b[^>]*\\/?>/.test(settingsXml)) {\n this._updateFields = true;\n }\n\n // Parse w:embedTrueTypeFonts per ECMA-376 Part 1 §17.15.1.24\n if (/<w:embedTrueTypeFonts\\b[^>]*\\/?>/.test(settingsXml)) {\n this._embedTrueTypeFonts = true;\n }\n\n // Parse w:saveSubsetFonts per ECMA-376 Part 1 §17.15.1.78\n if (/<w:saveSubsetFonts\\b[^>]*\\/?>/.test(settingsXml)) {\n this._saveSubsetFonts = true;\n }\n\n // Parse w:doNotTrackMoves per ECMA-376 Part 1 §17.15.1.35\n if (/<w:doNotTrackMoves\\b[^>]*\\/?>/.test(settingsXml)) {\n this._doNotTrackMoves = true;\n }\n\n // Parse w:decimalSymbol per ECMA-376 Part 1 §17.15.1.23\n const decimalMatch = /<w:decimalSymbol\\s+w:val\\s*=\\s*\"([^\"]*)\"\\s*\\/?>/.exec(settingsXml);\n if (decimalMatch?.[1]) {\n this._decimalSymbol = decimalMatch[1];\n }\n\n // Parse w:listSeparator per ECMA-376 Part 1 §17.15.1.55\n const listSepMatch = /<w:listSeparator\\s+w:val\\s*=\\s*\"([^\"]*)\"\\s*\\/?>/.exec(settingsXml);\n if (listSepMatch?.[1]) {\n this._listSeparator = listSepMatch[1];\n }\n\n // Parse w:compat block for compatibility mode detection\n this._compatInfo = this.parseCompatBlock(settingsXml);\n }\n\n /**\n * Parses the w:compat block from settings.xml to extract compatibility mode info.\n *\n * Per MS-DOCX specification, when the compatibilityMode compatSetting is absent,\n * the effective mode is 12 (Word 2007 / ECMA-376 1st edition).\n *\n * @param settingsXml - The raw settings.xml content\n * @returns Parsed CompatibilityInfo\n * @private\n */\n private parseCompatBlock(settingsXml: string): CompatibilityInfo {\n const compatSettings: CompatSetting[] = [];\n const legacyFlags: string[] = [];\n let mode = CompatibilityMode.Word2007; // Default per MS-DOCX spec\n\n // Extract w:compat block\n const compatBlockMatch = /<w:compat>([\\s\\S]*?)<\\/w:compat>/.exec(settingsXml);\n if (compatBlockMatch?.[1]) {\n const compatBlock = compatBlockMatch[1];\n\n // Parse w:compatSetting entries (name/uri/val triples)\n const settingRegex = /<w:compatSetting\\s+([^>]*)\\/?\\s*>/g;\n let settingMatch;\n while ((settingMatch = settingRegex.exec(compatBlock)) !== null) {\n const attrs = settingMatch[1] ?? '';\n const nameMatch = /w:name\\s*=\\s*\"([^\"]*)\"/.exec(attrs);\n const uriMatch = /w:uri\\s*=\\s*\"([^\"]*)\"/.exec(attrs);\n const valMatch = /w:val\\s*=\\s*\"([^\"]*)\"/.exec(attrs);\n\n if (nameMatch?.[1] && uriMatch?.[1] && valMatch?.[1]) {\n const setting: CompatSetting = {\n name: nameMatch[1],\n uri: uriMatch[1],\n val: valMatch[1],\n };\n compatSettings.push(setting);\n\n // Extract compatibility mode value\n if (\n setting.name === 'compatibilityMode' &&\n setting.uri === 'http://schemas.microsoft.com/office/word'\n ) {\n const modeVal = parseInt(setting.val, 10);\n if (!isNaN(modeVal)) {\n mode = modeVal as CompatibilityMode;\n }\n }\n }\n }\n\n // Parse legacy boolean compat flags (self-closing w: elements that are NOT w:compatSetting)\n const legacyFlagRegex = /<w:(\\w+)(?:\\s[^>]*)?\\/?>/g;\n let flagMatch;\n while ((flagMatch = legacyFlagRegex.exec(compatBlock)) !== null) {\n const tagName = flagMatch[1];\n // Skip w:compatSetting entries (already parsed above)\n if (!tagName || tagName === 'compatSetting') continue;\n legacyFlags.push(tagName);\n }\n }\n\n return {\n mode,\n isLegacyMode: mode < CompatibilityMode.Word2013Plus,\n compatSettings,\n legacyFlags,\n };\n }\n\n /**\n * Parses an existing document file loaded into the ZIP handler\n * Populates all document elements from the loaded XML\n *\n * @private\n */\n private async parseDocument(): Promise<void> {\n // Use the parser helper that's already created\n const result = await this.parser.parseDocument(\n this.zipHandler,\n this.relationshipManager,\n this.imageManager,\n this.bookmarkManager\n );\n\n // Populate document properties from parser results\n this.bodyElements = result.bodyElements;\n this.relationshipManager = result.relationshipManager;\n this.namespaces = result.namespaces;\n this.properties = result.properties;\n this._documentBackground = result.documentBackground;\n\n // Populate styles manager\n for (const style of result.styles) {\n this.stylesManager.addStyle(style);\n }\n\n // Inject StylesManager into parsed tables for conditional formatting resolution\n for (const element of this.bodyElements) {\n if (element instanceof Table) {\n element._setStylesManager(this.stylesManager);\n }\n }\n\n // Populate numbering manager\n for (const abstractNum of result.abstractNumberings) {\n this.numberingManager.addAbstractNumbering(abstractNum);\n }\n for (const instance of result.numberingInstances) {\n this.numberingManager.addInstance(instance);\n }\n\n // Set section if present\n if (result.section) {\n this.section = result.section;\n }\n\n // Parse and register headers/footers with error handling\n // If parsing fails, document loads but headers/footers are lost - warn user\n try {\n const headersFooters = await this.parser.parseHeadersAndFooters(\n this.zipHandler,\n result.section,\n this.relationshipManager,\n this.imageManager\n );\n\n // Register headers with HeaderFooterManager (deduplicate by rId)\n // Multiple section property types may reference the same rId\n const registeredHeaderRIds = new Set<string>();\n for (const { header, relationshipId } of headersFooters.headers) {\n if (registeredHeaderRIds.has(relationshipId)) continue;\n this.headerFooterManager.registerHeader(header, relationshipId);\n registeredHeaderRIds.add(relationshipId);\n }\n\n // Register footers with HeaderFooterManager (deduplicate by rId)\n const registeredFooterRIds = new Set<string>();\n for (const { footer, relationshipId } of headersFooters.footers) {\n if (registeredFooterRIds.has(relationshipId)) continue;\n this.headerFooterManager.registerFooter(footer, relationshipId);\n registeredFooterRIds.add(relationshipId);\n }\n } catch (headerFooterError) {\n const logger = getLogger();\n logger.warn('Failed to parse headers/footers - document will load without them', {\n error:\n headerFooterError instanceof Error\n ? headerFooterError.message\n : String(headerFooterError),\n });\n // Continue loading - headers/footers are not critical for document structure\n // User should be aware that headers/footers may be missing\n }\n\n // Reset modified flags - loading doesn't count as modification\n // This enables XML preservation for unmodified documents\n this.stylesManager.resetModified();\n this.numberingManager.resetModified();\n\n // Initialize ALL annotation managers with a unified global ID to avoid collisions\n // Per ECMA-376, w:id must be unique across ALL annotation types (bookmarks, revisions, comments)\n // Must be called BEFORE populateRevisionLocations() which registers revisions\n this.initializeGlobalAnnotationIds();\n\n // Parse and register comments from comments.xml\n // Must be called AFTER initializeGlobalAnnotationIds() to properly handle ID synchronization\n this.parseAndRegisterComments();\n this.parseAndRegisterFootnotes();\n this.parseAndRegisterEndnotes();\n\n // Populate revision locations for changelog/tracking purposes\n this.populateRevisionLocations();\n\n // Initialize image manager with existing images to avoid filename collisions\n this.imageManager.initializeFromLoadedImages();\n }\n\n /**\n * Scans the raw document XML for ALL existing annotation IDs and initializes\n * ALL managers (BookmarkManager, RevisionManager, CommentManager) to use IDs\n * starting from the global maximum + 1.\n *\n * Per ECMA-376, w:id attributes must be UNIQUE across ALL annotation types:\n * - w:bookmarkStart / w:bookmarkEnd\n * - w:ins / w:del (revisions)\n * - w:pPrChange / w:rPrChange / w:tblPrChange (property changes)\n * - w:moveFrom / w:moveTo\n * - w:commentRangeStart / w:commentRangeEnd\n * - w:comment\n *\n * This unified approach prevents ID collisions between different annotation types\n * that were causing document corruption.\n *\n * @private\n */\n private initializeGlobalAnnotationIds(): void {\n const documentXml = this.zipHandler.getFileAsString('word/document.xml');\n const commentsXml = this.zipHandler.getFileAsString('word/comments.xml');\n\n // Initialize the centralized DocumentIdManager from document XML\n // This scans ALL w:id attributes and sets nextId to globalMax + 1\n // All managers (Bookmark, Revision, Comment) use this shared counter via callbacks\n this.documentIdManager.initializeFromDocument(\n documentXml || undefined,\n commentsXml || undefined\n );\n }\n\n /**\n * Parses comments from word/comments.xml and registers them with the CommentManager.\n * This enables round-trip preservation of comments in loaded documents.\n * @private\n */\n private parseAndRegisterComments(): void {\n const commentsXml = this.zipHandler.getFileAsString('word/comments.xml');\n if (!commentsXml) {\n return; // No comments.xml file, nothing to parse\n }\n\n // Preserve original for passthrough (same pattern as footnotes)\n this._originalCommentsXml = commentsXml;\n\n // Also preserve companion files from the ZIP\n for (const path of [\n DOCX_PATHS.COMMENTS_EXTENDED,\n DOCX_PATHS.COMMENTS_IDS,\n DOCX_PATHS.COMMENTS_EXTENSIBLE,\n ]) {\n const content = this.zipHandler.getFileAsString(path);\n if (content) {\n this._originalCommentCompanionFiles.set(path, content);\n }\n }\n\n const parser = new DocumentParser();\n const comments = parser.parseCommentsXml(commentsXml);\n\n // Register each comment with its existing ID\n for (const comment of comments) {\n this.commentManager.registerExisting(comment);\n }\n\n // Link replies to their parent comments\n this.commentManager.linkReplies();\n }\n\n private parseAndRegisterFootnotes(): void {\n const footnotesXml = this.zipHandler.getFileAsString(DOCX_PATHS.FOOTNOTES);\n if (!footnotesXml) {\n return;\n }\n\n // Always preserve original for passthrough, even if parsing fails\n this._originalFootnotesXml = footnotesXml;\n\n try {\n const parser = new DocumentParser();\n const footnotes = parser.parseFootnotesXml(footnotesXml);\n\n for (const footnote of footnotes) {\n const id = footnote.getId();\n // Special footnotes (separator=-1, continuation=0) are already in the manager\n if (!this.footnoteManager.hasFootnote(id)) {\n this.footnoteManager.register(footnote);\n }\n }\n } catch (error) {\n this.logger.warn('Failed to parse footnotes - preserving original XML for passthrough', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n private parseAndRegisterEndnotes(): void {\n const endnotesXml = this.zipHandler.getFileAsString(DOCX_PATHS.ENDNOTES);\n if (!endnotesXml) {\n return;\n }\n\n this._originalEndnotesXml = endnotesXml;\n\n try {\n const parser = new DocumentParser();\n const endnotes = parser.parseEndnotesXml(endnotesXml);\n\n for (const endnote of endnotes) {\n const id = endnote.getId();\n if (!this.endnoteManager.hasEndnote(id)) {\n this.endnoteManager.register(endnote);\n }\n }\n } catch (error) {\n this.logger.warn('Failed to parse endnotes - preserving original XML for passthrough', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n /**\n * Populates location information on all revisions in the document\n * and registers them with the RevisionManager.\n * Called after parsing to set paragraph and run indices for each revision.\n * @private\n */\n private populateRevisionLocations(): void {\n const paragraphs = this.getParagraphs();\n\n // Track which revisions are already registered to avoid duplicates\n const registeredRevisions = new Set(this.revisionManager.getAllRevisions());\n\n for (let paragraphIndex = 0; paragraphIndex < paragraphs.length; paragraphIndex++) {\n const paragraph = paragraphs[paragraphIndex];\n if (!paragraph) continue;\n\n // Get all revisions from this paragraph\n const revisions = paragraph.getRevisions?.() || [];\n\n // Track run position within paragraph\n let runIndex = 0;\n\n for (const revision of revisions) {\n // Set location if not already set\n if (!revision.getLocation()) {\n const location: RevisionLocation = {\n paragraphIndex,\n runIndex,\n };\n revision.setLocation(location);\n }\n\n // Register revision with manager if not already registered\n // This ensures parsed revisions from document XML are accessible via\n // ChangelogGenerator.fromDocument() and revisionManager.getAllRevisions()\n // Uses registerExisting() to preserve original IDs from parsed XML\n // (register() would overwrite them with new sequential IDs)\n if (!registeredRevisions.has(revision)) {\n this.revisionManager.registerExisting(revision);\n registeredRevisions.add(revision);\n }\n\n // Advance run index for next revision\n runIndex++;\n }\n }\n }\n\n /**\n * Initializes all required DOCX files with minimal valid content\n */\n private initializeRequiredFiles(): void {\n // [Content_Types].xml\n this.zipHandler.addFile(DOCX_PATHS.CONTENT_TYPES, this.generator.generateContentTypes());\n\n // _rels/.rels\n this.zipHandler.addFile(DOCX_PATHS.RELS, this.generator.generateRels());\n\n // word/document.xml (will be updated when saving)\n this.zipHandler.addFile(\n DOCX_PATHS.DOCUMENT,\n this.generator.generateDocumentXml(\n this.bodyElements,\n this.section,\n this.namespaces,\n this._documentBackground\n )\n );\n\n // word/_rels/document.xml.rels\n this.zipHandler.addFile('word/_rels/document.xml.rels', this.relationshipManager.generateXml());\n\n // word/styles.xml\n this.zipHandler.addFile(DOCX_PATHS.STYLES, this.stylesManager.generateStylesXml());\n\n // word/numbering.xml\n this.zipHandler.addFile(DOCX_PATHS.NUMBERING, this.numberingManager.generateNumberingXml());\n\n // word/fontTable.xml (REQUIRED for DOCX compliance)\n this.zipHandler.addFile('word/fontTable.xml', this.generator.generateFontTable());\n\n // word/webSettings.xml\n this.zipHandler.addFile(DOCX_PATHS.WEB_SETTINGS, this.generator.generateWebSettings());\n\n // word/settings.xml (REQUIRED for DOCX compliance)\n this.zipHandler.addFile(\n DOCX_PATHS.SETTINGS,\n this.generator.generateSettings({\n trackChangesEnabled: this.trackChangesEnabled,\n trackFormatting: this.trackFormatting,\n revisionView: this.revisionViewSettings,\n rsidRoot: this.rsidRoot,\n rsids: this.getRsids(),\n documentProtection: this.documentProtection,\n })\n );\n\n // Set compatibility info for new documents (always mode 15)\n this._compatInfo = {\n mode: CompatibilityMode.Word2013Plus,\n isLegacyMode: false,\n compatSettings: [\n { name: 'compatibilityMode', uri: 'http://schemas.microsoft.com/office/word', val: '15' },\n {\n name: 'overrideTableStyleFontSizeAndJustification',\n uri: 'http://schemas.microsoft.com/office/word',\n val: '1',\n },\n {\n name: 'enableOpenTypeFeatures',\n uri: 'http://schemas.microsoft.com/office/word',\n val: '1',\n },\n {\n name: 'doNotFlipMirrorIndents',\n uri: 'http://schemas.microsoft.com/office/word',\n val: '1',\n },\n {\n name: 'differentiateMultirowTableHeaders',\n uri: 'http://schemas.microsoft.com/office/word',\n val: '1',\n },\n ],\n legacyFlags: [],\n };\n\n // word/theme/theme1.xml (REQUIRED for DOCX compliance)\n this.zipHandler.addFile('word/theme/theme1.xml', this.generator.generateTheme());\n\n // docProps/core.xml\n this.zipHandler.addFile(\n DOCX_PATHS.CORE_PROPS,\n this.generator.generateCoreProps(this.properties)\n );\n\n // docProps/app.xml\n this.zipHandler.addFile(DOCX_PATHS.APP_PROPS, this.generator.generateAppProps(this.properties));\n\n // Note: docProps/custom.xml is added during save() if custom properties exist\n }\n\n /**\n * Adds an existing paragraph to the document body\n *\n * Appends a Paragraph instance to the end of the document's body elements.\n * The paragraph maintains all its content, formatting, and properties.\n *\n * @param paragraph - The Paragraph instance to add\n * @returns This document instance for method chaining\n *\n * @example\n * ```typescript\n * const para = new Paragraph();\n * para.addText('Hello World', { bold: true });\n * doc.addParagraph(para);\n * ```\n *\n * @example\n * ```typescript\n * // Create and add in one chain\n * const para = Paragraph.create('Formatted text', { alignment: 'center' });\n * doc.addParagraph(para);\n * ```\n */\n addParagraph(paragraph: Paragraph): this {\n paragraph._setStylesManager(this.stylesManager);\n\n // When tracking enabled, bind context and wrap existing content in w:ins revisions\n if (this.trackChangesEnabled && this.trackingContext.isEnabled()) {\n this.bindTrackingToElement(paragraph);\n const runs = paragraph.getRuns();\n if (runs.length > 0) {\n const author = this.trackingContext.getAuthor();\n const insertion = Revision.createInsertion(author, runs);\n this.trackingContext.getRevisionManager().register(insertion);\n paragraph.addRevision(insertion);\n }\n }\n\n this.bodyElements.push(paragraph);\n return this;\n }\n\n /**\n * Creates a new paragraph and adds it to the document\n *\n * This is a convenience method that creates a Paragraph, optionally adds text content,\n * and appends it to the document in one operation. The returned paragraph can be\n * further modified using its chainable methods.\n *\n * @param text - Optional text content for the paragraph\n * @returns The created Paragraph instance for further customization\n *\n * @example\n * ```typescript\n * // Create empty paragraph\n * const para1 = doc.createParagraph();\n *\n * // Create with text\n * const para2 = doc.createParagraph('Hello World');\n *\n * // Create and customize\n * doc.createParagraph('Chapter 1')\n * .setStyle('Heading1')\n * .setAlignment('center');\n * ```\n */\n createParagraph(text?: string): Paragraph {\n const para = new Paragraph();\n\n // Inject StylesManager for style resolution\n para._setStylesManager(this.stylesManager);\n\n // If track changes is enabled, bind tracking context to the new paragraph\n if (this.trackChangesEnabled && this.trackingContext.isEnabled()) {\n para._setTrackingContext(this.trackingContext);\n }\n\n if (text) {\n para.addText(text);\n }\n this.bodyElements.push(para);\n return para;\n }\n\n /**\n * Adds an existing table to the document body\n *\n * Appends a Table instance to the end of the document's body elements.\n * The table maintains all its rows, cells, content, and formatting.\n *\n * @param table - The Table instance to add\n * @returns This document instance for method chaining\n *\n * @example\n * ```typescript\n * const table = new Table(3, 4);\n * table.getCell(0, 0)?.addParagraph(new Paragraph().addText('Header'));\n * doc.addTable(table);\n * ```\n */\n addTable(table: Table): this {\n table._setStylesManager(this.stylesManager);\n\n // When tracking enabled, bind context to table and its children\n if (this.trackChangesEnabled && this.trackingContext.isEnabled()) {\n this.bindTrackingToElement(table);\n }\n\n this.bodyElements.push(table);\n return this;\n }\n\n /**\n * Adds a Structured Document Tag (content control) to the document body\n *\n * Appends a StructuredDocumentTag instance to the end of the document's body elements.\n * SDTs are content controls used for forms, templates, and data-binding.\n *\n * @param sdt - The StructuredDocumentTag instance to add\n * @returns This document instance for method chaining\n *\n * @example\n * ```typescript\n * const sdt = new StructuredDocumentTag();\n * sdt.addParagraph(new Paragraph().addText('Content'));\n * doc.addStructuredDocumentTag(sdt);\n * ```\n */\n addStructuredDocumentTag(sdt: StructuredDocumentTag): this {\n this.bodyElements.push(sdt);\n return this;\n }\n\n /**\n * Creates a new table and adds it to the document\n *\n * This is a convenience method that creates a Table with the specified dimensions\n * and appends it to the document in one operation. The returned table can be\n * further customized using its chainable methods.\n *\n * @param rows - Number of rows to create (must be positive)\n * @param columns - Number of columns per row (must be positive)\n * @returns The created Table instance for further customization\n *\n * @throws Error if rows or columns is 0 or negative\n *\n * @example\n * ```typescript\n * // Create a 3x4 table\n * const table = doc.createTable(3, 4);\n * table.getCell(0, 0)?.addParagraph(new Paragraph().addText('A1'));\n * ```\n *\n * @example\n * ```typescript\n * // Create and format in one chain\n * doc.createTable(2, 3)\n * .setAllBorders({ style: 'single', size: 4, color: '000000' })\n * .setFirstRowShading('DFDFDF');\n * ```\n */\n createTable(rows: number, columns: number): Table {\n const table = new Table(rows, columns);\n table._setStylesManager(this.stylesManager);\n this.bodyElements.push(table);\n return table;\n }\n\n /**\n * Populates all TOCs in document XML\n * Extracted from replaceTableOfContents for reuse\n *\n * @param docXml The document XML string\n * @returns Modified XML with populated TOCs\n * @private\n */\n\n /**\n * Gets all tables in the document body (top-level only)\n *\n * Returns only tables that are direct children of the document body.\n * Does NOT include tables inside SDTs or nested tables.\n * Use {@link getAllTables} for recursive search including nested content.\n *\n * @returns Array of Table instances in the document body\n *\n * @example\n * ```typescript\n * const tables = doc.getTables();\n * console.log(`Document has ${tables.length} tables`);\n *\n * for (const table of tables) {\n * console.log(`Table: ${table.getRowCount()} rows x ${table.getColumnCount()} columns`);\n * }\n * ```\n */\n getTables(): Table[] {\n return this.bodyElements.filter((el): el is Table => el instanceof Table);\n }\n\n /**\n * Walks all elements in the document recursively, calling the visitor for each.\n *\n * Traverses the full document tree including elements nested inside:\n * - Tables (all cells in all rows)\n * - Structured Document Tags (content controls)\n * - Deeply nested SDTs and tables (unlimited depth)\n *\n * @param visitor - Callback invoked for each Paragraph, Table, or SDT encountered\n */\n walkElements(visitor: (element: Paragraph | Table | StructuredDocumentTag) => void): void {\n const walk = (elements: BodyElement[]) => {\n for (const element of elements) {\n if (element instanceof Paragraph) {\n visitor(element);\n } else if (element instanceof Table) {\n visitor(element);\n for (const row of element.getRows()) {\n for (const cell of row.getCells()) {\n for (const para of cell.getParagraphs()) {\n visitor(para);\n }\n }\n }\n } else if (element instanceof StructuredDocumentTag) {\n visitor(element);\n walk(element.getContent() as BodyElement[]);\n }\n }\n };\n walk(this.bodyElements);\n }\n\n /**\n * Gets all paragraphs in the document recursively\n *\n * Performs a deep search and returns ALL paragraphs in the document,\n * including those nested inside:\n * - Tables (all cells in all rows)\n * - Structured Document Tags (content controls)\n * - Nested SDTs and tables\n *\n * @returns Array of all Paragraph instances found anywhere in the document\n *\n * @example\n * ```typescript\n * // Count all paragraphs including those in tables\n * const allParas = doc.getAllParagraphs();\n * console.log(`Total paragraphs: ${allParas.length}`);\n * ```\n *\n * @example\n * ```typescript\n * // Find all headings\n * const headings = doc.getAllParagraphs().filter(p => {\n * const style = p.getStyle();\n * return style?.startsWith('Heading');\n * });\n * ```\n */\n getAllParagraphs(): Paragraph[] {\n const result: Paragraph[] = [];\n this.walkElements((element) => {\n if (element instanceof Paragraph) {\n result.push(element);\n }\n });\n return result;\n }\n\n /**\n * Gets all paragraphs in the document (alias for getAllParagraphs)\n * @returns Array of all paragraphs recursively\n * @deprecated Use getAllParagraphs() instead for clarity\n */\n getParagraphs(): Paragraph[] {\n return this.getAllParagraphs();\n }\n\n // ============================================================================\n // Direct Index Access & Navigation Helpers\n // ============================================================================\n\n /**\n * Gets a paragraph at a specific index from top-level body elements\n * @param index - The index of the paragraph (0-based)\n * @returns The paragraph at that index, or undefined if out of bounds\n */\n getParagraphAt(index: number): Paragraph | undefined {\n const paragraphs = this.bodyElements.filter((el): el is Paragraph => el instanceof Paragraph);\n return paragraphs[index];\n }\n\n /**\n * Gets a table at a specific index from top-level body elements\n * @param index - The index of the table (0-based)\n * @returns The table at that index, or undefined if out of bounds\n */\n getTableAt(index: number): Table | undefined {\n const tables = this.bodyElements.filter((el): el is Table => el instanceof Table);\n return tables[index];\n }\n\n /**\n * Gets a body element at a specific index\n * @param index - The index of the element (0-based)\n * @returns The body element at that index, or undefined if out of bounds\n */\n getBodyElementAt(index: number): BodyElement | undefined {\n return this.bodyElements[index];\n }\n\n /**\n * Gets the index of a paragraph within the top-level body elements\n * @param paragraph - The paragraph to find\n * @returns The index of the paragraph, or -1 if not found\n */\n getParagraphIndex(paragraph: Paragraph): number {\n const paragraphs = this.bodyElements.filter((el): el is Paragraph => el instanceof Paragraph);\n return paragraphs.indexOf(paragraph);\n }\n\n /**\n * Gets the index of a table within the top-level body elements\n * @param table - The table to find\n * @returns The index of the table, or -1 if not found\n */\n getTableIndex(table: Table): number {\n const tables = this.bodyElements.filter((el): el is Table => el instanceof Table);\n return tables.indexOf(table);\n }\n\n /**\n * Gets the next paragraph after the given paragraph\n * @param paragraph - The current paragraph\n * @returns The next paragraph, or undefined if none exists\n */\n getNextParagraph(paragraph: Paragraph): Paragraph | undefined {\n const paragraphs = this.bodyElements.filter((el): el is Paragraph => el instanceof Paragraph);\n const index = paragraphs.indexOf(paragraph);\n return index >= 0 && index < paragraphs.length - 1 ? paragraphs[index + 1] : undefined;\n }\n\n /**\n * Gets the previous paragraph before the given paragraph\n * @param paragraph - The current paragraph\n * @returns The previous paragraph, or undefined if none exists\n */\n getPreviousParagraph(paragraph: Paragraph): Paragraph | undefined {\n const paragraphs = this.bodyElements.filter((el): el is Paragraph => el instanceof Paragraph);\n const index = paragraphs.indexOf(paragraph);\n return index > 0 ? paragraphs[index - 1] : undefined;\n }\n\n /**\n * Gets all tables in the document recursively\n * Includes tables inside SDTs\n * @returns Array of all tables\n */\n getAllTables(): Table[] {\n const result: Table[] = [];\n this.walkElements((element) => {\n if (element instanceof Table) {\n result.push(element);\n }\n });\n return result;\n }\n\n /**\n * Gets all Table of Contents elements in the document\n * @returns Array of TableOfContentsElement\n */\n getTableOfContentsElements(): TableOfContentsElement[] {\n return this.bodyElements.filter(\n (el): el is TableOfContentsElement => el instanceof TableOfContentsElement\n );\n }\n\n /**\n * Adds a body element (paragraph, table, SDT, etc.) to the document\n * @param element - The body element to add\n * @returns This document for chaining\n */\n addBodyElement(element: BodyElement): this {\n this.bodyElements.push(element);\n return this;\n }\n\n /**\n * Gets all body elements (paragraphs and tables)\n * @returns Array of body elements\n */\n getBodyElements(): BodyElement[] {\n return [...this.bodyElements];\n }\n\n /**\n * Gets the number of paragraphs\n * @returns Number of paragraphs\n */\n getParagraphCount(): number {\n return this.getAllParagraphs().length;\n }\n\n /**\n * Gets the number of tables\n * @returns Number of tables\n */\n getTableCount(): number {\n return this.getTables().length;\n }\n\n /**\n * Removes all body elements from the document\n *\n * Clears all paragraphs, tables, TOCs, and other elements from the document body.\n * This does NOT affect headers, footers, styles, or document properties.\n *\n * @returns This document instance for method chaining\n *\n * @example\n * ```typescript\n * // Clear and rebuild document content\n * doc.clearParagraphs();\n * doc.createParagraph('Fresh start');\n * ```\n */\n clearParagraphs(): this {\n this.bodyElements = [];\n return this;\n }\n\n /**\n * Sets or updates document metadata properties\n *\n * Updates document metadata that appears in File > Properties in Word.\n * Properties are validated and sanitized before storing. Existing properties\n * are merged with new values.\n *\n * @param properties - Document metadata properties\n * @param properties.title - Document title\n * @param properties.subject - Document subject\n * @param properties.creator - Document author/creator\n * @param properties.keywords - Comma-separated keywords\n * @param properties.description - Document description\n * @param properties.category - Document category\n * @param properties.company - Company name\n * @param properties.customProperties - Custom key-value properties\n * @returns This document instance for method chaining\n *\n * @example\n * ```typescript\n * doc.setProperties({\n * title: 'Annual Report 2024',\n * creator: 'Finance Department',\n * company: 'Acme Corp',\n * keywords: 'annual, report, financial'\n * });\n * ```\n */\n setProperties(properties: DocumentProperties): this {\n // Validate and sanitize properties before storing\n const validated = DocumentValidator.validateProperties(properties);\n this.properties = { ...this.properties, ...validated };\n return this;\n }\n\n /**\n * Gets all document metadata properties\n *\n * Returns a copy of all document properties including core properties\n * (title, creator, etc.) and custom properties.\n *\n * @returns Copy of the document properties object\n *\n * @example\n * ```typescript\n * const props = doc.getProperties();\n * console.log(`Title: ${props.title}`);\n * console.log(`Author: ${props.creator}`);\n * ```\n */\n getProperties(): DocumentProperties {\n return { ...this.properties };\n }\n\n /**\n * Sets document property value\n * @param key - Property key\n * @param value - Property value\n * @returns This document for chaining\n */\n setProperty(\n key: keyof DocumentProperties,\n value: DocumentProperties[keyof DocumentProperties]\n ): this {\n this.properties[key] = value as never;\n return this;\n }\n\n /**\n * Sets the document title\n * @param title - Document title\n * @returns This document for chaining\n */\n setTitle(title: string): this {\n this.properties.title = title;\n return this;\n }\n\n /**\n * Sets the document subject\n * @param subject - Document subject\n * @returns This document for chaining\n */\n setSubject(subject: string): this {\n this.properties.subject = subject;\n return this;\n }\n\n /**\n * Sets the document creator/author\n * @param creator - Document creator\n * @returns This document for chaining\n */\n setCreator(creator: string): this {\n this.properties.creator = creator;\n return this;\n }\n\n /**\n * Sets the document author (alias for setCreator)\n * @param author - Document author name\n * @returns This document for chaining\n *\n * @example\n * ```typescript\n * doc.setAuthor('John Smith');\n * ```\n */\n setAuthor(author: string): this {\n return this.setCreator(author);\n }\n\n /**\n * Sets the document keywords\n * @param keywords - Document keywords (comma-separated)\n * @returns This document for chaining\n */\n setKeywords(keywords: string): this {\n this.properties.keywords = keywords;\n return this;\n }\n\n /**\n * Sets the document description\n * @param description - Document description\n * @returns This document for chaining\n */\n setDescription(description: string): this {\n this.properties.description = description;\n return this;\n }\n\n /**\n * Sets the document category\n * @param category - Document category\n * @returns This document for chaining\n */\n setCategory(category: string): this {\n this.properties.category = category;\n return this;\n }\n\n /**\n * Sets the document content status\n * @param status - Content status (e.g., \"Draft\", \"Final\", \"In Review\")\n * @returns This document for chaining\n */\n setContentStatus(status: string): this {\n this.properties.contentStatus = status;\n return this;\n }\n\n /**\n * Sets the application name\n * @param application - Application name\n * @returns This document for chaining\n */\n setApplication(application: string): this {\n this.properties.application = application;\n this._appPropsModified = true;\n return this;\n }\n\n /**\n * Sets the application version\n * @param version - Application version\n * @returns This document for chaining\n */\n setAppVersion(version: string): this {\n this.properties.appVersion = version;\n this._appPropsModified = true;\n return this;\n }\n\n /**\n * Sets the company name\n * @param company - Company name\n * @returns This document for chaining\n */\n setCompany(company: string): this {\n this.properties.company = company;\n this._appPropsModified = true;\n return this;\n }\n\n /**\n * Sets the manager name\n * @param manager - Manager name\n * @returns This document for chaining\n */\n setManager(manager: string): this {\n this.properties.manager = manager;\n this._appPropsModified = true;\n return this;\n }\n\n /**\n * Sets a custom property\n * @param name - Property name\n * @param value - Property value (string, number, boolean, or Date)\n * @returns This document for chaining\n */\n setCustomProperty(name: string, value: string | number | boolean | Date): this {\n if (!this.properties.customProperties) {\n this.properties.customProperties = {};\n }\n this.properties.customProperties[name] = value;\n return this;\n }\n\n /**\n * Sets multiple custom properties\n * @param properties - Object containing custom properties\n * @returns This document for chaining\n */\n setCustomProperties(properties: Record<string, string | number | boolean | Date>): this {\n this.properties.customProperties = { ...properties };\n return this;\n }\n\n /**\n * Gets a custom property value\n * @param name - Property name\n * @returns Property value or undefined\n */\n getCustomProperty(name: string): string | number | boolean | Date | undefined {\n return this.properties.customProperties?.[name];\n }\n\n /**\n * Enables or disables automatic TOC population during save\n *\n * When enabled, the save() and toBuffer() methods will automatically\n * populate Table of Contents fields with hyperlinked entries based on\n * the document's heading structure.\n *\n * This is critical for documents where the in-memory model doesn't preserve\n * the complete TOC field structure. When save() regenerates document.xml,\n * the TOC field markers (begin/separate/end) may be lost. Enabling this\n * option ensures the TOC is rebuilt with proper field structure after\n * XML regeneration.\n *\n * @param enabled - Whether to auto-populate TOCs (default: false)\n * @returns This document instance for method chaining\n *\n * @example\n * ```typescript\n * const doc = await Document.load('input.docx');\n * doc.setAutoPopulateTOCs(true);\n * await doc.save('output.docx');\n * // TOC will have proper field structure with working \"Update Field\" in Word\n * ```\n */\n setAutoPopulateTOCs(enabled: boolean): this {\n this.autoPopulateTOCs = enabled;\n return this;\n }\n\n /**\n * Saves the document to a file path\n *\n * Generates all required XML parts, processes images and relationships, validates\n * the document structure, and writes the complete DOCX package to disk.\n * Uses atomic save pattern (temp file + rename) to prevent corruption on failure.\n *\n * @param filePath - Absolute or relative path where the DOCX file will be saved\n *\n * @throws Error if validation fails, memory limits exceeded, or file system error occurs\n * @throws Error if image count or size limits are exceeded\n *\n * @example\n * ```typescript\n * const doc = Document.create();\n * doc.createParagraph('Hello World');\n * await doc.save('output.docx');\n * ```\n *\n * @example\n * ```typescript\n * // Save with TOC auto-population\n * doc.setAutoPopulateTOCs(true);\n * doc.createTableOfContents();\n * doc.createParagraph('Chapter 1').setStyle('Heading1');\n * await doc.save('document-with-toc.docx');\n * ```\n */\n /**\n * Common preparation logic shared by save() and toBuffer().\n * Validates, loads images, flushes changes, accepts revisions, and updates all XML parts.\n */\n private async prepareSave(): Promise<void> {\n // Validate before saving to prevent data loss\n this.validator.validateBeforeSave(this.bodyElements);\n\n // Check memory usage before starting\n this.validator.checkMemoryThreshold();\n\n // Load all image data before saving (now async)\n await this.imageManager.loadAllImageData();\n\n // Check memory again after loading images\n this.validator.checkMemoryThreshold();\n\n // Check document size and warn if too large\n const sizeInfo = this.validator.estimateSize(this.bodyElements, this.imageManager);\n if (sizeInfo.warning) {\n this.logger.warn(sizeInfo.warning, {\n totalMB: sizeInfo.totalEstimatedMB,\n paragraphs: sizeInfo.paragraphs,\n tables: sizeInfo.tables,\n images: sizeInfo.images,\n });\n }\n\n // Clear preserve flags before final save (they're runtime-only)\n this.clearAllPreserveFlags();\n\n this.processHyperlinks();\n\n // Flush pending tracked changes to create Revision objects before XML generation\n if (this.trackChangesEnabled && this.trackingContext) {\n this.flushPendingChanges();\n }\n\n // Consolidate adjacent revisions to match Word's behavior\n // This merges adjacent same-author revisions within a 1-second window,\n // preventing the \"random insertions and deletions\" problem in Word\n if (this.trackChangesEnabled) {\n this.consolidateAllRevisions();\n }\n\n // Accept all revisions if auto-accept is enabled\n // This MUST happen after flushPendingChanges() to catch all revisions\n // but BEFORE updateDocumentXml() so accepted changes are serialized correctly\n if (this.acceptRevisionsBeforeSave) {\n await this.acceptAllRevisions();\n this.acceptRevisionsBeforeSave = false; // Reset flag after acceptance\n }\n\n // Validate numbering references before generating XML to prevent corruption\n // from orphaned numId references pointing to removed definitions\n this.validateNumberingReferences();\n\n // Validate bookmark pairs — add missing bookmarkEnd markers and remove orphaned ends\n // This prevents Word \"unreadable content\" errors from unbalanced bookmark pairs\n this.validateBookmarkPairs();\n\n // Ensure unique IDs for revisions and drawing elements before serialization\n this.assignUniqueIds();\n\n // Only regenerate document.xml if we haven't manually stripped tracked changes\n // acceptAllRevisionsRawXml() sets skipDocumentXmlRegeneration to preserve the cleaned raw XML\n if (this.skipDocumentXmlRegeneration) {\n this.logger.warn(\n 'skipDocumentXmlRegeneration is set: in-memory content modifications will NOT be saved. ' +\n 'Use acceptAllRevisions() instead of acceptAllRevisionsRawXml() if you need to modify the document after accepting revisions.'\n );\n } else {\n this.updateDocumentXml();\n }\n\n // Post-process document.xml for sanitization (field flattening, RSID cleanup)\n // Must run AFTER updateDocumentXml() so we have the final XML,\n // and BEFORE updateSettingsXml() so RSID filtering affects the merge\n this._postProcessDocumentXml();\n\n this.updateStylesXml();\n this.updateNumberingXml();\n this.updateSettingsXml();\n this.updateCoreProps();\n this.updateAppProps();\n this.updateWebSettingsXml();\n this.saveImages();\n this.saveHeaders();\n this.saveFooters();\n this.saveComments();\n this.saveFootnotes();\n this.saveEndnotes();\n this.updatePeopleXml();\n this.saveCustomProperties();\n this.updateRelationships();\n this.updateContentTypesWithImagesHeadersFootersAndComments();\n }\n\n async save(filePath: string): Promise<void> {\n const logger = getLogger();\n logger.info('Saving document', { path: filePath, paragraphs: this.getParagraphCount() });\n\n // Use atomic save pattern: save to temp file, then rename\n // This prevents partial/corrupted saves if operation fails mid-way\n const tempPath = `${filePath}.tmp.${Date.now()}`;\n\n // Track whether save succeeded for proper cleanup\n let saveSucceeded = false;\n\n // Create state snapshot before any modifications for rollback on failure\n this.createSaveStateSnapshot();\n\n try {\n await this.prepareSave();\n\n // Save to temporary file first\n await this.zipHandler.save(tempPath);\n\n // Auto-populate TOCs if enabled\n if (this.autoPopulateTOCs) {\n await this.populateTOCsInFile(tempPath);\n }\n\n // Atomic rename - only if save succeeded\n const { promises: fs } = await import('fs');\n await fs.rename(tempPath, filePath);\n\n // Mark save as successful - image data can now be released safely\n saveSucceeded = true;\n this.clearSaveStateSnapshot();\n logger.info('Document saved', { path: filePath });\n } catch (error: unknown) {\n // Restore state snapshot on failure - allows retry without data loss\n this.restoreSaveStateSnapshot();\n\n // Cleanup temporary file on error\n try {\n const { promises: fs } = await import('fs');\n await fs.unlink(tempPath);\n } catch (cleanupErr) {\n logger.debug('Failed to clean up temp file', { tempPath, error: String(cleanupErr) });\n }\n throw error; // Re-throw original error\n } finally {\n // Only release image data if save succeeded\n // On failure, keep images loaded so user can retry save without reloading\n if (saveSucceeded) {\n this.imageManager.releaseAllImageData();\n }\n }\n }\n\n /**\n * Generates the document as an in-memory Buffer\n *\n * Creates the complete DOCX package in memory without writing to disk.\n * Useful for streaming documents in HTTP responses, storing in databases,\n * or processing through additional systems.\n *\n * @returns Promise that resolves to a Buffer containing the complete DOCX file\n *\n * @throws Error if validation fails, memory limits exceeded, or document is invalid\n *\n * @example\n * ```typescript\n * // Generate and send via HTTP\n * const doc = Document.create();\n * doc.createParagraph('Content');\n * const buffer = await doc.toBuffer();\n * res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document');\n * res.send(buffer);\n * ```\n *\n * @example\n * ```typescript\n * // Save to database\n * const buffer = await doc.toBuffer();\n * await db.documents.insert({ name: 'report.docx', data: buffer });\n * ```\n */\n async toBuffer(): Promise<Buffer> {\n const logger = getLogger();\n logger.info('Generating document buffer', { paragraphs: this.getParagraphCount() });\n\n // Track whether generation succeeded for proper cleanup\n let generateSucceeded = false;\n\n // Create state snapshot before any modifications for rollback on failure\n this.createSaveStateSnapshot();\n\n try {\n await this.prepareSave();\n\n // Auto-populate TOCs if enabled\n if (this.autoPopulateTOCs) {\n const docXml = this.zipHandler.getFileAsString('word/document.xml');\n if (docXml) {\n const populatedXml = this.populateAllTOCsInXML(docXml);\n if (populatedXml !== docXml) {\n this.zipHandler.updateFile('word/document.xml', populatedXml);\n }\n }\n }\n\n const buffer = await this.zipHandler.toBuffer();\n\n // Mark generation as successful\n generateSucceeded = true;\n this.clearSaveStateSnapshot();\n logger.info('Document buffer generated', { bufferSize: buffer.length });\n return buffer;\n } catch (error: unknown) {\n // Restore state snapshot on failure - allows retry without data loss\n this.restoreSaveStateSnapshot();\n throw error;\n } finally {\n // Only release image data if generation succeeded\n // On failure, keep images loaded so user can retry without reloading\n if (generateSucceeded) {\n this.imageManager.releaseAllImageData();\n }\n }\n }\n\n /**\n * Updates the document.xml file with current paragraphs\n */\n private updateDocumentXml(): void {\n let xml = this.generator.generateDocumentXml(\n this.bodyElements,\n this.section,\n this.namespaces,\n this._documentBackground\n );\n\n // Sync TOC field instructions with actual style names\n // This ensures TOC \\t switches reference styles by their current names\n xml = this.syncTOCFieldInstructions(xml);\n\n this.zipHandler.updateFile(DOCX_PATHS.DOCUMENT, xml);\n }\n\n /**\n * Post-processes document.xml after generation for sanitization tasks.\n * Runs only when explicitly enabled via flattenFieldCodes(), stripOrphanRSIDs(), or clearDirectSpacingForStyles().\n * Zero overhead when neither flag is set.\n *\n * IMPORTANT — INTENTIONAL REMOVAL BEHAVIOR (NOT A BUG):\n * These sanitization methods deliberately remove XML elements and attributes from\n * the document. This is their entire purpose — they clean up bloat and redundancy:\n *\n * - flattenFieldCodes(): Removes INCLUDEPICTURE field markup (fldChar, instrText runs).\n * Only the w:drawing content is preserved. The field wrapper is bloat from Outlook\n * copy-paste that causes Word to freeze.\n *\n * - stripOrphanRSIDs(): Removes RSIDs from settings.xml that are not referenced in\n * document.xml. Orphan RSIDs accumulate over editing sessions and can account for\n * 80%+ of settings.xml size. They serve no purpose.\n *\n * - clearDirectSpacingForStyles(): Removes direct w:spacing overrides from paragraphs\n * whose style already defines spacing. The direct overrides prevent style-based\n * spacing from taking effect.\n *\n * These methods are explicitly called by user code — they never run automatically.\n * The elements they remove are genuinely unwanted. Do not \"fix\" these removals.\n *\n * @private\n */\n private _postProcessDocumentXml(): void {\n if (\n !this._flattenIncludePictureFields &&\n !this._stripOrphanRSIDs &&\n !this._clearDirectSpacingStyles\n ) {\n return;\n }\n\n let docXml = this.zipHandler.getFileAsString(DOCX_PATHS.DOCUMENT);\n if (!docXml) {\n return;\n }\n\n // Step 1: Flatten INCLUDEPICTURE fields\n if (this._flattenIncludePictureFields) {\n docXml = this._flattenIncludePictureFieldsInXml(docXml);\n this._flattenIncludePictureFields = false; // Reset after use\n }\n\n // Step 2: Strip orphan RSIDs (uses final document.xml to determine which are referenced)\n if (this._stripOrphanRSIDs) {\n this._stripOrphanRSIDsFromSettings(docXml);\n this._stripOrphanRSIDs = false; // Reset after use\n }\n\n // Step 3: Clear direct w:spacing from styled paragraphs\n if (this._clearDirectSpacingStyles && this._clearDirectSpacingStyles.length > 0) {\n docXml = this._clearDirectSpacingFromStyledParagraphs(docXml, this._clearDirectSpacingStyles);\n this._clearDirectSpacingStyles = null;\n }\n\n this.zipHandler.updateFile(DOCX_PATHS.DOCUMENT, docXml);\n }\n\n /**\n * Strips INCLUDEPICTURE field markup from document.xml while preserving\n * the field result content (w:drawing elements with embedded images).\n *\n * Uses a token-based state machine to track field depth and identify\n * INCLUDEPICTURE fields. Removes the w:r elements containing fldChar\n * begin/separate/end and instrText, preserving everything else.\n *\n * @param xml - The document.xml content\n * @returns Modified XML with INCLUDEPICTURE field markup removed\n * @private\n */\n private _flattenIncludePictureFieldsInXml(xml: string): string {\n // Phase 1: Scan for all fldChar and instrText positions to build field structure\n interface FieldToken {\n type: 'begin' | 'separate' | 'end';\n /** Start of the containing <w:r> element */\n runStart: number;\n /** End of the containing </w:r> (exclusive) */\n runEnd: number;\n }\n\n interface InstrToken {\n /** The instrText content */\n text: string;\n /** Start of the containing <w:r> element */\n runStart: number;\n /** End of the containing </w:r> (exclusive) */\n runEnd: number;\n }\n\n // Find all <w:r>...</w:r> runs that contain fldChar or instrText\n const fieldTokens: FieldToken[] = [];\n const instrTokens: InstrToken[] = [];\n\n // Match all <w:r> elements (non-greedy, handling nested elements)\n const runRegex = /<w:r[\\s>]/g;\n let runMatch: RegExpExecArray | null;\n\n while ((runMatch = runRegex.exec(xml)) !== null) {\n const runStart = runMatch.index;\n\n // Find the closing </w:r> tag, accounting for depth\n const runEnd = this._findClosingWrTag(xml, runStart);\n if (runEnd === -1) continue;\n\n const runContent = xml.substring(runStart, runEnd);\n\n // Check for fldChar\n const fldCharMatch = /<w:fldChar\\s+w:fldCharType\\s*=\\s*\"(begin|separate|end)\"/.exec(\n runContent\n );\n if (fldCharMatch) {\n fieldTokens.push({\n type: fldCharMatch[1] as 'begin' | 'separate' | 'end',\n runStart,\n runEnd,\n });\n }\n\n // Check for instrText\n const instrMatch = /<w:instrText[^>]*>([\\s\\S]*?)<\\/w:instrText>/.exec(runContent);\n if (instrMatch) {\n instrTokens.push({\n text: instrMatch[1]!.trim(),\n runStart,\n runEnd,\n });\n }\n }\n\n // Phase 2: Use a depth-tracking state machine to identify INCLUDEPICTURE fields\n // and collect the runs to remove\n const runsToRemove: { start: number; end: number }[] = [];\n const fieldStack: {\n tokenIndex: number;\n instrRuns: { start: number; end: number }[];\n separateRun?: { start: number; end: number };\n isIncludePicture: boolean;\n }[] = [];\n\n let instrTokenIdx = 0;\n\n for (let i = 0; i < fieldTokens.length; i++) {\n const token = fieldTokens[i]!;\n\n if (token.type === 'begin') {\n fieldStack.push({\n tokenIndex: i,\n instrRuns: [],\n isIncludePicture: false,\n });\n const stackTop = fieldStack[fieldStack.length - 1]!;\n\n // Collect any instrText runs between this begin and the next fldChar\n const nextFldCharIdx = i + 1 < fieldTokens.length ? fieldTokens[i + 1]!.runStart : Infinity;\n while (\n instrTokenIdx < instrTokens.length &&\n instrTokens[instrTokenIdx]!.runStart < nextFldCharIdx &&\n instrTokens[instrTokenIdx]!.runStart > token.runStart\n ) {\n const instr = instrTokens[instrTokenIdx]!;\n stackTop.instrRuns.push({ start: instr.runStart, end: instr.runEnd });\n\n // Check if this is an INCLUDEPICTURE instruction\n if (/^\\s*INCLUDEPICTURE\\b/i.test(instr.text)) {\n stackTop.isIncludePicture = true;\n }\n instrTokenIdx++;\n }\n } else if (token.type === 'separate') {\n if (fieldStack.length > 0) {\n const current = fieldStack[fieldStack.length - 1]!;\n current.separateRun = { start: token.runStart, end: token.runEnd };\n\n // Also collect instrText runs between begin and separate that we may have missed\n // (when instrText spans multiple runs between begin and separate)\n const beginToken = fieldTokens[current.tokenIndex]!;\n while (\n instrTokenIdx < instrTokens.length &&\n instrTokens[instrTokenIdx]!.runStart > beginToken.runStart &&\n instrTokens[instrTokenIdx]!.runStart < token.runStart\n ) {\n const instr = instrTokens[instrTokenIdx]!;\n current.instrRuns.push({ start: instr.runStart, end: instr.runEnd });\n if (/^\\s*INCLUDEPICTURE\\b/i.test(instr.text)) {\n current.isIncludePicture = true;\n }\n instrTokenIdx++;\n }\n }\n } else if (token.type === 'end') {\n if (fieldStack.length > 0) {\n const field = fieldStack.pop()!;\n if (field.isIncludePicture) {\n // Remove: begin run, instrText runs, separate run, end run\n const beginFieldToken = fieldTokens[field.tokenIndex]!;\n runsToRemove.push({ start: beginFieldToken.runStart, end: beginFieldToken.runEnd });\n for (const instrRun of field.instrRuns) {\n runsToRemove.push(instrRun);\n }\n if (field.separateRun) {\n runsToRemove.push(field.separateRun);\n }\n runsToRemove.push({ start: token.runStart, end: token.runEnd });\n }\n }\n }\n }\n\n if (runsToRemove.length === 0) {\n return xml;\n }\n\n // Phase 3: Remove runs in reverse order to preserve offsets\n runsToRemove.sort((a, b) => b.start - a.start);\n\n // Deduplicate overlapping ranges\n const uniqueRuns: { start: number; end: number }[] = [];\n for (const run of runsToRemove) {\n const isDuplicate = uniqueRuns.some((u) => u.start === run.start && u.end === run.end);\n if (!isDuplicate) {\n uniqueRuns.push(run);\n }\n }\n\n let result = xml;\n for (const run of uniqueRuns) {\n result = result.substring(0, run.start) + result.substring(run.end);\n }\n\n return result;\n }\n\n /**\n * Finds the closing </w:r> tag for a <w:r> element starting at the given position,\n * accounting for nested depth (though w:r shouldn't nest, this is defensive).\n * @private\n */\n private _findClosingWrTag(xml: string, startPos: number): number {\n let depth = 0;\n const tagRegex = /<(\\/?)w:r([\\s>\\/])/g;\n tagRegex.lastIndex = startPos;\n\n let match: RegExpExecArray | null;\n while ((match = tagRegex.exec(xml)) !== null) {\n const isClosing = match[1] === '/';\n\n if (!isClosing) {\n // Check for self-closing\n const restOfTag = xml.substring(match.index, xml.indexOf('>', match.index) + 1);\n if (restOfTag.endsWith('/>')) {\n if (depth === 0 && match.index === startPos) {\n return xml.indexOf('>', match.index) + 1;\n }\n continue;\n }\n depth++;\n } else {\n depth--;\n if (depth === 0) {\n return xml.indexOf('>', match.index) + 1;\n }\n }\n }\n return -1;\n }\n\n /**\n * Removes direct w:spacing elements from w:pPr blocks that contain a w:pStyle\n * matching one of the specified style IDs.\n *\n * This operates on raw XML so it works alongside skipDocumentXmlRegeneration.\n * Only affects paragraphs with an explicit w:pStyle — paragraphs without a\n * style reference are left unchanged (they need direct formatting).\n * @private\n */\n private _clearDirectSpacingFromStyledParagraphs(xml: string, styleIds: string[]): string {\n const styleSet = new Set(styleIds);\n let cleared = 0;\n\n // Use depth-aware matching to find top-level <w:pPr>...</w:pPr> blocks.\n // A simple non-greedy regex would incorrectly terminate at nested </w:pPr>\n // inside <w:pPrChange> (ECMA-376 §17.13.5.29), producing malformed XML.\n const pPrOpenTag = '<w:pPr>';\n const pPrCloseTag = '</w:pPr>';\n let searchPos = 0;\n let result = '';\n let lastCopyPos = 0;\n\n while (searchPos < xml.length) {\n const openIdx = xml.indexOf(pPrOpenTag, searchPos);\n if (openIdx === -1) break;\n\n // Find the matching close tag using depth counting\n let depth = 1;\n let scanPos = openIdx + pPrOpenTag.length;\n while (depth > 0 && scanPos < xml.length) {\n const nextOpen = xml.indexOf(pPrOpenTag, scanPos);\n const nextClose = xml.indexOf(pPrCloseTag, scanPos);\n if (nextClose === -1) break; // Malformed XML — bail out\n\n if (nextOpen !== -1 && nextOpen < nextClose) {\n depth++;\n scanPos = nextOpen + pPrOpenTag.length;\n } else {\n depth--;\n if (depth === 0) {\n // Found the matching close tag\n const innerStart = openIdx + pPrOpenTag.length;\n const innerEnd = nextClose;\n const inner = xml.substring(innerStart, innerEnd);\n\n // Protect nested blocks (w:pPrChange, w:rPr) from modification.\n // w:pPrChange contains a child w:pPr with historical property values.\n // w:rPr may contain w:spacing for paragraph mark character spacing.\n // Protection must run BEFORE style check so we don't match styles\n // inside pPrChange (which represent historical, not current, state).\n const protectedBlocks: string[] = [];\n // Protect pPrChange and rPr blocks separately to prevent cross-tag\n // mismatch (e.g., <w:rPr> matching </w:pPrChange> in the alternation).\n let safeInner = inner.replace(/<w:pPrChange\\b[\\s\\S]*?<\\/w:pPrChange>/g, (block) => {\n protectedBlocks.push(block);\n return `\\x00PROTECTED_${protectedBlocks.length - 1}\\x00`;\n });\n safeInner = safeInner.replace(/<w:rPr\\b[\\s\\S]*?<\\/w:rPr>/g, (block) => {\n protectedBlocks.push(block);\n return `\\x00PROTECTED_${protectedBlocks.length - 1}\\x00`;\n });\n\n // Check if this pPr contains a pStyle matching our list\n // (checked against safeInner to avoid matching styles inside pPrChange)\n const styleMatch = /<w:pStyle\\s+w:val=\"([^\"]+)\"/.exec(safeInner);\n if (styleMatch && styleSet.has(styleMatch[1]!)) {\n // Remove direct <w:spacing .../> (self-closing) from the safe region\n let cleaned = safeInner.replace(/<w:spacing\\b[^/]*\\/>\\s*/g, '');\n\n if (cleaned !== safeInner) {\n // Restore protected blocks\n for (let i = 0; i < protectedBlocks.length; i++) {\n cleaned = cleaned.replace(`\\x00PROTECTED_${i}\\x00`, protectedBlocks[i]!);\n }\n cleared++;\n result += xml.substring(lastCopyPos, openIdx);\n result += `${pPrOpenTag}${cleaned}${pPrCloseTag}`;\n lastCopyPos = nextClose + pPrCloseTag.length;\n }\n }\n\n scanPos = nextClose + pPrCloseTag.length;\n } else {\n scanPos = nextClose + pPrCloseTag.length;\n }\n }\n }\n\n searchPos = scanPos;\n }\n\n // Append remaining content\n if (lastCopyPos === 0) {\n // No modifications made — return original string (avoids allocation)\n if (cleared === 0) return xml;\n }\n result += xml.substring(lastCopyPos);\n\n if (cleared > 0) {\n this.logger.info(`Cleared direct w:spacing from ${cleared} styled paragraphs`);\n }\n return result;\n }\n\n /**\n * Scans document.xml for all w:rsid* attribute values and filters\n * this.rsids to only keep referenced ones + rsidRoot.\n * @private\n */\n private _stripOrphanRSIDsFromSettings(documentXml: string): void {\n // Collect all rsid values referenced in document.xml\n // Matches: w:rsidR=\"00AABB11\", w:rsidRPr=\"...\", w:rsidRDefault=\"...\",\n // w:rsidP=\"...\", w:rsidDel=\"...\", w:rsidSect=\"...\", etc.\n const referencedRsids = new Set<string>();\n const rsidAttrRegex = /w:rsid\\w*\\s*=\\s*\"([0-9A-Fa-f]{8})\"/g;\n let rsidMatch: RegExpExecArray | null;\n\n while ((rsidMatch = rsidAttrRegex.exec(documentXml)) !== null) {\n referencedRsids.add(rsidMatch[1]!.toUpperCase());\n }\n\n // Always preserve rsidRoot (required by spec even if not in document.xml)\n if (this.rsidRoot) {\n referencedRsids.add(this.rsidRoot);\n }\n\n // Filter: keep only referenced RSIDs\n const originalSize = this.rsids.size;\n const newRsids = new Set<string>();\n for (const rsid of this.rsids) {\n if (referencedRsids.has(rsid)) {\n newRsids.add(rsid);\n }\n }\n this.rsids = newRsids;\n\n // Mark settings as modified so mergeSettingsWithOriginal() runs the merge path\n if (newRsids.size !== originalSize) {\n this._settingsModified = true;\n }\n }\n\n /**\n * Updates the core properties with current values\n */\n private updateCoreProps(): void {\n if (\n this._removedParts.has(DOCX_PATHS.CORE_PROPS) ||\n this._removedParts.has('docProps/core.xml')\n )\n return;\n const xml = this.generator.generateCoreProps(this.properties);\n this.zipHandler.updateFile(DOCX_PATHS.CORE_PROPS, xml);\n }\n\n /**\n * Updates the app properties with current values\n * Uses preservation strategy to maintain original metadata when unmodified\n */\n private updateAppProps(): void {\n if (this._removedParts.has(DOCX_PATHS.APP_PROPS) || this._removedParts.has('docProps/app.xml'))\n return;\n if (this._originalAppPropsXml && !this._appPropsModified) {\n // Preserve original as-is — no changes to app properties\n return;\n }\n if (this._originalAppPropsXml && this._appPropsModified) {\n // Merge: update only changed fields in original XML\n const mergedXml = this.mergeAppPropsWithOriginal();\n this.zipHandler.updateFile(DOCX_PATHS.APP_PROPS, mergedXml);\n } else {\n // New document — generate from scratch\n const xml = this.generator.generateAppProps(this.properties);\n this.zipHandler.updateFile(DOCX_PATHS.APP_PROPS, xml);\n }\n }\n\n /**\n * Merges modified app properties with the original app.xml\n * Updates only fields that have been programmatically changed,\n * preserving HeadingPairs, TotalTime, Pages, Words, etc.\n */\n private mergeAppPropsWithOriginal(): string {\n if (!this._originalAppPropsXml) {\n return this.generator.generateAppProps(this.properties);\n }\n\n let xml = this._originalAppPropsXml;\n\n // Update Company if changed\n if (this.properties.company !== undefined) {\n const escaped = XMLBuilder.sanitizeXmlContent(this.properties.company);\n if (xml.includes('<Company>')) {\n xml = xml.replace(/<Company>[^<]*<\\/Company>/, `<Company>${escaped}</Company>`);\n } else if (xml.includes('<Company/>')) {\n xml = xml.replace(/<Company\\/>/, `<Company>${escaped}</Company>`);\n }\n }\n\n // Update Application if changed\n if (this.properties.application !== undefined) {\n const escaped = XMLBuilder.sanitizeXmlContent(this.properties.application);\n if (xml.includes('<Application>')) {\n xml = xml.replace(\n /<Application>[^<]*<\\/Application>/,\n `<Application>${escaped}</Application>`\n );\n }\n }\n\n // Update AppVersion if changed\n if (this.properties.appVersion !== undefined) {\n const escaped = XMLBuilder.sanitizeXmlContent(this.properties.appVersion);\n if (xml.includes('<AppVersion>')) {\n xml = xml.replace(/<AppVersion>[^<]*<\\/AppVersion>/, `<AppVersion>${escaped}</AppVersion>`);\n }\n }\n\n // Update Manager if changed\n if (this.properties.manager !== undefined) {\n const escaped = XMLBuilder.sanitizeXmlContent(this.properties.manager);\n if (xml.includes('<Manager>')) {\n xml = xml.replace(/<Manager>[^<]*<\\/Manager>/, `<Manager>${escaped}</Manager>`);\n }\n }\n\n return xml;\n }\n\n /**\n * Parse webSettings.xml into in-memory state.\n * Uses regex matching consistent with parseSettingsFromXml().\n */\n private parseWebSettingsFromXml(xml: string): void {\n this._webSettings.optimizeForBrowser = /<w:optimizeForBrowser\\b/.test(xml);\n this._webSettings.allowPNG = /<w:allowPNG\\b/.test(xml);\n this._webSettings.relyOnVML = /<w:relyOnVML\\b/.test(xml);\n this._webSettings.doNotRelyOnCSS = /<w:doNotRelyOnCSS\\b/.test(xml);\n this._webSettings.doNotSaveAsSingleFile = /<w:doNotSaveAsSingleFile\\b/.test(xml);\n this._webSettings.doNotOrganizeInFolder = /<w:doNotOrganizeInFolder\\b/.test(xml);\n this._webSettings.doNotUseLongFileNames = /<w:doNotUseLongFileNames\\b/.test(xml);\n\n const pixelsMatch = /<w:pixelsPerInch\\b[^>]*w:val\\s*=\\s*\"(\\d+)\"/.exec(xml);\n this._webSettings.pixelsPerInch = pixelsMatch?.[1] ? parseInt(pixelsMatch[1], 10) : undefined;\n\n const screenMatch = /<w:targetScreenSz\\b[^>]*w:val\\s*=\\s*\"([^\"]*)\"/.exec(xml);\n this._webSettings.targetScreenSz = screenMatch?.[1] ?? undefined;\n\n const encodingMatch = /<w:encoding\\b[^>]*w:val\\s*=\\s*\"([^\"]*)\"/.exec(xml);\n this._webSettings.encoding = encodingMatch?.[1] ?? undefined;\n }\n\n /**\n * Save pipeline for webSettings.xml.\n * Preserves original XML when unmodified; writes modified or regenerated XML otherwise.\n */\n private updateWebSettingsXml(): void {\n if (!this._webSettingsModified) {\n // Original XML already in ZIP from load, or static template from initializeRequiredFiles\n return;\n }\n if (this._originalWebSettingsXml) {\n // In-place edit path (e.g., stripWebDivs mutated _originalWebSettingsXml)\n this.zipHandler.updateFile(DOCX_PATHS.WEB_SETTINGS, this._originalWebSettingsXml);\n } else {\n // Sanitize or setter path — regenerate from in-memory state\n this.zipHandler.updateFile(\n DOCX_PATHS.WEB_SETTINGS,\n this.generator.generateWebSettings(this._webSettings)\n );\n }\n }\n\n /**\n * Returns information about the current webSettings.xml state.\n */\n getWebSettingsInfo(): WebSettingsInfo {\n let divCount = 0;\n if (this._originalWebSettingsXml) {\n const matches = this._originalWebSettingsXml.match(/<w:div\\b/g);\n divCount = matches ? matches.length : 0;\n }\n return {\n divCount,\n ...this._webSettings,\n };\n }\n\n /**\n * Removes all w:divs from webSettings.xml.\n * Returns the number of divs that were removed.\n */\n stripWebDivs(): number {\n if (!this._originalWebSettingsXml) {\n return 0;\n }\n const matches = this._originalWebSettingsXml.match(/<w:div\\b/g);\n const count = matches ? matches.length : 0;\n if (count === 0) {\n return 0;\n }\n this._originalWebSettingsXml = this._originalWebSettingsXml.replace(\n /<w:divs>[\\s\\S]*?<\\/w:divs>/g,\n ''\n );\n this._webSettingsModified = true;\n return count;\n }\n\n /**\n * Resets webSettings to minimal defaults, removing all original content including w:divs.\n * Returns the number of divs that were present before sanitization.\n */\n sanitizeWebSettings(): number {\n let divCount = 0;\n if (this._originalWebSettingsXml) {\n const matches = this._originalWebSettingsXml.match(/<w:div\\b/g);\n divCount = matches ? matches.length : 0;\n }\n this._webSettings = {\n optimizeForBrowser: true,\n allowPNG: true,\n relyOnVML: false,\n doNotRelyOnCSS: false,\n doNotSaveAsSingleFile: false,\n doNotOrganizeInFolder: false,\n doNotUseLongFileNames: false,\n };\n this._originalWebSettingsXml = undefined;\n this._webSettingsModified = true;\n return divCount;\n }\n\n getOptimizeForBrowser(): boolean {\n return this._webSettings.optimizeForBrowser;\n }\n\n setOptimizeForBrowser(value: boolean): this {\n this._webSettings.optimizeForBrowser = value;\n this._webSettingsModified = true;\n // Also update original XML if present (for flag removal/addition)\n this._originalWebSettingsXml = undefined;\n return this;\n }\n\n getAllowPNG(): boolean {\n return this._webSettings.allowPNG;\n }\n\n setAllowPNG(value: boolean): this {\n this._webSettings.allowPNG = value;\n this._webSettingsModified = true;\n this._originalWebSettingsXml = undefined;\n return this;\n }\n\n /**\n * Updates the styles.xml file with current styles\n * Uses merge strategy to preserve unmodified styles from original document\n */\n private updateStylesXml(): void {\n if (this._originalStylesXml) {\n // Merge modified styles with original - preserves all unmodified styles\n const mergedXml = this.mergeStylesWithOriginal();\n this.zipHandler.updateFile(DOCX_PATHS.STYLES, mergedXml);\n } else {\n // New document - generate from scratch\n const xml = this.stylesManager.generateStylesXml();\n this.zipHandler.updateFile(DOCX_PATHS.STYLES, xml);\n }\n }\n\n /**\n * Merges modified styles with the original styles.xml\n *\n * This preserves all styles from the original document while only updating\n * styles that have been explicitly modified via addStyle().\n *\n * @returns Merged XML string with original styles + modified styles\n * @private\n */\n private mergeStylesWithOriginal(): string {\n if (!this._originalStylesXml) {\n return this.stylesManager.generateStylesXml();\n }\n\n const modifiedStyleIds = this.stylesManager.getModifiedStyleIds();\n\n // If nothing was modified, return original as-is\n if (modifiedStyleIds.size === 0) {\n return this._originalStylesXml;\n }\n\n // Get modified styles from StylesManager\n const modifiedStyles = new Map<string, Style>();\n for (const styleId of modifiedStyleIds) {\n const style = this.stylesManager.getStyle(styleId);\n if (style) {\n modifiedStyles.set(styleId, style);\n }\n }\n\n // Strategy: Use regex to replace style definitions in original XML\n // This preserves structure, whitespace, and any elements we don't parse\n let resultXml = this._originalStylesXml;\n\n for (const [styleId, style] of modifiedStyles) {\n // Generate the new style XML as a string\n const newStyleXml = XMLBuilder.elementToString(style.toXML());\n\n // Pattern to match existing style with this ID (handles various attribute orders)\n // Matches: <w:style w:type=\"...\" w:styleId=\"StyleId\">...</w:style>\n // or: <w:style w:styleId=\"StyleId\" w:type=\"...\">...</w:style>\n // Note: The regex escape includes `\"` because the escaped value is interpolated\n // inside a \"...\" pattern in the regex — protects against IDs containing quotes.\n // Search/replace methods omit `\"` since their patterns don't quote the value.\n const escapedStyleId = styleId.replace(/[.*+?^${}()|[\\]\\\\\"]/g, '\\\\$&');\n const stylePattern = new RegExp(\n `<w:style[^>]*\\\\sw:styleId=\"${escapedStyleId}\"[^>]*>[\\\\s\\\\S]*?</w:style>`\n );\n\n if (stylePattern.test(resultXml)) {\n // Replace existing style\n resultXml = resultXml.replace(stylePattern, newStyleXml);\n } else {\n // Style doesn't exist in original - append before </w:styles>\n resultXml = resultXml.replace('</w:styles>', `${newStyleXml}\\n</w:styles>`);\n }\n }\n\n return resultXml;\n }\n\n /**\n * Updates the numbering.xml file with current numbering definitions\n * Preserves original XML if numbering hasn't been modified (formatting preservation)\n */\n private updateNumberingXml(): void {\n if (this._originalNumberingXml && !this.numberingManager.isModified()) {\n // Unmodified — preserve original as-is\n this.zipHandler.updateFile(DOCX_PATHS.NUMBERING, this._originalNumberingXml);\n } else if (this._originalNumberingXml) {\n // Modified — merge changes into original XML to preserve namespaces/attributes\n const mergedXml = this.mergeNumberingWithOriginal();\n this.zipHandler.updateFile(DOCX_PATHS.NUMBERING, mergedXml);\n // Clean up numbering.xml.rels if numPicBullets were removed\n this.cleanupNumberingRels(mergedXml);\n } else {\n // New document — generate from scratch\n const xml = this.numberingManager.generateNumberingXml();\n this.zipHandler.updateFile(DOCX_PATHS.NUMBERING, xml);\n }\n }\n\n /**\n * Cleans up `word/_rels/numbering.xml.rels` by removing relationship entries\n * that are no longer referenced in the merged numbering.xml.\n *\n * numPicBullet elements contain `<a:blip r:embed=\"rIdX\"/>` references to images.\n * When numPicBullets are removed, their image relationships become orphaned.\n * This method removes those orphaned entries from the rels file.\n *\n * Note: The media files themselves (word/media/imageX.png) are NOT removed because\n * they may still be referenced by document.xml.rels for inline display.\n *\n * @param mergedXml The final numbering XML after all modifications\n * @private\n */\n private cleanupNumberingRels(mergedXml: string): void {\n const relsXml = this.zipHandler.getFileAsString(DOCX_PATHS.NUMBERING_RELS);\n if (!relsXml) return;\n\n // Collect all rId references still present in the merged numbering.xml\n const usedRIds = new Set<string>();\n const rIdPattern = /r:(?:embed|link|id)=\"(rId\\d+)\"/g;\n let match: RegExpExecArray | null;\n while ((match = rIdPattern.exec(mergedXml)) !== null) {\n if (match[1]) usedRIds.add(match[1]);\n }\n\n // Remove Relationship entries from the rels file if their Id is not referenced\n let cleanedRels = relsXml;\n const relPattern = /<Relationship\\s+[^>]*Id=\"(rId\\d+)\"[^>]*\\/>/g;\n const entriesToRemove: string[] = [];\n while ((match = relPattern.exec(relsXml)) !== null) {\n const relId = match[1];\n if (relId && !usedRIds.has(relId)) {\n entriesToRemove.push(match[0]);\n }\n }\n\n for (const entry of entriesToRemove) {\n cleanedRels = cleanedRels.replace(\n new RegExp(`\\\\s*${entry.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}`),\n ''\n );\n }\n\n if (entriesToRemove.length > 0) {\n // Check if all relationships were removed — if so, remove the rels file entirely\n if (!/<Relationship\\s/.test(cleanedRels)) {\n this.zipHandler.removeFile(DOCX_PATHS.NUMBERING_RELS);\n } else {\n this.zipHandler.updateFile(DOCX_PATHS.NUMBERING_RELS, cleanedRels);\n }\n this.logger.info(`Removed ${entriesToRemove.length} orphaned numbering relationship(s)`);\n }\n }\n\n /**\n * Merges modified numbering definitions with the original numbering.xml\n *\n * This preserves the original root element (namespaces, mc:Ignorable) and all\n * unmodified definitions while only updating definitions that have been explicitly\n * modified via addAbstractNumbering() or addInstance().\n *\n * @returns Merged XML string with original structure + modified definitions\n * @private\n */\n private mergeNumberingWithOriginal(): string {\n if (!this._originalNumberingXml) {\n return this.numberingManager.generateNumberingXml();\n }\n\n const modifiedAbstractNumIds = this.numberingManager.getModifiedAbstractNumIds();\n const modifiedNumIds = this.numberingManager.getModifiedNumIds();\n const removedAbstractNumIds = this.numberingManager.getRemovedAbstractNumIds();\n const removedNumIds = this.numberingManager.getRemovedNumIds();\n\n // If nothing was modified or removed, return original as-is\n if (\n modifiedAbstractNumIds.size === 0 &&\n modifiedNumIds.size === 0 &&\n removedAbstractNumIds.size === 0 &&\n removedNumIds.size === 0\n ) {\n return this._originalNumberingXml;\n }\n\n let resultXml = this._originalNumberingXml;\n\n // Replace or append modified abstractNum definitions\n for (const abstractNumId of modifiedAbstractNumIds) {\n const abstractNum = this.numberingManager.getAbstractNumbering(abstractNumId);\n if (!abstractNum) continue;\n\n const newXml = XMLBuilder.elementToString(abstractNum.toXML());\n\n // Pattern to match existing abstractNum with this ID (handles any attribute order)\n const escapedId = String(abstractNumId).replace(/[.*+?^${}()|[\\]\\\\\"]/g, '\\\\$&');\n const pattern = new RegExp(\n `<w:abstractNum[^>]*\\\\sw:abstractNumId=\"${escapedId}\"[^>]*>[\\\\s\\\\S]*?</w:abstractNum>`\n );\n\n if (pattern.test(resultXml)) {\n // Replace existing definition\n resultXml = resultXml.replace(pattern, newXml);\n } else {\n // New definition — insert before the first <w:num> or before </w:numbering>\n const numPos = resultXml.indexOf('<w:num ');\n if (numPos !== -1) {\n resultXml = resultXml.slice(0, numPos) + newXml + '\\n' + resultXml.slice(numPos);\n } else {\n resultXml = this.insertBeforeNumberingEnd(resultXml, newXml);\n }\n }\n }\n\n // Replace or append modified num instances\n for (const numId of modifiedNumIds) {\n const instance = this.numberingManager.getInstance(numId);\n if (!instance) continue;\n\n const newXml = XMLBuilder.elementToString(instance.toXML());\n\n // Pattern to match existing num with this ID (handles any attribute order)\n const escapedNumId = String(numId).replace(/[.*+?^${}()|[\\]\\\\\"]/g, '\\\\$&');\n const pattern = new RegExp(\n `<w:num\\\\b[^>]*\\\\sw:numId=\"${escapedNumId}\"[^>]*>[\\\\s\\\\S]*?</w:num>`\n );\n\n if (pattern.test(resultXml)) {\n // Replace existing instance\n resultXml = resultXml.replace(pattern, newXml);\n } else {\n // New instance — insert before numIdMacAtCleanup or </w:numbering>\n resultXml = this.insertBeforeNumberingEnd(resultXml, newXml);\n }\n }\n\n // Remove deleted abstractNum definitions\n for (const abstractNumId of removedAbstractNumIds) {\n const escapedId = String(abstractNumId).replace(/[.*+?^${}()|[\\]\\\\\"]/g, '\\\\$&');\n const pattern = new RegExp(\n `\\\\s*<w:abstractNum[^>]*\\\\sw:abstractNumId=\"${escapedId}\"[^>]*>[\\\\s\\\\S]*?</w:abstractNum>`\n );\n resultXml = resultXml.replace(pattern, '');\n }\n\n // Remove deleted num instances\n for (const numId of removedNumIds) {\n const escapedNumId = String(numId).replace(/[.*+?^${}()|[\\]\\\\\"]/g, '\\\\$&');\n const pattern = new RegExp(\n `\\\\s*<w:num\\\\b[^>]*\\\\sw:numId=\"${escapedNumId}\"[^>]*>[\\\\s\\\\S]*?</w:num>`\n );\n resultXml = resultXml.replace(pattern, '');\n }\n\n // Remove orphaned numPicBullet definitions (Step 1.3 of numbering bloat fix)\n // numPicBullets are only referenced via <w:numPicBulletId w:val=\"X\"/> inside abstractNums.\n // After removing abstractNums, check if any remaining abstractNum still references each picBullet.\n resultXml = this.removeOrphanedNumPicBullets(resultXml);\n\n return resultXml;\n }\n\n /**\n * Removes `<w:numPicBullet>` definitions whose numPicBulletId is not referenced\n * by any remaining `<w:abstractNum>` in the numbering XML.\n *\n * numPicBullets define picture-based bullet characters. They are referenced by\n * `<w:lvlPicBulletId w:val=\"X\"/>` elements inside abstractNum levels. When all\n * abstractNums that reference a picBullet have been removed, the picBullet itself\n * becomes dead weight.\n *\n * @param xml The numbering XML string\n * @returns The XML with orphaned numPicBullets removed\n * @private\n */\n private removeOrphanedNumPicBullets(xml: string): string {\n // Find all numPicBullet IDs defined in the XML\n const picBulletPattern = /<w:numPicBullet\\s+w:numPicBulletId=\"(\\d+)\"[^>]*>/g;\n const definedPicBulletIds: number[] = [];\n let match: RegExpExecArray | null;\n while ((match = picBulletPattern.exec(xml)) !== null) {\n if (match[1]) definedPicBulletIds.push(parseInt(match[1], 10));\n }\n\n if (definedPicBulletIds.length === 0) return xml;\n\n // Find all referenced picBullet IDs (via lvlPicBulletId inside abstractNums)\n const refPattern = /<w:lvlPicBulletId\\s+w:val=\"(\\d+)\"/g;\n const referencedIds = new Set<number>();\n while ((match = refPattern.exec(xml)) !== null) {\n if (match[1]) referencedIds.add(parseInt(match[1], 10));\n }\n\n // Remove unreferenced numPicBullet definitions\n let resultXml = xml;\n for (const id of definedPicBulletIds) {\n if (!referencedIds.has(id)) {\n const removePattern = new RegExp(\n `\\\\s*<w:numPicBullet\\\\s+w:numPicBulletId=\"${id}\"[^>]*>[\\\\s\\\\S]*?</w:numPicBullet>`\n );\n resultXml = resultXml.replace(removePattern, '');\n this._removedNumPicBulletIds.add(id);\n }\n }\n\n return resultXml;\n }\n\n /**\n * Inserts content before `<w:numIdMacAtCleanup>` if present, otherwise before `</w:numbering>`.\n * Per ECMA-376 CT_Numbering, the order is: abstractNum* → num* → numIdMacAtCleanup?\n */\n private insertBeforeNumberingEnd(xml: string, content: string): string {\n const macPos = xml.indexOf('<w:numIdMacAtCleanup');\n if (macPos !== -1) {\n return xml.slice(0, macPos) + content + '\\n' + xml.slice(macPos);\n }\n return xml.replace('</w:numbering>', `${content}\\n</w:numbering>`);\n }\n\n /**\n * Updates the settings.xml file with current in-memory state.\n *\n * For loaded documents: merges programmatic changes (track changes, protection, RSIDs)\n * into the preserved original XML to maintain round-trip fidelity.\n * For new documents: generates settings.xml from scratch.\n *\n * This method is called during save() and toBuffer() to ensure settings.xml\n * reflects any changes made via enableTrackChanges(), protectDocument(), etc.\n */\n private updateSettingsXml(): void {\n const xml = this.mergeSettingsWithOriginal();\n this.zipHandler.updateFile(DOCX_PATHS.SETTINGS, xml);\n }\n\n /**\n * Merges framework-managed settings into the preserved original settings.xml.\n *\n * If no original settings.xml exists (new document), generates from scratch.\n * If settings were not modified, returns original as-is for perfect round-trip.\n * If settings were modified, applies only changed settings into the original XML\n * using schema-aware insertion points per CT_Settings (ECMA-376).\n *\n * @returns The merged settings.xml content\n * @private\n */\n private mergeSettingsWithOriginal(): string {\n if (!this._originalSettingsXml) {\n // New document — generate base from scratch, then apply any modified settings\n let xml = this.generator.generateSettings({\n trackChangesEnabled: this.trackChangesEnabled,\n trackFormatting: this.trackFormatting,\n revisionView: this.revisionViewSettings,\n rsidRoot: this.rsidRoot,\n rsids: this.getRsids(),\n documentProtection: this.documentProtection,\n });\n // Apply settings merges to the generated XML for new documents\n if (this._settingsModified) {\n xml = this.mergeViewIntoSettings(xml);\n xml = this.mergeTrackChangesIntoSettings(xml);\n xml = this.mergeBooleanSettingsIntoSettings(xml);\n }\n return xml;\n }\n\n // If nothing was modified, return original as-is for perfect round-trip\n if (!this._settingsModified) {\n return this._originalSettingsXml;\n }\n\n // Start from original XML and selectively merge changed settings\n let xml = this._originalSettingsXml;\n xml = this.mergeViewIntoSettings(xml);\n xml = this.mergeTrackChangesIntoSettings(xml);\n xml = this.mergeProtectionIntoSettings(xml);\n xml = this.mergeRsidsIntoSettings(xml);\n xml = this.mergeBooleanSettingsIntoSettings(xml);\n\n return xml;\n }\n\n /**\n * Merges the document view (w:view) into settings.xml.\n *\n * Per CT_Settings schema: w:view is element #1 — must be the first child\n * of w:settings. Only modifies if setDocumentView() was called.\n *\n * @private\n */\n private mergeViewIntoSettings(xml: string): string {\n if (this._documentView === undefined) {\n return xml;\n }\n\n // Remove any existing w:view element\n xml = xml.replace(/<w:view\\b[^>]*\\/?>\\s*/g, '');\n\n // Insert as first child of w:settings (element #1 per CT_Settings)\n const viewXml = `<w:view w:val=\"${XMLBuilder.escapeXmlAttribute(this._documentView)}\"/>`;\n xml = xml.replace(/(<w:settings\\b[^>]*>)/, `$1\\n ${viewXml}`);\n\n return xml;\n }\n\n /**\n * Merges track changes settings (w:trackRevisions, w:doNotTrackFormatting,\n * w:trackFormatting, w:revisionView) into settings.xml.\n *\n * Per CT_Settings schema order:\n * #31 w:revisionView, #32 w:trackRevisions,\n * #33 w:doNotTrackMoves, #34 w:doNotTrackFormatting\n *\n * @private\n */\n private mergeTrackChangesIntoSettings(xml: string): string {\n // Remove existing track changes elements (will re-insert if needed)\n xml = xml.replace(/<w:trackRevisions\\b[^>]*\\/>/g, '');\n xml = xml.replace(/<w:trackRevisions\\b[^>]*>[\\s\\S]*?<\\/w:trackRevisions>/g, '');\n xml = xml.replace(/<w:doNotTrackMoves\\b[^>]*\\/>/g, '');\n xml = xml.replace(/<w:doNotTrackMoves\\b[^>]*>[\\s\\S]*?<\\/w:doNotTrackMoves>/g, '');\n xml = xml.replace(/<w:doNotTrackFormatting\\b[^>]*\\/>/g, '');\n xml = xml.replace(/<w:doNotTrackFormatting\\b[^>]*>[\\s\\S]*?<\\/w:doNotTrackFormatting>/g, '');\n xml = xml.replace(/<w:trackFormatting\\b[^>]*\\/>/g, '');\n xml = xml.replace(/<w:trackFormatting\\b[^>]*>[\\s\\S]*?<\\/w:trackFormatting>/g, '');\n xml = xml.replace(/<w:revisionView\\b[^>]*\\/>/g, '');\n xml = xml.replace(/<w:revisionView\\b[^>]*>[\\s\\S]*?<\\/w:revisionView>/g, '');\n\n // Build the new track changes block\n let trackBlock = '';\n\n // w:revisionView (#31 in CT_Settings)\n const view = this.revisionViewSettings;\n // Only emit revisionView if it differs from defaults (all true)\n if (!view.showInsertionsAndDeletions || !view.showFormatting || !view.showInkAnnotations) {\n trackBlock += `\\n <w:revisionView w:insDel=\"${view.showInsertionsAndDeletions ? '1' : '0'}\" w:formatting=\"${view.showFormatting ? '1' : '0'}\" w:inkAnnotations=\"${view.showInkAnnotations ? '1' : '0'}\"/>`;\n }\n\n // w:trackRevisions (#32)\n if (this.trackChangesEnabled) {\n trackBlock += '\\n <w:trackRevisions/>';\n }\n\n // w:doNotTrackMoves (#33) — only if explicitly set\n if (this._doNotTrackMoves) {\n trackBlock += '\\n <w:doNotTrackMoves/>';\n }\n\n // w:doNotTrackFormatting (#34) — only if explicitly disabled\n if (!this.trackFormatting) {\n trackBlock += '\\n <w:doNotTrackFormatting/>';\n }\n\n // Insert before w:documentProtection (#35) if it exists,\n // else before w:autoFormatOverride (#36), else before w:defaultTabStop (#39)\n if (trackBlock) {\n if (/<w:documentProtection\\b/.test(xml)) {\n xml = xml.replace(/<w:documentProtection\\b/, trackBlock + '\\n <w:documentProtection');\n } else if (/<w:autoFormatOverride\\b/.test(xml)) {\n xml = xml.replace(/<w:autoFormatOverride\\b/, trackBlock + '\\n <w:autoFormatOverride');\n } else if (/<w:defaultTabStop\\b/.test(xml)) {\n xml = xml.replace(/<w:defaultTabStop\\b/, trackBlock + '\\n <w:defaultTabStop');\n } else {\n // Fallback: insert before </w:settings>\n xml = xml.replace(/<\\/w:settings>/, trackBlock + '\\n</w:settings>');\n }\n }\n\n return xml;\n }\n\n /**\n * Merges document protection settings into settings.xml.\n *\n * Per CT_Settings schema: w:documentProtection is element #35\n * (after w:doNotTrackFormatting #34, before w:autoFormatOverride #36)\n *\n * @private\n */\n private mergeProtectionIntoSettings(xml: string): string {\n // Remove existing protection element\n xml = xml.replace(/<w:documentProtection\\b[^>]*\\/>/g, '');\n xml = xml.replace(/<w:documentProtection\\b[^>]*>[\\s\\S]*?<\\/w:documentProtection>/g, '');\n\n if (!this.documentProtection) {\n return xml;\n }\n\n // Build protection element (escape all attribute values to prevent XML injection)\n const prot = this.documentProtection;\n const esc = XMLBuilder.escapeXmlAttribute;\n let protXml = `\\n <w:documentProtection w:edit=\"${esc(prot.edit)}\" w:enforcement=\"${prot.enforcement ? '1' : '0'}\"`;\n if (prot.cryptProviderType) protXml += ` w:cryptProviderType=\"${esc(prot.cryptProviderType)}\"`;\n if (prot.cryptAlgorithmClass)\n protXml += ` w:cryptAlgorithmClass=\"${esc(prot.cryptAlgorithmClass)}\"`;\n if (prot.cryptAlgorithmType)\n protXml += ` w:cryptAlgorithmType=\"${esc(prot.cryptAlgorithmType)}\"`;\n if (prot.cryptAlgorithmSid)\n protXml += ` w:cryptAlgorithmSid=\"${esc(String(prot.cryptAlgorithmSid))}\"`;\n if (prot.cryptSpinCount) protXml += ` w:cryptSpinCount=\"${esc(String(prot.cryptSpinCount))}\"`;\n if (prot.hash) protXml += ` w:hash=\"${esc(prot.hash)}\"`;\n if (prot.salt) protXml += ` w:salt=\"${esc(prot.salt)}\"`;\n protXml += '/>';\n\n // Insert before w:autoFormatOverride (#36) if exists,\n // else before w:defaultTabStop (#39), else before </w:settings>\n if (/<w:autoFormatOverride\\b/.test(xml)) {\n xml = xml.replace(/<w:autoFormatOverride\\b/, protXml + '\\n <w:autoFormatOverride');\n } else if (/<w:defaultTabStop\\b/.test(xml)) {\n xml = xml.replace(/<w:defaultTabStop\\b/, protXml + '\\n <w:defaultTabStop');\n } else {\n xml = xml.replace(/<\\/w:settings>/, protXml + '\\n</w:settings>');\n }\n\n return xml;\n }\n\n /**\n * Merges RSIDs into settings.xml.\n *\n * Per CT_Settings schema: w:rsids is element #83\n * (after w:compat #81 / w:docVars #82, before m:mathPr #84)\n *\n * @private\n */\n private mergeRsidsIntoSettings(xml: string): string {\n // Remove existing rsids block\n xml = xml.replace(/<w:rsids>[\\s\\S]*?<\\/w:rsids>/g, '');\n\n if (this.rsids.size === 0) {\n return xml;\n }\n\n // Build RSIDs block (escape all attribute values)\n const esc = XMLBuilder.escapeXmlAttribute;\n let rsidsXml = '\\n <w:rsids>';\n if (this.rsidRoot) {\n rsidsXml += `\\n <w:rsidRoot w:val=\"${esc(this.rsidRoot)}\"/>`;\n }\n for (const rsid of this.rsids) {\n rsidsXml += `\\n <w:rsid w:val=\"${esc(rsid)}\"/>`;\n }\n rsidsXml += '\\n </w:rsids>';\n\n // Insert after w:compat or w:docVars (#81/#82), before m:mathPr (#84)\n if (xml.includes('</w:compat>')) {\n xml = xml.replace(/<\\/w:compat>/, '</w:compat>' + rsidsXml);\n } else if (/<m:mathPr\\b/.test(xml)) {\n xml = xml.replace(/<m:mathPr\\b/, rsidsXml + '\\n <m:mathPr');\n } else if (/<w:themeFontLang\\b/.test(xml)) {\n xml = xml.replace(/<w:themeFontLang\\b/, rsidsXml + '\\n <w:themeFontLang');\n } else {\n xml = xml.replace(/<\\/w:settings>/, rsidsXml + '\\n</w:settings>');\n }\n\n return xml;\n }\n\n /**\n * Merges boolean settings into the settings.xml preserving CT_Settings schema order.\n *\n * CT_Settings element order (relevant managed elements):\n * #11 embedTrueTypeFonts, #13 saveSubsetFonts, #15 mirrorMargins,\n * #20 hideSpellingErrors, #21 hideGrammaticalErrors,\n * #39 defaultTabStop, #40 autoHyphenation,\n * #48 evenAndOddHeaders, #61 characterSpacingControl,\n * #77 updateFields\n *\n * Strategy: Remove all managed elements, then re-insert a correctly ordered block\n * before the defaultTabStop anchor. This avoids ordering issues from incremental insertion.\n *\n * Only removes elements when explicitly set to false (not when undefined/unset).\n * @private\n */\n private mergeBooleanSettingsIntoSettings(xml: string): string {\n // =========================================================================\n // BEFORE defaultTabStop (#39) — remove-and-rebuild approach\n // Only removes elements that were EXPLICITLY set by the user.\n // Unset (undefined) elements are left in their original position.\n //\n // CT_Settings order: #11 embedTrueTypeFonts, #13 saveSubsetFonts,\n // #15 mirrorMargins, #20 hideSpellingErrors, #21 hideGrammaticalErrors\n // =========================================================================\n\n // Collect explicitly-set elements to add (in schema order)\n const preElements: string[] = [];\n const mod = this._modifiedBooleanSettings;\n\n // Only remove and process elements that were explicitly set via setters\n if (mod.has('embedTrueTypeFonts')) {\n xml = xml.replace(/<w:embedTrueTypeFonts\\b[^>]*\\/?>\\s*/g, '');\n if (this._embedTrueTypeFonts) preElements.push('<w:embedTrueTypeFonts/>');\n }\n if (mod.has('saveSubsetFonts')) {\n xml = xml.replace(/<w:saveSubsetFonts\\b[^>]*\\/?>\\s*/g, '');\n if (this._saveSubsetFonts) preElements.push('<w:saveSubsetFonts/>');\n }\n if (mod.has('mirrorMargins')) {\n xml = xml.replace(/<w:mirrorMargins\\b[^>]*\\/?>\\s*/g, '');\n if (this._mirrorMargins) preElements.push('<w:mirrorMargins/>');\n }\n if (mod.has('hideSpellingErrors')) {\n xml = xml.replace(/<w:hideSpellingErrors\\b[^>]*\\/?>\\s*/g, '');\n if (this._hideSpellingErrors) preElements.push('<w:hideSpellingErrors/>');\n }\n if (mod.has('hideGrammaticalErrors')) {\n xml = xml.replace(/<w:hideGrammaticalErrors\\b[^>]*\\/?>\\s*/g, '');\n if (this._hideGrammaticalErrors) preElements.push('<w:hideGrammaticalErrors/>');\n }\n\n // Insert the block before defaultTabStop (schema order preserved since array is ordered)\n if (preElements.length > 0) {\n const preBlock = preElements.map((e) => '\\n ' + e).join('');\n if (/<w:defaultTabStop\\b/.test(xml)) {\n xml = xml.replace(/<w:defaultTabStop\\b/, preBlock + '\\n <w:defaultTabStop');\n } else {\n xml = xml.replace(/<\\/w:settings>/, preBlock + '\\n</w:settings>');\n }\n }\n\n // =========================================================================\n // defaultTabStop (#39) — value attribute, not just boolean\n // =========================================================================\n if (mod.has('defaultTabStop') && this._defaultTabStop !== undefined) {\n const hasDTS = /<w:defaultTabStop\\b[^>]*\\/?>/.test(xml);\n if (hasDTS) {\n xml = xml.replace(\n /<w:defaultTabStop\\b[^>]*\\/?>/,\n `<w:defaultTabStop w:val=\"${this._defaultTabStop}\"/>`\n );\n } else {\n xml = xml.replace(\n /<\\/w:settings>/,\n ` <w:defaultTabStop w:val=\"${this._defaultTabStop}\"/>\\n</w:settings>`\n );\n }\n }\n\n // =========================================================================\n // AFTER defaultTabStop (#39) — only process explicitly set elements\n // #40 autoHyphenation, #48 evenAndOddHeaders\n // =========================================================================\n\n const postElements: string[] = [];\n\n if (mod.has('autoHyphenation')) {\n xml = xml.replace(/<w:autoHyphenation\\b[^>]*\\/?>\\s*/g, '');\n if (this._autoHyphenation) postElements.push('<w:autoHyphenation/>');\n }\n if (mod.has('evenAndOddHeaders')) {\n xml = xml.replace(/<w:evenAndOddHeaders\\b[^>]*\\/?>\\s*/g, '');\n if (this._evenAndOddHeaders) postElements.push('<w:evenAndOddHeaders/>');\n }\n\n if (postElements.length > 0) {\n const postBlock = postElements.map((e) => '\\n ' + e).join('');\n if (/<w:characterSpacingControl\\b/.test(xml)) {\n xml = xml.replace(\n /<w:characterSpacingControl\\b/,\n postBlock + '\\n <w:characterSpacingControl'\n );\n } else {\n xml = xml.replace(/<\\/w:settings>/, postBlock + '\\n</w:settings>');\n }\n }\n\n // =========================================================================\n // #77: updateFields (near end of CT_Settings) — only if explicitly set via setter\n // =========================================================================\n if (mod.has('updateFields')) {\n xml = xml.replace(/<w:updateFields\\b[^>]*\\/?>\\s*/g, '');\n if (this._updateFields) {\n if (/<w:compat\\b/.test(xml)) {\n xml = xml.replace(/<w:compat\\b/, '<w:updateFields w:val=\"true\"/>\\n <w:compat');\n } else {\n xml = xml.replace(/<\\/w:settings>/, ' <w:updateFields w:val=\"true\"/>\\n</w:settings>');\n }\n }\n }\n\n return xml;\n }\n\n /**\n * Gets the StylesManager for advanced style operations\n *\n * Provides direct access to the StylesManager for advanced scenarios\n * like bulk style operations, custom style creation, or style analysis.\n *\n * @returns The StylesManager instance managing this document's styles\n *\n * @example\n * ```typescript\n * const stylesManager = doc.getStylesManager();\n * const allStyles = stylesManager.getAllStyles();\n * console.log(`Document has ${allStyles.length} styles`);\n * ```\n */\n getStylesManager(): StylesManager {\n return this.stylesManager;\n }\n\n /**\n * Convenience shortcut for {@link getStylesManager}\n *\n * Provides quick access to the StylesManager for style operations.\n * This is a shorter alternative to calling getStylesManager().\n *\n * @returns The StylesManager instance managing this document's styles\n *\n * @example\n * ```typescript\n * // Quick access to styles manager\n * const styles = doc.styles();\n * styles.addStyle(customStyle);\n * ```\n */\n styles(): StylesManager {\n return this.stylesManager;\n }\n\n /**\n * Resolves the effective shading for a table cell through the ECMA-376 style hierarchy.\n *\n * Resolution order (highest priority first):\n * 1. Direct cell shading\n * 2. Row table property exceptions\n * 3. Conditional table style (tblStylePr) based on cnfStyle\n * 4. Table style default cell shading\n * 5. Direct table shading\n *\n * @param table - The table containing the cell\n * @param row - Row index (0-based)\n * @param col - Column index (0-based)\n * @returns The resolved ShadingConfig, or undefined if no shading applies\n */\n getComputedCellShading(\n table: Table,\n row: number,\n col: number\n ): import('../elements/CommonTypes').ShadingConfig | undefined {\n const tableRow = table.getRow(row);\n if (!tableRow) return undefined;\n const cell = tableRow.getCell(col);\n if (!cell) return undefined;\n return resolveCellShading(cell, table, this.stylesManager);\n }\n\n /**\n * Adds or updates a style definition in the document\n *\n * Registers a style definition that can be applied to paragraphs and tables.\n * If a style with the same ID already exists, it is replaced.\n * The styles.xml file is updated immediately.\n *\n * @param style - The Style instance to add or update\n * @returns This document instance for method chaining\n *\n * @example\n * ```typescript\n * const customStyle = Style.create({\n * styleId: 'MyCustomStyle',\n * name: 'My Custom Style',\n * type: 'paragraph',\n * runFormatting: { font: 'Arial', size: 14, bold: true },\n * paragraphFormatting: { alignment: 'center' }\n * });\n * doc.addStyle(customStyle);\n *\n * // Apply to paragraphs\n * doc.createParagraph('Styled text').setStyle('MyCustomStyle');\n * ```\n */\n addStyle(style: Style): this {\n this.stylesManager.addStyle(style);\n // Update styles XML immediately so it's reflected in getStylesXml()\n this.updateStylesXml();\n return this;\n }\n\n /**\n * Retrieves a style definition by its ID\n *\n * @param styleId - The unique style identifier (e.g., 'Heading1', 'Normal', 'CustomStyle')\n * @returns The Style instance if found, undefined otherwise\n *\n * @example\n * ```typescript\n * const heading1 = doc.getStyle('Heading1');\n * if (heading1) {\n * console.log(`Font: ${heading1.getRunFormatting().font}`);\n * }\n * ```\n */\n getStyle(styleId: string): Style | undefined {\n return this.stylesManager.getStyle(styleId);\n }\n\n /**\n * Checks if a style definition exists in the document\n *\n * @param styleId - The style identifier to check\n * @returns True if the style is defined, false otherwise\n *\n * @example\n * ```typescript\n * if (!doc.hasStyle('CustomHeader')) {\n * doc.addStyle(Style.create({\n * styleId: 'CustomHeader',\n * name: 'Custom Header',\n * type: 'paragraph'\n * }));\n * }\n * ```\n */\n hasStyle(styleId: string): boolean {\n return this.stylesManager.hasStyle(styleId);\n }\n\n /**\n * Gets all style definitions in the document\n *\n * Returns all registered styles including built-in Word styles\n * (Normal, Heading1-9, etc.) and custom styles.\n *\n * @returns Array of all Style instances in the document\n *\n * @example\n * ```typescript\n * const styles = doc.getStyles();\n * for (const style of styles) {\n * console.log(`${style.getStyleId()}: ${style.getName()}`);\n * }\n * ```\n */\n getStyles(): Style[] {\n return this.stylesManager.getAllStyles();\n }\n\n /**\n * Removes a style from the document\n * @param styleId - Style ID to remove\n * @returns True if the style was removed, false if not found\n */\n removeStyle(styleId: string): boolean {\n return this.stylesManager.removeStyle(styleId);\n }\n\n /**\n * Updates an existing style with new properties\n * @param styleId - Style ID to update\n * @param properties - Properties to update\n * @returns True if the style was updated, false if not found\n */\n updateStyle(styleId: string, properties: Partial<StyleProperties>): boolean {\n const style = this.stylesManager.getStyle(styleId);\n if (!style) {\n return false;\n }\n\n // Update the style properties\n const currentProps = style.getProperties();\n\n // Deep merge nested properties (paragraphFormatting, runFormatting)\n const updatedProps: StyleProperties = {\n ...currentProps,\n ...properties,\n styleId, // Preserve styleId\n // Deep merge paragraph formatting\n paragraphFormatting: properties.paragraphFormatting\n ? {\n ...currentProps.paragraphFormatting,\n ...properties.paragraphFormatting,\n // Deep merge nested spacing and indentation\n spacing: properties.paragraphFormatting.spacing\n ? {\n ...currentProps.paragraphFormatting?.spacing,\n ...properties.paragraphFormatting.spacing,\n }\n : currentProps.paragraphFormatting?.spacing,\n indentation: properties.paragraphFormatting.indentation\n ? {\n ...currentProps.paragraphFormatting?.indentation,\n ...properties.paragraphFormatting.indentation,\n }\n : currentProps.paragraphFormatting?.indentation,\n }\n : currentProps.paragraphFormatting,\n // Deep merge run formatting\n runFormatting: properties.runFormatting\n ? { ...currentProps.runFormatting, ...properties.runFormatting }\n : currentProps.runFormatting,\n };\n\n // Create new style with updated properties\n const updatedStyle = Style.create(updatedProps);\n\n // Replace in manager\n this.stylesManager.addStyle(updatedStyle);\n return true;\n }\n\n /**\n * Applies a style to all elements matching a predicate\n * @param styleId - Style ID to apply\n * @param predicate - Function to test each element\n * @returns Number of elements updated\n * @example\n * ```typescript\n * // Apply Heading1 style to all paragraphs containing \"Chapter\"\n * const count = doc.applyStyleToAll('Heading1', (el) => {\n * return el instanceof Paragraph && el.getText().includes('Chapter');\n * });\n * console.log(`Updated ${count} elements`);\n * ```\n */\n applyStyleToAll(styleId: string, predicate: (element: BodyElement) => boolean): number {\n let count = 0;\n\n for (const element of this.bodyElements) {\n if (predicate(element)) {\n if (element instanceof Paragraph) {\n element.setStyle(styleId);\n count++;\n }\n }\n }\n\n // Also check paragraphs inside tables\n for (const table of this.getTables()) {\n for (const row of table.getRows()) {\n for (const cell of row.getCells()) {\n for (const para of cell.getParagraphs()) {\n if (predicate(para)) {\n para.setStyle(styleId);\n count++;\n }\n }\n }\n }\n }\n\n return count;\n }\n\n /**\n * Finds all elements using a specific style\n * @param styleId - Style ID to search for\n * @returns Array of paragraphs and table cells using this style\n * @example\n * ```typescript\n * const heading1Elements = doc.findElementsByStyle('Heading1');\n * console.log(`Found ${heading1Elements.length} Heading1 elements`);\n * ```\n */\n findElementsByStyle(styleId: string): (Paragraph | TableCell)[] {\n const results: (Paragraph | TableCell)[] = [];\n\n // Check body paragraphs\n for (const element of this.bodyElements) {\n if (element instanceof Paragraph) {\n const formatting = element.getFormatting();\n if (formatting.style === styleId) {\n results.push(element);\n }\n }\n }\n\n // Check paragraphs inside tables\n for (const table of this.getTables()) {\n for (const row of table.getRows()) {\n for (const cell of row.getCells()) {\n for (const para of cell.getParagraphs()) {\n const formatting = para.getFormatting();\n if (formatting.style === styleId) {\n results.push(para);\n }\n }\n\n // Include the cell itself if it has styled paragraphs\n const hasStyledParagraph = cell\n .getParagraphs()\n .some((p) => p.getFormatting().style === styleId);\n if (hasStyledParagraph) {\n results.push(cell);\n }\n }\n }\n }\n\n return results;\n }\n\n /**\n * Applies a new style to all paragraphs currently using a specific style\n * Useful for bulk style updates across the document\n * @param currentStyleId - The style ID currently applied to paragraphs\n * @param newStyleId - The style ID to apply\n * @returns Number of paragraphs updated\n * @example\n * ```typescript\n * // Change all Normal paragraphs to BodyText\n * const count = doc.applyStyleToAllParagraphsWithStyle('Normal', 'BodyText');\n * console.log(`Updated ${count} paragraphs`);\n * ```\n */\n applyStyleToAllParagraphsWithStyle(currentStyleId: string, newStyleId: string): number {\n let count = 0;\n\n // Check body paragraphs\n for (const element of this.bodyElements) {\n if (element instanceof Paragraph) {\n const formatting = element.getFormatting();\n if (formatting.style === currentStyleId) {\n element.setStyle(newStyleId);\n count++;\n }\n }\n }\n\n // Check paragraphs inside tables\n for (const table of this.getTables()) {\n for (const row of table.getRows()) {\n for (const cell of row.getCells()) {\n for (const para of cell.getParagraphs()) {\n const formatting = para.getFormatting();\n if (formatting.style === currentStyleId) {\n para.setStyle(newStyleId);\n count++;\n }\n }\n }\n }\n }\n\n return count;\n }\n\n /**\n * Applies a style to all paragraphs in the document with optional filtering and formatting control\n *\n * This method provides flexible bulk style application with the ability to:\n * - Apply style to all paragraphs or filter by current style\n * - Clear direct run formatting so the style takes full effect\n * - Clear only specific formatting properties\n *\n * @param styleId - The style ID to apply (e.g., 'Normal', 'Heading1')\n * @param options - Optional configuration\n * @param options.currentStyleId - Only apply to paragraphs with this style (undefined = all paragraphs)\n * @param options.clearFormatting - Whether to clear direct run formatting (default: false)\n * @param options.clearProperties - Specific properties to clear (default: all if clearFormatting=true)\n * @returns Number of paragraphs updated\n * @example\n * ```typescript\n * // Apply Normal to all paragraphs and clear all direct formatting\n * doc.applyStyleToAllParagraphs('Normal', { clearFormatting: true });\n *\n * // Apply Heading1 to all Normal paragraphs, clear only font and color\n * doc.applyStyleToAllParagraphs('Heading1', {\n * currentStyleId: 'Normal',\n * clearFormatting: true,\n * clearProperties: ['font', 'color']\n * });\n *\n * // Apply BodyText to all paragraphs without clearing formatting\n * doc.applyStyleToAllParagraphs('BodyText');\n * ```\n */\n applyStyleToAllParagraphs(\n styleId: string,\n options?: {\n currentStyleId?: string;\n clearFormatting?: boolean;\n clearProperties?: string[];\n }\n ): number {\n let count = 0;\n const clearFormatting = options?.clearFormatting || false;\n const clearProperties = options?.clearProperties;\n const currentStyleId = options?.currentStyleId;\n\n // Helper to apply style to a paragraph\n const applyToParagraph = (para: Paragraph): void => {\n const formatting = para.getFormatting();\n\n // Check if this paragraph matches the filter\n if (currentStyleId !== undefined && formatting.style !== currentStyleId) {\n return; // Skip this paragraph\n }\n\n // Apply style\n if (clearFormatting) {\n para.applyStyleAndClearFormatting(\n styleId,\n clearProperties === undefined ? [] : clearProperties\n );\n } else {\n para.setStyle(styleId);\n }\n\n count++;\n };\n\n // Process body paragraphs\n for (const element of this.bodyElements) {\n if (element instanceof Paragraph) {\n applyToParagraph(element);\n }\n }\n\n // Process paragraphs inside tables\n for (const table of this.getTables()) {\n for (const row of table.getRows()) {\n for (const cell of row.getCells()) {\n for (const para of cell.getParagraphs()) {\n applyToParagraph(para);\n }\n }\n }\n }\n\n return count;\n }\n\n /**\n * Updates the color of all hyperlinks in the document\n * @param color - Hex color without # (e.g., '0000FF' for blue)\n * @returns Number of hyperlinks updated\n * @example\n * ```typescript\n * // Make all hyperlinks blue\n * const count = doc.updateAllHyperlinkColors('0000FF');\n * console.log(`Updated ${count} hyperlinks`);\n * ```\n */\n updateAllHyperlinkColors(color: string): number {\n const hyperlinks = this.getHyperlinks();\n\n for (const { hyperlink } of hyperlinks) {\n const currentFormatting = hyperlink.getFormatting();\n hyperlink.setFormatting({\n ...currentFormatting,\n color: color,\n });\n }\n\n return hyperlinks.length;\n }\n\n /**\n * Sets layout for all tables in the document\n * @param layout - Layout type ('auto' for fit to window, 'fixed' for fixed width)\n * @returns Number of tables updated\n * @example\n * ```typescript\n * // Make all tables fit to window\n * const count = doc.setAllTablesLayout('auto');\n * console.log(`Updated ${count} tables`);\n * ```\n */\n setAllTablesLayout(layout: 'auto' | 'fixed'): number {\n const tables = this.getTables();\n\n for (const table of tables) {\n table.setLayout(layout);\n }\n\n return tables.length;\n }\n\n /**\n * Applies borders to all cells in all tables throughout the document\n * Useful for ensuring consistent border styling across all tables\n * @param border - Border definition to apply to all sides of every cell\n * @returns Number of tables updated\n * @example\n * ```typescript\n * // Add single black borders to all tables\n * const count = doc.applyBordersToAllTables({\n * style: 'single',\n * size: 8,\n * color: '000000'\n * });\n * console.log(`Applied borders to ${count} tables`);\n * ```\n */\n applyBordersToAllTables(border: TableBorder): number {\n const tables = this.getAllTables();\n\n for (const table of tables) {\n table.setAllBorders(border);\n }\n\n return tables.length;\n }\n\n /**\n * Applies different shading to tables based on their size\n * 1x1 tables get one color, multi-cell tables get another color on first row\n * @param singleCellShading - Hex color for 1x1 tables (e.g., 'BFBFBF')\n * @param multiCellFirstRowShading - Hex color for first row of multi-cell tables (e.g., 'DFDFDF')\n * @returns Object with counts of single-cell and multi-cell tables updated\n * @example\n * ```typescript\n * const result = doc.applyTableFormattingBySize('BFBFBF', 'DFDFDF');\n * console.log(`Updated ${result.singleCellCount} 1x1 tables and ${result.multiCellCount} multi-cell tables`);\n * ```\n */\n applyTableFormattingBySize(\n singleCellShading: string,\n multiCellFirstRowShading: string\n ): { singleCellCount: number; multiCellCount: number } {\n const tables = this.getTables();\n let singleCellCount = 0;\n let multiCellCount = 0;\n\n for (const table of tables) {\n const rowCount = table.getRowCount();\n const colCount = table.getColumnCount();\n\n if (rowCount === 1 && colCount === 1) {\n // 1x1 table - shade the single cell\n const cell = table.getCell(0, 0);\n if (cell) {\n cell.setShading({ fill: singleCellShading });\n singleCellCount++;\n }\n } else {\n // Multi-cell table - shade first row\n const firstRow = table.getRow(0);\n if (firstRow) {\n for (const cell of firstRow.getCells()) {\n cell.setShading({ fill: multiCellFirstRowShading });\n }\n multiCellCount++;\n }\n }\n }\n\n return { singleCellCount, multiCellCount };\n }\n\n /**\n * @deprecated This functionality has been moved to Template_UI's\n * WordDocumentProcessor.fixExistingTopHyperlinks() for consolidation.\n * This method will be removed in a future version.\n *\n * Fixes all \"Top of Document\" hyperlinks to use standard formatting and anchor\n *\n * Changes made to matching hyperlinks:\n * - Text: Any variation → \"Top of the Document\"\n * - Formatting: Verdana 12pt, underline, blue (0000FF)\n * - Paragraph: Right aligned\n * - Anchor: Points to \"_top\" bookmark at document start\n *\n * Creates \"_top\" bookmark at first paragraph if it doesn't exist\n *\n * @returns Number of hyperlinks updated\n * @example\n * ```typescript\n * const count = doc.fixTODHyperlinks();\n * console.log(`Fixed ${count} \"Top of Document\" links`);\n * ```\n */\n fixTODHyperlinks(): number {\n console.warn(\n 'DEPRECATION WARNING: fixTODHyperlinks() is deprecated. ' +\n 'Use Template_UI WordDocumentProcessor.fixExistingTopHyperlinks() instead.'\n );\n let count = 0;\n\n // Ensure _top bookmark exists at document start\n if (!this.hasBookmark('_top')) {\n const paragraphs = this.getAllParagraphs();\n if (paragraphs.length > 0) {\n const firstPara = paragraphs[0];\n if (firstPara) {\n const bookmark = new Bookmark({ name: '_top' });\n const registered = this.bookmarkManager.register(bookmark);\n firstPara.addBookmark(registered);\n }\n }\n }\n\n // Find and fix all \"Top of Document\" hyperlinks\n const hyperlinks = this.getHyperlinks();\n\n for (const { hyperlink, paragraph } of hyperlinks) {\n const text = hyperlink.getText().toLowerCase();\n\n // Match variations: \"top of document\", \"top of the document\", etc.\n if (text.includes('top') && text.includes('document')) {\n // Update text\n hyperlink.setText('Top of the Document');\n\n // Update formatting\n hyperlink.setFormatting({\n font: 'Verdana',\n size: 12,\n underline: 'single',\n color: '0000FF',\n });\n\n // Update anchor to _top\n hyperlink.setAnchor('_top');\n\n // Set paragraph alignment to right\n paragraph.setAlignment('right');\n\n count++;\n }\n }\n\n return count;\n }\n\n /**\n * Sets width to 5% for first column of tables containing \"If\"\n *\n * For tables with 2+ columns where first column text contains \"If\",\n * sets the first column width to 5% of table width.\n *\n * Common use case: If/Then decision tables\n *\n * @returns Number of table cells updated\n * @example\n * ```typescript\n * const count = doc.setIfColumnWidth();\n * console.log(`Updated ${count} If column cells`);\n * ```\n */\n setIfColumnWidth(): number {\n let count = 0;\n const tables = this.getTables();\n\n for (const table of tables) {\n const columnCount = table.getColumnCount();\n\n // Only process tables with at least 2 columns\n if (columnCount < 2) continue;\n\n // Check all rows for \"If\" in first column\n let hasIfColumn = false;\n const rows = table.getRows();\n\n for (const row of rows) {\n const cells = row.getCells();\n const firstCell = cells[0];\n if (firstCell) {\n const text = firstCell.getText().toLowerCase();\n if (text.includes('if')) {\n hasIfColumn = true;\n break;\n }\n }\n }\n\n // If \"If\" found, set width on all first column cells\n if (hasIfColumn) {\n const tableWidth = table.getFormatting().width || 12960; // Default page width in twips\n const targetWidth = Math.round(tableWidth * 0.05); // 5%\n\n for (const row of rows) {\n const cells = row.getCells();\n const firstCell = cells[0];\n if (firstCell) {\n firstCell.setWidth(targetWidth);\n count++;\n }\n }\n }\n }\n\n return count;\n }\n\n /**\n * Applies comprehensive formatting to all tables in the document\n *\n * This helper function provides a one-call solution for standardizing table formatting:\n * - Apply black borders to all cells (always applied to all tables)\n * - Set table width to autofit to window (always applied to all tables)\n * - Format first row as header (shading, bold, centered, custom font/spacing)\n * - Apply consistent cell margins to all cells\n * - Recolor and format cells with existing shading\n * - Optionally skip shading/formatting for single-cell (1x1) tables\n *\n * Shading and formatting logic (for tables > 1x1):\n * - Row 0: Apply the specified color + full formatting (bold, Verdana 12pt, centered, 3pt spacing)\n * - Other rows: Cells with existing color (NOT white) receive the same color + formatting\n * - Cells with no color or white color remain unchanged\n *\n * @param colorOrOptions Hex color for multi-cell tables, or options object\n * @param multiCellColor Optional second color for multi-cell tables (when first param is 1x1 color)\n * @returns Statistics about tables processed\n *\n * @example\n * // Use default gray color (E9E9E9) for multi-cell tables, skip 1x1 tables\n * const result = doc.applyStandardTableFormatting();\n *\n * @example\n * // Custom color for multi-cell tables only\n * const result = doc.applyStandardTableFormatting('D9D9D9');\n *\n * @example\n * // Two colors: first for 1x1 tables, second for multi-cell tables\n * const result = doc.applyStandardTableFormatting('BFBFBF', 'E9E9E9');\n *\n * @example\n * // Advanced: Full customization\n * const result = doc.applyStandardTableFormatting({\n * singleCellShading: 'BFBFBF', // Gray for 1x1 tables\n * headerRowShading: '4472C4', // Blue for multi-cell table headers\n * headerRowFormatting: {\n * bold: true,\n * alignment: 'center',\n * font: 'Arial',\n * size: 14\n * }\n * });\n * console.log(`Processed ${result.tablesProcessed} tables`);\n * console.log(`Formatted ${result.headerRowsFormatted} header rows`);\n * console.log(`Recolored ${result.cellsRecolored} cells`);\n * console.log(`Shaded ${result.singleCellTablesShaded} single-cell tables`);\n */\n public applyStandardTableFormatting(\n colorOrOptions?:\n | string\n | {\n /** Autofit tables to window width (DEPRECATED: now always enabled) */\n autofitToWindow?: boolean;\n /** Single-cell (1x1) table shading color */\n singleCellShading?: string;\n /** Header row background color for multi-cell tables (default: 'E9E9E9') */\n headerRowShading?: string;\n /** Header row text formatting */\n headerRowFormatting?: {\n bold?: boolean;\n alignment?: 'left' | 'center' | 'right' | 'justify';\n font?: string;\n size?: number;\n color?: string;\n spacingBefore?: number;\n spacingAfter?: number;\n };\n /** Cell margins for all cells in twips */\n cellMargins?: {\n top?: number;\n bottom?: number;\n left?: number;\n right?: number;\n };\n /** Skip 1x1 tables (DEPRECATED: use singleCellShading instead) */\n skipSingleCellTables?: boolean;\n },\n multiCellColor?: string\n ): {\n tablesProcessed: number;\n headerRowsFormatted: number;\n cellsRecolored: number;\n singleCellTablesShaded: number;\n } {\n // Handle different parameter combinations\n let options:\n | {\n autofitToWindow?: boolean;\n singleCellShading?: string;\n headerRowShading?: string;\n headerRowFormatting?: {\n bold?: boolean;\n alignment?: 'left' | 'center' | 'right' | 'justify';\n font?: string;\n size?: number;\n color?: string;\n spacingBefore?: number;\n spacingAfter?: number;\n };\n cellMargins?: { top?: number; bottom?: number; left?: number; right?: number };\n skipSingleCellTables?: boolean;\n }\n | undefined;\n if (typeof colorOrOptions === 'string') {\n if (multiCellColor) {\n // Two colors provided: applyStandardTableFormatting('BFBFBF', 'E9E9E9')\n options = {\n singleCellShading: colorOrOptions,\n headerRowShading: multiCellColor,\n };\n } else {\n // One color provided: backwards compatible - for multi-cell only\n options = { headerRowShading: colorOrOptions };\n }\n } else {\n options = colorOrOptions;\n }\n\n // Default values\n const singleCellShading = options?.singleCellShading?.toUpperCase();\n const headerRowShading = (options?.headerRowShading || 'E9E9E9').toUpperCase();\n const headerRowFormatting = {\n bold: options?.headerRowFormatting?.bold !== false,\n alignment: options?.headerRowFormatting?.alignment || ('center' as const),\n font: options?.headerRowFormatting?.font || 'Verdana',\n size: options?.headerRowFormatting?.size || 12,\n color: options?.headerRowFormatting?.color || '000000',\n spacingBefore: options?.headerRowFormatting?.spacingBefore ?? 60,\n spacingAfter: options?.headerRowFormatting?.spacingAfter ?? 60,\n };\n const cellMargins = {\n top: options?.cellMargins?.top ?? 0,\n bottom: options?.cellMargins?.bottom ?? 0,\n left: options?.cellMargins?.left ?? 115, // 0.08 inches\n right: options?.cellMargins?.right ?? 115, // 0.08 inches\n };\n const skipSingleCellTables = options?.skipSingleCellTables !== false && !singleCellShading;\n\n // Statistics\n let tablesProcessed = 0;\n let headerRowsFormatted = 0;\n let cellsRecolored = 0;\n let singleCellTablesShaded = 0;\n\n // Get all tables\n const tables = this.getAllTables();\n\n for (const table of tables) {\n const rowCount = table.getRowCount();\n const columnCount = table.getColumnCount();\n\n // Apply borders to all cells (always applied to all tables)\n table.setAllBorders({\n style: 'single',\n size: 4,\n color: '000000',\n });\n\n // Set table width to autofit to window (always applied to all tables)\n table.setLayout('auto');\n table.setWidthType('pct');\n table.setWidth(5000);\n\n // Handle 1x1 (single-cell) tables separately\n const is1x1Table = rowCount === 1 && columnCount === 1;\n if (is1x1Table) {\n if (singleCellShading) {\n // Apply single-cell shading color\n const singleCell = table.getRow(0)?.getCell(0);\n if (singleCell) {\n singleCell.setShading({ fill: singleCellShading });\n singleCellTablesShaded++;\n }\n }\n // Skip further processing for 1x1 tables\n tablesProcessed++;\n continue;\n }\n\n // Format first row (header) for multi-cell tables\n const firstRow = table.getRow(0);\n if (firstRow) {\n for (const cell of firstRow.getCells()) {\n // Set header shading\n cell.setShading({ fill: headerRowShading });\n\n // Set margins\n cell.setMargins(cellMargins);\n\n // Format paragraphs and runs in header (skip list paragraphs)\n for (const para of cell.getParagraphs()) {\n // Skip paragraphs that are part of numbered or bulleted lists\n const numPr = para.getFormatting().numbering;\n if (numPr && (numPr.level !== undefined || numPr.numId !== undefined)) {\n continue; // Preserve list formatting\n }\n\n para.setAlignment(headerRowFormatting.alignment);\n para.setSpaceBefore(headerRowFormatting.spacingBefore);\n para.setSpaceAfter(headerRowFormatting.spacingAfter);\n\n for (const run of para.getRuns()) {\n if (headerRowFormatting.bold) run.setBold(true);\n run.setFont(headerRowFormatting.font, headerRowFormatting.size);\n // Preserve white font - don't change color if run is white (FFFFFF)\n const currentColor = run.getColor()?.toUpperCase();\n if (currentColor !== 'FFFFFF') {\n run.setColor(headerRowFormatting.color);\n }\n }\n }\n }\n headerRowsFormatted++;\n }\n\n // Format remaining rows (data rows)\n for (let i = 1; i < rowCount; i++) {\n const row = table.getRow(i);\n if (!row) continue;\n\n for (const cell of row.getCells()) {\n // Always apply margins\n cell.setMargins(cellMargins);\n\n // Apply shading and formatting to cells with existing shading\n // Shading can be either a hex fill color OR a pattern (like pct10)\n const currentShading = cell.getShading();\n const currentColor = currentShading?.fill?.toUpperCase();\n const currentPattern = currentShading?.pattern?.toLowerCase();\n\n // Check if color is a valid 6-character hex code (not 'auto' or other special values)\n const isValidHexColor = /^[0-9A-F]{6}$/i.test(currentColor || '');\n const hasHexFillShading = currentColor && currentColor !== 'FFFFFF' && isValidHexColor;\n\n // Check if cell has pattern-based shading (like pct10, pct20, etc.)\n // Patterns like 'clear' or 'nil' don't count as shading\n const hasPatternShading =\n currentPattern &&\n currentPattern !== 'clear' &&\n currentPattern !== 'nil' &&\n currentPattern !== 'auto';\n\n if (hasHexFillShading || hasPatternShading) {\n // Apply the color passed to the method\n cell.setShading({ fill: headerRowShading });\n cellsRecolored++;\n\n // Always apply formatting when shading is applied (but skip list paragraphs)\n for (const para of cell.getParagraphs()) {\n // Skip paragraphs that are part of numbered or bulleted lists\n const numPr = para.getFormatting().numbering;\n if (numPr && (numPr.level !== undefined || numPr.numId !== undefined)) {\n continue; // Preserve list formatting\n }\n\n para.setAlignment('center');\n para.setSpaceBefore(60); // 3pt\n para.setSpaceAfter(60); // 3pt\n\n for (const run of para.getRuns()) {\n // Skip runs with Hyperlink style - preserve their blue color and underline\n if (run.isHyperlinkStyled()) {\n continue;\n }\n run.setBold(true);\n run.setFont('Verdana', 12);\n // Preserve white font - don't change color if run is white (FFFFFF)\n const currentColor = run.getColor()?.toUpperCase();\n if (currentColor !== 'FFFFFF') {\n run.setColor('000000');\n }\n }\n }\n }\n }\n }\n\n tablesProcessed++;\n }\n\n return {\n tablesProcessed,\n headerRowsFormatted,\n cellsRecolored,\n singleCellTablesShaded,\n };\n }\n\n /**\n * Centers all images where either dimension exceeds the specified pixel size\n *\n * Actually centers the paragraph containing the image, since images\n * themselves don't have alignment properties in Word.\n *\n * Conversion: 96 pixels = 1 inch = 914,400 EMUs (at 96 DPI)\n *\n * @param minPixels Minimum size in pixels - if either width OR height exceeds this, image is centered (default: 96 = 1 inch)\n * @returns Number of images centered\n * @example\n * ```typescript\n * const count = doc.centerLargeImages(96); // Center images > 1 inch\n * console.log(`Centered ${count} large images`);\n * ```\n */\n centerLargeImages(minPixels = 96): number {\n let count = 0;\n\n // Convert pixels to EMUs (914400 EMUs per inch, 96 DPI)\n // Formula: pixels * (914400 / 96) = pixels * 9525\n const minEmus = Math.round(minPixels * 9525);\n\n // Get all images with metadata\n const images = this.imageManager.getAllImages();\n\n // Create a Set of image IDs that meet size criteria\n const largeImageIds = new Set<string>();\n\n for (const entry of images) {\n const image = entry.image;\n const width = image.getWidth();\n const height = image.getHeight();\n\n // Check if either dimension meets minimum (width OR height >= threshold)\n if (width >= minEmus || height >= minEmus) {\n // Track this image's relationship ID\n const relId = image.getRelationshipId();\n if (relId) {\n largeImageIds.add(relId);\n }\n }\n }\n\n // Find paragraphs containing these large images and center them\n // Note: Images are embedded in paragraphs as ImageRun elements\n for (const paragraph of this.getAllParagraphs()) {\n const content = paragraph.getContent();\n\n for (const item of content) {\n // Check if this is an ImageRun (subclass of Run)\n if (item instanceof ImageRun) {\n const image = item.getImageElement();\n const relId = image.getRelationshipId();\n\n if (relId && largeImageIds.has(relId)) {\n // Remove indentation before centering\n paragraph.formatting.indentation = undefined;\n paragraph.setAlignment('center');\n count++;\n break; // Only count paragraph once\n }\n }\n }\n }\n\n return count;\n }\n\n /**\n * Applies border and centers all images where either dimension exceeds the specified pixel size\n *\n * This helper combines two operations:\n * 1. Applies a border to the image\n * 2. Centers the paragraph containing the image\n *\n * Processes images where EITHER width OR height exceeds the minimum size.\n * Border defaults to 2pt with black color.\n *\n * Conversion: 96 pixels = 1 inch = 914,400 EMUs (at 96 DPI)\n *\n * @param minPixels Minimum size in pixels - if either width OR height exceeds this, image is processed (default: 96 = 1 inch)\n * @param borderThicknessPt Border thickness in points (default: 2)\n * @returns Number of images processed (bordered and centered)\n * @example\n * ```typescript\n * // Apply 2pt border and center all images > 1 inch\n * const count = doc.borderAndCenterLargeImages();\n * console.log(`Processed ${count} large images`);\n * ```\n * @example\n * ```typescript\n * // Custom threshold and border thickness\n * const count = doc.borderAndCenterLargeImages(96, 3);\n * console.log(`Applied 3pt borders to ${count} images > 1 inch`);\n * ```\n */\n public borderAndCenterLargeImages(minPixels = 96, borderThicknessPt = 2): number {\n let count = 0;\n\n // Convert pixels to EMUs (914400 EMUs per inch, 96 DPI)\n // Formula: pixels * (914400 / 96) = pixels * 9525\n const minEmus = Math.round(minPixels * 9525);\n\n // Helper to check if an item is an ImageRun with large dimensions\n // Returns true if a large image was found and processed\n const processImageRun = (item: unknown): boolean => {\n if (item instanceof ImageRun) {\n const image = item.getImageElement();\n const width = image.getWidth();\n const height = image.getHeight();\n\n // Check if either dimension meets minimum (width OR height >= threshold)\n if (width >= minEmus || height >= minEmus) {\n // Apply border to the image\n image.setBorder(borderThicknessPt);\n return true;\n }\n }\n return false;\n };\n\n // Helper to check revision content for images\n const processRevision = (revision: Revision): boolean => {\n let found = false;\n const revisionContent = revision.getContent();\n for (const item of revisionContent) {\n // ImageRun extends Run, so check instanceof ImageRun\n if (processImageRun(item)) {\n found = true;\n }\n }\n return found;\n };\n\n // Directly iterate all paragraphs and find images\n // This approach bypasses ImageManager and works with images wherever they are\n for (const paragraph of this.getAllParagraphs()) {\n const content = paragraph.getContent();\n let hasLargeImage = false;\n\n for (const item of content) {\n // Check direct ImageRun content\n if (processImageRun(item)) {\n hasLargeImage = true;\n }\n // Check images inside Revisions (tracked changes like w:ins, w:del)\n else if (item instanceof Revision) {\n if (processRevision(item)) {\n hasLargeImage = true;\n }\n }\n // Note: Hyperlinks typically contain text, not images\n // Image hyperlinks would be a separate ImageRun with link styling\n }\n\n // If paragraph has a large image, center it\n if (hasLargeImage) {\n // Remove indentation before centering\n paragraph.formatting.indentation = undefined;\n paragraph.setAlignment('center');\n count++;\n }\n }\n\n return count;\n }\n\n /**\n * Sets line spacing for all list items (numbered or bulleted)\n *\n * @param spacingTwips Line spacing in twips (default: 240 = 12pt)\n * @returns Number of list items updated\n * @example\n * ```typescript\n * const count = doc.setListLineSpacing(240);\n * console.log(`Updated ${count} list items`);\n * ```\n */\n setListLineSpacing(spacingTwips = 240): number {\n let count = 0;\n\n for (const paragraph of this.getAllParagraphs()) {\n const numbering = paragraph.getNumbering();\n\n if (numbering) {\n // Has numbering - it's a list item\n paragraph.setLineSpacing(spacingTwips, 'auto');\n count++;\n }\n }\n\n return count;\n }\n\n /**\n * Normalizes all numbered lists in the document to use consistent formatting\n *\n * Creates a standard numbered list format and applies it to all numbered lists:\n * - Level 0: 1., 2., 3., ... (decimal)\n * - Level 1: a., b., c., ... (lowerLetter)\n * - Level 2: i., ii., iii., ... (lowerRoman)\n * - Consistent indentation and spacing\n *\n * @returns Number of paragraphs updated\n * @example\n * ```typescript\n * const count = doc.normalizeNumberedLists();\n * console.log(`Normalized ${count} numbered list items`);\n * ```\n */\n normalizeNumberedLists(): number {\n let count = 0;\n\n // Create a standard numbered list\n const standardNumId = this.numberingManager.createNumberedList(3, [\n 'decimal',\n 'lowerLetter',\n 'lowerRoman',\n ]);\n\n // Collect all paragraphs with numbering and identify numbered lists\n const paragraphs = this.getAllParagraphs();\n const numberedParas: { para: Paragraph; level: number }[] = [];\n\n for (const para of paragraphs) {\n const numbering = para.getNumbering();\n if (!numbering) continue;\n\n // Get the abstract numbering for this numId\n const instance = this.numberingManager.getInstance(numbering.numId);\n if (!instance) continue;\n\n const abstractNum = this.numberingManager.getAbstractNumbering(instance.getAbstractNumId());\n if (!abstractNum) continue;\n\n // Check if level 0 is a numbered format (not bullet)\n const level0 = abstractNum.getLevel(0);\n if (!level0) continue;\n\n const format = level0.getFormat();\n // Numbered formats: decimal, lowerRoman, upperRoman, lowerLetter, upperLetter, etc.\n if (format !== 'bullet') {\n numberedParas.push({ para, level: numbering.level });\n }\n }\n\n // Apply standard numbering to all numbered paragraphs\n for (const { para, level } of numberedParas) {\n para.setNumbering(standardNumId, level);\n count++;\n }\n\n // Clean up orphaned numbering definitions\n this.cleanupUnusedNumbering();\n\n return count;\n }\n\n /**\n * Normalizes all bullet lists in the document to use consistent formatting\n *\n * Creates a standard bullet list format and applies it to all bullet lists:\n * - Level 0: • (bullet)\n * - Level 1: ○ (circle)\n * - Level 2: ■ (square)\n * - Consistent indentation and spacing\n *\n * @returns Number of paragraphs updated\n * @example\n * ```typescript\n * const count = doc.normalizeBulletLists();\n * console.log(`Normalized ${count} bullet list items`);\n * ```\n */\n normalizeBulletLists(): number {\n let count = 0;\n\n // Create a standard bullet list with custom bullets\n const standardNumId = this.numberingManager.createBulletList(3, ['•', '○', '■']);\n\n // Collect all paragraphs with numbering and identify bullet lists\n const paragraphs = this.getAllParagraphs();\n const bulletParas: { para: Paragraph; level: number }[] = [];\n\n for (const para of paragraphs) {\n const numbering = para.getNumbering();\n if (!numbering) continue;\n\n // Get the abstract numbering for this numId\n const instance = this.numberingManager.getInstance(numbering.numId);\n if (!instance) continue;\n\n const abstractNum = this.numberingManager.getAbstractNumbering(instance.getAbstractNumId());\n if (!abstractNum) continue;\n\n // Check if level 0 is a bullet format\n const level0 = abstractNum.getLevel(0);\n if (!level0) continue;\n\n const format = level0.getFormat();\n if (format === 'bullet') {\n bulletParas.push({ para, level: numbering.level });\n }\n }\n\n // Apply standard bullet numbering to all bullet paragraphs\n for (const { para, level } of bulletParas) {\n para.setNumbering(standardNumId, level);\n count++;\n }\n\n // Clean up orphaned numbering definitions\n this.cleanupUnusedNumbering();\n\n return count;\n }\n\n /**\n * Consolidates duplicate abstract numbering definitions\n *\n * INTENTIONAL REMOVAL (NOT A BUG): This method deliberately removes duplicate\n * abstract numbering definitions and remaps their instances to a single canonical\n * definition. DOCX files routinely accumulate 10-50+ identical copies of the same\n * numbering definition through copy-paste — this is pure bloat that inflates\n * numbering.xml and can cause Word performance issues.\n *\n * Groups abstractNums by a deterministic fingerprint of their level properties\n * (including numStyleLink, styleLink, multiLevelType, and all level attributes).\n * For each group with >1 member, picks the lowest abstractNumId as canonical,\n * remaps all instances, and removes duplicates.\n *\n * Typically called after uniformity methods have made definitions identical,\n * and before cleanupUnusedNumbering() to remove any orphaned leftovers.\n *\n * @param options Optional configuration (e.g., protected IDs to skip)\n * @returns Summary of what was consolidated\n * @public\n */\n consolidateNumbering(options?: NumberingConsolidationOptions): NumberingConsolidationResult {\n return this.numberingManager.consolidateNumbering(options);\n }\n\n /**\n * Cleans up unused numbering definitions\n *\n * INTENTIONAL REMOVAL (NOT A BUG): This method deliberately removes numbering\n * instances and abstract numberings that are no longer referenced by any paragraph\n * in the document. DOCX files accumulate orphaned numbering definitions through\n * copy-paste, style normalization, and editing — they serve no purpose and bloat\n * numbering.xml. This method is always called explicitly by user code or internally\n * after normalizeNumberedLists()/normalizeBulletLists() which reassign all paragraphs\n * to new definitions, making old ones orphans by design.\n *\n * Performs a comprehensive scan before removing anything:\n * - Current paragraph numbering properties (w:numPr)\n * - Previous numbering from paragraph property changes (w:pPrChange)\n * - numId references inside raw nested content (nested tables/SDTs)\n * - numId references inside body-level tracked deletions (w:del blocks\n * that were skipped during parsing)\n * - Header, footer, footnote, and endnote XML files\n * - Raw XML safety net scan of all relevant ZIP entries\n *\n * A definition is only removed if it appears in NONE of these sources.\n *\n * @public\n */\n cleanupUnusedNumbering(): void {\n const usedNumIds = new Set<number>();\n\n // 1. Scan all body paragraphs for current numbering\n const paragraphs = this.getAllParagraphs();\n this.collectNumIdsFromParagraphs(paragraphs, usedNumIds);\n\n // 2. Scan raw nested content in table cells for numId references\n for (const element of this.bodyElements) {\n if (element instanceof Table) {\n this.collectNumIdsFromTable(element, usedNumIds);\n } else if (element instanceof StructuredDocumentTag) {\n for (const content of element.getContent()) {\n if (content instanceof Table) {\n this.collectNumIdsFromTable(content, usedNumIds);\n }\n }\n }\n }\n\n // 3. Scan headers and footers for numId references\n this.collectNumIdsFromElements(\n this.headerFooterManager.getAllHeaders().flatMap((entry) => entry.header.getElements()),\n usedNumIds\n );\n this.collectNumIdsFromElements(\n this.headerFooterManager.getAllFooters().flatMap((entry) => entry.footer.getElements()),\n usedNumIds\n );\n\n // 4. Scan footnotes and endnotes for numId references\n for (const footnote of this.footnoteManager.getAllFootnotes()) {\n this.collectNumIdsFromParagraphs(footnote.getParagraphs(), usedNumIds);\n }\n for (const endnote of this.endnoteManager.getAllEndnotes()) {\n this.collectNumIdsFromParagraphs(endnote.getParagraphs(), usedNumIds);\n }\n\n // 5. Scan original document XML for any numId references not captured by\n // the in-memory model (e.g., body-level w:del blocks, nested structures)\n const documentXml = this.zipHandler.getFileAsString('word/document.xml');\n if (documentXml) {\n this.collectNumIdsFromXml(documentXml, usedNumIds);\n }\n\n // 6. Scan header/footer/footnote/endnote XML files for raw numId references\n for (const filePath of this.zipHandler.getFilePaths()) {\n if (\n filePath.startsWith('word/header') ||\n filePath.startsWith('word/footer') ||\n filePath === DOCX_PATHS.FOOTNOTES ||\n filePath === DOCX_PATHS.ENDNOTES\n ) {\n const xml = this.zipHandler.getFileAsString(filePath);\n if (xml) {\n this.collectNumIdsFromXml(xml, usedNumIds);\n }\n }\n }\n\n // Clean up numbering definitions not found in any of the above scans\n this.numberingManager.cleanupUnusedNumbering(usedNumIds);\n }\n\n /**\n * Validates that all paragraph numId references point to existing numbering\n * definitions. Removes orphaned references where the numId definition was\n * deleted but paragraphs still reference it. This prevents Word \"unreadable\n * content\" corruption caused by active numbering references to missing definitions.\n *\n * @returns Number of orphaned numId references fixed\n */\n validateNumberingReferences(): number {\n let fixed = 0;\n const existingNumIds = new Set<number>(\n this.numberingManager.getAllInstances().map((i: any) => i.getNumId())\n );\n\n for (const para of this.getAllParagraphs()) {\n const numbering = para.getNumbering();\n if (numbering && !existingNumIds.has(numbering.numId)) {\n para.removeNumbering();\n fixed++;\n }\n }\n\n if (fixed > 0) {\n this.logger.warn(`Fixed ${fixed} orphaned numId references (numbering definitions missing)`);\n }\n return fixed;\n }\n\n /**\n * Enables flattening of INCLUDEPICTURE field codes during the next save.\n * Removes all INCLUDEPICTURE field markup (begin/instrText/separate/end)\n * while preserving the embedded image content (w:drawing elements).\n *\n * INTENTIONAL REMOVAL (NOT A BUG): The removed fldChar/instrText runs are\n * field wrapper bloat from Outlook copy-paste. They cause Word to freeze\n * due to recursive field resolution. The actual image content (w:drawing)\n * is always preserved — only the INCLUDEPICTURE field scaffolding is stripped.\n * Other field types (HYPERLINK, TOC, MERGEFIELD, etc.) are never touched.\n *\n * The document.xml is regenerated from the in-memory model (preserving all\n * in-memory changes like style application), then _postProcessDocumentXml()\n * strips any remaining INCLUDEPICTURE field markup as a safety net.\n *\n * @returns this for chaining\n * @example\n * ```typescript\n * const doc = await Document.loadFromBuffer(buffer);\n * doc.flattenFieldCodes();\n * const output = await doc.toBuffer();\n * ```\n */\n flattenFieldCodes(): this {\n this._flattenIncludePictureFields = true;\n return this;\n }\n\n /**\n * Enables removal of direct w:spacing from paragraphs with specified styles\n * during the next save. This operates at the raw XML level in the\n * post-processing pipeline (after document.xml regeneration).\n *\n * INTENTIONAL REMOVAL (NOT A BUG): Per OOXML precedence rules, direct\n * paragraph formatting overrides style definitions. When a document has\n * style-defined spacing (e.g., Normal style → 8pt after), but also has\n * direct w:spacing on every paragraph, the style spacing is ignored. This\n * method removes the direct overrides so the style's spacing takes effect.\n * Historical spacing inside w:pPrChange (revision tracking) is never touched.\n *\n * @param styleIds - Array of style IDs whose paragraphs should have direct spacing removed\n * @returns this for chaining\n * @example\n * ```typescript\n * const doc = await Document.loadFromBuffer(buffer);\n * doc.flattenFieldCodes();\n * doc.clearDirectSpacingForStyles(['Normal', 'Heading1', 'ListParagraph']);\n * const output = await doc.toBuffer();\n * ```\n */\n clearDirectSpacingForStyles(styleIds: string[]): this {\n this._clearDirectSpacingStyles = styleIds;\n return this;\n }\n\n /**\n * Enables removal of orphan RSIDs from settings.xml during the next save.\n *\n * INTENTIONAL REMOVAL (NOT A BUG): RSIDs (Revision Session Identifiers)\n * accumulate in settings.xml over editing sessions. Once the paragraphs or\n * runs that referenced them are deleted, the RSIDs become orphans — they\n * serve no purpose and bloat settings.xml (often 80%+ of its size). This\n * method scans document.xml for actually-referenced RSIDs and removes the\n * rest. rsidRoot is always preserved (required by ECMA-376 spec).\n *\n * @returns this for chaining\n * @example\n * ```typescript\n * const doc = await Document.loadFromBuffer(buffer);\n * doc.stripOrphanRSIDs();\n * const output = await doc.toBuffer();\n * ```\n */\n stripOrphanRSIDs(): this {\n this._stripOrphanRSIDs = true;\n return this;\n }\n\n /**\n * Validates bookmark pairs — ensures every bookmarkStart has a matching bookmarkEnd\n * and vice versa. Adds synthetic bookmarkEnd markers for orphaned starts and removes\n * orphaned ends. This prevents Word \"unreadable content\" errors from unbalanced pairs.\n *\n * Scans body-level paragraphs and table cell paragraphs.\n * @returns Number of repairs made\n */\n validateBookmarkPairs(): number {\n const startIds = new Set<number>();\n const endIds = new Set<number>();\n\n // Collect all bookmark start/end IDs from all reachable paragraphs\n const collectFromParagraph = (para: Paragraph) => {\n for (const bm of para.getBookmarksStart()) {\n startIds.add(bm.getId());\n }\n for (const bm of para.getBookmarksEnd()) {\n endIds.add(bm.getId());\n }\n };\n\n const collectFromTable = (table: Table) => {\n for (let r = 0; r < table.getRowCount(); r++) {\n const row = table.getRow(r);\n if (!row) continue;\n for (let c = 0; c < row.getCellCount(); c++) {\n const cell = row.getCell(c);\n if (!cell) continue;\n for (const para of cell.getParagraphs()) {\n collectFromParagraph(para);\n }\n }\n }\n };\n\n for (const element of this.bodyElements) {\n if (element instanceof Paragraph) {\n collectFromParagraph(element);\n } else if (element instanceof Table) {\n collectFromTable(element);\n } else if (element instanceof StructuredDocumentTag) {\n for (const content of element.getContent()) {\n if (content instanceof Paragraph) {\n collectFromParagraph(content);\n } else if (content instanceof Table) {\n collectFromTable(content);\n }\n }\n }\n }\n\n let repairs = 0;\n\n // Fix orphaned starts (start without matching end)\n for (const id of startIds) {\n if (!endIds.has(id)) {\n // Add synthetic bookmarkEnd to the last paragraph in the document body\n const lastPara = this.getLastParagraph();\n if (lastPara) {\n lastPara.addBookmarkEnd(\n new Bookmark({ id, name: `_repair_${id}`, skipNormalization: true })\n );\n this.logger.warn(`Bookmark validation: added missing bookmarkEnd for ID ${id}`);\n repairs++;\n }\n }\n }\n\n // Fix orphaned ends (end without matching start)\n for (const id of endIds) {\n if (!startIds.has(id)) {\n // Remove orphaned bookmarkEnd from all paragraphs\n this.removeOrphanedBookmarkEnd(id);\n this.logger.warn(`Bookmark validation: removed orphaned bookmarkEnd for ID ${id}`);\n repairs++;\n }\n }\n\n return repairs;\n }\n\n /**\n * Assigns unique IDs to revisions and drawing elements before serialization.\n * Prevents duplicate w:id and docPr id attributes that cause OOXML validation failures.\n */\n private assignUniqueIds(): void {\n // Collect the highest existing revision ID to avoid collisions with parsed revisions\n const existingRevisions = this.revisionManager.getAllRevisions();\n let maxRevId = 0;\n for (const rev of existingRevisions) {\n if (rev.getId() > maxRevId) maxRevId = rev.getId();\n }\n const registeredSet = new Set(existingRevisions);\n\n let docPrId = 1;\n\n const processParagraph = (para: Paragraph) => {\n // Assign unique IDs to unregistered revisions\n for (const rev of para.getRevisions()) {\n if (!registeredSet.has(rev)) {\n maxRevId++;\n rev.setId(maxRevId);\n registeredSet.add(rev);\n }\n }\n\n // Assign unique docPr IDs to drawing elements\n for (const item of para.getContent()) {\n if (item instanceof Shape) {\n item.setDocPrId(docPrId++);\n } else if (item instanceof TextBox) {\n item.setDocPrId(docPrId++);\n } else if (item instanceof ImageRun) {\n item.getImageElement().setDocPrId(docPrId++);\n }\n }\n };\n\n for (const element of this.bodyElements) {\n if (element instanceof Paragraph) {\n processParagraph(element);\n } else if (element instanceof Table) {\n for (const row of element.getRows()) {\n for (const cell of row.getCells()) {\n for (const para of cell.getParagraphs()) {\n processParagraph(para);\n }\n }\n }\n }\n }\n }\n\n /**\n * Gets the last paragraph in the document body (including inside tables)\n */\n private getLastParagraph(): Paragraph | null {\n // Walk backwards through body elements to find last paragraph\n for (let i = this.bodyElements.length - 1; i >= 0; i--) {\n const element = this.bodyElements[i];\n if (element instanceof Paragraph) {\n return element;\n }\n if (element instanceof Table) {\n const para = element.getLastParagraph();\n if (para) return para;\n }\n }\n return null;\n }\n\n /**\n * Removes an orphaned bookmarkEnd with the given ID from all paragraphs\n */\n private removeOrphanedBookmarkEnd(id: number): void {\n const removeFromParagraph = (para: Paragraph) => {\n para.removeBookmarkEnd(id);\n };\n\n const removeFromTable = (table: Table) => {\n for (let r = 0; r < table.getRowCount(); r++) {\n const row = table.getRow(r);\n if (!row) continue;\n for (let c = 0; c < row.getCellCount(); c++) {\n const cell = row.getCell(c);\n if (!cell) continue;\n for (const para of cell.getParagraphs()) {\n removeFromParagraph(para);\n }\n }\n }\n };\n\n for (const element of this.bodyElements) {\n if (element instanceof Paragraph) {\n removeFromParagraph(element);\n } else if (element instanceof Table) {\n removeFromTable(element);\n } else if (element instanceof StructuredDocumentTag) {\n for (const content of element.getContent()) {\n if (content instanceof Paragraph) {\n removeFromParagraph(content);\n } else if (content instanceof Table) {\n removeFromTable(content);\n }\n }\n }\n }\n }\n\n /**\n * Scans paragraphs for current numbering and pPrChange numbering references.\n * @private\n */\n private collectNumIdsFromParagraphs(paragraphs: Paragraph[], usedNumIds: Set<number>): void {\n for (const para of paragraphs) {\n const numbering = para.getNumbering();\n if (numbering) {\n usedNumIds.add(numbering.numId);\n }\n const pPrChange = para.getFormatting().pPrChange;\n if (pPrChange?.previousProperties?.numbering?.numId !== undefined) {\n usedNumIds.add(pPrChange.previousProperties.numbering.numId);\n }\n }\n }\n\n /**\n * Scans an array of Paragraph | Table elements for numId references.\n * Handles both paragraph numbering and raw nested content in tables.\n * @private\n */\n private collectNumIdsFromElements(\n elements: (Paragraph | Table)[],\n usedNumIds: Set<number>\n ): void {\n for (const element of elements) {\n if (element instanceof Paragraph) {\n this.collectNumIdsFromParagraphs([element], usedNumIds);\n } else if (element instanceof Table) {\n // Scan parsed paragraphs in table cells\n for (const row of element.getRows()) {\n for (const cell of row.getCells()) {\n this.collectNumIdsFromParagraphs(cell.getParagraphs(), usedNumIds);\n }\n }\n // Scan raw nested content\n this.collectNumIdsFromTable(element, usedNumIds);\n }\n }\n }\n\n /**\n * Collects numId references from raw nested content in a table's cells.\n * Nested tables are stored as raw XML passthrough and may contain\n * numbering references not captured by the in-memory paragraph model.\n * @private\n */\n private collectNumIdsFromTable(table: Table, usedNumIds: Set<number>): void {\n for (const row of table.getRows()) {\n for (const cell of row.getCells()) {\n const rawContent = cell.getRawNestedContent();\n for (const item of rawContent) {\n this.collectNumIdsFromXml(item.xml, usedNumIds);\n }\n }\n }\n }\n\n /**\n * Extracts all w:numId w:val=\"X\" references from an XML string.\n * Used to find numbering references in raw XML content that is not\n * represented in the in-memory paragraph model (e.g., nested tables,\n * deleted paragraphs in tracked changes).\n * @private\n */\n private collectNumIdsFromXml(xml: string, usedNumIds: Set<number>): void {\n const numIdPattern = /<w:numId\\s+w:val=\"(\\d+)\"/g;\n let match: RegExpExecArray | null;\n while ((match = numIdPattern.exec(xml)) !== null) {\n const val = match[1];\n if (val) {\n usedNumIds.add(parseInt(val, 10));\n }\n }\n }\n\n /**\n * Adds a blank paragraph with Normal style after each bullet/numbered list\n *\n * Processes the document and inserts a blank paragraph after every list ends.\n * Lists are identified by their numbering ID - nested lists with the same ID\n * are treated as part of the same list.\n *\n * @returns The number of blank paragraphs inserted\n *\n * @example\n * ```typescript\n * const doc = await Document.load('input.docx');\n * const count = doc.addBlankLineAfterLists();\n * console.log(`Added ${count} blank lines after lists`);\n * await doc.save('output.docx');\n * ```\n */\n addBlankLineAfterLists(): number {\n let insertedCount = 0;\n\n // Iterate through body elements - need index-based loop since we modify the array\n for (let i = 0; i < this.bodyElements.length; i++) {\n const element = this.bodyElements[i];\n\n // Check if current element is a paragraph with numbering (list item)\n if (element instanceof Paragraph) {\n const numbering = element.getNumbering();\n\n if (numbering) {\n // This is a list item - check if it's the last item of its list\n const nextElement = this.bodyElements[i + 1];\n const isListEnd =\n !nextElement || // End of document\n !(nextElement instanceof Paragraph) || // Next is not a paragraph\n nextElement.getNumbering()?.numId !== numbering.numId; // Different list\n\n if (isListEnd) {\n // Check if there's already a blank paragraph after the list\n const alreadyHasBlank =\n nextElement instanceof Paragraph &&\n nextElement.getText().trim() === '' &&\n nextElement.getContent().length === 0;\n\n if (!alreadyHasBlank) {\n // Insert blank paragraph with Normal style after this list item\n const blankPara = new Paragraph();\n blankPara.setStyle('Normal');\n\n // Insert at position i+1 (after current element)\n this.bodyElements.splice(i + 1, 0, blankPara);\n insertedCount++;\n }\n\n // Skip the next element (either newly inserted or existing blank)\n i++;\n }\n }\n }\n }\n\n return insertedCount;\n }\n\n /**\n * Removes all headers and footers from the document\n *\n * Clears all header and footer references including:\n * - Default header/footer\n * - First page header/footer\n * - Even page header/footer\n *\n * @returns Number of headers and footers removed\n * @example\n * ```typescript\n * const count = doc.removeAllHeadersFooters();\n * console.log(`Removed ${count} headers and footers`);\n * ```\n */\n removeAllHeadersFooters(): number {\n let totalCount = 0;\n\n // Step 1: Remove relationship entries for headers and footers\n const headerRels = this.relationshipManager.getRelationshipsByType(\n 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/header'\n );\n const footerRels = this.relationshipManager.getRelationshipsByType(\n 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer'\n );\n\n for (const rel of [...headerRels, ...footerRels]) {\n this.relationshipManager.removeRelationship(rel.getId());\n totalCount++;\n }\n\n // Step 2: Find and delete all header/footer XML files from ZIP archive\n // Scan for word/header*.xml and word/footer*.xml files\n const allFiles = this.zipHandler.getFilePaths();\n const headerFooterFiles = allFiles.filter((path) =>\n /^word\\/(header|footer)\\d+\\.xml$/i.exec(path)\n );\n\n for (const filePath of headerFooterFiles) {\n this.zipHandler.removeFile(filePath);\n }\n\n // Step 3: Clear internal references\n this.headerFooterManager.clear();\n\n // Clear section header/footer references\n const section = this.section;\n const sectionProps = (section as any).properties;\n\n if (sectionProps.headers) {\n sectionProps.headers = {};\n }\n\n if (sectionProps.footers) {\n sectionProps.footers = {};\n }\n\n // Disable title page if it was enabled for first page headers/footers\n if (sectionProps.titlePage) {\n sectionProps.titlePage = false;\n }\n\n // Step 4: Strip header/footer references from inline sectPr in paragraphs\n // Multi-section documents store section breaks as raw XML strings on paragraphs.\n // These contain w:headerReference and w:footerReference elements that must also be removed.\n for (const element of this.bodyElements) {\n if (element instanceof Paragraph && typeof element.formatting.sectPr === 'string') {\n let sectPrXml = element.formatting.sectPr;\n // Remove w:headerReference elements\n sectPrXml = sectPrXml.replace(/<w:headerReference[^/]*\\/>/g, '');\n sectPrXml = sectPrXml.replace(/<w:headerReference[^>]*>[\\s\\S]*?<\\/w:headerReference>/g, '');\n // Remove w:footerReference elements\n sectPrXml = sectPrXml.replace(/<w:footerReference[^/]*\\/>/g, '');\n sectPrXml = sectPrXml.replace(/<w:footerReference[^>]*>[\\s\\S]*?<\\/w:footerReference>/g, '');\n // Remove w:titlePg (only relevant for first-page header/footer differentiation)\n sectPrXml = sectPrXml.replace(/<w:titlePg[^/]*\\/>/g, '');\n sectPrXml = sectPrXml.replace(/<w:titlePg[^>]*>[\\s\\S]*?<\\/w:titlePg>/g, '');\n element.setSectionProperties(sectPrXml);\n }\n }\n\n return totalCount;\n }\n\n /**\n * Clears the content of all headers and footers, leaving them as empty parts.\n *\n * Unlike removeAllHeadersFooters() which deletes the header/footer parts entirely,\n * this method preserves the structural elements (files, relationships, section references)\n * and only empties the content. Each header/footer will contain a single empty paragraph.\n *\n * This is safer for multi-section documents because it avoids dangling references.\n *\n * @returns Number of headers and footers cleared\n */\n clearAllHeaderFooterContent(): number {\n let count = 0;\n\n for (const entry of this.headerFooterManager.getAllHeaders()) {\n entry.header.clear();\n count++;\n }\n\n for (const entry of this.headerFooterManager.getAllFooters()) {\n entry.footer.clear();\n count++;\n }\n\n return count;\n }\n\n /**\n * Gets the raw styles.xml content as a string\n * @returns The raw XML content of styles.xml\n */\n getStylesXml(): string {\n const stylesFile = this.zipHandler.getFileAsString(DOCX_PATHS.STYLES);\n return stylesFile || this.stylesManager.generateStylesXml();\n }\n\n /**\n * Sets the raw styles.xml content\n *\n * **Warning:** This directly sets the XML content without validation.\n * Invalid XML may corrupt the document. Use StylesManager.validate()\n * to check the XML before setting.\n *\n * @param xml - The raw XML content to set\n */\n setStylesXml(xml: string): void {\n this.zipHandler.updateFile(DOCX_PATHS.STYLES, xml);\n\n // Clear the styles manager to force reload on next access\n this.stylesManager.clear();\n }\n\n /**\n * Gets the underlying ZipHandler for advanced ZIP operations\n *\n * Provides low-level access to the ZIP archive for advanced scenarios\n * like direct file manipulation, custom part extraction, or debugging.\n * Use with caution as direct modifications can corrupt the document.\n *\n * @returns The ZipHandler instance managing the DOCX package\n *\n * @example\n * ```typescript\n * const zipHandler = doc.getZipHandler();\n * const files = zipHandler.getFilePaths();\n * console.log('Package contains:', files);\n * ```\n */\n getZipHandler(): ZipHandler {\n return this.zipHandler;\n }\n\n /**\n * Gets the NumberingManager for advanced list operations\n *\n * Provides direct access to the NumberingManager for advanced scenarios\n * like creating custom list definitions, managing numbering instances,\n * or analyzing list structures.\n *\n * @returns The NumberingManager instance managing this document's lists\n *\n * @example\n * ```typescript\n * const numManager = doc.getNumberingManager();\n * const instances = numManager.getAllInstances();\n * console.log(`Document has ${instances.length} list definitions`);\n * ```\n */\n getNumberingManager(): NumberingManager {\n return this.numberingManager;\n }\n\n /**\n * Creates a new bullet list definition and returns its ID\n *\n * Creates a multi-level bullet list with customizable bullet characters\n * for each level. The returned numId can be used with {@link Paragraph.setNumbering}\n * to apply the list to paragraphs.\n *\n * @param levels - Number of indentation levels to create (default: 3, max: 9)\n * @param bullets - Optional array of bullet characters for each level (default: ['•', '○', '■'])\n * @returns The numbering instance ID to use with paragraph.setNumbering()\n *\n * @example\n * ```typescript\n * // Create simple 3-level bullet list\n * const listId = doc.createBulletList();\n * doc.createParagraph('Level 1 item').setNumbering(listId, 0);\n * doc.createParagraph('Level 2 item').setNumbering(listId, 1);\n * ```\n *\n * @example\n * ```typescript\n * // Create with custom bullets\n * const listId = doc.createBulletList(4, ['★', '☆', '▶', '▷']);\n * doc.createParagraph('Star item').setNumbering(listId, 0);\n * doc.createParagraph('Hollow star').setNumbering(listId, 1);\n * ```\n */\n createBulletList(levels = 3, bullets?: string[]): number {\n return this.numberingManager.createBulletList(levels, bullets);\n }\n\n /**\n * Creates a new numbered list definition and returns its ID\n *\n * Creates a multi-level numbered list with customizable number formats\n * for each level (decimal, roman, letters, etc.). The returned numId can be\n * used with {@link Paragraph.setNumbering} to apply the list to paragraphs.\n *\n * @param levels - Number of indentation levels to create (default: 3, max: 9)\n * @param formats - Optional array of number formats for each level (default: ['decimal', 'lowerLetter', 'lowerRoman'])\n * @returns The numbering instance ID to use with paragraph.setNumbering()\n *\n * @example\n * ``` typescript\n * // Create simple 3-level numbered list\n * const listId = doc.createNumberedList();\n * doc.createParagraph('1. First item').setNumbering(listId, 0);\n * doc.createParagraph('a. Sub-item').setNumbering(listId, 1);\n * ```\n *\n * @example\n * ```typescript\n * // Create custom format list\n * const listId = doc.createNumberedList(2, ['upperRoman', 'lowerLetter']);\n * doc.createParagraph('Roman numeral').setNumbering(listId, 0); // I.\n * doc.createParagraph('Letter').setNumbering(listId, 1); // a.\n * ```\n */\n createNumberedList(levels = 3, formats?: ('decimal' | 'lowerLetter' | 'lowerRoman')[]): number {\n return this.numberingManager.createNumberedList(levels, formats);\n }\n\n /**\n * Creates a new multi-level list and returns its numId\n * @returns The numId to use with setNumbering()\n */\n createMultiLevelList(): number {\n return this.numberingManager.createMultiLevelList();\n }\n\n /**\n * Creates a new numbering instance that restarts numbering for an existing list\n *\n * This creates a new `<w:num>` referencing the same abstract numbering as the\n * given numId, but with a level override to restart counting at the specified value.\n *\n * @param numId The existing numbering instance ID to base the restart on\n * @param level The level to restart (0-8, default: 0)\n * @param startValue The value to restart from (>= 1, default: 1)\n * @returns The new numId to use with paragraph.setNumbering()\n *\n * @example\n * ```typescript\n * const listId = doc.createNumberedList();\n * doc.createParagraph('First list item 1').setNumbering(listId, 0);\n * doc.createParagraph('First list item 2').setNumbering(listId, 0);\n *\n * const restartId = doc.restartNumbering(listId);\n * doc.createParagraph('Second list item 1').setNumbering(restartId, 0);\n * ```\n */\n restartNumbering(numId: number, level?: number, startValue?: number): number {\n return this.numberingManager.restartNumbering(numId, level, startValue);\n }\n\n /**\n * Gets the framework's standard indentation for a list level\n *\n * The framework uses a consistent indentation scheme:\n * - leftIndent: 720 * (level + 1) twips\n * - hangingIndent: 360 twips\n *\n * @param level The level (0-8)\n * @returns Object with leftIndent and hangingIndent in twips\n * @example\n * ```typescript\n * const indent = doc.getStandardIndentation(0);\n * // Returns: { leftIndent: 720, hangingIndent: 360 }\n * ```\n */\n getStandardIndentation(level: number): {\n leftIndent: number;\n hangingIndent: number;\n } {\n return this.numberingManager.getStandardIndentation(level);\n }\n\n /**\n * Sets custom indentation for a specific level in a numbering definition\n *\n * This updates the indentation for a specific level across ALL paragraphs\n * that use this numId and level combination.\n *\n * @param numId The numbering instance ID\n * @param level The level to modify (0-8)\n * @param leftIndent Left indentation in twips\n * @param hangingIndent Hanging indentation in twips (optional, defaults to 360)\n * @returns This document for chaining\n * @example\n * ```typescript\n * // Set level 0 to 0.5 inch left, 0.25 inch hanging\n * doc.setListIndentation(1, 0, 720, 360);\n * ```\n */\n setListIndentation(\n numId: number,\n level: number,\n leftIndent: number,\n hangingIndent?: number\n ): this {\n this.numberingManager.setListIndentation(numId, level, leftIndent, hangingIndent);\n return this;\n }\n\n /**\n * Normalizes indentation for all lists in the document\n *\n * Applies standard indentation to every numbering instance:\n * - leftIndent: 720 * (level + 1) twips\n * - hangingIndent: 360 twips\n *\n * This ensures consistent spacing across all lists in the document.\n *\n * @returns Number of numbering instances updated\n * @example\n * ```typescript\n * const count = doc.normalizeAllListIndentation();\n * console.log(`Normalized ${count} lists`);\n * ```\n */\n normalizeAllListIndentation(): number {\n return this.numberingManager.normalizeAllListIndentation();\n }\n\n /**\n * Applies standard formatting to all bullet lists in the document\n *\n * Standardizes bullet lists with:\n * - Alternating bullet symbols: • (solid) for even levels, ○ (open) for odd levels\n * - Indentation: 0.5\" increments (720 twips per level)\n * - Hanging indent: 0.25\" (360 twips)\n * - Paragraph text: Verdana 12pt\n * - Spacing: 0pt before, 3pt after (60 twips)\n * - Contextual spacing enabled (no spacing between same-type paragraphs)\n *\n * @returns Number of bullet lists updated\n * @example\n * ```typescript\n * const doc = await Document.load('document.docx');\n * const count = doc.applyStandardListFormatting();\n * console.log(`Standardized ${count} bullet lists`);\n * await doc.save('document-formatted.docx');\n * ```\n */\n applyStandardListFormatting(): number {\n const instances = this.numberingManager.getAllInstances();\n let count = 0;\n\n for (const instance of instances) {\n const abstractNumId = instance.getAbstractNumId();\n const abstractNum = this.numberingManager.getAbstractNumbering(abstractNumId);\n\n if (!abstractNum) continue;\n\n // Only process bullet lists (skip numbered lists)\n const level0 = abstractNum.getLevel(0);\n if (level0?.getFormat() !== 'bullet') continue;\n\n // Update all 9 levels (0-8) with standard formatting\n for (let levelIndex = 0; levelIndex < 9; levelIndex++) {\n const numLevel = abstractNum.getLevel(levelIndex);\n if (!numLevel) continue;\n\n // Alternate bullets: even levels = solid (•), odd levels = open (○)\n const bullet = levelIndex % 2 === 0 ? '•' : '○';\n numLevel.setText(bullet);\n\n // Set bullet font to Arial (Unicode bullets require a regular font, not Symbol)\n numLevel.setFont('Arial');\n\n // Set bullet size to 12pt (24 half-points)\n numLevel.setFontSize(24);\n\n // Indentation: 0.5\" per level (720 twips)\n // Level 0 = 720, Level 1 = 1440, Level 2 = 2160, etc.\n numLevel.setLeftIndent(720 * (levelIndex + 1));\n\n // Hanging indent: 0.25\" (360 twips) for all levels\n numLevel.setHangingIndent(360);\n }\n\n // Apply paragraph formatting to all paragraphs using this list\n this.applyFormattingToListParagraphs(instance.getNumId());\n count++;\n }\n\n return count;\n }\n\n /**\n * Applies standard formatting to all numbered lists in the document\n *\n * Standardizes numbered lists with (preserves existing numbering format):\n * - Indentation: 0.5\" increments (720 twips per level)\n * - Hanging indent: 0.25\" (360 twips)\n * - Number font: Verdana 12pt\n * - Paragraph text: Verdana 12pt\n * - Spacing: 0pt before, 3pt after (60 twips)\n * - Contextual spacing enabled (no spacing between same-type paragraphs)\n *\n * Note: This preserves the existing numbering format (decimal, roman, etc.)\n * and only standardizes the visual formatting. To change numbering formats,\n * use normalizeNumberedLists() instead.\n *\n * @returns Number of numbered lists updated\n * @example\n * ```typescript\n * const doc = await Document.load('document.docx');\n * const count = doc.applyStandardNumberedListFormatting();\n * console.log(`Standardized ${count} numbered lists`);\n * await doc.save('document-formatted.docx');\n * ```\n */\n applyStandardNumberedListFormatting(): number {\n const instances = this.numberingManager.getAllInstances();\n let count = 0;\n\n for (const instance of instances) {\n const abstractNumId = instance.getAbstractNumId();\n const abstractNum = this.numberingManager.getAbstractNumbering(abstractNumId);\n\n if (!abstractNum) continue;\n\n // Only process numbered lists (skip bullet lists)\n const level0 = abstractNum.getLevel(0);\n if (!level0 || level0.getFormat() === 'bullet') continue;\n\n // Update all 9 levels (0-8) with standard formatting\n for (let levelIndex = 0; levelIndex < 9; levelIndex++) {\n const numLevel = abstractNum.getLevel(levelIndex);\n if (!numLevel) continue;\n\n // Set number font to Verdana 12pt\n numLevel.setFont('Verdana');\n numLevel.setFontSize(24); // 12pt = 24 half-points\n\n // Indentation: 0.5\" per level (720 twips)\n // Level 0 = 720, Level 1 = 1440, Level 2 = 2160, etc.\n numLevel.setLeftIndent(720 * (levelIndex + 1));\n\n // Hanging indent: 0.25\" (360 twips) for all levels\n numLevel.setHangingIndent(360);\n\n // Set alignment to left\n numLevel.setAlignment('left');\n }\n\n // Apply paragraph formatting to all paragraphs using this list\n this.applyFormattingToListParagraphs(instance.getNumId());\n count++;\n }\n\n return count;\n }\n\n /**\n * Applies formatting to all paragraphs that use a specific numbering instance\n * Sets font, spacing, and contextual spacing properties\n * @param numId The numbering instance ID\n * @private\n */\n private applyFormattingToListParagraphs(numId: number): void {\n const paragraphs = this.getAllParagraphs();\n\n for (const para of paragraphs) {\n const numbering = para.getNumbering();\n if (numbering?.numId === numId) {\n // Apply font to all runs in the paragraph\n const runs = para.getRuns();\n for (const run of runs) {\n run.setFont('Verdana', 12);\n }\n\n // Apply paragraph spacing\n para.setSpaceBefore(0); // 0pt before\n para.setSpaceAfter(60); // 3pt after (60 twips)\n para.setContextualSpacing(true); // No spacing between same-type paragraphs\n\n // Clear paragraph-level indentation so numbering definition indentation takes effect\n // Paragraph-level indentation overrides numbering indentation, so we need to remove it\n para.formatting.indentation = undefined;\n }\n }\n }\n\n /**\n * Checks if a paragraph is contained within a table cell\n * @param para The paragraph to check\n * @returns Object with inTable boolean and cell reference if found\n * @private\n */\n private isParagraphInTable(para: Paragraph): {\n inTable: boolean;\n cell?: TableCell;\n } {\n const allTables = this.getAllTables();\n\n for (const table of allTables) {\n for (const row of table.getRows()) {\n for (const cell of row.getCells()) {\n const cellParas = cell.getParagraphs();\n for (const cellPara of cellParas) {\n if (cellPara === para) {\n return { inTable: true, cell };\n }\n }\n }\n }\n }\n\n return { inTable: false };\n }\n\n /**\n * Wraps a paragraph in a 1x1 table and applies cell formatting\n * @param para The paragraph to wrap\n * @param options Formatting options for the table cell\n * @returns The created table\n * @private\n */\n private wrapParagraphInTable(\n para: Paragraph,\n options: {\n shading?: string;\n marginTop?: number;\n marginBottom?: number;\n marginLeft?: number;\n marginRight?: number;\n tableWidthPercent?: number;\n }\n ): Table {\n // Find the paragraph index in bodyElements\n const paraIndex = this.bodyElements.indexOf(para);\n if (paraIndex === -1) {\n throw new Error('Paragraph not found in document body elements');\n }\n\n // Create 1x1 table\n const table = new Table(1, 1);\n const cell = table.getCell(0, 0);\n\n if (!cell) {\n throw new Error('Failed to get cell from newly created table');\n }\n\n // Move paragraph to cell\n // Remove paragraph from document body\n this.bodyElements.splice(paraIndex, 1);\n\n // Add paragraph to cell\n cell.addParagraph(para);\n\n // Apply cell formatting\n if (options.shading) {\n cell.setShading({ fill: options.shading });\n }\n\n if (\n options.marginTop !== undefined ||\n options.marginBottom !== undefined ||\n options.marginLeft !== undefined ||\n options.marginRight !== undefined\n ) {\n cell.setMargins({\n top: options.marginTop ?? 100,\n bottom: options.marginBottom ?? 100,\n left: options.marginLeft ?? 100,\n right: options.marginRight ?? 100,\n });\n }\n\n // Set table width (percentage of page width)\n if (options.tableWidthPercent !== undefined) {\n table.setWidth(options.tableWidthPercent);\n table.setWidthType('pct');\n }\n\n // Insert table where paragraph was\n this.bodyElements.splice(paraIndex, 0, table);\n\n return table;\n }\n\n // Default style configurations for applyStyles()\n private static readonly DEFAULT_HEADING1_CONFIG: StyleConfig = {\n run: {\n font: 'Verdana',\n size: 18,\n bold: true,\n color: '000000',\n },\n paragraph: {\n alignment: 'left',\n spacing: { before: 0, after: 240, line: 240, lineRule: 'auto' },\n },\n };\n\n private static readonly DEFAULT_HEADING2_CONFIG: Heading2Config = {\n run: {\n font: 'Verdana',\n size: 14,\n bold: true,\n color: '000000',\n },\n paragraph: {\n alignment: 'left',\n spacing: { before: 120, after: 120, line: 240, lineRule: 'auto' },\n },\n tableOptions: {\n shading: 'BFBFBF',\n marginTop: 0,\n marginBottom: 0,\n marginLeft: 115,\n marginRight: 115,\n tableWidthPercent: 5000,\n },\n };\n\n private static readonly DEFAULT_HEADING3_CONFIG: StyleConfig = {\n run: {\n font: 'Verdana',\n size: 12,\n bold: true,\n color: '000000',\n },\n paragraph: {\n alignment: 'left',\n spacing: { before: 60, after: 60, line: 240, lineRule: 'auto' },\n },\n };\n\n private static readonly DEFAULT_NORMAL_CONFIG: StyleConfig = {\n run: {\n font: 'Verdana',\n size: 12,\n color: '000000',\n },\n paragraph: {\n alignment: 'left',\n spacing: { before: 60, after: 60, line: 240, lineRule: 'auto' },\n },\n };\n\n private static readonly DEFAULT_LIST_PARAGRAPH_CONFIG: StyleConfig = {\n run: {\n font: 'Verdana',\n size: 12,\n color: '000000',\n },\n paragraph: {\n alignment: 'left',\n spacing: { before: 0, after: 60, line: 240, lineRule: 'auto' },\n indentation: { left: 360, hanging: 360 },\n contextualSpacing: true,\n },\n };\n\n /**\n * Gets all Run instances from a paragraph, including those nested inside\n * Revision, Hyperlink, and other container elements.\n *\n * This method recursively extracts runs from:\n * - Direct Run children of the paragraph\n * - Runs inside Revision elements (tracked changes)\n * - Runs inside Hyperlink elements\n *\n * @param para - The paragraph to extract runs from\n * @returns Array of all Run instances found in the paragraph\n * @private\n */\n private getAllRunsFromParagraph(para: Paragraph): Run[] {\n const runs: Run[] = [];\n const content = para.getContent();\n\n for (const item of content) {\n if (item instanceof Run) {\n // Direct run\n runs.push(item);\n } else if (item instanceof Revision) {\n // Skip deleted/moved-away content — these runs are inactive\n const revType = item.getType();\n if (revType === 'delete' || revType === 'moveFrom') {\n continue;\n }\n const revisionRuns = item.getRuns();\n runs.push(...revisionRuns);\n } else if (item instanceof Hyperlink) {\n // Run inside hyperlink (Hyperlink has a single run)\n const hyperlinkRun = item.getRun();\n runs.push(hyperlinkRun);\n }\n }\n\n return runs;\n }\n\n /**\n * Applies styles to the document with custom formatting\n *\n * Modifies existing Heading1, Heading2, Heading3, Normal, and List Paragraph style definitions\n * with custom formatting. This approach preserves the original style names while updating their formatting.\n *\n * **Key Feature**: Only properties explicitly provided in options will override current style values.\n * The method reads the ACTUAL current values from the style objects, not hardcoded defaults.\n * This allows you to change just one property (like font) while keeping all other existing values.\n *\n * Per ECMA-376 §17.7.2, direct formatting in document.xml ALWAYS overrides\n * style definitions in styles.xml. This method clears conflicting direct\n * formatting from paragraphs to allow style modifications to take effect.\n *\n * Fallback defaults (when no options provided OR style doesn't exist):\n * - Heading1: 18pt black bold Verdana, left aligned, 0pt before / 12pt after, single line spacing, no italic/underline\n * - Heading2: 14pt black bold Verdana, left aligned, 6pt before/after, single line spacing, wrapped in gray tables (0.08\" margins), no italic/underline\n * - Heading3: 12pt black bold Verdana, left aligned, 3pt before/after, single line spacing, no table wrapping, no italic/underline\n * - Normal: 12pt Verdana, left aligned, 3pt before/after, single line spacing, no italic/underline\n * - List Paragraph: 12pt Verdana, left aligned, 0pt before / 3pt after, single line spacing, 0.25\" bullet indent / 0.50\" text indent, contextual spacing enabled, no italic/underline\n *\n * Heading2 table wrapping behavior:\n * - Empty Heading2 paragraphs are skipped (not wrapped in tables)\n * - Heading2 paragraphs already in tables have their cell formatted (shading, margins, width)\n * - Heading2 paragraphs not in tables are wrapped in new 1x1 tables\n * - Table appearance is configurable via options.heading2.tableOptions\n *\n * @param options - Optional custom formatting configuration for each style. Properties merge with current values.\n * @returns Object indicating which styles were successfully modified\n *\n * @example\n * ```typescript\n * // Use default formatting (applies Verdana defaults)\n * doc.applyStyles();\n * ```\n *\n * @example\n * ```typescript\n * // Just change font, keep all other existing style values\n * doc.applyStyles({\n * heading1: {\n * run: { font: 'Arial' } // Only overrides font, keeps existing size/bold/color/etc.\n * }\n * });\n * ```\n *\n * @example\n * ```typescript\n * // Comprehensive custom formatting\n * doc.applyStyles({\n * heading1: {\n * run: { font: 'Arial', size: 16, bold: true, color: '000000' },\n * paragraph: { spacing: { before: 0, after: 200, line: 240, lineRule: 'auto' } }\n * },\n * heading2: {\n * run: { font: 'Arial', size: 14, bold: true },\n * paragraph: { spacing: { before: 100, after: 100 } },\n * tableOptions: { shading: '808080', marginLeft: 150, marginRight: 150 }\n * }\n * });\n * ```\n */\n public applyStyles(options?: ApplyStylesOptions): {\n heading1: boolean;\n heading2: boolean;\n heading3: boolean;\n normal: boolean;\n listParagraph: boolean;\n } {\n const results = {\n heading1: false,\n heading2: false,\n heading3: false,\n normal: false,\n listParagraph: false,\n };\n\n // Get existing styles from StylesManager\n const heading1 = this.stylesManager.getStyle('Heading1');\n const heading2 = this.stylesManager.getStyle('Heading2');\n const heading3 = this.stylesManager.getStyle('Heading3');\n const normal = this.stylesManager.getStyle('Normal');\n const listParagraph = this.stylesManager.getStyle('ListParagraph');\n\n // Merge provided options with ACTUAL current style values (not hardcoded defaults)\n // This allows users to only specify properties they want to change\n const h1Config = {\n run: {\n ...(heading1?.getRunFormatting() || Document.DEFAULT_HEADING1_CONFIG.run),\n ...options?.heading1?.run,\n },\n paragraph: {\n ...(heading1?.getParagraphFormatting() || Document.DEFAULT_HEADING1_CONFIG.paragraph),\n ...options?.heading1?.paragraph,\n },\n };\n const h2Config = {\n run: {\n ...(heading2?.getRunFormatting() || Document.DEFAULT_HEADING2_CONFIG.run),\n ...options?.heading2?.run,\n },\n paragraph: {\n ...(heading2?.getParagraphFormatting() || Document.DEFAULT_HEADING2_CONFIG.paragraph),\n ...options?.heading2?.paragraph,\n },\n tableOptions: {\n ...Document.DEFAULT_HEADING2_CONFIG.tableOptions,\n ...options?.heading2?.tableOptions,\n },\n };\n const h3Config = {\n run: {\n ...(heading3?.getRunFormatting() || Document.DEFAULT_HEADING3_CONFIG.run),\n ...options?.heading3?.run,\n },\n paragraph: {\n ...(heading3?.getParagraphFormatting() || Document.DEFAULT_HEADING3_CONFIG.paragraph),\n ...options?.heading3?.paragraph,\n },\n };\n const normalConfig = {\n run: {\n ...(normal?.getRunFormatting() || Document.DEFAULT_NORMAL_CONFIG.run),\n ...options?.normal?.run,\n },\n paragraph: {\n ...(normal?.getParagraphFormatting() || Document.DEFAULT_NORMAL_CONFIG.paragraph),\n ...options?.normal?.paragraph,\n },\n };\n const listParaConfig = {\n run: {\n ...(listParagraph?.getRunFormatting() || Document.DEFAULT_LIST_PARAGRAPH_CONFIG.run),\n ...options?.listParagraph?.run,\n },\n paragraph: {\n ...(listParagraph?.getParagraphFormatting() ||\n Document.DEFAULT_LIST_PARAGRAPH_CONFIG.paragraph),\n ...options?.listParagraph?.paragraph,\n },\n };\n\n // Extract preserve blank lines option (defaults to true)\n const preserveBlankLines = options?.preserveBlankLinesAfterHeading2Tables ?? true;\n\n // Modify Heading1 definition\n if (heading1 && h1Config.run && h1Config.paragraph) {\n if (h1Config.run) heading1.setRunFormatting(h1Config.run);\n if (h1Config.paragraph) heading1.setParagraphFormatting(h1Config.paragraph);\n // Mark style as modified so it gets included in mergeStylesWithOriginal()\n this.addStyle(heading1);\n results.heading1 = true;\n }\n\n // Modify Heading2 definition\n if (heading2 && h2Config.run && h2Config.paragraph) {\n if (h2Config.run) heading2.setRunFormatting(h2Config.run);\n if (h2Config.paragraph) heading2.setParagraphFormatting(h2Config.paragraph);\n // Mark style as modified so it gets included in mergeStylesWithOriginal()\n this.addStyle(heading2);\n results.heading2 = true;\n }\n\n // Modify Heading3 definition\n if (heading3 && h3Config.run && h3Config.paragraph) {\n if (h3Config.run) heading3.setRunFormatting(h3Config.run);\n if (h3Config.paragraph) heading3.setParagraphFormatting(h3Config.paragraph);\n // Mark style as modified so it gets included in mergeStylesWithOriginal()\n this.addStyle(heading3);\n results.heading3 = true;\n }\n\n // Modify Normal definition\n if (normal && normalConfig.run && normalConfig.paragraph) {\n if (normalConfig.run) normal.setRunFormatting(normalConfig.run);\n if (normalConfig.paragraph) normal.setParagraphFormatting(normalConfig.paragraph);\n // Mark style as modified so it gets included in mergeStylesWithOriginal()\n this.addStyle(normal);\n\n // Link NormalWeb to Normal (if enabled and NormalWeb exists)\n // Default is true - changes to Normal automatically apply to NormalWeb\n const shouldLinkNormalWeb = options?.linkNormalWebToNormal !== false;\n if (shouldLinkNormalWeb) {\n const normalWeb = this.stylesManager.getStyle('NormalWeb');\n if (normalWeb) {\n // Apply same formatting to NormalWeb\n if (normalConfig.run) normalWeb.setRunFormatting(normalConfig.run);\n if (normalConfig.paragraph) normalWeb.setParagraphFormatting(normalConfig.paragraph);\n // Mark as modified for selective merging during save\n this.addStyle(normalWeb);\n }\n }\n\n results.normal = true;\n }\n\n // Modify List Paragraph definition\n if (listParagraph && listParaConfig.run && listParaConfig.paragraph) {\n if (listParaConfig.run) listParagraph.setRunFormatting(listParaConfig.run);\n if (listParaConfig.paragraph) {\n // Validate indentation: hanging must not exceed left to prevent negative bullet position\n const indent = listParaConfig.paragraph.indentation;\n if (indent?.hanging !== undefined && indent?.left !== undefined) {\n if (indent.hanging > indent.left) {\n const logger = getGlobalLogger();\n logger.warn(\n `[Document] ListParagraph indentation: hanging (${indent.hanging}) > left (${indent.left}). ` +\n `Capping hanging to left to prevent negative bullet position.`\n );\n indent.hanging = indent.left;\n }\n }\n listParagraph.setParagraphFormatting(listParaConfig.paragraph);\n }\n // Mark style as modified so it gets included in mergeStylesWithOriginal()\n this.addStyle(listParagraph);\n results.listParagraph = true;\n }\n\n // Extract preserve flags from configurations\n const h1Preserve = {\n bold: h1Config.run?.preserveBold ?? false,\n italic: h1Config.run?.preserveItalic ?? false,\n underline: h1Config.run?.preserveUnderline ?? false,\n };\n const h2Preserve = {\n bold: h2Config.run?.preserveBold ?? false,\n italic: h2Config.run?.preserveItalic ?? false,\n underline: h2Config.run?.preserveUnderline ?? false,\n };\n const h3Preserve = {\n bold: h3Config.run?.preserveBold ?? false,\n italic: h3Config.run?.preserveItalic ?? false,\n underline: h3Config.run?.preserveUnderline ?? false,\n };\n const normalPreserve = {\n bold: normalConfig.run?.preserveBold ?? true,\n italic: normalConfig.run?.preserveItalic ?? false,\n underline: normalConfig.run?.preserveUnderline ?? false,\n };\n const listParaPreserve = {\n bold: listParaConfig.run?.preserveBold ?? true,\n italic: listParaConfig.run?.preserveItalic ?? false,\n underline: listParaConfig.run?.preserveUnderline ?? false,\n };\n\n // Clear direct formatting from affected paragraphs and wrap Heading2 in tables\n // Use a Set to track processed paragraphs and prevent duplicate wrapping\n const processedParagraphs = new Set<Paragraph>();\n\n // Get all paragraphs ONCE before modifications to prevent processing duplicates\n const allParas = this.getAllParagraphs();\n\n for (const para of allParas) {\n // Skip if already processed\n if (processedParagraphs.has(para)) {\n continue;\n }\n\n const styleId = para.getStyle();\n\n // Process Heading1 paragraphs\n if (styleId === 'Heading1' && heading1) {\n // Save white font status BEFORE clearing (clearDirectFormattingConflicts clears color)\n const allRuns = this.getAllRunsFromParagraph(para);\n const whiteFontRuns = new Set(\n options?.preserveWhiteFont\n ? allRuns.filter((run) => run.getColor()?.toUpperCase() === 'FFFFFF')\n : []\n );\n\n para.clearDirectFormattingConflicts(heading1);\n\n // Apply formatting to all runs (including those in revisions/hyperlinks), respecting preserve flags\n for (const run of allRuns) {\n // Skip runs with Hyperlink style - preserve their blue color and underline\n if (run.isHyperlinkStyled()) {\n continue;\n }\n if (!h1Preserve.bold) {\n run.setBold(h1Config.run?.bold ?? false);\n }\n if (!h1Preserve.italic) {\n run.setItalic(h1Config.run?.italic ?? false);\n }\n if (!h1Preserve.underline) {\n run.setUnderline(h1Config.run?.underline ? 'single' : false);\n }\n // Apply font, color, and size - skip color if run was white font\n if (h1Config.run?.font) {\n run.setFont(h1Config.run.font);\n }\n if (h1Config.run?.color !== undefined) {\n if (whiteFontRuns.has(run)) {\n // Restore white font\n run.setColor('FFFFFF');\n } else {\n run.setColor(h1Config.run.color);\n }\n }\n if (h1Config.run?.size) {\n run.setSize(h1Config.run.size);\n }\n }\n\n // Update paragraph mark properties to match configuration\n if (para.formatting.paragraphMarkRunProperties) {\n const markProps = para.formatting.paragraphMarkRunProperties;\n if (!h1Preserve.bold && h1Config.run?.bold === false && markProps.bold) {\n delete markProps.bold;\n }\n if (!h1Preserve.italic && h1Config.run?.italic === false && markProps.italic) {\n delete markProps.italic;\n }\n if (!h1Preserve.underline && h1Config.run?.underline === false && markProps.underline) {\n delete markProps.underline;\n }\n // Update paragraph mark font, color, size\n if (h1Config.run?.font) {\n markProps.font = h1Config.run.font;\n }\n if (h1Config.run?.color) {\n markProps.color = h1Config.run.color;\n }\n if (h1Config.run?.size) {\n markProps.size = h1Config.run.size;\n }\n }\n\n processedParagraphs.add(para);\n }\n\n // Process Heading2 paragraphs\n else if (styleId === 'Heading2' && heading2) {\n // Check if paragraph has actual text content (skip empty paragraphs)\n const hasContent = this.getAllRunsFromParagraph(para).some(\n (run) => run.getText().trim().length > 0\n );\n\n if (!hasContent) {\n // Skip empty Heading2 paragraphs - don't wrap them in tables\n processedParagraphs.add(para);\n continue;\n }\n\n // Check if paragraph is in a table FIRST (need this info for alignment preservation)\n const { inTable, cell } = this.isParagraphInTable(para);\n\n // Preserve alignment for shaded cells in multi-cell tables\n // Centering should not be cleared by clearDirectFormattingConflicts()\n let preservedAlignment: typeof para.formatting.alignment = undefined;\n\n if (inTable && cell) {\n // Find the table to check if it's > 1x1\n const table = this.getAllTables().find((t) => {\n for (const row of t.getRows()) {\n for (const c of row.getCells()) {\n if (c === cell) return true;\n }\n }\n return false;\n });\n\n // Preserve alignment for shaded cells in multi-cell tables\n if (table) {\n const rowCount = table.getRowCount();\n const colCount = table.getColumnCount();\n const isMultiCellTable = !(rowCount === 1 && colCount === 1);\n const cellFormatting = cell.getFormatting();\n const cellHasShading = !!(\n cellFormatting?.shading?.fill || cellFormatting?.shading?.pattern\n );\n\n if (isMultiCellTable && cellHasShading && para.formatting.alignment) {\n preservedAlignment = para.formatting.alignment;\n }\n }\n }\n\n // Save white font status BEFORE clearing (clearDirectFormattingConflicts clears color)\n const allRuns = this.getAllRunsFromParagraph(para);\n const whiteFontRuns = new Set(\n options?.preserveWhiteFont\n ? allRuns.filter((run) => run.getColor()?.toUpperCase() === 'FFFFFF')\n : []\n );\n\n // Clear direct formatting\n para.clearDirectFormattingConflicts(heading2);\n\n // Restore preserved alignment\n if (preservedAlignment) {\n para.setAlignment(preservedAlignment);\n }\n\n // Apply formatting to all runs (including those in revisions/hyperlinks), respecting preserve flags\n for (const run of allRuns) {\n // Skip runs with Hyperlink style - preserve their blue color and underline\n if (run.isHyperlinkStyled()) {\n continue;\n }\n if (!h2Preserve.bold) {\n run.setBold(h2Config.run?.bold ?? false);\n }\n if (!h2Preserve.italic) {\n run.setItalic(h2Config.run?.italic ?? false);\n }\n if (!h2Preserve.underline) {\n run.setUnderline(h2Config.run?.underline ? 'single' : false);\n }\n // Apply font, color, and size - skip color if run was white font\n if (h2Config.run?.font) {\n run.setFont(h2Config.run.font);\n }\n if (h2Config.run?.color !== undefined) {\n if (whiteFontRuns.has(run)) {\n // Restore white font\n run.setColor('FFFFFF');\n } else {\n run.setColor(h2Config.run.color);\n }\n }\n if (h2Config.run?.size) {\n run.setSize(h2Config.run.size);\n }\n }\n\n // Update paragraph mark properties to match configuration\n if (para.formatting.paragraphMarkRunProperties) {\n const markProps = para.formatting.paragraphMarkRunProperties;\n if (!h2Preserve.bold && h2Config.run?.bold === false && markProps.bold) {\n delete markProps.bold;\n }\n if (!h2Preserve.italic && h2Config.run?.italic === false && markProps.italic) {\n delete markProps.italic;\n }\n if (!h2Preserve.underline && h2Config.run?.underline === false && markProps.underline) {\n delete markProps.underline;\n }\n // Update paragraph mark font, color, size\n if (h2Config.run?.font) {\n markProps.font = h2Config.run.font;\n }\n if (h2Config.run?.color) {\n markProps.color = h2Config.run.color;\n }\n if (h2Config.run?.size) {\n markProps.size = h2Config.run.size;\n }\n }\n\n if (inTable && cell) {\n // Paragraph is already in a table - apply cell formatting using config\n if (h2Config.tableOptions?.shading) {\n cell.setShading({ fill: h2Config.tableOptions.shading });\n }\n if (\n h2Config.tableOptions?.marginTop !== undefined ||\n h2Config.tableOptions?.marginBottom !== undefined ||\n h2Config.tableOptions?.marginLeft !== undefined ||\n h2Config.tableOptions?.marginRight !== undefined\n ) {\n cell.setMargins({\n top: h2Config.tableOptions.marginTop ?? 0,\n bottom: h2Config.tableOptions.marginBottom ?? 0,\n left: h2Config.tableOptions.marginLeft ?? 115,\n right: h2Config.tableOptions.marginRight ?? 115,\n });\n }\n\n // Set table width using config\n if (h2Config.tableOptions?.tableWidthPercent) {\n const table = this.getAllTables().find((t) => {\n for (const row of t.getRows()) {\n for (const c of row.getCells()) {\n if (c === cell) return true;\n }\n }\n return false;\n });\n if (table) {\n table.setWidth(h2Config.tableOptions.tableWidthPercent);\n table.setWidthType('pct');\n }\n }\n } else {\n // Paragraph is not in a table - wrap it using config\n const table = this.wrapParagraphInTable(para, {\n shading: h2Config.tableOptions?.shading ?? 'BFBFBF',\n marginTop: h2Config.tableOptions?.marginTop ?? 0,\n marginBottom: h2Config.tableOptions?.marginBottom ?? 0,\n marginLeft: h2Config.tableOptions?.marginLeft ?? 115,\n marginRight: h2Config.tableOptions?.marginRight ?? 115,\n tableWidthPercent: h2Config.tableOptions?.tableWidthPercent ?? 5000,\n });\n\n // Add blank paragraph after table for spacing (only if not already present)\n const tableIndex = this.bodyElements.indexOf(table);\n if (tableIndex !== -1) {\n // Check if the next element has any content (text, hyperlinks, images, etc.)\n const nextElement = this.bodyElements[tableIndex + 1];\n\n // Check if next element is truly blank (no content at all)\n const isNextElementBlank = (() => {\n if (!(nextElement instanceof Paragraph)) return false;\n\n const content = nextElement.getContent();\n if (!content || content.length === 0) return true;\n\n // Check if all content items are empty\n for (const item of content) {\n // Hyperlinks count as content\n if (item instanceof Hyperlink) {\n return false;\n }\n // Images count as content (check for Image class when implemented)\n // Runs with text count as content\n if ((item as any).getText) {\n const text = (item as any).getText().trim();\n if (text !== '') return false;\n }\n }\n\n return true; // All content is empty\n })();\n\n // Only add blank paragraph if next element is truly blank or doesn't exist\n if (!isNextElementBlank) {\n const blankPara = Paragraph.create();\n // Add explicit spacing to ensure visibility in Word (120 twips = 6pt)\n blankPara.setSpaceAfter(120);\n // Mark as preserved if option is enabled (defaults to true)\n if (preserveBlankLines) {\n blankPara.setPreserved(true);\n }\n this.bodyElements.splice(tableIndex + 1, 0, blankPara);\n }\n }\n }\n\n processedParagraphs.add(para);\n }\n\n // Process Heading3 paragraphs\n else if (styleId === 'Heading3' && heading3) {\n // Save white font status BEFORE clearing (clearDirectFormattingConflicts clears color)\n const allRuns = this.getAllRunsFromParagraph(para);\n const whiteFontRuns = new Set(\n options?.preserveWhiteFont\n ? allRuns.filter((run) => run.getColor()?.toUpperCase() === 'FFFFFF')\n : []\n );\n\n para.clearDirectFormattingConflicts(heading3);\n\n // Apply formatting to all runs (including those in revisions/hyperlinks), respecting preserve flags\n for (const run of allRuns) {\n // Skip runs with Hyperlink style - preserve their blue color and underline\n if (run.isHyperlinkStyled()) {\n continue;\n }\n if (!h3Preserve.bold) {\n run.setBold(h3Config.run?.bold ?? false);\n }\n if (!h3Preserve.italic) {\n run.setItalic(h3Config.run?.italic ?? false);\n }\n if (!h3Preserve.underline) {\n run.setUnderline(h3Config.run?.underline ? 'single' : false);\n }\n // Apply font, color, and size - skip color if run was white font\n if (h3Config.run?.font) {\n run.setFont(h3Config.run.font);\n }\n if (h3Config.run?.color !== undefined) {\n if (whiteFontRuns.has(run)) {\n // Restore white font\n run.setColor('FFFFFF');\n } else {\n run.setColor(h3Config.run.color);\n }\n }\n if (h3Config.run?.size) {\n run.setSize(h3Config.run.size);\n }\n }\n\n // Update paragraph mark properties to match configuration\n if (para.formatting.paragraphMarkRunProperties) {\n const markProps = para.formatting.paragraphMarkRunProperties;\n if (!h3Preserve.bold && h3Config.run?.bold === false && markProps.bold) {\n delete markProps.bold;\n }\n if (!h3Preserve.italic && h3Config.run?.italic === false && markProps.italic) {\n delete markProps.italic;\n }\n if (!h3Preserve.underline && h3Config.run?.underline === false && markProps.underline) {\n delete markProps.underline;\n }\n // Update paragraph mark font, color, size\n if (h3Config.run?.font) {\n markProps.font = h3Config.run.font;\n }\n if (h3Config.run?.color) {\n markProps.color = h3Config.run.color;\n }\n if (h3Config.run?.size) {\n markProps.size = h3Config.run.size;\n }\n }\n\n processedParagraphs.add(para);\n }\n\n // Process List Paragraph paragraphs\n else if (styleId === 'ListParagraph' && listParagraph) {\n // Check for mis-styled paragraphs: ListParagraph + left:0 + no numbering\n // These are not actual list items - change them to Normal style\n const paraIndentation = para.getFormatting().indentation;\n const hasNumbering = para.getNumbering();\n if (paraIndentation?.left === 0 && !hasNumbering) {\n // This paragraph has ListParagraph style but explicitly overrides indent to 0\n // and has no numbering - it should be Normal style, not ListParagraph\n para.setStyle('Normal');\n\n // Preserve existing bold formatting and white font before applying Normal style\n const allRuns = this.getAllRunsFromParagraph(para);\n const preservedBold = allRuns.map((run) => ({\n run,\n bold: run.getBold(),\n isWhiteFont: options?.preserveWhiteFont && run.getColor()?.toUpperCase() === 'FFFFFF',\n }));\n\n // Process as Normal style - skip ListParagraph processing\n if (normal) {\n para.clearDirectFormattingConflicts(normal);\n for (const saved of preservedBold) {\n const run = saved.run;\n // Apply Normal style formatting\n if (normalConfig.run?.font) {\n run.setFont(normalConfig.run.font);\n }\n if (normalConfig.run?.color !== undefined) {\n if (saved.isWhiteFont) {\n // Restore white font\n run.setColor('FFFFFF');\n } else {\n run.setColor(normalConfig.run.color);\n }\n }\n if (normalConfig.run?.size && normalConfig.run?.font) {\n run.setFont(normalConfig.run.font, normalConfig.run.size);\n }\n }\n }\n\n // Restore bold formatting that was present before conversion\n for (const saved of preservedBold) {\n if (saved.bold) {\n saved.run.setBold(true);\n }\n }\n\n processedParagraphs.add(para);\n continue;\n }\n\n // Save formatting that should be preserved BEFORE clearing\n const allRuns = this.getAllRunsFromParagraph(para);\n const preservedFormatting = allRuns.map((run) => {\n const fmt = run.getFormatting();\n return {\n run: run,\n bold: listParaPreserve.bold ? fmt.bold : undefined,\n italic: listParaPreserve.italic ? fmt.italic : undefined,\n underline: listParaPreserve.underline ? fmt.underline : undefined,\n isWhiteFont: options?.preserveWhiteFont && fmt.color?.toUpperCase() === 'FFFFFF',\n };\n });\n\n para.clearDirectFormattingConflicts(listParagraph);\n\n // Restore preserved formatting AFTER clearing\n for (const saved of preservedFormatting) {\n if (saved.bold !== undefined) {\n saved.run.setBold(saved.bold);\n }\n if (saved.italic !== undefined) {\n saved.run.setItalic(saved.italic);\n }\n if (saved.underline !== undefined) {\n saved.run.setUnderline(saved.underline);\n }\n }\n\n // Apply formatting to all runs (including those in revisions/hyperlinks), respecting preserve flags\n for (const saved of preservedFormatting) {\n const run = saved.run;\n // Skip runs with Hyperlink style - preserve their blue color and underline\n if (run.isHyperlinkStyled()) {\n continue;\n }\n if (!listParaPreserve.bold) {\n run.setBold(listParaConfig.run?.bold ?? false);\n }\n if (!listParaPreserve.italic) {\n run.setItalic(listParaConfig.run?.italic ?? false);\n }\n if (!listParaPreserve.underline) {\n run.setUnderline(listParaConfig.run?.underline ? 'single' : false);\n }\n // Apply font, color, and size - skip color if run was white font\n if (listParaConfig.run?.font) {\n run.setFont(listParaConfig.run.font);\n }\n if (listParaConfig.run?.color !== undefined) {\n if (saved.isWhiteFont) {\n // Restore white font\n run.setColor('FFFFFF');\n } else {\n run.setColor(listParaConfig.run.color);\n }\n }\n if (listParaConfig.run?.size) {\n run.setSize(listParaConfig.run.size);\n }\n }\n\n // Update paragraph mark properties to match configuration\n if (para.formatting.paragraphMarkRunProperties) {\n const markProps = para.formatting.paragraphMarkRunProperties;\n if (!listParaPreserve.bold && listParaConfig.run?.bold === false && markProps.bold) {\n delete markProps.bold;\n }\n if (\n !listParaPreserve.italic &&\n listParaConfig.run?.italic === false &&\n markProps.italic\n ) {\n delete markProps.italic;\n }\n if (\n !listParaPreserve.underline &&\n listParaConfig.run?.underline === false &&\n markProps.underline\n ) {\n delete markProps.underline;\n }\n // Update paragraph mark font, color, size\n if (listParaConfig.run?.font) {\n markProps.font = listParaConfig.run.font;\n }\n if (listParaConfig.run?.color) {\n markProps.color = listParaConfig.run.color;\n }\n if (listParaConfig.run?.size) {\n markProps.size = listParaConfig.run.size;\n }\n }\n\n processedParagraphs.add(para);\n }\n\n // Process Normal paragraphs (including undefined style which defaults to Normal)\n // Also process NormalWeb paragraphs when linkNormalWebToNormal is enabled (default: true)\n else if (\n (styleId === 'Normal' ||\n styleId === undefined ||\n (styleId === 'NormalWeb' && options?.linkNormalWebToNormal !== false)) &&\n normal\n ) {\n // Save formatting that should be preserved BEFORE clearing\n const allRuns = this.getAllRunsFromParagraph(para);\n const preservedFormatting = allRuns.map((run) => {\n const fmt = run.getFormatting();\n return {\n run: run,\n bold: normalPreserve.bold ? fmt.bold : undefined,\n italic: normalPreserve.italic ? fmt.italic : undefined,\n underline: normalPreserve.underline ? fmt.underline : undefined,\n isWhiteFont: options?.preserveWhiteFont && fmt.color?.toUpperCase() === 'FFFFFF',\n };\n });\n\n // Save center alignment BEFORE clearing if preserveCenterAlignment is set\n const savedCenterAlignment =\n options?.normal?.preserveCenterAlignment && para.getAlignment() === 'center';\n\n para.clearDirectFormattingConflicts(normal);\n\n // Restore center alignment if it was saved\n if (savedCenterAlignment) {\n para.setAlignment('center');\n }\n\n // Restore preserved formatting AFTER clearing\n for (const saved of preservedFormatting) {\n if (saved.bold !== undefined) {\n saved.run.setBold(saved.bold);\n }\n if (saved.italic !== undefined) {\n saved.run.setItalic(saved.italic);\n }\n if (saved.underline !== undefined) {\n saved.run.setUnderline(saved.underline);\n }\n }\n\n // Apply formatting to all runs (including those in revisions/hyperlinks), respecting preserve flags\n for (const saved of preservedFormatting) {\n const run = saved.run;\n // Skip runs with Hyperlink style - preserve their blue color and underline\n if (run.isHyperlinkStyled()) {\n continue;\n }\n if (!normalPreserve.bold) {\n run.setBold(normalConfig.run?.bold ?? false);\n }\n if (!normalPreserve.italic) {\n run.setItalic(normalConfig.run?.italic ?? false);\n }\n if (!normalPreserve.underline) {\n run.setUnderline(normalConfig.run?.underline ? 'single' : false);\n }\n // Apply font, color, and size - skip color if run was white font\n if (normalConfig.run?.font) {\n run.setFont(normalConfig.run.font);\n }\n if (normalConfig.run?.color !== undefined) {\n // Use saved isWhiteFont flag since color was cleared by clearDirectFormattingConflicts\n if (!saved.isWhiteFont) {\n run.setColor(normalConfig.run.color);\n } else {\n // Restore white font\n run.setColor('FFFFFF');\n }\n }\n if (normalConfig.run?.size) {\n run.setSize(normalConfig.run.size);\n }\n }\n\n // Update paragraph mark properties to match configuration\n if (para.formatting.paragraphMarkRunProperties) {\n const markProps = para.formatting.paragraphMarkRunProperties;\n if (!normalPreserve.bold && normalConfig.run?.bold === false && markProps.bold) {\n delete markProps.bold;\n }\n if (!normalPreserve.italic && normalConfig.run?.italic === false && markProps.italic) {\n delete markProps.italic;\n }\n if (\n !normalPreserve.underline &&\n normalConfig.run?.underline === false &&\n markProps.underline\n ) {\n delete markProps.underline;\n }\n // Update paragraph mark font, color, size\n if (normalConfig.run?.font) {\n markProps.font = normalConfig.run.font;\n }\n if (normalConfig.run?.color) {\n markProps.color = normalConfig.run.color;\n }\n if (normalConfig.run?.size) {\n markProps.size = normalConfig.run.size;\n }\n }\n\n processedParagraphs.add(para);\n }\n }\n\n return results;\n }\n\n /**\n * Formats all TOC (Table of Contents) entry styles with the specified formatting.\n * Creates TOC 1-9 styles if they don't exist in the document.\n *\n * When Word updates a TOC field, it looks for these styles in styles.xml and\n * applies them to the generated entries. This method allows you to pre-define\n * how TOC entries will appear.\n *\n * @param options - Formatting options for TOC entries\n * @param options.run - Run (character) formatting to apply\n * @param options.paragraph - Paragraph formatting to apply\n * @param options.levels - Which TOC levels to format (default: 1-9)\n * @param options.indentPerLevel - Relative indentation in twips per level position.\n * When set, the first level in the sorted `levels` array gets 0 indent, the second\n * gets `indentPerLevel`, the third gets `2 * indentPerLevel`, etc. This is useful\n * when the TOC only includes a subset of heading levels (e.g., 2-4) so the first\n * visible level is flush-left. Overrides `paragraph.indentation.left` if both are set.\n * @returns Object indicating which levels were formatted\n *\n * @example\n * ```typescript\n * // Format all TOC entries with consistent styling\n * doc.formatTOCStyles({\n * run: {\n * font: 'Verdana',\n * size: 12,\n * color: '0000FF', // Blue\n * underline: true,\n * bold: false,\n * italic: false\n * },\n * paragraph: {\n * spacing: { before: 0, after: 0 } // 0pt spacing\n * }\n * });\n *\n * // Format only first 3 levels\n * doc.formatTOCStyles({\n * run: { font: 'Arial', size: 11 },\n * levels: [1, 2, 3]\n * });\n *\n * // Relative indentation: Heading 2-4 -> TOC2=0, TOC3=360, TOC4=720\n * doc.formatTOCStyles({\n * run: { font: 'Verdana', size: 12 },\n * levels: [2, 3, 4],\n * indentPerLevel: 360,\n * });\n * ```\n */\n formatTOCStyles(options: {\n run?: StyleRunFormatting;\n paragraph?: StyleParagraphFormatting;\n levels?: number[];\n indentPerLevel?: number;\n }): { formatted: number[] } {\n // Filter valid levels, deduplicate, and sort\n const validLevels = (options.levels ?? [1, 2, 3, 4, 5, 6, 7, 8, 9]).filter(\n (l) => l >= 1 && l <= 9\n );\n const levels = [...new Set(validLevels)].sort((a, b) => a - b);\n const formatted: number[] = [];\n\n for (let i = 0; i < levels.length; i++) {\n const level = levels[i]!;\n const styleId = `TOC${level}`;\n\n // When indentPerLevel is defined, compute relative indent based on position\n let paragraphOverride = options.paragraph;\n if (options.indentPerLevel !== undefined) {\n const relativeIndent = i * options.indentPerLevel;\n paragraphOverride = {\n ...options.paragraph,\n indentation: {\n ...options.paragraph?.indentation,\n left: relativeIndent,\n },\n };\n }\n\n let tocStyle = this.stylesManager.getStyle(styleId);\n\n if (!tocStyle) {\n // Create TOC style if it doesn't exist\n tocStyle = Style.createTOCStyle(level, {\n run: options.run,\n paragraph: paragraphOverride,\n });\n this.addStyle(tocStyle);\n } else {\n // Update existing style\n if (options.run) tocStyle.setRunFormatting(options.run);\n if (paragraphOverride) tocStyle.setParagraphFormatting(paragraphOverride);\n this.addStyle(tocStyle); // Mark as modified\n }\n\n formatted.push(level);\n }\n\n return { formatted };\n }\n\n /**\n * Helper function to apply formatting from Style objects\n *\n * This is a convenience wrapper that accepts Style objects, extracts their properties,\n * and converts them to configuration format before calling {@link applyStyles}.\n *\n * Style objects are matched by their styleId property:\n * - 'Heading1' → applies to Heading1 style\n * - 'Heading2' → applies to Heading2 style (with optional table options)\n * - 'Heading3' → applies to Heading3 style\n * - 'Normal' → applies to Normal style\n * - 'ListParagraph' → applies to List Paragraph style\n *\n * Other styleIds are ignored.\n *\n * @param styles - Variable number of Style objects to apply\n * @returns Object indicating which styles were successfully modified\n *\n * @example\n * // Create Style objects with your desired formatting\n * const h1 = new Style({\n * styleId: 'Heading1',\n * name: 'Heading 1',\n * type: 'paragraph',\n * runFormatting: { font: 'Arial', size: 16, bold: true },\n * paragraphFormatting: { spacing: { before: 0, after: 200 } }\n * });\n *\n * const h2 = Style.createHeadingStyle(2);\n * h2.setRunFormatting({ font: 'Arial', size: 14, bold: true });\n * h2.setHeading2TableOptions({ shading: '808080', marginLeft: 150, marginRight: 150 });\n *\n * // Apply to document\n * doc.applyStylesFromObjects(h1, h2);\n *\n * @example\n * // Just modify one style\n * const myNormal = new Style({\n * styleId: 'Normal',\n * name: 'Normal',\n * type: 'paragraph',\n * runFormatting: { font: 'Times New Roman', size: 12 }\n * });\n * doc.applyStylesFromObjects(myNormal);\n */\n public applyStylesFromObjects(...styles: Style[]): {\n heading1: boolean;\n heading2: boolean;\n heading3: boolean;\n normal: boolean;\n listParagraph: boolean;\n } {\n // Convert Style objects to ApplyStylesOptions\n const options: ApplyStylesOptions = {};\n\n for (const style of styles) {\n const styleId = style.getStyleId();\n\n switch (styleId) {\n case 'Heading1':\n options.heading1 = {\n run: style.getRunFormatting() as any,\n paragraph: style.getParagraphFormatting() as any,\n };\n break;\n\n case 'Heading2':\n options.heading2 = {\n run: style.getRunFormatting() as any,\n paragraph: style.getParagraphFormatting() as any,\n tableOptions: style.getHeading2TableOptions(),\n };\n break;\n\n case 'Heading3':\n options.heading3 = {\n run: style.getRunFormatting() as any,\n paragraph: style.getParagraphFormatting() as any,\n };\n break;\n\n case 'Normal':\n options.normal = {\n run: style.getRunFormatting() as any,\n paragraph: style.getParagraphFormatting() as any,\n };\n break;\n\n case 'ListParagraph':\n options.listParagraph = {\n run: style.getRunFormatting() as any,\n paragraph: style.getParagraphFormatting() as any,\n };\n break;\n\n default:\n // Ignore styles with other styleIds\n break;\n }\n }\n\n // Call existing method with converted options\n return this.applyStyles(options);\n }\n\n /**\n * Updates shading colors in table style definitions in styles.xml.\n *\n * Table styles (e.g., GridTable4-Accent3) often have conditional formatting with\n * hardcoded shading values. When applying table uniformity with different shading\n * colors, the table style definitions should also be updated to match.\n *\n * This method finds all occurrences of `oldColor` in shading elements (`w:shd`)\n * within table styles and replaces them with `newColor`.\n *\n * @param oldColor - Hex color to find (e.g., \"A5A5A5\", without #)\n * @param newColor - Hex color to replace with (e.g., \"DFDFDF\", without #)\n * @returns Number of shading elements updated\n *\n * @example\n * ```typescript\n * // Update table style shading from gray to light gray\n * const updated = doc.updateTableStyleShading(\"A5A5A5\", \"DFDFDF\");\n * console.log(`Updated ${updated} shading definitions in styles.xml`);\n * ```\n */\n public updateTableStyleShading(oldColor: string, newColor: string): number {\n // Normalize colors (uppercase, no #)\n const normalizedOld = oldColor.replace('#', '').toUpperCase();\n const normalizedNew = newColor.replace('#', '').toUpperCase();\n\n if (normalizedOld === normalizedNew) {\n return 0; // No change needed\n }\n\n // Get current styles.xml\n let stylesXml = this.getStylesXml();\n if (!stylesXml) {\n return 0;\n }\n\n let updateCount = 0;\n\n // Pattern to match shading elements with fill attribute containing the old color\n // Matches: w:fill=\"A5A5A5\" (case-insensitive)\n const fillPattern = new RegExp(`(w:fill=[\"'])${normalizedOld}([\"'])`, 'gi');\n\n // Replace all occurrences\n stylesXml = stylesXml.replace(fillPattern, (match, prefix, suffix) => {\n updateCount++;\n return `${prefix}${normalizedNew}${suffix}`;\n });\n\n // Also handle color attribute in shading elements\n // Matches: w:color=\"A5A5A5\" within shd elements\n const colorPattern = new RegExp(`(<w:shd[^>]*w:color=[\"'])${normalizedOld}([\"'])`, 'gi');\n\n stylesXml = stylesXml.replace(colorPattern, (match, prefix, suffix) => {\n updateCount++;\n return `${prefix}${normalizedNew}${suffix}`;\n });\n\n // Only update if changes were made\n if (updateCount > 0) {\n this.setStylesXml(stylesXml);\n }\n\n return updateCount;\n }\n\n /**\n * Updates all table style conditional formatting shading to match given settings.\n *\n * This is a convenience method that updates common table style shading patterns.\n * It's useful when applying table uniformity to ensure table styles in styles.xml\n * match the shading colors being applied to individual cells.\n *\n * @param settings - Shading configuration\n * @param settings.headerShading - Shading color for header/accent cells (e.g., \"BFBFBF\")\n * @param settings.dataShading - Shading color for data cells (e.g., \"DFDFDF\")\n * @param settings.replaceColors - Optional array of old colors to replace (defaults to common grays)\n * @returns Total number of shading elements updated\n *\n * @example\n * ```typescript\n * // Update table styles to use consistent shading\n * const updated = doc.updateTableStyleShadingBulk({\n * headerShading: \"BFBFBF\",\n * dataShading: \"DFDFDF\",\n * replaceColors: [\"A5A5A5\", \"C0C0C0\", \"D9D9D9\"]\n * });\n * ```\n */\n public updateTableStyleShadingBulk(settings: {\n headerShading?: string;\n dataShading?: string;\n replaceColors?: string[];\n }): number {\n let totalUpdated = 0;\n\n // Default colors commonly used in table styles\n const defaultReplaceColors = ['A5A5A5', 'C0C0C0', 'D9D9D9', 'E7E6E6'];\n const colorsToReplace = settings.replaceColors || defaultReplaceColors;\n\n // Replace header-type colors with header shading\n if (settings.headerShading) {\n for (const oldColor of colorsToReplace) {\n totalUpdated += this.updateTableStyleShading(oldColor, settings.headerShading);\n }\n }\n\n // If data shading differs from header, apply it to lighter colors\n if (settings.dataShading && settings.dataShading !== settings.headerShading) {\n // Typically data cells use lighter shading\n const dataColors = ['D9D9D9', 'E7E6E6', 'F2F2F2'];\n for (const oldColor of dataColors) {\n totalUpdated += this.updateTableStyleShading(oldColor, settings.dataShading);\n }\n }\n\n return totalUpdated;\n }\n\n /**\n * Helper method to process consecutive blank paragraphs\n * @private\n */\n private processConsecutiveBlanks(\n blanks: Paragraph[],\n keepOne: boolean,\n toRemove: Paragraph[]\n ): void {\n if (blanks.length === 0) return;\n\n if (keepOne && blanks.length > 1) {\n // Keep the first one, remove the rest\n for (let i = 1; i < blanks.length; i++) {\n const blank = blanks[i];\n if (blank) {\n toRemove.push(blank);\n }\n }\n } else if (!keepOne) {\n // Remove all\n toRemove.push(...blanks);\n }\n // If keepOne is true and there's only 1 blank, don't remove it\n }\n\n /**\n * Standardizes all bullet list symbols formatting (font, size, bold, color)\n *\n * This helper ensures consistent bullet FORMATTING across all bullet lists in the document.\n * It modifies the numbering definitions (not individual paragraphs), preserving the actual\n * bullet symbols (•, ○, ▪, etc.) while standardizing their visual formatting.\n *\n * **Important**: This only affects the bullet symbol FORMATTING, not the symbol itself.\n * The actual bullet characters are preserved as they were originally defined.\n *\n * @param options Formatting options\n * @returns Statistics about lists updated\n *\n * @example\n * // Standardize all bullet symbols with defaults (Arial 12pt bold black)\n * const result = doc.standardizeBulletSymbols();\n * console.log(`Updated ${result.listsUpdated} bullet lists (${result.levelsModified} levels)`);\n *\n * @example\n * // Custom formatting for bullet symbols\n * const result = doc.standardizeBulletSymbols({\n * bold: true,\n * fontSize: 28, // 14pt\n * color: 'FF0000', // Red\n * font: 'Calibri'\n * });\n */\n public standardizeBulletSymbols(options?: {\n bold?: boolean;\n fontSize?: number;\n color?: string;\n font?: string;\n }): {\n listsUpdated: number;\n levelsModified: number;\n } {\n const {\n bold = false,\n fontSize = 24, // 12pt\n color = '000000',\n font = 'Arial',\n } = options || {};\n\n let listsUpdated = 0;\n let levelsModified = 0;\n\n const instances = this.numberingManager.getAllInstances();\n\n for (const instance of instances) {\n const abstractNumId = instance.getAbstractNumId();\n const abstractNum = this.numberingManager.getAbstractNumbering(abstractNumId);\n\n if (!abstractNum) continue;\n\n // Only process bullet lists (skip numbered lists)\n const level0 = abstractNum.getLevel(0);\n if (level0?.getFormat() !== 'bullet') continue;\n\n // Update all 9 levels (0-8) with formatting only (preserve existing symbols)\n for (let levelIndex = 0; levelIndex < 9; levelIndex++) {\n const numLevel = abstractNum.getLevel(levelIndex);\n if (!numLevel) continue;\n\n // Only set formatting - do NOT change the bullet symbol itself\n numLevel.setFont(font);\n numLevel.setFontSize(fontSize);\n numLevel.setBold(bold);\n numLevel.setColor(color);\n\n levelsModified++;\n }\n\n listsUpdated++;\n }\n\n return { listsUpdated, levelsModified };\n }\n\n /**\n * Standardizes numbered list prefixes (1., a., i., etc.) to Verdana 12pt bold black\n *\n * This only affects the prefix/number formatting, not the text content after it.\n * It modifies the numbering definitions in the document while preserving the\n * numbering format type (decimal, roman, letter, etc.).\n *\n * **Important**: This updates the visual formatting of prefixes like \"1.\", \"a.\", \"i.\"\n * but does not change the numbering type itself.\n *\n * @param options Formatting options\n * @returns Statistics about lists updated\n *\n * @example\n * // Standardize all numbered list prefixes with defaults (Verdana 12pt bold black)\n * const result = doc.standardizeNumberedListPrefixes();\n * console.log(`Updated ${result.listsUpdated} numbered lists (${result.levelsModified} levels)`);\n *\n * @example\n * // Custom formatting for numbered list prefixes\n * const result = doc.standardizeNumberedListPrefixes({\n * bold: true,\n * fontSize: 24,\n * color: '000000',\n * font: 'Verdana'\n * });\n */\n public standardizeNumberedListPrefixes(options?: {\n bold?: boolean;\n fontSize?: number;\n color?: string;\n font?: string;\n }): {\n listsUpdated: number;\n levelsModified: number;\n } {\n const {\n bold = false,\n fontSize = 24, // 12pt\n color = '000000',\n font = 'Verdana',\n } = options || {};\n\n let listsUpdated = 0;\n let levelsModified = 0;\n\n const instances = this.numberingManager.getAllInstances();\n\n for (const instance of instances) {\n const abstractNumId = instance.getAbstractNumId();\n const abstractNum = this.numberingManager.getAbstractNumbering(abstractNumId);\n\n if (!abstractNum) continue;\n\n // Only process numbered lists (skip bullet lists)\n const level0 = abstractNum.getLevel(0);\n if (!level0 || level0.getFormat() === 'bullet') continue;\n\n // Update all 9 levels (0-8)\n for (let levelIndex = 0; levelIndex < 9; levelIndex++) {\n const numLevel = abstractNum.getLevel(levelIndex);\n if (!numLevel) continue;\n\n numLevel.setFont(font);\n numLevel.setFontSize(fontSize);\n numLevel.setBold(bold);\n numLevel.setColor(color);\n\n levelsModified++;\n }\n\n listsUpdated++;\n }\n\n return { listsUpdated, levelsModified };\n }\n\n /**\n * Standardizes all hyperlinks in the document to Verdana 12pt blue (#0000FF) underline\n *\n * This applies consistent formatting to all hyperlinks throughout the document,\n * including those in tables. The method preserves the hyperlink URLs and text\n * while updating only the visual formatting.\n *\n * @param options Formatting options\n * @returns Number of hyperlinks updated\n *\n * @example\n * // Use default formatting (Verdana 12pt blue underline)\n * const count = doc.standardizeAllHyperlinks();\n * console.log(`Standardized ${count} hyperlinks`);\n *\n * @example\n * // Custom hyperlink formatting\n * const count = doc.standardizeAllHyperlinks({\n * font: 'Arial',\n * size: 11,\n * color: 'FF0000', // Red\n * underline: true\n * });\n */\n public standardizeAllHyperlinks(options?: {\n font?: string;\n size?: number;\n color?: string;\n underline?: boolean;\n }): number {\n const { font = 'Verdana', size = 12, color = '0000FF', underline = true } = options || {};\n\n const hyperlinks = this.getHyperlinks();\n\n for (const { hyperlink } of hyperlinks) {\n hyperlink.setFormatting({\n font: font,\n size: size,\n color: color,\n underline: underline ? 'single' : false,\n });\n }\n\n return hyperlinks.length;\n }\n\n /**\n * Applies Heading 1 style to paragraphs with H1-like style names\n * @param options Optional style application options\n * @returns Number of paragraphs updated\n * @example\n * ```typescript\n * // Simple usage\n * doc.applyH1();\n *\n * // With custom formatting\n * doc.applyH1({\n * format: { font: 'Arial', size: 18, emphasis: ['bold'] }\n * });\n *\n * // Preserve specific properties\n * doc.applyH1({\n * keepProperties: ['bold', 'color'],\n * format: { font: 'Verdana' }\n * });\n * ```\n */\n public applyH1(options?: StyleApplyOptions): number {\n return this.applyStyleToMatching('Heading1', options, (style) =>\n /^(heading\\s*1|header\\s*1|h1)$/i.test(style)\n );\n }\n\n /**\n * Applies Heading 2 style to paragraphs with H2-like style names\n * @param options Optional style application options\n * @returns Number of paragraphs updated\n * @example\n * ```typescript\n * doc.applyH2({\n * format: { font: 'Verdana', size: 14, color: '000000' }\n * });\n * ```\n */\n public applyH2(options?: StyleApplyOptions): number {\n return this.applyStyleToMatching('Heading2', options, (style) =>\n /^(heading\\s*2|header\\s*2|h2)$/i.test(style)\n );\n }\n\n /**\n * Applies Heading 3 style to paragraphs with H3-like style names\n * @param options Optional style application options\n * @returns Number of paragraphs updated\n * @example\n * ```typescript\n * doc.applyH3({\n * format: { font: 'Verdana', size: 12, emphasis: ['bold'] }\n * });\n * ```\n */\n public applyH3(options?: StyleApplyOptions): number {\n return this.applyStyleToMatching('Heading3', options, (style) =>\n /^(heading\\s*3|header\\s*3|h3)$/i.test(style)\n );\n }\n\n /**\n * Applies Normal style to paragraphs without recognized styles\n * @param options Optional style application options\n * @returns Number of paragraphs updated\n */\n public applyNormal(options?: StyleApplyOptions): number {\n const targets =\n options?.paragraphs ||\n this.getAllParagraphs().filter((p) => {\n const style = p.getStyle();\n return !style || !/^(heading|header|h\\d|list|toc|tod|caution|table)/i.test(style);\n });\n\n let count = 0;\n for (const para of targets) {\n if (para.isPreserved()) continue;\n para.setStyle('Normal');\n\n if (options?.keepProperties && options.keepProperties.length > 0) {\n this.clearFormattingExcept(para, options.keepProperties);\n } else {\n para.clearDirectFormatting();\n }\n\n if (options?.format) {\n this.applyFormatOptions(para, options.format);\n }\n\n count++;\n }\n return count;\n }\n\n /**\n * Applies list style to numbered lists\n * @param options Optional style application options\n * @returns Number of paragraphs updated\n */\n public applyNumList(options?: StyleApplyOptions): number {\n return this.applyStyleToMatching('ListParagraph', options, (style) =>\n /^(list\\s*number|numbered\\s*list|list\\s*paragraph)$/i.test(style)\n );\n }\n\n /**\n * Applies list style to bullet lists\n * @param options Optional style application options\n * @returns Number of paragraphs updated\n */\n public applyBulletList(options?: StyleApplyOptions): number {\n return this.applyStyleToMatching('ListParagraph', options, (style) =>\n /^(list\\s*bullet|bullet\\s*list|list\\s*paragraph)$/i.test(style)\n );\n }\n\n /**\n * Applies Table of Contents style\n * @param options Optional style application options\n * @returns Number of paragraphs updated\n */\n public applyTOC(options?: StyleApplyOptions): number {\n return this.applyStyleToMatching('TOC', options, (style) =>\n /^(toc|table\\s*of\\s*contents|toc\\s*heading)$/i.test(style)\n );\n }\n\n /**\n * Applies Top of Document style\n * @param options Optional style application options\n * @returns Number of paragraphs updated\n */\n public applyTOD(options?: StyleApplyOptions): number {\n return this.applyStyleToMatching('TopOfDocument', options, (style) =>\n /^(tod|top\\s*of\\s*document|document\\s*top)$/i.test(style)\n );\n }\n\n /**\n * Applies Caution style\n * @param options Optional style application options\n * @returns Number of paragraphs updated\n */\n public applyCaution(options?: StyleApplyOptions): number {\n return this.applyStyleToMatching('Caution', options, (style) =>\n /^(caution|warning|important|alert)$/i.test(style)\n );\n }\n\n /**\n * Applies header style to table cell paragraphs (typically first row)\n * @param options Optional style application options\n * @returns Number of paragraphs updated\n */\n public applyCellHeader(options?: StyleApplyOptions): number {\n let count = 0;\n const tables = this.getAllTables();\n\n for (const table of tables) {\n const firstRow = table.getRow(0);\n if (!firstRow) continue;\n\n for (const cell of firstRow.getCells()) {\n for (const para of cell.getParagraphs()) {\n if (para.isPreserved()) continue;\n para.setStyle('TableHeader');\n\n if (options?.keepProperties && options.keepProperties.length > 0) {\n this.clearFormattingExcept(para, options.keepProperties);\n } else {\n para.clearDirectFormatting();\n }\n\n if (options?.format) {\n this.applyFormatOptions(para, options.format);\n }\n\n count++;\n }\n }\n }\n\n return count;\n }\n\n /**\n * Applies hyperlink style to hyperlinks\n * @returns Number of hyperlinks updated\n */\n public applyHyperlink(): number {\n let count = 0;\n const hyperlinks = this.getHyperlinks();\n\n for (const { hyperlink } of hyperlinks) {\n hyperlink.resetToStandardFormatting();\n count++;\n }\n\n return count;\n }\n\n /**\n * Helper method to apply formatting options to a paragraph\n * @private\n */\n private applyFormatOptions(para: Paragraph, options: FormatOptions): void {\n // Text formatting\n if (options.font || options.size || options.color || options.emphasis) {\n for (const run of para.getRuns()) {\n if (options.font) run.setFont(options.font);\n if (options.size) run.setSize(options.size);\n if (options.color) run.setColor(options.color);\n if (options.emphasis) {\n options.emphasis.forEach((emp) => {\n if (emp === 'bold') run.setBold(true);\n if (emp === 'italic') run.setItalic(true);\n if (emp === 'underline') run.setUnderline('single');\n });\n }\n }\n }\n\n // Alignment\n if (options.alignment) {\n para.setAlignment(options.alignment);\n }\n\n // Spacing (convert points to twips)\n if (options.spaceAbove !== undefined) {\n para.setSpaceBefore(options.spaceAbove * UNITS.TWIPS_PER_POINT);\n }\n if (options.spaceBelow !== undefined) {\n para.setSpaceAfter(options.spaceBelow * UNITS.TWIPS_PER_POINT);\n }\n if (options.lineSpacing !== undefined) {\n para.setLineSpacing(options.lineSpacing * UNITS.TWIPS_PER_POINT);\n }\n\n // Indentation (convert inches to twips)\n if (options.indentLeft !== undefined) {\n para.setLeftIndent(options.indentLeft * UNITS.TWIPS_PER_INCH);\n }\n if (options.indentRight !== undefined) {\n para.setRightIndent(options.indentRight * UNITS.TWIPS_PER_INCH);\n }\n if (options.indentFirst !== undefined) {\n para.setFirstLineIndent(options.indentFirst * UNITS.TWIPS_PER_INCH);\n }\n if (options.indentHanging !== undefined) {\n // Set hanging indent directly through formatting\n if (!para.formatting.indentation) {\n para.formatting.indentation = {};\n }\n para.formatting.indentation.hanging = options.indentHanging * UNITS.TWIPS_PER_INCH;\n }\n\n // Advanced options (only set if true)\n if (options.keepWithNext) {\n para.setKeepNext(true);\n }\n if (options.keepLines) {\n para.setKeepLines(true);\n }\n }\n\n /**\n * Helper method to selectively clear formatting while preserving specific properties\n * @private\n */\n private clearFormattingExcept(para: Paragraph, keepProperties: string[]): void {\n // Save properties to keep\n const savedProps: Record<string, unknown> = {};\n const formatting = para.formatting as Record<string, unknown>;\n\n for (const prop of keepProperties) {\n if (formatting[prop] !== undefined) {\n savedProps[prop] = formatting[prop];\n }\n }\n\n // Clear all formatting\n para.clearDirectFormatting();\n\n // Restore saved properties\n const restoredFormatting = para.formatting as Record<string, unknown>;\n for (const prop of keepProperties) {\n if (savedProps[prop] !== undefined) {\n restoredFormatting[prop] = savedProps[prop];\n }\n }\n\n // Handle run-level properties\n for (const run of para.getRuns()) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- dynamic property backup/restore requires flexible typing\n const runFormatting = run.getFormatting() as Record<string, any>;\n const runSavedProps: Record<string, any> = {};\n for (const prop of keepProperties) {\n if (runFormatting[prop] !== undefined) {\n runSavedProps[prop] = runFormatting[prop];\n }\n }\n\n run.clearFormatting();\n\n // Restore saved properties using appropriate setters\n if (runSavedProps.bold !== undefined) run.setBold(runSavedProps.bold);\n if (runSavedProps.italic !== undefined) run.setItalic(runSavedProps.italic);\n if (runSavedProps.underline !== undefined) run.setUnderline(runSavedProps.underline);\n if (runSavedProps.color !== undefined) run.setColor(runSavedProps.color);\n if (runSavedProps.font !== undefined) run.setFont(runSavedProps.font);\n if (runSavedProps.size !== undefined) run.setSize(runSavedProps.size);\n if (runSavedProps.highlight !== undefined) run.setHighlight(runSavedProps.highlight);\n if (runSavedProps.strike !== undefined) run.setStrike(runSavedProps.strike);\n if (runSavedProps.subscript !== undefined) run.setSubscript(runSavedProps.subscript);\n if (runSavedProps.superscript !== undefined) run.setSuperscript(runSavedProps.superscript);\n }\n }\n\n /**\n * Helper method to apply style to matching paragraphs\n * @private\n */\n private applyStyleToMatching(\n targetStyle: string,\n options: StyleApplyOptions | undefined,\n matcher: (style: string) => boolean\n ): number {\n const targets =\n options?.paragraphs ||\n this.getAllParagraphs().filter((p) => {\n const style = p.getStyle();\n return style && matcher(style);\n });\n\n let count = 0;\n for (const para of targets) {\n if (para.isPreserved()) continue;\n\n // Apply style\n para.setStyle(targetStyle);\n\n // Handle formatting\n if (options?.keepProperties && options.keepProperties.length > 0) {\n // Clear formatting except specified properties\n this.clearFormattingExcept(para, options.keepProperties);\n } else {\n // Clear all formatting\n para.clearDirectFormatting();\n }\n\n // Apply custom formatting if provided\n if (options?.format) {\n this.applyFormatOptions(para, options.format);\n }\n\n count++;\n }\n return count;\n }\n\n /**\n * Clears preserve flags from all paragraphs in the document\n * Called automatically before save since preserve flags are runtime-only\n * @returns Number of paragraphs that had preserve flags cleared\n * @private\n */\n private clearAllPreserveFlags(): number {\n let cleared = 0;\n for (const para of this.getAllParagraphs()) {\n if (para.isPreserved()) {\n para.setPreserved(false);\n cleared++;\n }\n }\n return cleared;\n }\n\n /**\n * Parses a TOC field instruction to extract which heading levels to include\n *\n * Handles field codes like:\n * - \"TOC \\o &quot;1-3&quot;\" → [1, 2, 3]\n * - \"TOC \\t &quot;Heading 2,2,&quot;\" → [2]\n * - \"TOC \\t &quot;2-3&quot;\" → [2, 3]\n * - \"TOC \\o &quot;1-2&quot; \\t &quot;Heading 3,3,&quot;\" → [1, 2, 3]\n * - \"TOC \\h \\u \\z \\t &quot;Heading 2,2,&quot;\" → [2]\n *\n * Supports both literal `\"` and HTML-encoded `&quot;` in quotes.\n *\n * @param instrText The TOC field instruction text (may contain &quot;)\n * @returns Array of heading levels (1-9) to include, sorted\n */\n private parseTOCFieldInstruction(instrText: string): number[] {\n const levels = new Set<number>();\n let hasOutlineSwitch = false;\n let hasTableSwitch = false;\n\n // Normalize whitespace and quotes: trim input and replace &quot; with \" for consistent parsing\n const normalizedText = instrText.trim().replace(/&quot;/g, '\"');\n\n // === Parse \\o \"X-Y\" switch (outline levels) - supports quoted and unquoted formats ===\n const outlineMatch = /\\\\o\\s+(?:\"(\\d+)-(\\d+)\"|'(\\d+)-(\\d+)'|(\\d+)-(\\d+))/.exec(normalizedText);\n if (outlineMatch) {\n // Extract captured groups from whichever format matched\n const start = parseInt(outlineMatch[1] || outlineMatch[3] || outlineMatch[5]!, 10);\n const end = parseInt(outlineMatch[2] || outlineMatch[4] || outlineMatch[6]!, 10);\n if (!isNaN(start) && !isNaN(end)) {\n hasOutlineSwitch = true;\n for (let i = start; i <= end; i++) {\n if (i >= 1 && i <= 9) levels.add(i);\n }\n }\n }\n\n // === Parse \\u switch (use outline levels) ===\n if (/\\\\u(?:\\s|\\\\|$)/.test(normalizedText)) {\n // When \\u is present without \\o or \\t, default to 1-9\n const hasTSwitch = /\\\\t\\s+\"/.test(normalizedText);\n if (!hasOutlineSwitch && !hasTSwitch) {\n for (let i = 1; i <= 9; i++) levels.add(i);\n }\n }\n\n // === Parse all \\t \"...\" switches (style or range) ===\n // Match: \\t followed by space and quoted string (supports nested commas safely)\n const tSwitchRegex = /\\\\t\\s+\"([^\"]*)\"/g; // Captures content inside quotes\n const tMatches = [...normalizedText.matchAll(tSwitchRegex)];\n\n for (const match of tMatches) {\n hasTableSwitch = true;\n const content = (match[1] || '').trim();\n if (!content) continue;\n\n // --- Case 1: Range format \"X-Y\" ---\n const rangeMatch = /^(\\d+)-(\\d+)$/.exec(content);\n if (rangeMatch?.[1] && rangeMatch?.[2]) {\n const start = parseInt(rangeMatch[1], 10);\n const end = parseInt(rangeMatch[2], 10);\n for (let i = start; i <= end; i++) {\n if (i >= 1 && i <= 9) levels.add(i);\n }\n continue;\n }\n\n // --- Case 2: Style format \"StyleName,Level,\" (e.g., \"Heading 2,2,\") ---\n // Split by comma, expect pattern: styleName, level, [optional trailing comma]\n const parts = content\n .split(',')\n .map((p) => p.trim())\n .filter(Boolean);\n for (let i = 0; i < parts.length; i += 2) {\n if (i + 1 < parts.length) {\n const levelStr = parts[i + 1];\n if (levelStr) {\n const level = parseInt(levelStr, 10);\n if (!isNaN(level) && level >= 1 && level <= 9) {\n levels.add(level);\n }\n }\n }\n }\n }\n\n // Final: Return sorted array (no duplicates)\n return Array.from(levels).sort((a, b) => a - b);\n }\n\n /**\n * Synchronizes TOC field instructions with actual style names from styles.xml\n * This ensures \\t switches reference styles by their current names, not outdated ones\n *\n * IMPORTANT: Does NOT modify style names - only updates TOC field references\n * This prevents TOC population failures when style names don't match field instructions\n *\n * @param documentXml - The generated document.xml content\n * @returns Modified XML with synchronized TOC field instructions\n * @private\n */\n private syncTOCFieldInstructions(documentXml: string): string {\n try {\n let modifiedXml = documentXml;\n let syncedCount = 0;\n\n // Strategy 1: Find TOC in SDT elements (modern Word format)\n const sdtTocRegex =\n /<w:sdt>[\\s\\S]*?<w:docPartGallery w:val=\"Table of Contents\"[\\s\\S]*?<\\/w:sdt>/g;\n const sdtMatches = Array.from(documentXml.matchAll(sdtTocRegex));\n\n for (const match of sdtMatches) {\n if (!match) continue;\n const result = this.syncTOCInstructionInXml(match[0]);\n if (result.changed) {\n modifiedXml = modifiedXml.replace(match[0], result.xml);\n syncedCount++;\n }\n }\n\n // Strategy 2: Find field-based TOC (older format without SDT wrapper)\n // Pattern: instrText containing \"TOC\" with field switches\n const instrRegex = /<w:instrText[^>]*>([^<]*TOC[^<]*)<\\/w:instrText>/g;\n const instrMatches = Array.from(modifiedXml.matchAll(instrRegex));\n\n for (const match of instrMatches) {\n if (!match?.[1]) continue;\n\n // Decode XML entities in instruction\n const fieldInstruction = match[1]\n .replace(/&amp;/g, '&')\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&quot;/g, '\"')\n .replace(/&apos;/g, \"'\");\n\n // Check if instruction contains \\t switches (style-specific TOC)\n if (!fieldInstruction.includes('\\\\t')) {\n continue; // Outline-based TOC, no style names to sync\n }\n\n // Parse and update \\t switches\n const updatedInstruction = this.updateTOCStyleNames(fieldInstruction);\n\n // If instruction changed, replace in XML\n if (updatedInstruction !== fieldInstruction) {\n // Re-encode for XML\n const encodedInstruction = updatedInstruction\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;');\n\n // Replace the instruction\n const updatedInstrXml = `<w:instrText xml:space=\"preserve\">${encodedInstruction}</w:instrText>`;\n modifiedXml = modifiedXml.replace(match[0], updatedInstrXml);\n\n this.logger.info(\n `Synced TOC field instruction: \"${fieldInstruction.substring(0, 50)}...\" → \"${updatedInstruction.substring(0, 50)}...\"`\n );\n syncedCount++;\n }\n }\n\n if (syncedCount > 0) {\n this.logger.info(`Synced ${syncedCount} TOC field instruction(s)`);\n }\n\n return modifiedXml;\n } catch (error: unknown) {\n // Log error but don't fail the save\n this.logger.error(\n 'Error syncing TOC field instructions - document will save with original instructions',\n error instanceof Error\n ? { message: error.message, stack: error.stack }\n : { error: String(error) }\n );\n return documentXml; // Return original on error\n }\n }\n\n /**\n * Helper to sync TOC instruction within an XML fragment\n * @private\n */\n private syncTOCInstructionInXml(xml: string): { xml: string; changed: boolean } {\n const instrMatch = /<w:instrText[^>]*>([\\s\\S]*?)<\\/w:instrText>/.exec(xml);\n if (!instrMatch?.[1]) {\n return { xml, changed: false };\n }\n\n // Decode XML entities in instruction\n const fieldInstruction = instrMatch[1]\n .replace(/&amp;/g, '&')\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&quot;/g, '\"')\n .replace(/&apos;/g, \"'\");\n\n // Check if instruction contains \\t switches (style-specific TOC)\n if (!fieldInstruction.includes('\\\\t')) {\n return { xml, changed: false };\n }\n\n // Parse and update \\t switches\n const updatedInstruction = this.updateTOCStyleNames(fieldInstruction);\n\n if (updatedInstruction === fieldInstruction) {\n return { xml, changed: false };\n }\n\n // Re-encode for XML\n const encodedInstruction = updatedInstruction\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;');\n\n const updatedXml = xml.replace(\n /<w:instrText[^>]*>[\\s\\S]*?<\\/w:instrText>/,\n `<w:instrText xml:space=\"preserve\">${encodedInstruction}</w:instrText>`\n );\n\n return { xml: updatedXml, changed: true };\n }\n\n /**\n * Updates style names in a TOC field instruction to match actual styles.xml names\n * Parses \\t switches, resolves each style name, and rebuilds instruction\n *\n * @param fieldInstruction - Original TOC field instruction\n * @returns Updated field instruction with current style names\n * @private\n */\n private updateTOCStyleNames(fieldInstruction: string): string {\n // Extract all \\t switches using regex\n // Format: \\t \"StyleName,Level,\" or \\t \"StyleName,Level,StyleName2,Level2,...\"\n const tSwitchRegex = /\\\\t\\s+\"([^\"]+)\"/g;\n let updatedInstruction = fieldInstruction;\n let hasChanges = false;\n\n const matches = Array.from(fieldInstruction.matchAll(tSwitchRegex));\n\n for (const match of matches) {\n const originalSwitch = match[0]; // Full match: \\t \"StyleName,Level,\"\n const content = match[1]; // Content inside quotes\n if (!content) continue;\n\n // Parse style names and levels from the switch content\n // Format: \"StyleName,Level,\" or \"StyleName,Level,StyleName2,Level2,...\"\n const parts = content\n .split(',')\n .map((p) => p.trim())\n .filter(Boolean);\n const updatedParts: string[] = [];\n\n for (let i = 0; i < parts.length; i += 2) {\n const styleName = parts[i];\n const levelStr = parts[i + 1];\n\n if (!styleName || !levelStr) {\n // Preserve malformed parts\n if (styleName) updatedParts.push(styleName);\n if (levelStr) updatedParts.push(levelStr);\n continue;\n }\n\n // Resolve style name to actual name in styles.xml\n const actualStyleName = this.resolveStyleNameForTOC(styleName);\n\n if (actualStyleName && actualStyleName !== styleName) {\n // Style name changed - use actual name\n updatedParts.push(actualStyleName, levelStr);\n hasChanges = true;\n } else if (actualStyleName) {\n // Style name unchanged\n updatedParts.push(styleName, levelStr);\n } else {\n // Style not found - preserve original reference and log warning\n updatedParts.push(styleName, levelStr);\n this.logger.warn(\n `TOC references style \"${styleName}\" which doesn't exist in styles.xml - preserving original reference`\n );\n }\n }\n\n // Rebuild the \\t switch with updated names\n if (hasChanges) {\n const updatedContent = updatedParts.join(',') + (content.endsWith(',') ? ',' : '');\n const updatedSwitch = `\\\\t \"${updatedContent}\"`;\n updatedInstruction = updatedInstruction.replace(originalSwitch, updatedSwitch);\n }\n }\n\n return updatedInstruction;\n }\n\n /**\n * Resolves a TOC style reference to the actual style name in styles.xml\n * Handles various naming patterns (Heading2 vs Heading 2 vs CustomHeader2)\n *\n * @param tocStyleName - Style name from TOC \\t switch\n * @returns Actual style name from styles.xml or undefined if not found\n * @private\n */\n private resolveStyleNameForTOC(tocStyleName: string): string | undefined {\n // Strategy 1: For standard heading references (Heading 1, Heading 2, etc.),\n // find the actual style being used for that outline level FIRST.\n // This handles cases where heading styles have been renamed (e.g., \"Heading 2\" -> \"Header 2\")\n // and ensures we return the style that paragraphs actually use.\n const headingLevelMatch = /^Heading\\s*(\\d+)$/i.exec(tocStyleName);\n if (headingLevelMatch?.[1]) {\n const level = parseInt(headingLevelMatch[1]);\n const usedStyles = this.findHeadingStylesUsedByParagraphs();\n const actualStyleName = usedStyles.get(level);\n if (actualStyleName) {\n this.logger.info(\n `TOC style \"${tocStyleName}\" resolved to actual used style \"${actualStyleName}\" for level ${level}`\n );\n return actualStyleName;\n }\n }\n\n // Strategy 2: Direct name match (exact)\n const allStyles = this.stylesManager.getAllStyles();\n for (const style of allStyles) {\n if (style.getName() === tocStyleName) {\n return style.getName();\n }\n }\n\n // Strategy 3: Match by styleId pattern\n // \"Heading 2\" → styleId=\"Heading2\" → get actual name\n // \"List Paragraph\" → styleId=\"ListParagraph\" → get actual name\n const normalizedId = tocStyleName.replace(/\\s+/g, '');\n const styleById = this.stylesManager.getStyle(normalizedId);\n if (styleById) {\n return styleById.getName();\n }\n\n // Strategy 4: Fuzzy match (case-insensitive search)\n const fuzzyResults = this.stylesManager.searchByName(tocStyleName);\n if (fuzzyResults.length > 0 && fuzzyResults[0]) {\n return fuzzyResults[0].getName();\n }\n\n // Style not found\n return undefined;\n }\n\n /**\n * Finds heading styles actually used by paragraphs in the document.\n * Returns a map of outline level -> style name for styles in use.\n *\n * This is used by resolveStyleNameForTOC to find the actual styles being used\n * when the TOC references standard heading styles that may have been renamed.\n *\n * @returns Map<outlineLevel, styleName> where outlineLevel is 1-indexed\n * @private\n */\n private findHeadingStylesUsedByParagraphs(): Map<number, string> {\n const usedStyles = new Map<number, string>();\n\n const processElement = (element: BodyElement) => {\n if (element instanceof Paragraph) {\n const styleId = element.getStyle();\n if (styleId) {\n const style = this.stylesManager.getStyle(styleId);\n if (style) {\n const outlineLevel = style.getParagraphFormatting()?.outlineLevel;\n if (outlineLevel !== undefined && outlineLevel >= 0) {\n const level = outlineLevel + 1; // Convert to 1-indexed\n const name = style.getName() || styleId;\n if (!usedStyles.has(level)) {\n usedStyles.set(level, name);\n }\n }\n }\n }\n } else if (element instanceof Table) {\n // Check table cells for paragraphs\n for (let row = 0; row < element.getRowCount(); row++) {\n const rowObj = element.getRow(row);\n if (rowObj) {\n for (let col = 0; col < rowObj.getCellCount(); col++) {\n const cell = rowObj.getCell(col);\n if (cell) {\n for (const para of cell.getParagraphs()) {\n processElement(para);\n }\n }\n }\n }\n }\n }\n };\n\n for (const element of this.bodyElements) {\n processElement(element);\n }\n\n return usedStyles;\n }\n\n /**\n * Finds all headings in the document that match the specified levels\n *\n * @param levels Array of heading levels to include (e.g., [1, 2, 3])\n * @returns Array of heading information objects\n */\n /**\n * Find headings for TOC by parsing XML directly (searches body AND tables)\n * This is more reliable than using bodyElements as it searches inside table cells too\n */\n private findHeadingsForTOCFromXML(\n docXml: string,\n levels: number[]\n ): { level: number; text: string; bookmark: string }[] {\n const headings: { level: number; text: string; bookmark: string }[] = [];\n const levelSet = new Set(levels);\n\n try {\n // Parse document.xml to object structure\n const parsed = XMLParser.parseToObject(docXml, { trimValues: false });\n const document = parsed['w:document'];\n if (!document) {\n return headings;\n }\n\n const body = (document as any)['w:body'];\n if (!body) {\n return headings;\n }\n\n // Helper function to extract heading info from a parsed paragraph object\n const extractHeading = (para: any): void => {\n const pPr = para['w:pPr'];\n if (!pPr?.['w:pStyle']) {\n return;\n }\n\n const styleVal = pPr['w:pStyle']['@_w:val'];\n if (!styleVal) {\n return;\n }\n\n // Check if style matches \"HeadingN\" format (exact match, case-insensitive)\n const headingMatch = styleVal.match(/^Heading(\\d+)$/i);\n if (!headingMatch?.[1]) {\n return;\n }\n\n const headingLevel = parseInt(headingMatch[1], 10);\n\n // Check if this level should be included in TOC\n if (!levelSet.has(headingLevel)) {\n return;\n }\n\n // Extract bookmark (use any existing bookmark, prioritize \"_heading\" or \"_Toc\")\n let bookmark = '';\n const bookmarkStart = para['w:bookmarkStart'];\n if (bookmarkStart) {\n const bookmarkArray = Array.isArray(bookmarkStart) ? bookmarkStart : [bookmarkStart];\n\n // First try to find preferred bookmark types\n for (const bm of bookmarkArray) {\n const bmName = bm['@_w:name'];\n if (\n bmName &&\n (bmName.toLowerCase().includes('_heading') || bmName.toLowerCase().includes('_toc'))\n ) {\n bookmark = bmName;\n break;\n }\n }\n\n // If no preferred bookmark found, use the first available bookmark\n if (!bookmark && bookmarkArray.length > 0) {\n const firstBm = bookmarkArray[0];\n const bmName = firstBm['@_w:name'];\n if (bmName) {\n bookmark = bmName;\n }\n }\n }\n\n // Extract text from runs\n let text = '';\n const runs = para['w:r'];\n if (runs) {\n const runArray = Array.isArray(runs) ? runs : [runs];\n for (const run of runArray) {\n const textElement = run['w:t'];\n if (textElement) {\n if (typeof textElement === 'string') {\n text += textElement;\n } else if (textElement['#text']) {\n text += textElement['#text'];\n }\n }\n }\n }\n\n // Only add if we have text\n text = text.trim();\n if (!text) {\n return;\n }\n\n // Generate bookmark if not found\n if (!bookmark) {\n bookmark = `_Toc${Date.now()}_${headings.length}`;\n }\n\n headings.push({\n level: headingLevel,\n text: text,\n bookmark: bookmark,\n });\n };\n\n // Search in direct paragraphs\n const paragraphs = body['w:p'];\n if (paragraphs) {\n const paraArray = Array.isArray(paragraphs) ? paragraphs : [paragraphs];\n for (const para of paraArray) {\n extractHeading(para);\n }\n }\n\n // Search in tables (this is critical - many documents have headings in tables)\n const tables = body['w:tbl'];\n if (tables) {\n const tableArray = Array.isArray(tables) ? tables : [tables];\n for (const table of tableArray) {\n const rows = table['w:tr'];\n if (!rows) continue;\n\n const rowArray = Array.isArray(rows) ? rows : [rows];\n for (const row of rowArray) {\n const cells = row['w:tc'];\n if (!cells) continue;\n\n const cellArray = Array.isArray(cells) ? cells : [cells];\n for (const cell of cellArray) {\n const cellParas = cell['w:p'];\n if (!cellParas) continue;\n\n const cellParaArray = Array.isArray(cellParas) ? cellParas : [cellParas];\n for (const para of cellParaArray) {\n extractHeading(para);\n }\n }\n }\n }\n }\n } catch (error: unknown) {\n defaultLogger.error(\n 'Error parsing document.xml for headings:',\n error instanceof Error\n ? { message: error.message, stack: error.stack }\n : { error: String(error) }\n );\n }\n\n return headings;\n }\n\n /**\n * Legacy method - searches only bodyElements (doesn't search inside tables)\n * Kept for compatibility but not recommended\n * @deprecated Use findHeadingsForTOCFromXML instead\n */\n private findHeadingsForTOC(\n levels: number[]\n ): { level: number; text: string; bookmark: string }[] {\n const headings: { level: number; text: string; bookmark: string }[] = [];\n const levelSet = new Set(levels);\n\n // Iterate through body elements\n for (const element of this.bodyElements) {\n if (element instanceof Paragraph) {\n const para = element;\n const formatting = para.getFormatting();\n\n // Check if paragraph has a heading style (handle both \"Heading1\" and \"Heading 1\")\n if (formatting.style) {\n const styleMatch = /Heading\\s*(\\d+)/i.exec(formatting.style);\n if (styleMatch?.[1]) {\n const headingLevel = parseInt(styleMatch[1], 10);\n\n // Check if this level should be included in TOC\n if (levelSet.has(headingLevel)) {\n const text = para.getText().trim();\n\n if (text) {\n // Create or get bookmark for this heading\n const bookmark = this.bookmarkManager.createHeadingBookmark(text);\n\n headings.push({\n level: headingLevel,\n text: text,\n bookmark: bookmark.getName(),\n });\n }\n }\n }\n }\n }\n }\n\n return headings;\n }\n\n /**\n * Generates TOC XML structure with populated entries\n *\n * Creates a complete SDT-wrapped TOC with:\n * - Complex field structure (begin/instruction/separate/entries/end)\n * - Pre-populated hyperlink entries for each heading\n * - Proper formatting (Verdana, blue, underlined)\n *\n * @param headings Array of heading information\n * @param originalInstrText Original TOC field instruction to preserve switches\n * @returns Complete TOC XML string\n */\n private generateTOCXML(\n headings: { level: number; text: string; bookmark: string }[],\n originalInstrText: string\n ): string {\n const sdtId = Math.floor(Math.random() * 2000000000) - 1000000000;\n\n let tocXml = '<w:sdt>';\n\n // SDT properties\n tocXml += '<w:sdtPr>';\n tocXml += `<w:id w:val=\"${sdtId}\"/>`;\n tocXml += '<w:docPartObj>';\n tocXml += '<w:docPartGallery w:val=\"Table of Contents\"/>';\n tocXml += '<w:docPartUnique w:val=\"1\"/>';\n tocXml += '</w:docPartObj>';\n tocXml += '</w:sdtPr>';\n\n // SDT content\n tocXml += '<w:sdtContent>';\n\n // Calculate minimum level for relative indentation\n // If TOC shows only Heading 2s, minLevel=2, so Heading 2 gets 0\" indent\n const minLevel = headings.length > 0 ? Math.min(...headings.map((h) => h.level)) : 1;\n\n // First paragraph: field begin + instruction + separator + first entry (if any)\n tocXml += '<w:p>';\n tocXml += '<w:pPr>';\n tocXml += '<w:spacing w:after=\"0\" w:before=\"0\" w:line=\"240\" w:lineRule=\"auto\"/>';\n\n // Add indentation for first entry relative to minimum level (0.25\" per level)\n if (headings.length > 0 && headings[0]) {\n const firstIndent = (headings[0].level - minLevel) * 360; // 360 twips = 0.25 inches\n if (firstIndent > 0) {\n tocXml += `<w:ind w:left=\"${firstIndent}\"/>`;\n }\n }\n\n tocXml += '</w:pPr>';\n\n // Field begin\n tocXml += '<w:r><w:fldChar w:fldCharType=\"begin\"/></w:r>';\n\n // Field instruction (preserve original switches)\n tocXml += '<w:r>';\n tocXml += `<w:instrText xml:space=\"preserve\">${this.escapeXml(\n originalInstrText\n )}</w:instrText>`;\n tocXml += '</w:r>';\n\n // Field separator\n tocXml += '<w:r><w:fldChar w:fldCharType=\"separate\"/></w:r>';\n\n // First entry (if any)\n if (headings.length > 0 && headings[0]) {\n tocXml += this.buildTOCEntryXML(headings[0]);\n }\n\n tocXml += '</w:p>';\n\n // Remaining entries (each in its own paragraph)\n for (let i = 1; i < headings.length; i++) {\n const heading = headings[i];\n if (!heading) continue;\n\n tocXml += '<w:p>';\n tocXml += '<w:pPr>';\n tocXml += '<w:spacing w:after=\"0\" w:before=\"0\" w:line=\"240\" w:lineRule=\"auto\"/>';\n\n // Add indentation relative to minimum level (0.25\" per level above minimum)\n const indent = (heading.level - minLevel) * 360;\n if (indent > 0) {\n tocXml += `<w:ind w:left=\"${indent}\"/>`;\n }\n\n tocXml += '</w:pPr>';\n tocXml += this.buildTOCEntryXML(heading);\n tocXml += '</w:p>';\n }\n\n // Final paragraph with field end\n tocXml += '<w:p>';\n tocXml += '<w:pPr>';\n tocXml += '<w:spacing w:after=\"0\" w:before=\"0\" w:line=\"240\" w:lineRule=\"auto\"/>';\n tocXml += '</w:pPr>';\n tocXml += '<w:r><w:fldChar w:fldCharType=\"end\"/></w:r>';\n tocXml += '</w:p>';\n\n tocXml += '</w:sdtContent>';\n tocXml += '</w:sdt>';\n\n return tocXml;\n }\n\n /**\n * Builds XML for a single TOC entry with hyperlink\n *\n * @param heading Heading information\n * @returns XML string for the TOC entry\n */\n private buildTOCEntryXML(heading: { level: number; text: string; bookmark: string }): string {\n const escapedText = this.escapeXml(heading.text);\n\n let xml = '';\n xml += `<w:hyperlink w:anchor=\"${this.escapeXml(heading.bookmark)}\">`;\n xml += '<w:r>';\n xml += '<w:rPr>';\n xml += '<w:rFonts w:ascii=\"Verdana\" w:hAnsi=\"Verdana\" w:cs=\"Verdana\" w:eastAsia=\"Verdana\"/>';\n xml += '<w:color w:val=\"0000FF\"/>';\n xml += '<w:sz w:val=\"24\"/>';\n xml += '<w:szCs w:val=\"24\"/>';\n xml += '<w:u w:val=\"single\"/>';\n xml += '</w:rPr>';\n xml += `<w:t xml:space=\"preserve\">${escapedText}</w:t>`;\n xml += '</w:r>';\n xml += '</w:hyperlink>';\n\n return xml;\n }\n\n /**\n * Escapes XML special characters\n *\n * @param text Text to escape\n * @returns Escaped text\n */\n private escapeXml(text: string): string {\n return text\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;');\n }\n\n /**\n * Populates TOCs in a saved file\n * Private helper used by save() when auto-populate is enabled\n *\n * @param filePath Path to the saved DOCX file\n * @returns Promise resolving to the number of TOCs populated\n * @private\n */\n private async populateTOCsInFile(filePath: string): Promise<number> {\n // Load the saved document\n const handler = new ZipHandler();\n await handler.load(filePath);\n\n // Get document.xml\n const docXml = handler.getFileAsString('word/document.xml');\n if (!docXml) {\n return 0;\n }\n\n // Populate all TOCs in the XML\n const modifiedXml = this.populateAllTOCsInXML(docXml);\n\n // Update and save if changes were made\n if (modifiedXml !== docXml) {\n handler.updateFile('word/document.xml', modifiedXml);\n await handler.save(filePath);\n\n // Count TOCs that were populated\n const tocRegex =\n /<w:sdt>[\\s\\S]*?<w:docPartGallery w:val=\"Table of Contents\"[\\s\\S]*?<\\/w:sdt>/g;\n const matches = Array.from(docXml.matchAll(tocRegex));\n return matches.length;\n }\n\n return 0;\n }\n\n /**\n * Populates all TOCs in document XML\n * Extracted from replaceTableOfContents for reuse\n *\n * @param docXml The document XML string\n * @returns Modified XML with populated TOCs\n * @private\n */\n private populateAllTOCsInXML(docXml: string): string {\n let modifiedXml = docXml;\n\n // Strategy 1: Try SDT-wrapped TOCs first (modern Word format)\n const sdtTocRegex =\n /<w:sdt>[\\s\\S]*?<w:docPartGallery w:val=\"Table of Contents\"[\\s\\S]*?<\\/w:sdt>/g;\n const sdtMatches = Array.from(docXml.matchAll(sdtTocRegex));\n\n if (sdtMatches.length > 0) {\n for (const match of sdtMatches) {\n try {\n const tocXml = match[0];\n const instrMatch = /<w:instrText[^>]*>([\\s\\S]*?)<\\/w:instrText>/.exec(tocXml);\n if (!instrMatch?.[1]) continue;\n\n const fieldInstruction = instrMatch[1]\n .replace(/&amp;/g, '&')\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&quot;/g, '\"')\n .replace(/&apos;/g, \"'\");\n\n const levels = this.parseTOCFieldInstruction(fieldInstruction);\n const headings = this.findHeadingsForTOCFromXML(docXml, levels);\n if (headings.length === 0) continue;\n\n const newTocXml = this.generateTOCXML(headings, fieldInstruction);\n modifiedXml = modifiedXml.replace(tocXml, newTocXml);\n } catch (error: unknown) {\n this.logger.error(\n 'Error populating SDT TOC',\n error instanceof Error\n ? { message: error.message, stack: error.stack }\n : { error: String(error) }\n );\n continue;\n }\n }\n return modifiedXml;\n }\n\n // Strategy 2: Handle simple complex field TOCs (no SDT wrapper)\n // These have the structure: fldChar begin → instrText → fldChar separate → entries → fldChar end\n // Match pattern: paragraph containing fldChar begin followed by instrText with TOC\n const simpleTocRegex =\n /<w:p[^>]*>[\\s\\S]*?<w:fldChar[^>]*w:fldCharType=\"begin\"[^>]*\\/>[\\s\\S]*?<w:instrText[^>]*>([^<]*TOC[^<]*)<\\/w:instrText>/g;\n const simpleMatches = Array.from(docXml.matchAll(simpleTocRegex));\n\n if (simpleMatches.length > 0) {\n for (const match of simpleMatches) {\n try {\n const instrText = match[1];\n if (!instrText) continue;\n\n const fieldInstruction = instrText\n .replace(/&amp;/g, '&')\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&quot;/g, '\"')\n .replace(/&apos;/g, \"'\");\n\n const levels = this.parseTOCFieldInstruction(fieldInstruction);\n const headings = this.findHeadingsForTOCFromXML(modifiedXml, levels);\n if (headings.length === 0) continue;\n\n // For simple TOCs, we need to find and replace the entire field structure\n // Find from fldChar begin to fldChar end\n const tocStartMatch = modifiedXml.match(\n new RegExp(\n `(<w:p[^>]*>[\\\\s\\\\S]*?<w:fldChar[^>]*w:fldCharType=\"begin\"[^>]*/>)([\\\\s\\\\S]*?<w:instrText[^>]*>${instrText.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}<\\\\/w:instrText>)`,\n 'g'\n )\n );\n\n if (!tocStartMatch) continue;\n\n // Find the end marker - look for fldChar end after this TOC instruction\n // The TOC field spans multiple paragraphs, ending at fldChar end\n const tocFieldPattern = new RegExp(\n `(<w:p[^>]*>[\\\\s\\\\S]*?<w:fldChar[^>]*w:fldCharType=\"begin\"[^>]*\\\\/>[\\\\s\\\\S]*?<w:instrText[^>]*>${instrText.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}<\\\\/w:instrText>[\\\\s\\\\S]*?<w:fldChar[^>]*w:fldCharType=\"separate\"[^>]*\\\\/>)([\\\\s\\\\S]*?)(<w:r[^>]*>[\\\\s\\\\S]*?<w:fldChar[^>]*w:fldCharType=\"end\"[^>]*\\\\/>[\\\\s\\\\S]*?<\\\\/w:r>)`,\n 'g'\n );\n\n const fullMatch = modifiedXml.match(tocFieldPattern);\n if (!fullMatch || fullMatch.length === 0) continue;\n\n const fullTocXml = fullMatch[0];\n\n // Generate new TOC XML preserving the complex field structure\n const newTocXml = this.generateSimpleTOCXML(headings, fieldInstruction);\n modifiedXml = modifiedXml.replace(fullTocXml, newTocXml);\n\n this.logger.info(`Populated simple TOC with ${headings.length} heading entries`);\n } catch (error: unknown) {\n this.logger.error(\n 'Error populating simple TOC',\n error instanceof Error\n ? { message: error.message, stack: error.stack }\n : { error: String(error) }\n );\n continue;\n }\n }\n }\n\n return modifiedXml;\n }\n\n /**\n * Generates XML for a simple complex field TOC (without SDT wrapper)\n * Preserves the fldChar begin → instrText → fldChar separate → entries → fldChar end structure\n *\n * @param headings Array of heading info objects\n * @param fieldInstruction The TOC field instruction string\n * @returns XML string for the TOC field\n * @private\n */\n private generateSimpleTOCXML(\n headings: { text: string; level: number; bookmark: string }[],\n fieldInstruction: string\n ): string {\n // Build the TOC entries\n const entries: string[] = [];\n\n for (const heading of headings) {\n // Calculate TOC style based on heading level (TOC1, TOC2, etc.)\n const tocStyle = `TOC${heading.level}`;\n\n // Escape text for XML\n const escapedText = heading.text\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;');\n\n // Create hyperlinked TOC entry paragraph\n entries.push(\n `<w:p>` +\n `<w:pPr><w:pStyle w:val=\"${tocStyle}\"/></w:pPr>` +\n `<w:hyperlink w:anchor=\"${heading.bookmark}\" w:history=\"1\">` +\n `<w:r><w:rPr><w:rStyle w:val=\"Hyperlink\"/></w:rPr>` +\n `<w:t>${escapedText}</w:t></w:r>` +\n `</w:hyperlink>` +\n `</w:p>`\n );\n }\n\n // Escape field instruction for XML\n const escapedInstruction = fieldInstruction\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;');\n\n // Build the complete TOC field structure\n return (\n // First paragraph: fldChar begin + instrText + fldChar separate\n `<w:p>` +\n `<w:pPr><w:pStyle w:val=\"TOC2\"/></w:pPr>` +\n `<w:r><w:fldChar w:fldCharType=\"begin\"/></w:r>` +\n `<w:r><w:instrText xml:space=\"preserve\">${escapedInstruction}</w:instrText></w:r>` +\n `<w:r><w:fldChar w:fldCharType=\"separate\"/></w:r>` +\n `</w:p>` +\n // TOC entry paragraphs (between separate and end)\n entries.join('') +\n // Last paragraph: fldChar end\n `<w:p>` +\n `<w:pPr><w:pStyle w:val=\"TOC2\"/></w:pPr>` +\n `<w:r><w:fldChar w:fldCharType=\"end\"/></w:r>` +\n `</w:p>`\n );\n }\n\n /**\n * Replaces all Table of Contents in a saved document file with pre-populated entries\n *\n * This helper function works with saved DOCX files:\n * 1. Loads the document file\n * 2. Finds all TOC elements in document.xml\n * 3. For each TOC, parses its field instruction to determine which heading levels to include\n * 4. Scans the document for all headings matching those levels\n * 5. Generates pre-populated TOC entries with working hyperlinks\n * 6. Replaces the TOC in the XML and saves the file\n *\n * The generated TOC maintains the complex field structure, so users can still\n * right-click \"Update Field\" in Word to refresh it.\n *\n * @param filePath Path to the DOCX file to process\n * @returns Promise resolving to the number of TOC elements that were replaced\n *\n * @example\n * // Save document first\n * await doc.save('output.docx');\n *\n * // Then replace TOCs with populated entries\n * const count = await doc.replaceTableOfContents('output.docx');\n * console.log(`Replaced ${count} TOC element(s) with populated entries`);\n */\n public async replaceTableOfContents(filePath: string): Promise<number> {\n // Reuse the new extracted logic\n return await this.populateTOCsInFile(filePath);\n }\n\n /**\n * Gets the document section\n * @returns The section\n */\n getSection(): Section {\n return this.section;\n }\n\n /**\n * Sets the document section\n * @param section The section to set\n * @returns This document for chaining\n */\n setSection(section: Section): this {\n this.section = section;\n return this;\n }\n\n /**\n * Sets page size\n * @param width Width in twips\n * @param height Height in twips\n * @param orientation Page orientation\n * @returns This document for chaining\n */\n setPageSize(width: number, height: number, orientation?: 'portrait' | 'landscape'): this {\n this.section.setPageSize(width, height, orientation);\n return this;\n }\n\n /**\n * Sets page orientation\n * @param orientation Page orientation\n * @returns This document for chaining\n */\n setPageOrientation(orientation: 'portrait' | 'landscape'): this {\n this.section.setOrientation(orientation);\n return this;\n }\n\n /**\n * Sets margins\n * @param margins Margin properties\n * @returns This document for chaining\n */\n setMargins(margins: {\n top: number;\n bottom: number;\n left: number;\n right: number;\n header?: number;\n footer?: number;\n gutter?: number;\n }): this {\n this.section.setMargins(margins);\n return this;\n }\n\n /**\n * Sets the default header for the document\n * @param header The header to set\n * @returns This document for chaining\n */\n setHeader(header: Header): this {\n // Generate relationship for header\n const relationship = this.relationshipManager.addHeader(`${header.getFilename(1)}`);\n\n // Register with manager\n this.headerFooterManager.registerHeader(header, relationship.getId());\n\n // Link to section\n this.section.setHeaderReference('default', relationship.getId());\n\n return this;\n }\n\n /**\n * Sets the first page header\n * @param header The header to set\n * @returns This document for chaining\n */\n setFirstPageHeader(header: Header): this {\n // Enable title page\n this.section.setTitlePage(true);\n\n // Generate relationship for header\n const relationship = this.relationshipManager.addHeader(\n `${header.getFilename(this.headerFooterManager.getHeaderCount() + 1)}`\n );\n\n // Register with manager\n this.headerFooterManager.registerHeader(header, relationship.getId());\n\n // Link to section\n this.section.setHeaderReference('first', relationship.getId());\n\n return this;\n }\n\n /**\n * Sets the even page header (requires different odd/even pages)\n * @param header The header to set\n * @returns This document for chaining\n */\n setEvenPageHeader(header: Header): this {\n // Generate relationship for header\n const relationship = this.relationshipManager.addHeader(\n `${header.getFilename(this.headerFooterManager.getHeaderCount() + 1)}`\n );\n\n // Register with manager\n this.headerFooterManager.registerHeader(header, relationship.getId());\n\n // Link to section\n this.section.setHeaderReference('even', relationship.getId());\n\n return this;\n }\n\n /**\n * Sets the default footer for the document\n * @param footer The footer to set\n * @returns This document for chaining\n */\n setFooter(footer: Footer): this {\n // Generate relationship for footer\n const relationship = this.relationshipManager.addFooter(`${footer.getFilename(1)}`);\n\n // Register with manager\n this.headerFooterManager.registerFooter(footer, relationship.getId());\n\n // Link to section\n this.section.setFooterReference('default', relationship.getId());\n\n return this;\n }\n\n /**\n * Sets the first page footer\n * @param footer The footer to set\n * @returns This document for chaining\n */\n setFirstPageFooter(footer: Footer): this {\n // Enable title page\n this.section.setTitlePage(true);\n\n // Generate relationship for footer\n const relationship = this.relationshipManager.addFooter(\n `${footer.getFilename(this.headerFooterManager.getFooterCount() + 1)}`\n );\n\n // Register with manager\n this.headerFooterManager.registerFooter(footer, relationship.getId());\n\n // Link to section\n this.section.setFooterReference('first', relationship.getId());\n\n return this;\n }\n\n /**\n * Sets the even page footer (requires different odd/even pages)\n * @param footer The footer to set\n * @returns This document for chaining\n */\n setEvenPageFooter(footer: Footer): this {\n // Generate relationship for footer\n const relationship = this.relationshipManager.addFooter(\n `${footer.getFilename(this.headerFooterManager.getFooterCount() + 1)}`\n );\n\n // Register with manager\n this.headerFooterManager.registerFooter(footer, relationship.getId());\n\n // Link to section\n this.section.setFooterReference('even', relationship.getId());\n\n return this;\n }\n\n /**\n * Gets the HeaderFooterManager\n * @returns HeaderFooterManager instance\n */\n getHeaderFooterManager(): HeaderFooterManager {\n return this.headerFooterManager;\n }\n\n /**\n * Removes a specific header from the document\n * Removes the header from HeaderFooterManager, RelationshipManager, and section references\n * Also removes the header XML file from the ZIP archive\n * @param type Header type to remove (default, first, even)\n * @returns This document for chaining\n */\n removeHeader(type: 'default' | 'first' | 'even'): this {\n const sectionProps = this.section.getProperties();\n\n // Get the relationship ID from section properties\n const rId = sectionProps.headers?.[type];\n if (!rId) {\n return this; // No header of this type exists\n }\n\n // Get the header filename from relationship\n const rel = this.relationshipManager.getRelationship(rId);\n if (rel) {\n const headerPath = `word/${rel.getTarget()}`;\n\n // Remove the header XML file from ZIP\n if (this.zipHandler.hasFile(headerPath)) {\n this.zipHandler.removeFile(headerPath);\n }\n\n // Remove the relationship\n this.relationshipManager.removeRelationship(rId);\n }\n\n // Remove from section references\n if (sectionProps.headers) {\n delete sectionProps.headers[type];\n\n // If no more headers, remove the headers object\n if (Object.keys(sectionProps.headers).length === 0) {\n delete sectionProps.headers;\n }\n }\n\n // Note: We can't directly remove from HeaderFooterManager without access to the Header object\n // The manager will be rebuilt on next save() call\n\n return this;\n }\n\n /**\n * Removes a specific footer from the document\n * Removes the footer from HeaderFooterManager, RelationshipManager, and section references\n * Also removes the footer XML file from the ZIP archive\n * @param type Footer type to remove (default, first, even)\n * @returns This document for chaining\n */\n removeFooter(type: 'default' | 'first' | 'even'): this {\n const sectionProps = this.section.getProperties();\n\n // Get the relationship ID from section properties\n const rId = sectionProps.footers?.[type];\n if (!rId) {\n return this; // No footer of this type exists\n }\n\n // Get the footer filename from relationship\n const rel = this.relationshipManager.getRelationship(rId);\n if (rel) {\n const footerPath = `word/${rel.getTarget()}`;\n\n // Remove the footer XML file from ZIP\n if (this.zipHandler.hasFile(footerPath)) {\n this.zipHandler.removeFile(footerPath);\n }\n\n // Remove the relationship\n this.relationshipManager.removeRelationship(rId);\n }\n\n // Remove from section references\n if (sectionProps.footers) {\n delete sectionProps.footers[type];\n\n // If no more footers, remove the footers object\n if (Object.keys(sectionProps.footers).length === 0) {\n delete sectionProps.footers;\n }\n }\n\n // Note: We can't directly remove from HeaderFooterManager without access to the Footer object\n // The manager will be rebuilt on next save() call\n\n return this;\n }\n\n /**\n * Removes all headers from the document\n * Removes all header relationships, section references, and header XML files from the ZIP archive\n * @returns This document for chaining\n */\n clearHeaders(): this {\n const sectionProps = this.section.getProperties();\n\n // Remove each header type\n if (sectionProps.headers) {\n const types = Object.keys(sectionProps.headers) as ('default' | 'first' | 'even')[];\n for (const type of types) {\n this.removeHeader(type);\n }\n }\n\n // Note: Don't call headerFooterManager.clear() as that would clear footers too\n // The manager will be rebuilt correctly during save based on section properties\n\n return this;\n }\n\n /**\n * Removes all footers from the document\n * Removes all footer relationships, section references, and footer XML files from the ZIP archive\n * @returns This document for chaining\n */\n clearFooters(): this {\n const sectionProps = this.section.getProperties();\n\n // Remove each footer type\n if (sectionProps.footers) {\n const types = Object.keys(sectionProps.footers) as ('default' | 'first' | 'even')[];\n for (const type of types) {\n this.removeFooter(type);\n }\n }\n\n // Note: Don't call headerFooterManager.clear() as that would clear headers too\n // The manager will be rebuilt correctly during save based on section properties\n\n return this;\n }\n\n /**\n * Adds an image to the document inside a paragraph\n * @param image The image to add\n * @returns This document for chaining\n */\n addImage(image: Image): this {\n // Generate relationship ID\n const target = `media/image${this.imageManager.getImageCount() + 1}.${image.getExtension()}`;\n const relationship = this.relationshipManager.addImage(target);\n\n // Register image with manager\n this.imageManager.registerImage(image, relationship.getId());\n\n // Create a paragraph containing the image\n const para = new Paragraph();\n // Add image as a run (ImageRun extends Run and generates w:drawing in w:r)\n const imageRun = this.createImageRun(image);\n para.addRun(imageRun);\n\n this.bodyElements.push(para);\n return this;\n }\n\n /**\n * Creates a run containing an image\n * @param image The image\n * @returns ImageRun (extends Run) with the image\n */\n private createImageRun(image: Image): ImageRun {\n // ImageRun extends Run, so it's type-safe to add to paragraphs\n return new ImageRun(image);\n }\n\n /**\n * Gets the ImageManager\n * @returns ImageManager instance\n */\n getImageManager(): ImageManager {\n return this.imageManager;\n }\n\n /**\n * Gets the RelationshipManager\n * @returns RelationshipManager instance\n */\n getRelationshipManager(): RelationshipManager {\n return this.relationshipManager;\n }\n\n /**\n * Processes all hyperlinks in paragraphs and registers them with RelationshipManager\n */\n private processHyperlinks(): void {\n this.generator.processHyperlinks(\n this.bodyElements,\n this.headerFooterManager,\n this.relationshipManager,\n this.footnoteManager,\n this.endnoteManager\n );\n }\n\n /**\n * Saves all images to the ZIP archive\n */\n private saveImages(): void {\n const images = this.imageManager.getAllImages();\n\n for (const entry of images) {\n const imageData = entry.image.getImageData();\n if (imageData && imageData.length > 0) {\n // Save to word/media/\n const path = `word/media/${entry.filename}`;\n this.zipHandler.addFile(path, imageData);\n }\n }\n }\n\n /**\n * Saves all headers to the ZIP archive\n */\n private saveHeaders(): void {\n const headers = this.headerFooterManager.getAllHeaders();\n\n for (const entry of headers) {\n const xml = entry.header.toXML();\n const path = `word/${entry.filename}`;\n this.zipHandler.addFile(path, xml);\n\n // Per OOXML, relationships are part-scoped: hyperlinks in header XML\n // need word/_rels/headerN.xml.rels, not word/_rels/document.xml.rels\n const paragraphs = this.extractParagraphsFromElements(entry.header.getElements());\n this.generatePartLevelHyperlinkRels(paragraphs, `word/_rels/${entry.filename}.rels`);\n }\n }\n\n /**\n * Saves all footers to the ZIP archive\n */\n private saveFooters(): void {\n const footers = this.headerFooterManager.getAllFooters();\n\n for (const entry of footers) {\n const xml = entry.footer.toXML();\n const path = `word/${entry.filename}`;\n this.zipHandler.addFile(path, xml);\n\n // Per OOXML, relationships are part-scoped: hyperlinks in footer XML\n // need word/_rels/footerN.xml.rels, not word/_rels/document.xml.rels\n const paragraphs = this.extractParagraphsFromElements(entry.footer.getElements());\n this.generatePartLevelHyperlinkRels(paragraphs, `word/_rels/${entry.filename}.rels`);\n }\n }\n\n /**\n * Updates the word/_rels/document.xml.rels file with current relationships\n */\n private updateRelationships(): void {\n const xml = this.relationshipManager.generateXml();\n this.zipHandler.updateFile('word/_rels/document.xml.rels', xml);\n }\n\n /**\n * Saves all comments to the ZIP archive\n */\n private saveComments(): void {\n if (this._commentsModified) {\n // Comments were modified — regenerate from in-memory model\n if (this.commentManager.getCount() > 0) {\n const xml = this.commentManager.generateCommentsXml();\n this.zipHandler.addFile('word/comments.xml', xml);\n\n const existingRels = this.relationshipManager.getRelationshipsByType(\n RelationshipType.COMMENTS\n );\n if (existingRels.length === 0) {\n this.relationshipManager.addComments();\n }\n } else {\n // All comments removed — clean up comments.xml and its relationship\n this.zipHandler.removeFile('word/comments.xml');\n const existingRels = this.relationshipManager.getRelationshipsByType(\n RelationshipType.COMMENTS\n );\n for (const rel of existingRels) {\n this.relationshipManager.removeRelationship(rel.getId());\n }\n }\n // Remove companion files since regenerated comments lack w14:paraId\n this.removeCommentCompanionFiles();\n } else if (this._originalCommentsXml) {\n // Passthrough — preserve original comments.xml exactly\n this.zipHandler.addFile('word/comments.xml', this._originalCommentsXml);\n\n // Preserve companion files as-is\n for (const [path, content] of this._originalCommentCompanionFiles) {\n this.zipHandler.addFile(path, content);\n }\n\n // Ensure comments relationship exists\n const existingRels = this.relationshipManager.getRelationshipsByType(\n RelationshipType.COMMENTS\n );\n if (existingRels.length === 0) {\n this.relationshipManager.addComments();\n }\n } else if (this.commentManager.getCount() > 0) {\n // New comments created on a document that had no original comments\n const xml = this.commentManager.generateCommentsXml();\n this.zipHandler.addFile('word/comments.xml', xml);\n\n const existingRels = this.relationshipManager.getRelationshipsByType(\n RelationshipType.COMMENTS\n );\n if (existingRels.length === 0) {\n this.relationshipManager.addComments();\n }\n }\n }\n\n private removeCommentCompanionFiles(): void {\n const companionPaths = [\n DOCX_PATHS.COMMENTS_EXTENDED,\n DOCX_PATHS.COMMENTS_IDS,\n DOCX_PATHS.COMMENTS_EXTENSIBLE,\n ];\n for (const filePath of companionPaths) {\n this.zipHandler.removeFile(filePath);\n const fileName = filePath.replace('word/', '');\n for (const rel of this.relationshipManager.getAllRelationships()) {\n if (rel.getTarget() === fileName) {\n this.relationshipManager.removeRelationship(rel.getId());\n }\n }\n }\n }\n\n private saveFootnotes(): void {\n if (this._footnotesModified || this.footnoteManager.getCount() > 0) {\n const xml = this.footnoteManager.generateFootnotesXml();\n this.zipHandler.addFile(DOCX_PATHS.FOOTNOTES, xml);\n\n const existingRels = this.relationshipManager.getRelationshipsByType(\n RelationshipType.FOOTNOTES\n );\n if (existingRels.length === 0) {\n this.relationshipManager.addFootnotes();\n }\n\n // Per OOXML, relationships are part-scoped: hyperlinks in footnotes.xml\n // need word/_rels/footnotes.xml.rels, not word/_rels/document.xml.rels\n this.generatePartLevelHyperlinkRels(\n this.footnoteManager.getAllFootnotes().flatMap((fn) => fn.getParagraphs()),\n 'word/_rels/footnotes.xml.rels'\n );\n } else if (this._originalFootnotesXml) {\n // Passthrough — preserve original XML exactly\n this.zipHandler.addFile(DOCX_PATHS.FOOTNOTES, this._originalFootnotesXml);\n\n const existingRels = this.relationshipManager.getRelationshipsByType(\n RelationshipType.FOOTNOTES\n );\n if (existingRels.length === 0) {\n this.relationshipManager.addFootnotes();\n }\n }\n }\n\n private saveEndnotes(): void {\n if (this._endnotesModified || this.endnoteManager.getCount() > 0) {\n const xml = this.endnoteManager.generateEndnotesXml();\n this.zipHandler.addFile(DOCX_PATHS.ENDNOTES, xml);\n\n const existingRels = this.relationshipManager.getRelationshipsByType(\n RelationshipType.ENDNOTES\n );\n if (existingRels.length === 0) {\n this.relationshipManager.addEndnotes();\n }\n\n // Per OOXML, relationships are part-scoped: hyperlinks in endnotes.xml\n // need word/_rels/endnotes.xml.rels, not word/_rels/document.xml.rels\n this.generatePartLevelHyperlinkRels(\n this.endnoteManager.getAllEndnotes().flatMap((en) => en.getParagraphs()),\n 'word/_rels/endnotes.xml.rels'\n );\n } else if (this._originalEndnotesXml) {\n // Passthrough — preserve original XML exactly\n this.zipHandler.addFile(DOCX_PATHS.ENDNOTES, this._originalEndnotesXml);\n\n const existingRels = this.relationshipManager.getRelationshipsByType(\n RelationshipType.ENDNOTES\n );\n if (existingRels.length === 0) {\n this.relationshipManager.addEndnotes();\n }\n }\n }\n\n /**\n * Extracts all Paragraph instances from a mixed array of Paragraphs and Tables.\n * Tables are recursed: rows → cells → getParagraphs().\n */\n private extractParagraphsFromElements(elements: (Paragraph | Table)[]): Paragraph[] {\n const result: Paragraph[] = [];\n for (const el of elements) {\n if (el instanceof Paragraph) {\n result.push(el);\n } else if (el instanceof Table) {\n for (const row of el.getRows()) {\n for (const cell of row.getCells()) {\n result.push(...cell.getParagraphs());\n }\n }\n }\n }\n return result;\n }\n\n /**\n * Generates a part-level .rels file for hyperlinks in paragraphs of a specific part.\n * Per OOXML, relationships are part-scoped: hyperlinks in footnotes.xml need\n * word/_rels/footnotes.xml.rels, not word/_rels/document.xml.rels.\n * After generating the .rels file, removes those relationships from the main\n * RelationshipManager so they don't appear in document.xml.rels.\n */\n private generatePartLevelHyperlinkRels(paragraphs: Paragraph[], relsPath: string): void {\n const hyperlinkRels: Array<{ id: string; url: string }> = [];\n\n for (const para of paragraphs) {\n for (const item of para.getContent()) {\n if (item instanceof Hyperlink && item.isExternal()) {\n const relId = item.getRelationshipId();\n const url = item.getUrl();\n if (relId && url) {\n hyperlinkRels.push({ id: relId, url });\n }\n }\n // Also check hyperlinks inside Revision objects (tracked changes)\n if (item instanceof Revision) {\n for (const revContent of item.getContent()) {\n if (revContent instanceof Hyperlink && revContent.isExternal()) {\n const relId = revContent.getRelationshipId();\n const url = revContent.getUrl();\n if (relId && url) {\n hyperlinkRels.push({ id: relId, url });\n }\n }\n }\n }\n }\n }\n\n if (hyperlinkRels.length > 0) {\n let xml = '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n';\n xml +=\n '<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\\n';\n for (const rel of hyperlinkRels) {\n const escapedId = XMLBuilder.escapeXmlAttribute(rel.id);\n const escapedUrl = XMLBuilder.escapeXmlAttribute(rel.url);\n xml += ` <Relationship Id=\"${escapedId}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink\" Target=\"${escapedUrl}\" TargetMode=\"External\"/>\\n`;\n }\n xml += '</Relationships>';\n\n this.zipHandler.addFile(relsPath, xml);\n\n // Remove these relationships from the main RelationshipManager\n // so they don't appear in document.xml.rels\n for (const rel of hyperlinkRels) {\n this.relationshipManager.removeRelationship(rel.id);\n }\n }\n }\n\n /**\n * Updates word/people.xml to include all tracked change authors from the document.\n *\n * Word expects every author referenced in tracked changes (w:ins, w:del, w:pPrChange, etc.)\n * to have a corresponding entry in people.xml. Missing authors cause \"unreadable content\" warnings.\n */\n private updatePeopleXml(): void {\n // Collect all unique authors from tracked changes\n const authors = new Set<string>();\n\n for (const para of this.getAllParagraphs()) {\n // Check revision content (w:ins, w:del, w:moveFrom, w:moveTo)\n for (const item of para.getContent()) {\n if (item instanceof Revision) {\n const author = item.getAuthor();\n if (author) authors.add(author);\n }\n }\n // Check rPrChange authors from runs\n for (const run of para.getRuns()) {\n const rPrChange = run.getPropertyChangeRevision();\n if (rPrChange?.author) {\n authors.add(rPrChange.author);\n }\n }\n // Check pPrChange author\n if (para.formatting.pPrChange?.author) {\n authors.add(para.formatting.pPrChange.author);\n }\n }\n\n // Also check table cells for tracked changes\n for (const element of this.bodyElements) {\n if (element instanceof Table) {\n this.collectAuthorsFromTable(element, authors);\n }\n }\n\n if (authors.size === 0) return;\n\n // Read existing people.xml\n const existingPeopleXml = this.zipHandler.getFileAsString('word/people.xml');\n\n // Extract existing authors from people.xml\n const existingAuthors = new Set<string>();\n if (existingPeopleXml) {\n const authorMatches = existingPeopleXml.matchAll(/w15:author=\"([^\"]+)\"/g);\n for (const match of authorMatches) {\n if (match[1]) existingAuthors.add(match[1]);\n }\n }\n\n // Find authors that are missing from people.xml\n const missingAuthors: string[] = [];\n for (const author of authors) {\n if (!existingAuthors.has(author)) {\n missingAuthors.push(author);\n }\n }\n\n if (missingAuthors.length === 0) return;\n\n // Build person elements for missing authors\n const personElements = missingAuthors\n .map((author) => {\n const escapedAuthor = author\n .replace(/&/g, '&amp;')\n .replace(/\"/g, '&quot;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;');\n return `<w15:person w15:author=\"${escapedAuthor}\"><w15:presenceInfo w15:providerId=\"None\" w15:userId=\"${escapedAuthor}\"/></w15:person>`;\n })\n .join('');\n\n if (existingPeopleXml) {\n // Insert new person elements before closing tag\n const updatedXml = existingPeopleXml.replace(\n '</w15:people>',\n `${personElements}</w15:people>`\n );\n this.zipHandler.updateFile('word/people.xml', updatedXml);\n } else {\n // Create new people.xml\n const newPeopleXml = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<w15:people xmlns:w15=\"http://schemas.microsoft.com/office/word/2012/wordml\" xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" mc:Ignorable=\"w15\">${personElements}</w15:people>`;\n this.zipHandler.addFile('word/people.xml', newPeopleXml);\n }\n\n // Ensure people.xml has a relationship entry\n const peopleType = RelationshipType.PEOPLE;\n const existingPeopleRels = this.relationshipManager.getRelationshipsByType(peopleType);\n if (existingPeopleRels.length === 0) {\n this.relationshipManager.addPeople();\n }\n\n this.logger.info('Updated people.xml with missing authors', {\n added: missingAuthors.length,\n authors: missingAuthors,\n });\n }\n\n /**\n * Recursively collects tracked change authors from a table's cells\n */\n private collectAuthorsFromTable(table: Table, authors: Set<string>): void {\n for (let r = 0; r < table.getRowCount(); r++) {\n const row = table.getRow(r);\n if (!row) continue;\n for (let c = 0; c < row.getCellCount(); c++) {\n const cell = row.getCell(c);\n if (!cell) continue;\n for (const para of cell.getParagraphs()) {\n for (const item of para.getContent()) {\n if (item instanceof Revision) {\n const author = item.getAuthor();\n if (author) authors.add(author);\n }\n }\n // Check rPrChange authors from runs\n for (const run of para.getRuns()) {\n const rPrChange = run.getPropertyChangeRevision();\n if (rPrChange?.author) {\n authors.add(rPrChange.author);\n }\n }\n if (para.formatting.pPrChange?.author) {\n authors.add(para.formatting.pPrChange.author);\n }\n }\n }\n }\n }\n\n /**\n * Saves custom properties to the ZIP archive\n */\n private saveCustomProperties(): void {\n // Only save custom.xml if there are custom properties\n if (\n this.properties.customProperties &&\n Object.keys(this.properties.customProperties).length > 0\n ) {\n const customXml = this.generator.generateCustomProps(this.properties.customProperties);\n if (customXml) {\n this.zipHandler.addFile('docProps/custom.xml', customXml);\n }\n }\n }\n\n /**\n * Parses [Content_Types].xml and extracts all Default and Override entries\n * Stores entries in format \"ext|mimetype\" and \"path|mimetype\" to enable round-trip preservation\n *\n * @param xml - The [Content_Types].xml content to parse\n * @returns Object containing sets of defaults and overrides\n */\n private parseContentTypes(xml: string): { defaults: Set<string>; overrides: Set<string> } {\n const defaults = new Set<string>();\n const overrides = new Set<string>();\n\n // Extract all <Default Extension=\"...\" ContentType=\"...\"/> entries\n const defaultMatches = xml.matchAll(\n /<Default\\s+Extension=\"([^\"]+)\"\\s+ContentType=\"([^\"]+)\"\\s*\\/>/g\n );\n for (const match of defaultMatches) {\n defaults.add(`${match[1]}|${match[2]}`); // Store as \"ext|mimetype\"\n }\n\n // Extract all <Override PartName=\"...\" ContentType=\"...\"/> entries\n const overrideMatches = xml.matchAll(\n /<Override\\s+PartName=\"([^\"]+)\"\\s+ContentType=\"([^\"]+)\"\\s*\\/>/g\n );\n for (const match of overrideMatches) {\n overrides.add(`${match[1]}|${match[2]}`); // Store as \"path|mimetype\"\n }\n\n return { defaults, overrides };\n }\n\n /**\n * Updates [Content_Types].xml to include image extensions, headers/footers, comments, and custom properties\n * Preserves entries for files that exist in the loaded document\n */\n private updateContentTypesWithImagesHeadersFootersAndComments(): void {\n const hasCustomProps =\n this.properties.customProperties && Object.keys(this.properties.customProperties).length > 0;\n\n const contentTypes = this.generator.generateContentTypesWithImagesHeadersFootersAndComments(\n this.imageManager,\n this.headerFooterManager,\n this.commentManager,\n this.zipHandler, // Pass zipHandler to check file existence\n undefined, // fontManager (optional)\n hasCustomProps, // Flag to include custom.xml override\n this._originalContentTypes, // Pass preserved original entries for round-trip fidelity\n this.footnoteManager,\n this.endnoteManager\n );\n this.zipHandler.updateFile(DOCX_PATHS.CONTENT_TYPES, contentTypes);\n }\n\n /**\n * Gets the BookmarkManager for bookmark operations\n *\n * Provides access to the BookmarkManager for advanced bookmark management,\n * including creating, querying, and managing document bookmarks.\n *\n * @returns The BookmarkManager instance managing this document's bookmarks\n *\n * @example\n * ```typescript\n * const bookmarks = doc.getBookmarkManager();\n * console.log(`Document has ${bookmarks.getAllBookmarks().length} bookmarks`);\n * ```\n */\n getBookmarkManager(): BookmarkManager {\n return this.bookmarkManager;\n }\n\n /**\n * Creates and registers a new bookmark with a unique name\n *\n * Creates a bookmark that can be used as an anchor for internal hyperlinks\n * or cross-references. The name is automatically normalized and made unique.\n *\n * @param name - Desired bookmark name (will be normalized to remove spaces and special characters)\n * @returns The created and registered Bookmark instance\n *\n * @example\n * ```typescript\n * const bookmark = doc.createBookmark('ImportantSection');\n * const para = doc.createParagraph('This is important');\n * para.addBookmark(bookmark);\n *\n * // Link to it from elsewhere\n * const link = Hyperlink.createInternal(bookmark.getName(), 'Go to section');\n * doc.createParagraph().addHyperlink(link);\n * ```\n */\n createBookmark(name: string): Bookmark {\n return this.bookmarkManager.createBookmark(name);\n }\n\n /**\n * Creates and registers a bookmark for a heading\n * Automatically generates a unique name from the heading text\n * @param headingText - The text of the heading\n * @returns The created and registered bookmark\n */\n createHeadingBookmark(headingText: string): Bookmark {\n return this.bookmarkManager.createHeadingBookmark(headingText);\n }\n\n /**\n * Gets a bookmark by name\n * @param name - Bookmark name\n * @returns The bookmark, or undefined if not found\n */\n getBookmark(name: string): Bookmark | undefined {\n return this.bookmarkManager.getBookmark(name);\n }\n\n /**\n * Checks if a bookmark exists\n * @param name - Bookmark name\n * @returns True if the bookmark exists\n */\n hasBookmark(name: string): boolean {\n return this.bookmarkManager.hasBookmark(name);\n }\n\n /**\n * Adds a bookmark to a paragraph (wraps the entire paragraph)\n * Creates the bookmark if a name is provided, or uses an existing bookmark object\n * @param paragraph - The paragraph to bookmark\n * @param bookmarkOrName - Bookmark object or bookmark name\n * @returns The bookmark that was added\n */\n addBookmarkToParagraph(paragraph: Paragraph, bookmarkOrName: Bookmark | string): Bookmark {\n const bookmark =\n typeof bookmarkOrName === 'string' ? this.createBookmark(bookmarkOrName) : bookmarkOrName;\n\n paragraph.addBookmark(bookmark);\n return bookmark;\n }\n\n /**\n * Adds or retrieves a \"_top\" bookmark at the beginning of the document\n *\n * This is a convenience method that ensures a \"_top\" bookmark exists at the start of the document body.\n * The bookmark is placed in an empty paragraph at position 0, with the structure:\n * ```xml\n * <w:bookmarkStart w:id=\"0\" w:name=\"_top\"/>\n * <w:bookmarkEnd w:id=\"0\"/>\n * ```\n *\n * This method is idempotent - calling it multiple times will not create duplicate bookmarks.\n * If the \"_top\" bookmark already exists, the existing bookmark is returned.\n *\n * @returns Object containing:\n * - `bookmark`: The Bookmark instance for \"_top\"\n * - `anchor`: The anchor name (\"_top\") for creating hyperlinks\n * - `hyperlink`: Convenience function to create a hyperlink to this bookmark\n *\n * @example\n * ```typescript\n * // Add or retrieve the _top bookmark\n * const { bookmark, anchor, hyperlink } = doc.addTopBookmark();\n *\n * // Create a hyperlink to the top of the document\n * const link = hyperlink('Back to top');\n * paragraph.addHyperlink(link);\n *\n * // Or create it manually\n * const link2 = Hyperlink.createInternal(anchor, 'Go to top');\n * ```\n */\n addTopBookmark(): {\n bookmark: Bookmark;\n anchor: string;\n hyperlink: (text: string, formatting?: RunFormatting) => Hyperlink;\n } {\n const BOOKMARK_NAME = '_top';\n\n // Check if _top bookmark already exists\n let bookmark = this.getBookmark(BOOKMARK_NAME);\n\n if (!bookmark) {\n // Create new _top bookmark\n // Note: We use skipNormalization to preserve the exact name \"_top\"\n // and explicitly set id to 0 as per the XML structure requirement\n bookmark = new Bookmark({\n id: 0,\n name: BOOKMARK_NAME,\n skipNormalization: true,\n });\n\n // Register the bookmark with the manager\n this.bookmarkManager.register(bookmark);\n\n // Add bookmark to the first existing paragraph if document has content\n // This avoids creating a visible newline at the top of the document\n const paragraphs = this.getAllParagraphs();\n\n if (paragraphs.length > 0 && paragraphs[0]) {\n // Add bookmark to first existing paragraph\n paragraphs[0].addBookmark(bookmark);\n } else {\n // Fallback: Create empty paragraph if document is empty\n const topParagraph = new Paragraph();\n topParagraph.addBookmark(bookmark);\n this.bodyElements.unshift(topParagraph);\n }\n }\n\n // Return the bookmark information and a convenience function\n return {\n bookmark,\n anchor: BOOKMARK_NAME,\n hyperlink: (text: string, formatting?: RunFormatting) => {\n return Hyperlink.createInternal(BOOKMARK_NAME, text, formatting);\n },\n };\n }\n\n /**\n * Gets the RevisionManager for track changes operations\n *\n * Provides access to the RevisionManager for managing tracked changes\n * (insertions, deletions, formatting changes, etc.) in the document.\n *\n * @returns The RevisionManager instance managing this document's revisions\n *\n * @example\n * ```typescript\n * const revManager = doc.getRevisionManager();\n * const stats = revManager.getStats();\n * console.log(`Document has ${stats.total} tracked changes`);\n * ```\n */\n getRevisionManager(): RevisionManager {\n return this.revisionManager;\n }\n\n // ============================================================\n // Revision Validation Methods\n // ============================================================\n\n /**\n * Validates all revisions in the document for ECMA-376 compliance.\n *\n * Checks for:\n * - Duplicate revision IDs\n * - Missing or invalid author attributes\n * - Orphaned move markers (moveFrom without moveTo or vice versa)\n * - Missing or invalid date formats\n * - Empty revisions\n * - Non-sequential IDs (in strict mode)\n *\n * @param options - Validation options\n * @returns Validation result with all issues found\n *\n * @example\n * ```typescript\n * const result = doc.validateRevisions();\n * if (!result.valid) {\n * console.error(`Found ${result.errors.length} errors:`);\n * for (const error of result.errors) {\n * console.error(` ${error.code}: ${error.message}`);\n * }\n * }\n * ```\n */\n validateRevisions(options?: ValidationOptions): ValidationResult {\n return RevisionValidator.validate(this, options);\n }\n\n /**\n * Auto-fixes revision validation issues.\n *\n * Can fix:\n * - Duplicate IDs (reassigns unique IDs)\n * - Missing authors (sets default author)\n * - Missing dates (sets current date)\n * - Orphaned move markers (removes orphaned markers)\n * - Empty revisions (removes them)\n * - Non-sequential IDs (reassigns sequentially)\n *\n * @param options - Auto-fix options\n * @returns Result with details of all fixes applied\n *\n * @example\n * ```typescript\n * // Fix all issues\n * const result = doc.autoFixRevisions();\n * console.log(`Fixed ${result.issuesFixed} issues`);\n *\n * // Preview fixes without applying\n * const preview = doc.autoFixRevisions({ dryRun: true });\n * console.log('Would fix:', preview.actions.map(a => a.action));\n * ```\n */\n autoFixRevisions(options?: AutoFixOptions): AutoFixResult {\n return RevisionAutoFixer.fix(this, options);\n }\n\n /**\n * Quick check if document revisions are valid.\n *\n * @returns True if document has no revision errors\n *\n * @example\n * ```typescript\n * if (!doc.isRevisionValid()) {\n * doc.autoFixRevisions();\n * }\n * ```\n */\n isRevisionsValid(): boolean {\n return RevisionValidator.isValid(this);\n }\n\n /**\n * Validates and auto-fixes revisions before save.\n *\n * This is a convenience method that validates first, then auto-fixes\n * any issues found. Use this before saving to ensure the document\n * will open correctly in Word.\n *\n * @param options - Options for validation and fixing\n * @returns Combined result of validation and fixing\n *\n * @example\n * ```typescript\n * const result = doc.validateAndFixRevisions();\n * if (result.validation.valid) {\n * await doc.save('output.docx');\n * }\n * ```\n */\n validateAndFixRevisions(options?: { validation?: ValidationOptions; autoFix?: AutoFixOptions }): {\n validation: ValidationResult;\n fix: AutoFixResult;\n } {\n // First validate\n const validation = this.validateRevisions(options?.validation);\n\n // If issues found, auto-fix\n let fix: AutoFixResult = {\n allFixed: true,\n issuesFixed: 0,\n issuesRemaining: 0,\n actions: [],\n errors: [],\n };\n\n if (!validation.valid) {\n fix = this.autoFixRevisions(options?.autoFix);\n }\n\n return { validation, fix };\n }\n\n /**\n * Creates and registers a new insertion revision\n * @param author - Author who made the insertion\n * @param content - Inserted content (Run or array of Runs)\n * @param date - Optional date (defaults to now)\n * @returns The created and registered revision\n */\n createInsertion(author: string, content: Run | Run[], date?: Date): Revision {\n const revision = Revision.createInsertion(author, content, date);\n return this.revisionManager.register(revision);\n }\n\n /**\n * Creates and registers a new deletion revision\n * @param author - Author who made the deletion\n * @param content - Deleted content (Run or array of Runs)\n * @param date - Optional date (defaults to now)\n * @returns The created and registered revision\n */\n createDeletion(author: string, content: Run | Run[], date?: Date): Revision {\n const revision = Revision.createDeletion(author, content, date);\n return this.revisionManager.register(revision);\n }\n\n /**\n * Creates and registers a revision from text\n * Convenience method that creates a Run from the text\n * @param type - Revision type ('insert' or 'delete')\n * @param author - Author who made the change\n * @param text - Text content\n * @param date - Optional date (defaults to now)\n * @returns The created and registered revision\n */\n createRevisionFromText(type: RevisionType, author: string, text: string, date?: Date): Revision {\n const revision = Revision.fromText(type, author, text, date);\n return this.revisionManager.register(revision);\n }\n\n /**\n * Finds the index of a paragraph in the document body\n * @param paragraph - The paragraph to find\n * @returns The index (0-based), or -1 if not found\n */\n private findParagraphIndex(paragraph: Paragraph): number {\n const paragraphs = this.getParagraphs();\n return paragraphs.indexOf(paragraph);\n }\n\n /**\n * Creates a RevisionLocation for a paragraph\n * @param paragraph - The paragraph containing the revision\n * @param runIndex - Optional run index within the paragraph\n * @returns RevisionLocation with paragraph index, or undefined if not found\n */\n private createRevisionLocation(\n paragraph: Paragraph,\n runIndex?: number\n ): RevisionLocation | undefined {\n const paragraphIndex = this.findParagraphIndex(paragraph);\n if (paragraphIndex === -1) {\n return undefined; // Paragraph not found in document\n }\n const location: RevisionLocation = { paragraphIndex };\n if (runIndex !== undefined) {\n location.runIndex = runIndex;\n }\n return location;\n }\n\n /**\n * Adds a tracked insertion to a paragraph\n * @param paragraph - The paragraph to add the insertion to\n * @param author - Author who made the insertion\n * @param text - Inserted text\n * @param date - Optional date (defaults to now)\n * @returns The created revision with location set\n */\n trackInsertion(paragraph: Paragraph, author: string, text: string, date?: Date): Revision {\n const revision = this.createRevisionFromText('insert', author, text, date);\n\n // Set location for changelog/tracking purposes\n const location = this.createRevisionLocation(paragraph);\n if (location) {\n // Run index will be the next run position in the paragraph\n location.runIndex = paragraph.getRuns().length;\n revision.setLocation(location);\n }\n\n paragraph.addRevision(revision);\n return revision;\n }\n\n /**\n * Adds a tracked deletion to a paragraph\n * @param paragraph - The paragraph to add the deletion to\n * @param author - Author who made the deletion\n * @param text - Deleted text\n * @param date - Optional date (defaults to now)\n * @returns The created revision with location set\n */\n trackDeletion(paragraph: Paragraph, author: string, text: string, date?: Date): Revision {\n const revision = this.createRevisionFromText('delete', author, text, date);\n\n // Set location for changelog/tracking purposes\n const location = this.createRevisionLocation(paragraph);\n if (location) {\n // Run index will be the next run position in the paragraph\n location.runIndex = paragraph.getRuns().length;\n revision.setLocation(location);\n }\n\n paragraph.addRevision(revision);\n return revision;\n }\n\n /**\n * Adds a tracked field instruction deletion to a paragraph\n * Uses w:delInstrText instead of w:delText for field codes\n * @param paragraph - The paragraph to add the deletion to\n * @param author - Author who made the deletion\n * @param fieldInstruction - Deleted field instruction text (e.g., 'PAGE', 'DATE')\n * @param date - Optional date (defaults to now)\n * @returns The created revision with location set\n * @example\n * // Track deletion of a PAGE field\n * const para = doc.createParagraph();\n * doc.trackFieldInstructionDeletion(para, 'Alice', 'PAGE \\\\* MERGEFORMAT');\n */\n trackFieldInstructionDeletion(\n paragraph: Paragraph,\n author: string,\n fieldInstruction: string,\n date?: Date\n ): Revision {\n const run = new Run(fieldInstruction);\n const revision = Revision.createFieldInstructionDeletion(author, run, date);\n this.revisionManager.register(revision);\n\n // Set location for changelog/tracking purposes\n const location = this.createRevisionLocation(paragraph);\n if (location) {\n location.runIndex = paragraph.getRuns().length;\n revision.setLocation(location);\n }\n\n paragraph.addRevision(revision);\n return revision;\n }\n\n /**\n * Marks a paragraph mark as deleted (tracked change)\n *\n * When a paragraph mark is deleted, it indicates that the paragraph\n * was joined with the next paragraph. This creates a deletion marker\n * in the paragraph properties (w:pPr/w:rPr/w:del) per ECMA-376 Part 1 §17.13.5.14.\n *\n * @param paragraph - Paragraph whose mark is deleted\n * @param author - Author who deleted the paragraph mark\n * @param date - Optional date (defaults to now)\n * @returns The paragraph for chaining\n * @example\n * // Mark paragraph mark as deleted when joining paragraphs\n * const para = doc.createParagraph('First paragraph');\n * doc.trackParagraphMarkDeletion(para, 'Alice');\n * // In Word, this shows the ¶ symbol as deleted\n */\n trackParagraphMarkDeletion(paragraph: Paragraph, author: string, date?: Date): Paragraph {\n const revisionId = this.revisionManager.consumeNextId();\n paragraph.markParagraphMarkAsDeleted(revisionId, author, date);\n return paragraph;\n }\n\n /**\n * Checks if the document contains any tracked changes\n *\n * Note: This checks if revisions exist, not if tracking is enabled.\n * Use {@link isTrackChangesEnabled} to check the tracking mode setting.\n *\n * @returns True if the document has one or more tracked changes (insertions, deletions, etc.)\n *\n * @example\n * ```typescript\n * if (doc.isTrackingChanges()) {\n * console.log('Document has pending changes to review');\n * const stats = doc.getRevisionStats();\n * console.log(`${stats.insertions} insertions, ${stats.deletions} deletions`);\n * }\n * ```\n */\n isTrackingChanges(): boolean {\n return this.revisionManager.isTrackingChanges();\n }\n\n /**\n * Checks if the document has any tracked changes (revisions)\n *\n * Convenience method that checks whether the document contains any revision\n * objects (insertions, deletions, moves, property changes, etc.).\n *\n * This is functionally equivalent to {@link isTrackingChanges} but uses a\n * more intuitive name that clarifies it checks for the *presence* of revisions,\n * not whether tracking mode is enabled.\n *\n * @returns True if the document contains one or more tracked changes\n *\n * @example\n * ```typescript\n * if (doc.hasTrackedChanges()) {\n * console.log('Document has pending revisions to review');\n * const stats = doc.getRevisionStats();\n * console.log(`Found ${stats.total} tracked changes`);\n * }\n * ```\n *\n * @see {@link isTrackingChanges} - Identical functionality\n * @see {@link isTrackChangesEnabled} - Checks if tracking mode is enabled\n */\n hasTrackedChanges(): boolean {\n return this.revisionManager.isTrackingChanges();\n }\n\n /**\n * Checks if the document's raw XML contains revision markup.\n *\n * This method checks the actual XML content of the document for revision\n * elements like `<w:ins>`, `<w:del>`, `<w:moveFrom>`, and `<w:moveTo>`.\n * Unlike {@link hasTrackedChanges}, which only checks the in-memory model,\n * this method detects revisions that may not have been fully parsed.\n *\n * Use this when you need to know if the document file contains any tracked\n * changes, regardless of whether they were parsed into the object model.\n *\n * @returns True if the raw XML contains revision markup\n *\n * @example\n * ```typescript\n * const doc = await Document.load('document.docx');\n *\n * // Check raw XML for revisions (more reliable)\n * if (doc.hasRawXmlRevisions()) {\n * console.log('Document XML contains tracked changes');\n * }\n *\n * // Compare with in-memory check\n * if (doc.hasTrackedChanges()) {\n * console.log('Document has parsed revisions in memory');\n * }\n * ```\n */\n hasRawXmlRevisions(): boolean {\n const documentXml = this.zipHandler.getFileAsString('word/document.xml');\n if (!documentXml) {\n return false;\n }\n // Use precise patterns to avoid false matches like <w:insideH> (table borders)\n // Revision elements are: <w:ins ...>, <w:del ...>, <w:moveFrom ...>, <w:moveTo ...>\n // They either have attributes (<w:ins w:author=...) or just close (>)\n return (\n /<w:ins[\\s>]/.test(documentXml) ||\n /<w:del[\\s>]/.test(documentXml) ||\n /<w:moveFrom[\\s>]/.test(documentXml) ||\n /<w:moveTo[\\s>]/.test(documentXml)\n );\n }\n\n /**\n * Gets detailed statistics about tracked changes in the document\n *\n * Provides a comprehensive breakdown of all revisions including counts\n * by type, list of authors, and the next available revision ID.\n *\n * @returns Object containing revision statistics\n *\n * @example\n * ```typescript\n * const stats = doc.getRevisionStats();\n * console.log(`Total changes: ${stats.total}`);\n * console.log(`Insertions: ${stats.insertions}`);\n * console.log(`Deletions: ${stats.deletions}`);\n * console.log(`Authors: ${stats.authors.join(', ')}`);\n * ```\n */\n getRevisionStats(): {\n total: number;\n insertions: number;\n deletions: number;\n propertyChanges: number;\n moves: number;\n tableCellChanges: number;\n authors: string[];\n nextId: number;\n } {\n return this.revisionManager.getStats();\n }\n\n /**\n * Enables track changes mode for the document\n *\n * When enabled, Word will track all future edits made to the document.\n * This adds the w:trackRevisions flag to settings.xml and configures\n * revision view settings (what changes are visible).\n *\n * @param options - Optional track changes configuration\n * @param options.trackFormatting - Track formatting changes (default: true)\n * @param options.showInsertionsAndDeletions - Display insertions/deletions in Word (default: true)\n * @param options.showFormatting - Display formatting changes in Word (default: true)\n * @param options.showInkAnnotations - Display ink annotations in Word (default: true)\n * @returns This document instance for method chaining\n *\n * @example\n * ```typescript\n * // Enable with defaults\n * doc.enableTrackChanges();\n * ```\n *\n * @example\n * ```typescript\n * // Enable with custom settings\n * doc.enableTrackChanges({\n * trackFormatting: false,\n * showInsertionsAndDeletions: true\n * });\n * ```\n */\n enableTrackChanges(options?: {\n /** Author name for automatically tracked changes (default: 'DocHub') */\n author?: string;\n trackFormatting?: boolean;\n showInsertionsAndDeletions?: boolean;\n showFormatting?: boolean;\n showInkAnnotations?: boolean;\n /**\n * Whether to clear existing pPrChange elements before enabling tracking.\n * Default: true\n *\n * When true, any existing paragraph property change tracking (w:pPrChange)\n * is cleared before enabling fresh tracking. This prevents merge issues\n * where Word requires multiple \"Accept All\" clicks.\n *\n * Set to false only if you specifically want to preserve and merge with\n * existing pPrChange elements.\n */\n clearExistingPropertyChanges?: boolean;\n }): this {\n // Clear existing pPrChange elements to prevent merge issues with Word\n // This ensures Word's \"Accept All Changes\" works in a single click\n // Can be disabled via options.clearExistingPropertyChanges = false\n const shouldClear = options?.clearExistingPropertyChanges !== false;\n if (shouldClear) {\n this.clearAllParagraphPropertyChanges();\n }\n\n this.trackChangesEnabled = true;\n this._settingsModified = true;\n\n if (options) {\n if (options.trackFormatting !== undefined) {\n this.trackFormatting = options.trackFormatting;\n }\n if (options.showInsertionsAndDeletions !== undefined) {\n this.revisionViewSettings.showInsertionsAndDeletions = options.showInsertionsAndDeletions;\n }\n if (options.showFormatting !== undefined) {\n this.revisionViewSettings.showFormatting = options.showFormatting;\n }\n if (options.showInkAnnotations !== undefined) {\n this.revisionViewSettings.showInkAnnotations = options.showInkAnnotations;\n }\n }\n\n // Enable the tracking context for automatic change tracking\n this.trackingContext.enable({\n author: options?.author,\n trackFormatting: this.trackFormatting,\n });\n\n // Bind tracking context to all existing elements\n this.bindTrackingToAllElements();\n\n return this;\n }\n\n /**\n * Disables track changes mode for the document\n *\n * When disabled, Word will not track future edits.\n * Note: This does NOT remove existing tracked changes.\n *\n * @returns This document instance for method chaining\n *\n * @example\n * ```typescript\n * doc.disableTrackChanges();\n * await doc.save('output.docx'); // Future edits won't be tracked\n * ```\n */\n disableTrackChanges(): this {\n this.trackChangesEnabled = false;\n this._settingsModified = true;\n this.trackingContext.disable(); // Flushes pending changes and disables\n return this;\n }\n\n /**\n * Checks if track changes is enabled\n * @returns True if track changes is enabled\n */\n isTrackChangesEnabled(): boolean {\n return this.trackChangesEnabled;\n }\n\n /**\n * Gets the track formatting setting\n * @returns True if formatting changes are tracked\n */\n isTrackFormattingEnabled(): boolean {\n return this.trackFormatting;\n }\n\n /**\n * Gets the revision view settings\n * @returns Revision view settings\n */\n getRevisionViewSettings(): {\n showInsertionsAndDeletions: boolean;\n showFormatting: boolean;\n showInkAnnotations: boolean;\n } {\n return { ...this.revisionViewSettings };\n }\n\n /**\n * Gets the tracking context for automatic change tracking.\n * Elements use this to notify the document of changes.\n * @returns The tracking context\n */\n getTrackingContext(): TrackingContext {\n return this.trackingContext;\n }\n\n /**\n * Flushes all pending tracked changes and creates Revision objects.\n * Called automatically on save, but can be called manually.\n * @returns Array of created Revision objects\n */\n flushPendingChanges(): Revision[] {\n return this.trackingContext.flushPendingChanges();\n }\n\n /**\n * Enable automatic acceptance of all revisions before save.\n *\n * When enabled, acceptAllRevisions() is called after flushPendingChanges()\n * but before XML generation during save(). This ensures ALL revisions\n * (including those created during save) are accepted.\n *\n * This is useful when you want a clean document without visible tracked changes,\n * but need to process the document first and capture changes for logging/UI display.\n *\n * @param accept - Whether to accept all revisions before save (default: false)\n * @returns This document instance for method chaining\n *\n * @example\n * ```typescript\n * // Enable track changes for processing\n * doc.enableTrackChanges({ author: 'DocHub' });\n *\n * // Make modifications (automatically tracked)\n * doc.createParagraph('New content');\n *\n * // Extract changes for UI display BEFORE accepting\n * const changes = ChangelogGenerator.fromDocument(doc);\n *\n * // Enable auto-accept so document will be clean after save\n * doc.setAcceptRevisionsBeforeSave(true);\n * doc.disableTrackChanges();\n *\n * // Save - all revisions will be accepted, document will have no visible tracked changes\n * await doc.save('output.docx');\n * ```\n */\n setAcceptRevisionsBeforeSave(accept: boolean): this {\n this.acceptRevisionsBeforeSave = accept;\n return this;\n }\n\n /**\n * Check if revisions will be automatically accepted before save.\n * @returns True if revisions will be accepted before save\n */\n getAcceptRevisionsBeforeSave(): boolean {\n return this.acceptRevisionsBeforeSave;\n }\n\n /**\n * Binds the tracking context to all existing elements in the document.\n * Called automatically when track changes is enabled.\n * @internal\n */\n private bindTrackingToAllElements(): void {\n for (const element of this.bodyElements) {\n this.bindTrackingToElement(element);\n }\n // Bind tracking to section\n this.bindTrackingToElement(this.section);\n\n // Headers\n for (const entry of this.headerFooterManager.getAllHeaders()) {\n for (const element of entry.header.getElements()) {\n this.bindTrackingToElement(element);\n }\n }\n\n // Footers\n for (const entry of this.headerFooterManager.getAllFooters()) {\n for (const element of entry.footer.getElements()) {\n this.bindTrackingToElement(element);\n }\n }\n\n // Footnotes\n for (const footnote of this.footnoteManager.getAllFootnotes()) {\n for (const para of footnote.getParagraphs()) {\n this.bindTrackingToElement(para);\n }\n }\n\n // Endnotes\n for (const endnote of this.endnoteManager.getAllEndnotes()) {\n for (const para of endnote.getParagraphs()) {\n this.bindTrackingToElement(para);\n }\n }\n\n // Comments\n for (const comment of this.commentManager.getAllCommentsWithReplies()) {\n for (const run of comment.getRuns()) {\n this.bindTrackingToElement(run);\n }\n }\n }\n\n /**\n * Binds the tracking context to an element and its children.\n * @param element - Element to bind\n * @internal\n */\n private bindTrackingToElement(element: any): void {\n // Set tracking context on element if it supports it\n if (element && typeof element._setTrackingContext === 'function') {\n element._setTrackingContext(this.trackingContext);\n }\n\n // Recursively bind to runs\n if (element && typeof element.getRuns === 'function') {\n for (const run of element.getRuns()) {\n this.bindTrackingToElement(run);\n }\n }\n\n // Recursively bind to hyperlinks\n if (element && typeof element.getHyperlinks === 'function') {\n for (const link of element.getHyperlinks()) {\n this.bindTrackingToElement(link);\n }\n }\n\n // Recursively bind to table rows and cells\n if (element && typeof element.getRows === 'function') {\n for (const row of element.getRows()) {\n this.bindTrackingToElement(row);\n if (typeof row.getCells === 'function') {\n for (const cell of row.getCells()) {\n this.bindTrackingToElement(cell);\n // Bind to paragraphs in cell\n if (typeof cell.getParagraphs === 'function') {\n for (const para of cell.getParagraphs()) {\n this.bindTrackingToElement(para);\n }\n }\n }\n }\n }\n }\n }\n\n /**\n * Sets the RSID root for this document\n * RSID (Revision Save ID) identifies the first editing session\n * @param rsidRoot - 8-character hexadecimal RSID value\n */\n setRsidRoot(rsidRoot: string): this {\n // Validate RSID format (8 hex characters)\n if (!/^[0-9A-Fa-f]{8}$/.test(rsidRoot)) {\n throw new Error('RSID must be an 8-character hexadecimal value');\n }\n this.rsidRoot = rsidRoot.toUpperCase();\n this.rsids.add(this.rsidRoot);\n this._settingsModified = true;\n return this;\n }\n\n /**\n * Adds an RSID to the document\n * Each editing session gets a unique RSID\n * @param rsid - 8-character hexadecimal RSID value\n */\n addRsid(rsid: string): this {\n // Validate RSID format\n if (!/^[0-9A-Fa-f]{8}$/.test(rsid)) {\n throw new Error('RSID must be an 8-character hexadecimal value');\n }\n this.rsids.add(rsid.toUpperCase());\n this._settingsModified = true;\n return this;\n }\n\n /**\n * Generates a new random RSID and adds it to the document\n * @returns The generated RSID\n */\n generateRsid(): string {\n const rsid = Math.floor(Math.random() * 0xffffffff)\n .toString(16)\n .toUpperCase()\n .padStart(8, '0');\n this.rsids.add(rsid);\n this._settingsModified = true;\n return rsid;\n }\n\n /**\n * Gets the RSID root value\n * @returns RSID root or undefined if not set\n */\n getRsidRoot(): string | undefined {\n return this.rsidRoot;\n }\n\n /**\n * Gets all RSIDs in the document\n * @returns Array of RSID values\n */\n getRsids(): string[] {\n return Array.from(this.rsids);\n }\n\n /**\n * Protects the document with specified edit restrictions\n * @param protection - Document protection settings\n */\n protectDocument(protection: {\n edit: 'readOnly' | 'comments' | 'trackedChanges' | 'forms';\n enforcement?: boolean;\n password?: string;\n cryptProviderType?: string;\n cryptAlgorithmClass?: string;\n cryptAlgorithmType?: string;\n cryptAlgorithmSid?: number;\n cryptSpinCount?: number;\n }): this {\n this.documentProtection = {\n edit: protection.edit,\n enforcement: protection.enforcement ?? true,\n cryptProviderType: protection.cryptProviderType,\n cryptAlgorithmClass: protection.cryptAlgorithmClass,\n cryptAlgorithmType: protection.cryptAlgorithmType,\n cryptAlgorithmSid: protection.cryptAlgorithmSid,\n cryptSpinCount: protection.cryptSpinCount,\n };\n this._settingsModified = true;\n\n // If password provided, generate hash and salt\n if (protection.password) {\n // For now, use a simple hash. In production, use proper cryptographic functions\n const crypto = require('crypto');\n const salt = crypto.randomBytes(16).toString('base64');\n const hash = crypto\n .pbkdf2Sync(protection.password, salt, protection.cryptSpinCount || 100000, 32, 'sha512')\n .toString('base64');\n\n this.documentProtection.hash = hash;\n this.documentProtection.salt = salt;\n }\n\n return this;\n }\n\n /**\n * Removes document protection\n */\n unprotectDocument(): this {\n this.documentProtection = undefined;\n this._settingsModified = true;\n return this;\n }\n\n /**\n * Checks if document is protected\n * @returns True if document has protection enabled\n */\n isProtected(): boolean {\n return this.documentProtection !== undefined;\n }\n\n /**\n * Gets document protection settings\n * @returns Document protection settings or undefined\n */\n getProtection(): typeof this.documentProtection {\n return this.documentProtection;\n }\n\n // ==================== COMPATIBILITY MODE API ====================\n\n /**\n * Gets the document's compatibility mode version.\n *\n * For loaded documents, returns the mode parsed from settings.xml.\n * For new documents, returns Word2013Plus (15) since that's what the framework generates.\n * Per MS-DOCX spec, the default when the w:compat block is absent is 12 (Word 2007).\n *\n * @returns The CompatibilityMode enum value (11, 12, 14, or 15)\n */\n getCompatibilityMode(): CompatibilityMode {\n return this._compatInfo?.mode ?? CompatibilityMode.Word2007;\n }\n\n /**\n * Gets the document background per ECMA-376 Part 1 §17.2.1\n * @returns Background properties or undefined\n */\n getDocumentBackground():\n | { color?: string; themeColor?: string; themeTint?: string; themeShade?: string }\n | undefined {\n return this._documentBackground ? { ...this._documentBackground } : undefined;\n }\n\n /**\n * Sets the document background per ECMA-376 Part 1 §17.2.1\n * @param background - Background properties (color, themeColor, etc.) or undefined to remove\n */\n setDocumentBackground(\n background:\n | { color?: string; themeColor?: string; themeTint?: string; themeShade?: string }\n | undefined\n ): void {\n this._documentBackground = background ? { ...background } : undefined;\n }\n\n /**\n * Gets whether even and odd headers/footers are enabled (w:evenAndOddHeaders)\n */\n /**\n * Gets the document view type (w:view) per ECMA-376 Part 1 §17.15.1.92.\n * Common values: 'print', 'web', 'outline', 'masterPages', 'normal', 'none'.\n * @returns The view type string, or undefined if not set\n */\n getDocumentView(): string | undefined {\n return this._documentView;\n }\n\n /**\n * Sets the document view type (w:view) per ECMA-376 Part 1 §17.15.1.92.\n * Controls which view mode Word uses when opening the document.\n * Common values: 'print' (Print Layout), 'web' (Web Layout), 'outline', 'normal' (Draft).\n * @param view - The view type to set\n */\n setDocumentView(view: string): void {\n this._documentView = view;\n this._settingsModified = true;\n }\n\n getEvenAndOddHeaders(): boolean {\n return this._evenAndOddHeaders ?? false;\n }\n\n /**\n * Sets even and odd headers/footers mode (w:evenAndOddHeaders)\n */\n setEvenAndOddHeaders(enabled: boolean): void {\n this._evenAndOddHeaders = enabled;\n this._settingsModified = true;\n this._modifiedBooleanSettings.add('evenAndOddHeaders');\n }\n\n /**\n * Gets whether mirror margins are enabled (w:mirrorMargins)\n */\n getMirrorMargins(): boolean {\n return this._mirrorMargins ?? false;\n }\n\n /**\n * Sets mirror margins mode (w:mirrorMargins)\n */\n setMirrorMargins(enabled: boolean): void {\n this._mirrorMargins = enabled;\n this._settingsModified = true;\n this._modifiedBooleanSettings.add('mirrorMargins');\n }\n\n /**\n * Gets whether auto hyphenation is enabled (w:autoHyphenation)\n */\n getAutoHyphenation(): boolean {\n return this._autoHyphenation ?? false;\n }\n\n /**\n * Sets auto hyphenation (w:autoHyphenation)\n */\n setAutoHyphenation(enabled: boolean): void {\n this._autoHyphenation = enabled;\n this._settingsModified = true;\n this._modifiedBooleanSettings.add('autoHyphenation');\n }\n\n /**\n * Gets whether spelling errors are hidden (w:hideSpellingErrors)\n */\n getHideSpellingErrors(): boolean {\n return this._hideSpellingErrors ?? false;\n }\n\n /**\n * Sets whether to hide spelling errors (w:hideSpellingErrors)\n */\n setHideSpellingErrors(enabled: boolean): void {\n this._hideSpellingErrors = enabled;\n this._settingsModified = true;\n this._modifiedBooleanSettings.add('hideSpellingErrors');\n }\n\n /**\n * Gets whether grammatical errors are hidden (w:hideGrammaticalErrors)\n */\n getHideGrammaticalErrors(): boolean {\n return this._hideGrammaticalErrors ?? false;\n }\n\n /**\n * Sets whether to hide grammatical errors (w:hideGrammaticalErrors)\n */\n setHideGrammaticalErrors(enabled: boolean): void {\n this._hideGrammaticalErrors = enabled;\n this._settingsModified = true;\n this._modifiedBooleanSettings.add('hideGrammaticalErrors');\n }\n\n /**\n * Gets the default tab stop value in twips (w:defaultTabStop)\n */\n getDefaultTabStop(): number | undefined {\n return this._defaultTabStop;\n }\n\n /**\n * Sets the default tab stop value in twips (w:defaultTabStop)\n */\n setDefaultTabStop(twips: number): void {\n this._defaultTabStop = twips;\n this._settingsModified = true;\n this._modifiedBooleanSettings.add('defaultTabStop');\n }\n\n /**\n * Gets whether fields are updated on document open (w:updateFields)\n */\n getUpdateFields(): boolean {\n return this._updateFields ?? false;\n }\n\n /**\n * Sets whether fields should be updated on document open (w:updateFields)\n */\n setUpdateFields(enabled: boolean): void {\n this._updateFields = enabled;\n this._settingsModified = true;\n this._modifiedBooleanSettings.add('updateFields');\n }\n\n /**\n * Gets whether TrueType fonts are embedded (w:embedTrueTypeFonts)\n */\n getEmbedTrueTypeFonts(): boolean {\n return this._embedTrueTypeFonts ?? false;\n }\n\n /**\n * Sets whether to embed TrueType fonts (w:embedTrueTypeFonts)\n */\n setEmbedTrueTypeFonts(enabled: boolean): void {\n this._embedTrueTypeFonts = enabled;\n this._settingsModified = true;\n this._modifiedBooleanSettings.add('embedTrueTypeFonts');\n }\n\n /**\n * Gets whether only font subsets are saved (w:saveSubsetFonts)\n */\n getSaveSubsetFonts(): boolean {\n return this._saveSubsetFonts ?? false;\n }\n\n /**\n * Sets whether to save only font subsets (w:saveSubsetFonts)\n */\n setSaveSubsetFonts(enabled: boolean): void {\n this._saveSubsetFonts = enabled;\n this._settingsModified = true;\n this._modifiedBooleanSettings.add('saveSubsetFonts');\n }\n\n /**\n * Gets whether move tracking is disabled (w:doNotTrackMoves)\n */\n getDoNotTrackMoves(): boolean {\n return this._doNotTrackMoves ?? false;\n }\n\n /**\n * Sets whether to disable move tracking (w:doNotTrackMoves)\n */\n setDoNotTrackMoves(enabled: boolean): void {\n this._doNotTrackMoves = enabled;\n this._settingsModified = true;\n this._modifiedBooleanSettings.add('doNotTrackMoves');\n }\n\n /**\n * Gets the decimal symbol for locale (w:decimalSymbol)\n */\n getDecimalSymbol(): string | undefined {\n return this._decimalSymbol;\n }\n\n /**\n * Gets the list separator for locale (w:listSeparator)\n */\n getListSeparator(): string | undefined {\n return this._listSeparator;\n }\n\n /**\n * Whether the document is in a legacy compatibility mode (anything below Word 2013/mode 15).\n *\n * When true, Word's layout engine uses older rendering rules that may differ from\n * modern mode for table sizing, line breaking, text wrapping, and spacing.\n *\n * Per MS-DOCX spec, documents without a w:compat block default to mode 12 (legacy).\n *\n * @returns true if the document targets a Word version prior to 2013\n */\n isCompatibilityMode(): boolean {\n return this._compatInfo?.isLegacyMode ?? true;\n }\n\n /**\n * Gets the full parsed compatibility settings from the w:compat block.\n *\n * Includes the numeric mode, whether it's legacy, all modern w:compatSetting entries\n * (name/uri/val triples), and all legacy boolean compat flags that are enabled.\n *\n * @returns CompatibilityInfo with all parsed settings\n */\n getCompatibilityInfo(): CompatibilityInfo {\n return (\n this._compatInfo ?? {\n mode: CompatibilityMode.Word2007,\n isLegacyMode: true,\n compatSettings: [],\n legacyFlags: [],\n }\n );\n }\n\n /**\n * Upgrades the document to modern Word format (compatibility mode 15).\n *\n * This is equivalent to clicking File > Info > Convert in Microsoft Word.\n * It performs the following:\n *\n * 1. Updates compatibilityMode to 15 (Word 2013+)\n * 2. Removes legacy compat boolean flags (~65 possible elements)\n * 3. Adds modern w:compatSetting entries\n * 4. Ensures document.xml namespaces include w14/w15/w16se/w16cid\n *\n * WARNING: This may cause minor layout shifts. Word's modern layout engine\n * handles table sizing, line breaking, text wrapping, and spacing differently\n * than legacy modes. This is the same behavior as Word's own Convert button.\n *\n * This does NOT convert VML shapes to DrawingML, or upgrade legacy equation\n * objects. Those transformations are Word-internal and are preserved as-is\n * via XML passthrough.\n *\n * @returns UpgradeReport with details of what changed\n */\n upgradeToModernFormat(): UpgradeReport {\n const currentMode = this.getCompatibilityMode();\n const currentInfo = this.getCompatibilityInfo();\n\n // Already fully modern — check if there are any legacy flags to clean\n if (currentMode === CompatibilityMode.Word2013Plus && currentInfo.legacyFlags.length === 0) {\n return {\n previousMode: currentMode,\n newMode: 15,\n removedFlags: [],\n addedSettings: [],\n namespacesExpanded: false,\n changed: false,\n };\n }\n\n // Upgrade the settings.xml compat block\n if (this._originalSettingsXml) {\n const result = CompatibilityUpgrader.upgradeCompatBlock(\n this._originalSettingsXml,\n currentMode\n );\n this._originalSettingsXml = result.xml;\n this._settingsModified = true;\n\n // Expand namespaces on the document\n const nsResult = CompatibilityUpgrader.ensureModernNamespaces(this.namespaces);\n this.namespaces = nsResult.namespaces;\n result.report.namespacesExpanded = nsResult.expanded;\n\n // Update in-memory compat info\n this._compatInfo = {\n mode: CompatibilityMode.Word2013Plus,\n isLegacyMode: false,\n compatSettings: [...MODERN_COMPAT_SETTINGS],\n legacyFlags: [],\n };\n\n return result.report;\n }\n\n // New document (no original settings.xml) — ensure modern compat info\n this._compatInfo = {\n mode: CompatibilityMode.Word2013Plus,\n isLegacyMode: false,\n compatSettings: [...MODERN_COMPAT_SETTINGS],\n legacyFlags: [],\n };\n\n const nsResult = CompatibilityUpgrader.ensureModernNamespaces(this.namespaces);\n this.namespaces = nsResult.namespaces;\n\n return {\n previousMode: currentMode,\n newMode: 15,\n removedFlags: [],\n addedSettings: MODERN_COMPAT_SETTINGS.map((s) => s.name),\n namespacesExpanded: nsResult.expanded,\n changed: currentMode !== CompatibilityMode.Word2013Plus,\n };\n }\n\n /**\n * Creates and registers a run properties change revision\n * @param author - Author who made the change\n * @param content - Content with changed formatting\n * @param previousProperties - Previous run properties\n * @param date - Optional date (defaults to now)\n * @returns The created and registered revision\n */\n createRunPropertiesChange(\n author: string,\n content: Run | Run[],\n previousProperties: Record<string, any>,\n date?: Date\n ): Revision {\n const revision = Revision.createRunPropertiesChange(author, content, previousProperties, date);\n return this.revisionManager.register(revision);\n }\n\n /**\n * Creates and registers a paragraph properties change revision\n * @param author - Author who made the change\n * @param content - Paragraph content\n * @param previousProperties - Previous paragraph properties\n * @param date - Optional date (defaults to now)\n * @returns The created and registered revision\n */\n createParagraphPropertiesChange(\n author: string,\n content: Run | Run[],\n previousProperties: Record<string, any>,\n date?: Date\n ): Revision {\n const revision = Revision.createParagraphPropertiesChange(\n author,\n content,\n previousProperties,\n date\n );\n return this.revisionManager.register(revision);\n }\n\n /**\n * Creates and registers a table properties change revision\n * @param author - Author who made the change\n * @param content - Table content\n * @param previousProperties - Previous table properties\n * @param date - Optional date (defaults to now)\n * @returns The created and registered revision\n */\n createTablePropertiesChange(\n author: string,\n content: Run | Run[],\n previousProperties: Record<string, any>,\n date?: Date\n ): Revision {\n const revision = Revision.createTablePropertiesChange(\n author,\n content,\n previousProperties,\n date\n );\n return this.revisionManager.register(revision);\n }\n\n /**\n * Creates and registers a moveFrom revision (source of moved content)\n * @param author - Author who moved the content\n * @param content - Content that was moved\n * @param moveId - Unique move operation ID (links moveFrom and moveTo)\n * @param date - Optional date (defaults to now)\n * @returns The created and registered revision\n */\n createMoveFrom(author: string, content: Run | Run[], moveId: string, date?: Date): Revision {\n const revision = Revision.createMoveFrom(author, content, moveId, date);\n return this.revisionManager.register(revision);\n }\n\n /**\n * Creates and registers a moveTo revision (destination of moved content)\n * @param author - Author who moved the content\n * @param content - Content that was moved\n * @param moveId - Unique move operation ID (links moveFrom and moveTo)\n * @param date - Optional date (defaults to now)\n * @returns The created and registered revision\n */\n createMoveTo(author: string, content: Run | Run[], moveId: string, date?: Date): Revision {\n const revision = Revision.createMoveTo(author, content, moveId, date);\n return this.revisionManager.register(revision);\n }\n\n /**\n * Creates a pair of moveFrom and moveTo revisions for moving content\n * @param author - Author who moved the content\n * @param content - Content that was moved\n * @param date - Optional date (defaults to now)\n * @returns Object with both moveFrom and moveTo revisions and range markers\n */\n trackMove(\n author: string,\n content: Run | Run[],\n date?: Date\n ): {\n moveFrom: Revision;\n moveTo: Revision;\n moveId: string;\n moveFromRangeStart: RangeMarker;\n moveFromRangeEnd: RangeMarker;\n moveToRangeStart: RangeMarker;\n moveToRangeEnd: RangeMarker;\n } {\n // Generate unique move ID and name\n const moveId = `move${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n const moveName = `move${Date.now()}`;\n\n // Get unique IDs for range markers (use revision manager's next ID)\n const rangeIdStart = this.revisionManager.getStats().nextId;\n\n // Create range markers for moveFrom\n const moveFromRangeStart = RangeMarker.createMoveFromStart(\n rangeIdStart,\n moveName,\n author,\n date\n );\n const moveFromRangeEnd = RangeMarker.createMoveFromEnd(rangeIdStart);\n\n // Create range markers for moveTo\n const moveToRangeStart = RangeMarker.createMoveToStart(rangeIdStart, moveName, author, date);\n const moveToRangeEnd = RangeMarker.createMoveToEnd(rangeIdStart);\n\n // Create the actual move revisions\n const moveFrom = this.createMoveFrom(author, content, moveId, date);\n const moveTo = this.createMoveTo(author, content, moveId, date);\n\n return {\n moveFrom,\n moveTo,\n moveId,\n moveFromRangeStart,\n moveFromRangeEnd,\n moveToRangeStart,\n moveToRangeEnd,\n };\n }\n\n /**\n * Creates and registers a table cell insertion revision\n * @param author - Author who inserted the cell\n * @param content - Cell content\n * @param date - Optional date (defaults to now)\n * @returns The created and registered revision\n */\n createTableCellInsert(author: string, content: Run | Run[], date?: Date): Revision {\n const revision = Revision.createTableCellInsert(author, content, date);\n return this.revisionManager.register(revision);\n }\n\n /**\n * Creates and registers a table cell deletion revision\n * @param author - Author who deleted the cell\n * @param content - Cell content\n * @param date - Optional date (defaults to now)\n * @returns The created and registered revision\n */\n createTableCellDelete(author: string, content: Run | Run[], date?: Date): Revision {\n const revision = Revision.createTableCellDelete(author, content, date);\n return this.revisionManager.register(revision);\n }\n\n /**\n * Creates and registers a table cell merge revision\n * @param author - Author who merged cells\n * @param content - Merged cell content\n * @param date - Optional date (defaults to now)\n * @returns The created and registered revision\n */\n createTableCellMerge(author: string, content: Run | Run[], date?: Date): Revision {\n const revision = Revision.createTableCellMerge(author, content, date);\n return this.revisionManager.register(revision);\n }\n\n /**\n * Creates and registers a numbering change revision\n * @param author - Author who changed the numbering\n * @param content - Content with changed numbering\n * @param previousProperties - Previous numbering properties\n * @param date - Optional date (defaults to now)\n * @returns The created and registered revision\n */\n createNumberingChange(\n author: string,\n content: Run | Run[],\n previousProperties: Record<string, any>,\n date?: Date\n ): Revision {\n const revision = Revision.createNumberingChange(author, content, previousProperties, date);\n return this.revisionManager.register(revision);\n }\n\n /**\n * Gets the CommentManager for comment operations\n *\n * Provides access to the CommentManager for creating, managing, and\n * querying document comments and comment threads.\n *\n * **Important:** For mutations (create, reply, remove), prefer the Document-level\n * wrapper methods (`createComment`, `createReply`, `removeComment`) which set the\n * internal dirty flag needed for correct companion file handling during save.\n *\n * @returns The CommentManager instance managing this document's comments\n *\n * @example\n * ```typescript\n * const commentMgr = doc.getCommentManager();\n * const allComments = commentMgr.getAllComments();\n * console.log(`Document has ${allComments.length} comments`);\n * ```\n */\n getCommentManager(): CommentManager {\n return this.commentManager;\n }\n\n /**\n * Creates and registers a new comment\n *\n * Creates a comment that can be attached to paragraphs or text ranges.\n * The comment is automatically registered with the CommentManager and\n * assigned a unique ID.\n *\n * @param author - Name of the comment author\n * @param content - Comment text content, single Run, or array of Runs\n * @param initials - Optional author initials (defaults to first letters of author name)\n * @returns The created and registered Comment instance\n *\n * @example\n * ```typescript\n * // Create simple text comment\n * const comment = doc.createComment('John Doe', 'Please review this section');\n * const para = doc.createParagraph('Important text');\n * para.addComment(comment);\n * ```\n *\n * @example\n * ```typescript\n * // Create comment with formatted content\n * const run = new Run('This needs attention', { bold: true, color: 'FF0000' });\n * const comment = doc.createComment('Alice', run, 'A');\n * ```\n */\n createComment(author: string, content: string | Run | Run[], initials?: string): Comment {\n this._commentsModified = true;\n return this.commentManager.createComment(author, content, initials);\n }\n\n /**\n * Creates and registers a reply to an existing comment\n * @param parentCommentId - ID of the parent comment\n * @param author - Reply author\n * @param content - Reply content (text or runs)\n * @param initials - Optional author initials\n * @returns The created and registered reply\n */\n createReply(\n parentCommentId: number,\n author: string,\n content: string | Run | Run[],\n initials?: string\n ): Comment {\n this._commentsModified = true;\n return this.commentManager.createReply(parentCommentId, author, content, initials);\n }\n\n /**\n * Gets a comment by ID\n * @param id - Comment ID\n * @returns The comment, or undefined if not found\n */\n getComment(id: number): Comment | undefined {\n return this.commentManager.getComment(id);\n }\n\n /**\n * Gets all comments (top-level only, not replies)\n * @returns Array of all top-level comments\n */\n getAllComments(): Comment[] {\n return this.commentManager.getAllComments();\n }\n\n getFootnoteManager(): FootnoteManager {\n return this.footnoteManager;\n }\n\n getEndnoteManager(): EndnoteManager {\n return this.endnoteManager;\n }\n\n createFootnote(text: string): Footnote {\n this._footnotesModified = true;\n return this.footnoteManager.createFootnote(text);\n }\n\n createEndnote(text: string): Endnote {\n this._endnotesModified = true;\n return this.endnoteManager.createEndnote(text);\n }\n\n /**\n * Clears all footnotes (except special separators).\n * On save, generates a footnotes.xml with only separator entries.\n */\n clearFootnotes(): void {\n this.footnoteManager.clear();\n this._footnotesModified = true;\n }\n\n /**\n * Clears all endnotes (except special separators).\n * On save, generates an endnotes.xml with only separator entries.\n */\n clearEndnotes(): void {\n this.endnoteManager.clear();\n this._endnotesModified = true;\n }\n\n /**\n * Adds a comment to a paragraph (wraps the entire paragraph)\n * Creates the comment if text is provided, or uses an existing comment object\n * @param paragraph - The paragraph to comment\n * @param commentOrAuthor - Comment object, or author name if creating new comment\n * @param content - Comment content (required if creating new comment)\n * @param initials - Optional author initials (for new comments)\n * @returns The comment that was added\n */\n addCommentToParagraph(\n paragraph: Paragraph,\n commentOrAuthor: Comment | string,\n content?: string | Run | Run[],\n initials?: string\n ): Comment {\n const comment =\n typeof commentOrAuthor === 'string'\n ? this.createComment(commentOrAuthor, content!, initials)\n : commentOrAuthor;\n\n paragraph.addComment(comment);\n return comment;\n }\n\n /**\n * Gets statistics about comments\n * @returns Object with comment statistics\n */\n getCommentStats(): {\n total: number;\n topLevel: number;\n replies: number;\n authors: string[];\n nextId: number;\n } {\n return this.commentManager.getStats();\n }\n\n /**\n * Checks if there are any comments in the document\n * @returns True if there are no comments\n */\n hasNoComments(): boolean {\n return this.commentManager.isEmpty();\n }\n\n /**\n * Checks if there are comments in the document\n * @returns True if there are comments\n */\n hasComments(): boolean {\n return !this.commentManager.isEmpty();\n }\n\n /**\n * Gets a comment thread (comment and all its replies)\n * @param commentId - ID of the top-level comment\n * @returns Object with the comment and its replies, or undefined if not found\n */\n getCommentThread(commentId: number): { comment: Comment; replies: Comment[] } | undefined {\n return this.commentManager.getCommentThread(commentId);\n }\n\n /**\n * Searches comments by text content\n * @param searchText - Text to search for (case-insensitive)\n * @returns Array of comments containing the search text\n */\n findCommentsByText(searchText: string): Comment[] {\n return this.commentManager.findCommentsByText(searchText);\n }\n\n /**\n * Gets the most recent comments\n * @param count - Number of recent comments to return\n * @returns Array of most recent comments\n */\n getRecentComments(count: number): Comment[] {\n return this.commentManager.getRecentComments(count);\n }\n\n /**\n * Gets comments by author\n * @param author - Author name to filter by\n * @returns Array of comments by the specified author\n */\n getCommentsByAuthor(author: string): Comment[] {\n return this.commentManager.getCommentsByAuthor(author);\n }\n\n /**\n * Gets comments within a date range\n * @param startDate - Start of date range\n * @param endDate - End of date range\n * @returns Array of comments within the date range\n */\n getCommentsByDateRange(startDate: Date, endDate: Date): Comment[] {\n return this.commentManager.getCommentsByDateRange(startDate, endDate);\n }\n\n /**\n * Gets all comments including replies\n * @returns Array of all comments (top-level and replies)\n */\n getAllCommentsWithReplies(): Comment[] {\n return this.commentManager.getAllCommentsWithReplies();\n }\n\n /**\n * Gets the total number of comments (including replies)\n * @returns Number of comments\n */\n getCommentCount(): number {\n return this.commentManager.getCount();\n }\n\n /**\n * Gets the number of top-level comments (excluding replies)\n * @returns Number of top-level comments\n */\n getTopLevelCommentCount(): number {\n return this.commentManager.getTopLevelCount();\n }\n\n /**\n * Gets all unique authors who have made comments\n * @returns Array of unique author names\n */\n getCommentAuthors(): string[] {\n return this.commentManager.getAuthors();\n }\n\n /**\n * Gets replies to a comment\n * @param commentId - ID of the parent comment\n * @returns Array of reply comments\n */\n getReplies(commentId: number): Comment[] {\n return this.commentManager.getReplies(commentId);\n }\n\n /**\n * Checks if a comment has replies\n * @param commentId - ID of the comment\n * @returns True if the comment has replies\n */\n hasReplies(commentId: number): boolean {\n return this.commentManager.hasReplies(commentId);\n }\n\n /**\n * Removes a comment (also removes all its replies)\n * @param id - Comment ID\n * @returns True if the comment was removed\n */\n removeComment(id: number): boolean {\n const removed = this.commentManager.removeComment(id);\n if (removed) {\n this._commentsModified = true;\n }\n return removed;\n }\n\n /**\n * Checks if there are any revisions in the document\n * @returns True if there are no revisions\n */\n hasNoRevisions(): boolean {\n return this.revisionManager.isEmpty();\n }\n\n /**\n * Checks if there are revisions in the document\n * @returns True if there are revisions\n */\n hasRevisions(): boolean {\n return !this.revisionManager.isEmpty();\n }\n\n /**\n * Gets the most recent revisions\n * @param count - Number of recent revisions to return\n * @returns Array of most recent revisions\n */\n getRecentRevisions(count: number): Revision[] {\n return this.revisionManager.getRecentRevisions(count);\n }\n\n /**\n * Searches revisions by text content\n * @param searchText - Text to search for (case-insensitive)\n * @returns Array of revisions containing the search text\n */\n findRevisionsByText(searchText: string): Revision[] {\n return this.revisionManager.findRevisionsByText(searchText);\n }\n\n /**\n * Gets all insertion revisions\n * @returns Array of insertion revisions\n */\n getAllInsertions(): Revision[] {\n return this.revisionManager.getAllInsertions();\n }\n\n /**\n * Gets all deletion revisions\n * @returns Array of deletion revisions\n */\n getAllDeletions(): Revision[] {\n return this.revisionManager.getAllDeletions();\n }\n\n /**\n * Gets parse warnings collected during document loading\n * Only populated when loading existing documents in lenient mode\n * @returns Array of parse errors/warnings\n */\n getParseWarnings(): { element: string; error: Error }[] {\n return this.parser.getParseErrors();\n }\n\n /**\n * Updates hyperlink URLs in the document using a URL mapping\n *\n * This method finds all external hyperlinks in the document and updates their URLs\n * according to the provided map. The relationships are updated in-place to maintain\n * document integrity and prevent orphaned relationships per ECMA-376 §17.16.22.\n *\n * **Important Notes:**\n * - Only updates external hyperlinks (not internal bookmarks)\n * - Only updates the URL, not the display text\n * - Relationships are updated in-place to maintain IDs\n * - To update text too, manually iterate and call setText() on hyperlinks\n *\n * **OpenXML Compliance:**\n * This implementation ensures proper OpenXML structure by:\n * 1. Updating existing relationship targets in-place (prevents orphaned relationships)\n * 2. Maintaining relationship IDs for document integrity\n * 3. Maintaining TargetMode=\"External\" for all web links (per ECMA-376 §17.16.22)\n *\n * @param urlMap - Map of old URLs to new URLs\n * @returns Number of hyperlinks updated\n *\n * @example\n * ```typescript\n * // Load existing document\n * const doc = await Document.load('document.docx');\n *\n * // Define URL mappings (old URL → new URL)\n * const urlMap = new Map([\n * ['https://old-site.com', 'https://new-site.com'],\n * ['https://example.org', 'https://example.com']\n * ]);\n *\n * // Update hyperlink URLs\n * const updated = doc.updateHyperlinkUrls(urlMap);\n * console.log(`Updated ${updated} hyperlink(s)`);\n *\n * // Save with updated relationships\n * await doc.save('updated-document.docx');\n * ```\n *\n * @see {@link https://www.ecma-international.org/publications-and-standards/standards/ecma-376/ | ECMA-376 Part 1 §17.16.22}\n */\n updateHyperlinkUrls(urlMap: Map<string, string>): number {\n // Early exit if no URLs to update\n if (urlMap.size === 0) {\n return 0;\n }\n\n // Two-phase update to handle circular URL swaps correctly\n // Phase 1: Collect all updates without modifying hyperlinks\n const updates: {\n hyperlink: Hyperlink;\n newUrl: string;\n relationshipId?: string;\n }[] = [];\n\n // Iterate through all paragraphs in document body\n for (const para of this.getAllParagraphs()) {\n // Get all content items (runs, hyperlinks, fields, revisions)\n for (const content of para.getContent()) {\n // Check if content is a Hyperlink and is external\n if (content instanceof Hyperlink && content.isExternal()) {\n const currentUrl = content.getUrl();\n\n // If current URL is in the map, collect the update\n if (currentUrl && urlMap.has(currentUrl)) {\n const newUrl = urlMap.get(currentUrl)!;\n updates.push({\n hyperlink: content,\n newUrl,\n relationshipId: content.getRelationshipId(),\n });\n }\n }\n }\n }\n\n // Phase 2: Apply all updates atomically\n // This prevents circular swap issues (e.g., A→B, B→A becomes B→A, A→B)\n for (const { hyperlink, newUrl, relationshipId } of updates) {\n // Update the hyperlink URL (maintains relationship ID)\n hyperlink.setUrl(newUrl);\n\n // Update the relationship target in-place if relationship exists\n if (relationshipId) {\n this.relationshipManager.updateHyperlinkTarget(relationshipId, newUrl);\n }\n }\n\n // Note: This implementation updates relationships in-place,\n // maintaining document integrity per ECMA-376\n\n return updates.length;\n }\n\n /**\n * Estimates the size of the document\n * Provides breakdown by component and warnings if size is too large\n * @returns Size estimation with breakdown and optional warning\n */\n estimateSize(): {\n paragraphs: number;\n tables: number;\n images: number;\n estimatedXmlBytes: number;\n imageBytes: number;\n totalEstimatedBytes: number;\n totalEstimatedMB: number;\n warning?: string;\n } {\n return this.validator.estimateSize(this.bodyElements, this.imageManager);\n }\n\n /**\n * Strips all tracked changes from the document\n *\n * Removes all revision markup (<w:ins>, <w:del>, <w:moveFrom>, <w:moveTo>) from the document's XML\n * and cleans up related metadata. This effectively \"accepts\" all changes without using Word's\n * built-in Accept Changes feature.\n *\n * **IMPORTANT**: This operation:\n * 1. Modifies the raw XML in the ZIP package to remove all tracked changes\n * 2. Clears Revision objects from the in-memory object model to prevent re-serialization\n * 3. Sets flag to prevent XML regeneration on save (preserves the cleaned XML)\n *\n * What gets removed:\n * - All insertion markers (<w:ins>) - content is kept, wrapper removed\n * - All deletion markers (<w:del>) - entire element including content removed\n * - All move operations (<w:moveFrom>, <w:moveTo>)\n * - All range markers (moveFromRangeStart/End, moveToRangeStart/End, etc.)\n * - All property change tracking (rPrChange, pPrChange, tblPrChange, etc.)\n * - Revision authors from word/people.xml\n * - Track changes settings from word/settings.xml\n * - Revision count from docProps/core.xml\n *\n * @returns This document instance for method chaining\n *\n * @example\n * ```typescript\n * // Load document with tracked changes\n * const doc = await Document.load('document-with-revisions.docx');\n *\n * // Strip all tracked changes\n * await doc.stripTrackedChanges();\n *\n * // Now process the document as normal\n * doc.applyStyles();\n * await doc.save('cleaned.docx');\n * ```\n *\n * @example\n * ```typescript\n * // Check for tracked changes first\n * const doc = await Document.load('input.docx');\n * if (doc.hasTrackedChanges()) {\n * console.log('Document has tracked changes - stripping them');\n * await doc.stripTrackedChanges();\n * }\n * await doc.save('output.docx');\n * ```\n *\n * @deprecated Use {@link acceptAllRevisions} instead - this method will be removed in a future version\n */\n async stripTrackedChanges(): Promise<this> {\n // Delegate to acceptAllRevisions for backward compatibility\n return this.acceptAllRevisions();\n }\n\n /**\n * Accepts all tracked changes in the document\n *\n * Processes all revision markup following Microsoft's official OpenXML SDK approach:\n * - Insertions (<w:ins>): Keep the inserted content, remove wrapper tags\n * - Deletions (<w:del>): Remove entirely (content was deleted, so discard it)\n * - Move From (<w:moveFrom>): Remove entirely (source of moved content)\n * - Move To (<w:moveTo>): Keep content, remove wrapper (destination of moved content)\n * - Property changes: Remove all tracking elements\n * - Range markers: Remove all boundary markers\n *\n * Also cleans up metadata:\n * - Revision authors from word/people.xml\n * - Track changes settings from word/settings.xml\n * - Revision count from docProps/core.xml\n *\n * **IMPORTANT**: This operation:\n * 1. Modifies the raw XML in the ZIP package\n * 2. Clears Revision objects from the in-memory object model\n * 3. Sets flag to prevent XML regeneration on save (preserves the cleaned XML)\n *\n * @returns This document instance for method chaining\n *\n * @example\n * ```typescript\n * // Load document with tracked changes\n * const doc = await Document.load('document-with-revisions.docx');\n *\n * // Accept all tracked changes\n * await doc.acceptAllRevisions();\n *\n * // Now process the document as normal\n * doc.applyStyles();\n * await doc.save('cleaned.docx');\n * ```\n *\n * @example\n * ```typescript\n * // Check for tracked changes first\n * const doc = await Document.load('input.docx');\n * if (doc.hasTrackedChanges()) {\n * console.log('Document has tracked changes - accepting them');\n * await doc.acceptAllRevisions();\n * }\n * await doc.save('output.docx');\n * ```\n *\n * @see https://learn.microsoft.com/en-us/office/open-xml/how-to-accept-all-revisions\n */\n async acceptAllRevisions(): Promise<this> {\n // Use in-memory DOM transformation approach (industry standard)\n // This transforms Revision objects in the in-memory model, allowing subsequent\n // modifications to work correctly. Unlike the raw XML approach, this does NOT\n // set skipDocumentXmlRegeneration, so save() will regenerate document.xml with\n // all modifications including accepted revisions AND any subsequent changes.\n //\n // @see OpenXML PowerTools RevisionAccepter - https://github.com/OfficeDev/Open-Xml-PowerTools\n // @see https://learn.microsoft.com/en-us/previous-versions/office/developer/office-2007/ee836138(v=office.12)\n\n const result = acceptRevisionsInMemory(this);\n\n // Also cleanup metadata files (people.xml, settings.xml, core.xml)\n // This removes author tracking info and track changes settings that would\n // otherwise indicate the document had tracked changes\n cleanupRevisionMetadata(this.zipHandler);\n\n this.logger.info('Accepted all revisions using in-memory transformation', {\n insertions: result.insertionsAccepted,\n deletions: result.deletionsAccepted,\n moves: result.movesAccepted,\n propertyChanges: result.propertyChangesAccepted,\n total: result.totalAccepted,\n });\n\n return this;\n }\n\n /**\n * Consolidates adjacent revisions throughout the document.\n *\n * This addresses the \"random insertions and deletions\" problem where Word displays\n * many small revisions instead of consolidated ones. The method merges adjacent\n * revisions that have:\n * - Same type (both insertions or both deletions)\n * - Same author\n * - Timestamps within the specified time window\n *\n * **Why this matters:**\n * Microsoft Word typically consolidates edits made in quick succession by the same\n * author. Without consolidation, programmatic edits create many tiny revisions that\n * clutter the document and confuse users when reviewing changes.\n *\n * **When to call:**\n * - After making multiple programmatic changes with track changes enabled\n * - Before saving a document that will be reviewed in Word\n * - Automatically called during save() if track changes was enabled\n *\n * @param timeWindowMs - Time window in milliseconds for consolidation (default: 1000ms)\n * @returns Object with total paragraphs processed and revisions consolidated\n *\n * @example\n * ```typescript\n * // Enable track changes\n * doc.enableTrackChanges({ author: 'Automation' });\n *\n * // Make multiple changes\n * for (const para of doc.getParagraphs()) {\n * for (const run of para.getRuns()) {\n * run.setColor('000000');\n * }\n * }\n *\n * // Consolidate before saving\n * const result = doc.consolidateAllRevisions();\n * console.log(`Consolidated ${result.revisionsConsolidated} revisions`);\n *\n * await doc.save('output.docx');\n * ```\n */\n consolidateAllRevisions(timeWindowMs = 1000): {\n paragraphsProcessed: number;\n revisionsConsolidated: number;\n } {\n let paragraphsProcessed = 0;\n let totalConsolidated = 0;\n\n // Process main document body paragraphs\n for (const para of this.getAllParagraphs()) {\n paragraphsProcessed++;\n totalConsolidated += para.consolidateRevisions(timeWindowMs);\n }\n\n // Process table cell paragraphs\n for (const table of this.getTables()) {\n for (const row of table.getRows()) {\n for (const cell of row.getCells()) {\n for (const para of cell.getParagraphs()) {\n paragraphsProcessed++;\n totalConsolidated += para.consolidateRevisions(timeWindowMs);\n }\n }\n }\n }\n\n // Process headers and footers\n for (const headerEntry of this.headerFooterManager.getAllHeaders()) {\n for (const element of headerEntry.header.getElements()) {\n if (element instanceof Paragraph) {\n paragraphsProcessed++;\n totalConsolidated += element.consolidateRevisions(timeWindowMs);\n }\n }\n }\n\n for (const footerEntry of this.headerFooterManager.getAllFooters()) {\n for (const element of footerEntry.footer.getElements()) {\n if (element instanceof Paragraph) {\n paragraphsProcessed++;\n totalConsolidated += element.consolidateRevisions(timeWindowMs);\n }\n }\n }\n\n this.logger.info('Consolidated revisions across document', {\n paragraphsProcessed,\n revisionsConsolidated: totalConsolidated,\n });\n\n return { paragraphsProcessed, revisionsConsolidated: totalConsolidated };\n }\n\n /**\n * Accept all revisions using raw XML modification (legacy approach).\n *\n * This method modifies the raw XML in the ZIP package directly, then sets\n * `skipDocumentXmlRegeneration = true` to preserve the cleaned XML on save.\n *\n * **WARNING**: Using this method will prevent ANY subsequent in-memory modifications\n * from being saved. Use the standard `acceptAllRevisions()` instead.\n *\n * Use cases for this method:\n * - When you need to accept revisions and save immediately without further changes\n * - When dealing with complex revision structures that the in-memory model doesn't fully capture\n *\n * @returns This document instance for method chaining\n * @deprecated Prefer `acceptAllRevisions()` which uses in-memory transformation\n */\n async acceptAllRevisionsRawXml(): Promise<this> {\n // Step 1: Accept all revisions in the raw XML in ZIP package\n // Uses the imported acceptAllRevisions function (raw XML approach)\n await acceptAllRevisions(this.zipHandler);\n\n // Step 2: Clear Revision objects from in-memory object model\n // This prevents them from being re-serialized during save()\n this.clearRevisionsFromAllParagraphs();\n\n // Step 3: Set flag to prevent document.xml regeneration on save()\n // This preserves the cleaned XML we just created, preventing corruption\n this.skipDocumentXmlRegeneration = true;\n\n return this;\n }\n\n /**\n * Preserves the raw XML in the document, preventing regeneration on save.\n *\n * Use this when you want to keep the original document.xml exactly as loaded,\n * without any modifications from the in-memory model. This is useful for:\n * - Preserving tracked changes that weren't fully parsed into memory\n * - Round-tripping documents with features the framework doesn't support\n * - Keeping original formatting that might be lost during regeneration\n *\n * **IMPORTANT**: After calling this method:\n * - Changes made to paragraphs, runs, tables, etc. will NOT be saved\n * - Only changes to other parts (styles, numbering, headers) will be saved\n * - The document.xml will remain exactly as it was when loaded\n *\n * @returns This document instance for method chaining\n *\n * @example\n * ```typescript\n * // Load a document with tracked changes\n * const doc = await Document.load('document-with-revisions.docx');\n *\n * // Preserve the original XML (including tracked changes)\n * doc.preserveRawXml();\n *\n * // Save - tracked changes will be preserved in output\n * await doc.save('output.docx');\n * ```\n */\n preserveRawXml(): this {\n this.skipDocumentXmlRegeneration = true;\n this.logger.info('Raw XML preservation enabled - document.xml will not be regenerated on save');\n return this;\n }\n\n /**\n * Clears all Revision objects from paragraph content throughout the document\n * This removes in-memory tracked change objects to prevent re-serialization\n * Called by stripTrackedChanges() after cleaning the raw XML\n * @private\n */\n private clearRevisionsFromAllParagraphs(): void {\n let clearedCount = 0;\n\n // Clear revisions from all paragraphs in the document\n for (const para of this.getAllParagraphs()) {\n const revisions = para.getRevisions();\n\n if (revisions.length > 0) {\n // Filter out all Revision objects from paragraph content\n const content = para.getContent();\n const nonRevisionContent = content.filter((item) => !(item instanceof Revision));\n\n // Replace paragraph content with filtered version\n para.clearContent();\n for (const item of nonRevisionContent) {\n if (item instanceof Run || item instanceof ImageRun) {\n para.addRun(item);\n } else if (item instanceof Hyperlink) {\n para.addHyperlink(item);\n } else if (item instanceof Field) {\n para.addField(item);\n }\n }\n\n clearedCount += revisions.length;\n }\n }\n\n if (clearedCount > 0) {\n this.logger.info(`Cleared ${clearedCount} Revision object(s) from in-memory document model`);\n }\n }\n\n /**\n * Clears all paragraph property change tracking (w:pPrChange) from all paragraphs.\n *\n * This method removes existing pPrChange elements from paragraphs without affecting\n * other tracked changes (insertions, deletions, etc.). This is useful when:\n * - Loading a document with existing tracked changes and then enabling fresh tracking\n * - Preventing merge issues where old and new pPrChange elements conflict\n * - Ensuring Word's \"Accept All Changes\" works in a single click\n *\n * Called automatically by enableTrackChanges() to prevent problematic merging of\n * existing pPrChange with newly tracked property changes.\n *\n * @returns Number of paragraphs that had pPrChange cleared\n *\n * @example\n * ```typescript\n * // Manually clear before enabling tracking\n * const cleared = doc.clearAllParagraphPropertyChanges();\n * console.log(`Cleared pPrChange from ${cleared} paragraphs`);\n * doc.enableTrackChanges({ author: 'DocHub' });\n * ```\n */\n public clearAllParagraphPropertyChanges(): number {\n let count = 0;\n\n // Clear from body paragraphs\n for (const para of this.getAllParagraphs()) {\n if (para.getFormatting().pPrChange) {\n para.clearParagraphPropertiesChange();\n count++;\n }\n }\n\n // Clear from table cells\n for (const table of this.getTables()) {\n for (const row of table.getRows()) {\n for (const cell of row.getCells()) {\n for (const para of cell.getParagraphs()) {\n if (para.getFormatting().pPrChange) {\n para.clearParagraphPropertiesChange();\n count++;\n }\n }\n }\n }\n }\n\n // Clear from headers and footers\n if (this.headerFooterManager) {\n const headers = this.headerFooterManager.getAllHeaders();\n for (const { header } of headers) {\n for (const element of header.getElements()) {\n if ('getFormatting' in element && typeof (element as any).getFormatting === 'function') {\n const para = element as Paragraph;\n if (para.getFormatting().pPrChange) {\n para.clearParagraphPropertiesChange();\n count++;\n }\n }\n }\n }\n\n const footers = this.headerFooterManager.getAllFooters();\n for (const { footer } of footers) {\n for (const element of footer.getElements()) {\n if ('getFormatting' in element && typeof (element as any).getFormatting === 'function') {\n const para = element as Paragraph;\n if (para.getFormatting().pPrChange) {\n para.clearParagraphPropertiesChange();\n count++;\n }\n }\n }\n }\n }\n\n if (count > 0) {\n this.logger.info(`Cleared pPrChange from ${count} paragraph(s)`);\n }\n\n return count;\n }\n\n /**\n * Cleans up resources and clears all managers\n * Call this after saving in long-running processes to free memory\n * Especially important for API servers processing many documents\n */\n dispose(): void {\n // Clear all internal state to free memory\n // NOTE: Use clear() methods instead of creating new instances to properly free memory\n\n // Clear body elements\n this.bodyElements = [];\n\n // Clear parser state\n this.parser.clearParseErrors();\n\n // Clear all managers using their clear() methods\n this.stylesManager.clear();\n this.numberingManager.clear();\n this.imageManager.clear();\n this.imageManager.releaseAllImageData();\n this.relationshipManager.clear();\n this.headerFooterManager.clear();\n this.bookmarkManager.clear();\n this.revisionManager.clear();\n this.commentManager.clear();\n this.footnoteManager.clear();\n this.endnoteManager.clear();\n\n // Clear ZIP handler to free compressed data\n this.zipHandler.clear();\n\n // Disable tracking context (cannot set to undefined since it's not optional)\n // The context will be recreated if document is reused\n this.trackingContext.disable();\n\n // Clear preserved state\n this._originalStylesXml = undefined;\n this._originalNumberingXml = undefined;\n this._originalSettingsXml = undefined;\n this._originalAppPropsXml = undefined;\n this._originalFootnotesXml = undefined;\n this._originalEndnotesXml = undefined;\n this._originalCommentsXml = undefined;\n this._commentsModified = false;\n this._originalCommentCompanionFiles.clear();\n this._originalContentTypes = undefined;\n this._settingsModified = false;\n this._appPropsModified = false;\n this._footnotesModified = false;\n this._endnotesModified = false;\n this._originalWebSettingsXml = undefined;\n this._webSettingsModified = false;\n this._webSettings = {\n optimizeForBrowser: true,\n allowPNG: true,\n relyOnVML: false,\n doNotRelyOnCSS: false,\n doNotSaveAsSingleFile: false,\n doNotOrganizeInFolder: false,\n doNotUseLongFileNames: false,\n };\n this._compatInfo = undefined;\n this._documentBackground = undefined;\n this._evenAndOddHeaders = undefined;\n this._mirrorMargins = undefined;\n this._autoHyphenation = undefined;\n this._hideSpellingErrors = undefined;\n this._hideGrammaticalErrors = undefined;\n this._defaultTabStop = undefined;\n this._updateFields = undefined;\n this._embedTrueTypeFonts = undefined;\n this._saveSubsetFonts = undefined;\n this._doNotTrackMoves = undefined;\n this._modifiedBooleanSettings.clear();\n this._decimalSymbol = undefined;\n this._listSeparator = undefined;\n this._flattenIncludePictureFields = false;\n this._stripOrphanRSIDs = false;\n this._clearDirectSpacingStyles = null;\n this.skipDocumentXmlRegeneration = false;\n this._removedNumPicBulletIds.clear();\n this.saveStateSnapshot = undefined;\n\n // Reset track changes and settings-managed fields\n this.trackChangesEnabled = false;\n this.trackFormatting = true;\n this.revisionViewSettings = {\n showInsertionsAndDeletions: true,\n showFormatting: true,\n showInkAnnotations: true,\n };\n this.rsidRoot = undefined;\n this.rsids = new Set();\n this.documentProtection = undefined;\n\n // Reset document properties to minimal state\n this.properties = {};\n this.section = Section.create();\n this.namespaces = {};\n }\n\n /**\n * Gets size statistics for the document\n * @returns Size statistics\n */\n getSizeStats(): {\n elements: { paragraphs: number; tables: number; images: number };\n size: { xml: string; images: string; total: string };\n warnings: string[];\n } {\n return this.validator.getSizeStats(this.bodyElements, this.imageManager);\n }\n\n // ==================== DOCUMENT PART ACCESS METHODS ====================\n // These methods provide low-level access to document package parts,\n // enabling advanced operations not covered by the high-level API.\n\n /**\n * Gets a specific document part from the package\n *\n * Provides direct access to any part within the DOCX package, including\n * XML parts, binary files, and custom parts. This enables advanced scenarios\n * not covered by the high-level API.\n *\n * @param partName - The part name/path (e.g., 'word/document.xml', '[Content_Types].xml')\n * @returns The document part with content and metadata, or null if not found\n *\n * @example\n * ```typescript\n * // Get the main document XML\n * const docPart = await doc.getPart('word/document.xml');\n * if (docPart) {\n * console.log(docPart.content); // XML content as string\n * }\n *\n * // Get an image\n * const imagePart = await doc.getPart('word/media/image1.png');\n * if (imagePart) {\n * console.log(imagePart.isBinary); // true\n * // imagePart.content is a Buffer\n * }\n * ```\n */\n async getPart(partName: string): Promise<DocumentPart | null> {\n try {\n const file = this.zipHandler.getFile(partName);\n if (!file) {\n return null;\n }\n\n // Convert Buffer to string for text files\n // ZipWriter stores all content as Buffer internally, but DocumentPart expects string for text\n let content: string | Buffer = file.content;\n if (!file.isBinary && Buffer.isBuffer(file.content)) {\n content = file.content.toString('utf-8');\n }\n\n return {\n name: partName,\n content,\n contentType: this.getContentTypeForPart(partName),\n isBinary: file.isBinary,\n size: file.size,\n };\n } catch (error: unknown) {\n // Return null for any errors (file not found, etc.)\n return null;\n }\n }\n\n /**\n * Sets or updates a document part in the package\n *\n * Allows adding or updating any part within the DOCX package. Use with caution\n * as incorrect modifications can corrupt the document structure.\n *\n * **Important:** This method does not automatically update relationships or\n * content types. You may need to manually update these for new parts.\n *\n * @param partName - The part name/path\n * @param content - The part content (string for XML/text, Buffer for binary)\n * @returns Promise that resolves when the part is set\n *\n * @example\n * ```typescript\n * // Update custom XML part\n * await doc.setPart('customXml/item1.xml', '<data>Custom content</data>');\n *\n * // Add a new image (remember to update relationships and content types)\n * const imageBuffer = await fs.readFile('image.png');\n * await doc.setPart('word/media/image2.png', imageBuffer);\n * ```\n */\n async setPart(partName: string, content: string | Buffer): Promise<void> {\n // Determine if content is binary\n const isBinary = Buffer.isBuffer(content);\n\n // Add or update the file in the ZIP handler\n this.zipHandler.addFile(partName, content, { binary: isBinary });\n }\n\n /**\n * Removes a document part from the package\n *\n * **Warning:** Removing required parts can corrupt the document.\n * This method does not update relationships or content types that may\n * reference the removed part.\n *\n * @param partName - The part name/path to remove\n * @returns True if the part was removed, false if it didn't exist\n *\n * @example\n * ```typescript\n * // Remove a custom part\n * const removed = await doc.removePart('customXml/item1.xml');\n * console.log(removed ? 'Part removed' : 'Part not found');\n * ```\n */\n async removePart(partName: string): Promise<boolean> {\n const removed = this.zipHandler.removeFile(partName);\n if (removed) {\n // Remove the part's ContentType override to prevent \"part does not exist\" errors\n if (this._originalContentTypes?.overrides) {\n const partKey = partName.startsWith('/') ? partName : `/${partName}`;\n for (const entry of this._originalContentTypes.overrides) {\n if (entry.startsWith(`${partKey}|`)) {\n this._originalContentTypes.overrides.delete(entry);\n break;\n }\n }\n }\n // Remove relationships targeting this part from _rels/.rels\n const relsXml = this.zipHandler.getFileAsString('_rels/.rels');\n if (relsXml) {\n const target = partName.replace(/^\\//, '');\n const relPattern = new RegExp(\n `\\\\s*<Relationship[^>]*Target=\"${target.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\"[^>]*/?>`,\n 'g'\n );\n const cleaned = relsXml.replace(relPattern, '');\n if (cleaned !== relsXml) {\n this.zipHandler.updateFile('_rels/.rels', cleaned);\n }\n }\n // Track removed parts to skip regeneration during save\n this._removedParts.add(partName);\n }\n return removed;\n }\n\n /**\n * Lists all parts in the document package\n *\n * Returns an array of all part names/paths in the DOCX package,\n * useful for debugging, analysis, or discovering custom parts.\n *\n * @returns Array of part names\n *\n * @example\n * ```typescript\n * const parts = await doc.listParts();\n * console.log('Document contains', parts.length, 'parts');\n * parts.forEach(part => console.log(part));\n * ```\n */\n async listParts(): Promise<string[]> {\n return this.zipHandler.getFilePaths();\n }\n\n /**\n * Checks if a part exists in the document package\n *\n * @param partName - The part name/path to check\n * @returns True if the part exists, false otherwise\n *\n * @example\n * ```typescript\n * if (await doc.partExists('word/glossary/document.xml')) {\n * console.log('Document has a glossary');\n * }\n * ```\n */\n async partExists(partName: string): Promise<boolean> {\n return this.zipHandler.hasFile(partName);\n }\n\n /**\n * Gets all content types from [Content_Types].xml\n *\n * Returns a map of part names/extensions to their MIME content types.\n * This is useful for understanding the document structure and registering\n * new content types for custom parts.\n *\n * @returns Map of part names/extensions to content types\n *\n * @example\n * ```typescript\n * const contentTypes = await doc.getContentTypes();\n * contentTypes.forEach((type, name) => {\n * console.log(`${name}: ${type}`);\n * });\n * ```\n */\n async getContentTypes(): Promise<Map<string, string>> {\n const contentTypes = new Map<string, string>();\n\n try {\n const contentTypesXml = this.zipHandler.getFileAsString('[Content_Types].xml');\n if (!contentTypesXml) {\n return contentTypes;\n }\n\n // Parse content types XML\n // Match Default elements (by extension)\n const defaultPattern = /<Default\\s+Extension=\"([^\"]+)\"\\s+ContentType=\"([^\"]+)\"/g;\n let match;\n while ((match = defaultPattern.exec(contentTypesXml)) !== null) {\n if (match[1] && match[2]) {\n contentTypes.set(`.${match[1]}`, match[2]);\n }\n }\n\n // Match Override elements (by part name)\n const overridePattern = /<Override\\s+PartName=\"([^\"]+)\"\\s+ContentType=\"([^\"]+)\"/g;\n while ((match = overridePattern.exec(contentTypesXml)) !== null) {\n if (match[1] && match[2]) {\n contentTypes.set(match[1], match[2]);\n }\n }\n } catch (error: unknown) {\n // Return empty map on error\n }\n\n return contentTypes;\n }\n\n /**\n * Gets the raw XML content of a document part without any processing\n *\n * Returns the unparsed XML string for any part in the document package.\n * This is useful for advanced manipulation, debugging, or accessing\n * content types that don't have dedicated APIs.\n *\n * **Note**: For binary parts (images, fonts), this converts the Buffer to UTF-8\n * string, which may not be appropriate. Check the content type first.\n *\n * @param partName - Part path (e.g., 'word/document.xml', '[Content_Types].xml')\n * @returns Raw XML string, or null if part not found\n *\n * @example\n * ```typescript\n * // Get raw document XML\n * const xml = await doc.getRawXml('word/document.xml');\n * console.log(xml); // Complete XML as string\n *\n * // Get raw styles XML\n * const stylesXml = await doc.getRawXml('word/styles.xml');\n *\n * // Get package metadata\n * const coreProps = await doc.getRawXml('docProps/core.xml');\n * ```\n */\n async getRawXml(partName: string): Promise<string | null> {\n try {\n const part = await this.getPart(partName);\n if (!part) {\n return null;\n }\n\n // If already a string, return as-is\n if (typeof part.content === 'string') {\n return part.content;\n }\n\n // If Buffer, decode as UTF-8 (standard for XML files)\n if (Buffer.isBuffer(part.content)) {\n return part.content.toString('utf8');\n }\n\n return null;\n } catch (error: unknown) {\n return null;\n }\n }\n\n /**\n * Gets raw XML content for all text-based parts (non-binary files)\n *\n * Returns a map of part names to their raw XML content, excluding binary files\n * like images and fonts. Useful for debugging or batch processing.\n *\n * @returns Map of part names to raw XML content\n *\n * @example\n * ```typescript\n * // Get all XML parts\n * const allXml = await doc.getAllRawXml();\n * for (const [partName, xml] of allXml) {\n * console.log(`${partName}: ${xml.length} bytes`);\n * }\n *\n * // Validate all XML parts\n * for (const [partName, xml] of allXml) {\n * try {\n * // Parse and validate XML\n * const parser = new DOMParser();\n * parser.parseFromString(xml, 'text/xml');\n * } catch (e) {\n * console.error(`Invalid XML in ${partName}:`, e);\n * }\n * }\n * ```\n */\n async getAllRawXml(): Promise<Map<string, string>> {\n const xmlMap = new Map<string, string>();\n\n try {\n const parts = await this.listParts();\n\n for (const partName of parts) {\n // Skip binary files (images, fonts, etc.)\n if (/\\.(png|jpg|jpeg|gif|woff|woff2|ttf|otf|bin)$/i.exec(partName)) {\n continue;\n }\n\n const xml = await this.getRawXml(partName);\n if (xml) {\n xmlMap.set(partName, xml);\n }\n }\n } catch (error: unknown) {\n // Return partial results on error\n }\n\n return xmlMap;\n }\n\n /**\n * Sets or updates raw XML content for a document part\n *\n * Convenience method for updating XML content in document parts.\n * Automatically detects and handles text/XML content.\n *\n * **Note**: This method does not automatically update relationships or\n * content types. You may need to manually update these if adding new parts.\n *\n * @param partName - Part path (e.g., 'word/document.xml')\n * @param xmlContent - Raw XML string to set\n * @returns Promise that resolves when the part is updated\n *\n * @example\n * ```typescript\n * // Update document XML\n * const newXml = '<?xml version=\"1.0\"?><w:document>...</w:document>';\n * await doc.setRawXml('word/document.xml', newXml);\n *\n * // Update styles\n * const stylesXml = await doc.getRawXml('word/styles.xml');\n * const modified = stylesXml.replace('Old Style', 'New Style');\n * await doc.setRawXml('word/styles.xml', modified);\n * ```\n */\n async setRawXml(partName: string, xmlContent: string): Promise<void> {\n if (typeof xmlContent !== 'string') {\n throw new Error('XML content must be a string');\n }\n\n // Use setPart to update the part (handles both string and binary detection)\n await this.setPart(partName, xmlContent);\n }\n\n /**\n * Adds or updates a content type registration\n *\n * Registers a new content type in [Content_Types].xml. This is required\n * when adding new types of parts to the document package.\n *\n * @param partNameOrExtension - Part name (e.g., '/word/custom.xml') or extension (e.g., '.xml')\n * @param contentType - MIME content type (e.g., 'application/xml')\n * @returns True if successful\n *\n * @example\n * ```typescript\n * // Register a custom XML part\n * await doc.addContentType('/customXml/item1.xml', 'application/xml');\n *\n * // Register a new file extension\n * await doc.addContentType('.json', 'application/json');\n * ```\n */\n async addContentType(partNameOrExtension: string, contentType: string): Promise<boolean> {\n try {\n let contentTypesXml = this.zipHandler.getFileAsString('[Content_Types].xml');\n if (!contentTypesXml) {\n return false;\n }\n\n const isExtension = partNameOrExtension.startsWith('.');\n\n if (isExtension) {\n // Add as Default element (for extensions)\n const extension = partNameOrExtension.substring(1);\n\n // Check if already exists\n const existingPattern = new RegExp(\n `<Default\\\\s+Extension=\"${extension}\"\\\\s+ContentType=\"[^\"]+\"/?>`,\n 'g'\n );\n if (existingPattern.test(contentTypesXml)) {\n // Update existing\n contentTypesXml = contentTypesXml.replace(\n existingPattern,\n `<Default Extension=\"${extension}\" ContentType=\"${contentType}\"/>`\n );\n } else {\n // Add new before closing tag\n contentTypesXml = contentTypesXml.replace(\n '</Types>',\n ` <Default Extension=\"${extension}\" ContentType=\"${contentType}\"/>\\n</Types>`\n );\n }\n } else {\n // Add as Override element (for specific parts)\n const partName = partNameOrExtension.startsWith('/')\n ? partNameOrExtension\n : `/${partNameOrExtension}`;\n\n // Check if already exists\n const existingPattern = new RegExp(\n `<Override\\\\s+PartName=\"${partName.replace(\n /[.*+?^${}()|[\\]\\\\]/g,\n '\\\\$&'\n )}\"\\\\s+ContentType=\"[^\"]+\"/?>`,\n 'g'\n );\n if (existingPattern.test(contentTypesXml)) {\n // Update existing\n contentTypesXml = contentTypesXml.replace(\n existingPattern,\n `<Override PartName=\"${partName}\" ContentType=\"${contentType}\"/>`\n );\n } else {\n // Add new before closing tag\n contentTypesXml = contentTypesXml.replace(\n '</Types>',\n ` <Override PartName=\"${partName}\" ContentType=\"${contentType}\"/>\\n</Types>`\n );\n }\n }\n\n // Update the content types file\n this.zipHandler.updateFile('[Content_Types].xml', contentTypesXml);\n return true;\n } catch (error: unknown) {\n return false;\n }\n }\n\n /**\n * Gets all relationships for the document\n *\n * Returns a map of relationship file paths to their relationships.\n * This includes document relationships, part relationships, etc.\n *\n * @returns Map of relationship file paths to relationship arrays\n *\n * @example\n * ```typescript\n * const relationships = await doc.getAllRelationships();\n * relationships.forEach((rels, path) => {\n * console.log(`${path}: ${rels.length} relationships`);\n * });\n * ```\n */\n async getAllRelationships(): Promise<Map<string, any[]>> {\n const relationships = new Map<string, any[]>();\n\n try {\n // Get all .rels files\n const relsPaths = this.zipHandler.getFilePaths().filter((path) => path.endsWith('.rels'));\n\n for (const relsPath of relsPaths) {\n const relsContent = this.zipHandler.getFileAsString(relsPath);\n if (relsContent) {\n interface ParsedRelationship {\n id?: string;\n type?: string;\n target?: string;\n targetMode?: string;\n }\n\n const rels: ParsedRelationship[] = [];\n\n // Use XMLParser to extract all Relationship elements\n const relationshipElements = XMLParser.extractElements(relsContent, 'Relationship');\n\n for (const relElement of relationshipElements) {\n const rel: ParsedRelationship = {};\n\n // Extract attributes using XMLParser\n const id = XMLParser.extractAttribute(relElement, 'Id');\n const type = XMLParser.extractAttribute(relElement, 'Type');\n const target = XMLParser.extractAttribute(relElement, 'Target');\n const targetMode = XMLParser.extractAttribute(relElement, 'TargetMode');\n\n if (id) rel.id = id;\n if (type) rel.type = type;\n if (target) rel.target = target;\n if (targetMode) rel.targetMode = targetMode;\n\n rels.push(rel);\n }\n\n relationships.set(relsPath, rels);\n }\n }\n } catch (error: unknown) {\n // Return empty map on error\n }\n\n return relationships;\n }\n\n /**\n * Gets relationships for a specific document part\n *\n * Retrieves all relationships defined for a specific part's .rels file.\n * For example, calling with 'word/document.xml' returns relationships\n * from 'word/_rels/document.xml.rels'.\n *\n * @param partName - The 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 * @example\n * ```typescript\n * // Get relationships for document\n * const docRels = await doc.getRelationships('word/document.xml');\n * for (const rel of docRels) {\n * if (rel.type.includes('hyperlink')) {\n * console.log('Hyperlink target:', rel.target);\n * }\n * }\n *\n * // Get relationships for styles\n * const styleRels = await doc.getRelationships('word/styles.xml');\n *\n * // Get relationships for headers/footers\n * const headerRels = await doc.getRelationships('word/header1.xml');\n * ```\n */\n async getRelationships(\n partName: string\n ): Promise<{ id?: string; type?: string; target?: string; targetMode?: string }[]> {\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 = this.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 // Use XMLParser to extract all Relationship elements\n const relationshipElements = XMLParser.extractElements(relsContent, 'Relationship');\n\n for (const relElement of relationshipElements) {\n const rel: ParsedRelationship = {};\n\n // Extract attributes using XMLParser\n const id = XMLParser.extractAttribute(relElement, 'Id');\n const type = XMLParser.extractAttribute(relElement, 'Type');\n const target = XMLParser.extractAttribute(relElement, 'Target');\n const targetMode = XMLParser.extractAttribute(relElement, 'TargetMode');\n\n if (id) rel.id = id;\n if (type) rel.type = type;\n if (target) rel.target = target;\n if (targetMode) rel.targetMode = targetMode;\n\n relationships.push(rel);\n }\n\n return relationships;\n } catch (error: unknown) {\n // Return empty array on error\n return [];\n }\n }\n\n /**\n * Gets the content type for a specific part\n * Helper method used internally by getPart\n */\n private getContentTypeForPart(partName: string): string | undefined {\n try {\n const contentTypesXml = this.zipHandler.getFileAsString('[Content_Types].xml');\n if (!contentTypesXml) {\n return undefined;\n }\n\n // Check for specific override\n const overridePattern = new RegExp(\n `<Override\\\\s+PartName=\"${partName.replace(\n /[.*+?^${}()|[\\]\\\\]/g,\n '\\\\$&'\n )}\"\\\\s+ContentType=\"([^\"]+)\"`,\n 'i'\n );\n const overrideMatch = contentTypesXml.match(overridePattern);\n if (overrideMatch) {\n return overrideMatch[1];\n }\n\n // Check for extension default\n const ext = partName.substring(partName.lastIndexOf('.'));\n if (ext) {\n const defaultPattern = new RegExp(\n `<Default\\\\s+Extension=\"${ext.substring(1)}\"\\\\s+ContentType=\"([^\"]+)\"`,\n 'i'\n );\n const defaultMatch = contentTypesXml.match(defaultPattern);\n if (defaultMatch) {\n return defaultMatch[1];\n }\n }\n } catch (error: unknown) {\n // Return undefined on error\n }\n\n return undefined;\n }\n\n /**\n * Finds all occurrences of specific text in the document\n *\n * Searches through all paragraphs (including those in tables) and returns\n * detailed information about each match, including the containing paragraph,\n * run, and position within the run.\n *\n * @param text - The text string to search for\n * @param options - Optional search configuration\n * @param options.caseSensitive - If true, match case exactly (default: false)\n * @param options.wholeWord - If true, match whole words only (default: false)\n * @returns Array of search results with location and context information\n *\n * @example\n * ```typescript\n * // Find all occurrences (case-insensitive)\n * const results = doc.findText('important');\n * console.log(`Found ${results.length} matches`);\n *\n * for (const result of results) {\n * console.log(`Match in paragraph ${result.paragraphIndex}: \"${result.text}\"`);\n * }\n * ```\n *\n * @example\n * ```typescript\n * // Find exact case and whole word only\n * const results = doc.findText('Error', {\n * caseSensitive: true,\n * wholeWord: true\n * });\n * ```\n */\n findText(\n text: string,\n options?: { caseSensitive?: boolean; wholeWord?: boolean }\n ): {\n paragraph: Paragraph;\n paragraphIndex: number;\n run: Run;\n runIndex: number;\n text: string;\n startIndex: number;\n }[] {\n const results: {\n paragraph: Paragraph;\n paragraphIndex: number;\n run: Run;\n runIndex: number;\n text: string;\n startIndex: number;\n }[] = [];\n\n const caseSensitive = options?.caseSensitive ?? false;\n const wholeWord = options?.wholeWord ?? false;\n const searchText = caseSensitive ? text : text.toLowerCase();\n\n // Track searched paragraphs to prevent duplicates (tables are in both getAllParagraphs() and getTables())\n const searchedParagraphs = new Set<Paragraph>();\n\n const paragraphs = this.getAllParagraphs();\n for (let pIndex = 0; pIndex < paragraphs.length; pIndex++) {\n const paragraph = paragraphs[pIndex];\n if (!paragraph) continue;\n\n // Mark this paragraph as searched\n searchedParagraphs.add(paragraph);\n const runs = paragraph.getRuns();\n\n for (let rIndex = 0; rIndex < runs.length; rIndex++) {\n const run = runs[rIndex];\n if (!run) continue;\n const runText = run.getText();\n const compareText = caseSensitive ? runText : runText.toLowerCase();\n\n if (wholeWord) {\n // Create word boundary regex\n const wordPattern = new RegExp(\n `\\\\b${searchText.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\b`,\n caseSensitive ? 'g' : 'gi'\n );\n let match;\n while ((match = wordPattern.exec(runText)) !== null) {\n results.push({\n paragraph,\n paragraphIndex: pIndex,\n run,\n runIndex: rIndex,\n text: match[0],\n startIndex: match.index,\n });\n }\n } else {\n // Simple substring search\n let startIndex = 0;\n while ((startIndex = compareText.indexOf(searchText, startIndex)) !== -1) {\n results.push({\n paragraph,\n paragraphIndex: pIndex,\n run,\n runIndex: rIndex,\n text: runText.substr(startIndex, text.length),\n startIndex,\n });\n startIndex += text.length;\n }\n }\n }\n }\n\n // Also search in tables\n for (const table of this.getTables()) {\n for (const row of table.getRows()) {\n for (const cell of row.getCells()) {\n if (cell instanceof TableCell) {\n const cellParagraphs = cell.getParagraphs();\n for (let pIndex = 0; pIndex < cellParagraphs.length; pIndex++) {\n const paragraph = cellParagraphs[pIndex];\n if (!paragraph) continue;\n\n // Skip if already searched (getAllParagraphs includes table paragraphs)\n if (searchedParagraphs.has(paragraph)) {\n continue;\n }\n searchedParagraphs.add(paragraph);\n\n const runs = paragraph.getRuns();\n\n for (let rIndex = 0; rIndex < runs.length; rIndex++) {\n const run = runs[rIndex];\n if (!run) continue;\n const runText = run.getText();\n const compareText = caseSensitive ? runText : runText.toLowerCase();\n\n if (wholeWord) {\n // Create word boundary regex\n const wordPattern = new RegExp(\n `\\\\b${searchText.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\b`,\n caseSensitive ? 'g' : 'gi'\n );\n let match;\n while ((match = wordPattern.exec(runText)) !== null) {\n results.push({\n paragraph,\n paragraphIndex: -1, // Not in main body, in table\n run,\n runIndex: rIndex,\n text: match[0],\n startIndex: match.index,\n });\n }\n } else {\n // Simple substring search\n let startIndex = 0;\n while ((startIndex = compareText.indexOf(searchText, startIndex)) !== -1) {\n results.push({\n paragraph,\n paragraphIndex: -1, // Not in main body, in table\n run,\n runIndex: rIndex,\n text: runText.substr(startIndex, text.length),\n startIndex,\n });\n startIndex += text.length;\n }\n }\n }\n }\n }\n }\n }\n }\n\n return results;\n }\n\n /**\n * Finds paragraphs containing text matching a pattern\n *\n * Supports both plain string and regex patterns. Returns an array of\n * paragraphs with match details for each occurrence.\n *\n * @param pattern - String or RegExp to search for\n * @returns Array of paragraphs with their matches\n *\n * @example\n * ```typescript\n * // Find with string\n * const results = doc.findParagraphsByText('error');\n *\n * // Find with regex\n * const results = doc.findParagraphsByText(/\\berror\\b/gi);\n * for (const { paragraph, matches } of results) {\n * console.log(`Found ${matches.length} matches in paragraph`);\n * }\n * ```\n */\n findParagraphsByText(pattern: string | RegExp): { paragraph: Paragraph; matches: string[] }[] {\n const results: { paragraph: Paragraph; matches: string[] }[] = [];\n const regex = typeof pattern === 'string' ? new RegExp(pattern, 'gi') : pattern;\n\n for (const paragraph of this.getAllParagraphs()) {\n const text = paragraph.getText();\n const matches = text.match(regex);\n if (matches && matches.length > 0) {\n results.push({ paragraph, matches: [...matches] });\n }\n }\n return results;\n }\n\n /**\n * Gets all runs that use a specific font\n *\n * Searches through all paragraphs (including tables) and returns runs\n * that have the specified font applied.\n *\n * @param fontName - Font name to search for (case-insensitive)\n * @returns Array of runs using the specified font\n *\n * @example\n * ```typescript\n * const arialRuns = doc.getRunsByFont('Arial');\n * console.log(`Found ${arialRuns.length} runs using Arial`);\n * ```\n */\n getRunsByFont(fontName: string): Run[] {\n const results: Run[] = [];\n const lowerFontName = fontName.toLowerCase();\n\n for (const paragraph of this.getAllParagraphs()) {\n for (const run of paragraph.getRuns()) {\n const formatting = run.getFormatting();\n if (formatting.font?.toLowerCase() === lowerFontName) {\n results.push(run);\n }\n }\n }\n return results;\n }\n\n /**\n * Gets all runs that use a specific color\n *\n * Searches through all paragraphs (including tables) and returns runs\n * that have the specified color applied.\n *\n * @param color - Hex color code to search for (with or without #)\n * @returns Array of runs using the specified color\n *\n * @example\n * ```typescript\n * const redRuns = doc.getRunsByColor('FF0000');\n * const blueRuns = doc.getRunsByColor('#0000FF');\n * ```\n */\n getRunsByColor(color: string): Run[] {\n const results: Run[] = [];\n // Normalize color - remove # and convert to uppercase\n const normalizedColor = color.replace(/^#/, '').toUpperCase();\n\n for (const paragraph of this.getAllParagraphs()) {\n for (const run of paragraph.getRuns()) {\n const formatting = run.getFormatting();\n if (formatting.color) {\n const runColor = formatting.color.replace(/^#/, '').toUpperCase();\n if (runColor === normalizedColor) {\n results.push(run);\n }\n }\n }\n }\n return results;\n }\n\n /**\n * Gets all paragraphs that use a specific style\n *\n * @param styleId - Style ID to filter by\n * @returns Array of paragraphs using the specified style\n *\n * @example\n * ```typescript\n * const headings = doc.getParagraphsByStyle('Heading1');\n * console.log(`Found ${headings.length} Heading 1 paragraphs`);\n * ```\n */\n getParagraphsByStyle(styleId: string): Paragraph[] {\n return this.getAllParagraphs().filter((para) => para.getStyle() === styleId);\n }\n\n /**\n * Sets the font for all runs in the document\n *\n * Applies the specified font to every text run in the document,\n * including runs in tables.\n *\n * @param fontName - The font name to apply (e.g., 'Arial', 'Times New Roman')\n * @returns Number of runs modified\n *\n * @example\n * ```typescript\n * const count = doc.setAllRunsFont('Calibri');\n * console.log(`Changed font on ${count} runs`);\n * ```\n */\n setAllRunsFont(fontName: string): number {\n let count = 0;\n for (const run of this.getAllRuns()) {\n run.setFont(fontName);\n count++;\n }\n return count;\n }\n\n /**\n * Sets the font size for all runs in the document\n *\n * Applies the specified font size to every text run in the document,\n * including runs in tables.\n *\n * @param size - Font size in half-points (e.g., 24 = 12pt, 22 = 11pt)\n * @returns Number of runs modified\n *\n * @example\n * ```typescript\n * const count = doc.setAllRunsSize(24); // Set to 12pt\n * console.log(`Changed size on ${count} runs`);\n * ```\n */\n setAllRunsSize(size: number): number {\n let count = 0;\n for (const run of this.getAllRuns()) {\n run.setSize(size);\n count++;\n }\n return count;\n }\n\n /**\n * Sets the color for all runs in the document\n *\n * Applies the specified color to every text run in the document,\n * including runs in tables.\n *\n * @param color - Hex color code (e.g., 'FF0000', '#0000FF')\n * @returns Number of runs modified\n *\n * @example\n * ```typescript\n * const count = doc.setAllRunsColor('000000'); // Set to black\n * console.log(`Changed color on ${count} runs`);\n * ```\n */\n setAllRunsColor(color: string): number {\n let count = 0;\n for (const run of this.getAllRuns()) {\n run.setColor(color);\n count++;\n }\n return count;\n }\n\n /**\n * Formatting report interface\n */\n static FormattingReport: {\n fonts: Map<string, number>;\n sizes: Map<number, number>;\n colors: Map<string, number>;\n styles: Map<string, number>;\n uniqueFonts: string[];\n uniqueColors: string[];\n uniqueStyles: string[];\n mostUsedFont?: string;\n mostUsedSize?: number;\n mostUsedColor?: string;\n totalRuns: number;\n totalParagraphs: number;\n };\n\n /**\n * Generates a formatting report for the document\n *\n * Analyzes all runs and paragraphs to provide statistics about\n * formatting usage throughout the document.\n *\n * @returns Object with formatting statistics\n *\n * @example\n * ```typescript\n * const report = doc.getFormattingReport();\n * console.log(`Unique fonts: ${report.uniqueFonts.join(', ')}`);\n * console.log(`Most used font: ${report.mostUsedFont}`);\n * console.log(`Most used size: ${report.mostUsedSize / 2}pt`);\n * ```\n */\n getFormattingReport(): {\n fonts: Map<string, number>;\n sizes: Map<number, number>;\n colors: Map<string, number>;\n styles: Map<string, number>;\n uniqueFonts: string[];\n uniqueColors: string[];\n uniqueStyles: string[];\n mostUsedFont?: string;\n mostUsedSize?: number;\n mostUsedColor?: string;\n totalRuns: number;\n totalParagraphs: number;\n } {\n const fonts = new Map<string, number>();\n const sizes = new Map<number, number>();\n const colors = new Map<string, number>();\n const styles = new Map<string, number>();\n let totalRuns = 0;\n\n const paragraphs = this.getAllParagraphs();\n\n for (const para of paragraphs) {\n // Track paragraph styles\n const style = para.getStyle();\n if (style) {\n styles.set(style, (styles.get(style) || 0) + 1);\n }\n\n // Track run formatting\n for (const run of para.getRuns()) {\n totalRuns++;\n const formatting = run.getFormatting();\n\n if (formatting.font) {\n fonts.set(formatting.font, (fonts.get(formatting.font) || 0) + 1);\n }\n if (formatting.size !== undefined) {\n sizes.set(formatting.size, (sizes.get(formatting.size) || 0) + 1);\n }\n if (formatting.color) {\n const normalizedColor = formatting.color.toUpperCase().replace(/^#/, '');\n colors.set(normalizedColor, (colors.get(normalizedColor) || 0) + 1);\n }\n }\n }\n\n // Find most used entries\n let mostUsedFont: string | undefined;\n let maxFontCount = 0;\n for (const [font, count] of fonts.entries()) {\n if (count > maxFontCount) {\n maxFontCount = count;\n mostUsedFont = font;\n }\n }\n\n let mostUsedSize: number | undefined;\n let maxSizeCount = 0;\n for (const [size, count] of sizes.entries()) {\n if (count > maxSizeCount) {\n maxSizeCount = count;\n mostUsedSize = size;\n }\n }\n\n let mostUsedColor: string | undefined;\n let maxColorCount = 0;\n for (const [color, count] of colors.entries()) {\n if (count > maxColorCount) {\n maxColorCount = count;\n mostUsedColor = color;\n }\n }\n\n return {\n fonts,\n sizes,\n colors,\n styles,\n uniqueFonts: Array.from(fonts.keys()),\n uniqueColors: Array.from(colors.keys()),\n uniqueStyles: Array.from(styles.keys()),\n mostUsedFont,\n mostUsedSize,\n mostUsedColor,\n totalRuns,\n totalParagraphs: paragraphs.length,\n };\n }\n\n /**\n * Replaces all occurrences of text in the document\n *\n * Searches through all paragraphs (including those in tables) and replaces\n * matching text with the replacement string. Preserves the original formatting\n * of the text runs.\n *\n * @param find - The text string to search for\n * @param replace - The text string to replace with\n * @param options - Optional replacement configuration\n * @param options.caseSensitive - If true, match case exactly (default: false)\n * @param options.wholeWord - If true, match whole words only (default: false)\n * @returns Number of replacements made\n *\n * @example\n * ```typescript\n * // Simple find and replace\n * const count = doc.replaceText('color', 'colour');\n * console.log(`Replaced ${count} occurrences`);\n * ```\n *\n * @example\n * ```typescript\n * // Case-sensitive whole word replacement\n * const count = doc.replaceText('Error', 'Warning', {\n * caseSensitive: true,\n * wholeWord: true\n * });\n * ```\n */\n replaceText(\n find: string,\n replace: string,\n options?: { caseSensitive?: boolean; wholeWord?: boolean }\n ): number {\n let replacementCount = 0;\n const caseSensitive = options?.caseSensitive ?? false;\n const wholeWord = options?.wholeWord ?? false;\n\n const paragraphs = this.getAllParagraphs();\n for (const paragraph of paragraphs) {\n const runs = paragraph.getRuns();\n\n for (const run of runs) {\n const originalText = run.getText();\n let newText = originalText;\n\n if (wholeWord) {\n // Use word boundary regex for whole word replacement\n const wordPattern = new RegExp(\n `\\\\b${find.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\b`,\n caseSensitive ? 'g' : 'gi'\n );\n const matches = originalText.match(wordPattern);\n if (matches) {\n replacementCount += matches.length;\n newText = originalText.replace(wordPattern, replace);\n }\n } else {\n // Simple substring replacement\n const searchPattern = new RegExp(\n find.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'),\n caseSensitive ? 'g' : 'gi'\n );\n const matches = originalText.match(searchPattern);\n if (matches) {\n replacementCount += matches.length;\n newText = originalText.replace(searchPattern, replace);\n }\n }\n\n if (newText !== originalText) {\n run.setText(newText);\n }\n }\n }\n\n return replacementCount;\n }\n\n /**\n * Advanced find and replace with regex support and track changes integration\n *\n * Performs global find and replace operations with support for:\n * - Regular expressions for complex pattern matching\n * - Case-sensitive and whole-word matching\n * - Track changes integration (creates revision objects)\n * - Replacement across paragraphs and table cells\n *\n * @param pattern - String or RegExp pattern to find\n * @param replacement - Replacement text\n * @param options - Search and tracking options\n * @returns Object with replacement count and optional revisions\n *\n * @example\n * ```typescript\n * // Simple text replacement\n * const result = doc.findAndReplaceAll('old text', 'new text');\n * console.log(`Made ${result.count} replacements`);\n *\n * // Regex replacement\n * const phoneResult = doc.findAndReplaceAll(\n * /\\d{3}-\\d{4}/g,\n * '***-****',\n * { caseSensitive: true }\n * );\n *\n * // With track changes\n * const tracked = doc.findAndReplaceAll('error', 'correction', {\n * trackChanges: true,\n * author: 'John Doe'\n * });\n * console.log(`Created ${tracked.revisions?.length} revisions`);\n *\n * // Whole word replacement\n * doc.findAndReplaceAll('test', 'exam', { wholeWord: true });\n * ```\n */\n findAndReplaceAll(\n pattern: string | RegExp,\n replacement: string,\n options?: {\n caseSensitive?: boolean;\n wholeWord?: boolean;\n trackChanges?: boolean;\n author?: string;\n }\n ): { count: number; revisions?: Revision[] } {\n const {\n caseSensitive = false,\n wholeWord = false,\n trackChanges = false,\n author = 'Unknown',\n } = options || {};\n\n let count = 0;\n const revisions: Revision[] = [];\n\n // Convert pattern to RegExp if it's a string\n let regex: RegExp;\n if (typeof pattern === 'string') {\n // Escape special regex characters\n const escaped = pattern.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const boundaryPattern = wholeWord ? `\\\\b${escaped}\\\\b` : escaped;\n const flags = caseSensitive ? 'g' : 'gi';\n regex = new RegExp(boundaryPattern, flags);\n } else {\n // Use provided RegExp, ensure global flag\n const flags = pattern.flags.includes('g') ? pattern.flags : pattern.flags + 'g';\n regex = new RegExp(pattern.source, flags);\n }\n\n // Process all runs in document\n const runs = this.getAllRuns();\n\n for (const run of runs) {\n const originalText = run.getText();\n const matches = originalText.match(regex);\n\n if (matches && matches.length > 0) {\n const newText = originalText.replace(regex, replacement);\n\n if (trackChanges && !this.trackChangesEnabled) {\n // Option-level tracking: global tracking is OFF, so we manually create\n // and embed revisions into the paragraph content\n const parentParagraph = run._getParentParagraph();\n\n if (parentParagraph) {\n const segments = diffText(originalText, newText);\n const useGranular = diffHasUnchangedParts(segments);\n const now = new Date();\n const formatting = run.getFormatting();\n const newContent: ParagraphContent[] = [];\n\n if (useGranular) {\n for (const seg of segments) {\n if (seg.type === 'equal') {\n newContent.push(new Run(seg.text, formatting));\n } else if (seg.type === 'delete') {\n const delRev = Revision.createDeletion(\n author,\n new Run(seg.text, formatting),\n now\n );\n this.revisionManager.register(delRev);\n revisions.push(delRev);\n newContent.push(delRev);\n } else if (seg.type === 'insert') {\n const insRev = Revision.createInsertion(\n author,\n new Run(seg.text, formatting),\n now\n );\n this.revisionManager.register(insRev);\n revisions.push(insRev);\n newContent.push(insRev);\n }\n }\n } else {\n // Whole-run delete + insert\n const deletion = Revision.createDeletion(\n author,\n new Run(originalText, formatting),\n now\n );\n this.revisionManager.register(deletion);\n revisions.push(deletion);\n newContent.push(deletion);\n\n const insertion = Revision.createInsertion(author, new Run(newText, formatting), now);\n this.revisionManager.register(insertion);\n revisions.push(insertion);\n newContent.push(insertion);\n }\n\n parentParagraph.replaceContent(run, newContent);\n } else {\n // No parent paragraph — just update text in-place as fallback\n run.setText(newText);\n }\n } else {\n // Global tracking path or no tracking: use setText()\n const revCountBefore = this.revisionManager.getAllRevisions().length;\n\n run.setText(newText);\n\n // If global tracking is enabled and trackChanges was requested, collect the new revisions\n if (trackChanges && this.trackChangesEnabled) {\n const allRevs = this.revisionManager.getAllRevisions();\n for (let i = revCountBefore; i < allRevs.length; i++) {\n revisions.push(allRevs[i]!);\n }\n }\n }\n\n count += matches.length;\n }\n }\n\n return trackChanges ? { count, revisions } : { count };\n }\n\n /**\n * Gets the total word count in the document\n *\n * Counts all words in paragraphs including those inside tables.\n * Words are determined by splitting text on whitespace.\n *\n * @returns Total number of words in the document\n *\n * @example\n * ```typescript\n * const words = doc.getWordCount();\n * console.log(`Document contains ${words} words`);\n * ```\n */\n getWordCount(): number {\n let totalWords = 0;\n\n // Track counted paragraphs to prevent duplicates (getAllParagraphs includes table paragraphs)\n const countedParagraphs = new Set<Paragraph>();\n\n const paragraphs = this.getAllParagraphs();\n for (const paragraph of paragraphs) {\n countedParagraphs.add(paragraph);\n const text = paragraph.getText().trim();\n if (text) {\n // Split by whitespace and filter out empty strings\n const words = text.split(/\\s+/).filter((word) => word.length > 0);\n totalWords += words.length;\n }\n }\n\n // Also count words in tables (skip if already counted)\n const tables = this.getTables();\n for (const table of tables) {\n const rows = table.getRows();\n for (const row of rows) {\n const cells = row.getCells();\n for (const cell of cells) {\n const cellParas = cell.getParagraphs();\n for (const para of cellParas) {\n // Skip if already counted\n if (countedParagraphs.has(para)) {\n continue;\n }\n countedParagraphs.add(para);\n\n const text = para.getText().trim();\n if (text) {\n const words = text.split(/\\s+/).filter((word) => word.length > 0);\n totalWords += words.length;\n }\n }\n }\n }\n }\n\n return totalWords;\n }\n\n /**\n * Gets the total character count in the document\n *\n * Counts all characters in paragraphs including those inside tables.\n * Optionally includes or excludes spaces from the count.\n *\n * @param includeSpaces - If true, includes spaces in count; if false, excludes them (default: true)\n * @returns Total number of characters in the document\n *\n * @example\n * ```typescript\n * const charsWithSpaces = doc.getCharacterCount();\n * const charsNoSpaces = doc.getCharacterCount(false);\n * console.log(`Characters: ${charsWithSpaces} (with spaces), ${charsNoSpaces} (without)`);\n * ```\n */\n getCharacterCount(includeSpaces = true): number {\n let totalChars = 0;\n\n // Track counted paragraphs to prevent duplicates (getAllParagraphs includes table paragraphs)\n const countedParagraphs = new Set<Paragraph>();\n\n const paragraphs = this.getAllParagraphs();\n for (const paragraph of paragraphs) {\n countedParagraphs.add(paragraph);\n const text = paragraph.getText();\n if (includeSpaces) {\n totalChars += text.length;\n } else {\n totalChars += text.replace(/\\s/g, '').length;\n }\n }\n\n // Also count characters in tables (skip if already counted)\n const tables = this.getTables();\n for (const table of tables) {\n const rows = table.getRows();\n for (const row of rows) {\n const cells = row.getCells();\n for (const cell of cells) {\n const cellParas = cell.getParagraphs();\n for (const para of cellParas) {\n // Skip if already counted\n if (countedParagraphs.has(para)) {\n continue;\n }\n countedParagraphs.add(para);\n\n const text = para.getText();\n if (includeSpaces) {\n totalChars += text.length;\n } else {\n totalChars += text.replace(/\\s/g, '').length;\n }\n }\n }\n }\n }\n\n return totalChars;\n }\n\n /**\n * Removes a paragraph from the document\n * @param paragraphOrIndex - The paragraph object or its index\n * @returns True if the paragraph was removed, false otherwise\n */\n removeParagraph(paragraphOrIndex: Paragraph | number): boolean {\n let index: number;\n\n if (typeof paragraphOrIndex === 'number') {\n index = paragraphOrIndex;\n } else {\n // Find the index of the paragraph\n index = this.bodyElements.indexOf(paragraphOrIndex);\n }\n\n if (index >= 0 && index < this.bodyElements.length) {\n const element = this.bodyElements[index];\n if (element instanceof Paragraph) {\n // When tracking enabled, wrap content in w:del instead of removing\n if (this.trackChangesEnabled && this.trackingContext.isEnabled()) {\n const runs = element.getRuns();\n if (runs.length > 0) {\n const author = this.trackingContext.getAuthor();\n const deletion = Revision.createDeletion(author, runs);\n this.trackingContext.getRevisionManager().register(deletion);\n element.addRevision(deletion);\n }\n return true;\n }\n this.bodyElements.splice(index, 1);\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Removes a table from the document\n * @param tableOrIndex - The table object or its index\n * @returns True if the table was removed, false otherwise\n */\n removeTable(tableOrIndex: Table | number): boolean {\n let index: number;\n\n if (typeof tableOrIndex === 'number') {\n // If number provided, find the nth table\n const tables = this.getTables();\n if (tableOrIndex >= 0 && tableOrIndex < tables.length) {\n const table = tables[tableOrIndex];\n if (!table) return false;\n index = this.bodyElements.indexOf(table);\n } else {\n return false;\n }\n } else {\n // Find the index of the table\n index = this.bodyElements.indexOf(tableOrIndex);\n }\n\n if (index >= 0 && index < this.bodyElements.length) {\n const element = this.bodyElements[index];\n if (element instanceof Table) {\n this.bodyElements.splice(index, 1);\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Validates a paragraph before insertion\n * @param paragraph - The paragraph to validate\n * @throws Error if paragraph is invalid\n */\n private validateParagraph(paragraph: Paragraph): void {\n // Type validation\n if (!(paragraph instanceof Paragraph)) {\n throw new Error('insertParagraphAt: parameter must be a Paragraph instance');\n }\n\n // Check for duplicate paragraph IDs\n const paraId = paragraph.getFormatting().paraId;\n if (paraId) {\n const existingIds = this.bodyElements\n .filter((el): el is Paragraph => el instanceof Paragraph)\n .map((p) => p.getFormatting().paraId)\n .filter((id) => id === paraId);\n\n if (existingIds.length > 0) {\n throw new Error(\n `Duplicate paragraph ID detected: ${paraId}. Each paragraph must have a unique ID.`\n );\n }\n }\n\n // Warn about missing styles\n const style = paragraph.getFormatting().style;\n if (style && !this.stylesManager.hasStyle(style)) {\n defaultLogger.warn(\n `Style \"${style}\" not found in document. Paragraph will fall back to Normal style.`\n );\n }\n\n // Warn about missing numbering\n const numbering = paragraph.getFormatting().numbering;\n if (numbering && !this.numberingManager.hasInstance(numbering.numId)) {\n defaultLogger.warn(\n `Numbering ID ${numbering.numId} not found in document. List formatting will not display.`\n );\n }\n }\n\n /**\n * Validates a table before insertion\n * @param table - The table to validate\n * @throws Error if table is invalid\n */\n private validateTable(table: Table): void {\n // Type validation\n if (!(table instanceof Table)) {\n throw new Error('insertTableAt: parameter must be a Table instance');\n }\n\n // Content validation - table must have rows\n const rows = table.getRows();\n if (rows.length === 0) {\n throw new Error('insertTableAt: table must have at least one row');\n }\n\n // Check first row has cells (rows.length > 0 already checked above)\n const firstRow = rows[0];\n if (firstRow?.getCells().length === 0) {\n throw new Error('insertTableAt: table rows must have at least one cell');\n }\n\n // Warn about missing table styles\n const tableStyle = table.getFormatting().style;\n if (tableStyle && !this.stylesManager.hasStyle(tableStyle)) {\n defaultLogger.warn(\n `Table style \"${tableStyle}\" not found in document. Table will use default formatting.`\n );\n }\n }\n\n /**\n * Validates a TOC element before insertion\n * @param toc - The TOC to validate\n * @throws Error if TOC is invalid\n */\n private validateToc(toc: TableOfContentsElement): void {\n // Type validation\n if (!(toc instanceof TableOfContentsElement)) {\n throw new Error('insertTocAt: parameter must be a TableOfContentsElement instance');\n }\n\n // Check if document has heading styles for TOC to reference\n const hasHeadings = [\n 'Heading1',\n 'Heading2',\n 'Heading3',\n 'Heading4',\n 'Heading5',\n 'Heading6',\n 'Heading7',\n 'Heading8',\n 'Heading9',\n ].some((style) => this.stylesManager.hasStyle(style));\n\n if (!hasHeadings) {\n defaultLogger.warn(\n 'No heading styles found in document. Table of Contents may not display entries correctly.'\n );\n }\n }\n\n /**\n * Normalizes and validates insertion index\n * @param index - The requested index\n * @returns Normalized index within valid bounds\n */\n private normalizeIndex(index: number): number {\n if (index < 0) {\n return 0;\n } else if (index > this.bodyElements.length) {\n return this.bodyElements.length;\n }\n return index;\n }\n\n /**\n * Inserts a paragraph at a specific position\n * @param index - The position to insert at (0-based)\n * @param paragraph - The paragraph to insert\n * @returns This document for chaining\n * @throws Error if paragraph is invalid or has duplicate IDs\n */\n insertParagraphAt(index: number, paragraph: Paragraph): this {\n // Validate the paragraph\n this.validateParagraph(paragraph);\n\n // Normalize index\n index = this.normalizeIndex(index);\n\n // Insert the paragraph\n this.bodyElements.splice(index, 0, paragraph);\n return this;\n }\n\n /**\n * Inserts a table at a specific position\n * @param index - The position to insert at (0-based)\n * @param table - The table to insert\n * @returns This document for chaining\n * @throws Error if table is invalid or malformed\n * @example\n * ```typescript\n * const table = new Table(2, 3);\n * doc.insertTableAt(5, table); // Insert at position 5\n * ```\n */\n insertTableAt(index: number, table: Table): this {\n // Validate the table\n this.validateTable(table);\n\n // Normalize index\n index = this.normalizeIndex(index);\n\n // Insert the table\n this.bodyElements.splice(index, 0, table);\n return this;\n }\n\n /**\n * Inserts a Table of Contents at a specific position\n * @param index - The position to insert at (0-based)\n * @param toc - The TableOfContentsElement to insert\n * @returns This document for chaining\n * @throws Error if TOC is invalid\n * @example\n * ```typescript\n * const toc = TableOfContentsElement.createStandard();\n * doc.insertTocAt(0, toc); // Insert at beginning\n * ```\n */\n insertTocAt(index: number, toc: TableOfContentsElement): this {\n // Validate the TOC\n this.validateToc(toc);\n\n // Normalize index\n index = this.normalizeIndex(index);\n\n // Insert the TOC\n this.bodyElements.splice(index, 0, toc);\n return this;\n }\n\n /**\n * Replaces a paragraph at a specific position\n * @param index - The position to replace at (0-based)\n * @param paragraph - The new paragraph\n * @returns True if replaced, false if index invalid\n * @throws Error if replacement paragraph is invalid or has duplicate IDs\n * @example\n * ```typescript\n * const newPara = new Paragraph();\n * newPara.addText('Replacement text');\n * doc.replaceParagraphAt(3, newPara);\n * ```\n */\n replaceParagraphAt(index: number, paragraph: Paragraph): boolean {\n if (index >= 0 && index < this.bodyElements.length) {\n const element = this.bodyElements[index];\n if (element instanceof Paragraph) {\n // Validate the replacement paragraph\n this.validateParagraph(paragraph);\n\n // Replace the paragraph\n this.bodyElements[index] = paragraph;\n return true;\n }\n }\n return false;\n }\n\n /**\n * Replaces a table at a specific position\n * @param index - The position to replace at (0-based)\n * @param table - The new table\n * @returns True if replaced, false if index invalid or not a table\n * @throws Error if replacement table is invalid or malformed\n * @example\n * ```typescript\n * const newTable = new Table(3, 4);\n * doc.replaceTableAt(2, newTable);\n * ```\n */\n replaceTableAt(index: number, table: Table): boolean {\n if (index >= 0 && index < this.bodyElements.length) {\n const element = this.bodyElements[index];\n if (element instanceof Table) {\n // Validate the replacement table\n this.validateTable(table);\n\n // Replace the table\n this.bodyElements[index] = table;\n return true;\n }\n }\n return false;\n }\n\n /**\n * Moves an element from one position to another\n * @param fromIndex - Current position (0-based)\n * @param toIndex - Target position (0-based)\n * @returns True if moved, false if indices invalid\n * @example\n * ```typescript\n * doc.moveElement(5, 2); // Move element from position 5 to position 2\n * ```\n */\n moveElement(fromIndex: number, toIndex: number): boolean {\n if (\n fromIndex < 0 ||\n fromIndex >= this.bodyElements.length ||\n toIndex < 0 ||\n toIndex >= this.bodyElements.length\n ) {\n return false;\n }\n\n const [element] = this.bodyElements.splice(fromIndex, 1);\n this.bodyElements.splice(toIndex, 0, element!);\n return true;\n }\n\n /**\n * Swaps two elements' positions\n * @param index1 - First element position (0-based)\n * @param index2 - Second element position (0-based)\n * @returns True if swapped, false if indices invalid\n * @example\n * ```typescript\n * doc.swapElements(2, 5); // Swap elements at positions 2 and 5\n * ```\n */\n swapElements(index1: number, index2: number): boolean {\n if (\n index1 < 0 ||\n index1 >= this.bodyElements.length ||\n index2 < 0 ||\n index2 >= this.bodyElements.length\n ) {\n return false;\n }\n\n const temp = this.bodyElements[index1];\n this.bodyElements[index1] = this.bodyElements[index2]!;\n this.bodyElements[index2] = temp!;\n return true;\n }\n\n /**\n * Removes a Table of Contents element at a specific position\n * @param index - The position to remove (0-based)\n * @returns True if removed, false if index invalid or not a TOC\n * @example\n * ```typescript\n * doc.removeTocAt(0); // Remove TOC at beginning\n * ```\n */\n removeTocAt(index: number): boolean {\n if (index >= 0 && index < this.bodyElements.length) {\n const element = this.bodyElements[index];\n if (element instanceof TableOfContentsElement) {\n this.bodyElements.splice(index, 1);\n return true;\n }\n }\n return false;\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Body Element Access API\n // These methods provide index-based access to the internal bodyElements array,\n // enabling external code to perform the same manipulations that were previously\n // only possible from within the Document class.\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Gets the index of a body element in the document's body elements array.\n * Unlike getParagraphIndex/getTableIndex which find the index among same-type elements,\n * this returns the absolute index in the full bodyElements array.\n * @param element - The element to find\n * @returns The zero-based index of the element, or -1 if not found\n * @example\n * ```typescript\n * const tables = doc.getAllTables();\n * const index = doc.getBodyElementIndex(tables[0]);\n * if (index !== -1) {\n * const nextElement = doc.getBodyElementAt(index + 1);\n * }\n * ```\n */\n getBodyElementIndex(element: BodyElement): number {\n return this.bodyElements.indexOf(element);\n }\n\n /**\n * Gets the total number of body elements in the document.\n * @returns The count of body elements (paragraphs, tables, TOC elements, SDTs)\n * @example\n * ```typescript\n * for (let i = 0; i < doc.getBodyElementCount(); i++) {\n * const el = doc.getBodyElementAt(i);\n * }\n * ```\n */\n getBodyElementCount(): number {\n return this.bodyElements.length;\n }\n\n /**\n * Removes the body element at a specific index.\n * @param index - The zero-based index of the element to remove\n * @returns True if the element was removed, false if the index was out of bounds\n * @example\n * ```typescript\n * const index = doc.getBodyElementIndex(paragraph);\n * if (index !== -1) {\n * doc.removeBodyElementAt(index);\n * }\n * ```\n */\n removeBodyElementAt(index: number): boolean {\n if (index >= 0 && index < this.bodyElements.length) {\n this.bodyElements.splice(index, 1);\n return true;\n }\n return false;\n }\n\n /**\n * Inserts a body element at a specific index, shifting existing elements forward.\n * @param index - The zero-based index at which to insert. Clamped to valid range.\n * @param element - The element to insert (Paragraph, Table, TOC, or SDT)\n * @example\n * ```typescript\n * const blankPara = Paragraph.create();\n * const tableIndex = doc.getBodyElementIndex(table);\n * doc.insertBodyElementAt(tableIndex + 1, blankPara);\n * ```\n */\n insertBodyElementAt(index: number, element: BodyElement): void {\n const clampedIndex = Math.max(0, Math.min(index, this.bodyElements.length));\n this.bodyElements.splice(clampedIndex, 0, element);\n }\n\n /**\n * Replaces the entire body elements array.\n * Use with caution - this is a low-level operation for code that needs to\n * rebuild the body element list (e.g., SDT unwrapping).\n * @param elements - The new body elements array\n */\n setBodyElements(elements: BodyElement[]): void {\n this.bodyElements = elements;\n }\n\n /**\n * Gets all hyperlinks in the document\n *\n * Searches through all paragraphs (including those in tables) and returns\n * all Hyperlink instances along with their containing paragraphs.\n *\n * @returns Array of objects containing hyperlink and its parent paragraph\n *\n * @example\n * ```typescript\n * const hyperlinks = doc.getHyperlinks();\n * console.log(`Found ${hyperlinks.length} hyperlinks`);\n *\n * for (const { hyperlink, paragraph } of hyperlinks) {\n * console.log(`Link: ${hyperlink.getText()} -> ${hyperlink.getUrl()}`);\n * }\n * ```\n *\n * @example\n * ```typescript\n * // Find broken links\n * const hyperlinks = doc.getHyperlinks();\n * for (const { hyperlink } of hyperlinks) {\n * const url = hyperlink.getUrl();\n * if (url && url.includes('old-domain.com')) {\n * console.log(`Update needed: ${url}`);\n * }\n * }\n * ```\n */\n getHyperlinks(): { hyperlink: Hyperlink; paragraph: Paragraph }[] {\n const hyperlinks: { hyperlink: Hyperlink; paragraph: Paragraph }[] = [];\n\n // Helper function to extract hyperlinks from paragraph content,\n // including those inside Revision elements (w:ins, w:del, etc.)\n const extractHyperlinksFromParagraph = (para: Paragraph): void => {\n for (const content of para.getContent()) {\n if (content instanceof Hyperlink) {\n hyperlinks.push({ hyperlink: content, paragraph: para });\n } else if (content instanceof Revision) {\n // Check inside revision elements for hyperlinks\n for (const revContent of content.getContent()) {\n if (revContent instanceof Hyperlink) {\n hyperlinks.push({ hyperlink: revContent, paragraph: para });\n }\n }\n }\n }\n };\n\n for (const paragraph of this.getAllParagraphs()) {\n extractHyperlinksFromParagraph(paragraph);\n }\n\n // Also check in tables\n for (const table of this.getTables()) {\n for (const row of table.getRows()) {\n for (const cell of row.getCells()) {\n // TableCell has getParagraphs method\n const cellParagraphs = cell instanceof TableCell ? cell.getParagraphs() : [];\n for (const para of cellParagraphs) {\n extractHyperlinksFromParagraph(para);\n }\n }\n }\n }\n\n return hyperlinks;\n }\n\n /**\n * Collects ALL hyperlink relationship IDs referenced anywhere in the document,\n * including raw nested content (nested tables stored as raw XML), headers/footers,\n * footnotes, and endnotes. This is the comprehensive version of getHyperlinks()\n * for relationship cleanup purposes.\n */\n collectAllReferencedHyperlinkIds(): Set<string> {\n const ids = new Set<string>();\n\n const scanParagraph = (para: Paragraph): void => {\n for (const item of para.getContent()) {\n if (item instanceof Hyperlink) {\n const relId = item.getRelationshipId();\n if (relId) ids.add(relId);\n }\n if (item instanceof Revision) {\n for (const revContent of item.getContent()) {\n if (revContent instanceof Hyperlink) {\n const relId = revContent.getRelationshipId();\n if (relId) ids.add(relId);\n }\n }\n }\n }\n };\n\n const scanElement = (\n element: BodyElement | Paragraph | Table | StructuredDocumentTag\n ): void => {\n if (element instanceof Paragraph) {\n scanParagraph(element);\n } else if (element instanceof Table) {\n for (let row = 0; row < element.getRowCount(); row++) {\n for (let col = 0; col < element.getColumnCount(); col++) {\n const cell = element.getCell(row, col);\n if (cell) {\n for (const para of cell.getParagraphs()) {\n scanParagraph(para);\n }\n // Scan raw nested content (nested tables/SDTs stored as raw XML)\n for (const nested of cell.getRawNestedContent()) {\n const rIdPattern = /r:id=\"(rId\\d+)\"/g;\n let rIdMatch: RegExpExecArray | null;\n while ((rIdMatch = rIdPattern.exec(nested.xml)) !== null) {\n ids.add(rIdMatch[1]!);\n }\n }\n }\n }\n }\n } else if (element instanceof StructuredDocumentTag) {\n for (const item of element.getContent()) {\n scanElement(item);\n }\n }\n };\n\n // Body elements\n for (const element of this.bodyElements) {\n scanElement(element);\n }\n\n // Headers and footers\n for (const header of this.headerFooterManager.getAllHeaders()) {\n for (const el of header.header.getElements()) {\n scanElement(el);\n }\n }\n for (const footer of this.headerFooterManager.getAllFooters()) {\n for (const el of footer.footer.getElements()) {\n scanElement(el);\n }\n }\n\n // Footnotes\n for (const fn of this.footnoteManager.getAllFootnotes()) {\n for (const para of fn.getParagraphs()) {\n scanParagraph(para);\n }\n }\n\n // Endnotes\n for (const en of this.endnoteManager.getAllEndnotes()) {\n for (const para of en.getParagraphs()) {\n scanParagraph(para);\n }\n }\n\n return ids;\n }\n\n /**\n * Defragments and optimizes hyperlinks in the document\n * This merges fragmented hyperlinks with the same URL (common in Google Docs exports)\n * and optionally resets their formatting to standard style\n *\n * @param options - Defragmentation options\n * @returns Number of hyperlinks merged\n *\n * @example\n * ```typescript\n * // Basic defragmentation\n * const merged = doc.defragmentHyperlinks();\n * console.log(`Merged ${merged} fragmented hyperlinks`);\n *\n * // With formatting reset (fixes corrupted fonts like Caveat)\n * const fixed = doc.defragmentHyperlinks({ resetFormatting: true });\n * console.log(`Fixed ${fixed} hyperlinks with standard formatting`);\n * ```\n */\n defragmentHyperlinks(options?: {\n resetFormatting?: boolean;\n cleanupRelationships?: boolean;\n }): number {\n const { resetFormatting = false, cleanupRelationships = false } = options || {};\n\n // Guard: Skip when track changes is enabled - prevents field structure corruption\n // The mergeConsecutiveHyperlinks() method uses clearContent() + addHyperlink()\n // which creates new revisions at the END of the content array, placing them\n // OUTSIDE field boundaries when field codes are present\n if (this.trackChangesEnabled) {\n defaultLogger.warn(\n 'defragmentHyperlinks skipped: track changes is enabled. ' +\n 'Call defragmentHyperlinks before enableTrackChanges() to avoid field corruption.'\n );\n return 0;\n }\n\n let mergedCount = 0;\n\n // Get the DocumentParser instance to use its merging method\n const parser = new DocumentParser();\n\n // Process all paragraphs in the document\n for (const paragraph of this.getAllParagraphs()) {\n const originalContent = paragraph.getContent();\n\n // Call the enhanced mergeConsecutiveHyperlinks method\n (parser as any).mergeConsecutiveHyperlinks(paragraph, resetFormatting);\n\n const newContent = paragraph.getContent();\n\n // Count merges by comparing content length\n if (originalContent.length > newContent.length) {\n mergedCount += originalContent.length - newContent.length;\n }\n }\n\n // Also process paragraphs in tables\n for (const table of this.getTables()) {\n for (const row of table.getRows()) {\n for (const cell of row.getCells()) {\n const cellParagraphs = cell instanceof TableCell ? cell.getParagraphs() : [];\n for (const para of cellParagraphs) {\n const originalContent = para.getContent();\n\n (parser as any).mergeConsecutiveHyperlinks(para, resetFormatting);\n\n const newContent = para.getContent();\n\n if (originalContent.length > newContent.length) {\n mergedCount += originalContent.length - newContent.length;\n }\n }\n }\n }\n }\n\n // Optionally clean up orphaned relationships\n if (cleanupRelationships && mergedCount > 0) {\n // Use comprehensive scanning that includes raw nested content\n const referencedIds = this.collectAllReferencedHyperlinkIds();\n\n // Remove orphaned hyperlink relationships\n const removedCount = this.relationshipManager.removeOrphanedHyperlinks(referencedIds);\n if (removedCount > 0) {\n defaultLogger.info(`Cleaned up ${removedCount} orphaned hyperlink relationship(s)`);\n }\n }\n\n return mergedCount;\n }\n\n /**\n * Gets all bookmarks in the document\n * @returns Array of bookmarks with their containing paragraph\n */\n getBookmarks(): { bookmark: Bookmark; paragraph: Paragraph }[] {\n const bookmarks: { bookmark: Bookmark; paragraph: Paragraph }[] = [];\n\n for (const paragraph of this.getAllParagraphs()) {\n // Get bookmarks that start in this paragraph\n for (const bookmark of paragraph.getBookmarksStart()) {\n bookmarks.push({ bookmark, paragraph });\n }\n }\n\n // Also check in tables\n for (const table of this.getTables()) {\n for (const row of table.getRows()) {\n for (const cell of row.getCells()) {\n for (const para of cell.getParagraphs()) {\n for (const bookmark of para.getBookmarksStart()) {\n bookmarks.push({ bookmark, paragraph: para });\n }\n }\n }\n }\n }\n\n return bookmarks;\n }\n\n /**\n * Gets all fields in the document with their parent context\n *\n * Returns all Field and ComplexField instances from:\n * - All body paragraphs\n * - All paragraphs inside table cells\n *\n * @returns Array of objects containing field, paragraph, and optionally table\n *\n * @example\n * ```typescript\n * // Get all fields\n * const fields = doc.getFields();\n * console.log(`Document has ${fields.length} fields`);\n *\n * for (const { field, paragraph, table } of fields) {\n * console.log(`Field: ${field.getType()} - ${field.getInstruction()}`);\n * if (table) {\n * console.log(' (inside table)');\n * }\n * }\n * ```\n *\n * @example\n * ```typescript\n * // Find all merge fields\n * const fields = doc.getFields();\n * const mergeFields = fields.filter(({ field }) =>\n * field.getType() === 'MERGEFIELD'\n * );\n * console.log(`Found ${mergeFields.length} merge fields`);\n * ```\n */\n getFields(): { field: FieldLike; paragraph: Paragraph; table?: Table }[] {\n const results: { field: FieldLike; paragraph: Paragraph; table?: Table }[] = [];\n\n // Get fields from all body paragraphs\n for (const paragraph of this.getAllParagraphs()) {\n for (const field of paragraph.getFields()) {\n results.push({ field, paragraph });\n }\n }\n\n // Get fields from paragraphs inside table cells\n for (const table of this.getTables()) {\n for (const row of table.getRows()) {\n for (const cell of row.getCells()) {\n const cellParagraphs = cell instanceof TableCell ? cell.getParagraphs() : [];\n for (const para of cellParagraphs) {\n for (const field of para.getFields()) {\n results.push({ field, paragraph: para, table });\n }\n }\n }\n }\n }\n\n return results;\n }\n\n /**\n * Gets all images in the document with metadata\n *\n * Returns all Image instances registered in the document along with\n * their relationship IDs and filenames in the media folder.\n *\n * @returns Array of objects containing image, relationship ID, and filename\n *\n * @example\n * ```typescript\n * const images = doc.getImages();\n * console.log(`Document contains ${images.length} images`);\n *\n * for (const { image, filename } of images) {\n * console.log(`${filename}: ${image.getWidth()}x${image.getHeight()} EMUs`);\n * }\n * ```\n */\n getImages(): {\n image: Image;\n relationshipId: string;\n filename: string;\n }[] {\n return this.imageManager.getAllImages();\n }\n\n /**\n * Performs lossless image optimization on all images in the document.\n *\n * - PNG images: re-compressed at zlib level 9, metadata chunks stripped\n * - BMP images: converted to PNG format (lossless, typically 10-50x smaller)\n * - JPEG, EMF, WMF, SVG, GIF, TIFF: skipped (cannot be losslessly optimized further)\n *\n * @returns Optimization results including count and bytes saved\n *\n * @example\n * ```typescript\n * const doc = await Document.load('document.docx');\n * const result = await doc.optimizeImages();\n * console.log(`Optimized ${result.optimizedCount} images, saved ${result.totalSavedBytes} bytes`);\n * await doc.save('document-optimized.docx');\n * ```\n */\n async optimizeImages(): Promise<ImageOptimizationResult> {\n // 1. Ensure all image data is loaded\n await this.imageManager.loadAllImageData();\n\n // 2. Group images by filename (avoid processing same file twice)\n const imagesByFilename = new Map<\n string,\n { image: Image; relationshipId: string; filename: string }[]\n >();\n for (const entry of this.imageManager.getAllImages()) {\n const group = imagesByFilename.get(entry.filename) || [];\n group.push(entry);\n imagesByFilename.set(entry.filename, group);\n }\n\n // 3. Optimize each unique image file\n let totalSaved = 0;\n let optimizedCount = 0;\n\n for (const [filename, entries] of imagesByFilename) {\n const firstEntry = entries[0];\n if (!firstEntry) continue;\n\n const image = firstEntry.image;\n let originalData: Buffer;\n try {\n originalData = image.getImageData();\n } catch {\n continue; // Image data not available\n }\n const extension = image.getExtension();\n\n const result = optimizeImage(originalData, extension);\n if (!result) continue;\n\n const saved = originalData.length - result.data.length;\n if (saved <= 0) continue;\n\n // 4. Update all Image objects sharing this file\n for (const entry of entries) {\n await entry.image.updateImageData(result.data);\n }\n\n // 5. If format changed (e.g., bmp → png), update filename + relationships\n if (result.newExtension !== extension) {\n const newFilename = filename.replace(/\\.[^.]+$/, `.${result.newExtension}`);\n this.imageManager.updateEntryFilename(image, newFilename);\n\n // Update relationship targets across all relationship managers\n for (const entry of entries) {\n this.updateImageRelationshipTarget(entry.relationshipId, filename, newFilename);\n }\n }\n\n totalSaved += saved;\n optimizedCount++;\n }\n\n return { optimizedCount, totalSavedBytes: totalSaved };\n }\n\n /**\n * Updates an image relationship target when the image format changes.\n * Handles both document body and header/footer relationships.\n * @private\n */\n private updateImageRelationshipTarget(\n relId: string,\n oldFilename: string,\n newFilename: string\n ): void {\n // Try document body relationship manager first\n const rel = this.relationshipManager.getRelationship(relId);\n if (rel) {\n const oldTarget = rel.getTarget();\n const newTarget = oldTarget.replace(oldFilename, newFilename);\n rel.setTarget(newTarget);\n return;\n }\n\n // For header/footer images, update .rels files in the ZIP directly\n const oldTarget = `media/${oldFilename}`;\n const newTarget = `media/${newFilename}`;\n const escapedOldTarget = oldTarget.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\n const filePaths = this.zipHandler.getFilePaths();\n for (const path of filePaths) {\n if (!path.endsWith('.rels') || path === 'word/_rels/document.xml.rels') continue;\n const content = this.zipHandler.getFileAsString(path);\n if (content?.includes(oldTarget)) {\n const updated = content.replace(new RegExp(escapedOldTarget, 'g'), newTarget);\n this.zipHandler.updateFile(path, updated);\n }\n }\n }\n\n /**\n * Gets all runs in the document (flattened from all paragraphs)\n *\n * This method returns all Run objects from:\n * - All body paragraphs\n * - All paragraphs inside table cells\n *\n * Useful for bulk operations on text formatting across the entire document.\n *\n * @returns Array of all Run objects in the document\n *\n * @example\n * ```typescript\n * // Get all runs\n * const runs = doc.getAllRuns();\n * console.log(`Document has ${runs.length} text runs`);\n *\n * // Make all text bold\n * for (const run of doc.getAllRuns()) {\n * run.setBold(true);\n * }\n * ```\n */\n getAllRuns(): Run[] {\n const runs: Run[] = [];\n\n // Get runs from all body paragraphs\n for (const paragraph of this.getAllParagraphs()) {\n runs.push(...paragraph.getRuns());\n }\n\n // Get runs from paragraphs inside table cells\n for (const table of this.getTables()) {\n for (const row of table.getRows()) {\n for (const cell of row.getCells()) {\n const cellParagraphs = cell instanceof TableCell ? cell.getParagraphs() : [];\n for (const para of cellParagraphs) {\n runs.push(...para.getRuns());\n }\n }\n }\n }\n\n return runs;\n }\n\n /**\n * Automatically converts email addresses in text to mailto: hyperlinks\n *\n * Scans all paragraphs (including those in tables, headers, and footers)\n * for email addresses and converts them to clickable mailto: hyperlinks\n * with standard hyperlink formatting.\n *\n * @param options - Optional formatting and behavior options\n * @param options.formatting - Custom formatting for the hyperlinks (defaults to Verdana 12pt, underline, blue)\n * @returns Statistics about emails converted\n *\n * @example\n * ```typescript\n * // Auto-link all email addresses with default formatting\n * const result = doc.hyperlinkEmails();\n * console.log(`Linked ${result.emailsLinked} emails in ${result.paragraphsModified} paragraphs`);\n *\n * // With custom formatting\n * doc.hyperlinkEmails({\n * formatting: {\n * font: 'Arial',\n * size: 22, // 11pt in half-points\n * underline: 'single',\n * bold: false,\n * color: '0000FF',\n * }\n * });\n * ```\n */\n hyperlinkEmails(options?: { formatting?: RunFormatting }): {\n emailsLinked: number;\n paragraphsModified: number;\n } {\n // Default formatting: Verdana 12pt, Underline, no bold, #0000FF\n const defaultFormatting: RunFormatting = {\n font: 'Verdana',\n size: 12, // 12pt\n underline: 'single',\n bold: false,\n color: '0000FF',\n };\n\n const formatting = options?.formatting ?? defaultFormatting;\n\n // RFC 5322 simplified email regex (handles most common patterns)\n const emailRegex = /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}/g;\n\n let emailsLinked = 0;\n let paragraphsModified = 0;\n\n // Get all paragraphs (including in tables, headers, footers)\n const paragraphs = this.getAllParagraphs();\n\n for (const para of paragraphs) {\n let modified = false;\n const content = [...para.getContent()]; // Clone to avoid modification during iteration\n\n for (const item of content) {\n if (item instanceof Run) {\n const text = item.getText();\n const matches = [...text.matchAll(emailRegex)];\n\n if (matches.length > 0) {\n // Split run into segments with hyperlinks\n const newContent = this.splitRunWithEmails(item, matches, formatting);\n\n // Replace original run with new content\n para.replaceContent(item, newContent);\n\n emailsLinked += matches.length;\n modified = true;\n }\n }\n }\n\n if (modified) paragraphsModified++;\n }\n\n return { emailsLinked, paragraphsModified };\n }\n\n /**\n * Splits a run containing email addresses into text runs and hyperlinks\n * @private\n */\n private splitRunWithEmails(\n run: Run,\n matches: RegExpMatchArray[],\n formatting: RunFormatting\n ): ParagraphContent[] {\n const text = run.getText();\n const originalFormatting = run.getFormatting();\n const result: ParagraphContent[] = [];\n\n let lastIndex = 0;\n\n for (const match of matches) {\n const email = match[0];\n const startIndex = match.index!;\n\n // Add text before email (if any)\n if (startIndex > lastIndex) {\n const beforeText = text.slice(lastIndex, startIndex);\n result.push(new Run(beforeText, originalFormatting));\n }\n\n // Add email as hyperlink\n const hyperlink = Hyperlink.createEmail(email, email, formatting);\n result.push(hyperlink);\n\n lastIndex = startIndex + email.length;\n }\n\n // Add remaining text after last email (if any)\n if (lastIndex < text.length) {\n const afterText = text.slice(lastIndex);\n result.push(new Run(afterText, originalFormatting));\n }\n\n return result;\n }\n\n /**\n * Removes a specific formatting type from all runs in the document\n *\n * This is a bulk operation that removes the specified formatting property\n * from ALL text runs in the document (including runs inside table cells).\n *\n * @param type - The formatting property to remove\n * @returns Number of runs that were modified\n *\n * @example\n * ```typescript\n * // Remove all bold formatting from document\n * const count = doc.removeFormattingFromAll('bold');\n * console.log(`Removed bold from ${count} runs`);\n *\n * // Remove all highlighting\n * doc.removeFormattingFromAll('highlight');\n *\n * // Remove all font color\n * doc.removeFormattingFromAll('color');\n *\n * // Remove underlines\n * doc.removeFormattingFromAll('underline');\n * ```\n */\n removeFormattingFromAll(\n type:\n | 'bold'\n | 'italic'\n | 'underline'\n | 'strike'\n | 'dstrike'\n | 'highlight'\n | 'color'\n | 'font'\n | 'size'\n | 'subscript'\n | 'superscript'\n | 'smallCaps'\n | 'allCaps'\n | 'outline'\n | 'shadow'\n | 'emboss'\n | 'imprint'\n ): number {\n let modifiedCount = 0;\n\n // Get all runs in the document\n const runs = this.getAllRuns();\n\n for (const run of runs) {\n const formatting = run.getFormatting();\n\n // Check if the property exists before removing it\n if (type in formatting) {\n // Access the private formatting property to modify it\n // This is a valid pattern for bulk operations in the framework\n (run as any).formatting[type] = undefined;\n delete (run as any).formatting[type];\n\n modifiedCount++;\n }\n }\n\n return modifiedCount;\n }\n\n /**\n * Applies a formatting function to all hyperlinks in the document\n *\n * This is a bulk operation that calls the provided formatter function\n * for each hyperlink in the document (including hyperlinks inside table cells).\n *\n * The formatter function receives the hyperlink and its containing paragraph,\n * allowing for sophisticated conditional formatting based on context.\n *\n * @param formatter - Function to apply to each hyperlink\n * @returns Number of hyperlinks processed\n *\n * @example\n * ```typescript\n * // Make all hyperlinks red and bold\n * doc.updateAllHyperlinks((link) => {\n * link.setFormatting({ color: 'FF0000', bold: true });\n * });\n *\n * // Remove underline from all hyperlinks\n * doc.updateAllHyperlinks((link) => {\n * const fmt = link.getFormatting();\n * delete fmt.underline;\n * link.setFormatting(fmt);\n * });\n *\n * // Conditional formatting based on URL\n * doc.updateAllHyperlinks((link) => {\n * const url = link.getUrl();\n * if (url?.includes('internal')) {\n * link.setFormatting({ color: '0000FF' }); // Blue for internal links\n * } else if (url?.includes('external')) {\n * link.setFormatting({ color: 'FF0000' }); // Red for external links\n * }\n * });\n *\n * // Access paragraph context for advanced logic\n * doc.updateAllHyperlinks((link, para) => {\n * const paraStyle = para.getFormatting().style;\n * if (paraStyle === 'Heading1') {\n * link.setFormatting({ bold: true, size: 16 });\n * }\n * });\n * ```\n */\n updateAllHyperlinks(formatter: (hyperlink: Hyperlink, paragraph: Paragraph) => void): number {\n // Get all hyperlinks with their containing paragraphs\n const hyperlinks = this.getHyperlinks();\n\n // Apply formatter to each hyperlink\n for (const { hyperlink, paragraph } of hyperlinks) {\n formatter(hyperlink, paragraph);\n }\n\n return hyperlinks.length;\n }\n\n /**\n * Normalizes spacing throughout the document\n *\n * Ensures consistent spacing by:\n * - Removing duplicate consecutive empty paragraphs\n * - Applying standard paragraph spacing (before/after)\n * - Standardizing line spacing\n * - Removing trailing spaces from runs\n *\n * @param rules - Normalization rules\n * @returns Object with counts of elements removed and normalized\n *\n * @example\n * ```typescript\n * // Remove duplicate empty paragraphs only\n * const result = doc.normalizeSpacing({\n * removeDuplicateEmptyParagraphs: true\n * });\n * console.log(`Removed ${result.removed} empty paragraphs`);\n *\n * // Apply standard spacing\n * doc.normalizeSpacing({\n * standardParagraphSpacing: { before: 0, after: 200 }, // 200 twips = 10pt\n * standardLineSpacing: 240, // Single spacing\n * removeTrailingSpaces: true\n * });\n *\n * // Full normalization\n * const stats = doc.normalizeSpacing({\n * removeDuplicateEmptyParagraphs: true,\n * standardParagraphSpacing: { after: 200 },\n * removeTrailingSpaces: true\n * });\n * console.log(`Removed: ${stats.removed}, Normalized: ${stats.normalized}`);\n * ```\n */\n normalizeSpacing(\n rules: {\n removeDuplicateEmptyParagraphs?: boolean;\n standardParagraphSpacing?: { before?: number; after?: number };\n standardLineSpacing?: number;\n removeTrailingSpaces?: boolean;\n } = {}\n ): { removed: number; normalized: number } {\n const {\n removeDuplicateEmptyParagraphs = true,\n standardParagraphSpacing,\n standardLineSpacing,\n removeTrailingSpaces = true,\n } = rules;\n\n let removed = 0;\n let normalized = 0;\n\n // Remove duplicate empty paragraphs\n if (removeDuplicateEmptyParagraphs) {\n let lastWasEmpty = false;\n const toRemove: number[] = [];\n\n this.bodyElements.forEach((element, index) => {\n if (element instanceof Paragraph) {\n const isEmpty = element.getText().trim() === '';\n if (isEmpty && lastWasEmpty) {\n toRemove.push(index);\n }\n lastWasEmpty = isEmpty;\n } else {\n lastWasEmpty = false; // Reset for non-paragraph elements\n }\n });\n\n // Remove in reverse order to maintain indices\n toRemove.reverse().forEach((index) => {\n this.bodyElements.splice(index, 1);\n removed++;\n });\n }\n\n // Apply standard spacing to all paragraphs\n for (const para of this.getAllParagraphs()) {\n if (standardParagraphSpacing) {\n if (standardParagraphSpacing.before !== undefined) {\n para.setSpaceBefore(standardParagraphSpacing.before);\n normalized++;\n }\n if (standardParagraphSpacing.after !== undefined) {\n para.setSpaceAfter(standardParagraphSpacing.after);\n normalized++;\n }\n }\n\n if (standardLineSpacing !== undefined) {\n para.setLineSpacing(standardLineSpacing, 'auto');\n normalized++;\n }\n\n // Remove trailing spaces from runs\n if (removeTrailingSpaces) {\n const runs = para.getRuns();\n if (runs.length > 0) {\n const lastRun = runs[runs.length - 1];\n if (lastRun) {\n const text = lastRun.getText();\n const trimmed = text.trimEnd();\n if (text !== trimmed) {\n lastRun.setText(trimmed);\n normalized++;\n }\n }\n }\n }\n }\n\n // Also process tables\n for (const table of this.getTables()) {\n for (const row of table.getRows()) {\n for (const cell of row.getCells()) {\n const cellParagraphs = cell instanceof TableCell ? cell.getParagraphs() : [];\n for (const para of cellParagraphs) {\n if (standardParagraphSpacing) {\n if (standardParagraphSpacing.before !== undefined) {\n para.setSpaceBefore(standardParagraphSpacing.before);\n normalized++;\n }\n if (standardParagraphSpacing.after !== undefined) {\n para.setSpaceAfter(standardParagraphSpacing.after);\n normalized++;\n }\n }\n\n if (standardLineSpacing !== undefined) {\n para.setLineSpacing(standardLineSpacing, 'auto');\n normalized++;\n }\n\n if (removeTrailingSpaces) {\n const runs = para.getRuns();\n if (runs.length > 0) {\n const lastRun = runs[runs.length - 1];\n if (lastRun) {\n const text = lastRun.getText();\n const trimmed = text.trimEnd();\n if (text !== trimmed) {\n lastRun.setText(trimmed);\n normalized++;\n }\n }\n }\n }\n }\n }\n }\n }\n\n return { removed, normalized };\n }\n\n /**\n * Sets the document language\n * @param language - Language code (e.g., 'en-US', 'es-ES', 'fr-FR')\n * @returns This document for chaining\n */\n setLanguage(language: string): this {\n // Store language in properties for core.xml\n if (!this.properties) {\n this.properties = {};\n }\n this.properties.language = language;\n\n return this;\n }\n\n /**\n * Gets the document language code\n *\n * @returns Language code (e.g., 'en-US', 'fr-FR') or undefined if not set\n *\n * @example\n * ```typescript\n * const lang = doc.getLanguage();\n * if (lang) {\n * console.log(`Document language: ${lang}`);\n * }\n * ```\n */\n getLanguage(): string | undefined {\n return this.properties?.language;\n }\n\n /**\n * Removes all SDT (Structured Document Tag) wrappers from the document body,\n * unwrapping their content. Used internally by rebuildTOCs.\n * @private\n */\n private clearCustom(): void {\n const unwrappedBody: BodyElement[] = [];\n\n const unwrapSDT = (sdt: StructuredDocumentTag, target: BodyElement[]) => {\n for (const item of sdt.getContent()) {\n if (item instanceof Paragraph || item instanceof Table) {\n target.push(item);\n } else if (item instanceof StructuredDocumentTag) {\n unwrapSDT(item, target);\n }\n }\n };\n\n for (const element of this.bodyElements) {\n if (element instanceof StructuredDocumentTag) {\n unwrapSDT(element, unwrappedBody);\n } else {\n unwrappedBody.push(element);\n }\n }\n\n this.bodyElements = unwrappedBody;\n }\n\n /**\n * Rebuilds all Table of Contents in the document\n *\n * Analyzes each TOC in the document, parses its field instructions to determine\n * which heading levels to include, searches for matching headings (including those\n * in nested tables), and returns a summary of TOC instructions and heading counts.\n *\n * **NEW: This method now also populates the TOCs with hyperlinked entries automatically!**\n *\n * The method:\n * 1. Removes SDT wrappers around tables if found (uses clearCustom helper)\n * 2. Ensures `_top` bookmark exists at document start for TOC linking\n * 3. Scans document.xml for all TOC field instructions\n * 4. For each TOC, parses the instruction to extract heading levels\n * 5. Finds all matching headings (searches body AND nested tables)\n * 6. **Generates bookmarks for headings that don't have them**\n * 7. **Creates hyperlinked TOC entries pointing to those bookmarks**\n * 8. **Populates the TOC with entries (Verdana 12pt, blue, underlined, no page numbers)**\n * 9. **Updates document.xml with the populated TOC**\n * 10. Retains field instructions so TOCs can be manually updated later\n * 11. Returns summary: [instruction, [h1Count, h2Count, h3Count, ...]]\n *\n * **Key Features:**\n * - No arguments required - analyzes the current document state\n * - Searches nested tables when counting headings\n * - Automatically removes SDT wrappers that interfere with TOC population\n * - Ensures `_top` bookmark exists for document-top linking\n * - **Automatically populates TOCs with clickable hyperlink entries**\n * - **TOCs display correctly on first open without manual update**\n * - **Field instructions preserved for manual updates**\n * - **No page numbers displayed (pure hyperlink navigation)**\n * - Returns summary data for diagnostics and verification\n *\n * **Output Format:**\n * Returns a 2D array where each row contains:\n * - Index 0: The TOC field instruction text (e.g., \"TOC \\\\o \\\"1-3\\\"\")\n * - Index 1: Array of heading counts by level (e.g., [5, 12, 8] = 5 H1s, 12 H2s, 8 H3s)\n *\n * @returns Two-dimensional array of [instruction, headingCounts[]] for each TOC\n *\n * @example\n * ```typescript\n * const doc = await Document.load('document.docx');\n * const tocInfo = doc.rebuildTOCs();\n *\n * console.log(`Found ${tocInfo.length} Table(s) of Contents`);\n * for (const [instruction, counts] of tocInfo) {\n * console.log(`TOC Instruction: ${instruction}`);\n * counts.forEach((count, level) => {\n * if (count > 0) {\n * console.log(` Heading ${level + 1}: ${count} found`);\n * }\n * });\n * }\n *\n * // TOCs are now populated with hyperlinks - save the document\n * await doc.save('output.docx');\n * // When opened in Word, TOCs will display with clickable links, no manual update needed\n * ```\n *\n * @example\n * ```typescript\n * // Rebuild TOCs and save with populated entries\n * const doc = await Document.load('input.docx');\n * const tocSummary = doc.rebuildTOCs();\n * await doc.save('output.docx');\n *\n * console.log(`Processed ${tocSummary.length} TOCs with hyperlinked entries`);\n * ```\n */\n public rebuildTOCs(): [string, number[]][] {\n const results: [string, number[]][] = [];\n\n // Step 1: Remove SDT wrappers around tables if found (helper already exists)\n this.clearCustom();\n\n // Step 2: Ensure _top bookmark exists at document start\n this.addTopBookmark();\n\n // Step 3: Get document.xml to scan for TOC elements\n const docXml = this.zipHandler.getFileAsString('word/document.xml');\n if (!docXml) {\n return results;\n }\n\n // Step 4: Find all TOC SDT elements\n const tocRegex = /<w:sdt>[\\s\\S]*?<w:docPartGallery w:val=\"Table of Contents\"[\\s\\S]*?<\\/w:sdt>/g;\n const tocMatches = Array.from(docXml.matchAll(tocRegex));\n\n if (tocMatches.length === 0) {\n return results;\n }\n\n // Step 5: For each TOC, parse instructions and count headings\n for (const match of tocMatches) {\n try {\n const tocXml = match[0];\n\n // Extract field instruction\n const instrMatch = /<w:instrText[^>]*>([\\s\\S]*?)<\\/w:instrText>/.exec(tocXml);\n if (!instrMatch?.[1]) {\n continue;\n }\n\n // TypeScript type narrowing: assign to const variable\n const instrText = instrMatch[1];\n\n // Decode XML entities\n const fieldInstruction = instrText\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '\"')\n .replace(/'/g, \"'\");\n\n // Parse the instruction to get heading levels\n const levels = this.parseTOCFieldInstruction(fieldInstruction);\n\n // Find all headings in document (including nested tables)\n const headings = this.findHeadingsForTOCFromXML(docXml, levels);\n\n // Count headings by level (create array with counts for each level 1-9)\n const headingCounts: number[] = [0, 0, 0, 0, 0, 0, 0, 0, 0]; // Indices 0-8 for levels 1-9\n\n for (const heading of headings) {\n if (heading.level >= 1 && heading.level <= 9) {\n const index = heading.level - 1;\n headingCounts[index] = (headingCounts[index] || 0) + 1;\n }\n }\n\n // Add to results: [instruction, counts]\n results.push([fieldInstruction, headingCounts]);\n } catch (error: unknown) {\n // Skip this TOC on error\n this.logger.warn(\n 'Error processing TOC in rebuildTOCs',\n error instanceof Error\n ? { message: error.message, stack: error.stack }\n : { error: String(error) }\n );\n continue;\n }\n }\n\n // Step 6: Populate all TOCs in the document with hyperlinked entries\n // This modifies the XML to include pre-populated TOC entries with hyperlinks\n const populatedXml = this.populateAllTOCsInXML(docXml);\n\n // Step 7: Update document.xml with the populated TOCs\n if (populatedXml !== docXml) {\n this.zipHandler.updateFile('word/document.xml', populatedXml);\n\n this.logger.info(`Successfully populated ${results.length} TOC(s) with hyperlinked entries`);\n }\n\n return results;\n }\n\n /**\n * Normalizes all table borders to a uniform style\n *\n * Applies consistent border styling to all tables in the document.\n * This is useful for fixing documents with inconsistent borders\n * (e.g., thick bottom borders on some tables).\n *\n * @param options - Border styling options\n * @param options.style - Border style (default: 'single')\n * @param options.size - Border size in eighths of a point (default: 4 = 0.5pt)\n * @param options.color - Border color in hex without # (default: '000000')\n * @returns Number of tables updated\n *\n * @example\n * ```typescript\n * // Apply default thin black borders to all tables\n * const count = doc.normalizeTableBorders();\n * console.log(`Normalized borders on ${count} tables`);\n *\n * // Custom border styling\n * doc.normalizeTableBorders({\n * style: 'single',\n * size: 8, // 1pt border\n * color: '333333' // Dark gray\n * });\n * ```\n */\n normalizeTableBorders(options?: {\n style?: 'single' | 'double' | 'dotted' | 'dashed' | 'thick' | 'none';\n size?: number;\n color?: string;\n }): number {\n const border: TableBorder = {\n style: options?.style ?? 'single',\n size: options?.size ?? 4,\n color: options?.color ?? '000000',\n };\n\n return this.applyBordersToAllTables(border);\n }\n\n /**\n * Replaces text in runs with optional formatting constraints\n *\n * Searches for text patterns and replaces them while optionally\n * constraining matches to runs with specific formatting (e.g., bold only).\n * Formatting is preserved after replacement.\n *\n * @param find - Text to find (string or regex)\n * @param replace - Replacement text\n * @param options - Search options\n * @param options.matchBold - Only match text in bold runs (default: false)\n * @param options.matchItalic - Only match text in italic runs (default: false)\n * @param options.matchCase - Case-sensitive search (default: false)\n * @returns Number of replacements made\n *\n * @example\n * ```typescript\n * // Replace \"Parent SOP:\" with \"Parent Document:\" only in bold text\n * const count = doc.replaceFormattedText('Parent SOP:', 'Parent Document:', {\n * matchBold: true\n * });\n * console.log(`Replaced ${count} occurrences`);\n *\n * // Case-sensitive replacement\n * doc.replaceFormattedText('OLD_VALUE', 'NEW_VALUE', {\n * matchCase: true\n * });\n * ```\n */\n replaceFormattedText(\n find: string,\n replace: string,\n options?: {\n matchBold?: boolean;\n matchItalic?: boolean;\n matchCase?: boolean;\n }\n ): number {\n let replacedCount = 0;\n const matchBold = options?.matchBold ?? false;\n const matchItalic = options?.matchItalic ?? false;\n const matchCase = options?.matchCase ?? false;\n\n // Create regex pattern\n const pattern = matchCase\n ? new RegExp(find.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'), 'g')\n : new RegExp(find.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'), 'gi');\n\n // Process body paragraphs\n for (const para of this.getAllParagraphs()) {\n for (const run of para.getRuns()) {\n const text = run.getText();\n if (!text) continue;\n\n // Check formatting constraints\n const formatting = run.getFormatting();\n if (matchBold && !formatting.bold) continue;\n if (matchItalic && !formatting.italic) continue;\n\n // Perform replacement\n if (pattern.test(text)) {\n const newText = text.replace(pattern, replace);\n if (newText !== text) {\n run.setText(newText);\n replacedCount++;\n }\n }\n // Reset regex lastIndex for next iteration\n pattern.lastIndex = 0;\n }\n }\n\n // Process paragraphs inside table cells\n for (const table of this.getTables()) {\n for (const row of table.getRows()) {\n for (const cell of row.getCells()) {\n for (const para of cell.getParagraphs()) {\n for (const run of para.getRuns()) {\n const text = run.getText();\n if (!text) continue;\n\n // Check formatting constraints\n const runFormatting = run.getFormatting();\n if (matchBold && !runFormatting.bold) continue;\n if (matchItalic && !runFormatting.italic) continue;\n\n // Perform replacement\n if (pattern.test(text)) {\n const newText = text.replace(pattern, replace);\n if (newText !== text) {\n run.setText(newText);\n replacedCount++;\n }\n }\n // Reset regex lastIndex for next iteration\n pattern.lastIndex = 0;\n }\n }\n }\n }\n }\n\n return replacedCount;\n }\n\n /**\n * Creates an empty document with minimal structure\n *\n * Creates a new document with only the essential parts required\n * for a valid DOCX file, without any default content or styling.\n * Useful for building documents from scratch programmatically.\n *\n * @returns New empty Document instance\n *\n * @example\n * ```typescript\n * const doc = Document.createEmpty();\n * // Document has minimal structure, ready for content\n * doc.createParagraph('First paragraph');\n * await doc.save('minimal.docx');\n * ```\n */\n static createEmpty(): Document {\n const doc = new Document(undefined, {}, false); // Don't init defaults\n\n // Add only the absolute minimum required files\n const zipHandler = doc.getZipHandler();\n\n // [Content_Types].xml - minimal\n zipHandler.addFile(\n '[Content_Types].xml',\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n' +\n '<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">\\n' +\n ' <Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/>\\n' +\n ' <Default Extension=\"xml\" ContentType=\"application/xml\"/>\\n' +\n ' <Override PartName=\"/word/document.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml\"/>\\n' +\n '</Types>'\n );\n\n // _rels/.rels - only reference parts that actually exist\n zipHandler.addFile(\n '_rels/.rels',\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n' +\n '<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\\n' +\n ' <Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\" Target=\"word/document.xml\"/>\\n' +\n '</Relationships>'\n );\n\n // word/document.xml - empty body\n zipHandler.addFile(\n 'word/document.xml',\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n' +\n '<w:document xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\">\\n' +\n ' <w:body/>\\n' +\n '</w:document>'\n );\n\n // word/_rels/document.xml.rels - empty relationships\n zipHandler.addFile(\n 'word/_rels/document.xml.rels',\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n' +\n '<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"/>'\n );\n\n return doc;\n }\n}\n"]}
1
+ {"version":3,"file":"Document.js","sourceRoot":"","sources":["../../src/core/Document.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Document - High-level API for creating and managing Word documents\n * Provides a simple interface for creating DOCX files without managing ZIP and XML manually\n */\n\nimport { AlternateContent } from '../elements/AlternateContent';\nimport { Bookmark } from '../elements/Bookmark';\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 { CommentManager } from '../elements/CommentManager';\nimport { Endnote } from '../elements/Endnote';\nimport { EndnoteManager } from '../elements/EndnoteManager';\nimport { Field } from '../elements/Field';\nimport { Footnote } from '../elements/Footnote';\nimport { FootnoteManager } from '../elements/FootnoteManager';\nimport { Footer } from '../elements/Footer';\nimport { Header } from '../elements/Header';\nimport { HeaderFooterManager } from '../elements/HeaderFooterManager';\nimport { Hyperlink } from '../elements/Hyperlink';\nimport { Image } from '../elements/Image';\nimport { ImageManager } from '../elements/ImageManager';\nimport { ImageRun } from '../elements/ImageRun';\nimport { Paragraph, ParagraphContent, FieldLike } from '../elements/Paragraph';\nimport { RangeMarker } from '../elements/RangeMarker';\nimport { Revision, RevisionType } from '../elements/Revision';\nimport { RevisionManager } from '../elements/RevisionManager';\nimport { RevisionLocation } from '../elements/PropertyChangeTypes';\nimport { Run, RunFormatting } from '../elements/Run';\nimport { Shape } from '../elements/Shape';\nimport { TextBox } from '../elements/TextBox';\nimport {\n RevisionValidator,\n RevisionAutoFixer,\n ValidationOptions,\n AutoFixOptions,\n ValidationResult,\n AutoFixResult,\n} from '../validation';\nimport { Section } from '../elements/Section';\nimport { StructuredDocumentTag } from '../elements/StructuredDocumentTag';\nimport { Table, TableBorder } from '../elements/Table';\nimport { TableCell } from '../elements/TableCell';\nimport { TableOfContentsElement } from '../elements/TableOfContentsElement';\nimport { resolveCellShading } from '../utils/ShadingResolver';\nimport {\n NumberingManager,\n NumberingConsolidationOptions,\n NumberingConsolidationResult,\n} from '../formatting/NumberingManager';\nimport { Style, StyleProperties } from '../formatting/Style';\nimport { StylesManager } from '../formatting/StylesManager';\nimport { FormatOptions, StyleApplyOptions } from '../types/formatting';\nimport { CompatibilityMode, CompatibilityInfo, CompatSetting } from '../types/compatibility-types';\nimport { DocumentProtection, RevisionViewSettings, WebSettingsInfo } from '../types/settings-types';\nimport { CompatibilityUpgrader, UpgradeReport } from '../utils/CompatibilityUpgrader';\nimport { MODERN_COMPAT_SETTINGS } from '../constants/legacyCompatFlags';\n// ListNormalizationOptions and ListNormalizationReport removed - normalizeTableLists moved to consumer\nimport {\n ApplyStylesOptions,\n Heading2Config,\n StyleConfig,\n StyleRunFormatting,\n StyleParagraphFormatting,\n} from '../types/styleConfig';\n// ListNormalizer import removed - moved to consumer\nimport { defaultLogger, ILogger, getGlobalLogger, createScopedLogger } from '../utils/logger';\nimport { UNITS } from '../utils/units';\n\n// Create scoped logger for Document operations\nfunction getLogger(): ILogger {\n return createScopedLogger(getGlobalLogger(), 'Document');\n}\n// Raw XML revision acceptance - used at load time BEFORE parsing\n// cleanupRevisionMetadata - cleanup metadata files after in-memory acceptance\nimport { acceptAllRevisions, cleanupRevisionMetadata } from '../utils/acceptRevisions';\n// In-memory revision acceptance - used AFTER parsing, allows subsequent modifications\nimport { acceptRevisionsInMemory, AcceptRevisionsResult } from '../utils/InMemoryRevisionAcceptor';\nimport { stripTrackedChanges } from '../utils/stripTrackedChanges';\nimport { diffText, diffHasUnchangedParts } from '../utils/textDiff';\nimport { XMLBuilder } from '../xml/XMLBuilder';\nimport { XMLParser } from '../xml/XMLParser';\nimport { DocumentTrackingContext } from '../tracking/DocumentTrackingContext';\nimport type { TrackingContext } from '../tracking/TrackingContext';\nimport { ZipHandler } from '../zip/ZipHandler';\nimport { DOCX_PATHS } from '../zip/types';\nimport { DocumentGenerator } from './DocumentGenerator';\nimport { DocumentIdManager } from './DocumentIdManager';\nimport { DocumentParser } from './DocumentParser';\nimport { DocumentValidator } from './DocumentValidator';\nimport { RelationshipManager } from './RelationshipManager';\nimport { RelationshipType } from './Relationship';\nimport { BodyElement } from './DocumentContent';\nimport { optimizeImage, ImageOptimizationResult } from '../images/ImageOptimizer';\n\n/**\n * Document properties (core and extended)\n */\nexport interface DocumentProperties {\n // Core Properties (docProps/core.xml)\n title?: string;\n subject?: string;\n creator?: string;\n keywords?: string;\n description?: string;\n lastModifiedBy?: string;\n revision?: number;\n created?: Date;\n modified?: Date;\n language?: string;\n category?: string;\n contentStatus?: string;\n\n // Extended Properties (docProps/app.xml)\n application?: string;\n appVersion?: string;\n company?: string;\n manager?: string;\n version?: string;\n\n // Custom Properties (docProps/custom.xml)\n customProperties?: Record<string, string | number | boolean | Date>;\n}\n\n/**\n * Document part representation\n * Represents any part within a DOCX package (XML, binary, etc.)\n */\nexport interface DocumentPart {\n /** Part name/path within the package */\n name: string;\n /** Part content (string for XML/text, Buffer for binary) */\n content: string | Buffer;\n /** MIME content type */\n contentType?: string;\n /** Whether the part is binary */\n isBinary?: boolean;\n /** Part size in bytes */\n size?: number;\n}\n\n/**\n * Document creation options\n */\nexport interface DocumentOptions {\n properties?: DocumentProperties;\n /** Maximum memory usage percentage (0-100) before throwing error. Default: 80 */\n maxMemoryUsagePercent?: number;\n /** Maximum absolute RSS (Resident Set Size) in MB. Default: 2048 (2GB) */\n maxRssMB?: number;\n /** Enable absolute RSS limit checking. Default: true */\n useAbsoluteMemoryLimit?: boolean;\n /** Strict parsing mode - throw errors instead of collecting warnings. Default: false */\n strictParsing?: boolean;\n /** Maximum number of images allowed in document. Default: 1000 */\n maxImageCount?: number;\n /** Maximum total size of all images in MB. Default: 100 */\n maxTotalImageSizeMB?: number;\n /** Maximum size of a single image in MB. Default: 20 */\n maxSingleImageSizeMB?: number;\n /**\n * Logger instance for framework messages\n * Allows control over how warnings, info, and debug messages are handled\n * If not provided, uses ConsoleLogger with WARN minimum level\n * Use SilentLogger to suppress all logging\n * @example\n * // Use custom logger\n * const doc = Document.create({ logger: myCustomLogger });\n *\n * // Suppress all logging\n * import { SilentLogger } from 'docxmlater';\n * const doc = Document.create({ logger: new SilentLogger() });\n */\n logger?: ILogger;\n}\n\n/**\n * Document loading options\n */\nexport interface DocumentLoadOptions extends DocumentOptions {\n /**\n * How to handle tracked changes during document load\n *\n * - 'preserve': Keep tracked changes as-is (may cause corruption if IDs conflict)\n * - 'accept': Accept all changes - removes revision markup, keeps inserted content, removes deleted content (default)\n * - 'strip': Remove all revision markup completely\n *\n * Default: 'accept' (prevents corruption from revision ID conflicts)\n *\n * @default 'accept'\n *\n * @example\n * ```typescript\n * // Default: accept all changes (recommended)\n * const doc = await Document.load('file.docx');\n *\n * // Explicit accept\n * const doc = await Document.load('file.docx', { revisionHandling: 'accept' });\n *\n * // Strip all tracked changes\n * const doc = await Document.load('file.docx', { revisionHandling: 'strip' });\n *\n * // Preserve tracked changes (may cause corruption)\n * const doc = await Document.load('file.docx', { revisionHandling: 'preserve' });\n * ```\n */\n revisionHandling?: 'preserve' | 'accept' | 'strip';\n\n /**\n * Accept all tracked changes after parsing using in-memory transformation.\n *\n * Unlike `revisionHandling: 'accept'` which uses raw XML transformation before parsing,\n * this option parses the document first (so revisions are available for inspection),\n * then accepts them using in-memory DOM transformation.\n *\n * Key difference: This allows subsequent document modifications to be saved correctly,\n * whereas raw XML acceptance may cause modifications to be lost.\n *\n * When `true`:\n * - Document is loaded with revisions preserved\n * - Revisions are parsed into the model (available for ChangelogGenerator)\n * - After parsing, `acceptAllRevisions()` is called automatically\n * - Document is clean and ready for modifications\n *\n * Recommended for Template_UI workflow when auto-accept is enabled.\n *\n * @default false\n *\n * @example\n * ```typescript\n * // Load and accept revisions (clean document, modifications work)\n * const doc = await Document.load('file.docx', { acceptRevisions: true });\n * doc.enableTrackChanges({ author: 'Doc Hub' });\n * // ... make modifications ...\n * await doc.save('output.docx'); // Modifications are saved correctly\n * ```\n */\n acceptRevisions?: boolean;\n}\n\n/**\n * Represents a Word document\n */\nexport class Document {\n constructor(zipHandler?: ZipHandler, options: DocumentOptions = {}, initDefaults = true) {\n this.zipHandler = zipHandler || new ZipHandler();\n this.bodyElements = [];\n this.properties = options.properties || {};\n this.namespaces = {};\n this.stylesManager = StylesManager.create();\n this.numberingManager = NumberingManager.create();\n this.section = new Section();\n this.imageManager = ImageManager.create();\n this.relationshipManager = initDefaults\n ? RelationshipManager.createForDocument()\n : RelationshipManager.create();\n this.headerFooterManager = HeaderFooterManager.create();\n this.bookmarkManager = BookmarkManager.create();\n this.revisionManager = RevisionManager.create();\n this.commentManager = CommentManager.create();\n this.footnoteManager = FootnoteManager.create();\n this.endnoteManager = EndnoteManager.create();\n this.documentIdManager = DocumentIdManager.create();\n\n // Wire up centralized ID allocation for all annotation managers\n // This ensures bookmark, revision, and comment IDs are globally unique (ECMA-376 requirement)\n this.bookmarkManager.setIdProvider(\n () => this.documentIdManager.getNextId(),\n (existingId) => this.documentIdManager.ensureNextIdAbove(existingId)\n );\n this.revisionManager.setIdProvider(\n () => this.documentIdManager.getNextId(),\n (existingId) => this.documentIdManager.ensureNextIdAbove(existingId)\n );\n this.commentManager.setIdProvider(\n () => this.documentIdManager.getNextId(),\n (existingId) => this.documentIdManager.ensureNextIdAbove(existingId)\n );\n\n this.trackingContext = new DocumentTrackingContext(this.revisionManager);\n this.parser = new DocumentParser();\n this.generator = new DocumentGenerator();\n this.validator = new DocumentValidator();\n this.logger = options.logger || defaultLogger;\n this.trackChangesEnabled = false;\n this.trackFormatting = true;\n this.revisionViewSettings = {\n showInsertionsAndDeletions: true,\n showFormatting: true,\n showInkAnnotations: true,\n };\n this.autoPopulateTOCs = false;\n this.rsids = new Set();\n if (initDefaults) {\n this.initializeRequiredFiles();\n }\n }\n private zipHandler: ZipHandler;\n private bodyElements: BodyElement[] = [];\n private properties: DocumentProperties;\n public namespaces: Record<string, string> = {};\n private stylesManager: StylesManager;\n private numberingManager: NumberingManager;\n private section: Section;\n private imageManager: ImageManager;\n private relationshipManager: RelationshipManager;\n private headerFooterManager: HeaderFooterManager;\n private bookmarkManager: BookmarkManager;\n private revisionManager: RevisionManager;\n private commentManager: CommentManager;\n private documentIdManager: DocumentIdManager;\n private trackingContext: DocumentTrackingContext;\n private footnoteManager: FootnoteManager;\n private endnoteManager: EndnoteManager;\n\n // Helper classes for parsing, generation, and validation\n private parser: DocumentParser;\n private generator: DocumentGenerator;\n private validator: DocumentValidator;\n private logger: ILogger;\n\n // Track changes settings\n private trackChangesEnabled = false;\n private trackFormatting = true;\n private revisionViewSettings: RevisionViewSettings = {\n showInsertionsAndDeletions: true,\n showFormatting: true,\n showInkAnnotations: true,\n };\n\n // TOC auto-population setting\n private autoPopulateTOCs = false;\n\n // TOC field instruction sync setting (default: OFF to preserve original instructions)\n private autoSyncTOCStyles = false;\n\n // Flag to skip document.xml regeneration after stripping tracked changes\n // When true, save() and toBuffer() will preserve the manually cleaned XML\n private skipDocumentXmlRegeneration = false;\n\n // Flag to accept all revisions before save\n // When true, acceptAllRevisions() is called after flushPendingChanges() but before XML generation\n // This ensures ALL revisions (including those created during save) are accepted\n private acceptRevisionsBeforeSave = false;\n\n // Store original [Content_Types].xml entries to preserve during save\n // This ensures round-trip fidelity for documents with features the framework doesn't track\n // (VBA macros, custom UI, embedded objects, etc.)\n private _originalContentTypes?: { defaults: Set<string>; overrides: Set<string> };\n\n // Store original styles.xml, numbering.xml, and settings.xml to preserve formatting during save\n // Prevents loss of formatting details not captured by parsers (bullet indentation, cell padding, etc.)\n private _originalStylesXml?: string;\n private _originalNumberingXml?: string;\n private _originalSettingsXml?: string;\n private _originalAppPropsXml?: string;\n private _originalFootnotesXml?: string;\n private _originalEndnotesXml?: string;\n private _originalCommentsXml?: string;\n private _commentsModified = false;\n private _originalCommentCompanionFiles = new Map<string, string>();\n /** Parts explicitly removed via removePart() — skip regeneration during save */\n private _removedParts = new Set<string>();\n\n // Track whether app properties have been programmatically modified since load\n private _appPropsModified = false;\n\n // Track whether footnotes/endnotes have been programmatically modified since load\n private _footnotesModified = false;\n private _endnotesModified = false;\n\n // Track whether settings have been programmatically modified since load\n // When true, mergeSettingsWithOriginal() will apply in-memory state to the preserved XML\n private _settingsModified = false;\n /** Tracks which individual boolean settings were modified via setters (not just parsed) */\n private _modifiedBooleanSettings = new Set<string>();\n\n // webSettings.xml round-trip preservation\n private _originalWebSettingsXml?: string;\n private _webSettingsModified = false;\n private _webSettings: {\n optimizeForBrowser: boolean;\n allowPNG: boolean;\n relyOnVML: boolean;\n doNotRelyOnCSS: boolean;\n doNotSaveAsSingleFile: boolean;\n doNotOrganizeInFolder: boolean;\n doNotUseLongFileNames: boolean;\n pixelsPerInch?: number;\n targetScreenSz?: string;\n encoding?: string;\n } = {\n optimizeForBrowser: true,\n allowPNG: true,\n relyOnVML: false,\n doNotRelyOnCSS: false,\n doNotSaveAsSingleFile: false,\n doNotOrganizeInFolder: false,\n doNotUseLongFileNames: false,\n };\n\n // Parsed compatibility mode info from w:compat block in settings.xml\n // Per MS-DOCX spec, default when absent is mode 12 (Word 2007)\n private _compatInfo?: CompatibilityInfo;\n\n private rsidRoot?: string;\n private rsids = new Set<string>();\n private documentProtection?: DocumentProtection;\n\n /** Document background (w:background) per ECMA-376 Part 1 §17.2.1 */\n private _documentBackground?: {\n color?: string;\n themeColor?: string;\n themeTint?: string;\n themeShade?: string;\n };\n\n /** Even and odd headers setting (w:evenAndOddHeaders) per ECMA-376 Part 1 §17.15.1.28 */\n private _evenAndOddHeaders?: boolean;\n /** Mirror margins setting (w:mirrorMargins) per ECMA-376 Part 1 §17.15.1.57 */\n private _mirrorMargins?: boolean;\n /** Auto hyphenation setting (w:autoHyphenation) per ECMA-376 Part 1 §17.15.1.10 */\n private _autoHyphenation?: boolean;\n /** Hide spelling errors (w:hideSpellingErrors) per ECMA-376 Part 1 §17.15.1.43 */\n private _hideSpellingErrors?: boolean;\n /** Hide grammatical errors (w:hideGrammaticalErrors) per ECMA-376 Part 1 §17.15.1.42 */\n private _hideGrammaticalErrors?: boolean;\n /** Default tab stop (w:defaultTabStop) per ECMA-376 Part 1 §17.15.1.25 */\n private _defaultTabStop?: number;\n /** Update fields on open (w:updateFields) per ECMA-376 Part 1 §17.15.1.85 */\n private _updateFields?: boolean;\n /** Embed TrueType fonts (w:embedTrueTypeFonts) per ECMA-376 Part 1 §17.15.1.24 */\n private _embedTrueTypeFonts?: boolean;\n /** Save subset of fonts (w:saveSubsetFonts) per ECMA-376 Part 1 §17.15.1.78 */\n private _saveSubsetFonts?: boolean;\n /** Do not track moves (w:doNotTrackMoves) per ECMA-376 Part 1 §17.15.1.35 */\n private _doNotTrackMoves?: boolean;\n /** Decimal symbol for locale (w:decimalSymbol) per ECMA-376 Part 1 §17.15.1.23 */\n private _decimalSymbol?: string;\n /** List separator for locale (w:listSeparator) per ECMA-376 Part 1 §17.15.1.55 */\n private _listSeparator?: string;\n /** Document view type (w:view) per ECMA-376 Part 1 §17.15.1.92 — element #1 in CT_Settings */\n private _documentView?: string;\n\n /** When true, _postProcessDocumentXml() strips INCLUDEPICTURE field markup from document.xml */\n private _flattenIncludePictureFields = false;\n /** When true, _postProcessDocumentXml() removes RSIDs not referenced in document.xml */\n private _stripOrphanRSIDs = false;\n /** When set, _postProcessDocumentXml() removes direct w:spacing from paragraphs with these styles */\n private _clearDirectSpacingStyles: string[] | null = null;\n /** Tracks numPicBullet IDs removed during numbering merge, for rels cleanup */\n private _removedNumPicBulletIds = new Set<number>();\n\n /**\n * Snapshot of save-related state for rollback on failure\n * @private\n */\n private saveStateSnapshot?: {\n preservedParagraphs: Set<Paragraph>;\n acceptRevisionsBeforeSave: boolean;\n flattenIncludePictureFields: boolean;\n stripOrphanRSIDs: boolean;\n clearDirectSpacingStyles: string[] | null;\n };\n\n /**\n * Creates a snapshot of mutable state before save operations\n * This allows rollback if save fails after state modifications\n * @private\n */\n private createSaveStateSnapshot(): void {\n const preservedParagraphs = new Set<Paragraph>();\n for (const para of this.getAllParagraphs()) {\n if (para.isPreserved()) {\n preservedParagraphs.add(para);\n }\n }\n this.saveStateSnapshot = {\n preservedParagraphs,\n acceptRevisionsBeforeSave: this.acceptRevisionsBeforeSave,\n flattenIncludePictureFields: this._flattenIncludePictureFields,\n stripOrphanRSIDs: this._stripOrphanRSIDs,\n clearDirectSpacingStyles: this._clearDirectSpacingStyles,\n };\n }\n\n /**\n * Restores mutable state from snapshot after a failed save\n * @private\n */\n private restoreSaveStateSnapshot(): void {\n if (!this.saveStateSnapshot) return;\n\n // Restore preserve flags\n for (const para of this.saveStateSnapshot.preservedParagraphs) {\n para.setPreserved(true);\n }\n\n // Restore acceptRevisionsBeforeSave flag\n this.acceptRevisionsBeforeSave = this.saveStateSnapshot.acceptRevisionsBeforeSave;\n\n // Restore post-processing flags (consumed during _postProcessDocumentXml)\n this._flattenIncludePictureFields = this.saveStateSnapshot.flattenIncludePictureFields;\n this._stripOrphanRSIDs = this.saveStateSnapshot.stripOrphanRSIDs;\n this._clearDirectSpacingStyles = this.saveStateSnapshot.clearDirectSpacingStyles;\n\n // Clear snapshot\n this.saveStateSnapshot = undefined;\n }\n\n /**\n * Clears the save state snapshot (called after successful save)\n * @private\n */\n private clearSaveStateSnapshot(): void {\n this.saveStateSnapshot = undefined;\n }\n\n /**\n * Creates a new empty Word document\n *\n * Creates a new DOCX document with all required files initialized and ready for content.\n * The document includes default styles, numbering definitions, and required relationships.\n *\n * @param options - Optional document configuration\n * @param options.properties - Document metadata (title, author, subject, etc.)\n * @param options.maxMemoryUsagePercent - Maximum memory usage percentage (0-100) before throwing error (default: 80)\n * @param options.maxRssMB - Maximum absolute RSS in MB (default: 2048)\n * @param options.strictParsing - Throw errors instead of collecting warnings (default: false)\n * @param options.logger - Custom logger for framework messages\n * @returns A new Document instance ready for adding content\n *\n * @example\n * ```typescript\n * // Create a basic document\n * const doc = Document.create();\n * doc.createParagraph('Hello World');\n * await doc.save('output.docx');\n * ```\n *\n * @example\n * ```typescript\n * // Create with metadata\n * const doc = Document.create({\n * properties: {\n * title: 'My Document',\n * creator: 'John Doe',\n * subject: 'Report'\n * }\n * });\n * ```\n */\n static create(options?: DocumentOptions): Document {\n const doc = new Document(undefined, options);\n doc.initializeRequiredFiles();\n return doc;\n }\n\n /**\n * Loads an existing Word document from a file path\n *\n * Reads and parses an existing DOCX file, preserving all content, formatting,\n * styles, numbering, headers, footers, images, and other document elements.\n *\n * @param filePath - Absolute or relative path to the DOCX file to load\n * @param options - Optional document configuration (see {@link DocumentOptions})\n * @param options.strictParsing - If true, throws errors on malformed content; if false, collects warnings (default: false)\n * @param options.logger - Custom logger for warnings and errors during parsing\n * @returns Promise that resolves to a Document instance with all parsed content\n *\n * @throws Error if file doesn't exist, is not a valid DOCX, or is corrupted\n *\n * @example\n * ```typescript\n * // Load and modify a document\n * const doc = await Document.load('input.docx');\n * doc.createParagraph('Additional content');\n * await doc.save('modified.docx');\n * ```\n *\n * @example\n * ```typescript\n * // Load with strict parsing\n * try {\n * const doc = await Document.load('input.docx', { strictParsing: true });\n * } catch (error) {\n * console.error('Document is corrupted:', error);\n * }\n * ```\n */\n static async load(filePath: string, options?: DocumentLoadOptions): Promise<Document> {\n const logger = getLogger();\n logger.info('Loading document from file', { path: filePath });\n\n const zipHandler = new ZipHandler();\n await zipHandler.load(filePath);\n\n return Document.initializeFromZip(zipHandler, options);\n }\n\n /**\n * Loads an existing Word document from a Buffer\n *\n * Reads and parses a DOCX file from an in-memory Buffer, useful for processing\n * documents from HTTP requests, database blobs, or other non-filesystem sources.\n *\n * @param buffer - Buffer containing the complete DOCX file data\n * @param options - Optional document configuration (see {@link DocumentOptions})\n * @returns Promise that resolves to a Document instance with all parsed content\n *\n * @throws Error if buffer doesn't contain valid DOCX data or is corrupted\n *\n * @example\n * ```typescript\n * // Load from HTTP response\n * const response = await fetch('https://example.com/doc.docx');\n * const buffer = Buffer.from(await response.arrayBuffer());\n * const doc = await Document.loadFromBuffer(buffer);\n * ```\n *\n * @example\n * ```typescript\n * // Load from file system buffer\n * import { promises as fs } from 'fs';\n * const buffer = await fs.readFile('input.docx');\n * const doc = await Document.loadFromBuffer(buffer);\n * ```\n */\n static async loadFromBuffer(buffer: Buffer, options?: DocumentLoadOptions): Promise<Document> {\n const logger = getLogger();\n logger.info('Loading document from buffer', { bufferSize: buffer.length });\n\n const zipHandler = new ZipHandler();\n await zipHandler.loadFromBuffer(buffer);\n\n return Document.initializeFromZip(zipHandler, options);\n }\n\n /**\n * Common initialization logic for load() and loadFromBuffer().\n * Handles revision strategy, preserves original XML, parses content, and optionally accepts revisions.\n */\n private static async initializeFromZip(\n zipHandler: ZipHandler,\n options?: DocumentLoadOptions\n ): Promise<Document> {\n const logger = getLogger();\n\n // Determine revision handling strategy\n // If acceptRevisions is true, we need to preserve revisions during parsing\n // so they can be accepted using in-memory transformation after parsing\n const useInMemoryAccept = options?.acceptRevisions === true;\n const revisionHandling = useInMemoryAccept\n ? 'preserve' // Force preserve so revisions are parsed into model\n : (options?.revisionHandling ?? 'accept'); // Default to accept\n\n // Handle tracked changes BEFORE parsing (unless using in-memory accept)\n if (revisionHandling === 'accept') {\n // Accept all tracked changes to prevent corruption (raw XML approach)\n await acceptAllRevisions(zipHandler);\n } else if (revisionHandling === 'strip') {\n // Strip all tracked changes completely\n await stripTrackedChanges(zipHandler);\n } else if (revisionHandling === 'preserve') {\n // Check if document has tracked changes and warn (unless intentionally accepting later)\n if (!useInMemoryAccept) {\n const documentXml = zipHandler.getFileAsString('word/document.xml');\n if (\n documentXml &&\n (documentXml.includes('<w:ins') ||\n documentXml.includes('<w:del') ||\n documentXml.includes('<w:moveFrom') ||\n documentXml.includes('<w:moveTo'))\n ) {\n logger.warn('Document contains tracked changes in preserve mode');\n }\n }\n }\n\n // Create document without default relationships (will parse from file)\n const doc = new Document(zipHandler, options, false);\n\n // Parse and preserve original [Content_Types].xml entries for round-trip fidelity\n const contentTypesXml = zipHandler.getFileAsString('[Content_Types].xml');\n if (contentTypesXml) {\n doc._originalContentTypes = doc.parseContentTypes(contentTypesXml);\n }\n\n // Parse and preserve original styles.xml and numbering.xml for formatting fidelity\n const stylesXml = zipHandler.getFileAsString(DOCX_PATHS.STYLES);\n if (stylesXml) {\n doc._originalStylesXml = stylesXml;\n }\n\n const numberingXml = zipHandler.getFileAsString(DOCX_PATHS.NUMBERING);\n if (numberingXml) {\n doc._originalNumberingXml = numberingXml;\n }\n\n // Preserve original settings.xml and parse managed settings into in-memory state\n // This ensures round-trip fidelity and accurate merge logic on save\n const settingsXml = zipHandler.getFileAsString(DOCX_PATHS.SETTINGS);\n if (settingsXml) {\n doc._originalSettingsXml = settingsXml;\n doc.parseSettingsFromXml(settingsXml);\n }\n\n // Preserve original app.xml for round-trip fidelity (HeadingPairs, TotalTime, etc.)\n const appPropsXml = zipHandler.getFileAsString(DOCX_PATHS.APP_PROPS);\n if (appPropsXml) {\n doc._originalAppPropsXml = appPropsXml;\n }\n\n // Preserve original webSettings.xml for round-trip fidelity (w:divs, flags, etc.)\n const webSettingsXml = zipHandler.getFileAsString(DOCX_PATHS.WEB_SETTINGS);\n if (webSettingsXml) {\n doc._originalWebSettingsXml = webSettingsXml;\n doc.parseWebSettingsFromXml(webSettingsXml);\n }\n\n await doc.parseDocument();\n\n // Surface parse warnings so users know about partial parsing issues\n const parseWarnings = doc.getParseWarnings();\n if (parseWarnings.length > 0) {\n logger.warn('Document loaded with parse warnings', {\n warningCount: parseWarnings.length,\n elements: parseWarnings.map((w) => w.element).join(', '),\n });\n }\n\n // If acceptRevisions option was set, accept revisions using in-memory transformation\n // This happens AFTER parsing so revisions were available for inspection (e.g., ChangelogGenerator)\n // and allows subsequent document modifications to be saved correctly\n if (useInMemoryAccept) {\n logger.info('Accepting revisions using in-memory transformation');\n await doc.acceptAllRevisions();\n logger.info('Revisions accepted', { paragraphs: doc.getParagraphCount() });\n }\n\n logger.info('Document loaded', { paragraphs: doc.getParagraphCount() });\n\n return doc;\n }\n\n /**\n * Parses managed settings from settings.xml into in-memory state.\n *\n * This populates trackChangesEnabled, trackFormatting, revisionViewSettings,\n * documentProtection, rsidRoot, and rsids from the original settings.xml so that\n * the merge logic on save has accurate state to work with.\n *\n * Without this, calling protectDocument() on a loaded doc could accidentally\n * strip <w:trackRevisions/> during the merge because trackChangesEnabled would\n * still be false (constructor default) rather than the value from the file.\n *\n * @param settingsXml - The raw settings.xml content\n * @private\n */\n private parseSettingsFromXml(settingsXml: string): void {\n // Parse w:trackRevisions - presence means tracking is enabled\n // Both <w:trackRevisions/> and <w:trackRevisions w:val=\"true\"/> mean enabled\n // <w:trackRevisions w:val=\"false\"/> or <w:trackRevisions w:val=\"0\"/> means disabled\n const trackRevisionsMatch = /<w:trackRevisions\\b([^>]*)\\/?>/.exec(settingsXml);\n if (trackRevisionsMatch) {\n const attrs = trackRevisionsMatch[1] ?? '';\n const valMatch = /w:val\\s*=\\s*\"([^\"]*)\"/.exec(attrs);\n if (valMatch?.[1] !== undefined) {\n const val = valMatch[1].toLowerCase();\n this.trackChangesEnabled = val !== 'false' && val !== '0' && val !== 'off';\n } else {\n // Self-closing without val attribute means enabled\n this.trackChangesEnabled = true;\n }\n }\n\n // Parse w:doNotTrackFormatting - presence means formatting tracking is disabled\n const hasDoNotTrackFormatting = /<w:doNotTrackFormatting\\b[^>]*\\/?>/.test(settingsXml);\n if (hasDoNotTrackFormatting) {\n this.trackFormatting = false;\n }\n // Parse w:trackFormatting - explicit presence means formatting tracking is enabled\n const hasTrackFormatting = /<w:trackFormatting\\b[^>]*\\/?>/.test(settingsXml);\n if (hasTrackFormatting) {\n this.trackFormatting = true;\n }\n\n // Parse w:revisionView\n const revisionViewMatch = /<w:revisionView\\b([^>]*)\\/?>/.exec(settingsXml);\n if (revisionViewMatch) {\n const attrs = revisionViewMatch[1] || '';\n const insDelMatch = /w:insDel\\s*=\\s*\"([^\"]*)\"/.exec(attrs);\n const formattingMatch = /w:formatting\\s*=\\s*\"([^\"]*)\"/.exec(attrs);\n const inkMatch = /w:inkAnnotations\\s*=\\s*\"([^\"]*)\"/.exec(attrs);\n if (insDelMatch?.[1] !== undefined) {\n this.revisionViewSettings.showInsertionsAndDeletions = insDelMatch[1] !== '0';\n }\n if (formattingMatch?.[1] !== undefined) {\n this.revisionViewSettings.showFormatting = formattingMatch[1] !== '0';\n }\n if (inkMatch?.[1] !== undefined) {\n this.revisionViewSettings.showInkAnnotations = inkMatch[1] !== '0';\n }\n }\n\n // Parse w:documentProtection\n const protMatch = /<w:documentProtection\\b([^>]*)\\/?>/.exec(settingsXml);\n if (protMatch) {\n const attrs = protMatch[1] || '';\n const editMatch = /w:edit\\s*=\\s*\"([^\"]*)\"/.exec(attrs);\n const enforcementMatch = /w:enforcement\\s*=\\s*\"([^\"]*)\"/.exec(attrs);\n if (editMatch?.[1]) {\n const edit = editMatch[1] as 'readOnly' | 'comments' | 'trackedChanges' | 'forms';\n const enforcement = enforcementMatch?.[1] ? enforcementMatch[1] !== '0' : true;\n this.documentProtection = { edit, enforcement };\n\n // Parse optional crypto attributes\n const cryptProviderMatch = /w:cryptProviderType\\s*=\\s*\"([^\"]*)\"/.exec(attrs);\n const cryptAlgClassMatch = /w:cryptAlgorithmClass\\s*=\\s*\"([^\"]*)\"/.exec(attrs);\n const cryptAlgTypeMatch = /w:cryptAlgorithmType\\s*=\\s*\"([^\"]*)\"/.exec(attrs);\n const cryptAlgSidMatch = /w:cryptAlgorithmSid\\s*=\\s*\"([^\"]*)\"/.exec(attrs);\n const cryptSpinMatch = /w:cryptSpinCount\\s*=\\s*\"([^\"]*)\"/.exec(attrs);\n const hashMatch = /w:hash\\s*=\\s*\"([^\"]*)\"/.exec(attrs);\n const saltMatch = /w:salt\\s*=\\s*\"([^\"]*)\"/.exec(attrs);\n\n if (cryptProviderMatch?.[1])\n this.documentProtection.cryptProviderType = cryptProviderMatch[1];\n if (cryptAlgClassMatch?.[1])\n this.documentProtection.cryptAlgorithmClass = cryptAlgClassMatch[1];\n if (cryptAlgTypeMatch?.[1])\n this.documentProtection.cryptAlgorithmType = cryptAlgTypeMatch[1];\n if (cryptAlgSidMatch?.[1])\n this.documentProtection.cryptAlgorithmSid = parseInt(cryptAlgSidMatch[1], 10);\n if (cryptSpinMatch?.[1])\n this.documentProtection.cryptSpinCount = parseInt(cryptSpinMatch[1], 10);\n if (hashMatch?.[1]) this.documentProtection.hash = hashMatch[1];\n if (saltMatch?.[1]) this.documentProtection.salt = saltMatch[1];\n }\n }\n\n // Parse w:rsids block\n const rsidsBlockMatch = /<w:rsids>([\\s\\S]*?)<\\/w:rsids>/.exec(settingsXml);\n if (rsidsBlockMatch?.[1]) {\n const rsidsBlock = rsidsBlockMatch[1];\n\n // Parse rsidRoot\n const rsidRootMatch = /<w:rsidRoot\\s+w:val\\s*=\\s*\"([^\"]*)\"\\s*\\/?>/.exec(rsidsBlock);\n if (rsidRootMatch?.[1]) {\n this.rsidRoot = rsidRootMatch[1].toUpperCase();\n }\n\n // Parse all rsid entries\n const rsidRegex = /<w:rsid\\s+w:val\\s*=\\s*\"([^\"]*)\"\\s*\\/?>/g;\n let rsidMatch;\n while ((rsidMatch = rsidRegex.exec(rsidsBlock)) !== null) {\n if (rsidMatch[1]) this.rsids.add(rsidMatch[1].toUpperCase());\n }\n\n // Ensure rsidRoot is also in the rsids set\n if (this.rsidRoot) {\n this.rsids.add(this.rsidRoot);\n }\n }\n\n // Parse w:view per ECMA-376 Part 1 §17.15.1.92 (element #1 in CT_Settings)\n const viewMatch = /<w:view\\s+w:val\\s*=\\s*\"([^\"]*)\"[^>]*\\/?>/.exec(settingsXml);\n if (viewMatch?.[1]) {\n this._documentView = viewMatch[1];\n }\n\n // Parse w:evenAndOddHeaders per ECMA-376 Part 1 §17.15.1.28\n if (/<w:evenAndOddHeaders\\b[^>]*\\/?>/.test(settingsXml)) {\n this._evenAndOddHeaders = true;\n }\n\n // Parse w:mirrorMargins per ECMA-376 Part 1 §17.15.1.57\n if (/<w:mirrorMargins\\b[^>]*\\/?>/.test(settingsXml)) {\n this._mirrorMargins = true;\n }\n\n // Parse w:autoHyphenation per ECMA-376 Part 1 §17.15.1.10\n if (/<w:autoHyphenation\\b[^>]*\\/?>/.test(settingsXml)) {\n this._autoHyphenation = true;\n }\n\n // Parse w:hideSpellingErrors per ECMA-376 Part 1 §17.15.1.43\n if (/<w:hideSpellingErrors\\b[^>]*\\/?>/.test(settingsXml)) {\n this._hideSpellingErrors = true;\n }\n\n // Parse w:hideGrammaticalErrors per ECMA-376 Part 1 §17.15.1.42\n if (/<w:hideGrammaticalErrors\\b[^>]*\\/?>/.test(settingsXml)) {\n this._hideGrammaticalErrors = true;\n }\n\n // Parse w:defaultTabStop per ECMA-376 Part 1 §17.15.1.25\n const defaultTabStopMatch = /<w:defaultTabStop\\s+w:val\\s*=\\s*\"(\\d+)\"\\s*\\/?>/.exec(settingsXml);\n if (defaultTabStopMatch?.[1]) {\n this._defaultTabStop = parseInt(defaultTabStopMatch[1], 10);\n }\n\n // Parse w:updateFields per ECMA-376 Part 1 §17.15.1.85\n if (/<w:updateFields\\b[^>]*\\/?>/.test(settingsXml)) {\n this._updateFields = true;\n }\n\n // Parse w:embedTrueTypeFonts per ECMA-376 Part 1 §17.15.1.24\n if (/<w:embedTrueTypeFonts\\b[^>]*\\/?>/.test(settingsXml)) {\n this._embedTrueTypeFonts = true;\n }\n\n // Parse w:saveSubsetFonts per ECMA-376 Part 1 §17.15.1.78\n if (/<w:saveSubsetFonts\\b[^>]*\\/?>/.test(settingsXml)) {\n this._saveSubsetFonts = true;\n }\n\n // Parse w:doNotTrackMoves per ECMA-376 Part 1 §17.15.1.35\n if (/<w:doNotTrackMoves\\b[^>]*\\/?>/.test(settingsXml)) {\n this._doNotTrackMoves = true;\n }\n\n // Parse w:decimalSymbol per ECMA-376 Part 1 §17.15.1.23\n const decimalMatch = /<w:decimalSymbol\\s+w:val\\s*=\\s*\"([^\"]*)\"\\s*\\/?>/.exec(settingsXml);\n if (decimalMatch?.[1]) {\n this._decimalSymbol = decimalMatch[1];\n }\n\n // Parse w:listSeparator per ECMA-376 Part 1 §17.15.1.55\n const listSepMatch = /<w:listSeparator\\s+w:val\\s*=\\s*\"([^\"]*)\"\\s*\\/?>/.exec(settingsXml);\n if (listSepMatch?.[1]) {\n this._listSeparator = listSepMatch[1];\n }\n\n // Parse w:compat block for compatibility mode detection\n this._compatInfo = this.parseCompatBlock(settingsXml);\n }\n\n /**\n * Parses the w:compat block from settings.xml to extract compatibility mode info.\n *\n * Per MS-DOCX specification, when the compatibilityMode compatSetting is absent,\n * the effective mode is 12 (Word 2007 / ECMA-376 1st edition).\n *\n * @param settingsXml - The raw settings.xml content\n * @returns Parsed CompatibilityInfo\n * @private\n */\n private parseCompatBlock(settingsXml: string): CompatibilityInfo {\n const compatSettings: CompatSetting[] = [];\n const legacyFlags: string[] = [];\n let mode = CompatibilityMode.Word2007; // Default per MS-DOCX spec\n\n // Extract w:compat block\n const compatBlockMatch = /<w:compat>([\\s\\S]*?)<\\/w:compat>/.exec(settingsXml);\n if (compatBlockMatch?.[1]) {\n const compatBlock = compatBlockMatch[1];\n\n // Parse w:compatSetting entries (name/uri/val triples)\n const settingRegex = /<w:compatSetting\\s+([^>]*)\\/?\\s*>/g;\n let settingMatch;\n while ((settingMatch = settingRegex.exec(compatBlock)) !== null) {\n const attrs = settingMatch[1] ?? '';\n const nameMatch = /w:name\\s*=\\s*\"([^\"]*)\"/.exec(attrs);\n const uriMatch = /w:uri\\s*=\\s*\"([^\"]*)\"/.exec(attrs);\n const valMatch = /w:val\\s*=\\s*\"([^\"]*)\"/.exec(attrs);\n\n if (nameMatch?.[1] && uriMatch?.[1] && valMatch?.[1]) {\n const setting: CompatSetting = {\n name: nameMatch[1],\n uri: uriMatch[1],\n val: valMatch[1],\n };\n compatSettings.push(setting);\n\n // Extract compatibility mode value\n if (\n setting.name === 'compatibilityMode' &&\n setting.uri === 'http://schemas.microsoft.com/office/word'\n ) {\n const modeVal = parseInt(setting.val, 10);\n if (!isNaN(modeVal)) {\n mode = modeVal as CompatibilityMode;\n }\n }\n }\n }\n\n // Parse legacy boolean compat flags (self-closing w: elements that are NOT w:compatSetting)\n const legacyFlagRegex = /<w:(\\w+)(?:\\s[^>]*)?\\/?>/g;\n let flagMatch;\n while ((flagMatch = legacyFlagRegex.exec(compatBlock)) !== null) {\n const tagName = flagMatch[1];\n // Skip w:compatSetting entries (already parsed above)\n if (!tagName || tagName === 'compatSetting') continue;\n legacyFlags.push(tagName);\n }\n }\n\n return {\n mode,\n isLegacyMode: mode < CompatibilityMode.Word2013Plus,\n compatSettings,\n legacyFlags,\n };\n }\n\n /**\n * Parses an existing document file loaded into the ZIP handler\n * Populates all document elements from the loaded XML\n *\n * @private\n */\n private async parseDocument(): Promise<void> {\n // Use the parser helper that's already created\n const result = await this.parser.parseDocument(\n this.zipHandler,\n this.relationshipManager,\n this.imageManager,\n this.bookmarkManager\n );\n\n // Populate document properties from parser results\n this.bodyElements = result.bodyElements;\n this.relationshipManager = result.relationshipManager;\n this.namespaces = result.namespaces;\n this.properties = result.properties;\n this._documentBackground = result.documentBackground;\n\n // Populate styles manager\n for (const style of result.styles) {\n this.stylesManager.addStyle(style);\n }\n\n // Inject StylesManager into parsed tables for conditional formatting resolution\n for (const element of this.bodyElements) {\n if (element instanceof Table) {\n element._setStylesManager(this.stylesManager);\n }\n }\n\n // Populate numbering manager\n for (const abstractNum of result.abstractNumberings) {\n this.numberingManager.addAbstractNumbering(abstractNum);\n }\n for (const instance of result.numberingInstances) {\n this.numberingManager.addInstance(instance);\n }\n\n // Set section if present\n if (result.section) {\n this.section = result.section;\n }\n\n // Parse and register headers/footers with error handling\n // If parsing fails, document loads but headers/footers are lost - warn user\n try {\n const headersFooters = await this.parser.parseHeadersAndFooters(\n this.zipHandler,\n result.section,\n this.relationshipManager,\n this.imageManager\n );\n\n // Register headers with HeaderFooterManager (deduplicate by rId)\n // Multiple section property types may reference the same rId\n const registeredHeaderRIds = new Set<string>();\n for (const { header, relationshipId } of headersFooters.headers) {\n if (registeredHeaderRIds.has(relationshipId)) continue;\n this.headerFooterManager.registerHeader(header, relationshipId);\n registeredHeaderRIds.add(relationshipId);\n }\n\n // Register footers with HeaderFooterManager (deduplicate by rId)\n const registeredFooterRIds = new Set<string>();\n for (const { footer, relationshipId } of headersFooters.footers) {\n if (registeredFooterRIds.has(relationshipId)) continue;\n this.headerFooterManager.registerFooter(footer, relationshipId);\n registeredFooterRIds.add(relationshipId);\n }\n } catch (headerFooterError) {\n const logger = getLogger();\n logger.warn('Failed to parse headers/footers - document will load without them', {\n error:\n headerFooterError instanceof Error\n ? headerFooterError.message\n : String(headerFooterError),\n });\n // Continue loading - headers/footers are not critical for document structure\n // User should be aware that headers/footers may be missing\n }\n\n // Reset modified flags - loading doesn't count as modification\n // This enables XML preservation for unmodified documents\n this.stylesManager.resetModified();\n this.numberingManager.resetModified();\n\n // Initialize ALL annotation managers with a unified global ID to avoid collisions\n // Per ECMA-376, w:id must be unique across ALL annotation types (bookmarks, revisions, comments)\n // Must be called BEFORE populateRevisionLocations() which registers revisions\n this.initializeGlobalAnnotationIds();\n\n // Parse and register comments from comments.xml\n // Must be called AFTER initializeGlobalAnnotationIds() to properly handle ID synchronization\n this.parseAndRegisterComments();\n this.parseAndRegisterFootnotes();\n this.parseAndRegisterEndnotes();\n\n // Populate revision locations for changelog/tracking purposes\n this.populateRevisionLocations();\n\n // Initialize image manager with existing images to avoid filename collisions\n this.imageManager.initializeFromLoadedImages();\n }\n\n /**\n * Scans the raw document XML for ALL existing annotation IDs and initializes\n * ALL managers (BookmarkManager, RevisionManager, CommentManager) to use IDs\n * starting from the global maximum + 1.\n *\n * Per ECMA-376, w:id attributes must be UNIQUE across ALL annotation types:\n * - w:bookmarkStart / w:bookmarkEnd\n * - w:ins / w:del (revisions)\n * - w:pPrChange / w:rPrChange / w:tblPrChange (property changes)\n * - w:moveFrom / w:moveTo\n * - w:commentRangeStart / w:commentRangeEnd\n * - w:comment\n *\n * This unified approach prevents ID collisions between different annotation types\n * that were causing document corruption.\n *\n * @private\n */\n private initializeGlobalAnnotationIds(): void {\n const documentXml = this.zipHandler.getFileAsString('word/document.xml');\n const commentsXml = this.zipHandler.getFileAsString('word/comments.xml');\n\n // Initialize the centralized DocumentIdManager from document XML\n // This scans ALL w:id attributes and sets nextId to globalMax + 1\n // All managers (Bookmark, Revision, Comment) use this shared counter via callbacks\n this.documentIdManager.initializeFromDocument(\n documentXml || undefined,\n commentsXml || undefined\n );\n }\n\n /**\n * Parses comments from word/comments.xml and registers them with the CommentManager.\n * This enables round-trip preservation of comments in loaded documents.\n * @private\n */\n private parseAndRegisterComments(): void {\n const commentsXml = this.zipHandler.getFileAsString('word/comments.xml');\n if (!commentsXml) {\n return; // No comments.xml file, nothing to parse\n }\n\n // Preserve original for passthrough (same pattern as footnotes)\n this._originalCommentsXml = commentsXml;\n\n // Also preserve companion files from the ZIP\n for (const path of [\n DOCX_PATHS.COMMENTS_EXTENDED,\n DOCX_PATHS.COMMENTS_IDS,\n DOCX_PATHS.COMMENTS_EXTENSIBLE,\n ]) {\n const content = this.zipHandler.getFileAsString(path);\n if (content) {\n this._originalCommentCompanionFiles.set(path, content);\n }\n }\n\n const parser = new DocumentParser();\n const comments = parser.parseCommentsXml(commentsXml);\n\n // Register each comment with its existing ID\n for (const comment of comments) {\n this.commentManager.registerExisting(comment);\n }\n\n // Link replies to their parent comments\n this.commentManager.linkReplies();\n }\n\n private parseAndRegisterFootnotes(): void {\n const footnotesXml = this.zipHandler.getFileAsString(DOCX_PATHS.FOOTNOTES);\n if (!footnotesXml) {\n return;\n }\n\n // Always preserve original for passthrough, even if parsing fails\n this._originalFootnotesXml = footnotesXml;\n\n try {\n const parser = new DocumentParser();\n const footnotes = parser.parseFootnotesXml(footnotesXml);\n\n for (const footnote of footnotes) {\n const id = footnote.getId();\n // Special footnotes (separator=-1, continuation=0) are already in the manager\n if (!this.footnoteManager.hasFootnote(id)) {\n this.footnoteManager.register(footnote);\n }\n }\n } catch (error) {\n this.logger.warn('Failed to parse footnotes - preserving original XML for passthrough', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n private parseAndRegisterEndnotes(): void {\n const endnotesXml = this.zipHandler.getFileAsString(DOCX_PATHS.ENDNOTES);\n if (!endnotesXml) {\n return;\n }\n\n this._originalEndnotesXml = endnotesXml;\n\n try {\n const parser = new DocumentParser();\n const endnotes = parser.parseEndnotesXml(endnotesXml);\n\n for (const endnote of endnotes) {\n const id = endnote.getId();\n if (!this.endnoteManager.hasEndnote(id)) {\n this.endnoteManager.register(endnote);\n }\n }\n } catch (error) {\n this.logger.warn('Failed to parse endnotes - preserving original XML for passthrough', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n /**\n * Populates location information on all revisions in the document\n * and registers them with the RevisionManager.\n * Called after parsing to set paragraph and run indices for each revision.\n * @private\n */\n private populateRevisionLocations(): void {\n const paragraphs = this.getParagraphs();\n\n // Track which revisions are already registered to avoid duplicates\n const registeredRevisions = new Set(this.revisionManager.getAllRevisions());\n\n for (let paragraphIndex = 0; paragraphIndex < paragraphs.length; paragraphIndex++) {\n const paragraph = paragraphs[paragraphIndex];\n if (!paragraph) continue;\n\n // Get all revisions from this paragraph\n const revisions = paragraph.getRevisions?.() || [];\n\n // Track run position within paragraph\n let runIndex = 0;\n\n for (const revision of revisions) {\n // Set location if not already set\n if (!revision.getLocation()) {\n const location: RevisionLocation = {\n paragraphIndex,\n runIndex,\n };\n revision.setLocation(location);\n }\n\n // Register revision with manager if not already registered\n // This ensures parsed revisions from document XML are accessible via\n // ChangelogGenerator.fromDocument() and revisionManager.getAllRevisions()\n // Uses registerExisting() to preserve original IDs from parsed XML\n // (register() would overwrite them with new sequential IDs)\n if (!registeredRevisions.has(revision)) {\n this.revisionManager.registerExisting(revision);\n registeredRevisions.add(revision);\n }\n\n // Advance run index for next revision\n runIndex++;\n }\n }\n }\n\n /**\n * Initializes all required DOCX files with minimal valid content\n */\n private initializeRequiredFiles(): void {\n // [Content_Types].xml\n this.zipHandler.addFile(DOCX_PATHS.CONTENT_TYPES, this.generator.generateContentTypes());\n\n // _rels/.rels\n this.zipHandler.addFile(DOCX_PATHS.RELS, this.generator.generateRels());\n\n // word/document.xml (will be updated when saving)\n this.zipHandler.addFile(\n DOCX_PATHS.DOCUMENT,\n this.generator.generateDocumentXml(\n this.bodyElements,\n this.section,\n this.namespaces,\n this._documentBackground\n )\n );\n\n // word/_rels/document.xml.rels\n this.zipHandler.addFile('word/_rels/document.xml.rels', this.relationshipManager.generateXml());\n\n // word/styles.xml\n this.zipHandler.addFile(DOCX_PATHS.STYLES, this.stylesManager.generateStylesXml());\n\n // word/numbering.xml\n this.zipHandler.addFile(DOCX_PATHS.NUMBERING, this.numberingManager.generateNumberingXml());\n\n // word/fontTable.xml (REQUIRED for DOCX compliance)\n this.zipHandler.addFile('word/fontTable.xml', this.generator.generateFontTable());\n\n // word/webSettings.xml\n this.zipHandler.addFile(DOCX_PATHS.WEB_SETTINGS, this.generator.generateWebSettings());\n\n // word/settings.xml (REQUIRED for DOCX compliance)\n this.zipHandler.addFile(\n DOCX_PATHS.SETTINGS,\n this.generator.generateSettings({\n trackChangesEnabled: this.trackChangesEnabled,\n trackFormatting: this.trackFormatting,\n revisionView: this.revisionViewSettings,\n rsidRoot: this.rsidRoot,\n rsids: this.getRsids(),\n documentProtection: this.documentProtection,\n })\n );\n\n // Set compatibility info for new documents (always mode 15)\n this._compatInfo = {\n mode: CompatibilityMode.Word2013Plus,\n isLegacyMode: false,\n compatSettings: [\n { name: 'compatibilityMode', uri: 'http://schemas.microsoft.com/office/word', val: '15' },\n {\n name: 'overrideTableStyleFontSizeAndJustification',\n uri: 'http://schemas.microsoft.com/office/word',\n val: '1',\n },\n {\n name: 'enableOpenTypeFeatures',\n uri: 'http://schemas.microsoft.com/office/word',\n val: '1',\n },\n {\n name: 'doNotFlipMirrorIndents',\n uri: 'http://schemas.microsoft.com/office/word',\n val: '1',\n },\n {\n name: 'differentiateMultirowTableHeaders',\n uri: 'http://schemas.microsoft.com/office/word',\n val: '1',\n },\n ],\n legacyFlags: [],\n };\n\n // word/theme/theme1.xml (REQUIRED for DOCX compliance)\n this.zipHandler.addFile('word/theme/theme1.xml', this.generator.generateTheme());\n\n // docProps/core.xml\n this.zipHandler.addFile(\n DOCX_PATHS.CORE_PROPS,\n this.generator.generateCoreProps(this.properties)\n );\n\n // docProps/app.xml\n this.zipHandler.addFile(DOCX_PATHS.APP_PROPS, this.generator.generateAppProps(this.properties));\n\n // Note: docProps/custom.xml is added during save() if custom properties exist\n }\n\n /**\n * Adds an existing paragraph to the document body\n *\n * Appends a Paragraph instance to the end of the document's body elements.\n * The paragraph maintains all its content, formatting, and properties.\n *\n * @param paragraph - The Paragraph instance to add\n * @returns This document instance for method chaining\n *\n * @example\n * ```typescript\n * const para = new Paragraph();\n * para.addText('Hello World', { bold: true });\n * doc.addParagraph(para);\n * ```\n *\n * @example\n * ```typescript\n * // Create and add in one chain\n * const para = Paragraph.create('Formatted text', { alignment: 'center' });\n * doc.addParagraph(para);\n * ```\n */\n addParagraph(paragraph: Paragraph): this {\n paragraph._setStylesManager(this.stylesManager);\n\n // When tracking enabled, bind context and wrap existing content in w:ins revisions\n if (this.trackChangesEnabled && this.trackingContext.isEnabled()) {\n this.bindTrackingToElement(paragraph);\n const runs = paragraph.getRuns();\n if (runs.length > 0) {\n const author = this.trackingContext.getAuthor();\n const insertion = Revision.createInsertion(author, runs);\n this.trackingContext.getRevisionManager().register(insertion);\n paragraph.addRevision(insertion);\n }\n }\n\n this.bodyElements.push(paragraph);\n return this;\n }\n\n /**\n * Creates a new paragraph and adds it to the document\n *\n * This is a convenience method that creates a Paragraph, optionally adds text content,\n * and appends it to the document in one operation. The returned paragraph can be\n * further modified using its chainable methods.\n *\n * @param text - Optional text content for the paragraph\n * @returns The created Paragraph instance for further customization\n *\n * @example\n * ```typescript\n * // Create empty paragraph\n * const para1 = doc.createParagraph();\n *\n * // Create with text\n * const para2 = doc.createParagraph('Hello World');\n *\n * // Create and customize\n * doc.createParagraph('Chapter 1')\n * .setStyle('Heading1')\n * .setAlignment('center');\n * ```\n */\n createParagraph(text?: string): Paragraph {\n const para = new Paragraph();\n\n // Inject StylesManager for style resolution\n para._setStylesManager(this.stylesManager);\n\n // If track changes is enabled, bind tracking context to the new paragraph\n if (this.trackChangesEnabled && this.trackingContext.isEnabled()) {\n para._setTrackingContext(this.trackingContext);\n }\n\n if (text) {\n para.addText(text);\n }\n this.bodyElements.push(para);\n return para;\n }\n\n /**\n * Adds an existing table to the document body\n *\n * Appends a Table instance to the end of the document's body elements.\n * The table maintains all its rows, cells, content, and formatting.\n *\n * @param table - The Table instance to add\n * @returns This document instance for method chaining\n *\n * @example\n * ```typescript\n * const table = new Table(3, 4);\n * table.getCell(0, 0)?.addParagraph(new Paragraph().addText('Header'));\n * doc.addTable(table);\n * ```\n */\n addTable(table: Table): this {\n table._setStylesManager(this.stylesManager);\n\n // When tracking enabled, bind context to table and its children\n if (this.trackChangesEnabled && this.trackingContext.isEnabled()) {\n this.bindTrackingToElement(table);\n }\n\n this.bodyElements.push(table);\n return this;\n }\n\n /**\n * Adds a Structured Document Tag (content control) to the document body\n *\n * Appends a StructuredDocumentTag instance to the end of the document's body elements.\n * SDTs are content controls used for forms, templates, and data-binding.\n *\n * @param sdt - The StructuredDocumentTag instance to add\n * @returns This document instance for method chaining\n *\n * @example\n * ```typescript\n * const sdt = new StructuredDocumentTag();\n * sdt.addParagraph(new Paragraph().addText('Content'));\n * doc.addStructuredDocumentTag(sdt);\n * ```\n */\n addStructuredDocumentTag(sdt: StructuredDocumentTag): this {\n this.bodyElements.push(sdt);\n return this;\n }\n\n /**\n * Creates a new table and adds it to the document\n *\n * This is a convenience method that creates a Table with the specified dimensions\n * and appends it to the document in one operation. The returned table can be\n * further customized using its chainable methods.\n *\n * @param rows - Number of rows to create (must be positive)\n * @param columns - Number of columns per row (must be positive)\n * @returns The created Table instance for further customization\n *\n * @throws Error if rows or columns is 0 or negative\n *\n * @example\n * ```typescript\n * // Create a 3x4 table\n * const table = doc.createTable(3, 4);\n * table.getCell(0, 0)?.addParagraph(new Paragraph().addText('A1'));\n * ```\n *\n * @example\n * ```typescript\n * // Create and format in one chain\n * doc.createTable(2, 3)\n * .setAllBorders({ style: 'single', size: 4, color: '000000' })\n * .setFirstRowShading('DFDFDF');\n * ```\n */\n createTable(rows: number, columns: number): Table {\n const table = new Table(rows, columns);\n table._setStylesManager(this.stylesManager);\n this.bodyElements.push(table);\n return table;\n }\n\n /**\n * Populates all TOCs in document XML\n * Extracted from replaceTableOfContents for reuse\n *\n * @param docXml The document XML string\n * @returns Modified XML with populated TOCs\n * @private\n */\n\n /**\n * Gets all tables in the document body (top-level only)\n *\n * Returns only tables that are direct children of the document body.\n * Does NOT include tables inside SDTs or nested tables.\n * Use {@link getAllTables} for recursive search including nested content.\n *\n * @returns Array of Table instances in the document body\n *\n * @example\n * ```typescript\n * const tables = doc.getTables();\n * console.log(`Document has ${tables.length} tables`);\n *\n * for (const table of tables) {\n * console.log(`Table: ${table.getRowCount()} rows x ${table.getColumnCount()} columns`);\n * }\n * ```\n */\n getTables(): Table[] {\n return this.bodyElements.filter((el): el is Table => el instanceof Table);\n }\n\n /**\n * Walks all elements in the document recursively, calling the visitor for each.\n *\n * Traverses the full document tree including elements nested inside:\n * - Tables (all cells in all rows)\n * - Structured Document Tags (content controls)\n * - Deeply nested SDTs and tables (unlimited depth)\n *\n * @param visitor - Callback invoked for each Paragraph, Table, or SDT encountered\n */\n walkElements(visitor: (element: Paragraph | Table | StructuredDocumentTag) => void): void {\n const walk = (elements: BodyElement[]) => {\n for (const element of elements) {\n if (element instanceof Paragraph) {\n visitor(element);\n } else if (element instanceof Table) {\n visitor(element);\n for (const row of element.getRows()) {\n for (const cell of row.getCells()) {\n for (const para of cell.getParagraphs()) {\n visitor(para);\n }\n }\n }\n } else if (element instanceof StructuredDocumentTag) {\n visitor(element);\n walk(element.getContent() as BodyElement[]);\n }\n }\n };\n walk(this.bodyElements);\n }\n\n /**\n * Gets all paragraphs in the document recursively\n *\n * Performs a deep search and returns ALL paragraphs in the document,\n * including those nested inside:\n * - Tables (all cells in all rows)\n * - Structured Document Tags (content controls)\n * - Nested SDTs and tables\n *\n * @returns Array of all Paragraph instances found anywhere in the document\n *\n * @example\n * ```typescript\n * // Count all paragraphs including those in tables\n * const allParas = doc.getAllParagraphs();\n * console.log(`Total paragraphs: ${allParas.length}`);\n * ```\n *\n * @example\n * ```typescript\n * // Find all headings\n * const headings = doc.getAllParagraphs().filter(p => {\n * const style = p.getStyle();\n * return style?.startsWith('Heading');\n * });\n * ```\n */\n getAllParagraphs(): Paragraph[] {\n const result: Paragraph[] = [];\n this.walkElements((element) => {\n if (element instanceof Paragraph) {\n result.push(element);\n }\n });\n return result;\n }\n\n /**\n * Gets all paragraphs in the document (alias for getAllParagraphs)\n * @returns Array of all paragraphs recursively\n * @deprecated Use getAllParagraphs() instead for clarity\n */\n getParagraphs(): Paragraph[] {\n return this.getAllParagraphs();\n }\n\n // ============================================================================\n // Direct Index Access & Navigation Helpers\n // ============================================================================\n\n /**\n * Gets a paragraph at a specific index from top-level body elements\n * @param index - The index of the paragraph (0-based)\n * @returns The paragraph at that index, or undefined if out of bounds\n */\n getParagraphAt(index: number): Paragraph | undefined {\n const paragraphs = this.bodyElements.filter((el): el is Paragraph => el instanceof Paragraph);\n return paragraphs[index];\n }\n\n /**\n * Gets a table at a specific index from top-level body elements\n * @param index - The index of the table (0-based)\n * @returns The table at that index, or undefined if out of bounds\n */\n getTableAt(index: number): Table | undefined {\n const tables = this.bodyElements.filter((el): el is Table => el instanceof Table);\n return tables[index];\n }\n\n /**\n * Gets a body element at a specific index\n * @param index - The index of the element (0-based)\n * @returns The body element at that index, or undefined if out of bounds\n */\n getBodyElementAt(index: number): BodyElement | undefined {\n return this.bodyElements[index];\n }\n\n /**\n * Gets the index of a paragraph within the top-level body elements\n * @param paragraph - The paragraph to find\n * @returns The index of the paragraph, or -1 if not found\n */\n getParagraphIndex(paragraph: Paragraph): number {\n const paragraphs = this.bodyElements.filter((el): el is Paragraph => el instanceof Paragraph);\n return paragraphs.indexOf(paragraph);\n }\n\n /**\n * Gets the index of a table within the top-level body elements\n * @param table - The table to find\n * @returns The index of the table, or -1 if not found\n */\n getTableIndex(table: Table): number {\n const tables = this.bodyElements.filter((el): el is Table => el instanceof Table);\n return tables.indexOf(table);\n }\n\n /**\n * Gets the next paragraph after the given paragraph\n * @param paragraph - The current paragraph\n * @returns The next paragraph, or undefined if none exists\n */\n getNextParagraph(paragraph: Paragraph): Paragraph | undefined {\n const paragraphs = this.bodyElements.filter((el): el is Paragraph => el instanceof Paragraph);\n const index = paragraphs.indexOf(paragraph);\n return index >= 0 && index < paragraphs.length - 1 ? paragraphs[index + 1] : undefined;\n }\n\n /**\n * Gets the previous paragraph before the given paragraph\n * @param paragraph - The current paragraph\n * @returns The previous paragraph, or undefined if none exists\n */\n getPreviousParagraph(paragraph: Paragraph): Paragraph | undefined {\n const paragraphs = this.bodyElements.filter((el): el is Paragraph => el instanceof Paragraph);\n const index = paragraphs.indexOf(paragraph);\n return index > 0 ? paragraphs[index - 1] : undefined;\n }\n\n /**\n * Gets all tables in the document recursively\n * Includes tables inside SDTs\n * @returns Array of all tables\n */\n getAllTables(): Table[] {\n const result: Table[] = [];\n this.walkElements((element) => {\n if (element instanceof Table) {\n result.push(element);\n }\n });\n return result;\n }\n\n /**\n * Gets all Table of Contents elements in the document\n * @returns Array of TableOfContentsElement\n */\n getTableOfContentsElements(): TableOfContentsElement[] {\n return this.bodyElements.filter(\n (el): el is TableOfContentsElement => el instanceof TableOfContentsElement\n );\n }\n\n /**\n * Adds a body element (paragraph, table, SDT, etc.) to the document\n * @param element - The body element to add\n * @returns This document for chaining\n */\n addBodyElement(element: BodyElement): this {\n this.bodyElements.push(element);\n return this;\n }\n\n /**\n * Gets all body elements (paragraphs and tables)\n * @returns Array of body elements\n */\n getBodyElements(): BodyElement[] {\n return [...this.bodyElements];\n }\n\n /**\n * Gets the number of paragraphs\n * @returns Number of paragraphs\n */\n getParagraphCount(): number {\n return this.getAllParagraphs().length;\n }\n\n /**\n * Gets the number of tables\n * @returns Number of tables\n */\n getTableCount(): number {\n return this.getTables().length;\n }\n\n /**\n * Removes all body elements from the document\n *\n * Clears all paragraphs, tables, TOCs, and other elements from the document body.\n * This does NOT affect headers, footers, styles, or document properties.\n *\n * @returns This document instance for method chaining\n *\n * @example\n * ```typescript\n * // Clear and rebuild document content\n * doc.clearParagraphs();\n * doc.createParagraph('Fresh start');\n * ```\n */\n clearParagraphs(): this {\n this.bodyElements = [];\n return this;\n }\n\n /**\n * Sets or updates document metadata properties\n *\n * Updates document metadata that appears in File > Properties in Word.\n * Properties are validated and sanitized before storing. Existing properties\n * are merged with new values.\n *\n * @param properties - Document metadata properties\n * @param properties.title - Document title\n * @param properties.subject - Document subject\n * @param properties.creator - Document author/creator\n * @param properties.keywords - Comma-separated keywords\n * @param properties.description - Document description\n * @param properties.category - Document category\n * @param properties.company - Company name\n * @param properties.customProperties - Custom key-value properties\n * @returns This document instance for method chaining\n *\n * @example\n * ```typescript\n * doc.setProperties({\n * title: 'Annual Report 2024',\n * creator: 'Finance Department',\n * company: 'Acme Corp',\n * keywords: 'annual, report, financial'\n * });\n * ```\n */\n setProperties(properties: DocumentProperties): this {\n // Validate and sanitize properties before storing\n const validated = DocumentValidator.validateProperties(properties);\n this.properties = { ...this.properties, ...validated };\n return this;\n }\n\n /**\n * Gets all document metadata properties\n *\n * Returns a copy of all document properties including core properties\n * (title, creator, etc.) and custom properties.\n *\n * @returns Copy of the document properties object\n *\n * @example\n * ```typescript\n * const props = doc.getProperties();\n * console.log(`Title: ${props.title}`);\n * console.log(`Author: ${props.creator}`);\n * ```\n */\n getProperties(): DocumentProperties {\n return { ...this.properties };\n }\n\n /**\n * Sets document property value\n * @param key - Property key\n * @param value - Property value\n * @returns This document for chaining\n */\n setProperty(\n key: keyof DocumentProperties,\n value: DocumentProperties[keyof DocumentProperties]\n ): this {\n this.properties[key] = value as never;\n return this;\n }\n\n /**\n * Sets the document title\n * @param title - Document title\n * @returns This document for chaining\n */\n setTitle(title: string): this {\n this.properties.title = title;\n return this;\n }\n\n /**\n * Sets the document subject\n * @param subject - Document subject\n * @returns This document for chaining\n */\n setSubject(subject: string): this {\n this.properties.subject = subject;\n return this;\n }\n\n /**\n * Sets the document creator/author\n * @param creator - Document creator\n * @returns This document for chaining\n */\n setCreator(creator: string): this {\n this.properties.creator = creator;\n return this;\n }\n\n /**\n * Sets the document author (alias for setCreator)\n * @param author - Document author name\n * @returns This document for chaining\n *\n * @example\n * ```typescript\n * doc.setAuthor('John Smith');\n * ```\n */\n setAuthor(author: string): this {\n return this.setCreator(author);\n }\n\n /**\n * Sets the document keywords\n * @param keywords - Document keywords (comma-separated)\n * @returns This document for chaining\n */\n setKeywords(keywords: string): this {\n this.properties.keywords = keywords;\n return this;\n }\n\n /**\n * Sets the document description\n * @param description - Document description\n * @returns This document for chaining\n */\n setDescription(description: string): this {\n this.properties.description = description;\n return this;\n }\n\n /**\n * Sets the document category\n * @param category - Document category\n * @returns This document for chaining\n */\n setCategory(category: string): this {\n this.properties.category = category;\n return this;\n }\n\n /**\n * Sets the document content status\n * @param status - Content status (e.g., \"Draft\", \"Final\", \"In Review\")\n * @returns This document for chaining\n */\n setContentStatus(status: string): this {\n this.properties.contentStatus = status;\n return this;\n }\n\n /**\n * Sets the application name\n * @param application - Application name\n * @returns This document for chaining\n */\n setApplication(application: string): this {\n this.properties.application = application;\n this._appPropsModified = true;\n return this;\n }\n\n /**\n * Sets the application version\n * @param version - Application version\n * @returns This document for chaining\n */\n setAppVersion(version: string): this {\n this.properties.appVersion = version;\n this._appPropsModified = true;\n return this;\n }\n\n /**\n * Sets the company name\n * @param company - Company name\n * @returns This document for chaining\n */\n setCompany(company: string): this {\n this.properties.company = company;\n this._appPropsModified = true;\n return this;\n }\n\n /**\n * Sets the manager name\n * @param manager - Manager name\n * @returns This document for chaining\n */\n setManager(manager: string): this {\n this.properties.manager = manager;\n this._appPropsModified = true;\n return this;\n }\n\n /**\n * Sets a custom property\n * @param name - Property name\n * @param value - Property value (string, number, boolean, or Date)\n * @returns This document for chaining\n */\n setCustomProperty(name: string, value: string | number | boolean | Date): this {\n if (!this.properties.customProperties) {\n this.properties.customProperties = {};\n }\n this.properties.customProperties[name] = value;\n return this;\n }\n\n /**\n * Sets multiple custom properties\n * @param properties - Object containing custom properties\n * @returns This document for chaining\n */\n setCustomProperties(properties: Record<string, string | number | boolean | Date>): this {\n this.properties.customProperties = { ...properties };\n return this;\n }\n\n /**\n * Gets a custom property value\n * @param name - Property name\n * @returns Property value or undefined\n */\n getCustomProperty(name: string): string | number | boolean | Date | undefined {\n return this.properties.customProperties?.[name];\n }\n\n /**\n * Enables or disables automatic TOC population during save\n *\n * When enabled, the save() and toBuffer() methods will automatically\n * populate Table of Contents fields with hyperlinked entries based on\n * the document's heading structure.\n *\n * This is critical for documents where the in-memory model doesn't preserve\n * the complete TOC field structure. When save() regenerates document.xml,\n * the TOC field markers (begin/separate/end) may be lost. Enabling this\n * option ensures the TOC is rebuilt with proper field structure after\n * XML regeneration.\n *\n * @param enabled - Whether to auto-populate TOCs (default: false)\n * @returns This document instance for method chaining\n *\n * @example\n * ```typescript\n * const doc = await Document.load('input.docx');\n * doc.setAutoPopulateTOCs(true);\n * await doc.save('output.docx');\n * // TOC will have proper field structure with working \"Update Field\" in Word\n * ```\n */\n setAutoPopulateTOCs(enabled: boolean): this {\n this.autoPopulateTOCs = enabled;\n return this;\n }\n\n /**\n * Saves the document to a file path\n *\n * Generates all required XML parts, processes images and relationships, validates\n * the document structure, and writes the complete DOCX package to disk.\n * Uses atomic save pattern (temp file + rename) to prevent corruption on failure.\n *\n * @param filePath - Absolute or relative path where the DOCX file will be saved\n *\n * @throws Error if validation fails, memory limits exceeded, or file system error occurs\n * @throws Error if image count or size limits are exceeded\n *\n * @example\n * ```typescript\n * const doc = Document.create();\n * doc.createParagraph('Hello World');\n * await doc.save('output.docx');\n * ```\n *\n * @example\n * ```typescript\n * // Save with TOC auto-population\n * doc.setAutoPopulateTOCs(true);\n * doc.createTableOfContents();\n * doc.createParagraph('Chapter 1').setStyle('Heading1');\n * await doc.save('document-with-toc.docx');\n * ```\n */\n /**\n * Common preparation logic shared by save() and toBuffer().\n * Validates, loads images, flushes changes, accepts revisions, and updates all XML parts.\n */\n private async prepareSave(): Promise<void> {\n // Validate before saving to prevent data loss\n this.validator.validateBeforeSave(this.bodyElements);\n\n // Check memory usage before starting\n this.validator.checkMemoryThreshold();\n\n // Load all image data before saving (now async)\n await this.imageManager.loadAllImageData();\n\n // Check memory again after loading images\n this.validator.checkMemoryThreshold();\n\n // Check document size and warn if too large\n const sizeInfo = this.validator.estimateSize(this.bodyElements, this.imageManager);\n if (sizeInfo.warning) {\n this.logger.warn(sizeInfo.warning, {\n totalMB: sizeInfo.totalEstimatedMB,\n paragraphs: sizeInfo.paragraphs,\n tables: sizeInfo.tables,\n images: sizeInfo.images,\n });\n }\n\n // Clear preserve flags before final save (they're runtime-only)\n this.clearAllPreserveFlags();\n\n this.processHyperlinks();\n\n // Flush pending tracked changes to create Revision objects before XML generation\n if (this.trackChangesEnabled && this.trackingContext) {\n this.flushPendingChanges();\n }\n\n // Consolidate adjacent revisions to match Word's behavior\n // This merges adjacent same-author revisions within a 1-second window,\n // preventing the \"random insertions and deletions\" problem in Word\n if (this.trackChangesEnabled) {\n this.consolidateAllRevisions();\n }\n\n // Accept all revisions if auto-accept is enabled\n // This MUST happen after flushPendingChanges() to catch all revisions\n // but BEFORE updateDocumentXml() so accepted changes are serialized correctly\n if (this.acceptRevisionsBeforeSave) {\n await this.acceptAllRevisions();\n this.acceptRevisionsBeforeSave = false; // Reset flag after acceptance\n }\n\n // Validate numbering references before generating XML to prevent corruption\n // from orphaned numId references pointing to removed definitions\n this.validateNumberingReferences();\n\n // Validate bookmark pairs — add missing bookmarkEnd markers and remove orphaned ends\n // This prevents Word \"unreadable content\" errors from unbalanced bookmark pairs\n this.validateBookmarkPairs();\n\n // Ensure unique IDs for revisions and drawing elements before serialization\n this.assignUniqueIds();\n\n // Only regenerate document.xml if we haven't manually stripped tracked changes\n // acceptAllRevisionsRawXml() sets skipDocumentXmlRegeneration to preserve the cleaned raw XML\n if (this.skipDocumentXmlRegeneration) {\n this.logger.warn(\n 'skipDocumentXmlRegeneration is set: in-memory content modifications will NOT be saved. ' +\n 'Use acceptAllRevisions() instead of acceptAllRevisionsRawXml() if you need to modify the document after accepting revisions.'\n );\n } else {\n this.updateDocumentXml();\n }\n\n // Post-process document.xml for sanitization (field flattening, RSID cleanup)\n // Must run AFTER updateDocumentXml() so we have the final XML,\n // and BEFORE updateSettingsXml() so RSID filtering affects the merge\n this._postProcessDocumentXml();\n\n this.updateStylesXml();\n this.updateNumberingXml();\n this.updateSettingsXml();\n this.updateCoreProps();\n this.updateAppProps();\n this.updateWebSettingsXml();\n this.saveImages();\n this.saveHeaders();\n this.saveFooters();\n this.saveComments();\n this.saveFootnotes();\n this.saveEndnotes();\n this.updatePeopleXml();\n this.saveCustomProperties();\n this.updateRelationships();\n this.updateContentTypesWithImagesHeadersFootersAndComments();\n }\n\n async save(filePath: string): Promise<void> {\n const logger = getLogger();\n logger.info('Saving document', { path: filePath, paragraphs: this.getParagraphCount() });\n\n // Use atomic save pattern: save to temp file, then rename\n // This prevents partial/corrupted saves if operation fails mid-way\n const tempPath = `${filePath}.tmp.${Date.now()}`;\n\n // Track whether save succeeded for proper cleanup\n let saveSucceeded = false;\n\n // Create state snapshot before any modifications for rollback on failure\n this.createSaveStateSnapshot();\n\n try {\n await this.prepareSave();\n\n // Save to temporary file first\n await this.zipHandler.save(tempPath);\n\n // Auto-populate TOCs if enabled\n if (this.autoPopulateTOCs) {\n await this.populateTOCsInFile(tempPath);\n }\n\n // Atomic rename - only if save succeeded\n const { promises: fs } = await import('fs');\n await fs.rename(tempPath, filePath);\n\n // Mark save as successful - image data can now be released safely\n saveSucceeded = true;\n this.clearSaveStateSnapshot();\n logger.info('Document saved', { path: filePath });\n } catch (error: unknown) {\n // Restore state snapshot on failure - allows retry without data loss\n this.restoreSaveStateSnapshot();\n\n // Cleanup temporary file on error\n try {\n const { promises: fs } = await import('fs');\n await fs.unlink(tempPath);\n } catch (cleanupErr) {\n logger.debug('Failed to clean up temp file', { tempPath, error: String(cleanupErr) });\n }\n throw error; // Re-throw original error\n } finally {\n // Only release image data if save succeeded\n // On failure, keep images loaded so user can retry save without reloading\n if (saveSucceeded) {\n this.imageManager.releaseAllImageData();\n }\n }\n }\n\n /**\n * Generates the document as an in-memory Buffer\n *\n * Creates the complete DOCX package in memory without writing to disk.\n * Useful for streaming documents in HTTP responses, storing in databases,\n * or processing through additional systems.\n *\n * @returns Promise that resolves to a Buffer containing the complete DOCX file\n *\n * @throws Error if validation fails, memory limits exceeded, or document is invalid\n *\n * @example\n * ```typescript\n * // Generate and send via HTTP\n * const doc = Document.create();\n * doc.createParagraph('Content');\n * const buffer = await doc.toBuffer();\n * res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document');\n * res.send(buffer);\n * ```\n *\n * @example\n * ```typescript\n * // Save to database\n * const buffer = await doc.toBuffer();\n * await db.documents.insert({ name: 'report.docx', data: buffer });\n * ```\n */\n async toBuffer(): Promise<Buffer> {\n const logger = getLogger();\n logger.info('Generating document buffer', { paragraphs: this.getParagraphCount() });\n\n // Track whether generation succeeded for proper cleanup\n let generateSucceeded = false;\n\n // Create state snapshot before any modifications for rollback on failure\n this.createSaveStateSnapshot();\n\n try {\n await this.prepareSave();\n\n // Auto-populate TOCs if enabled\n if (this.autoPopulateTOCs) {\n const docXml = this.zipHandler.getFileAsString('word/document.xml');\n if (docXml) {\n const populatedXml = this.populateAllTOCsInXML(docXml);\n if (populatedXml !== docXml) {\n this.zipHandler.updateFile('word/document.xml', populatedXml);\n }\n }\n }\n\n const buffer = await this.zipHandler.toBuffer();\n\n // Mark generation as successful\n generateSucceeded = true;\n this.clearSaveStateSnapshot();\n logger.info('Document buffer generated', { bufferSize: buffer.length });\n return buffer;\n } catch (error: unknown) {\n // Restore state snapshot on failure - allows retry without data loss\n this.restoreSaveStateSnapshot();\n throw error;\n } finally {\n // Only release image data if generation succeeded\n // On failure, keep images loaded so user can retry without reloading\n if (generateSucceeded) {\n this.imageManager.releaseAllImageData();\n }\n }\n }\n\n /**\n * Updates the document.xml file with current paragraphs\n */\n private updateDocumentXml(): void {\n let xml = this.generator.generateDocumentXml(\n this.bodyElements,\n this.section,\n this.namespaces,\n this._documentBackground\n );\n\n // Sync TOC field instructions with actual style names\n // This ensures TOC \\t switches reference styles by their current names\n xml = this.syncTOCFieldInstructions(xml);\n\n this.zipHandler.updateFile(DOCX_PATHS.DOCUMENT, xml);\n }\n\n /**\n * Post-processes document.xml after generation for sanitization tasks.\n * Runs only when explicitly enabled via flattenFieldCodes(), stripOrphanRSIDs(), or clearDirectSpacingForStyles().\n * Zero overhead when neither flag is set.\n *\n * IMPORTANT — INTENTIONAL REMOVAL BEHAVIOR (NOT A BUG):\n * These sanitization methods deliberately remove XML elements and attributes from\n * the document. This is their entire purpose — they clean up bloat and redundancy:\n *\n * - flattenFieldCodes(): Removes INCLUDEPICTURE field markup (fldChar, instrText runs).\n * Only the w:drawing content is preserved. The field wrapper is bloat from Outlook\n * copy-paste that causes Word to freeze.\n *\n * - stripOrphanRSIDs(): Removes RSIDs from settings.xml that are not referenced in\n * document.xml. Orphan RSIDs accumulate over editing sessions and can account for\n * 80%+ of settings.xml size. They serve no purpose.\n *\n * - clearDirectSpacingForStyles(): Removes direct w:spacing overrides from paragraphs\n * whose style already defines spacing. The direct overrides prevent style-based\n * spacing from taking effect.\n *\n * These methods are explicitly called by user code — they never run automatically.\n * The elements they remove are genuinely unwanted. Do not \"fix\" these removals.\n *\n * @private\n */\n private _postProcessDocumentXml(): void {\n if (\n !this._flattenIncludePictureFields &&\n !this._stripOrphanRSIDs &&\n !this._clearDirectSpacingStyles\n ) {\n return;\n }\n\n let docXml = this.zipHandler.getFileAsString(DOCX_PATHS.DOCUMENT);\n if (!docXml) {\n return;\n }\n\n // Step 1: Flatten INCLUDEPICTURE fields\n if (this._flattenIncludePictureFields) {\n docXml = this._flattenIncludePictureFieldsInXml(docXml);\n this._flattenIncludePictureFields = false; // Reset after use\n }\n\n // Step 2: Strip orphan RSIDs (uses final document.xml to determine which are referenced)\n if (this._stripOrphanRSIDs) {\n this._stripOrphanRSIDsFromSettings(docXml);\n this._stripOrphanRSIDs = false; // Reset after use\n }\n\n // Step 3: Clear direct w:spacing from styled paragraphs\n if (this._clearDirectSpacingStyles && this._clearDirectSpacingStyles.length > 0) {\n docXml = this._clearDirectSpacingFromStyledParagraphs(docXml, this._clearDirectSpacingStyles);\n this._clearDirectSpacingStyles = null;\n }\n\n this.zipHandler.updateFile(DOCX_PATHS.DOCUMENT, docXml);\n }\n\n /**\n * Strips INCLUDEPICTURE field markup from document.xml while preserving\n * the field result content (w:drawing elements with embedded images).\n *\n * Uses a token-based state machine to track field depth and identify\n * INCLUDEPICTURE fields. Removes the w:r elements containing fldChar\n * begin/separate/end and instrText, preserving everything else.\n *\n * @param xml - The document.xml content\n * @returns Modified XML with INCLUDEPICTURE field markup removed\n * @private\n */\n private _flattenIncludePictureFieldsInXml(xml: string): string {\n // Phase 1: Scan for all fldChar and instrText positions to build field structure\n interface FieldToken {\n type: 'begin' | 'separate' | 'end';\n /** Start of the containing <w:r> element */\n runStart: number;\n /** End of the containing </w:r> (exclusive) */\n runEnd: number;\n }\n\n interface InstrToken {\n /** The instrText content */\n text: string;\n /** Start of the containing <w:r> element */\n runStart: number;\n /** End of the containing </w:r> (exclusive) */\n runEnd: number;\n }\n\n // Find all <w:r>...</w:r> runs that contain fldChar or instrText\n const fieldTokens: FieldToken[] = [];\n const instrTokens: InstrToken[] = [];\n\n // Match all <w:r> elements (non-greedy, handling nested elements)\n const runRegex = /<w:r[\\s>]/g;\n let runMatch: RegExpExecArray | null;\n\n while ((runMatch = runRegex.exec(xml)) !== null) {\n const runStart = runMatch.index;\n\n // Find the closing </w:r> tag, accounting for depth\n const runEnd = this._findClosingWrTag(xml, runStart);\n if (runEnd === -1) continue;\n\n const runContent = xml.substring(runStart, runEnd);\n\n // Check for fldChar\n const fldCharMatch = /<w:fldChar\\s+w:fldCharType\\s*=\\s*\"(begin|separate|end)\"/.exec(\n runContent\n );\n if (fldCharMatch) {\n fieldTokens.push({\n type: fldCharMatch[1] as 'begin' | 'separate' | 'end',\n runStart,\n runEnd,\n });\n }\n\n // Check for instrText\n const instrMatch = /<w:instrText[^>]*>([\\s\\S]*?)<\\/w:instrText>/.exec(runContent);\n if (instrMatch) {\n instrTokens.push({\n text: instrMatch[1]!.trim(),\n runStart,\n runEnd,\n });\n }\n }\n\n // Phase 2: Use a depth-tracking state machine to identify INCLUDEPICTURE fields\n // and collect the runs to remove\n const runsToRemove: { start: number; end: number }[] = [];\n const fieldStack: {\n tokenIndex: number;\n instrRuns: { start: number; end: number }[];\n separateRun?: { start: number; end: number };\n isIncludePicture: boolean;\n }[] = [];\n\n let instrTokenIdx = 0;\n\n for (let i = 0; i < fieldTokens.length; i++) {\n const token = fieldTokens[i]!;\n\n if (token.type === 'begin') {\n fieldStack.push({\n tokenIndex: i,\n instrRuns: [],\n isIncludePicture: false,\n });\n const stackTop = fieldStack[fieldStack.length - 1]!;\n\n // Collect any instrText runs between this begin and the next fldChar\n const nextFldCharIdx = i + 1 < fieldTokens.length ? fieldTokens[i + 1]!.runStart : Infinity;\n while (\n instrTokenIdx < instrTokens.length &&\n instrTokens[instrTokenIdx]!.runStart < nextFldCharIdx &&\n instrTokens[instrTokenIdx]!.runStart > token.runStart\n ) {\n const instr = instrTokens[instrTokenIdx]!;\n stackTop.instrRuns.push({ start: instr.runStart, end: instr.runEnd });\n\n // Check if this is an INCLUDEPICTURE instruction\n if (/^\\s*INCLUDEPICTURE\\b/i.test(instr.text)) {\n stackTop.isIncludePicture = true;\n }\n instrTokenIdx++;\n }\n } else if (token.type === 'separate') {\n if (fieldStack.length > 0) {\n const current = fieldStack[fieldStack.length - 1]!;\n current.separateRun = { start: token.runStart, end: token.runEnd };\n\n // Also collect instrText runs between begin and separate that we may have missed\n // (when instrText spans multiple runs between begin and separate)\n const beginToken = fieldTokens[current.tokenIndex]!;\n while (\n instrTokenIdx < instrTokens.length &&\n instrTokens[instrTokenIdx]!.runStart > beginToken.runStart &&\n instrTokens[instrTokenIdx]!.runStart < token.runStart\n ) {\n const instr = instrTokens[instrTokenIdx]!;\n current.instrRuns.push({ start: instr.runStart, end: instr.runEnd });\n if (/^\\s*INCLUDEPICTURE\\b/i.test(instr.text)) {\n current.isIncludePicture = true;\n }\n instrTokenIdx++;\n }\n }\n } else if (token.type === 'end') {\n if (fieldStack.length > 0) {\n const field = fieldStack.pop()!;\n if (field.isIncludePicture) {\n // Remove: begin run, instrText runs, separate run, end run\n const beginFieldToken = fieldTokens[field.tokenIndex]!;\n runsToRemove.push({ start: beginFieldToken.runStart, end: beginFieldToken.runEnd });\n for (const instrRun of field.instrRuns) {\n runsToRemove.push(instrRun);\n }\n if (field.separateRun) {\n runsToRemove.push(field.separateRun);\n }\n runsToRemove.push({ start: token.runStart, end: token.runEnd });\n }\n }\n }\n }\n\n if (runsToRemove.length === 0) {\n return xml;\n }\n\n // Phase 3: Remove runs in reverse order to preserve offsets\n runsToRemove.sort((a, b) => b.start - a.start);\n\n // Deduplicate overlapping ranges\n const uniqueRuns: { start: number; end: number }[] = [];\n for (const run of runsToRemove) {\n const isDuplicate = uniqueRuns.some((u) => u.start === run.start && u.end === run.end);\n if (!isDuplicate) {\n uniqueRuns.push(run);\n }\n }\n\n let result = xml;\n for (const run of uniqueRuns) {\n result = result.substring(0, run.start) + result.substring(run.end);\n }\n\n return result;\n }\n\n /**\n * Finds the closing </w:r> tag for a <w:r> element starting at the given position,\n * accounting for nested depth (though w:r shouldn't nest, this is defensive).\n * @private\n */\n private _findClosingWrTag(xml: string, startPos: number): number {\n let depth = 0;\n const tagRegex = /<(\\/?)w:r([\\s>\\/])/g;\n tagRegex.lastIndex = startPos;\n\n let match: RegExpExecArray | null;\n while ((match = tagRegex.exec(xml)) !== null) {\n const isClosing = match[1] === '/';\n\n if (!isClosing) {\n // Check for self-closing\n const restOfTag = xml.substring(match.index, xml.indexOf('>', match.index) + 1);\n if (restOfTag.endsWith('/>')) {\n if (depth === 0 && match.index === startPos) {\n return xml.indexOf('>', match.index) + 1;\n }\n continue;\n }\n depth++;\n } else {\n depth--;\n if (depth === 0) {\n return xml.indexOf('>', match.index) + 1;\n }\n }\n }\n return -1;\n }\n\n /**\n * Removes direct w:spacing elements from w:pPr blocks that contain a w:pStyle\n * matching one of the specified style IDs.\n *\n * This operates on raw XML so it works alongside skipDocumentXmlRegeneration.\n * Only affects paragraphs with an explicit w:pStyle — paragraphs without a\n * style reference are left unchanged (they need direct formatting).\n * @private\n */\n private _clearDirectSpacingFromStyledParagraphs(xml: string, styleIds: string[]): string {\n const styleSet = new Set(styleIds);\n let cleared = 0;\n\n // Use depth-aware matching to find top-level <w:pPr>...</w:pPr> blocks.\n // A simple non-greedy regex would incorrectly terminate at nested </w:pPr>\n // inside <w:pPrChange> (ECMA-376 §17.13.5.29), producing malformed XML.\n const pPrOpenTag = '<w:pPr>';\n const pPrCloseTag = '</w:pPr>';\n let searchPos = 0;\n let result = '';\n let lastCopyPos = 0;\n\n while (searchPos < xml.length) {\n const openIdx = xml.indexOf(pPrOpenTag, searchPos);\n if (openIdx === -1) break;\n\n // Find the matching close tag using depth counting\n let depth = 1;\n let scanPos = openIdx + pPrOpenTag.length;\n while (depth > 0 && scanPos < xml.length) {\n const nextOpen = xml.indexOf(pPrOpenTag, scanPos);\n const nextClose = xml.indexOf(pPrCloseTag, scanPos);\n if (nextClose === -1) break; // Malformed XML — bail out\n\n if (nextOpen !== -1 && nextOpen < nextClose) {\n depth++;\n scanPos = nextOpen + pPrOpenTag.length;\n } else {\n depth--;\n if (depth === 0) {\n // Found the matching close tag\n const innerStart = openIdx + pPrOpenTag.length;\n const innerEnd = nextClose;\n const inner = xml.substring(innerStart, innerEnd);\n\n // Protect nested blocks (w:pPrChange, w:rPr) from modification.\n // w:pPrChange contains a child w:pPr with historical property values.\n // w:rPr may contain w:spacing for paragraph mark character spacing.\n // Protection must run BEFORE style check so we don't match styles\n // inside pPrChange (which represent historical, not current, state).\n const protectedBlocks: string[] = [];\n // Protect pPrChange and rPr blocks separately to prevent cross-tag\n // mismatch (e.g., <w:rPr> matching </w:pPrChange> in the alternation).\n let safeInner = inner.replace(/<w:pPrChange\\b[\\s\\S]*?<\\/w:pPrChange>/g, (block) => {\n protectedBlocks.push(block);\n return `\\x00PROTECTED_${protectedBlocks.length - 1}\\x00`;\n });\n safeInner = safeInner.replace(/<w:rPr\\b[\\s\\S]*?<\\/w:rPr>/g, (block) => {\n protectedBlocks.push(block);\n return `\\x00PROTECTED_${protectedBlocks.length - 1}\\x00`;\n });\n\n // Check if this pPr contains a pStyle matching our list\n // (checked against safeInner to avoid matching styles inside pPrChange)\n const styleMatch = /<w:pStyle\\s+w:val=\"([^\"]+)\"/.exec(safeInner);\n if (styleMatch && styleSet.has(styleMatch[1]!)) {\n // Remove direct <w:spacing .../> (self-closing) from the safe region\n let cleaned = safeInner.replace(/<w:spacing\\b[^/]*\\/>\\s*/g, '');\n\n if (cleaned !== safeInner) {\n // Restore protected blocks\n for (let i = 0; i < protectedBlocks.length; i++) {\n cleaned = cleaned.replace(`\\x00PROTECTED_${i}\\x00`, protectedBlocks[i]!);\n }\n cleared++;\n result += xml.substring(lastCopyPos, openIdx);\n result += `${pPrOpenTag}${cleaned}${pPrCloseTag}`;\n lastCopyPos = nextClose + pPrCloseTag.length;\n }\n }\n\n scanPos = nextClose + pPrCloseTag.length;\n } else {\n scanPos = nextClose + pPrCloseTag.length;\n }\n }\n }\n\n searchPos = scanPos;\n }\n\n // Append remaining content\n if (lastCopyPos === 0) {\n // No modifications made — return original string (avoids allocation)\n if (cleared === 0) return xml;\n }\n result += xml.substring(lastCopyPos);\n\n if (cleared > 0) {\n this.logger.info(`Cleared direct w:spacing from ${cleared} styled paragraphs`);\n }\n return result;\n }\n\n /**\n * Scans document.xml for all w:rsid* attribute values and filters\n * this.rsids to only keep referenced ones + rsidRoot.\n * @private\n */\n private _stripOrphanRSIDsFromSettings(documentXml: string): void {\n // Collect all rsid values referenced in document.xml\n // Matches: w:rsidR=\"00AABB11\", w:rsidRPr=\"...\", w:rsidRDefault=\"...\",\n // w:rsidP=\"...\", w:rsidDel=\"...\", w:rsidSect=\"...\", etc.\n const referencedRsids = new Set<string>();\n const rsidAttrRegex = /w:rsid\\w*\\s*=\\s*\"([0-9A-Fa-f]{8})\"/g;\n let rsidMatch: RegExpExecArray | null;\n\n while ((rsidMatch = rsidAttrRegex.exec(documentXml)) !== null) {\n referencedRsids.add(rsidMatch[1]!.toUpperCase());\n }\n\n // Always preserve rsidRoot (required by spec even if not in document.xml)\n if (this.rsidRoot) {\n referencedRsids.add(this.rsidRoot);\n }\n\n // Filter: keep only referenced RSIDs\n const originalSize = this.rsids.size;\n const newRsids = new Set<string>();\n for (const rsid of this.rsids) {\n if (referencedRsids.has(rsid)) {\n newRsids.add(rsid);\n }\n }\n this.rsids = newRsids;\n\n // Mark settings as modified so mergeSettingsWithOriginal() runs the merge path\n if (newRsids.size !== originalSize) {\n this._settingsModified = true;\n }\n }\n\n /**\n * Updates the core properties with current values\n */\n private updateCoreProps(): void {\n if (\n this._removedParts.has(DOCX_PATHS.CORE_PROPS) ||\n this._removedParts.has('docProps/core.xml')\n )\n return;\n const xml = this.generator.generateCoreProps(this.properties);\n this.zipHandler.updateFile(DOCX_PATHS.CORE_PROPS, xml);\n }\n\n /**\n * Updates the app properties with current values\n * Uses preservation strategy to maintain original metadata when unmodified\n */\n private updateAppProps(): void {\n if (this._removedParts.has(DOCX_PATHS.APP_PROPS) || this._removedParts.has('docProps/app.xml'))\n return;\n if (this._originalAppPropsXml && !this._appPropsModified) {\n // Preserve original as-is — no changes to app properties\n return;\n }\n if (this._originalAppPropsXml && this._appPropsModified) {\n // Merge: update only changed fields in original XML\n const mergedXml = this.mergeAppPropsWithOriginal();\n this.zipHandler.updateFile(DOCX_PATHS.APP_PROPS, mergedXml);\n } else {\n // New document — generate from scratch\n const xml = this.generator.generateAppProps(this.properties);\n this.zipHandler.updateFile(DOCX_PATHS.APP_PROPS, xml);\n }\n }\n\n /**\n * Merges modified app properties with the original app.xml\n * Updates only fields that have been programmatically changed,\n * preserving HeadingPairs, TotalTime, Pages, Words, etc.\n */\n private mergeAppPropsWithOriginal(): string {\n if (!this._originalAppPropsXml) {\n return this.generator.generateAppProps(this.properties);\n }\n\n let xml = this._originalAppPropsXml;\n\n // Update Company if changed\n if (this.properties.company !== undefined) {\n const escaped = XMLBuilder.sanitizeXmlContent(this.properties.company);\n if (xml.includes('<Company>')) {\n xml = xml.replace(/<Company>[^<]*<\\/Company>/, `<Company>${escaped}</Company>`);\n } else if (xml.includes('<Company/>')) {\n xml = xml.replace(/<Company\\/>/, `<Company>${escaped}</Company>`);\n }\n }\n\n // Update Application if changed\n if (this.properties.application !== undefined) {\n const escaped = XMLBuilder.sanitizeXmlContent(this.properties.application);\n if (xml.includes('<Application>')) {\n xml = xml.replace(\n /<Application>[^<]*<\\/Application>/,\n `<Application>${escaped}</Application>`\n );\n }\n }\n\n // Update AppVersion if changed\n if (this.properties.appVersion !== undefined) {\n const escaped = XMLBuilder.sanitizeXmlContent(this.properties.appVersion);\n if (xml.includes('<AppVersion>')) {\n xml = xml.replace(/<AppVersion>[^<]*<\\/AppVersion>/, `<AppVersion>${escaped}</AppVersion>`);\n }\n }\n\n // Update Manager if changed\n if (this.properties.manager !== undefined) {\n const escaped = XMLBuilder.sanitizeXmlContent(this.properties.manager);\n if (xml.includes('<Manager>')) {\n xml = xml.replace(/<Manager>[^<]*<\\/Manager>/, `<Manager>${escaped}</Manager>`);\n }\n }\n\n return xml;\n }\n\n /**\n * Parse webSettings.xml into in-memory state.\n * Uses regex matching consistent with parseSettingsFromXml().\n */\n private parseWebSettingsFromXml(xml: string): void {\n this._webSettings.optimizeForBrowser = /<w:optimizeForBrowser\\b/.test(xml);\n this._webSettings.allowPNG = /<w:allowPNG\\b/.test(xml);\n this._webSettings.relyOnVML = /<w:relyOnVML\\b/.test(xml);\n this._webSettings.doNotRelyOnCSS = /<w:doNotRelyOnCSS\\b/.test(xml);\n this._webSettings.doNotSaveAsSingleFile = /<w:doNotSaveAsSingleFile\\b/.test(xml);\n this._webSettings.doNotOrganizeInFolder = /<w:doNotOrganizeInFolder\\b/.test(xml);\n this._webSettings.doNotUseLongFileNames = /<w:doNotUseLongFileNames\\b/.test(xml);\n\n const pixelsMatch = /<w:pixelsPerInch\\b[^>]*w:val\\s*=\\s*\"(\\d+)\"/.exec(xml);\n this._webSettings.pixelsPerInch = pixelsMatch?.[1] ? parseInt(pixelsMatch[1], 10) : undefined;\n\n const screenMatch = /<w:targetScreenSz\\b[^>]*w:val\\s*=\\s*\"([^\"]*)\"/.exec(xml);\n this._webSettings.targetScreenSz = screenMatch?.[1] ?? undefined;\n\n const encodingMatch = /<w:encoding\\b[^>]*w:val\\s*=\\s*\"([^\"]*)\"/.exec(xml);\n this._webSettings.encoding = encodingMatch?.[1] ?? undefined;\n }\n\n /**\n * Save pipeline for webSettings.xml.\n * Preserves original XML when unmodified; writes modified or regenerated XML otherwise.\n */\n private updateWebSettingsXml(): void {\n if (!this._webSettingsModified) {\n // Original XML already in ZIP from load, or static template from initializeRequiredFiles\n return;\n }\n if (this._originalWebSettingsXml) {\n // In-place edit path (e.g., stripWebDivs mutated _originalWebSettingsXml)\n this.zipHandler.updateFile(DOCX_PATHS.WEB_SETTINGS, this._originalWebSettingsXml);\n } else {\n // Sanitize or setter path — regenerate from in-memory state\n this.zipHandler.updateFile(\n DOCX_PATHS.WEB_SETTINGS,\n this.generator.generateWebSettings(this._webSettings)\n );\n }\n }\n\n /**\n * Returns information about the current webSettings.xml state.\n */\n getWebSettingsInfo(): WebSettingsInfo {\n let divCount = 0;\n if (this._originalWebSettingsXml) {\n const matches = this._originalWebSettingsXml.match(/<w:div\\b/g);\n divCount = matches ? matches.length : 0;\n }\n return {\n divCount,\n ...this._webSettings,\n };\n }\n\n /**\n * Removes all w:divs from webSettings.xml.\n * Returns the number of divs that were removed.\n */\n stripWebDivs(): number {\n if (!this._originalWebSettingsXml) {\n return 0;\n }\n const matches = this._originalWebSettingsXml.match(/<w:div\\b/g);\n const count = matches ? matches.length : 0;\n if (count === 0) {\n return 0;\n }\n this._originalWebSettingsXml = this._originalWebSettingsXml.replace(\n /<w:divs>[\\s\\S]*?<\\/w:divs>/g,\n ''\n );\n this._webSettingsModified = true;\n return count;\n }\n\n /**\n * Resets webSettings to minimal defaults, removing all original content including w:divs.\n * Returns the number of divs that were present before sanitization.\n */\n sanitizeWebSettings(): number {\n let divCount = 0;\n if (this._originalWebSettingsXml) {\n const matches = this._originalWebSettingsXml.match(/<w:div\\b/g);\n divCount = matches ? matches.length : 0;\n }\n this._webSettings = {\n optimizeForBrowser: true,\n allowPNG: true,\n relyOnVML: false,\n doNotRelyOnCSS: false,\n doNotSaveAsSingleFile: false,\n doNotOrganizeInFolder: false,\n doNotUseLongFileNames: false,\n };\n this._originalWebSettingsXml = undefined;\n this._webSettingsModified = true;\n return divCount;\n }\n\n getOptimizeForBrowser(): boolean {\n return this._webSettings.optimizeForBrowser;\n }\n\n setOptimizeForBrowser(value: boolean): this {\n this._webSettings.optimizeForBrowser = value;\n this._webSettingsModified = true;\n // Also update original XML if present (for flag removal/addition)\n this._originalWebSettingsXml = undefined;\n return this;\n }\n\n getAllowPNG(): boolean {\n return this._webSettings.allowPNG;\n }\n\n setAllowPNG(value: boolean): this {\n this._webSettings.allowPNG = value;\n this._webSettingsModified = true;\n this._originalWebSettingsXml = undefined;\n return this;\n }\n\n /**\n * Updates the styles.xml file with current styles\n * Uses merge strategy to preserve unmodified styles from original document\n */\n private updateStylesXml(): void {\n if (this._originalStylesXml) {\n // Merge modified styles with original - preserves all unmodified styles\n const mergedXml = this.mergeStylesWithOriginal();\n this.zipHandler.updateFile(DOCX_PATHS.STYLES, mergedXml);\n } else {\n // New document - generate from scratch\n const xml = this.stylesManager.generateStylesXml();\n this.zipHandler.updateFile(DOCX_PATHS.STYLES, xml);\n }\n }\n\n /**\n * Merges modified styles with the original styles.xml\n *\n * This preserves all styles from the original document while only updating\n * styles that have been explicitly modified via addStyle().\n *\n * @returns Merged XML string with original styles + modified styles\n * @private\n */\n private mergeStylesWithOriginal(): string {\n if (!this._originalStylesXml) {\n return this.stylesManager.generateStylesXml();\n }\n\n const modifiedStyleIds = this.stylesManager.getModifiedStyleIds();\n\n // If nothing was modified, return original as-is\n if (modifiedStyleIds.size === 0) {\n return this._originalStylesXml;\n }\n\n // Get modified styles from StylesManager\n const modifiedStyles = new Map<string, Style>();\n for (const styleId of modifiedStyleIds) {\n const style = this.stylesManager.getStyle(styleId);\n if (style) {\n modifiedStyles.set(styleId, style);\n }\n }\n\n // Strategy: Use regex to replace style definitions in original XML\n // This preserves structure, whitespace, and any elements we don't parse\n let resultXml = this._originalStylesXml;\n\n for (const [styleId, style] of modifiedStyles) {\n // Generate the new style XML as a string\n const newStyleXml = XMLBuilder.elementToString(style.toXML());\n\n // Pattern to match existing style with this ID (handles various attribute orders)\n // Matches: <w:style w:type=\"...\" w:styleId=\"StyleId\">...</w:style>\n // or: <w:style w:styleId=\"StyleId\" w:type=\"...\">...</w:style>\n // Note: The regex escape includes `\"` because the escaped value is interpolated\n // inside a \"...\" pattern in the regex — protects against IDs containing quotes.\n // Search/replace methods omit `\"` since their patterns don't quote the value.\n const escapedStyleId = styleId.replace(/[.*+?^${}()|[\\]\\\\\"]/g, '\\\\$&');\n const stylePattern = new RegExp(\n `<w:style[^>]*\\\\sw:styleId=\"${escapedStyleId}\"[^>]*>[\\\\s\\\\S]*?</w:style>`\n );\n\n if (stylePattern.test(resultXml)) {\n // Replace existing style\n resultXml = resultXml.replace(stylePattern, newStyleXml);\n } else {\n // Style doesn't exist in original - append before </w:styles>\n resultXml = resultXml.replace('</w:styles>', `${newStyleXml}\\n</w:styles>`);\n }\n }\n\n return resultXml;\n }\n\n /**\n * Updates the numbering.xml file with current numbering definitions\n * Preserves original XML if numbering hasn't been modified (formatting preservation)\n */\n private updateNumberingXml(): void {\n if (this._originalNumberingXml && !this.numberingManager.isModified()) {\n // Unmodified — preserve original as-is\n this.zipHandler.updateFile(DOCX_PATHS.NUMBERING, this._originalNumberingXml);\n } else if (this._originalNumberingXml) {\n // Modified — merge changes into original XML to preserve namespaces/attributes\n const mergedXml = this.mergeNumberingWithOriginal();\n this.zipHandler.updateFile(DOCX_PATHS.NUMBERING, mergedXml);\n // Clean up numbering.xml.rels if numPicBullets were removed\n this.cleanupNumberingRels(mergedXml);\n } else {\n // New document — generate from scratch\n const xml = this.numberingManager.generateNumberingXml();\n this.zipHandler.updateFile(DOCX_PATHS.NUMBERING, xml);\n }\n }\n\n /**\n * Cleans up `word/_rels/numbering.xml.rels` by removing relationship entries\n * that are no longer referenced in the merged numbering.xml.\n *\n * numPicBullet elements contain `<a:blip r:embed=\"rIdX\"/>` references to images.\n * When numPicBullets are removed, their image relationships become orphaned.\n * This method removes those orphaned entries from the rels file.\n *\n * Note: The media files themselves (word/media/imageX.png) are NOT removed because\n * they may still be referenced by document.xml.rels for inline display.\n *\n * @param mergedXml The final numbering XML after all modifications\n * @private\n */\n private cleanupNumberingRels(mergedXml: string): void {\n const relsXml = this.zipHandler.getFileAsString(DOCX_PATHS.NUMBERING_RELS);\n if (!relsXml) return;\n\n // Collect all rId references still present in the merged numbering.xml\n const usedRIds = new Set<string>();\n const rIdPattern = /r:(?:embed|link|id)=\"(rId\\d+)\"/g;\n let match: RegExpExecArray | null;\n while ((match = rIdPattern.exec(mergedXml)) !== null) {\n if (match[1]) usedRIds.add(match[1]);\n }\n\n // Remove Relationship entries from the rels file if their Id is not referenced\n let cleanedRels = relsXml;\n const relPattern = /<Relationship\\s+[^>]*Id=\"(rId\\d+)\"[^>]*\\/>/g;\n const entriesToRemove: string[] = [];\n while ((match = relPattern.exec(relsXml)) !== null) {\n const relId = match[1];\n if (relId && !usedRIds.has(relId)) {\n entriesToRemove.push(match[0]);\n }\n }\n\n for (const entry of entriesToRemove) {\n cleanedRels = cleanedRels.replace(\n new RegExp(`\\\\s*${entry.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}`),\n ''\n );\n }\n\n if (entriesToRemove.length > 0) {\n // Check if all relationships were removed — if so, remove the rels file entirely\n if (!/<Relationship\\s/.test(cleanedRels)) {\n this.zipHandler.removeFile(DOCX_PATHS.NUMBERING_RELS);\n } else {\n this.zipHandler.updateFile(DOCX_PATHS.NUMBERING_RELS, cleanedRels);\n }\n this.logger.info(`Removed ${entriesToRemove.length} orphaned numbering relationship(s)`);\n }\n }\n\n /**\n * Merges modified numbering definitions with the original numbering.xml\n *\n * This preserves the original root element (namespaces, mc:Ignorable) and all\n * unmodified definitions while only updating definitions that have been explicitly\n * modified via addAbstractNumbering() or addInstance().\n *\n * @returns Merged XML string with original structure + modified definitions\n * @private\n */\n private mergeNumberingWithOriginal(): string {\n if (!this._originalNumberingXml) {\n return this.numberingManager.generateNumberingXml();\n }\n\n const modifiedAbstractNumIds = this.numberingManager.getModifiedAbstractNumIds();\n const modifiedNumIds = this.numberingManager.getModifiedNumIds();\n const removedAbstractNumIds = this.numberingManager.getRemovedAbstractNumIds();\n const removedNumIds = this.numberingManager.getRemovedNumIds();\n\n // If nothing was modified or removed, return original as-is\n if (\n modifiedAbstractNumIds.size === 0 &&\n modifiedNumIds.size === 0 &&\n removedAbstractNumIds.size === 0 &&\n removedNumIds.size === 0\n ) {\n return this._originalNumberingXml;\n }\n\n let resultXml = this._originalNumberingXml;\n\n // Replace or append modified abstractNum definitions\n for (const abstractNumId of modifiedAbstractNumIds) {\n const abstractNum = this.numberingManager.getAbstractNumbering(abstractNumId);\n if (!abstractNum) continue;\n\n const newXml = XMLBuilder.elementToString(abstractNum.toXML());\n\n // Pattern to match existing abstractNum with this ID (handles any attribute order)\n const escapedId = String(abstractNumId).replace(/[.*+?^${}()|[\\]\\\\\"]/g, '\\\\$&');\n const pattern = new RegExp(\n `<w:abstractNum[^>]*\\\\sw:abstractNumId=\"${escapedId}\"[^>]*>[\\\\s\\\\S]*?</w:abstractNum>`\n );\n\n if (pattern.test(resultXml)) {\n // Replace existing definition\n resultXml = resultXml.replace(pattern, newXml);\n } else {\n // New definition — insert before the first <w:num> or before </w:numbering>\n const numPos = resultXml.indexOf('<w:num ');\n if (numPos !== -1) {\n resultXml = resultXml.slice(0, numPos) + newXml + '\\n' + resultXml.slice(numPos);\n } else {\n resultXml = this.insertBeforeNumberingEnd(resultXml, newXml);\n }\n }\n }\n\n // Replace or append modified num instances\n for (const numId of modifiedNumIds) {\n const instance = this.numberingManager.getInstance(numId);\n if (!instance) continue;\n\n const newXml = XMLBuilder.elementToString(instance.toXML());\n\n // Pattern to match existing num with this ID (handles any attribute order)\n const escapedNumId = String(numId).replace(/[.*+?^${}()|[\\]\\\\\"]/g, '\\\\$&');\n const pattern = new RegExp(\n `<w:num\\\\b[^>]*\\\\sw:numId=\"${escapedNumId}\"[^>]*>[\\\\s\\\\S]*?</w:num>`\n );\n\n if (pattern.test(resultXml)) {\n // Replace existing instance\n resultXml = resultXml.replace(pattern, newXml);\n } else {\n // New instance — insert before numIdMacAtCleanup or </w:numbering>\n resultXml = this.insertBeforeNumberingEnd(resultXml, newXml);\n }\n }\n\n // Remove deleted abstractNum definitions\n for (const abstractNumId of removedAbstractNumIds) {\n const escapedId = String(abstractNumId).replace(/[.*+?^${}()|[\\]\\\\\"]/g, '\\\\$&');\n const pattern = new RegExp(\n `\\\\s*<w:abstractNum[^>]*\\\\sw:abstractNumId=\"${escapedId}\"[^>]*>[\\\\s\\\\S]*?</w:abstractNum>`\n );\n resultXml = resultXml.replace(pattern, '');\n }\n\n // Remove deleted num instances\n for (const numId of removedNumIds) {\n const escapedNumId = String(numId).replace(/[.*+?^${}()|[\\]\\\\\"]/g, '\\\\$&');\n const pattern = new RegExp(\n `\\\\s*<w:num\\\\b[^>]*\\\\sw:numId=\"${escapedNumId}\"[^>]*>[\\\\s\\\\S]*?</w:num>`\n );\n resultXml = resultXml.replace(pattern, '');\n }\n\n // Remove orphaned numPicBullet definitions (Step 1.3 of numbering bloat fix)\n // numPicBullets are only referenced via <w:numPicBulletId w:val=\"X\"/> inside abstractNums.\n // After removing abstractNums, check if any remaining abstractNum still references each picBullet.\n resultXml = this.removeOrphanedNumPicBullets(resultXml);\n\n return resultXml;\n }\n\n /**\n * Removes `<w:numPicBullet>` definitions whose numPicBulletId is not referenced\n * by any remaining `<w:abstractNum>` in the numbering XML.\n *\n * numPicBullets define picture-based bullet characters. They are referenced by\n * `<w:lvlPicBulletId w:val=\"X\"/>` elements inside abstractNum levels. When all\n * abstractNums that reference a picBullet have been removed, the picBullet itself\n * becomes dead weight.\n *\n * @param xml The numbering XML string\n * @returns The XML with orphaned numPicBullets removed\n * @private\n */\n private removeOrphanedNumPicBullets(xml: string): string {\n // Find all numPicBullet IDs defined in the XML\n const picBulletPattern = /<w:numPicBullet\\s+w:numPicBulletId=\"(\\d+)\"[^>]*>/g;\n const definedPicBulletIds: number[] = [];\n let match: RegExpExecArray | null;\n while ((match = picBulletPattern.exec(xml)) !== null) {\n if (match[1]) definedPicBulletIds.push(parseInt(match[1], 10));\n }\n\n if (definedPicBulletIds.length === 0) return xml;\n\n // Find all referenced picBullet IDs (via lvlPicBulletId inside abstractNums)\n const refPattern = /<w:lvlPicBulletId\\s+w:val=\"(\\d+)\"/g;\n const referencedIds = new Set<number>();\n while ((match = refPattern.exec(xml)) !== null) {\n if (match[1]) referencedIds.add(parseInt(match[1], 10));\n }\n\n // Remove unreferenced numPicBullet definitions\n let resultXml = xml;\n for (const id of definedPicBulletIds) {\n if (!referencedIds.has(id)) {\n const removePattern = new RegExp(\n `\\\\s*<w:numPicBullet\\\\s+w:numPicBulletId=\"${id}\"[^>]*>[\\\\s\\\\S]*?</w:numPicBullet>`\n );\n resultXml = resultXml.replace(removePattern, '');\n this._removedNumPicBulletIds.add(id);\n }\n }\n\n return resultXml;\n }\n\n /**\n * Inserts content before `<w:numIdMacAtCleanup>` if present, otherwise before `</w:numbering>`.\n * Per ECMA-376 CT_Numbering, the order is: abstractNum* → num* → numIdMacAtCleanup?\n */\n private insertBeforeNumberingEnd(xml: string, content: string): string {\n const macPos = xml.indexOf('<w:numIdMacAtCleanup');\n if (macPos !== -1) {\n return xml.slice(0, macPos) + content + '\\n' + xml.slice(macPos);\n }\n return xml.replace('</w:numbering>', `${content}\\n</w:numbering>`);\n }\n\n /**\n * Updates the settings.xml file with current in-memory state.\n *\n * For loaded documents: merges programmatic changes (track changes, protection, RSIDs)\n * into the preserved original XML to maintain round-trip fidelity.\n * For new documents: generates settings.xml from scratch.\n *\n * This method is called during save() and toBuffer() to ensure settings.xml\n * reflects any changes made via enableTrackChanges(), protectDocument(), etc.\n */\n private updateSettingsXml(): void {\n const xml = this.mergeSettingsWithOriginal();\n this.zipHandler.updateFile(DOCX_PATHS.SETTINGS, xml);\n }\n\n /**\n * Merges framework-managed settings into the preserved original settings.xml.\n *\n * If no original settings.xml exists (new document), generates from scratch.\n * If settings were not modified, returns original as-is for perfect round-trip.\n * If settings were modified, applies only changed settings into the original XML\n * using schema-aware insertion points per CT_Settings (ECMA-376).\n *\n * @returns The merged settings.xml content\n * @private\n */\n private mergeSettingsWithOriginal(): string {\n if (!this._originalSettingsXml) {\n // New document — generate base from scratch, then apply any modified settings\n let xml = this.generator.generateSettings({\n trackChangesEnabled: this.trackChangesEnabled,\n trackFormatting: this.trackFormatting,\n revisionView: this.revisionViewSettings,\n rsidRoot: this.rsidRoot,\n rsids: this.getRsids(),\n documentProtection: this.documentProtection,\n });\n // Apply settings merges to the generated XML for new documents\n if (this._settingsModified) {\n xml = this.mergeViewIntoSettings(xml);\n xml = this.mergeTrackChangesIntoSettings(xml);\n xml = this.mergeBooleanSettingsIntoSettings(xml);\n }\n return xml;\n }\n\n // If nothing was modified, return original as-is for perfect round-trip\n if (!this._settingsModified) {\n return this._originalSettingsXml;\n }\n\n // Start from original XML and selectively merge changed settings\n let xml = this._originalSettingsXml;\n xml = this.mergeViewIntoSettings(xml);\n xml = this.mergeTrackChangesIntoSettings(xml);\n xml = this.mergeProtectionIntoSettings(xml);\n xml = this.mergeRsidsIntoSettings(xml);\n xml = this.mergeBooleanSettingsIntoSettings(xml);\n\n return xml;\n }\n\n /**\n * Merges the document view (w:view) into settings.xml.\n *\n * Per CT_Settings schema: w:view is element #1 — must be the first child\n * of w:settings. Only modifies if setDocumentView() was called.\n *\n * @private\n */\n private mergeViewIntoSettings(xml: string): string {\n if (this._documentView === undefined) {\n return xml;\n }\n\n // Remove any existing w:view element\n xml = xml.replace(/<w:view\\b[^>]*\\/?>\\s*/g, '');\n\n // Insert as first child of w:settings (element #1 per CT_Settings)\n const viewXml = `<w:view w:val=\"${XMLBuilder.escapeXmlAttribute(this._documentView)}\"/>`;\n xml = xml.replace(/(<w:settings\\b[^>]*>)/, `$1\\n ${viewXml}`);\n\n return xml;\n }\n\n /**\n * Merges track changes settings (w:trackRevisions, w:doNotTrackFormatting,\n * w:trackFormatting, w:revisionView) into settings.xml.\n *\n * Per CT_Settings schema order:\n * #31 w:revisionView, #32 w:trackRevisions,\n * #33 w:doNotTrackMoves, #34 w:doNotTrackFormatting\n *\n * @private\n */\n private mergeTrackChangesIntoSettings(xml: string): string {\n // Remove existing track changes elements (will re-insert if needed)\n xml = xml.replace(/<w:trackRevisions\\b[^>]*\\/>/g, '');\n xml = xml.replace(/<w:trackRevisions\\b[^>]*>[\\s\\S]*?<\\/w:trackRevisions>/g, '');\n xml = xml.replace(/<w:doNotTrackMoves\\b[^>]*\\/>/g, '');\n xml = xml.replace(/<w:doNotTrackMoves\\b[^>]*>[\\s\\S]*?<\\/w:doNotTrackMoves>/g, '');\n xml = xml.replace(/<w:doNotTrackFormatting\\b[^>]*\\/>/g, '');\n xml = xml.replace(/<w:doNotTrackFormatting\\b[^>]*>[\\s\\S]*?<\\/w:doNotTrackFormatting>/g, '');\n xml = xml.replace(/<w:trackFormatting\\b[^>]*\\/>/g, '');\n xml = xml.replace(/<w:trackFormatting\\b[^>]*>[\\s\\S]*?<\\/w:trackFormatting>/g, '');\n xml = xml.replace(/<w:revisionView\\b[^>]*\\/>/g, '');\n xml = xml.replace(/<w:revisionView\\b[^>]*>[\\s\\S]*?<\\/w:revisionView>/g, '');\n\n // Build the new track changes block\n let trackBlock = '';\n\n // w:revisionView (#31 in CT_Settings)\n const view = this.revisionViewSettings;\n // Only emit revisionView if it differs from defaults (all true)\n if (!view.showInsertionsAndDeletions || !view.showFormatting || !view.showInkAnnotations) {\n trackBlock += `\\n <w:revisionView w:insDel=\"${view.showInsertionsAndDeletions ? '1' : '0'}\" w:formatting=\"${view.showFormatting ? '1' : '0'}\" w:inkAnnotations=\"${view.showInkAnnotations ? '1' : '0'}\"/>`;\n }\n\n // w:trackRevisions (#32)\n if (this.trackChangesEnabled) {\n trackBlock += '\\n <w:trackRevisions/>';\n }\n\n // w:doNotTrackMoves (#33) — only if explicitly set\n if (this._doNotTrackMoves) {\n trackBlock += '\\n <w:doNotTrackMoves/>';\n }\n\n // w:doNotTrackFormatting (#34) — only if explicitly disabled\n if (!this.trackFormatting) {\n trackBlock += '\\n <w:doNotTrackFormatting/>';\n }\n\n // Insert before w:documentProtection (#35) if it exists,\n // else before w:autoFormatOverride (#36), else before w:defaultTabStop (#39)\n if (trackBlock) {\n if (/<w:documentProtection\\b/.test(xml)) {\n xml = xml.replace(/<w:documentProtection\\b/, trackBlock + '\\n <w:documentProtection');\n } else if (/<w:autoFormatOverride\\b/.test(xml)) {\n xml = xml.replace(/<w:autoFormatOverride\\b/, trackBlock + '\\n <w:autoFormatOverride');\n } else if (/<w:defaultTabStop\\b/.test(xml)) {\n xml = xml.replace(/<w:defaultTabStop\\b/, trackBlock + '\\n <w:defaultTabStop');\n } else {\n // Fallback: insert before </w:settings>\n xml = xml.replace(/<\\/w:settings>/, trackBlock + '\\n</w:settings>');\n }\n }\n\n return xml;\n }\n\n /**\n * Merges document protection settings into settings.xml.\n *\n * Per CT_Settings schema: w:documentProtection is element #35\n * (after w:doNotTrackFormatting #34, before w:autoFormatOverride #36)\n *\n * @private\n */\n private mergeProtectionIntoSettings(xml: string): string {\n // Remove existing protection element\n xml = xml.replace(/<w:documentProtection\\b[^>]*\\/>/g, '');\n xml = xml.replace(/<w:documentProtection\\b[^>]*>[\\s\\S]*?<\\/w:documentProtection>/g, '');\n\n if (!this.documentProtection) {\n return xml;\n }\n\n // Build protection element (escape all attribute values to prevent XML injection)\n const prot = this.documentProtection;\n const esc = XMLBuilder.escapeXmlAttribute;\n let protXml = `\\n <w:documentProtection w:edit=\"${esc(prot.edit)}\" w:enforcement=\"${prot.enforcement ? '1' : '0'}\"`;\n if (prot.cryptProviderType) protXml += ` w:cryptProviderType=\"${esc(prot.cryptProviderType)}\"`;\n if (prot.cryptAlgorithmClass)\n protXml += ` w:cryptAlgorithmClass=\"${esc(prot.cryptAlgorithmClass)}\"`;\n if (prot.cryptAlgorithmType)\n protXml += ` w:cryptAlgorithmType=\"${esc(prot.cryptAlgorithmType)}\"`;\n if (prot.cryptAlgorithmSid)\n protXml += ` w:cryptAlgorithmSid=\"${esc(String(prot.cryptAlgorithmSid))}\"`;\n if (prot.cryptSpinCount) protXml += ` w:cryptSpinCount=\"${esc(String(prot.cryptSpinCount))}\"`;\n if (prot.hash) protXml += ` w:hash=\"${esc(prot.hash)}\"`;\n if (prot.salt) protXml += ` w:salt=\"${esc(prot.salt)}\"`;\n protXml += '/>';\n\n // Insert before w:autoFormatOverride (#36) if exists,\n // else before w:defaultTabStop (#39), else before </w:settings>\n if (/<w:autoFormatOverride\\b/.test(xml)) {\n xml = xml.replace(/<w:autoFormatOverride\\b/, protXml + '\\n <w:autoFormatOverride');\n } else if (/<w:defaultTabStop\\b/.test(xml)) {\n xml = xml.replace(/<w:defaultTabStop\\b/, protXml + '\\n <w:defaultTabStop');\n } else {\n xml = xml.replace(/<\\/w:settings>/, protXml + '\\n</w:settings>');\n }\n\n return xml;\n }\n\n /**\n * Merges RSIDs into settings.xml.\n *\n * Per CT_Settings schema: w:rsids is element #83\n * (after w:compat #81 / w:docVars #82, before m:mathPr #84)\n *\n * @private\n */\n private mergeRsidsIntoSettings(xml: string): string {\n // Remove existing rsids block\n xml = xml.replace(/<w:rsids>[\\s\\S]*?<\\/w:rsids>/g, '');\n\n if (this.rsids.size === 0) {\n return xml;\n }\n\n // Build RSIDs block (escape all attribute values)\n const esc = XMLBuilder.escapeXmlAttribute;\n let rsidsXml = '\\n <w:rsids>';\n if (this.rsidRoot) {\n rsidsXml += `\\n <w:rsidRoot w:val=\"${esc(this.rsidRoot)}\"/>`;\n }\n for (const rsid of this.rsids) {\n rsidsXml += `\\n <w:rsid w:val=\"${esc(rsid)}\"/>`;\n }\n rsidsXml += '\\n </w:rsids>';\n\n // Insert after w:compat or w:docVars (#81/#82), before m:mathPr (#84)\n if (xml.includes('</w:compat>')) {\n xml = xml.replace(/<\\/w:compat>/, '</w:compat>' + rsidsXml);\n } else if (/<m:mathPr\\b/.test(xml)) {\n xml = xml.replace(/<m:mathPr\\b/, rsidsXml + '\\n <m:mathPr');\n } else if (/<w:themeFontLang\\b/.test(xml)) {\n xml = xml.replace(/<w:themeFontLang\\b/, rsidsXml + '\\n <w:themeFontLang');\n } else {\n xml = xml.replace(/<\\/w:settings>/, rsidsXml + '\\n</w:settings>');\n }\n\n return xml;\n }\n\n /**\n * Merges boolean settings into the settings.xml preserving CT_Settings schema order.\n *\n * CT_Settings element order (relevant managed elements):\n * #11 embedTrueTypeFonts, #13 saveSubsetFonts, #15 mirrorMargins,\n * #20 hideSpellingErrors, #21 hideGrammaticalErrors,\n * #39 defaultTabStop, #40 autoHyphenation,\n * #48 evenAndOddHeaders, #61 characterSpacingControl,\n * #77 updateFields\n *\n * Strategy: Remove all managed elements, then re-insert a correctly ordered block\n * before the defaultTabStop anchor. This avoids ordering issues from incremental insertion.\n *\n * Only removes elements when explicitly set to false (not when undefined/unset).\n * @private\n */\n private mergeBooleanSettingsIntoSettings(xml: string): string {\n // =========================================================================\n // BEFORE defaultTabStop (#39) — remove-and-rebuild approach\n // Only removes elements that were EXPLICITLY set by the user.\n // Unset (undefined) elements are left in their original position.\n //\n // CT_Settings order: #11 embedTrueTypeFonts, #13 saveSubsetFonts,\n // #15 mirrorMargins, #20 hideSpellingErrors, #21 hideGrammaticalErrors\n // =========================================================================\n\n // Collect explicitly-set elements to add (in schema order)\n const preElements: string[] = [];\n const mod = this._modifiedBooleanSettings;\n\n // Only remove and process elements that were explicitly set via setters\n if (mod.has('embedTrueTypeFonts')) {\n xml = xml.replace(/<w:embedTrueTypeFonts\\b[^>]*\\/?>\\s*/g, '');\n if (this._embedTrueTypeFonts) preElements.push('<w:embedTrueTypeFonts/>');\n }\n if (mod.has('saveSubsetFonts')) {\n xml = xml.replace(/<w:saveSubsetFonts\\b[^>]*\\/?>\\s*/g, '');\n if (this._saveSubsetFonts) preElements.push('<w:saveSubsetFonts/>');\n }\n if (mod.has('mirrorMargins')) {\n xml = xml.replace(/<w:mirrorMargins\\b[^>]*\\/?>\\s*/g, '');\n if (this._mirrorMargins) preElements.push('<w:mirrorMargins/>');\n }\n if (mod.has('hideSpellingErrors')) {\n xml = xml.replace(/<w:hideSpellingErrors\\b[^>]*\\/?>\\s*/g, '');\n if (this._hideSpellingErrors) preElements.push('<w:hideSpellingErrors/>');\n }\n if (mod.has('hideGrammaticalErrors')) {\n xml = xml.replace(/<w:hideGrammaticalErrors\\b[^>]*\\/?>\\s*/g, '');\n if (this._hideGrammaticalErrors) preElements.push('<w:hideGrammaticalErrors/>');\n }\n\n // Insert the block before defaultTabStop (schema order preserved since array is ordered)\n if (preElements.length > 0) {\n const preBlock = preElements.map((e) => '\\n ' + e).join('');\n if (/<w:defaultTabStop\\b/.test(xml)) {\n xml = xml.replace(/<w:defaultTabStop\\b/, preBlock + '\\n <w:defaultTabStop');\n } else {\n xml = xml.replace(/<\\/w:settings>/, preBlock + '\\n</w:settings>');\n }\n }\n\n // =========================================================================\n // defaultTabStop (#39) — value attribute, not just boolean\n // =========================================================================\n if (mod.has('defaultTabStop') && this._defaultTabStop !== undefined) {\n const hasDTS = /<w:defaultTabStop\\b[^>]*\\/?>/.test(xml);\n if (hasDTS) {\n xml = xml.replace(\n /<w:defaultTabStop\\b[^>]*\\/?>/,\n `<w:defaultTabStop w:val=\"${this._defaultTabStop}\"/>`\n );\n } else {\n xml = xml.replace(\n /<\\/w:settings>/,\n ` <w:defaultTabStop w:val=\"${this._defaultTabStop}\"/>\\n</w:settings>`\n );\n }\n }\n\n // =========================================================================\n // AFTER defaultTabStop (#39) — only process explicitly set elements\n // #40 autoHyphenation, #48 evenAndOddHeaders\n // =========================================================================\n\n const postElements: string[] = [];\n\n if (mod.has('autoHyphenation')) {\n xml = xml.replace(/<w:autoHyphenation\\b[^>]*\\/?>\\s*/g, '');\n if (this._autoHyphenation) postElements.push('<w:autoHyphenation/>');\n }\n if (mod.has('evenAndOddHeaders')) {\n xml = xml.replace(/<w:evenAndOddHeaders\\b[^>]*\\/?>\\s*/g, '');\n if (this._evenAndOddHeaders) postElements.push('<w:evenAndOddHeaders/>');\n }\n\n if (postElements.length > 0) {\n const postBlock = postElements.map((e) => '\\n ' + e).join('');\n if (/<w:characterSpacingControl\\b/.test(xml)) {\n xml = xml.replace(\n /<w:characterSpacingControl\\b/,\n postBlock + '\\n <w:characterSpacingControl'\n );\n } else {\n xml = xml.replace(/<\\/w:settings>/, postBlock + '\\n</w:settings>');\n }\n }\n\n // =========================================================================\n // #77: updateFields (near end of CT_Settings) — only if explicitly set via setter\n // =========================================================================\n if (mod.has('updateFields')) {\n xml = xml.replace(/<w:updateFields\\b[^>]*\\/?>\\s*/g, '');\n if (this._updateFields) {\n if (/<w:compat\\b/.test(xml)) {\n xml = xml.replace(/<w:compat\\b/, '<w:updateFields w:val=\"true\"/>\\n <w:compat');\n } else {\n xml = xml.replace(/<\\/w:settings>/, ' <w:updateFields w:val=\"true\"/>\\n</w:settings>');\n }\n }\n }\n\n return xml;\n }\n\n /**\n * Gets the StylesManager for advanced style operations\n *\n * Provides direct access to the StylesManager for advanced scenarios\n * like bulk style operations, custom style creation, or style analysis.\n *\n * @returns The StylesManager instance managing this document's styles\n *\n * @example\n * ```typescript\n * const stylesManager = doc.getStylesManager();\n * const allStyles = stylesManager.getAllStyles();\n * console.log(`Document has ${allStyles.length} styles`);\n * ```\n */\n getStylesManager(): StylesManager {\n return this.stylesManager;\n }\n\n /**\n * Convenience shortcut for {@link getStylesManager}\n *\n * Provides quick access to the StylesManager for style operations.\n * This is a shorter alternative to calling getStylesManager().\n *\n * @returns The StylesManager instance managing this document's styles\n *\n * @example\n * ```typescript\n * // Quick access to styles manager\n * const styles = doc.styles();\n * styles.addStyle(customStyle);\n * ```\n */\n styles(): StylesManager {\n return this.stylesManager;\n }\n\n /**\n * Resolves the effective shading for a table cell through the ECMA-376 style hierarchy.\n *\n * Resolution order (highest priority first):\n * 1. Direct cell shading\n * 2. Row table property exceptions\n * 3. Conditional table style (tblStylePr) based on cnfStyle\n * 4. Table style default cell shading\n * 5. Direct table shading\n *\n * @param table - The table containing the cell\n * @param row - Row index (0-based)\n * @param col - Column index (0-based)\n * @returns The resolved ShadingConfig, or undefined if no shading applies\n */\n getComputedCellShading(\n table: Table,\n row: number,\n col: number\n ): import('../elements/CommonTypes').ShadingConfig | undefined {\n const tableRow = table.getRow(row);\n if (!tableRow) return undefined;\n const cell = tableRow.getCell(col);\n if (!cell) return undefined;\n return resolveCellShading(cell, table, this.stylesManager);\n }\n\n /**\n * Adds or updates a style definition in the document\n *\n * Registers a style definition that can be applied to paragraphs and tables.\n * If a style with the same ID already exists, it is replaced.\n * The styles.xml file is updated immediately.\n *\n * @param style - The Style instance to add or update\n * @returns This document instance for method chaining\n *\n * @example\n * ```typescript\n * const customStyle = Style.create({\n * styleId: 'MyCustomStyle',\n * name: 'My Custom Style',\n * type: 'paragraph',\n * runFormatting: { font: 'Arial', size: 14, bold: true },\n * paragraphFormatting: { alignment: 'center' }\n * });\n * doc.addStyle(customStyle);\n *\n * // Apply to paragraphs\n * doc.createParagraph('Styled text').setStyle('MyCustomStyle');\n * ```\n */\n addStyle(style: Style): this {\n this.stylesManager.addStyle(style);\n // Update styles XML immediately so it's reflected in getStylesXml()\n this.updateStylesXml();\n return this;\n }\n\n /**\n * Retrieves a style definition by its ID\n *\n * @param styleId - The unique style identifier (e.g., 'Heading1', 'Normal', 'CustomStyle')\n * @returns The Style instance if found, undefined otherwise\n *\n * @example\n * ```typescript\n * const heading1 = doc.getStyle('Heading1');\n * if (heading1) {\n * console.log(`Font: ${heading1.getRunFormatting().font}`);\n * }\n * ```\n */\n getStyle(styleId: string): Style | undefined {\n return this.stylesManager.getStyle(styleId);\n }\n\n /**\n * Checks if a style definition exists in the document\n *\n * @param styleId - The style identifier to check\n * @returns True if the style is defined, false otherwise\n *\n * @example\n * ```typescript\n * if (!doc.hasStyle('CustomHeader')) {\n * doc.addStyle(Style.create({\n * styleId: 'CustomHeader',\n * name: 'Custom Header',\n * type: 'paragraph'\n * }));\n * }\n * ```\n */\n hasStyle(styleId: string): boolean {\n return this.stylesManager.hasStyle(styleId);\n }\n\n /**\n * Gets all style definitions in the document\n *\n * Returns all registered styles including built-in Word styles\n * (Normal, Heading1-9, etc.) and custom styles.\n *\n * @returns Array of all Style instances in the document\n *\n * @example\n * ```typescript\n * const styles = doc.getStyles();\n * for (const style of styles) {\n * console.log(`${style.getStyleId()}: ${style.getName()}`);\n * }\n * ```\n */\n getStyles(): Style[] {\n return this.stylesManager.getAllStyles();\n }\n\n /**\n * Removes a style from the document\n * @param styleId - Style ID to remove\n * @returns True if the style was removed, false if not found\n */\n removeStyle(styleId: string): boolean {\n return this.stylesManager.removeStyle(styleId);\n }\n\n /**\n * Updates an existing style with new properties\n * @param styleId - Style ID to update\n * @param properties - Properties to update\n * @returns True if the style was updated, false if not found\n */\n updateStyle(styleId: string, properties: Partial<StyleProperties>): boolean {\n const style = this.stylesManager.getStyle(styleId);\n if (!style) {\n return false;\n }\n\n // Update the style properties\n const currentProps = style.getProperties();\n\n // Deep merge nested properties (paragraphFormatting, runFormatting)\n const updatedProps: StyleProperties = {\n ...currentProps,\n ...properties,\n styleId, // Preserve styleId\n // Deep merge paragraph formatting\n paragraphFormatting: properties.paragraphFormatting\n ? {\n ...currentProps.paragraphFormatting,\n ...properties.paragraphFormatting,\n // Deep merge nested spacing and indentation\n spacing: properties.paragraphFormatting.spacing\n ? {\n ...currentProps.paragraphFormatting?.spacing,\n ...properties.paragraphFormatting.spacing,\n }\n : currentProps.paragraphFormatting?.spacing,\n indentation: properties.paragraphFormatting.indentation\n ? {\n ...currentProps.paragraphFormatting?.indentation,\n ...properties.paragraphFormatting.indentation,\n }\n : currentProps.paragraphFormatting?.indentation,\n }\n : currentProps.paragraphFormatting,\n // Deep merge run formatting\n runFormatting: properties.runFormatting\n ? { ...currentProps.runFormatting, ...properties.runFormatting }\n : currentProps.runFormatting,\n };\n\n // Create new style with updated properties\n const updatedStyle = Style.create(updatedProps);\n\n // Replace in manager\n this.stylesManager.addStyle(updatedStyle);\n return true;\n }\n\n /**\n * Applies a style to all elements matching a predicate\n * @param styleId - Style ID to apply\n * @param predicate - Function to test each element\n * @returns Number of elements updated\n * @example\n * ```typescript\n * // Apply Heading1 style to all paragraphs containing \"Chapter\"\n * const count = doc.applyStyleToAll('Heading1', (el) => {\n * return el instanceof Paragraph && el.getText().includes('Chapter');\n * });\n * console.log(`Updated ${count} elements`);\n * ```\n */\n applyStyleToAll(styleId: string, predicate: (element: BodyElement) => boolean): number {\n let count = 0;\n\n for (const element of this.bodyElements) {\n if (predicate(element)) {\n if (element instanceof Paragraph) {\n element.setStyle(styleId);\n count++;\n }\n }\n }\n\n // Also check paragraphs inside tables\n for (const table of this.getTables()) {\n for (const row of table.getRows()) {\n for (const cell of row.getCells()) {\n for (const para of cell.getParagraphs()) {\n if (predicate(para)) {\n para.setStyle(styleId);\n count++;\n }\n }\n }\n }\n }\n\n return count;\n }\n\n /**\n * Finds all elements using a specific style\n * @param styleId - Style ID to search for\n * @returns Array of paragraphs and table cells using this style\n * @example\n * ```typescript\n * const heading1Elements = doc.findElementsByStyle('Heading1');\n * console.log(`Found ${heading1Elements.length} Heading1 elements`);\n * ```\n */\n findElementsByStyle(styleId: string): (Paragraph | TableCell)[] {\n const results: (Paragraph | TableCell)[] = [];\n\n // Check body paragraphs\n for (const element of this.bodyElements) {\n if (element instanceof Paragraph) {\n const formatting = element.getFormatting();\n if (formatting.style === styleId) {\n results.push(element);\n }\n }\n }\n\n // Check paragraphs inside tables\n for (const table of this.getTables()) {\n for (const row of table.getRows()) {\n for (const cell of row.getCells()) {\n for (const para of cell.getParagraphs()) {\n const formatting = para.getFormatting();\n if (formatting.style === styleId) {\n results.push(para);\n }\n }\n\n // Include the cell itself if it has styled paragraphs\n const hasStyledParagraph = cell\n .getParagraphs()\n .some((p) => p.getFormatting().style === styleId);\n if (hasStyledParagraph) {\n results.push(cell);\n }\n }\n }\n }\n\n return results;\n }\n\n /**\n * Applies a new style to all paragraphs currently using a specific style\n * Useful for bulk style updates across the document\n * @param currentStyleId - The style ID currently applied to paragraphs\n * @param newStyleId - The style ID to apply\n * @returns Number of paragraphs updated\n * @example\n * ```typescript\n * // Change all Normal paragraphs to BodyText\n * const count = doc.applyStyleToAllParagraphsWithStyle('Normal', 'BodyText');\n * console.log(`Updated ${count} paragraphs`);\n * ```\n */\n applyStyleToAllParagraphsWithStyle(currentStyleId: string, newStyleId: string): number {\n let count = 0;\n\n // Check body paragraphs\n for (const element of this.bodyElements) {\n if (element instanceof Paragraph) {\n const formatting = element.getFormatting();\n if (formatting.style === currentStyleId) {\n element.setStyle(newStyleId);\n count++;\n }\n }\n }\n\n // Check paragraphs inside tables\n for (const table of this.getTables()) {\n for (const row of table.getRows()) {\n for (const cell of row.getCells()) {\n for (const para of cell.getParagraphs()) {\n const formatting = para.getFormatting();\n if (formatting.style === currentStyleId) {\n para.setStyle(newStyleId);\n count++;\n }\n }\n }\n }\n }\n\n return count;\n }\n\n /**\n * Applies a style to all paragraphs in the document with optional filtering and formatting control\n *\n * This method provides flexible bulk style application with the ability to:\n * - Apply style to all paragraphs or filter by current style\n * - Clear direct run formatting so the style takes full effect\n * - Clear only specific formatting properties\n *\n * @param styleId - The style ID to apply (e.g., 'Normal', 'Heading1')\n * @param options - Optional configuration\n * @param options.currentStyleId - Only apply to paragraphs with this style (undefined = all paragraphs)\n * @param options.clearFormatting - Whether to clear direct run formatting (default: false)\n * @param options.clearProperties - Specific properties to clear (default: all if clearFormatting=true)\n * @returns Number of paragraphs updated\n * @example\n * ```typescript\n * // Apply Normal to all paragraphs and clear all direct formatting\n * doc.applyStyleToAllParagraphs('Normal', { clearFormatting: true });\n *\n * // Apply Heading1 to all Normal paragraphs, clear only font and color\n * doc.applyStyleToAllParagraphs('Heading1', {\n * currentStyleId: 'Normal',\n * clearFormatting: true,\n * clearProperties: ['font', 'color']\n * });\n *\n * // Apply BodyText to all paragraphs without clearing formatting\n * doc.applyStyleToAllParagraphs('BodyText');\n * ```\n */\n applyStyleToAllParagraphs(\n styleId: string,\n options?: {\n currentStyleId?: string;\n clearFormatting?: boolean;\n clearProperties?: string[];\n }\n ): number {\n let count = 0;\n const clearFormatting = options?.clearFormatting || false;\n const clearProperties = options?.clearProperties;\n const currentStyleId = options?.currentStyleId;\n\n // Helper to apply style to a paragraph\n const applyToParagraph = (para: Paragraph): void => {\n const formatting = para.getFormatting();\n\n // Check if this paragraph matches the filter\n if (currentStyleId !== undefined && formatting.style !== currentStyleId) {\n return; // Skip this paragraph\n }\n\n // Apply style\n if (clearFormatting) {\n para.applyStyleAndClearFormatting(\n styleId,\n clearProperties === undefined ? [] : clearProperties\n );\n } else {\n para.setStyle(styleId);\n }\n\n count++;\n };\n\n // Process body paragraphs\n for (const element of this.bodyElements) {\n if (element instanceof Paragraph) {\n applyToParagraph(element);\n }\n }\n\n // Process paragraphs inside tables\n for (const table of this.getTables()) {\n for (const row of table.getRows()) {\n for (const cell of row.getCells()) {\n for (const para of cell.getParagraphs()) {\n applyToParagraph(para);\n }\n }\n }\n }\n\n return count;\n }\n\n /**\n * Updates the color of all hyperlinks in the document\n * @param color - Hex color without # (e.g., '0000FF' for blue)\n * @returns Number of hyperlinks updated\n * @example\n * ```typescript\n * // Make all hyperlinks blue\n * const count = doc.updateAllHyperlinkColors('0000FF');\n * console.log(`Updated ${count} hyperlinks`);\n * ```\n */\n updateAllHyperlinkColors(color: string): number {\n const hyperlinks = this.getHyperlinks();\n\n for (const { hyperlink } of hyperlinks) {\n const currentFormatting = hyperlink.getFormatting();\n hyperlink.setFormatting({\n ...currentFormatting,\n color: color,\n });\n }\n\n return hyperlinks.length;\n }\n\n /**\n * Sets layout for all tables in the document\n * @param layout - Layout type ('auto' for fit to window, 'fixed' for fixed width)\n * @returns Number of tables updated\n * @example\n * ```typescript\n * // Make all tables fit to window\n * const count = doc.setAllTablesLayout('auto');\n * console.log(`Updated ${count} tables`);\n * ```\n */\n setAllTablesLayout(layout: 'auto' | 'fixed'): number {\n const tables = this.getTables();\n\n for (const table of tables) {\n table.setLayout(layout);\n }\n\n return tables.length;\n }\n\n /**\n * Applies borders to all cells in all tables throughout the document\n * Useful for ensuring consistent border styling across all tables\n * @param border - Border definition to apply to all sides of every cell\n * @returns Number of tables updated\n * @example\n * ```typescript\n * // Add single black borders to all tables\n * const count = doc.applyBordersToAllTables({\n * style: 'single',\n * size: 8,\n * color: '000000'\n * });\n * console.log(`Applied borders to ${count} tables`);\n * ```\n */\n applyBordersToAllTables(border: TableBorder): number {\n const tables = this.getAllTables();\n\n for (const table of tables) {\n table.setAllBorders(border);\n }\n\n return tables.length;\n }\n\n /**\n * Applies different shading to tables based on their size\n * 1x1 tables get one color, multi-cell tables get another color on first row\n * @param singleCellShading - Hex color for 1x1 tables (e.g., 'BFBFBF')\n * @param multiCellFirstRowShading - Hex color for first row of multi-cell tables (e.g., 'DFDFDF')\n * @returns Object with counts of single-cell and multi-cell tables updated\n * @example\n * ```typescript\n * const result = doc.applyTableFormattingBySize('BFBFBF', 'DFDFDF');\n * console.log(`Updated ${result.singleCellCount} 1x1 tables and ${result.multiCellCount} multi-cell tables`);\n * ```\n */\n applyTableFormattingBySize(\n singleCellShading: string,\n multiCellFirstRowShading: string\n ): { singleCellCount: number; multiCellCount: number } {\n const tables = this.getTables();\n let singleCellCount = 0;\n let multiCellCount = 0;\n\n for (const table of tables) {\n const rowCount = table.getRowCount();\n const colCount = table.getColumnCount();\n\n if (rowCount === 1 && colCount === 1) {\n // 1x1 table - shade the single cell\n const cell = table.getCell(0, 0);\n if (cell) {\n cell.setShading({ fill: singleCellShading });\n singleCellCount++;\n }\n } else {\n // Multi-cell table - shade first row\n const firstRow = table.getRow(0);\n if (firstRow) {\n for (const cell of firstRow.getCells()) {\n cell.setShading({ fill: multiCellFirstRowShading });\n }\n multiCellCount++;\n }\n }\n }\n\n return { singleCellCount, multiCellCount };\n }\n\n /**\n * @deprecated This functionality has been moved to Template_UI's\n * WordDocumentProcessor.fixExistingTopHyperlinks() for consolidation.\n * This method will be removed in a future version.\n *\n * Fixes all \"Top of Document\" hyperlinks to use standard formatting and anchor\n *\n * Changes made to matching hyperlinks:\n * - Text: Any variation → \"Top of the Document\"\n * - Formatting: Verdana 12pt, underline, blue (0000FF)\n * - Paragraph: Right aligned\n * - Anchor: Points to \"_top\" bookmark at document start\n *\n * Creates \"_top\" bookmark at first paragraph if it doesn't exist\n *\n * @returns Number of hyperlinks updated\n * @example\n * ```typescript\n * const count = doc.fixTODHyperlinks();\n * console.log(`Fixed ${count} \"Top of Document\" links`);\n * ```\n */\n fixTODHyperlinks(): number {\n console.warn(\n 'DEPRECATION WARNING: fixTODHyperlinks() is deprecated. ' +\n 'Use Template_UI WordDocumentProcessor.fixExistingTopHyperlinks() instead.'\n );\n let count = 0;\n\n // Ensure _top bookmark exists at document start\n if (!this.hasBookmark('_top')) {\n const paragraphs = this.getAllParagraphs();\n if (paragraphs.length > 0) {\n const firstPara = paragraphs[0];\n if (firstPara) {\n const bookmark = new Bookmark({ name: '_top' });\n const registered = this.bookmarkManager.register(bookmark);\n firstPara.addBookmark(registered);\n }\n }\n }\n\n // Find and fix all \"Top of Document\" hyperlinks\n const hyperlinks = this.getHyperlinks();\n\n for (const { hyperlink, paragraph } of hyperlinks) {\n const text = hyperlink.getText().toLowerCase();\n\n // Match variations: \"top of document\", \"top of the document\", etc.\n if (text.includes('top') && text.includes('document')) {\n // Update text\n hyperlink.setText('Top of the Document');\n\n // Update formatting\n hyperlink.setFormatting({\n font: 'Verdana',\n size: 12,\n underline: 'single',\n color: '0000FF',\n });\n\n // Update anchor to _top\n hyperlink.setAnchor('_top');\n\n // Set paragraph alignment to right\n paragraph.setAlignment('right');\n\n count++;\n }\n }\n\n return count;\n }\n\n /**\n * Sets width to 5% for first column of tables containing \"If\"\n *\n * For tables with 2+ columns where first column text contains \"If\",\n * sets the first column width to 5% of table width.\n *\n * Common use case: If/Then decision tables\n *\n * @returns Number of table cells updated\n * @example\n * ```typescript\n * const count = doc.setIfColumnWidth();\n * console.log(`Updated ${count} If column cells`);\n * ```\n */\n setIfColumnWidth(): number {\n let count = 0;\n const tables = this.getTables();\n\n for (const table of tables) {\n const columnCount = table.getColumnCount();\n\n // Only process tables with at least 2 columns\n if (columnCount < 2) continue;\n\n // Check all rows for \"If\" in first column\n let hasIfColumn = false;\n const rows = table.getRows();\n\n for (const row of rows) {\n const cells = row.getCells();\n const firstCell = cells[0];\n if (firstCell) {\n const text = firstCell.getText().toLowerCase();\n if (text.includes('if')) {\n hasIfColumn = true;\n break;\n }\n }\n }\n\n // If \"If\" found, set width on all first column cells\n if (hasIfColumn) {\n const tableWidth = table.getFormatting().width || 12960; // Default page width in twips\n const targetWidth = Math.round(tableWidth * 0.05); // 5%\n\n for (const row of rows) {\n const cells = row.getCells();\n const firstCell = cells[0];\n if (firstCell) {\n firstCell.setWidth(targetWidth);\n count++;\n }\n }\n }\n }\n\n return count;\n }\n\n /**\n * Applies comprehensive formatting to all tables in the document\n *\n * This helper function provides a one-call solution for standardizing table formatting:\n * - Apply black borders to all cells (always applied to all tables)\n * - Set table width to autofit to window (always applied to all tables)\n * - Format first row as header (shading, bold, centered, custom font/spacing)\n * - Apply consistent cell margins to all cells\n * - Recolor and format cells with existing shading\n * - Optionally skip shading/formatting for single-cell (1x1) tables\n *\n * Shading and formatting logic (for tables > 1x1):\n * - Row 0: Apply the specified color + full formatting (bold, Verdana 12pt, centered, 3pt spacing)\n * - Other rows: Cells with existing color (NOT white) receive the same color + formatting\n * - Cells with no color or white color remain unchanged\n *\n * @param colorOrOptions Hex color for multi-cell tables, or options object\n * @param multiCellColor Optional second color for multi-cell tables (when first param is 1x1 color)\n * @returns Statistics about tables processed\n *\n * @example\n * // Use default gray color (E9E9E9) for multi-cell tables, skip 1x1 tables\n * const result = doc.applyStandardTableFormatting();\n *\n * @example\n * // Custom color for multi-cell tables only\n * const result = doc.applyStandardTableFormatting('D9D9D9');\n *\n * @example\n * // Two colors: first for 1x1 tables, second for multi-cell tables\n * const result = doc.applyStandardTableFormatting('BFBFBF', 'E9E9E9');\n *\n * @example\n * // Advanced: Full customization\n * const result = doc.applyStandardTableFormatting({\n * singleCellShading: 'BFBFBF', // Gray for 1x1 tables\n * headerRowShading: '4472C4', // Blue for multi-cell table headers\n * headerRowFormatting: {\n * bold: true,\n * alignment: 'center',\n * font: 'Arial',\n * size: 14\n * }\n * });\n * console.log(`Processed ${result.tablesProcessed} tables`);\n * console.log(`Formatted ${result.headerRowsFormatted} header rows`);\n * console.log(`Recolored ${result.cellsRecolored} cells`);\n * console.log(`Shaded ${result.singleCellTablesShaded} single-cell tables`);\n */\n public applyStandardTableFormatting(\n colorOrOptions?:\n | string\n | {\n /** Autofit tables to window width (DEPRECATED: now always enabled) */\n autofitToWindow?: boolean;\n /** Single-cell (1x1) table shading color */\n singleCellShading?: string;\n /** Header row background color for multi-cell tables (default: 'E9E9E9') */\n headerRowShading?: string;\n /** Header row text formatting */\n headerRowFormatting?: {\n bold?: boolean;\n alignment?: 'left' | 'center' | 'right' | 'justify';\n font?: string;\n size?: number;\n color?: string;\n spacingBefore?: number;\n spacingAfter?: number;\n };\n /** Cell margins for all cells in twips */\n cellMargins?: {\n top?: number;\n bottom?: number;\n left?: number;\n right?: number;\n };\n /** Skip 1x1 tables (DEPRECATED: use singleCellShading instead) */\n skipSingleCellTables?: boolean;\n },\n multiCellColor?: string\n ): {\n tablesProcessed: number;\n headerRowsFormatted: number;\n cellsRecolored: number;\n singleCellTablesShaded: number;\n } {\n // Handle different parameter combinations\n let options:\n | {\n autofitToWindow?: boolean;\n singleCellShading?: string;\n headerRowShading?: string;\n headerRowFormatting?: {\n bold?: boolean;\n alignment?: 'left' | 'center' | 'right' | 'justify';\n font?: string;\n size?: number;\n color?: string;\n spacingBefore?: number;\n spacingAfter?: number;\n };\n cellMargins?: { top?: number; bottom?: number; left?: number; right?: number };\n skipSingleCellTables?: boolean;\n }\n | undefined;\n if (typeof colorOrOptions === 'string') {\n if (multiCellColor) {\n // Two colors provided: applyStandardTableFormatting('BFBFBF', 'E9E9E9')\n options = {\n singleCellShading: colorOrOptions,\n headerRowShading: multiCellColor,\n };\n } else {\n // One color provided: backwards compatible - for multi-cell only\n options = { headerRowShading: colorOrOptions };\n }\n } else {\n options = colorOrOptions;\n }\n\n // Default values\n const singleCellShading = options?.singleCellShading?.toUpperCase();\n const headerRowShading = (options?.headerRowShading || 'E9E9E9').toUpperCase();\n const headerRowFormatting = {\n bold: options?.headerRowFormatting?.bold !== false,\n alignment: options?.headerRowFormatting?.alignment || ('center' as const),\n font: options?.headerRowFormatting?.font || 'Verdana',\n size: options?.headerRowFormatting?.size || 12,\n color: options?.headerRowFormatting?.color || '000000',\n spacingBefore: options?.headerRowFormatting?.spacingBefore ?? 60,\n spacingAfter: options?.headerRowFormatting?.spacingAfter ?? 60,\n };\n const cellMargins = {\n top: options?.cellMargins?.top ?? 0,\n bottom: options?.cellMargins?.bottom ?? 0,\n left: options?.cellMargins?.left ?? 115, // 0.08 inches\n right: options?.cellMargins?.right ?? 115, // 0.08 inches\n };\n const skipSingleCellTables = options?.skipSingleCellTables !== false && !singleCellShading;\n\n // Statistics\n let tablesProcessed = 0;\n let headerRowsFormatted = 0;\n let cellsRecolored = 0;\n let singleCellTablesShaded = 0;\n\n // Get all tables\n const tables = this.getAllTables();\n\n for (const table of tables) {\n const rowCount = table.getRowCount();\n const columnCount = table.getColumnCount();\n\n // Apply borders to all cells (always applied to all tables)\n table.setAllBorders({\n style: 'single',\n size: 4,\n color: '000000',\n });\n\n // Set table width to autofit to window (always applied to all tables)\n table.setLayout('auto');\n table.setWidthType('pct');\n table.setWidth(5000);\n\n // Handle 1x1 (single-cell) tables separately\n const is1x1Table = rowCount === 1 && columnCount === 1;\n if (is1x1Table) {\n if (singleCellShading) {\n // Apply single-cell shading color\n const singleCell = table.getRow(0)?.getCell(0);\n if (singleCell) {\n singleCell.setShading({ fill: singleCellShading });\n singleCellTablesShaded++;\n }\n }\n // Skip further processing for 1x1 tables\n tablesProcessed++;\n continue;\n }\n\n // Format first row (header) for multi-cell tables\n const firstRow = table.getRow(0);\n if (firstRow) {\n for (const cell of firstRow.getCells()) {\n // Set header shading\n cell.setShading({ fill: headerRowShading });\n\n // Set margins\n cell.setMargins(cellMargins);\n\n // Format paragraphs and runs in header (skip list paragraphs)\n for (const para of cell.getParagraphs()) {\n // Skip paragraphs that are part of numbered or bulleted lists\n const numPr = para.getFormatting().numbering;\n if (numPr && (numPr.level !== undefined || numPr.numId !== undefined)) {\n continue; // Preserve list formatting\n }\n\n para.setAlignment(headerRowFormatting.alignment);\n para.setSpaceBefore(headerRowFormatting.spacingBefore);\n para.setSpaceAfter(headerRowFormatting.spacingAfter);\n\n for (const run of para.getRuns()) {\n if (headerRowFormatting.bold) run.setBold(true);\n run.setFont(headerRowFormatting.font, headerRowFormatting.size);\n // Preserve white font - don't change color if run is white (FFFFFF)\n const currentColor = run.getColor()?.toUpperCase();\n if (currentColor !== 'FFFFFF') {\n run.setColor(headerRowFormatting.color);\n }\n }\n }\n }\n headerRowsFormatted++;\n }\n\n // Format remaining rows (data rows)\n for (let i = 1; i < rowCount; i++) {\n const row = table.getRow(i);\n if (!row) continue;\n\n for (const cell of row.getCells()) {\n // Always apply margins\n cell.setMargins(cellMargins);\n\n // Apply shading and formatting to cells with existing shading\n // Shading can be either a hex fill color OR a pattern (like pct10)\n const currentShading = cell.getShading();\n const currentColor = currentShading?.fill?.toUpperCase();\n const currentPattern = currentShading?.pattern?.toLowerCase();\n\n // Check if color is a valid 6-character hex code (not 'auto' or other special values)\n const isValidHexColor = /^[0-9A-F]{6}$/i.test(currentColor || '');\n const hasHexFillShading = currentColor && currentColor !== 'FFFFFF' && isValidHexColor;\n\n // Check if cell has pattern-based shading (like pct10, pct20, etc.)\n // Patterns like 'clear' or 'nil' don't count as shading\n const hasPatternShading =\n currentPattern &&\n currentPattern !== 'clear' &&\n currentPattern !== 'nil' &&\n currentPattern !== 'auto';\n\n if (hasHexFillShading || hasPatternShading) {\n // Apply the color passed to the method\n cell.setShading({ fill: headerRowShading });\n cellsRecolored++;\n\n // Always apply formatting when shading is applied (but skip list paragraphs)\n for (const para of cell.getParagraphs()) {\n // Skip paragraphs that are part of numbered or bulleted lists\n const numPr = para.getFormatting().numbering;\n if (numPr && (numPr.level !== undefined || numPr.numId !== undefined)) {\n continue; // Preserve list formatting\n }\n\n para.setAlignment('center');\n para.setSpaceBefore(60); // 3pt\n para.setSpaceAfter(60); // 3pt\n\n for (const run of para.getRuns()) {\n // Skip runs with Hyperlink style - preserve their blue color and underline\n if (run.isHyperlinkStyled()) {\n continue;\n }\n run.setBold(true);\n run.setFont('Verdana', 12);\n // Preserve white font - don't change color if run is white (FFFFFF)\n const currentColor = run.getColor()?.toUpperCase();\n if (currentColor !== 'FFFFFF') {\n run.setColor('000000');\n }\n }\n }\n }\n }\n }\n\n tablesProcessed++;\n }\n\n return {\n tablesProcessed,\n headerRowsFormatted,\n cellsRecolored,\n singleCellTablesShaded,\n };\n }\n\n /**\n * Centers all images where either dimension exceeds the specified pixel size\n *\n * Actually centers the paragraph containing the image, since images\n * themselves don't have alignment properties in Word.\n *\n * Conversion: 96 pixels = 1 inch = 914,400 EMUs (at 96 DPI)\n *\n * @param minPixels Minimum size in pixels - if either width OR height exceeds this, image is centered (default: 96 = 1 inch)\n * @returns Number of images centered\n * @example\n * ```typescript\n * const count = doc.centerLargeImages(96); // Center images > 1 inch\n * console.log(`Centered ${count} large images`);\n * ```\n */\n centerLargeImages(minPixels = 96): number {\n let count = 0;\n\n // Convert pixels to EMUs (914400 EMUs per inch, 96 DPI)\n // Formula: pixels * (914400 / 96) = pixels * 9525\n const minEmus = Math.round(minPixels * 9525);\n\n // Get all images with metadata\n const images = this.imageManager.getAllImages();\n\n // Create a Set of image IDs that meet size criteria\n const largeImageIds = new Set<string>();\n\n for (const entry of images) {\n const image = entry.image;\n const width = image.getWidth();\n const height = image.getHeight();\n\n // Check if either dimension meets minimum (width OR height >= threshold)\n if (width >= minEmus || height >= minEmus) {\n // Track this image's relationship ID\n const relId = image.getRelationshipId();\n if (relId) {\n largeImageIds.add(relId);\n }\n }\n }\n\n // Find paragraphs containing these large images and center them\n // Note: Images are embedded in paragraphs as ImageRun elements\n for (const paragraph of this.getAllParagraphs()) {\n const content = paragraph.getContent();\n\n for (const item of content) {\n // Check if this is an ImageRun (subclass of Run)\n if (item instanceof ImageRun) {\n const image = item.getImageElement();\n const relId = image.getRelationshipId();\n\n if (relId && largeImageIds.has(relId)) {\n // Remove indentation before centering\n paragraph.formatting.indentation = undefined;\n paragraph.setAlignment('center');\n count++;\n break; // Only count paragraph once\n }\n }\n }\n }\n\n return count;\n }\n\n /**\n * Applies border and centers all images where either dimension exceeds the specified pixel size\n *\n * This helper combines two operations:\n * 1. Applies a border to the image\n * 2. Centers the paragraph containing the image\n *\n * Processes images where EITHER width OR height exceeds the minimum size.\n * Border defaults to 2pt with black color.\n *\n * Conversion: 96 pixels = 1 inch = 914,400 EMUs (at 96 DPI)\n *\n * @param minPixels Minimum size in pixels - if either width OR height exceeds this, image is processed (default: 96 = 1 inch)\n * @param borderThicknessPt Border thickness in points (default: 2)\n * @returns Number of images processed (bordered and centered)\n * @example\n * ```typescript\n * // Apply 2pt border and center all images > 1 inch\n * const count = doc.borderAndCenterLargeImages();\n * console.log(`Processed ${count} large images`);\n * ```\n * @example\n * ```typescript\n * // Custom threshold and border thickness\n * const count = doc.borderAndCenterLargeImages(96, 3);\n * console.log(`Applied 3pt borders to ${count} images > 1 inch`);\n * ```\n */\n public borderAndCenterLargeImages(minPixels = 96, borderThicknessPt = 2): number {\n let count = 0;\n\n // Convert pixels to EMUs (914400 EMUs per inch, 96 DPI)\n // Formula: pixels * (914400 / 96) = pixels * 9525\n const minEmus = Math.round(minPixels * 9525);\n\n // Helper to check if an item is an ImageRun with large dimensions\n // Returns true if a large image was found and processed\n const processImageRun = (item: unknown): boolean => {\n if (item instanceof ImageRun) {\n const image = item.getImageElement();\n const width = image.getWidth();\n const height = image.getHeight();\n\n // Check if either dimension meets minimum (width OR height >= threshold)\n if (width >= minEmus || height >= minEmus) {\n // Apply border to the image\n image.setBorder(borderThicknessPt);\n return true;\n }\n }\n return false;\n };\n\n // Helper to check revision content for images\n const processRevision = (revision: Revision): boolean => {\n let found = false;\n const revisionContent = revision.getContent();\n for (const item of revisionContent) {\n // ImageRun extends Run, so check instanceof ImageRun\n if (processImageRun(item)) {\n found = true;\n }\n }\n return found;\n };\n\n // Directly iterate all paragraphs and find images\n // This approach bypasses ImageManager and works with images wherever they are\n for (const paragraph of this.getAllParagraphs()) {\n const content = paragraph.getContent();\n let hasLargeImage = false;\n\n for (const item of content) {\n // Check direct ImageRun content\n if (processImageRun(item)) {\n hasLargeImage = true;\n }\n // Check images inside Revisions (tracked changes like w:ins, w:del)\n else if (item instanceof Revision) {\n if (processRevision(item)) {\n hasLargeImage = true;\n }\n }\n // Note: Hyperlinks typically contain text, not images\n // Image hyperlinks would be a separate ImageRun with link styling\n }\n\n // If paragraph has a large image, center it\n if (hasLargeImage) {\n // Remove indentation before centering\n paragraph.formatting.indentation = undefined;\n paragraph.setAlignment('center');\n count++;\n }\n }\n\n return count;\n }\n\n /**\n * Sets line spacing for all list items (numbered or bulleted)\n *\n * @param spacingTwips Line spacing in twips (default: 240 = 12pt)\n * @returns Number of list items updated\n * @example\n * ```typescript\n * const count = doc.setListLineSpacing(240);\n * console.log(`Updated ${count} list items`);\n * ```\n */\n setListLineSpacing(spacingTwips = 240): number {\n let count = 0;\n\n for (const paragraph of this.getAllParagraphs()) {\n const numbering = paragraph.getNumbering();\n\n if (numbering) {\n // Has numbering - it's a list item\n paragraph.setLineSpacing(spacingTwips, 'auto');\n count++;\n }\n }\n\n return count;\n }\n\n /**\n * Normalizes all numbered lists in the document to use consistent formatting\n *\n * Creates a standard numbered list format and applies it to all numbered lists:\n * - Level 0: 1., 2., 3., ... (decimal)\n * - Level 1: a., b., c., ... (lowerLetter)\n * - Level 2: i., ii., iii., ... (lowerRoman)\n * - Consistent indentation and spacing\n *\n * @returns Number of paragraphs updated\n * @example\n * ```typescript\n * const count = doc.normalizeNumberedLists();\n * console.log(`Normalized ${count} numbered list items`);\n * ```\n */\n normalizeNumberedLists(): number {\n let count = 0;\n\n // Create a standard numbered list\n const standardNumId = this.numberingManager.createNumberedList(3, [\n 'decimal',\n 'lowerLetter',\n 'lowerRoman',\n ]);\n\n // Collect all paragraphs with numbering and identify numbered lists\n const paragraphs = this.getAllParagraphs();\n const numberedParas: { para: Paragraph; level: number }[] = [];\n\n for (const para of paragraphs) {\n const numbering = para.getNumbering();\n if (!numbering) continue;\n\n // Get the abstract numbering for this numId\n const instance = this.numberingManager.getInstance(numbering.numId);\n if (!instance) continue;\n\n const abstractNum = this.numberingManager.getAbstractNumbering(instance.getAbstractNumId());\n if (!abstractNum) continue;\n\n // Check if level 0 is a numbered format (not bullet)\n const level0 = abstractNum.getLevel(0);\n if (!level0) continue;\n\n const format = level0.getFormat();\n // Numbered formats: decimal, lowerRoman, upperRoman, lowerLetter, upperLetter, etc.\n if (format !== 'bullet') {\n numberedParas.push({ para, level: numbering.level });\n }\n }\n\n // Apply standard numbering to all numbered paragraphs\n for (const { para, level } of numberedParas) {\n para.setNumbering(standardNumId, level);\n count++;\n }\n\n // Clean up orphaned numbering definitions\n this.cleanupUnusedNumbering();\n\n return count;\n }\n\n /**\n * Normalizes all bullet lists in the document to use consistent formatting\n *\n * Creates a standard bullet list format and applies it to all bullet lists:\n * - Level 0: • (bullet)\n * - Level 1: ○ (circle)\n * - Level 2: ■ (square)\n * - Consistent indentation and spacing\n *\n * @returns Number of paragraphs updated\n * @example\n * ```typescript\n * const count = doc.normalizeBulletLists();\n * console.log(`Normalized ${count} bullet list items`);\n * ```\n */\n normalizeBulletLists(): number {\n let count = 0;\n\n // Create a standard bullet list with custom bullets\n const standardNumId = this.numberingManager.createBulletList(3, ['•', '○', '■']);\n\n // Collect all paragraphs with numbering and identify bullet lists\n const paragraphs = this.getAllParagraphs();\n const bulletParas: { para: Paragraph; level: number }[] = [];\n\n for (const para of paragraphs) {\n const numbering = para.getNumbering();\n if (!numbering) continue;\n\n // Get the abstract numbering for this numId\n const instance = this.numberingManager.getInstance(numbering.numId);\n if (!instance) continue;\n\n const abstractNum = this.numberingManager.getAbstractNumbering(instance.getAbstractNumId());\n if (!abstractNum) continue;\n\n // Check if level 0 is a bullet format\n const level0 = abstractNum.getLevel(0);\n if (!level0) continue;\n\n const format = level0.getFormat();\n if (format === 'bullet') {\n bulletParas.push({ para, level: numbering.level });\n }\n }\n\n // Apply standard bullet numbering to all bullet paragraphs\n for (const { para, level } of bulletParas) {\n para.setNumbering(standardNumId, level);\n count++;\n }\n\n // Clean up orphaned numbering definitions\n this.cleanupUnusedNumbering();\n\n return count;\n }\n\n /**\n * Consolidates duplicate abstract numbering definitions\n *\n * INTENTIONAL REMOVAL (NOT A BUG): This method deliberately removes duplicate\n * abstract numbering definitions and remaps their instances to a single canonical\n * definition. DOCX files routinely accumulate 10-50+ identical copies of the same\n * numbering definition through copy-paste — this is pure bloat that inflates\n * numbering.xml and can cause Word performance issues.\n *\n * Groups abstractNums by a deterministic fingerprint of their level properties\n * (including numStyleLink, styleLink, multiLevelType, and all level attributes).\n * For each group with >1 member, picks the lowest abstractNumId as canonical,\n * remaps all instances, and removes duplicates.\n *\n * Typically called after uniformity methods have made definitions identical,\n * and before cleanupUnusedNumbering() to remove any orphaned leftovers.\n *\n * @param options Optional configuration (e.g., protected IDs to skip)\n * @returns Summary of what was consolidated\n * @public\n */\n consolidateNumbering(options?: NumberingConsolidationOptions): NumberingConsolidationResult {\n return this.numberingManager.consolidateNumbering(options);\n }\n\n /**\n * Cleans up unused numbering definitions\n *\n * INTENTIONAL REMOVAL (NOT A BUG): This method deliberately removes numbering\n * instances and abstract numberings that are no longer referenced by any paragraph\n * in the document. DOCX files accumulate orphaned numbering definitions through\n * copy-paste, style normalization, and editing — they serve no purpose and bloat\n * numbering.xml. This method is always called explicitly by user code or internally\n * after normalizeNumberedLists()/normalizeBulletLists() which reassign all paragraphs\n * to new definitions, making old ones orphans by design.\n *\n * Performs a comprehensive scan before removing anything:\n * - Current paragraph numbering properties (w:numPr)\n * - Previous numbering from paragraph property changes (w:pPrChange)\n * - numId references inside raw nested content (nested tables/SDTs)\n * - numId references inside body-level tracked deletions (w:del blocks\n * that were skipped during parsing)\n * - Header, footer, footnote, and endnote XML files\n * - Raw XML safety net scan of all relevant ZIP entries\n *\n * A definition is only removed if it appears in NONE of these sources.\n *\n * @public\n */\n cleanupUnusedNumbering(): void {\n const usedNumIds = new Set<number>();\n\n // 1. Scan all body paragraphs for current numbering\n const paragraphs = this.getAllParagraphs();\n this.collectNumIdsFromParagraphs(paragraphs, usedNumIds);\n\n // 2. Scan raw nested content in table cells for numId references\n for (const element of this.bodyElements) {\n if (element instanceof Table) {\n this.collectNumIdsFromTable(element, usedNumIds);\n } else if (element instanceof StructuredDocumentTag) {\n for (const content of element.getContent()) {\n if (content instanceof Table) {\n this.collectNumIdsFromTable(content, usedNumIds);\n }\n }\n }\n }\n\n // 3. Scan headers and footers for numId references\n this.collectNumIdsFromElements(\n this.headerFooterManager.getAllHeaders().flatMap((entry) => entry.header.getElements()),\n usedNumIds\n );\n this.collectNumIdsFromElements(\n this.headerFooterManager.getAllFooters().flatMap((entry) => entry.footer.getElements()),\n usedNumIds\n );\n\n // 4. Scan footnotes and endnotes for numId references\n for (const footnote of this.footnoteManager.getAllFootnotes()) {\n this.collectNumIdsFromParagraphs(footnote.getParagraphs(), usedNumIds);\n }\n for (const endnote of this.endnoteManager.getAllEndnotes()) {\n this.collectNumIdsFromParagraphs(endnote.getParagraphs(), usedNumIds);\n }\n\n // 5. Scan original document XML for any numId references not captured by\n // the in-memory model (e.g., body-level w:del blocks, nested structures)\n const documentXml = this.zipHandler.getFileAsString('word/document.xml');\n if (documentXml) {\n this.collectNumIdsFromXml(documentXml, usedNumIds);\n }\n\n // 6. Scan header/footer/footnote/endnote XML files for raw numId references\n for (const filePath of this.zipHandler.getFilePaths()) {\n if (\n filePath.startsWith('word/header') ||\n filePath.startsWith('word/footer') ||\n filePath === DOCX_PATHS.FOOTNOTES ||\n filePath === DOCX_PATHS.ENDNOTES\n ) {\n const xml = this.zipHandler.getFileAsString(filePath);\n if (xml) {\n this.collectNumIdsFromXml(xml, usedNumIds);\n }\n }\n }\n\n // Clean up numbering definitions not found in any of the above scans\n this.numberingManager.cleanupUnusedNumbering(usedNumIds);\n }\n\n /**\n * Validates that all paragraph numId references point to existing numbering\n * definitions. Removes orphaned references where the numId definition was\n * deleted but paragraphs still reference it. This prevents Word \"unreadable\n * content\" corruption caused by active numbering references to missing definitions.\n *\n * @returns Number of orphaned numId references fixed\n */\n validateNumberingReferences(): number {\n let fixed = 0;\n const existingNumIds = new Set<number>(\n this.numberingManager.getAllInstances().map((i: any) => i.getNumId())\n );\n\n for (const para of this.getAllParagraphs()) {\n const numbering = para.getNumbering();\n if (numbering && !existingNumIds.has(numbering.numId)) {\n para.removeNumbering();\n fixed++;\n }\n }\n\n if (fixed > 0) {\n this.logger.warn(`Fixed ${fixed} orphaned numId references (numbering definitions missing)`);\n }\n return fixed;\n }\n\n /**\n * Enables flattening of INCLUDEPICTURE field codes during the next save.\n * Removes all INCLUDEPICTURE field markup (begin/instrText/separate/end)\n * while preserving the embedded image content (w:drawing elements).\n *\n * INTENTIONAL REMOVAL (NOT A BUG): The removed fldChar/instrText runs are\n * field wrapper bloat from Outlook copy-paste. They cause Word to freeze\n * due to recursive field resolution. The actual image content (w:drawing)\n * is always preserved — only the INCLUDEPICTURE field scaffolding is stripped.\n * Other field types (HYPERLINK, TOC, MERGEFIELD, etc.) are never touched.\n *\n * The document.xml is regenerated from the in-memory model (preserving all\n * in-memory changes like style application), then _postProcessDocumentXml()\n * strips any remaining INCLUDEPICTURE field markup as a safety net.\n *\n * @returns this for chaining\n * @example\n * ```typescript\n * const doc = await Document.loadFromBuffer(buffer);\n * doc.flattenFieldCodes();\n * const output = await doc.toBuffer();\n * ```\n */\n flattenFieldCodes(): this {\n this._flattenIncludePictureFields = true;\n return this;\n }\n\n /**\n * Enables removal of direct w:spacing from paragraphs with specified styles\n * during the next save. This operates at the raw XML level in the\n * post-processing pipeline (after document.xml regeneration).\n *\n * INTENTIONAL REMOVAL (NOT A BUG): Per OOXML precedence rules, direct\n * paragraph formatting overrides style definitions. When a document has\n * style-defined spacing (e.g., Normal style → 8pt after), but also has\n * direct w:spacing on every paragraph, the style spacing is ignored. This\n * method removes the direct overrides so the style's spacing takes effect.\n * Historical spacing inside w:pPrChange (revision tracking) is never touched.\n *\n * @param styleIds - Array of style IDs whose paragraphs should have direct spacing removed\n * @returns this for chaining\n * @example\n * ```typescript\n * const doc = await Document.loadFromBuffer(buffer);\n * doc.flattenFieldCodes();\n * doc.clearDirectSpacingForStyles(['Normal', 'Heading1', 'ListParagraph']);\n * const output = await doc.toBuffer();\n * ```\n */\n clearDirectSpacingForStyles(styleIds: string[]): this {\n this._clearDirectSpacingStyles = styleIds;\n return this;\n }\n\n /**\n * Enables removal of orphan RSIDs from settings.xml during the next save.\n *\n * INTENTIONAL REMOVAL (NOT A BUG): RSIDs (Revision Session Identifiers)\n * accumulate in settings.xml over editing sessions. Once the paragraphs or\n * runs that referenced them are deleted, the RSIDs become orphans — they\n * serve no purpose and bloat settings.xml (often 80%+ of its size). This\n * method scans document.xml for actually-referenced RSIDs and removes the\n * rest. rsidRoot is always preserved (required by ECMA-376 spec).\n *\n * @returns this for chaining\n * @example\n * ```typescript\n * const doc = await Document.loadFromBuffer(buffer);\n * doc.stripOrphanRSIDs();\n * const output = await doc.toBuffer();\n * ```\n */\n stripOrphanRSIDs(): this {\n this._stripOrphanRSIDs = true;\n return this;\n }\n\n /**\n * Validates bookmark pairs — ensures every bookmarkStart has a matching bookmarkEnd\n * and vice versa. Adds synthetic bookmarkEnd markers for orphaned starts and removes\n * orphaned ends. This prevents Word \"unreadable content\" errors from unbalanced pairs.\n *\n * Scans body-level paragraphs and table cell paragraphs.\n * @returns Number of repairs made\n */\n validateBookmarkPairs(): number {\n const startIds = new Set<number>();\n const endIds = new Set<number>();\n\n // Collect all bookmark start/end IDs from all reachable paragraphs\n const collectFromParagraph = (para: Paragraph) => {\n for (const bm of para.getBookmarksStart()) {\n startIds.add(bm.getId());\n }\n for (const bm of para.getBookmarksEnd()) {\n endIds.add(bm.getId());\n }\n };\n\n const collectFromTable = (table: Table) => {\n for (let r = 0; r < table.getRowCount(); r++) {\n const row = table.getRow(r);\n if (!row) continue;\n for (let c = 0; c < row.getCellCount(); c++) {\n const cell = row.getCell(c);\n if (!cell) continue;\n for (const para of cell.getParagraphs()) {\n collectFromParagraph(para);\n }\n }\n }\n };\n\n for (const element of this.bodyElements) {\n if (element instanceof Paragraph) {\n collectFromParagraph(element);\n } else if (element instanceof Table) {\n collectFromTable(element);\n } else if (element instanceof StructuredDocumentTag) {\n for (const content of element.getContent()) {\n if (content instanceof Paragraph) {\n collectFromParagraph(content);\n } else if (content instanceof Table) {\n collectFromTable(content);\n }\n }\n }\n }\n\n let repairs = 0;\n\n // Fix orphaned starts (start without matching end)\n for (const id of startIds) {\n if (!endIds.has(id)) {\n // Add synthetic bookmarkEnd to the last paragraph in the document body\n const lastPara = this.getLastParagraph();\n if (lastPara) {\n lastPara.addBookmarkEnd(\n new Bookmark({ id, name: `_repair_${id}`, skipNormalization: true })\n );\n this.logger.warn(`Bookmark validation: added missing bookmarkEnd for ID ${id}`);\n repairs++;\n }\n }\n }\n\n // Fix orphaned ends (end without matching start)\n for (const id of endIds) {\n if (!startIds.has(id)) {\n // Remove orphaned bookmarkEnd from all paragraphs\n this.removeOrphanedBookmarkEnd(id);\n this.logger.warn(`Bookmark validation: removed orphaned bookmarkEnd for ID ${id}`);\n repairs++;\n }\n }\n\n return repairs;\n }\n\n /**\n * Assigns unique IDs to revisions and drawing elements before serialization.\n * Prevents duplicate w:id and docPr id attributes that cause OOXML validation failures.\n */\n private assignUniqueIds(): void {\n // Collect the highest existing revision ID to avoid collisions with parsed revisions\n const existingRevisions = this.revisionManager.getAllRevisions();\n let maxRevId = 0;\n for (const rev of existingRevisions) {\n if (rev.getId() > maxRevId) maxRevId = rev.getId();\n }\n const registeredSet = new Set(existingRevisions);\n\n let docPrId = 1;\n\n const processParagraph = (para: Paragraph) => {\n // Assign unique IDs to unregistered revisions\n for (const rev of para.getRevisions()) {\n if (!registeredSet.has(rev)) {\n maxRevId++;\n rev.setId(maxRevId);\n registeredSet.add(rev);\n }\n }\n\n // Assign unique docPr IDs to drawing elements\n for (const item of para.getContent()) {\n if (item instanceof Shape) {\n item.setDocPrId(docPrId++);\n } else if (item instanceof TextBox) {\n item.setDocPrId(docPrId++);\n } else if (item instanceof ImageRun) {\n item.getImageElement().setDocPrId(docPrId++);\n }\n }\n };\n\n for (const element of this.bodyElements) {\n if (element instanceof Paragraph) {\n processParagraph(element);\n } else if (element instanceof Table) {\n for (const row of element.getRows()) {\n for (const cell of row.getCells()) {\n for (const para of cell.getParagraphs()) {\n processParagraph(para);\n }\n }\n }\n }\n }\n }\n\n /**\n * Gets the last paragraph in the document body (including inside tables)\n */\n private getLastParagraph(): Paragraph | null {\n // Walk backwards through body elements to find last paragraph\n for (let i = this.bodyElements.length - 1; i >= 0; i--) {\n const element = this.bodyElements[i];\n if (element instanceof Paragraph) {\n return element;\n }\n if (element instanceof Table) {\n const para = element.getLastParagraph();\n if (para) return para;\n }\n }\n return null;\n }\n\n /**\n * Removes an orphaned bookmarkEnd with the given ID from all paragraphs\n */\n private removeOrphanedBookmarkEnd(id: number): void {\n const removeFromParagraph = (para: Paragraph) => {\n para.removeBookmarkEnd(id);\n };\n\n const removeFromTable = (table: Table) => {\n for (let r = 0; r < table.getRowCount(); r++) {\n const row = table.getRow(r);\n if (!row) continue;\n for (let c = 0; c < row.getCellCount(); c++) {\n const cell = row.getCell(c);\n if (!cell) continue;\n for (const para of cell.getParagraphs()) {\n removeFromParagraph(para);\n }\n }\n }\n };\n\n for (const element of this.bodyElements) {\n if (element instanceof Paragraph) {\n removeFromParagraph(element);\n } else if (element instanceof Table) {\n removeFromTable(element);\n } else if (element instanceof StructuredDocumentTag) {\n for (const content of element.getContent()) {\n if (content instanceof Paragraph) {\n removeFromParagraph(content);\n } else if (content instanceof Table) {\n removeFromTable(content);\n }\n }\n }\n }\n }\n\n /**\n * Scans paragraphs for current numbering and pPrChange numbering references.\n * @private\n */\n private collectNumIdsFromParagraphs(paragraphs: Paragraph[], usedNumIds: Set<number>): void {\n for (const para of paragraphs) {\n const numbering = para.getNumbering();\n if (numbering) {\n usedNumIds.add(numbering.numId);\n }\n const pPrChange = para.getFormatting().pPrChange;\n if (pPrChange?.previousProperties?.numbering?.numId !== undefined) {\n usedNumIds.add(pPrChange.previousProperties.numbering.numId);\n }\n }\n }\n\n /**\n * Scans an array of Paragraph | Table elements for numId references.\n * Handles both paragraph numbering and raw nested content in tables.\n * @private\n */\n private collectNumIdsFromElements(\n elements: (Paragraph | Table)[],\n usedNumIds: Set<number>\n ): void {\n for (const element of elements) {\n if (element instanceof Paragraph) {\n this.collectNumIdsFromParagraphs([element], usedNumIds);\n } else if (element instanceof Table) {\n // Scan parsed paragraphs in table cells\n for (const row of element.getRows()) {\n for (const cell of row.getCells()) {\n this.collectNumIdsFromParagraphs(cell.getParagraphs(), usedNumIds);\n }\n }\n // Scan raw nested content\n this.collectNumIdsFromTable(element, usedNumIds);\n }\n }\n }\n\n /**\n * Collects numId references from raw nested content in a table's cells.\n * Nested tables are stored as raw XML passthrough and may contain\n * numbering references not captured by the in-memory paragraph model.\n * @private\n */\n private collectNumIdsFromTable(table: Table, usedNumIds: Set<number>): void {\n for (const row of table.getRows()) {\n for (const cell of row.getCells()) {\n const rawContent = cell.getRawNestedContent();\n for (const item of rawContent) {\n this.collectNumIdsFromXml(item.xml, usedNumIds);\n }\n }\n }\n }\n\n /**\n * Extracts all w:numId w:val=\"X\" references from an XML string.\n * Used to find numbering references in raw XML content that is not\n * represented in the in-memory paragraph model (e.g., nested tables,\n * deleted paragraphs in tracked changes).\n * @private\n */\n private collectNumIdsFromXml(xml: string, usedNumIds: Set<number>): void {\n const numIdPattern = /<w:numId\\s+w:val=\"(\\d+)\"/g;\n let match: RegExpExecArray | null;\n while ((match = numIdPattern.exec(xml)) !== null) {\n const val = match[1];\n if (val) {\n usedNumIds.add(parseInt(val, 10));\n }\n }\n }\n\n /**\n * Adds a blank paragraph with Normal style after each bullet/numbered list\n *\n * Processes the document and inserts a blank paragraph after every list ends.\n * Lists are identified by their numbering ID - nested lists with the same ID\n * are treated as part of the same list.\n *\n * @returns The number of blank paragraphs inserted\n *\n * @example\n * ```typescript\n * const doc = await Document.load('input.docx');\n * const count = doc.addBlankLineAfterLists();\n * console.log(`Added ${count} blank lines after lists`);\n * await doc.save('output.docx');\n * ```\n */\n addBlankLineAfterLists(): number {\n let insertedCount = 0;\n\n // Iterate through body elements - need index-based loop since we modify the array\n for (let i = 0; i < this.bodyElements.length; i++) {\n const element = this.bodyElements[i];\n\n // Check if current element is a paragraph with numbering (list item)\n if (element instanceof Paragraph) {\n const numbering = element.getNumbering();\n\n if (numbering) {\n // This is a list item - check if it's the last item of its list\n const nextElement = this.bodyElements[i + 1];\n const isListEnd =\n !nextElement || // End of document\n !(nextElement instanceof Paragraph) || // Next is not a paragraph\n nextElement.getNumbering()?.numId !== numbering.numId; // Different list\n\n if (isListEnd) {\n // Check if there's already a blank paragraph after the list\n const alreadyHasBlank =\n nextElement instanceof Paragraph &&\n nextElement.getText().trim() === '' &&\n nextElement.getContent().length === 0;\n\n if (!alreadyHasBlank) {\n // Insert blank paragraph with Normal style after this list item\n const blankPara = new Paragraph();\n blankPara.setStyle('Normal');\n\n // Insert at position i+1 (after current element)\n this.bodyElements.splice(i + 1, 0, blankPara);\n insertedCount++;\n }\n\n // Skip the next element (either newly inserted or existing blank)\n i++;\n }\n }\n }\n }\n\n return insertedCount;\n }\n\n /**\n * Removes all headers and footers from the document\n *\n * Clears all header and footer references including:\n * - Default header/footer\n * - First page header/footer\n * - Even page header/footer\n *\n * @returns Number of headers and footers removed\n * @example\n * ```typescript\n * const count = doc.removeAllHeadersFooters();\n * console.log(`Removed ${count} headers and footers`);\n * ```\n */\n removeAllHeadersFooters(): number {\n let totalCount = 0;\n\n // Step 1: Remove relationship entries for headers and footers\n const headerRels = this.relationshipManager.getRelationshipsByType(\n 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/header'\n );\n const footerRels = this.relationshipManager.getRelationshipsByType(\n 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer'\n );\n\n for (const rel of [...headerRels, ...footerRels]) {\n this.relationshipManager.removeRelationship(rel.getId());\n totalCount++;\n }\n\n // Step 2: Find and delete all header/footer XML files from ZIP archive\n // Scan for word/header*.xml and word/footer*.xml files\n const allFiles = this.zipHandler.getFilePaths();\n const headerFooterFiles = allFiles.filter((path) =>\n /^word\\/(header|footer)\\d+\\.xml$/i.exec(path)\n );\n\n for (const filePath of headerFooterFiles) {\n this.zipHandler.removeFile(filePath);\n }\n\n // Step 3: Clear internal references\n this.headerFooterManager.clear();\n\n // Clear section header/footer references\n const section = this.section;\n const sectionProps = (section as any).properties;\n\n if (sectionProps.headers) {\n sectionProps.headers = {};\n }\n\n if (sectionProps.footers) {\n sectionProps.footers = {};\n }\n\n // Disable title page if it was enabled for first page headers/footers\n if (sectionProps.titlePage) {\n sectionProps.titlePage = false;\n }\n\n // Step 4: Strip header/footer references from inline sectPr in paragraphs\n // Multi-section documents store section breaks as raw XML strings on paragraphs.\n // These contain w:headerReference and w:footerReference elements that must also be removed.\n for (const element of this.bodyElements) {\n if (element instanceof Paragraph && typeof element.formatting.sectPr === 'string') {\n let sectPrXml = element.formatting.sectPr;\n // Remove w:headerReference elements\n sectPrXml = sectPrXml.replace(/<w:headerReference[^/]*\\/>/g, '');\n sectPrXml = sectPrXml.replace(/<w:headerReference[^>]*>[\\s\\S]*?<\\/w:headerReference>/g, '');\n // Remove w:footerReference elements\n sectPrXml = sectPrXml.replace(/<w:footerReference[^/]*\\/>/g, '');\n sectPrXml = sectPrXml.replace(/<w:footerReference[^>]*>[\\s\\S]*?<\\/w:footerReference>/g, '');\n // Remove w:titlePg (only relevant for first-page header/footer differentiation)\n sectPrXml = sectPrXml.replace(/<w:titlePg[^/]*\\/>/g, '');\n sectPrXml = sectPrXml.replace(/<w:titlePg[^>]*>[\\s\\S]*?<\\/w:titlePg>/g, '');\n element.setSectionProperties(sectPrXml);\n }\n }\n\n return totalCount;\n }\n\n /**\n * Clears the content of all headers and footers, leaving them as empty parts.\n *\n * Unlike removeAllHeadersFooters() which deletes the header/footer parts entirely,\n * this method preserves the structural elements (files, relationships, section references)\n * and only empties the content. Each header/footer will contain a single empty paragraph.\n *\n * This is safer for multi-section documents because it avoids dangling references.\n *\n * @returns Number of headers and footers cleared\n */\n clearAllHeaderFooterContent(): number {\n let count = 0;\n\n for (const entry of this.headerFooterManager.getAllHeaders()) {\n entry.header.clear();\n count++;\n }\n\n for (const entry of this.headerFooterManager.getAllFooters()) {\n entry.footer.clear();\n count++;\n }\n\n return count;\n }\n\n /**\n * Gets the raw styles.xml content as a string\n * @returns The raw XML content of styles.xml\n */\n getStylesXml(): string {\n const stylesFile = this.zipHandler.getFileAsString(DOCX_PATHS.STYLES);\n return stylesFile || this.stylesManager.generateStylesXml();\n }\n\n /**\n * Sets the raw styles.xml content\n *\n * **Warning:** This directly sets the XML content without validation.\n * Invalid XML may corrupt the document. Use StylesManager.validate()\n * to check the XML before setting.\n *\n * @param xml - The raw XML content to set\n */\n setStylesXml(xml: string): void {\n this.zipHandler.updateFile(DOCX_PATHS.STYLES, xml);\n\n // Clear the styles manager to force reload on next access\n this.stylesManager.clear();\n }\n\n /**\n * Gets the underlying ZipHandler for advanced ZIP operations\n *\n * Provides low-level access to the ZIP archive for advanced scenarios\n * like direct file manipulation, custom part extraction, or debugging.\n * Use with caution as direct modifications can corrupt the document.\n *\n * @returns The ZipHandler instance managing the DOCX package\n *\n * @example\n * ```typescript\n * const zipHandler = doc.getZipHandler();\n * const files = zipHandler.getFilePaths();\n * console.log('Package contains:', files);\n * ```\n */\n getZipHandler(): ZipHandler {\n return this.zipHandler;\n }\n\n /**\n * Gets the NumberingManager for advanced list operations\n *\n * Provides direct access to the NumberingManager for advanced scenarios\n * like creating custom list definitions, managing numbering instances,\n * or analyzing list structures.\n *\n * @returns The NumberingManager instance managing this document's lists\n *\n * @example\n * ```typescript\n * const numManager = doc.getNumberingManager();\n * const instances = numManager.getAllInstances();\n * console.log(`Document has ${instances.length} list definitions`);\n * ```\n */\n getNumberingManager(): NumberingManager {\n return this.numberingManager;\n }\n\n /**\n * Creates a new bullet list definition and returns its ID\n *\n * Creates a multi-level bullet list with customizable bullet characters\n * for each level. The returned numId can be used with {@link Paragraph.setNumbering}\n * to apply the list to paragraphs.\n *\n * @param levels - Number of indentation levels to create (default: 3, max: 9)\n * @param bullets - Optional array of bullet characters for each level (default: ['•', '○', '■'])\n * @returns The numbering instance ID to use with paragraph.setNumbering()\n *\n * @example\n * ```typescript\n * // Create simple 3-level bullet list\n * const listId = doc.createBulletList();\n * doc.createParagraph('Level 1 item').setNumbering(listId, 0);\n * doc.createParagraph('Level 2 item').setNumbering(listId, 1);\n * ```\n *\n * @example\n * ```typescript\n * // Create with custom bullets\n * const listId = doc.createBulletList(4, ['★', '☆', '▶', '▷']);\n * doc.createParagraph('Star item').setNumbering(listId, 0);\n * doc.createParagraph('Hollow star').setNumbering(listId, 1);\n * ```\n */\n createBulletList(levels = 3, bullets?: string[]): number {\n return this.numberingManager.createBulletList(levels, bullets);\n }\n\n /**\n * Creates a new numbered list definition and returns its ID\n *\n * Creates a multi-level numbered list with customizable number formats\n * for each level (decimal, roman, letters, etc.). The returned numId can be\n * used with {@link Paragraph.setNumbering} to apply the list to paragraphs.\n *\n * @param levels - Number of indentation levels to create (default: 3, max: 9)\n * @param formats - Optional array of number formats for each level (default: ['decimal', 'lowerLetter', 'lowerRoman'])\n * @returns The numbering instance ID to use with paragraph.setNumbering()\n *\n * @example\n * ``` typescript\n * // Create simple 3-level numbered list\n * const listId = doc.createNumberedList();\n * doc.createParagraph('1. First item').setNumbering(listId, 0);\n * doc.createParagraph('a. Sub-item').setNumbering(listId, 1);\n * ```\n *\n * @example\n * ```typescript\n * // Create custom format list\n * const listId = doc.createNumberedList(2, ['upperRoman', 'lowerLetter']);\n * doc.createParagraph('Roman numeral').setNumbering(listId, 0); // I.\n * doc.createParagraph('Letter').setNumbering(listId, 1); // a.\n * ```\n */\n createNumberedList(levels = 3, formats?: ('decimal' | 'lowerLetter' | 'lowerRoman')[]): number {\n return this.numberingManager.createNumberedList(levels, formats);\n }\n\n /**\n * Creates a new multi-level list and returns its numId\n * @returns The numId to use with setNumbering()\n */\n createMultiLevelList(): number {\n return this.numberingManager.createMultiLevelList();\n }\n\n /**\n * Creates a new numbering instance that restarts numbering for an existing list\n *\n * This creates a new `<w:num>` referencing the same abstract numbering as the\n * given numId, but with a level override to restart counting at the specified value.\n *\n * @param numId The existing numbering instance ID to base the restart on\n * @param level The level to restart (0-8, default: 0)\n * @param startValue The value to restart from (>= 1, default: 1)\n * @returns The new numId to use with paragraph.setNumbering()\n *\n * @example\n * ```typescript\n * const listId = doc.createNumberedList();\n * doc.createParagraph('First list item 1').setNumbering(listId, 0);\n * doc.createParagraph('First list item 2').setNumbering(listId, 0);\n *\n * const restartId = doc.restartNumbering(listId);\n * doc.createParagraph('Second list item 1').setNumbering(restartId, 0);\n * ```\n */\n restartNumbering(numId: number, level?: number, startValue?: number): number {\n return this.numberingManager.restartNumbering(numId, level, startValue);\n }\n\n /**\n * Gets the framework's standard indentation for a list level\n *\n * The framework uses a consistent indentation scheme:\n * - leftIndent: 720 * (level + 1) twips\n * - hangingIndent: 360 twips\n *\n * @param level The level (0-8)\n * @returns Object with leftIndent and hangingIndent in twips\n * @example\n * ```typescript\n * const indent = doc.getStandardIndentation(0);\n * // Returns: { leftIndent: 720, hangingIndent: 360 }\n * ```\n */\n getStandardIndentation(level: number): {\n leftIndent: number;\n hangingIndent: number;\n } {\n return this.numberingManager.getStandardIndentation(level);\n }\n\n /**\n * Sets custom indentation for a specific level in a numbering definition\n *\n * This updates the indentation for a specific level across ALL paragraphs\n * that use this numId and level combination.\n *\n * @param numId The numbering instance ID\n * @param level The level to modify (0-8)\n * @param leftIndent Left indentation in twips\n * @param hangingIndent Hanging indentation in twips (optional, defaults to 360)\n * @returns This document for chaining\n * @example\n * ```typescript\n * // Set level 0 to 0.5 inch left, 0.25 inch hanging\n * doc.setListIndentation(1, 0, 720, 360);\n * ```\n */\n setListIndentation(\n numId: number,\n level: number,\n leftIndent: number,\n hangingIndent?: number\n ): this {\n this.numberingManager.setListIndentation(numId, level, leftIndent, hangingIndent);\n return this;\n }\n\n /**\n * Normalizes indentation for all lists in the document\n *\n * Applies standard indentation to every numbering instance:\n * - leftIndent: 720 * (level + 1) twips\n * - hangingIndent: 360 twips\n *\n * This ensures consistent spacing across all lists in the document.\n *\n * @returns Number of numbering instances updated\n * @example\n * ```typescript\n * const count = doc.normalizeAllListIndentation();\n * console.log(`Normalized ${count} lists`);\n * ```\n */\n normalizeAllListIndentation(): number {\n return this.numberingManager.normalizeAllListIndentation();\n }\n\n /**\n * Applies standard formatting to all bullet lists in the document\n *\n * Standardizes bullet lists with:\n * - Alternating bullet symbols: • (solid) for even levels, ○ (open) for odd levels\n * - Indentation: 0.5\" increments (720 twips per level)\n * - Hanging indent: 0.25\" (360 twips)\n * - Paragraph text: Verdana 12pt\n * - Spacing: 0pt before, 3pt after (60 twips)\n * - Contextual spacing enabled (no spacing between same-type paragraphs)\n *\n * @returns Number of bullet lists updated\n * @example\n * ```typescript\n * const doc = await Document.load('document.docx');\n * const count = doc.applyStandardListFormatting();\n * console.log(`Standardized ${count} bullet lists`);\n * await doc.save('document-formatted.docx');\n * ```\n */\n applyStandardListFormatting(): number {\n const instances = this.numberingManager.getAllInstances();\n let count = 0;\n\n for (const instance of instances) {\n const abstractNumId = instance.getAbstractNumId();\n const abstractNum = this.numberingManager.getAbstractNumbering(abstractNumId);\n\n if (!abstractNum) continue;\n\n // Only process bullet lists (skip numbered lists)\n const level0 = abstractNum.getLevel(0);\n if (level0?.getFormat() !== 'bullet') continue;\n\n // Update all 9 levels (0-8) with standard formatting\n for (let levelIndex = 0; levelIndex < 9; levelIndex++) {\n const numLevel = abstractNum.getLevel(levelIndex);\n if (!numLevel) continue;\n\n // Alternate bullets: even levels = solid (•), odd levels = open (○)\n const bullet = levelIndex % 2 === 0 ? '•' : '○';\n numLevel.setText(bullet);\n\n // Set bullet font to Arial (Unicode bullets require a regular font, not Symbol)\n numLevel.setFont('Arial');\n\n // Set bullet size to 12pt (24 half-points)\n numLevel.setFontSize(24);\n\n // Indentation: 0.5\" per level (720 twips)\n // Level 0 = 720, Level 1 = 1440, Level 2 = 2160, etc.\n numLevel.setLeftIndent(720 * (levelIndex + 1));\n\n // Hanging indent: 0.25\" (360 twips) for all levels\n numLevel.setHangingIndent(360);\n }\n\n // Apply paragraph formatting to all paragraphs using this list\n this.applyFormattingToListParagraphs(instance.getNumId());\n count++;\n }\n\n return count;\n }\n\n /**\n * Applies standard formatting to all numbered lists in the document\n *\n * Standardizes numbered lists with (preserves existing numbering format):\n * - Indentation: 0.5\" increments (720 twips per level)\n * - Hanging indent: 0.25\" (360 twips)\n * - Number font: Verdana 12pt\n * - Paragraph text: Verdana 12pt\n * - Spacing: 0pt before, 3pt after (60 twips)\n * - Contextual spacing enabled (no spacing between same-type paragraphs)\n *\n * Note: This preserves the existing numbering format (decimal, roman, etc.)\n * and only standardizes the visual formatting. To change numbering formats,\n * use normalizeNumberedLists() instead.\n *\n * @returns Number of numbered lists updated\n * @example\n * ```typescript\n * const doc = await Document.load('document.docx');\n * const count = doc.applyStandardNumberedListFormatting();\n * console.log(`Standardized ${count} numbered lists`);\n * await doc.save('document-formatted.docx');\n * ```\n */\n applyStandardNumberedListFormatting(): number {\n const instances = this.numberingManager.getAllInstances();\n let count = 0;\n\n for (const instance of instances) {\n const abstractNumId = instance.getAbstractNumId();\n const abstractNum = this.numberingManager.getAbstractNumbering(abstractNumId);\n\n if (!abstractNum) continue;\n\n // Only process numbered lists (skip bullet lists)\n const level0 = abstractNum.getLevel(0);\n if (!level0 || level0.getFormat() === 'bullet') continue;\n\n // Update all 9 levels (0-8) with standard formatting\n for (let levelIndex = 0; levelIndex < 9; levelIndex++) {\n const numLevel = abstractNum.getLevel(levelIndex);\n if (!numLevel) continue;\n\n // Set number font to Verdana 12pt\n numLevel.setFont('Verdana');\n numLevel.setFontSize(24); // 12pt = 24 half-points\n\n // Indentation: 0.5\" per level (720 twips)\n // Level 0 = 720, Level 1 = 1440, Level 2 = 2160, etc.\n numLevel.setLeftIndent(720 * (levelIndex + 1));\n\n // Hanging indent: 0.25\" (360 twips) for all levels\n numLevel.setHangingIndent(360);\n\n // Set alignment to left\n numLevel.setAlignment('left');\n }\n\n // Apply paragraph formatting to all paragraphs using this list\n this.applyFormattingToListParagraphs(instance.getNumId());\n count++;\n }\n\n return count;\n }\n\n /**\n * Applies formatting to all paragraphs that use a specific numbering instance\n * Sets font, spacing, and contextual spacing properties\n * @param numId The numbering instance ID\n * @private\n */\n private applyFormattingToListParagraphs(numId: number): void {\n const paragraphs = this.getAllParagraphs();\n\n for (const para of paragraphs) {\n const numbering = para.getNumbering();\n if (numbering?.numId === numId) {\n // Apply font to all runs in the paragraph\n const runs = para.getRuns();\n for (const run of runs) {\n run.setFont('Verdana', 12);\n }\n\n // Apply paragraph spacing\n para.setSpaceBefore(0); // 0pt before\n para.setSpaceAfter(60); // 3pt after (60 twips)\n para.setContextualSpacing(true); // No spacing between same-type paragraphs\n\n // Clear paragraph-level indentation so numbering definition indentation takes effect\n // Paragraph-level indentation overrides numbering indentation, so we need to remove it\n para.formatting.indentation = undefined;\n }\n }\n }\n\n /**\n * Checks if a paragraph is contained within a table cell\n * @param para The paragraph to check\n * @returns Object with inTable boolean and cell reference if found\n * @private\n */\n private isParagraphInTable(para: Paragraph): {\n inTable: boolean;\n cell?: TableCell;\n } {\n const allTables = this.getAllTables();\n\n for (const table of allTables) {\n for (const row of table.getRows()) {\n for (const cell of row.getCells()) {\n const cellParas = cell.getParagraphs();\n for (const cellPara of cellParas) {\n if (cellPara === para) {\n return { inTable: true, cell };\n }\n }\n }\n }\n }\n\n return { inTable: false };\n }\n\n /**\n * Wraps a paragraph in a 1x1 table and applies cell formatting\n * @param para The paragraph to wrap\n * @param options Formatting options for the table cell\n * @returns The created table\n * @private\n */\n private wrapParagraphInTable(\n para: Paragraph,\n options: {\n shading?: string;\n marginTop?: number;\n marginBottom?: number;\n marginLeft?: number;\n marginRight?: number;\n tableWidthPercent?: number;\n }\n ): Table {\n // Find the paragraph index in bodyElements\n const paraIndex = this.bodyElements.indexOf(para);\n if (paraIndex === -1) {\n throw new Error('Paragraph not found in document body elements');\n }\n\n // Create 1x1 table\n const table = new Table(1, 1);\n const cell = table.getCell(0, 0);\n\n if (!cell) {\n throw new Error('Failed to get cell from newly created table');\n }\n\n // Move paragraph to cell\n // Remove paragraph from document body\n this.bodyElements.splice(paraIndex, 1);\n\n // Add paragraph to cell\n cell.addParagraph(para);\n\n // Apply cell formatting\n if (options.shading) {\n cell.setShading({ fill: options.shading });\n }\n\n if (\n options.marginTop !== undefined ||\n options.marginBottom !== undefined ||\n options.marginLeft !== undefined ||\n options.marginRight !== undefined\n ) {\n cell.setMargins({\n top: options.marginTop ?? 100,\n bottom: options.marginBottom ?? 100,\n left: options.marginLeft ?? 100,\n right: options.marginRight ?? 100,\n });\n }\n\n // Set table width (percentage of page width)\n if (options.tableWidthPercent !== undefined) {\n table.setWidth(options.tableWidthPercent);\n table.setWidthType('pct');\n }\n\n // Insert table where paragraph was\n this.bodyElements.splice(paraIndex, 0, table);\n\n return table;\n }\n\n // Default style configurations for applyStyles()\n private static readonly DEFAULT_HEADING1_CONFIG: StyleConfig = {\n run: {\n font: 'Verdana',\n size: 18,\n bold: true,\n color: '000000',\n },\n paragraph: {\n alignment: 'left',\n spacing: { before: 0, after: 240, line: 240, lineRule: 'auto' },\n },\n };\n\n private static readonly DEFAULT_HEADING2_CONFIG: Heading2Config = {\n run: {\n font: 'Verdana',\n size: 14,\n bold: true,\n color: '000000',\n },\n paragraph: {\n alignment: 'left',\n spacing: { before: 120, after: 120, line: 240, lineRule: 'auto' },\n },\n tableOptions: {\n shading: 'BFBFBF',\n marginTop: 0,\n marginBottom: 0,\n marginLeft: 115,\n marginRight: 115,\n tableWidthPercent: 5000,\n },\n };\n\n private static readonly DEFAULT_HEADING3_CONFIG: StyleConfig = {\n run: {\n font: 'Verdana',\n size: 12,\n bold: true,\n color: '000000',\n },\n paragraph: {\n alignment: 'left',\n spacing: { before: 60, after: 60, line: 240, lineRule: 'auto' },\n },\n };\n\n private static readonly DEFAULT_NORMAL_CONFIG: StyleConfig = {\n run: {\n font: 'Verdana',\n size: 12,\n color: '000000',\n },\n paragraph: {\n alignment: 'left',\n spacing: { before: 60, after: 60, line: 240, lineRule: 'auto' },\n },\n };\n\n private static readonly DEFAULT_LIST_PARAGRAPH_CONFIG: StyleConfig = {\n run: {\n font: 'Verdana',\n size: 12,\n color: '000000',\n },\n paragraph: {\n alignment: 'left',\n spacing: { before: 0, after: 60, line: 240, lineRule: 'auto' },\n indentation: { left: 360, hanging: 360 },\n contextualSpacing: true,\n },\n };\n\n /**\n * Gets all Run instances from a paragraph, including those nested inside\n * Revision, Hyperlink, and other container elements.\n *\n * This method recursively extracts runs from:\n * - Direct Run children of the paragraph\n * - Runs inside Revision elements (tracked changes)\n * - Runs inside Hyperlink elements\n *\n * @param para - The paragraph to extract runs from\n * @returns Array of all Run instances found in the paragraph\n * @private\n */\n private getAllRunsFromParagraph(para: Paragraph): Run[] {\n const runs: Run[] = [];\n const content = para.getContent();\n\n for (const item of content) {\n if (item instanceof Run) {\n // Direct run\n runs.push(item);\n } else if (item instanceof Revision) {\n // Skip deleted/moved-away content — these runs are inactive\n const revType = item.getType();\n if (revType === 'delete' || revType === 'moveFrom') {\n continue;\n }\n const revisionRuns = item.getRuns();\n runs.push(...revisionRuns);\n } else if (item instanceof Hyperlink) {\n // Run inside hyperlink (Hyperlink has a single run)\n const hyperlinkRun = item.getRun();\n runs.push(hyperlinkRun);\n }\n }\n\n return runs;\n }\n\n /**\n * Applies styles to the document with custom formatting\n *\n * Modifies existing Heading1, Heading2, Heading3, Normal, and List Paragraph style definitions\n * with custom formatting. This approach preserves the original style names while updating their formatting.\n *\n * **Key Feature**: Only properties explicitly provided in options will override current style values.\n * The method reads the ACTUAL current values from the style objects, not hardcoded defaults.\n * This allows you to change just one property (like font) while keeping all other existing values.\n *\n * Per ECMA-376 §17.7.2, direct formatting in document.xml ALWAYS overrides\n * style definitions in styles.xml. This method clears conflicting direct\n * formatting from paragraphs to allow style modifications to take effect.\n *\n * Fallback defaults (when no options provided OR style doesn't exist):\n * - Heading1: 18pt black bold Verdana, left aligned, 0pt before / 12pt after, single line spacing, no italic/underline\n * - Heading2: 14pt black bold Verdana, left aligned, 6pt before/after, single line spacing, wrapped in gray tables (0.08\" margins), no italic/underline\n * - Heading3: 12pt black bold Verdana, left aligned, 3pt before/after, single line spacing, no table wrapping, no italic/underline\n * - Normal: 12pt Verdana, left aligned, 3pt before/after, single line spacing, no italic/underline\n * - List Paragraph: 12pt Verdana, left aligned, 0pt before / 3pt after, single line spacing, 0.25\" bullet indent / 0.50\" text indent, contextual spacing enabled, no italic/underline\n *\n * Heading2 table wrapping behavior:\n * - Empty Heading2 paragraphs are skipped (not wrapped in tables)\n * - Heading2 paragraphs already in tables have their cell formatted (shading, margins, width)\n * - Heading2 paragraphs not in tables are wrapped in new 1x1 tables\n * - Table appearance is configurable via options.heading2.tableOptions\n *\n * @param options - Optional custom formatting configuration for each style. Properties merge with current values.\n * @returns Object indicating which styles were successfully modified\n *\n * @example\n * ```typescript\n * // Use default formatting (applies Verdana defaults)\n * doc.applyStyles();\n * ```\n *\n * @example\n * ```typescript\n * // Just change font, keep all other existing style values\n * doc.applyStyles({\n * heading1: {\n * run: { font: 'Arial' } // Only overrides font, keeps existing size/bold/color/etc.\n * }\n * });\n * ```\n *\n * @example\n * ```typescript\n * // Comprehensive custom formatting\n * doc.applyStyles({\n * heading1: {\n * run: { font: 'Arial', size: 16, bold: true, color: '000000' },\n * paragraph: { spacing: { before: 0, after: 200, line: 240, lineRule: 'auto' } }\n * },\n * heading2: {\n * run: { font: 'Arial', size: 14, bold: true },\n * paragraph: { spacing: { before: 100, after: 100 } },\n * tableOptions: { shading: '808080', marginLeft: 150, marginRight: 150 }\n * }\n * });\n * ```\n */\n public applyStyles(options?: ApplyStylesOptions): {\n heading1: boolean;\n heading2: boolean;\n heading3: boolean;\n normal: boolean;\n listParagraph: boolean;\n } {\n const results = {\n heading1: false,\n heading2: false,\n heading3: false,\n normal: false,\n listParagraph: false,\n };\n\n // Get existing styles from StylesManager\n const heading1 = this.stylesManager.getStyle('Heading1');\n const heading2 = this.stylesManager.getStyle('Heading2');\n const heading3 = this.stylesManager.getStyle('Heading3');\n const normal = this.stylesManager.getStyle('Normal');\n const listParagraph = this.stylesManager.getStyle('ListParagraph');\n\n // Merge provided options with ACTUAL current style values (not hardcoded defaults)\n // This allows users to only specify properties they want to change\n const h1Config = {\n run: {\n ...(heading1?.getRunFormatting() || Document.DEFAULT_HEADING1_CONFIG.run),\n ...options?.heading1?.run,\n },\n paragraph: {\n ...(heading1?.getParagraphFormatting() || Document.DEFAULT_HEADING1_CONFIG.paragraph),\n ...options?.heading1?.paragraph,\n },\n };\n const h2Config = {\n run: {\n ...(heading2?.getRunFormatting() || Document.DEFAULT_HEADING2_CONFIG.run),\n ...options?.heading2?.run,\n },\n paragraph: {\n ...(heading2?.getParagraphFormatting() || Document.DEFAULT_HEADING2_CONFIG.paragraph),\n ...options?.heading2?.paragraph,\n },\n tableOptions: {\n ...Document.DEFAULT_HEADING2_CONFIG.tableOptions,\n ...options?.heading2?.tableOptions,\n },\n };\n const h3Config = {\n run: {\n ...(heading3?.getRunFormatting() || Document.DEFAULT_HEADING3_CONFIG.run),\n ...options?.heading3?.run,\n },\n paragraph: {\n ...(heading3?.getParagraphFormatting() || Document.DEFAULT_HEADING3_CONFIG.paragraph),\n ...options?.heading3?.paragraph,\n },\n };\n const normalConfig = {\n run: {\n ...(normal?.getRunFormatting() || Document.DEFAULT_NORMAL_CONFIG.run),\n ...options?.normal?.run,\n },\n paragraph: {\n ...(normal?.getParagraphFormatting() || Document.DEFAULT_NORMAL_CONFIG.paragraph),\n ...options?.normal?.paragraph,\n },\n };\n const listParaConfig = {\n run: {\n ...(listParagraph?.getRunFormatting() || Document.DEFAULT_LIST_PARAGRAPH_CONFIG.run),\n ...options?.listParagraph?.run,\n },\n paragraph: {\n ...(listParagraph?.getParagraphFormatting() ||\n Document.DEFAULT_LIST_PARAGRAPH_CONFIG.paragraph),\n ...options?.listParagraph?.paragraph,\n },\n };\n\n // Extract preserve blank lines option (defaults to true)\n const preserveBlankLines = options?.preserveBlankLinesAfterHeading2Tables ?? true;\n\n // Modify Heading1 definition\n if (heading1 && h1Config.run && h1Config.paragraph) {\n if (h1Config.run) heading1.setRunFormatting(h1Config.run);\n if (h1Config.paragraph) heading1.setParagraphFormatting(h1Config.paragraph);\n // Mark style as modified so it gets included in mergeStylesWithOriginal()\n this.addStyle(heading1);\n results.heading1 = true;\n }\n\n // Modify Heading2 definition\n if (heading2 && h2Config.run && h2Config.paragraph) {\n if (h2Config.run) heading2.setRunFormatting(h2Config.run);\n if (h2Config.paragraph) heading2.setParagraphFormatting(h2Config.paragraph);\n // Mark style as modified so it gets included in mergeStylesWithOriginal()\n this.addStyle(heading2);\n results.heading2 = true;\n }\n\n // Modify Heading3 definition\n if (heading3 && h3Config.run && h3Config.paragraph) {\n if (h3Config.run) heading3.setRunFormatting(h3Config.run);\n if (h3Config.paragraph) heading3.setParagraphFormatting(h3Config.paragraph);\n // Mark style as modified so it gets included in mergeStylesWithOriginal()\n this.addStyle(heading3);\n results.heading3 = true;\n }\n\n // Modify Normal definition\n if (normal && normalConfig.run && normalConfig.paragraph) {\n if (normalConfig.run) normal.setRunFormatting(normalConfig.run);\n if (normalConfig.paragraph) normal.setParagraphFormatting(normalConfig.paragraph);\n // Mark style as modified so it gets included in mergeStylesWithOriginal()\n this.addStyle(normal);\n\n // Link NormalWeb to Normal (if enabled and NormalWeb exists)\n // Default is true - changes to Normal automatically apply to NormalWeb\n const shouldLinkNormalWeb = options?.linkNormalWebToNormal !== false;\n if (shouldLinkNormalWeb) {\n const normalWeb = this.stylesManager.getStyle('NormalWeb');\n if (normalWeb) {\n // Apply same formatting to NormalWeb\n if (normalConfig.run) normalWeb.setRunFormatting(normalConfig.run);\n if (normalConfig.paragraph) normalWeb.setParagraphFormatting(normalConfig.paragraph);\n // Mark as modified for selective merging during save\n this.addStyle(normalWeb);\n }\n }\n\n results.normal = true;\n }\n\n // Modify List Paragraph definition\n if (listParagraph && listParaConfig.run && listParaConfig.paragraph) {\n if (listParaConfig.run) listParagraph.setRunFormatting(listParaConfig.run);\n if (listParaConfig.paragraph) {\n // Validate indentation: hanging must not exceed left to prevent negative bullet position\n const indent = listParaConfig.paragraph.indentation;\n if (indent?.hanging !== undefined && indent?.left !== undefined) {\n if (indent.hanging > indent.left) {\n const logger = getGlobalLogger();\n logger.warn(\n `[Document] ListParagraph indentation: hanging (${indent.hanging}) > left (${indent.left}). ` +\n `Capping hanging to left to prevent negative bullet position.`\n );\n indent.hanging = indent.left;\n }\n }\n listParagraph.setParagraphFormatting(listParaConfig.paragraph);\n }\n // Mark style as modified so it gets included in mergeStylesWithOriginal()\n this.addStyle(listParagraph);\n results.listParagraph = true;\n }\n\n // Extract preserve flags from configurations\n const h1Preserve = {\n bold: h1Config.run?.preserveBold ?? false,\n italic: h1Config.run?.preserveItalic ?? false,\n underline: h1Config.run?.preserveUnderline ?? false,\n };\n const h2Preserve = {\n bold: h2Config.run?.preserveBold ?? false,\n italic: h2Config.run?.preserveItalic ?? false,\n underline: h2Config.run?.preserveUnderline ?? false,\n };\n const h3Preserve = {\n bold: h3Config.run?.preserveBold ?? false,\n italic: h3Config.run?.preserveItalic ?? false,\n underline: h3Config.run?.preserveUnderline ?? false,\n };\n const normalPreserve = {\n bold: normalConfig.run?.preserveBold ?? true,\n italic: normalConfig.run?.preserveItalic ?? false,\n underline: normalConfig.run?.preserveUnderline ?? false,\n };\n const listParaPreserve = {\n bold: listParaConfig.run?.preserveBold ?? true,\n italic: listParaConfig.run?.preserveItalic ?? false,\n underline: listParaConfig.run?.preserveUnderline ?? false,\n };\n\n // Clear direct formatting from affected paragraphs and wrap Heading2 in tables\n // Use a Set to track processed paragraphs and prevent duplicate wrapping\n const processedParagraphs = new Set<Paragraph>();\n\n // Get all paragraphs ONCE before modifications to prevent processing duplicates\n const allParas = this.getAllParagraphs();\n\n for (const para of allParas) {\n // Skip if already processed\n if (processedParagraphs.has(para)) {\n continue;\n }\n\n const styleId = para.getStyle();\n\n // Process Heading1 paragraphs\n if (styleId === 'Heading1' && heading1) {\n // Save white font status BEFORE clearing (clearDirectFormattingConflicts clears color)\n const allRuns = this.getAllRunsFromParagraph(para);\n const whiteFontRuns = new Set(\n options?.preserveWhiteFont\n ? allRuns.filter((run) => run.getColor()?.toUpperCase() === 'FFFFFF')\n : []\n );\n\n para.clearDirectFormattingConflicts(heading1);\n\n // Apply formatting to all runs (including those in revisions/hyperlinks), respecting preserve flags\n for (const run of allRuns) {\n // Skip runs with Hyperlink style - preserve their blue color and underline\n if (run.isHyperlinkStyled()) {\n continue;\n }\n if (!h1Preserve.bold) {\n run.setBold(h1Config.run?.bold ?? false);\n }\n if (!h1Preserve.italic) {\n run.setItalic(h1Config.run?.italic ?? false);\n }\n if (!h1Preserve.underline) {\n run.setUnderline(h1Config.run?.underline ? 'single' : false);\n }\n // Apply font, color, and size - skip color if run was white font\n if (h1Config.run?.font) {\n run.setFont(h1Config.run.font);\n }\n if (h1Config.run?.color !== undefined) {\n if (whiteFontRuns.has(run)) {\n // Restore white font\n run.setColor('FFFFFF');\n } else {\n run.setColor(h1Config.run.color);\n }\n }\n if (h1Config.run?.size) {\n run.setSize(h1Config.run.size);\n }\n }\n\n // Update paragraph mark properties to match configuration\n if (para.formatting.paragraphMarkRunProperties) {\n const markProps = para.formatting.paragraphMarkRunProperties;\n if (!h1Preserve.bold && h1Config.run?.bold === false && markProps.bold) {\n delete markProps.bold;\n }\n if (!h1Preserve.italic && h1Config.run?.italic === false && markProps.italic) {\n delete markProps.italic;\n }\n if (!h1Preserve.underline && h1Config.run?.underline === false && markProps.underline) {\n delete markProps.underline;\n }\n // Update paragraph mark font, color, size\n if (h1Config.run?.font) {\n markProps.font = h1Config.run.font;\n }\n if (h1Config.run?.color) {\n markProps.color = h1Config.run.color;\n }\n if (h1Config.run?.size) {\n markProps.size = h1Config.run.size;\n }\n }\n\n processedParagraphs.add(para);\n }\n\n // Process Heading2 paragraphs\n else if (styleId === 'Heading2' && heading2) {\n // Check if paragraph has actual text content (skip empty paragraphs)\n const hasContent = this.getAllRunsFromParagraph(para).some(\n (run) => run.getText().trim().length > 0\n );\n\n if (!hasContent) {\n // Skip empty Heading2 paragraphs - don't wrap them in tables\n processedParagraphs.add(para);\n continue;\n }\n\n // Check if paragraph is in a table FIRST (need this info for alignment preservation)\n const { inTable, cell } = this.isParagraphInTable(para);\n\n // Preserve alignment for shaded cells in multi-cell tables\n // Centering should not be cleared by clearDirectFormattingConflicts()\n let preservedAlignment: typeof para.formatting.alignment = undefined;\n\n if (inTable && cell) {\n // Find the table to check if it's > 1x1\n const table = this.getAllTables().find((t) => {\n for (const row of t.getRows()) {\n for (const c of row.getCells()) {\n if (c === cell) return true;\n }\n }\n return false;\n });\n\n // Preserve alignment for shaded cells in multi-cell tables\n if (table) {\n const rowCount = table.getRowCount();\n const colCount = table.getColumnCount();\n const isMultiCellTable = !(rowCount === 1 && colCount === 1);\n const cellFormatting = cell.getFormatting();\n const cellHasShading = !!(\n cellFormatting?.shading?.fill || cellFormatting?.shading?.pattern\n );\n\n if (isMultiCellTable && cellHasShading && para.formatting.alignment) {\n preservedAlignment = para.formatting.alignment;\n }\n }\n }\n\n // Save white font status BEFORE clearing (clearDirectFormattingConflicts clears color)\n const allRuns = this.getAllRunsFromParagraph(para);\n const whiteFontRuns = new Set(\n options?.preserveWhiteFont\n ? allRuns.filter((run) => run.getColor()?.toUpperCase() === 'FFFFFF')\n : []\n );\n\n // Clear direct formatting\n para.clearDirectFormattingConflicts(heading2);\n\n // Restore preserved alignment\n if (preservedAlignment) {\n para.setAlignment(preservedAlignment);\n }\n\n // Apply formatting to all runs (including those in revisions/hyperlinks), respecting preserve flags\n for (const run of allRuns) {\n // Skip runs with Hyperlink style - preserve their blue color and underline\n if (run.isHyperlinkStyled()) {\n continue;\n }\n if (!h2Preserve.bold) {\n run.setBold(h2Config.run?.bold ?? false);\n }\n if (!h2Preserve.italic) {\n run.setItalic(h2Config.run?.italic ?? false);\n }\n if (!h2Preserve.underline) {\n run.setUnderline(h2Config.run?.underline ? 'single' : false);\n }\n // Apply font, color, and size - skip color if run was white font\n if (h2Config.run?.font) {\n run.setFont(h2Config.run.font);\n }\n if (h2Config.run?.color !== undefined) {\n if (whiteFontRuns.has(run)) {\n // Restore white font\n run.setColor('FFFFFF');\n } else {\n run.setColor(h2Config.run.color);\n }\n }\n if (h2Config.run?.size) {\n run.setSize(h2Config.run.size);\n }\n }\n\n // Update paragraph mark properties to match configuration\n if (para.formatting.paragraphMarkRunProperties) {\n const markProps = para.formatting.paragraphMarkRunProperties;\n if (!h2Preserve.bold && h2Config.run?.bold === false && markProps.bold) {\n delete markProps.bold;\n }\n if (!h2Preserve.italic && h2Config.run?.italic === false && markProps.italic) {\n delete markProps.italic;\n }\n if (!h2Preserve.underline && h2Config.run?.underline === false && markProps.underline) {\n delete markProps.underline;\n }\n // Update paragraph mark font, color, size\n if (h2Config.run?.font) {\n markProps.font = h2Config.run.font;\n }\n if (h2Config.run?.color) {\n markProps.color = h2Config.run.color;\n }\n if (h2Config.run?.size) {\n markProps.size = h2Config.run.size;\n }\n }\n\n if (inTable && cell) {\n // Paragraph is already in a table - apply cell formatting using config\n if (h2Config.tableOptions?.shading) {\n cell.setShading({ fill: h2Config.tableOptions.shading });\n }\n if (\n h2Config.tableOptions?.marginTop !== undefined ||\n h2Config.tableOptions?.marginBottom !== undefined ||\n h2Config.tableOptions?.marginLeft !== undefined ||\n h2Config.tableOptions?.marginRight !== undefined\n ) {\n cell.setMargins({\n top: h2Config.tableOptions.marginTop ?? 0,\n bottom: h2Config.tableOptions.marginBottom ?? 0,\n left: h2Config.tableOptions.marginLeft ?? 115,\n right: h2Config.tableOptions.marginRight ?? 115,\n });\n }\n\n // Set table width using config\n if (h2Config.tableOptions?.tableWidthPercent) {\n const table = this.getAllTables().find((t) => {\n for (const row of t.getRows()) {\n for (const c of row.getCells()) {\n if (c === cell) return true;\n }\n }\n return false;\n });\n if (table) {\n table.setWidth(h2Config.tableOptions.tableWidthPercent);\n table.setWidthType('pct');\n }\n }\n } else {\n // Paragraph is not in a table - wrap it using config\n const table = this.wrapParagraphInTable(para, {\n shading: h2Config.tableOptions?.shading ?? 'BFBFBF',\n marginTop: h2Config.tableOptions?.marginTop ?? 0,\n marginBottom: h2Config.tableOptions?.marginBottom ?? 0,\n marginLeft: h2Config.tableOptions?.marginLeft ?? 115,\n marginRight: h2Config.tableOptions?.marginRight ?? 115,\n tableWidthPercent: h2Config.tableOptions?.tableWidthPercent ?? 5000,\n });\n\n // Add blank paragraph after table for spacing (only if not already present)\n const tableIndex = this.bodyElements.indexOf(table);\n if (tableIndex !== -1) {\n // Check if the next element has any content (text, hyperlinks, images, etc.)\n const nextElement = this.bodyElements[tableIndex + 1];\n\n // Check if next element is truly blank (no content at all)\n const isNextElementBlank = (() => {\n if (!(nextElement instanceof Paragraph)) return false;\n\n const content = nextElement.getContent();\n if (!content || content.length === 0) return true;\n\n // Check if all content items are empty\n for (const item of content) {\n // Hyperlinks count as content\n if (item instanceof Hyperlink) {\n return false;\n }\n // Images count as content (check for Image class when implemented)\n // Runs with text count as content\n if ((item as any).getText) {\n const text = (item as any).getText().trim();\n if (text !== '') return false;\n }\n }\n\n return true; // All content is empty\n })();\n\n // Only add blank paragraph if next element is truly blank or doesn't exist\n if (!isNextElementBlank) {\n const blankPara = Paragraph.create();\n // Add explicit spacing to ensure visibility in Word (120 twips = 6pt)\n blankPara.setSpaceAfter(120);\n // Mark as preserved if option is enabled (defaults to true)\n if (preserveBlankLines) {\n blankPara.setPreserved(true);\n }\n this.bodyElements.splice(tableIndex + 1, 0, blankPara);\n }\n }\n }\n\n processedParagraphs.add(para);\n }\n\n // Process Heading3 paragraphs\n else if (styleId === 'Heading3' && heading3) {\n // Save white font status BEFORE clearing (clearDirectFormattingConflicts clears color)\n const allRuns = this.getAllRunsFromParagraph(para);\n const whiteFontRuns = new Set(\n options?.preserveWhiteFont\n ? allRuns.filter((run) => run.getColor()?.toUpperCase() === 'FFFFFF')\n : []\n );\n\n para.clearDirectFormattingConflicts(heading3);\n\n // Apply formatting to all runs (including those in revisions/hyperlinks), respecting preserve flags\n for (const run of allRuns) {\n // Skip runs with Hyperlink style - preserve their blue color and underline\n if (run.isHyperlinkStyled()) {\n continue;\n }\n if (!h3Preserve.bold) {\n run.setBold(h3Config.run?.bold ?? false);\n }\n if (!h3Preserve.italic) {\n run.setItalic(h3Config.run?.italic ?? false);\n }\n if (!h3Preserve.underline) {\n run.setUnderline(h3Config.run?.underline ? 'single' : false);\n }\n // Apply font, color, and size - skip color if run was white font\n if (h3Config.run?.font) {\n run.setFont(h3Config.run.font);\n }\n if (h3Config.run?.color !== undefined) {\n if (whiteFontRuns.has(run)) {\n // Restore white font\n run.setColor('FFFFFF');\n } else {\n run.setColor(h3Config.run.color);\n }\n }\n if (h3Config.run?.size) {\n run.setSize(h3Config.run.size);\n }\n }\n\n // Update paragraph mark properties to match configuration\n if (para.formatting.paragraphMarkRunProperties) {\n const markProps = para.formatting.paragraphMarkRunProperties;\n if (!h3Preserve.bold && h3Config.run?.bold === false && markProps.bold) {\n delete markProps.bold;\n }\n if (!h3Preserve.italic && h3Config.run?.italic === false && markProps.italic) {\n delete markProps.italic;\n }\n if (!h3Preserve.underline && h3Config.run?.underline === false && markProps.underline) {\n delete markProps.underline;\n }\n // Update paragraph mark font, color, size\n if (h3Config.run?.font) {\n markProps.font = h3Config.run.font;\n }\n if (h3Config.run?.color) {\n markProps.color = h3Config.run.color;\n }\n if (h3Config.run?.size) {\n markProps.size = h3Config.run.size;\n }\n }\n\n processedParagraphs.add(para);\n }\n\n // Process List Paragraph paragraphs\n else if (styleId === 'ListParagraph' && listParagraph) {\n // Check for mis-styled paragraphs: ListParagraph + left:0 + no numbering\n // These are not actual list items - change them to Normal style\n const paraIndentation = para.getFormatting().indentation;\n const hasNumbering = para.getNumbering();\n if (paraIndentation?.left === 0 && !hasNumbering) {\n // This paragraph has ListParagraph style but explicitly overrides indent to 0\n // and has no numbering - it should be Normal style, not ListParagraph\n para.setStyle('Normal');\n\n // Preserve existing bold formatting and white font before applying Normal style\n const allRuns = this.getAllRunsFromParagraph(para);\n const preservedBold = allRuns.map((run) => ({\n run,\n bold: run.getBold(),\n isWhiteFont: options?.preserveWhiteFont && run.getColor()?.toUpperCase() === 'FFFFFF',\n }));\n\n // Process as Normal style - skip ListParagraph processing\n if (normal) {\n para.clearDirectFormattingConflicts(normal);\n for (const saved of preservedBold) {\n const run = saved.run;\n // Apply Normal style formatting\n if (normalConfig.run?.font) {\n run.setFont(normalConfig.run.font);\n }\n if (normalConfig.run?.color !== undefined) {\n if (saved.isWhiteFont) {\n // Restore white font\n run.setColor('FFFFFF');\n } else {\n run.setColor(normalConfig.run.color);\n }\n }\n if (normalConfig.run?.size && normalConfig.run?.font) {\n run.setFont(normalConfig.run.font, normalConfig.run.size);\n }\n }\n }\n\n // Restore bold formatting that was present before conversion\n for (const saved of preservedBold) {\n if (saved.bold) {\n saved.run.setBold(true);\n }\n }\n\n processedParagraphs.add(para);\n continue;\n }\n\n // Save formatting that should be preserved BEFORE clearing\n const allRuns = this.getAllRunsFromParagraph(para);\n const preservedFormatting = allRuns.map((run) => {\n const fmt = run.getFormatting();\n return {\n run: run,\n bold: listParaPreserve.bold ? fmt.bold : undefined,\n italic: listParaPreserve.italic ? fmt.italic : undefined,\n underline: listParaPreserve.underline ? fmt.underline : undefined,\n isWhiteFont: options?.preserveWhiteFont && fmt.color?.toUpperCase() === 'FFFFFF',\n };\n });\n\n para.clearDirectFormattingConflicts(listParagraph);\n\n // Restore preserved formatting AFTER clearing\n for (const saved of preservedFormatting) {\n if (saved.bold !== undefined) {\n saved.run.setBold(saved.bold);\n }\n if (saved.italic !== undefined) {\n saved.run.setItalic(saved.italic);\n }\n if (saved.underline !== undefined) {\n saved.run.setUnderline(saved.underline);\n }\n }\n\n // Apply formatting to all runs (including those in revisions/hyperlinks), respecting preserve flags\n for (const saved of preservedFormatting) {\n const run = saved.run;\n // Skip runs with Hyperlink style - preserve their blue color and underline\n if (run.isHyperlinkStyled()) {\n continue;\n }\n if (!listParaPreserve.bold) {\n run.setBold(listParaConfig.run?.bold ?? false);\n }\n if (!listParaPreserve.italic) {\n run.setItalic(listParaConfig.run?.italic ?? false);\n }\n if (!listParaPreserve.underline) {\n run.setUnderline(listParaConfig.run?.underline ? 'single' : false);\n }\n // Apply font, color, and size - skip color if run was white font\n if (listParaConfig.run?.font) {\n run.setFont(listParaConfig.run.font);\n }\n if (listParaConfig.run?.color !== undefined) {\n if (saved.isWhiteFont) {\n // Restore white font\n run.setColor('FFFFFF');\n } else {\n run.setColor(listParaConfig.run.color);\n }\n }\n if (listParaConfig.run?.size) {\n run.setSize(listParaConfig.run.size);\n }\n }\n\n // Update paragraph mark properties to match configuration\n if (para.formatting.paragraphMarkRunProperties) {\n const markProps = para.formatting.paragraphMarkRunProperties;\n if (!listParaPreserve.bold && listParaConfig.run?.bold === false && markProps.bold) {\n delete markProps.bold;\n }\n if (\n !listParaPreserve.italic &&\n listParaConfig.run?.italic === false &&\n markProps.italic\n ) {\n delete markProps.italic;\n }\n if (\n !listParaPreserve.underline &&\n listParaConfig.run?.underline === false &&\n markProps.underline\n ) {\n delete markProps.underline;\n }\n // Update paragraph mark font, color, size\n if (listParaConfig.run?.font) {\n markProps.font = listParaConfig.run.font;\n }\n if (listParaConfig.run?.color) {\n markProps.color = listParaConfig.run.color;\n }\n if (listParaConfig.run?.size) {\n markProps.size = listParaConfig.run.size;\n }\n }\n\n processedParagraphs.add(para);\n }\n\n // Process Normal paragraphs (including undefined style which defaults to Normal)\n // Also process NormalWeb paragraphs when linkNormalWebToNormal is enabled (default: true)\n else if (\n (styleId === 'Normal' ||\n styleId === undefined ||\n (styleId === 'NormalWeb' && options?.linkNormalWebToNormal !== false)) &&\n normal\n ) {\n // Save formatting that should be preserved BEFORE clearing\n const allRuns = this.getAllRunsFromParagraph(para);\n const preservedFormatting = allRuns.map((run) => {\n const fmt = run.getFormatting();\n return {\n run: run,\n bold: normalPreserve.bold ? fmt.bold : undefined,\n italic: normalPreserve.italic ? fmt.italic : undefined,\n underline: normalPreserve.underline ? fmt.underline : undefined,\n isWhiteFont: options?.preserveWhiteFont && fmt.color?.toUpperCase() === 'FFFFFF',\n };\n });\n\n // Save center alignment BEFORE clearing if preserveCenterAlignment is set\n const savedCenterAlignment =\n options?.normal?.preserveCenterAlignment && para.getAlignment() === 'center';\n\n para.clearDirectFormattingConflicts(normal);\n\n // Restore center alignment if it was saved\n if (savedCenterAlignment) {\n para.setAlignment('center');\n }\n\n // Restore preserved formatting AFTER clearing\n for (const saved of preservedFormatting) {\n if (saved.bold !== undefined) {\n saved.run.setBold(saved.bold);\n }\n if (saved.italic !== undefined) {\n saved.run.setItalic(saved.italic);\n }\n if (saved.underline !== undefined) {\n saved.run.setUnderline(saved.underline);\n }\n }\n\n // Apply formatting to all runs (including those in revisions/hyperlinks), respecting preserve flags\n for (const saved of preservedFormatting) {\n const run = saved.run;\n // Skip runs with Hyperlink style - preserve their blue color and underline\n if (run.isHyperlinkStyled()) {\n continue;\n }\n if (!normalPreserve.bold) {\n run.setBold(normalConfig.run?.bold ?? false);\n }\n if (!normalPreserve.italic) {\n run.setItalic(normalConfig.run?.italic ?? false);\n }\n if (!normalPreserve.underline) {\n run.setUnderline(normalConfig.run?.underline ? 'single' : false);\n }\n // Apply font, color, and size - skip color if run was white font\n if (normalConfig.run?.font) {\n run.setFont(normalConfig.run.font);\n }\n if (normalConfig.run?.color !== undefined) {\n // Use saved isWhiteFont flag since color was cleared by clearDirectFormattingConflicts\n if (!saved.isWhiteFont) {\n run.setColor(normalConfig.run.color);\n } else {\n // Restore white font\n run.setColor('FFFFFF');\n }\n }\n if (normalConfig.run?.size) {\n run.setSize(normalConfig.run.size);\n }\n }\n\n // Update paragraph mark properties to match configuration\n if (para.formatting.paragraphMarkRunProperties) {\n const markProps = para.formatting.paragraphMarkRunProperties;\n if (!normalPreserve.bold && normalConfig.run?.bold === false && markProps.bold) {\n delete markProps.bold;\n }\n if (!normalPreserve.italic && normalConfig.run?.italic === false && markProps.italic) {\n delete markProps.italic;\n }\n if (\n !normalPreserve.underline &&\n normalConfig.run?.underline === false &&\n markProps.underline\n ) {\n delete markProps.underline;\n }\n // Update paragraph mark font, color, size\n if (normalConfig.run?.font) {\n markProps.font = normalConfig.run.font;\n }\n if (normalConfig.run?.color) {\n markProps.color = normalConfig.run.color;\n }\n if (normalConfig.run?.size) {\n markProps.size = normalConfig.run.size;\n }\n }\n\n processedParagraphs.add(para);\n }\n }\n\n return results;\n }\n\n /**\n * Formats all TOC (Table of Contents) entry styles with the specified formatting.\n * Creates TOC 1-9 styles if they don't exist in the document.\n *\n * When Word updates a TOC field, it looks for these styles in styles.xml and\n * applies them to the generated entries. This method allows you to pre-define\n * how TOC entries will appear.\n *\n * @param options - Formatting options for TOC entries\n * @param options.run - Run (character) formatting to apply\n * @param options.paragraph - Paragraph formatting to apply\n * @param options.levels - Which TOC levels to format (default: 1-9)\n * @param options.indentPerLevel - Relative indentation in twips per level position.\n * When set, the first level in the sorted `levels` array gets 0 indent, the second\n * gets `indentPerLevel`, the third gets `2 * indentPerLevel`, etc. This is useful\n * when the TOC only includes a subset of heading levels (e.g., 2-4) so the first\n * visible level is flush-left. Overrides `paragraph.indentation.left` if both are set.\n * @returns Object indicating which levels were formatted\n *\n * @example\n * ```typescript\n * // Format all TOC entries with consistent styling\n * doc.formatTOCStyles({\n * run: {\n * font: 'Verdana',\n * size: 12,\n * color: '0000FF', // Blue\n * underline: true,\n * bold: false,\n * italic: false\n * },\n * paragraph: {\n * spacing: { before: 0, after: 0 } // 0pt spacing\n * }\n * });\n *\n * // Format only first 3 levels\n * doc.formatTOCStyles({\n * run: { font: 'Arial', size: 11 },\n * levels: [1, 2, 3]\n * });\n *\n * // Relative indentation: Heading 2-4 -> TOC2=0, TOC3=360, TOC4=720\n * doc.formatTOCStyles({\n * run: { font: 'Verdana', size: 12 },\n * levels: [2, 3, 4],\n * indentPerLevel: 360,\n * });\n * ```\n */\n formatTOCStyles(options: {\n run?: StyleRunFormatting;\n paragraph?: StyleParagraphFormatting;\n levels?: number[];\n indentPerLevel?: number;\n }): { formatted: number[] } {\n // Filter valid levels, deduplicate, and sort\n const validLevels = (options.levels ?? [1, 2, 3, 4, 5, 6, 7, 8, 9]).filter(\n (l) => l >= 1 && l <= 9\n );\n const levels = [...new Set(validLevels)].sort((a, b) => a - b);\n const formatted: number[] = [];\n\n for (let i = 0; i < levels.length; i++) {\n const level = levels[i]!;\n const styleId = `TOC${level}`;\n\n // When indentPerLevel is defined, compute relative indent based on position\n let paragraphOverride = options.paragraph;\n if (options.indentPerLevel !== undefined) {\n const relativeIndent = i * options.indentPerLevel;\n paragraphOverride = {\n ...options.paragraph,\n indentation: {\n ...options.paragraph?.indentation,\n left: relativeIndent,\n },\n };\n }\n\n let tocStyle = this.stylesManager.getStyle(styleId);\n\n if (!tocStyle) {\n // Create TOC style if it doesn't exist\n tocStyle = Style.createTOCStyle(level, {\n run: options.run,\n paragraph: paragraphOverride,\n });\n this.addStyle(tocStyle);\n } else {\n // Update existing style\n if (options.run) tocStyle.setRunFormatting(options.run);\n if (paragraphOverride) tocStyle.setParagraphFormatting(paragraphOverride);\n this.addStyle(tocStyle); // Mark as modified\n }\n\n formatted.push(level);\n }\n\n return { formatted };\n }\n\n /**\n * Helper function to apply formatting from Style objects\n *\n * This is a convenience wrapper that accepts Style objects, extracts their properties,\n * and converts them to configuration format before calling {@link applyStyles}.\n *\n * Style objects are matched by their styleId property:\n * - 'Heading1' → applies to Heading1 style\n * - 'Heading2' → applies to Heading2 style (with optional table options)\n * - 'Heading3' → applies to Heading3 style\n * - 'Normal' → applies to Normal style\n * - 'ListParagraph' → applies to List Paragraph style\n *\n * Other styleIds are ignored.\n *\n * @param styles - Variable number of Style objects to apply\n * @returns Object indicating which styles were successfully modified\n *\n * @example\n * // Create Style objects with your desired formatting\n * const h1 = new Style({\n * styleId: 'Heading1',\n * name: 'Heading 1',\n * type: 'paragraph',\n * runFormatting: { font: 'Arial', size: 16, bold: true },\n * paragraphFormatting: { spacing: { before: 0, after: 200 } }\n * });\n *\n * const h2 = Style.createHeadingStyle(2);\n * h2.setRunFormatting({ font: 'Arial', size: 14, bold: true });\n * h2.setHeading2TableOptions({ shading: '808080', marginLeft: 150, marginRight: 150 });\n *\n * // Apply to document\n * doc.applyStylesFromObjects(h1, h2);\n *\n * @example\n * // Just modify one style\n * const myNormal = new Style({\n * styleId: 'Normal',\n * name: 'Normal',\n * type: 'paragraph',\n * runFormatting: { font: 'Times New Roman', size: 12 }\n * });\n * doc.applyStylesFromObjects(myNormal);\n */\n public applyStylesFromObjects(...styles: Style[]): {\n heading1: boolean;\n heading2: boolean;\n heading3: boolean;\n normal: boolean;\n listParagraph: boolean;\n } {\n // Convert Style objects to ApplyStylesOptions\n const options: ApplyStylesOptions = {};\n\n for (const style of styles) {\n const styleId = style.getStyleId();\n\n switch (styleId) {\n case 'Heading1':\n options.heading1 = {\n run: style.getRunFormatting() as any,\n paragraph: style.getParagraphFormatting() as any,\n };\n break;\n\n case 'Heading2':\n options.heading2 = {\n run: style.getRunFormatting() as any,\n paragraph: style.getParagraphFormatting() as any,\n tableOptions: style.getHeading2TableOptions(),\n };\n break;\n\n case 'Heading3':\n options.heading3 = {\n run: style.getRunFormatting() as any,\n paragraph: style.getParagraphFormatting() as any,\n };\n break;\n\n case 'Normal':\n options.normal = {\n run: style.getRunFormatting() as any,\n paragraph: style.getParagraphFormatting() as any,\n };\n break;\n\n case 'ListParagraph':\n options.listParagraph = {\n run: style.getRunFormatting() as any,\n paragraph: style.getParagraphFormatting() as any,\n };\n break;\n\n default:\n // Ignore styles with other styleIds\n break;\n }\n }\n\n // Call existing method with converted options\n return this.applyStyles(options);\n }\n\n /**\n * Updates shading colors in table style definitions in styles.xml.\n *\n * Table styles (e.g., GridTable4-Accent3) often have conditional formatting with\n * hardcoded shading values. When applying table uniformity with different shading\n * colors, the table style definitions should also be updated to match.\n *\n * This method finds all occurrences of `oldColor` in shading elements (`w:shd`)\n * within table styles and replaces them with `newColor`.\n *\n * @param oldColor - Hex color to find (e.g., \"A5A5A5\", without #)\n * @param newColor - Hex color to replace with (e.g., \"DFDFDF\", without #)\n * @returns Number of shading elements updated\n *\n * @example\n * ```typescript\n * // Update table style shading from gray to light gray\n * const updated = doc.updateTableStyleShading(\"A5A5A5\", \"DFDFDF\");\n * console.log(`Updated ${updated} shading definitions in styles.xml`);\n * ```\n */\n public updateTableStyleShading(oldColor: string, newColor: string): number {\n // Normalize colors (uppercase, no #)\n const normalizedOld = oldColor.replace('#', '').toUpperCase();\n const normalizedNew = newColor.replace('#', '').toUpperCase();\n\n if (normalizedOld === normalizedNew) {\n return 0; // No change needed\n }\n\n // Get current styles.xml\n let stylesXml = this.getStylesXml();\n if (!stylesXml) {\n return 0;\n }\n\n let updateCount = 0;\n\n // Pattern to match shading elements with fill attribute containing the old color\n // Matches: w:fill=\"A5A5A5\" (case-insensitive)\n const fillPattern = new RegExp(`(w:fill=[\"'])${normalizedOld}([\"'])`, 'gi');\n\n // Replace all occurrences\n stylesXml = stylesXml.replace(fillPattern, (match, prefix, suffix) => {\n updateCount++;\n return `${prefix}${normalizedNew}${suffix}`;\n });\n\n // Also handle color attribute in shading elements\n // Matches: w:color=\"A5A5A5\" within shd elements\n const colorPattern = new RegExp(`(<w:shd[^>]*w:color=[\"'])${normalizedOld}([\"'])`, 'gi');\n\n stylesXml = stylesXml.replace(colorPattern, (match, prefix, suffix) => {\n updateCount++;\n return `${prefix}${normalizedNew}${suffix}`;\n });\n\n // Only update if changes were made\n if (updateCount > 0) {\n this.setStylesXml(stylesXml);\n }\n\n return updateCount;\n }\n\n /**\n * Updates all table style conditional formatting shading to match given settings.\n *\n * This is a convenience method that updates common table style shading patterns.\n * It's useful when applying table uniformity to ensure table styles in styles.xml\n * match the shading colors being applied to individual cells.\n *\n * @param settings - Shading configuration\n * @param settings.headerShading - Shading color for header/accent cells (e.g., \"BFBFBF\")\n * @param settings.dataShading - Shading color for data cells (e.g., \"DFDFDF\")\n * @param settings.replaceColors - Optional array of old colors to replace (defaults to common grays)\n * @returns Total number of shading elements updated\n *\n * @example\n * ```typescript\n * // Update table styles to use consistent shading\n * const updated = doc.updateTableStyleShadingBulk({\n * headerShading: \"BFBFBF\",\n * dataShading: \"DFDFDF\",\n * replaceColors: [\"A5A5A5\", \"C0C0C0\", \"D9D9D9\"]\n * });\n * ```\n */\n public updateTableStyleShadingBulk(settings: {\n headerShading?: string;\n dataShading?: string;\n replaceColors?: string[];\n }): number {\n let totalUpdated = 0;\n\n // Default colors commonly used in table styles\n const defaultReplaceColors = ['A5A5A5', 'C0C0C0', 'D9D9D9', 'E7E6E6'];\n const colorsToReplace = settings.replaceColors || defaultReplaceColors;\n\n // Replace header-type colors with header shading\n if (settings.headerShading) {\n for (const oldColor of colorsToReplace) {\n totalUpdated += this.updateTableStyleShading(oldColor, settings.headerShading);\n }\n }\n\n // If data shading differs from header, apply it to lighter colors\n if (settings.dataShading && settings.dataShading !== settings.headerShading) {\n // Typically data cells use lighter shading\n const dataColors = ['D9D9D9', 'E7E6E6', 'F2F2F2'];\n for (const oldColor of dataColors) {\n totalUpdated += this.updateTableStyleShading(oldColor, settings.dataShading);\n }\n }\n\n return totalUpdated;\n }\n\n /**\n * Helper method to process consecutive blank paragraphs\n * @private\n */\n private processConsecutiveBlanks(\n blanks: Paragraph[],\n keepOne: boolean,\n toRemove: Paragraph[]\n ): void {\n if (blanks.length === 0) return;\n\n if (keepOne && blanks.length > 1) {\n // Keep the first one, remove the rest\n for (let i = 1; i < blanks.length; i++) {\n const blank = blanks[i];\n if (blank) {\n toRemove.push(blank);\n }\n }\n } else if (!keepOne) {\n // Remove all\n toRemove.push(...blanks);\n }\n // If keepOne is true and there's only 1 blank, don't remove it\n }\n\n /**\n * Standardizes all bullet list symbols formatting (font, size, bold, color)\n *\n * This helper ensures consistent bullet FORMATTING across all bullet lists in the document.\n * It modifies the numbering definitions (not individual paragraphs), preserving the actual\n * bullet symbols (•, ○, ▪, etc.) while standardizing their visual formatting.\n *\n * **Important**: This only affects the bullet symbol FORMATTING, not the symbol itself.\n * The actual bullet characters are preserved as they were originally defined.\n *\n * @param options Formatting options\n * @returns Statistics about lists updated\n *\n * @example\n * // Standardize all bullet symbols with defaults (Arial 12pt bold black)\n * const result = doc.standardizeBulletSymbols();\n * console.log(`Updated ${result.listsUpdated} bullet lists (${result.levelsModified} levels)`);\n *\n * @example\n * // Custom formatting for bullet symbols\n * const result = doc.standardizeBulletSymbols({\n * bold: true,\n * fontSize: 28, // 14pt\n * color: 'FF0000', // Red\n * font: 'Calibri'\n * });\n */\n public standardizeBulletSymbols(options?: {\n bold?: boolean;\n fontSize?: number;\n color?: string;\n font?: string;\n }): {\n listsUpdated: number;\n levelsModified: number;\n } {\n const {\n bold = false,\n fontSize = 24, // 12pt\n color = '000000',\n font = 'Arial',\n } = options || {};\n\n let listsUpdated = 0;\n let levelsModified = 0;\n\n const instances = this.numberingManager.getAllInstances();\n\n for (const instance of instances) {\n const abstractNumId = instance.getAbstractNumId();\n const abstractNum = this.numberingManager.getAbstractNumbering(abstractNumId);\n\n if (!abstractNum) continue;\n\n // Only process bullet lists (skip numbered lists)\n const level0 = abstractNum.getLevel(0);\n if (level0?.getFormat() !== 'bullet') continue;\n\n // Update all 9 levels (0-8) with formatting only (preserve existing symbols)\n for (let levelIndex = 0; levelIndex < 9; levelIndex++) {\n const numLevel = abstractNum.getLevel(levelIndex);\n if (!numLevel) continue;\n\n // Only set formatting - do NOT change the bullet symbol itself\n numLevel.setFont(font);\n numLevel.setFontSize(fontSize);\n numLevel.setBold(bold);\n numLevel.setColor(color);\n\n levelsModified++;\n }\n\n listsUpdated++;\n }\n\n return { listsUpdated, levelsModified };\n }\n\n /**\n * Standardizes numbered list prefixes (1., a., i., etc.) to Verdana 12pt bold black\n *\n * This only affects the prefix/number formatting, not the text content after it.\n * It modifies the numbering definitions in the document while preserving the\n * numbering format type (decimal, roman, letter, etc.).\n *\n * **Important**: This updates the visual formatting of prefixes like \"1.\", \"a.\", \"i.\"\n * but does not change the numbering type itself.\n *\n * @param options Formatting options\n * @returns Statistics about lists updated\n *\n * @example\n * // Standardize all numbered list prefixes with defaults (Verdana 12pt bold black)\n * const result = doc.standardizeNumberedListPrefixes();\n * console.log(`Updated ${result.listsUpdated} numbered lists (${result.levelsModified} levels)`);\n *\n * @example\n * // Custom formatting for numbered list prefixes\n * const result = doc.standardizeNumberedListPrefixes({\n * bold: true,\n * fontSize: 24,\n * color: '000000',\n * font: 'Verdana'\n * });\n */\n public standardizeNumberedListPrefixes(options?: {\n bold?: boolean;\n fontSize?: number;\n color?: string;\n font?: string;\n }): {\n listsUpdated: number;\n levelsModified: number;\n } {\n const {\n bold = false,\n fontSize = 24, // 12pt\n color = '000000',\n font = 'Verdana',\n } = options || {};\n\n let listsUpdated = 0;\n let levelsModified = 0;\n\n const instances = this.numberingManager.getAllInstances();\n\n for (const instance of instances) {\n const abstractNumId = instance.getAbstractNumId();\n const abstractNum = this.numberingManager.getAbstractNumbering(abstractNumId);\n\n if (!abstractNum) continue;\n\n // Only process numbered lists (skip bullet lists)\n const level0 = abstractNum.getLevel(0);\n if (!level0 || level0.getFormat() === 'bullet') continue;\n\n // Update all 9 levels (0-8)\n for (let levelIndex = 0; levelIndex < 9; levelIndex++) {\n const numLevel = abstractNum.getLevel(levelIndex);\n if (!numLevel) continue;\n\n numLevel.setFont(font);\n numLevel.setFontSize(fontSize);\n numLevel.setBold(bold);\n numLevel.setColor(color);\n\n levelsModified++;\n }\n\n listsUpdated++;\n }\n\n return { listsUpdated, levelsModified };\n }\n\n /**\n * Standardizes all hyperlinks in the document to Verdana 12pt blue (#0000FF) underline\n *\n * This applies consistent formatting to all hyperlinks throughout the document,\n * including those in tables. The method preserves the hyperlink URLs and text\n * while updating only the visual formatting.\n *\n * @param options Formatting options\n * @returns Number of hyperlinks updated\n *\n * @example\n * // Use default formatting (Verdana 12pt blue underline)\n * const count = doc.standardizeAllHyperlinks();\n * console.log(`Standardized ${count} hyperlinks`);\n *\n * @example\n * // Custom hyperlink formatting\n * const count = doc.standardizeAllHyperlinks({\n * font: 'Arial',\n * size: 11,\n * color: 'FF0000', // Red\n * underline: true\n * });\n */\n public standardizeAllHyperlinks(options?: {\n font?: string;\n size?: number;\n color?: string;\n underline?: boolean;\n }): number {\n const { font = 'Verdana', size = 12, color = '0000FF', underline = true } = options || {};\n\n const hyperlinks = this.getHyperlinks();\n\n for (const { hyperlink } of hyperlinks) {\n hyperlink.setFormatting({\n font: font,\n size: size,\n color: color,\n underline: underline ? 'single' : false,\n });\n }\n\n return hyperlinks.length;\n }\n\n /**\n * Applies Heading 1 style to paragraphs with H1-like style names\n * @param options Optional style application options\n * @returns Number of paragraphs updated\n * @example\n * ```typescript\n * // Simple usage\n * doc.applyH1();\n *\n * // With custom formatting\n * doc.applyH1({\n * format: { font: 'Arial', size: 18, emphasis: ['bold'] }\n * });\n *\n * // Preserve specific properties\n * doc.applyH1({\n * keepProperties: ['bold', 'color'],\n * format: { font: 'Verdana' }\n * });\n * ```\n */\n public applyH1(options?: StyleApplyOptions): number {\n return this.applyStyleToMatching('Heading1', options, (style) =>\n /^(heading\\s*1|header\\s*1|h1)$/i.test(style)\n );\n }\n\n /**\n * Applies Heading 2 style to paragraphs with H2-like style names\n * @param options Optional style application options\n * @returns Number of paragraphs updated\n * @example\n * ```typescript\n * doc.applyH2({\n * format: { font: 'Verdana', size: 14, color: '000000' }\n * });\n * ```\n */\n public applyH2(options?: StyleApplyOptions): number {\n return this.applyStyleToMatching('Heading2', options, (style) =>\n /^(heading\\s*2|header\\s*2|h2)$/i.test(style)\n );\n }\n\n /**\n * Applies Heading 3 style to paragraphs with H3-like style names\n * @param options Optional style application options\n * @returns Number of paragraphs updated\n * @example\n * ```typescript\n * doc.applyH3({\n * format: { font: 'Verdana', size: 12, emphasis: ['bold'] }\n * });\n * ```\n */\n public applyH3(options?: StyleApplyOptions): number {\n return this.applyStyleToMatching('Heading3', options, (style) =>\n /^(heading\\s*3|header\\s*3|h3)$/i.test(style)\n );\n }\n\n /**\n * Applies Normal style to paragraphs without recognized styles\n * @param options Optional style application options\n * @returns Number of paragraphs updated\n */\n public applyNormal(options?: StyleApplyOptions): number {\n const targets =\n options?.paragraphs ||\n this.getAllParagraphs().filter((p) => {\n const style = p.getStyle();\n return !style || !/^(heading|header|h\\d|list|toc|tod|caution|table)/i.test(style);\n });\n\n let count = 0;\n for (const para of targets) {\n if (para.isPreserved()) continue;\n para.setStyle('Normal');\n\n if (options?.keepProperties && options.keepProperties.length > 0) {\n this.clearFormattingExcept(para, options.keepProperties);\n } else {\n para.clearDirectFormatting();\n }\n\n if (options?.format) {\n this.applyFormatOptions(para, options.format);\n }\n\n count++;\n }\n return count;\n }\n\n /**\n * Applies list style to numbered lists\n * @param options Optional style application options\n * @returns Number of paragraphs updated\n */\n public applyNumList(options?: StyleApplyOptions): number {\n return this.applyStyleToMatching('ListParagraph', options, (style) =>\n /^(list\\s*number|numbered\\s*list|list\\s*paragraph)$/i.test(style)\n );\n }\n\n /**\n * Applies list style to bullet lists\n * @param options Optional style application options\n * @returns Number of paragraphs updated\n */\n public applyBulletList(options?: StyleApplyOptions): number {\n return this.applyStyleToMatching('ListParagraph', options, (style) =>\n /^(list\\s*bullet|bullet\\s*list|list\\s*paragraph)$/i.test(style)\n );\n }\n\n /**\n * Applies Table of Contents style\n * @param options Optional style application options\n * @returns Number of paragraphs updated\n */\n public applyTOC(options?: StyleApplyOptions): number {\n return this.applyStyleToMatching('TOC', options, (style) =>\n /^(toc|table\\s*of\\s*contents|toc\\s*heading)$/i.test(style)\n );\n }\n\n /**\n * Applies Top of Document style\n * @param options Optional style application options\n * @returns Number of paragraphs updated\n */\n public applyTOD(options?: StyleApplyOptions): number {\n return this.applyStyleToMatching('TopOfDocument', options, (style) =>\n /^(tod|top\\s*of\\s*document|document\\s*top)$/i.test(style)\n );\n }\n\n /**\n * Applies Caution style\n * @param options Optional style application options\n * @returns Number of paragraphs updated\n */\n public applyCaution(options?: StyleApplyOptions): number {\n return this.applyStyleToMatching('Caution', options, (style) =>\n /^(caution|warning|important|alert)$/i.test(style)\n );\n }\n\n /**\n * Applies header style to table cell paragraphs (typically first row)\n * @param options Optional style application options\n * @returns Number of paragraphs updated\n */\n public applyCellHeader(options?: StyleApplyOptions): number {\n let count = 0;\n const tables = this.getAllTables();\n\n for (const table of tables) {\n const firstRow = table.getRow(0);\n if (!firstRow) continue;\n\n for (const cell of firstRow.getCells()) {\n for (const para of cell.getParagraphs()) {\n if (para.isPreserved()) continue;\n para.setStyle('TableHeader');\n\n if (options?.keepProperties && options.keepProperties.length > 0) {\n this.clearFormattingExcept(para, options.keepProperties);\n } else {\n para.clearDirectFormatting();\n }\n\n if (options?.format) {\n this.applyFormatOptions(para, options.format);\n }\n\n count++;\n }\n }\n }\n\n return count;\n }\n\n /**\n * Applies hyperlink style to hyperlinks\n * @returns Number of hyperlinks updated\n */\n public applyHyperlink(): number {\n let count = 0;\n const hyperlinks = this.getHyperlinks();\n\n for (const { hyperlink } of hyperlinks) {\n hyperlink.resetToStandardFormatting();\n count++;\n }\n\n return count;\n }\n\n /**\n * Helper method to apply formatting options to a paragraph\n * @private\n */\n private applyFormatOptions(para: Paragraph, options: FormatOptions): void {\n // Text formatting\n if (options.font || options.size || options.color || options.emphasis) {\n for (const run of para.getRuns()) {\n if (options.font) run.setFont(options.font);\n if (options.size) run.setSize(options.size);\n if (options.color) run.setColor(options.color);\n if (options.emphasis) {\n options.emphasis.forEach((emp) => {\n if (emp === 'bold') run.setBold(true);\n if (emp === 'italic') run.setItalic(true);\n if (emp === 'underline') run.setUnderline('single');\n });\n }\n }\n }\n\n // Alignment\n if (options.alignment) {\n para.setAlignment(options.alignment);\n }\n\n // Spacing (convert points to twips)\n if (options.spaceAbove !== undefined) {\n para.setSpaceBefore(options.spaceAbove * UNITS.TWIPS_PER_POINT);\n }\n if (options.spaceBelow !== undefined) {\n para.setSpaceAfter(options.spaceBelow * UNITS.TWIPS_PER_POINT);\n }\n if (options.lineSpacing !== undefined) {\n para.setLineSpacing(options.lineSpacing * UNITS.TWIPS_PER_POINT);\n }\n\n // Indentation (convert inches to twips)\n if (options.indentLeft !== undefined) {\n para.setLeftIndent(options.indentLeft * UNITS.TWIPS_PER_INCH);\n }\n if (options.indentRight !== undefined) {\n para.setRightIndent(options.indentRight * UNITS.TWIPS_PER_INCH);\n }\n if (options.indentFirst !== undefined) {\n para.setFirstLineIndent(options.indentFirst * UNITS.TWIPS_PER_INCH);\n }\n if (options.indentHanging !== undefined) {\n // Set hanging indent directly through formatting\n if (!para.formatting.indentation) {\n para.formatting.indentation = {};\n }\n para.formatting.indentation.hanging = options.indentHanging * UNITS.TWIPS_PER_INCH;\n }\n\n // Advanced options (only set if true)\n if (options.keepWithNext) {\n para.setKeepNext(true);\n }\n if (options.keepLines) {\n para.setKeepLines(true);\n }\n }\n\n /**\n * Helper method to selectively clear formatting while preserving specific properties\n * @private\n */\n private clearFormattingExcept(para: Paragraph, keepProperties: string[]): void {\n // Save properties to keep\n const savedProps: Record<string, unknown> = {};\n const formatting = para.formatting as Record<string, unknown>;\n\n for (const prop of keepProperties) {\n if (formatting[prop] !== undefined) {\n savedProps[prop] = formatting[prop];\n }\n }\n\n // Clear all formatting\n para.clearDirectFormatting();\n\n // Restore saved properties\n const restoredFormatting = para.formatting as Record<string, unknown>;\n for (const prop of keepProperties) {\n if (savedProps[prop] !== undefined) {\n restoredFormatting[prop] = savedProps[prop];\n }\n }\n\n // Handle run-level properties\n for (const run of para.getRuns()) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- dynamic property backup/restore requires flexible typing\n const runFormatting = run.getFormatting() as Record<string, any>;\n const runSavedProps: Record<string, any> = {};\n for (const prop of keepProperties) {\n if (runFormatting[prop] !== undefined) {\n runSavedProps[prop] = runFormatting[prop];\n }\n }\n\n run.clearFormatting();\n\n // Restore saved properties using appropriate setters\n if (runSavedProps.bold !== undefined) run.setBold(runSavedProps.bold);\n if (runSavedProps.italic !== undefined) run.setItalic(runSavedProps.italic);\n if (runSavedProps.underline !== undefined) run.setUnderline(runSavedProps.underline);\n if (runSavedProps.color !== undefined) run.setColor(runSavedProps.color);\n if (runSavedProps.font !== undefined) run.setFont(runSavedProps.font);\n if (runSavedProps.size !== undefined) run.setSize(runSavedProps.size);\n if (runSavedProps.highlight !== undefined) run.setHighlight(runSavedProps.highlight);\n if (runSavedProps.strike !== undefined) run.setStrike(runSavedProps.strike);\n if (runSavedProps.subscript !== undefined) run.setSubscript(runSavedProps.subscript);\n if (runSavedProps.superscript !== undefined) run.setSuperscript(runSavedProps.superscript);\n }\n }\n\n /**\n * Helper method to apply style to matching paragraphs\n * @private\n */\n private applyStyleToMatching(\n targetStyle: string,\n options: StyleApplyOptions | undefined,\n matcher: (style: string) => boolean\n ): number {\n const targets =\n options?.paragraphs ||\n this.getAllParagraphs().filter((p) => {\n const style = p.getStyle();\n return style && matcher(style);\n });\n\n let count = 0;\n for (const para of targets) {\n if (para.isPreserved()) continue;\n\n // Apply style\n para.setStyle(targetStyle);\n\n // Handle formatting\n if (options?.keepProperties && options.keepProperties.length > 0) {\n // Clear formatting except specified properties\n this.clearFormattingExcept(para, options.keepProperties);\n } else {\n // Clear all formatting\n para.clearDirectFormatting();\n }\n\n // Apply custom formatting if provided\n if (options?.format) {\n this.applyFormatOptions(para, options.format);\n }\n\n count++;\n }\n return count;\n }\n\n /**\n * Clears preserve flags from all paragraphs in the document\n * Called automatically before save since preserve flags are runtime-only\n * @returns Number of paragraphs that had preserve flags cleared\n * @private\n */\n private clearAllPreserveFlags(): number {\n let cleared = 0;\n for (const para of this.getAllParagraphs()) {\n if (para.isPreserved()) {\n para.setPreserved(false);\n cleared++;\n }\n }\n return cleared;\n }\n\n /**\n * Parses a TOC field instruction to extract which heading levels to include\n *\n * Handles field codes like:\n * - \"TOC \\o &quot;1-3&quot;\" → [1, 2, 3]\n * - \"TOC \\t &quot;Heading 2,2,&quot;\" → [2]\n * - \"TOC \\t &quot;2-3&quot;\" → [2, 3]\n * - \"TOC \\o &quot;1-2&quot; \\t &quot;Heading 3,3,&quot;\" → [1, 2, 3]\n * - \"TOC \\h \\u \\z \\t &quot;Heading 2,2,&quot;\" → [2]\n *\n * Supports both literal `\"` and HTML-encoded `&quot;` in quotes.\n *\n * @param instrText The TOC field instruction text (may contain &quot;)\n * @returns Array of heading levels (1-9) to include, sorted\n */\n private parseTOCFieldInstruction(instrText: string): number[] {\n const levels = new Set<number>();\n let hasOutlineSwitch = false;\n let hasTableSwitch = false;\n\n // Normalize whitespace and quotes: trim input and replace &quot; with \" for consistent parsing\n const normalizedText = instrText.trim().replace(/&quot;/g, '\"');\n\n // === Parse \\o \"X-Y\" switch (outline levels) - supports quoted and unquoted formats ===\n const outlineMatch = /\\\\o\\s+(?:\"(\\d+)-(\\d+)\"|'(\\d+)-(\\d+)'|(\\d+)-(\\d+))/.exec(normalizedText);\n if (outlineMatch) {\n // Extract captured groups from whichever format matched\n const start = parseInt(outlineMatch[1] || outlineMatch[3] || outlineMatch[5]!, 10);\n const end = parseInt(outlineMatch[2] || outlineMatch[4] || outlineMatch[6]!, 10);\n if (!isNaN(start) && !isNaN(end)) {\n hasOutlineSwitch = true;\n for (let i = start; i <= end; i++) {\n if (i >= 1 && i <= 9) levels.add(i);\n }\n }\n }\n\n // === Parse \\u switch (use outline levels) ===\n if (/\\\\u(?:\\s|\\\\|$)/.test(normalizedText)) {\n // When \\u is present without \\o or \\t, default to 1-9\n const hasTSwitch = /\\\\t\\s+\"/.test(normalizedText);\n if (!hasOutlineSwitch && !hasTSwitch) {\n for (let i = 1; i <= 9; i++) levels.add(i);\n }\n }\n\n // === Parse all \\t \"...\" switches (style or range) ===\n // Match: \\t followed by space and quoted string (supports nested commas safely)\n const tSwitchRegex = /\\\\t\\s+\"([^\"]*)\"/g; // Captures content inside quotes\n const tMatches = [...normalizedText.matchAll(tSwitchRegex)];\n\n for (const match of tMatches) {\n hasTableSwitch = true;\n const content = (match[1] || '').trim();\n if (!content) continue;\n\n // --- Case 1: Range format \"X-Y\" ---\n const rangeMatch = /^(\\d+)-(\\d+)$/.exec(content);\n if (rangeMatch?.[1] && rangeMatch?.[2]) {\n const start = parseInt(rangeMatch[1], 10);\n const end = parseInt(rangeMatch[2], 10);\n for (let i = start; i <= end; i++) {\n if (i >= 1 && i <= 9) levels.add(i);\n }\n continue;\n }\n\n // --- Case 2: Style format \"StyleName,Level,\" (e.g., \"Heading 2,2,\") ---\n // Split by comma, expect pattern: styleName, level, [optional trailing comma]\n const parts = content\n .split(',')\n .map((p) => p.trim())\n .filter(Boolean);\n for (let i = 0; i < parts.length; i += 2) {\n if (i + 1 < parts.length) {\n const levelStr = parts[i + 1];\n if (levelStr) {\n const level = parseInt(levelStr, 10);\n if (!isNaN(level) && level >= 1 && level <= 9) {\n levels.add(level);\n }\n }\n }\n }\n }\n\n // Final: Return sorted array (no duplicates)\n return Array.from(levels).sort((a, b) => a - b);\n }\n\n /**\n * Synchronizes TOC field instructions with actual style names from styles.xml\n * This ensures \\t switches reference styles by their current names, not outdated ones\n *\n * IMPORTANT: Does NOT modify style names - only updates TOC field references\n * This prevents TOC population failures when style names don't match field instructions\n *\n * @param documentXml - The generated document.xml content\n * @returns Modified XML with synchronized TOC field instructions\n * @private\n */\n private syncTOCFieldInstructions(documentXml: string): string {\n try {\n let modifiedXml = documentXml;\n let syncedCount = 0;\n\n // Strategy 1: Find TOC in SDT elements (modern Word format)\n const sdtTocRegex =\n /<w:sdt>[\\s\\S]*?<w:docPartGallery w:val=\"Table of Contents\"[\\s\\S]*?<\\/w:sdt>/g;\n const sdtMatches = Array.from(documentXml.matchAll(sdtTocRegex));\n\n for (const match of sdtMatches) {\n if (!match) continue;\n const result = this.syncTOCInstructionInXml(match[0]);\n if (result.changed) {\n modifiedXml = modifiedXml.replace(match[0], result.xml);\n syncedCount++;\n }\n }\n\n // Strategy 2: Find field-based TOC (older format without SDT wrapper)\n // Pattern: instrText containing \"TOC\" with field switches\n const instrRegex = /<w:instrText[^>]*>([^<]*TOC[^<]*)<\\/w:instrText>/g;\n const instrMatches = Array.from(modifiedXml.matchAll(instrRegex));\n\n for (const match of instrMatches) {\n if (!match?.[1]) continue;\n\n // Decode XML entities in instruction\n const fieldInstruction = match[1]\n .replace(/&amp;/g, '&')\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&quot;/g, '\"')\n .replace(/&apos;/g, \"'\");\n\n // Check if instruction contains \\t switches (style-specific TOC)\n if (!fieldInstruction.includes('\\\\t')) {\n continue; // Outline-based TOC, no style names to sync\n }\n\n // Parse and update \\t switches\n const updatedInstruction = this.updateTOCStyleNames(fieldInstruction);\n\n // If instruction changed, replace in XML\n if (updatedInstruction !== fieldInstruction) {\n // Re-encode for XML\n const encodedInstruction = updatedInstruction\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;');\n\n // Replace the instruction\n const updatedInstrXml = `<w:instrText xml:space=\"preserve\">${encodedInstruction}</w:instrText>`;\n modifiedXml = modifiedXml.replace(match[0], updatedInstrXml);\n\n this.logger.info(\n `Synced TOC field instruction: \"${fieldInstruction.substring(0, 50)}...\" → \"${updatedInstruction.substring(0, 50)}...\"`\n );\n syncedCount++;\n }\n }\n\n if (syncedCount > 0) {\n this.logger.info(`Synced ${syncedCount} TOC field instruction(s)`);\n }\n\n return modifiedXml;\n } catch (error: unknown) {\n // Log error but don't fail the save\n this.logger.error(\n 'Error syncing TOC field instructions - document will save with original instructions',\n error instanceof Error\n ? { message: error.message, stack: error.stack }\n : { error: String(error) }\n );\n return documentXml; // Return original on error\n }\n }\n\n /**\n * Helper to sync TOC instruction within an XML fragment\n * @private\n */\n private syncTOCInstructionInXml(xml: string): { xml: string; changed: boolean } {\n const instrMatch = /<w:instrText[^>]*>([\\s\\S]*?)<\\/w:instrText>/.exec(xml);\n if (!instrMatch?.[1]) {\n return { xml, changed: false };\n }\n\n // Decode XML entities in instruction\n const fieldInstruction = instrMatch[1]\n .replace(/&amp;/g, '&')\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&quot;/g, '\"')\n .replace(/&apos;/g, \"'\");\n\n // Check if instruction contains \\t switches (style-specific TOC)\n if (!fieldInstruction.includes('\\\\t')) {\n return { xml, changed: false };\n }\n\n // Parse and update \\t switches\n const updatedInstruction = this.updateTOCStyleNames(fieldInstruction);\n\n if (updatedInstruction === fieldInstruction) {\n return { xml, changed: false };\n }\n\n // Re-encode for XML\n const encodedInstruction = updatedInstruction\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;');\n\n const updatedXml = xml.replace(\n /<w:instrText[^>]*>[\\s\\S]*?<\\/w:instrText>/,\n `<w:instrText xml:space=\"preserve\">${encodedInstruction}</w:instrText>`\n );\n\n return { xml: updatedXml, changed: true };\n }\n\n /**\n * Updates style names in a TOC field instruction to match actual styles.xml names\n * Parses \\t switches, resolves each style name, and rebuilds instruction\n *\n * @param fieldInstruction - Original TOC field instruction\n * @returns Updated field instruction with current style names\n * @private\n */\n private updateTOCStyleNames(fieldInstruction: string): string {\n // Extract all \\t switches using regex\n // Format: \\t \"StyleName,Level,\" or \\t \"StyleName,Level,StyleName2,Level2,...\"\n const tSwitchRegex = /\\\\t\\s+\"([^\"]+)\"/g;\n let updatedInstruction = fieldInstruction;\n let hasChanges = false;\n\n const matches = Array.from(fieldInstruction.matchAll(tSwitchRegex));\n\n for (const match of matches) {\n const originalSwitch = match[0]; // Full match: \\t \"StyleName,Level,\"\n const content = match[1]; // Content inside quotes\n if (!content) continue;\n\n // Parse style names and levels from the switch content\n // Format: \"StyleName,Level,\" or \"StyleName,Level,StyleName2,Level2,...\"\n const parts = content\n .split(',')\n .map((p) => p.trim())\n .filter(Boolean);\n const updatedParts: string[] = [];\n\n for (let i = 0; i < parts.length; i += 2) {\n const styleName = parts[i];\n const levelStr = parts[i + 1];\n\n if (!styleName || !levelStr) {\n // Preserve malformed parts\n if (styleName) updatedParts.push(styleName);\n if (levelStr) updatedParts.push(levelStr);\n continue;\n }\n\n // Resolve style name to actual name in styles.xml\n const actualStyleName = this.resolveStyleNameForTOC(styleName);\n\n if (actualStyleName && actualStyleName !== styleName) {\n // Style name changed - use actual name\n updatedParts.push(actualStyleName, levelStr);\n hasChanges = true;\n } else if (actualStyleName) {\n // Style name unchanged\n updatedParts.push(styleName, levelStr);\n } else {\n // Style not found - preserve original reference and log warning\n updatedParts.push(styleName, levelStr);\n this.logger.warn(\n `TOC references style \"${styleName}\" which doesn't exist in styles.xml - preserving original reference`\n );\n }\n }\n\n // Rebuild the \\t switch with updated names\n if (hasChanges) {\n const updatedContent = updatedParts.join(',') + (content.endsWith(',') ? ',' : '');\n const updatedSwitch = `\\\\t \"${updatedContent}\"`;\n updatedInstruction = updatedInstruction.replace(originalSwitch, updatedSwitch);\n }\n }\n\n return updatedInstruction;\n }\n\n /**\n * Resolves a TOC style reference to the actual style name in styles.xml\n * Handles various naming patterns (Heading2 vs Heading 2 vs CustomHeader2)\n *\n * @param tocStyleName - Style name from TOC \\t switch\n * @returns Actual style name from styles.xml or undefined if not found\n * @private\n */\n private resolveStyleNameForTOC(tocStyleName: string): string | undefined {\n // Strategy 1: For standard heading references (Heading 1, Heading 2, etc.),\n // find the actual style being used for that outline level FIRST.\n // This handles cases where heading styles have been renamed (e.g., \"Heading 2\" -> \"Header 2\")\n // and ensures we return the style that paragraphs actually use.\n const headingLevelMatch = /^Heading\\s*(\\d+)$/i.exec(tocStyleName);\n if (headingLevelMatch?.[1]) {\n const level = parseInt(headingLevelMatch[1]);\n const usedStyles = this.findHeadingStylesUsedByParagraphs();\n const actualStyleName = usedStyles.get(level);\n if (actualStyleName) {\n this.logger.info(\n `TOC style \"${tocStyleName}\" resolved to actual used style \"${actualStyleName}\" for level ${level}`\n );\n return actualStyleName;\n }\n }\n\n // Strategy 2: Direct name match (exact)\n const allStyles = this.stylesManager.getAllStyles();\n for (const style of allStyles) {\n if (style.getName() === tocStyleName) {\n return style.getName();\n }\n }\n\n // Strategy 3: Match by styleId pattern\n // \"Heading 2\" → styleId=\"Heading2\" → get actual name\n // \"List Paragraph\" → styleId=\"ListParagraph\" → get actual name\n const normalizedId = tocStyleName.replace(/\\s+/g, '');\n const styleById = this.stylesManager.getStyle(normalizedId);\n if (styleById) {\n return styleById.getName();\n }\n\n // Strategy 4: Fuzzy match (case-insensitive search)\n const fuzzyResults = this.stylesManager.searchByName(tocStyleName);\n if (fuzzyResults.length > 0 && fuzzyResults[0]) {\n return fuzzyResults[0].getName();\n }\n\n // Style not found\n return undefined;\n }\n\n /**\n * Finds heading styles actually used by paragraphs in the document.\n * Returns a map of outline level -> style name for styles in use.\n *\n * This is used by resolveStyleNameForTOC to find the actual styles being used\n * when the TOC references standard heading styles that may have been renamed.\n *\n * @returns Map<outlineLevel, styleName> where outlineLevel is 1-indexed\n * @private\n */\n private findHeadingStylesUsedByParagraphs(): Map<number, string> {\n const usedStyles = new Map<number, string>();\n\n const processElement = (element: BodyElement) => {\n if (element instanceof Paragraph) {\n const styleId = element.getStyle();\n if (styleId) {\n const style = this.stylesManager.getStyle(styleId);\n if (style) {\n const outlineLevel = style.getParagraphFormatting()?.outlineLevel;\n if (outlineLevel !== undefined && outlineLevel >= 0) {\n const level = outlineLevel + 1; // Convert to 1-indexed\n const name = style.getName() || styleId;\n if (!usedStyles.has(level)) {\n usedStyles.set(level, name);\n }\n }\n }\n }\n } else if (element instanceof Table) {\n // Check table cells for paragraphs\n for (let row = 0; row < element.getRowCount(); row++) {\n const rowObj = element.getRow(row);\n if (rowObj) {\n for (let col = 0; col < rowObj.getCellCount(); col++) {\n const cell = rowObj.getCell(col);\n if (cell) {\n for (const para of cell.getParagraphs()) {\n processElement(para);\n }\n }\n }\n }\n }\n }\n };\n\n for (const element of this.bodyElements) {\n processElement(element);\n }\n\n return usedStyles;\n }\n\n /**\n * Finds all headings in the document that match the specified levels\n *\n * @param levels Array of heading levels to include (e.g., [1, 2, 3])\n * @returns Array of heading information objects\n */\n /**\n * Find headings for TOC by parsing XML directly (searches body AND tables)\n * This is more reliable than using bodyElements as it searches inside table cells too\n */\n private findHeadingsForTOCFromXML(\n docXml: string,\n levels: number[]\n ): { level: number; text: string; bookmark: string }[] {\n const headings: { level: number; text: string; bookmark: string }[] = [];\n const levelSet = new Set(levels);\n\n try {\n // Parse document.xml to object structure\n const parsed = XMLParser.parseToObject(docXml, { trimValues: false });\n const document = parsed['w:document'];\n if (!document) {\n return headings;\n }\n\n const body = (document as any)['w:body'];\n if (!body) {\n return headings;\n }\n\n // Helper function to extract heading info from a parsed paragraph object\n const extractHeading = (para: any): void => {\n const pPr = para['w:pPr'];\n if (!pPr?.['w:pStyle']) {\n return;\n }\n\n const styleVal = pPr['w:pStyle']['@_w:val'];\n if (!styleVal) {\n return;\n }\n\n // Check if style matches \"HeadingN\" format (exact match, case-insensitive)\n const headingMatch = styleVal.match(/^Heading(\\d+)$/i);\n if (!headingMatch?.[1]) {\n return;\n }\n\n const headingLevel = parseInt(headingMatch[1], 10);\n\n // Check if this level should be included in TOC\n if (!levelSet.has(headingLevel)) {\n return;\n }\n\n // Extract bookmark (use any existing bookmark, prioritize \"_heading\" or \"_Toc\")\n let bookmark = '';\n const bookmarkStart = para['w:bookmarkStart'];\n if (bookmarkStart) {\n const bookmarkArray = Array.isArray(bookmarkStart) ? bookmarkStart : [bookmarkStart];\n\n // First try to find preferred bookmark types\n for (const bm of bookmarkArray) {\n const bmName = bm['@_w:name'];\n if (\n bmName &&\n (bmName.toLowerCase().includes('_heading') || bmName.toLowerCase().includes('_toc'))\n ) {\n bookmark = bmName;\n break;\n }\n }\n\n // If no preferred bookmark found, use the first available bookmark\n if (!bookmark && bookmarkArray.length > 0) {\n const firstBm = bookmarkArray[0];\n const bmName = firstBm['@_w:name'];\n if (bmName) {\n bookmark = bmName;\n }\n }\n }\n\n // Extract text from runs\n let text = '';\n const runs = para['w:r'];\n if (runs) {\n const runArray = Array.isArray(runs) ? runs : [runs];\n for (const run of runArray) {\n const textElement = run['w:t'];\n if (textElement) {\n if (typeof textElement === 'string') {\n text += textElement;\n } else if (textElement['#text']) {\n text += textElement['#text'];\n }\n }\n }\n }\n\n // Only add if we have text\n text = text.trim();\n if (!text) {\n return;\n }\n\n // Generate bookmark if not found\n if (!bookmark) {\n bookmark = `_Toc${Date.now()}_${headings.length}`;\n }\n\n headings.push({\n level: headingLevel,\n text: text,\n bookmark: bookmark,\n });\n };\n\n // Search in direct paragraphs\n const paragraphs = body['w:p'];\n if (paragraphs) {\n const paraArray = Array.isArray(paragraphs) ? paragraphs : [paragraphs];\n for (const para of paraArray) {\n extractHeading(para);\n }\n }\n\n // Search in tables (this is critical - many documents have headings in tables)\n const tables = body['w:tbl'];\n if (tables) {\n const tableArray = Array.isArray(tables) ? tables : [tables];\n for (const table of tableArray) {\n const rows = table['w:tr'];\n if (!rows) continue;\n\n const rowArray = Array.isArray(rows) ? rows : [rows];\n for (const row of rowArray) {\n const cells = row['w:tc'];\n if (!cells) continue;\n\n const cellArray = Array.isArray(cells) ? cells : [cells];\n for (const cell of cellArray) {\n const cellParas = cell['w:p'];\n if (!cellParas) continue;\n\n const cellParaArray = Array.isArray(cellParas) ? cellParas : [cellParas];\n for (const para of cellParaArray) {\n extractHeading(para);\n }\n }\n }\n }\n }\n } catch (error: unknown) {\n defaultLogger.error(\n 'Error parsing document.xml for headings:',\n error instanceof Error\n ? { message: error.message, stack: error.stack }\n : { error: String(error) }\n );\n }\n\n return headings;\n }\n\n /**\n * Legacy method - searches only bodyElements (doesn't search inside tables)\n * Kept for compatibility but not recommended\n * @deprecated Use findHeadingsForTOCFromXML instead\n */\n private findHeadingsForTOC(\n levels: number[]\n ): { level: number; text: string; bookmark: string }[] {\n const headings: { level: number; text: string; bookmark: string }[] = [];\n const levelSet = new Set(levels);\n\n // Iterate through body elements\n for (const element of this.bodyElements) {\n if (element instanceof Paragraph) {\n const para = element;\n const formatting = para.getFormatting();\n\n // Check if paragraph has a heading style (handle both \"Heading1\" and \"Heading 1\")\n if (formatting.style) {\n const styleMatch = /Heading\\s*(\\d+)/i.exec(formatting.style);\n if (styleMatch?.[1]) {\n const headingLevel = parseInt(styleMatch[1], 10);\n\n // Check if this level should be included in TOC\n if (levelSet.has(headingLevel)) {\n const text = para.getText().trim();\n\n if (text) {\n // Create or get bookmark for this heading\n const bookmark = this.bookmarkManager.createHeadingBookmark(text);\n\n headings.push({\n level: headingLevel,\n text: text,\n bookmark: bookmark.getName(),\n });\n }\n }\n }\n }\n }\n }\n\n return headings;\n }\n\n /**\n * Generates TOC XML structure with populated entries\n *\n * Creates a complete SDT-wrapped TOC with:\n * - Complex field structure (begin/instruction/separate/entries/end)\n * - Pre-populated hyperlink entries for each heading\n * - Proper formatting (Verdana, blue, underlined)\n *\n * @param headings Array of heading information\n * @param originalInstrText Original TOC field instruction to preserve switches\n * @returns Complete TOC XML string\n */\n private generateTOCXML(\n headings: { level: number; text: string; bookmark: string }[],\n originalInstrText: string\n ): string {\n const sdtId = Math.floor(Math.random() * 2000000000) - 1000000000;\n\n let tocXml = '<w:sdt>';\n\n // SDT properties\n tocXml += '<w:sdtPr>';\n tocXml += `<w:id w:val=\"${sdtId}\"/>`;\n tocXml += '<w:docPartObj>';\n tocXml += '<w:docPartGallery w:val=\"Table of Contents\"/>';\n tocXml += '<w:docPartUnique w:val=\"1\"/>';\n tocXml += '</w:docPartObj>';\n tocXml += '</w:sdtPr>';\n\n // SDT content\n tocXml += '<w:sdtContent>';\n\n // Calculate minimum level for relative indentation\n // If TOC shows only Heading 2s, minLevel=2, so Heading 2 gets 0\" indent\n const minLevel = headings.length > 0 ? Math.min(...headings.map((h) => h.level)) : 1;\n\n // First paragraph: field begin + instruction + separator + first entry (if any)\n tocXml += '<w:p>';\n tocXml += '<w:pPr>';\n tocXml += '<w:spacing w:after=\"0\" w:before=\"0\" w:line=\"240\" w:lineRule=\"auto\"/>';\n\n // Add indentation for first entry relative to minimum level (0.25\" per level)\n if (headings.length > 0 && headings[0]) {\n const firstIndent = (headings[0].level - minLevel) * 360; // 360 twips = 0.25 inches\n if (firstIndent > 0) {\n tocXml += `<w:ind w:left=\"${firstIndent}\"/>`;\n }\n }\n\n tocXml += '</w:pPr>';\n\n // Field begin\n tocXml += '<w:r><w:fldChar w:fldCharType=\"begin\"/></w:r>';\n\n // Field instruction (preserve original switches)\n tocXml += '<w:r>';\n tocXml += `<w:instrText xml:space=\"preserve\">${this.escapeXml(\n originalInstrText\n )}</w:instrText>`;\n tocXml += '</w:r>';\n\n // Field separator\n tocXml += '<w:r><w:fldChar w:fldCharType=\"separate\"/></w:r>';\n\n // First entry (if any)\n if (headings.length > 0 && headings[0]) {\n tocXml += this.buildTOCEntryXML(headings[0]);\n }\n\n tocXml += '</w:p>';\n\n // Remaining entries (each in its own paragraph)\n for (let i = 1; i < headings.length; i++) {\n const heading = headings[i];\n if (!heading) continue;\n\n tocXml += '<w:p>';\n tocXml += '<w:pPr>';\n tocXml += '<w:spacing w:after=\"0\" w:before=\"0\" w:line=\"240\" w:lineRule=\"auto\"/>';\n\n // Add indentation relative to minimum level (0.25\" per level above minimum)\n const indent = (heading.level - minLevel) * 360;\n if (indent > 0) {\n tocXml += `<w:ind w:left=\"${indent}\"/>`;\n }\n\n tocXml += '</w:pPr>';\n tocXml += this.buildTOCEntryXML(heading);\n tocXml += '</w:p>';\n }\n\n // Final paragraph with field end\n tocXml += '<w:p>';\n tocXml += '<w:pPr>';\n tocXml += '<w:spacing w:after=\"0\" w:before=\"0\" w:line=\"240\" w:lineRule=\"auto\"/>';\n tocXml += '</w:pPr>';\n tocXml += '<w:r><w:fldChar w:fldCharType=\"end\"/></w:r>';\n tocXml += '</w:p>';\n\n tocXml += '</w:sdtContent>';\n tocXml += '</w:sdt>';\n\n return tocXml;\n }\n\n /**\n * Builds XML for a single TOC entry with hyperlink\n *\n * @param heading Heading information\n * @returns XML string for the TOC entry\n */\n private buildTOCEntryXML(heading: { level: number; text: string; bookmark: string }): string {\n const escapedText = this.escapeXml(heading.text);\n\n let xml = '';\n xml += `<w:hyperlink w:anchor=\"${this.escapeXml(heading.bookmark)}\">`;\n xml += '<w:r>';\n xml += '<w:rPr>';\n xml += '<w:rFonts w:ascii=\"Verdana\" w:hAnsi=\"Verdana\" w:cs=\"Verdana\" w:eastAsia=\"Verdana\"/>';\n xml += '<w:color w:val=\"0000FF\"/>';\n xml += '<w:sz w:val=\"24\"/>';\n xml += '<w:szCs w:val=\"24\"/>';\n xml += '<w:u w:val=\"single\"/>';\n xml += '</w:rPr>';\n xml += `<w:t xml:space=\"preserve\">${escapedText}</w:t>`;\n xml += '</w:r>';\n xml += '</w:hyperlink>';\n\n return xml;\n }\n\n /**\n * Escapes XML special characters\n *\n * @param text Text to escape\n * @returns Escaped text\n */\n private escapeXml(text: string): string {\n return text\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;');\n }\n\n /**\n * Populates TOCs in a saved file\n * Private helper used by save() when auto-populate is enabled\n *\n * @param filePath Path to the saved DOCX file\n * @returns Promise resolving to the number of TOCs populated\n * @private\n */\n private async populateTOCsInFile(filePath: string): Promise<number> {\n // Load the saved document\n const handler = new ZipHandler();\n await handler.load(filePath);\n\n // Get document.xml\n const docXml = handler.getFileAsString('word/document.xml');\n if (!docXml) {\n return 0;\n }\n\n // Populate all TOCs in the XML\n const modifiedXml = this.populateAllTOCsInXML(docXml);\n\n // Update and save if changes were made\n if (modifiedXml !== docXml) {\n handler.updateFile('word/document.xml', modifiedXml);\n await handler.save(filePath);\n\n // Count TOCs that were populated\n const tocRegex =\n /<w:sdt>[\\s\\S]*?<w:docPartGallery w:val=\"Table of Contents\"[\\s\\S]*?<\\/w:sdt>/g;\n const matches = Array.from(docXml.matchAll(tocRegex));\n return matches.length;\n }\n\n return 0;\n }\n\n /**\n * Populates all TOCs in document XML\n * Extracted from replaceTableOfContents for reuse\n *\n * @param docXml The document XML string\n * @returns Modified XML with populated TOCs\n * @private\n */\n private populateAllTOCsInXML(docXml: string): string {\n let modifiedXml = docXml;\n\n // Strategy 1: Try SDT-wrapped TOCs first (modern Word format)\n const sdtTocRegex =\n /<w:sdt>[\\s\\S]*?<w:docPartGallery w:val=\"Table of Contents\"[\\s\\S]*?<\\/w:sdt>/g;\n const sdtMatches = Array.from(docXml.matchAll(sdtTocRegex));\n\n if (sdtMatches.length > 0) {\n for (const match of sdtMatches) {\n try {\n const tocXml = match[0];\n const instrMatch = /<w:instrText[^>]*>([\\s\\S]*?)<\\/w:instrText>/.exec(tocXml);\n if (!instrMatch?.[1]) continue;\n\n const fieldInstruction = instrMatch[1]\n .replace(/&amp;/g, '&')\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&quot;/g, '\"')\n .replace(/&apos;/g, \"'\");\n\n const levels = this.parseTOCFieldInstruction(fieldInstruction);\n const headings = this.findHeadingsForTOCFromXML(docXml, levels);\n if (headings.length === 0) continue;\n\n const newTocXml = this.generateTOCXML(headings, fieldInstruction);\n modifiedXml = modifiedXml.replace(tocXml, newTocXml);\n } catch (error: unknown) {\n this.logger.error(\n 'Error populating SDT TOC',\n error instanceof Error\n ? { message: error.message, stack: error.stack }\n : { error: String(error) }\n );\n continue;\n }\n }\n return modifiedXml;\n }\n\n // Strategy 2: Handle simple complex field TOCs (no SDT wrapper)\n // These have the structure: fldChar begin → instrText → fldChar separate → entries → fldChar end\n // Match pattern: paragraph containing fldChar begin followed by instrText with TOC\n const simpleTocRegex =\n /<w:p[^>]*>[\\s\\S]*?<w:fldChar[^>]*w:fldCharType=\"begin\"[^>]*\\/>[\\s\\S]*?<w:instrText[^>]*>([^<]*TOC[^<]*)<\\/w:instrText>/g;\n const simpleMatches = Array.from(docXml.matchAll(simpleTocRegex));\n\n if (simpleMatches.length > 0) {\n for (const match of simpleMatches) {\n try {\n const instrText = match[1];\n if (!instrText) continue;\n\n const fieldInstruction = instrText\n .replace(/&amp;/g, '&')\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&quot;/g, '\"')\n .replace(/&apos;/g, \"'\");\n\n const levels = this.parseTOCFieldInstruction(fieldInstruction);\n const headings = this.findHeadingsForTOCFromXML(modifiedXml, levels);\n if (headings.length === 0) continue;\n\n // For simple TOCs, we need to find and replace the entire field structure\n // Find from fldChar begin to fldChar end\n const tocStartMatch = modifiedXml.match(\n new RegExp(\n `(<w:p[^>]*>[\\\\s\\\\S]*?<w:fldChar[^>]*w:fldCharType=\"begin\"[^>]*/>)([\\\\s\\\\S]*?<w:instrText[^>]*>${instrText.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}<\\\\/w:instrText>)`,\n 'g'\n )\n );\n\n if (!tocStartMatch) continue;\n\n // Find the end marker - look for fldChar end after this TOC instruction\n // The TOC field spans multiple paragraphs, ending at fldChar end\n const tocFieldPattern = new RegExp(\n `(<w:p[^>]*>[\\\\s\\\\S]*?<w:fldChar[^>]*w:fldCharType=\"begin\"[^>]*\\\\/>[\\\\s\\\\S]*?<w:instrText[^>]*>${instrText.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}<\\\\/w:instrText>[\\\\s\\\\S]*?<w:fldChar[^>]*w:fldCharType=\"separate\"[^>]*\\\\/>)([\\\\s\\\\S]*?)(<w:r[^>]*>[\\\\s\\\\S]*?<w:fldChar[^>]*w:fldCharType=\"end\"[^>]*\\\\/>[\\\\s\\\\S]*?<\\\\/w:r>)`,\n 'g'\n );\n\n const fullMatch = modifiedXml.match(tocFieldPattern);\n if (!fullMatch || fullMatch.length === 0) continue;\n\n const fullTocXml = fullMatch[0];\n\n // Generate new TOC XML preserving the complex field structure\n const newTocXml = this.generateSimpleTOCXML(headings, fieldInstruction);\n modifiedXml = modifiedXml.replace(fullTocXml, newTocXml);\n\n this.logger.info(`Populated simple TOC with ${headings.length} heading entries`);\n } catch (error: unknown) {\n this.logger.error(\n 'Error populating simple TOC',\n error instanceof Error\n ? { message: error.message, stack: error.stack }\n : { error: String(error) }\n );\n continue;\n }\n }\n }\n\n return modifiedXml;\n }\n\n /**\n * Generates XML for a simple complex field TOC (without SDT wrapper)\n * Preserves the fldChar begin → instrText → fldChar separate → entries → fldChar end structure\n *\n * @param headings Array of heading info objects\n * @param fieldInstruction The TOC field instruction string\n * @returns XML string for the TOC field\n * @private\n */\n private generateSimpleTOCXML(\n headings: { text: string; level: number; bookmark: string }[],\n fieldInstruction: string\n ): string {\n // Build the TOC entries\n const entries: string[] = [];\n\n for (const heading of headings) {\n // Calculate TOC style based on heading level (TOC1, TOC2, etc.)\n const tocStyle = `TOC${heading.level}`;\n\n // Escape text for XML\n const escapedText = heading.text\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;');\n\n // Create hyperlinked TOC entry paragraph\n entries.push(\n `<w:p>` +\n `<w:pPr><w:pStyle w:val=\"${tocStyle}\"/></w:pPr>` +\n `<w:hyperlink w:anchor=\"${heading.bookmark}\" w:history=\"1\">` +\n `<w:r><w:rPr><w:rStyle w:val=\"Hyperlink\"/></w:rPr>` +\n `<w:t>${escapedText}</w:t></w:r>` +\n `</w:hyperlink>` +\n `</w:p>`\n );\n }\n\n // Escape field instruction for XML\n const escapedInstruction = fieldInstruction\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;');\n\n // Build the complete TOC field structure\n return (\n // First paragraph: fldChar begin + instrText + fldChar separate\n `<w:p>` +\n `<w:pPr><w:pStyle w:val=\"TOC2\"/></w:pPr>` +\n `<w:r><w:fldChar w:fldCharType=\"begin\"/></w:r>` +\n `<w:r><w:instrText xml:space=\"preserve\">${escapedInstruction}</w:instrText></w:r>` +\n `<w:r><w:fldChar w:fldCharType=\"separate\"/></w:r>` +\n `</w:p>` +\n // TOC entry paragraphs (between separate and end)\n entries.join('') +\n // Last paragraph: fldChar end\n `<w:p>` +\n `<w:pPr><w:pStyle w:val=\"TOC2\"/></w:pPr>` +\n `<w:r><w:fldChar w:fldCharType=\"end\"/></w:r>` +\n `</w:p>`\n );\n }\n\n /**\n * Replaces all Table of Contents in a saved document file with pre-populated entries\n *\n * This helper function works with saved DOCX files:\n * 1. Loads the document file\n * 2. Finds all TOC elements in document.xml\n * 3. For each TOC, parses its field instruction to determine which heading levels to include\n * 4. Scans the document for all headings matching those levels\n * 5. Generates pre-populated TOC entries with working hyperlinks\n * 6. Replaces the TOC in the XML and saves the file\n *\n * The generated TOC maintains the complex field structure, so users can still\n * right-click \"Update Field\" in Word to refresh it.\n *\n * @param filePath Path to the DOCX file to process\n * @returns Promise resolving to the number of TOC elements that were replaced\n *\n * @example\n * // Save document first\n * await doc.save('output.docx');\n *\n * // Then replace TOCs with populated entries\n * const count = await doc.replaceTableOfContents('output.docx');\n * console.log(`Replaced ${count} TOC element(s) with populated entries`);\n */\n public async replaceTableOfContents(filePath: string): Promise<number> {\n // Reuse the new extracted logic\n return await this.populateTOCsInFile(filePath);\n }\n\n /**\n * Gets the document section\n * @returns The section\n */\n getSection(): Section {\n return this.section;\n }\n\n /**\n * Sets the document section\n * @param section The section to set\n * @returns This document for chaining\n */\n setSection(section: Section): this {\n this.section = section;\n return this;\n }\n\n /**\n * Sets page size\n * @param width Width in twips\n * @param height Height in twips\n * @param orientation Page orientation\n * @returns This document for chaining\n */\n setPageSize(width: number, height: number, orientation?: 'portrait' | 'landscape'): this {\n this.section.setPageSize(width, height, orientation);\n return this;\n }\n\n /**\n * Sets page orientation\n * @param orientation Page orientation\n * @returns This document for chaining\n */\n setPageOrientation(orientation: 'portrait' | 'landscape'): this {\n this.section.setOrientation(orientation);\n return this;\n }\n\n /**\n * Sets margins\n * @param margins Margin properties\n * @returns This document for chaining\n */\n setMargins(margins: {\n top: number;\n bottom: number;\n left: number;\n right: number;\n header?: number;\n footer?: number;\n gutter?: number;\n }): this {\n this.section.setMargins(margins);\n return this;\n }\n\n /**\n * Sets the default header for the document\n * @param header The header to set\n * @returns This document for chaining\n */\n setHeader(header: Header): this {\n // Generate relationship for header\n const relationship = this.relationshipManager.addHeader(`${header.getFilename(1)}`);\n\n // Register with manager\n this.headerFooterManager.registerHeader(header, relationship.getId());\n\n // Link to section\n this.section.setHeaderReference('default', relationship.getId());\n\n return this;\n }\n\n /**\n * Sets the first page header\n * @param header The header to set\n * @returns This document for chaining\n */\n setFirstPageHeader(header: Header): this {\n // Enable title page\n this.section.setTitlePage(true);\n\n // Generate relationship for header\n const relationship = this.relationshipManager.addHeader(\n `${header.getFilename(this.headerFooterManager.getHeaderCount() + 1)}`\n );\n\n // Register with manager\n this.headerFooterManager.registerHeader(header, relationship.getId());\n\n // Link to section\n this.section.setHeaderReference('first', relationship.getId());\n\n return this;\n }\n\n /**\n * Sets the even page header (requires different odd/even pages)\n * @param header The header to set\n * @returns This document for chaining\n */\n setEvenPageHeader(header: Header): this {\n // Generate relationship for header\n const relationship = this.relationshipManager.addHeader(\n `${header.getFilename(this.headerFooterManager.getHeaderCount() + 1)}`\n );\n\n // Register with manager\n this.headerFooterManager.registerHeader(header, relationship.getId());\n\n // Link to section\n this.section.setHeaderReference('even', relationship.getId());\n\n return this;\n }\n\n /**\n * Sets the default footer for the document\n * @param footer The footer to set\n * @returns This document for chaining\n */\n setFooter(footer: Footer): this {\n // Generate relationship for footer\n const relationship = this.relationshipManager.addFooter(`${footer.getFilename(1)}`);\n\n // Register with manager\n this.headerFooterManager.registerFooter(footer, relationship.getId());\n\n // Link to section\n this.section.setFooterReference('default', relationship.getId());\n\n return this;\n }\n\n /**\n * Sets the first page footer\n * @param footer The footer to set\n * @returns This document for chaining\n */\n setFirstPageFooter(footer: Footer): this {\n // Enable title page\n this.section.setTitlePage(true);\n\n // Generate relationship for footer\n const relationship = this.relationshipManager.addFooter(\n `${footer.getFilename(this.headerFooterManager.getFooterCount() + 1)}`\n );\n\n // Register with manager\n this.headerFooterManager.registerFooter(footer, relationship.getId());\n\n // Link to section\n this.section.setFooterReference('first', relationship.getId());\n\n return this;\n }\n\n /**\n * Sets the even page footer (requires different odd/even pages)\n * @param footer The footer to set\n * @returns This document for chaining\n */\n setEvenPageFooter(footer: Footer): this {\n // Generate relationship for footer\n const relationship = this.relationshipManager.addFooter(\n `${footer.getFilename(this.headerFooterManager.getFooterCount() + 1)}`\n );\n\n // Register with manager\n this.headerFooterManager.registerFooter(footer, relationship.getId());\n\n // Link to section\n this.section.setFooterReference('even', relationship.getId());\n\n return this;\n }\n\n /**\n * Gets the HeaderFooterManager\n * @returns HeaderFooterManager instance\n */\n getHeaderFooterManager(): HeaderFooterManager {\n return this.headerFooterManager;\n }\n\n /**\n * Removes a specific header from the document\n * Removes the header from HeaderFooterManager, RelationshipManager, and section references\n * Also removes the header XML file from the ZIP archive\n * @param type Header type to remove (default, first, even)\n * @returns This document for chaining\n */\n removeHeader(type: 'default' | 'first' | 'even'): this {\n const sectionProps = this.section.getProperties();\n\n // Get the relationship ID from section properties\n const rId = sectionProps.headers?.[type];\n if (!rId) {\n return this; // No header of this type exists\n }\n\n // Get the header filename from relationship\n const rel = this.relationshipManager.getRelationship(rId);\n if (rel) {\n const headerPath = `word/${rel.getTarget()}`;\n\n // Remove the header XML file from ZIP\n if (this.zipHandler.hasFile(headerPath)) {\n this.zipHandler.removeFile(headerPath);\n }\n\n // Remove the relationship\n this.relationshipManager.removeRelationship(rId);\n }\n\n // Remove from section references\n if (sectionProps.headers) {\n delete sectionProps.headers[type];\n\n // If no more headers, remove the headers object\n if (Object.keys(sectionProps.headers).length === 0) {\n delete sectionProps.headers;\n }\n }\n\n // Note: We can't directly remove from HeaderFooterManager without access to the Header object\n // The manager will be rebuilt on next save() call\n\n return this;\n }\n\n /**\n * Removes a specific footer from the document\n * Removes the footer from HeaderFooterManager, RelationshipManager, and section references\n * Also removes the footer XML file from the ZIP archive\n * @param type Footer type to remove (default, first, even)\n * @returns This document for chaining\n */\n removeFooter(type: 'default' | 'first' | 'even'): this {\n const sectionProps = this.section.getProperties();\n\n // Get the relationship ID from section properties\n const rId = sectionProps.footers?.[type];\n if (!rId) {\n return this; // No footer of this type exists\n }\n\n // Get the footer filename from relationship\n const rel = this.relationshipManager.getRelationship(rId);\n if (rel) {\n const footerPath = `word/${rel.getTarget()}`;\n\n // Remove the footer XML file from ZIP\n if (this.zipHandler.hasFile(footerPath)) {\n this.zipHandler.removeFile(footerPath);\n }\n\n // Remove the relationship\n this.relationshipManager.removeRelationship(rId);\n }\n\n // Remove from section references\n if (sectionProps.footers) {\n delete sectionProps.footers[type];\n\n // If no more footers, remove the footers object\n if (Object.keys(sectionProps.footers).length === 0) {\n delete sectionProps.footers;\n }\n }\n\n // Note: We can't directly remove from HeaderFooterManager without access to the Footer object\n // The manager will be rebuilt on next save() call\n\n return this;\n }\n\n /**\n * Removes all headers from the document\n * Removes all header relationships, section references, and header XML files from the ZIP archive\n * @returns This document for chaining\n */\n clearHeaders(): this {\n const sectionProps = this.section.getProperties();\n\n // Remove each header type\n if (sectionProps.headers) {\n const types = Object.keys(sectionProps.headers) as ('default' | 'first' | 'even')[];\n for (const type of types) {\n this.removeHeader(type);\n }\n }\n\n // Note: Don't call headerFooterManager.clear() as that would clear footers too\n // The manager will be rebuilt correctly during save based on section properties\n\n return this;\n }\n\n /**\n * Removes all footers from the document\n * Removes all footer relationships, section references, and footer XML files from the ZIP archive\n * @returns This document for chaining\n */\n clearFooters(): this {\n const sectionProps = this.section.getProperties();\n\n // Remove each footer type\n if (sectionProps.footers) {\n const types = Object.keys(sectionProps.footers) as ('default' | 'first' | 'even')[];\n for (const type of types) {\n this.removeFooter(type);\n }\n }\n\n // Note: Don't call headerFooterManager.clear() as that would clear headers too\n // The manager will be rebuilt correctly during save based on section properties\n\n return this;\n }\n\n /**\n * Adds an image to the document inside a paragraph\n * @param image The image to add\n * @returns This document for chaining\n */\n addImage(image: Image): this {\n // Generate relationship ID\n const target = `media/image${this.imageManager.getImageCount() + 1}.${image.getExtension()}`;\n const relationship = this.relationshipManager.addImage(target);\n\n // Register image with manager\n this.imageManager.registerImage(image, relationship.getId());\n\n // Create a paragraph containing the image\n const para = new Paragraph();\n // Add image as a run (ImageRun extends Run and generates w:drawing in w:r)\n const imageRun = this.createImageRun(image);\n para.addRun(imageRun);\n\n this.bodyElements.push(para);\n return this;\n }\n\n /**\n * Creates a run containing an image\n * @param image The image\n * @returns ImageRun (extends Run) with the image\n */\n private createImageRun(image: Image): ImageRun {\n // ImageRun extends Run, so it's type-safe to add to paragraphs\n return new ImageRun(image);\n }\n\n /**\n * Gets the ImageManager\n * @returns ImageManager instance\n */\n getImageManager(): ImageManager {\n return this.imageManager;\n }\n\n /**\n * Gets the RelationshipManager\n * @returns RelationshipManager instance\n */\n getRelationshipManager(): RelationshipManager {\n return this.relationshipManager;\n }\n\n /**\n * Processes all hyperlinks in paragraphs and registers them with RelationshipManager\n */\n private processHyperlinks(): void {\n this.generator.processHyperlinks(\n this.bodyElements,\n this.headerFooterManager,\n this.relationshipManager,\n this.footnoteManager,\n this.endnoteManager\n );\n }\n\n /**\n * Saves all images to the ZIP archive\n */\n private saveImages(): void {\n const images = this.imageManager.getAllImages();\n\n for (const entry of images) {\n const imageData = entry.image.getImageData();\n if (imageData && imageData.length > 0) {\n // Save to word/media/\n const path = `word/media/${entry.filename}`;\n this.zipHandler.addFile(path, imageData);\n }\n }\n }\n\n /**\n * Saves all headers to the ZIP archive\n */\n private saveHeaders(): void {\n const headers = this.headerFooterManager.getAllHeaders();\n\n for (const entry of headers) {\n const xml = entry.header.toXML();\n const path = `word/${entry.filename}`;\n this.zipHandler.addFile(path, xml);\n\n // Per OOXML, relationships are part-scoped: hyperlinks in header XML\n // need word/_rels/headerN.xml.rels, not word/_rels/document.xml.rels\n const paragraphs = this.extractParagraphsFromElements(entry.header.getElements());\n this.generatePartLevelHyperlinkRels(paragraphs, `word/_rels/${entry.filename}.rels`);\n }\n }\n\n /**\n * Saves all footers to the ZIP archive\n */\n private saveFooters(): void {\n const footers = this.headerFooterManager.getAllFooters();\n\n for (const entry of footers) {\n const xml = entry.footer.toXML();\n const path = `word/${entry.filename}`;\n this.zipHandler.addFile(path, xml);\n\n // Per OOXML, relationships are part-scoped: hyperlinks in footer XML\n // need word/_rels/footerN.xml.rels, not word/_rels/document.xml.rels\n const paragraphs = this.extractParagraphsFromElements(entry.footer.getElements());\n this.generatePartLevelHyperlinkRels(paragraphs, `word/_rels/${entry.filename}.rels`);\n }\n }\n\n /**\n * Updates the word/_rels/document.xml.rels file with current relationships\n */\n private updateRelationships(): void {\n const xml = this.relationshipManager.generateXml();\n this.zipHandler.updateFile('word/_rels/document.xml.rels', xml);\n }\n\n /**\n * Saves all comments to the ZIP archive\n */\n private saveComments(): void {\n if (this._commentsModified) {\n // Comments were modified — regenerate from in-memory model\n if (this.commentManager.getCount() > 0) {\n const xml = this.commentManager.generateCommentsXml();\n this.zipHandler.addFile('word/comments.xml', xml);\n\n const existingRels = this.relationshipManager.getRelationshipsByType(\n RelationshipType.COMMENTS\n );\n if (existingRels.length === 0) {\n this.relationshipManager.addComments();\n }\n } else {\n // All comments removed — clean up comments.xml and its relationship\n this.zipHandler.removeFile('word/comments.xml');\n const existingRels = this.relationshipManager.getRelationshipsByType(\n RelationshipType.COMMENTS\n );\n for (const rel of existingRels) {\n this.relationshipManager.removeRelationship(rel.getId());\n }\n }\n // Remove companion files since regenerated comments lack w14:paraId\n this.removeCommentCompanionFiles();\n } else if (this._originalCommentsXml) {\n // Passthrough — preserve original comments.xml exactly\n this.zipHandler.addFile('word/comments.xml', this._originalCommentsXml);\n\n // Preserve companion files as-is\n for (const [path, content] of this._originalCommentCompanionFiles) {\n this.zipHandler.addFile(path, content);\n }\n\n // Ensure comments relationship exists\n const existingRels = this.relationshipManager.getRelationshipsByType(\n RelationshipType.COMMENTS\n );\n if (existingRels.length === 0) {\n this.relationshipManager.addComments();\n }\n } else if (this.commentManager.getCount() > 0) {\n // New comments created on a document that had no original comments\n const xml = this.commentManager.generateCommentsXml();\n this.zipHandler.addFile('word/comments.xml', xml);\n\n const existingRels = this.relationshipManager.getRelationshipsByType(\n RelationshipType.COMMENTS\n );\n if (existingRels.length === 0) {\n this.relationshipManager.addComments();\n }\n }\n }\n\n private removeCommentCompanionFiles(): void {\n const companionPaths = [\n DOCX_PATHS.COMMENTS_EXTENDED,\n DOCX_PATHS.COMMENTS_IDS,\n DOCX_PATHS.COMMENTS_EXTENSIBLE,\n ];\n for (const filePath of companionPaths) {\n this.zipHandler.removeFile(filePath);\n const fileName = filePath.replace('word/', '');\n for (const rel of this.relationshipManager.getAllRelationships()) {\n if (rel.getTarget() === fileName) {\n this.relationshipManager.removeRelationship(rel.getId());\n }\n }\n }\n }\n\n private saveFootnotes(): void {\n if (this._footnotesModified || this.footnoteManager.getCount() > 0) {\n const xml = this.footnoteManager.generateFootnotesXml();\n this.zipHandler.addFile(DOCX_PATHS.FOOTNOTES, xml);\n\n const existingRels = this.relationshipManager.getRelationshipsByType(\n RelationshipType.FOOTNOTES\n );\n if (existingRels.length === 0) {\n this.relationshipManager.addFootnotes();\n }\n\n // Per OOXML, relationships are part-scoped: hyperlinks in footnotes.xml\n // need word/_rels/footnotes.xml.rels, not word/_rels/document.xml.rels\n this.generatePartLevelHyperlinkRels(\n this.footnoteManager.getAllFootnotes().flatMap((fn) => fn.getParagraphs()),\n 'word/_rels/footnotes.xml.rels'\n );\n } else if (this._originalFootnotesXml) {\n // Passthrough — preserve original XML exactly\n this.zipHandler.addFile(DOCX_PATHS.FOOTNOTES, this._originalFootnotesXml);\n\n const existingRels = this.relationshipManager.getRelationshipsByType(\n RelationshipType.FOOTNOTES\n );\n if (existingRels.length === 0) {\n this.relationshipManager.addFootnotes();\n }\n }\n }\n\n private saveEndnotes(): void {\n if (this._endnotesModified || this.endnoteManager.getCount() > 0) {\n const xml = this.endnoteManager.generateEndnotesXml();\n this.zipHandler.addFile(DOCX_PATHS.ENDNOTES, xml);\n\n const existingRels = this.relationshipManager.getRelationshipsByType(\n RelationshipType.ENDNOTES\n );\n if (existingRels.length === 0) {\n this.relationshipManager.addEndnotes();\n }\n\n // Per OOXML, relationships are part-scoped: hyperlinks in endnotes.xml\n // need word/_rels/endnotes.xml.rels, not word/_rels/document.xml.rels\n this.generatePartLevelHyperlinkRels(\n this.endnoteManager.getAllEndnotes().flatMap((en) => en.getParagraphs()),\n 'word/_rels/endnotes.xml.rels'\n );\n } else if (this._originalEndnotesXml) {\n // Passthrough — preserve original XML exactly\n this.zipHandler.addFile(DOCX_PATHS.ENDNOTES, this._originalEndnotesXml);\n\n const existingRels = this.relationshipManager.getRelationshipsByType(\n RelationshipType.ENDNOTES\n );\n if (existingRels.length === 0) {\n this.relationshipManager.addEndnotes();\n }\n }\n }\n\n /**\n * Extracts all Paragraph instances from a mixed array of Paragraphs and Tables.\n * Tables are recursed: rows → cells → getParagraphs().\n */\n private extractParagraphsFromElements(elements: (Paragraph | Table)[]): Paragraph[] {\n const result: Paragraph[] = [];\n for (const el of elements) {\n if (el instanceof Paragraph) {\n result.push(el);\n } else if (el instanceof Table) {\n for (const row of el.getRows()) {\n for (const cell of row.getCells()) {\n result.push(...cell.getParagraphs());\n }\n }\n }\n }\n return result;\n }\n\n /**\n * Generates a part-level .rels file for hyperlinks in paragraphs of a specific part.\n * Per OOXML, relationships are part-scoped: hyperlinks in footnotes.xml need\n * word/_rels/footnotes.xml.rels, not word/_rels/document.xml.rels.\n * After generating the .rels file, removes those relationships from the main\n * RelationshipManager so they don't appear in document.xml.rels.\n */\n private generatePartLevelHyperlinkRels(paragraphs: Paragraph[], relsPath: string): void {\n const hyperlinkRels: Array<{ id: string; url: string }> = [];\n\n for (const para of paragraphs) {\n for (const item of para.getContent()) {\n if (item instanceof Hyperlink && item.isExternal()) {\n const relId = item.getRelationshipId();\n const url = item.getUrl();\n if (relId && url) {\n hyperlinkRels.push({ id: relId, url });\n }\n }\n // Also check hyperlinks inside Revision objects (tracked changes)\n if (item instanceof Revision) {\n for (const revContent of item.getContent()) {\n if (revContent instanceof Hyperlink && revContent.isExternal()) {\n const relId = revContent.getRelationshipId();\n const url = revContent.getUrl();\n if (relId && url) {\n hyperlinkRels.push({ id: relId, url });\n }\n }\n }\n }\n }\n }\n\n if (hyperlinkRels.length > 0) {\n let xml = '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n';\n xml +=\n '<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\\n';\n for (const rel of hyperlinkRels) {\n const escapedId = XMLBuilder.escapeXmlAttribute(rel.id);\n const escapedUrl = XMLBuilder.escapeXmlAttribute(rel.url);\n xml += ` <Relationship Id=\"${escapedId}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink\" Target=\"${escapedUrl}\" TargetMode=\"External\"/>\\n`;\n }\n xml += '</Relationships>';\n\n this.zipHandler.addFile(relsPath, xml);\n\n // Remove these relationships from the main RelationshipManager\n // so they don't appear in document.xml.rels\n for (const rel of hyperlinkRels) {\n this.relationshipManager.removeRelationship(rel.id);\n }\n }\n }\n\n /**\n * Updates word/people.xml to include all tracked change authors from the document.\n *\n * Word expects every author referenced in tracked changes (w:ins, w:del, w:pPrChange, etc.)\n * to have a corresponding entry in people.xml. Missing authors cause \"unreadable content\" warnings.\n */\n private updatePeopleXml(): void {\n // Collect all unique authors from tracked changes\n const authors = new Set<string>();\n\n for (const para of this.getAllParagraphs()) {\n // Check revision content (w:ins, w:del, w:moveFrom, w:moveTo)\n for (const item of para.getContent()) {\n if (item instanceof Revision) {\n const author = item.getAuthor();\n if (author) authors.add(author);\n }\n }\n // Check rPrChange authors from runs\n for (const run of para.getRuns()) {\n const rPrChange = run.getPropertyChangeRevision();\n if (rPrChange?.author) {\n authors.add(rPrChange.author);\n }\n }\n // Check pPrChange author\n if (para.formatting.pPrChange?.author) {\n authors.add(para.formatting.pPrChange.author);\n }\n }\n\n // Also check table cells for tracked changes\n for (const element of this.bodyElements) {\n if (element instanceof Table) {\n this.collectAuthorsFromTable(element, authors);\n }\n }\n\n if (authors.size === 0) return;\n\n // Read existing people.xml\n const existingPeopleXml = this.zipHandler.getFileAsString('word/people.xml');\n\n // Extract existing authors from people.xml\n const existingAuthors = new Set<string>();\n if (existingPeopleXml) {\n const authorMatches = existingPeopleXml.matchAll(/w15:author=\"([^\"]+)\"/g);\n for (const match of authorMatches) {\n if (match[1]) existingAuthors.add(match[1]);\n }\n }\n\n // Find authors that are missing from people.xml\n const missingAuthors: string[] = [];\n for (const author of authors) {\n if (!existingAuthors.has(author)) {\n missingAuthors.push(author);\n }\n }\n\n if (missingAuthors.length === 0) return;\n\n // Build person elements for missing authors\n const personElements = missingAuthors\n .map((author) => {\n const escapedAuthor = author\n .replace(/&/g, '&amp;')\n .replace(/\"/g, '&quot;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;');\n return `<w15:person w15:author=\"${escapedAuthor}\"><w15:presenceInfo w15:providerId=\"None\" w15:userId=\"${escapedAuthor}\"/></w15:person>`;\n })\n .join('');\n\n if (existingPeopleXml) {\n // Insert new person elements before closing tag\n const updatedXml = existingPeopleXml.replace(\n '</w15:people>',\n `${personElements}</w15:people>`\n );\n this.zipHandler.updateFile('word/people.xml', updatedXml);\n } else {\n // Create new people.xml\n const newPeopleXml = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<w15:people xmlns:w15=\"http://schemas.microsoft.com/office/word/2012/wordml\" xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" mc:Ignorable=\"w15\">${personElements}</w15:people>`;\n this.zipHandler.addFile('word/people.xml', newPeopleXml);\n }\n\n // Ensure people.xml has a relationship entry\n const peopleType = RelationshipType.PEOPLE;\n const existingPeopleRels = this.relationshipManager.getRelationshipsByType(peopleType);\n if (existingPeopleRels.length === 0) {\n this.relationshipManager.addPeople();\n }\n\n this.logger.info('Updated people.xml with missing authors', {\n added: missingAuthors.length,\n authors: missingAuthors,\n });\n }\n\n /**\n * Recursively collects tracked change authors from a table's cells\n */\n private collectAuthorsFromTable(table: Table, authors: Set<string>): void {\n for (let r = 0; r < table.getRowCount(); r++) {\n const row = table.getRow(r);\n if (!row) continue;\n for (let c = 0; c < row.getCellCount(); c++) {\n const cell = row.getCell(c);\n if (!cell) continue;\n for (const para of cell.getParagraphs()) {\n for (const item of para.getContent()) {\n if (item instanceof Revision) {\n const author = item.getAuthor();\n if (author) authors.add(author);\n }\n }\n // Check rPrChange authors from runs\n for (const run of para.getRuns()) {\n const rPrChange = run.getPropertyChangeRevision();\n if (rPrChange?.author) {\n authors.add(rPrChange.author);\n }\n }\n if (para.formatting.pPrChange?.author) {\n authors.add(para.formatting.pPrChange.author);\n }\n }\n }\n }\n }\n\n /**\n * Saves custom properties to the ZIP archive\n */\n private saveCustomProperties(): void {\n // Only save custom.xml if there are custom properties\n if (\n this.properties.customProperties &&\n Object.keys(this.properties.customProperties).length > 0\n ) {\n const customXml = this.generator.generateCustomProps(this.properties.customProperties);\n if (customXml) {\n this.zipHandler.addFile('docProps/custom.xml', customXml);\n }\n }\n }\n\n /**\n * Parses [Content_Types].xml and extracts all Default and Override entries\n * Stores entries in format \"ext|mimetype\" and \"path|mimetype\" to enable round-trip preservation\n *\n * @param xml - The [Content_Types].xml content to parse\n * @returns Object containing sets of defaults and overrides\n */\n private parseContentTypes(xml: string): { defaults: Set<string>; overrides: Set<string> } {\n const defaults = new Set<string>();\n const overrides = new Set<string>();\n\n // Extract all <Default Extension=\"...\" ContentType=\"...\"/> entries\n const defaultMatches = xml.matchAll(\n /<Default\\s+Extension=\"([^\"]+)\"\\s+ContentType=\"([^\"]+)\"\\s*\\/>/g\n );\n for (const match of defaultMatches) {\n defaults.add(`${match[1]}|${match[2]}`); // Store as \"ext|mimetype\"\n }\n\n // Extract all <Override PartName=\"...\" ContentType=\"...\"/> entries\n const overrideMatches = xml.matchAll(\n /<Override\\s+PartName=\"([^\"]+)\"\\s+ContentType=\"([^\"]+)\"\\s*\\/>/g\n );\n for (const match of overrideMatches) {\n overrides.add(`${match[1]}|${match[2]}`); // Store as \"path|mimetype\"\n }\n\n return { defaults, overrides };\n }\n\n /**\n * Updates [Content_Types].xml to include image extensions, headers/footers, comments, and custom properties\n * Preserves entries for files that exist in the loaded document\n */\n private updateContentTypesWithImagesHeadersFootersAndComments(): void {\n const hasCustomProps =\n this.properties.customProperties && Object.keys(this.properties.customProperties).length > 0;\n\n const contentTypes = this.generator.generateContentTypesWithImagesHeadersFootersAndComments(\n this.imageManager,\n this.headerFooterManager,\n this.commentManager,\n this.zipHandler, // Pass zipHandler to check file existence\n undefined, // fontManager (optional)\n hasCustomProps, // Flag to include custom.xml override\n this._originalContentTypes, // Pass preserved original entries for round-trip fidelity\n this.footnoteManager,\n this.endnoteManager\n );\n this.zipHandler.updateFile(DOCX_PATHS.CONTENT_TYPES, contentTypes);\n }\n\n /**\n * Gets the BookmarkManager for bookmark operations\n *\n * Provides access to the BookmarkManager for advanced bookmark management,\n * including creating, querying, and managing document bookmarks.\n *\n * @returns The BookmarkManager instance managing this document's bookmarks\n *\n * @example\n * ```typescript\n * const bookmarks = doc.getBookmarkManager();\n * console.log(`Document has ${bookmarks.getAllBookmarks().length} bookmarks`);\n * ```\n */\n getBookmarkManager(): BookmarkManager {\n return this.bookmarkManager;\n }\n\n /**\n * Creates and registers a new bookmark with a unique name\n *\n * Creates a bookmark that can be used as an anchor for internal hyperlinks\n * or cross-references. The name is automatically normalized and made unique.\n *\n * @param name - Desired bookmark name (will be normalized to remove spaces and special characters)\n * @returns The created and registered Bookmark instance\n *\n * @example\n * ```typescript\n * const bookmark = doc.createBookmark('ImportantSection');\n * const para = doc.createParagraph('This is important');\n * para.addBookmark(bookmark);\n *\n * // Link to it from elsewhere\n * const link = Hyperlink.createInternal(bookmark.getName(), 'Go to section');\n * doc.createParagraph().addHyperlink(link);\n * ```\n */\n createBookmark(name: string): Bookmark {\n return this.bookmarkManager.createBookmark(name);\n }\n\n /**\n * Creates and registers a bookmark for a heading\n * Automatically generates a unique name from the heading text\n * @param headingText - The text of the heading\n * @returns The created and registered bookmark\n */\n createHeadingBookmark(headingText: string): Bookmark {\n return this.bookmarkManager.createHeadingBookmark(headingText);\n }\n\n /**\n * Gets a bookmark by name\n * @param name - Bookmark name\n * @returns The bookmark, or undefined if not found\n */\n getBookmark(name: string): Bookmark | undefined {\n return this.bookmarkManager.getBookmark(name);\n }\n\n /**\n * Checks if a bookmark exists\n * @param name - Bookmark name\n * @returns True if the bookmark exists\n */\n hasBookmark(name: string): boolean {\n return this.bookmarkManager.hasBookmark(name);\n }\n\n /**\n * Adds a bookmark to a paragraph (wraps the entire paragraph)\n * Creates the bookmark if a name is provided, or uses an existing bookmark object\n * @param paragraph - The paragraph to bookmark\n * @param bookmarkOrName - Bookmark object or bookmark name\n * @returns The bookmark that was added\n */\n addBookmarkToParagraph(paragraph: Paragraph, bookmarkOrName: Bookmark | string): Bookmark {\n const bookmark =\n typeof bookmarkOrName === 'string' ? this.createBookmark(bookmarkOrName) : bookmarkOrName;\n\n paragraph.addBookmark(bookmark);\n return bookmark;\n }\n\n /**\n * Adds or retrieves a \"_top\" bookmark at the beginning of the document\n *\n * This is a convenience method that ensures a \"_top\" bookmark exists at the start of the document body.\n * The bookmark is placed in an empty paragraph at position 0, with the structure:\n * ```xml\n * <w:bookmarkStart w:id=\"0\" w:name=\"_top\"/>\n * <w:bookmarkEnd w:id=\"0\"/>\n * ```\n *\n * This method is idempotent - calling it multiple times will not create duplicate bookmarks.\n * If the \"_top\" bookmark already exists, the existing bookmark is returned.\n *\n * @returns Object containing:\n * - `bookmark`: The Bookmark instance for \"_top\"\n * - `anchor`: The anchor name (\"_top\") for creating hyperlinks\n * - `hyperlink`: Convenience function to create a hyperlink to this bookmark\n *\n * @example\n * ```typescript\n * // Add or retrieve the _top bookmark\n * const { bookmark, anchor, hyperlink } = doc.addTopBookmark();\n *\n * // Create a hyperlink to the top of the document\n * const link = hyperlink('Back to top');\n * paragraph.addHyperlink(link);\n *\n * // Or create it manually\n * const link2 = Hyperlink.createInternal(anchor, 'Go to top');\n * ```\n */\n addTopBookmark(): {\n bookmark: Bookmark;\n anchor: string;\n hyperlink: (text: string, formatting?: RunFormatting) => Hyperlink;\n } {\n const BOOKMARK_NAME = '_top';\n\n // Check if _top bookmark already exists\n let bookmark = this.getBookmark(BOOKMARK_NAME);\n\n if (!bookmark) {\n // Create new _top bookmark\n // Note: We use skipNormalization to preserve the exact name \"_top\"\n // and explicitly set id to 0 as per the XML structure requirement\n bookmark = new Bookmark({\n id: 0,\n name: BOOKMARK_NAME,\n skipNormalization: true,\n });\n\n // Register the bookmark with the manager\n this.bookmarkManager.register(bookmark);\n\n // Add bookmark to the first existing paragraph if document has content\n // This avoids creating a visible newline at the top of the document\n const paragraphs = this.getAllParagraphs();\n\n if (paragraphs.length > 0 && paragraphs[0]) {\n // Add bookmark to first existing paragraph\n paragraphs[0].addBookmark(bookmark);\n } else {\n // Fallback: Create empty paragraph if document is empty\n const topParagraph = new Paragraph();\n topParagraph.addBookmark(bookmark);\n this.bodyElements.unshift(topParagraph);\n }\n }\n\n // Return the bookmark information and a convenience function\n return {\n bookmark,\n anchor: BOOKMARK_NAME,\n hyperlink: (text: string, formatting?: RunFormatting) => {\n return Hyperlink.createInternal(BOOKMARK_NAME, text, formatting);\n },\n };\n }\n\n /**\n * Gets the RevisionManager for track changes operations\n *\n * Provides access to the RevisionManager for managing tracked changes\n * (insertions, deletions, formatting changes, etc.) in the document.\n *\n * @returns The RevisionManager instance managing this document's revisions\n *\n * @example\n * ```typescript\n * const revManager = doc.getRevisionManager();\n * const stats = revManager.getStats();\n * console.log(`Document has ${stats.total} tracked changes`);\n * ```\n */\n getRevisionManager(): RevisionManager {\n return this.revisionManager;\n }\n\n // ============================================================\n // Revision Validation Methods\n // ============================================================\n\n /**\n * Validates all revisions in the document for ECMA-376 compliance.\n *\n * Checks for:\n * - Duplicate revision IDs\n * - Missing or invalid author attributes\n * - Orphaned move markers (moveFrom without moveTo or vice versa)\n * - Missing or invalid date formats\n * - Empty revisions\n * - Non-sequential IDs (in strict mode)\n *\n * @param options - Validation options\n * @returns Validation result with all issues found\n *\n * @example\n * ```typescript\n * const result = doc.validateRevisions();\n * if (!result.valid) {\n * console.error(`Found ${result.errors.length} errors:`);\n * for (const error of result.errors) {\n * console.error(` ${error.code}: ${error.message}`);\n * }\n * }\n * ```\n */\n validateRevisions(options?: ValidationOptions): ValidationResult {\n return RevisionValidator.validate(this, options);\n }\n\n /**\n * Auto-fixes revision validation issues.\n *\n * Can fix:\n * - Duplicate IDs (reassigns unique IDs)\n * - Missing authors (sets default author)\n * - Missing dates (sets current date)\n * - Orphaned move markers (removes orphaned markers)\n * - Empty revisions (removes them)\n * - Non-sequential IDs (reassigns sequentially)\n *\n * @param options - Auto-fix options\n * @returns Result with details of all fixes applied\n *\n * @example\n * ```typescript\n * // Fix all issues\n * const result = doc.autoFixRevisions();\n * console.log(`Fixed ${result.issuesFixed} issues`);\n *\n * // Preview fixes without applying\n * const preview = doc.autoFixRevisions({ dryRun: true });\n * console.log('Would fix:', preview.actions.map(a => a.action));\n * ```\n */\n autoFixRevisions(options?: AutoFixOptions): AutoFixResult {\n return RevisionAutoFixer.fix(this, options);\n }\n\n /**\n * Quick check if document revisions are valid.\n *\n * @returns True if document has no revision errors\n *\n * @example\n * ```typescript\n * if (!doc.isRevisionValid()) {\n * doc.autoFixRevisions();\n * }\n * ```\n */\n isRevisionsValid(): boolean {\n return RevisionValidator.isValid(this);\n }\n\n /**\n * Validates and auto-fixes revisions before save.\n *\n * This is a convenience method that validates first, then auto-fixes\n * any issues found. Use this before saving to ensure the document\n * will open correctly in Word.\n *\n * @param options - Options for validation and fixing\n * @returns Combined result of validation and fixing\n *\n * @example\n * ```typescript\n * const result = doc.validateAndFixRevisions();\n * if (result.validation.valid) {\n * await doc.save('output.docx');\n * }\n * ```\n */\n validateAndFixRevisions(options?: { validation?: ValidationOptions; autoFix?: AutoFixOptions }): {\n validation: ValidationResult;\n fix: AutoFixResult;\n } {\n // First validate\n const validation = this.validateRevisions(options?.validation);\n\n // If issues found, auto-fix\n let fix: AutoFixResult = {\n allFixed: true,\n issuesFixed: 0,\n issuesRemaining: 0,\n actions: [],\n errors: [],\n };\n\n if (!validation.valid) {\n fix = this.autoFixRevisions(options?.autoFix);\n }\n\n return { validation, fix };\n }\n\n /**\n * Creates and registers a new insertion revision\n * @param author - Author who made the insertion\n * @param content - Inserted content (Run or array of Runs)\n * @param date - Optional date (defaults to now)\n * @returns The created and registered revision\n */\n createInsertion(author: string, content: Run | Run[], date?: Date): Revision {\n const revision = Revision.createInsertion(author, content, date);\n return this.revisionManager.register(revision);\n }\n\n /**\n * Creates and registers a new deletion revision\n * @param author - Author who made the deletion\n * @param content - Deleted content (Run or array of Runs)\n * @param date - Optional date (defaults to now)\n * @returns The created and registered revision\n */\n createDeletion(author: string, content: Run | Run[], date?: Date): Revision {\n const revision = Revision.createDeletion(author, content, date);\n return this.revisionManager.register(revision);\n }\n\n /**\n * Creates and registers a revision from text\n * Convenience method that creates a Run from the text\n * @param type - Revision type ('insert' or 'delete')\n * @param author - Author who made the change\n * @param text - Text content\n * @param date - Optional date (defaults to now)\n * @returns The created and registered revision\n */\n createRevisionFromText(type: RevisionType, author: string, text: string, date?: Date): Revision {\n const revision = Revision.fromText(type, author, text, date);\n return this.revisionManager.register(revision);\n }\n\n /**\n * Finds the index of a paragraph in the document body\n * @param paragraph - The paragraph to find\n * @returns The index (0-based), or -1 if not found\n */\n private findParagraphIndex(paragraph: Paragraph): number {\n const paragraphs = this.getParagraphs();\n return paragraphs.indexOf(paragraph);\n }\n\n /**\n * Creates a RevisionLocation for a paragraph\n * @param paragraph - The paragraph containing the revision\n * @param runIndex - Optional run index within the paragraph\n * @returns RevisionLocation with paragraph index, or undefined if not found\n */\n private createRevisionLocation(\n paragraph: Paragraph,\n runIndex?: number\n ): RevisionLocation | undefined {\n const paragraphIndex = this.findParagraphIndex(paragraph);\n if (paragraphIndex === -1) {\n return undefined; // Paragraph not found in document\n }\n const location: RevisionLocation = { paragraphIndex };\n if (runIndex !== undefined) {\n location.runIndex = runIndex;\n }\n return location;\n }\n\n /**\n * Adds a tracked insertion to a paragraph\n * @param paragraph - The paragraph to add the insertion to\n * @param author - Author who made the insertion\n * @param text - Inserted text\n * @param date - Optional date (defaults to now)\n * @returns The created revision with location set\n */\n trackInsertion(paragraph: Paragraph, author: string, text: string, date?: Date): Revision {\n const revision = this.createRevisionFromText('insert', author, text, date);\n\n // Set location for changelog/tracking purposes\n const location = this.createRevisionLocation(paragraph);\n if (location) {\n // Run index will be the next run position in the paragraph\n location.runIndex = paragraph.getRuns().length;\n revision.setLocation(location);\n }\n\n paragraph.addRevision(revision);\n return revision;\n }\n\n /**\n * Adds a tracked deletion to a paragraph\n * @param paragraph - The paragraph to add the deletion to\n * @param author - Author who made the deletion\n * @param text - Deleted text\n * @param date - Optional date (defaults to now)\n * @returns The created revision with location set\n */\n trackDeletion(paragraph: Paragraph, author: string, text: string, date?: Date): Revision {\n const revision = this.createRevisionFromText('delete', author, text, date);\n\n // Set location for changelog/tracking purposes\n const location = this.createRevisionLocation(paragraph);\n if (location) {\n // Run index will be the next run position in the paragraph\n location.runIndex = paragraph.getRuns().length;\n revision.setLocation(location);\n }\n\n paragraph.addRevision(revision);\n return revision;\n }\n\n /**\n * Adds a tracked field instruction deletion to a paragraph\n * Uses w:delInstrText instead of w:delText for field codes\n * @param paragraph - The paragraph to add the deletion to\n * @param author - Author who made the deletion\n * @param fieldInstruction - Deleted field instruction text (e.g., 'PAGE', 'DATE')\n * @param date - Optional date (defaults to now)\n * @returns The created revision with location set\n * @example\n * // Track deletion of a PAGE field\n * const para = doc.createParagraph();\n * doc.trackFieldInstructionDeletion(para, 'Alice', 'PAGE \\\\* MERGEFORMAT');\n */\n trackFieldInstructionDeletion(\n paragraph: Paragraph,\n author: string,\n fieldInstruction: string,\n date?: Date\n ): Revision {\n const run = new Run(fieldInstruction);\n const revision = Revision.createFieldInstructionDeletion(author, run, date);\n this.revisionManager.register(revision);\n\n // Set location for changelog/tracking purposes\n const location = this.createRevisionLocation(paragraph);\n if (location) {\n location.runIndex = paragraph.getRuns().length;\n revision.setLocation(location);\n }\n\n paragraph.addRevision(revision);\n return revision;\n }\n\n /**\n * Marks a paragraph mark as deleted (tracked change)\n *\n * When a paragraph mark is deleted, it indicates that the paragraph\n * was joined with the next paragraph. This creates a deletion marker\n * in the paragraph properties (w:pPr/w:rPr/w:del) per ECMA-376 Part 1 §17.13.5.14.\n *\n * @param paragraph - Paragraph whose mark is deleted\n * @param author - Author who deleted the paragraph mark\n * @param date - Optional date (defaults to now)\n * @returns The paragraph for chaining\n * @example\n * // Mark paragraph mark as deleted when joining paragraphs\n * const para = doc.createParagraph('First paragraph');\n * doc.trackParagraphMarkDeletion(para, 'Alice');\n * // In Word, this shows the ¶ symbol as deleted\n */\n trackParagraphMarkDeletion(paragraph: Paragraph, author: string, date?: Date): Paragraph {\n const revisionId = this.revisionManager.consumeNextId();\n paragraph.markParagraphMarkAsDeleted(revisionId, author, date);\n return paragraph;\n }\n\n /**\n * Checks if the document contains any tracked changes\n *\n * Note: This checks if revisions exist, not if tracking is enabled.\n * Use {@link isTrackChangesEnabled} to check the tracking mode setting.\n *\n * @returns True if the document has one or more tracked changes (insertions, deletions, etc.)\n *\n * @example\n * ```typescript\n * if (doc.isTrackingChanges()) {\n * console.log('Document has pending changes to review');\n * const stats = doc.getRevisionStats();\n * console.log(`${stats.insertions} insertions, ${stats.deletions} deletions`);\n * }\n * ```\n */\n isTrackingChanges(): boolean {\n return this.revisionManager.isTrackingChanges();\n }\n\n /**\n * Checks if the document has any tracked changes (revisions)\n *\n * Convenience method that checks whether the document contains any revision\n * objects (insertions, deletions, moves, property changes, etc.).\n *\n * This is functionally equivalent to {@link isTrackingChanges} but uses a\n * more intuitive name that clarifies it checks for the *presence* of revisions,\n * not whether tracking mode is enabled.\n *\n * @returns True if the document contains one or more tracked changes\n *\n * @example\n * ```typescript\n * if (doc.hasTrackedChanges()) {\n * console.log('Document has pending revisions to review');\n * const stats = doc.getRevisionStats();\n * console.log(`Found ${stats.total} tracked changes`);\n * }\n * ```\n *\n * @see {@link isTrackingChanges} - Identical functionality\n * @see {@link isTrackChangesEnabled} - Checks if tracking mode is enabled\n */\n hasTrackedChanges(): boolean {\n return this.revisionManager.isTrackingChanges();\n }\n\n /**\n * Checks if the document's raw XML contains revision markup.\n *\n * This method checks the actual XML content of the document for revision\n * elements like `<w:ins>`, `<w:del>`, `<w:moveFrom>`, and `<w:moveTo>`.\n * Unlike {@link hasTrackedChanges}, which only checks the in-memory model,\n * this method detects revisions that may not have been fully parsed.\n *\n * Use this when you need to know if the document file contains any tracked\n * changes, regardless of whether they were parsed into the object model.\n *\n * @returns True if the raw XML contains revision markup\n *\n * @example\n * ```typescript\n * const doc = await Document.load('document.docx');\n *\n * // Check raw XML for revisions (more reliable)\n * if (doc.hasRawXmlRevisions()) {\n * console.log('Document XML contains tracked changes');\n * }\n *\n * // Compare with in-memory check\n * if (doc.hasTrackedChanges()) {\n * console.log('Document has parsed revisions in memory');\n * }\n * ```\n */\n hasRawXmlRevisions(): boolean {\n const documentXml = this.zipHandler.getFileAsString('word/document.xml');\n if (!documentXml) {\n return false;\n }\n // Use precise patterns to avoid false matches like <w:insideH> (table borders)\n // Revision elements are: <w:ins ...>, <w:del ...>, <w:moveFrom ...>, <w:moveTo ...>\n // They either have attributes (<w:ins w:author=...) or just close (>)\n return (\n /<w:ins[\\s>]/.test(documentXml) ||\n /<w:del[\\s>]/.test(documentXml) ||\n /<w:moveFrom[\\s>]/.test(documentXml) ||\n /<w:moveTo[\\s>]/.test(documentXml)\n );\n }\n\n /**\n * Gets detailed statistics about tracked changes in the document\n *\n * Provides a comprehensive breakdown of all revisions including counts\n * by type, list of authors, and the next available revision ID.\n *\n * @returns Object containing revision statistics\n *\n * @example\n * ```typescript\n * const stats = doc.getRevisionStats();\n * console.log(`Total changes: ${stats.total}`);\n * console.log(`Insertions: ${stats.insertions}`);\n * console.log(`Deletions: ${stats.deletions}`);\n * console.log(`Authors: ${stats.authors.join(', ')}`);\n * ```\n */\n getRevisionStats(): {\n total: number;\n insertions: number;\n deletions: number;\n propertyChanges: number;\n moves: number;\n tableCellChanges: number;\n authors: string[];\n nextId: number;\n } {\n return this.revisionManager.getStats();\n }\n\n /**\n * Enables track changes mode for the document\n *\n * When enabled, Word will track all future edits made to the document.\n * This adds the w:trackRevisions flag to settings.xml and configures\n * revision view settings (what changes are visible).\n *\n * @param options - Optional track changes configuration\n * @param options.trackFormatting - Track formatting changes (default: true)\n * @param options.showInsertionsAndDeletions - Display insertions/deletions in Word (default: true)\n * @param options.showFormatting - Display formatting changes in Word (default: true)\n * @param options.showInkAnnotations - Display ink annotations in Word (default: true)\n * @returns This document instance for method chaining\n *\n * @example\n * ```typescript\n * // Enable with defaults\n * doc.enableTrackChanges();\n * ```\n *\n * @example\n * ```typescript\n * // Enable with custom settings\n * doc.enableTrackChanges({\n * trackFormatting: false,\n * showInsertionsAndDeletions: true\n * });\n * ```\n */\n enableTrackChanges(options?: {\n /** Author name for automatically tracked changes (default: 'DocHub') */\n author?: string;\n trackFormatting?: boolean;\n showInsertionsAndDeletions?: boolean;\n showFormatting?: boolean;\n showInkAnnotations?: boolean;\n /**\n * Whether to clear existing pPrChange elements before enabling tracking.\n * Default: true\n *\n * When true, any existing paragraph property change tracking (w:pPrChange)\n * is cleared before enabling fresh tracking. This prevents merge issues\n * where Word requires multiple \"Accept All\" clicks.\n *\n * Set to false only if you specifically want to preserve and merge with\n * existing pPrChange elements.\n */\n clearExistingPropertyChanges?: boolean;\n }): this {\n // Clear existing pPrChange elements to prevent merge issues with Word\n // This ensures Word's \"Accept All Changes\" works in a single click\n // Can be disabled via options.clearExistingPropertyChanges = false\n const shouldClear = options?.clearExistingPropertyChanges !== false;\n if (shouldClear) {\n this.clearAllParagraphPropertyChanges();\n }\n\n this.trackChangesEnabled = true;\n this._settingsModified = true;\n\n if (options) {\n if (options.trackFormatting !== undefined) {\n this.trackFormatting = options.trackFormatting;\n }\n if (options.showInsertionsAndDeletions !== undefined) {\n this.revisionViewSettings.showInsertionsAndDeletions = options.showInsertionsAndDeletions;\n }\n if (options.showFormatting !== undefined) {\n this.revisionViewSettings.showFormatting = options.showFormatting;\n }\n if (options.showInkAnnotations !== undefined) {\n this.revisionViewSettings.showInkAnnotations = options.showInkAnnotations;\n }\n }\n\n // Enable the tracking context for automatic change tracking\n this.trackingContext.enable({\n author: options?.author,\n trackFormatting: this.trackFormatting,\n });\n\n // Bind tracking context to all existing elements\n this.bindTrackingToAllElements();\n\n return this;\n }\n\n /**\n * Disables track changes mode for the document\n *\n * When disabled, Word will not track future edits.\n * Note: This does NOT remove existing tracked changes.\n *\n * @returns This document instance for method chaining\n *\n * @example\n * ```typescript\n * doc.disableTrackChanges();\n * await doc.save('output.docx'); // Future edits won't be tracked\n * ```\n */\n disableTrackChanges(): this {\n this.trackChangesEnabled = false;\n this._settingsModified = true;\n this.trackingContext.disable(); // Flushes pending changes and disables\n return this;\n }\n\n /**\n * Checks if track changes is enabled\n * @returns True if track changes is enabled\n */\n isTrackChangesEnabled(): boolean {\n return this.trackChangesEnabled;\n }\n\n /**\n * Gets the track formatting setting\n * @returns True if formatting changes are tracked\n */\n isTrackFormattingEnabled(): boolean {\n return this.trackFormatting;\n }\n\n /**\n * Gets the revision view settings\n * @returns Revision view settings\n */\n getRevisionViewSettings(): {\n showInsertionsAndDeletions: boolean;\n showFormatting: boolean;\n showInkAnnotations: boolean;\n } {\n return { ...this.revisionViewSettings };\n }\n\n /**\n * Gets the tracking context for automatic change tracking.\n * Elements use this to notify the document of changes.\n * @returns The tracking context\n */\n getTrackingContext(): TrackingContext {\n return this.trackingContext;\n }\n\n /**\n * Flushes all pending tracked changes and creates Revision objects.\n * Called automatically on save, but can be called manually.\n * @returns Array of created Revision objects\n */\n flushPendingChanges(): Revision[] {\n return this.trackingContext.flushPendingChanges();\n }\n\n /**\n * Enable automatic acceptance of all revisions before save.\n *\n * When enabled, acceptAllRevisions() is called after flushPendingChanges()\n * but before XML generation during save(). This ensures ALL revisions\n * (including those created during save) are accepted.\n *\n * This is useful when you want a clean document without visible tracked changes,\n * but need to process the document first and capture changes for logging/UI display.\n *\n * @param accept - Whether to accept all revisions before save (default: false)\n * @returns This document instance for method chaining\n *\n * @example\n * ```typescript\n * // Enable track changes for processing\n * doc.enableTrackChanges({ author: 'DocHub' });\n *\n * // Make modifications (automatically tracked)\n * doc.createParagraph('New content');\n *\n * // Extract changes for UI display BEFORE accepting\n * const changes = ChangelogGenerator.fromDocument(doc);\n *\n * // Enable auto-accept so document will be clean after save\n * doc.setAcceptRevisionsBeforeSave(true);\n * doc.disableTrackChanges();\n *\n * // Save - all revisions will be accepted, document will have no visible tracked changes\n * await doc.save('output.docx');\n * ```\n */\n setAcceptRevisionsBeforeSave(accept: boolean): this {\n this.acceptRevisionsBeforeSave = accept;\n return this;\n }\n\n /**\n * Check if revisions will be automatically accepted before save.\n * @returns True if revisions will be accepted before save\n */\n getAcceptRevisionsBeforeSave(): boolean {\n return this.acceptRevisionsBeforeSave;\n }\n\n /**\n * Binds the tracking context to all existing elements in the document.\n * Called automatically when track changes is enabled.\n * @internal\n */\n private bindTrackingToAllElements(): void {\n for (const element of this.bodyElements) {\n this.bindTrackingToElement(element);\n }\n // Bind tracking to section\n this.bindTrackingToElement(this.section);\n\n // Headers\n for (const entry of this.headerFooterManager.getAllHeaders()) {\n for (const element of entry.header.getElements()) {\n this.bindTrackingToElement(element);\n }\n }\n\n // Footers\n for (const entry of this.headerFooterManager.getAllFooters()) {\n for (const element of entry.footer.getElements()) {\n this.bindTrackingToElement(element);\n }\n }\n\n // Footnotes\n for (const footnote of this.footnoteManager.getAllFootnotes()) {\n for (const para of footnote.getParagraphs()) {\n this.bindTrackingToElement(para);\n }\n }\n\n // Endnotes\n for (const endnote of this.endnoteManager.getAllEndnotes()) {\n for (const para of endnote.getParagraphs()) {\n this.bindTrackingToElement(para);\n }\n }\n\n // Comments\n for (const comment of this.commentManager.getAllCommentsWithReplies()) {\n for (const run of comment.getRuns()) {\n this.bindTrackingToElement(run);\n }\n }\n }\n\n /**\n * Binds the tracking context to an element and its children.\n * @param element - Element to bind\n * @internal\n */\n private bindTrackingToElement(element: any): void {\n // Set tracking context on element if it supports it\n if (element && typeof element._setTrackingContext === 'function') {\n element._setTrackingContext(this.trackingContext);\n }\n\n // Recursively bind to runs\n if (element && typeof element.getRuns === 'function') {\n for (const run of element.getRuns()) {\n this.bindTrackingToElement(run);\n }\n }\n\n // Recursively bind to hyperlinks\n if (element && typeof element.getHyperlinks === 'function') {\n for (const link of element.getHyperlinks()) {\n this.bindTrackingToElement(link);\n }\n }\n\n // Bind to ComplexField instances in paragraph content\n if (element && typeof element.getContent === 'function') {\n for (const item of element.getContent()) {\n if (\n item &&\n typeof item._setTrackingContext === 'function' &&\n typeof item.getInstruction === 'function'\n ) {\n item._setTrackingContext(this.trackingContext);\n }\n }\n }\n\n // Recursively bind to table rows and cells\n if (element && typeof element.getRows === 'function') {\n for (const row of element.getRows()) {\n this.bindTrackingToElement(row);\n if (typeof row.getCells === 'function') {\n for (const cell of row.getCells()) {\n this.bindTrackingToElement(cell);\n // Bind to paragraphs in cell\n if (typeof cell.getParagraphs === 'function') {\n for (const para of cell.getParagraphs()) {\n this.bindTrackingToElement(para);\n }\n }\n }\n }\n }\n }\n }\n\n /**\n * Sets the RSID root for this document\n * RSID (Revision Save ID) identifies the first editing session\n * @param rsidRoot - 8-character hexadecimal RSID value\n */\n setRsidRoot(rsidRoot: string): this {\n // Validate RSID format (8 hex characters)\n if (!/^[0-9A-Fa-f]{8}$/.test(rsidRoot)) {\n throw new Error('RSID must be an 8-character hexadecimal value');\n }\n this.rsidRoot = rsidRoot.toUpperCase();\n this.rsids.add(this.rsidRoot);\n this._settingsModified = true;\n return this;\n }\n\n /**\n * Adds an RSID to the document\n * Each editing session gets a unique RSID\n * @param rsid - 8-character hexadecimal RSID value\n */\n addRsid(rsid: string): this {\n // Validate RSID format\n if (!/^[0-9A-Fa-f]{8}$/.test(rsid)) {\n throw new Error('RSID must be an 8-character hexadecimal value');\n }\n this.rsids.add(rsid.toUpperCase());\n this._settingsModified = true;\n return this;\n }\n\n /**\n * Generates a new random RSID and adds it to the document\n * @returns The generated RSID\n */\n generateRsid(): string {\n const rsid = Math.floor(Math.random() * 0xffffffff)\n .toString(16)\n .toUpperCase()\n .padStart(8, '0');\n this.rsids.add(rsid);\n this._settingsModified = true;\n return rsid;\n }\n\n /**\n * Gets the RSID root value\n * @returns RSID root or undefined if not set\n */\n getRsidRoot(): string | undefined {\n return this.rsidRoot;\n }\n\n /**\n * Gets all RSIDs in the document\n * @returns Array of RSID values\n */\n getRsids(): string[] {\n return Array.from(this.rsids);\n }\n\n /**\n * Protects the document with specified edit restrictions\n * @param protection - Document protection settings\n */\n protectDocument(protection: {\n edit: 'readOnly' | 'comments' | 'trackedChanges' | 'forms';\n enforcement?: boolean;\n password?: string;\n cryptProviderType?: string;\n cryptAlgorithmClass?: string;\n cryptAlgorithmType?: string;\n cryptAlgorithmSid?: number;\n cryptSpinCount?: number;\n }): this {\n this.documentProtection = {\n edit: protection.edit,\n enforcement: protection.enforcement ?? true,\n cryptProviderType: protection.cryptProviderType,\n cryptAlgorithmClass: protection.cryptAlgorithmClass,\n cryptAlgorithmType: protection.cryptAlgorithmType,\n cryptAlgorithmSid: protection.cryptAlgorithmSid,\n cryptSpinCount: protection.cryptSpinCount,\n };\n this._settingsModified = true;\n\n // If password provided, generate hash and salt\n if (protection.password) {\n // For now, use a simple hash. In production, use proper cryptographic functions\n const crypto = require('crypto');\n const salt = crypto.randomBytes(16).toString('base64');\n const hash = crypto\n .pbkdf2Sync(protection.password, salt, protection.cryptSpinCount || 100000, 32, 'sha512')\n .toString('base64');\n\n this.documentProtection.hash = hash;\n this.documentProtection.salt = salt;\n }\n\n return this;\n }\n\n /**\n * Removes document protection\n */\n unprotectDocument(): this {\n this.documentProtection = undefined;\n this._settingsModified = true;\n return this;\n }\n\n /**\n * Checks if document is protected\n * @returns True if document has protection enabled\n */\n isProtected(): boolean {\n return this.documentProtection !== undefined;\n }\n\n /**\n * Gets document protection settings\n * @returns Document protection settings or undefined\n */\n getProtection(): typeof this.documentProtection {\n return this.documentProtection;\n }\n\n // ==================== COMPATIBILITY MODE API ====================\n\n /**\n * Gets the document's compatibility mode version.\n *\n * For loaded documents, returns the mode parsed from settings.xml.\n * For new documents, returns Word2013Plus (15) since that's what the framework generates.\n * Per MS-DOCX spec, the default when the w:compat block is absent is 12 (Word 2007).\n *\n * @returns The CompatibilityMode enum value (11, 12, 14, or 15)\n */\n getCompatibilityMode(): CompatibilityMode {\n return this._compatInfo?.mode ?? CompatibilityMode.Word2007;\n }\n\n /**\n * Gets the document background per ECMA-376 Part 1 §17.2.1\n * @returns Background properties or undefined\n */\n getDocumentBackground():\n | { color?: string; themeColor?: string; themeTint?: string; themeShade?: string }\n | undefined {\n return this._documentBackground ? { ...this._documentBackground } : undefined;\n }\n\n /**\n * Sets the document background per ECMA-376 Part 1 §17.2.1\n * @param background - Background properties (color, themeColor, etc.) or undefined to remove\n */\n setDocumentBackground(\n background:\n | { color?: string; themeColor?: string; themeTint?: string; themeShade?: string }\n | undefined\n ): void {\n this._documentBackground = background ? { ...background } : undefined;\n }\n\n /**\n * Gets whether even and odd headers/footers are enabled (w:evenAndOddHeaders)\n */\n /**\n * Gets the document view type (w:view) per ECMA-376 Part 1 §17.15.1.92.\n * Common values: 'print', 'web', 'outline', 'masterPages', 'normal', 'none'.\n * @returns The view type string, or undefined if not set\n */\n getDocumentView(): string | undefined {\n return this._documentView;\n }\n\n /**\n * Sets the document view type (w:view) per ECMA-376 Part 1 §17.15.1.92.\n * Controls which view mode Word uses when opening the document.\n * Common values: 'print' (Print Layout), 'web' (Web Layout), 'outline', 'normal' (Draft).\n * @param view - The view type to set\n */\n setDocumentView(view: string): void {\n this._documentView = view;\n this._settingsModified = true;\n }\n\n getEvenAndOddHeaders(): boolean {\n return this._evenAndOddHeaders ?? false;\n }\n\n /**\n * Sets even and odd headers/footers mode (w:evenAndOddHeaders)\n */\n setEvenAndOddHeaders(enabled: boolean): void {\n this._evenAndOddHeaders = enabled;\n this._settingsModified = true;\n this._modifiedBooleanSettings.add('evenAndOddHeaders');\n }\n\n /**\n * Gets whether mirror margins are enabled (w:mirrorMargins)\n */\n getMirrorMargins(): boolean {\n return this._mirrorMargins ?? false;\n }\n\n /**\n * Sets mirror margins mode (w:mirrorMargins)\n */\n setMirrorMargins(enabled: boolean): void {\n this._mirrorMargins = enabled;\n this._settingsModified = true;\n this._modifiedBooleanSettings.add('mirrorMargins');\n }\n\n /**\n * Gets whether auto hyphenation is enabled (w:autoHyphenation)\n */\n getAutoHyphenation(): boolean {\n return this._autoHyphenation ?? false;\n }\n\n /**\n * Sets auto hyphenation (w:autoHyphenation)\n */\n setAutoHyphenation(enabled: boolean): void {\n this._autoHyphenation = enabled;\n this._settingsModified = true;\n this._modifiedBooleanSettings.add('autoHyphenation');\n }\n\n /**\n * Gets whether spelling errors are hidden (w:hideSpellingErrors)\n */\n getHideSpellingErrors(): boolean {\n return this._hideSpellingErrors ?? false;\n }\n\n /**\n * Sets whether to hide spelling errors (w:hideSpellingErrors)\n */\n setHideSpellingErrors(enabled: boolean): void {\n this._hideSpellingErrors = enabled;\n this._settingsModified = true;\n this._modifiedBooleanSettings.add('hideSpellingErrors');\n }\n\n /**\n * Gets whether grammatical errors are hidden (w:hideGrammaticalErrors)\n */\n getHideGrammaticalErrors(): boolean {\n return this._hideGrammaticalErrors ?? false;\n }\n\n /**\n * Sets whether to hide grammatical errors (w:hideGrammaticalErrors)\n */\n setHideGrammaticalErrors(enabled: boolean): void {\n this._hideGrammaticalErrors = enabled;\n this._settingsModified = true;\n this._modifiedBooleanSettings.add('hideGrammaticalErrors');\n }\n\n /**\n * Gets the default tab stop value in twips (w:defaultTabStop)\n */\n getDefaultTabStop(): number | undefined {\n return this._defaultTabStop;\n }\n\n /**\n * Sets the default tab stop value in twips (w:defaultTabStop)\n */\n setDefaultTabStop(twips: number): void {\n this._defaultTabStop = twips;\n this._settingsModified = true;\n this._modifiedBooleanSettings.add('defaultTabStop');\n }\n\n /**\n * Gets whether fields are updated on document open (w:updateFields)\n */\n getUpdateFields(): boolean {\n return this._updateFields ?? false;\n }\n\n /**\n * Sets whether fields should be updated on document open (w:updateFields)\n */\n setUpdateFields(enabled: boolean): void {\n this._updateFields = enabled;\n this._settingsModified = true;\n this._modifiedBooleanSettings.add('updateFields');\n }\n\n /**\n * Gets whether TrueType fonts are embedded (w:embedTrueTypeFonts)\n */\n getEmbedTrueTypeFonts(): boolean {\n return this._embedTrueTypeFonts ?? false;\n }\n\n /**\n * Sets whether to embed TrueType fonts (w:embedTrueTypeFonts)\n */\n setEmbedTrueTypeFonts(enabled: boolean): void {\n this._embedTrueTypeFonts = enabled;\n this._settingsModified = true;\n this._modifiedBooleanSettings.add('embedTrueTypeFonts');\n }\n\n /**\n * Gets whether only font subsets are saved (w:saveSubsetFonts)\n */\n getSaveSubsetFonts(): boolean {\n return this._saveSubsetFonts ?? false;\n }\n\n /**\n * Sets whether to save only font subsets (w:saveSubsetFonts)\n */\n setSaveSubsetFonts(enabled: boolean): void {\n this._saveSubsetFonts = enabled;\n this._settingsModified = true;\n this._modifiedBooleanSettings.add('saveSubsetFonts');\n }\n\n /**\n * Gets whether move tracking is disabled (w:doNotTrackMoves)\n */\n getDoNotTrackMoves(): boolean {\n return this._doNotTrackMoves ?? false;\n }\n\n /**\n * Sets whether to disable move tracking (w:doNotTrackMoves)\n */\n setDoNotTrackMoves(enabled: boolean): void {\n this._doNotTrackMoves = enabled;\n this._settingsModified = true;\n this._modifiedBooleanSettings.add('doNotTrackMoves');\n }\n\n /**\n * Gets the decimal symbol for locale (w:decimalSymbol)\n */\n getDecimalSymbol(): string | undefined {\n return this._decimalSymbol;\n }\n\n /**\n * Gets the list separator for locale (w:listSeparator)\n */\n getListSeparator(): string | undefined {\n return this._listSeparator;\n }\n\n /**\n * Whether the document is in a legacy compatibility mode (anything below Word 2013/mode 15).\n *\n * When true, Word's layout engine uses older rendering rules that may differ from\n * modern mode for table sizing, line breaking, text wrapping, and spacing.\n *\n * Per MS-DOCX spec, documents without a w:compat block default to mode 12 (legacy).\n *\n * @returns true if the document targets a Word version prior to 2013\n */\n isCompatibilityMode(): boolean {\n return this._compatInfo?.isLegacyMode ?? true;\n }\n\n /**\n * Gets the full parsed compatibility settings from the w:compat block.\n *\n * Includes the numeric mode, whether it's legacy, all modern w:compatSetting entries\n * (name/uri/val triples), and all legacy boolean compat flags that are enabled.\n *\n * @returns CompatibilityInfo with all parsed settings\n */\n getCompatibilityInfo(): CompatibilityInfo {\n return (\n this._compatInfo ?? {\n mode: CompatibilityMode.Word2007,\n isLegacyMode: true,\n compatSettings: [],\n legacyFlags: [],\n }\n );\n }\n\n /**\n * Upgrades the document to modern Word format (compatibility mode 15).\n *\n * This is equivalent to clicking File > Info > Convert in Microsoft Word.\n * It performs the following:\n *\n * 1. Updates compatibilityMode to 15 (Word 2013+)\n * 2. Removes legacy compat boolean flags (~65 possible elements)\n * 3. Adds modern w:compatSetting entries\n * 4. Ensures document.xml namespaces include w14/w15/w16se/w16cid\n *\n * WARNING: This may cause minor layout shifts. Word's modern layout engine\n * handles table sizing, line breaking, text wrapping, and spacing differently\n * than legacy modes. This is the same behavior as Word's own Convert button.\n *\n * This does NOT convert VML shapes to DrawingML, or upgrade legacy equation\n * objects. Those transformations are Word-internal and are preserved as-is\n * via XML passthrough.\n *\n * @returns UpgradeReport with details of what changed\n */\n upgradeToModernFormat(): UpgradeReport {\n const currentMode = this.getCompatibilityMode();\n const currentInfo = this.getCompatibilityInfo();\n\n // Already fully modern — check if there are any legacy flags to clean\n if (currentMode === CompatibilityMode.Word2013Plus && currentInfo.legacyFlags.length === 0) {\n return {\n previousMode: currentMode,\n newMode: 15,\n removedFlags: [],\n addedSettings: [],\n namespacesExpanded: false,\n changed: false,\n };\n }\n\n // Upgrade the settings.xml compat block\n if (this._originalSettingsXml) {\n const result = CompatibilityUpgrader.upgradeCompatBlock(\n this._originalSettingsXml,\n currentMode\n );\n this._originalSettingsXml = result.xml;\n this._settingsModified = true;\n\n // Expand namespaces on the document\n const nsResult = CompatibilityUpgrader.ensureModernNamespaces(this.namespaces);\n this.namespaces = nsResult.namespaces;\n result.report.namespacesExpanded = nsResult.expanded;\n\n // Update in-memory compat info\n this._compatInfo = {\n mode: CompatibilityMode.Word2013Plus,\n isLegacyMode: false,\n compatSettings: [...MODERN_COMPAT_SETTINGS],\n legacyFlags: [],\n };\n\n return result.report;\n }\n\n // New document (no original settings.xml) — ensure modern compat info\n this._compatInfo = {\n mode: CompatibilityMode.Word2013Plus,\n isLegacyMode: false,\n compatSettings: [...MODERN_COMPAT_SETTINGS],\n legacyFlags: [],\n };\n\n const nsResult = CompatibilityUpgrader.ensureModernNamespaces(this.namespaces);\n this.namespaces = nsResult.namespaces;\n\n return {\n previousMode: currentMode,\n newMode: 15,\n removedFlags: [],\n addedSettings: MODERN_COMPAT_SETTINGS.map((s) => s.name),\n namespacesExpanded: nsResult.expanded,\n changed: currentMode !== CompatibilityMode.Word2013Plus,\n };\n }\n\n /**\n * Creates and registers a run properties change revision\n * @param author - Author who made the change\n * @param content - Content with changed formatting\n * @param previousProperties - Previous run properties\n * @param date - Optional date (defaults to now)\n * @returns The created and registered revision\n */\n createRunPropertiesChange(\n author: string,\n content: Run | Run[],\n previousProperties: Record<string, any>,\n date?: Date\n ): Revision {\n const revision = Revision.createRunPropertiesChange(author, content, previousProperties, date);\n return this.revisionManager.register(revision);\n }\n\n /**\n * Creates and registers a paragraph properties change revision\n * @param author - Author who made the change\n * @param content - Paragraph content\n * @param previousProperties - Previous paragraph properties\n * @param date - Optional date (defaults to now)\n * @returns The created and registered revision\n */\n createParagraphPropertiesChange(\n author: string,\n content: Run | Run[],\n previousProperties: Record<string, any>,\n date?: Date\n ): Revision {\n const revision = Revision.createParagraphPropertiesChange(\n author,\n content,\n previousProperties,\n date\n );\n return this.revisionManager.register(revision);\n }\n\n /**\n * Creates and registers a table properties change revision\n * @param author - Author who made the change\n * @param content - Table content\n * @param previousProperties - Previous table properties\n * @param date - Optional date (defaults to now)\n * @returns The created and registered revision\n */\n createTablePropertiesChange(\n author: string,\n content: Run | Run[],\n previousProperties: Record<string, any>,\n date?: Date\n ): Revision {\n const revision = Revision.createTablePropertiesChange(\n author,\n content,\n previousProperties,\n date\n );\n return this.revisionManager.register(revision);\n }\n\n /**\n * Creates and registers a moveFrom revision (source of moved content)\n * @param author - Author who moved the content\n * @param content - Content that was moved\n * @param moveId - Unique move operation ID (links moveFrom and moveTo)\n * @param date - Optional date (defaults to now)\n * @returns The created and registered revision\n */\n createMoveFrom(author: string, content: Run | Run[], moveId: string, date?: Date): Revision {\n const revision = Revision.createMoveFrom(author, content, moveId, date);\n return this.revisionManager.register(revision);\n }\n\n /**\n * Creates and registers a moveTo revision (destination of moved content)\n * @param author - Author who moved the content\n * @param content - Content that was moved\n * @param moveId - Unique move operation ID (links moveFrom and moveTo)\n * @param date - Optional date (defaults to now)\n * @returns The created and registered revision\n */\n createMoveTo(author: string, content: Run | Run[], moveId: string, date?: Date): Revision {\n const revision = Revision.createMoveTo(author, content, moveId, date);\n return this.revisionManager.register(revision);\n }\n\n /**\n * Creates a pair of moveFrom and moveTo revisions for moving content\n * @param author - Author who moved the content\n * @param content - Content that was moved\n * @param date - Optional date (defaults to now)\n * @returns Object with both moveFrom and moveTo revisions and range markers\n */\n trackMove(\n author: string,\n content: Run | Run[],\n date?: Date\n ): {\n moveFrom: Revision;\n moveTo: Revision;\n moveId: string;\n moveFromRangeStart: RangeMarker;\n moveFromRangeEnd: RangeMarker;\n moveToRangeStart: RangeMarker;\n moveToRangeEnd: RangeMarker;\n } {\n // Generate unique move ID and name\n const moveId = `move${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n const moveName = `move${Date.now()}`;\n\n // Get unique IDs for range markers (use revision manager's next ID)\n const rangeIdStart = this.revisionManager.getStats().nextId;\n\n // Create range markers for moveFrom\n const moveFromRangeStart = RangeMarker.createMoveFromStart(\n rangeIdStart,\n moveName,\n author,\n date\n );\n const moveFromRangeEnd = RangeMarker.createMoveFromEnd(rangeIdStart);\n\n // Create range markers for moveTo\n const moveToRangeStart = RangeMarker.createMoveToStart(rangeIdStart, moveName, author, date);\n const moveToRangeEnd = RangeMarker.createMoveToEnd(rangeIdStart);\n\n // Create the actual move revisions\n const moveFrom = this.createMoveFrom(author, content, moveId, date);\n const moveTo = this.createMoveTo(author, content, moveId, date);\n\n return {\n moveFrom,\n moveTo,\n moveId,\n moveFromRangeStart,\n moveFromRangeEnd,\n moveToRangeStart,\n moveToRangeEnd,\n };\n }\n\n /**\n * Creates and registers a table cell insertion revision\n * @param author - Author who inserted the cell\n * @param content - Cell content\n * @param date - Optional date (defaults to now)\n * @returns The created and registered revision\n */\n createTableCellInsert(author: string, content: Run | Run[], date?: Date): Revision {\n const revision = Revision.createTableCellInsert(author, content, date);\n return this.revisionManager.register(revision);\n }\n\n /**\n * Creates and registers a table cell deletion revision\n * @param author - Author who deleted the cell\n * @param content - Cell content\n * @param date - Optional date (defaults to now)\n * @returns The created and registered revision\n */\n createTableCellDelete(author: string, content: Run | Run[], date?: Date): Revision {\n const revision = Revision.createTableCellDelete(author, content, date);\n return this.revisionManager.register(revision);\n }\n\n /**\n * Creates and registers a table cell merge revision\n * @param author - Author who merged cells\n * @param content - Merged cell content\n * @param date - Optional date (defaults to now)\n * @returns The created and registered revision\n */\n createTableCellMerge(author: string, content: Run | Run[], date?: Date): Revision {\n const revision = Revision.createTableCellMerge(author, content, date);\n return this.revisionManager.register(revision);\n }\n\n /**\n * Creates and registers a numbering change revision\n * @param author - Author who changed the numbering\n * @param content - Content with changed numbering\n * @param previousProperties - Previous numbering properties\n * @param date - Optional date (defaults to now)\n * @returns The created and registered revision\n */\n createNumberingChange(\n author: string,\n content: Run | Run[],\n previousProperties: Record<string, any>,\n date?: Date\n ): Revision {\n const revision = Revision.createNumberingChange(author, content, previousProperties, date);\n return this.revisionManager.register(revision);\n }\n\n /**\n * Gets the CommentManager for comment operations\n *\n * Provides access to the CommentManager for creating, managing, and\n * querying document comments and comment threads.\n *\n * **Important:** For mutations (create, reply, remove), prefer the Document-level\n * wrapper methods (`createComment`, `createReply`, `removeComment`) which set the\n * internal dirty flag needed for correct companion file handling during save.\n *\n * @returns The CommentManager instance managing this document's comments\n *\n * @example\n * ```typescript\n * const commentMgr = doc.getCommentManager();\n * const allComments = commentMgr.getAllComments();\n * console.log(`Document has ${allComments.length} comments`);\n * ```\n */\n getCommentManager(): CommentManager {\n return this.commentManager;\n }\n\n /**\n * Creates and registers a new comment\n *\n * Creates a comment that can be attached to paragraphs or text ranges.\n * The comment is automatically registered with the CommentManager and\n * assigned a unique ID.\n *\n * @param author - Name of the comment author\n * @param content - Comment text content, single Run, or array of Runs\n * @param initials - Optional author initials (defaults to first letters of author name)\n * @returns The created and registered Comment instance\n *\n * @example\n * ```typescript\n * // Create simple text comment\n * const comment = doc.createComment('John Doe', 'Please review this section');\n * const para = doc.createParagraph('Important text');\n * para.addComment(comment);\n * ```\n *\n * @example\n * ```typescript\n * // Create comment with formatted content\n * const run = new Run('This needs attention', { bold: true, color: 'FF0000' });\n * const comment = doc.createComment('Alice', run, 'A');\n * ```\n */\n createComment(author: string, content: string | Run | Run[], initials?: string): Comment {\n this._commentsModified = true;\n return this.commentManager.createComment(author, content, initials);\n }\n\n /**\n * Creates and registers a reply to an existing comment\n * @param parentCommentId - ID of the parent comment\n * @param author - Reply author\n * @param content - Reply content (text or runs)\n * @param initials - Optional author initials\n * @returns The created and registered reply\n */\n createReply(\n parentCommentId: number,\n author: string,\n content: string | Run | Run[],\n initials?: string\n ): Comment {\n this._commentsModified = true;\n return this.commentManager.createReply(parentCommentId, author, content, initials);\n }\n\n /**\n * Gets a comment by ID\n * @param id - Comment ID\n * @returns The comment, or undefined if not found\n */\n getComment(id: number): Comment | undefined {\n return this.commentManager.getComment(id);\n }\n\n /**\n * Gets all comments (top-level only, not replies)\n * @returns Array of all top-level comments\n */\n getAllComments(): Comment[] {\n return this.commentManager.getAllComments();\n }\n\n getFootnoteManager(): FootnoteManager {\n return this.footnoteManager;\n }\n\n getEndnoteManager(): EndnoteManager {\n return this.endnoteManager;\n }\n\n createFootnote(text: string): Footnote {\n this._footnotesModified = true;\n return this.footnoteManager.createFootnote(text);\n }\n\n createEndnote(text: string): Endnote {\n this._endnotesModified = true;\n return this.endnoteManager.createEndnote(text);\n }\n\n /**\n * Clears all footnotes (except special separators).\n * On save, generates a footnotes.xml with only separator entries.\n */\n clearFootnotes(): void {\n this.footnoteManager.clear();\n this._footnotesModified = true;\n }\n\n /**\n * Clears all endnotes (except special separators).\n * On save, generates an endnotes.xml with only separator entries.\n */\n clearEndnotes(): void {\n this.endnoteManager.clear();\n this._endnotesModified = true;\n }\n\n /**\n * Adds a comment to a paragraph (wraps the entire paragraph)\n * Creates the comment if text is provided, or uses an existing comment object\n * @param paragraph - The paragraph to comment\n * @param commentOrAuthor - Comment object, or author name if creating new comment\n * @param content - Comment content (required if creating new comment)\n * @param initials - Optional author initials (for new comments)\n * @returns The comment that was added\n */\n addCommentToParagraph(\n paragraph: Paragraph,\n commentOrAuthor: Comment | string,\n content?: string | Run | Run[],\n initials?: string\n ): Comment {\n const comment =\n typeof commentOrAuthor === 'string'\n ? this.createComment(commentOrAuthor, content!, initials)\n : commentOrAuthor;\n\n paragraph.addComment(comment);\n return comment;\n }\n\n /**\n * Gets statistics about comments\n * @returns Object with comment statistics\n */\n getCommentStats(): {\n total: number;\n topLevel: number;\n replies: number;\n authors: string[];\n nextId: number;\n } {\n return this.commentManager.getStats();\n }\n\n /**\n * Checks if there are any comments in the document\n * @returns True if there are no comments\n */\n hasNoComments(): boolean {\n return this.commentManager.isEmpty();\n }\n\n /**\n * Checks if there are comments in the document\n * @returns True if there are comments\n */\n hasComments(): boolean {\n return !this.commentManager.isEmpty();\n }\n\n /**\n * Gets a comment thread (comment and all its replies)\n * @param commentId - ID of the top-level comment\n * @returns Object with the comment and its replies, or undefined if not found\n */\n getCommentThread(commentId: number): { comment: Comment; replies: Comment[] } | undefined {\n return this.commentManager.getCommentThread(commentId);\n }\n\n /**\n * Searches comments by text content\n * @param searchText - Text to search for (case-insensitive)\n * @returns Array of comments containing the search text\n */\n findCommentsByText(searchText: string): Comment[] {\n return this.commentManager.findCommentsByText(searchText);\n }\n\n /**\n * Gets the most recent comments\n * @param count - Number of recent comments to return\n * @returns Array of most recent comments\n */\n getRecentComments(count: number): Comment[] {\n return this.commentManager.getRecentComments(count);\n }\n\n /**\n * Gets comments by author\n * @param author - Author name to filter by\n * @returns Array of comments by the specified author\n */\n getCommentsByAuthor(author: string): Comment[] {\n return this.commentManager.getCommentsByAuthor(author);\n }\n\n /**\n * Gets comments within a date range\n * @param startDate - Start of date range\n * @param endDate - End of date range\n * @returns Array of comments within the date range\n */\n getCommentsByDateRange(startDate: Date, endDate: Date): Comment[] {\n return this.commentManager.getCommentsByDateRange(startDate, endDate);\n }\n\n /**\n * Gets all comments including replies\n * @returns Array of all comments (top-level and replies)\n */\n getAllCommentsWithReplies(): Comment[] {\n return this.commentManager.getAllCommentsWithReplies();\n }\n\n /**\n * Gets the total number of comments (including replies)\n * @returns Number of comments\n */\n getCommentCount(): number {\n return this.commentManager.getCount();\n }\n\n /**\n * Gets the number of top-level comments (excluding replies)\n * @returns Number of top-level comments\n */\n getTopLevelCommentCount(): number {\n return this.commentManager.getTopLevelCount();\n }\n\n /**\n * Gets all unique authors who have made comments\n * @returns Array of unique author names\n */\n getCommentAuthors(): string[] {\n return this.commentManager.getAuthors();\n }\n\n /**\n * Gets replies to a comment\n * @param commentId - ID of the parent comment\n * @returns Array of reply comments\n */\n getReplies(commentId: number): Comment[] {\n return this.commentManager.getReplies(commentId);\n }\n\n /**\n * Checks if a comment has replies\n * @param commentId - ID of the comment\n * @returns True if the comment has replies\n */\n hasReplies(commentId: number): boolean {\n return this.commentManager.hasReplies(commentId);\n }\n\n /**\n * Removes a comment (also removes all its replies)\n * @param id - Comment ID\n * @returns True if the comment was removed\n */\n removeComment(id: number): boolean {\n const removed = this.commentManager.removeComment(id);\n if (removed) {\n this._commentsModified = true;\n }\n return removed;\n }\n\n /**\n * Checks if there are any revisions in the document\n * @returns True if there are no revisions\n */\n hasNoRevisions(): boolean {\n return this.revisionManager.isEmpty();\n }\n\n /**\n * Checks if there are revisions in the document\n * @returns True if there are revisions\n */\n hasRevisions(): boolean {\n return !this.revisionManager.isEmpty();\n }\n\n /**\n * Gets the most recent revisions\n * @param count - Number of recent revisions to return\n * @returns Array of most recent revisions\n */\n getRecentRevisions(count: number): Revision[] {\n return this.revisionManager.getRecentRevisions(count);\n }\n\n /**\n * Searches revisions by text content\n * @param searchText - Text to search for (case-insensitive)\n * @returns Array of revisions containing the search text\n */\n findRevisionsByText(searchText: string): Revision[] {\n return this.revisionManager.findRevisionsByText(searchText);\n }\n\n /**\n * Gets all insertion revisions\n * @returns Array of insertion revisions\n */\n getAllInsertions(): Revision[] {\n return this.revisionManager.getAllInsertions();\n }\n\n /**\n * Gets all deletion revisions\n * @returns Array of deletion revisions\n */\n getAllDeletions(): Revision[] {\n return this.revisionManager.getAllDeletions();\n }\n\n /**\n * Gets parse warnings collected during document loading\n * Only populated when loading existing documents in lenient mode\n * @returns Array of parse errors/warnings\n */\n getParseWarnings(): { element: string; error: Error }[] {\n return this.parser.getParseErrors();\n }\n\n /**\n * Updates hyperlink URLs in the document using a URL mapping\n *\n * This method finds all external hyperlinks in the document and updates their URLs\n * according to the provided map. The relationships are updated in-place to maintain\n * document integrity and prevent orphaned relationships per ECMA-376 §17.16.22.\n *\n * **Important Notes:**\n * - Only updates external hyperlinks (not internal bookmarks)\n * - Only updates the URL, not the display text\n * - Relationships are updated in-place to maintain IDs\n * - To update text too, manually iterate and call setText() on hyperlinks\n *\n * **OpenXML Compliance:**\n * This implementation ensures proper OpenXML structure by:\n * 1. Updating existing relationship targets in-place (prevents orphaned relationships)\n * 2. Maintaining relationship IDs for document integrity\n * 3. Maintaining TargetMode=\"External\" for all web links (per ECMA-376 §17.16.22)\n *\n * @param urlMap - Map of old URLs to new URLs\n * @returns Number of hyperlinks updated\n *\n * @example\n * ```typescript\n * // Load existing document\n * const doc = await Document.load('document.docx');\n *\n * // Define URL mappings (old URL → new URL)\n * const urlMap = new Map([\n * ['https://old-site.com', 'https://new-site.com'],\n * ['https://example.org', 'https://example.com']\n * ]);\n *\n * // Update hyperlink URLs\n * const updated = doc.updateHyperlinkUrls(urlMap);\n * console.log(`Updated ${updated} hyperlink(s)`);\n *\n * // Save with updated relationships\n * await doc.save('updated-document.docx');\n * ```\n *\n * @see {@link https://www.ecma-international.org/publications-and-standards/standards/ecma-376/ | ECMA-376 Part 1 §17.16.22}\n */\n updateHyperlinkUrls(urlMap: Map<string, string>): number {\n // Early exit if no URLs to update\n if (urlMap.size === 0) {\n return 0;\n }\n\n // Two-phase update to handle circular URL swaps correctly\n // Phase 1: Collect all updates without modifying hyperlinks\n const updates: {\n hyperlink: Hyperlink;\n newUrl: string;\n relationshipId?: string;\n }[] = [];\n\n // Iterate through all paragraphs in document body\n for (const para of this.getAllParagraphs()) {\n // Get all content items (runs, hyperlinks, fields, revisions)\n for (const content of para.getContent()) {\n // Check if content is a Hyperlink and is external\n if (content instanceof Hyperlink && content.isExternal()) {\n const currentUrl = content.getUrl();\n\n // If current URL is in the map, collect the update\n if (currentUrl && urlMap.has(currentUrl)) {\n const newUrl = urlMap.get(currentUrl)!;\n updates.push({\n hyperlink: content,\n newUrl,\n relationshipId: content.getRelationshipId(),\n });\n }\n }\n }\n }\n\n // Phase 2: Apply all updates atomically\n // This prevents circular swap issues (e.g., A→B, B→A becomes B→A, A→B)\n for (const { hyperlink, newUrl, relationshipId } of updates) {\n // Update the hyperlink URL (maintains relationship ID)\n hyperlink.setUrl(newUrl);\n\n // Update the relationship target in-place if relationship exists\n if (relationshipId) {\n this.relationshipManager.updateHyperlinkTarget(relationshipId, newUrl);\n }\n }\n\n // Note: This implementation updates relationships in-place,\n // maintaining document integrity per ECMA-376\n\n return updates.length;\n }\n\n /**\n * Estimates the size of the document\n * Provides breakdown by component and warnings if size is too large\n * @returns Size estimation with breakdown and optional warning\n */\n estimateSize(): {\n paragraphs: number;\n tables: number;\n images: number;\n estimatedXmlBytes: number;\n imageBytes: number;\n totalEstimatedBytes: number;\n totalEstimatedMB: number;\n warning?: string;\n } {\n return this.validator.estimateSize(this.bodyElements, this.imageManager);\n }\n\n /**\n * Strips all tracked changes from the document\n *\n * Removes all revision markup (<w:ins>, <w:del>, <w:moveFrom>, <w:moveTo>) from the document's XML\n * and cleans up related metadata. This effectively \"accepts\" all changes without using Word's\n * built-in Accept Changes feature.\n *\n * **IMPORTANT**: This operation:\n * 1. Modifies the raw XML in the ZIP package to remove all tracked changes\n * 2. Clears Revision objects from the in-memory object model to prevent re-serialization\n * 3. Sets flag to prevent XML regeneration on save (preserves the cleaned XML)\n *\n * What gets removed:\n * - All insertion markers (<w:ins>) - content is kept, wrapper removed\n * - All deletion markers (<w:del>) - entire element including content removed\n * - All move operations (<w:moveFrom>, <w:moveTo>)\n * - All range markers (moveFromRangeStart/End, moveToRangeStart/End, etc.)\n * - All property change tracking (rPrChange, pPrChange, tblPrChange, etc.)\n * - Revision authors from word/people.xml\n * - Track changes settings from word/settings.xml\n * - Revision count from docProps/core.xml\n *\n * @returns This document instance for method chaining\n *\n * @example\n * ```typescript\n * // Load document with tracked changes\n * const doc = await Document.load('document-with-revisions.docx');\n *\n * // Strip all tracked changes\n * await doc.stripTrackedChanges();\n *\n * // Now process the document as normal\n * doc.applyStyles();\n * await doc.save('cleaned.docx');\n * ```\n *\n * @example\n * ```typescript\n * // Check for tracked changes first\n * const doc = await Document.load('input.docx');\n * if (doc.hasTrackedChanges()) {\n * console.log('Document has tracked changes - stripping them');\n * await doc.stripTrackedChanges();\n * }\n * await doc.save('output.docx');\n * ```\n *\n * @deprecated Use {@link acceptAllRevisions} instead - this method will be removed in a future version\n */\n async stripTrackedChanges(): Promise<this> {\n // Delegate to acceptAllRevisions for backward compatibility\n return this.acceptAllRevisions();\n }\n\n /**\n * Accepts all tracked changes in the document\n *\n * Processes all revision markup following Microsoft's official OpenXML SDK approach:\n * - Insertions (<w:ins>): Keep the inserted content, remove wrapper tags\n * - Deletions (<w:del>): Remove entirely (content was deleted, so discard it)\n * - Move From (<w:moveFrom>): Remove entirely (source of moved content)\n * - Move To (<w:moveTo>): Keep content, remove wrapper (destination of moved content)\n * - Property changes: Remove all tracking elements\n * - Range markers: Remove all boundary markers\n *\n * Also cleans up metadata:\n * - Revision authors from word/people.xml\n * - Track changes settings from word/settings.xml\n * - Revision count from docProps/core.xml\n *\n * **IMPORTANT**: This operation:\n * 1. Modifies the raw XML in the ZIP package\n * 2. Clears Revision objects from the in-memory object model\n * 3. Sets flag to prevent XML regeneration on save (preserves the cleaned XML)\n *\n * @returns This document instance for method chaining\n *\n * @example\n * ```typescript\n * // Load document with tracked changes\n * const doc = await Document.load('document-with-revisions.docx');\n *\n * // Accept all tracked changes\n * await doc.acceptAllRevisions();\n *\n * // Now process the document as normal\n * doc.applyStyles();\n * await doc.save('cleaned.docx');\n * ```\n *\n * @example\n * ```typescript\n * // Check for tracked changes first\n * const doc = await Document.load('input.docx');\n * if (doc.hasTrackedChanges()) {\n * console.log('Document has tracked changes - accepting them');\n * await doc.acceptAllRevisions();\n * }\n * await doc.save('output.docx');\n * ```\n *\n * @see https://learn.microsoft.com/en-us/office/open-xml/how-to-accept-all-revisions\n */\n async acceptAllRevisions(): Promise<this> {\n // Use in-memory DOM transformation approach (industry standard)\n // This transforms Revision objects in the in-memory model, allowing subsequent\n // modifications to work correctly. Unlike the raw XML approach, this does NOT\n // set skipDocumentXmlRegeneration, so save() will regenerate document.xml with\n // all modifications including accepted revisions AND any subsequent changes.\n //\n // @see OpenXML PowerTools RevisionAccepter - https://github.com/OfficeDev/Open-Xml-PowerTools\n // @see https://learn.microsoft.com/en-us/previous-versions/office/developer/office-2007/ee836138(v=office.12)\n\n const result = acceptRevisionsInMemory(this);\n\n // Also cleanup metadata files (people.xml, settings.xml, core.xml)\n // This removes author tracking info and track changes settings that would\n // otherwise indicate the document had tracked changes\n cleanupRevisionMetadata(this.zipHandler);\n\n this.logger.info('Accepted all revisions using in-memory transformation', {\n insertions: result.insertionsAccepted,\n deletions: result.deletionsAccepted,\n moves: result.movesAccepted,\n propertyChanges: result.propertyChangesAccepted,\n total: result.totalAccepted,\n });\n\n return this;\n }\n\n /**\n * Consolidates adjacent revisions throughout the document.\n *\n * This addresses the \"random insertions and deletions\" problem where Word displays\n * many small revisions instead of consolidated ones. The method merges adjacent\n * revisions that have:\n * - Same type (both insertions or both deletions)\n * - Same author\n * - Timestamps within the specified time window\n *\n * **Why this matters:**\n * Microsoft Word typically consolidates edits made in quick succession by the same\n * author. Without consolidation, programmatic edits create many tiny revisions that\n * clutter the document and confuse users when reviewing changes.\n *\n * **When to call:**\n * - After making multiple programmatic changes with track changes enabled\n * - Before saving a document that will be reviewed in Word\n * - Automatically called during save() if track changes was enabled\n *\n * @param timeWindowMs - Time window in milliseconds for consolidation (default: 1000ms)\n * @returns Object with total paragraphs processed and revisions consolidated\n *\n * @example\n * ```typescript\n * // Enable track changes\n * doc.enableTrackChanges({ author: 'Automation' });\n *\n * // Make multiple changes\n * for (const para of doc.getParagraphs()) {\n * for (const run of para.getRuns()) {\n * run.setColor('000000');\n * }\n * }\n *\n * // Consolidate before saving\n * const result = doc.consolidateAllRevisions();\n * console.log(`Consolidated ${result.revisionsConsolidated} revisions`);\n *\n * await doc.save('output.docx');\n * ```\n */\n consolidateAllRevisions(timeWindowMs = 1000): {\n paragraphsProcessed: number;\n revisionsConsolidated: number;\n } {\n let paragraphsProcessed = 0;\n let totalConsolidated = 0;\n\n // Process main document body paragraphs\n for (const para of this.getAllParagraphs()) {\n paragraphsProcessed++;\n totalConsolidated += para.consolidateRevisions(timeWindowMs);\n }\n\n // Process table cell paragraphs\n for (const table of this.getTables()) {\n for (const row of table.getRows()) {\n for (const cell of row.getCells()) {\n for (const para of cell.getParagraphs()) {\n paragraphsProcessed++;\n totalConsolidated += para.consolidateRevisions(timeWindowMs);\n }\n }\n }\n }\n\n // Process headers and footers\n for (const headerEntry of this.headerFooterManager.getAllHeaders()) {\n for (const element of headerEntry.header.getElements()) {\n if (element instanceof Paragraph) {\n paragraphsProcessed++;\n totalConsolidated += element.consolidateRevisions(timeWindowMs);\n }\n }\n }\n\n for (const footerEntry of this.headerFooterManager.getAllFooters()) {\n for (const element of footerEntry.footer.getElements()) {\n if (element instanceof Paragraph) {\n paragraphsProcessed++;\n totalConsolidated += element.consolidateRevisions(timeWindowMs);\n }\n }\n }\n\n this.logger.info('Consolidated revisions across document', {\n paragraphsProcessed,\n revisionsConsolidated: totalConsolidated,\n });\n\n return { paragraphsProcessed, revisionsConsolidated: totalConsolidated };\n }\n\n /**\n * Accept all revisions using raw XML modification (legacy approach).\n *\n * This method modifies the raw XML in the ZIP package directly, then sets\n * `skipDocumentXmlRegeneration = true` to preserve the cleaned XML on save.\n *\n * **WARNING**: Using this method will prevent ANY subsequent in-memory modifications\n * from being saved. Use the standard `acceptAllRevisions()` instead.\n *\n * Use cases for this method:\n * - When you need to accept revisions and save immediately without further changes\n * - When dealing with complex revision structures that the in-memory model doesn't fully capture\n *\n * @returns This document instance for method chaining\n * @deprecated Prefer `acceptAllRevisions()` which uses in-memory transformation\n */\n async acceptAllRevisionsRawXml(): Promise<this> {\n // Step 1: Accept all revisions in the raw XML in ZIP package\n // Uses the imported acceptAllRevisions function (raw XML approach)\n await acceptAllRevisions(this.zipHandler);\n\n // Step 2: Clear Revision objects from in-memory object model\n // This prevents them from being re-serialized during save()\n this.clearRevisionsFromAllParagraphs();\n\n // Step 3: Set flag to prevent document.xml regeneration on save()\n // This preserves the cleaned XML we just created, preventing corruption\n this.skipDocumentXmlRegeneration = true;\n\n return this;\n }\n\n /**\n * Preserves the raw XML in the document, preventing regeneration on save.\n *\n * Use this when you want to keep the original document.xml exactly as loaded,\n * without any modifications from the in-memory model. This is useful for:\n * - Preserving tracked changes that weren't fully parsed into memory\n * - Round-tripping documents with features the framework doesn't support\n * - Keeping original formatting that might be lost during regeneration\n *\n * **IMPORTANT**: After calling this method:\n * - Changes made to paragraphs, runs, tables, etc. will NOT be saved\n * - Only changes to other parts (styles, numbering, headers) will be saved\n * - The document.xml will remain exactly as it was when loaded\n *\n * @returns This document instance for method chaining\n *\n * @example\n * ```typescript\n * // Load a document with tracked changes\n * const doc = await Document.load('document-with-revisions.docx');\n *\n * // Preserve the original XML (including tracked changes)\n * doc.preserveRawXml();\n *\n * // Save - tracked changes will be preserved in output\n * await doc.save('output.docx');\n * ```\n */\n preserveRawXml(): this {\n this.skipDocumentXmlRegeneration = true;\n this.logger.info('Raw XML preservation enabled - document.xml will not be regenerated on save');\n return this;\n }\n\n /**\n * Clears all Revision objects from paragraph content throughout the document\n * This removes in-memory tracked change objects to prevent re-serialization\n * Called by stripTrackedChanges() after cleaning the raw XML\n * @private\n */\n private clearRevisionsFromAllParagraphs(): void {\n let clearedCount = 0;\n\n // Clear revisions from all paragraphs in the document\n for (const para of this.getAllParagraphs()) {\n const revisions = para.getRevisions();\n\n if (revisions.length > 0) {\n // Filter out all Revision objects from paragraph content\n const content = para.getContent();\n const nonRevisionContent = content.filter((item) => !(item instanceof Revision));\n\n // Replace paragraph content with filtered version\n para.clearContent();\n for (const item of nonRevisionContent) {\n if (item instanceof Run || item instanceof ImageRun) {\n para.addRun(item);\n } else if (item instanceof Hyperlink) {\n para.addHyperlink(item);\n } else if (item instanceof Field) {\n para.addField(item);\n }\n }\n\n clearedCount += revisions.length;\n }\n }\n\n if (clearedCount > 0) {\n this.logger.info(`Cleared ${clearedCount} Revision object(s) from in-memory document model`);\n }\n }\n\n /**\n * Clears all paragraph property change tracking (w:pPrChange) from all paragraphs.\n *\n * This method removes existing pPrChange elements from paragraphs without affecting\n * other tracked changes (insertions, deletions, etc.). This is useful when:\n * - Loading a document with existing tracked changes and then enabling fresh tracking\n * - Preventing merge issues where old and new pPrChange elements conflict\n * - Ensuring Word's \"Accept All Changes\" works in a single click\n *\n * Called automatically by enableTrackChanges() to prevent problematic merging of\n * existing pPrChange with newly tracked property changes.\n *\n * @returns Number of paragraphs that had pPrChange cleared\n *\n * @example\n * ```typescript\n * // Manually clear before enabling tracking\n * const cleared = doc.clearAllParagraphPropertyChanges();\n * console.log(`Cleared pPrChange from ${cleared} paragraphs`);\n * doc.enableTrackChanges({ author: 'DocHub' });\n * ```\n */\n public clearAllParagraphPropertyChanges(): number {\n let count = 0;\n\n // Clear from body paragraphs\n for (const para of this.getAllParagraphs()) {\n if (para.getFormatting().pPrChange) {\n para.clearParagraphPropertiesChange();\n count++;\n }\n }\n\n // Clear from table cells\n for (const table of this.getTables()) {\n for (const row of table.getRows()) {\n for (const cell of row.getCells()) {\n for (const para of cell.getParagraphs()) {\n if (para.getFormatting().pPrChange) {\n para.clearParagraphPropertiesChange();\n count++;\n }\n }\n }\n }\n }\n\n // Clear from headers and footers\n if (this.headerFooterManager) {\n const headers = this.headerFooterManager.getAllHeaders();\n for (const { header } of headers) {\n for (const element of header.getElements()) {\n if ('getFormatting' in element && typeof (element as any).getFormatting === 'function') {\n const para = element as Paragraph;\n if (para.getFormatting().pPrChange) {\n para.clearParagraphPropertiesChange();\n count++;\n }\n }\n }\n }\n\n const footers = this.headerFooterManager.getAllFooters();\n for (const { footer } of footers) {\n for (const element of footer.getElements()) {\n if ('getFormatting' in element && typeof (element as any).getFormatting === 'function') {\n const para = element as Paragraph;\n if (para.getFormatting().pPrChange) {\n para.clearParagraphPropertiesChange();\n count++;\n }\n }\n }\n }\n }\n\n if (count > 0) {\n this.logger.info(`Cleared pPrChange from ${count} paragraph(s)`);\n }\n\n return count;\n }\n\n /**\n * Cleans up resources and clears all managers\n * Call this after saving in long-running processes to free memory\n * Especially important for API servers processing many documents\n */\n dispose(): void {\n // Clear all internal state to free memory\n // NOTE: Use clear() methods instead of creating new instances to properly free memory\n\n // Clear body elements\n this.bodyElements = [];\n\n // Clear parser state\n this.parser.clearParseErrors();\n\n // Clear all managers using their clear() methods\n this.stylesManager.clear();\n this.numberingManager.clear();\n this.imageManager.clear();\n this.imageManager.releaseAllImageData();\n this.relationshipManager.clear();\n this.headerFooterManager.clear();\n this.bookmarkManager.clear();\n this.revisionManager.clear();\n this.commentManager.clear();\n this.footnoteManager.clear();\n this.endnoteManager.clear();\n\n // Clear ZIP handler to free compressed data\n this.zipHandler.clear();\n\n // Disable tracking context (cannot set to undefined since it's not optional)\n // The context will be recreated if document is reused\n this.trackingContext.disable();\n\n // Clear preserved state\n this._originalStylesXml = undefined;\n this._originalNumberingXml = undefined;\n this._originalSettingsXml = undefined;\n this._originalAppPropsXml = undefined;\n this._originalFootnotesXml = undefined;\n this._originalEndnotesXml = undefined;\n this._originalCommentsXml = undefined;\n this._commentsModified = false;\n this._originalCommentCompanionFiles.clear();\n this._originalContentTypes = undefined;\n this._settingsModified = false;\n this._appPropsModified = false;\n this._footnotesModified = false;\n this._endnotesModified = false;\n this._originalWebSettingsXml = undefined;\n this._webSettingsModified = false;\n this._webSettings = {\n optimizeForBrowser: true,\n allowPNG: true,\n relyOnVML: false,\n doNotRelyOnCSS: false,\n doNotSaveAsSingleFile: false,\n doNotOrganizeInFolder: false,\n doNotUseLongFileNames: false,\n };\n this._compatInfo = undefined;\n this._documentBackground = undefined;\n this._evenAndOddHeaders = undefined;\n this._mirrorMargins = undefined;\n this._autoHyphenation = undefined;\n this._hideSpellingErrors = undefined;\n this._hideGrammaticalErrors = undefined;\n this._defaultTabStop = undefined;\n this._updateFields = undefined;\n this._embedTrueTypeFonts = undefined;\n this._saveSubsetFonts = undefined;\n this._doNotTrackMoves = undefined;\n this._modifiedBooleanSettings.clear();\n this._decimalSymbol = undefined;\n this._listSeparator = undefined;\n this._flattenIncludePictureFields = false;\n this._stripOrphanRSIDs = false;\n this._clearDirectSpacingStyles = null;\n this.skipDocumentXmlRegeneration = false;\n this._removedNumPicBulletIds.clear();\n this.saveStateSnapshot = undefined;\n\n // Reset track changes and settings-managed fields\n this.trackChangesEnabled = false;\n this.trackFormatting = true;\n this.revisionViewSettings = {\n showInsertionsAndDeletions: true,\n showFormatting: true,\n showInkAnnotations: true,\n };\n this.rsidRoot = undefined;\n this.rsids = new Set();\n this.documentProtection = undefined;\n\n // Reset document properties to minimal state\n this.properties = {};\n this.section = Section.create();\n this.namespaces = {};\n }\n\n /**\n * Gets size statistics for the document\n * @returns Size statistics\n */\n getSizeStats(): {\n elements: { paragraphs: number; tables: number; images: number };\n size: { xml: string; images: string; total: string };\n warnings: string[];\n } {\n return this.validator.getSizeStats(this.bodyElements, this.imageManager);\n }\n\n // ==================== DOCUMENT PART ACCESS METHODS ====================\n // These methods provide low-level access to document package parts,\n // enabling advanced operations not covered by the high-level API.\n\n /**\n * Gets a specific document part from the package\n *\n * Provides direct access to any part within the DOCX package, including\n * XML parts, binary files, and custom parts. This enables advanced scenarios\n * not covered by the high-level API.\n *\n * @param partName - The part name/path (e.g., 'word/document.xml', '[Content_Types].xml')\n * @returns The document part with content and metadata, or null if not found\n *\n * @example\n * ```typescript\n * // Get the main document XML\n * const docPart = await doc.getPart('word/document.xml');\n * if (docPart) {\n * console.log(docPart.content); // XML content as string\n * }\n *\n * // Get an image\n * const imagePart = await doc.getPart('word/media/image1.png');\n * if (imagePart) {\n * console.log(imagePart.isBinary); // true\n * // imagePart.content is a Buffer\n * }\n * ```\n */\n async getPart(partName: string): Promise<DocumentPart | null> {\n try {\n const file = this.zipHandler.getFile(partName);\n if (!file) {\n return null;\n }\n\n // Convert Buffer to string for text files\n // ZipWriter stores all content as Buffer internally, but DocumentPart expects string for text\n let content: string | Buffer = file.content;\n if (!file.isBinary && Buffer.isBuffer(file.content)) {\n content = file.content.toString('utf-8');\n }\n\n return {\n name: partName,\n content,\n contentType: this.getContentTypeForPart(partName),\n isBinary: file.isBinary,\n size: file.size,\n };\n } catch (error: unknown) {\n // Return null for any errors (file not found, etc.)\n return null;\n }\n }\n\n /**\n * Sets or updates a document part in the package\n *\n * Allows adding or updating any part within the DOCX package. Use with caution\n * as incorrect modifications can corrupt the document structure.\n *\n * **Important:** This method does not automatically update relationships or\n * content types. You may need to manually update these for new parts.\n *\n * @param partName - The part name/path\n * @param content - The part content (string for XML/text, Buffer for binary)\n * @returns Promise that resolves when the part is set\n *\n * @example\n * ```typescript\n * // Update custom XML part\n * await doc.setPart('customXml/item1.xml', '<data>Custom content</data>');\n *\n * // Add a new image (remember to update relationships and content types)\n * const imageBuffer = await fs.readFile('image.png');\n * await doc.setPart('word/media/image2.png', imageBuffer);\n * ```\n */\n async setPart(partName: string, content: string | Buffer): Promise<void> {\n // Determine if content is binary\n const isBinary = Buffer.isBuffer(content);\n\n // Add or update the file in the ZIP handler\n this.zipHandler.addFile(partName, content, { binary: isBinary });\n }\n\n /**\n * Removes a document part from the package\n *\n * **Warning:** Removing required parts can corrupt the document.\n * This method does not update relationships or content types that may\n * reference the removed part.\n *\n * @param partName - The part name/path to remove\n * @returns True if the part was removed, false if it didn't exist\n *\n * @example\n * ```typescript\n * // Remove a custom part\n * const removed = await doc.removePart('customXml/item1.xml');\n * console.log(removed ? 'Part removed' : 'Part not found');\n * ```\n */\n async removePart(partName: string): Promise<boolean> {\n const removed = this.zipHandler.removeFile(partName);\n if (removed) {\n // Remove the part's ContentType override to prevent \"part does not exist\" errors\n if (this._originalContentTypes?.overrides) {\n const partKey = partName.startsWith('/') ? partName : `/${partName}`;\n for (const entry of this._originalContentTypes.overrides) {\n if (entry.startsWith(`${partKey}|`)) {\n this._originalContentTypes.overrides.delete(entry);\n break;\n }\n }\n }\n // Remove relationships targeting this part from _rels/.rels\n const relsXml = this.zipHandler.getFileAsString('_rels/.rels');\n if (relsXml) {\n const target = partName.replace(/^\\//, '');\n const relPattern = new RegExp(\n `\\\\s*<Relationship[^>]*Target=\"${target.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\"[^>]*/?>`,\n 'g'\n );\n const cleaned = relsXml.replace(relPattern, '');\n if (cleaned !== relsXml) {\n this.zipHandler.updateFile('_rels/.rels', cleaned);\n }\n }\n // Track removed parts to skip regeneration during save\n this._removedParts.add(partName);\n }\n return removed;\n }\n\n /**\n * Lists all parts in the document package\n *\n * Returns an array of all part names/paths in the DOCX package,\n * useful for debugging, analysis, or discovering custom parts.\n *\n * @returns Array of part names\n *\n * @example\n * ```typescript\n * const parts = await doc.listParts();\n * console.log('Document contains', parts.length, 'parts');\n * parts.forEach(part => console.log(part));\n * ```\n */\n async listParts(): Promise<string[]> {\n return this.zipHandler.getFilePaths();\n }\n\n /**\n * Checks if a part exists in the document package\n *\n * @param partName - The part name/path to check\n * @returns True if the part exists, false otherwise\n *\n * @example\n * ```typescript\n * if (await doc.partExists('word/glossary/document.xml')) {\n * console.log('Document has a glossary');\n * }\n * ```\n */\n async partExists(partName: string): Promise<boolean> {\n return this.zipHandler.hasFile(partName);\n }\n\n /**\n * Gets all content types from [Content_Types].xml\n *\n * Returns a map of part names/extensions to their MIME content types.\n * This is useful for understanding the document structure and registering\n * new content types for custom parts.\n *\n * @returns Map of part names/extensions to content types\n *\n * @example\n * ```typescript\n * const contentTypes = await doc.getContentTypes();\n * contentTypes.forEach((type, name) => {\n * console.log(`${name}: ${type}`);\n * });\n * ```\n */\n async getContentTypes(): Promise<Map<string, string>> {\n const contentTypes = new Map<string, string>();\n\n try {\n const contentTypesXml = this.zipHandler.getFileAsString('[Content_Types].xml');\n if (!contentTypesXml) {\n return contentTypes;\n }\n\n // Parse content types XML\n // Match Default elements (by extension)\n const defaultPattern = /<Default\\s+Extension=\"([^\"]+)\"\\s+ContentType=\"([^\"]+)\"/g;\n let match;\n while ((match = defaultPattern.exec(contentTypesXml)) !== null) {\n if (match[1] && match[2]) {\n contentTypes.set(`.${match[1]}`, match[2]);\n }\n }\n\n // Match Override elements (by part name)\n const overridePattern = /<Override\\s+PartName=\"([^\"]+)\"\\s+ContentType=\"([^\"]+)\"/g;\n while ((match = overridePattern.exec(contentTypesXml)) !== null) {\n if (match[1] && match[2]) {\n contentTypes.set(match[1], match[2]);\n }\n }\n } catch (error: unknown) {\n // Return empty map on error\n }\n\n return contentTypes;\n }\n\n /**\n * Gets the raw XML content of a document part without any processing\n *\n * Returns the unparsed XML string for any part in the document package.\n * This is useful for advanced manipulation, debugging, or accessing\n * content types that don't have dedicated APIs.\n *\n * **Note**: For binary parts (images, fonts), this converts the Buffer to UTF-8\n * string, which may not be appropriate. Check the content type first.\n *\n * @param partName - Part path (e.g., 'word/document.xml', '[Content_Types].xml')\n * @returns Raw XML string, or null if part not found\n *\n * @example\n * ```typescript\n * // Get raw document XML\n * const xml = await doc.getRawXml('word/document.xml');\n * console.log(xml); // Complete XML as string\n *\n * // Get raw styles XML\n * const stylesXml = await doc.getRawXml('word/styles.xml');\n *\n * // Get package metadata\n * const coreProps = await doc.getRawXml('docProps/core.xml');\n * ```\n */\n async getRawXml(partName: string): Promise<string | null> {\n try {\n const part = await this.getPart(partName);\n if (!part) {\n return null;\n }\n\n // If already a string, return as-is\n if (typeof part.content === 'string') {\n return part.content;\n }\n\n // If Buffer, decode as UTF-8 (standard for XML files)\n if (Buffer.isBuffer(part.content)) {\n return part.content.toString('utf8');\n }\n\n return null;\n } catch (error: unknown) {\n return null;\n }\n }\n\n /**\n * Gets raw XML content for all text-based parts (non-binary files)\n *\n * Returns a map of part names to their raw XML content, excluding binary files\n * like images and fonts. Useful for debugging or batch processing.\n *\n * @returns Map of part names to raw XML content\n *\n * @example\n * ```typescript\n * // Get all XML parts\n * const allXml = await doc.getAllRawXml();\n * for (const [partName, xml] of allXml) {\n * console.log(`${partName}: ${xml.length} bytes`);\n * }\n *\n * // Validate all XML parts\n * for (const [partName, xml] of allXml) {\n * try {\n * // Parse and validate XML\n * const parser = new DOMParser();\n * parser.parseFromString(xml, 'text/xml');\n * } catch (e) {\n * console.error(`Invalid XML in ${partName}:`, e);\n * }\n * }\n * ```\n */\n async getAllRawXml(): Promise<Map<string, string>> {\n const xmlMap = new Map<string, string>();\n\n try {\n const parts = await this.listParts();\n\n for (const partName of parts) {\n // Skip binary files (images, fonts, etc.)\n if (/\\.(png|jpg|jpeg|gif|woff|woff2|ttf|otf|bin)$/i.exec(partName)) {\n continue;\n }\n\n const xml = await this.getRawXml(partName);\n if (xml) {\n xmlMap.set(partName, xml);\n }\n }\n } catch (error: unknown) {\n // Return partial results on error\n }\n\n return xmlMap;\n }\n\n /**\n * Sets or updates raw XML content for a document part\n *\n * Convenience method for updating XML content in document parts.\n * Automatically detects and handles text/XML content.\n *\n * **Note**: This method does not automatically update relationships or\n * content types. You may need to manually update these if adding new parts.\n *\n * @param partName - Part path (e.g., 'word/document.xml')\n * @param xmlContent - Raw XML string to set\n * @returns Promise that resolves when the part is updated\n *\n * @example\n * ```typescript\n * // Update document XML\n * const newXml = '<?xml version=\"1.0\"?><w:document>...</w:document>';\n * await doc.setRawXml('word/document.xml', newXml);\n *\n * // Update styles\n * const stylesXml = await doc.getRawXml('word/styles.xml');\n * const modified = stylesXml.replace('Old Style', 'New Style');\n * await doc.setRawXml('word/styles.xml', modified);\n * ```\n */\n async setRawXml(partName: string, xmlContent: string): Promise<void> {\n if (typeof xmlContent !== 'string') {\n throw new Error('XML content must be a string');\n }\n\n // Use setPart to update the part (handles both string and binary detection)\n await this.setPart(partName, xmlContent);\n }\n\n /**\n * Adds or updates a content type registration\n *\n * Registers a new content type in [Content_Types].xml. This is required\n * when adding new types of parts to the document package.\n *\n * @param partNameOrExtension - Part name (e.g., '/word/custom.xml') or extension (e.g., '.xml')\n * @param contentType - MIME content type (e.g., 'application/xml')\n * @returns True if successful\n *\n * @example\n * ```typescript\n * // Register a custom XML part\n * await doc.addContentType('/customXml/item1.xml', 'application/xml');\n *\n * // Register a new file extension\n * await doc.addContentType('.json', 'application/json');\n * ```\n */\n async addContentType(partNameOrExtension: string, contentType: string): Promise<boolean> {\n try {\n let contentTypesXml = this.zipHandler.getFileAsString('[Content_Types].xml');\n if (!contentTypesXml) {\n return false;\n }\n\n const isExtension = partNameOrExtension.startsWith('.');\n\n if (isExtension) {\n // Add as Default element (for extensions)\n const extension = partNameOrExtension.substring(1);\n\n // Check if already exists\n const existingPattern = new RegExp(\n `<Default\\\\s+Extension=\"${extension}\"\\\\s+ContentType=\"[^\"]+\"/?>`,\n 'g'\n );\n if (existingPattern.test(contentTypesXml)) {\n // Update existing\n contentTypesXml = contentTypesXml.replace(\n existingPattern,\n `<Default Extension=\"${extension}\" ContentType=\"${contentType}\"/>`\n );\n } else {\n // Add new before closing tag\n contentTypesXml = contentTypesXml.replace(\n '</Types>',\n ` <Default Extension=\"${extension}\" ContentType=\"${contentType}\"/>\\n</Types>`\n );\n }\n } else {\n // Add as Override element (for specific parts)\n const partName = partNameOrExtension.startsWith('/')\n ? partNameOrExtension\n : `/${partNameOrExtension}`;\n\n // Check if already exists\n const existingPattern = new RegExp(\n `<Override\\\\s+PartName=\"${partName.replace(\n /[.*+?^${}()|[\\]\\\\]/g,\n '\\\\$&'\n )}\"\\\\s+ContentType=\"[^\"]+\"/?>`,\n 'g'\n );\n if (existingPattern.test(contentTypesXml)) {\n // Update existing\n contentTypesXml = contentTypesXml.replace(\n existingPattern,\n `<Override PartName=\"${partName}\" ContentType=\"${contentType}\"/>`\n );\n } else {\n // Add new before closing tag\n contentTypesXml = contentTypesXml.replace(\n '</Types>',\n ` <Override PartName=\"${partName}\" ContentType=\"${contentType}\"/>\\n</Types>`\n );\n }\n }\n\n // Update the content types file\n this.zipHandler.updateFile('[Content_Types].xml', contentTypesXml);\n return true;\n } catch (error: unknown) {\n return false;\n }\n }\n\n /**\n * Gets all relationships for the document\n *\n * Returns a map of relationship file paths to their relationships.\n * This includes document relationships, part relationships, etc.\n *\n * @returns Map of relationship file paths to relationship arrays\n *\n * @example\n * ```typescript\n * const relationships = await doc.getAllRelationships();\n * relationships.forEach((rels, path) => {\n * console.log(`${path}: ${rels.length} relationships`);\n * });\n * ```\n */\n async getAllRelationships(): Promise<Map<string, any[]>> {\n const relationships = new Map<string, any[]>();\n\n try {\n // Get all .rels files\n const relsPaths = this.zipHandler.getFilePaths().filter((path) => path.endsWith('.rels'));\n\n for (const relsPath of relsPaths) {\n const relsContent = this.zipHandler.getFileAsString(relsPath);\n if (relsContent) {\n interface ParsedRelationship {\n id?: string;\n type?: string;\n target?: string;\n targetMode?: string;\n }\n\n const rels: ParsedRelationship[] = [];\n\n // Use XMLParser to extract all Relationship elements\n const relationshipElements = XMLParser.extractElements(relsContent, 'Relationship');\n\n for (const relElement of relationshipElements) {\n const rel: ParsedRelationship = {};\n\n // Extract attributes using XMLParser\n const id = XMLParser.extractAttribute(relElement, 'Id');\n const type = XMLParser.extractAttribute(relElement, 'Type');\n const target = XMLParser.extractAttribute(relElement, 'Target');\n const targetMode = XMLParser.extractAttribute(relElement, 'TargetMode');\n\n if (id) rel.id = id;\n if (type) rel.type = type;\n if (target) rel.target = target;\n if (targetMode) rel.targetMode = targetMode;\n\n rels.push(rel);\n }\n\n relationships.set(relsPath, rels);\n }\n }\n } catch (error: unknown) {\n // Return empty map on error\n }\n\n return relationships;\n }\n\n /**\n * Gets relationships for a specific document part\n *\n * Retrieves all relationships defined for a specific part's .rels file.\n * For example, calling with 'word/document.xml' returns relationships\n * from 'word/_rels/document.xml.rels'.\n *\n * @param partName - The 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 * @example\n * ```typescript\n * // Get relationships for document\n * const docRels = await doc.getRelationships('word/document.xml');\n * for (const rel of docRels) {\n * if (rel.type.includes('hyperlink')) {\n * console.log('Hyperlink target:', rel.target);\n * }\n * }\n *\n * // Get relationships for styles\n * const styleRels = await doc.getRelationships('word/styles.xml');\n *\n * // Get relationships for headers/footers\n * const headerRels = await doc.getRelationships('word/header1.xml');\n * ```\n */\n async getRelationships(\n partName: string\n ): Promise<{ id?: string; type?: string; target?: string; targetMode?: string }[]> {\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 = this.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 // Use XMLParser to extract all Relationship elements\n const relationshipElements = XMLParser.extractElements(relsContent, 'Relationship');\n\n for (const relElement of relationshipElements) {\n const rel: ParsedRelationship = {};\n\n // Extract attributes using XMLParser\n const id = XMLParser.extractAttribute(relElement, 'Id');\n const type = XMLParser.extractAttribute(relElement, 'Type');\n const target = XMLParser.extractAttribute(relElement, 'Target');\n const targetMode = XMLParser.extractAttribute(relElement, 'TargetMode');\n\n if (id) rel.id = id;\n if (type) rel.type = type;\n if (target) rel.target = target;\n if (targetMode) rel.targetMode = targetMode;\n\n relationships.push(rel);\n }\n\n return relationships;\n } catch (error: unknown) {\n // Return empty array on error\n return [];\n }\n }\n\n /**\n * Gets the content type for a specific part\n * Helper method used internally by getPart\n */\n private getContentTypeForPart(partName: string): string | undefined {\n try {\n const contentTypesXml = this.zipHandler.getFileAsString('[Content_Types].xml');\n if (!contentTypesXml) {\n return undefined;\n }\n\n // Check for specific override\n const overridePattern = new RegExp(\n `<Override\\\\s+PartName=\"${partName.replace(\n /[.*+?^${}()|[\\]\\\\]/g,\n '\\\\$&'\n )}\"\\\\s+ContentType=\"([^\"]+)\"`,\n 'i'\n );\n const overrideMatch = contentTypesXml.match(overridePattern);\n if (overrideMatch) {\n return overrideMatch[1];\n }\n\n // Check for extension default\n const ext = partName.substring(partName.lastIndexOf('.'));\n if (ext) {\n const defaultPattern = new RegExp(\n `<Default\\\\s+Extension=\"${ext.substring(1)}\"\\\\s+ContentType=\"([^\"]+)\"`,\n 'i'\n );\n const defaultMatch = contentTypesXml.match(defaultPattern);\n if (defaultMatch) {\n return defaultMatch[1];\n }\n }\n } catch (error: unknown) {\n // Return undefined on error\n }\n\n return undefined;\n }\n\n /**\n * Finds all occurrences of specific text in the document\n *\n * Searches through all paragraphs (including those in tables) and returns\n * detailed information about each match, including the containing paragraph,\n * run, and position within the run.\n *\n * @param text - The text string to search for\n * @param options - Optional search configuration\n * @param options.caseSensitive - If true, match case exactly (default: false)\n * @param options.wholeWord - If true, match whole words only (default: false)\n * @returns Array of search results with location and context information\n *\n * @example\n * ```typescript\n * // Find all occurrences (case-insensitive)\n * const results = doc.findText('important');\n * console.log(`Found ${results.length} matches`);\n *\n * for (const result of results) {\n * console.log(`Match in paragraph ${result.paragraphIndex}: \"${result.text}\"`);\n * }\n * ```\n *\n * @example\n * ```typescript\n * // Find exact case and whole word only\n * const results = doc.findText('Error', {\n * caseSensitive: true,\n * wholeWord: true\n * });\n * ```\n */\n findText(\n text: string,\n options?: { caseSensitive?: boolean; wholeWord?: boolean }\n ): {\n paragraph: Paragraph;\n paragraphIndex: number;\n run: Run;\n runIndex: number;\n text: string;\n startIndex: number;\n }[] {\n const results: {\n paragraph: Paragraph;\n paragraphIndex: number;\n run: Run;\n runIndex: number;\n text: string;\n startIndex: number;\n }[] = [];\n\n const caseSensitive = options?.caseSensitive ?? false;\n const wholeWord = options?.wholeWord ?? false;\n const searchText = caseSensitive ? text : text.toLowerCase();\n\n // Track searched paragraphs to prevent duplicates (tables are in both getAllParagraphs() and getTables())\n const searchedParagraphs = new Set<Paragraph>();\n\n const paragraphs = this.getAllParagraphs();\n for (let pIndex = 0; pIndex < paragraphs.length; pIndex++) {\n const paragraph = paragraphs[pIndex];\n if (!paragraph) continue;\n\n // Mark this paragraph as searched\n searchedParagraphs.add(paragraph);\n const runs = paragraph.getRuns();\n\n for (let rIndex = 0; rIndex < runs.length; rIndex++) {\n const run = runs[rIndex];\n if (!run) continue;\n const runText = run.getText();\n const compareText = caseSensitive ? runText : runText.toLowerCase();\n\n if (wholeWord) {\n // Create word boundary regex\n const wordPattern = new RegExp(\n `\\\\b${searchText.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\b`,\n caseSensitive ? 'g' : 'gi'\n );\n let match;\n while ((match = wordPattern.exec(runText)) !== null) {\n results.push({\n paragraph,\n paragraphIndex: pIndex,\n run,\n runIndex: rIndex,\n text: match[0],\n startIndex: match.index,\n });\n }\n } else {\n // Simple substring search\n let startIndex = 0;\n while ((startIndex = compareText.indexOf(searchText, startIndex)) !== -1) {\n results.push({\n paragraph,\n paragraphIndex: pIndex,\n run,\n runIndex: rIndex,\n text: runText.substr(startIndex, text.length),\n startIndex,\n });\n startIndex += text.length;\n }\n }\n }\n }\n\n // Also search in tables\n for (const table of this.getTables()) {\n for (const row of table.getRows()) {\n for (const cell of row.getCells()) {\n if (cell instanceof TableCell) {\n const cellParagraphs = cell.getParagraphs();\n for (let pIndex = 0; pIndex < cellParagraphs.length; pIndex++) {\n const paragraph = cellParagraphs[pIndex];\n if (!paragraph) continue;\n\n // Skip if already searched (getAllParagraphs includes table paragraphs)\n if (searchedParagraphs.has(paragraph)) {\n continue;\n }\n searchedParagraphs.add(paragraph);\n\n const runs = paragraph.getRuns();\n\n for (let rIndex = 0; rIndex < runs.length; rIndex++) {\n const run = runs[rIndex];\n if (!run) continue;\n const runText = run.getText();\n const compareText = caseSensitive ? runText : runText.toLowerCase();\n\n if (wholeWord) {\n // Create word boundary regex\n const wordPattern = new RegExp(\n `\\\\b${searchText.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\b`,\n caseSensitive ? 'g' : 'gi'\n );\n let match;\n while ((match = wordPattern.exec(runText)) !== null) {\n results.push({\n paragraph,\n paragraphIndex: -1, // Not in main body, in table\n run,\n runIndex: rIndex,\n text: match[0],\n startIndex: match.index,\n });\n }\n } else {\n // Simple substring search\n let startIndex = 0;\n while ((startIndex = compareText.indexOf(searchText, startIndex)) !== -1) {\n results.push({\n paragraph,\n paragraphIndex: -1, // Not in main body, in table\n run,\n runIndex: rIndex,\n text: runText.substr(startIndex, text.length),\n startIndex,\n });\n startIndex += text.length;\n }\n }\n }\n }\n }\n }\n }\n }\n\n return results;\n }\n\n /**\n * Finds paragraphs containing text matching a pattern\n *\n * Supports both plain string and regex patterns. Returns an array of\n * paragraphs with match details for each occurrence.\n *\n * @param pattern - String or RegExp to search for\n * @returns Array of paragraphs with their matches\n *\n * @example\n * ```typescript\n * // Find with string\n * const results = doc.findParagraphsByText('error');\n *\n * // Find with regex\n * const results = doc.findParagraphsByText(/\\berror\\b/gi);\n * for (const { paragraph, matches } of results) {\n * console.log(`Found ${matches.length} matches in paragraph`);\n * }\n * ```\n */\n findParagraphsByText(pattern: string | RegExp): { paragraph: Paragraph; matches: string[] }[] {\n const results: { paragraph: Paragraph; matches: string[] }[] = [];\n const regex = typeof pattern === 'string' ? new RegExp(pattern, 'gi') : pattern;\n\n for (const paragraph of this.getAllParagraphs()) {\n const text = paragraph.getText();\n const matches = text.match(regex);\n if (matches && matches.length > 0) {\n results.push({ paragraph, matches: [...matches] });\n }\n }\n return results;\n }\n\n /**\n * Gets all runs that use a specific font\n *\n * Searches through all paragraphs (including tables) and returns runs\n * that have the specified font applied.\n *\n * @param fontName - Font name to search for (case-insensitive)\n * @returns Array of runs using the specified font\n *\n * @example\n * ```typescript\n * const arialRuns = doc.getRunsByFont('Arial');\n * console.log(`Found ${arialRuns.length} runs using Arial`);\n * ```\n */\n getRunsByFont(fontName: string): Run[] {\n const results: Run[] = [];\n const lowerFontName = fontName.toLowerCase();\n\n for (const paragraph of this.getAllParagraphs()) {\n for (const run of paragraph.getRuns()) {\n const formatting = run.getFormatting();\n if (formatting.font?.toLowerCase() === lowerFontName) {\n results.push(run);\n }\n }\n }\n return results;\n }\n\n /**\n * Gets all runs that use a specific color\n *\n * Searches through all paragraphs (including tables) and returns runs\n * that have the specified color applied.\n *\n * @param color - Hex color code to search for (with or without #)\n * @returns Array of runs using the specified color\n *\n * @example\n * ```typescript\n * const redRuns = doc.getRunsByColor('FF0000');\n * const blueRuns = doc.getRunsByColor('#0000FF');\n * ```\n */\n getRunsByColor(color: string): Run[] {\n const results: Run[] = [];\n // Normalize color - remove # and convert to uppercase\n const normalizedColor = color.replace(/^#/, '').toUpperCase();\n\n for (const paragraph of this.getAllParagraphs()) {\n for (const run of paragraph.getRuns()) {\n const formatting = run.getFormatting();\n if (formatting.color) {\n const runColor = formatting.color.replace(/^#/, '').toUpperCase();\n if (runColor === normalizedColor) {\n results.push(run);\n }\n }\n }\n }\n return results;\n }\n\n /**\n * Gets all paragraphs that use a specific style\n *\n * @param styleId - Style ID to filter by\n * @returns Array of paragraphs using the specified style\n *\n * @example\n * ```typescript\n * const headings = doc.getParagraphsByStyle('Heading1');\n * console.log(`Found ${headings.length} Heading 1 paragraphs`);\n * ```\n */\n getParagraphsByStyle(styleId: string): Paragraph[] {\n return this.getAllParagraphs().filter((para) => para.getStyle() === styleId);\n }\n\n /**\n * Sets the font for all runs in the document\n *\n * Applies the specified font to every text run in the document,\n * including runs in tables.\n *\n * @param fontName - The font name to apply (e.g., 'Arial', 'Times New Roman')\n * @returns Number of runs modified\n *\n * @example\n * ```typescript\n * const count = doc.setAllRunsFont('Calibri');\n * console.log(`Changed font on ${count} runs`);\n * ```\n */\n setAllRunsFont(fontName: string): number {\n let count = 0;\n for (const run of this.getAllRuns()) {\n run.setFont(fontName);\n count++;\n }\n return count;\n }\n\n /**\n * Sets the font size for all runs in the document\n *\n * Applies the specified font size to every text run in the document,\n * including runs in tables.\n *\n * @param size - Font size in half-points (e.g., 24 = 12pt, 22 = 11pt)\n * @returns Number of runs modified\n *\n * @example\n * ```typescript\n * const count = doc.setAllRunsSize(24); // Set to 12pt\n * console.log(`Changed size on ${count} runs`);\n * ```\n */\n setAllRunsSize(size: number): number {\n let count = 0;\n for (const run of this.getAllRuns()) {\n run.setSize(size);\n count++;\n }\n return count;\n }\n\n /**\n * Sets the color for all runs in the document\n *\n * Applies the specified color to every text run in the document,\n * including runs in tables.\n *\n * @param color - Hex color code (e.g., 'FF0000', '#0000FF')\n * @returns Number of runs modified\n *\n * @example\n * ```typescript\n * const count = doc.setAllRunsColor('000000'); // Set to black\n * console.log(`Changed color on ${count} runs`);\n * ```\n */\n setAllRunsColor(color: string): number {\n let count = 0;\n for (const run of this.getAllRuns()) {\n run.setColor(color);\n count++;\n }\n return count;\n }\n\n /**\n * Formatting report interface\n */\n static FormattingReport: {\n fonts: Map<string, number>;\n sizes: Map<number, number>;\n colors: Map<string, number>;\n styles: Map<string, number>;\n uniqueFonts: string[];\n uniqueColors: string[];\n uniqueStyles: string[];\n mostUsedFont?: string;\n mostUsedSize?: number;\n mostUsedColor?: string;\n totalRuns: number;\n totalParagraphs: number;\n };\n\n /**\n * Generates a formatting report for the document\n *\n * Analyzes all runs and paragraphs to provide statistics about\n * formatting usage throughout the document.\n *\n * @returns Object with formatting statistics\n *\n * @example\n * ```typescript\n * const report = doc.getFormattingReport();\n * console.log(`Unique fonts: ${report.uniqueFonts.join(', ')}`);\n * console.log(`Most used font: ${report.mostUsedFont}`);\n * console.log(`Most used size: ${report.mostUsedSize / 2}pt`);\n * ```\n */\n getFormattingReport(): {\n fonts: Map<string, number>;\n sizes: Map<number, number>;\n colors: Map<string, number>;\n styles: Map<string, number>;\n uniqueFonts: string[];\n uniqueColors: string[];\n uniqueStyles: string[];\n mostUsedFont?: string;\n mostUsedSize?: number;\n mostUsedColor?: string;\n totalRuns: number;\n totalParagraphs: number;\n } {\n const fonts = new Map<string, number>();\n const sizes = new Map<number, number>();\n const colors = new Map<string, number>();\n const styles = new Map<string, number>();\n let totalRuns = 0;\n\n const paragraphs = this.getAllParagraphs();\n\n for (const para of paragraphs) {\n // Track paragraph styles\n const style = para.getStyle();\n if (style) {\n styles.set(style, (styles.get(style) || 0) + 1);\n }\n\n // Track run formatting\n for (const run of para.getRuns()) {\n totalRuns++;\n const formatting = run.getFormatting();\n\n if (formatting.font) {\n fonts.set(formatting.font, (fonts.get(formatting.font) || 0) + 1);\n }\n if (formatting.size !== undefined) {\n sizes.set(formatting.size, (sizes.get(formatting.size) || 0) + 1);\n }\n if (formatting.color) {\n const normalizedColor = formatting.color.toUpperCase().replace(/^#/, '');\n colors.set(normalizedColor, (colors.get(normalizedColor) || 0) + 1);\n }\n }\n }\n\n // Find most used entries\n let mostUsedFont: string | undefined;\n let maxFontCount = 0;\n for (const [font, count] of fonts.entries()) {\n if (count > maxFontCount) {\n maxFontCount = count;\n mostUsedFont = font;\n }\n }\n\n let mostUsedSize: number | undefined;\n let maxSizeCount = 0;\n for (const [size, count] of sizes.entries()) {\n if (count > maxSizeCount) {\n maxSizeCount = count;\n mostUsedSize = size;\n }\n }\n\n let mostUsedColor: string | undefined;\n let maxColorCount = 0;\n for (const [color, count] of colors.entries()) {\n if (count > maxColorCount) {\n maxColorCount = count;\n mostUsedColor = color;\n }\n }\n\n return {\n fonts,\n sizes,\n colors,\n styles,\n uniqueFonts: Array.from(fonts.keys()),\n uniqueColors: Array.from(colors.keys()),\n uniqueStyles: Array.from(styles.keys()),\n mostUsedFont,\n mostUsedSize,\n mostUsedColor,\n totalRuns,\n totalParagraphs: paragraphs.length,\n };\n }\n\n /**\n * Replaces all occurrences of text in the document\n *\n * Searches through all paragraphs (including those in tables) and replaces\n * matching text with the replacement string. Preserves the original formatting\n * of the text runs.\n *\n * @param find - The text string to search for\n * @param replace - The text string to replace with\n * @param options - Optional replacement configuration\n * @param options.caseSensitive - If true, match case exactly (default: false)\n * @param options.wholeWord - If true, match whole words only (default: false)\n * @returns Number of replacements made\n *\n * @example\n * ```typescript\n * // Simple find and replace\n * const count = doc.replaceText('color', 'colour');\n * console.log(`Replaced ${count} occurrences`);\n * ```\n *\n * @example\n * ```typescript\n * // Case-sensitive whole word replacement\n * const count = doc.replaceText('Error', 'Warning', {\n * caseSensitive: true,\n * wholeWord: true\n * });\n * ```\n */\n replaceText(\n find: string,\n replace: string,\n options?: { caseSensitive?: boolean; wholeWord?: boolean }\n ): number {\n let replacementCount = 0;\n const caseSensitive = options?.caseSensitive ?? false;\n const wholeWord = options?.wholeWord ?? false;\n\n const paragraphs = this.getAllParagraphs();\n for (const paragraph of paragraphs) {\n const runs = paragraph.getRuns();\n\n for (const run of runs) {\n const originalText = run.getText();\n let newText = originalText;\n\n if (wholeWord) {\n // Use word boundary regex for whole word replacement\n const wordPattern = new RegExp(\n `\\\\b${find.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\b`,\n caseSensitive ? 'g' : 'gi'\n );\n const matches = originalText.match(wordPattern);\n if (matches) {\n replacementCount += matches.length;\n newText = originalText.replace(wordPattern, replace);\n }\n } else {\n // Simple substring replacement\n const searchPattern = new RegExp(\n find.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'),\n caseSensitive ? 'g' : 'gi'\n );\n const matches = originalText.match(searchPattern);\n if (matches) {\n replacementCount += matches.length;\n newText = originalText.replace(searchPattern, replace);\n }\n }\n\n if (newText !== originalText) {\n run.setText(newText);\n }\n }\n }\n\n return replacementCount;\n }\n\n /**\n * Advanced find and replace with regex support and track changes integration\n *\n * Performs global find and replace operations with support for:\n * - Regular expressions for complex pattern matching\n * - Case-sensitive and whole-word matching\n * - Track changes integration (creates revision objects)\n * - Replacement across paragraphs and table cells\n *\n * @param pattern - String or RegExp pattern to find\n * @param replacement - Replacement text\n * @param options - Search and tracking options\n * @returns Object with replacement count and optional revisions\n *\n * @example\n * ```typescript\n * // Simple text replacement\n * const result = doc.findAndReplaceAll('old text', 'new text');\n * console.log(`Made ${result.count} replacements`);\n *\n * // Regex replacement\n * const phoneResult = doc.findAndReplaceAll(\n * /\\d{3}-\\d{4}/g,\n * '***-****',\n * { caseSensitive: true }\n * );\n *\n * // With track changes\n * const tracked = doc.findAndReplaceAll('error', 'correction', {\n * trackChanges: true,\n * author: 'John Doe'\n * });\n * console.log(`Created ${tracked.revisions?.length} revisions`);\n *\n * // Whole word replacement\n * doc.findAndReplaceAll('test', 'exam', { wholeWord: true });\n * ```\n */\n findAndReplaceAll(\n pattern: string | RegExp,\n replacement: string,\n options?: {\n caseSensitive?: boolean;\n wholeWord?: boolean;\n trackChanges?: boolean;\n author?: string;\n }\n ): { count: number; revisions?: Revision[] } {\n const {\n caseSensitive = false,\n wholeWord = false,\n trackChanges = false,\n author = 'Unknown',\n } = options || {};\n\n let count = 0;\n const revisions: Revision[] = [];\n\n // Convert pattern to RegExp if it's a string\n let regex: RegExp;\n if (typeof pattern === 'string') {\n // Escape special regex characters\n const escaped = pattern.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const boundaryPattern = wholeWord ? `\\\\b${escaped}\\\\b` : escaped;\n const flags = caseSensitive ? 'g' : 'gi';\n regex = new RegExp(boundaryPattern, flags);\n } else {\n // Use provided RegExp, ensure global flag\n const flags = pattern.flags.includes('g') ? pattern.flags : pattern.flags + 'g';\n regex = new RegExp(pattern.source, flags);\n }\n\n // Process all runs in document\n const runs = this.getAllRuns();\n\n for (const run of runs) {\n const originalText = run.getText();\n const matches = originalText.match(regex);\n\n if (matches && matches.length > 0) {\n const newText = originalText.replace(regex, replacement);\n\n if (trackChanges && !this.trackChangesEnabled) {\n // Option-level tracking: global tracking is OFF, so we manually create\n // and embed revisions into the paragraph content\n const parentParagraph = run._getParentParagraph();\n\n if (parentParagraph) {\n const segments = diffText(originalText, newText);\n const useGranular = diffHasUnchangedParts(segments);\n const now = new Date();\n const formatting = run.getFormatting();\n const newContent: ParagraphContent[] = [];\n\n if (useGranular) {\n for (const seg of segments) {\n if (seg.type === 'equal') {\n newContent.push(new Run(seg.text, formatting));\n } else if (seg.type === 'delete') {\n const delRev = Revision.createDeletion(\n author,\n new Run(seg.text, formatting),\n now\n );\n this.revisionManager.register(delRev);\n revisions.push(delRev);\n newContent.push(delRev);\n } else if (seg.type === 'insert') {\n const insRev = Revision.createInsertion(\n author,\n new Run(seg.text, formatting),\n now\n );\n this.revisionManager.register(insRev);\n revisions.push(insRev);\n newContent.push(insRev);\n }\n }\n } else {\n // Whole-run delete + insert\n const deletion = Revision.createDeletion(\n author,\n new Run(originalText, formatting),\n now\n );\n this.revisionManager.register(deletion);\n revisions.push(deletion);\n newContent.push(deletion);\n\n const insertion = Revision.createInsertion(author, new Run(newText, formatting), now);\n this.revisionManager.register(insertion);\n revisions.push(insertion);\n newContent.push(insertion);\n }\n\n parentParagraph.replaceContent(run, newContent);\n } else {\n // No parent paragraph — just update text in-place as fallback\n run.setText(newText);\n }\n } else {\n // Global tracking path or no tracking: use setText()\n const revCountBefore = this.revisionManager.getAllRevisions().length;\n\n run.setText(newText);\n\n // If global tracking is enabled and trackChanges was requested, collect the new revisions\n if (trackChanges && this.trackChangesEnabled) {\n const allRevs = this.revisionManager.getAllRevisions();\n for (let i = revCountBefore; i < allRevs.length; i++) {\n revisions.push(allRevs[i]!);\n }\n }\n }\n\n count += matches.length;\n }\n }\n\n return trackChanges ? { count, revisions } : { count };\n }\n\n /**\n * Gets the total word count in the document\n *\n * Counts all words in paragraphs including those inside tables.\n * Words are determined by splitting text on whitespace.\n *\n * @returns Total number of words in the document\n *\n * @example\n * ```typescript\n * const words = doc.getWordCount();\n * console.log(`Document contains ${words} words`);\n * ```\n */\n getWordCount(): number {\n let totalWords = 0;\n\n // Track counted paragraphs to prevent duplicates (getAllParagraphs includes table paragraphs)\n const countedParagraphs = new Set<Paragraph>();\n\n const paragraphs = this.getAllParagraphs();\n for (const paragraph of paragraphs) {\n countedParagraphs.add(paragraph);\n const text = paragraph.getText().trim();\n if (text) {\n // Split by whitespace and filter out empty strings\n const words = text.split(/\\s+/).filter((word) => word.length > 0);\n totalWords += words.length;\n }\n }\n\n // Also count words in tables (skip if already counted)\n const tables = this.getTables();\n for (const table of tables) {\n const rows = table.getRows();\n for (const row of rows) {\n const cells = row.getCells();\n for (const cell of cells) {\n const cellParas = cell.getParagraphs();\n for (const para of cellParas) {\n // Skip if already counted\n if (countedParagraphs.has(para)) {\n continue;\n }\n countedParagraphs.add(para);\n\n const text = para.getText().trim();\n if (text) {\n const words = text.split(/\\s+/).filter((word) => word.length > 0);\n totalWords += words.length;\n }\n }\n }\n }\n }\n\n return totalWords;\n }\n\n /**\n * Gets the total character count in the document\n *\n * Counts all characters in paragraphs including those inside tables.\n * Optionally includes or excludes spaces from the count.\n *\n * @param includeSpaces - If true, includes spaces in count; if false, excludes them (default: true)\n * @returns Total number of characters in the document\n *\n * @example\n * ```typescript\n * const charsWithSpaces = doc.getCharacterCount();\n * const charsNoSpaces = doc.getCharacterCount(false);\n * console.log(`Characters: ${charsWithSpaces} (with spaces), ${charsNoSpaces} (without)`);\n * ```\n */\n getCharacterCount(includeSpaces = true): number {\n let totalChars = 0;\n\n // Track counted paragraphs to prevent duplicates (getAllParagraphs includes table paragraphs)\n const countedParagraphs = new Set<Paragraph>();\n\n const paragraphs = this.getAllParagraphs();\n for (const paragraph of paragraphs) {\n countedParagraphs.add(paragraph);\n const text = paragraph.getText();\n if (includeSpaces) {\n totalChars += text.length;\n } else {\n totalChars += text.replace(/\\s/g, '').length;\n }\n }\n\n // Also count characters in tables (skip if already counted)\n const tables = this.getTables();\n for (const table of tables) {\n const rows = table.getRows();\n for (const row of rows) {\n const cells = row.getCells();\n for (const cell of cells) {\n const cellParas = cell.getParagraphs();\n for (const para of cellParas) {\n // Skip if already counted\n if (countedParagraphs.has(para)) {\n continue;\n }\n countedParagraphs.add(para);\n\n const text = para.getText();\n if (includeSpaces) {\n totalChars += text.length;\n } else {\n totalChars += text.replace(/\\s/g, '').length;\n }\n }\n }\n }\n }\n\n return totalChars;\n }\n\n /**\n * Removes a paragraph from the document\n * @param paragraphOrIndex - The paragraph object or its index\n * @returns True if the paragraph was removed, false otherwise\n */\n removeParagraph(paragraphOrIndex: Paragraph | number): boolean {\n let index: number;\n\n if (typeof paragraphOrIndex === 'number') {\n index = paragraphOrIndex;\n } else {\n // Find the index of the paragraph\n index = this.bodyElements.indexOf(paragraphOrIndex);\n }\n\n if (index >= 0 && index < this.bodyElements.length) {\n const element = this.bodyElements[index];\n if (element instanceof Paragraph) {\n // When tracking enabled, wrap content in w:del instead of removing\n if (this.trackChangesEnabled && this.trackingContext.isEnabled()) {\n const runs = element.getRuns();\n if (runs.length > 0) {\n const author = this.trackingContext.getAuthor();\n const deletion = Revision.createDeletion(author, runs);\n this.trackingContext.getRevisionManager().register(deletion);\n element.addRevision(deletion);\n }\n return true;\n }\n this.bodyElements.splice(index, 1);\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Removes a table from the document\n * @param tableOrIndex - The table object or its index\n * @returns True if the table was removed, false otherwise\n */\n removeTable(tableOrIndex: Table | number): boolean {\n let index: number;\n\n if (typeof tableOrIndex === 'number') {\n // If number provided, find the nth table\n const tables = this.getTables();\n if (tableOrIndex >= 0 && tableOrIndex < tables.length) {\n const table = tables[tableOrIndex];\n if (!table) return false;\n index = this.bodyElements.indexOf(table);\n } else {\n return false;\n }\n } else {\n // Find the index of the table\n index = this.bodyElements.indexOf(tableOrIndex);\n }\n\n if (index >= 0 && index < this.bodyElements.length) {\n const element = this.bodyElements[index];\n if (element instanceof Table) {\n this.bodyElements.splice(index, 1);\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Validates a paragraph before insertion\n * @param paragraph - The paragraph to validate\n * @throws Error if paragraph is invalid\n */\n private validateParagraph(paragraph: Paragraph): void {\n // Type validation\n if (!(paragraph instanceof Paragraph)) {\n throw new Error('insertParagraphAt: parameter must be a Paragraph instance');\n }\n\n // Check for duplicate paragraph IDs\n const paraId = paragraph.getFormatting().paraId;\n if (paraId) {\n const existingIds = this.bodyElements\n .filter((el): el is Paragraph => el instanceof Paragraph)\n .map((p) => p.getFormatting().paraId)\n .filter((id) => id === paraId);\n\n if (existingIds.length > 0) {\n throw new Error(\n `Duplicate paragraph ID detected: ${paraId}. Each paragraph must have a unique ID.`\n );\n }\n }\n\n // Warn about missing styles\n const style = paragraph.getFormatting().style;\n if (style && !this.stylesManager.hasStyle(style)) {\n defaultLogger.warn(\n `Style \"${style}\" not found in document. Paragraph will fall back to Normal style.`\n );\n }\n\n // Warn about missing numbering\n const numbering = paragraph.getFormatting().numbering;\n if (numbering && !this.numberingManager.hasInstance(numbering.numId)) {\n defaultLogger.warn(\n `Numbering ID ${numbering.numId} not found in document. List formatting will not display.`\n );\n }\n }\n\n /**\n * Validates a table before insertion\n * @param table - The table to validate\n * @throws Error if table is invalid\n */\n private validateTable(table: Table): void {\n // Type validation\n if (!(table instanceof Table)) {\n throw new Error('insertTableAt: parameter must be a Table instance');\n }\n\n // Content validation - table must have rows\n const rows = table.getRows();\n if (rows.length === 0) {\n throw new Error('insertTableAt: table must have at least one row');\n }\n\n // Check first row has cells (rows.length > 0 already checked above)\n const firstRow = rows[0];\n if (firstRow?.getCells().length === 0) {\n throw new Error('insertTableAt: table rows must have at least one cell');\n }\n\n // Warn about missing table styles\n const tableStyle = table.getFormatting().style;\n if (tableStyle && !this.stylesManager.hasStyle(tableStyle)) {\n defaultLogger.warn(\n `Table style \"${tableStyle}\" not found in document. Table will use default formatting.`\n );\n }\n }\n\n /**\n * Validates a TOC element before insertion\n * @param toc - The TOC to validate\n * @throws Error if TOC is invalid\n */\n private validateToc(toc: TableOfContentsElement): void {\n // Type validation\n if (!(toc instanceof TableOfContentsElement)) {\n throw new Error('insertTocAt: parameter must be a TableOfContentsElement instance');\n }\n\n // Check if document has heading styles for TOC to reference\n const hasHeadings = [\n 'Heading1',\n 'Heading2',\n 'Heading3',\n 'Heading4',\n 'Heading5',\n 'Heading6',\n 'Heading7',\n 'Heading8',\n 'Heading9',\n ].some((style) => this.stylesManager.hasStyle(style));\n\n if (!hasHeadings) {\n defaultLogger.warn(\n 'No heading styles found in document. Table of Contents may not display entries correctly.'\n );\n }\n }\n\n /**\n * Normalizes and validates insertion index\n * @param index - The requested index\n * @returns Normalized index within valid bounds\n */\n private normalizeIndex(index: number): number {\n if (index < 0) {\n return 0;\n } else if (index > this.bodyElements.length) {\n return this.bodyElements.length;\n }\n return index;\n }\n\n /**\n * Inserts a paragraph at a specific position\n * @param index - The position to insert at (0-based)\n * @param paragraph - The paragraph to insert\n * @returns This document for chaining\n * @throws Error if paragraph is invalid or has duplicate IDs\n */\n insertParagraphAt(index: number, paragraph: Paragraph): this {\n // Validate the paragraph\n this.validateParagraph(paragraph);\n\n // Normalize index\n index = this.normalizeIndex(index);\n\n // Insert the paragraph\n this.bodyElements.splice(index, 0, paragraph);\n return this;\n }\n\n /**\n * Inserts a table at a specific position\n * @param index - The position to insert at (0-based)\n * @param table - The table to insert\n * @returns This document for chaining\n * @throws Error if table is invalid or malformed\n * @example\n * ```typescript\n * const table = new Table(2, 3);\n * doc.insertTableAt(5, table); // Insert at position 5\n * ```\n */\n insertTableAt(index: number, table: Table): this {\n // Validate the table\n this.validateTable(table);\n\n // Normalize index\n index = this.normalizeIndex(index);\n\n // Insert the table\n this.bodyElements.splice(index, 0, table);\n return this;\n }\n\n /**\n * Inserts a Table of Contents at a specific position\n * @param index - The position to insert at (0-based)\n * @param toc - The TableOfContentsElement to insert\n * @returns This document for chaining\n * @throws Error if TOC is invalid\n * @example\n * ```typescript\n * const toc = TableOfContentsElement.createStandard();\n * doc.insertTocAt(0, toc); // Insert at beginning\n * ```\n */\n insertTocAt(index: number, toc: TableOfContentsElement): this {\n // Validate the TOC\n this.validateToc(toc);\n\n // Normalize index\n index = this.normalizeIndex(index);\n\n // Insert the TOC\n this.bodyElements.splice(index, 0, toc);\n return this;\n }\n\n /**\n * Replaces a paragraph at a specific position\n * @param index - The position to replace at (0-based)\n * @param paragraph - The new paragraph\n * @returns True if replaced, false if index invalid\n * @throws Error if replacement paragraph is invalid or has duplicate IDs\n * @example\n * ```typescript\n * const newPara = new Paragraph();\n * newPara.addText('Replacement text');\n * doc.replaceParagraphAt(3, newPara);\n * ```\n */\n replaceParagraphAt(index: number, paragraph: Paragraph): boolean {\n if (index >= 0 && index < this.bodyElements.length) {\n const element = this.bodyElements[index];\n if (element instanceof Paragraph) {\n // Validate the replacement paragraph\n this.validateParagraph(paragraph);\n\n // Replace the paragraph\n this.bodyElements[index] = paragraph;\n return true;\n }\n }\n return false;\n }\n\n /**\n * Replaces a table at a specific position\n * @param index - The position to replace at (0-based)\n * @param table - The new table\n * @returns True if replaced, false if index invalid or not a table\n * @throws Error if replacement table is invalid or malformed\n * @example\n * ```typescript\n * const newTable = new Table(3, 4);\n * doc.replaceTableAt(2, newTable);\n * ```\n */\n replaceTableAt(index: number, table: Table): boolean {\n if (index >= 0 && index < this.bodyElements.length) {\n const element = this.bodyElements[index];\n if (element instanceof Table) {\n // Validate the replacement table\n this.validateTable(table);\n\n // Replace the table\n this.bodyElements[index] = table;\n return true;\n }\n }\n return false;\n }\n\n /**\n * Moves an element from one position to another\n * @param fromIndex - Current position (0-based)\n * @param toIndex - Target position (0-based)\n * @returns True if moved, false if indices invalid\n * @example\n * ```typescript\n * doc.moveElement(5, 2); // Move element from position 5 to position 2\n * ```\n */\n moveElement(fromIndex: number, toIndex: number): boolean {\n if (\n fromIndex < 0 ||\n fromIndex >= this.bodyElements.length ||\n toIndex < 0 ||\n toIndex >= this.bodyElements.length\n ) {\n return false;\n }\n\n const [element] = this.bodyElements.splice(fromIndex, 1);\n this.bodyElements.splice(toIndex, 0, element!);\n return true;\n }\n\n /**\n * Swaps two elements' positions\n * @param index1 - First element position (0-based)\n * @param index2 - Second element position (0-based)\n * @returns True if swapped, false if indices invalid\n * @example\n * ```typescript\n * doc.swapElements(2, 5); // Swap elements at positions 2 and 5\n * ```\n */\n swapElements(index1: number, index2: number): boolean {\n if (\n index1 < 0 ||\n index1 >= this.bodyElements.length ||\n index2 < 0 ||\n index2 >= this.bodyElements.length\n ) {\n return false;\n }\n\n const temp = this.bodyElements[index1];\n this.bodyElements[index1] = this.bodyElements[index2]!;\n this.bodyElements[index2] = temp!;\n return true;\n }\n\n /**\n * Removes a Table of Contents element at a specific position\n * @param index - The position to remove (0-based)\n * @returns True if removed, false if index invalid or not a TOC\n * @example\n * ```typescript\n * doc.removeTocAt(0); // Remove TOC at beginning\n * ```\n */\n removeTocAt(index: number): boolean {\n if (index >= 0 && index < this.bodyElements.length) {\n const element = this.bodyElements[index];\n if (element instanceof TableOfContentsElement) {\n this.bodyElements.splice(index, 1);\n return true;\n }\n }\n return false;\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Body Element Access API\n // These methods provide index-based access to the internal bodyElements array,\n // enabling external code to perform the same manipulations that were previously\n // only possible from within the Document class.\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Gets the index of a body element in the document's body elements array.\n * Unlike getParagraphIndex/getTableIndex which find the index among same-type elements,\n * this returns the absolute index in the full bodyElements array.\n * @param element - The element to find\n * @returns The zero-based index of the element, or -1 if not found\n * @example\n * ```typescript\n * const tables = doc.getAllTables();\n * const index = doc.getBodyElementIndex(tables[0]);\n * if (index !== -1) {\n * const nextElement = doc.getBodyElementAt(index + 1);\n * }\n * ```\n */\n getBodyElementIndex(element: BodyElement): number {\n return this.bodyElements.indexOf(element);\n }\n\n /**\n * Gets the total number of body elements in the document.\n * @returns The count of body elements (paragraphs, tables, TOC elements, SDTs)\n * @example\n * ```typescript\n * for (let i = 0; i < doc.getBodyElementCount(); i++) {\n * const el = doc.getBodyElementAt(i);\n * }\n * ```\n */\n getBodyElementCount(): number {\n return this.bodyElements.length;\n }\n\n /**\n * Removes the body element at a specific index.\n * @param index - The zero-based index of the element to remove\n * @returns True if the element was removed, false if the index was out of bounds\n * @example\n * ```typescript\n * const index = doc.getBodyElementIndex(paragraph);\n * if (index !== -1) {\n * doc.removeBodyElementAt(index);\n * }\n * ```\n */\n removeBodyElementAt(index: number): boolean {\n if (index >= 0 && index < this.bodyElements.length) {\n this.bodyElements.splice(index, 1);\n return true;\n }\n return false;\n }\n\n /**\n * Inserts a body element at a specific index, shifting existing elements forward.\n * @param index - The zero-based index at which to insert. Clamped to valid range.\n * @param element - The element to insert (Paragraph, Table, TOC, or SDT)\n * @example\n * ```typescript\n * const blankPara = Paragraph.create();\n * const tableIndex = doc.getBodyElementIndex(table);\n * doc.insertBodyElementAt(tableIndex + 1, blankPara);\n * ```\n */\n insertBodyElementAt(index: number, element: BodyElement): void {\n const clampedIndex = Math.max(0, Math.min(index, this.bodyElements.length));\n this.bodyElements.splice(clampedIndex, 0, element);\n }\n\n /**\n * Replaces the entire body elements array.\n * Use with caution - this is a low-level operation for code that needs to\n * rebuild the body element list (e.g., SDT unwrapping).\n * @param elements - The new body elements array\n */\n setBodyElements(elements: BodyElement[]): void {\n this.bodyElements = elements;\n }\n\n /**\n * Gets all hyperlinks in the document\n *\n * Searches through all paragraphs (including those in tables) and returns\n * all Hyperlink instances along with their containing paragraphs.\n *\n * @returns Array of objects containing hyperlink and its parent paragraph\n *\n * @example\n * ```typescript\n * const hyperlinks = doc.getHyperlinks();\n * console.log(`Found ${hyperlinks.length} hyperlinks`);\n *\n * for (const { hyperlink, paragraph } of hyperlinks) {\n * console.log(`Link: ${hyperlink.getText()} -> ${hyperlink.getUrl()}`);\n * }\n * ```\n *\n * @example\n * ```typescript\n * // Find broken links\n * const hyperlinks = doc.getHyperlinks();\n * for (const { hyperlink } of hyperlinks) {\n * const url = hyperlink.getUrl();\n * if (url && url.includes('old-domain.com')) {\n * console.log(`Update needed: ${url}`);\n * }\n * }\n * ```\n */\n getHyperlinks(): { hyperlink: Hyperlink; paragraph: Paragraph }[] {\n const hyperlinks: { hyperlink: Hyperlink; paragraph: Paragraph }[] = [];\n\n // Helper function to extract hyperlinks from paragraph content,\n // including those inside Revision elements (w:ins, w:del, etc.)\n const extractHyperlinksFromParagraph = (para: Paragraph): void => {\n for (const content of para.getContent()) {\n if (content instanceof Hyperlink) {\n hyperlinks.push({ hyperlink: content, paragraph: para });\n } else if (content instanceof Revision) {\n // Check inside revision elements for hyperlinks\n for (const revContent of content.getContent()) {\n if (revContent instanceof Hyperlink) {\n hyperlinks.push({ hyperlink: revContent, paragraph: para });\n }\n }\n }\n }\n };\n\n for (const paragraph of this.getAllParagraphs()) {\n extractHyperlinksFromParagraph(paragraph);\n }\n\n // Also check in tables\n for (const table of this.getTables()) {\n for (const row of table.getRows()) {\n for (const cell of row.getCells()) {\n // TableCell has getParagraphs method\n const cellParagraphs = cell instanceof TableCell ? cell.getParagraphs() : [];\n for (const para of cellParagraphs) {\n extractHyperlinksFromParagraph(para);\n }\n }\n }\n }\n\n return hyperlinks;\n }\n\n /**\n * Collects ALL hyperlink relationship IDs referenced anywhere in the document,\n * including raw nested content (nested tables stored as raw XML), headers/footers,\n * footnotes, and endnotes. This is the comprehensive version of getHyperlinks()\n * for relationship cleanup purposes.\n */\n collectAllReferencedHyperlinkIds(): Set<string> {\n const ids = new Set<string>();\n\n const scanParagraph = (para: Paragraph): void => {\n for (const item of para.getContent()) {\n if (item instanceof Hyperlink) {\n const relId = item.getRelationshipId();\n if (relId) ids.add(relId);\n }\n if (item instanceof Revision) {\n for (const revContent of item.getContent()) {\n if (revContent instanceof Hyperlink) {\n const relId = revContent.getRelationshipId();\n if (relId) ids.add(relId);\n }\n }\n }\n }\n };\n\n const scanElement = (\n element: BodyElement | Paragraph | Table | StructuredDocumentTag\n ): void => {\n if (element instanceof Paragraph) {\n scanParagraph(element);\n } else if (element instanceof Table) {\n for (let row = 0; row < element.getRowCount(); row++) {\n for (let col = 0; col < element.getColumnCount(); col++) {\n const cell = element.getCell(row, col);\n if (cell) {\n for (const para of cell.getParagraphs()) {\n scanParagraph(para);\n }\n // Scan raw nested content (nested tables/SDTs stored as raw XML)\n for (const nested of cell.getRawNestedContent()) {\n const rIdPattern = /r:id=\"(rId\\d+)\"/g;\n let rIdMatch: RegExpExecArray | null;\n while ((rIdMatch = rIdPattern.exec(nested.xml)) !== null) {\n ids.add(rIdMatch[1]!);\n }\n }\n }\n }\n }\n } else if (element instanceof StructuredDocumentTag) {\n for (const item of element.getContent()) {\n scanElement(item);\n }\n }\n };\n\n // Body elements\n for (const element of this.bodyElements) {\n scanElement(element);\n }\n\n // Headers and footers\n for (const header of this.headerFooterManager.getAllHeaders()) {\n for (const el of header.header.getElements()) {\n scanElement(el);\n }\n }\n for (const footer of this.headerFooterManager.getAllFooters()) {\n for (const el of footer.footer.getElements()) {\n scanElement(el);\n }\n }\n\n // Footnotes\n for (const fn of this.footnoteManager.getAllFootnotes()) {\n for (const para of fn.getParagraphs()) {\n scanParagraph(para);\n }\n }\n\n // Endnotes\n for (const en of this.endnoteManager.getAllEndnotes()) {\n for (const para of en.getParagraphs()) {\n scanParagraph(para);\n }\n }\n\n return ids;\n }\n\n /**\n * Defragments and optimizes hyperlinks in the document\n * This merges fragmented hyperlinks with the same URL (common in Google Docs exports)\n * and optionally resets their formatting to standard style\n *\n * @param options - Defragmentation options\n * @returns Number of hyperlinks merged\n *\n * @example\n * ```typescript\n * // Basic defragmentation\n * const merged = doc.defragmentHyperlinks();\n * console.log(`Merged ${merged} fragmented hyperlinks`);\n *\n * // With formatting reset (fixes corrupted fonts like Caveat)\n * const fixed = doc.defragmentHyperlinks({ resetFormatting: true });\n * console.log(`Fixed ${fixed} hyperlinks with standard formatting`);\n * ```\n */\n defragmentHyperlinks(options?: {\n resetFormatting?: boolean;\n cleanupRelationships?: boolean;\n }): number {\n const { resetFormatting = false, cleanupRelationships = false } = options || {};\n\n // Guard: Skip when track changes is enabled - prevents field structure corruption\n // The mergeConsecutiveHyperlinks() method uses clearContent() + addHyperlink()\n // which creates new revisions at the END of the content array, placing them\n // OUTSIDE field boundaries when field codes are present\n if (this.trackChangesEnabled) {\n defaultLogger.warn(\n 'defragmentHyperlinks skipped: track changes is enabled. ' +\n 'Call defragmentHyperlinks before enableTrackChanges() to avoid field corruption.'\n );\n return 0;\n }\n\n let mergedCount = 0;\n\n // Get the DocumentParser instance to use its merging method\n const parser = new DocumentParser();\n\n // Process all paragraphs in the document\n for (const paragraph of this.getAllParagraphs()) {\n const originalContent = paragraph.getContent();\n\n // Call the enhanced mergeConsecutiveHyperlinks method\n (parser as any).mergeConsecutiveHyperlinks(paragraph, resetFormatting);\n\n const newContent = paragraph.getContent();\n\n // Count merges by comparing content length\n if (originalContent.length > newContent.length) {\n mergedCount += originalContent.length - newContent.length;\n }\n }\n\n // Also process paragraphs in tables\n for (const table of this.getTables()) {\n for (const row of table.getRows()) {\n for (const cell of row.getCells()) {\n const cellParagraphs = cell instanceof TableCell ? cell.getParagraphs() : [];\n for (const para of cellParagraphs) {\n const originalContent = para.getContent();\n\n (parser as any).mergeConsecutiveHyperlinks(para, resetFormatting);\n\n const newContent = para.getContent();\n\n if (originalContent.length > newContent.length) {\n mergedCount += originalContent.length - newContent.length;\n }\n }\n }\n }\n }\n\n // Optionally clean up orphaned relationships\n if (cleanupRelationships && mergedCount > 0) {\n // Use comprehensive scanning that includes raw nested content\n const referencedIds = this.collectAllReferencedHyperlinkIds();\n\n // Remove orphaned hyperlink relationships\n const removedCount = this.relationshipManager.removeOrphanedHyperlinks(referencedIds);\n if (removedCount > 0) {\n defaultLogger.info(`Cleaned up ${removedCount} orphaned hyperlink relationship(s)`);\n }\n }\n\n return mergedCount;\n }\n\n /**\n * Gets all bookmarks in the document\n * @returns Array of bookmarks with their containing paragraph\n */\n getBookmarks(): { bookmark: Bookmark; paragraph: Paragraph }[] {\n const bookmarks: { bookmark: Bookmark; paragraph: Paragraph }[] = [];\n\n for (const paragraph of this.getAllParagraphs()) {\n // Get bookmarks that start in this paragraph\n for (const bookmark of paragraph.getBookmarksStart()) {\n bookmarks.push({ bookmark, paragraph });\n }\n }\n\n // Also check in tables\n for (const table of this.getTables()) {\n for (const row of table.getRows()) {\n for (const cell of row.getCells()) {\n for (const para of cell.getParagraphs()) {\n for (const bookmark of para.getBookmarksStart()) {\n bookmarks.push({ bookmark, paragraph: para });\n }\n }\n }\n }\n }\n\n return bookmarks;\n }\n\n /**\n * Gets all fields in the document with their parent context\n *\n * Returns all Field and ComplexField instances from:\n * - All body paragraphs\n * - All paragraphs inside table cells\n *\n * @returns Array of objects containing field, paragraph, and optionally table\n *\n * @example\n * ```typescript\n * // Get all fields\n * const fields = doc.getFields();\n * console.log(`Document has ${fields.length} fields`);\n *\n * for (const { field, paragraph, table } of fields) {\n * console.log(`Field: ${field.getType()} - ${field.getInstruction()}`);\n * if (table) {\n * console.log(' (inside table)');\n * }\n * }\n * ```\n *\n * @example\n * ```typescript\n * // Find all merge fields\n * const fields = doc.getFields();\n * const mergeFields = fields.filter(({ field }) =>\n * field.getType() === 'MERGEFIELD'\n * );\n * console.log(`Found ${mergeFields.length} merge fields`);\n * ```\n */\n getFields(): { field: FieldLike; paragraph: Paragraph; table?: Table }[] {\n const results: { field: FieldLike; paragraph: Paragraph; table?: Table }[] = [];\n\n // Get fields from all body paragraphs\n for (const paragraph of this.getAllParagraphs()) {\n for (const field of paragraph.getFields()) {\n results.push({ field, paragraph });\n }\n }\n\n // Get fields from paragraphs inside table cells\n for (const table of this.getTables()) {\n for (const row of table.getRows()) {\n for (const cell of row.getCells()) {\n const cellParagraphs = cell instanceof TableCell ? cell.getParagraphs() : [];\n for (const para of cellParagraphs) {\n for (const field of para.getFields()) {\n results.push({ field, paragraph: para, table });\n }\n }\n }\n }\n }\n\n return results;\n }\n\n /**\n * Gets all images in the document with metadata\n *\n * Returns all Image instances registered in the document along with\n * their relationship IDs and filenames in the media folder.\n *\n * @returns Array of objects containing image, relationship ID, and filename\n *\n * @example\n * ```typescript\n * const images = doc.getImages();\n * console.log(`Document contains ${images.length} images`);\n *\n * for (const { image, filename } of images) {\n * console.log(`${filename}: ${image.getWidth()}x${image.getHeight()} EMUs`);\n * }\n * ```\n */\n getImages(): {\n image: Image;\n relationshipId: string;\n filename: string;\n }[] {\n return this.imageManager.getAllImages();\n }\n\n /**\n * Performs lossless image optimization on all images in the document.\n *\n * - PNG images: re-compressed at zlib level 9, metadata chunks stripped\n * - BMP images: converted to PNG format (lossless, typically 10-50x smaller)\n * - JPEG, EMF, WMF, SVG, GIF, TIFF: skipped (cannot be losslessly optimized further)\n *\n * @returns Optimization results including count and bytes saved\n *\n * @example\n * ```typescript\n * const doc = await Document.load('document.docx');\n * const result = await doc.optimizeImages();\n * console.log(`Optimized ${result.optimizedCount} images, saved ${result.totalSavedBytes} bytes`);\n * await doc.save('document-optimized.docx');\n * ```\n */\n async optimizeImages(): Promise<ImageOptimizationResult> {\n // 1. Ensure all image data is loaded\n await this.imageManager.loadAllImageData();\n\n // 2. Group images by filename (avoid processing same file twice)\n const imagesByFilename = new Map<\n string,\n { image: Image; relationshipId: string; filename: string }[]\n >();\n for (const entry of this.imageManager.getAllImages()) {\n const group = imagesByFilename.get(entry.filename) || [];\n group.push(entry);\n imagesByFilename.set(entry.filename, group);\n }\n\n // 3. Optimize each unique image file\n let totalSaved = 0;\n let optimizedCount = 0;\n\n for (const [filename, entries] of imagesByFilename) {\n const firstEntry = entries[0];\n if (!firstEntry) continue;\n\n const image = firstEntry.image;\n let originalData: Buffer;\n try {\n originalData = image.getImageData();\n } catch {\n continue; // Image data not available\n }\n const extension = image.getExtension();\n\n const result = optimizeImage(originalData, extension);\n if (!result) continue;\n\n const saved = originalData.length - result.data.length;\n if (saved <= 0) continue;\n\n // 4. Update all Image objects sharing this file\n for (const entry of entries) {\n await entry.image.updateImageData(result.data);\n }\n\n // 5. If format changed (e.g., bmp → png), update filename + relationships\n if (result.newExtension !== extension) {\n const newFilename = filename.replace(/\\.[^.]+$/, `.${result.newExtension}`);\n this.imageManager.updateEntryFilename(image, newFilename);\n\n // Update relationship targets across all relationship managers\n for (const entry of entries) {\n this.updateImageRelationshipTarget(entry.relationshipId, filename, newFilename);\n }\n }\n\n totalSaved += saved;\n optimizedCount++;\n }\n\n return { optimizedCount, totalSavedBytes: totalSaved };\n }\n\n /**\n * Updates an image relationship target when the image format changes.\n * Handles both document body and header/footer relationships.\n * @private\n */\n private updateImageRelationshipTarget(\n relId: string,\n oldFilename: string,\n newFilename: string\n ): void {\n // Try document body relationship manager first\n const rel = this.relationshipManager.getRelationship(relId);\n if (rel) {\n const oldTarget = rel.getTarget();\n const newTarget = oldTarget.replace(oldFilename, newFilename);\n rel.setTarget(newTarget);\n return;\n }\n\n // For header/footer images, update .rels files in the ZIP directly\n const oldTarget = `media/${oldFilename}`;\n const newTarget = `media/${newFilename}`;\n const escapedOldTarget = oldTarget.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\n const filePaths = this.zipHandler.getFilePaths();\n for (const path of filePaths) {\n if (!path.endsWith('.rels') || path === 'word/_rels/document.xml.rels') continue;\n const content = this.zipHandler.getFileAsString(path);\n if (content?.includes(oldTarget)) {\n const updated = content.replace(new RegExp(escapedOldTarget, 'g'), newTarget);\n this.zipHandler.updateFile(path, updated);\n }\n }\n }\n\n /**\n * Gets all runs in the document (flattened from all paragraphs)\n *\n * This method returns all Run objects from:\n * - All body paragraphs\n * - All paragraphs inside table cells\n *\n * Useful for bulk operations on text formatting across the entire document.\n *\n * @returns Array of all Run objects in the document\n *\n * @example\n * ```typescript\n * // Get all runs\n * const runs = doc.getAllRuns();\n * console.log(`Document has ${runs.length} text runs`);\n *\n * // Make all text bold\n * for (const run of doc.getAllRuns()) {\n * run.setBold(true);\n * }\n * ```\n */\n getAllRuns(): Run[] {\n const runs: Run[] = [];\n\n // Get runs from all body paragraphs\n for (const paragraph of this.getAllParagraphs()) {\n runs.push(...paragraph.getRuns());\n }\n\n // Get runs from paragraphs inside table cells\n for (const table of this.getTables()) {\n for (const row of table.getRows()) {\n for (const cell of row.getCells()) {\n const cellParagraphs = cell instanceof TableCell ? cell.getParagraphs() : [];\n for (const para of cellParagraphs) {\n runs.push(...para.getRuns());\n }\n }\n }\n }\n\n return runs;\n }\n\n /**\n * Automatically converts email addresses in text to mailto: hyperlinks\n *\n * Scans all paragraphs (including those in tables, headers, and footers)\n * for email addresses and converts them to clickable mailto: hyperlinks\n * with standard hyperlink formatting.\n *\n * @param options - Optional formatting and behavior options\n * @param options.formatting - Custom formatting for the hyperlinks (defaults to Verdana 12pt, underline, blue)\n * @returns Statistics about emails converted\n *\n * @example\n * ```typescript\n * // Auto-link all email addresses with default formatting\n * const result = doc.hyperlinkEmails();\n * console.log(`Linked ${result.emailsLinked} emails in ${result.paragraphsModified} paragraphs`);\n *\n * // With custom formatting\n * doc.hyperlinkEmails({\n * formatting: {\n * font: 'Arial',\n * size: 22, // 11pt in half-points\n * underline: 'single',\n * bold: false,\n * color: '0000FF',\n * }\n * });\n * ```\n */\n hyperlinkEmails(options?: { formatting?: RunFormatting }): {\n emailsLinked: number;\n paragraphsModified: number;\n } {\n // Default formatting: Verdana 12pt, Underline, no bold, #0000FF\n const defaultFormatting: RunFormatting = {\n font: 'Verdana',\n size: 12, // 12pt\n underline: 'single',\n bold: false,\n color: '0000FF',\n };\n\n const formatting = options?.formatting ?? defaultFormatting;\n\n // RFC 5322 simplified email regex (handles most common patterns)\n const emailRegex = /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}/g;\n\n let emailsLinked = 0;\n let paragraphsModified = 0;\n\n // Get all paragraphs (including in tables, headers, footers)\n const paragraphs = this.getAllParagraphs();\n\n for (const para of paragraphs) {\n let modified = false;\n const content = [...para.getContent()]; // Clone to avoid modification during iteration\n\n for (const item of content) {\n if (item instanceof Run) {\n const text = item.getText();\n const matches = [...text.matchAll(emailRegex)];\n\n if (matches.length > 0) {\n // Split run into segments with hyperlinks\n const newContent = this.splitRunWithEmails(item, matches, formatting);\n\n // Replace original run with new content\n para.replaceContent(item, newContent);\n\n emailsLinked += matches.length;\n modified = true;\n }\n }\n }\n\n if (modified) paragraphsModified++;\n }\n\n return { emailsLinked, paragraphsModified };\n }\n\n /**\n * Splits a run containing email addresses into text runs and hyperlinks\n * @private\n */\n private splitRunWithEmails(\n run: Run,\n matches: RegExpMatchArray[],\n formatting: RunFormatting\n ): ParagraphContent[] {\n const text = run.getText();\n const originalFormatting = run.getFormatting();\n const result: ParagraphContent[] = [];\n\n let lastIndex = 0;\n\n for (const match of matches) {\n const email = match[0];\n const startIndex = match.index!;\n\n // Add text before email (if any)\n if (startIndex > lastIndex) {\n const beforeText = text.slice(lastIndex, startIndex);\n result.push(new Run(beforeText, originalFormatting));\n }\n\n // Add email as hyperlink\n const hyperlink = Hyperlink.createEmail(email, email, formatting);\n result.push(hyperlink);\n\n lastIndex = startIndex + email.length;\n }\n\n // Add remaining text after last email (if any)\n if (lastIndex < text.length) {\n const afterText = text.slice(lastIndex);\n result.push(new Run(afterText, originalFormatting));\n }\n\n return result;\n }\n\n /**\n * Removes a specific formatting type from all runs in the document\n *\n * This is a bulk operation that removes the specified formatting property\n * from ALL text runs in the document (including runs inside table cells).\n *\n * @param type - The formatting property to remove\n * @returns Number of runs that were modified\n *\n * @example\n * ```typescript\n * // Remove all bold formatting from document\n * const count = doc.removeFormattingFromAll('bold');\n * console.log(`Removed bold from ${count} runs`);\n *\n * // Remove all highlighting\n * doc.removeFormattingFromAll('highlight');\n *\n * // Remove all font color\n * doc.removeFormattingFromAll('color');\n *\n * // Remove underlines\n * doc.removeFormattingFromAll('underline');\n * ```\n */\n removeFormattingFromAll(\n type:\n | 'bold'\n | 'italic'\n | 'underline'\n | 'strike'\n | 'dstrike'\n | 'highlight'\n | 'color'\n | 'font'\n | 'size'\n | 'subscript'\n | 'superscript'\n | 'smallCaps'\n | 'allCaps'\n | 'outline'\n | 'shadow'\n | 'emboss'\n | 'imprint'\n ): number {\n let modifiedCount = 0;\n\n // Get all runs in the document\n const runs = this.getAllRuns();\n\n for (const run of runs) {\n const formatting = run.getFormatting();\n\n // Check if the property exists before removing it\n if (type in formatting) {\n // Access the private formatting property to modify it\n // This is a valid pattern for bulk operations in the framework\n (run as any).formatting[type] = undefined;\n delete (run as any).formatting[type];\n\n modifiedCount++;\n }\n }\n\n return modifiedCount;\n }\n\n /**\n * Applies a formatting function to all hyperlinks in the document\n *\n * This is a bulk operation that calls the provided formatter function\n * for each hyperlink in the document (including hyperlinks inside table cells).\n *\n * The formatter function receives the hyperlink and its containing paragraph,\n * allowing for sophisticated conditional formatting based on context.\n *\n * @param formatter - Function to apply to each hyperlink\n * @returns Number of hyperlinks processed\n *\n * @example\n * ```typescript\n * // Make all hyperlinks red and bold\n * doc.updateAllHyperlinks((link) => {\n * link.setFormatting({ color: 'FF0000', bold: true });\n * });\n *\n * // Remove underline from all hyperlinks\n * doc.updateAllHyperlinks((link) => {\n * const fmt = link.getFormatting();\n * delete fmt.underline;\n * link.setFormatting(fmt);\n * });\n *\n * // Conditional formatting based on URL\n * doc.updateAllHyperlinks((link) => {\n * const url = link.getUrl();\n * if (url?.includes('internal')) {\n * link.setFormatting({ color: '0000FF' }); // Blue for internal links\n * } else if (url?.includes('external')) {\n * link.setFormatting({ color: 'FF0000' }); // Red for external links\n * }\n * });\n *\n * // Access paragraph context for advanced logic\n * doc.updateAllHyperlinks((link, para) => {\n * const paraStyle = para.getFormatting().style;\n * if (paraStyle === 'Heading1') {\n * link.setFormatting({ bold: true, size: 16 });\n * }\n * });\n * ```\n */\n updateAllHyperlinks(formatter: (hyperlink: Hyperlink, paragraph: Paragraph) => void): number {\n // Get all hyperlinks with their containing paragraphs\n const hyperlinks = this.getHyperlinks();\n\n // Apply formatter to each hyperlink\n for (const { hyperlink, paragraph } of hyperlinks) {\n formatter(hyperlink, paragraph);\n }\n\n return hyperlinks.length;\n }\n\n /**\n * Normalizes spacing throughout the document\n *\n * Ensures consistent spacing by:\n * - Removing duplicate consecutive empty paragraphs\n * - Applying standard paragraph spacing (before/after)\n * - Standardizing line spacing\n * - Removing trailing spaces from runs\n *\n * @param rules - Normalization rules\n * @returns Object with counts of elements removed and normalized\n *\n * @example\n * ```typescript\n * // Remove duplicate empty paragraphs only\n * const result = doc.normalizeSpacing({\n * removeDuplicateEmptyParagraphs: true\n * });\n * console.log(`Removed ${result.removed} empty paragraphs`);\n *\n * // Apply standard spacing\n * doc.normalizeSpacing({\n * standardParagraphSpacing: { before: 0, after: 200 }, // 200 twips = 10pt\n * standardLineSpacing: 240, // Single spacing\n * removeTrailingSpaces: true\n * });\n *\n * // Full normalization\n * const stats = doc.normalizeSpacing({\n * removeDuplicateEmptyParagraphs: true,\n * standardParagraphSpacing: { after: 200 },\n * removeTrailingSpaces: true\n * });\n * console.log(`Removed: ${stats.removed}, Normalized: ${stats.normalized}`);\n * ```\n */\n normalizeSpacing(\n rules: {\n removeDuplicateEmptyParagraphs?: boolean;\n standardParagraphSpacing?: { before?: number; after?: number };\n standardLineSpacing?: number;\n removeTrailingSpaces?: boolean;\n } = {}\n ): { removed: number; normalized: number } {\n const {\n removeDuplicateEmptyParagraphs = true,\n standardParagraphSpacing,\n standardLineSpacing,\n removeTrailingSpaces = true,\n } = rules;\n\n let removed = 0;\n let normalized = 0;\n\n // Remove duplicate empty paragraphs\n if (removeDuplicateEmptyParagraphs) {\n let lastWasEmpty = false;\n const toRemove: number[] = [];\n\n this.bodyElements.forEach((element, index) => {\n if (element instanceof Paragraph) {\n const isEmpty = element.getText().trim() === '';\n if (isEmpty && lastWasEmpty) {\n toRemove.push(index);\n }\n lastWasEmpty = isEmpty;\n } else {\n lastWasEmpty = false; // Reset for non-paragraph elements\n }\n });\n\n // Remove in reverse order to maintain indices\n toRemove.reverse().forEach((index) => {\n this.bodyElements.splice(index, 1);\n removed++;\n });\n }\n\n // Apply standard spacing to all paragraphs\n for (const para of this.getAllParagraphs()) {\n if (standardParagraphSpacing) {\n if (standardParagraphSpacing.before !== undefined) {\n para.setSpaceBefore(standardParagraphSpacing.before);\n normalized++;\n }\n if (standardParagraphSpacing.after !== undefined) {\n para.setSpaceAfter(standardParagraphSpacing.after);\n normalized++;\n }\n }\n\n if (standardLineSpacing !== undefined) {\n para.setLineSpacing(standardLineSpacing, 'auto');\n normalized++;\n }\n\n // Remove trailing spaces from runs\n if (removeTrailingSpaces) {\n const runs = para.getRuns();\n if (runs.length > 0) {\n const lastRun = runs[runs.length - 1];\n if (lastRun) {\n const text = lastRun.getText();\n const trimmed = text.trimEnd();\n if (text !== trimmed) {\n lastRun.setText(trimmed);\n normalized++;\n }\n }\n }\n }\n }\n\n // Also process tables\n for (const table of this.getTables()) {\n for (const row of table.getRows()) {\n for (const cell of row.getCells()) {\n const cellParagraphs = cell instanceof TableCell ? cell.getParagraphs() : [];\n for (const para of cellParagraphs) {\n if (standardParagraphSpacing) {\n if (standardParagraphSpacing.before !== undefined) {\n para.setSpaceBefore(standardParagraphSpacing.before);\n normalized++;\n }\n if (standardParagraphSpacing.after !== undefined) {\n para.setSpaceAfter(standardParagraphSpacing.after);\n normalized++;\n }\n }\n\n if (standardLineSpacing !== undefined) {\n para.setLineSpacing(standardLineSpacing, 'auto');\n normalized++;\n }\n\n if (removeTrailingSpaces) {\n const runs = para.getRuns();\n if (runs.length > 0) {\n const lastRun = runs[runs.length - 1];\n if (lastRun) {\n const text = lastRun.getText();\n const trimmed = text.trimEnd();\n if (text !== trimmed) {\n lastRun.setText(trimmed);\n normalized++;\n }\n }\n }\n }\n }\n }\n }\n }\n\n return { removed, normalized };\n }\n\n /**\n * Sets the document language\n * @param language - Language code (e.g., 'en-US', 'es-ES', 'fr-FR')\n * @returns This document for chaining\n */\n setLanguage(language: string): this {\n // Store language in properties for core.xml\n if (!this.properties) {\n this.properties = {};\n }\n this.properties.language = language;\n\n return this;\n }\n\n /**\n * Gets the document language code\n *\n * @returns Language code (e.g., 'en-US', 'fr-FR') or undefined if not set\n *\n * @example\n * ```typescript\n * const lang = doc.getLanguage();\n * if (lang) {\n * console.log(`Document language: ${lang}`);\n * }\n * ```\n */\n getLanguage(): string | undefined {\n return this.properties?.language;\n }\n\n /**\n * Removes all SDT (Structured Document Tag) wrappers from the document body,\n * unwrapping their content. Used internally by rebuildTOCs.\n * @private\n */\n private clearCustom(): void {\n const unwrappedBody: BodyElement[] = [];\n\n const unwrapSDT = (sdt: StructuredDocumentTag, target: BodyElement[]) => {\n for (const item of sdt.getContent()) {\n if (item instanceof Paragraph || item instanceof Table) {\n target.push(item);\n } else if (item instanceof StructuredDocumentTag) {\n unwrapSDT(item, target);\n }\n }\n };\n\n for (const element of this.bodyElements) {\n if (element instanceof StructuredDocumentTag) {\n unwrapSDT(element, unwrappedBody);\n } else {\n unwrappedBody.push(element);\n }\n }\n\n this.bodyElements = unwrappedBody;\n }\n\n /**\n * Rebuilds all Table of Contents in the document\n *\n * Analyzes each TOC in the document, parses its field instructions to determine\n * which heading levels to include, searches for matching headings (including those\n * in nested tables), and returns a summary of TOC instructions and heading counts.\n *\n * **NEW: This method now also populates the TOCs with hyperlinked entries automatically!**\n *\n * The method:\n * 1. Removes SDT wrappers around tables if found (uses clearCustom helper)\n * 2. Ensures `_top` bookmark exists at document start for TOC linking\n * 3. Scans document.xml for all TOC field instructions\n * 4. For each TOC, parses the instruction to extract heading levels\n * 5. Finds all matching headings (searches body AND nested tables)\n * 6. **Generates bookmarks for headings that don't have them**\n * 7. **Creates hyperlinked TOC entries pointing to those bookmarks**\n * 8. **Populates the TOC with entries (Verdana 12pt, blue, underlined, no page numbers)**\n * 9. **Updates document.xml with the populated TOC**\n * 10. Retains field instructions so TOCs can be manually updated later\n * 11. Returns summary: [instruction, [h1Count, h2Count, h3Count, ...]]\n *\n * **Key Features:**\n * - No arguments required - analyzes the current document state\n * - Searches nested tables when counting headings\n * - Automatically removes SDT wrappers that interfere with TOC population\n * - Ensures `_top` bookmark exists for document-top linking\n * - **Automatically populates TOCs with clickable hyperlink entries**\n * - **TOCs display correctly on first open without manual update**\n * - **Field instructions preserved for manual updates**\n * - **No page numbers displayed (pure hyperlink navigation)**\n * - Returns summary data for diagnostics and verification\n *\n * **Output Format:**\n * Returns a 2D array where each row contains:\n * - Index 0: The TOC field instruction text (e.g., \"TOC \\\\o \\\"1-3\\\"\")\n * - Index 1: Array of heading counts by level (e.g., [5, 12, 8] = 5 H1s, 12 H2s, 8 H3s)\n *\n * @returns Two-dimensional array of [instruction, headingCounts[]] for each TOC\n *\n * @example\n * ```typescript\n * const doc = await Document.load('document.docx');\n * const tocInfo = doc.rebuildTOCs();\n *\n * console.log(`Found ${tocInfo.length} Table(s) of Contents`);\n * for (const [instruction, counts] of tocInfo) {\n * console.log(`TOC Instruction: ${instruction}`);\n * counts.forEach((count, level) => {\n * if (count > 0) {\n * console.log(` Heading ${level + 1}: ${count} found`);\n * }\n * });\n * }\n *\n * // TOCs are now populated with hyperlinks - save the document\n * await doc.save('output.docx');\n * // When opened in Word, TOCs will display with clickable links, no manual update needed\n * ```\n *\n * @example\n * ```typescript\n * // Rebuild TOCs and save with populated entries\n * const doc = await Document.load('input.docx');\n * const tocSummary = doc.rebuildTOCs();\n * await doc.save('output.docx');\n *\n * console.log(`Processed ${tocSummary.length} TOCs with hyperlinked entries`);\n * ```\n */\n public rebuildTOCs(): [string, number[]][] {\n const results: [string, number[]][] = [];\n\n // Step 1: Remove SDT wrappers around tables if found (helper already exists)\n this.clearCustom();\n\n // Step 2: Ensure _top bookmark exists at document start\n this.addTopBookmark();\n\n // Step 3: Get document.xml to scan for TOC elements\n const docXml = this.zipHandler.getFileAsString('word/document.xml');\n if (!docXml) {\n return results;\n }\n\n // Step 4: Find all TOC SDT elements\n const tocRegex = /<w:sdt>[\\s\\S]*?<w:docPartGallery w:val=\"Table of Contents\"[\\s\\S]*?<\\/w:sdt>/g;\n const tocMatches = Array.from(docXml.matchAll(tocRegex));\n\n if (tocMatches.length === 0) {\n return results;\n }\n\n // Step 5: For each TOC, parse instructions and count headings\n for (const match of tocMatches) {\n try {\n const tocXml = match[0];\n\n // Extract field instruction\n const instrMatch = /<w:instrText[^>]*>([\\s\\S]*?)<\\/w:instrText>/.exec(tocXml);\n if (!instrMatch?.[1]) {\n continue;\n }\n\n // TypeScript type narrowing: assign to const variable\n const instrText = instrMatch[1];\n\n // Decode XML entities\n const fieldInstruction = instrText\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '\"')\n .replace(/'/g, \"'\");\n\n // Parse the instruction to get heading levels\n const levels = this.parseTOCFieldInstruction(fieldInstruction);\n\n // Find all headings in document (including nested tables)\n const headings = this.findHeadingsForTOCFromXML(docXml, levels);\n\n // Count headings by level (create array with counts for each level 1-9)\n const headingCounts: number[] = [0, 0, 0, 0, 0, 0, 0, 0, 0]; // Indices 0-8 for levels 1-9\n\n for (const heading of headings) {\n if (heading.level >= 1 && heading.level <= 9) {\n const index = heading.level - 1;\n headingCounts[index] = (headingCounts[index] || 0) + 1;\n }\n }\n\n // Add to results: [instruction, counts]\n results.push([fieldInstruction, headingCounts]);\n } catch (error: unknown) {\n // Skip this TOC on error\n this.logger.warn(\n 'Error processing TOC in rebuildTOCs',\n error instanceof Error\n ? { message: error.message, stack: error.stack }\n : { error: String(error) }\n );\n continue;\n }\n }\n\n // Step 6: Populate all TOCs in the document with hyperlinked entries\n // This modifies the XML to include pre-populated TOC entries with hyperlinks\n const populatedXml = this.populateAllTOCsInXML(docXml);\n\n // Step 7: Update document.xml with the populated TOCs\n if (populatedXml !== docXml) {\n this.zipHandler.updateFile('word/document.xml', populatedXml);\n\n this.logger.info(`Successfully populated ${results.length} TOC(s) with hyperlinked entries`);\n }\n\n return results;\n }\n\n /**\n * Normalizes all table borders to a uniform style\n *\n * Applies consistent border styling to all tables in the document.\n * This is useful for fixing documents with inconsistent borders\n * (e.g., thick bottom borders on some tables).\n *\n * @param options - Border styling options\n * @param options.style - Border style (default: 'single')\n * @param options.size - Border size in eighths of a point (default: 4 = 0.5pt)\n * @param options.color - Border color in hex without # (default: '000000')\n * @returns Number of tables updated\n *\n * @example\n * ```typescript\n * // Apply default thin black borders to all tables\n * const count = doc.normalizeTableBorders();\n * console.log(`Normalized borders on ${count} tables`);\n *\n * // Custom border styling\n * doc.normalizeTableBorders({\n * style: 'single',\n * size: 8, // 1pt border\n * color: '333333' // Dark gray\n * });\n * ```\n */\n normalizeTableBorders(options?: {\n style?: 'single' | 'double' | 'dotted' | 'dashed' | 'thick' | 'none';\n size?: number;\n color?: string;\n }): number {\n const border: TableBorder = {\n style: options?.style ?? 'single',\n size: options?.size ?? 4,\n color: options?.color ?? '000000',\n };\n\n return this.applyBordersToAllTables(border);\n }\n\n /**\n * Replaces text in runs with optional formatting constraints\n *\n * Searches for text patterns and replaces them while optionally\n * constraining matches to runs with specific formatting (e.g., bold only).\n * Formatting is preserved after replacement.\n *\n * @param find - Text to find (string or regex)\n * @param replace - Replacement text\n * @param options - Search options\n * @param options.matchBold - Only match text in bold runs (default: false)\n * @param options.matchItalic - Only match text in italic runs (default: false)\n * @param options.matchCase - Case-sensitive search (default: false)\n * @returns Number of replacements made\n *\n * @example\n * ```typescript\n * // Replace \"Parent SOP:\" with \"Parent Document:\" only in bold text\n * const count = doc.replaceFormattedText('Parent SOP:', 'Parent Document:', {\n * matchBold: true\n * });\n * console.log(`Replaced ${count} occurrences`);\n *\n * // Case-sensitive replacement\n * doc.replaceFormattedText('OLD_VALUE', 'NEW_VALUE', {\n * matchCase: true\n * });\n * ```\n */\n replaceFormattedText(\n find: string,\n replace: string,\n options?: {\n matchBold?: boolean;\n matchItalic?: boolean;\n matchCase?: boolean;\n }\n ): number {\n let replacedCount = 0;\n const matchBold = options?.matchBold ?? false;\n const matchItalic = options?.matchItalic ?? false;\n const matchCase = options?.matchCase ?? false;\n\n // Create regex pattern\n const pattern = matchCase\n ? new RegExp(find.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'), 'g')\n : new RegExp(find.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'), 'gi');\n\n // Process body paragraphs\n for (const para of this.getAllParagraphs()) {\n for (const run of para.getRuns()) {\n const text = run.getText();\n if (!text) continue;\n\n // Check formatting constraints\n const formatting = run.getFormatting();\n if (matchBold && !formatting.bold) continue;\n if (matchItalic && !formatting.italic) continue;\n\n // Perform replacement\n if (pattern.test(text)) {\n const newText = text.replace(pattern, replace);\n if (newText !== text) {\n run.setText(newText);\n replacedCount++;\n }\n }\n // Reset regex lastIndex for next iteration\n pattern.lastIndex = 0;\n }\n }\n\n // Process paragraphs inside table cells\n for (const table of this.getTables()) {\n for (const row of table.getRows()) {\n for (const cell of row.getCells()) {\n for (const para of cell.getParagraphs()) {\n for (const run of para.getRuns()) {\n const text = run.getText();\n if (!text) continue;\n\n // Check formatting constraints\n const runFormatting = run.getFormatting();\n if (matchBold && !runFormatting.bold) continue;\n if (matchItalic && !runFormatting.italic) continue;\n\n // Perform replacement\n if (pattern.test(text)) {\n const newText = text.replace(pattern, replace);\n if (newText !== text) {\n run.setText(newText);\n replacedCount++;\n }\n }\n // Reset regex lastIndex for next iteration\n pattern.lastIndex = 0;\n }\n }\n }\n }\n }\n\n return replacedCount;\n }\n\n /**\n * Creates an empty document with minimal structure\n *\n * Creates a new document with only the essential parts required\n * for a valid DOCX file, without any default content or styling.\n * Useful for building documents from scratch programmatically.\n *\n * @returns New empty Document instance\n *\n * @example\n * ```typescript\n * const doc = Document.createEmpty();\n * // Document has minimal structure, ready for content\n * doc.createParagraph('First paragraph');\n * await doc.save('minimal.docx');\n * ```\n */\n static createEmpty(): Document {\n const doc = new Document(undefined, {}, false); // Don't init defaults\n\n // Add only the absolute minimum required files\n const zipHandler = doc.getZipHandler();\n\n // [Content_Types].xml - minimal\n zipHandler.addFile(\n '[Content_Types].xml',\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n' +\n '<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">\\n' +\n ' <Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/>\\n' +\n ' <Default Extension=\"xml\" ContentType=\"application/xml\"/>\\n' +\n ' <Override PartName=\"/word/document.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml\"/>\\n' +\n '</Types>'\n );\n\n // _rels/.rels - only reference parts that actually exist\n zipHandler.addFile(\n '_rels/.rels',\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n' +\n '<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\\n' +\n ' <Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\" Target=\"word/document.xml\"/>\\n' +\n '</Relationships>'\n );\n\n // word/document.xml - empty body\n zipHandler.addFile(\n 'word/document.xml',\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n' +\n '<w:document xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\">\\n' +\n ' <w:body/>\\n' +\n '</w:document>'\n );\n\n // word/_rels/document.xml.rels - empty relationships\n zipHandler.addFile(\n 'word/_rels/document.xml.rels',\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n' +\n '<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"/>'\n );\n\n return doc;\n }\n}\n"]}