docxmlater 10.4.1 → 11.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (699) hide show
  1. package/README.md +3 -3
  2. package/dist/constants/legacyCompatFlags.d.ts +1 -1
  3. package/dist/constants/legacyCompatFlags.d.ts.map +1 -1
  4. package/dist/constants/legacyCompatFlags.js.map +1 -1
  5. package/dist/core/Document.d.ts +74 -67
  6. package/dist/core/Document.d.ts.map +1 -1
  7. package/dist/core/Document.js +605 -414
  8. package/dist/core/Document.js.map +1 -1
  9. package/dist/core/DocumentContent.d.ts +11 -10
  10. package/dist/core/DocumentContent.d.ts.map +1 -1
  11. package/dist/core/DocumentContent.js +19 -19
  12. package/dist/core/DocumentContent.js.map +1 -1
  13. package/dist/core/DocumentEvents.d.ts +39 -0
  14. package/dist/core/DocumentEvents.d.ts.map +1 -0
  15. package/dist/core/DocumentEvents.js +51 -0
  16. package/dist/core/DocumentEvents.js.map +1 -0
  17. package/dist/core/DocumentGenerator.d.ts +11 -11
  18. package/dist/core/DocumentGenerator.d.ts.map +1 -1
  19. package/dist/core/DocumentGenerator.js +72 -52
  20. package/dist/core/DocumentGenerator.js.map +1 -1
  21. package/dist/core/DocumentParser.d.ts +15 -15
  22. package/dist/core/DocumentParser.d.ts.map +1 -1
  23. package/dist/core/DocumentParser.js +2056 -1073
  24. package/dist/core/DocumentParser.js.map +1 -1
  25. package/dist/core/DocumentValidator.d.ts +3 -3
  26. package/dist/core/DocumentValidator.d.ts.map +1 -1
  27. package/dist/core/DocumentValidator.js +31 -31
  28. package/dist/core/DocumentValidator.js.map +1 -1
  29. package/dist/core/ElementRegistry.d.ts +22 -0
  30. package/dist/core/ElementRegistry.d.ts.map +1 -0
  31. package/dist/core/ElementRegistry.js +27 -0
  32. package/dist/core/ElementRegistry.js.map +1 -0
  33. package/dist/core/Relationship.js +4 -4
  34. package/dist/core/Relationship.js.map +1 -1
  35. package/dist/core/RelationshipManager.d.ts +1 -1
  36. package/dist/core/RelationshipManager.d.ts.map +1 -1
  37. package/dist/core/RelationshipManager.js +32 -32
  38. package/dist/core/RelationshipManager.js.map +1 -1
  39. package/dist/elements/AlternateContent.d.ts +1 -1
  40. package/dist/elements/AlternateContent.d.ts.map +1 -1
  41. package/dist/elements/AlternateContent.js.map +1 -1
  42. package/dist/elements/Bookmark.d.ts +6 -1
  43. package/dist/elements/Bookmark.d.ts.map +1 -1
  44. package/dist/elements/Bookmark.js +19 -3
  45. package/dist/elements/Bookmark.js.map +1 -1
  46. package/dist/elements/BookmarkManager.d.ts +1 -1
  47. package/dist/elements/BookmarkManager.d.ts.map +1 -1
  48. package/dist/elements/BookmarkManager.js +7 -7
  49. package/dist/elements/BookmarkManager.js.map +1 -1
  50. package/dist/elements/Comment.d.ts +2 -2
  51. package/dist/elements/Comment.d.ts.map +1 -1
  52. package/dist/elements/Comment.js +4 -4
  53. package/dist/elements/Comment.js.map +1 -1
  54. package/dist/elements/CommentManager.d.ts +2 -2
  55. package/dist/elements/CommentManager.d.ts.map +1 -1
  56. package/dist/elements/CommentManager.js +9 -9
  57. package/dist/elements/CommentManager.js.map +1 -1
  58. package/dist/elements/CommonTypes.d.ts +9 -4
  59. package/dist/elements/CommonTypes.d.ts.map +1 -1
  60. package/dist/elements/CommonTypes.js +1 -0
  61. package/dist/elements/CommonTypes.js.map +1 -1
  62. package/dist/elements/CustomXml.d.ts +1 -1
  63. package/dist/elements/CustomXml.d.ts.map +1 -1
  64. package/dist/elements/CustomXml.js.map +1 -1
  65. package/dist/elements/Endnote.d.ts +2 -2
  66. package/dist/elements/Endnote.d.ts.map +1 -1
  67. package/dist/elements/Endnote.js +9 -9
  68. package/dist/elements/Endnote.js.map +1 -1
  69. package/dist/elements/EndnoteManager.d.ts +1 -1
  70. package/dist/elements/EndnoteManager.d.ts.map +1 -1
  71. package/dist/elements/EndnoteManager.js +11 -11
  72. package/dist/elements/EndnoteManager.js.map +1 -1
  73. package/dist/elements/Field.d.ts +9 -5
  74. package/dist/elements/Field.d.ts.map +1 -1
  75. package/dist/elements/Field.js +21 -9
  76. package/dist/elements/Field.js.map +1 -1
  77. package/dist/elements/FieldHelpers.d.ts +1 -1
  78. package/dist/elements/FieldHelpers.d.ts.map +1 -1
  79. package/dist/elements/FieldHelpers.js +10 -10
  80. package/dist/elements/FieldHelpers.js.map +1 -1
  81. package/dist/elements/Footer.d.ts +3 -3
  82. package/dist/elements/Footer.d.ts.map +1 -1
  83. package/dist/elements/Footer.js +5 -5
  84. package/dist/elements/Footer.js.map +1 -1
  85. package/dist/elements/Footnote.d.ts +2 -2
  86. package/dist/elements/Footnote.d.ts.map +1 -1
  87. package/dist/elements/Footnote.js +9 -9
  88. package/dist/elements/Footnote.js.map +1 -1
  89. package/dist/elements/FootnoteManager.d.ts +1 -1
  90. package/dist/elements/FootnoteManager.d.ts.map +1 -1
  91. package/dist/elements/FootnoteManager.js +11 -11
  92. package/dist/elements/FootnoteManager.js.map +1 -1
  93. package/dist/elements/Header.d.ts +3 -3
  94. package/dist/elements/Header.d.ts.map +1 -1
  95. package/dist/elements/Header.js +5 -5
  96. package/dist/elements/Header.js.map +1 -1
  97. package/dist/elements/HeaderFooterManager.d.ts +2 -2
  98. package/dist/elements/HeaderFooterManager.d.ts.map +1 -1
  99. package/dist/elements/HeaderFooterManager.js.map +1 -1
  100. package/dist/elements/Hyperlink.d.ts +5 -5
  101. package/dist/elements/Hyperlink.d.ts.map +1 -1
  102. package/dist/elements/Hyperlink.js +29 -29
  103. package/dist/elements/Hyperlink.js.map +1 -1
  104. package/dist/elements/Image.d.ts +1 -1
  105. package/dist/elements/Image.d.ts.map +1 -1
  106. package/dist/elements/Image.js +67 -67
  107. package/dist/elements/Image.js.map +1 -1
  108. package/dist/elements/ImageManager.d.ts +1 -1
  109. package/dist/elements/ImageManager.d.ts.map +1 -1
  110. package/dist/elements/ImageManager.js +4 -4
  111. package/dist/elements/ImageManager.js.map +1 -1
  112. package/dist/elements/ImageRun.d.ts +3 -3
  113. package/dist/elements/ImageRun.d.ts.map +1 -1
  114. package/dist/elements/ImageRun.js +2 -2
  115. package/dist/elements/ImageRun.js.map +1 -1
  116. package/dist/elements/MathElement.d.ts +1 -1
  117. package/dist/elements/MathElement.d.ts.map +1 -1
  118. package/dist/elements/MathElement.js.map +1 -1
  119. package/dist/elements/Paragraph.d.ts +34 -19
  120. package/dist/elements/Paragraph.d.ts.map +1 -1
  121. package/dist/elements/Paragraph.js +286 -231
  122. package/dist/elements/Paragraph.js.map +1 -1
  123. package/dist/elements/PreservedElement.d.ts +1 -1
  124. package/dist/elements/PreservedElement.d.ts.map +1 -1
  125. package/dist/elements/PreservedElement.js.map +1 -1
  126. package/dist/elements/PropertyChangeTypes.d.ts +2 -2
  127. package/dist/elements/PropertyChangeTypes.d.ts.map +1 -1
  128. package/dist/elements/PropertyChangeTypes.js.map +1 -1
  129. package/dist/elements/RangeMarker.d.ts +14 -1
  130. package/dist/elements/RangeMarker.d.ts.map +1 -1
  131. package/dist/elements/RangeMarker.js +46 -8
  132. package/dist/elements/RangeMarker.js.map +1 -1
  133. package/dist/elements/RegisteredBodyElement.d.ts +15 -0
  134. package/dist/elements/RegisteredBodyElement.d.ts.map +1 -0
  135. package/dist/elements/RegisteredBodyElement.js +44 -0
  136. package/dist/elements/RegisteredBodyElement.js.map +1 -0
  137. package/dist/elements/Revision.d.ts +8 -8
  138. package/dist/elements/Revision.d.ts.map +1 -1
  139. package/dist/elements/Revision.js +12 -12
  140. package/dist/elements/Revision.js.map +1 -1
  141. package/dist/elements/RevisionContent.d.ts +3 -3
  142. package/dist/elements/RevisionContent.d.ts.map +1 -1
  143. package/dist/elements/RevisionContent.js.map +1 -1
  144. package/dist/elements/RevisionManager.d.ts +2 -2
  145. package/dist/elements/RevisionManager.d.ts.map +1 -1
  146. package/dist/elements/RevisionManager.js +2 -2
  147. package/dist/elements/RevisionManager.js.map +1 -1
  148. package/dist/elements/Run.d.ts +16 -10
  149. package/dist/elements/Run.d.ts.map +1 -1
  150. package/dist/elements/Run.js +199 -173
  151. package/dist/elements/Run.js.map +1 -1
  152. package/dist/elements/Section.d.ts +4 -2
  153. package/dist/elements/Section.d.ts.map +1 -1
  154. package/dist/elements/Section.js +152 -145
  155. package/dist/elements/Section.js.map +1 -1
  156. package/dist/elements/Shape.d.ts +3 -3
  157. package/dist/elements/Shape.d.ts.map +1 -1
  158. package/dist/elements/Shape.js +12 -12
  159. package/dist/elements/Shape.js.map +1 -1
  160. package/dist/elements/StructuredDocumentTag.d.ts +3 -3
  161. package/dist/elements/StructuredDocumentTag.d.ts.map +1 -1
  162. package/dist/elements/StructuredDocumentTag.js +39 -39
  163. package/dist/elements/StructuredDocumentTag.js.map +1 -1
  164. package/dist/elements/Table.d.ts +16 -10
  165. package/dist/elements/Table.d.ts.map +1 -1
  166. package/dist/elements/Table.js +118 -89
  167. package/dist/elements/Table.js.map +1 -1
  168. package/dist/elements/TableCell.d.ts +11 -11
  169. package/dist/elements/TableCell.d.ts.map +1 -1
  170. package/dist/elements/TableCell.js +108 -78
  171. package/dist/elements/TableCell.js.map +1 -1
  172. package/dist/elements/TableGridChange.d.ts +1 -1
  173. package/dist/elements/TableGridChange.d.ts.map +1 -1
  174. package/dist/elements/TableGridChange.js +3 -3
  175. package/dist/elements/TableGridChange.js.map +1 -1
  176. package/dist/elements/TableOfContents.d.ts +1 -1
  177. package/dist/elements/TableOfContents.d.ts.map +1 -1
  178. package/dist/elements/TableOfContents.js +2 -2
  179. package/dist/elements/TableOfContents.js.map +1 -1
  180. package/dist/elements/TableOfContentsElement.d.ts +2 -2
  181. package/dist/elements/TableOfContentsElement.d.ts.map +1 -1
  182. package/dist/elements/TableOfContentsElement.js +5 -5
  183. package/dist/elements/TableOfContentsElement.js.map +1 -1
  184. package/dist/elements/TableRow.d.ts +18 -7
  185. package/dist/elements/TableRow.d.ts.map +1 -1
  186. package/dist/elements/TableRow.js +127 -74
  187. package/dist/elements/TableRow.js.map +1 -1
  188. package/dist/elements/TextBox.d.ts +4 -4
  189. package/dist/elements/TextBox.d.ts.map +1 -1
  190. package/dist/elements/TextBox.js +6 -6
  191. package/dist/elements/TextBox.js.map +1 -1
  192. package/dist/esm/constants/legacyCompatFlags.js +97 -0
  193. package/dist/esm/constants/legacyCompatFlags.js.map +1 -0
  194. package/dist/esm/constants/limits.js +36 -0
  195. package/dist/esm/constants/limits.js.map +1 -0
  196. package/dist/esm/core/Document.js +8498 -0
  197. package/dist/esm/core/Document.js.map +1 -0
  198. package/dist/esm/core/DocumentContent.js +190 -0
  199. package/dist/esm/core/DocumentContent.js.map +1 -0
  200. package/dist/esm/core/DocumentEvents.js +47 -0
  201. package/dist/esm/core/DocumentEvents.js.map +1 -0
  202. package/dist/esm/core/DocumentGenerator.js +764 -0
  203. package/dist/esm/core/DocumentGenerator.js.map +1 -0
  204. package/dist/esm/core/DocumentIdManager.js +67 -0
  205. package/dist/esm/core/DocumentIdManager.js.map +1 -0
  206. package/dist/esm/core/DocumentParser.js +8760 -0
  207. package/dist/esm/core/DocumentParser.js.map +1 -0
  208. package/dist/esm/core/DocumentValidator.js +222 -0
  209. package/dist/esm/core/DocumentValidator.js.map +1 -0
  210. package/dist/esm/core/ElementRegistry.js +24 -0
  211. package/dist/esm/core/ElementRegistry.js.map +1 -0
  212. package/dist/esm/core/Relationship.js +177 -0
  213. package/dist/esm/core/Relationship.js.map +1 -0
  214. package/dist/esm/core/RelationshipManager.js +202 -0
  215. package/dist/esm/core/RelationshipManager.js.map +1 -0
  216. package/dist/esm/elements/AlternateContent.js +19 -0
  217. package/dist/esm/elements/AlternateContent.js.map +1 -0
  218. package/dist/esm/elements/Bookmark.js +115 -0
  219. package/dist/esm/elements/Bookmark.js.map +1 -0
  220. package/dist/esm/elements/BookmarkManager.js +99 -0
  221. package/dist/esm/elements/BookmarkManager.js.map +1 -0
  222. package/dist/esm/elements/Comment.js +181 -0
  223. package/dist/esm/elements/Comment.js.map +1 -0
  224. package/dist/esm/elements/CommentManager.js +233 -0
  225. package/dist/esm/elements/CommentManager.js.map +1 -0
  226. package/dist/esm/elements/CommonTypes.js +106 -0
  227. package/dist/esm/elements/CommonTypes.js.map +1 -0
  228. package/dist/esm/elements/CustomXml.js +19 -0
  229. package/dist/esm/elements/CustomXml.js.map +1 -0
  230. package/dist/esm/elements/Endnote.js +107 -0
  231. package/dist/esm/elements/Endnote.js.map +1 -0
  232. package/dist/esm/elements/EndnoteManager.js +119 -0
  233. package/dist/esm/elements/EndnoteManager.js.map +1 -0
  234. package/dist/esm/elements/Field.js +856 -0
  235. package/dist/esm/elements/Field.js.map +1 -0
  236. package/dist/esm/elements/FieldHelpers.js +134 -0
  237. package/dist/esm/elements/FieldHelpers.js.map +1 -0
  238. package/dist/esm/elements/FontManager.js +158 -0
  239. package/dist/esm/elements/FontManager.js.map +1 -0
  240. package/dist/esm/elements/Footer.js +141 -0
  241. package/dist/esm/elements/Footer.js.map +1 -0
  242. package/dist/esm/elements/Footnote.js +107 -0
  243. package/dist/esm/elements/Footnote.js.map +1 -0
  244. package/dist/esm/elements/FootnoteManager.js +119 -0
  245. package/dist/esm/elements/FootnoteManager.js.map +1 -0
  246. package/dist/esm/elements/Header.js +141 -0
  247. package/dist/esm/elements/Header.js.map +1 -0
  248. package/dist/esm/elements/HeaderFooterManager.js +87 -0
  249. package/dist/esm/elements/HeaderFooterManager.js.map +1 -0
  250. package/dist/esm/elements/Hyperlink.js +586 -0
  251. package/dist/esm/elements/Hyperlink.js.map +1 -0
  252. package/dist/esm/elements/Image.js +1288 -0
  253. package/dist/esm/elements/Image.js.map +1 -0
  254. package/dist/esm/elements/ImageManager.js +223 -0
  255. package/dist/esm/elements/ImageManager.js.map +1 -0
  256. package/dist/esm/elements/ImageRun.js +29 -0
  257. package/dist/esm/elements/ImageRun.js.map +1 -0
  258. package/dist/esm/elements/MathElement.js +37 -0
  259. package/dist/esm/elements/MathElement.js.map +1 -0
  260. package/dist/esm/elements/Paragraph.js +2308 -0
  261. package/dist/esm/elements/Paragraph.js.map +1 -0
  262. package/dist/esm/elements/PreservedElement.js +29 -0
  263. package/dist/esm/elements/PreservedElement.js.map +1 -0
  264. package/dist/esm/elements/PropertyChangeTypes.js +53 -0
  265. package/dist/esm/elements/PropertyChangeTypes.js.map +1 -0
  266. package/dist/esm/elements/RangeMarker.js +219 -0
  267. package/dist/esm/elements/RangeMarker.js.map +1 -0
  268. package/dist/esm/elements/RegisteredBodyElement.js +40 -0
  269. package/dist/esm/elements/RegisteredBodyElement.js.map +1 -0
  270. package/dist/esm/elements/Revision.js +498 -0
  271. package/dist/esm/elements/Revision.js.map +1 -0
  272. package/dist/esm/elements/RevisionContent.js +18 -0
  273. package/dist/esm/elements/RevisionContent.js.map +1 -0
  274. package/dist/esm/elements/RevisionManager.js +486 -0
  275. package/dist/esm/elements/RevisionManager.js.map +1 -0
  276. package/dist/esm/elements/Run.js +1465 -0
  277. package/dist/esm/elements/Run.js.map +1 -0
  278. package/dist/esm/elements/Section.js +978 -0
  279. package/dist/esm/elements/Section.js.map +1 -0
  280. package/dist/esm/elements/Shape.js +493 -0
  281. package/dist/esm/elements/Shape.js.map +1 -0
  282. package/dist/esm/elements/StructuredDocumentTag.js +471 -0
  283. package/dist/esm/elements/StructuredDocumentTag.js.map +1 -0
  284. package/dist/esm/elements/Table.js +1456 -0
  285. package/dist/esm/elements/Table.js.map +1 -0
  286. package/dist/esm/elements/TableCell.js +835 -0
  287. package/dist/esm/elements/TableCell.js.map +1 -0
  288. package/dist/esm/elements/TableGridChange.js +52 -0
  289. package/dist/esm/elements/TableGridChange.js.map +1 -0
  290. package/dist/esm/elements/TableOfContents.js +389 -0
  291. package/dist/esm/elements/TableOfContents.js.map +1 -0
  292. package/dist/esm/elements/TableOfContentsElement.js +29 -0
  293. package/dist/esm/elements/TableOfContentsElement.js.map +1 -0
  294. package/dist/esm/elements/TableRow.js +555 -0
  295. package/dist/esm/elements/TableRow.js.map +1 -0
  296. package/dist/esm/elements/TextBox.js +459 -0
  297. package/dist/esm/elements/TextBox.js.map +1 -0
  298. package/dist/esm/formatting/AbstractNumbering.js +325 -0
  299. package/dist/esm/formatting/AbstractNumbering.js.map +1 -0
  300. package/dist/esm/formatting/NumberingInstance.js +150 -0
  301. package/dist/esm/formatting/NumberingInstance.js.map +1 -0
  302. package/dist/esm/formatting/NumberingLevel.js +608 -0
  303. package/dist/esm/formatting/NumberingLevel.js.map +1 -0
  304. package/dist/esm/formatting/NumberingManager.js +423 -0
  305. package/dist/esm/formatting/NumberingManager.js.map +1 -0
  306. package/dist/esm/formatting/Style.js +1151 -0
  307. package/dist/esm/formatting/Style.js.map +1 -0
  308. package/dist/esm/formatting/StylesManager.js +557 -0
  309. package/dist/esm/formatting/StylesManager.js.map +1 -0
  310. package/dist/esm/helpers/CleanupHelper.js +350 -0
  311. package/dist/esm/helpers/CleanupHelper.js.map +1 -0
  312. package/dist/esm/images/ImageOptimizer.js +161 -0
  313. package/dist/esm/images/ImageOptimizer.js.map +1 -0
  314. package/dist/esm/index.js +75 -0
  315. package/dist/esm/index.js.map +1 -0
  316. package/dist/esm/internal.js +16 -0
  317. package/dist/esm/internal.js.map +1 -0
  318. package/dist/esm/managers/DrawingManager.js +163 -0
  319. package/dist/esm/managers/DrawingManager.js.map +1 -0
  320. package/dist/esm/package.json +3 -0
  321. package/dist/esm/processors/ChangelogGenerator.js +970 -0
  322. package/dist/esm/processors/ChangelogGenerator.js.map +1 -0
  323. package/dist/esm/processors/CompatibilityUpgrader.js +130 -0
  324. package/dist/esm/processors/CompatibilityUpgrader.js.map +1 -0
  325. package/dist/esm/processors/InMemoryRevisionAcceptor.js +530 -0
  326. package/dist/esm/processors/InMemoryRevisionAcceptor.js.map +1 -0
  327. package/dist/esm/processors/MoveOperationHelper.js +57 -0
  328. package/dist/esm/processors/MoveOperationHelper.js.map +1 -0
  329. package/dist/esm/processors/RevisionAwareProcessor.js +232 -0
  330. package/dist/esm/processors/RevisionAwareProcessor.js.map +1 -0
  331. package/dist/esm/processors/RevisionWalker.js +278 -0
  332. package/dist/esm/processors/RevisionWalker.js.map +1 -0
  333. package/dist/{utils → esm/processors}/SelectiveRevisionAcceptor.js +81 -42
  334. package/dist/esm/processors/SelectiveRevisionAcceptor.js.map +1 -0
  335. package/dist/esm/processors/ShadingResolver.js +66 -0
  336. package/dist/esm/processors/ShadingResolver.js.map +1 -0
  337. package/dist/esm/processors/acceptRevisions.js +416 -0
  338. package/dist/esm/processors/acceptRevisions.js.map +1 -0
  339. package/dist/esm/processors/cnfStyleDecoder.js +89 -0
  340. package/dist/esm/processors/cnfStyleDecoder.js.map +1 -0
  341. package/dist/esm/processors/stripTrackedChanges.js +201 -0
  342. package/dist/esm/processors/stripTrackedChanges.js.map +1 -0
  343. package/dist/esm/tracking/DocumentTrackingContext.js +531 -0
  344. package/dist/esm/tracking/DocumentTrackingContext.js.map +1 -0
  345. package/dist/esm/tracking/TrackingContext.js +2 -0
  346. package/dist/esm/tracking/TrackingContext.js.map +1 -0
  347. package/dist/esm/types/compatibility-types.js +8 -0
  348. package/dist/esm/types/compatibility-types.js.map +1 -0
  349. package/dist/esm/types/document-types.js +2 -0
  350. package/dist/esm/types/document-types.js.map +1 -0
  351. package/dist/esm/types/formatting.js +2 -0
  352. package/dist/esm/types/formatting.js.map +1 -0
  353. package/dist/esm/types/list-types.js +2 -0
  354. package/dist/esm/types/list-types.js.map +1 -0
  355. package/dist/esm/types/settings-types.js +2 -0
  356. package/dist/esm/types/settings-types.js.map +1 -0
  357. package/dist/esm/types/styleConfig.js +2 -0
  358. package/dist/esm/types/styleConfig.js.map +1 -0
  359. package/dist/esm/utils/KeyedRegistry.js +32 -0
  360. package/dist/esm/utils/KeyedRegistry.js.map +1 -0
  361. package/dist/esm/utils/corruptionDetection.js +155 -0
  362. package/dist/esm/utils/corruptionDetection.js.map +1 -0
  363. package/dist/esm/utils/dateFormatting.js +4 -0
  364. package/dist/esm/utils/dateFormatting.js.map +1 -0
  365. package/dist/esm/utils/deepClone.js +40 -0
  366. package/dist/esm/utils/deepClone.js.map +1 -0
  367. package/dist/esm/utils/deepEqual.js +47 -0
  368. package/dist/esm/utils/deepEqual.js.map +1 -0
  369. package/dist/esm/utils/diagnostics.js +69 -0
  370. package/dist/esm/utils/diagnostics.js.map +1 -0
  371. package/dist/esm/utils/errorHandling.js +36 -0
  372. package/dist/esm/utils/errorHandling.js.map +1 -0
  373. package/dist/esm/utils/formatting.js +93 -0
  374. package/dist/esm/utils/formatting.js.map +1 -0
  375. package/dist/esm/utils/list-detection.js +148 -0
  376. package/dist/esm/utils/list-detection.js.map +1 -0
  377. package/dist/esm/utils/logger.js +205 -0
  378. package/dist/esm/utils/logger.js.map +1 -0
  379. package/dist/esm/utils/parsingHelpers.js +56 -0
  380. package/dist/esm/utils/parsingHelpers.js.map +1 -0
  381. package/dist/esm/utils/textDiff.js +42 -0
  382. package/dist/esm/utils/textDiff.js.map +1 -0
  383. package/dist/esm/utils/units.js +152 -0
  384. package/dist/esm/utils/units.js.map +1 -0
  385. package/dist/esm/utils/validation.js +285 -0
  386. package/dist/esm/utils/validation.js.map +1 -0
  387. package/dist/esm/utils/xmlSanitization.js +54 -0
  388. package/dist/esm/utils/xmlSanitization.js.map +1 -0
  389. package/dist/esm/validation/RevisionAutoFixer.js +340 -0
  390. package/dist/esm/validation/RevisionAutoFixer.js.map +1 -0
  391. package/dist/esm/validation/RevisionValidator.js +240 -0
  392. package/dist/esm/validation/RevisionValidator.js.map +1 -0
  393. package/dist/esm/validation/ValidationRuleRegistry.js +40 -0
  394. package/dist/esm/validation/ValidationRuleRegistry.js.map +1 -0
  395. package/dist/esm/validation/ValidationRules.js +92 -0
  396. package/dist/esm/validation/ValidationRules.js.map +1 -0
  397. package/dist/esm/validation/index.js +4 -0
  398. package/dist/esm/validation/index.js.map +1 -0
  399. package/dist/esm/xml/XMLBuilder.js +434 -0
  400. package/dist/esm/xml/XMLBuilder.js.map +1 -0
  401. package/dist/esm/xml/XMLParser.js +486 -0
  402. package/dist/esm/xml/XMLParser.js.map +1 -0
  403. package/dist/esm/zip/ZipHandler.js +298 -0
  404. package/dist/esm/zip/ZipHandler.js.map +1 -0
  405. package/dist/esm/zip/ZipReader.js +147 -0
  406. package/dist/esm/zip/ZipReader.js.map +1 -0
  407. package/dist/esm/zip/ZipWriter.js +199 -0
  408. package/dist/esm/zip/ZipWriter.js.map +1 -0
  409. package/dist/esm/zip/errors.js +43 -0
  410. package/dist/esm/zip/errors.js.map +1 -0
  411. package/dist/esm/zip/types.js +31 -0
  412. package/dist/esm/zip/types.js.map +1 -0
  413. package/dist/formatting/AbstractNumbering.d.ts +2 -2
  414. package/dist/formatting/AbstractNumbering.d.ts.map +1 -1
  415. package/dist/formatting/AbstractNumbering.js +33 -33
  416. package/dist/formatting/AbstractNumbering.js.map +1 -1
  417. package/dist/formatting/NumberingInstance.d.ts +2 -2
  418. package/dist/formatting/NumberingInstance.d.ts.map +1 -1
  419. package/dist/formatting/NumberingInstance.js +7 -7
  420. package/dist/formatting/NumberingInstance.js.map +1 -1
  421. package/dist/formatting/NumberingLevel.d.ts +11 -2
  422. package/dist/formatting/NumberingLevel.d.ts.map +1 -1
  423. package/dist/formatting/NumberingLevel.js +111 -25
  424. package/dist/formatting/NumberingLevel.js.map +1 -1
  425. package/dist/formatting/NumberingManager.d.ts +4 -4
  426. package/dist/formatting/NumberingManager.d.ts.map +1 -1
  427. package/dist/formatting/NumberingManager.js +28 -28
  428. package/dist/formatting/NumberingManager.js.map +1 -1
  429. package/dist/formatting/Style.d.ts +14 -7
  430. package/dist/formatting/Style.d.ts.map +1 -1
  431. package/dist/formatting/Style.js +309 -112
  432. package/dist/formatting/Style.js.map +1 -1
  433. package/dist/formatting/StylesManager.d.ts +2 -2
  434. package/dist/formatting/StylesManager.d.ts.map +1 -1
  435. package/dist/formatting/StylesManager.js +52 -52
  436. package/dist/formatting/StylesManager.js.map +1 -1
  437. package/dist/helpers/CleanupHelper.d.ts +1 -1
  438. package/dist/helpers/CleanupHelper.d.ts.map +1 -1
  439. package/dist/helpers/CleanupHelper.js +15 -15
  440. package/dist/helpers/CleanupHelper.js.map +1 -1
  441. package/dist/index.d.ts +81 -90
  442. package/dist/index.d.ts.map +1 -1
  443. package/dist/index.js +286 -317
  444. package/dist/index.js.map +1 -1
  445. package/dist/internal.d.ts +16 -0
  446. package/dist/internal.d.ts.map +1 -0
  447. package/dist/internal.js +42 -0
  448. package/dist/internal.js.map +1 -0
  449. package/dist/managers/DrawingManager.d.ts +3 -3
  450. package/dist/managers/DrawingManager.d.ts.map +1 -1
  451. package/dist/managers/DrawingManager.js +12 -12
  452. package/dist/managers/DrawingManager.js.map +1 -1
  453. package/dist/{utils → processors}/ChangelogGenerator.d.ts +2 -2
  454. package/dist/processors/ChangelogGenerator.d.ts.map +1 -0
  455. package/dist/{utils → processors}/ChangelogGenerator.js +2 -2
  456. package/dist/processors/ChangelogGenerator.js.map +1 -0
  457. package/dist/processors/CompatibilityUpgrader.d.ts.map +1 -0
  458. package/dist/{utils → processors}/CompatibilityUpgrader.js +10 -10
  459. package/dist/processors/CompatibilityUpgrader.js.map +1 -0
  460. package/dist/{utils → processors}/InMemoryRevisionAcceptor.d.ts +3 -3
  461. package/dist/processors/InMemoryRevisionAcceptor.d.ts.map +1 -0
  462. package/dist/{utils → processors}/InMemoryRevisionAcceptor.js +84 -27
  463. package/dist/processors/InMemoryRevisionAcceptor.js.map +1 -0
  464. package/dist/{utils → processors}/MoveOperationHelper.d.ts +4 -4
  465. package/dist/processors/MoveOperationHelper.d.ts.map +1 -0
  466. package/dist/{utils → processors}/MoveOperationHelper.js +10 -10
  467. package/dist/processors/MoveOperationHelper.js.map +1 -0
  468. package/dist/{utils → processors}/RevisionAwareProcessor.d.ts +3 -3
  469. package/dist/processors/RevisionAwareProcessor.d.ts.map +1 -0
  470. package/dist/{utils → processors}/RevisionAwareProcessor.js +2 -2
  471. package/dist/processors/RevisionAwareProcessor.js.map +1 -0
  472. package/dist/{utils → processors}/RevisionWalker.d.ts +2 -1
  473. package/dist/processors/RevisionWalker.d.ts.map +1 -0
  474. package/dist/{utils → processors}/RevisionWalker.js +28 -0
  475. package/dist/processors/RevisionWalker.js.map +1 -0
  476. package/dist/{utils → processors}/SelectiveRevisionAcceptor.d.ts +4 -3
  477. package/dist/processors/SelectiveRevisionAcceptor.d.ts.map +1 -0
  478. package/dist/processors/SelectiveRevisionAcceptor.js +402 -0
  479. package/dist/processors/SelectiveRevisionAcceptor.js.map +1 -0
  480. package/dist/processors/ShadingResolver.d.ts +6 -0
  481. package/dist/processors/ShadingResolver.d.ts.map +1 -0
  482. package/dist/{utils → processors}/ShadingResolver.js +2 -2
  483. package/dist/processors/ShadingResolver.js.map +1 -0
  484. package/dist/{utils → processors}/acceptRevisions.d.ts +1 -1
  485. package/dist/processors/acceptRevisions.d.ts.map +1 -0
  486. package/dist/{utils → processors}/acceptRevisions.js +24 -4
  487. package/dist/processors/acceptRevisions.js.map +1 -0
  488. package/dist/{utils → processors}/cnfStyleDecoder.d.ts +1 -1
  489. package/dist/processors/cnfStyleDecoder.d.ts.map +1 -0
  490. package/dist/processors/cnfStyleDecoder.js.map +1 -0
  491. package/dist/processors/stripTrackedChanges.d.ts +3 -0
  492. package/dist/processors/stripTrackedChanges.d.ts.map +1 -0
  493. package/dist/{utils → processors}/stripTrackedChanges.js +16 -6
  494. package/dist/processors/stripTrackedChanges.js.map +1 -0
  495. package/dist/tracking/DocumentTrackingContext.d.ts +4 -4
  496. package/dist/tracking/DocumentTrackingContext.d.ts.map +1 -1
  497. package/dist/tracking/DocumentTrackingContext.js +38 -43
  498. package/dist/tracking/DocumentTrackingContext.js.map +1 -1
  499. package/dist/tracking/TrackingContext.d.ts +8 -8
  500. package/dist/tracking/TrackingContext.d.ts.map +1 -1
  501. package/dist/tracking/TrackingContext.js.map +1 -1
  502. package/dist/types/document-types.d.ts +28 -0
  503. package/dist/types/document-types.d.ts.map +1 -0
  504. package/dist/types/document-types.js +3 -0
  505. package/dist/types/document-types.js.map +1 -0
  506. package/dist/types/formatting.d.ts +4 -4
  507. package/dist/types/formatting.d.ts.map +1 -1
  508. package/dist/types/formatting.js.map +1 -1
  509. package/dist/types/settings-types.d.ts +6 -0
  510. package/dist/types/settings-types.d.ts.map +1 -1
  511. package/dist/types/settings-types.js.map +1 -1
  512. package/dist/utils/KeyedRegistry.d.ts +13 -0
  513. package/dist/utils/KeyedRegistry.d.ts.map +1 -0
  514. package/dist/utils/KeyedRegistry.js +36 -0
  515. package/dist/utils/KeyedRegistry.js.map +1 -0
  516. package/dist/utils/corruptionDetection.d.ts +1 -1
  517. package/dist/utils/corruptionDetection.d.ts.map +1 -1
  518. package/dist/utils/corruptionDetection.js +4 -4
  519. package/dist/utils/corruptionDetection.js.map +1 -1
  520. package/dist/utils/deepEqual.d.ts +2 -0
  521. package/dist/utils/deepEqual.d.ts.map +1 -0
  522. package/dist/utils/deepEqual.js +50 -0
  523. package/dist/utils/deepEqual.js.map +1 -0
  524. package/dist/utils/list-detection.d.ts +2 -2
  525. package/dist/utils/list-detection.d.ts.map +1 -1
  526. package/dist/utils/list-detection.js.map +1 -1
  527. package/dist/utils/parsingHelpers.d.ts +1 -1
  528. package/dist/utils/parsingHelpers.d.ts.map +1 -1
  529. package/dist/utils/parsingHelpers.js +2 -2
  530. package/dist/utils/parsingHelpers.js.map +1 -1
  531. package/dist/utils/validation.js +7 -7
  532. package/dist/utils/validation.js.map +1 -1
  533. package/dist/utils/xmlSanitization.js +2 -2
  534. package/dist/utils/xmlSanitization.js.map +1 -1
  535. package/dist/validation/RevisionAutoFixer.d.ts +4 -4
  536. package/dist/validation/RevisionAutoFixer.d.ts.map +1 -1
  537. package/dist/validation/RevisionAutoFixer.js +11 -11
  538. package/dist/validation/RevisionAutoFixer.js.map +1 -1
  539. package/dist/validation/RevisionValidator.d.ts +5 -4
  540. package/dist/validation/RevisionValidator.d.ts.map +1 -1
  541. package/dist/validation/RevisionValidator.js +29 -30
  542. package/dist/validation/RevisionValidator.js.map +1 -1
  543. package/dist/validation/ValidationRuleRegistry.d.ts +27 -0
  544. package/dist/validation/ValidationRuleRegistry.d.ts.map +1 -0
  545. package/dist/validation/ValidationRuleRegistry.js +43 -0
  546. package/dist/validation/ValidationRuleRegistry.js.map +1 -0
  547. package/dist/validation/index.d.ts +3 -3
  548. package/dist/validation/index.d.ts.map +1 -1
  549. package/dist/validation/index.js +10 -10
  550. package/dist/validation/index.js.map +1 -1
  551. package/dist/xml/XMLBuilder.d.ts +6 -1
  552. package/dist/xml/XMLBuilder.d.ts.map +1 -1
  553. package/dist/xml/XMLBuilder.js +11 -6
  554. package/dist/xml/XMLBuilder.js.map +1 -1
  555. package/dist/xml/XMLParser.js +6 -6
  556. package/dist/xml/XMLParser.js.map +1 -1
  557. package/dist/zip/ZipHandler.d.ts +1 -1
  558. package/dist/zip/ZipHandler.d.ts.map +1 -1
  559. package/dist/zip/ZipHandler.js +8 -8
  560. package/dist/zip/ZipHandler.js.map +1 -1
  561. package/dist/zip/ZipReader.d.ts +1 -1
  562. package/dist/zip/ZipReader.d.ts.map +1 -1
  563. package/dist/zip/ZipReader.js +14 -14
  564. package/dist/zip/ZipReader.js.map +1 -1
  565. package/dist/zip/ZipWriter.d.ts +1 -1
  566. package/dist/zip/ZipWriter.d.ts.map +1 -1
  567. package/dist/zip/ZipWriter.js +10 -10
  568. package/dist/zip/ZipWriter.js.map +1 -1
  569. package/package.json +20 -4
  570. package/src/constants/legacyCompatFlags.ts +1 -1
  571. package/src/core/Document.ts +461 -167
  572. package/src/core/DocumentContent.ts +14 -11
  573. package/src/core/DocumentEvents.ts +90 -0
  574. package/src/core/DocumentGenerator.ts +49 -22
  575. package/src/core/DocumentParser.ts +2180 -617
  576. package/src/core/DocumentValidator.ts +7 -7
  577. package/src/core/ElementRegistry.ts +69 -0
  578. package/src/core/Relationship.ts +1 -1
  579. package/src/core/RelationshipManager.ts +4 -4
  580. package/src/elements/AlternateContent.ts +1 -1
  581. package/src/elements/Bookmark.ts +52 -4
  582. package/src/elements/BookmarkManager.ts +2 -2
  583. package/src/elements/Comment.ts +3 -3
  584. package/src/elements/CommentManager.ts +4 -4
  585. package/src/elements/CommonTypes.ts +45 -7
  586. package/src/elements/CustomXml.ts +1 -1
  587. package/src/elements/Endnote.ts +2 -2
  588. package/src/elements/EndnoteManager.ts +3 -3
  589. package/src/elements/Field.ts +44 -10
  590. package/src/elements/FieldHelpers.ts +2 -2
  591. package/src/elements/Footer.ts +4 -4
  592. package/src/elements/Footnote.ts +2 -2
  593. package/src/elements/FootnoteManager.ts +3 -3
  594. package/src/elements/Header.ts +4 -4
  595. package/src/elements/HeaderFooterManager.ts +2 -2
  596. package/src/elements/Hyperlink.ts +16 -12
  597. package/src/elements/Image.ts +3 -3
  598. package/src/elements/ImageManager.ts +2 -2
  599. package/src/elements/ImageRun.ts +3 -3
  600. package/src/elements/MathElement.ts +1 -1
  601. package/src/elements/Paragraph.ts +221 -88
  602. package/src/elements/PreservedElement.ts +1 -1
  603. package/src/elements/PropertyChangeTypes.ts +2 -2
  604. package/src/elements/RangeMarker.ts +153 -12
  605. package/src/elements/RegisteredBodyElement.ts +52 -0
  606. package/src/elements/Revision.ts +14 -14
  607. package/src/elements/RevisionContent.ts +3 -3
  608. package/src/elements/RevisionManager.ts +3 -3
  609. package/src/elements/Run.ts +221 -94
  610. package/src/elements/Section.ts +136 -69
  611. package/src/elements/Shape.ts +4 -4
  612. package/src/elements/StructuredDocumentTag.ts +3 -3
  613. package/src/elements/Table.ts +91 -27
  614. package/src/elements/TableCell.ts +62 -34
  615. package/src/elements/TableGridChange.ts +1 -1
  616. package/src/elements/TableOfContents.ts +1 -1
  617. package/src/elements/TableOfContentsElement.ts +2 -2
  618. package/src/elements/TableRow.ts +192 -48
  619. package/src/elements/TextBox.ts +5 -5
  620. package/src/formatting/AbstractNumbering.ts +3 -3
  621. package/src/formatting/NumberingInstance.ts +2 -2
  622. package/src/formatting/NumberingLevel.ts +201 -10
  623. package/src/formatting/NumberingManager.ts +5 -5
  624. package/src/formatting/Style.ts +382 -86
  625. package/src/formatting/StylesManager.ts +4 -4
  626. package/src/helpers/CleanupHelper.ts +6 -6
  627. package/src/index.ts +118 -127
  628. package/src/internal.ts +79 -0
  629. package/src/managers/DrawingManager.ts +3 -3
  630. package/src/{utils → processors}/ChangelogGenerator.ts +3 -3
  631. package/src/{utils → processors}/CompatibilityUpgrader.ts +2 -2
  632. package/src/{utils → processors}/InMemoryRevisionAcceptor.ts +100 -12
  633. package/src/{utils → processors}/MoveOperationHelper.ts +5 -5
  634. package/src/{utils → processors}/RevisionAwareProcessor.ts +3 -3
  635. package/src/{utils → processors}/RevisionWalker.ts +42 -1
  636. package/src/{utils → processors}/SelectiveRevisionAcceptor.ts +98 -39
  637. package/src/{utils → processors}/ShadingResolver.ts +5 -5
  638. package/src/{utils → processors}/acceptRevisions.ts +77 -9
  639. package/src/{utils → processors}/cnfStyleDecoder.ts +1 -1
  640. package/src/{utils → processors}/stripTrackedChanges.ts +35 -10
  641. package/src/tracking/DocumentTrackingContext.ts +12 -14
  642. package/src/tracking/TrackingContext.ts +8 -8
  643. package/src/types/document-types.ts +53 -0
  644. package/src/types/formatting.ts +4 -4
  645. package/src/types/settings-types.ts +32 -0
  646. package/src/utils/KeyedRegistry.ts +41 -0
  647. package/src/utils/corruptionDetection.ts +2 -2
  648. package/src/utils/deepEqual.ts +58 -0
  649. package/src/utils/list-detection.ts +2 -2
  650. package/src/utils/parsingHelpers.ts +11 -3
  651. package/src/utils/validation.ts +3 -3
  652. package/src/utils/xmlSanitization.ts +1 -1
  653. package/src/validation/RevisionAutoFixer.ts +5 -5
  654. package/src/validation/RevisionValidator.ts +39 -28
  655. package/src/validation/ValidationRuleRegistry.ts +86 -0
  656. package/src/validation/index.ts +3 -3
  657. package/src/xml/XMLBuilder.ts +13 -3
  658. package/src/xml/XMLParser.ts +2 -2
  659. package/src/zip/ZipHandler.ts +4 -4
  660. package/src/zip/ZipReader.ts +3 -3
  661. package/src/zip/ZipWriter.ts +3 -3
  662. package/dist/utils/ChangelogGenerator.d.ts.map +0 -1
  663. package/dist/utils/ChangelogGenerator.js.map +0 -1
  664. package/dist/utils/CompatibilityUpgrader.d.ts.map +0 -1
  665. package/dist/utils/CompatibilityUpgrader.js.map +0 -1
  666. package/dist/utils/InMemoryRevisionAcceptor.d.ts.map +0 -1
  667. package/dist/utils/InMemoryRevisionAcceptor.js.map +0 -1
  668. package/dist/utils/MoveOperationHelper.d.ts.map +0 -1
  669. package/dist/utils/MoveOperationHelper.js.map +0 -1
  670. package/dist/utils/RevisionAwareProcessor.d.ts.map +0 -1
  671. package/dist/utils/RevisionAwareProcessor.js.map +0 -1
  672. package/dist/utils/RevisionWalker.d.ts.map +0 -1
  673. package/dist/utils/RevisionWalker.js.map +0 -1
  674. package/dist/utils/SelectiveRevisionAcceptor.d.ts.map +0 -1
  675. package/dist/utils/SelectiveRevisionAcceptor.js.map +0 -1
  676. package/dist/utils/ShadingResolver.d.ts +0 -6
  677. package/dist/utils/ShadingResolver.d.ts.map +0 -1
  678. package/dist/utils/ShadingResolver.js.map +0 -1
  679. package/dist/utils/acceptRevisions.d.ts.map +0 -1
  680. package/dist/utils/acceptRevisions.js.map +0 -1
  681. package/dist/utils/cnfStyleDecoder.d.ts.map +0 -1
  682. package/dist/utils/cnfStyleDecoder.js.map +0 -1
  683. package/dist/utils/stripTrackedChanges.d.ts +0 -3
  684. package/dist/utils/stripTrackedChanges.d.ts.map +0 -1
  685. package/dist/utils/stripTrackedChanges.js.map +0 -1
  686. package/src/__tests__/helper-methods.test.ts +0 -512
  687. package/src/constants/CLAUDE.md +0 -28
  688. package/src/core/CLAUDE.md +0 -113
  689. package/src/elements/CLAUDE.md +0 -142
  690. package/src/formatting/CLAUDE.md +0 -78
  691. package/src/managers/CLAUDE.md +0 -47
  692. package/src/tracking/CLAUDE.md +0 -30
  693. package/src/types/CLAUDE.md +0 -39
  694. package/src/utils/CLAUDE.md +0 -168
  695. package/src/validation/CLAUDE.md +0 -40
  696. package/src/xml/CLAUDE.md +0 -65
  697. package/src/zip/CLAUDE.md +0 -55
  698. /package/dist/{utils → processors}/CompatibilityUpgrader.d.ts +0 -0
  699. /package/dist/{utils → processors}/cnfStyleDecoder.js +0 -0
