docxmlater 10.4.0 → 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 +75 -67
  6. package/dist/core/Document.d.ts.map +1 -1
  7. package/dist/core/Document.js +618 -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 +2100 -1076
  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 +478 -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 +2235 -620
  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
@@ -14,14 +14,18 @@
14
14
  * @see https://learn.microsoft.com/en-us/previous-versions/office/developer/office-2007/ee836138(v=office.12)
15
15
  */
16
16
 
17
- import type { Document } from '../core/Document';
18
- import { Paragraph } from '../elements/Paragraph';
19
- import type { ParagraphContent } from '../elements/Paragraph';
20
- import { Revision, RevisionType } from '../elements/Revision';
21
- import { isRunContent, isHyperlinkContent, isImageRunContent } from '../elements/RevisionContent';
22
- import { ComplexField } from '../elements/Field';
23
- import { Table } from '../elements/Table';
24
- import { getGlobalLogger, createScopedLogger, ILogger } from './logger';
17
+ import type { Document } from '../core/Document.js';
18
+ import { Paragraph } from '../elements/Paragraph.js';
19
+ import type { ParagraphContent } from '../elements/Paragraph.js';
20
+ import { Revision, RevisionType } from '../elements/Revision.js';
21
+ import {
22
+ isRunContent,
23
+ isHyperlinkContent,
24
+ isImageRunContent,
25
+ } from '../elements/RevisionContent.js';
26
+ import { ComplexField } from '../elements/Field.js';
27
+ import { Table } from '../elements/Table.js';
28
+ import { getGlobalLogger, createScopedLogger, ILogger } from '../utils/logger.js';
25
29
 
