docxmlater 10.3.5 → 10.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (185) hide show
  1. package/README.md +158 -7
  2. package/dist/core/Document.d.ts +102 -3
  3. package/dist/core/Document.d.ts.map +1 -1
  4. package/dist/core/Document.js +775 -50
  5. package/dist/core/Document.js.map +1 -1
  6. package/dist/core/DocumentContent.d.ts.map +1 -1
  7. package/dist/core/DocumentContent.js +0 -8
  8. package/dist/core/DocumentContent.js.map +1 -1
  9. package/dist/core/DocumentGenerator.d.ts.map +1 -1
  10. package/dist/core/DocumentGenerator.js +9 -5
  11. package/dist/core/DocumentGenerator.js.map +1 -1
  12. package/dist/core/DocumentParser.d.ts.map +1 -1
  13. package/dist/core/DocumentParser.js +588 -102
  14. package/dist/core/DocumentParser.js.map +1 -1
  15. package/dist/core/RelationshipManager.d.ts.map +1 -1
  16. package/dist/core/RelationshipManager.js +4 -3
  17. package/dist/core/RelationshipManager.js.map +1 -1
  18. package/dist/elements/Bookmark.d.ts +7 -0
  19. package/dist/elements/Bookmark.d.ts.map +1 -1
  20. package/dist/elements/Bookmark.js +24 -4
  21. package/dist/elements/Bookmark.js.map +1 -1
  22. package/dist/elements/BookmarkManager.d.ts.map +1 -1
  23. package/dist/elements/BookmarkManager.js +4 -3
  24. package/dist/elements/BookmarkManager.js.map +1 -1
  25. package/dist/elements/CommonTypes.d.ts +2 -2
  26. package/dist/elements/CommonTypes.d.ts.map +1 -1
  27. package/dist/elements/CommonTypes.js +14 -1
  28. package/dist/elements/CommonTypes.js.map +1 -1
  29. package/dist/elements/Field.d.ts +1 -1
  30. package/dist/elements/Field.d.ts.map +1 -1
  31. package/dist/elements/Field.js +1 -1
  32. package/dist/elements/Field.js.map +1 -1
  33. package/dist/elements/Footer.d.ts +2 -0
  34. package/dist/elements/Footer.d.ts.map +1 -1
  35. package/dist/elements/Footer.js +6 -0
  36. package/dist/elements/Footer.js.map +1 -1
  37. package/dist/elements/Header.d.ts +2 -0
  38. package/dist/elements/Header.d.ts.map +1 -1
  39. package/dist/elements/Header.js +6 -0
  40. package/dist/elements/Header.js.map +1 -1
  41. package/dist/elements/Image.d.ts +1 -0
  42. package/dist/elements/Image.d.ts.map +1 -1
  43. package/dist/elements/Image.js +17 -2
  44. package/dist/elements/Image.js.map +1 -1
  45. package/dist/elements/Paragraph.d.ts +81 -1
  46. package/dist/elements/Paragraph.d.ts.map +1 -1
  47. package/dist/elements/Paragraph.js +515 -21
  48. package/dist/elements/Paragraph.js.map +1 -1
  49. package/dist/elements/Revision.d.ts +0 -1
  50. package/dist/elements/Revision.d.ts.map +1 -1
  51. package/dist/elements/Revision.js +0 -12
  52. package/dist/elements/Revision.js.map +1 -1
  53. package/dist/elements/RevisionManager.d.ts +0 -1
  54. package/dist/elements/RevisionManager.d.ts.map +1 -1
  55. package/dist/elements/RevisionManager.js +0 -2
  56. package/dist/elements/RevisionManager.js.map +1 -1
  57. package/dist/elements/Run.d.ts +16 -4
  58. package/dist/elements/Run.d.ts.map +1 -1
  59. package/dist/elements/Run.js +114 -22
  60. package/dist/elements/Run.js.map +1 -1
  61. package/dist/elements/Section.d.ts +7 -1
  62. package/dist/elements/Section.d.ts.map +1 -1
  63. package/dist/elements/Section.js +185 -4
  64. package/dist/elements/Section.js.map +1 -1
  65. package/dist/elements/Shape.js.map +1 -1
  66. package/dist/elements/Table.d.ts +30 -1
  67. package/dist/elements/Table.d.ts.map +1 -1
  68. package/dist/elements/Table.js +357 -40
  69. package/dist/elements/Table.js.map +1 -1
  70. package/dist/elements/TableCell.d.ts +3 -0
  71. package/dist/elements/TableCell.d.ts.map +1 -1
  72. package/dist/elements/TableCell.js +30 -3
  73. package/dist/elements/TableCell.js.map +1 -1
  74. package/dist/elements/TableGridChange.d.ts +0 -1
  75. package/dist/elements/TableGridChange.d.ts.map +1 -1
  76. package/dist/elements/TableGridChange.js +0 -10
  77. package/dist/elements/TableGridChange.js.map +1 -1
  78. package/dist/elements/TableRow.d.ts +4 -0
  79. package/dist/elements/TableRow.d.ts.map +1 -1
  80. package/dist/elements/TableRow.js +31 -3
  81. package/dist/elements/TableRow.js.map +1 -1
  82. package/dist/formatting/AbstractNumbering.d.ts +5 -0
  83. package/dist/formatting/AbstractNumbering.d.ts.map +1 -1
  84. package/dist/formatting/AbstractNumbering.js +22 -0
  85. package/dist/formatting/AbstractNumbering.js.map +1 -1
  86. package/dist/formatting/NumberingLevel.d.ts.map +1 -1
  87. package/dist/formatting/NumberingLevel.js +3 -3
  88. package/dist/formatting/NumberingLevel.js.map +1 -1
  89. package/dist/formatting/Style.d.ts +1 -0
  90. package/dist/formatting/Style.d.ts.map +1 -1
  91. package/dist/formatting/Style.js +25 -59
  92. package/dist/formatting/Style.js.map +1 -1
  93. package/dist/formatting/StylesManager.d.ts +1 -0
  94. package/dist/formatting/StylesManager.d.ts.map +1 -1
  95. package/dist/formatting/StylesManager.js +12 -0
  96. package/dist/formatting/StylesManager.js.map +1 -1
  97. package/dist/helpers/CleanupHelper.js.map +1 -1
  98. package/dist/images/ImageOptimizer.d.ts.map +1 -1
  99. package/dist/images/ImageOptimizer.js +0 -1
  100. package/dist/images/ImageOptimizer.js.map +1 -1
  101. package/dist/index.d.ts +1 -1
  102. package/dist/index.d.ts.map +1 -1
  103. package/dist/index.js.map +1 -1
  104. package/dist/managers/DrawingManager.d.ts.map +1 -1
  105. package/dist/managers/DrawingManager.js +4 -2
  106. package/dist/managers/DrawingManager.js.map +1 -1
  107. package/dist/types/formatting.d.ts +2 -2
  108. package/dist/types/formatting.d.ts.map +1 -1
  109. package/dist/types/formatting.js.map +1 -1
  110. package/dist/utils/ChangelogGenerator.d.ts +2 -2
  111. package/dist/utils/ChangelogGenerator.d.ts.map +1 -1
  112. package/dist/utils/ChangelogGenerator.js +4 -5
  113. package/dist/utils/ChangelogGenerator.js.map +1 -1
  114. package/dist/utils/InMemoryRevisionAcceptor.d.ts.map +1 -1
  115. package/dist/utils/InMemoryRevisionAcceptor.js +0 -1
  116. package/dist/utils/InMemoryRevisionAcceptor.js.map +1 -1
  117. package/dist/utils/RevisionAwareProcessor.d.ts +2 -2
  118. package/dist/utils/RevisionAwareProcessor.d.ts.map +1 -1
  119. package/dist/utils/RevisionAwareProcessor.js +2 -2
  120. package/dist/utils/RevisionAwareProcessor.js.map +1 -1
  121. package/dist/utils/SelectiveRevisionAcceptor.d.ts +0 -2
  122. package/dist/utils/SelectiveRevisionAcceptor.d.ts.map +1 -1
  123. package/dist/utils/SelectiveRevisionAcceptor.js +0 -26
  124. package/dist/utils/SelectiveRevisionAcceptor.js.map +1 -1
  125. package/dist/utils/ShadingResolver.d.ts.map +1 -1
  126. package/dist/utils/ShadingResolver.js.map +1 -1
  127. package/dist/utils/acceptRevisions.js +1 -1
  128. package/dist/utils/acceptRevisions.js.map +1 -1
  129. package/dist/utils/stripTrackedChanges.js +1 -1
  130. package/dist/utils/stripTrackedChanges.js.map +1 -1
  131. package/dist/utils/units.d.ts.map +1 -1
  132. package/dist/utils/units.js +1 -1
  133. package/dist/utils/units.js.map +1 -1
  134. package/dist/validation/RevisionAutoFixer.d.ts +2 -1
  135. package/dist/validation/RevisionAutoFixer.d.ts.map +1 -1
  136. package/dist/validation/RevisionAutoFixer.js.map +1 -1
  137. package/package.json +10 -1
  138. package/src/constants/CLAUDE.md +28 -0
  139. package/src/core/CLAUDE.md +4 -0
  140. package/src/core/Document.ts +1888 -137
  141. package/src/core/DocumentContent.ts +0 -11
  142. package/src/core/DocumentGenerator.ts +11 -12
  143. package/src/core/DocumentParser.ts +620 -139
  144. package/src/core/RelationshipManager.ts +6 -3
  145. package/src/elements/Bookmark.ts +39 -4
  146. package/src/elements/BookmarkManager.ts +4 -3
  147. package/src/elements/CLAUDE.md +18 -2
  148. package/src/elements/CommonTypes.ts +35 -8
  149. package/src/elements/Field.ts +1 -1
  150. package/src/elements/Footer.ts +23 -0
  151. package/src/elements/Header.ts +25 -0
  152. package/src/elements/Image.ts +28 -5
  153. package/src/elements/Paragraph.ts +1069 -41
  154. package/src/elements/Revision.ts +0 -19
  155. package/src/elements/RevisionManager.ts +1 -3
  156. package/src/elements/Run.ts +265 -35
  157. package/src/elements/Section.ts +214 -8
  158. package/src/elements/Shape.ts +1 -1
  159. package/src/elements/Table.ts +850 -61
  160. package/src/elements/TableCell.ts +84 -10
  161. package/src/elements/TableGridChange.ts +2 -16
  162. package/src/elements/TableRow.ts +94 -9
  163. package/src/formatting/AbstractNumbering.ts +42 -1
  164. package/src/formatting/CLAUDE.md +4 -0
  165. package/src/formatting/NumberingLevel.ts +11 -7
  166. package/src/formatting/Style.ts +39 -71
  167. package/src/formatting/StylesManager.ts +36 -0
  168. package/src/helpers/CleanupHelper.ts +1 -1
  169. package/src/images/ImageOptimizer.ts +0 -3
  170. package/src/index.ts +1 -1
  171. package/src/managers/DrawingManager.ts +5 -3
  172. package/src/tracking/CLAUDE.md +30 -0
  173. package/src/types/CLAUDE.md +39 -0
  174. package/src/types/formatting.ts +2 -2
  175. package/src/utils/CLAUDE.md +15 -0
  176. package/src/utils/ChangelogGenerator.ts +4 -5
  177. package/src/utils/InMemoryRevisionAcceptor.ts +0 -9
  178. package/src/utils/RevisionAwareProcessor.ts +2 -3
  179. package/src/utils/SelectiveRevisionAcceptor.ts +0 -39
  180. package/src/utils/ShadingResolver.ts +0 -1
  181. package/src/utils/acceptRevisions.ts +1 -1
  182. package/src/utils/stripTrackedChanges.ts +1 -1
  183. package/src/utils/units.ts +2 -1
  184. package/src/validation/CLAUDE.md +40 -0
  185. package/src/validation/RevisionAutoFixer.ts +2 -1
@@ -1 +1 @@
1
- {"version":3,"file":"Paragraph.js","sourceRoot":"","sources":["../../src/elements/Paragraph.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Paragraph - Represents a paragraph in a Word document\n * Contains one or more runs of formatted text\n */\n\nimport { deepClone } from '../utils/deepClone';\nimport { formatDateForXml } from '../utils/dateFormatting';\nimport { logParagraphContent, logTextDirection } from '../utils/diagnostics';\nimport { defaultLogger } from '../utils/logger';\nimport { XMLBuilder, XMLElement } from '../xml/XMLBuilder';\nimport { Bookmark } from './Bookmark';\nimport type { Comment } from './Comment';\nimport {\n // Import common types\n ParagraphAlignment as CommonParagraphAlignment,\n BorderStyle as CommonBorderStyle,\n ShadingPattern as CommonShadingPattern,\n BasicShadingPattern,\n TabAlignment as CommonTabAlignment,\n TabLeader as CommonTabLeader,\n TextDirection as CommonTextDirection,\n TextVerticalAlignment,\n BorderDefinition as CommonBorderDefinition,\n TabStop as CommonTabStop,\n ShadingConfig,\n buildShadingAttributes,\n} from './CommonTypes';\nimport { ComplexField, Field } from './Field';\nimport { Hyperlink } from './Hyperlink';\nimport { RangeMarker } from './RangeMarker';\nimport { Revision } from './Revision';\nimport { Run, RunFormatting } from './Run';\nimport { Shape } from './Shape';\nimport { TextBox } from './TextBox';\nimport { PreservedElement } from './PreservedElement';\n\n// ============================================================================\n// RE-EXPORTED TYPES (for backward compatibility)\n// These types are now defined in CommonTypes.ts but re-exported here\n// to maintain backward compatibility with existing imports.\n// ============================================================================\n\n/**\n * Paragraph alignment options\n * @see CommonTypes.ParagraphAlignment\n */\nexport type ParagraphAlignment = CommonParagraphAlignment;\n\n/**\n * Type to indicate ComplexField support in paragraph content\n */\nexport type FieldLike = Field | ComplexField;\n\n/**\n * Border style types for paragraph borders\n * @see CommonTypes.BorderStyle\n */\nexport type BorderStyle = CommonBorderStyle;\n\n/**\n * Shading pattern types (basic patterns without percentage fills)\n * @see CommonTypes.BasicShadingPattern for basic patterns\n * @see CommonTypes.ShadingPattern for full pattern set including percentages\n */\nexport type ShadingPattern = BasicShadingPattern;\n\n/**\n * Tab stop alignment types\n * @see CommonTypes.TabAlignment\n */\nexport type TabAlignment = CommonTabAlignment;\n\n/**\n * Tab stop leader types\n * @see CommonTypes.TabLeader\n */\nexport type TabLeader = CommonTabLeader;\n\n/**\n * Text direction types for paragraphs\n * @see CommonTypes.TextDirection\n */\nexport type TextDirection = CommonTextDirection;\n\n/**\n * Text vertical alignment types\n * @see CommonTypes.TextVerticalAlignment\n */\nexport type TextAlignment = TextVerticalAlignment;\n\n/**\n * Textbox tight wrap modes\n */\nexport type TextboxTightWrap =\n | 'none'\n | 'allLines'\n | 'firstAndLastLine'\n | 'firstLineOnly'\n | 'lastLineOnly';\n\n/**\n * Paragraph property change tracking (for revision history)\n */\nexport interface ParagraphPropertiesChange {\n /** Author of the change */\n author?: string;\n /** Date of the change */\n date?: string;\n /** Unique ID for this revision */\n id?: string;\n /** Previous paragraph properties before the change (stored as object) */\n previousProperties?: Partial<ParagraphFormatting>;\n}\n\n/**\n * Frame/text box properties\n */\nexport interface FrameProperties {\n /** Width in twips */\n w?: number;\n /** Height in twips */\n h?: number;\n /** Height rule */\n hRule?: 'auto' | 'atLeast' | 'exact';\n /** Absolute horizontal position in twips */\n x?: number;\n /** Absolute vertical position in twips */\n y?: number;\n /** Relative horizontal alignment */\n xAlign?: 'left' | 'center' | 'right' | 'inside' | 'outside';\n /** Relative vertical alignment */\n yAlign?: 'top' | 'center' | 'bottom' | 'inside' | 'outside';\n /** Horizontal anchor/positioning base */\n hAnchor?: 'page' | 'margin' | 'text';\n /** Vertical anchor/positioning base */\n vAnchor?: 'page' | 'margin' | 'text';\n /** Horizontal padding in twips */\n hSpace?: number;\n /** Vertical padding in twips */\n vSpace?: number;\n /** Text wrapping around frame */\n wrap?: 'around' | 'notBeside' | 'none' | 'tight';\n /** Drop cap style */\n dropCap?: 'none' | 'drop' | 'margin';\n /** Drop cap height in lines */\n lines?: number;\n /** Lock frame anchor to paragraph */\n anchorLock?: boolean;\n}\n\n/**\n * Single border definition\n */\nexport interface BorderDefinition {\n /** Border style */\n style?: BorderStyle;\n /** Border width in eighths of a point (1-96) */\n size?: number;\n /** Border color (hex without #) */\n color?: string;\n /** Space between border and text in points (0-31) */\n space?: number;\n}\n\n/**\n * Tab stop definition\n */\nexport interface TabStop {\n /** Position in twips */\n position: number;\n /** Alignment type */\n val?: TabAlignment;\n /** Leader character */\n leader?: TabLeader;\n}\n\n/**\n * Paragraph formatting options\n */\nexport interface ParagraphFormatting {\n /** Text alignment */\n alignment?: ParagraphAlignment;\n /** Indentation in twips (1/20th of a point) */\n indentation?: {\n left?: number;\n right?: number;\n firstLine?: number;\n hanging?: number;\n };\n /** Spacing in twips */\n spacing?: {\n before?: number;\n after?: number;\n line?: number;\n lineRule?: 'auto' | 'exact' | 'atLeast';\n };\n /** Keep with next paragraph */\n keepNext?: boolean;\n /** Keep lines together */\n keepLines?: boolean;\n /** Page break before */\n pageBreakBefore?: boolean;\n /** Paragraph style ID */\n style?: string;\n /** Numbering properties */\n numbering?: {\n numId: number;\n level: number;\n };\n /** Contextual spacing - removes spacing between paragraphs of same style */\n contextualSpacing?: boolean;\n /** Paragraph ID (Word 2010+) - required by modern Word for change tracking */\n paraId?: string;\n /** Paragraph borders (top, bottom, left, right, between, bar) */\n borders?: {\n top?: BorderDefinition;\n bottom?: BorderDefinition;\n left?: BorderDefinition;\n right?: BorderDefinition;\n between?: BorderDefinition;\n bar?: BorderDefinition;\n };\n /** Paragraph shading (background color and pattern) */\n shading?: ShadingConfig;\n /** Tab stops */\n tabs?: TabStop[];\n /** Widow/orphan control - prevents single lines at top/bottom of pages */\n widowControl?: boolean;\n /** Outline level (0-9) for table of contents hierarchy */\n outlineLevel?: number;\n /** Suppress line numbers for this paragraph */\n suppressLineNumbers?: boolean;\n /** Right-to-left paragraph layout (for Arabic, Hebrew, etc.) */\n bidi?: boolean;\n /** Text flow direction */\n textDirection?: TextDirection;\n /** Vertical text alignment */\n textAlignment?: TextAlignment;\n /** Use inside/outside indents instead of left/right (for double-sided printing) */\n mirrorIndents?: boolean;\n /** Auto-adjust right indent when document grid is defined */\n adjustRightInd?: boolean;\n /** Text frame/box properties (positioning, wrapping, drop cap) */\n framePr?: FrameProperties;\n /** Suppress automatic hyphenation for this paragraph */\n suppressAutoHyphens?: boolean;\n /** Kinsoku rules - CJK line-breaking rules per ECMA-376 Part 1 §17.3.1.16 */\n kinsoku?: boolean;\n /** Word wrap - allow CJK text to wrap mid-word per ECMA-376 Part 1 §17.3.1.45 */\n wordWrap?: boolean;\n /** Overflow punctuation - allow CJK punctuation to overhang margins per ECMA-376 Part 1 §17.3.1.24 */\n overflowPunct?: boolean;\n /** Top line punctuation - compress CJK punctuation at start of line per ECMA-376 Part 1 §17.3.1.43 */\n topLinePunct?: boolean;\n /** Auto space between East Asian and numeric text per ECMA-376 Part 1 §17.3.1.2 */\n autoSpaceDE?: boolean;\n /** Auto space between East Asian and Western text per ECMA-376 Part 1 §17.3.1.3 */\n autoSpaceDN?: boolean;\n /** Prevent text frames from overlapping */\n suppressOverlap?: boolean;\n /** Tight wrapping mode for text boxes */\n textboxTightWrap?: TextboxTightWrap;\n /** Associated HTML div ID (for HTML round-trip) */\n divId?: number;\n /** Conditional table style formatting (bitmask string, e.g., \"101000000100\") */\n cnfStyle?: string;\n /** Section properties at paragraph level (for section breaks) */\n sectPr?: string | Record<string, unknown>;\n /** Paragraph property change tracking (revision history) */\n pPrChange?: ParagraphPropertiesChange;\n /** Run properties for the paragraph mark (¶ symbol formatting) */\n paragraphMarkRunProperties?: RunFormatting;\n /** Paragraph mark deletion tracking (for deleted ¶ symbols) */\n paragraphMarkDeletion?: {\n /** Unique revision ID */\n id: number;\n /** Author who deleted the paragraph mark */\n author: string;\n /** Date when the paragraph mark was deleted */\n date: Date;\n };\n /** Paragraph mark insertion tracking (for inserted ¶ symbols) */\n paragraphMarkInsertion?: {\n /** Unique revision ID */\n id: number;\n /** Author who inserted the paragraph mark */\n author: string;\n /** Date when the paragraph mark was inserted */\n date: Date;\n };\n /** True when the original XML had numId=0 (explicitly suppressed numbering) */\n numberingSuppressed?: boolean;\n}\n\n/**\n * Paragraph content (runs, fields, hyperlinks, revisions, range markers, shapes, text boxes)\n */\nexport type ParagraphContent =\n | Run\n | FieldLike\n | Hyperlink\n | Revision\n | RangeMarker\n | Shape\n | TextBox\n | PreservedElement;\n\n// ============================================================================\n// TYPE GUARDS FOR ParagraphContent\n// These functions help with type narrowing when working with paragraph content\n// ============================================================================\n\n/**\n * Type guard: Check if content is a Run\n * @param content - Paragraph content item to check\n * @returns True if the content is a Run instance\n */\nexport function isRun(content: ParagraphContent): content is Run {\n return content instanceof Run;\n}\n\n/**\n * Type guard: Check if content is a Field (simple or complex)\n * @param content - Paragraph content item to check\n * @returns True if the content is a Field or ComplexField instance\n */\nexport function isField(content: ParagraphContent): content is FieldLike {\n return content instanceof Field || content instanceof ComplexField;\n}\n\n/**\n * Type guard: Check if content is a simple Field\n * @param content - Paragraph content item to check\n * @returns True if the content is a Field instance (not ComplexField)\n */\nexport function isSimpleField(content: ParagraphContent): content is Field {\n return content instanceof Field && !(content instanceof ComplexField);\n}\n\n/**\n * Type guard: Check if content is a ComplexField\n * @param content - Paragraph content item to check\n * @returns True if the content is a ComplexField instance\n */\nexport function isComplexField(content: ParagraphContent): content is ComplexField {\n return content instanceof ComplexField;\n}\n\n/**\n * Type guard: Check if content is a Hyperlink\n * @param content - Paragraph content item to check\n * @returns True if the content is a Hyperlink instance\n */\nexport function isHyperlink(content: ParagraphContent): content is Hyperlink {\n return content instanceof Hyperlink;\n}\n\n/**\n * Type guard: Check if content is a Revision\n * @param content - Paragraph content item to check\n * @returns True if the content is a Revision instance\n */\nexport function isRevision(content: ParagraphContent): content is Revision {\n return content instanceof Revision;\n}\n\n/**\n * Type guard: Check if content is a RangeMarker (bookmark start/end, comment start/end)\n * @param content - Paragraph content item to check\n * @returns True if the content is a RangeMarker instance\n */\nexport function isRangeMarker(content: ParagraphContent): content is RangeMarker {\n return content instanceof RangeMarker;\n}\n\n/**\n * Type guard: Check if content is a Shape\n * @param content - Paragraph content item to check\n * @returns True if the content is a Shape instance\n */\nexport function isShape(content: ParagraphContent): content is Shape {\n return content instanceof Shape;\n}\n\n/**\n * Type guard: Check if content is a TextBox\n * @param content - Paragraph content item to check\n * @returns True if the content is a TextBox instance\n */\nexport function isTextBox(content: ParagraphContent): content is TextBox {\n return content instanceof TextBox;\n}\n\n/**\n * Represents a paragraph in a document\n */\nexport class Paragraph {\n private content: ParagraphContent[] = [];\n public formatting: ParagraphFormatting;\n private bookmarksStart: Bookmark[] = [];\n private bookmarksEnd: Bookmark[] = [];\n private commentsStart: Comment[] = [];\n private commentsEnd: Comment[] = [];\n /** Internal flag to mark paragraph as preserved from removal operations */\n private _isPreserved = false;\n /** Tracking context for automatic change tracking */\n private trackingContext?: import('../tracking/TrackingContext').TrackingContext;\n /** Parent table cell reference (if paragraph is inside a table cell) */\n private _parentCell?: import('./TableCell').TableCell;\n /** StylesManager reference for conditional formatting resolution */\n private _stylesManager?: import('../formatting/StylesManager').StylesManager;\n /**\n * Internal flag to mark paragraph as part of a multi-paragraph field (e.g., TOC)\n * When true, assembleComplexFields() will skip processing this paragraph\n * to preserve the original field structure across paragraphs.\n * @internal\n */\n _isPartOfMultiParagraphField?: boolean;\n\n /**\n * Creates a new Paragraph\n * @param formatting - Paragraph formatting options\n */\n constructor(formatting: ParagraphFormatting = {}) {\n this.formatting = formatting;\n }\n\n /**\n * Sets the tracking context for automatic change tracking.\n * Called by Document when track changes is enabled.\n * @internal\n */\n _setTrackingContext(context: import('../tracking/TrackingContext').TrackingContext): void {\n this.trackingContext = context;\n }\n\n /**\n * Sets the parent cell reference for this paragraph.\n * Called by TableCell when adding paragraphs.\n * @internal\n */\n _setParentCell(cell: import('./TableCell').TableCell | undefined): void {\n this._parentCell = cell;\n }\n\n /**\n * Gets the parent cell reference for this paragraph.\n * @internal\n */\n _getParentCell(): import('./TableCell').TableCell | undefined {\n return this._parentCell;\n }\n\n /**\n * Checks if this paragraph is inside a table cell.\n * @returns True if paragraph has a parent cell\n */\n isInTableCell(): boolean {\n return this._parentCell !== undefined;\n }\n\n /**\n * Gets the table's cnfStyle (conditional formatting flags) for this paragraph.\n * Returns the cell's cnfStyle if in a table, or the paragraph's own cnfStyle.\n * @returns The cnfStyle string or undefined\n */\n getTableConditionalStyle(): string | undefined {\n // Cell cnfStyle takes precedence\n if (this._parentCell) {\n const cellFormatting = this._parentCell.getFormatting();\n if (cellFormatting.cnfStyle) {\n return cellFormatting.cnfStyle;\n }\n }\n // Fall back to paragraph's own cnfStyle\n return this.formatting.cnfStyle;\n }\n\n /**\n * Sets the StylesManager reference for conditional formatting resolution.\n * Called by Document/Table when adding paragraphs.\n * @internal\n */\n _setStylesManager(manager: import('../formatting/StylesManager').StylesManager): void {\n this._stylesManager = manager;\n }\n\n /**\n * Gets the StylesManager reference for conditional formatting resolution.\n * @internal\n */\n _getStylesManager(): import('../formatting/StylesManager').StylesManager | undefined {\n return this._stylesManager;\n }\n\n /**\n * Creates an empty detached paragraph\n * @returns New Paragraph instance\n * @example\n * const para = Paragraph.create();\n * para.addText('Added later');\n */\n static create(): Paragraph;\n\n /**\n * Creates a detached paragraph with formatting\n * @param formatting - Paragraph formatting options\n * @returns New Paragraph instance\n * @example\n * const para = Paragraph.create({ alignment: 'center' });\n */\n static create(formatting: ParagraphFormatting): Paragraph;\n\n /**\n * Creates a detached paragraph with text and optional formatting\n * @param text - Text content\n * @param formatting - Optional paragraph formatting\n * @returns New Paragraph instance\n * @example\n * const para = Paragraph.create('Hello World', { alignment: 'center' });\n */\n static create(text: string, formatting?: ParagraphFormatting): Paragraph;\n\n /**\n * Creates a detached paragraph (not yet added to a document)\n * @param textOrFormatting - Optional text content or paragraph formatting\n * @param formatting - Optional paragraph formatting (only used if first param is text)\n * @returns New Paragraph instance\n * @example\n * // Create with text and formatting\n * const para1 = Paragraph.create('Hello World', { alignment: 'center' });\n *\n * // Create with just formatting\n * const para2 = Paragraph.create({ alignment: 'right' });\n *\n * // Create empty\n * const para3 = Paragraph.create();\n *\n * // Add to document later\n * doc.addParagraph(para1);\n */\n static create(\n textOrFormatting?: string | ParagraphFormatting,\n formatting?: ParagraphFormatting\n ): Paragraph {\n // Handle overloaded parameters\n if (typeof textOrFormatting === 'string') {\n // First param is text\n const paragraph = new Paragraph(formatting);\n paragraph.addText(textOrFormatting);\n return paragraph;\n } else {\n // First param is formatting (or undefined)\n return new Paragraph(textOrFormatting);\n }\n }\n\n /**\n * Creates a detached paragraph with a specific style\n * @param text - Text content\n * @param styleId - Style ID (e.g., 'Heading1', 'Title')\n * @returns New Paragraph instance\n * @example\n * const heading = Paragraph.createWithStyle('Chapter 1', 'Heading1');\n * doc.addParagraph(heading);\n */\n static createWithStyle(text: string, styleId: string): Paragraph {\n const paragraph = new Paragraph({ style: styleId });\n paragraph.addText(text);\n return paragraph;\n }\n\n /**\n * Creates a detached empty paragraph\n * Useful for adding blank lines or spacing\n * @returns New empty Paragraph instance\n * @example\n * const blank = Paragraph.createEmpty();\n * doc.addParagraph(blank);\n */\n static createEmpty(): Paragraph {\n return new Paragraph();\n }\n\n /**\n * Creates a detached paragraph with formatted text\n * @param text - Text content\n * @param runFormatting - Run formatting (bold, italic, etc.)\n * @param paragraphFormatting - Paragraph formatting (alignment, spacing, etc.)\n * @returns New Paragraph instance\n * @example\n * const para = Paragraph.createFormatted(\n * 'Important Text',\n * { bold: true, color: 'FF0000' },\n * { alignment: 'center' }\n * );\n */\n static createFormatted(\n text: string,\n runFormatting?: RunFormatting,\n paragraphFormatting?: ParagraphFormatting\n ): Paragraph {\n const paragraph = new Paragraph(paragraphFormatting);\n paragraph.addText(text, runFormatting);\n return paragraph;\n }\n\n /**\n * Adds a Run to the paragraph\n *\n * Appends a Run instance to the paragraph's content. Runs are sequences\n * of text with uniform formatting.\n *\n * @param run - The Run instance to add\n * @returns This paragraph instance for method chaining\n *\n * @example\n * ```typescript\n * const para = new Paragraph();\n * const run = new Run('Bold text', { bold: true });\n * para.addRun(run);\n * ```\n */\n addRun(run: Run): this {\n // Set parent reference for setText tracking\n run._setParentParagraph(this);\n\n if (this.trackingContext?.isEnabled()) {\n // Wrap the run in an insert revision when tracking is enabled\n const revision = Revision.createInsertion(this.trackingContext.getAuthor(), run, new Date());\n this.trackingContext.getRevisionManager().register(revision);\n this.content.push(revision);\n } else {\n this.content.push(run);\n }\n return this;\n }\n\n /**\n * Adds a field to the paragraph (supports both Field and ComplexField)\n * @param field - Field or ComplexField to add\n * @returns This paragraph for chaining\n */\n addField(field: FieldLike): this {\n if (this.trackingContext?.isEnabled()) {\n // Fields need special handling - wrap in revision if the field has runs\n // For now, just add directly as complex fields have their own structure\n this.content.push(field);\n } else {\n this.content.push(field);\n }\n return this;\n }\n\n /**\n * Adds a complex field to the paragraph\n * @param field - ComplexField to add\n * @returns This paragraph for chaining\n */\n addComplexField(field: ComplexField): this {\n this.content.push(field);\n return this;\n }\n\n /**\n * Adds a hyperlink to the paragraph\n * @param urlOrHyperlink - URL string for new hyperlink, or existing Hyperlink object\n * @returns Hyperlink object for fluent chaining (when creating new), or this paragraph (when adding existing)\n *\n * @example\n * // Fluent API (new signature)\n * const link = para.addHyperlink('https://example.com');\n * link.setText('Visit Example');\n *\n * // Or use without URL\n * const link2 = para.addHyperlink();\n * link2.setUrl('https://example.com').setText('Link');\n *\n * // Legacy API (still supported)\n * const hyperlink = new Hyperlink({ url: 'https://example.com', text: 'Link' });\n * para.addHyperlink(hyperlink);\n */\n /**\n * Adds a hyperlink to the paragraph\n * @param url - Optional URL for the hyperlink\n * @returns Hyperlink object for fluent chaining\n */\n addHyperlink(url?: string): Hyperlink;\n /**\n * Adds an existing hyperlink to the paragraph\n * @param hyperlink - Existing Hyperlink object\n * @returns This paragraph for chaining\n */\n addHyperlink(hyperlink: Hyperlink): this;\n addHyperlink(urlOrHyperlink?: string | Hyperlink): Hyperlink | this {\n if (typeof urlOrHyperlink === 'string') {\n // New fluent API: create hyperlink from URL\n const hyperlink = new Hyperlink({ url: urlOrHyperlink, text: urlOrHyperlink });\n hyperlink._setParentParagraph(this);\n if (this.trackingContext?.isEnabled()) {\n const revision = Revision.createInsertion(\n this.trackingContext.getAuthor(),\n hyperlink,\n new Date()\n );\n this.trackingContext.getRevisionManager().register(revision);\n this.content.push(revision);\n } else {\n this.content.push(hyperlink);\n }\n return hyperlink;\n } else if (urlOrHyperlink instanceof Hyperlink) {\n // Legacy API: add existing hyperlink\n urlOrHyperlink._setParentParagraph(this);\n if (this.trackingContext?.isEnabled()) {\n const revision = Revision.createInsertion(\n this.trackingContext.getAuthor(),\n urlOrHyperlink,\n new Date()\n );\n this.trackingContext.getRevisionManager().register(revision);\n this.content.push(revision);\n } else {\n this.content.push(urlOrHyperlink);\n }\n return this;\n } else {\n // No argument: create empty hyperlink for fluent building\n const hyperlink = new Hyperlink({ text: 'Link' });\n hyperlink._setParentParagraph(this);\n if (this.trackingContext?.isEnabled()) {\n const revision = Revision.createInsertion(\n this.trackingContext.getAuthor(),\n hyperlink,\n new Date()\n );\n this.trackingContext.getRevisionManager().register(revision);\n this.content.push(revision);\n } else {\n this.content.push(hyperlink);\n }\n return hyperlink;\n }\n }\n\n /**\n * Adds a revision (tracked change) to the paragraph\n * @param revision - Revision to add\n * @returns This paragraph for chaining\n */\n addRevision(revision: Revision): this {\n this.content.push(revision);\n return this;\n }\n\n /**\n * Adds a range marker to the paragraph\n * Range markers mark the boundaries of moved, inserted, or deleted content\n * @param rangeMarker - Range marker to add\n * @returns This paragraph for chaining\n */\n addRangeMarker(rangeMarker: RangeMarker): this {\n this.content.push(rangeMarker);\n return this;\n }\n\n /**\n * Adds a shape to the paragraph\n * @param shape - Shape to add\n * @returns This paragraph for chaining\n * @example\n * const rect = Shape.createRectangle(inchesToEmus(2), inchesToEmus(1));\n * paragraph.addShape(rect);\n */\n addShape(shape: Shape): this {\n this.content.push(shape);\n return this;\n }\n\n /**\n * Adds a text box to the paragraph\n * @param textbox - TextBox to add\n * @returns This paragraph for chaining\n * @example\n * const textbox = TextBox.create(inchesToEmus(3), inchesToEmus(2));\n * paragraph.addTextBox(textbox);\n */\n addTextBox(textbox: TextBox): this {\n this.content.push(textbox);\n return this;\n }\n\n /**\n * Adds any ParagraphContent item to the paragraph\n * Used for preserved elements (proofErr, permStart/End, etc.)\n * @param item - Content item to add\n * @returns This paragraph for chaining\n */\n addContent(item: ParagraphContent): this {\n this.content.push(item);\n return this;\n }\n\n /**\n * Adds a bookmark start marker at the beginning of this paragraph\n * @param bookmark - Bookmark to add\n * @returns This paragraph for chaining\n */\n addBookmarkStart(bookmark: Bookmark): this {\n this.bookmarksStart.push(bookmark);\n return this;\n }\n\n /**\n * Adds a bookmark end marker at the end of this paragraph\n * @param bookmark - Bookmark to add (must have matching start marker)\n * @returns This paragraph for chaining\n */\n addBookmarkEnd(bookmark: Bookmark): this {\n this.bookmarksEnd.push(bookmark);\n return this;\n }\n\n /**\n * Adds both start and end bookmark markers (wraps entire paragraph)\n * @param bookmark - Bookmark to add\n * @returns This paragraph for chaining\n */\n addBookmark(bookmark: Bookmark): this {\n this.addBookmarkStart(bookmark);\n this.addBookmarkEnd(bookmark);\n return this;\n }\n\n /**\n * Gets all bookmarks that start in this paragraph\n * @returns Array of bookmarks\n */\n getBookmarksStart(): Bookmark[] {\n return [...this.bookmarksStart];\n }\n\n /**\n * Gets all bookmarks that end in this paragraph\n * @returns Array of bookmarks\n */\n getBookmarksEnd(): Bookmark[] {\n return [...this.bookmarksEnd];\n }\n\n /**\n * Removes a bookmark end marker by its ID\n * @param id - The bookmark ID to remove\n * @returns true if a bookmark was removed, false if not found\n */\n removeBookmarkEnd(id: number): boolean {\n const index = this.bookmarksEnd.findIndex((bm) => bm.getId() === id);\n if (index !== -1) {\n this.bookmarksEnd.splice(index, 1);\n return true;\n }\n return false;\n }\n\n /**\n * Adds a comment range start marker at the beginning of this paragraph\n * @param comment - Comment to start\n * @returns This paragraph for chaining\n */\n addCommentStart(comment: Comment): this {\n this.commentsStart.push(comment);\n return this;\n }\n\n /**\n * Adds a comment range end marker at the end of this paragraph\n * @param comment - Comment to end (must have matching start marker)\n * @returns This paragraph for chaining\n */\n addCommentEnd(comment: Comment): this {\n this.commentsEnd.push(comment);\n return this;\n }\n\n /**\n * Adds both start and end comment range markers (comments entire paragraph)\n * @param comment - Comment to add\n * @returns This paragraph for chaining\n */\n addComment(comment: Comment): this {\n this.addCommentStart(comment);\n this.addCommentEnd(comment);\n return this;\n }\n\n /**\n * Gets all comments that start in this paragraph\n * @returns Array of comments\n */\n getCommentsStart(): Comment[] {\n return [...this.commentsStart];\n }\n\n /**\n * Gets all comments that end in this paragraph\n * @returns Array of comments\n */\n getCommentsEnd(): Comment[] {\n return [...this.commentsEnd];\n }\n\n /**\n * Adds a page number field\n * @param formatting - Optional run formatting for the page number\n * @returns This paragraph for chaining\n * @example\n * paragraph.addPageNumber();\n * paragraph.addPageNumber({ bold: true, size: 12 });\n */\n addPageNumber(formatting?: RunFormatting): this {\n return this.addField(Field.createPageNumber(formatting));\n }\n\n /**\n * Adds a total pages field (NUMPAGES)\n * @param formatting - Optional run formatting\n * @returns This paragraph for chaining\n * @example\n * paragraph.addTotalPages();\n */\n addTotalPages(formatting?: RunFormatting): this {\n return this.addField(Field.createTotalPages(formatting));\n }\n\n /**\n * Adds a date field\n * @param format - Date format (e.g., 'MMMM d, yyyy', 'M/d/yyyy')\n * @param formatting - Optional run formatting\n * @returns This paragraph for chaining\n * @example\n * paragraph.addDate();\n * paragraph.addDate('MMMM d, yyyy');\n * paragraph.addDate('M/d/yyyy', { italic: true });\n */\n addDate(format?: string, formatting?: RunFormatting): this {\n return this.addField(Field.createDate(format, formatting));\n }\n\n /**\n * Adds a time field\n * @param format - Time format\n * @param formatting - Optional run formatting\n * @returns This paragraph for chaining\n * @example\n * paragraph.addTime();\n * paragraph.addTime('h:mm:ss tt');\n */\n addTime(format?: string, formatting?: RunFormatting): this {\n return this.addField(Field.createTime(format, formatting));\n }\n\n /**\n * Adds a filename field\n * @param includePath - Whether to include full path\n * @param formatting - Optional run formatting\n * @returns This paragraph for chaining\n * @example\n * paragraph.addFilename();\n * paragraph.addFilename(true); // Includes full path\n */\n addFilename(includePath = false, formatting?: RunFormatting): this {\n return this.addField(Field.createFilename(includePath, formatting));\n }\n\n /**\n * Adds an author field\n * @param formatting - Optional run formatting\n * @returns This paragraph for chaining\n * @example\n * paragraph.addAuthor();\n */\n addAuthor(formatting?: RunFormatting): this {\n return this.addField(Field.createAuthor(formatting));\n }\n\n /**\n * Adds a title field\n * @param formatting - Optional run formatting\n * @returns This paragraph for chaining\n * @example\n * paragraph.addTitle();\n */\n addTitle(formatting?: RunFormatting): this {\n return this.addField(Field.createTitle(formatting));\n }\n\n /**\n * Adds text to the paragraph with optional formatting\n *\n * Creates a new Run with the specified text and formatting, then adds it\n * to the paragraph. This is a convenience method combining Run creation\n * and addition in one call.\n *\n * @param text - The text content to add\n * @param formatting - Optional formatting to apply to the text\n * @returns This paragraph instance for method chaining\n *\n * @example\n * ```typescript\n * const para = new Paragraph();\n * para.addText('Normal text');\n * para.addText('Bold text', { bold: true });\n * para.addText('Red italic', { italic: true, color: 'FF0000' });\n * ```\n */\n addText(text: string, formatting?: RunFormatting): this {\n const run = new Run(text, formatting);\n // Set parent reference for setText tracking\n run._setParentParagraph(this);\n\n if (this.trackingContext?.isEnabled()) {\n // Wrap the run in an insert revision when tracking is enabled\n const revision = Revision.createInsertion(this.trackingContext.getAuthor(), run, new Date());\n this.trackingContext.getRevisionManager().register(revision);\n this.content.push(revision);\n } else {\n this.content.push(run);\n }\n return this;\n }\n\n /**\n * Sets the paragraph text content (replaces all existing content)\n *\n * Clears all existing runs, fields, hyperlinks, and other content,\n * then adds a single Run with the specified text and formatting.\n *\n * @param text - The new text content\n * @param formatting - Optional formatting to apply to the text\n * @returns This paragraph instance for method chaining\n *\n * @example\n * ```typescript\n * const para = new Paragraph();\n * para.addText('First text');\n * para.addText('More text');\n * para.setText('Replace all', { bold: true }); // Replaces everything\n * ```\n */\n setText(text: string, formatting?: RunFormatting): this {\n this.content = [new Run(text, formatting)];\n return this;\n }\n\n /**\n * Gets all Run instances in the paragraph\n *\n * Returns only Run objects, excluding other content types like fields,\n * hyperlinks, revisions, and range markers.\n *\n * @returns Array of Run instances\n *\n * @example\n * ```typescript\n * const runs = para.getRuns();\n * console.log(`Paragraph has ${runs.length} text runs`);\n *\n * // Apply formatting to all runs\n * for (const run of runs) {\n * run.setBold(true);\n * }\n * ```\n */\n getRuns(): Run[] {\n const runs: Run[] = [];\n for (const item of this.content) {\n if (item instanceof Run) {\n runs.push(item);\n } else if (item instanceof Revision) {\n // Extract runs from inside revisions (track changes)\n runs.push(...item.getRuns());\n } else if (item instanceof Hyperlink) {\n // Extract run from inside hyperlink\n runs.push(item.getRun());\n }\n }\n return runs;\n }\n\n /**\n * Gets all Revision instances in the paragraph\n *\n * Returns only Revision objects (tracked changes), excluding other content types.\n *\n * @returns Array of Revision instances\n *\n * @example\n * ```typescript\n * const revisions = para.getRevisions();\n * console.log(`Paragraph has ${revisions.length} tracked changes`);\n *\n * // Check each revision\n * for (const rev of revisions) {\n * console.log(`${rev.getType()} by ${rev.getAuthor()}`);\n * }\n * ```\n */\n getRevisions(): Revision[] {\n return this.content.filter((item): item is Revision => item instanceof Revision);\n }\n\n /**\n * Gets all content in the paragraph\n *\n * Returns all content items including runs, fields, hyperlinks,\n * revisions, range markers, shapes, and text boxes.\n *\n * @returns Array of all content items in order\n *\n * @example\n * ```typescript\n * const content = para.getContent();\n * for (const item of content) {\n * if (item instanceof Run) {\n * console.log('Text:', item.getText());\n * } else if (item instanceof Hyperlink) {\n * console.log('Link:', item.getUrl());\n * }\n * }\n * ```\n */\n getContent(): ParagraphContent[] {\n return [...this.content];\n }\n\n /**\n * Clears all content from the paragraph\n *\n * Removes all runs, hyperlinks, fields, revisions, and other content items.\n * The paragraph formatting is preserved.\n *\n * @returns This paragraph instance for method chaining\n *\n * @example\n * ```typescript\n * para.clearContent();\n * para.addText('Fresh start');\n * ```\n */\n clearContent(): this {\n if (this.trackingContext?.isEnabled() && this.content.length > 0) {\n // Wrap all existing content in delete revisions instead of removing\n const deletedContent: ParagraphContent[] = [];\n for (const item of this.content) {\n // Skip items that are already revisions (don't double-wrap)\n if (item instanceof Revision) {\n deletedContent.push(item);\n } else if (item instanceof Run || item instanceof Hyperlink) {\n const revision = Revision.createDeletion(\n this.trackingContext.getAuthor(),\n item,\n new Date()\n );\n this.trackingContext.getRevisionManager().register(revision);\n deletedContent.push(revision);\n } else {\n // For other content types (fields, etc.), just keep them\n // as they may have complex structures\n deletedContent.push(item);\n }\n }\n this.content = deletedContent;\n } else {\n this.content = [];\n }\n return this;\n }\n\n /**\n * Replaces a content item with one or more new items\n *\n * This is useful for tracked changes where a hyperlink needs to be replaced\n * with a deletion revision (containing old hyperlink) and insertion revision\n * (containing new hyperlink).\n *\n * @param oldItem - The item to replace (must be the exact same object reference)\n * @param newItems - The new items to insert in place of the old item\n * @returns true if the item was found and replaced, false if not found\n *\n * @example\n * ```typescript\n * // Replace a hyperlink with tracked changes\n * const deletion = Revision.createDeletion(author, [oldHyperlink]);\n * const insertion = Revision.createInsertion(author, [newHyperlink]);\n * para.replaceContent(hyperlink, [deletion, insertion]);\n * ```\n */\n replaceContent(oldItem: ParagraphContent, newItems: ParagraphContent[]): boolean {\n const index = this.content.indexOf(oldItem);\n if (index === -1) {\n return false;\n }\n\n // Replace the item with the new items\n this.content.splice(index, 1, ...newItems);\n return true;\n }\n\n /**\n * Sets all content of the paragraph, replacing existing content\n *\n * Used for bulk content operations like regrouping field runs\n * into ComplexField objects during parsing.\n *\n * @param content - Array of content items to set\n *\n * @example\n * ```typescript\n * // Replace all content with grouped items\n * para.setContent([run1, complexField, run2]);\n * ```\n */\n setContent(content: ParagraphContent[]): void {\n // If tracking is enabled and we have existing content, create delete revisions\n if (this.trackingContext?.isEnabled() && this.content.length > 0) {\n const deletedContent: ParagraphContent[] = [];\n for (const item of this.content) {\n if (item instanceof Revision) {\n deletedContent.push(item);\n } else if (item instanceof Run || item instanceof Hyperlink) {\n const revision = Revision.createDeletion(\n this.trackingContext.getAuthor(),\n item,\n new Date()\n );\n this.trackingContext.getRevisionManager().register(revision);\n deletedContent.push(revision);\n }\n }\n // New content array starts with deleted items followed by new items\n // But actually, for setContent we probably want to just replace\n // Keep the deletion revisions and add new content\n this.content = [...deletedContent, ...content];\n } else {\n this.content = [...content];\n }\n // Set parent reference for runs and hyperlinks in the content\n for (const item of this.content) {\n if (item instanceof Hyperlink) {\n item._setParentParagraph(this);\n } else if (item instanceof Run) {\n item._setParentParagraph(this);\n }\n }\n }\n\n /**\n * Removes a content item at the specified index\n *\n * When track changes is enabled, wraps the removed item in a delete revision\n * instead of actually removing it.\n *\n * @param index - Index of the item to remove\n * @returns The removed item, or undefined if index is out of bounds\n *\n * @example\n * ```typescript\n * const para = new Paragraph();\n * para.addText('First');\n * para.addText('Second');\n * para.removeContentAt(0); // Removes 'First'\n * ```\n */\n removeContentAt(index: number): ParagraphContent | undefined {\n if (index < 0 || index >= this.content.length) {\n return undefined;\n }\n\n const item = this.content[index];\n\n if (this.trackingContext?.isEnabled()) {\n // Wrap the item in a delete revision instead of removing\n if (item instanceof Run || item instanceof Hyperlink) {\n const revision = Revision.createDeletion(\n this.trackingContext.getAuthor(),\n item,\n new Date()\n );\n this.trackingContext.getRevisionManager().register(revision);\n this.content[index] = revision;\n }\n // For revisions and other types, leave them as-is\n } else {\n this.content.splice(index, 1);\n }\n\n return item;\n }\n\n /**\n * Gets the combined text content of the paragraph\n *\n * Concatenates text from all Runs and Hyperlinks in the paragraph,\n * excluding other content types like fields or revisions.\n *\n * @returns Combined text string from all text-bearing elements\n *\n * @example\n * ```typescript\n * const para = new Paragraph();\n * para.addText('Hello ');\n * para.addText('World');\n * console.log(para.getText()); // \"Hello World\"\n * ```\n */\n getText(): string {\n return this.content\n .filter((item): item is Run | Hyperlink => item instanceof Run || item instanceof Hyperlink)\n .map((item) => item.getText())\n .join('');\n }\n\n /**\n * Gets all fields in the paragraph (both Field and ComplexField)\n *\n * Returns all field instances including simple fields (`<w:fldSimple>`)\n * and complex fields (begin/separate/end structure).\n *\n * @returns Array of fields\n *\n * @example\n * ```typescript\n * const fields = para.getFields();\n * console.log(`P aragraph has ${fields.length} fields`);\n * for (const field of fields) {\n * console.log(`Instruction: ${field.getInstruction()}`);\n * }\n * ```\n */\n getFields(): FieldLike[] {\n return this.content.filter(\n (item): item is FieldLike => item instanceof Field || item instanceof ComplexField\n );\n }\n\n /**\n * Finds fields matching an instruction pattern\n *\n * Searches all fields and returns those whose instruction matches\n * the specified pattern (string or regex).\n *\n * @param pattern - Regex pattern or string to match against instruction\n * @returns Array of matching fields\n *\n * @example\n * ```typescript\n * // Find all PAGE fields\n * const pageFields = para.findFieldsByInstruction('PAGE');\n *\n * // Find all TOC fields\n * const tocFields = para.findFieldsByInstruction(/^TOC/i);\n *\n * // Find fields with specific switches\n * const hyperlinkedFields = para.findFieldsByInstruction(/\\\\h/);\n * ```\n */\n findFieldsByInstruction(pattern: string | RegExp): FieldLike[] {\n const regex = typeof pattern === 'string' ? new RegExp(pattern, 'i') : pattern;\n\n return this.getFields().filter((field) => {\n const instruction = field.getInstruction();\n return regex.test(instruction);\n });\n }\n\n /**\n * Removes all fields from the paragraph\n *\n * Filters out all Field and ComplexField instances, converting them\n * to plain text if they have result text.\n *\n * @returns Count of fields removed\n *\n * @example\n * ```typescript\n * const count = para.removeAllFields();\n * console.log(`Removed ${count} fields`);\n * ```\n */\n removeAllFields(): number {\n const originalLength = this.content.length;\n this.content = this.content.filter(\n (item) => !(item instanceof Field || item instanceof ComplexField)\n );\n return originalLength - this.content.length;\n }\n\n /**\n * Replaces a field with another field or text\n *\n * Swaps out an existing field with a replacement. If replacement is a string,\n * converts it to a Run.\n *\n * @param oldField - Field to replace\n * @param replacement - New field or text to insert\n * @returns True if replacement successful, false if field not found\n *\n * @example\n * ```typescript\n * const pageField = para.getFields()[0];\n * if (pageField) {\n * // Replace with text\n * para.replaceField(pageField, 'Page 1');\n *\n * // Or replace with another field\n * para.replaceField(pageField, Field.createDate());\n * }\n * ```\n */\n replaceField(oldField: FieldLike, replacement: FieldLike | string): boolean {\n const index = this.content.indexOf(oldField);\n if (index === -1) return false;\n\n if (typeof replacement === 'string') {\n this.content[index] = new Run(replacement);\n } else {\n this.content[index] = replacement;\n }\n return true;\n }\n\n /**\n * Gets a copy of the paragraph formatting\n *\n * Returns a copy of all formatting properties including alignment,\n * indentation, spacing, style, numbering, borders, shading, etc.\n *\n * @returns Copy of the paragraph formatting object\n *\n * @example\n * ```typescript\n * const formatting = para.getFormatting();\n * console.log(`Style: ${formatting.style}`);\n * console.log(`Alignment: ${formatting.alignment}`);\n * if (formatting.spacing) {\n * console.log(`Spacing before: ${formatting.spacing.before} twips`);\n * }\n * ```\n */\n getFormatting(): ParagraphFormatting {\n return { ...this.formatting };\n }\n\n // ============================================================================\n // Individual Formatting Getters\n // ============================================================================\n\n /**\n * Gets the left indentation in twips\n * @returns Left indent in twips or undefined if not set\n */\n getLeftIndent(): number | undefined {\n return this.formatting.indentation?.left;\n }\n\n /**\n * Gets the right indentation in twips\n * @returns Right indent in twips or undefined if not set\n */\n getRightIndent(): number | undefined {\n return this.formatting.indentation?.right;\n }\n\n /**\n * Gets the first line indentation in twips\n * @returns First line indent in twips or undefined if not set\n */\n getFirstLineIndent(): number | undefined {\n return this.formatting.indentation?.firstLine;\n }\n\n /**\n * Gets the hanging indentation in twips\n * @returns Hanging indent in twips or undefined if not set\n */\n getHangingIndent(): number | undefined {\n return this.formatting.indentation?.hanging;\n }\n\n /**\n * Gets the spacing before the paragraph in twips\n * @returns Space before in twips or undefined if not set\n */\n getSpaceBefore(): number | undefined {\n return this.formatting.spacing?.before;\n }\n\n /**\n * Gets the spacing after the paragraph in twips\n * @returns Space after in twips or undefined if not set\n */\n getSpaceAfter(): number | undefined {\n return this.formatting.spacing?.after;\n }\n\n /**\n * Gets the line spacing value\n * @returns Line spacing value or undefined if not set\n */\n getLineSpacing(): number | undefined {\n return this.formatting.spacing?.line;\n }\n\n /**\n * Gets the paragraph alignment\n * @returns Alignment ('left', 'center', 'right', 'justify') or undefined\n */\n getAlignment(): string | undefined {\n return this.formatting.alignment;\n }\n\n /**\n * Gets the keepNext property (keep with next paragraph)\n * @returns True if keepNext is set\n */\n getKeepNext(): boolean {\n return this.formatting.keepNext ?? false;\n }\n\n /**\n * Gets the keepLines property (keep lines together)\n * @returns True if keepLines is set\n */\n getKeepLines(): boolean {\n return this.formatting.keepLines ?? false;\n }\n\n /**\n * Gets the pageBreakBefore property\n * @returns True if page break before is set\n */\n getPageBreakBefore(): boolean {\n return this.formatting.pageBreakBefore ?? false;\n }\n\n /**\n * Gets the outline level for TOC headings\n * @returns Outline level (0-8) or undefined if not set\n */\n getOutlineLevel(): number | undefined {\n return this.formatting.outlineLevel;\n }\n\n /**\n * Gets the text direction\n * @returns Text direction or undefined if not set\n */\n getTextDirection(): string | undefined {\n return this.formatting.textDirection;\n }\n\n /**\n * Gets the widow/orphan control setting\n * @returns True if widow control is enabled\n */\n getWidowControl(): boolean {\n return this.formatting.widowControl ?? true; // Word defaults to true\n }\n\n /**\n * Gets the contextual spacing setting\n * @returns True if contextual spacing is enabled\n */\n getContextualSpacing(): boolean {\n return this.formatting.contextualSpacing ?? false;\n }\n\n // ============================================================================\n // Checker Methods (has*, is*, isEmpty)\n // ============================================================================\n\n /**\n * Checks if the paragraph has list numbering applied\n * @returns True if paragraph is part of a list\n */\n hasNumbering(): boolean {\n return this.formatting.numbering?.numId !== undefined && this.formatting.numbering.numId !== 0;\n }\n\n /**\n * Checks if numbering was explicitly suppressed in the original XML (numId=0).\n * This is different from having no numbering — it means the document author\n * intentionally overrode style-inherited numbering.\n * @returns True if numbering is explicitly suppressed\n */\n isNumberingSuppressed(): boolean {\n return this.formatting.numberingSuppressed === true;\n }\n\n /**\n * Checks if the paragraph contains any fields\n * @returns True if paragraph has fields\n */\n hasFields(): boolean {\n return this.getFields().length > 0;\n }\n\n /**\n * Checks if the paragraph has any bookmark start markers\n * @returns True if paragraph has bookmarks\n */\n hasBookmarks(): boolean {\n return this.getBookmarksStart().length > 0;\n }\n\n /**\n * Checks if the paragraph has any comment start markers\n * @returns True if paragraph has comments\n */\n hasComments(): boolean {\n return this.getCommentsStart().length > 0;\n }\n\n /**\n * Checks if the paragraph contains any revisions\n * @returns True if paragraph has revisions\n */\n hasRevisions(): boolean {\n return this.getRevisions().length > 0;\n }\n\n /**\n * Consolidates adjacent revisions of the same type, author, and within a time window.\n *\n * This addresses the \"random insertions and deletions\" problem where Word displays\n * many small revisions instead of consolidated ones. The method merges:\n * - Adjacent insertions from the same author within 1 second\n * - Adjacent deletions from the same author within 1 second\n *\n * **How it works:**\n * - Iterates through paragraph content\n * - When finding consecutive Revisions of same type/author within time window:\n * - Merges their content (Runs/Hyperlinks) into a single Revision\n * - Uses the earliest timestamp for the merged revision\n * - Non-revision content acts as a boundary (stops merging)\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 * @param timeWindowMs - Time window in milliseconds for consolidation (default: 1000ms)\n * @returns Number of revisions that were consolidated (merged)\n *\n * @example\n * ```typescript\n * // Before: Multiple separate insertions\n * para.addText('Hello '); // Creates w:ins #1\n * para.addText('World'); // Creates w:ins #2\n *\n * // Consolidate into single revision\n * const merged = para.consolidateRevisions();\n * console.log(`Consolidated ${merged} revisions`);\n * // Result: Single w:ins containing \"Hello World\"\n * ```\n */\n consolidateRevisions(timeWindowMs = 1000): number {\n if (!this.hasRevisions()) {\n return 0;\n }\n\n const consolidatedContent: ParagraphContent[] = [];\n let mergeCount = 0;\n let currentMergeGroup: Revision | null = null;\n\n for (const item of this.content) {\n if (item instanceof Revision) {\n // Check if we can merge with current group\n if (currentMergeGroup && this.canMergeRevisions(currentMergeGroup, item, timeWindowMs)) {\n // Merge this revision into the current group\n for (const content of item.getContent()) {\n currentMergeGroup.addContent(content);\n }\n mergeCount++;\n } else {\n // Start a new merge group\n if (currentMergeGroup) {\n consolidatedContent.push(currentMergeGroup);\n }\n // Clone the revision to avoid modifying the original\n currentMergeGroup = this.cloneRevision(item);\n }\n } else {\n // Non-revision content - acts as boundary\n if (currentMergeGroup) {\n consolidatedContent.push(currentMergeGroup);\n currentMergeGroup = null;\n }\n consolidatedContent.push(item);\n }\n }\n\n // Don't forget the last merge group\n if (currentMergeGroup) {\n consolidatedContent.push(currentMergeGroup);\n }\n\n // Only update content if we actually merged something\n if (mergeCount > 0) {\n this.content = consolidatedContent;\n }\n\n return mergeCount;\n }\n\n /**\n * Checks if two revisions can be merged based on type, author, and time window.\n * @private\n */\n private canMergeRevisions(rev1: Revision, rev2: Revision, timeWindowMs: number): boolean {\n // Must be same type (both insertions or both deletions)\n if (rev1.getType() !== rev2.getType()) {\n return false;\n }\n\n // Only merge insert/delete content revisions, not property changes\n const mergeableTypes: string[] = ['insert', 'delete', 'moveFrom', 'moveTo'];\n if (!mergeableTypes.includes(rev1.getType())) {\n return false;\n }\n\n // Must be same author\n if (rev1.getAuthor() !== rev2.getAuthor()) {\n return false;\n }\n\n // Must be within time window\n const timeDiff = Math.abs(rev1.getDate().getTime() - rev2.getDate().getTime());\n if (timeDiff > timeWindowMs) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Creates a shallow clone of a revision with cloned content array.\n * @private\n */\n private cloneRevision(revision: Revision): Revision {\n const cloned = new Revision({\n id: revision.getId(),\n author: revision.getAuthor(),\n date: revision.getDate(),\n type: revision.getType(),\n content: [...revision.getContent()],\n previousProperties: revision.getPreviousProperties(),\n newProperties: revision.getNewProperties(),\n moveId: revision.getMoveId(),\n moveLocation: revision.getMoveLocation(),\n location: revision.getLocation(),\n fieldContext: revision.getFieldContext(),\n });\n return cloned;\n }\n\n /**\n * Checks if the paragraph is empty (no text content)\n * @returns True if paragraph has no text\n */\n isEmpty(): boolean {\n return this.getText().trim().length === 0;\n }\n\n /**\n * Gets the paragraph style ID\n *\n * Returns the style identifier if a style is applied to this paragraph.\n *\n * @returns Style ID (e.g., 'Heading1', 'Normal') or undefined if no style is set\n *\n * @example\n * ```typescript\n * const style = para.getStyle();\n * if (style === 'Heading1') {\n * console.log('This is a heading paragraph');\n * }\n * ```\n */\n getStyle(): string | undefined {\n return this.formatting.style;\n }\n\n /**\n * Detects if this paragraph is a heading and returns its level (1-9)\n *\n * Detection is performed using multiple methods in order of reliability:\n * 1. **Style ID matching** - Checks for 'Heading1', 'Heading2', etc. (most reliable)\n * 2. **Outline level** - Uses ECMA-376 outlineLevel property (0-based, where 0 = H1)\n * 3. **Formatting heuristics** - Analyzes text size, boldness, and patterns\n *\n * @returns Heading level (1-9) if detected, null if not a heading\n *\n * @example\n * ```typescript\n * const para = doc.createParagraph('Chapter 1');\n * para.setStyle('Heading1');\n *\n * const level = para.detectHeadingLevel();\n * console.log(level); // 1\n *\n * // Use for TOC generation\n * for (const para of doc.getParagraphs()) {\n * const level = para.detectHeadingLevel();\n * if (level) {\n * console.log(`H${level}: ${para.getText()}`);\n * }\n * }\n * ```\n */\n detectHeadingLevel(): number | null {\n // Method 1: Check style ID (most reliable)\n const style = this.formatting.style;\n if (style) {\n const match = /^Heading(\\d)$/i.exec(style);\n if (match?.[1]) {\n const level = parseInt(match[1], 10);\n // Word supports Heading1-Heading9\n return level >= 1 && level <= 9 ? level : null;\n }\n }\n\n // Method 2: Check outline level (ECMA-376 property)\n // Per ECMA-376 Part 1 §17.3.1.20, outlineLevel is 0-based (0 = Level 1)\n if (this.formatting.outlineLevel !== undefined) {\n const level = this.formatting.outlineLevel + 1;\n return level >= 1 && level <= 9 ? level : null;\n }\n\n // Method 3: Formatting heuristics (least reliable, use as fallback)\n // Only attempt if paragraph has text\n const text = this.getText().trim();\n if (!text) return null;\n\n // Get formatting from first run (headings typically have uniform formatting)\n const runs = this.getRuns();\n if (runs.length === 0) return null;\n\n const firstRun = runs[0];\n if (!firstRun) return null;\n\n const fmt = firstRun.getFormatting();\n if (!fmt) return null;\n\n // Heuristic: Large bold text suggests a heading\n if (fmt.bold && fmt.size) {\n // H1: Very large (>= 24pt)\n if (fmt.size >= 24) return 1;\n // H2: Large (>= 20pt)\n if (fmt.size >= 20) return 2;\n // H3: Medium-large (>= 16pt)\n if (fmt.size >= 16) return 3;\n // H4-H6: Moderate size (14pt+)\n if (fmt.size >= 14) return 4;\n }\n\n // Additional heuristic: All caps bold text (common for headings)\n if (fmt.bold && fmt.allCaps && text.length < 100) {\n return 2; // Often used for section headings\n }\n\n // Not detected as a heading\n return null;\n }\n\n /**\n * Sets paragraph text alignment\n *\n * Controls how text is aligned within the paragraph boundaries.\n *\n * @param alignment - Alignment value ('left' | 'center' | 'right' | 'justify' | 'both')\n * @returns This paragraph instance for method chaining\n *\n * @example\n * ```typescript\n * para.setAlignment('center'); // Center-aligned\n * para.setAlignment('justify'); // Justified text\n * ```\n */\n setAlignment(alignment: ParagraphAlignment): this {\n const previousValue = this.formatting.alignment;\n this.formatting.alignment = alignment;\n if (this.trackingContext?.isEnabled() && previousValue !== alignment) {\n this.trackingContext.trackParagraphPropertyChange(\n this,\n 'alignment',\n previousValue,\n alignment\n );\n }\n return this;\n }\n\n /**\n * Sets left indentation\n *\n * WARNING: If this paragraph has numbering (is part of a list), setting\n * left indentation will be ignored as numbering controls indentation.\n * Use setNumbering() with different levels to change list indentation.\n *\n * @param twips - Indentation in twips (1/20th of a point)\n * @returns This paragraph for chaining\n *\n * @example\n * ```typescript\n * // For regular paragraphs\n * paragraph.setLeftIndent(720); // 0.5 inch indent\n *\n * // For list items, use numbering levels instead\n * paragraph.setNumbering(listId, 1); // Increases indent to level 1\n * ```\n */\n setLeftIndent(twips: number): this {\n if (this.formatting.numbering) {\n // Note: This will be cleared when setNumbering() was called or will be on next call\n // Still allow setting for edge cases, but it will have no effect\n defaultLogger.warn(\n 'Setting left indentation on a numbered paragraph has no effect. ' +\n 'Numbering controls indentation. Use different numbering levels to change indent.'\n );\n }\n const previousValue = this.formatting.indentation?.left;\n if (!this.formatting.indentation) {\n this.formatting.indentation = {};\n }\n this.formatting.indentation.left = twips;\n if (this.trackingContext?.isEnabled() && previousValue !== twips) {\n this.trackingContext.trackParagraphPropertyChange(\n this,\n 'indentation.left',\n previousValue,\n twips\n );\n }\n return this;\n }\n\n /**\n * Sets right indentation\n * @param twips - Indentation in twips\n * @returns This paragraph for chaining\n */\n setRightIndent(twips: number): this {\n const previousValue = this.formatting.indentation?.right;\n if (!this.formatting.indentation) {\n this.formatting.indentation = {};\n }\n this.formatting.indentation.right = twips;\n if (this.trackingContext?.isEnabled() && previousValue !== twips) {\n this.trackingContext.trackParagraphPropertyChange(\n this,\n 'indentation.right',\n previousValue,\n twips\n );\n }\n return this;\n }\n\n /**\n * Sets first line indentation\n *\n * WARNING: If this paragraph has numbering (is part of a list), setting\n * first line indentation will be ignored as numbering controls indentation.\n * Numbered lists use hanging indentation for proper alignment.\n *\n * @param twips - Indentation in twips\n * @returns This paragraph for chaining\n */\n setFirstLineIndent(twips: number): this {\n if (this.formatting.numbering) {\n defaultLogger.warn(\n 'Setting first line indentation on a numbered paragraph has no effect. ' +\n 'Numbering controls indentation using hanging indent.'\n );\n }\n const previousValue = this.formatting.indentation?.firstLine;\n if (!this.formatting.indentation) {\n this.formatting.indentation = {};\n }\n this.formatting.indentation.firstLine = twips;\n if (this.trackingContext?.isEnabled() && previousValue !== twips) {\n this.trackingContext.trackParagraphPropertyChange(\n this,\n 'indentation.firstLine',\n previousValue,\n twips\n );\n }\n return this;\n }\n\n /**\n * Sets hanging indentation\n *\n * Creates a hanging indent where the first line starts at the left margin\n * and subsequent lines are indented. Common for bulleted/numbered lists\n * and bibliographies.\n *\n * WARNING: If this paragraph has numbering (is part of a list), setting\n * hanging indentation manually will be ignored as numbering controls indentation.\n *\n * @param twips - Indentation in twips (must be non-negative)\n * @returns This paragraph for chaining\n *\n * @example\n * ```typescript\n * // Create hanging indent of 0.5 inch (720 twips)\n * paragraph.setHangingIndent(720);\n * ```\n */\n setHangingIndent(twips: number): this {\n if (twips < 0) {\n throw new Error('Hanging indent must be non-negative');\n }\n if (this.formatting.numbering) {\n defaultLogger.warn(\n 'Setting hanging indentation on a numbered paragraph has no effect. ' +\n 'Numbering controls indentation.'\n );\n }\n const previousValue = this.formatting.indentation?.hanging;\n if (!this.formatting.indentation) {\n this.formatting.indentation = {};\n }\n this.formatting.indentation.hanging = twips;\n if (this.trackingContext?.isEnabled() && previousValue !== twips) {\n this.trackingContext.trackParagraphPropertyChange(\n this,\n 'indentation.hanging',\n previousValue,\n twips\n );\n }\n return this;\n }\n\n /**\n * Sets spacing before the paragraph\n *\n * Controls the vertical space above the paragraph.\n * 1 point = 20 twips, so 120 twips = 6pt spacing.\n *\n * @param twips - Spacing value in twips (1/20th of a point)\n * @returns This paragraph instance for method chaining\n *\n * @example\n * ```typescript\n * para.setSpaceBefore(240); // 12pt (240 twips) before paragraph\n * para.setSpaceBefore(0); // No space before\n * ```\n */\n setSpaceBefore(twips: number): this {\n const previousValue = this.formatting.spacing?.before;\n if (!this.formatting.spacing) {\n this.formatting.spacing = {};\n }\n this.formatting.spacing.before = twips;\n if (this.trackingContext?.isEnabled() && previousValue !== twips) {\n this.trackingContext.trackParagraphPropertyChange(\n this,\n 'spacing.before',\n previousValue,\n twips\n );\n }\n return this;\n }\n\n /**\n * Sets spacing after the paragraph\n *\n * Controls the vertical space below the paragraph.\n * 1 point = 20 twips, so 120 twips = 6pt spacing.\n *\n * @param twips - Spacing value in twips (1/20th of a point)\n * @returns This paragraph instance for method chaining\n *\n * @example\n * ```typescript\n * para.setSpaceAfter(120); // 6pt (120 twips) after paragraph\n * para.setSpaceAfter(0); // No space after\n * ```\n */\n setSpaceAfter(twips: number): this {\n const previousValue = this.formatting.spacing?.after;\n if (!this.formatting.spacing) {\n this.formatting.spacing = {};\n }\n this.formatting.spacing.after = twips;\n if (this.trackingContext?.isEnabled() && previousValue !== twips) {\n this.trackingContext.trackParagraphPropertyChange(\n this,\n 'spacing.after',\n previousValue,\n twips\n );\n }\n return this;\n }\n\n /**\n * Sets line spacing within the paragraph\n *\n * Controls the vertical space between lines of text within the paragraph.\n * Per ECMA-376 Part 1 §17.3.1.33 (w:spacing/@w:line)\n *\n * @param twips - Line spacing value in twips (1/20th of a point)\n * @param rule - Line spacing rule (default: 'auto')\n * - 'auto': Line spacing is based on font size (240 twips = single spacing)\n * - 'exact': Exact line height regardless of font size\n * - 'atLeast': Minimum line height, expands if content is larger\n * @returns This paragraph instance for method chaining\n *\n * @example\n * ```typescript\n * para.setLineSpacing(240, 'auto'); // Single spacing\n * para.setLineSpacing(360, 'auto'); // 1.5 spacing\n * para.setLineSpacing(480, 'auto'); // Double spacing\n * para.setLineSpacing(300, 'exact'); // Exactly 15pt line height\n * ```\n */\n setLineSpacing(twips: number, rule: 'auto' | 'exact' | 'atLeast' = 'auto'): this {\n const previousLine = this.formatting.spacing?.line;\n const previousRule = this.formatting.spacing?.lineRule;\n if (!this.formatting.spacing) {\n this.formatting.spacing = {};\n }\n this.formatting.spacing.line = twips;\n this.formatting.spacing.lineRule = rule;\n if (this.trackingContext?.isEnabled()) {\n if (previousLine !== twips) {\n this.trackingContext.trackParagraphPropertyChange(\n this,\n 'spacing.line',\n previousLine,\n twips\n );\n }\n if (previousRule !== rule) {\n this.trackingContext.trackParagraphPropertyChange(\n this,\n 'spacing.lineRule',\n previousRule,\n rule\n );\n }\n }\n return this;\n }\n\n /**\n * Clears all direct spacing properties from the paragraph.\n *\n * Removes the spacing object (before, after, line, lineRule) so the paragraph\n * inherits spacing from its style definition. This is different from setting\n * spacing to 0 — clearing means \"use style value\", while 0 means \"no spacing\".\n *\n * @returns This paragraph instance for method chaining\n *\n * @example\n * ```typescript\n * // Clear direct spacing so Normal style's 3pt/3pt takes effect\n * para.clearSpacing();\n * ```\n */\n clearSpacing(): this {\n delete this.formatting.spacing;\n return this;\n }\n\n /**\n * Sets the paragraph style\n *\n * Applies a style definition to the paragraph. The style must exist\n * in the document's StylesManager.\n *\n * @param styleId - The style identifier (e.g., 'Heading1', 'Normal', 'ListParagraph')\n * @returns This paragraph instance for method chaining\n *\n * @example\n * ```typescript\n * para.setStyle('Heading1'); // Apply Heading1 style\n * para.setStyle('Normal'); // Apply Normal style\n * ```\n */\n setStyle(styleId: string): this {\n const previousValue = this.formatting.style;\n this.formatting.style = styleId;\n if (this.trackingContext?.isEnabled() && previousValue !== styleId) {\n this.trackingContext.trackParagraphPropertyChange(this, 'style', previousValue, styleId);\n }\n return this;\n }\n\n /**\n * Sets keep with next\n *\n * **Automatic Conflict Resolution:**\n * When setting keepNext to true, pageBreakBefore is automatically cleared to prevent\n * layout conflicts. The pageBreakBefore property creates contradictory constraints\n * (breaking the page vs. keeping content together) that cause massive whitespace\n * in Word as the layout engine tries to satisfy both. Keep properties take priority\n * as they represent explicit user intent to keep content together.\n *\n * @param keepNext - Whether to keep with next paragraph\n * @returns This paragraph for chaining\n */\n setKeepNext(keepNext = true): this {\n const previousValue = this.formatting.keepNext;\n this.formatting.keepNext = keepNext;\n\n // Resolve property conflicts: keepNext contradicts pageBreakBefore\n if (keepNext) {\n this.formatting.pageBreakBefore = false;\n }\n\n if (this.trackingContext?.isEnabled() && previousValue !== keepNext) {\n this.trackingContext.trackParagraphPropertyChange(this, 'keepNext', previousValue, keepNext);\n }\n return this;\n }\n\n /**\n * Sets keep lines together\n *\n * **Automatic Conflict Resolution:**\n * When setting keepLines to true, pageBreakBefore is automatically cleared to prevent\n * layout conflicts. The pageBreakBefore property creates contradictory constraints\n * (breaking the page vs. keeping lines together) that cause massive whitespace\n * in Word as the layout engine tries to satisfy both. Keep properties take priority\n * as they represent explicit user intent to keep content together.\n *\n * @param keepLines - Whether to keep lines together\n * @returns This paragraph for chaining\n */\n setKeepLines(keepLines = true): this {\n const previousValue = this.formatting.keepLines;\n this.formatting.keepLines = keepLines;\n\n // Resolve property conflicts: keepLines contradicts pageBreakBefore\n if (keepLines) {\n this.formatting.pageBreakBefore = false;\n }\n\n if (this.trackingContext?.isEnabled() && previousValue !== keepLines) {\n this.trackingContext.trackParagraphPropertyChange(\n this,\n 'keepLines',\n previousValue,\n keepLines\n );\n }\n return this;\n }\n\n /**\n * Sets page break before\n * @param pageBreakBefore - Whether to insert page break before\n * @returns This paragraph for chaining\n */\n setPageBreakBefore(pageBreakBefore = true): this {\n const previousValue = this.formatting.pageBreakBefore;\n this.formatting.pageBreakBefore = pageBreakBefore;\n if (this.trackingContext?.isEnabled() && previousValue !== pageBreakBefore) {\n this.trackingContext.trackParagraphPropertyChange(\n this,\n 'pageBreakBefore',\n previousValue,\n pageBreakBefore\n );\n }\n return this;\n }\n\n /**\n * Marks this paragraph as preserved to prevent automatic removal by document processing operations\n * (e.g., removing extra blank paragraphs). Useful for spacing paragraphs that should remain\n * even if they appear to be \"extra\" blank lines.\n * @param preserved - Whether to preserve this paragraph\n * @returns This paragraph for chaining\n */\n setPreserved(preserved = true): this {\n this._isPreserved = preserved;\n return this;\n }\n\n /**\n * Checks if this paragraph is marked as preserved from automatic removal\n * @returns True if paragraph should be preserved from removal operations\n */\n isPreserved(): boolean {\n return this._isPreserved;\n }\n\n /**\n * Sets numbering for this paragraph (adds to a list)\n *\n * When numbering is applied, any conflicting paragraph indentation\n * (left, firstLine, hanging) is automatically cleared to prevent\n * override issues. Right indentation is preserved as it doesn't\n * conflict with list formatting.\n *\n * This matches Microsoft Word behavior where numbering controls\n * the indentation, not paragraph-level formatting.\n *\n * @param numId - The numbering instance ID\n * @param level - The level (0-8, where 0 is the outermost level)\n * @returns This paragraph for chaining\n *\n * @example\n * ```typescript\n * const listId = doc.createBulletList();\n * paragraph.setNumbering(listId, 0); // Level 0, indent controlled by numbering\n * paragraph.setNumbering(listId, 1); // Level 1, deeper indent\n * ```\n */\n setNumbering(numId: number, level = 0): this {\n if (numId < 0) {\n throw new Error('Numbering ID must be non-negative');\n }\n if (level < 0 || level > 8) {\n throw new Error('Level must be between 0 and 8');\n }\n\n const previousValue = this.formatting.numbering;\n this.formatting.numbering = { numId, level };\n delete this.formatting.numberingSuppressed;\n\n // Clear conflicting indentation properties\n // Per ECMA-376 §17.3.1.12, paragraph indentation overrides numbering indentation\n // To prevent unexpected behavior, we clear left/firstLine/hanging when numbering is applied\n // This matches Microsoft Word behavior where numbering controls indentation\n if (this.formatting.indentation) {\n const { right } = this.formatting.indentation;\n // Preserve right indent only (doesn't conflict with numbering)\n this.formatting.indentation = right !== undefined ? { right } : undefined;\n }\n\n if (this.trackingContext?.isEnabled()) {\n const newValue = { numId, level };\n if (previousValue?.numId !== newValue.numId || previousValue?.level !== newValue.level) {\n this.trackingContext.trackParagraphPropertyChange(\n this,\n 'numbering',\n previousValue,\n newValue\n );\n }\n }\n return this;\n }\n\n /**\n * Sets contextual spacing for this paragraph\n * When enabled, removes spacing between consecutive paragraphs of the same style\n * Per ECMA-376 Part 1 §17.3.1.8\n * @param enable - Whether to enable contextual spacing\n * @returns This paragraph for chaining\n */\n setContextualSpacing(enable = true): this {\n const previousValue = this.formatting.contextualSpacing;\n this.formatting.contextualSpacing = enable;\n if (this.trackingContext?.isEnabled() && previousValue !== enable) {\n this.trackingContext.trackParagraphPropertyChange(\n this,\n 'contextualSpacing',\n previousValue,\n enable\n );\n }\n return this;\n }\n\n /**\n * Removes numbering from this paragraph\n * @returns This paragraph for chaining\n */\n removeNumbering(): this {\n delete this.formatting.numbering;\n delete this.formatting.numberingSuppressed;\n return this;\n }\n\n /**\n * Gets the numbering properties\n * @returns Numbering properties or undefined\n */\n getNumbering(): { numId: number; level: number } | undefined {\n return this.formatting.numbering ? { ...this.formatting.numbering } : undefined;\n }\n\n /**\n * Sets widow/orphan control for this paragraph\n * Controls whether to prevent single lines at the top or bottom of a page.\n * Word's default is true - set to false to allow widows/orphans.\n * Per ECMA-376 Part 1 §17.3.1.40\n * @param enable - Whether to enable widow/orphan control\n * @returns This paragraph for chaining\n */\n setWidowControl(enable = true): this {\n const previousValue = this.formatting.widowControl;\n this.formatting.widowControl = enable;\n if (this.trackingContext?.isEnabled() && previousValue !== enable) {\n this.trackingContext.trackParagraphPropertyChange(\n this,\n 'widowControl',\n previousValue,\n enable\n );\n }\n return this;\n }\n\n /**\n * Sets outline level for this paragraph (for table of contents)\n * Level 0-9 indicates hierarchy in document structure.\n * Level 0 = highest level (like Heading 1)\n * Level 9 = lowest level\n * Per ECMA-376 Part 1 §17.3.1.19\n * @param level - Outline level (0-9)\n * @returns This paragraph for chaining\n */\n setOutlineLevel(level: number): this {\n if (level < 0 || level > 9) {\n throw new Error('Outline level must be between 0 and 9');\n }\n const previousValue = this.formatting.outlineLevel;\n this.formatting.outlineLevel = level;\n if (this.trackingContext?.isEnabled() && previousValue !== level) {\n this.trackingContext.trackParagraphPropertyChange(this, 'outlineLevel', previousValue, level);\n }\n return this;\n }\n\n /**\n * Sets whether to suppress line numbers for this paragraph\n * Per ECMA-376 Part 1 §17.3.1.34\n * @param suppress - Whether to suppress line numbers\n * @returns This paragraph for chaining\n */\n setSuppressLineNumbers(suppress = true): this {\n const previousValue = this.formatting.suppressLineNumbers;\n this.formatting.suppressLineNumbers = suppress;\n if (this.trackingContext?.isEnabled() && previousValue !== suppress) {\n this.trackingContext.trackParagraphPropertyChange(\n this,\n 'suppressLineNumbers',\n previousValue,\n suppress\n );\n }\n return this;\n }\n\n /**\n * Sets bidirectional text layout (right-to-left)\n * Enables right-to-left paragraph layout for languages like Arabic and Hebrew.\n * Per ECMA-376 Part 1 §17.3.1.6\n * @param enable - Whether to enable bidirectional (RTL) layout\n * @returns This paragraph for chaining\n */\n setBidi(enable = true): this {\n const previousValue = this.formatting.bidi;\n this.formatting.bidi = enable;\n if (this.trackingContext?.isEnabled() && previousValue !== enable) {\n this.trackingContext.trackParagraphPropertyChange(this, 'bidi', previousValue, enable);\n }\n return this;\n }\n\n /**\n * Sets text flow direction for this paragraph\n * Per ECMA-376 Part 1 §17.3.1.36\n * @param direction - Text flow direction\n * - 'lrTb': Left-to-right, top-to-bottom (default for English)\n * - 'tbRl': Top-to-bottom, right-to-left (traditional Chinese/Japanese)\n * - 'btLr': Bottom-to-top, left-to-right (Mongolian)\n * - 'lrTbV': Left-to-right, top-to-bottom vertical\n * - 'tbRlV': Top-to-bottom, right-to-left vertical\n * - 'tbLrV': Top-to-bottom, left-to-right vertical\n * @returns This paragraph for chaining\n */\n setTextDirection(direction: TextDirection): this {\n const previousValue = this.formatting.textDirection;\n this.formatting.textDirection = direction;\n if (this.trackingContext?.isEnabled() && previousValue !== direction) {\n this.trackingContext.trackParagraphPropertyChange(\n this,\n 'textDirection',\n previousValue,\n direction\n );\n }\n return this;\n }\n\n /**\n * Sets vertical text alignment for this paragraph\n * Per ECMA-376 Part 1 §17.3.1.35\n * @param alignment - Vertical alignment\n * - 'top': Align to top of line\n * - 'center': Align to center of line\n * - 'baseline': Align to baseline\n * - 'bottom': Align to bottom of line\n * - 'auto': Automatic alignment\n * @returns This paragraph for chaining\n */\n setTextAlignment(alignment: TextAlignment): this {\n const previousValue = this.formatting.textAlignment;\n this.formatting.textAlignment = alignment;\n if (this.trackingContext?.isEnabled() && previousValue !== alignment) {\n this.trackingContext.trackParagraphPropertyChange(\n this,\n 'textAlignment',\n previousValue,\n alignment\n );\n }\n return this;\n }\n\n /**\n * Sets mirror indents for this paragraph\n * When enabled, uses inside/outside indents instead of left/right for double-sided printing.\n * Per ECMA-376 Part 1 §17.3.1.18\n * @param enable - Whether to enable mirror indents\n * @returns This paragraph for chaining\n */\n setMirrorIndents(enable = true): this {\n const previousValue = this.formatting.mirrorIndents;\n this.formatting.mirrorIndents = enable;\n if (this.trackingContext?.isEnabled() && previousValue !== enable) {\n this.trackingContext.trackParagraphPropertyChange(\n this,\n 'mirrorIndents',\n previousValue,\n enable\n );\n }\n return this;\n }\n\n /**\n * Sets auto-adjust right indent for this paragraph\n * When enabled, automatically adjusts right indent when a document grid is defined.\n * Per ECMA-376 Part 1 §17.3.1.1\n * @param enable - Whether to enable auto-adjust right indent\n * @returns This paragraph for chaining\n */\n setAdjustRightInd(enable = true): this {\n const previousValue = this.formatting.adjustRightInd;\n this.formatting.adjustRightInd = enable;\n if (this.trackingContext?.isEnabled() && previousValue !== enable) {\n this.trackingContext.trackParagraphPropertyChange(\n this,\n 'adjustRightInd',\n previousValue,\n enable\n );\n }\n return this;\n }\n\n /**\n * Sets text frame/box properties for this paragraph\n * Text frames allow positioning paragraphs in specific locations with text wrapping.\n * Per ECMA-376 Part 1 §17.3.1.11\n * @param props - Frame properties\n * - w, h: Width and height in twips\n * - hRule: Height rule ('auto', 'atLeast', 'exact')\n * - x, y: Absolute positioning in twips\n * - xAlign, yAlign: Relative alignment\n * - hAnchor, vAnchor: Positioning base ('page', 'margin', 'text')\n * - hSpace, vSpace: Padding around frame in twips\n * - wrap: Text wrapping ('around', 'notBeside', 'none', 'tight')\n * - dropCap: Drop cap style ('none', 'drop', 'margin')\n * - lines: Drop cap height in lines\n * - anchorLock: Lock frame anchor to paragraph\n * @returns This paragraph for chaining\n */\n setFrameProperties(props: FrameProperties): this {\n const previousValue = this.formatting.framePr;\n this.formatting.framePr = props;\n if (this.trackingContext?.isEnabled() && previousValue !== props) {\n this.trackingContext.trackParagraphPropertyChange(this, 'framePr', previousValue, props);\n }\n return this;\n }\n\n /**\n * Suppress automatic hyphenation for this paragraph\n * Per ECMA-376 Part 1 §17.3.1.33\n * @param suppress - Whether to suppress hyphenation (default: true)\n * @returns This paragraph for chaining\n */\n setSuppressAutoHyphens(suppress = true): this {\n const previousValue = this.formatting.suppressAutoHyphens;\n this.formatting.suppressAutoHyphens = suppress;\n if (this.trackingContext?.isEnabled() && previousValue !== suppress) {\n this.trackingContext.trackParagraphPropertyChange(\n this,\n 'suppressAutoHyphens',\n previousValue,\n suppress\n );\n }\n return this;\n }\n\n /**\n * Sets CJK kinsoku line-breaking rules\n * Per ECMA-376 Part 1 §17.3.1.16\n * @param enable - Whether to enable kinsoku rules (default: true)\n * @returns This paragraph for chaining\n */\n setKinsoku(enable = true): this {\n this.formatting.kinsoku = enable;\n return this;\n }\n\n /**\n * Sets CJK word wrap behavior\n * Per ECMA-376 Part 1 §17.3.1.45\n * @param enable - Whether to allow wrapping mid-word (default: true)\n * @returns This paragraph for chaining\n */\n setWordWrap(enable = true): this {\n this.formatting.wordWrap = enable;\n return this;\n }\n\n /**\n * Sets CJK overflow punctuation\n * Per ECMA-376 Part 1 §17.3.1.24\n * @param enable - Whether to allow punctuation overhang (default: true)\n * @returns This paragraph for chaining\n */\n setOverflowPunct(enable = true): this {\n this.formatting.overflowPunct = enable;\n return this;\n }\n\n /**\n * Sets CJK top line punctuation compression\n * Per ECMA-376 Part 1 §17.3.1.43\n * @param enable - Whether to compress punctuation at line start (default: true)\n * @returns This paragraph for chaining\n */\n setTopLinePunct(enable = true): this {\n this.formatting.topLinePunct = enable;\n return this;\n }\n\n /**\n * Sets auto space between East Asian and numeric text\n * Per ECMA-376 Part 1 §17.3.1.2\n * @param enable - Whether to auto-space (default: true)\n * @returns This paragraph for chaining\n */\n setAutoSpaceDE(enable = true): this {\n this.formatting.autoSpaceDE = enable;\n return this;\n }\n\n /**\n * Sets auto space between East Asian and Western text\n * Per ECMA-376 Part 1 §17.3.1.3\n * @param enable - Whether to auto-space (default: true)\n * @returns This paragraph for chaining\n */\n setAutoSpaceDN(enable = true): this {\n this.formatting.autoSpaceDN = enable;\n return this;\n }\n\n /**\n * Prevent text frames from overlapping with this paragraph\n * Per ECMA-376 Part 1 §17.3.1.34\n * @param suppress - Whether to prevent overlap (default: true)\n * @returns This paragraph for chaining\n */\n setSuppressOverlap(suppress = true): this {\n const previousValue = this.formatting.suppressOverlap;\n this.formatting.suppressOverlap = suppress;\n if (this.trackingContext?.isEnabled() && previousValue !== suppress) {\n this.trackingContext.trackParagraphPropertyChange(\n this,\n 'suppressOverlap',\n previousValue,\n suppress\n );\n }\n return this;\n }\n\n /**\n * Sets tight wrapping mode for text boxes\n * Controls how tightly surrounding text wraps around text box content.\n * Per ECMA-376 Part 1 §17.3.1.37\n * @param wrap - Tight wrap mode\n * - 'none': No tight wrapping\n * - 'allLines': Tight wrap all lines\n * - 'firstAndLastLine': Tight wrap first and last lines only\n * - 'firstLineOnly': Tight wrap first line only\n * - 'lastLineOnly': Tight wrap last line only\n * @returns This paragraph for chaining\n */\n setTextboxTightWrap(wrap: TextboxTightWrap): this {\n const previousValue = this.formatting.textboxTightWrap;\n this.formatting.textboxTightWrap = wrap;\n if (this.trackingContext?.isEnabled() && previousValue !== wrap) {\n this.trackingContext.trackParagraphPropertyChange(\n this,\n 'textboxTightWrap',\n previousValue,\n wrap\n );\n }\n return this;\n }\n\n /**\n * Sets the HTML div ID associated with this paragraph\n * Used for HTML round-trip conversion to preserve div structure.\n * Per ECMA-376 Part 1 §17.3.1.9\n * @param id - Decimal ID referencing a div in the web settings part\n * @returns This paragraph for chaining\n */\n setDivId(id: number): this {\n const previousValue = this.formatting.divId;\n this.formatting.divId = id;\n if (this.trackingContext?.isEnabled() && previousValue !== id) {\n this.trackingContext.trackParagraphPropertyChange(this, 'divId', previousValue, id);\n }\n return this;\n }\n\n /**\n * Sets conditional table style formatting for this paragraph\n * Used to apply conditional formatting based on table position (first row, last column, etc.).\n * Per ECMA-376 Part 1 §17.3.1.8\n * @param bitmask - Bitmask string (e.g., \"101000000100\")\n * Each bit represents a conditional formatting property:\n * - Bit 0: First row\n * - Bit 1: Last row\n * - Bit 2: First column\n * - Bit 3: Last column\n * - Bit 4: Band 1 vertical\n * - Bit 5: Band 2 vertical\n * - Bit 6: Band 1 horizontal\n * - Bit 7: Band 2 horizontal\n * - Bit 8-11: Corner cells (NE, NW, SE, SW)\n * @returns This paragraph for chaining\n */\n setConditionalFormatting(bitmask: string): this {\n const previousValue = this.formatting.cnfStyle;\n this.formatting.cnfStyle = bitmask;\n if (this.trackingContext?.isEnabled() && previousValue !== bitmask) {\n this.trackingContext.trackParagraphPropertyChange(this, 'cnfStyle', previousValue, bitmask);\n }\n return this;\n }\n\n /**\n * Sets section properties for this paragraph\n * Used to define section breaks and section-specific formatting.\n * Per ECMA-376 Part 1 §17.3.1.30\n * @param properties - Section properties object\n * @returns This paragraph for chaining\n */\n setSectionProperties(properties: string | Record<string, unknown>): this {\n const previousValue = this.formatting.sectPr;\n this.formatting.sectPr = properties;\n if (this.trackingContext?.isEnabled() && previousValue !== properties) {\n this.trackingContext.trackParagraphPropertyChange(this, 'sectPr', previousValue, properties);\n }\n return this;\n }\n\n /**\n * Sets paragraph property change tracking information\n * Used for revision history and change tracking.\n * Per ECMA-376 Part 1 §17.3.1.27\n * @param change - Change tracking information\n * @returns This paragraph for chaining\n */\n setParagraphPropertiesChange(change: ParagraphPropertiesChange): this {\n const previousValue = this.formatting.pPrChange;\n this.formatting.pPrChange = change;\n if (this.trackingContext?.isEnabled() && previousValue !== change) {\n this.trackingContext.trackParagraphPropertyChange(this, 'pPrChange', previousValue, change);\n }\n return this;\n }\n\n /**\n * Clears paragraph property change tracking information.\n * Used when accepting revisions to remove the w:pPrChange element.\n * @returns This paragraph for chaining\n */\n clearParagraphPropertiesChange(): this {\n delete this.formatting.pPrChange;\n return this;\n }\n\n /**\n * Sets run properties for the paragraph mark (¶ symbol)\n *\n * The paragraph mark is the invisible character at the end of every paragraph.\n * It can have its own formatting independent of the text runs in the paragraph.\n * This is useful for controlling formatting behavior when text is inserted after\n * the paragraph mark.\n *\n * Per ECMA-376 Part 1 §17.3.1.29 (Run Properties for the Paragraph Mark)\n *\n * Common use cases:\n * - Set default font for new text added to paragraph\n * - Control paragraph mark visibility in \"Show/Hide ¶\" mode\n * - Apply highlighting to paragraph mark for visual consistency\n *\n * @param properties - Run formatting properties for the paragraph mark\n * @returns This paragraph for chaining\n *\n * @example\n * ```typescript\n * // Set paragraph mark to be red and bold\n * paragraph.setParagraphMarkFormatting({ bold: true, color: 'FF0000' });\n *\n * // Hide paragraph mark\n * paragraph.setParagraphMarkFormatting({ vanish: true });\n *\n * // Set default font for new text in this paragraph\n * paragraph.setParagraphMarkFormatting({ font: 'Arial', size: 12 });\n * ```\n */\n setParagraphMarkFormatting(properties: RunFormatting): this {\n const previousValue = this.formatting.paragraphMarkRunProperties;\n this.formatting.paragraphMarkRunProperties = properties;\n if (this.trackingContext?.isEnabled() && previousValue !== properties) {\n this.trackingContext.trackParagraphPropertyChange(\n this,\n 'paragraphMarkRunProperties',\n previousValue,\n properties\n );\n }\n return this;\n }\n\n /**\n * Marks the 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. Word shows this as a deletion\n * of the ¶ symbol.\n *\n * @param id - Unique revision ID\n * @param author - Author who deleted the paragraph mark\n * @param date - Date when the deletion occurred (defaults to now)\n * @returns This paragraph for chaining\n *\n * @example\n * ```typescript\n * paragraph.markParagraphMarkAsDeleted(1, 'Alice', new Date());\n * ```\n */\n markParagraphMarkAsDeleted(id: number, author: string, date?: Date): this {\n this.formatting.paragraphMarkDeletion = {\n id,\n author,\n date: date || new Date(),\n };\n return this;\n }\n\n /**\n * Clears the paragraph mark deletion marker\n * @returns This paragraph for chaining\n */\n clearParagraphMarkDeletion(): this {\n delete this.formatting.paragraphMarkDeletion;\n return this;\n }\n\n /**\n * Checks if the paragraph mark is marked as deleted\n * @returns True if the paragraph mark is deleted\n */\n isParagraphMarkDeleted(): boolean {\n return !!this.formatting.paragraphMarkDeletion;\n }\n\n /**\n * Marks the paragraph mark (¶ symbol) as inserted via tracked changes.\n * This adds a `w:ins` element inside `w:pPr/w:rPr` indicating the insertion\n * of the ¶ symbol.\n *\n * @param id - Unique revision ID\n * @param author - Author who inserted the paragraph mark\n * @param date - Date when the insertion occurred (defaults to now)\n * @returns This paragraph for chaining\n */\n markParagraphMarkAsInserted(id: number, author: string, date?: Date): this {\n this.formatting.paragraphMarkInsertion = {\n id,\n author,\n date: date || new Date(),\n };\n return this;\n }\n\n /**\n * Clears the paragraph mark insertion marker\n * @returns This paragraph for chaining\n */\n clearParagraphMarkInsertion(): this {\n delete this.formatting.paragraphMarkInsertion;\n return this;\n }\n\n /**\n * Checks if the paragraph mark is marked as inserted\n * @returns True if the paragraph mark is inserted\n */\n isParagraphMarkInserted(): boolean {\n return !!this.formatting.paragraphMarkInsertion;\n }\n\n /**\n * Converts the paragraph to WordprocessingML XML element\n *\n * **ECMA-376 Compliance:** Properties are generated in the order specified by\n * ECMA-376 Part 1 §17.3.1.26 to ensure strict OpenXML conformance.\n *\n * Per spec, the order includes (partial list):\n * 1. pStyle (style reference)\n * 2. keepNext (keep with next paragraph)\n * 3. keepLines (keep lines together)\n * 4. pageBreakBefore (page break before)\n * 5. widowControl (widow/orphan control)\n * 6. numPr (numbering properties)\n * 7. suppressLineNumbers (suppress line numbers)\n * 8-10. borders, shading, tabs\n * 11-19. East Asian typography properties\n * 20. bidi (bidirectional layout)\n * 21. adjustRightInd (auto-adjust right indent)\n * 22. spacing, indentation, contextualSpacing\n * 23. mirrorIndents (mirror indents)\n * 24. jc (justification/alignment)\n * 25. textAlignment (vertical text alignment)\n * 26. textDirection (text flow direction)\n * 27. outlineLvl (outline level)\n *\n * @returns XMLElement representing the paragraph\n */\n toXML(): XMLElement {\n // Diagnostic logging before serialization\n const runData = this.getRuns().map((run) => ({\n text: run.getText(),\n rtl: run.isRTL(),\n }));\n logParagraphContent('serialization', -1, runData, this.formatting.bidi);\n\n if (this.formatting.bidi) {\n logTextDirection(`Serializing paragraph with BiDi enabled`);\n }\n\n const pPrChildren: XMLElement[] = [];\n\n // 1. Paragraph style (must be first per ECMA-376 §17.3.1.26)\n if (this.formatting.style) {\n pPrChildren.push(XMLBuilder.wSelf('pStyle', { 'w:val': this.formatting.style }));\n }\n\n // 2. Keep with next paragraph\n if (this.formatting.keepNext) {\n pPrChildren.push(XMLBuilder.wSelf('keepNext'));\n }\n\n // 3. Keep lines together\n if (this.formatting.keepLines) {\n pPrChildren.push(XMLBuilder.wSelf('keepLines'));\n }\n\n // CT_PPrBase element order per ECMA-376:\n // pStyle → keepNext → keepLines → pageBreakBefore → framePr → widowControl →\n // numPr → suppressLineNumbers → pBdr → shd → tabs → suppressAutoHyphens →\n // kinsoku → wordWrap → overflowPunct → topLinePunct → autoSpaceDE → autoSpaceDN →\n // bidi → adjustRightInd → spacing → ind → contextualSpacing → mirrorIndents →\n // suppressOverlap → jc → textDirection → textAlignment → textboxTightWrap →\n // outlineLvl → divId → cnfStyle\n\n // 4. Page break before\n if (this.formatting.pageBreakBefore) {\n pPrChildren.push(XMLBuilder.wSelf('pageBreakBefore'));\n }\n\n // 5. Text frame properties (framePr)\n if (this.formatting.framePr) {\n const attrs: Record<string, string> = {};\n const f = this.formatting.framePr;\n if (f.w !== undefined) attrs['w:w'] = f.w.toString();\n if (f.h !== undefined) attrs['w:h'] = f.h.toString();\n if (f.hRule) attrs['w:hRule'] = f.hRule;\n if (f.x !== undefined) attrs['w:x'] = f.x.toString();\n if (f.y !== undefined) attrs['w:y'] = f.y.toString();\n if (f.xAlign) attrs['w:xAlign'] = f.xAlign;\n if (f.yAlign) attrs['w:yAlign'] = f.yAlign;\n if (f.hAnchor) attrs['w:hAnchor'] = f.hAnchor;\n if (f.vAnchor) attrs['w:vAnchor'] = f.vAnchor;\n if (f.hSpace !== undefined) attrs['w:hSpace'] = f.hSpace.toString();\n if (f.vSpace !== undefined) attrs['w:vSpace'] = f.vSpace.toString();\n if (f.wrap) attrs['w:wrap'] = f.wrap;\n if (f.dropCap) attrs['w:dropCap'] = f.dropCap;\n if (f.lines !== undefined) attrs['w:lines'] = f.lines.toString();\n if (f.anchorLock !== undefined) attrs['w:anchorLock'] = f.anchorLock ? '1' : '0';\n if (Object.keys(attrs).length > 0) {\n pPrChildren.push(XMLBuilder.wSelf('framePr', attrs));\n }\n }\n\n // 6. Widow/orphan control\n if (this.formatting.widowControl !== undefined) {\n pPrChildren.push(\n XMLBuilder.wSelf('widowControl', {\n 'w:val': this.formatting.widowControl ? '1' : '0',\n })\n );\n }\n\n // 7. Numbering properties\n if (this.formatting.numbering) {\n const numPr = XMLBuilder.w('numPr', undefined, [\n XMLBuilder.wSelf('ilvl', {\n 'w:val': this.formatting.numbering.level.toString(),\n }),\n XMLBuilder.wSelf('numId', {\n 'w:val': this.formatting.numbering.numId.toString(),\n }),\n ]);\n pPrChildren.push(numPr);\n }\n\n // 8. Suppress line numbers\n if (this.formatting.suppressLineNumbers) {\n pPrChildren.push(XMLBuilder.wSelf('suppressLineNumbers'));\n }\n\n // 9. Paragraph borders\n if (this.formatting.borders) {\n const borderChildren: XMLElement[] = [];\n const borders = this.formatting.borders;\n\n const createBorder = (\n borderType: string,\n border: BorderDefinition | undefined\n ): XMLElement | null => {\n if (!border) return null;\n const attributes: Record<string, string | number> = {};\n if (border.style) attributes['w:val'] = border.style;\n if (border.size !== undefined) attributes['w:sz'] = border.size;\n if (border.color) attributes['w:color'] = border.color;\n if (border.space !== undefined) attributes['w:space'] = border.space;\n if (Object.keys(attributes).length > 0) {\n return XMLBuilder.wSelf(borderType, attributes);\n }\n return null;\n };\n\n // Add borders in order: top, left, bottom, right, between, bar\n const topBorder = createBorder('top', borders.top);\n if (topBorder) borderChildren.push(topBorder);\n\n const leftBorder = createBorder('left', borders.left);\n if (leftBorder) borderChildren.push(leftBorder);\n\n const bottomBorder = createBorder('bottom', borders.bottom);\n if (bottomBorder) borderChildren.push(bottomBorder);\n\n const rightBorder = createBorder('right', borders.right);\n if (rightBorder) borderChildren.push(rightBorder);\n\n const betweenBorder = createBorder('between', borders.between);\n if (betweenBorder) borderChildren.push(betweenBorder);\n\n const barBorder = createBorder('bar', borders.bar);\n if (barBorder) borderChildren.push(barBorder);\n\n if (borderChildren.length > 0) {\n pPrChildren.push(XMLBuilder.w('pBdr', undefined, borderChildren));\n }\n }\n\n // 10. Paragraph shading\n if (this.formatting.shading) {\n const shdAttrs = buildShadingAttributes(this.formatting.shading);\n if (Object.keys(shdAttrs).length > 0) {\n pPrChildren.push(XMLBuilder.wSelf('shd', shdAttrs));\n }\n }\n\n // 11. Tab stops\n if (this.formatting.tabs && this.formatting.tabs.length > 0) {\n const tabChildren: XMLElement[] = [];\n for (const tab of this.formatting.tabs) {\n const attributes: Record<string, string | number> = {};\n attributes['w:pos'] = tab.position;\n if (tab.val) attributes['w:val'] = tab.val;\n if (tab.leader) attributes['w:leader'] = tab.leader;\n tabChildren.push(XMLBuilder.wSelf('tab', attributes));\n }\n if (tabChildren.length > 0) {\n pPrChildren.push(XMLBuilder.w('tabs', undefined, tabChildren));\n }\n }\n\n // 12. Suppress automatic hyphenation\n if (this.formatting.suppressAutoHyphens) {\n pPrChildren.push(XMLBuilder.wSelf('suppressAutoHyphens'));\n }\n\n // 13. CJK paragraph properties\n if (this.formatting.kinsoku !== undefined) {\n pPrChildren.push(\n XMLBuilder.wSelf('kinsoku', { 'w:val': this.formatting.kinsoku ? '1' : '0' })\n );\n }\n if (this.formatting.wordWrap !== undefined) {\n pPrChildren.push(\n XMLBuilder.wSelf('wordWrap', { 'w:val': this.formatting.wordWrap ? '1' : '0' })\n );\n }\n if (this.formatting.overflowPunct !== undefined) {\n pPrChildren.push(\n XMLBuilder.wSelf('overflowPunct', { 'w:val': this.formatting.overflowPunct ? '1' : '0' })\n );\n }\n if (this.formatting.topLinePunct !== undefined) {\n pPrChildren.push(\n XMLBuilder.wSelf('topLinePunct', { 'w:val': this.formatting.topLinePunct ? '1' : '0' })\n );\n }\n if (this.formatting.autoSpaceDE !== undefined) {\n pPrChildren.push(\n XMLBuilder.wSelf('autoSpaceDE', { 'w:val': this.formatting.autoSpaceDE ? '1' : '0' })\n );\n }\n if (this.formatting.autoSpaceDN !== undefined) {\n pPrChildren.push(\n XMLBuilder.wSelf('autoSpaceDN', { 'w:val': this.formatting.autoSpaceDN ? '1' : '0' })\n );\n }\n\n // 14. Bidirectional layout\n if (this.formatting.bidi !== undefined) {\n pPrChildren.push(XMLBuilder.wSelf('bidi', { 'w:val': this.formatting.bidi ? '1' : '0' }));\n }\n\n // 15. Auto-adjust right indent\n if (this.formatting.adjustRightInd !== undefined) {\n pPrChildren.push(\n XMLBuilder.wSelf('adjustRightInd', {\n 'w:val': this.formatting.adjustRightInd ? '1' : '0',\n })\n );\n }\n\n // 16. Spacing (before/after/line)\n if (this.formatting.spacing) {\n const spc = this.formatting.spacing;\n const attributes: Record<string, number | string> = {};\n if (spc.before !== undefined) attributes['w:before'] = spc.before;\n if (spc.after !== undefined) attributes['w:after'] = spc.after;\n if (spc.line !== undefined) attributes['w:line'] = spc.line;\n if (spc.lineRule) attributes['w:lineRule'] = spc.lineRule;\n if (Object.keys(attributes).length > 0) {\n pPrChildren.push(XMLBuilder.wSelf('spacing', attributes));\n }\n }\n\n // 17. Indentation (left/right/firstLine/hanging)\n if (this.formatting.indentation) {\n const ind = this.formatting.indentation;\n const attributes: Record<string, number> = {};\n if (ind.left !== undefined) attributes['w:left'] = ind.left;\n if (ind.right !== undefined) attributes['w:right'] = ind.right;\n if (ind.firstLine !== undefined) attributes['w:firstLine'] = ind.firstLine;\n if (ind.hanging !== undefined) attributes['w:hanging'] = ind.hanging;\n if (Object.keys(attributes).length > 0) {\n pPrChildren.push(XMLBuilder.wSelf('ind', attributes));\n }\n }\n\n // 18. Contextual spacing\n if (this.formatting.contextualSpacing) {\n pPrChildren.push(XMLBuilder.wSelf('contextualSpacing', { 'w:val': '1' }));\n }\n\n // 19. Mirror indents\n if (this.formatting.mirrorIndents) {\n pPrChildren.push(XMLBuilder.wSelf('mirrorIndents'));\n }\n\n // 20. Suppress text frame overlap\n if (this.formatting.suppressOverlap) {\n pPrChildren.push(XMLBuilder.wSelf('suppressOverlap'));\n }\n\n // 21. Justification/Alignment\n if (this.formatting.alignment) {\n const alignmentValue =\n this.formatting.alignment === 'justify' ? 'both' : this.formatting.alignment;\n pPrChildren.push(XMLBuilder.wSelf('jc', { 'w:val': alignmentValue }));\n }\n\n // 22. Text direction\n if (this.formatting.textDirection) {\n pPrChildren.push(\n XMLBuilder.wSelf('textDirection', {\n 'w:val': this.formatting.textDirection,\n })\n );\n }\n\n // 23. Text vertical alignment\n if (this.formatting.textAlignment) {\n pPrChildren.push(\n XMLBuilder.wSelf('textAlignment', {\n 'w:val': this.formatting.textAlignment,\n })\n );\n }\n\n // 24. Textbox tight wrap\n if (this.formatting.textboxTightWrap) {\n pPrChildren.push(\n XMLBuilder.wSelf('textboxTightWrap', {\n 'w:val': this.formatting.textboxTightWrap,\n })\n );\n }\n\n // 25. Outline level\n if (this.formatting.outlineLevel !== undefined) {\n pPrChildren.push(\n XMLBuilder.wSelf('outlineLvl', {\n 'w:val': this.formatting.outlineLevel.toString(),\n })\n );\n }\n\n // 17. HTML div ID per ECMA-376 Part 1 §17.3.1.9\n if (this.formatting.divId !== undefined) {\n pPrChildren.push(XMLBuilder.wSelf('divId', { 'w:val': this.formatting.divId.toString() }));\n }\n\n // 18. Conditional table style formatting per ECMA-376 Part 1 §17.3.1.8\n if (this.formatting.cnfStyle) {\n pPrChildren.push(XMLBuilder.wSelf('cnfStyle', { 'w:val': this.formatting.cnfStyle }));\n }\n\n // 19. Paragraph mark run properties per ECMA-376 Part 1 §17.3.1.29\n // Per CT_PPr, w:rPr comes after all CT_PPrBase elements and before w:sectPr/w:pPrChange\n if (\n this.formatting.paragraphMarkRunProperties ||\n this.formatting.paragraphMarkDeletion ||\n this.formatting.paragraphMarkInsertion\n ) {\n const rPrChildren: XMLElement[] = [];\n\n // Add run properties for the paragraph mark if they exist\n if (this.formatting.paragraphMarkRunProperties) {\n const rPr = Run.generateRunPropertiesXML(this.formatting.paragraphMarkRunProperties);\n if (rPr?.children) {\n // Filter to only XMLElement types (children can be XMLElement or string)\n for (const child of rPr.children) {\n if (typeof child !== 'string') {\n rPrChildren.push(child);\n }\n }\n }\n }\n\n // Per CT_ParaRPr schema, w:ins precedes w:del in the sequence\n // Add insertion marker if the paragraph mark is inserted (w:ins)\n // Per ECMA-376 Part 1 §17.13.5.18 - tracks insertion of paragraph mark\n if (this.formatting.paragraphMarkInsertion) {\n const ins = this.formatting.paragraphMarkInsertion;\n rPrChildren.push(\n XMLBuilder.wSelf('ins', {\n 'w:id': ins.id.toString(),\n 'w:author': ins.author,\n 'w:date': formatDateForXml(ins.date),\n })\n );\n }\n\n // Add deletion marker if the paragraph mark is deleted (w:del)\n // Per ECMA-376 Part 1 §17.13.5.14 - tracks deletion of paragraph mark\n if (this.formatting.paragraphMarkDeletion) {\n const del = this.formatting.paragraphMarkDeletion;\n rPrChildren.push(\n XMLBuilder.wSelf('del', {\n 'w:id': del.id.toString(),\n 'w:author': del.author,\n 'w:date': formatDateForXml(del.date),\n })\n );\n }\n\n // Add w:rPr element if there are any run properties\n if (rPrChildren.length > 0) {\n pPrChildren.push(XMLBuilder.w('rPr', undefined, rPrChildren));\n }\n }\n\n // 20. Paragraph property change tracking per ECMA-376 Part 1 §17.3.1.27\n /**\n * Per OOXML spec, w:pPrChange contains:\n * - Attributes: w:id (required), w:author (required), w:date (optional)\n * - Child element: w:pPr containing the PREVIOUS paragraph properties before the change\n *\n * Structure:\n * <w:pPrChange w:id=\"1\" w:author=\"Author\" w:date=\"2024-01-01T12:00:00Z\">\n * <w:pPr>\n * <!-- Previous paragraph properties -->\n * </w:pPr>\n * </w:pPrChange>\n */\n // Per CT_PPr: sectPr comes BEFORE pPrChange\n if (this.formatting.sectPr) {\n if (typeof this.formatting.sectPr === 'string') {\n // Raw XML passthrough for inline sectPr (preserves exact structure)\n pPrChildren.push({\n name: '__rawXml',\n rawXml: this.formatting.sectPr,\n } as XMLElement);\n }\n // Non-string (parsed object) is skipped to prevent corruption from\n // XMLBuilder.wSelf treating complex objects as flat attributes\n }\n\n if (this.formatting.pPrChange) {\n const change = this.formatting.pPrChange;\n const attrs: Record<string, string> = {};\n // ECMA-376 attribute order: w:id (required), w:author (required), w:date (optional)\n if (change.id) attrs['w:id'] = change.id;\n if (change.author) attrs['w:author'] = change.author;\n if (change.date) attrs['w:date'] = change.date;\n\n // Build child w:pPr element with previous properties\n // Per CT_PPrBase schema order: pStyle, keepNext, keepLines, pageBreakBefore,\n // widowControl, numPr, suppressLineNumbers, pBdr, shd, tabs,\n // suppressAutoHyphens, bidi, adjustRightInd, spacing, ind,\n // contextualSpacing, mirrorIndents, jc, textDirection, textAlignment, outlineLvl\n const prevPPrChildren: XMLElement[] = [];\n if (change.previousProperties) {\n const prev = change.previousProperties;\n\n // 1. pStyle\n if (prev.style) {\n prevPPrChildren.push(XMLBuilder.wSelf('pStyle', { 'w:val': prev.style }));\n }\n\n // 2. keepNext\n if (prev.keepNext !== undefined) {\n prevPPrChildren.push(\n XMLBuilder.wSelf('keepNext', prev.keepNext ? { 'w:val': '1' } : { 'w:val': '0' })\n );\n }\n\n // 3. keepLines\n if (prev.keepLines !== undefined) {\n prevPPrChildren.push(\n XMLBuilder.wSelf('keepLines', prev.keepLines ? { 'w:val': '1' } : { 'w:val': '0' })\n );\n }\n\n // 4. pageBreakBefore\n if (prev.pageBreakBefore !== undefined) {\n prevPPrChildren.push(\n XMLBuilder.wSelf(\n 'pageBreakBefore',\n prev.pageBreakBefore ? { 'w:val': '1' } : { 'w:val': '0' }\n )\n );\n }\n\n // 5. widowControl\n if (prev.widowControl !== undefined) {\n prevPPrChildren.push(\n XMLBuilder.wSelf('widowControl', {\n 'w:val': prev.widowControl ? '1' : '0',\n })\n );\n }\n\n // 6. numPr\n if (prev.numbering) {\n const numPrChildren: XMLElement[] = [];\n if (prev.numbering.level !== undefined) {\n numPrChildren.push(\n XMLBuilder.wSelf('ilvl', { 'w:val': prev.numbering.level.toString() })\n );\n }\n if (prev.numbering.numId !== undefined) {\n numPrChildren.push(\n XMLBuilder.wSelf('numId', { 'w:val': prev.numbering.numId.toString() })\n );\n }\n if (numPrChildren.length > 0) {\n prevPPrChildren.push(XMLBuilder.w('numPr', undefined, numPrChildren));\n }\n }\n\n // 7. suppressLineNumbers\n if (prev.suppressLineNumbers !== undefined) {\n if (prev.suppressLineNumbers) {\n prevPPrChildren.push(XMLBuilder.wSelf('suppressLineNumbers'));\n }\n }\n\n // 8. pBdr (paragraph borders)\n if (prev.borders) {\n const borderChildren: XMLElement[] = [];\n const borderSides = ['top', 'left', 'bottom', 'right', 'between', 'bar'] as const;\n for (const side of borderSides) {\n const border = prev.borders[side];\n if (border) {\n const attrs: Record<string, string> = {};\n if (border.style) attrs['w:val'] = border.style;\n if (border.size !== undefined) attrs['w:sz'] = border.size.toString();\n if (border.color) attrs['w:color'] = border.color;\n if (border.space !== undefined) attrs['w:space'] = border.space.toString();\n if (Object.keys(attrs).length > 0) {\n borderChildren.push(XMLBuilder.wSelf(side, attrs));\n }\n }\n }\n if (borderChildren.length > 0) {\n prevPPrChildren.push(XMLBuilder.w('pBdr', undefined, borderChildren));\n }\n }\n\n // 9. shd (paragraph shading)\n if (prev.shading) {\n const shdAttrs = buildShadingAttributes(prev.shading);\n if (Object.keys(shdAttrs).length > 0) {\n prevPPrChildren.push(XMLBuilder.wSelf('shd', shdAttrs));\n }\n }\n\n // 10. tabs\n if (prev.tabs && prev.tabs.length > 0) {\n const tabChildren: XMLElement[] = prev.tabs.map((tab) => {\n const tabAttrs: Record<string, string> = {\n 'w:pos': tab.position.toString(),\n };\n if (tab.val) tabAttrs['w:val'] = tab.val;\n if (tab.leader) tabAttrs['w:leader'] = tab.leader;\n return XMLBuilder.wSelf('tab', tabAttrs);\n });\n prevPPrChildren.push(XMLBuilder.w('tabs', undefined, tabChildren));\n }\n\n // 11. suppressAutoHyphens\n if (prev.suppressAutoHyphens !== undefined) {\n if (prev.suppressAutoHyphens) {\n prevPPrChildren.push(XMLBuilder.wSelf('suppressAutoHyphens', { 'w:val': '1' }));\n }\n }\n\n // 12. bidi\n if (prev.bidi !== undefined) {\n prevPPrChildren.push(XMLBuilder.wSelf('bidi', { 'w:val': prev.bidi ? '1' : '0' }));\n }\n\n // 13. adjustRightInd\n if (prev.adjustRightInd !== undefined) {\n prevPPrChildren.push(\n XMLBuilder.wSelf('adjustRightInd', {\n 'w:val': prev.adjustRightInd ? '1' : '0',\n })\n );\n }\n\n // 14. spacing\n if (prev.spacing) {\n const spacingAttrs: Record<string, string> = {};\n if (prev.spacing.before !== undefined)\n spacingAttrs['w:before'] = prev.spacing.before.toString();\n if (prev.spacing.after !== undefined)\n spacingAttrs['w:after'] = prev.spacing.after.toString();\n if (prev.spacing.line !== undefined)\n spacingAttrs['w:line'] = prev.spacing.line.toString();\n if (prev.spacing.lineRule) spacingAttrs['w:lineRule'] = prev.spacing.lineRule;\n if (Object.keys(spacingAttrs).length > 0) {\n prevPPrChildren.push(XMLBuilder.wSelf('spacing', spacingAttrs));\n }\n }\n\n // 15. ind (indentation)\n if (prev.indentation) {\n const indAttrs: Record<string, string> = {};\n if (prev.indentation.left !== undefined)\n indAttrs['w:left'] = prev.indentation.left.toString();\n if (prev.indentation.right !== undefined)\n indAttrs['w:right'] = prev.indentation.right.toString();\n if (prev.indentation.firstLine !== undefined)\n indAttrs['w:firstLine'] = prev.indentation.firstLine.toString();\n if (prev.indentation.hanging !== undefined)\n indAttrs['w:hanging'] = prev.indentation.hanging.toString();\n prevPPrChildren.push(XMLBuilder.wSelf('ind', indAttrs));\n }\n\n // 16. contextualSpacing\n if (prev.contextualSpacing !== undefined) {\n prevPPrChildren.push(\n XMLBuilder.wSelf('contextualSpacing', {\n 'w:val': prev.contextualSpacing ? '1' : '0',\n })\n );\n }\n\n // 17. mirrorIndents\n if (prev.mirrorIndents !== undefined) {\n prevPPrChildren.push(\n XMLBuilder.wSelf('mirrorIndents', {\n 'w:val': prev.mirrorIndents ? '1' : '0',\n })\n );\n }\n\n // 18. jc (alignment)\n if (prev.alignment) {\n // Map 'justify' to 'both' per ECMA-376 ST_Jc enumeration\n const alignmentValue = prev.alignment === 'justify' ? 'both' : prev.alignment;\n prevPPrChildren.push(XMLBuilder.wSelf('jc', { 'w:val': alignmentValue }));\n }\n\n // 19. textDirection\n if (prev.textDirection) {\n prevPPrChildren.push(XMLBuilder.wSelf('textDirection', { 'w:val': prev.textDirection }));\n }\n\n // 20. textAlignment\n if (prev.textAlignment) {\n prevPPrChildren.push(XMLBuilder.wSelf('textAlignment', { 'w:val': prev.textAlignment }));\n }\n\n // 21. outlineLvl\n if (prev.outlineLevel !== undefined) {\n prevPPrChildren.push(\n XMLBuilder.wSelf('outlineLvl', { 'w:val': prev.outlineLevel.toString() })\n );\n }\n }\n\n // Create w:pPrChange element with child w:pPr\n // Per ECMA-376 Part 1 §17.13.5.29, w:pPrChange MUST contain a w:pPr child element.\n // Only output pPrChange if we have properties to include in w:pPr.\n // Empty pPrChange elements cause Word to report \"unreadable content\" corruption.\n if (prevPPrChildren.length > 0) {\n const pPrChangeChildren: XMLElement[] = [\n {\n name: 'w:pPr',\n attributes: {},\n children: prevPPrChildren,\n },\n ];\n\n pPrChildren.push({\n name: 'w:pPrChange',\n attributes: attrs,\n children: pPrChangeChildren,\n });\n }\n // If no previous properties to record, skip w:pPrChange entirely to avoid corruption\n }\n\n // Build paragraph element\n const paragraphChildren: XMLElement[] = [];\n\n // Add paragraph properties if there are any\n if (pPrChildren.length > 0) {\n paragraphChildren.push(XMLBuilder.w('pPr', undefined, pPrChildren));\n }\n\n // Add bookmark start markers\n for (const bookmark of this.bookmarksStart) {\n paragraphChildren.push(bookmark.toStartXML());\n }\n\n // Add comment range start markers\n for (const comment of this.commentsStart) {\n paragraphChildren.push(comment.toRangeStartXML());\n }\n\n // Add content (runs, fields, hyperlinks, revisions, range markers, shapes, text boxes)\n for (let i = 0; i < this.content.length; i++) {\n const item = this.content[i];\n if (item instanceof Field) {\n // Simple Field — fldSimple is a paragraph-level element containing w:r children\n paragraphChildren.push(item.toXML());\n } else if (item instanceof ComplexField) {\n // ComplexField returns array of runs - spread them directly into paragraphChildren\n const fieldXml = item.toXML();\n if (Array.isArray(fieldXml)) {\n paragraphChildren.push(...fieldXml);\n } else {\n // Fallback if toXML() doesn't return array\n paragraphChildren.push(XMLBuilder.w('r', undefined, [fieldXml]));\n }\n } else if (item instanceof Hyperlink) {\n // Hyperlinks are their own element\n paragraphChildren.push(item.toXML());\n } else if (item instanceof Revision) {\n // Revisions (track changes) are their own element\n // Property change types (rPrChange, pPrChange, tblPrChange, etc.) are only valid\n // inside their respective property elements (w:rPr, w:pPr, etc.), not as direct\n // children of w:p. Skip them here to avoid producing invalid XML.\n const revType = item.getType();\n if (\n revType === 'runPropertiesChange' ||\n revType === 'paragraphPropertiesChange' ||\n revType === 'tablePropertiesChange' ||\n revType === 'tableExceptionPropertiesChange' ||\n revType === 'tableRowPropertiesChange' ||\n revType === 'tableCellPropertiesChange' ||\n revType === 'sectionPropertiesChange' ||\n revType === 'numberingChange'\n ) {\n continue;\n }\n // Note: toXML() returns null for internal-only revision types (e.g., hyperlinkChange)\n const revisionXml = item.toXML();\n if (revisionXml) {\n paragraphChildren.push(revisionXml);\n }\n } else if (item instanceof RangeMarker) {\n // Range markers are their own element (mark boundaries of moves, etc.)\n paragraphChildren.push(item.toXML());\n } else if (item instanceof Shape) {\n // Shapes are wrapped in a run\n paragraphChildren.push(XMLBuilder.w('r', undefined, [item.toXML()]));\n } else if (item instanceof TextBox) {\n // Text boxes are wrapped in a run\n paragraphChildren.push(XMLBuilder.w('r', undefined, [item.toXML()]));\n } else if (item) {\n paragraphChildren.push(item.toXML());\n }\n }\n\n // If no content, add empty run to prevent invalid XML\n if (this.content.length === 0) {\n paragraphChildren.push(new Run('').toXML());\n }\n\n // Add comment range end markers\n for (const comment of this.commentsEnd) {\n paragraphChildren.push(comment.toRangeEndXML());\n }\n\n // Add comment references (must come after range end)\n for (const comment of this.commentsEnd) {\n paragraphChildren.push(comment.toReferenceXML());\n }\n\n // Add bookmark end markers\n for (const bookmark of this.bookmarksEnd) {\n paragraphChildren.push(bookmark.toEndXML());\n }\n\n // Add paragraph-level attributes (Word 2010+ requires w14:paraId)\n const paragraphAttributes: Record<string, string> = {};\n if (this.formatting.paraId) {\n paragraphAttributes['w14:paraId'] = this.formatting.paraId;\n }\n\n return XMLBuilder.w(\n 'p',\n Object.keys(paragraphAttributes).length > 0 ? paragraphAttributes : undefined,\n paragraphChildren\n );\n }\n\n /**\n * Gets the word count for this paragraph\n *\n * Counts words by splitting text on whitespace and filtering empty strings.\n *\n * @returns Number of words in the paragraph\n *\n * @example\n * ```typescript\n * const count = para.getWordCount();\n * console.log(`Paragraph has ${count} words`);\n * ```\n */\n getWordCount(): number {\n const text = this.getText().trim();\n if (!text) return 0;\n\n // Split by whitespace and filter out empty strings\n const words = text.split(/\\s+/).filter((word) => word.length > 0);\n return words.length;\n }\n\n /**\n * Gets the character count for this paragraph\n *\n * Counts all characters including or excluding whitespace.\n *\n * @param includeSpaces - If true, includes spaces; if false, excludes them (default: true)\n * @returns Number of characters in the paragraph\n *\n * @example\n * ```typescript\n * const withSpaces = para.getLength(); // Includes spaces\n * const noSpaces = para.getLength(false); // Excludes spaces\n * console.log(`${withSpaces} chars (${noSpaces} without spaces)`);\n * ```\n */\n getLength(includeSpaces = true): number {\n const text = this.getText();\n if (includeSpaces) {\n return text.length;\n } else {\n return text.replace(/\\s/g, '').length;\n }\n }\n\n /**\n * Creates a deep clone of this paragraph\n *\n * Creates a new Paragraph with copies of all content, formatting,\n * bookmarks, and comments. The clone is independent of the original.\n *\n * @returns A new Paragraph instance with the same content and formatting\n *\n * @example\n * ```typescript\n * const original = new Paragraph();\n * original.addText('Template text', { bold: true });\n * original.setStyle('Heading1');\n *\n * const copy = original.clone();\n * copy.addText(' - modified'); // Original unchanged\n * ```\n */\n clone(): Paragraph {\n // Clone the formatting\n const clonedFormatting: ParagraphFormatting = deepClone(this.formatting);\n\n // Create new paragraph with cloned formatting\n const clonedParagraph = new Paragraph(clonedFormatting);\n\n // Clone all content (runs, fields, hyperlinks, revisions)\n for (const item of this.content) {\n if (item instanceof Run) {\n // Clone the run with its text and formatting\n const runFormatting = item.getFormatting();\n const clonedRun = new Run(item.getText(), deepClone(runFormatting));\n clonedParagraph.addRun(clonedRun);\n } else {\n // For other content types, add them as-is (shallow copy for now)\n // In a more complete implementation, we'd clone these too\n clonedParagraph.content.push(item);\n }\n }\n\n // Clone bookmark and comment markers\n clonedParagraph.bookmarksStart = [...this.bookmarksStart];\n clonedParagraph.bookmarksEnd = [...this.bookmarksEnd];\n clonedParagraph.commentsStart = [...this.commentsStart];\n clonedParagraph.commentsEnd = [...this.commentsEnd];\n\n return clonedParagraph;\n }\n\n /**\n * Sets paragraph borders\n * @param borders - Border definitions for each side\n * @returns This paragraph for chaining\n * @example\n * ```typescript\n * para.setBorder({\n * top: { style: 'single', size: 4, color: '000000', space: 1 },\n * bottom: { style: 'single', size: 4, color: '000000', space: 1 }\n * });\n * ```\n */\n setBorder(borders: {\n top?: BorderDefinition;\n bottom?: BorderDefinition;\n left?: BorderDefinition;\n right?: BorderDefinition;\n between?: BorderDefinition;\n bar?: BorderDefinition;\n }): this {\n if (!this.formatting) {\n this.formatting = {};\n }\n\n this.formatting.borders = borders;\n\n return this;\n }\n\n /**\n * Sets paragraph shading (background color and pattern)\n * @param shading - Shading options\n * @returns This paragraph for chaining\n * @example\n * ```typescript\n * // Solid background\n * para.setShading({ fill: 'FFFF00', pattern: 'solid' });\n *\n * // Pattern with colors\n * para.setShading({\n * fill: 'FFFF00',\n * color: '000000',\n * pattern: 'diagStripe'\n * });\n * ```\n */\n setShading(shading: ShadingConfig): this {\n if (!this.formatting) {\n this.formatting = {};\n }\n\n const previousValue = this.formatting.shading;\n this.formatting.shading = shading;\n\n if (this.trackingContext?.isEnabled() && previousValue !== shading) {\n this.trackingContext.trackParagraphPropertyChange(this, 'shading', previousValue, shading);\n }\n\n return this;\n }\n\n /**\n * Sets tab stops for the paragraph\n * @param tabs - Array of tab stop definitions\n * @returns This paragraph for chaining\n * @example\n * ```typescript\n * para.setTabs([\n * { position: 720, val: 'left' },\n * { position: 1440, val: 'center', leader: 'dot' },\n * { position: 2160, val: 'right' }\n * ]);\n * ```\n */\n setTabs(tabs: TabStop[]): this {\n if (!this.formatting) {\n this.formatting = {};\n }\n\n this.formatting.tabs = tabs;\n\n return this;\n }\n\n /**\n * Inserts a run at a specific position\n * @param index - Position to insert at (0-based)\n * @param run - Run to insert\n * @returns This paragraph for chaining\n * @example\n * ```typescript\n * const para = new Paragraph();\n * const run = new Run('Inserted', { bold: true });\n * para.insertRunAt(0, run);\n * ```\n */\n insertRunAt(index: number, run: Run): this {\n if (index < 0) index = 0;\n if (index > this.content.length) index = this.content.length;\n\n this.content.splice(index, 0, run);\n return this;\n }\n\n /**\n * Removes a run at a specific position\n * @param index - Position to remove (0-based)\n * @returns True if removed, false if index invalid\n * @example\n * ```typescript\n * para.removeRunAt(2); // Remove third run\n * ```\n */\n removeRunAt(index: number): boolean {\n if (index >= 0 && index < this.content.length) {\n const item = this.content[index];\n if (item instanceof Run) {\n this.content.splice(index, 1);\n return true;\n }\n }\n return false;\n }\n\n /**\n * Replaces a run at a specific position\n * @param index - Position to replace (0-based)\n * @param run - New run\n * @returns True if replaced, false if index invalid or not a run\n * @example\n * ```typescript\n * const newRun = new Run('Replacement', { italic: true });\n * para.replaceRunAt(1, newRun);\n * ```\n */\n replaceRunAt(index: number, run: Run): boolean {\n if (index >= 0 && index < this.content.length) {\n const item = this.content[index];\n if (item instanceof Run) {\n this.content[index] = run;\n return true;\n }\n }\n return false;\n }\n\n /**\n * Finds text within the paragraph and returns run indices\n *\n * Searches through all runs in the paragraph and returns the indices\n * of runs that contain the search text.\n *\n * @param text - The text 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 run indices (0-based) that contain the search text\n *\n * @example\n * ```typescript\n * const indices = para.findText('important');\n * console.log(`Found in runs: ${indices.join(', ')}`);\n *\n * // Highlight all matching runs\n * for (const idx of indices) {\n * const run = para.getRuns()[idx];\n * run?.setHighlight('yellow');\n * }\n * ```\n */\n findText(text: string, options?: { caseSensitive?: boolean; wholeWord?: boolean }): number[] {\n const indices: number[] = [];\n const caseSensitive = options?.caseSensitive || false;\n const wholeWord = options?.wholeWord || false;\n\n const searchText = caseSensitive ? text : text.toLowerCase();\n\n for (let i = 0; i < this.content.length; i++) {\n const item = this.content[i];\n if (item instanceof Run) {\n const runText = caseSensitive ? item.getText() : item.getText().toLowerCase();\n\n if (wholeWord) {\n // Use word boundary regex\n const wordPattern = new RegExp(\n `\\\\b${searchText.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\b`\n );\n if (wordPattern.test(runText)) {\n indices.push(i);\n }\n } else {\n // Simple substring search\n if (runText.includes(searchText)) {\n indices.push(i);\n }\n }\n }\n }\n\n return indices;\n }\n\n /**\n * Replaces text within paragraph runs\n *\n * Searches through all runs and replaces matching text while preserving\n * the original formatting of each run.\n *\n * @param find - The text to search for\n * @param replace - The replacement text\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 Number of replacements made\n *\n * @example\n * ```typescript\n * const count = para.replaceText('color', 'colour');\n * console.log(`Replaced ${count} occurrences`);\n * ```\n *\n * @example\n * ```typescript\n * // Case-sensitive whole word replacement\n * const count = para.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 for (const item of this.content) {\n if (item instanceof Run) {\n const originalText = item.getText();\n let newText = originalText;\n\n if (wholeWord) {\n // Use word boundary regex\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 item.setText(newText);\n }\n }\n }\n\n return replacementCount;\n }\n\n /**\n * Merges another paragraph's content into this one\n *\n * Appends all content (runs, fields, hyperlinks), bookmarks, and comments\n * from another paragraph to this one. The other paragraph is not modified.\n *\n * @param otherPara - The paragraph whose content to merge\n * @returns This paragraph instance for method chaining\n *\n * @example\n * ```typescript\n * const para1 = new Paragraph().addText('Hello ');\n * const para2 = new Paragraph().addText('World');\n * para1.mergeWith(para2); // para1 now contains \"Hello World\"\n * ```\n */\n mergeWith(otherPara: Paragraph): this {\n // Add all content from other paragraph\n for (const item of otherPara.content) {\n if (item instanceof Run) {\n this.content.push(item.clone());\n } else {\n this.content.push(item);\n }\n }\n\n // Merge bookmarks\n this.bookmarksStart.push(...otherPara.bookmarksStart);\n this.bookmarksEnd.push(...otherPara.bookmarksEnd);\n\n // Merge comments\n this.commentsStart.push(...otherPara.commentsStart);\n this.commentsEnd.push(...otherPara.commentsEnd);\n\n return this;\n }\n\n /**\n * Clears direct run formatting from all runs in this paragraph\n *\n * This is useful when applying styles, as direct run formatting takes precedence\n * over style formatting in Word. By clearing direct formatting, the style's\n * formatting can take effect.\n *\n * @param properties - Optional array of specific properties to clear.\n * If not specified, clears ALL direct formatting.\n * Valid properties: 'bold', 'italic', 'underline', 'strike',\n * 'font', 'size', 'color', 'highlight', 'subscript', 'superscript',\n * 'smallCaps', 'allCaps', 'dstrike'\n * @returns This paragraph for chaining\n * @example\n * ```typescript\n * // Clear all direct formatting\n * para.clearDirectRunFormatting();\n *\n * // Clear only font and color\n * para.clearDirectRunFormatting(['font', 'color']);\n *\n * // Apply style and clear all formatting\n * para.setStyle('Heading1').clearDirectRunFormatting();\n * ```\n */\n clearDirectRunFormatting(properties?: string[]): this {\n const runs = this.getRuns();\n\n for (const run of runs) {\n const formatting = run.getFormatting();\n\n if (properties && properties.length > 0) {\n // Clear only specified properties\n const newFormatting: RunFormatting = { ...formatting };\n for (const prop of properties) {\n if (prop in newFormatting) {\n delete (newFormatting as any)[prop];\n }\n }\n\n // Create new run with cleared formatting\n const text = run.getText();\n const newRun = new Run(text, newFormatting);\n\n // Replace in content array\n const index = this.content.indexOf(run);\n if (index !== -1) {\n this.content[index] = newRun;\n }\n } else {\n // Clear ALL direct formatting - replace with plain text run\n const text = run.getText();\n const newRun = new Run(text, {});\n\n // Replace in content array\n const index = this.content.indexOf(run);\n if (index !== -1) {\n this.content[index] = newRun;\n }\n }\n }\n\n return this;\n }\n\n /**\n * Applies a style to this paragraph and optionally clears direct run formatting\n *\n * In Word, direct run formatting takes precedence over style formatting. This method\n * provides a way to apply a style while ensuring it takes effect by clearing\n * conflicting direct formatting.\n *\n * @param styleId - Style ID to apply (e.g., 'Normal', 'Heading1')\n * @param clearProperties - Optional array of run properties to clear.\n * If not specified, does NOT clear any formatting (style overlay behavior).\n * Pass empty array [] to clear ALL formatting.\n * @returns This paragraph for chaining\n * @example\n * ```typescript\n * // Apply Heading1 and clear all direct formatting\n * para.applyStyleAndClearFormatting('Heading1', []);\n *\n * // Apply Normal and clear only font and color\n * para.applyStyleAndClearFormatting('Normal', ['font', 'color']);\n *\n * // Apply Title but keep existing run formatting (overlay style)\n * para.applyStyleAndClearFormatting('Title');\n * ```\n */\n applyStyleAndClearFormatting(styleId: string, clearProperties?: string[]): this {\n // Apply the style\n this.setStyle(styleId);\n\n // Clear direct formatting if requested\n if (clearProperties !== undefined) {\n this.clearDirectRunFormatting(clearProperties.length === 0 ? undefined : clearProperties);\n }\n\n return this;\n }\n\n /**\n * Clears paragraph and run formatting that conflicts with a style definition.\n * Uses smart clearing per ECMA-376 §17.7.2 formatting hierarchy.\n *\n * This is critical because direct formatting in document.xml ALWAYS overrides\n * style definitions in styles.xml. To make style modifications take effect,\n * we must remove conflicting direct formatting.\n *\n * Strategy:\n * - Compare paragraph properties with style's paragraph properties\n * - Clear only properties that DIFFER from the style\n * - For each run, call run.clearFormattingConflicts() with style's run formatting\n * - Preserve style reference (pStyle element)\n *\n * @param styleDefinition - Style object containing both paragraph and run formatting\n * @returns This paragraph for method chaining\n * @example\n * ```typescript\n * // Style defines: left alignment, 14pt black Verdana, 6pt spacing\n * // Paragraph has: center alignment (conflict!), 120 twips spacing (conflict!)\n * // Runs have: red color (conflict!), 12pt size (conflict!), bold (not in style - keep!)\n * const style = stylesManager.getStyle('Heading2');\n * paragraph.clearDirectFormattingConflicts(style);\n * // Result: Alignment cleared, spacing cleared, runs' color/size cleared, bold preserved\n * ```\n */\n clearDirectFormattingConflicts(styleDefinition: {\n getProperties(): {\n paragraphFormatting?: ParagraphFormatting;\n runFormatting?: RunFormatting;\n };\n }): this {\n const styleProperties = styleDefinition.getProperties();\n const styleParagraphFormatting = styleProperties.paragraphFormatting || {};\n const styleRunFormatting = styleProperties.runFormatting || {};\n\n // Clear conflicting paragraph-level properties\n // Keep only pStyle (style reference) - clear everything else that conflicts\n const conflictingParaProps: (keyof ParagraphFormatting)[] = [];\n\n for (const key in this.formatting) {\n const propKey = key as keyof ParagraphFormatting;\n\n // Always preserve style reference\n if (propKey === 'style') {\n continue;\n }\n\n // Skip if style doesn't define this property\n if (styleParagraphFormatting[propKey] === undefined) {\n continue;\n }\n\n // Special handling for indentation - strip direct formatting so style/numbering values take effect\n if (propKey === 'indentation') {\n const paraIndent = this.formatting.indentation;\n const styleIndent = styleParagraphFormatting.indentation;\n\n // Preserve intentional zero-indent overrides\n // When style has left indent > 0 and paragraph explicitly sets left to 0,\n // this is an intentional override to remove the indent - preserve it\n if (paraIndent?.left === 0 && styleIndent?.left && styleIndent.left > 0) {\n continue;\n }\n\n // Clear direct indentation so style value takes effect (consistent with other properties)\n conflictingParaProps.push(propKey);\n continue;\n }\n\n // Handle complex objects (spacing, borders, etc.)\n if (\n propKey === 'spacing' ||\n propKey === 'borders' ||\n propKey === 'shading' ||\n propKey === 'numbering'\n ) {\n // Deep comparison for objects\n const paraValue = this.formatting[propKey];\n const styleValue = styleParagraphFormatting[propKey];\n\n if (JSON.stringify(paraValue) !== JSON.stringify(styleValue)) {\n conflictingParaProps.push(propKey);\n }\n } else {\n // Simple value comparison\n if (this.formatting[propKey] !== styleParagraphFormatting[propKey]) {\n conflictingParaProps.push(propKey);\n }\n }\n }\n\n // Clear conflicting paragraph properties\n for (const prop of conflictingParaProps) {\n delete this.formatting[prop];\n }\n\n // Clear conflicting run-level properties from all runs\n for (const item of this.content) {\n if (item instanceof Run) {\n item.clearFormattingConflicts(styleRunFormatting);\n }\n }\n\n return this;\n }\n\n /**\n * Clears all direct formatting from this paragraph and its runs\n *\n * Removes all direct formatting properties from the paragraph and all its runs,\n * leaving only the style reference and text content. This is useful for ensuring\n * paragraphs match their defined style without formatting overrides.\n *\n * @returns This paragraph for chaining\n * @example\n * ```typescript\n * paragraph.clearDirectFormatting();\n * ```\n */\n clearDirectFormatting(): this {\n // Clear paragraph-level formatting (keep only style, numbering, and preserved flag)\n const style = this.formatting.style;\n const numbering = this.formatting.numbering;\n\n this.formatting = {};\n\n // Restore essential properties\n if (style) this.formatting.style = style;\n if (numbering) this.formatting.numbering = numbering;\n\n // Clear run-level formatting\n for (const item of this.content) {\n if (item instanceof Run) {\n item.clearFormatting();\n }\n }\n\n return this;\n }\n}\n"]}
1
+ {"version":3,"file":"Paragraph.js","sourceRoot":"","sources":["../../src/elements/Paragraph.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Paragraph - Represents a paragraph in a Word document\n * Contains one or more runs of formatted text\n */\n\nimport { deepClone } from '../utils/deepClone';\nimport { formatDateForXml } from '../utils/dateFormatting';\nimport { logParagraphContent, logTextDirection } from '../utils/diagnostics';\nimport { isEqualFormatting } from '../utils/formatting';\nimport { defaultLogger } from '../utils/logger';\nimport { XMLBuilder, XMLElement } from '../xml/XMLBuilder';\nimport { Bookmark } from './Bookmark';\nimport type { Comment } from './Comment';\nimport {\n // Import common types\n ParagraphAlignment as CommonParagraphAlignment,\n BorderStyle as CommonBorderStyle,\n BasicShadingPattern,\n TabAlignment as CommonTabAlignment,\n TabLeader as CommonTabLeader,\n TextDirection as CommonTextDirection,\n TextVerticalAlignment,\n ShadingConfig,\n buildShadingAttributes,\n} from './CommonTypes';\nimport { ComplexField, Field } from './Field';\nimport { Hyperlink } from './Hyperlink';\nimport { RangeMarker } from './RangeMarker';\nimport { Revision } from './Revision';\nimport { Run, RunFormatting } from './Run';\nimport { Shape } from './Shape';\nimport { TextBox } from './TextBox';\nimport { PreservedElement } from './PreservedElement';\n\n// ============================================================================\n// RE-EXPORTED TYPES (for backward compatibility)\n// These types are now defined in CommonTypes.ts but re-exported here\n// to maintain backward compatibility with existing imports.\n// ============================================================================\n\n/**\n * Paragraph alignment options\n * @see CommonTypes.ParagraphAlignment\n */\nexport type ParagraphAlignment = CommonParagraphAlignment;\n\n/**\n * Type to indicate ComplexField support in paragraph content\n */\nexport type FieldLike = Field | ComplexField;\n\n/**\n * Border style types for paragraph borders\n * @see CommonTypes.BorderStyle\n */\nexport type BorderStyle = CommonBorderStyle;\n\n/**\n * Shading pattern types (basic patterns without percentage fills)\n * @see CommonTypes.BasicShadingPattern for basic patterns\n * @see CommonTypes.ShadingPattern for full pattern set including percentages\n */\nexport type ShadingPattern = BasicShadingPattern;\n\n/**\n * Tab stop alignment types\n * @see CommonTypes.TabAlignment\n */\nexport type TabAlignment = CommonTabAlignment;\n\n/**\n * Tab stop leader types\n * @see CommonTypes.TabLeader\n */\nexport type TabLeader = CommonTabLeader;\n\n/**\n * Text direction types for paragraphs\n * @see CommonTypes.TextDirection\n */\nexport type TextDirection = CommonTextDirection;\n\n/**\n * Text vertical alignment types\n * @see CommonTypes.TextVerticalAlignment\n */\nexport type TextAlignment = TextVerticalAlignment;\n\n/**\n * Textbox tight wrap modes\n */\nexport type TextboxTightWrap =\n | 'none'\n | 'allLines'\n | 'firstAndLastLine'\n | 'firstLineOnly'\n | 'lastLineOnly';\n\n/**\n * Paragraph property change tracking (for revision history)\n */\nexport interface ParagraphPropertiesChange {\n /** Author of the change */\n author?: string;\n /** Date of the change */\n date?: string;\n /** Unique ID for this revision */\n id?: string;\n /** Previous paragraph properties before the change (stored as object) */\n previousProperties?: Partial<ParagraphFormatting>;\n}\n\n/**\n * Frame/text box properties\n */\nexport interface FrameProperties {\n /** Width in twips */\n w?: number;\n /** Height in twips */\n h?: number;\n /** Height rule */\n hRule?: 'auto' | 'atLeast' | 'exact';\n /** Absolute horizontal position in twips */\n x?: number;\n /** Absolute vertical position in twips */\n y?: number;\n /** Relative horizontal alignment */\n xAlign?: 'left' | 'center' | 'right' | 'inside' | 'outside';\n /** Relative vertical alignment */\n yAlign?: 'top' | 'center' | 'bottom' | 'inside' | 'outside';\n /** Horizontal anchor/positioning base */\n hAnchor?: 'page' | 'margin' | 'text';\n /** Vertical anchor/positioning base */\n vAnchor?: 'page' | 'margin' | 'text';\n /** Horizontal padding in twips */\n hSpace?: number;\n /** Vertical padding in twips */\n vSpace?: number;\n /** Text wrapping around frame per ECMA-376 ST_Wrap (§17.18.104) */\n wrap?: 'around' | 'auto' | 'none' | 'notBeside' | 'through' | 'tight';\n /** Drop cap style */\n dropCap?: 'none' | 'drop' | 'margin';\n /** Drop cap height in lines */\n lines?: number;\n /** Lock frame anchor to paragraph */\n anchorLock?: boolean;\n}\n\n/**\n * Single border definition\n */\nexport interface BorderDefinition {\n /** Border style */\n style?: BorderStyle;\n /** Border width in eighths of a point (1-96) */\n size?: number;\n /** Border color (hex without #) */\n color?: string;\n /** Space between border and text in points (0-31) */\n space?: number;\n}\n\n/**\n * Tab stop definition\n */\nexport interface TabStop {\n /** Position in twips */\n position: number;\n /** Alignment type */\n val?: TabAlignment;\n /** Leader character */\n leader?: TabLeader;\n}\n\n/**\n * Paragraph formatting options\n */\nexport interface ParagraphFormatting {\n /** Text alignment */\n alignment?: ParagraphAlignment;\n /** Indentation in twips (1/20th of a point) */\n indentation?: {\n left?: number;\n right?: number;\n firstLine?: number;\n hanging?: number;\n };\n /** Spacing per ECMA-376 §17.3.1.33 (CT_Spacing) */\n spacing?: {\n before?: number;\n after?: number;\n line?: number;\n lineRule?: 'auto' | 'exact' | 'atLeast';\n /** Spacing before in hundredths of a line */\n beforeLines?: number;\n /** Spacing after in hundredths of a line */\n afterLines?: number;\n /** Auto-calculate before spacing (overrides w:before when true) */\n beforeAutospacing?: boolean;\n /** Auto-calculate after spacing (overrides w:after when true) */\n afterAutospacing?: boolean;\n };\n /** Keep with next paragraph */\n keepNext?: boolean;\n /** Keep lines together */\n keepLines?: boolean;\n /** Page break before */\n pageBreakBefore?: boolean;\n /** Paragraph style ID */\n style?: string;\n /** Numbering properties */\n numbering?: {\n numId: number;\n level: number;\n };\n /** Contextual spacing - removes spacing between paragraphs of same style */\n contextualSpacing?: boolean;\n /** Paragraph ID (Word 2010+) - required by modern Word for change tracking */\n paraId?: string;\n /** Text ID (Word 2010+) - tracks text modifications for merge conflict resolution */\n textId?: string;\n /** Paragraph borders (top, bottom, left, right, between, bar) */\n borders?: {\n top?: BorderDefinition;\n bottom?: BorderDefinition;\n left?: BorderDefinition;\n right?: BorderDefinition;\n between?: BorderDefinition;\n bar?: BorderDefinition;\n };\n /** Paragraph shading (background color and pattern) */\n shading?: ShadingConfig;\n /** Tab stops */\n tabs?: TabStop[];\n /** Widow/orphan control - prevents single lines at top/bottom of pages */\n widowControl?: boolean;\n /** Outline level (0-9) for table of contents hierarchy */\n outlineLevel?: number;\n /** Suppress line numbers for this paragraph */\n suppressLineNumbers?: boolean;\n /** Right-to-left paragraph layout (for Arabic, Hebrew, etc.) */\n bidi?: boolean;\n /** Text flow direction */\n textDirection?: TextDirection;\n /** Vertical text alignment */\n textAlignment?: TextAlignment;\n /** Use inside/outside indents instead of left/right (for double-sided printing) */\n mirrorIndents?: boolean;\n /** Auto-adjust right indent when document grid is defined */\n adjustRightInd?: boolean;\n /** Text frame/box properties (positioning, wrapping, drop cap) */\n framePr?: FrameProperties;\n /** Suppress automatic hyphenation for this paragraph */\n suppressAutoHyphens?: boolean;\n /** Kinsoku rules - CJK line-breaking rules per ECMA-376 Part 1 §17.3.1.16 */\n kinsoku?: boolean;\n /** Word wrap - allow CJK text to wrap mid-word per ECMA-376 Part 1 §17.3.1.45 */\n wordWrap?: boolean;\n /** Overflow punctuation - allow CJK punctuation to overhang margins per ECMA-376 Part 1 §17.3.1.24 */\n overflowPunct?: boolean;\n /** Top line punctuation - compress CJK punctuation at start of line per ECMA-376 Part 1 §17.3.1.43 */\n topLinePunct?: boolean;\n /** Auto space between East Asian and numeric text per ECMA-376 Part 1 §17.3.1.2 */\n autoSpaceDE?: boolean;\n /** Auto space between East Asian and Western text per ECMA-376 Part 1 §17.3.1.3 */\n autoSpaceDN?: boolean;\n /** Prevent text frames from overlapping */\n suppressOverlap?: boolean;\n /** Tight wrapping mode for text boxes */\n textboxTightWrap?: TextboxTightWrap;\n /** Associated HTML div ID (for HTML round-trip) */\n divId?: number;\n /** Conditional table style formatting (bitmask string, e.g., \"101000000100\") */\n cnfStyle?: string;\n /** Section properties at paragraph level (for section breaks) */\n sectPr?: string | Record<string, unknown>;\n /** Paragraph property change tracking (revision history) */\n pPrChange?: ParagraphPropertiesChange;\n /** Run properties for the paragraph mark (¶ symbol formatting) */\n paragraphMarkRunProperties?: RunFormatting;\n /** Paragraph mark deletion tracking (for deleted ¶ symbols) */\n paragraphMarkDeletion?: {\n /** Unique revision ID */\n id: number;\n /** Author who deleted the paragraph mark */\n author: string;\n /** Date when the paragraph mark was deleted */\n date: Date;\n };\n /** Paragraph mark insertion tracking (for inserted ¶ symbols) */\n paragraphMarkInsertion?: {\n /** Unique revision ID */\n id: number;\n /** Author who inserted the paragraph mark */\n author: string;\n /** Date when the paragraph mark was inserted */\n date: Date;\n };\n /** True when the original XML had numId=0 (explicitly suppressed numbering) */\n numberingSuppressed?: boolean;\n}\n\n/**\n * Paragraph content (runs, fields, hyperlinks, revisions, range markers, shapes, text boxes)\n */\nexport type ParagraphContent =\n | Run\n | FieldLike\n | Hyperlink\n | Revision\n | RangeMarker\n | Shape\n | TextBox\n | PreservedElement;\n\n// ============================================================================\n// TYPE GUARDS FOR ParagraphContent\n// These functions help with type narrowing when working with paragraph content\n// ============================================================================\n\n/**\n * Type guard: Check if content is a Run\n * @param content - Paragraph content item to check\n * @returns True if the content is a Run instance\n */\nexport function isRun(content: ParagraphContent): content is Run {\n return content instanceof Run;\n}\n\n/**\n * Type guard: Check if content is a Field (simple or complex)\n * @param content - Paragraph content item to check\n * @returns True if the content is a Field or ComplexField instance\n */\nexport function isField(content: ParagraphContent): content is FieldLike {\n return content instanceof Field || content instanceof ComplexField;\n}\n\n/**\n * Type guard: Check if content is a simple Field\n * @param content - Paragraph content item to check\n * @returns True if the content is a Field instance (not ComplexField)\n */\nexport function isSimpleField(content: ParagraphContent): content is Field {\n return content instanceof Field && !(content instanceof ComplexField);\n}\n\n/**\n * Type guard: Check if content is a ComplexField\n * @param content - Paragraph content item to check\n * @returns True if the content is a ComplexField instance\n */\nexport function isComplexField(content: ParagraphContent): content is ComplexField {\n return content instanceof ComplexField;\n}\n\n/**\n * Type guard: Check if content is a Hyperlink\n * @param content - Paragraph content item to check\n * @returns True if the content is a Hyperlink instance\n */\nexport function isHyperlink(content: ParagraphContent): content is Hyperlink {\n return content instanceof Hyperlink;\n}\n\n/**\n * Type guard: Check if content is a Revision\n * @param content - Paragraph content item to check\n * @returns True if the content is a Revision instance\n */\nexport function isRevision(content: ParagraphContent): content is Revision {\n return content instanceof Revision;\n}\n\n/**\n * Type guard: Check if content is a RangeMarker (bookmark start/end, comment start/end)\n * @param content - Paragraph content item to check\n * @returns True if the content is a RangeMarker instance\n */\nexport function isRangeMarker(content: ParagraphContent): content is RangeMarker {\n return content instanceof RangeMarker;\n}\n\n/**\n * Type guard: Check if content is a Shape\n * @param content - Paragraph content item to check\n * @returns True if the content is a Shape instance\n */\nexport function isShape(content: ParagraphContent): content is Shape {\n return content instanceof Shape;\n}\n\n/**\n * Type guard: Check if content is a TextBox\n * @param content - Paragraph content item to check\n * @returns True if the content is a TextBox instance\n */\nexport function isTextBox(content: ParagraphContent): content is TextBox {\n return content instanceof TextBox;\n}\n\n/**\n * Represents a paragraph in a document\n */\nexport class Paragraph {\n private content: ParagraphContent[] = [];\n public formatting: ParagraphFormatting;\n private bookmarksStart: Bookmark[] = [];\n private bookmarksEnd: Bookmark[] = [];\n private commentsStart: Comment[] = [];\n private commentsEnd: Comment[] = [];\n /** Internal flag to mark paragraph as preserved from removal operations */\n private _isPreserved = false;\n /** Tracking context for automatic change tracking */\n private trackingContext?: import('../tracking/TrackingContext').TrackingContext;\n /** Parent table cell reference (if paragraph is inside a table cell) */\n private _parentCell?: import('./TableCell').TableCell;\n /** StylesManager reference for conditional formatting resolution */\n private _stylesManager?: import('../formatting/StylesManager').StylesManager;\n /**\n * Internal flag to mark paragraph as part of a multi-paragraph field (e.g., TOC)\n * When true, assembleComplexFields() will skip processing this paragraph\n * to preserve the original field structure across paragraphs.\n * @internal\n */\n _isPartOfMultiParagraphField?: boolean;\n\n /**\n * Creates a new Paragraph\n * @param formatting - Paragraph formatting options\n */\n constructor(formatting: ParagraphFormatting = {}) {\n this.formatting = formatting;\n }\n\n /**\n * Sets the tracking context for automatic change tracking.\n * Called by Document when track changes is enabled.\n * @internal\n */\n _setTrackingContext(context: import('../tracking/TrackingContext').TrackingContext): void {\n this.trackingContext = context;\n }\n\n /**\n * Sets the parent cell reference for this paragraph.\n * Called by TableCell when adding paragraphs.\n * @internal\n */\n _setParentCell(cell: import('./TableCell').TableCell | undefined): void {\n this._parentCell = cell;\n }\n\n /**\n * Gets the parent cell reference for this paragraph.\n * @internal\n */\n _getParentCell(): import('./TableCell').TableCell | undefined {\n return this._parentCell;\n }\n\n /**\n * Checks if this paragraph is inside a table cell.\n * @returns True if paragraph has a parent cell\n */\n isInTableCell(): boolean {\n return this._parentCell !== undefined;\n }\n\n /**\n * Gets the table's cnfStyle (conditional formatting flags) for this paragraph.\n * Returns the cell's cnfStyle if in a table, or the paragraph's own cnfStyle.\n * @returns The cnfStyle string or undefined\n */\n getTableConditionalStyle(): string | undefined {\n // Cell cnfStyle takes precedence\n if (this._parentCell) {\n const cellFormatting = this._parentCell.getFormatting();\n if (cellFormatting.cnfStyle) {\n return cellFormatting.cnfStyle;\n }\n }\n // Fall back to paragraph's own cnfStyle\n return this.formatting.cnfStyle;\n }\n\n /**\n * Sets the StylesManager reference for conditional formatting resolution.\n * Called by Document/Table when adding paragraphs.\n * @internal\n */\n _setStylesManager(manager: import('../formatting/StylesManager').StylesManager): void {\n this._stylesManager = manager;\n }\n\n /**\n * Gets the StylesManager reference for conditional formatting resolution.\n * @internal\n */\n _getStylesManager(): import('../formatting/StylesManager').StylesManager | undefined {\n return this._stylesManager;\n }\n\n /**\n * Creates an empty detached paragraph\n * @returns New Paragraph instance\n * @example\n * const para = Paragraph.create();\n * para.addText('Added later');\n */\n static create(): Paragraph;\n\n /**\n * Creates a detached paragraph with formatting\n * @param formatting - Paragraph formatting options\n * @returns New Paragraph instance\n * @example\n * const para = Paragraph.create({ alignment: 'center' });\n */\n static create(formatting: ParagraphFormatting): Paragraph;\n\n /**\n * Creates a detached paragraph with text and optional formatting\n * @param text - Text content\n * @param formatting - Optional paragraph formatting\n * @returns New Paragraph instance\n * @example\n * const para = Paragraph.create('Hello World', { alignment: 'center' });\n */\n static create(text: string, formatting?: ParagraphFormatting): Paragraph;\n\n /**\n * Creates a detached paragraph (not yet added to a document)\n * @param textOrFormatting - Optional text content or paragraph formatting\n * @param formatting - Optional paragraph formatting (only used if first param is text)\n * @returns New Paragraph instance\n * @example\n * // Create with text and formatting\n * const para1 = Paragraph.create('Hello World', { alignment: 'center' });\n *\n * // Create with just formatting\n * const para2 = Paragraph.create({ alignment: 'right' });\n *\n * // Create empty\n * const para3 = Paragraph.create();\n *\n * // Add to document later\n * doc.addParagraph(para1);\n */\n static create(\n textOrFormatting?: string | ParagraphFormatting,\n formatting?: ParagraphFormatting\n ): Paragraph {\n // Handle overloaded parameters\n if (typeof textOrFormatting === 'string') {\n // First param is text\n const paragraph = new Paragraph(formatting);\n paragraph.addText(textOrFormatting);\n return paragraph;\n } else {\n // First param is formatting (or undefined)\n return new Paragraph(textOrFormatting);\n }\n }\n\n /**\n * Creates a detached paragraph with a specific style\n * @param text - Text content\n * @param styleId - Style ID (e.g., 'Heading1', 'Title')\n * @returns New Paragraph instance\n * @example\n * const heading = Paragraph.createWithStyle('Chapter 1', 'Heading1');\n * doc.addParagraph(heading);\n */\n static createWithStyle(text: string, styleId: string): Paragraph {\n const paragraph = new Paragraph({ style: styleId });\n paragraph.addText(text);\n return paragraph;\n }\n\n /**\n * Creates a detached empty paragraph\n * Useful for adding blank lines or spacing\n * @returns New empty Paragraph instance\n * @example\n * const blank = Paragraph.createEmpty();\n * doc.addParagraph(blank);\n */\n static createEmpty(): Paragraph {\n return new Paragraph();\n }\n\n /**\n * Creates a detached paragraph with formatted text\n * @param text - Text content\n * @param runFormatting - Run formatting (bold, italic, etc.)\n * @param paragraphFormatting - Paragraph formatting (alignment, spacing, etc.)\n * @returns New Paragraph instance\n * @example\n * const para = Paragraph.createFormatted(\n * 'Important Text',\n * { bold: true, color: 'FF0000' },\n * { alignment: 'center' }\n * );\n */\n static createFormatted(\n text: string,\n runFormatting?: RunFormatting,\n paragraphFormatting?: ParagraphFormatting\n ): Paragraph {\n const paragraph = new Paragraph(paragraphFormatting);\n paragraph.addText(text, runFormatting);\n return paragraph;\n }\n\n /**\n * Adds a Run to the paragraph\n *\n * Appends a Run instance to the paragraph's content. Runs are sequences\n * of text with uniform formatting.\n *\n * @param run - The Run instance to add\n * @returns This paragraph instance for method chaining\n *\n * @example\n * ```typescript\n * const para = new Paragraph();\n * const run = new Run('Bold text', { bold: true });\n * para.addRun(run);\n * ```\n */\n addRun(run: Run): this {\n // Set parent reference for setText tracking\n run._setParentParagraph(this);\n\n if (this.trackingContext?.isEnabled()) {\n // Wrap the run in an insert revision when tracking is enabled\n const revision = Revision.createInsertion(this.trackingContext.getAuthor(), run, new Date());\n this.trackingContext.getRevisionManager().register(revision);\n this.content.push(revision);\n } else {\n this.content.push(run);\n }\n return this;\n }\n\n /**\n * Adds a field to the paragraph (supports both Field and ComplexField)\n * @param field - Field or ComplexField to add\n * @returns This paragraph for chaining\n */\n addField(field: FieldLike): this {\n if (this.trackingContext?.isEnabled()) {\n // Fields need special handling - wrap in revision if the field has runs\n // For now, just add directly as complex fields have their own structure\n this.content.push(field);\n } else {\n this.content.push(field);\n }\n return this;\n }\n\n /**\n * Adds a complex field to the paragraph\n * @param field - ComplexField to add\n * @returns This paragraph for chaining\n */\n addComplexField(field: ComplexField): this {\n this.content.push(field);\n return this;\n }\n\n /**\n * Adds a hyperlink to the paragraph\n * @param urlOrHyperlink - URL string for new hyperlink, or existing Hyperlink object\n * @returns Hyperlink object for fluent chaining (when creating new), or this paragraph (when adding existing)\n *\n * @example\n * // Fluent API (new signature)\n * const link = para.addHyperlink('https://example.com');\n * link.setText('Visit Example');\n *\n * // Or use without URL\n * const link2 = para.addHyperlink();\n * link2.setUrl('https://example.com').setText('Link');\n *\n * // Legacy API (still supported)\n * const hyperlink = new Hyperlink({ url: 'https://example.com', text: 'Link' });\n * para.addHyperlink(hyperlink);\n */\n /**\n * Adds a hyperlink to the paragraph\n * NOTE: This method has overloaded return types:\n * - `addHyperlink(url: string)` returns the `Hyperlink` object (for configuring the link)\n * - `addHyperlink(hyperlink: Hyperlink)` returns `this` (for paragraph chaining)\n *\n * @example\n * ```typescript\n * // Pattern 1: Create and configure a new hyperlink\n * const link = para.addHyperlink('https://example.com');\n * link.setText('Visit Example');\n *\n * // Pattern 2: Add pre-built hyperlink (returns paragraph for chaining)\n * para.addHyperlink(new Hyperlink({ url: 'https://example.com', text: 'Link' }))\n * .addText(' more text after the link');\n * ```\n *\n * @param url - URL string to create a new hyperlink\n * @returns Hyperlink object for configuring the link\n */\n addHyperlink(url?: string): Hyperlink;\n /**\n * @param hyperlink - Existing Hyperlink object to add\n * @returns This paragraph for chaining\n */\n addHyperlink(hyperlink: Hyperlink): this;\n addHyperlink(urlOrHyperlink?: string | Hyperlink): Hyperlink | this {\n if (typeof urlOrHyperlink === 'string') {\n // New fluent API: create hyperlink from URL\n const hyperlink = new Hyperlink({ url: urlOrHyperlink, text: urlOrHyperlink });\n hyperlink._setParentParagraph(this);\n if (this.trackingContext?.isEnabled()) {\n const revision = Revision.createInsertion(\n this.trackingContext.getAuthor(),\n hyperlink,\n new Date()\n );\n this.trackingContext.getRevisionManager().register(revision);\n this.content.push(revision);\n } else {\n this.content.push(hyperlink);\n }\n return hyperlink;\n } else if (urlOrHyperlink instanceof Hyperlink) {\n // Legacy API: add existing hyperlink\n urlOrHyperlink._setParentParagraph(this);\n if (this.trackingContext?.isEnabled()) {\n const revision = Revision.createInsertion(\n this.trackingContext.getAuthor(),\n urlOrHyperlink,\n new Date()\n );\n this.trackingContext.getRevisionManager().register(revision);\n this.content.push(revision);\n } else {\n this.content.push(urlOrHyperlink);\n }\n return this;\n } else {\n // No argument: create empty hyperlink for fluent building\n const hyperlink = new Hyperlink({ text: 'Link' });\n hyperlink._setParentParagraph(this);\n if (this.trackingContext?.isEnabled()) {\n const revision = Revision.createInsertion(\n this.trackingContext.getAuthor(),\n hyperlink,\n new Date()\n );\n this.trackingContext.getRevisionManager().register(revision);\n this.content.push(revision);\n } else {\n this.content.push(hyperlink);\n }\n return hyperlink;\n }\n }\n\n /**\n * Adds a revision (tracked change) to the paragraph\n * @param revision - Revision to add\n * @returns This paragraph for chaining\n */\n addRevision(revision: Revision): this {\n this.content.push(revision);\n return this;\n }\n\n /**\n * Adds a range marker to the paragraph\n * Range markers mark the boundaries of moved, inserted, or deleted content\n * @param rangeMarker - Range marker to add\n * @returns This paragraph for chaining\n */\n addRangeMarker(rangeMarker: RangeMarker): this {\n this.content.push(rangeMarker);\n return this;\n }\n\n /**\n * Adds a shape to the paragraph\n * @param shape - Shape to add\n * @returns This paragraph for chaining\n * @example\n * const rect = Shape.createRectangle(inchesToEmus(2), inchesToEmus(1));\n * paragraph.addShape(rect);\n */\n addShape(shape: Shape): this {\n this.content.push(shape);\n return this;\n }\n\n /**\n * Adds a text box to the paragraph\n * @param textbox - TextBox to add\n * @returns This paragraph for chaining\n * @example\n * const textbox = TextBox.create(inchesToEmus(3), inchesToEmus(2));\n * paragraph.addTextBox(textbox);\n */\n addTextBox(textbox: TextBox): this {\n this.content.push(textbox);\n return this;\n }\n\n /**\n * Adds any ParagraphContent item to the paragraph\n * Used for preserved elements (proofErr, permStart/End, etc.)\n * @param item - Content item to add\n * @returns This paragraph for chaining\n */\n addContent(item: ParagraphContent): this {\n this.content.push(item);\n return this;\n }\n\n /**\n * Adds a bookmark start marker at the beginning of this paragraph\n * @param bookmark - Bookmark to add\n * @returns This paragraph for chaining\n */\n addBookmarkStart(bookmark: Bookmark): this {\n this.bookmarksStart.push(bookmark);\n return this;\n }\n\n /**\n * Adds a bookmark end marker at the end of this paragraph\n * @param bookmark - Bookmark to add (must have matching start marker)\n * @returns This paragraph for chaining\n */\n addBookmarkEnd(bookmark: Bookmark): this {\n this.bookmarksEnd.push(bookmark);\n return this;\n }\n\n /**\n * Adds both start and end bookmark markers (wraps entire paragraph)\n * @param bookmark - Bookmark to add\n * @returns This paragraph for chaining\n */\n addBookmark(bookmark: Bookmark): this {\n this.addBookmarkStart(bookmark);\n this.addBookmarkEnd(bookmark);\n return this;\n }\n\n /**\n * Gets all bookmarks that start in this paragraph\n * @returns Array of bookmarks\n */\n getBookmarksStart(): Bookmark[] {\n return [...this.bookmarksStart];\n }\n\n /**\n * Gets all bookmarks that end in this paragraph\n * @returns Array of bookmarks\n */\n getBookmarksEnd(): Bookmark[] {\n return [...this.bookmarksEnd];\n }\n\n /**\n * Removes a bookmark end marker by its ID\n * @param id - The bookmark ID to remove\n * @returns true if a bookmark was removed, false if not found\n */\n removeBookmarkEnd(id: number): boolean {\n const index = this.bookmarksEnd.findIndex((bm) => bm.getId() === id);\n if (index !== -1) {\n this.bookmarksEnd.splice(index, 1);\n return true;\n }\n return false;\n }\n\n /**\n * Adds a comment range start marker at the beginning of this paragraph\n * @param comment - Comment to start\n * @returns This paragraph for chaining\n */\n addCommentStart(comment: Comment): this {\n this.commentsStart.push(comment);\n return this;\n }\n\n /**\n * Adds a comment range end marker at the end of this paragraph\n * @param comment - Comment to end (must have matching start marker)\n * @returns This paragraph for chaining\n */\n addCommentEnd(comment: Comment): this {\n this.commentsEnd.push(comment);\n return this;\n }\n\n /**\n * Adds both start and end comment range markers (comments entire paragraph)\n * @param comment - Comment to add\n * @returns This paragraph for chaining\n */\n addComment(comment: Comment): this {\n this.addCommentStart(comment);\n this.addCommentEnd(comment);\n return this;\n }\n\n /**\n * Gets all comments that start in this paragraph\n * @returns Array of comments\n */\n getCommentsStart(): Comment[] {\n return [...this.commentsStart];\n }\n\n /**\n * Gets all comments that end in this paragraph\n * @returns Array of comments\n */\n getCommentsEnd(): Comment[] {\n return [...this.commentsEnd];\n }\n\n /**\n * Adds a page number field\n * @param formatting - Optional run formatting for the page number\n * @returns This paragraph for chaining\n * @example\n * paragraph.addPageNumber();\n * paragraph.addPageNumber({ bold: true, size: 12 });\n */\n addPageNumber(formatting?: RunFormatting): this {\n return this.addField(Field.createPageNumber(formatting));\n }\n\n /**\n * Adds a total pages field (NUMPAGES)\n * @param formatting - Optional run formatting\n * @returns This paragraph for chaining\n * @example\n * paragraph.addTotalPages();\n */\n addTotalPages(formatting?: RunFormatting): this {\n return this.addField(Field.createTotalPages(formatting));\n }\n\n /**\n * Adds a date field\n * @param format - Date format (e.g., 'MMMM d, yyyy', 'M/d/yyyy')\n * @param formatting - Optional run formatting\n * @returns This paragraph for chaining\n * @example\n * paragraph.addDate();\n * paragraph.addDate('MMMM d, yyyy');\n * paragraph.addDate('M/d/yyyy', { italic: true });\n */\n addDate(format?: string, formatting?: RunFormatting): this {\n return this.addField(Field.createDate(format, formatting));\n }\n\n /**\n * Adds a time field\n * @param format - Time format\n * @param formatting - Optional run formatting\n * @returns This paragraph for chaining\n * @example\n * paragraph.addTime();\n * paragraph.addTime('h:mm:ss tt');\n */\n addTime(format?: string, formatting?: RunFormatting): this {\n return this.addField(Field.createTime(format, formatting));\n }\n\n /**\n * Adds a filename field\n * @param includePath - Whether to include full path\n * @param formatting - Optional run formatting\n * @returns This paragraph for chaining\n * @example\n * paragraph.addFilename();\n * paragraph.addFilename(true); // Includes full path\n */\n addFilename(includePath = false, formatting?: RunFormatting): this {\n return this.addField(Field.createFilename(includePath, formatting));\n }\n\n /**\n * Adds an author field\n * @param formatting - Optional run formatting\n * @returns This paragraph for chaining\n * @example\n * paragraph.addAuthor();\n */\n addAuthor(formatting?: RunFormatting): this {\n return this.addField(Field.createAuthor(formatting));\n }\n\n /**\n * Adds a title field\n * @param formatting - Optional run formatting\n * @returns This paragraph for chaining\n * @example\n * paragraph.addTitle();\n */\n addTitle(formatting?: RunFormatting): this {\n return this.addField(Field.createTitle(formatting));\n }\n\n /**\n * Adds text to the paragraph with optional formatting\n *\n * Creates a new Run with the specified text and formatting, then adds it\n * to the paragraph. This is a convenience method combining Run creation\n * and addition in one call.\n *\n * @param text - The text content to add\n * @param formatting - Optional formatting to apply to the text\n * @returns This paragraph instance for method chaining\n *\n * @example\n * ```typescript\n * const para = new Paragraph();\n * para.addText('Normal text');\n * para.addText('Bold text', { bold: true });\n * para.addText('Red italic', { italic: true, color: 'FF0000' });\n * ```\n */\n addText(text: string, formatting?: RunFormatting): this {\n const run = new Run(text, formatting);\n // Set parent reference for setText tracking\n run._setParentParagraph(this);\n\n if (this.trackingContext?.isEnabled()) {\n // Wrap the run in an insert revision when tracking is enabled\n const revision = Revision.createInsertion(this.trackingContext.getAuthor(), run, new Date());\n this.trackingContext.getRevisionManager().register(revision);\n this.content.push(revision);\n } else {\n this.content.push(run);\n }\n return this;\n }\n\n /**\n * Adds a line break to the paragraph\n *\n * Creates a Run containing a line break element (`w:br`). This produces\n * a soft return (line break within the same paragraph), unlike creating\n * a new paragraph which produces a hard return.\n *\n * @returns This paragraph for chaining\n *\n * @example\n * ```typescript\n * para.addText('Line one');\n * para.addLineBreak();\n * para.addText('Line two (same paragraph)');\n * ```\n */\n addLineBreak(): this {\n const run = new Run('');\n run.addBreak();\n this.content.push(run);\n return this;\n }\n\n /**\n * Adds a column break to the paragraph\n *\n * Inserts a column break element (`w:br w:type=\"column\"`). In multi-column\n * layouts, forces subsequent content to the next column.\n *\n * @returns This paragraph for chaining\n */\n addColumnBreak(): this {\n const run = new Run('');\n run.addBreak('column');\n this.content.push(run);\n return this;\n }\n\n /**\n * Sets the paragraph text content (replaces all existing content)\n *\n * Clears all existing runs, fields, hyperlinks, and other content,\n * then adds a single Run with the specified text and formatting.\n *\n * @param text - The new text content\n * @param formatting - Optional formatting to apply to the text\n * @returns This paragraph instance for method chaining\n *\n * @example\n * ```typescript\n * const para = new Paragraph();\n * para.addText('First text');\n * para.addText('More text');\n * para.setText('Replace all', { bold: true }); // Replaces everything\n * ```\n */\n setText(text: string, formatting?: RunFormatting): this {\n this.content = [new Run(text, formatting)];\n return this;\n }\n\n /**\n * Gets all Run instances in the paragraph\n *\n * Returns only Run objects, excluding other content types like fields,\n * hyperlinks, revisions, and range markers.\n *\n * @returns Array of Run instances\n *\n * @example\n * ```typescript\n * const runs = para.getRuns();\n * console.log(`Paragraph has ${runs.length} text runs`);\n *\n * // Apply formatting to all runs\n * for (const run of runs) {\n * run.setBold(true);\n * }\n * ```\n */\n getRuns(): Run[] {\n const runs: Run[] = [];\n for (const item of this.content) {\n if (item instanceof Run) {\n runs.push(item);\n } else if (item instanceof Revision) {\n // Extract runs from inside revisions (track changes)\n runs.push(...item.getRuns());\n } else if (item instanceof Hyperlink) {\n // Extract run from inside hyperlink\n runs.push(item.getRun());\n }\n }\n return runs;\n }\n\n /**\n * Gets all Revision instances in the paragraph\n *\n * Returns only Revision objects (tracked changes), excluding other content types.\n *\n * @returns Array of Revision instances\n *\n * @example\n * ```typescript\n * const revisions = para.getRevisions();\n * console.log(`Paragraph has ${revisions.length} tracked changes`);\n *\n * // Check each revision\n * for (const rev of revisions) {\n * console.log(`${rev.getType()} by ${rev.getAuthor()}`);\n * }\n * ```\n */\n getRevisions(): Revision[] {\n return this.content.filter((item): item is Revision => item instanceof Revision);\n }\n\n /**\n * Gets all content in the paragraph\n *\n * Returns all content items including runs, fields, hyperlinks,\n * revisions, range markers, shapes, and text boxes.\n *\n * @returns Array of all content items in order\n *\n * @example\n * ```typescript\n * const content = para.getContent();\n * for (const item of content) {\n * if (item instanceof Run) {\n * console.log('Text:', item.getText());\n * } else if (item instanceof Hyperlink) {\n * console.log('Link:', item.getUrl());\n * }\n * }\n * ```\n */\n getContent(): ParagraphContent[] {\n return [...this.content];\n }\n\n /**\n * Clears all content from the paragraph\n *\n * Removes all runs, hyperlinks, fields, revisions, and other content items.\n * The paragraph formatting is preserved.\n *\n * @returns This paragraph instance for method chaining\n *\n * @example\n * ```typescript\n * para.clearContent();\n * para.addText('Fresh start');\n * ```\n */\n clearContent(): this {\n if (this.trackingContext?.isEnabled() && this.content.length > 0) {\n // Wrap all existing content in delete revisions instead of removing\n const deletedContent: ParagraphContent[] = [];\n for (const item of this.content) {\n // Skip items that are already revisions (don't double-wrap)\n if (item instanceof Revision) {\n deletedContent.push(item);\n } else if (item instanceof Run || item instanceof Hyperlink) {\n const revision = Revision.createDeletion(\n this.trackingContext.getAuthor(),\n item,\n new Date()\n );\n this.trackingContext.getRevisionManager().register(revision);\n deletedContent.push(revision);\n } else {\n // For other content types (fields, etc.), just keep them\n // as they may have complex structures\n deletedContent.push(item);\n }\n }\n this.content = deletedContent;\n } else {\n this.content = [];\n }\n return this;\n }\n\n /**\n * Replaces a content item with one or more new items\n *\n * This is useful for tracked changes where a hyperlink needs to be replaced\n * with a deletion revision (containing old hyperlink) and insertion revision\n * (containing new hyperlink).\n *\n * @param oldItem - The item to replace (must be the exact same object reference)\n * @param newItems - The new items to insert in place of the old item\n * @returns true if the item was found and replaced, false if not found\n *\n * @example\n * ```typescript\n * // Replace a hyperlink with tracked changes\n * const deletion = Revision.createDeletion(author, [oldHyperlink]);\n * const insertion = Revision.createInsertion(author, [newHyperlink]);\n * para.replaceContent(hyperlink, [deletion, insertion]);\n * ```\n */\n replaceContent(oldItem: ParagraphContent, newItems: ParagraphContent[]): boolean {\n const index = this.content.indexOf(oldItem);\n if (index === -1) {\n return false;\n }\n\n // Replace the item with the new items\n this.content.splice(index, 1, ...newItems);\n return true;\n }\n\n /**\n * Sets all content of the paragraph, replacing existing content\n *\n * Used for bulk content operations like regrouping field runs\n * into ComplexField objects during parsing.\n *\n * @param content - Array of content items to set\n *\n * @example\n * ```typescript\n * // Replace all content with grouped items\n * para.setContent([run1, complexField, run2]);\n * ```\n */\n setContent(content: ParagraphContent[]): void {\n // If tracking is enabled and we have existing content, create delete revisions\n if (this.trackingContext?.isEnabled() && this.content.length > 0) {\n const deletedContent: ParagraphContent[] = [];\n for (const item of this.content) {\n if (item instanceof Revision) {\n deletedContent.push(item);\n } else if (item instanceof Run || item instanceof Hyperlink) {\n const revision = Revision.createDeletion(\n this.trackingContext.getAuthor(),\n item,\n new Date()\n );\n this.trackingContext.getRevisionManager().register(revision);\n deletedContent.push(revision);\n }\n }\n // New content array starts with deleted items followed by new items\n // But actually, for setContent we probably want to just replace\n // Keep the deletion revisions and add new content\n this.content = [...deletedContent, ...content];\n } else {\n this.content = [...content];\n }\n // Set parent reference for runs and hyperlinks in the content\n for (const item of this.content) {\n if (item instanceof Hyperlink) {\n item._setParentParagraph(this);\n } else if (item instanceof Run) {\n item._setParentParagraph(this);\n }\n }\n }\n\n /**\n * Removes a content item at the specified index\n *\n * When track changes is enabled, wraps the removed item in a delete revision\n * instead of actually removing it.\n *\n * @param index - Index of the item to remove\n * @returns The removed item, or undefined if index is out of bounds\n *\n * @example\n * ```typescript\n * const para = new Paragraph();\n * para.addText('First');\n * para.addText('Second');\n * para.removeContentAt(0); // Removes 'First'\n * ```\n */\n removeContentAt(index: number): ParagraphContent | undefined {\n if (index < 0 || index >= this.content.length) {\n return undefined;\n }\n\n const item = this.content[index];\n\n if (this.trackingContext?.isEnabled()) {\n // Wrap the item in a delete revision instead of removing\n if (item instanceof Run || item instanceof Hyperlink) {\n const revision = Revision.createDeletion(\n this.trackingContext.getAuthor(),\n item,\n new Date()\n );\n this.trackingContext.getRevisionManager().register(revision);\n this.content[index] = revision;\n }\n // For revisions and other types, leave them as-is\n } else {\n this.content.splice(index, 1);\n }\n\n return item;\n }\n\n /**\n * Gets the combined text content of the paragraph\n *\n * Concatenates text from all Runs and Hyperlinks in the paragraph,\n * excluding other content types like fields or revisions.\n *\n * @returns Combined text string from all text-bearing elements\n *\n * @example\n * ```typescript\n * const para = new Paragraph();\n * para.addText('Hello ');\n * para.addText('World');\n * console.log(para.getText()); // \"Hello World\"\n * ```\n */\n getText(): string {\n return this.content\n .filter((item): item is Run | Hyperlink => item instanceof Run || item instanceof Hyperlink)\n .map((item) => item.getText())\n .join('');\n }\n\n /**\n * Gets all fields in the paragraph (both Field and ComplexField)\n *\n * Returns all field instances including simple fields (`<w:fldSimple>`)\n * and complex fields (begin/separate/end structure).\n *\n * @returns Array of fields\n *\n * @example\n * ```typescript\n * const fields = para.getFields();\n * console.log(`P aragraph has ${fields.length} fields`);\n * for (const field of fields) {\n * console.log(`Instruction: ${field.getInstruction()}`);\n * }\n * ```\n */\n getFields(): FieldLike[] {\n return this.content.filter(\n (item): item is FieldLike => item instanceof Field || item instanceof ComplexField\n );\n }\n\n /**\n * Finds fields matching an instruction pattern\n *\n * Searches all fields and returns those whose instruction matches\n * the specified pattern (string or regex).\n *\n * @param pattern - Regex pattern or string to match against instruction\n * @returns Array of matching fields\n *\n * @example\n * ```typescript\n * // Find all PAGE fields\n * const pageFields = para.findFieldsByInstruction('PAGE');\n *\n * // Find all TOC fields\n * const tocFields = para.findFieldsByInstruction(/^TOC/i);\n *\n * // Find fields with specific switches\n * const hyperlinkedFields = para.findFieldsByInstruction(/\\\\h/);\n * ```\n */\n findFieldsByInstruction(pattern: string | RegExp): FieldLike[] {\n const regex = typeof pattern === 'string' ? new RegExp(pattern, 'i') : pattern;\n\n return this.getFields().filter((field) => {\n const instruction = field.getInstruction();\n return regex.test(instruction);\n });\n }\n\n /**\n * Removes all fields from the paragraph\n *\n * Filters out all Field and ComplexField instances, converting them\n * to plain text if they have result text.\n *\n * @returns Count of fields removed\n *\n * @example\n * ```typescript\n * const count = para.removeAllFields();\n * console.log(`Removed ${count} fields`);\n * ```\n */\n removeAllFields(): number {\n const originalLength = this.content.length;\n this.content = this.content.filter(\n (item) => !(item instanceof Field || item instanceof ComplexField)\n );\n return originalLength - this.content.length;\n }\n\n /**\n * Replaces a field with another field or text\n *\n * Swaps out an existing field with a replacement. If replacement is a string,\n * converts it to a Run.\n *\n * @param oldField - Field to replace\n * @param replacement - New field or text to insert\n * @returns True if replacement successful, false if field not found\n *\n * @example\n * ```typescript\n * const pageField = para.getFields()[0];\n * if (pageField) {\n * // Replace with text\n * para.replaceField(pageField, 'Page 1');\n *\n * // Or replace with another field\n * para.replaceField(pageField, Field.createDate());\n * }\n * ```\n */\n replaceField(oldField: FieldLike, replacement: FieldLike | string): boolean {\n const index = this.content.indexOf(oldField);\n if (index === -1) return false;\n\n if (typeof replacement === 'string') {\n this.content[index] = new Run(replacement);\n } else {\n this.content[index] = replacement;\n }\n return true;\n }\n\n /**\n * Gets a copy of the paragraph formatting\n *\n * Returns a copy of all formatting properties including alignment,\n * indentation, spacing, style, numbering, borders, shading, etc.\n *\n * @returns Copy of the paragraph formatting object\n *\n * @example\n * ```typescript\n * const formatting = para.getFormatting();\n * console.log(`Style: ${formatting.style}`);\n * console.log(`Alignment: ${formatting.alignment}`);\n * if (formatting.spacing) {\n * console.log(`Spacing before: ${formatting.spacing.before} twips`);\n * }\n * ```\n */\n getFormatting(): ParagraphFormatting {\n return { ...this.formatting };\n }\n\n // ============================================================================\n // Individual Formatting Getters\n // ============================================================================\n\n /**\n * Gets the left indentation in twips\n * @returns Left indent in twips or undefined if not set\n */\n getLeftIndent(): number | undefined {\n return this.formatting.indentation?.left;\n }\n\n /**\n * Gets the right indentation in twips\n * @returns Right indent in twips or undefined if not set\n */\n getRightIndent(): number | undefined {\n return this.formatting.indentation?.right;\n }\n\n /**\n * Gets the first line indentation in twips\n * @returns First line indent in twips or undefined if not set\n */\n getFirstLineIndent(): number | undefined {\n return this.formatting.indentation?.firstLine;\n }\n\n /**\n * Gets the hanging indentation in twips\n * @returns Hanging indent in twips or undefined if not set\n */\n getHangingIndent(): number | undefined {\n return this.formatting.indentation?.hanging;\n }\n\n /**\n * Gets the spacing before the paragraph in twips\n * @returns Space before in twips or undefined if not set\n */\n getSpaceBefore(): number | undefined {\n return this.formatting.spacing?.before;\n }\n\n /**\n * Gets the spacing after the paragraph in twips\n * @returns Space after in twips or undefined if not set\n */\n getSpaceAfter(): number | undefined {\n return this.formatting.spacing?.after;\n }\n\n /**\n * Gets the line spacing value\n * @returns Line spacing value or undefined if not set\n */\n getLineSpacing(): number | undefined {\n return this.formatting.spacing?.line;\n }\n\n /**\n * Gets the paragraph alignment\n * @returns Alignment ('left', 'center', 'right', 'justify') or undefined\n */\n getAlignment(): string | undefined {\n return this.formatting.alignment;\n }\n\n /**\n * Gets the keepNext property (keep with next paragraph)\n * @returns True if keepNext is set\n */\n getKeepNext(): boolean {\n return this.formatting.keepNext ?? false;\n }\n\n /**\n * Gets the keepLines property (keep lines together)\n * @returns True if keepLines is set\n */\n getKeepLines(): boolean {\n return this.formatting.keepLines ?? false;\n }\n\n /**\n * Gets the pageBreakBefore property\n * @returns True if page break before is set\n */\n getPageBreakBefore(): boolean {\n return this.formatting.pageBreakBefore ?? false;\n }\n\n /**\n * Gets the outline level for TOC headings\n * @returns Outline level (0-8) or undefined if not set\n */\n getOutlineLevel(): number | undefined {\n return this.formatting.outlineLevel;\n }\n\n /**\n * Gets the text direction\n * @returns Text direction or undefined if not set\n */\n getTextDirection(): string | undefined {\n return this.formatting.textDirection;\n }\n\n /**\n * Gets the widow/orphan control setting\n * @returns True if widow control is enabled\n */\n getWidowControl(): boolean {\n return this.formatting.widowControl ?? true; // Word defaults to true\n }\n\n /**\n * Gets the contextual spacing setting\n * @returns True if contextual spacing is enabled\n */\n getContextualSpacing(): boolean {\n return this.formatting.contextualSpacing ?? false;\n }\n\n // ============================================================================\n // Checker Methods (has*, is*, isEmpty)\n // ============================================================================\n\n /**\n * Checks if the paragraph has list numbering applied\n * @returns True if paragraph is part of a list\n */\n hasNumbering(): boolean {\n return this.formatting.numbering?.numId !== undefined && this.formatting.numbering.numId !== 0;\n }\n\n /**\n * Checks if numbering was explicitly suppressed in the original XML (numId=0).\n * This is different from having no numbering — it means the document author\n * intentionally overrode style-inherited numbering.\n * @returns True if numbering is explicitly suppressed\n */\n isNumberingSuppressed(): boolean {\n return this.formatting.numberingSuppressed === true;\n }\n\n /**\n * Checks if the paragraph contains any fields\n * @returns True if paragraph has fields\n */\n hasFields(): boolean {\n return this.getFields().length > 0;\n }\n\n /**\n * Checks if the paragraph has any bookmark start markers\n * @returns True if paragraph has bookmarks\n */\n hasBookmarks(): boolean {\n return this.getBookmarksStart().length > 0;\n }\n\n /**\n * Checks if the paragraph has any comment start markers\n * @returns True if paragraph has comments\n */\n hasComments(): boolean {\n return this.getCommentsStart().length > 0;\n }\n\n /**\n * Checks if the paragraph contains any revisions\n * @returns True if paragraph has revisions\n */\n hasRevisions(): boolean {\n return this.getRevisions().length > 0;\n }\n\n /**\n * Consolidates adjacent revisions of the same type, author, and within a time window.\n *\n * This addresses the \"random insertions and deletions\" problem where Word displays\n * many small revisions instead of consolidated ones. The method merges:\n * - Adjacent insertions from the same author within 1 second\n * - Adjacent deletions from the same author within 1 second\n *\n * **How it works:**\n * - Iterates through paragraph content\n * - When finding consecutive Revisions of same type/author within time window:\n * - Merges their content (Runs/Hyperlinks) into a single Revision\n * - Uses the earliest timestamp for the merged revision\n * - Non-revision content acts as a boundary (stops merging)\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 * @param timeWindowMs - Time window in milliseconds for consolidation (default: 1000ms)\n * @returns Number of revisions that were consolidated (merged)\n *\n * @example\n * ```typescript\n * // Before: Multiple separate insertions\n * para.addText('Hello '); // Creates w:ins #1\n * para.addText('World'); // Creates w:ins #2\n *\n * // Consolidate into single revision\n * const merged = para.consolidateRevisions();\n * console.log(`Consolidated ${merged} revisions`);\n * // Result: Single w:ins containing \"Hello World\"\n * ```\n */\n consolidateRevisions(timeWindowMs = 1000): number {\n if (!this.hasRevisions()) {\n return 0;\n }\n\n const consolidatedContent: ParagraphContent[] = [];\n let mergeCount = 0;\n let currentMergeGroup: Revision | null = null;\n\n for (const item of this.content) {\n if (item instanceof Revision) {\n // Check if we can merge with current group\n if (currentMergeGroup && this.canMergeRevisions(currentMergeGroup, item, timeWindowMs)) {\n // Merge this revision into the current group\n for (const content of item.getContent()) {\n currentMergeGroup.addContent(content);\n }\n mergeCount++;\n } else {\n // Start a new merge group\n if (currentMergeGroup) {\n consolidatedContent.push(currentMergeGroup);\n }\n // Clone the revision to avoid modifying the original\n currentMergeGroup = this.cloneRevision(item);\n }\n } else {\n // Non-revision content - acts as boundary\n if (currentMergeGroup) {\n consolidatedContent.push(currentMergeGroup);\n currentMergeGroup = null;\n }\n consolidatedContent.push(item);\n }\n }\n\n // Don't forget the last merge group\n if (currentMergeGroup) {\n consolidatedContent.push(currentMergeGroup);\n }\n\n // Only update content if we actually merged something\n if (mergeCount > 0) {\n this.content = consolidatedContent;\n }\n\n return mergeCount;\n }\n\n /**\n * Checks if two revisions can be merged based on type, author, and time window.\n * @private\n */\n private canMergeRevisions(rev1: Revision, rev2: Revision, timeWindowMs: number): boolean {\n // Must be same type (both insertions or both deletions)\n if (rev1.getType() !== rev2.getType()) {\n return false;\n }\n\n // Only merge insert/delete content revisions, not property changes\n const mergeableTypes: string[] = ['insert', 'delete', 'moveFrom', 'moveTo'];\n if (!mergeableTypes.includes(rev1.getType())) {\n return false;\n }\n\n // Must be same author\n if (rev1.getAuthor() !== rev2.getAuthor()) {\n return false;\n }\n\n // Must be within time window\n const timeDiff = Math.abs(rev1.getDate().getTime() - rev2.getDate().getTime());\n if (timeDiff > timeWindowMs) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Creates a shallow clone of a revision with cloned content array.\n * @private\n */\n private cloneRevision(revision: Revision): Revision {\n const cloned = new Revision({\n id: revision.getId(),\n author: revision.getAuthor(),\n date: revision.getDate(),\n type: revision.getType(),\n content: [...revision.getContent()],\n previousProperties: revision.getPreviousProperties(),\n newProperties: revision.getNewProperties(),\n moveId: revision.getMoveId(),\n moveLocation: revision.getMoveLocation(),\n location: revision.getLocation(),\n fieldContext: revision.getFieldContext(),\n });\n return cloned;\n }\n\n /**\n * Checks if the paragraph is empty (no text content)\n * @returns True if paragraph has no text\n */\n isEmpty(): boolean {\n return this.getText().trim().length === 0;\n }\n\n /**\n * Checks whether the paragraph text contains a substring\n *\n * Case-insensitive by default. A simpler alternative to `findText()`\n * when you just need a boolean check.\n *\n * @param text - Substring to search for\n * @param caseSensitive - Match case exactly (default: false)\n * @returns True if the paragraph contains the text\n *\n * @example\n * ```typescript\n * if (para.contains('TODO')) {\n * console.log('Found a TODO item');\n * }\n * ```\n */\n contains(text: string, caseSensitive = false): boolean {\n const paraText = caseSensitive ? this.getText() : this.getText().toLowerCase();\n const search = caseSensitive ? text : text.toLowerCase();\n return paraText.includes(search);\n }\n\n /**\n * Gets the paragraph style ID\n *\n * Returns the style identifier if a style is applied to this paragraph.\n *\n * @returns Style ID (e.g., 'Heading1', 'Normal') or undefined if no style is set\n *\n * @example\n * ```typescript\n * const style = para.getStyle();\n * if (style === 'Heading1') {\n * console.log('This is a heading paragraph');\n * }\n * ```\n */\n getStyle(): string | undefined {\n return this.formatting.style;\n }\n\n /**\n * Detects if this paragraph is a heading and returns its level (1-9)\n *\n * Detection is performed using multiple methods in order of reliability:\n * 1. **Style ID matching** - Checks for 'Heading1', 'Heading2', etc. (most reliable)\n * 2. **Outline level** - Uses ECMA-376 outlineLevel property (0-based, where 0 = H1)\n * 3. **Formatting heuristics** - Analyzes text size, boldness, and patterns\n *\n * @returns Heading level (1-9) if detected, null if not a heading\n *\n * @example\n * ```typescript\n * const para = doc.createParagraph('Chapter 1');\n * para.setStyle('Heading1');\n *\n * const level = para.detectHeadingLevel();\n * console.log(level); // 1\n *\n * // Use for TOC generation\n * for (const para of doc.getParagraphs()) {\n * const level = para.detectHeadingLevel();\n * if (level) {\n * console.log(`H${level}: ${para.getText()}`);\n * }\n * }\n * ```\n */\n detectHeadingLevel(): number | null {\n // Method 1: Check style ID (most reliable)\n const style = this.formatting.style;\n if (style) {\n const match = /^Heading(\\d)$/i.exec(style);\n if (match?.[1]) {\n const level = parseInt(match[1], 10);\n // Word supports Heading1-Heading9\n return level >= 1 && level <= 9 ? level : null;\n }\n }\n\n // Method 2: Check outline level (ECMA-376 property)\n // Per ECMA-376 Part 1 §17.3.1.20, outlineLevel is 0-based (0 = Level 1)\n if (this.formatting.outlineLevel !== undefined) {\n const level = this.formatting.outlineLevel + 1;\n return level >= 1 && level <= 9 ? level : null;\n }\n\n // Method 3: Formatting heuristics (least reliable, use as fallback)\n // Only attempt if paragraph has text\n const text = this.getText().trim();\n if (!text) return null;\n\n // Get formatting from first run (headings typically have uniform formatting)\n const runs = this.getRuns();\n if (runs.length === 0) return null;\n\n const firstRun = runs[0];\n if (!firstRun) return null;\n\n const fmt = firstRun.getFormatting();\n if (!fmt) return null;\n\n // Heuristic: Large bold text suggests a heading\n if (fmt.bold && fmt.size) {\n // H1: Very large (>= 24pt)\n if (fmt.size >= 24) return 1;\n // H2: Large (>= 20pt)\n if (fmt.size >= 20) return 2;\n // H3: Medium-large (>= 16pt)\n if (fmt.size >= 16) return 3;\n // H4-H6: Moderate size (14pt+)\n if (fmt.size >= 14) return 4;\n }\n\n // Additional heuristic: All caps bold text (common for headings)\n if (fmt.bold && fmt.allCaps && text.length < 100) {\n return 2; // Often used for section headings\n }\n\n // Not detected as a heading\n return null;\n }\n\n /**\n * Sets paragraph text alignment\n *\n * Controls how text is aligned within the paragraph boundaries.\n *\n * @param alignment - Alignment value ('left' | 'center' | 'right' | 'justify' | 'both')\n * @returns This paragraph instance for method chaining\n *\n * @example\n * ```typescript\n * para.setAlignment('center'); // Center-aligned\n * para.setAlignment('justify'); // Justified text\n * ```\n */\n setAlignment(alignment: ParagraphAlignment): this {\n const previousValue = this.formatting.alignment;\n this.formatting.alignment = alignment;\n if (this.trackingContext?.isEnabled() && previousValue !== alignment) {\n this.trackingContext.trackParagraphPropertyChange(\n this,\n 'alignment',\n previousValue,\n alignment\n );\n }\n return this;\n }\n\n /**\n * Sets left indentation\n *\n * WARNING: If this paragraph has numbering (is part of a list), setting\n * left indentation will be ignored as numbering controls indentation.\n * Use setNumbering() with different levels to change list indentation.\n *\n * @param twips - Indentation in twips (1/20th of a point)\n * @returns This paragraph for chaining\n *\n * @example\n * ```typescript\n * // For regular paragraphs\n * paragraph.setLeftIndent(720); // 0.5 inch indent\n *\n * // For list items, use numbering levels instead\n * paragraph.setNumbering(listId, 1); // Increases indent to level 1\n * ```\n */\n setLeftIndent(twips: number): this {\n if (this.formatting.numbering) {\n // Note: This will be cleared when setNumbering() was called or will be on next call\n // Still allow setting for edge cases, but it will have no effect\n defaultLogger.warn(\n 'Setting left indentation on a numbered paragraph has no effect. ' +\n 'Numbering controls indentation. Use different numbering levels to change indent.'\n );\n }\n const previousValue = this.formatting.indentation?.left;\n if (!this.formatting.indentation) {\n this.formatting.indentation = {};\n }\n this.formatting.indentation.left = twips;\n if (this.trackingContext?.isEnabled() && previousValue !== twips) {\n this.trackingContext.trackParagraphPropertyChange(\n this,\n 'indentation.left',\n previousValue,\n twips\n );\n }\n return this;\n }\n\n /**\n * Sets right indentation\n * @param twips - Indentation in twips\n * @returns This paragraph for chaining\n */\n setRightIndent(twips: number): this {\n const previousValue = this.formatting.indentation?.right;\n if (!this.formatting.indentation) {\n this.formatting.indentation = {};\n }\n this.formatting.indentation.right = twips;\n if (this.trackingContext?.isEnabled() && previousValue !== twips) {\n this.trackingContext.trackParagraphPropertyChange(\n this,\n 'indentation.right',\n previousValue,\n twips\n );\n }\n return this;\n }\n\n /**\n * Sets first line indentation\n *\n * WARNING: If this paragraph has numbering (is part of a list), setting\n * first line indentation will be ignored as numbering controls indentation.\n * Numbered lists use hanging indentation for proper alignment.\n *\n * @param twips - Indentation in twips\n * @returns This paragraph for chaining\n */\n setFirstLineIndent(twips: number): this {\n if (this.formatting.numbering) {\n defaultLogger.warn(\n 'Setting first line indentation on a numbered paragraph has no effect. ' +\n 'Numbering controls indentation using hanging indent.'\n );\n }\n const previousValue = this.formatting.indentation?.firstLine;\n if (!this.formatting.indentation) {\n this.formatting.indentation = {};\n }\n this.formatting.indentation.firstLine = twips;\n if (this.trackingContext?.isEnabled() && previousValue !== twips) {\n this.trackingContext.trackParagraphPropertyChange(\n this,\n 'indentation.firstLine',\n previousValue,\n twips\n );\n }\n return this;\n }\n\n /**\n * Sets hanging indentation\n *\n * Creates a hanging indent where the first line starts at the left margin\n * and subsequent lines are indented. Common for bulleted/numbered lists\n * and bibliographies.\n *\n * WARNING: If this paragraph has numbering (is part of a list), setting\n * hanging indentation manually will be ignored as numbering controls indentation.\n *\n * @param twips - Indentation in twips (must be non-negative)\n * @returns This paragraph for chaining\n *\n * @example\n * ```typescript\n * // Create hanging indent of 0.5 inch (720 twips)\n * paragraph.setHangingIndent(720);\n * ```\n */\n setHangingIndent(twips: number): this {\n if (twips < 0) {\n throw new Error('Hanging indent must be non-negative');\n }\n if (this.formatting.numbering) {\n defaultLogger.warn(\n 'Setting hanging indentation on a numbered paragraph has no effect. ' +\n 'Numbering controls indentation.'\n );\n }\n const previousValue = this.formatting.indentation?.hanging;\n if (!this.formatting.indentation) {\n this.formatting.indentation = {};\n }\n this.formatting.indentation.hanging = twips;\n if (this.trackingContext?.isEnabled() && previousValue !== twips) {\n this.trackingContext.trackParagraphPropertyChange(\n this,\n 'indentation.hanging',\n previousValue,\n twips\n );\n }\n return this;\n }\n\n /**\n * Sets spacing before the paragraph\n *\n * Controls the vertical space above the paragraph.\n * 1 point = 20 twips, so 120 twips = 6pt spacing.\n *\n * @param twips - Spacing value in twips (1/20th of a point)\n * @returns This paragraph instance for method chaining\n *\n * @example\n * ```typescript\n * para.setSpaceBefore(240); // 12pt (240 twips) before paragraph\n * para.setSpaceBefore(0); // No space before\n * ```\n */\n setSpaceBefore(twips: number): this {\n const previousValue = this.formatting.spacing?.before;\n if (!this.formatting.spacing) {\n this.formatting.spacing = {};\n }\n this.formatting.spacing.before = twips;\n if (this.trackingContext?.isEnabled() && previousValue !== twips) {\n this.trackingContext.trackParagraphPropertyChange(\n this,\n 'spacing.before',\n previousValue,\n twips\n );\n }\n return this;\n }\n\n /**\n * Sets spacing after the paragraph\n *\n * Controls the vertical space below the paragraph.\n * 1 point = 20 twips, so 120 twips = 6pt spacing.\n *\n * @param twips - Spacing value in twips (1/20th of a point)\n * @returns This paragraph instance for method chaining\n *\n * @example\n * ```typescript\n * para.setSpaceAfter(120); // 6pt (120 twips) after paragraph\n * para.setSpaceAfter(0); // No space after\n * ```\n */\n setSpaceAfter(twips: number): this {\n const previousValue = this.formatting.spacing?.after;\n if (!this.formatting.spacing) {\n this.formatting.spacing = {};\n }\n this.formatting.spacing.after = twips;\n if (this.trackingContext?.isEnabled() && previousValue !== twips) {\n this.trackingContext.trackParagraphPropertyChange(\n this,\n 'spacing.after',\n previousValue,\n twips\n );\n }\n return this;\n }\n\n /**\n * Sets line spacing within the paragraph\n *\n * Controls the vertical space between lines of text within the paragraph.\n * Per ECMA-376 Part 1 §17.3.1.33 (w:spacing/@w:line)\n *\n * @param twips - Line spacing value in twips (1/20th of a point)\n * @param rule - Line spacing rule (default: 'auto')\n * - 'auto': Line spacing is based on font size (240 twips = single spacing)\n * - 'exact': Exact line height regardless of font size\n * - 'atLeast': Minimum line height, expands if content is larger\n * @returns This paragraph instance for method chaining\n *\n * @example\n * ```typescript\n * para.setLineSpacing(240, 'auto'); // Single spacing\n * para.setLineSpacing(360, 'auto'); // 1.5 spacing\n * para.setLineSpacing(480, 'auto'); // Double spacing\n * para.setLineSpacing(300, 'exact'); // Exactly 15pt line height\n * ```\n */\n setLineSpacing(twips: number, rule: 'auto' | 'exact' | 'atLeast' = 'auto'): this {\n const previousLine = this.formatting.spacing?.line;\n const previousRule = this.formatting.spacing?.lineRule;\n if (!this.formatting.spacing) {\n this.formatting.spacing = {};\n }\n this.formatting.spacing.line = twips;\n this.formatting.spacing.lineRule = rule;\n if (this.trackingContext?.isEnabled()) {\n if (previousLine !== twips) {\n this.trackingContext.trackParagraphPropertyChange(\n this,\n 'spacing.line',\n previousLine,\n twips\n );\n }\n if (previousRule !== rule) {\n this.trackingContext.trackParagraphPropertyChange(\n this,\n 'spacing.lineRule',\n previousRule,\n rule\n );\n }\n }\n return this;\n }\n\n /**\n * Clears all direct spacing properties from the paragraph.\n *\n * Removes the spacing object (before, after, line, lineRule) so the paragraph\n * inherits spacing from its style definition. This is different from setting\n * spacing to 0 — clearing means \"use style value\", while 0 means \"no spacing\".\n *\n * @returns This paragraph instance for method chaining\n *\n * @example\n * ```typescript\n * // Clear direct spacing so Normal style's 3pt/3pt takes effect\n * para.clearSpacing();\n * ```\n */\n clearSpacing(): this {\n delete this.formatting.spacing;\n return this;\n }\n\n /**\n * Sets the paragraph style\n *\n * Applies a style definition to the paragraph. The style must exist\n * in the document's StylesManager.\n *\n * @param styleId - The style identifier (e.g., 'Heading1', 'Normal', 'ListParagraph')\n * @returns This paragraph instance for method chaining\n *\n * @example\n * ```typescript\n * para.setStyle('Heading1'); // Apply Heading1 style\n * para.setStyle('Normal'); // Apply Normal style\n * ```\n */\n setStyle(styleId: string): this {\n const previousValue = this.formatting.style;\n this.formatting.style = styleId;\n if (this.trackingContext?.isEnabled() && previousValue !== styleId) {\n this.trackingContext.trackParagraphPropertyChange(this, 'style', previousValue, styleId);\n }\n return this;\n }\n\n /**\n * Sets keep with next\n *\n * **Automatic Conflict Resolution:**\n * When setting keepNext to true, pageBreakBefore is automatically cleared to prevent\n * layout conflicts. The pageBreakBefore property creates contradictory constraints\n * (breaking the page vs. keeping content together) that cause massive whitespace\n * in Word as the layout engine tries to satisfy both. Keep properties take priority\n * as they represent explicit user intent to keep content together.\n *\n * @param keepNext - Whether to keep with next paragraph\n * @returns This paragraph for chaining\n */\n setKeepNext(keepNext = true): this {\n const previousValue = this.formatting.keepNext;\n this.formatting.keepNext = keepNext;\n\n // Resolve property conflicts: keepNext contradicts pageBreakBefore\n if (keepNext) {\n this.formatting.pageBreakBefore = undefined;\n }\n\n if (this.trackingContext?.isEnabled() && previousValue !== keepNext) {\n this.trackingContext.trackParagraphPropertyChange(this, 'keepNext', previousValue, keepNext);\n }\n return this;\n }\n\n /**\n * Sets keep lines together\n *\n * **Automatic Conflict Resolution:**\n * When setting keepLines to true, pageBreakBefore is automatically cleared to prevent\n * layout conflicts. The pageBreakBefore property creates contradictory constraints\n * (breaking the page vs. keeping lines together) that cause massive whitespace\n * in Word as the layout engine tries to satisfy both. Keep properties take priority\n * as they represent explicit user intent to keep content together.\n *\n * @param keepLines - Whether to keep lines together\n * @returns This paragraph for chaining\n */\n setKeepLines(keepLines = true): this {\n const previousValue = this.formatting.keepLines;\n this.formatting.keepLines = keepLines;\n\n // Resolve property conflicts: keepLines contradicts pageBreakBefore\n if (keepLines) {\n this.formatting.pageBreakBefore = undefined;\n }\n\n if (this.trackingContext?.isEnabled() && previousValue !== keepLines) {\n this.trackingContext.trackParagraphPropertyChange(\n this,\n 'keepLines',\n previousValue,\n keepLines\n );\n }\n return this;\n }\n\n /**\n * Sets page break before\n * @param pageBreakBefore - Whether to insert page break before\n * @returns This paragraph for chaining\n */\n setPageBreakBefore(pageBreakBefore = true): this {\n const previousValue = this.formatting.pageBreakBefore;\n this.formatting.pageBreakBefore = pageBreakBefore;\n if (this.trackingContext?.isEnabled() && previousValue !== pageBreakBefore) {\n this.trackingContext.trackParagraphPropertyChange(\n this,\n 'pageBreakBefore',\n previousValue,\n pageBreakBefore\n );\n }\n return this;\n }\n\n /**\n * Marks this paragraph as preserved to prevent automatic removal by document processing operations\n * (e.g., removing extra blank paragraphs). Useful for spacing paragraphs that should remain\n * even if they appear to be \"extra\" blank lines.\n * @param preserved - Whether to preserve this paragraph\n * @returns This paragraph for chaining\n */\n setPreserved(preserved = true): this {\n this._isPreserved = preserved;\n return this;\n }\n\n /**\n * Checks if this paragraph is marked as preserved from automatic removal\n * @returns True if paragraph should be preserved from removal operations\n */\n isPreserved(): boolean {\n return this._isPreserved;\n }\n\n /**\n * Sets numbering for this paragraph (adds to a list)\n *\n * When numbering is applied, any conflicting paragraph indentation\n * (left, firstLine, hanging) is automatically cleared to prevent\n * override issues. Right indentation is preserved as it doesn't\n * conflict with list formatting.\n *\n * This matches Microsoft Word behavior where numbering controls\n * the indentation, not paragraph-level formatting.\n *\n * @param numId - The numbering instance ID\n * @param level - The level (0-8, where 0 is the outermost level)\n * @returns This paragraph for chaining\n *\n * @example\n * ```typescript\n * const listId = doc.createBulletList();\n * paragraph.setNumbering(listId, 0); // Level 0, indent controlled by numbering\n * paragraph.setNumbering(listId, 1); // Level 1, deeper indent\n * ```\n */\n setNumbering(numId: number, level = 0): this {\n if (numId < 0) {\n throw new Error('Numbering ID must be non-negative');\n }\n if (level < 0 || level > 8) {\n throw new Error('Level must be between 0 and 8');\n }\n\n const previousValue = this.formatting.numbering;\n this.formatting.numbering = { numId, level };\n delete this.formatting.numberingSuppressed;\n\n // Clear conflicting indentation properties\n // Per ECMA-376 §17.3.1.12, paragraph indentation overrides numbering indentation\n // To prevent unexpected behavior, we clear left/firstLine/hanging when numbering is applied\n // This matches Microsoft Word behavior where numbering controls indentation\n if (this.formatting.indentation) {\n const { right } = this.formatting.indentation;\n // Preserve right indent only (doesn't conflict with numbering)\n this.formatting.indentation = right !== undefined ? { right } : undefined;\n }\n\n if (this.trackingContext?.isEnabled()) {\n const newValue = { numId, level };\n if (previousValue?.numId !== newValue.numId || previousValue?.level !== newValue.level) {\n this.trackingContext.trackParagraphPropertyChange(\n this,\n 'numbering',\n previousValue,\n newValue\n );\n }\n }\n return this;\n }\n\n /**\n * Sets contextual spacing for this paragraph\n * When enabled, removes spacing between consecutive paragraphs of the same style\n * Per ECMA-376 Part 1 §17.3.1.8\n * @param enable - Whether to enable contextual spacing\n * @returns This paragraph for chaining\n */\n setContextualSpacing(enable = true): this {\n const previousValue = this.formatting.contextualSpacing;\n this.formatting.contextualSpacing = enable;\n if (this.trackingContext?.isEnabled() && previousValue !== enable) {\n this.trackingContext.trackParagraphPropertyChange(\n this,\n 'contextualSpacing',\n previousValue,\n enable\n );\n }\n return this;\n }\n\n /**\n * Removes numbering from this paragraph\n * @returns This paragraph for chaining\n */\n removeNumbering(): this {\n delete this.formatting.numbering;\n delete this.formatting.numberingSuppressed;\n return this;\n }\n\n /**\n * Gets the numbering properties\n * @returns Numbering properties or undefined\n */\n getNumbering(): { numId: number; level: number } | undefined {\n return this.formatting.numbering ? { ...this.formatting.numbering } : undefined;\n }\n\n /**\n * Sets widow/orphan control for this paragraph\n * Controls whether to prevent single lines at the top or bottom of a page.\n * Word's default is true - set to false to allow widows/orphans.\n * Per ECMA-376 Part 1 §17.3.1.40\n * @param enable - Whether to enable widow/orphan control\n * @returns This paragraph for chaining\n */\n setWidowControl(enable = true): this {\n const previousValue = this.formatting.widowControl;\n this.formatting.widowControl = enable;\n if (this.trackingContext?.isEnabled() && previousValue !== enable) {\n this.trackingContext.trackParagraphPropertyChange(\n this,\n 'widowControl',\n previousValue,\n enable\n );\n }\n return this;\n }\n\n /**\n * Sets outline level for this paragraph (for table of contents)\n * Level 0-9 indicates hierarchy in document structure.\n * Level 0 = highest level (like Heading 1)\n * Level 9 = lowest level\n * Per ECMA-376 Part 1 §17.3.1.19\n * @param level - Outline level (0-9)\n * @returns This paragraph for chaining\n */\n setOutlineLevel(level: number): this {\n if (level < 0 || level > 9) {\n throw new Error('Outline level must be between 0 and 9');\n }\n const previousValue = this.formatting.outlineLevel;\n this.formatting.outlineLevel = level;\n if (this.trackingContext?.isEnabled() && previousValue !== level) {\n this.trackingContext.trackParagraphPropertyChange(this, 'outlineLevel', previousValue, level);\n }\n return this;\n }\n\n /**\n * Sets whether to suppress line numbers for this paragraph\n * Per ECMA-376 Part 1 §17.3.1.34\n * @param suppress - Whether to suppress line numbers\n * @returns This paragraph for chaining\n */\n setSuppressLineNumbers(suppress = true): this {\n const previousValue = this.formatting.suppressLineNumbers;\n this.formatting.suppressLineNumbers = suppress;\n if (this.trackingContext?.isEnabled() && previousValue !== suppress) {\n this.trackingContext.trackParagraphPropertyChange(\n this,\n 'suppressLineNumbers',\n previousValue,\n suppress\n );\n }\n return this;\n }\n\n /**\n * Sets bidirectional text layout (right-to-left)\n * Enables right-to-left paragraph layout for languages like Arabic and Hebrew.\n * Per ECMA-376 Part 1 §17.3.1.6\n * @param enable - Whether to enable bidirectional (RTL) layout\n * @returns This paragraph for chaining\n */\n setBidi(enable = true): this {\n const previousValue = this.formatting.bidi;\n this.formatting.bidi = enable;\n if (this.trackingContext?.isEnabled() && previousValue !== enable) {\n this.trackingContext.trackParagraphPropertyChange(this, 'bidi', previousValue, enable);\n }\n return this;\n }\n\n /**\n * Sets text flow direction for this paragraph\n * Per ECMA-376 Part 1 §17.3.1.36\n * @param direction - Text flow direction\n * - 'lrTb': Left-to-right, top-to-bottom (default for English)\n * - 'tbRl': Top-to-bottom, right-to-left (traditional Chinese/Japanese)\n * - 'btLr': Bottom-to-top, left-to-right (Mongolian)\n * - 'lrTbV': Left-to-right, top-to-bottom vertical\n * - 'tbRlV': Top-to-bottom, right-to-left vertical\n * - 'tbLrV': Top-to-bottom, left-to-right vertical\n * @returns This paragraph for chaining\n */\n setTextDirection(direction: TextDirection): this {\n const previousValue = this.formatting.textDirection;\n this.formatting.textDirection = direction;\n if (this.trackingContext?.isEnabled() && previousValue !== direction) {\n this.trackingContext.trackParagraphPropertyChange(\n this,\n 'textDirection',\n previousValue,\n direction\n );\n }\n return this;\n }\n\n /**\n * Sets vertical text alignment for this paragraph\n * Per ECMA-376 Part 1 §17.3.1.35\n * @param alignment - Vertical alignment\n * - 'top': Align to top of line\n * - 'center': Align to center of line\n * - 'baseline': Align to baseline\n * - 'bottom': Align to bottom of line\n * - 'auto': Automatic alignment\n * @returns This paragraph for chaining\n */\n setTextAlignment(alignment: TextAlignment): this {\n const previousValue = this.formatting.textAlignment;\n this.formatting.textAlignment = alignment;\n if (this.trackingContext?.isEnabled() && previousValue !== alignment) {\n this.trackingContext.trackParagraphPropertyChange(\n this,\n 'textAlignment',\n previousValue,\n alignment\n );\n }\n return this;\n }\n\n /**\n * Sets mirror indents for this paragraph\n * When enabled, uses inside/outside indents instead of left/right for double-sided printing.\n * Per ECMA-376 Part 1 §17.3.1.18\n * @param enable - Whether to enable mirror indents\n * @returns This paragraph for chaining\n */\n setMirrorIndents(enable = true): this {\n const previousValue = this.formatting.mirrorIndents;\n this.formatting.mirrorIndents = enable;\n if (this.trackingContext?.isEnabled() && previousValue !== enable) {\n this.trackingContext.trackParagraphPropertyChange(\n this,\n 'mirrorIndents',\n previousValue,\n enable\n );\n }\n return this;\n }\n\n /**\n * Sets auto-adjust right indent for this paragraph\n * When enabled, automatically adjusts right indent when a document grid is defined.\n * Per ECMA-376 Part 1 §17.3.1.1\n * @param enable - Whether to enable auto-adjust right indent\n * @returns This paragraph for chaining\n */\n setAdjustRightInd(enable = true): this {\n const previousValue = this.formatting.adjustRightInd;\n this.formatting.adjustRightInd = enable;\n if (this.trackingContext?.isEnabled() && previousValue !== enable) {\n this.trackingContext.trackParagraphPropertyChange(\n this,\n 'adjustRightInd',\n previousValue,\n enable\n );\n }\n return this;\n }\n\n /**\n * Sets text frame/box properties for this paragraph\n * Text frames allow positioning paragraphs in specific locations with text wrapping.\n * Per ECMA-376 Part 1 §17.3.1.11\n * @param props - Frame properties\n * - w, h: Width and height in twips\n * - hRule: Height rule ('auto', 'atLeast', 'exact')\n * - x, y: Absolute positioning in twips\n * - xAlign, yAlign: Relative alignment\n * - hAnchor, vAnchor: Positioning base ('page', 'margin', 'text')\n * - hSpace, vSpace: Padding around frame in twips\n * - wrap: Text wrapping ('around', 'notBeside', 'none', 'tight')\n * - dropCap: Drop cap style ('none', 'drop', 'margin')\n * - lines: Drop cap height in lines\n * - anchorLock: Lock frame anchor to paragraph\n * @returns This paragraph for chaining\n */\n setFrameProperties(props: FrameProperties): this {\n const previousValue = this.formatting.framePr;\n this.formatting.framePr = props;\n if (this.trackingContext?.isEnabled() && previousValue !== props) {\n this.trackingContext.trackParagraphPropertyChange(this, 'framePr', previousValue, props);\n }\n return this;\n }\n\n /**\n * Suppress automatic hyphenation for this paragraph\n * Per ECMA-376 Part 1 §17.3.1.33\n * @param suppress - Whether to suppress hyphenation (default: true)\n * @returns This paragraph for chaining\n */\n setSuppressAutoHyphens(suppress = true): this {\n const previousValue = this.formatting.suppressAutoHyphens;\n this.formatting.suppressAutoHyphens = suppress;\n if (this.trackingContext?.isEnabled() && previousValue !== suppress) {\n this.trackingContext.trackParagraphPropertyChange(\n this,\n 'suppressAutoHyphens',\n previousValue,\n suppress\n );\n }\n return this;\n }\n\n /**\n * Sets CJK kinsoku line-breaking rules\n * Per ECMA-376 Part 1 §17.3.1.16\n * @param enable - Whether to enable kinsoku rules (default: true)\n * @returns This paragraph for chaining\n */\n setKinsoku(enable = true): this {\n this.formatting.kinsoku = enable;\n return this;\n }\n\n /**\n * Sets CJK word wrap behavior\n * Per ECMA-376 Part 1 §17.3.1.45\n * @param enable - Whether to allow wrapping mid-word (default: true)\n * @returns This paragraph for chaining\n */\n setWordWrap(enable = true): this {\n this.formatting.wordWrap = enable;\n return this;\n }\n\n /**\n * Sets CJK overflow punctuation\n * Per ECMA-376 Part 1 §17.3.1.24\n * @param enable - Whether to allow punctuation overhang (default: true)\n * @returns This paragraph for chaining\n */\n setOverflowPunct(enable = true): this {\n this.formatting.overflowPunct = enable;\n return this;\n }\n\n /**\n * Sets CJK top line punctuation compression\n * Per ECMA-376 Part 1 §17.3.1.43\n * @param enable - Whether to compress punctuation at line start (default: true)\n * @returns This paragraph for chaining\n */\n setTopLinePunct(enable = true): this {\n this.formatting.topLinePunct = enable;\n return this;\n }\n\n /**\n * Sets auto space between East Asian and numeric text\n * Per ECMA-376 Part 1 §17.3.1.2\n * @param enable - Whether to auto-space (default: true)\n * @returns This paragraph for chaining\n */\n setAutoSpaceDE(enable = true): this {\n this.formatting.autoSpaceDE = enable;\n return this;\n }\n\n /**\n * Sets auto space between East Asian and Western text\n * Per ECMA-376 Part 1 §17.3.1.3\n * @param enable - Whether to auto-space (default: true)\n * @returns This paragraph for chaining\n */\n setAutoSpaceDN(enable = true): this {\n this.formatting.autoSpaceDN = enable;\n return this;\n }\n\n /**\n * Prevent text frames from overlapping with this paragraph\n * Per ECMA-376 Part 1 §17.3.1.34\n * @param suppress - Whether to prevent overlap (default: true)\n * @returns This paragraph for chaining\n */\n setSuppressOverlap(suppress = true): this {\n const previousValue = this.formatting.suppressOverlap;\n this.formatting.suppressOverlap = suppress;\n if (this.trackingContext?.isEnabled() && previousValue !== suppress) {\n this.trackingContext.trackParagraphPropertyChange(\n this,\n 'suppressOverlap',\n previousValue,\n suppress\n );\n }\n return this;\n }\n\n /**\n * Sets tight wrapping mode for text boxes\n * Controls how tightly surrounding text wraps around text box content.\n * Per ECMA-376 Part 1 §17.3.1.37\n * @param wrap - Tight wrap mode\n * - 'none': No tight wrapping\n * - 'allLines': Tight wrap all lines\n * - 'firstAndLastLine': Tight wrap first and last lines only\n * - 'firstLineOnly': Tight wrap first line only\n * - 'lastLineOnly': Tight wrap last line only\n * @returns This paragraph for chaining\n */\n setTextboxTightWrap(wrap: TextboxTightWrap): this {\n const previousValue = this.formatting.textboxTightWrap;\n this.formatting.textboxTightWrap = wrap;\n if (this.trackingContext?.isEnabled() && previousValue !== wrap) {\n this.trackingContext.trackParagraphPropertyChange(\n this,\n 'textboxTightWrap',\n previousValue,\n wrap\n );\n }\n return this;\n }\n\n /**\n * Sets the HTML div ID associated with this paragraph\n * Used for HTML round-trip conversion to preserve div structure.\n * Per ECMA-376 Part 1 §17.3.1.9\n * @param id - Decimal ID referencing a div in the web settings part\n * @returns This paragraph for chaining\n */\n setDivId(id: number): this {\n const previousValue = this.formatting.divId;\n this.formatting.divId = id;\n if (this.trackingContext?.isEnabled() && previousValue !== id) {\n this.trackingContext.trackParagraphPropertyChange(this, 'divId', previousValue, id);\n }\n return this;\n }\n\n /**\n * Sets conditional table style formatting for this paragraph\n * Used to apply conditional formatting based on table position (first row, last column, etc.).\n * Per ECMA-376 Part 1 §17.3.1.8\n * @param bitmask - Bitmask string (e.g., \"101000000100\")\n * Each bit represents a conditional formatting property:\n * - Bit 0: First row\n * - Bit 1: Last row\n * - Bit 2: First column\n * - Bit 3: Last column\n * - Bit 4: Band 1 vertical\n * - Bit 5: Band 2 vertical\n * - Bit 6: Band 1 horizontal\n * - Bit 7: Band 2 horizontal\n * - Bit 8-11: Corner cells (NE, NW, SE, SW)\n * @returns This paragraph for chaining\n */\n setConditionalFormatting(bitmask: string): this {\n const previousValue = this.formatting.cnfStyle;\n this.formatting.cnfStyle = bitmask;\n if (this.trackingContext?.isEnabled() && previousValue !== bitmask) {\n this.trackingContext.trackParagraphPropertyChange(this, 'cnfStyle', previousValue, bitmask);\n }\n return this;\n }\n\n /**\n * Sets section properties for this paragraph\n * Used to define section breaks and section-specific formatting.\n * Per ECMA-376 Part 1 §17.3.1.30\n * @param properties - Section properties object\n * @returns This paragraph for chaining\n */\n setSectionProperties(properties: string | Record<string, unknown>): this {\n const previousValue = this.formatting.sectPr;\n this.formatting.sectPr = properties;\n if (this.trackingContext?.isEnabled() && previousValue !== properties) {\n this.trackingContext.trackParagraphPropertyChange(this, 'sectPr', previousValue, properties);\n }\n return this;\n }\n\n /**\n * Sets paragraph property change tracking information\n * Used for revision history and change tracking.\n * Per ECMA-376 Part 1 §17.3.1.27\n * @param change - Change tracking information\n * @returns This paragraph for chaining\n */\n setParagraphPropertiesChange(change: ParagraphPropertiesChange): this {\n const previousValue = this.formatting.pPrChange;\n this.formatting.pPrChange = change;\n if (this.trackingContext?.isEnabled() && previousValue !== change) {\n this.trackingContext.trackParagraphPropertyChange(this, 'pPrChange', previousValue, change);\n }\n return this;\n }\n\n /**\n * Clears paragraph property change tracking information.\n * Used when accepting revisions to remove the w:pPrChange element.\n * @returns This paragraph for chaining\n */\n clearParagraphPropertiesChange(): this {\n delete this.formatting.pPrChange;\n return this;\n }\n\n /**\n * Sets run properties for the paragraph mark (¶ symbol)\n *\n * The paragraph mark is the invisible character at the end of every paragraph.\n * It can have its own formatting independent of the text runs in the paragraph.\n * This is useful for controlling formatting behavior when text is inserted after\n * the paragraph mark.\n *\n * Per ECMA-376 Part 1 §17.3.1.29 (Run Properties for the Paragraph Mark)\n *\n * Common use cases:\n * - Set default font for new text added to paragraph\n * - Control paragraph mark visibility in \"Show/Hide ¶\" mode\n * - Apply highlighting to paragraph mark for visual consistency\n *\n * @param properties - Run formatting properties for the paragraph mark\n * @returns This paragraph for chaining\n *\n * @example\n * ```typescript\n * // Set paragraph mark to be red and bold\n * paragraph.setParagraphMarkFormatting({ bold: true, color: 'FF0000' });\n *\n * // Hide paragraph mark\n * paragraph.setParagraphMarkFormatting({ vanish: true });\n *\n * // Set default font for new text in this paragraph\n * paragraph.setParagraphMarkFormatting({ font: 'Arial', size: 12 });\n * ```\n */\n setParagraphMarkFormatting(properties: RunFormatting): this {\n const previousValue = this.formatting.paragraphMarkRunProperties;\n this.formatting.paragraphMarkRunProperties = properties;\n if (this.trackingContext?.isEnabled() && previousValue !== properties) {\n this.trackingContext.trackParagraphPropertyChange(\n this,\n 'paragraphMarkRunProperties',\n previousValue,\n properties\n );\n }\n return this;\n }\n\n /**\n * Marks the 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. Word shows this as a deletion\n * of the ¶ symbol.\n *\n * @param id - Unique revision ID\n * @param author - Author who deleted the paragraph mark\n * @param date - Date when the deletion occurred (defaults to now)\n * @returns This paragraph for chaining\n *\n * @example\n * ```typescript\n * paragraph.markParagraphMarkAsDeleted(1, 'Alice', new Date());\n * ```\n */\n markParagraphMarkAsDeleted(id: number, author: string, date?: Date): this {\n this.formatting.paragraphMarkDeletion = {\n id,\n author,\n date: date || new Date(),\n };\n return this;\n }\n\n /**\n * Clears the paragraph mark deletion marker\n * @returns This paragraph for chaining\n */\n clearParagraphMarkDeletion(): this {\n delete this.formatting.paragraphMarkDeletion;\n return this;\n }\n\n /**\n * Checks if the paragraph mark is marked as deleted\n * @returns True if the paragraph mark is deleted\n */\n isParagraphMarkDeleted(): boolean {\n return !!this.formatting.paragraphMarkDeletion;\n }\n\n /**\n * Marks the paragraph mark (¶ symbol) as inserted via tracked changes.\n * This adds a `w:ins` element inside `w:pPr/w:rPr` indicating the insertion\n * of the ¶ symbol.\n *\n * @param id - Unique revision ID\n * @param author - Author who inserted the paragraph mark\n * @param date - Date when the insertion occurred (defaults to now)\n * @returns This paragraph for chaining\n */\n markParagraphMarkAsInserted(id: number, author: string, date?: Date): this {\n this.formatting.paragraphMarkInsertion = {\n id,\n author,\n date: date || new Date(),\n };\n return this;\n }\n\n /**\n * Clears the paragraph mark insertion marker\n * @returns This paragraph for chaining\n */\n clearParagraphMarkInsertion(): this {\n delete this.formatting.paragraphMarkInsertion;\n return this;\n }\n\n /**\n * Checks if the paragraph mark is marked as inserted\n * @returns True if the paragraph mark is inserted\n */\n isParagraphMarkInserted(): boolean {\n return !!this.formatting.paragraphMarkInsertion;\n }\n\n /**\n * Converts the paragraph to WordprocessingML XML element\n *\n * **ECMA-376 Compliance:** Properties are generated in the order specified by\n * ECMA-376 Part 1 §17.3.1.26 to ensure strict OpenXML conformance.\n *\n * Per spec, the order includes (partial list):\n * 1. pStyle (style reference)\n * 2. keepNext (keep with next paragraph)\n * 3. keepLines (keep lines together)\n * 4. pageBreakBefore (page break before)\n * 5. widowControl (widow/orphan control)\n * 6. numPr (numbering properties)\n * 7. suppressLineNumbers (suppress line numbers)\n * 8-10. borders, shading, tabs\n * 11-19. East Asian typography properties\n * 20. bidi (bidirectional layout)\n * 21. adjustRightInd (auto-adjust right indent)\n * 22. spacing, indentation, contextualSpacing\n * 23. mirrorIndents (mirror indents)\n * 24. jc (justification/alignment)\n * 25. textAlignment (vertical text alignment)\n * 26. textDirection (text flow direction)\n * 27. outlineLvl (outline level)\n *\n * @returns XMLElement representing the paragraph\n */\n toXML(): XMLElement {\n // Diagnostic logging before serialization\n const runData = this.getRuns().map((run) => ({\n text: run.getText(),\n rtl: run.isRTL(),\n }));\n logParagraphContent('serialization', -1, runData, this.formatting.bidi);\n\n if (this.formatting.bidi) {\n logTextDirection(`Serializing paragraph with BiDi enabled`);\n }\n\n const pPrChildren: XMLElement[] = [];\n\n // 1. Paragraph style (must be first per ECMA-376 §17.3.1.26)\n if (this.formatting.style) {\n pPrChildren.push(XMLBuilder.wSelf('pStyle', { 'w:val': this.formatting.style }));\n }\n\n // 2. Keep with next paragraph (CT_OnOff — emit val=\"0\" to override style inheritance)\n if (this.formatting.keepNext !== undefined) {\n pPrChildren.push(\n XMLBuilder.wSelf('keepNext', { 'w:val': this.formatting.keepNext ? '1' : '0' })\n );\n }\n\n // 3. Keep lines together\n if (this.formatting.keepLines !== undefined) {\n pPrChildren.push(\n XMLBuilder.wSelf('keepLines', { 'w:val': this.formatting.keepLines ? '1' : '0' })\n );\n }\n\n // CT_PPrBase element order per ECMA-376:\n // pStyle → keepNext → keepLines → pageBreakBefore → framePr → widowControl →\n // numPr → suppressLineNumbers → pBdr → shd → tabs → suppressAutoHyphens →\n // kinsoku → wordWrap → overflowPunct → topLinePunct → autoSpaceDE → autoSpaceDN →\n // bidi → adjustRightInd → spacing → ind → contextualSpacing → mirrorIndents →\n // suppressOverlap → jc → textDirection → textAlignment → textboxTightWrap →\n // outlineLvl → divId → cnfStyle\n\n // 4. Page break before\n if (this.formatting.pageBreakBefore !== undefined) {\n pPrChildren.push(\n XMLBuilder.wSelf('pageBreakBefore', {\n 'w:val': this.formatting.pageBreakBefore ? '1' : '0',\n })\n );\n }\n\n // 5. Text frame properties (framePr)\n if (this.formatting.framePr) {\n const attrs: Record<string, string> = {};\n const f = this.formatting.framePr;\n if (f.w !== undefined) attrs['w:w'] = f.w.toString();\n if (f.h !== undefined) attrs['w:h'] = f.h.toString();\n if (f.hRule) attrs['w:hRule'] = f.hRule;\n if (f.x !== undefined) attrs['w:x'] = f.x.toString();\n if (f.y !== undefined) attrs['w:y'] = f.y.toString();\n if (f.xAlign) attrs['w:xAlign'] = f.xAlign;\n if (f.yAlign) attrs['w:yAlign'] = f.yAlign;\n if (f.hAnchor) attrs['w:hAnchor'] = f.hAnchor;\n if (f.vAnchor) attrs['w:vAnchor'] = f.vAnchor;\n if (f.hSpace !== undefined) attrs['w:hSpace'] = f.hSpace.toString();\n if (f.vSpace !== undefined) attrs['w:vSpace'] = f.vSpace.toString();\n if (f.wrap) attrs['w:wrap'] = f.wrap;\n if (f.dropCap) attrs['w:dropCap'] = f.dropCap;\n if (f.lines !== undefined) attrs['w:lines'] = f.lines.toString();\n if (f.anchorLock !== undefined) attrs['w:anchorLock'] = f.anchorLock ? '1' : '0';\n if (Object.keys(attrs).length > 0) {\n pPrChildren.push(XMLBuilder.wSelf('framePr', attrs));\n }\n }\n\n // 6. Widow/orphan control\n if (this.formatting.widowControl !== undefined) {\n pPrChildren.push(\n XMLBuilder.wSelf('widowControl', {\n 'w:val': this.formatting.widowControl ? '1' : '0',\n })\n );\n }\n\n // 7. Numbering properties\n if (this.formatting.numbering) {\n const numPr = XMLBuilder.w('numPr', undefined, [\n XMLBuilder.wSelf('ilvl', {\n 'w:val': this.formatting.numbering.level.toString(),\n }),\n XMLBuilder.wSelf('numId', {\n 'w:val': this.formatting.numbering.numId.toString(),\n }),\n ]);\n pPrChildren.push(numPr);\n } else if (this.formatting.numberingSuppressed) {\n // Per ECMA-376 §17.3.1.19, numId=0 explicitly removes numbering inherited from style\n const numPr = XMLBuilder.w('numPr', undefined, [\n XMLBuilder.wSelf('ilvl', { 'w:val': '0' }),\n XMLBuilder.wSelf('numId', { 'w:val': '0' }),\n ]);\n pPrChildren.push(numPr);\n }\n\n // 8. Suppress line numbers\n if (this.formatting.suppressLineNumbers !== undefined) {\n pPrChildren.push(\n XMLBuilder.wSelf('suppressLineNumbers', {\n 'w:val': this.formatting.suppressLineNumbers ? '1' : '0',\n })\n );\n }\n\n // 9. Paragraph borders\n if (this.formatting.borders) {\n const borderChildren: XMLElement[] = [];\n const borders = this.formatting.borders;\n\n const createBorder = (\n borderType: string,\n border: BorderDefinition | undefined\n ): XMLElement | null => {\n if (!border) return null;\n const attributes: Record<string, string | number> = {};\n if (border.style) attributes['w:val'] = border.style;\n if (border.size !== undefined) attributes['w:sz'] = border.size;\n if (border.color) attributes['w:color'] = border.color;\n if (border.space !== undefined) attributes['w:space'] = border.space;\n if (Object.keys(attributes).length > 0) {\n return XMLBuilder.wSelf(borderType, attributes);\n }\n return null;\n };\n\n // Add borders in order: top, left, bottom, right, between, bar\n const topBorder = createBorder('top', borders.top);\n if (topBorder) borderChildren.push(topBorder);\n\n const leftBorder = createBorder('left', borders.left);\n if (leftBorder) borderChildren.push(leftBorder);\n\n const bottomBorder = createBorder('bottom', borders.bottom);\n if (bottomBorder) borderChildren.push(bottomBorder);\n\n const rightBorder = createBorder('right', borders.right);\n if (rightBorder) borderChildren.push(rightBorder);\n\n const betweenBorder = createBorder('between', borders.between);\n if (betweenBorder) borderChildren.push(betweenBorder);\n\n const barBorder = createBorder('bar', borders.bar);\n if (barBorder) borderChildren.push(barBorder);\n\n if (borderChildren.length > 0) {\n pPrChildren.push(XMLBuilder.w('pBdr', undefined, borderChildren));\n }\n }\n\n // 10. Paragraph shading\n if (this.formatting.shading) {\n const shdAttrs = buildShadingAttributes(this.formatting.shading);\n if (Object.keys(shdAttrs).length > 0) {\n pPrChildren.push(XMLBuilder.wSelf('shd', shdAttrs));\n }\n }\n\n // 11. Tab stops\n if (this.formatting.tabs && this.formatting.tabs.length > 0) {\n const tabChildren: XMLElement[] = [];\n for (const tab of this.formatting.tabs) {\n const attributes: Record<string, string | number> = {};\n attributes['w:pos'] = tab.position;\n if (tab.val) attributes['w:val'] = tab.val;\n if (tab.leader) attributes['w:leader'] = tab.leader;\n tabChildren.push(XMLBuilder.wSelf('tab', attributes));\n }\n if (tabChildren.length > 0) {\n pPrChildren.push(XMLBuilder.w('tabs', undefined, tabChildren));\n }\n }\n\n // 12. Suppress automatic hyphenation\n if (this.formatting.suppressAutoHyphens !== undefined) {\n pPrChildren.push(\n XMLBuilder.wSelf('suppressAutoHyphens', {\n 'w:val': this.formatting.suppressAutoHyphens ? '1' : '0',\n })\n );\n }\n\n // 13. CJK paragraph properties\n if (this.formatting.kinsoku !== undefined) {\n pPrChildren.push(\n XMLBuilder.wSelf('kinsoku', { 'w:val': this.formatting.kinsoku ? '1' : '0' })\n );\n }\n if (this.formatting.wordWrap !== undefined) {\n pPrChildren.push(\n XMLBuilder.wSelf('wordWrap', { 'w:val': this.formatting.wordWrap ? '1' : '0' })\n );\n }\n if (this.formatting.overflowPunct !== undefined) {\n pPrChildren.push(\n XMLBuilder.wSelf('overflowPunct', { 'w:val': this.formatting.overflowPunct ? '1' : '0' })\n );\n }\n if (this.formatting.topLinePunct !== undefined) {\n pPrChildren.push(\n XMLBuilder.wSelf('topLinePunct', { 'w:val': this.formatting.topLinePunct ? '1' : '0' })\n );\n }\n if (this.formatting.autoSpaceDE !== undefined) {\n pPrChildren.push(\n XMLBuilder.wSelf('autoSpaceDE', { 'w:val': this.formatting.autoSpaceDE ? '1' : '0' })\n );\n }\n if (this.formatting.autoSpaceDN !== undefined) {\n pPrChildren.push(\n XMLBuilder.wSelf('autoSpaceDN', { 'w:val': this.formatting.autoSpaceDN ? '1' : '0' })\n );\n }\n\n // 14. Bidirectional layout\n if (this.formatting.bidi !== undefined) {\n pPrChildren.push(XMLBuilder.wSelf('bidi', { 'w:val': this.formatting.bidi ? '1' : '0' }));\n }\n\n // 15. Auto-adjust right indent\n if (this.formatting.adjustRightInd !== undefined) {\n pPrChildren.push(\n XMLBuilder.wSelf('adjustRightInd', {\n 'w:val': this.formatting.adjustRightInd ? '1' : '0',\n })\n );\n }\n\n // 16. Spacing (before/after/line + autospacing/lines per ECMA-376 §17.3.1.33)\n if (this.formatting.spacing) {\n const spc = this.formatting.spacing;\n const attributes: Record<string, number | string> = {};\n if (spc.before !== undefined) attributes['w:before'] = spc.before;\n if (spc.beforeLines !== undefined) attributes['w:beforeLines'] = spc.beforeLines;\n if (spc.beforeAutospacing !== undefined)\n attributes['w:beforeAutospacing'] = spc.beforeAutospacing ? '1' : '0';\n if (spc.after !== undefined) attributes['w:after'] = spc.after;\n if (spc.afterLines !== undefined) attributes['w:afterLines'] = spc.afterLines;\n if (spc.afterAutospacing !== undefined)\n attributes['w:afterAutospacing'] = spc.afterAutospacing ? '1' : '0';\n if (spc.line !== undefined) attributes['w:line'] = spc.line;\n if (spc.lineRule) attributes['w:lineRule'] = spc.lineRule;\n if (Object.keys(attributes).length > 0) {\n pPrChildren.push(XMLBuilder.wSelf('spacing', attributes));\n }\n }\n\n // 17. Indentation (left/right/firstLine/hanging)\n // Per ECMA-376 §17.3.1.12, firstLine and hanging are mutually exclusive — hanging takes precedence\n if (this.formatting.indentation) {\n const ind = this.formatting.indentation;\n const attributes: Record<string, number> = {};\n if (ind.left !== undefined) attributes['w:left'] = ind.left;\n if (ind.right !== undefined) attributes['w:right'] = ind.right;\n if (ind.hanging !== undefined) {\n attributes['w:hanging'] = ind.hanging;\n } else if (ind.firstLine !== undefined) {\n attributes['w:firstLine'] = ind.firstLine;\n }\n if (Object.keys(attributes).length > 0) {\n pPrChildren.push(XMLBuilder.wSelf('ind', attributes));\n }\n }\n\n // 18. Contextual spacing\n if (this.formatting.contextualSpacing !== undefined) {\n pPrChildren.push(\n XMLBuilder.wSelf('contextualSpacing', {\n 'w:val': this.formatting.contextualSpacing ? '1' : '0',\n })\n );\n }\n\n // 19. Mirror indents\n if (this.formatting.mirrorIndents !== undefined) {\n pPrChildren.push(\n XMLBuilder.wSelf('mirrorIndents', { 'w:val': this.formatting.mirrorIndents ? '1' : '0' })\n );\n }\n\n // 20. Suppress text frame overlap\n if (this.formatting.suppressOverlap !== undefined) {\n pPrChildren.push(\n XMLBuilder.wSelf('suppressOverlap', {\n 'w:val': this.formatting.suppressOverlap ? '1' : '0',\n })\n );\n }\n\n // 21. Justification/Alignment\n if (this.formatting.alignment) {\n const alignmentValue =\n this.formatting.alignment === 'justify' ? 'both' : this.formatting.alignment;\n pPrChildren.push(XMLBuilder.wSelf('jc', { 'w:val': alignmentValue }));\n }\n\n // 22. Text direction\n if (this.formatting.textDirection) {\n pPrChildren.push(\n XMLBuilder.wSelf('textDirection', {\n 'w:val': this.formatting.textDirection,\n })\n );\n }\n\n // 23. Text vertical alignment\n if (this.formatting.textAlignment) {\n pPrChildren.push(\n XMLBuilder.wSelf('textAlignment', {\n 'w:val': this.formatting.textAlignment,\n })\n );\n }\n\n // 24. Textbox tight wrap\n if (this.formatting.textboxTightWrap) {\n pPrChildren.push(\n XMLBuilder.wSelf('textboxTightWrap', {\n 'w:val': this.formatting.textboxTightWrap,\n })\n );\n }\n\n // 25. Outline level\n if (this.formatting.outlineLevel !== undefined) {\n pPrChildren.push(\n XMLBuilder.wSelf('outlineLvl', {\n 'w:val': this.formatting.outlineLevel.toString(),\n })\n );\n }\n\n // 17. HTML div ID per ECMA-376 Part 1 §17.3.1.9\n if (this.formatting.divId !== undefined) {\n pPrChildren.push(XMLBuilder.wSelf('divId', { 'w:val': this.formatting.divId.toString() }));\n }\n\n // 18. Conditional table style formatting per ECMA-376 Part 1 §17.3.1.8\n if (this.formatting.cnfStyle) {\n pPrChildren.push(XMLBuilder.wSelf('cnfStyle', { 'w:val': this.formatting.cnfStyle }));\n }\n\n // 19. Paragraph mark run properties per ECMA-376 Part 1 §17.3.1.29\n // Per CT_PPr, w:rPr comes after all CT_PPrBase elements and before w:sectPr/w:pPrChange\n if (\n this.formatting.paragraphMarkRunProperties ||\n this.formatting.paragraphMarkDeletion ||\n this.formatting.paragraphMarkInsertion\n ) {\n const rPrChildren: XMLElement[] = [];\n\n // Add run properties for the paragraph mark if they exist\n if (this.formatting.paragraphMarkRunProperties) {\n const rPr = Run.generateRunPropertiesXML(this.formatting.paragraphMarkRunProperties);\n if (rPr?.children) {\n // Filter to only XMLElement types (children can be XMLElement or string)\n for (const child of rPr.children) {\n if (typeof child !== 'string') {\n rPrChildren.push(child);\n }\n }\n }\n }\n\n // Per CT_ParaRPr schema, w:ins precedes w:del in the sequence\n // Add insertion marker if the paragraph mark is inserted (w:ins)\n // Per ECMA-376 Part 1 §17.13.5.18 - tracks insertion of paragraph mark\n if (this.formatting.paragraphMarkInsertion) {\n const ins = this.formatting.paragraphMarkInsertion;\n rPrChildren.push(\n XMLBuilder.wSelf('ins', {\n 'w:id': ins.id.toString(),\n 'w:author': ins.author,\n 'w:date': formatDateForXml(ins.date),\n })\n );\n }\n\n // Add deletion marker if the paragraph mark is deleted (w:del)\n // Per ECMA-376 Part 1 §17.13.5.14 - tracks deletion of paragraph mark\n if (this.formatting.paragraphMarkDeletion) {\n const del = this.formatting.paragraphMarkDeletion;\n rPrChildren.push(\n XMLBuilder.wSelf('del', {\n 'w:id': del.id.toString(),\n 'w:author': del.author,\n 'w:date': formatDateForXml(del.date),\n })\n );\n }\n\n // Add w:rPr element if there are any run properties\n if (rPrChildren.length > 0) {\n pPrChildren.push(XMLBuilder.w('rPr', undefined, rPrChildren));\n }\n }\n\n // 20. Paragraph property change tracking per ECMA-376 Part 1 §17.3.1.27\n /**\n * Per OOXML spec, w:pPrChange contains:\n * - Attributes: w:id (required), w:author (required), w:date (optional)\n * - Child element: w:pPr containing the PREVIOUS paragraph properties before the change\n *\n * Structure:\n * <w:pPrChange w:id=\"1\" w:author=\"Author\" w:date=\"2024-01-01T12:00:00Z\">\n * <w:pPr>\n * <!-- Previous paragraph properties -->\n * </w:pPr>\n * </w:pPrChange>\n */\n // Per CT_PPr: sectPr comes BEFORE pPrChange\n if (this.formatting.sectPr) {\n if (typeof this.formatting.sectPr === 'string') {\n // Raw XML passthrough for inline sectPr (preserves exact structure)\n pPrChildren.push({\n name: '__rawXml',\n rawXml: this.formatting.sectPr,\n } as XMLElement);\n }\n // Non-string (parsed object) is skipped to prevent corruption from\n // XMLBuilder.wSelf treating complex objects as flat attributes\n }\n\n if (this.formatting.pPrChange) {\n const change = this.formatting.pPrChange;\n const attrs: Record<string, string> = {};\n // ECMA-376 attribute order: w:id (required), w:author (required), w:date (optional)\n if (change.id) attrs['w:id'] = change.id;\n if (change.author) attrs['w:author'] = change.author;\n if (change.date) attrs['w:date'] = change.date;\n\n // Build child w:pPr element with previous properties\n // Per CT_PPrBase schema order: pStyle, keepNext, keepLines, pageBreakBefore,\n // framePr, widowControl, numPr, suppressLineNumbers, pBdr, shd, tabs,\n // suppressAutoHyphens, kinsoku, wordWrap, overflowPunct, topLinePunct,\n // autoSpaceDE, autoSpaceDN, bidi, adjustRightInd, spacing, ind,\n // contextualSpacing, mirrorIndents, suppressOverlap, jc, textDirection,\n // textAlignment, outlineLvl\n const prevPPrChildren: XMLElement[] = [];\n if (change.previousProperties) {\n const prev = change.previousProperties;\n\n // 1. pStyle\n if (prev.style) {\n prevPPrChildren.push(XMLBuilder.wSelf('pStyle', { 'w:val': prev.style }));\n }\n\n // 2. keepNext\n if (prev.keepNext !== undefined) {\n prevPPrChildren.push(\n XMLBuilder.wSelf('keepNext', prev.keepNext ? { 'w:val': '1' } : { 'w:val': '0' })\n );\n }\n\n // 3. keepLines\n if (prev.keepLines !== undefined) {\n prevPPrChildren.push(\n XMLBuilder.wSelf('keepLines', prev.keepLines ? { 'w:val': '1' } : { 'w:val': '0' })\n );\n }\n\n // 4. pageBreakBefore\n if (prev.pageBreakBefore !== undefined) {\n prevPPrChildren.push(\n XMLBuilder.wSelf(\n 'pageBreakBefore',\n prev.pageBreakBefore ? { 'w:val': '1' } : { 'w:val': '0' }\n )\n );\n }\n\n // 5. framePr (text frame properties)\n if (prev.framePr) {\n const fAttrs: Record<string, string> = {};\n const f = prev.framePr;\n if (f.w !== undefined) fAttrs['w:w'] = f.w.toString();\n if (f.h !== undefined) fAttrs['w:h'] = f.h.toString();\n if (f.hRule) fAttrs['w:hRule'] = f.hRule;\n if (f.x !== undefined) fAttrs['w:x'] = f.x.toString();\n if (f.y !== undefined) fAttrs['w:y'] = f.y.toString();\n if (f.xAlign) fAttrs['w:xAlign'] = f.xAlign;\n if (f.yAlign) fAttrs['w:yAlign'] = f.yAlign;\n if (f.hAnchor) fAttrs['w:hAnchor'] = f.hAnchor;\n if (f.vAnchor) fAttrs['w:vAnchor'] = f.vAnchor;\n if (f.hSpace !== undefined) fAttrs['w:hSpace'] = f.hSpace.toString();\n if (f.vSpace !== undefined) fAttrs['w:vSpace'] = f.vSpace.toString();\n if (f.wrap) fAttrs['w:wrap'] = f.wrap;\n if (f.dropCap) fAttrs['w:dropCap'] = f.dropCap;\n if (f.lines !== undefined) fAttrs['w:lines'] = f.lines.toString();\n if (f.anchorLock !== undefined) fAttrs['w:anchorLock'] = f.anchorLock ? '1' : '0';\n if (Object.keys(fAttrs).length > 0) {\n prevPPrChildren.push(XMLBuilder.wSelf('framePr', fAttrs));\n }\n }\n\n // 6. widowControl\n if (prev.widowControl !== undefined) {\n prevPPrChildren.push(\n XMLBuilder.wSelf('widowControl', {\n 'w:val': prev.widowControl ? '1' : '0',\n })\n );\n }\n\n // 6. numPr\n if (prev.numbering) {\n const numPrChildren: XMLElement[] = [];\n if (prev.numbering.level !== undefined) {\n numPrChildren.push(\n XMLBuilder.wSelf('ilvl', { 'w:val': prev.numbering.level.toString() })\n );\n }\n if (prev.numbering.numId !== undefined) {\n numPrChildren.push(\n XMLBuilder.wSelf('numId', { 'w:val': prev.numbering.numId.toString() })\n );\n }\n if (numPrChildren.length > 0) {\n prevPPrChildren.push(XMLBuilder.w('numPr', undefined, numPrChildren));\n }\n } else if (prev.numberingSuppressed) {\n prevPPrChildren.push(\n XMLBuilder.w('numPr', undefined, [\n XMLBuilder.wSelf('ilvl', { 'w:val': '0' }),\n XMLBuilder.wSelf('numId', { 'w:val': '0' }),\n ])\n );\n }\n\n // 7. suppressLineNumbers\n if (prev.suppressLineNumbers !== undefined) {\n if (prev.suppressLineNumbers) {\n prevPPrChildren.push(XMLBuilder.wSelf('suppressLineNumbers'));\n }\n }\n\n // 8. pBdr (paragraph borders)\n if (prev.borders) {\n const borderChildren: XMLElement[] = [];\n const borderSides = ['top', 'left', 'bottom', 'right', 'between', 'bar'] as const;\n for (const side of borderSides) {\n const border = prev.borders[side];\n if (border) {\n const attrs: Record<string, string> = {};\n if (border.style) attrs['w:val'] = border.style;\n if (border.size !== undefined) attrs['w:sz'] = border.size.toString();\n if (border.color) attrs['w:color'] = border.color;\n if (border.space !== undefined) attrs['w:space'] = border.space.toString();\n if (Object.keys(attrs).length > 0) {\n borderChildren.push(XMLBuilder.wSelf(side, attrs));\n }\n }\n }\n if (borderChildren.length > 0) {\n prevPPrChildren.push(XMLBuilder.w('pBdr', undefined, borderChildren));\n }\n }\n\n // 9. shd (paragraph shading)\n if (prev.shading) {\n const shdAttrs = buildShadingAttributes(prev.shading);\n if (Object.keys(shdAttrs).length > 0) {\n prevPPrChildren.push(XMLBuilder.wSelf('shd', shdAttrs));\n }\n }\n\n // 10. tabs\n if (prev.tabs && prev.tabs.length > 0) {\n const tabChildren: XMLElement[] = prev.tabs.map((tab) => {\n const tabAttrs: Record<string, string> = {\n 'w:pos': tab.position.toString(),\n };\n if (tab.val) tabAttrs['w:val'] = tab.val;\n if (tab.leader) tabAttrs['w:leader'] = tab.leader;\n return XMLBuilder.wSelf('tab', tabAttrs);\n });\n prevPPrChildren.push(XMLBuilder.w('tabs', undefined, tabChildren));\n }\n\n // 11. suppressAutoHyphens\n if (prev.suppressAutoHyphens !== undefined) {\n if (prev.suppressAutoHyphens) {\n prevPPrChildren.push(XMLBuilder.wSelf('suppressAutoHyphens', { 'w:val': '1' }));\n }\n }\n\n // 12. CJK paragraph properties\n if (prev.kinsoku !== undefined) {\n prevPPrChildren.push(XMLBuilder.wSelf('kinsoku', { 'w:val': prev.kinsoku ? '1' : '0' }));\n }\n if (prev.wordWrap !== undefined) {\n prevPPrChildren.push(\n XMLBuilder.wSelf('wordWrap', { 'w:val': prev.wordWrap ? '1' : '0' })\n );\n }\n if (prev.overflowPunct !== undefined) {\n prevPPrChildren.push(\n XMLBuilder.wSelf('overflowPunct', { 'w:val': prev.overflowPunct ? '1' : '0' })\n );\n }\n if (prev.topLinePunct !== undefined) {\n prevPPrChildren.push(\n XMLBuilder.wSelf('topLinePunct', { 'w:val': prev.topLinePunct ? '1' : '0' })\n );\n }\n if (prev.autoSpaceDE !== undefined) {\n prevPPrChildren.push(\n XMLBuilder.wSelf('autoSpaceDE', { 'w:val': prev.autoSpaceDE ? '1' : '0' })\n );\n }\n if (prev.autoSpaceDN !== undefined) {\n prevPPrChildren.push(\n XMLBuilder.wSelf('autoSpaceDN', { 'w:val': prev.autoSpaceDN ? '1' : '0' })\n );\n }\n\n // 13. bidi\n if (prev.bidi !== undefined) {\n prevPPrChildren.push(XMLBuilder.wSelf('bidi', { 'w:val': prev.bidi ? '1' : '0' }));\n }\n\n // 13. adjustRightInd\n if (prev.adjustRightInd !== undefined) {\n prevPPrChildren.push(\n XMLBuilder.wSelf('adjustRightInd', {\n 'w:val': prev.adjustRightInd ? '1' : '0',\n })\n );\n }\n\n // 14. spacing (all 8 CT_Spacing attributes)\n if (prev.spacing) {\n const spacingAttrs: Record<string, string> = {};\n if (prev.spacing.before !== undefined)\n spacingAttrs['w:before'] = prev.spacing.before.toString();\n if (prev.spacing.beforeLines !== undefined)\n spacingAttrs['w:beforeLines'] = prev.spacing.beforeLines.toString();\n if (prev.spacing.beforeAutospacing !== undefined)\n spacingAttrs['w:beforeAutospacing'] = prev.spacing.beforeAutospacing ? '1' : '0';\n if (prev.spacing.after !== undefined)\n spacingAttrs['w:after'] = prev.spacing.after.toString();\n if (prev.spacing.afterLines !== undefined)\n spacingAttrs['w:afterLines'] = prev.spacing.afterLines.toString();\n if (prev.spacing.afterAutospacing !== undefined)\n spacingAttrs['w:afterAutospacing'] = prev.spacing.afterAutospacing ? '1' : '0';\n if (prev.spacing.line !== undefined)\n spacingAttrs['w:line'] = prev.spacing.line.toString();\n if (prev.spacing.lineRule) spacingAttrs['w:lineRule'] = prev.spacing.lineRule;\n if (Object.keys(spacingAttrs).length > 0) {\n prevPPrChildren.push(XMLBuilder.wSelf('spacing', spacingAttrs));\n }\n }\n\n // 15. ind (indentation)\n if (prev.indentation) {\n const indAttrs: Record<string, string> = {};\n if (prev.indentation.left !== undefined)\n indAttrs['w:left'] = prev.indentation.left.toString();\n if (prev.indentation.right !== undefined)\n indAttrs['w:right'] = prev.indentation.right.toString();\n if (prev.indentation.firstLine !== undefined)\n indAttrs['w:firstLine'] = prev.indentation.firstLine.toString();\n if (prev.indentation.hanging !== undefined)\n indAttrs['w:hanging'] = prev.indentation.hanging.toString();\n prevPPrChildren.push(XMLBuilder.wSelf('ind', indAttrs));\n }\n\n // 16. contextualSpacing\n if (prev.contextualSpacing !== undefined) {\n prevPPrChildren.push(\n XMLBuilder.wSelf('contextualSpacing', {\n 'w:val': prev.contextualSpacing ? '1' : '0',\n })\n );\n }\n\n // 17. mirrorIndents\n if (prev.mirrorIndents !== undefined) {\n prevPPrChildren.push(\n XMLBuilder.wSelf('mirrorIndents', {\n 'w:val': prev.mirrorIndents ? '1' : '0',\n })\n );\n }\n\n // 18. suppressOverlap\n if (prev.suppressOverlap !== undefined) {\n prevPPrChildren.push(\n XMLBuilder.wSelf('suppressOverlap', {\n 'w:val': prev.suppressOverlap ? '1' : '0',\n })\n );\n }\n\n // 19. jc (alignment)\n if (prev.alignment) {\n // Map 'justify' to 'both' per ECMA-376 ST_Jc enumeration\n const alignmentValue = prev.alignment === 'justify' ? 'both' : prev.alignment;\n prevPPrChildren.push(XMLBuilder.wSelf('jc', { 'w:val': alignmentValue }));\n }\n\n // 19. textDirection\n if (prev.textDirection) {\n prevPPrChildren.push(XMLBuilder.wSelf('textDirection', { 'w:val': prev.textDirection }));\n }\n\n // 20. textAlignment\n if (prev.textAlignment) {\n prevPPrChildren.push(XMLBuilder.wSelf('textAlignment', { 'w:val': prev.textAlignment }));\n }\n\n // 21. textboxTightWrap\n if (prev.textboxTightWrap) {\n prevPPrChildren.push(\n XMLBuilder.wSelf('textboxTightWrap', { 'w:val': prev.textboxTightWrap })\n );\n }\n\n // 22. outlineLvl\n if (prev.outlineLevel !== undefined) {\n prevPPrChildren.push(\n XMLBuilder.wSelf('outlineLvl', { 'w:val': prev.outlineLevel.toString() })\n );\n }\n\n // 23. divId\n if (prev.divId !== undefined) {\n prevPPrChildren.push(XMLBuilder.wSelf('divId', { 'w:val': prev.divId.toString() }));\n }\n\n // 24. cnfStyle\n if (prev.cnfStyle) {\n prevPPrChildren.push(XMLBuilder.wSelf('cnfStyle', { 'w:val': prev.cnfStyle }));\n }\n }\n\n // Create w:pPrChange element with child w:pPr\n // Per ECMA-376 Part 1 §17.13.5.29, w:pPrChange MUST contain a w:pPr child element.\n // Only output pPrChange if we have properties to include in w:pPr.\n // Empty pPrChange elements cause Word to report \"unreadable content\" corruption.\n if (prevPPrChildren.length > 0) {\n const pPrChangeChildren: XMLElement[] = [\n {\n name: 'w:pPr',\n attributes: {},\n children: prevPPrChildren,\n },\n ];\n\n pPrChildren.push({\n name: 'w:pPrChange',\n attributes: attrs,\n children: pPrChangeChildren,\n });\n }\n // If no previous properties to record, skip w:pPrChange entirely to avoid corruption\n }\n\n // Build paragraph element\n const paragraphChildren: XMLElement[] = [];\n\n // Add paragraph properties if there are any\n if (pPrChildren.length > 0) {\n paragraphChildren.push(XMLBuilder.w('pPr', undefined, pPrChildren));\n }\n\n // Add bookmark start markers\n for (const bookmark of this.bookmarksStart) {\n paragraphChildren.push(bookmark.toStartXML());\n }\n\n // Add comment range start markers\n for (const comment of this.commentsStart) {\n paragraphChildren.push(comment.toRangeStartXML());\n }\n\n // Add content (runs, fields, hyperlinks, revisions, range markers, shapes, text boxes)\n for (let i = 0; i < this.content.length; i++) {\n const item = this.content[i];\n if (item instanceof Field) {\n // Simple Field — fldSimple is a paragraph-level element containing w:r children\n paragraphChildren.push(item.toXML());\n } else if (item instanceof ComplexField) {\n // ComplexField returns array of runs - spread them directly into paragraphChildren\n const fieldXml = item.toXML();\n if (Array.isArray(fieldXml)) {\n paragraphChildren.push(...fieldXml);\n } else {\n // Fallback if toXML() doesn't return array\n paragraphChildren.push(XMLBuilder.w('r', undefined, [fieldXml]));\n }\n } else if (item instanceof Hyperlink) {\n // Hyperlinks are their own element\n paragraphChildren.push(item.toXML());\n } else if (item instanceof Revision) {\n // Revisions (track changes) are their own element\n // Property change types (rPrChange, pPrChange, tblPrChange, etc.) are only valid\n // inside their respective property elements (w:rPr, w:pPr, etc.), not as direct\n // children of w:p. Skip them here to avoid producing invalid XML.\n const revType = item.getType();\n if (\n revType === 'runPropertiesChange' ||\n revType === 'paragraphPropertiesChange' ||\n revType === 'tablePropertiesChange' ||\n revType === 'tableExceptionPropertiesChange' ||\n revType === 'tableRowPropertiesChange' ||\n revType === 'tableCellPropertiesChange' ||\n revType === 'sectionPropertiesChange' ||\n revType === 'numberingChange'\n ) {\n continue;\n }\n // Note: toXML() returns null for internal-only revision types (e.g., hyperlinkChange)\n const revisionXml = item.toXML();\n if (revisionXml) {\n paragraphChildren.push(revisionXml);\n }\n } else if (item instanceof RangeMarker) {\n // Range markers are their own element (mark boundaries of moves, etc.)\n paragraphChildren.push(item.toXML());\n } else if (item instanceof Shape) {\n // Shapes are wrapped in a run\n paragraphChildren.push(XMLBuilder.w('r', undefined, [item.toXML()]));\n } else if (item instanceof TextBox) {\n // Text boxes are wrapped in a run\n paragraphChildren.push(XMLBuilder.w('r', undefined, [item.toXML()]));\n } else if (item) {\n paragraphChildren.push(item.toXML());\n }\n }\n\n // If no content, add empty run to prevent invalid XML\n if (this.content.length === 0) {\n paragraphChildren.push(new Run('').toXML());\n }\n\n // Add comment range end markers\n for (const comment of this.commentsEnd) {\n paragraphChildren.push(comment.toRangeEndXML());\n }\n\n // Add comment references (must come after range end)\n for (const comment of this.commentsEnd) {\n paragraphChildren.push(comment.toReferenceXML());\n }\n\n // Add bookmark end markers\n for (const bookmark of this.bookmarksEnd) {\n paragraphChildren.push(bookmark.toEndXML());\n }\n\n // Add paragraph-level attributes (Word 2010+ w14:paraId and w14:textId)\n const paragraphAttributes: Record<string, string> = {};\n if (this.formatting.paraId) {\n paragraphAttributes['w14:paraId'] = this.formatting.paraId;\n }\n if (this.formatting.textId) {\n paragraphAttributes['w14:textId'] = this.formatting.textId;\n }\n\n return XMLBuilder.w(\n 'p',\n Object.keys(paragraphAttributes).length > 0 ? paragraphAttributes : undefined,\n paragraphChildren\n );\n }\n\n /**\n * Gets the word count for this paragraph\n *\n * Counts words by splitting text on whitespace and filtering empty strings.\n *\n * @returns Number of words in the paragraph\n *\n * @example\n * ```typescript\n * const count = para.getWordCount();\n * console.log(`Paragraph has ${count} words`);\n * ```\n */\n getWordCount(): number {\n const text = this.getText().trim();\n if (!text) return 0;\n\n // Split by whitespace and filter out empty strings\n const words = text.split(/\\s+/).filter((word) => word.length > 0);\n return words.length;\n }\n\n /**\n * Gets the character count for this paragraph\n *\n * Counts all characters including or excluding whitespace.\n *\n * @param includeSpaces - If true, includes spaces; if false, excludes them (default: true)\n * @returns Number of characters in the paragraph\n *\n * @example\n * ```typescript\n * const withSpaces = para.getLength(); // Includes spaces\n * const noSpaces = para.getLength(false); // Excludes spaces\n * console.log(`${withSpaces} chars (${noSpaces} without spaces)`);\n * ```\n */\n getLength(includeSpaces = true): number {\n const text = this.getText();\n if (includeSpaces) {\n return text.length;\n } else {\n return text.replace(/\\s/g, '').length;\n }\n }\n\n /**\n * Creates a deep clone of this paragraph\n *\n * Creates a new Paragraph with copies of all content, formatting,\n * bookmarks, and comments. The clone is independent of the original.\n *\n * @returns A new Paragraph instance with the same content and formatting\n *\n * @example\n * ```typescript\n * const original = new Paragraph();\n * original.addText('Template text', { bold: true });\n * original.setStyle('Heading1');\n *\n * const copy = original.clone();\n * copy.addText(' - modified'); // Original unchanged\n * ```\n */\n clone(): Paragraph {\n // Clone the formatting\n const clonedFormatting: ParagraphFormatting = deepClone(this.formatting);\n\n // Create new paragraph with cloned formatting\n const clonedParagraph = new Paragraph(clonedFormatting);\n\n // Clone all content (runs, fields, hyperlinks, revisions)\n for (const item of this.content) {\n if (item instanceof Run) {\n // Clone the run with its text and formatting\n const runFormatting = item.getFormatting();\n const clonedRun = new Run(item.getText(), deepClone(runFormatting));\n clonedParagraph.addRun(clonedRun);\n } else {\n // For other content types, add them as-is (shallow copy for now)\n // In a more complete implementation, we'd clone these too\n clonedParagraph.content.push(item);\n }\n }\n\n // Clone bookmark and comment markers\n clonedParagraph.bookmarksStart = [...this.bookmarksStart];\n clonedParagraph.bookmarksEnd = [...this.bookmarksEnd];\n clonedParagraph.commentsStart = [...this.commentsStart];\n clonedParagraph.commentsEnd = [...this.commentsEnd];\n\n return clonedParagraph;\n }\n\n /**\n * Serializes the paragraph to a portable JSON object\n *\n * Returns a plain object representing the paragraph's text content, inline\n * formatting, style, and paragraph-level formatting. Only Run content is\n * serialized — hyperlinks, revisions, and other non-Run elements are\n * represented by their text only.\n *\n * The output is designed for data pipelines, API responses, storage,\n * and debugging. Use `Paragraph.fromJSON()` to reconstruct.\n *\n * @returns JSON-serializable paragraph representation\n *\n * @example\n * ```typescript\n * const para = new Paragraph().addText('Hello ', { bold: true }).addText('World');\n * para.setStyle('Heading1').setAlignment('center');\n *\n * const json = para.toJSON();\n * // {\n * // text: 'Hello World',\n * // style: 'Heading1',\n * // alignment: 'center',\n * // runs: [\n * // { text: 'Hello ', formatting: { bold: true } },\n * // { text: 'World', formatting: {} }\n * // ]\n * // }\n * ```\n */\n toJSON(): {\n text: string;\n style?: string;\n alignment?: string;\n runs: { text: string; formatting: RunFormatting }[];\n numbering?: { numId: number; level: number };\n indentation?: { left?: number; right?: number; firstLine?: number; hanging?: number };\n spacing?: { before?: number; after?: number; line?: number; lineRule?: string };\n } {\n const runs = this.getRuns().map((run) => ({\n text: run.getText(),\n formatting: run.getFormatting(),\n }));\n\n const result: ReturnType<Paragraph['toJSON']> = {\n text: this.getText(),\n runs,\n };\n\n if (this.formatting.style) result.style = this.formatting.style;\n if (this.formatting.alignment) result.alignment = this.formatting.alignment;\n if (this.formatting.numbering) result.numbering = { ...this.formatting.numbering };\n if (this.formatting.indentation) result.indentation = { ...this.formatting.indentation };\n if (this.formatting.spacing) {\n result.spacing = {\n before: this.formatting.spacing.before,\n after: this.formatting.spacing.after,\n line: this.formatting.spacing.line,\n lineRule: this.formatting.spacing.lineRule,\n };\n }\n\n return result;\n }\n\n /**\n * Creates a Paragraph from a JSON object (as produced by `toJSON()`)\n *\n * Reconstructs a paragraph with runs, formatting, style, and layout\n * from a serialized representation. This enables round-trip serialization.\n *\n * @param data - JSON object matching the `toJSON()` output shape\n * @returns New Paragraph instance\n *\n * @example\n * ```typescript\n * const json = { text: 'Hello', style: 'Heading1', runs: [{ text: 'Hello', formatting: { bold: true } }] };\n * const para = Paragraph.fromJSON(json);\n * para.getText(); // 'Hello'\n * para.getStyle(); // 'Heading1'\n * ```\n */\n static fromJSON(data: {\n text?: string;\n style?: string;\n alignment?: string;\n runs?: { text: string; formatting?: RunFormatting }[];\n numbering?: { numId: number; level: number };\n indentation?: { left?: number; right?: number; firstLine?: number; hanging?: number };\n spacing?: { before?: number; after?: number; line?: number; lineRule?: string };\n }): Paragraph {\n const para = new Paragraph();\n\n if (data.runs && data.runs.length > 0) {\n for (const runData of data.runs) {\n para.addText(runData.text, runData.formatting);\n }\n } else if (data.text) {\n para.addText(data.text);\n }\n\n if (data.style) para.setStyle(data.style);\n if (data.alignment) para.setAlignment(data.alignment as ParagraphAlignment);\n if (data.numbering) para.setNumbering(data.numbering.numId, data.numbering.level);\n if (data.indentation) {\n if (data.indentation.left !== undefined) para.setLeftIndent(data.indentation.left);\n if (data.indentation.right !== undefined) para.setRightIndent(data.indentation.right);\n if (data.indentation.firstLine !== undefined)\n para.setFirstLineIndent(data.indentation.firstLine);\n if (data.indentation.hanging !== undefined) para.setHangingIndent(data.indentation.hanging);\n }\n if (data.spacing) {\n if (data.spacing.before !== undefined) para.setSpaceBefore(data.spacing.before);\n if (data.spacing.after !== undefined) para.setSpaceAfter(data.spacing.after);\n if (data.spacing.line !== undefined) {\n para.setLineSpacing(\n data.spacing.line,\n (data.spacing.lineRule as 'auto' | 'exact' | 'atLeast') ?? 'auto'\n );\n }\n }\n\n return para;\n }\n\n /**\n * Splits this paragraph at a character offset, returning the tail as a new paragraph\n *\n * Content from the offset onward is moved to a new Paragraph. The new paragraph\n * inherits this paragraph's style and formatting (deep-cloned). If the split point\n * falls within a Run, that run is split using `Run.splitAt()`.\n *\n * Only Run elements contribute to the character offset count. Non-Run content\n * (hyperlinks, revisions, fields) that appears after all affected runs is moved\n * to the new paragraph as-is.\n *\n * @param offset - Character position to split at (0-based). Content from this\n * position onward moves to the new paragraph.\n * @returns A new Paragraph containing content from `offset` onward\n *\n * @example\n * ```typescript\n * const para = new Paragraph().addText('Hello World');\n * const tail = para.splitAt(5);\n * para.getText(); // \"Hello\"\n * tail.getText(); // \" World\"\n * ```\n *\n * @example\n * ```typescript\n * // Insert a table between two halves of a paragraph\n * const tail = para.splitAt(offset);\n * const paraIndex = doc.getParagraphIndex(para);\n * doc.insertTableAt(paraIndex + 1, table);\n * doc.insertParagraphAt(paraIndex + 2, tail);\n * ```\n */\n splitAt(offset: number): Paragraph {\n // Create new paragraph with cloned formatting and style\n const tailPara = new Paragraph(deepClone(this.formatting));\n\n // Edge case: split at or past end — return empty paragraph\n const totalLength = this.getText().length;\n if (offset >= totalLength) {\n return tailPara;\n }\n\n // Edge case: split at or before start — move everything\n if (offset <= 0) {\n tailPara.content = this.content;\n this.content = [];\n return tailPara;\n }\n\n // Walk content to find the split point\n let charPos = 0;\n let splitContentIndex = -1;\n\n for (let i = 0; i < this.content.length; i++) {\n const item = this.content[i]!;\n\n if (item instanceof Run) {\n const runLen = item.getText().length;\n const runEnd = charPos + runLen;\n\n if (runEnd <= offset) {\n // Entire run stays in this paragraph\n charPos = runEnd;\n continue;\n }\n\n if (charPos >= offset) {\n // Entire run goes to tail paragraph\n splitContentIndex = i;\n break;\n }\n\n // Split falls within this run\n const localOffset = offset - charPos;\n const tailRun = item.splitAt(localOffset);\n\n // Insert the tail run and mark everything after it for the new paragraph\n this.content.splice(i + 1, 0, tailRun);\n splitContentIndex = i + 1;\n break;\n } else {\n // Non-Run content: if we haven't reached the offset yet, keep it here\n // Once we've passed the offset, it moves to tail\n if (charPos >= offset) {\n splitContentIndex = i;\n break;\n }\n }\n }\n\n // If no split point found (shouldn't happen given offset < totalLength),\n // but guard against it\n if (splitContentIndex === -1) {\n return tailPara;\n }\n\n // Move content from splitContentIndex onward to the tail paragraph\n tailPara.content = this.content.splice(splitContentIndex);\n\n return tailPara;\n }\n\n /**\n * Sets paragraph borders\n * @param borders - Border definitions for each side\n * @returns This paragraph for chaining\n * @example\n * ```typescript\n * para.setBorder({\n * top: { style: 'single', size: 4, color: '000000', space: 1 },\n * bottom: { style: 'single', size: 4, color: '000000', space: 1 }\n * });\n * ```\n */\n setBorder(borders: {\n top?: BorderDefinition;\n bottom?: BorderDefinition;\n left?: BorderDefinition;\n right?: BorderDefinition;\n between?: BorderDefinition;\n bar?: BorderDefinition;\n }): this {\n if (!this.formatting) {\n this.formatting = {};\n }\n\n this.formatting.borders = borders;\n\n return this;\n }\n\n /**\n * Sets paragraph shading (background color and pattern)\n * @param shading - Shading options\n * @returns This paragraph for chaining\n * @example\n * ```typescript\n * // Solid background\n * para.setShading({ fill: 'FFFF00', pattern: 'solid' });\n *\n * // Pattern with colors\n * para.setShading({\n * fill: 'FFFF00',\n * color: '000000',\n * pattern: 'diagStripe'\n * });\n * ```\n */\n setShading(shading: ShadingConfig): this {\n if (!this.formatting) {\n this.formatting = {};\n }\n\n const previousValue = this.formatting.shading;\n this.formatting.shading = shading;\n\n if (this.trackingContext?.isEnabled() && previousValue !== shading) {\n this.trackingContext.trackParagraphPropertyChange(this, 'shading', previousValue, shading);\n }\n\n return this;\n }\n\n /**\n * Sets tab stops for the paragraph\n * @param tabs - Array of tab stop definitions\n * @returns This paragraph for chaining\n * @example\n * ```typescript\n * para.setTabs([\n * { position: 720, val: 'left' },\n * { position: 1440, val: 'center', leader: 'dot' },\n * { position: 2160, val: 'right' }\n * ]);\n * ```\n */\n setTabs(tabs: TabStop[]): this {\n if (!this.formatting) {\n this.formatting = {};\n }\n\n this.formatting.tabs = tabs;\n\n return this;\n }\n\n /**\n * Inserts a run at a specific position\n * @param index - Position to insert at (0-based)\n * @param run - Run to insert\n * @returns This paragraph for chaining\n * @example\n * ```typescript\n * const para = new Paragraph();\n * const run = new Run('Inserted', { bold: true });\n * para.insertRunAt(0, run);\n * ```\n */\n insertRunAt(index: number, run: Run): this {\n if (index < 0) index = 0;\n if (index > this.content.length) index = this.content.length;\n\n this.content.splice(index, 0, run);\n return this;\n }\n\n /**\n * Removes a run at a specific position\n * @param index - Position to remove (0-based)\n * @returns True if removed, false if index invalid\n * @example\n * ```typescript\n * para.removeRunAt(2); // Remove third run\n * ```\n */\n removeRunAt(index: number): boolean {\n if (index >= 0 && index < this.content.length) {\n const item = this.content[index];\n if (item instanceof Run) {\n this.content.splice(index, 1);\n return true;\n }\n }\n return false;\n }\n\n /**\n * Replaces a run at a specific position\n * @param index - Position to replace (0-based)\n * @param run - New run\n * @returns True if replaced, false if index invalid or not a run\n * @example\n * ```typescript\n * const newRun = new Run('Replacement', { italic: true });\n * para.replaceRunAt(1, newRun);\n * ```\n */\n replaceRunAt(index: number, run: Run): boolean {\n if (index >= 0 && index < this.content.length) {\n const item = this.content[index];\n if (item instanceof Run) {\n this.content[index] = run;\n return true;\n }\n }\n return false;\n }\n\n /**\n * Finds text within the paragraph and returns run indices\n *\n * Searches through all runs in the paragraph and returns the indices\n * of runs that contain the search text.\n *\n * @param text - The text 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 run indices (0-based) that contain the search text\n *\n * @example\n * ```typescript\n * const indices = para.findText('important');\n * console.log(`Found in runs: ${indices.join(', ')}`);\n *\n * // Highlight all matching runs\n * for (const idx of indices) {\n * const run = para.getRuns()[idx];\n * run?.setHighlight('yellow');\n * }\n * ```\n */\n findText(text: string, options?: { caseSensitive?: boolean; wholeWord?: boolean }): number[] {\n const indices: number[] = [];\n const caseSensitive = options?.caseSensitive || false;\n const wholeWord = options?.wholeWord || false;\n\n const searchText = caseSensitive ? text : text.toLowerCase();\n\n for (let i = 0; i < this.content.length; i++) {\n const item = this.content[i];\n if (item instanceof Run) {\n const runText = caseSensitive ? item.getText() : item.getText().toLowerCase();\n\n if (wholeWord) {\n // Use word boundary regex\n const wordPattern = new RegExp(\n `\\\\b${searchText.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\b`\n );\n if (wordPattern.test(runText)) {\n indices.push(i);\n }\n } else {\n // Simple substring search\n if (runText.includes(searchText)) {\n indices.push(i);\n }\n }\n }\n }\n\n return indices;\n }\n\n /**\n * Replaces text within paragraph runs\n *\n * Searches through all runs and replaces matching text while preserving\n * the original formatting of each run.\n *\n * @param find - The text to search for\n * @param replace - The replacement text\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 Number of replacements made\n *\n * @example\n * ```typescript\n * const count = para.replaceText('color', 'colour');\n * console.log(`Replaced ${count} occurrences`);\n * ```\n *\n * @example\n * ```typescript\n * // Case-sensitive whole word replacement\n * const count = para.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 for (const item of this.content) {\n if (item instanceof Run) {\n const originalText = item.getText();\n let newText = originalText;\n\n if (wholeWord) {\n // Use word boundary regex\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 item.setText(newText);\n }\n }\n }\n\n return replacementCount;\n }\n\n /**\n * Replaces all occurrences of a string, searching across run boundaries\n *\n * A simplified alias for `replaceTextCrossRun()` with no options — just\n * find and replace. Case-insensitive. Handles Word-fragmented text.\n *\n * @param find - Text to search for\n * @param replace - Replacement text\n * @returns Number of replacements made\n *\n * @example\n * ```typescript\n * para.replaceAll('old', 'new');\n * para.replaceAll('{{name}}', 'Alice');\n * ```\n */\n replaceAll(find: string, replace: string): number {\n return this.replaceTextCrossRun(find, replace);\n }\n\n /**\n * Searches for text across run boundaries, returning match positions\n *\n * Concatenates text from all runs and searches the combined string,\n * finding matches that may span multiple runs (e.g., `{{name}}` split\n * across runs as `{{` + `name` + `}}`). This is the read-only\n * counterpart to `replaceTextCrossRun()`.\n *\n * @param find - Text to search for (plain string)\n * @param options - Search options\n * @param options.caseSensitive - Match case exactly (default: false)\n * @returns Array of match objects with offset and matched text\n *\n * @example\n * ```typescript\n * // Find all placeholders, even if fragmented across runs\n * const matches = para.findTextCrossRun('{{name}}');\n * console.log(`Found ${matches.length} matches`);\n * for (const m of matches) {\n * console.log(` at offset ${m.offset}: \"${m.text}\"`);\n * }\n * ```\n */\n findTextCrossRun(\n find: string,\n options?: { caseSensitive?: boolean }\n ): { offset: number; text: string }[] {\n const caseSensitive = options?.caseSensitive ?? false;\n\n // Build full text from runs only\n let fullText = '';\n for (const item of this.content) {\n if (item instanceof Run) {\n fullText += item.getText();\n }\n }\n\n if (fullText.length === 0) return [];\n\n const escaped = find.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const regex = new RegExp(escaped, caseSensitive ? 'g' : 'gi');\n const results: { offset: number; text: string }[] = [];\n let m: RegExpExecArray | null;\n\n while ((m = regex.exec(fullText)) !== null) {\n results.push({ offset: m.index, text: m[0]! });\n }\n\n return results;\n }\n\n /**\n * Finds and replaces text that may span across multiple runs\n *\n * Unlike `replaceText()` which searches each run independently, this method\n * concatenates text across all runs and searches the combined string. This\n * handles the common case where Word splits text like `{{name}}` across\n * multiple runs (e.g., `{{` in one run, `name` in another, `}}` in a third).\n *\n * The replacement text inherits formatting from the first run of the match.\n * Runs that are fully consumed by the match are removed; partially consumed\n * runs are trimmed.\n *\n * @param find - Text to search for (plain string, case-insensitive by default)\n * @param replace - Replacement text\n * @param options - Search options\n * @param options.caseSensitive - Match case exactly (default: false)\n * @returns Number of replacements made\n *\n * @example\n * ```typescript\n * // Handle Word-fragmented placeholders\n * // Paragraph has runs: [\"{{\", \"name\", \"}}\"]\n * para.replaceTextCrossRun('{{name}}', 'Alice');\n * // Now has single run: \"Alice\"\n * ```\n *\n * @example\n * ```typescript\n * // Works with normal (non-fragmented) text too\n * para.replaceTextCrossRun('old text', 'new text');\n * ```\n */\n replaceTextCrossRun(\n find: string,\n replace: string,\n options?: { caseSensitive?: boolean }\n ): number {\n const caseSensitive = options?.caseSensitive ?? false;\n\n // Build run map: [{run, contentIndex, startOffset, endOffset}]\n const runMap: { run: Run; contentIndex: number; start: number; end: number }[] = [];\n let charPos = 0;\n for (let i = 0; i < this.content.length; i++) {\n const item = this.content[i]!;\n if (item instanceof Run) {\n const len = item.getText().length;\n if (len > 0) {\n runMap.push({ run: item, contentIndex: i, start: charPos, end: charPos + len });\n }\n charPos += len;\n }\n }\n\n if (runMap.length === 0) return 0;\n\n // Get full concatenated text\n const fullText = runMap.map((r) => r.run.getText()).join('');\n\n // Find all match positions\n const escaped = find.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const regex = new RegExp(escaped, caseSensitive ? 'g' : 'gi');\n const matches: { start: number; end: number }[] = [];\n let m: RegExpExecArray | null;\n while ((m = regex.exec(fullText)) !== null) {\n matches.push({ start: m.index, end: m.index + m[0]!.length });\n }\n\n if (matches.length === 0) return 0;\n\n // Process matches in reverse order to preserve earlier offsets\n for (let mi = matches.length - 1; mi >= 0; mi--) {\n const match = matches[mi]!;\n\n // Find all runs that overlap this match\n const affectedRuns = runMap.filter((r) => r.end > match.start && r.start < match.end);\n\n if (affectedRuns.length === 0) continue;\n\n const firstAffected = affectedRuns[0]!;\n const lastAffected = affectedRuns[affectedRuns.length - 1]!;\n\n // Calculate what to keep from the first and last runs\n const keepBefore =\n match.start > firstAffected.start\n ? firstAffected.run.getText().slice(0, match.start - firstAffected.start)\n : '';\n const keepAfter =\n match.end < lastAffected.end\n ? lastAffected.run.getText().slice(match.end - lastAffected.start)\n : '';\n\n // Set the first affected run to: kept-before + replacement + kept-after\n firstAffected.run.setText(keepBefore + replace + keepAfter);\n\n // Remove any middle/last runs that were fully or partially consumed\n // (iterate in reverse to preserve indices)\n for (let r = affectedRuns.length - 1; r >= 1; r--) {\n const runEntry = affectedRuns[r]!;\n const idx = this.content.indexOf(runEntry.run);\n if (idx !== -1) {\n this.content.splice(idx, 1);\n }\n }\n }\n\n return matches.length;\n }\n\n /**\n * Deletes a character range from the paragraph\n *\n * Removes text in the [start, end) range. Runs fully within the range\n * are removed entirely; boundary runs are trimmed. Non-Run content is\n * not affected.\n *\n * @param start - Start character offset (0-based, inclusive)\n * @param end - End character offset (0-based, exclusive)\n * @returns This paragraph for chaining\n *\n * @example\n * ```typescript\n * const para = new Paragraph().addText('Hello Beautiful World');\n * para.deleteRange(5, 15);\n * para.getText(); // \"Hello World\"\n * ```\n */\n deleteRange(start: number, end: number): this {\n if (start >= end) return this;\n\n // Build run map\n const runMap: { index: number; start: number; end: number }[] = [];\n let charPos = 0;\n for (let i = 0; i < this.content.length; i++) {\n const item = this.content[i]!;\n if (item instanceof Run) {\n const len = item.getText().length;\n if (len > 0) {\n runMap.push({ index: i, start: charPos, end: charPos + len });\n }\n charPos += len;\n }\n }\n\n // Process in reverse to preserve indices\n for (let m = runMap.length - 1; m >= 0; m--) {\n const entry = runMap[m]!;\n const run = this.content[entry.index] as Run;\n\n // Skip runs entirely outside the range\n if (entry.end <= start || entry.start >= end) continue;\n\n const runStart = entry.start;\n const runEnd = entry.end;\n\n // How much of this run is in the delete range?\n const delStart = Math.max(0, start - runStart);\n const delEnd = Math.min(runEnd - runStart, end - runStart);\n const runLen = runEnd - runStart;\n\n if (delStart === 0 && delEnd === runLen) {\n // Entire run is deleted\n this.content.splice(entry.index, 1);\n } else {\n // Partial deletion — keep the parts outside the range\n const textBefore = run.getText().slice(0, delStart);\n const textAfter = run.getText().slice(delEnd);\n run.setText(textBefore + textAfter);\n }\n }\n\n return this;\n }\n\n /**\n * Truncates paragraph text to a maximum length\n *\n * If the paragraph text exceeds `maxLength`, content beyond that point\n * is removed and an optional suffix (default `'...'`) is appended.\n * The suffix counts toward the total length, so the final text is at\n * most `maxLength` characters.\n *\n * @param maxLength - Maximum total character length (including suffix)\n * @param suffix - Text to append when truncated (default: '...')\n * @returns This paragraph for chaining\n *\n * @example\n * ```typescript\n * const para = new Paragraph().addText('The quick brown fox jumps over the lazy dog');\n * para.truncate(20);\n * para.getText(); // \"The quick brown f...\"\n *\n * para.truncate(10, ' [more]');\n * // getText() => \"The [more]\"\n * ```\n */\n truncate(maxLength: number, suffix = '...'): this {\n const text = this.getText();\n if (text.length <= maxLength) return this;\n\n const cutoff = Math.max(0, maxLength - suffix.length);\n this.deleteRange(cutoff, text.length);\n\n // Append suffix as a new run (inherits no formatting — plain text indicator)\n if (suffix) {\n this.addText(suffix);\n }\n\n return this;\n }\n\n /**\n * Wraps existing paragraph content with prefix and/or suffix text\n *\n * Inserts a Run with the prefix text before existing content and\n * a Run with the suffix text after it. Both inherit no formatting\n * by default, but optional formatting can be provided.\n *\n * @param prefix - Text to prepend (empty string to skip)\n * @param suffix - Text to append (empty string to skip)\n * @param formatting - Optional formatting for both prefix and suffix runs\n * @returns This paragraph for chaining\n *\n * @example\n * ```typescript\n * const para = new Paragraph().addText('important');\n * para.wrap('[', ']');\n * para.getText(); // \"[important]\"\n *\n * // With formatting\n * para.wrap('NOTE: ', '', { bold: true });\n * ```\n */\n wrap(prefix: string, suffix: string, formatting?: RunFormatting): this {\n if (prefix) {\n const prefixRun = new Run(prefix, formatting);\n this.content.unshift(prefixRun);\n }\n if (suffix) {\n const suffixRun = new Run(suffix, formatting);\n this.content.push(suffixRun);\n }\n return this;\n }\n\n /**\n * Returns the Run that contains the character at the given offset\n *\n * Walks through Run elements in the paragraph, counting characters,\n * and returns the Run that contains the specified offset along with\n * the local offset within that run. Non-Run content is skipped.\n *\n * @param offset - Character position (0-based)\n * @returns Object with the Run and the local offset within it, or\n * undefined if the offset is out of range or hits non-Run content\n *\n * @example\n * ```typescript\n * const para = new Paragraph();\n * para.addRun(new Run('Hello ', { bold: true }));\n * para.addRun(new Run('World'));\n *\n * const result = para.getRunAtOffset(8);\n * // result.run.getText() === 'World'\n * // result.localOffset === 2 (the 'r' in 'World')\n * ```\n */\n getRunAtOffset(offset: number): { run: Run; localOffset: number } | undefined {\n if (offset < 0) return undefined;\n\n let charPos = 0;\n for (const item of this.content) {\n if (!(item instanceof Run)) continue;\n\n const len = item.getText().length;\n if (charPos + len > offset) {\n return { run: item, localOffset: offset - charPos };\n }\n charPos += len;\n }\n\n return undefined;\n }\n\n /**\n * Returns the RunFormatting active at a given character position\n *\n * Finds the Run containing the character at `offset` and returns its\n * formatting. Useful for format inspection, format painting, and building\n * rich text cursors.\n *\n * @param offset - Character position (0-based)\n * @returns RunFormatting at that position, or undefined if out of range\n *\n * @example\n * ```typescript\n * const para = new Paragraph();\n * para.addRun(new Run('Bold text', { bold: true, color: 'FF0000' }));\n * para.addRun(new Run(' plain text'));\n *\n * const fmt = para.getFormattingAtOffset(3);\n * // fmt.bold === true\n * // fmt.color === 'FF0000'\n *\n * const fmt2 = para.getFormattingAtOffset(12);\n * // fmt2.bold === undefined\n * ```\n */\n getFormattingAtOffset(offset: number): RunFormatting | undefined {\n const result = this.getRunAtOffset(offset);\n return result ? result.run.getFormatting() : undefined;\n }\n\n /**\n * Applies formatting to a character range across runs\n *\n * Splits runs at the range boundaries as needed, then applies the given\n * formatting properties to every run that falls within [start, end).\n * Only modifies Run elements — hyperlinks, revisions, fields, and other\n * non-Run content are skipped (their characters still count toward offsets).\n *\n * Each property in the formatting object is applied via the corresponding\n * setter method (e.g. `bold` → `setBold()`, `color` → `setColor()`).\n *\n * @param start - Start character offset (0-based, inclusive)\n * @param end - End character offset (0-based, exclusive)\n * @param formatting - Partial RunFormatting to apply to the range\n * @returns This paragraph for chaining\n *\n * @example\n * ```typescript\n * // Bold \"World\" in \"Hello World\"\n * const para = new Paragraph().addText('Hello World');\n * para.applyFormattingToRange(6, 11, { bold: true });\n * ```\n *\n * @example\n * ```typescript\n * // Highlight a middle section\n * const para = new Paragraph().addText('The quick brown fox');\n * para.applyFormattingToRange(4, 9, {\n * bold: true,\n * color: 'FF0000',\n * highlight: 'yellow',\n * });\n * // Results in 3 runs: \"The \" | \"quick\" (bold red highlighted) | \" brown fox\"\n * ```\n */\n applyFormattingToRange(start: number, end: number, formatting: Partial<RunFormatting>): this {\n if (start >= end) return this;\n\n // Build a map of content indices to their character offset ranges,\n // then work backwards to avoid index shifting during splicing.\n const contentMap: { index: number; start: number; end: number }[] = [];\n let charPos = 0;\n for (let i = 0; i < this.content.length; i++) {\n const item = this.content[i]!;\n let len = 0;\n if (item instanceof Run) {\n len = item.getText().length;\n }\n // Non-Run items don't contribute characters for our purposes\n // (they're skipped but still occupy content array slots)\n if (len > 0) {\n contentMap.push({ index: i, start: charPos, end: charPos + len });\n }\n charPos += len;\n }\n\n // Process runs in reverse order so splice indices stay valid\n for (let m = contentMap.length - 1; m >= 0; m--) {\n const entry = contentMap[m]!;\n const run = this.content[entry.index] as Run;\n\n // Skip runs entirely outside the range\n if (entry.end <= start || entry.start >= end) continue;\n\n const runStart = entry.start;\n const runEnd = entry.end;\n\n // Determine split points relative to this run\n const splitStart = Math.max(0, start - runStart);\n const splitEnd = Math.min(runEnd - runStart, end - runStart);\n const runLen = runEnd - runStart;\n\n if (splitStart === 0 && splitEnd === runLen) {\n // Entire run is within range — just apply formatting\n this.applyFormattingToRun(run, formatting);\n } else if (splitStart === 0) {\n // Range covers beginning of run — split off the tail\n const tail = run.splitAt(splitEnd);\n this.applyFormattingToRun(run, formatting);\n this.content.splice(entry.index + 1, 0, tail);\n } else if (splitEnd === runLen) {\n // Range covers end of run — split off the head\n const tail = run.splitAt(splitStart);\n this.applyFormattingToRun(tail, formatting);\n this.content.splice(entry.index + 1, 0, tail);\n } else {\n // Range is in the middle — three-way split\n const mid = run.splitAt(splitStart);\n const tail = mid.splitAt(splitEnd - splitStart);\n this.applyFormattingToRun(mid, formatting);\n this.content.splice(entry.index + 1, 0, mid, tail);\n }\n }\n\n return this;\n }\n\n /**\n * Applies partial RunFormatting to a run via setter methods.\n * @internal\n */\n private applyFormattingToRun(run: Run, formatting: Partial<RunFormatting>): void {\n if (formatting.bold !== undefined) run.setBold(formatting.bold);\n if (formatting.italic !== undefined) run.setItalic(formatting.italic);\n if (formatting.underline !== undefined) run.setUnderline(formatting.underline);\n if (formatting.strike !== undefined) run.setStrike(formatting.strike);\n if (formatting.subscript !== undefined) run.setSubscript(formatting.subscript);\n if (formatting.superscript !== undefined) run.setSuperscript(formatting.superscript);\n if (formatting.smallCaps !== undefined) run.setSmallCaps(formatting.smallCaps);\n if (formatting.allCaps !== undefined) run.setAllCaps(formatting.allCaps);\n if (formatting.font !== undefined) run.setFont(formatting.font);\n if (formatting.size !== undefined) run.setSize(formatting.size);\n if (formatting.color !== undefined) run.setColor(formatting.color);\n if (formatting.highlight !== undefined) run.setHighlight(formatting.highlight);\n if (formatting.characterSpacing !== undefined)\n run.setCharacterSpacing(formatting.characterSpacing);\n if (formatting.vanish !== undefined) run.setVanish(formatting.vanish);\n }\n\n /**\n * Merges adjacent runs that have identical formatting\n *\n * Walks the content array and combines consecutive Run elements whose\n * formatting is deeply equal. Non-Run content (hyperlinks, revisions,\n * fields, etc.) acts as a boundary — runs on opposite sides are never\n * merged even if their formatting matches.\n *\n * This is useful after operations that fragment runs, such as\n * `applyFormattingToRange()` or `Run.splitAt()`, to reduce file size\n * and simplify the content model.\n *\n * @returns Number of runs that were eliminated by merging\n *\n * @example\n * ```typescript\n * const para = new Paragraph();\n * para.addRun(new Run('Hello ', { bold: true }));\n * para.addRun(new Run('World', { bold: true }));\n * para.addRun(new Run('!'));\n *\n * const merged = para.consolidateRuns();\n * // merged === 1 (two bold runs became one)\n * // para now has 2 runs: \"Hello World\" (bold) and \"!\"\n * ```\n *\n * @example\n * ```typescript\n * // Clean up after applyFormattingToRange\n * para.applyFormattingToRange(0, 5, { bold: true });\n * para.applyFormattingToRange(5, 10, { bold: true });\n * para.consolidateRuns(); // merges the two bold fragments\n * ```\n */\n consolidateRuns(): number {\n if (this.content.length < 2) return 0;\n\n const consolidated: ParagraphContent[] = [];\n let eliminated = 0;\n\n for (const item of this.content) {\n if (!(item instanceof Run)) {\n // Non-run content acts as a merge boundary\n consolidated.push(item);\n continue;\n }\n\n const prev = consolidated.length > 0 ? consolidated[consolidated.length - 1] : undefined;\n\n if (\n prev instanceof Run &&\n isEqualFormatting(\n prev.getFormatting() as unknown as Record<string, unknown>,\n item.getFormatting() as unknown as Record<string, unknown>\n )\n ) {\n // Merge: append item's content to prev run\n const mergedContent = [...prev.getContent(), ...item.getContent()];\n const mergedRun = Run.createFromContent(mergedContent, deepClone(prev.getFormatting()));\n consolidated[consolidated.length - 1] = mergedRun;\n eliminated++;\n } else {\n consolidated.push(item);\n }\n }\n\n if (eliminated > 0) {\n this.content = consolidated;\n }\n\n return eliminated;\n }\n\n /**\n * Merges another paragraph's content into this one\n *\n * Appends all content (runs, fields, hyperlinks), bookmarks, and comments\n * from another paragraph to this one. The other paragraph is not modified.\n *\n * @param otherPara - The paragraph whose content to merge\n * @returns This paragraph instance for method chaining\n *\n * @example\n * ```typescript\n * const para1 = new Paragraph().addText('Hello ');\n * const para2 = new Paragraph().addText('World');\n * para1.mergeWith(para2); // para1 now contains \"Hello World\"\n * ```\n */\n mergeWith(otherPara: Paragraph): this {\n // Add all content from other paragraph\n for (const item of otherPara.content) {\n if (item instanceof Run) {\n this.content.push(item.clone());\n } else {\n this.content.push(item);\n }\n }\n\n // Merge bookmarks\n this.bookmarksStart.push(...otherPara.bookmarksStart);\n this.bookmarksEnd.push(...otherPara.bookmarksEnd);\n\n // Merge comments\n this.commentsStart.push(...otherPara.commentsStart);\n this.commentsEnd.push(...otherPara.commentsEnd);\n\n return this;\n }\n\n /**\n * Clears direct run formatting from all runs in this paragraph\n *\n * This is useful when applying styles, as direct run formatting takes precedence\n * over style formatting in Word. By clearing direct formatting, the style's\n * formatting can take effect.\n *\n * @param properties - Optional array of specific properties to clear.\n * If not specified, clears ALL direct formatting.\n * Valid properties: 'bold', 'italic', 'underline', 'strike',\n * 'font', 'size', 'color', 'highlight', 'subscript', 'superscript',\n * 'smallCaps', 'allCaps', 'dstrike'\n * @returns This paragraph for chaining\n * @example\n * ```typescript\n * // Clear all direct formatting\n * para.clearDirectRunFormatting();\n *\n * // Clear only font and color\n * para.clearDirectRunFormatting(['font', 'color']);\n *\n * // Apply style and clear all formatting\n * para.setStyle('Heading1').clearDirectRunFormatting();\n * ```\n */\n clearDirectRunFormatting(properties?: string[]): this {\n const runs = this.getRuns();\n\n for (const run of runs) {\n const formatting = run.getFormatting();\n\n if (properties && properties.length > 0) {\n // Clear only specified properties\n const newFormatting: RunFormatting = { ...formatting };\n for (const prop of properties) {\n if (prop in newFormatting) {\n delete (newFormatting as any)[prop];\n }\n }\n\n // Create new run with cleared formatting\n const text = run.getText();\n const newRun = new Run(text, newFormatting);\n\n // Replace in content array\n const index = this.content.indexOf(run);\n if (index !== -1) {\n this.content[index] = newRun;\n }\n } else {\n // Clear ALL direct formatting - replace with plain text run\n const text = run.getText();\n const newRun = new Run(text, {});\n\n // Replace in content array\n const index = this.content.indexOf(run);\n if (index !== -1) {\n this.content[index] = newRun;\n }\n }\n }\n\n return this;\n }\n\n /**\n * Applies a style to this paragraph and optionally clears direct run formatting\n *\n * In Word, direct run formatting takes precedence over style formatting. This method\n * provides a way to apply a style while ensuring it takes effect by clearing\n * conflicting direct formatting.\n *\n * @param styleId - Style ID to apply (e.g., 'Normal', 'Heading1')\n * @param clearProperties - Optional array of run properties to clear.\n * If not specified, does NOT clear any formatting (style overlay behavior).\n * Pass empty array [] to clear ALL formatting.\n * @returns This paragraph for chaining\n * @example\n * ```typescript\n * // Apply Heading1 and clear all direct formatting\n * para.applyStyleAndClearFormatting('Heading1', []);\n *\n * // Apply Normal and clear only font and color\n * para.applyStyleAndClearFormatting('Normal', ['font', 'color']);\n *\n * // Apply Title but keep existing run formatting (overlay style)\n * para.applyStyleAndClearFormatting('Title');\n * ```\n */\n applyStyleAndClearFormatting(styleId: string, clearProperties?: string[]): this {\n // Apply the style\n this.setStyle(styleId);\n\n // Clear direct formatting if requested\n if (clearProperties !== undefined) {\n this.clearDirectRunFormatting(clearProperties.length === 0 ? undefined : clearProperties);\n }\n\n return this;\n }\n\n /**\n * Clears paragraph and run formatting that conflicts with a style definition.\n * Uses smart clearing per ECMA-376 §17.7.2 formatting hierarchy.\n *\n * This is critical because direct formatting in document.xml ALWAYS overrides\n * style definitions in styles.xml. To make style modifications take effect,\n * we must remove conflicting direct formatting.\n *\n * Strategy:\n * - Compare paragraph properties with style's paragraph properties\n * - Clear only properties that DIFFER from the style\n * - For each run, call run.clearFormattingConflicts() with style's run formatting\n * - Preserve style reference (pStyle element)\n *\n * @param styleDefinition - Style object containing both paragraph and run formatting\n * @returns This paragraph for method chaining\n * @example\n * ```typescript\n * // Style defines: left alignment, 14pt black Verdana, 6pt spacing\n * // Paragraph has: center alignment (conflict!), 120 twips spacing (conflict!)\n * // Runs have: red color (conflict!), 12pt size (conflict!), bold (not in style - keep!)\n * const style = stylesManager.getStyle('Heading2');\n * paragraph.clearDirectFormattingConflicts(style);\n * // Result: Alignment cleared, spacing cleared, runs' color/size cleared, bold preserved\n * ```\n */\n clearDirectFormattingConflicts(styleDefinition: {\n getProperties(): {\n paragraphFormatting?: ParagraphFormatting;\n runFormatting?: RunFormatting;\n };\n }): this {\n const styleProperties = styleDefinition.getProperties();\n const styleParagraphFormatting = styleProperties.paragraphFormatting || {};\n const styleRunFormatting = styleProperties.runFormatting || {};\n\n // Clear conflicting paragraph-level properties\n // Keep only pStyle (style reference) - clear everything else that conflicts\n const conflictingParaProps: (keyof ParagraphFormatting)[] = [];\n\n for (const key in this.formatting) {\n const propKey = key as keyof ParagraphFormatting;\n\n // Always preserve style reference\n if (propKey === 'style') {\n continue;\n }\n\n // Skip if style doesn't define this property\n if (styleParagraphFormatting[propKey] === undefined) {\n continue;\n }\n\n // Special handling for indentation - strip direct formatting so style/numbering values take effect\n if (propKey === 'indentation') {\n const paraIndent = this.formatting.indentation;\n const styleIndent = styleParagraphFormatting.indentation;\n\n // Preserve intentional zero-indent overrides\n // When style has left indent > 0 and paragraph explicitly sets left to 0,\n // this is an intentional override to remove the indent - preserve it\n if (paraIndent?.left === 0 && styleIndent?.left && styleIndent.left > 0) {\n continue;\n }\n\n // Clear direct indentation so style value takes effect (consistent with other properties)\n conflictingParaProps.push(propKey);\n continue;\n }\n\n // Handle complex objects (spacing, borders, etc.)\n if (\n propKey === 'spacing' ||\n propKey === 'borders' ||\n propKey === 'shading' ||\n propKey === 'numbering'\n ) {\n // Deep comparison for objects\n const paraValue = this.formatting[propKey];\n const styleValue = styleParagraphFormatting[propKey];\n\n if (JSON.stringify(paraValue) !== JSON.stringify(styleValue)) {\n conflictingParaProps.push(propKey);\n }\n } else {\n // Simple value comparison\n if (this.formatting[propKey] !== styleParagraphFormatting[propKey]) {\n conflictingParaProps.push(propKey);\n }\n }\n }\n\n // Clear conflicting paragraph properties\n for (const prop of conflictingParaProps) {\n delete this.formatting[prop];\n }\n\n // Clear conflicting run-level properties from all runs\n for (const item of this.content) {\n if (item instanceof Run) {\n item.clearFormattingConflicts(styleRunFormatting);\n }\n }\n\n return this;\n }\n\n /**\n * Clears all direct formatting from this paragraph and its runs\n *\n * Removes all direct formatting properties from the paragraph and all its runs,\n * leaving only the style reference and text content. This is useful for ensuring\n * paragraphs match their defined style without formatting overrides.\n *\n * @returns This paragraph for chaining\n * @example\n * ```typescript\n * paragraph.clearDirectFormatting();\n * ```\n */\n clearDirectFormatting(): this {\n // Clear paragraph-level formatting (keep only style, numbering, and preserved flag)\n const style = this.formatting.style;\n const numbering = this.formatting.numbering;\n\n this.formatting = {};\n\n // Restore essential properties\n if (style) this.formatting.style = style;\n if (numbering) this.formatting.numbering = numbering;\n\n // Clear run-level formatting\n for (const item of this.content) {\n if (item instanceof Run) {\n item.clearFormatting();\n }\n }\n\n return this;\n }\n}\n"]}