@@ -48,11 +48,11 @@
48
48
  * @see {@link https://www.ecma-international.org/publications-and-standards/standards/ecma-376/ | ECMA-376 Part 1 §17.16.22}
49
49
  */
50
50
 
51
- import { XMLElement } from '../xml/XMLBuilder';
52
- import { Run, RunFormatting } from './Run';
53
- import { Revision } from './Revision';
54
- import { validateRunText, sanitizeHyperlinkUrl } from '../utils/validation';
55
- import { defaultLogger } from '../utils/logger';
51
+ import { XMLElement } from '../xml/XMLBuilder.js';
52
+ import { Run, RunFormatting } from './Run.js';
53
+ import { Revision } from './Revision.js';
54
+ import { validateRunText, sanitizeHyperlinkUrl } from '../utils/validation.js';
55
+ import { defaultLogger } from '../utils/logger.js';
56
56
 
57
57
  /**
58
58
  * Hyperlink properties
@@ -100,9 +100,9 @@ export class Hyperlink {
100
100
  /** Document location for within-document navigation in external files */
101
101
  private docLocation?: string;
102
102
  /** Tracking context for automatic change tracking */
103
- private trackingContext?: import('../tracking/TrackingContext').TrackingContext;
103
+ private trackingContext?: import('../tracking/TrackingContext.js').TrackingContext;
104
104
  /** Parent paragraph reference for automatic tracking */
105
- private _parentParagraph?: import('./Paragraph').Paragraph;
105
+ private _parentParagraph?: import('./Paragraph.js').Paragraph;
106
106
  /** Baseline formatting captured before first tracked formatting change */
107
107
  private _preTrackingFormatting?: RunFormatting;
108
108
 
@@ -176,7 +176,7 @@ export class Hyperlink {
176
176
  * Called by Document when track changes is enabled.
177
177
  * @internal
178
178
  */
179
- _setTrackingContext(context: import('../tracking/TrackingContext').TrackingContext): void {
179
+ _setTrackingContext(context: import('../tracking/TrackingContext.js').TrackingContext): void {
180
180
  this.trackingContext = context;
181
181
  }
182
182
 
@@ -185,7 +185,7 @@ export class Hyperlink {
185
185
  * Called by Paragraph when hyperlink is added.
186
186
  * @internal
187
187
  */
188
- _setParentParagraph(paragraph: import('./Paragraph').Paragraph): void {
188
+ _setParentParagraph(paragraph: import('./Paragraph.js').Paragraph): void {
189
189
  this._parentParagraph = paragraph;
190
190
  }
191
191
 
@@ -193,7 +193,7 @@ export class Hyperlink {
193
193
  * Gets the parent paragraph reference.
194
194
  * @internal
195
195
  */
196
- _getParentParagraph(): import('./Paragraph').Paragraph | undefined {
196
+ _getParentParagraph(): import('./Paragraph.js').Paragraph | undefined {
197
197
  return this._parentParagraph;
198
198
  }
199
199
 
@@ -1208,8 +1208,12 @@ export class Hyperlink {
1208
1208
  attributes['w:tgtFrame'] = this.tgtFrame;
1209
1209
  }
1210
1210
 
1211
- // History tracking attribute
1212
- if (this.history) {
1211
+ // History tracking attribute (CT_OnOff per ECMA-376 §17.16.22).
1212
+ // Use `!== undefined` rather than a truthy check so explicit "0" /
1213
+ // "false" / "off" overrides survive round-trip — the parser
1214
+ // normalises to "1"/"0", but external callers may still set any
1215
+ // ST_OnOff literal.
1216
+ if (this.history !== undefined) {
1213
1217
  attributes['w:history'] = this.history;
1214
1218
  }
1215
1219
 
@@ -6,9 +6,9 @@
6
6
  */
7
7
 
8
8
  import { promises as fs } from 'fs';
9
- import { defaultLogger } from '../utils/logger';
10
- import { inchesToEmus, UNITS } from '../utils/units';
11
- import { XMLBuilder, XMLElement } from '../xml/XMLBuilder';
9
+ import { defaultLogger } from '../utils/logger.js';
10
+ import { inchesToEmus, UNITS } from '../utils/units.js';
11
+ import { XMLBuilder, XMLElement } from '../xml/XMLBuilder.js';
12
12
 
13
13
  /**
14
14
  * Supported image formats
@@ -5,8 +5,8 @@
5
5
  * with the RelationshipManager for image relationships.
6
6
  */
7
7
 
8
- import { Image } from './Image';
9
- import { defaultLogger } from '../utils/logger';
8
+ import { Image } from './Image.js';
9
+ import { defaultLogger } from '../utils/logger.js';
10
10
 
11
11
  /**
12
12
  * Image file entry
@@ -6,9 +6,9 @@
6
6
  * It generates proper w:r (run) XML with w:drawing child element.
7
7
  */
8
8
 
9
- import { Run } from './Run';
10
- import { Image } from './Image';
11
- import { XMLElement } from '../xml/XMLBuilder';
9
+ import { Run } from './Run.js';
10
+ import { Image } from './Image.js';
11
+ import { XMLElement } from '../xml/XMLBuilder.js';
12
12
 
13
13
  /**
14
14
  * ImageRun - A run containing an embedded image
@@ -8,7 +8,7 @@
8
8
  * internal structure (fractions, radicals, matrices, etc.).
9
9
  */
10
10
 
11
- import { XMLElement } from '../xml/XMLBuilder';
11
+ import { XMLElement } from '../xml/XMLBuilder.js';
12
12
 
13
13
  /**
14
14
  * Block-level math paragraph (m:oMathPara)
@@ -3,18 +3,20 @@
3
3
  * Contains one or more runs of formatted text
4
4
  */
5
5
 
6
- import { deepClone } from '../utils/deepClone';
7
- import { formatDateForXml } from '../utils/dateFormatting';
8
- import { logParagraphContent, logTextDirection } from '../utils/diagnostics';
9
- import { isEqualFormatting } from '../utils/formatting';
10
- import { defaultLogger } from '../utils/logger';
11
- import { XMLBuilder, XMLElement } from '../xml/XMLBuilder';
12
- import { Bookmark } from './Bookmark';
13
- import type { Comment } from './Comment';
6
+ import { deepClone } from '../utils/deepClone.js';
7
+ import { deepEqual } from '../utils/deepEqual.js';
8
+ import { formatDateForXml } from '../utils/dateFormatting.js';
9
+ import { logParagraphContent, logTextDirection } from '../utils/diagnostics.js';
10
+ import { isEqualFormatting } from '../utils/formatting.js';
11
+ import { defaultLogger } from '../utils/logger.js';
12
+ import { XMLBuilder, XMLElement } from '../xml/XMLBuilder.js';
13
+ import { Bookmark } from './Bookmark.js';
14
+ import type { Comment } from './Comment.js';
14
15
  import {
15
16
  // Import common types
16
17
  ParagraphAlignment as CommonParagraphAlignment,
17
18
  BorderStyle as CommonBorderStyle,
19
+ FullBorderStyle as CommonFullBorderStyle,
18
20
  BasicShadingPattern,
19
21
  TabAlignment as CommonTabAlignment,
20
22
  TabLeader as CommonTabLeader,
@@ -22,15 +24,15 @@ import {
22
24
  TextVerticalAlignment,
23
25
  ShadingConfig,
24
26
  buildShadingAttributes,
25
- } from './CommonTypes';
26
- import { ComplexField, Field } from './Field';
27
- import { Hyperlink } from './Hyperlink';
28
- import { RangeMarker } from './RangeMarker';
29
- import { Revision } from './Revision';
30
- import { Run, RunFormatting } from './Run';
31
- import { Shape } from './Shape';
32
- import { TextBox } from './TextBox';
33
- import { PreservedElement } from './PreservedElement';
27
+ } from './CommonTypes.js';
28
+ import { ComplexField, Field } from './Field.js';
29
+ import { Hyperlink } from './Hyperlink.js';
30
+ import { RangeMarker } from './RangeMarker.js';
31
+ import { Revision } from './Revision.js';
32
+ import { Run, RunFormatting } from './Run.js';
33
+ import { Shape } from './Shape.js';
34
+ import { TextBox } from './TextBox.js';
35
+ import { PreservedElement } from './PreservedElement.js';
34
36
 
35
37
  // ============================================================================
36
38
  // RE-EXPORTED TYPES (for backward compatibility)
@@ -126,8 +128,12 @@ export interface FrameProperties {
126
128
  y?: number;
127
129
  /** Relative horizontal alignment */
128
130
  xAlign?: 'left' | 'center' | 'right' | 'inside' | 'outside';
129
- /** Relative vertical alignment */
130
- yAlign?: 'top' | 'center' | 'bottom' | 'inside' | 'outside';
131
+ /**
132
+ * Relative vertical alignment per ECMA-376 Part 1 §17.18.110 ST_YAlign.
133
+ * `inline` anchors the frame in line with the surrounding text rather
134
+ * than offsetting it vertically.
135
+ */
136
+ yAlign?: 'top' | 'center' | 'bottom' | 'inline' | 'inside' | 'outside';
131
137
  /** Horizontal anchor/positioning base */
132
138
  hAnchor?: 'page' | 'margin' | 'text';
133
139
  /** Vertical anchor/positioning base */
@@ -147,17 +153,30 @@ export interface FrameProperties {
147
153
  }
148
154
 
149
155
  /**
150
- * Single border definition
156
+ * Single paragraph-border definition. `style` uses FullBorderStyle (25+
157
+ * ST_Border values per ECMA-376 §17.18.2) — paragraph borders support
158
+ * the full multi-line-gap / triple / inset / outset set, not just the
159
+ * narrow 6-value BorderStyle subset that this field previously used.
151
160
  */
152
161
  export interface BorderDefinition {
153
- /** Border style */
154
- style?: BorderStyle;
162
+ /** Border style (full ST_Border enumeration) */
163
+ style?: CommonFullBorderStyle;
155
164
  /** Border width in eighths of a point (1-96) */
156
165
  size?: number;
157
166
  /** Border color (hex without #) */
158
167
  color?: string;
159
168
  /** Space between border and text in points (0-31) */
160
169
  space?: number;
170
+ /** Theme color reference (ST_ThemeColor per §17.18.97) */
171
+ themeColor?: string;
172
+ /** Theme tint (2-hex-digit string) */
173
+ themeTint?: string;
174
+ /** Theme shade (2-hex-digit string) */
175
+ themeShade?: string;
176
+ /** Border casts a shadow (ST_OnOff attribute on CT_Border §17.18.2) */
177
+ shadow?: boolean;
178
+ /** Border is part of a frame around the content (ST_OnOff) */
179
+ frame?: boolean;
161
180
  }
162
181
 
163
182
  /**
@@ -184,6 +203,18 @@ export interface ParagraphFormatting {
184
203
  right?: number;
185
204
  firstLine?: number;
186
205
  hanging?: number;
206
+ /**
207
+ * CJK character-unit indentation attributes per ECMA-376 §17.3.1.12.
208
+ * Values are in hundredths of a character unit (200 = 2 character widths).
209
+ * Used alongside (not instead of) the twips attributes: Word authors
210
+ * specify one or the other based on document language, and both are
211
+ * preserved on round-trip so downstream consumers keep the author's
212
+ * original intent.
213
+ */
214
+ leftChars?: number;
215
+ rightChars?: number;
216
+ firstLineChars?: number;
217
+ hangingChars?: number;
187
218
  };
188
219
  /** Spacing per ECMA-376 §17.3.1.33 (CT_Spacing) */
189
220
  spacing?: {
@@ -278,6 +309,19 @@ export interface ParagraphFormatting {
278
309
  pPrChange?: ParagraphPropertiesChange;
279
310
  /** Run properties for the paragraph mark (¶ symbol formatting) */
280
311
  paragraphMarkRunProperties?: RunFormatting;
312
+ /**
313
+ * Paragraph mark run-properties change tracking (w:rPrChange inside
314
+ * <w:pPr><w:rPr>), per ECMA-376 Part 1 §17.3.1.30 / CT_ParaRPrChange.
315
+ * Stores the previous rPr of the pilcrow glyph when its formatting has
316
+ * been modified under track changes. Emitted as the LAST child of the
317
+ * paragraph-mark <w:rPr> per CT_ParaRPr schema.
318
+ */
319
+ paragraphMarkRunPropertiesChange?: {
320
+ id: number;
321
+ author: string;
322
+ date: Date;
323
+ previousProperties: Partial<RunFormatting>;
324
+ };
281
325
  /** Paragraph mark deletion tracking (for deleted ¶ symbols) */
282
326
  paragraphMarkDeletion?: {
283
327
  /** Unique revision ID */
@@ -412,11 +456,11 @@ export class Paragraph {
412
456
  /** Internal flag to mark paragraph as preserved from removal operations */
413
457
  private _isPreserved = false;
414
458
  /** Tracking context for automatic change tracking */
415
- private trackingContext?: import('../tracking/TrackingContext').TrackingContext;
459
+ private trackingContext?: import('../tracking/TrackingContext.js').TrackingContext;
416
460
  /** Parent table cell reference (if paragraph is inside a table cell) */
417
- private _parentCell?: import('./TableCell').TableCell;
461
+ private _parentCell?: import('./TableCell.js').TableCell;
418
462
  /** StylesManager reference for conditional formatting resolution */
419
- private _stylesManager?: import('../formatting/StylesManager').StylesManager;
463
+ private _stylesManager?: import('../formatting/StylesManager.js').StylesManager;
420
464
  /**
421
465
  * Internal flag to mark paragraph as part of a multi-paragraph field (e.g., TOC)
422
466
  * When true, assembleComplexFields() will skip processing this paragraph
@@ -438,7 +482,7 @@ export class Paragraph {
438
482
  * Called by Document when track changes is enabled.
439
483
  * @internal
440
484
  */
441
- _setTrackingContext(context: import('../tracking/TrackingContext').TrackingContext): void {
485
+ _setTrackingContext(context: import('../tracking/TrackingContext.js').TrackingContext): void {
442
486
  this.trackingContext = context;
443
487
  }
444
488
 
@@ -447,7 +491,7 @@ export class Paragraph {
447
491
  * Called by TableCell when adding paragraphs.
448
492
  * @internal
449
493
  */
450
- _setParentCell(cell: import('./TableCell').TableCell | undefined): void {
494
+ _setParentCell(cell: import('./TableCell.js').TableCell | undefined): void {
451
495
  this._parentCell = cell;
452
496
  }
453
497
 
@@ -455,7 +499,7 @@ export class Paragraph {
455
499
  * Gets the parent cell reference for this paragraph.
456
500
  * @internal
457
501
  */
458
- _getParentCell(): import('./TableCell').TableCell | undefined {
502
+ _getParentCell(): import('./TableCell.js').TableCell | undefined {
459
503
  return this._parentCell;
460
504
  }
461
505
 
@@ -489,7 +533,7 @@ export class Paragraph {
489
533
  * Called by Document/Table when adding paragraphs.
490
534
  * @internal
491
535
  */
492
- _setStylesManager(manager: import('../formatting/StylesManager').StylesManager): void {
536
+ _setStylesManager(manager: import('../formatting/StylesManager.js').StylesManager): void {
493
537
  this._stylesManager = manager;
494
538
  }
495
539
 
@@ -497,7 +541,7 @@ export class Paragraph {
497
541
  * Gets the StylesManager reference for conditional formatting resolution.
498
542
  * @internal
499
543
  */
500
- _getStylesManager(): import('../formatting/StylesManager').StylesManager | undefined {
544
+ _getStylesManager(): import('../formatting/StylesManager.js').StylesManager | undefined {
501
545
  return this._stylesManager;
502
546
  }
503
547
 
@@ -3169,15 +3213,25 @@ export class Paragraph {
3169
3213
  border: BorderDefinition | undefined
3170
3214
  ): XMLElement | null => {
3171
3215
  if (!border) return null;
3172
- const attributes: Record<string, string | number> = {};
3173
- if (border.style) attributes['w:val'] = border.style;
3216
+ // CT_Border §17.18.2: `w:val` (ST_Border) is REQUIRED. Default to
3217
+ // "nil" (the "no visible border" sentinel) when the consumer set
3218
+ // only size/color/space — otherwise strict OOXML validators reject
3219
+ // the document with "The required attribute 'val' is missing".
3220
+ const attributes: Record<string, string | number> = {
3221
+ 'w:val': border.style ?? 'nil',
3222
+ };
3174
3223
  if (border.size !== undefined) attributes['w:sz'] = border.size;
3175
3224
  if (border.color) attributes['w:color'] = border.color;
3176
3225
  if (border.space !== undefined) attributes['w:space'] = border.space;
3177
- if (Object.keys(attributes).length > 0) {
3178
- return XMLBuilder.wSelf(borderType, attributes);
3179
- }
3180
- return null;
3226
+ // Full CT_Border attribute set (§17.18.2): themeColor / themeTint /
3227
+ // themeShade / shadow / frame. Round-trips themed paragraph borders
3228
+ // authored by Word — previously all five were silently stripped.
3229
+ if (border.themeColor) attributes['w:themeColor'] = border.themeColor;
3230
+ if (border.themeTint) attributes['w:themeTint'] = border.themeTint;
3231
+ if (border.themeShade) attributes['w:themeShade'] = border.themeShade;
3232
+ if (border.shadow !== undefined) attributes['w:shadow'] = border.shadow ? '1' : '0';
3233
+ if (border.frame !== undefined) attributes['w:frame'] = border.frame ? '1' : '0';
3234
+ return XMLBuilder.wSelf(borderType, attributes);
3181
3235
  };
3182
3236
 
3183
3237
  // Add borders in order: top, left, bottom, right, between, bar
@@ -3212,13 +3266,18 @@ export class Paragraph {
3212
3266
  }
3213
3267
  }
3214
3268
 
3215
- // 11. Tab stops
3269
+ // 11. Tab stops. CT_TabStop §17.3.1.37 declares BOTH `w:val` (ST_TabJc)
3270
+ // and `w:pos` (ST_SignedTwipsMeasure) as REQUIRED attributes. Default
3271
+ // `w:val` to "left" (ST_TabJc default and Word's authored default) when
3272
+ // caller didn't specify — otherwise strict OOXML validation rejects
3273
+ // the output with "The required attribute 'val' is missing".
3216
3274
  if (this.formatting.tabs && this.formatting.tabs.length > 0) {
3217
3275
  const tabChildren: XMLElement[] = [];
3218
3276
  for (const tab of this.formatting.tabs) {
3219
- const attributes: Record<string, string | number> = {};
3220
- attributes['w:pos'] = tab.position;
3221
- if (tab.val) attributes['w:val'] = tab.val;
3277
+ const attributes: Record<string, string | number> = {
3278
+ 'w:val': tab.val ?? 'left',
3279
+ 'w:pos': tab.position,
3280
+ };
3222
3281
  if (tab.leader) attributes['w:leader'] = tab.leader;
3223
3282
  tabChildren.push(XMLBuilder.wSelf('tab', attributes));
3224
3283
  }
@@ -3301,8 +3360,11 @@ export class Paragraph {
3301
3360
  }
3302
3361
  }
3303
3362
 
3304
- // 17. Indentation (left/right/firstLine/hanging)
3305
- // Per ECMA-376 §17.3.1.12, firstLine and hanging are mutually exclusive — hanging takes precedence
3363
+ // 17. Indentation (left/right/firstLine/hanging + CJK character-unit variants)
3364
+ // Per ECMA-376 §17.3.1.12, firstLine and hanging are mutually exclusive —
3365
+ // hanging takes precedence. The *Chars attributes (ST_DecimalNumber, in
3366
+ // hundredths of a character unit) are independent of the twips variants;
3367
+ // Word authors in CJK locales emit them alongside — preserve both on save.
3306
3368
  if (this.formatting.indentation) {
3307
3369
  const ind = this.formatting.indentation;
3308
3370
  const attributes: Record<string, number> = {};
@@ -3313,6 +3375,15 @@ export class Paragraph {
3313
3375
  } else if (ind.firstLine !== undefined) {
3314
3376
  attributes['w:firstLine'] = ind.firstLine;
3315
3377
  }
3378
+ if (ind.leftChars !== undefined) attributes['w:leftChars'] = ind.leftChars;
3379
+ if (ind.rightChars !== undefined) attributes['w:rightChars'] = ind.rightChars;
3380
+ // Same mutual-exclusive treatment: hangingChars wins over firstLineChars
3381
+ // when both are set, mirroring the twips behaviour above.
3382
+ if (ind.hangingChars !== undefined) {
3383
+ attributes['w:hangingChars'] = ind.hangingChars;
3384
+ } else if (ind.firstLineChars !== undefined) {
3385
+ attributes['w:firstLineChars'] = ind.firstLineChars;
3386
+ }
3316
3387
  if (Object.keys(attributes).length > 0) {
3317
3388
  pPrChildren.push(XMLBuilder.wSelf('ind', attributes));
3318
3389
  }
@@ -3397,30 +3468,29 @@ export class Paragraph {
3397
3468
  }
3398
3469
 
3399
3470
  // 19. Paragraph mark run properties per ECMA-376 Part 1 §17.3.1.29
3400
- // Per CT_PPr, w:rPr comes after all CT_PPrBase elements and before w:sectPr/w:pPrChange
3471
+ // Per CT_PPr, w:rPr comes after all CT_PPrBase elements and before w:sectPr/w:pPrChange.
3472
+ //
3473
+ // CT_ParaRPr content model (ECMA-376 Part 1, Annex A / wml.xsd):
3474
+ // <xsd:sequence>
3475
+ // <xsd:group ref="EG_ParaRPrTrackChanges" minOccurs="0"/> <!-- ins, del, moveFrom, moveTo -->
3476
+ // <xsd:group ref="EG_RPrBase" minOccurs="0" maxOccurs="unbounded"/> <!-- rStyle, rFonts, b, bCs, i, ... -->
3477
+ // <xsd:element name="rPrChange" type="CT_ParaRPrChange" minOccurs="0"/>
3478
+ // </xsd:sequence>
3479
+ //
3480
+ // The track-change markers (w:ins / w:del) must precede the EG_RPrBase
3481
+ // run-property children. Earlier revisions of this code emitted run
3482
+ // properties first and then ins/del, which is a schema violation — strict
3483
+ // validators reject the inverted order, and tracked-change-aware tools
3484
+ // may misinterpret the revision state of the paragraph mark.
3401
3485
  if (
3402
3486
  this.formatting.paragraphMarkRunProperties ||
3403
3487
  this.formatting.paragraphMarkDeletion ||
3404
- this.formatting.paragraphMarkInsertion
3488
+ this.formatting.paragraphMarkInsertion ||
3489
+ this.formatting.paragraphMarkRunPropertiesChange
3405
3490
  ) {
3406
3491
  const rPrChildren: XMLElement[] = [];
3407
3492
 
3408
- // Add run properties for the paragraph mark if they exist
3409
- if (this.formatting.paragraphMarkRunProperties) {
3410
- const rPr = Run.generateRunPropertiesXML(this.formatting.paragraphMarkRunProperties);
3411
- if (rPr?.children) {
3412
- // Filter to only XMLElement types (children can be XMLElement or string)
3413
- for (const child of rPr.children) {
3414
- if (typeof child !== 'string') {
3415
- rPrChildren.push(child);
3416
- }
3417
- }
3418
- }
3419
- }
3420
-
3421
- // Per CT_ParaRPr schema, w:ins precedes w:del in the sequence
3422
- // Add insertion marker if the paragraph mark is inserted (w:ins)
3423
- // Per ECMA-376 Part 1 §17.13.5.18 - tracks insertion of paragraph mark
3493
+ // EG_ParaRPrTrackChanges (ins del moveFrom moveTo) FIRST per CT_ParaRPr.
3424
3494
  if (this.formatting.paragraphMarkInsertion) {
3425
3495
  const ins = this.formatting.paragraphMarkInsertion;
3426
3496
  rPrChildren.push(
@@ -3432,8 +3502,6 @@ export class Paragraph {
3432
3502
  );
3433
3503
  }
3434
3504
 
3435
- // Add deletion marker if the paragraph mark is deleted (w:del)
3436
- // Per ECMA-376 Part 1 §17.13.5.14 - tracks deletion of paragraph mark
3437
3505
  if (this.formatting.paragraphMarkDeletion) {
3438
3506
  const del = this.formatting.paragraphMarkDeletion;
3439
3507
  rPrChildren.push(
@@ -3445,6 +3513,44 @@ export class Paragraph {
3445
3513
  );
3446
3514
  }
3447
3515
 
3516
+ // EG_RPrBase run properties — AFTER the track-change markers.
3517
+ if (this.formatting.paragraphMarkRunProperties) {
3518
+ const rPr = Run.generateRunPropertiesXML(this.formatting.paragraphMarkRunProperties);
3519
+ if (rPr?.children) {
3520
+ // Filter to only XMLElement types (children can be XMLElement or string)
3521
+ for (const child of rPr.children) {
3522
+ if (typeof child !== 'string') {
3523
+ rPrChildren.push(child);
3524
+ }
3525
+ }
3526
+ }
3527
+ }
3528
+
3529
+ // <w:rPrChange> (CT_ParaRPrChange, §17.3.1.30) — LAST per CT_ParaRPr.
3530
+ // Contains a single <w:rPr> child with the previous run properties of
3531
+ // the paragraph mark. Reuses Run.generateRunPropertiesXML for full
3532
+ // CT_RPr coverage in the previous-properties block.
3533
+ const paraRPrChange = this.formatting.paragraphMarkRunPropertiesChange;
3534
+ if (paraRPrChange) {
3535
+ const prevRPr = Run.generateRunPropertiesXML(
3536
+ paraRPrChange.previousProperties as RunFormatting
3537
+ );
3538
+ const prevRPrElement: XMLElement = prevRPr ?? {
3539
+ name: 'w:rPr',
3540
+ attributes: {},
3541
+ children: [],
3542
+ };
3543
+ rPrChildren.push({
3544
+ name: 'w:rPrChange',
3545
+ attributes: {
3546
+ 'w:id': paraRPrChange.id.toString(),
3547
+ 'w:author': paraRPrChange.author,
3548
+ 'w:date': formatDateForXml(paraRPrChange.date),
3549
+ },
3550
+ children: [prevRPrElement],
3551
+ });
3552
+ }
3553
+
3448
3554
  // Add w:rPr element if there are any run properties
3449
3555
  if (rPrChildren.length > 0) {
3450
3556
  pPrChildren.push(XMLBuilder.w('rPr', undefined, rPrChildren));
@@ -3583,28 +3689,37 @@ export class Paragraph {
3583
3689
  );
3584
3690
  }
3585
3691
 
3586
- // 7. suppressLineNumbers
3692
+ // 7. suppressLineNumbers — CT_OnOff. Emit w:val="0" for explicit false so the
3693
+ // tracked "previous" value round-trips losslessly (see main generator line ~3154).
3587
3694
  if (prev.suppressLineNumbers !== undefined) {
3588
- if (prev.suppressLineNumbers) {
3589
- prevPPrChildren.push(XMLBuilder.wSelf('suppressLineNumbers'));
3590
- }
3695
+ prevPPrChildren.push(
3696
+ XMLBuilder.wSelf('suppressLineNumbers', {
3697
+ 'w:val': prev.suppressLineNumbers ? '1' : '0',
3698
+ })
3699
+ );
3591
3700
  }
3592
3701
 
3593
- // 8. pBdr (paragraph borders)
3702
+ // 8. pBdr (paragraph borders) — CT_Border §17.18.2 requires w:val.
3703
+ // Default to "nil" when style undefined so pPrChange's previous
3704
+ // border set round-trips through strict validation. Full CT_Border
3705
+ // attribute set (themeColor/themeTint/themeShade/shadow/frame) is
3706
+ // preserved so Word's themed borders survive tracked-change history.
3594
3707
  if (prev.borders) {
3595
3708
  const borderChildren: XMLElement[] = [];
3596
3709
  const borderSides = ['top', 'left', 'bottom', 'right', 'between', 'bar'] as const;
3597
3710
  for (const side of borderSides) {
3598
3711
  const border = prev.borders[side];
3599
3712
  if (border) {
3600
- const attrs: Record<string, string> = {};
3601
- if (border.style) attrs['w:val'] = border.style;
3713
+ const attrs: Record<string, string> = { 'w:val': border.style ?? 'nil' };
3602
3714
  if (border.size !== undefined) attrs['w:sz'] = border.size.toString();
3603
3715
  if (border.color) attrs['w:color'] = border.color;
3604
3716
  if (border.space !== undefined) attrs['w:space'] = border.space.toString();
3605
- if (Object.keys(attrs).length > 0) {
3606
- borderChildren.push(XMLBuilder.wSelf(side, attrs));
3607
- }
3717
+ if (border.themeColor) attrs['w:themeColor'] = border.themeColor;
3718
+ if (border.themeTint) attrs['w:themeTint'] = border.themeTint;
3719
+ if (border.themeShade) attrs['w:themeShade'] = border.themeShade;
3720
+ if (border.shadow !== undefined) attrs['w:shadow'] = border.shadow ? '1' : '0';
3721
+ if (border.frame !== undefined) attrs['w:frame'] = border.frame ? '1' : '0';
3722
+ borderChildren.push(XMLBuilder.wSelf(side, attrs));
3608
3723
  }
3609
3724
  }
3610
3725
  if (borderChildren.length > 0) {
@@ -3620,24 +3735,28 @@ export class Paragraph {
3620
3735
  }
3621
3736
  }
3622
3737
 
3623
- // 10. tabs
3738
+ // 10. tabs — CT_TabStop §17.3.1.37 requires w:val AND w:pos. Default
3739
+ // w:val to "left" when pPrChange's previous state didn't record one.
3624
3740
  if (prev.tabs && prev.tabs.length > 0) {
3625
3741
  const tabChildren: XMLElement[] = prev.tabs.map((tab) => {
3626
3742
  const tabAttrs: Record<string, string> = {
3743
+ 'w:val': tab.val ?? 'left',
3627
3744
  'w:pos': tab.position.toString(),
3628
3745
  };
3629
- if (tab.val) tabAttrs['w:val'] = tab.val;
3630
3746
  if (tab.leader) tabAttrs['w:leader'] = tab.leader;
3631
3747
  return XMLBuilder.wSelf('tab', tabAttrs);
3632
3748
  });
3633
3749
  prevPPrChildren.push(XMLBuilder.w('tabs', undefined, tabChildren));
3634
3750
  }
3635
3751
 
3636
- // 11. suppressAutoHyphens
3752
+ // 11. suppressAutoHyphens — CT_OnOff. Emit w:val="0" for explicit false so the
3753
+ // tracked "previous" value round-trips losslessly (see main generator line ~3231).
3637
3754
  if (prev.suppressAutoHyphens !== undefined) {
3638
- if (prev.suppressAutoHyphens) {
3639
- prevPPrChildren.push(XMLBuilder.wSelf('suppressAutoHyphens', { 'w:val': '1' }));
3640
- }
3755
+ prevPPrChildren.push(
3756
+ XMLBuilder.wSelf('suppressAutoHyphens', {
3757
+ 'w:val': prev.suppressAutoHyphens ? '1' : '0',
3758
+ })
3759
+ );
3641
3760
  }
3642
3761
 
3643
3762
  // 12. CJK paragraph properties
@@ -3707,17 +3826,31 @@ export class Paragraph {
3707
3826
  }
3708
3827
  }
3709
3828
 
3710
- // 15. ind (indentation)
3829
+ // 15. ind (indentation + CJK character-unit variants per ECMA-376 §17.3.1.12)
3830
+ // hanging / firstLine are conceptually mutually exclusive (opposite-
3831
+ // direction first-line indents). Mirror the direct paragraph generator's
3832
+ // precedence: hanging wins when both are set. Previously this path emitted
3833
+ // BOTH attributes, producing ambiguous tracked-change history that Word
3834
+ // renders inconsistently across versions.
3711
3835
  if (prev.indentation) {
3712
3836
  const indAttrs: Record<string, string> = {};
3713
- if (prev.indentation.left !== undefined)
3714
- indAttrs['w:left'] = prev.indentation.left.toString();
3715
- if (prev.indentation.right !== undefined)
3716
- indAttrs['w:right'] = prev.indentation.right.toString();
3717
- if (prev.indentation.firstLine !== undefined)
3718
- indAttrs['w:firstLine'] = prev.indentation.firstLine.toString();
3719
- if (prev.indentation.hanging !== undefined)
3720
- indAttrs['w:hanging'] = prev.indentation.hanging.toString();
3837
+ const indentation = prev.indentation as Record<string, number | undefined>;
3838
+ if (indentation.left !== undefined) indAttrs['w:left'] = indentation.left.toString();
3839
+ if (indentation.right !== undefined) indAttrs['w:right'] = indentation.right.toString();
3840
+ if (indentation.hanging !== undefined) {
3841
+ indAttrs['w:hanging'] = indentation.hanging.toString();
3842
+ } else if (indentation.firstLine !== undefined) {
3843
+ indAttrs['w:firstLine'] = indentation.firstLine.toString();
3844
+ }
3845
+ if (indentation.leftChars !== undefined)
3846
+ indAttrs['w:leftChars'] = indentation.leftChars.toString();
3847
+ if (indentation.rightChars !== undefined)
3848
+ indAttrs['w:rightChars'] = indentation.rightChars.toString();
3849
+ if (indentation.hangingChars !== undefined) {
3850
+ indAttrs['w:hangingChars'] = indentation.hangingChars.toString();
3851
+ } else if (indentation.firstLineChars !== undefined) {
3852
+ indAttrs['w:firstLineChars'] = indentation.firstLineChars.toString();
3853
+ }
3721
3854
  prevPPrChildren.push(XMLBuilder.wSelf('ind', indAttrs));
3722
3855
  }
3723
3856
 
@@ -5313,7 +5446,7 @@ export class Paragraph {
5313
5446
  const paraValue = this.formatting[propKey];
5314
5447
  const styleValue = styleParagraphFormatting[propKey];
5315
5448
 
5316
- if (JSON.stringify(paraValue) !== JSON.stringify(styleValue)) {
5449
+ if (!deepEqual(paraValue, styleValue)) {
5317
5450
  conflictingParaProps.push(propKey);
5318
5451
  }
5319
5452
  } else {
@@ -7,7 +7,7 @@
7
7
  * Examples: w:proofErr, w:permStart, w:permEnd, w:altChunk, w:ruby
8
8
  */
9
9
 
10
- import { XMLElement } from '../xml/XMLBuilder';
10
+ import { XMLElement } from '../xml/XMLBuilder.js';
11
11
 
12
12
  /**
13
13
  * Element context where it can appear
@@ -15,8 +15,8 @@
15
15
  * @module PropertyChangeTypes
16
16
  */
17
17
 
18
- import type { RunFormatting } from './Run';
19
- import type { ShadingConfig } from './CommonTypes';
18
+ import type { RunFormatting } from './Run.js';
19
+ import type { ShadingConfig } from './CommonTypes.js';
20
20
 
21
21
  /**
22
22
  * Common base for all property change types