26
30
  /**
27
31
  * Get scoped logger for this module
@@ -240,6 +244,31 @@ export function acceptRevisionsInMemory(
240
244
  result.propertyChangesAccepted++;
241
245
  }
242
246
 
247
+ // Row-level tracked ins / del (CT_TrPr: w:ins / w:del per ECMA-376
248
+ // §17.13.5.19 / §17.13.5.14) — these mark the ENTIRE row as a tracked
249
+ // insertion or deletion. Previously the acceptor only cleared the
250
+ // tcPrChange / trPrChange / cellRevision metadata and silently ignored
251
+ // row-level markers, so deleted rows persisted and inserted rows kept
252
+ // their pending state. Collect deletion indices up front so we can
253
+ // splice them out after iteration (reverse order to keep indices stable).
254
+ const rowsToRemove: number[] = [];
255
+ const allRows = table.getRows();
256
+ for (let rowIdx = 0; rowIdx < allRows.length; rowIdx++) {
257
+ const row = allRows[rowIdx]!;
258
+ const fmt = row.getFormatting();
259
+ if (fmt.rowInsertion && opts.acceptInsertions) {
260
+ row.setRowInsertion(undefined);
261
+ result.insertionsAccepted++;
262
+ }
263
+ if (fmt.rowDeletion && opts.acceptDeletions) {
264
+ rowsToRemove.push(rowIdx);
265
+ result.deletionsAccepted++;
266
+ }
267
+ }
268
+ for (let i = rowsToRemove.length - 1; i >= 0; i--) {
269
+ table._removeRowAtIndex(rowsToRemove[i]!);
270
+ }
271
+
243
272
  for (const row of table.getRows()) {
244
273
  // Clear trPrChange on row
245
274
  if (opts.acceptPropertyChanges && row.getTrPrChange()) {
@@ -254,10 +283,28 @@ export function acceptRevisionsInMemory(
254
283
  result.propertyChangesAccepted++;
255
284
  }
256
285
 
257
- // Clear cell structural revision markers (cellIns/cellDel/cellMerge)
258
- if (opts.acceptPropertyChanges && cell.getCellRevision()) {
259
- cell.clearCellRevision();
260
- result.propertyChangesAccepted++;
286
+ // Route cellIns / cellDel / cellMerge by their semantic revision type
287
+ // (per ECMA-376 §17.13.5.4-6). Previously all three were lumped under
288
+ // `acceptPropertyChanges`, which meant `{ acceptInsertions: true }`
289
+ // alone never cleared a cellIns marker, and `{ acceptPropertyChanges:
290
+ // true }` alone cleared everything including insertions. Correct
291
+ // mapping:
292
+ // - tableCellInsert (w:cellIns) → acceptInsertions
293
+ // - tableCellDelete (w:cellDel) → acceptDeletions
294
+ // - tableCellMerge (w:cellMerge) → acceptPropertyChanges
295
+ const cellRev = cell.getCellRevision();
296
+ if (cellRev) {
297
+ const revType = cellRev.getType();
298
+ if (revType === 'tableCellInsert' && opts.acceptInsertions) {
299
+ cell.clearCellRevision();
300
+ result.insertionsAccepted++;
301
+ } else if (revType === 'tableCellDelete' && opts.acceptDeletions) {
302
+ cell.clearCellRevision();
303
+ result.deletionsAccepted++;
304
+ } else if (revType === 'tableCellMerge' && opts.acceptPropertyChanges) {
305
+ cell.clearCellRevision();
306
+ result.propertyChangesAccepted++;
307
+ }
261
308
  }
262
309
 
263
310
  // Process paragraphs in the cell
@@ -385,6 +432,40 @@ export function acceptRevisionsInMemory(
385
432
  }
386
433
  }
387
434
 
435
+ // Walk footnote and endnote paragraphs. Per ECMA-376 §17.11.4 /
436
+ // §17.11.15, notes can hold any block-level content including
437
+ // tracked changes; programmatically-added Revision objects on note
438
+ // paragraphs (e.g.
439
+ // `footnote.getParagraphs()[0].addContent(new Revision(...))`)
440
+ // were never visited by the in-memory acceptor and stayed in the
441
+ // model after `acceptAllRevisions()`. The raw-XML acceptor
442
+ // (iter 135) already handles existing-document note revisions on
443
+ // load, so this loop's job is the programmatic-API path.
444
+ const footnoteManager = doc.getFootnoteManager?.();
445
+ if (footnoteManager) {
446
+ for (const fn of footnoteManager.getAllFootnotes()) {
447
+ for (const paragraph of fn.getParagraphs()) {
448
+ const paragraphResult = acceptRevisionsInParagraph(paragraph, opts);
449
+ result.insertionsAccepted += paragraphResult.insertionsAccepted;
450
+ result.deletionsAccepted += paragraphResult.deletionsAccepted;
451
+ result.movesAccepted += paragraphResult.movesAccepted;
452
+ result.propertyChangesAccepted += paragraphResult.propertyChangesAccepted;
453
+ }
454
+ }
455
+ }
456
+ const endnoteManager = doc.getEndnoteManager?.();
457
+ if (endnoteManager) {
458
+ for (const en of endnoteManager.getAllEndnotes()) {
459
+ for (const paragraph of en.getParagraphs()) {
460
+ const paragraphResult = acceptRevisionsInParagraph(paragraph, opts);
461
+ result.insertionsAccepted += paragraphResult.insertionsAccepted;
462
+ result.deletionsAccepted += paragraphResult.deletionsAccepted;
463
+ result.movesAccepted += paragraphResult.movesAccepted;
464
+ result.propertyChangesAccepted += paragraphResult.propertyChangesAccepted;
465
+ }
466
+ }
467
+ }
468
+
388
469
  // Clear sectPrChange on document section
389
470
  if (opts.acceptPropertyChanges) {
390
471
  const section = doc.getSection();
@@ -581,6 +662,13 @@ function acceptRevisionsInParagraph(
581
662
  paragraph.clearParagraphPropertiesChange();
582
663
  result.propertyChangesAccepted++;
583
664
  }
665
+ // Paragraph-mark rPrChange (CT_ParaRPrChange, §17.3.1.30) — same
666
+ // rationale as pPrChange: acceptance clears the "previous" snapshot,
667
+ // current formatting (paragraphMarkRunProperties) stays intact.
668
+ if (formatting.paragraphMarkRunPropertiesChange) {
669
+ paragraph.formatting.paragraphMarkRunPropertiesChange = undefined;
670
+ result.propertyChangesAccepted++;
671
+ }
584
672
  }
585
673
 
586
674
  // Clear paragraph mark deletion tracking if accepting deletions
@@ -33,9 +33,9 @@
33
33
  * ```
34
34
  */
35
35
 
36
- import { Revision } from '../elements/Revision';
37
- import { RangeMarker } from '../elements/RangeMarker';
38
- import { Run } from '../elements/Run';
36
+ import { Revision } from '../elements/Revision.js';
37
+ import { RangeMarker } from '../elements/RangeMarker.js';
38
+ import { Run } from '../elements/Run.js';
39
39
 
40
40
  /**
41
41
  * Options for creating a move operation
@@ -203,8 +203,8 @@ export class MoveOperationHelper {
203
203
  * ```
204
204
  */
205
205
  static addMoveOperation(
206
- sourceParagraph: import('../elements/Paragraph').Paragraph,
207
- destParagraph: import('../elements/Paragraph').Paragraph,
206
+ sourceParagraph: import('../elements/Paragraph.js').Paragraph,
207
+ destParagraph: import('../elements/Paragraph.js').Paragraph,
208
208
  options: MoveOperationOptions
209
209
  ): MoveOperationResult {
210
210
  const moveOp = this.createMoveOperation(options);
@@ -11,9 +11,9 @@
11
11
  * @module RevisionAwareProcessor
12
12
  */
13
13
 
14
- import type { Document } from '../core/Document';
15
- import { Revision, RevisionType } from '../elements/Revision';
16
- import { ChangeCategory, ChangeLocation } from './ChangelogGenerator';
14
+ import type { Document } from '../core/Document.js';
15
+ import { Revision, RevisionType } from '../elements/Revision.js';
16
+ import { ChangeCategory, ChangeLocation } from './ChangelogGenerator.js';
17
17
 
18
18
  /**
19
19
  * Revision handling modes for document processing.
@@ -8,7 +8,7 @@
8
8
  * @module RevisionWalker
9
9
  */
10
10
 
11
- import { ParsedXMLObject } from '../xml/XMLParser';
11
+ import { ParsedXMLObject } from '../xml/XMLParser.js';
12
12
 
13
13
  /**
14
14
  * Options for controlling which revision types to accept
@@ -143,6 +143,16 @@ export class RevisionWalker {
143
143
  return;
144
144
  }
145
145
 
146
+ // Pre-recursion: row-level tracked deletions (CT_TrPr > w:del per
147
+ // §17.13.5.14). Must run BEFORE the depth-first recursion — otherwise
148
+ // processRevisions in trPr would strip the w:del marker before we can
149
+ // detect it at the table level. The default `w:del` removal in
150
+ // processRevisions only strips the marker itself, leaving a zombie
151
+ // empty row; per spec, accepting the deletion removes the entire row.
152
+ if (options.acceptDeletions && obj['w:tr']) {
153
+ RevisionWalker.filterDeletedRows(obj);
154
+ }
155
+
146
156
  // Get keys to process (excluding metadata keys)
147
157
  const keys = Object.keys(obj).filter(
148
158
  (k) => !k.startsWith('@_') && k !== '#text' && k !== '_orderedChildren'
@@ -165,6 +175,37 @@ export class RevisionWalker {
165
175
  RevisionWalker.processRevisions(obj, options);
166
176
  }
167
177
 
178
+ /**
179
+ * Remove `<w:tr>` entries whose `<w:trPr>` contains a self-closing
180
+ * `<w:del/>` row-level deletion marker. Operates on the parsed-object
181
+ * representation (arrays when multiple, single object otherwise).
182
+ */
183
+ private static filterDeletedRows(tbl: any): void {
184
+ const rows = tbl['w:tr'];
185
+ const isRowDeleted = (row: any): boolean => {
186
+ if (!row || typeof row !== 'object') return false;
187
+ const trPr = row['w:trPr'];
188
+ if (!trPr || typeof trPr !== 'object') return false;
189
+ // w:del at row level is a CT_TrackChange (no children). When absent
190
+ // the parser leaves no key; when present it's a self-closing tag
191
+ // parsed as an object with only @_w:id/@_w:author/@_w:date keys.
192
+ return !!trPr['w:del'];
193
+ };
194
+
195
+ if (Array.isArray(rows)) {
196
+ const kept = rows.filter((r) => !isRowDeleted(r));
197
+ if (kept.length !== rows.length) {
198
+ if (kept.length === 0) {
199
+ delete tbl['w:tr'];
200
+ } else {
201
+ tbl['w:tr'] = kept;
202
+ }
203
+ }
204
+ } else if (isRowDeleted(rows)) {
205
+ delete tbl['w:tr'];
206
+ }
207
+ }
208
+
168
209
  /**
169
210
  * Process revision elements at the current level
170
211
  */
@@ -12,13 +12,13 @@
12
12
  * @see https://github.com/OfficeDev/Open-Xml-PowerTools - RevisionAccepter.cs
13
13
  */
14
14
 
15
- import type { Document } from '../core/Document';
16
- import type { Paragraph, ParagraphContent } from '../elements/Paragraph';
17
- import { Revision, RevisionType } from '../elements/Revision';
18
- import type { Run } from '../elements/Run';
19
- import { isRunContent, isHyperlinkContent } from '../elements/RevisionContent';
20
- import { ChangeCategory } from './ChangelogGenerator';
21
- import { SelectionCriteria } from './RevisionAwareProcessor';
15
+ import type { Document } from '../core/Document.js';
16
+ import type { Paragraph, ParagraphContent } from '../elements/Paragraph.js';
17
+ import { Revision, RevisionType } from '../elements/Revision.js';
18
+ import type { Run } from '../elements/Run.js';
19
+ import { isRunContent, isHyperlinkContent } from '../elements/RevisionContent.js';
20
+ import { ChangeCategory } from './ChangelogGenerator.js';
21
+ import { SelectionCriteria } from './RevisionAwareProcessor.js';
22
22
 
23
23
  /**
24
24
  * Result of selective revision acceptance.
@@ -62,23 +62,9 @@ export class SelectiveRevisionAcceptor {
62
62
  const hasFullApi = typeof (doc as any).getAllParagraphs === 'function';
63
63
 
64
64
  if (hasFullApi) {
65
- // Full in-memory DOM transformation
66
- const paragraphs = (doc as any).getAllParagraphs();
67
- for (const paragraph of paragraphs) {
65
+ this.walkAllParagraphs(doc, (paragraph) => {
68
66
  this.processSelectiveParagraph(paragraph, criteria, 'accept', accepted, remaining);
69
- }
70
-
71
- // Process paragraphs in tables
72
- const tables = (doc as any).getTables();
73
- for (const table of tables) {
74
- for (const row of table.getRows()) {
75
- for (const cell of row.getCells()) {
76
- for (const paragraph of cell.getParagraphs()) {
77
- this.processSelectiveParagraph(paragraph, criteria, 'accept', accepted, remaining);
78
- }
79
- }
80
- }
81
- }
67
+ });
82
68
  } else {
83
69
  // Fallback: Filter revisions from RevisionManager only (for backward compatibility)
84
70
  const revisionManager = doc.getRevisionManager();
@@ -136,23 +122,9 @@ export class SelectiveRevisionAcceptor {
136
122
  const hasFullApi = typeof (doc as any).getAllParagraphs === 'function';
137
123
 
138
124
  if (hasFullApi) {
139
- // Full in-memory DOM transformation
140
- const paragraphs = (doc as any).getAllParagraphs();
141
- for (const paragraph of paragraphs) {
125
+ this.walkAllParagraphs(doc, (paragraph) => {
142
126
  this.processSelectiveParagraph(paragraph, criteria, 'reject', rejected, remaining);
143
- }
144
-
145
- // Process paragraphs in tables
146
- const tables = (doc as any).getTables();
147
- for (const table of tables) {
148
- for (const row of table.getRows()) {
149
- for (const cell of row.getCells()) {
150
- for (const paragraph of cell.getParagraphs()) {
151
- this.processSelectiveParagraph(paragraph, criteria, 'reject', rejected, remaining);
152
- }
153
- }
154
- }
155
- }
127
+ });
156
128
  } else {
157
129
  // Fallback: Filter revisions from RevisionManager only (for backward compatibility)
158
130
  const revisionManager = doc.getRevisionManager();
@@ -189,6 +161,93 @@ export class SelectiveRevisionAcceptor {
189
161
  };
190
162
  }
191
163
 
164
+ /**
165
+ * Walk every paragraph that can carry tracked-change content per
166
+ * ECMA-376: body, tables (recursively), headers, footers, footnotes,
167
+ * and endnotes. Mirrors the in-memory acceptor traversal so
168
+ * selective accept / reject covers the same surface as
169
+ * `acceptRevisionsInMemory`. Comments are deliberately excluded —
170
+ * `Comment` stores `Run[]` rather than `Paragraph[]`, so revisions
171
+ * are never represented in the in-memory model and must be cleaned
172
+ * via the raw-XML path on load.
173
+ */
174
+ private static walkAllParagraphs(
175
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
176
+ doc: any,
177
+ visit: (paragraph: Paragraph) => void
178
+ ): void {
179
+ // Body paragraphs
180
+ for (const paragraph of doc.getAllParagraphs()) {
181
+ visit(paragraph);
182
+ }
183
+
184
+ // Tables (body-level)
185
+ for (const table of doc.getTables()) {
186
+ for (const row of table.getRows()) {
187
+ for (const cell of row.getCells()) {
188
+ for (const paragraph of cell.getParagraphs()) {
189
+ visit(paragraph);
190
+ }
191
+ }
192
+ }
193
+ }
194
+
195
+ // Headers and footers
196
+ const hfManager = doc.getHeaderFooterManager?.();
197
+ if (hfManager) {
198
+ for (const headerEntry of hfManager.getAllHeaders()) {
199
+ for (const element of headerEntry.header.getElements()) {
200
+ if (typeof element.getContent === 'function' && typeof element.getRuns === 'function') {
201
+ // Paragraph
202
+ visit(element);
203
+ } else if (typeof element.getRows === 'function') {
204
+ // Table
205
+ for (const row of element.getRows()) {
206
+ for (const cell of row.getCells()) {
207
+ for (const paragraph of cell.getParagraphs()) {
208
+ visit(paragraph);
209
+ }
210
+ }
211
+ }
212
+ }
213
+ }
214
+ }
215
+ for (const footerEntry of hfManager.getAllFooters()) {
216
+ for (const element of footerEntry.footer.getElements()) {
217
+ if (typeof element.getContent === 'function' && typeof element.getRuns === 'function') {
218
+ visit(element);
219
+ } else if (typeof element.getRows === 'function') {
220
+ for (const row of element.getRows()) {
221
+ for (const cell of row.getCells()) {
222
+ for (const paragraph of cell.getParagraphs()) {
223
+ visit(paragraph);
224
+ }
225
+ }
226
+ }
227
+ }
228
+ }
229
+ }
230
+ }
231
+
232
+ // Footnotes and endnotes
233
+ const footnoteManager = doc.getFootnoteManager?.();
234
+ if (footnoteManager) {
235
+ for (const fn of footnoteManager.getAllFootnotes()) {
236
+ for (const paragraph of fn.getParagraphs()) {
237
+ visit(paragraph);
238
+ }
239
+ }
240
+ }
241
+ const endnoteManager = doc.getEndnoteManager?.();
242
+ if (endnoteManager) {
243
+ for (const en of endnoteManager.getAllEndnotes()) {
244
+ for (const paragraph of en.getParagraphs()) {
245
+ visit(paragraph);
246
+ }
247
+ }
248
+ }
249
+ }
250
+
192
251
  /**
193
252
  * Process a paragraph for selective revision acceptance/rejection.
194
253
  * Transforms matching revisions in-place using DOM transformation.
@@ -13,11 +13,11 @@
13
13
  * - fill: "auto" = inherit (continue resolution)
14
14
  */
15
15
 
16
- import type { ShadingConfig } from '../elements/CommonTypes';
17
- import type { Table } from '../elements/Table';
18
- import type { TableCell } from '../elements/TableCell';
19
- import type { StylesManager } from '../formatting/StylesManager';
20
- import { getActiveConditionalsInPriorityOrder } from './cnfStyleDecoder';
16
+ import type { ShadingConfig } from '../elements/CommonTypes.js';
17
+ import type { Table } from '../elements/Table.js';
18
+ import type { TableCell } from '../elements/TableCell.js';
19
+ import type { StylesManager } from '../formatting/StylesManager.js';
20
+ import { getActiveConditionalsInPriorityOrder } from './cnfStyleDecoder.js';
21
21
 
22
22
  /**
23
23
  * Resolves the effective shading for a table cell through the style hierarchy.
@@ -1,6 +1,15 @@
1
- import { ZipHandler } from '../zip/ZipHandler';
2
- import { XMLParser } from '../xml/XMLParser';
3
- import { RevisionWalker } from './RevisionWalker';
1
+ import { ZipHandler } from '../zip/ZipHandler.js';
2
+ import { XMLParser } from '../xml/XMLParser.js';
3
+ import { RevisionWalker } from './RevisionWalker.js';
4
+
5
+ /**
6
+ * Markers covered: w:ins, w:del, w:moveFrom, w:moveTo,
7
+ * w:rPrChange, w:pPrChange, w:tblPrChange, w:tblPrExChange,
8
+ * w:trPrChange, w:tcPrChange, w:sectPrChange, w:numberingChange,
9
+ * w:cellIns, w:cellDel, w:cellMerge, and any *RangeStart/End markers.
10
+ */
11
+ const REVISION_MARKER_PATTERN =
12
+ /<w:(?:ins|del|moveFrom|moveTo|rPrChange|pPrChange|tblPrChange|tblPrExChange|trPrChange|tcPrChange|sectPrChange|numberingChange|cellIns|cellDel|cellMerge|moveFromRangeStart|moveFromRangeEnd|moveToRangeStart|moveToRangeEnd|customXmlInsRangeStart|customXmlInsRangeEnd|customXmlDelRangeStart|customXmlDelRangeEnd|customXmlMoveFromRangeStart|customXmlMoveFromRangeEnd|customXmlMoveToRangeStart|customXmlMoveToRangeEnd)\b/;
4
13
 
5
14
  /**
6
15
  * Accepts all tracked changes in a Word document per Microsoft's OpenXML SDK pattern
@@ -40,7 +49,14 @@ class RevisionAcceptor {
40
49
  // Process document.xml
41
50
  await this.processDocumentPart('word/document.xml');
42
51
 
43
- // Process headers
52
+ // Process headers / footers / footnotes / endnotes / comments.
53
+ // Footnotes (§17.11.15), endnotes (§17.11.4), and comments (§17.13.4)
54
+ // can all carry block-level content including tracked changes
55
+ // (w:ins / w:del / pPrChange / rPrChange / moveFrom / moveTo).
56
+ // Previously only document.xml + headers + footers were walked,
57
+ // leaving footnote / endnote / comment revisions unaccepted so
58
+ // Word still showed the document as having pending tracked
59
+ // changes after `acceptAllRevisions()` returned.
44
60
  const files = this.zipHandler.getFilePaths();
45
61
  for (const file of files) {
46
62
  if (/^word\/header\d+\.xml$/.exec(file)) {
@@ -50,6 +66,14 @@ class RevisionAcceptor {
50
66
  await this.processDocumentPart(file);
51
67
  }
52
68
  }
69
+ // Singleton notes / comments parts. Check presence explicitly
70
+ // (not all documents have them) — processDocumentPart is a no-op
71
+ // on missing files.
72
+ for (const notesPath of ['word/footnotes.xml', 'word/endnotes.xml', 'word/comments.xml']) {
73
+ if (this.zipHandler.getFileAsString(notesPath)) {
74
+ await this.processDocumentPart(notesPath);
75
+ }
76
+ }
53
77
 
54
78
  // Clean up metadata files
55
79
  this.cleanupPeopleXml();
@@ -61,12 +85,31 @@ class RevisionAcceptor {
61
85
  * Process a document part (document.xml, header, footer) to accept revisions
62
86
  */
63
87
  private async processDocumentPart(partPath: string): Promise<void> {
88
+ // Fast path: parts with no revision markup do not need to be re-serialised.
89
+ // Re-serialising a part destroys the original whitespace / formatting
90
+ // (XMLBuilder emits a different layout than the source), which can break
91
+ // byte-for-byte passthrough preservation in downstream consumers
92
+ // (e.g., comments.xml round-trip with no tracked changes inside).
93
+ const xml = this.zipHandler.getFileAsString(partPath);
94
+ if (!xml || !RevisionAcceptor.containsRevisionMarkup(xml)) {
95
+ return;
96
+ }
97
+
64
98
  if (this.useDomBasedProcessing) {
65
99
  return this.processDocumentPartDOM(partPath);
66
100
  }
67
101
  return this.processDocumentPartRegex(partPath);
68
102
  }
69
103
 
104
+ /**
105
+ * Quick scan for any tracked-change marker. Returns false when the part
106
+ * carries none, allowing the acceptor to skip an unnecessary parse +
107
+ * re-serialise round-trip.
108
+ */
109
+ private static containsRevisionMarkup(xml: string): boolean {
110
+ return REVISION_MARKER_PATTERN.test(xml);
111
+ }
112
+
70
113
  /**
71
114
  * DOM-based implementation of revision acceptance
72
115
  * Uses XMLParser and RevisionWalker for reliable processing
@@ -200,23 +243,48 @@ class RevisionAcceptor {
200
243
  }
201
244
 
202
245
  /**
203
- * Accept deletions - remove the entire <w:del> element including its content
246
+ * Accept deletions - remove the entire <w:del> element including its content.
204
247
  *
205
- * Per Microsoft SDK: "DeletedRun elements should be removed along with their content"
248
+ * Per Microsoft SDK: "DeletedRun elements should be removed along with
249
+ * their content". Additionally, per ECMA-376 Part 1 §17.13.5.14, a
250
+ * self-closing `<w:del/>` inside `<w:trPr>` marks the entire row as a
251
+ * tracked deletion — accepting it must remove the entire `<w:tr>` block,
252
+ * not just the marker. Without that, zombie rows (the row wrapper with
253
+ * empty cells) persist in the document after revision acceptance.
206
254
  */
207
255
  private acceptDeletions(xml: string): string {
208
256
  let result = xml;
209
257
  let previousLength = 0;
210
258
 
211
- // Iterate until no more deletions (handles nested cases)
259
+ // Pass A row-level deletion: remove entire <w:tr> whose <w:trPr>
260
+ // contains a self-closing row-deletion marker. Constraints:
261
+ // - `<w:trPr\b(?:\s[^>]*)?>` only matches the OPEN form of trPr (i.e.
262
+ // rejects self-closing `<w:trPr/>`, which by definition contains
263
+ // no del markers), so the match anchors on the correct row.
264
+ // - negative lookahead `(?!<w:tc\b|<w:tr\b|<\/w:tr>)` between the
265
+ // `<w:tr>` opening and the `<w:trPr>` prevents the match from
266
+ // slipping past a cell boundary or nested-table row and latching
267
+ // onto a later row's trPr-with-del.
268
+ const rowDelPattern =
269
+ /<w:tr\b[^>]*>(?:(?!<w:tc\b|<w:tr\b|<\/w:tr>)[\s\S])*?<w:trPr\b(?:\s[^>]*)?>(?:(?!<\/w:trPr>)[\s\S])*?<w:del\b[^>]*\/>(?:(?!<\/w:trPr>)[\s\S])*?<\/w:trPr>(?:(?!<w:tr\b|<\/w:tr>)[\s\S])*?<\/w:tr>/g;
270
+ previousLength = 0;
212
271
  while (result.length !== previousLength) {
213
272
  previousLength = result.length;
273
+ result = result.replace(rowDelPattern, '');
274
+ }
214
275
 
215
- // Match complete <w:del ...>...</w:del> elements and remove entirely
276
+ // Pass B — wrapper deletions: iterate until no more <w:del>..</w:del>
277
+ // elements (handles nested cases).
278
+ previousLength = 0;
279
+ while (result.length !== previousLength) {
280
+ previousLength = result.length;
216
281
  result = result.replace(/<w:del\b[^>]*>[\s\S]*?<\/w:del>/g, '');
217
282
  }
218
283
 
219
- // Also remove self-closing deletion tags
284
+ // Pass C — remove any remaining self-closing deletion markers (paragraph
285
+ // mark deletions inside pPr/rPr, orphans, etc.). By this point, any
286
+ // row-level markers have already triggered full-row removal in Pass A,
287
+ // so this pass only cleans up non-structural markers.
220
288
  result = result.replace(/<w:del\b[^>]*\/>/g, '');
221
289
 
222
290
  return result;
@@ -6,7 +6,7 @@
6
6
  * representing whether a particular conditional format applies.
7
7
  */
8
8
 
9
- import { ConditionalFormattingType } from '../formatting/Style';
9
+ import { ConditionalFormattingType } from '../formatting/Style.js';
10
10
 
11
11
  /**
12
12
  * Decoded cnfStyle flags
@@ -1,4 +1,4 @@
1
- import { ZipHandler } from '../zip/ZipHandler';
1
+ import { ZipHandler } from '../zip/ZipHandler.js';
2
2
 
3
3
  /**
4
4
  * Strips all tracked changes markup from a Word document
@@ -13,11 +13,33 @@ class TrackedChangesStripper {
13
13
  }
14
14
 
15
15
  /**
16
- * Main method to strip all tracked changes from the document
16
+ * Main method to strip all tracked changes from the document.
17
+ *
18
+ * Per ECMA-376 Part 1, tracked-change markup can appear in any
19
+ * part that carries block-level content: the body (§17.2 w:body),
20
+ * headers / footers (§17.10.3-4 CT_HdrFtr), footnotes (§17.11.15),
21
+ * endnotes (§17.11.4), and comments (§17.13.4). All of these
22
+ * must be walked — stripping document.xml alone would leave
23
+ * tracked changes visible in Word for every header / footer /
24
+ * note / comment revision.
17
25
  */
18
26
  public async stripTrackedChanges(): Promise<void> {
19
- // Strip revision elements from document.xml
20
- await this.stripDocumentRevisions();
27
+ // Always process the body.
28
+ await this.stripPartRevisions('word/document.xml');
29
+
30
+ // Process every header and footer part present in the ZIP.
31
+ for (const file of this.zipHandler.getFilePaths()) {
32
+ if (/^word\/header\d+\.xml$/.exec(file) || /^word\/footer\d+\.xml$/.exec(file)) {
33
+ await this.stripPartRevisions(file);
34
+ }
35
+ }
36
+
37
+ // Process singleton notes / comments parts when present.
38
+ for (const path of ['word/footnotes.xml', 'word/endnotes.xml', 'word/comments.xml']) {
39
+ if (this.zipHandler.getFileAsString(path)) {
40
+ await this.stripPartRevisions(path);
41
+ }
42
+ }
21
43
 
22
44
  // Clean up metadata files
23
45
  await this.cleanupPeopleXml();
@@ -26,15 +48,18 @@ class TrackedChangesStripper {
26
48
  }
27
49
 
28
50
  /**
29
- * Strip ALL revision elements from word/document.xml
51
+ * Strip ALL revision elements from a single document part.
52
+ * The per-step pipeline is identical to the historical
53
+ * document.xml implementation; the only difference is the
54
+ * configurable source path.
30
55
  */
31
- private async stripDocumentRevisions(): Promise<void> {
32
- const documentXml = this.zipHandler.getFileAsString('word/document.xml');
33
- if (!documentXml) {
56
+ private async stripPartRevisions(partPath: string): Promise<void> {
57
+ const xml = this.zipHandler.getFileAsString(partPath);
58
+ if (!xml) {
34
59
  return;
35
60
  }
36
61
 
37
- let content = documentXml;
62
+ let content = xml;
38
63
 
39
64
  // STEP 1: Remove all range markers (boundary markers for tracked changes)
40
65
  content = this.removeRangeMarkers(content);
@@ -56,7 +81,7 @@ class TrackedChangesStripper {
56
81
  content = this.removeSelfClosingRevisionTags(content);
57
82
 
58
83
  // Update the file in the zip
59
- this.zipHandler.updateFile('word/document.xml', content);
84
+ this.zipHandler.updateFile(partPath, content);
60
85
  }
61
86
 
62
87
  /**