docxmlater 11.0.10 → 12.0.1

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 (354) hide show
  1. package/README.md +51 -13
  2. package/dist/core/Document.d.ts +28 -2
  3. package/dist/core/Document.d.ts.map +1 -1
  4. package/dist/core/Document.js +725 -170
  5. package/dist/core/Document.js.map +1 -1
  6. package/dist/core/DocumentGenerator.d.ts +1 -0
  7. package/dist/core/DocumentGenerator.d.ts.map +1 -1
  8. package/dist/core/DocumentGenerator.js +77 -25
  9. package/dist/core/DocumentGenerator.js.map +1 -1
  10. package/dist/core/DocumentParser.d.ts +7 -3
  11. package/dist/core/DocumentParser.d.ts.map +1 -1
  12. package/dist/core/DocumentParser.js +427 -81
  13. package/dist/core/DocumentParser.js.map +1 -1
  14. package/dist/core/RelationshipManager.d.ts.map +1 -1
  15. package/dist/core/RelationshipManager.js +2 -2
  16. package/dist/core/RelationshipManager.js.map +1 -1
  17. package/dist/elements/Comment.d.ts +15 -1
  18. package/dist/elements/Comment.d.ts.map +1 -1
  19. package/dist/elements/Comment.js +67 -12
  20. package/dist/elements/Comment.js.map +1 -1
  21. package/dist/elements/CommentManager.d.ts +4 -0
  22. package/dist/elements/CommentManager.d.ts.map +1 -1
  23. package/dist/elements/CommentManager.js +74 -16
  24. package/dist/elements/CommentManager.js.map +1 -1
  25. package/dist/elements/EndnoteManager.d.ts.map +1 -1
  26. package/dist/elements/EndnoteManager.js.map +1 -1
  27. package/dist/elements/Field.d.ts +10 -1
  28. package/dist/elements/Field.d.ts.map +1 -1
  29. package/dist/elements/Field.js +76 -34
  30. package/dist/elements/Field.js.map +1 -1
  31. package/dist/elements/FieldHelpers.d.ts +1 -0
  32. package/dist/elements/FieldHelpers.d.ts.map +1 -1
  33. package/dist/elements/FieldHelpers.js +8 -4
  34. package/dist/elements/FieldHelpers.js.map +1 -1
  35. package/dist/elements/Footer.d.ts +3 -1
  36. package/dist/elements/Footer.d.ts.map +1 -1
  37. package/dist/elements/Footer.js +39 -53
  38. package/dist/elements/Footer.js.map +1 -1
  39. package/dist/elements/FootnoteManager.d.ts.map +1 -1
  40. package/dist/elements/FootnoteManager.js.map +1 -1
  41. package/dist/elements/Header.d.ts +3 -1
  42. package/dist/elements/Header.d.ts.map +1 -1
  43. package/dist/elements/Header.js +39 -53
  44. package/dist/elements/Header.js.map +1 -1
  45. package/dist/elements/HeaderFooterManager.d.ts +4 -2
  46. package/dist/elements/HeaderFooterManager.d.ts.map +1 -1
  47. package/dist/elements/HeaderFooterManager.js +36 -6
  48. package/dist/elements/HeaderFooterManager.js.map +1 -1
  49. package/dist/elements/Hyperlink.d.ts +6 -1
  50. package/dist/elements/Hyperlink.d.ts.map +1 -1
  51. package/dist/elements/Hyperlink.js +69 -44
  52. package/dist/elements/Hyperlink.js.map +1 -1
  53. package/dist/elements/Image.d.ts.map +1 -1
  54. package/dist/elements/Image.js +33 -6
  55. package/dist/elements/Image.js.map +1 -1
  56. package/dist/elements/ImageManager.d.ts +1 -0
  57. package/dist/elements/ImageManager.d.ts.map +1 -1
  58. package/dist/elements/ImageManager.js +11 -0
  59. package/dist/elements/ImageManager.js.map +1 -1
  60. package/dist/elements/Paragraph.d.ts +3 -0
  61. package/dist/elements/Paragraph.d.ts.map +1 -1
  62. package/dist/elements/Paragraph.js +91 -26
  63. package/dist/elements/Paragraph.js.map +1 -1
  64. package/dist/elements/Revision.d.ts +4 -0
  65. package/dist/elements/Revision.d.ts.map +1 -1
  66. package/dist/elements/Revision.js +369 -29
  67. package/dist/elements/Revision.js.map +1 -1
  68. package/dist/elements/Run.d.ts +1 -0
  69. package/dist/elements/Run.d.ts.map +1 -1
  70. package/dist/elements/Run.js +24 -4
  71. package/dist/elements/Run.js.map +1 -1
  72. package/dist/elements/Section.d.ts.map +1 -1
  73. package/dist/elements/Section.js +17 -7
  74. package/dist/elements/Section.js.map +1 -1
  75. package/dist/elements/Shape.d.ts.map +1 -1
  76. package/dist/elements/Shape.js +50 -42
  77. package/dist/elements/Shape.js.map +1 -1
  78. package/dist/elements/StructuredDocumentTag.d.ts +9 -1
  79. package/dist/elements/StructuredDocumentTag.d.ts.map +1 -1
  80. package/dist/elements/StructuredDocumentTag.js +46 -6
  81. package/dist/elements/StructuredDocumentTag.js.map +1 -1
  82. package/dist/elements/Table.d.ts +2 -0
  83. package/dist/elements/Table.d.ts.map +1 -1
  84. package/dist/elements/Table.js +90 -42
  85. package/dist/elements/Table.js.map +1 -1
  86. package/dist/elements/TableCell.d.ts +1 -0
  87. package/dist/elements/TableCell.d.ts.map +1 -1
  88. package/dist/elements/TableCell.js +32 -13
  89. package/dist/elements/TableCell.js.map +1 -1
  90. package/dist/elements/TableOfContents.d.ts.map +1 -1
  91. package/dist/elements/TableOfContents.js +5 -7
  92. package/dist/elements/TableOfContents.js.map +1 -1
  93. package/dist/elements/TableRow.d.ts +1 -0
  94. package/dist/elements/TableRow.d.ts.map +1 -1
  95. package/dist/elements/TableRow.js +16 -1
  96. package/dist/elements/TableRow.js.map +1 -1
  97. package/dist/elements/TextBox.d.ts.map +1 -1
  98. package/dist/elements/TextBox.js +55 -42
  99. package/dist/elements/TextBox.js.map +1 -1
  100. package/dist/esm/core/Document.js +726 -171
  101. package/dist/esm/core/Document.js.map +1 -1
  102. package/dist/esm/core/DocumentGenerator.js +77 -25
  103. package/dist/esm/core/DocumentGenerator.js.map +1 -1
  104. package/dist/esm/core/DocumentParser.js +427 -81
  105. package/dist/esm/core/DocumentParser.js.map +1 -1
  106. package/dist/esm/core/RelationshipManager.js +2 -2
  107. package/dist/esm/core/RelationshipManager.js.map +1 -1
  108. package/dist/esm/elements/Comment.js +67 -12
  109. package/dist/esm/elements/Comment.js.map +1 -1
  110. package/dist/esm/elements/CommentManager.js +74 -16
  111. package/dist/esm/elements/CommentManager.js.map +1 -1
  112. package/dist/esm/elements/EndnoteManager.js.map +1 -1
  113. package/dist/esm/elements/Field.js +77 -35
  114. package/dist/esm/elements/Field.js.map +1 -1
  115. package/dist/esm/elements/FieldHelpers.js +7 -4
  116. package/dist/esm/elements/FieldHelpers.js.map +1 -1
  117. package/dist/esm/elements/Footer.js +39 -53
  118. package/dist/esm/elements/Footer.js.map +1 -1
  119. package/dist/esm/elements/FootnoteManager.js.map +1 -1
  120. package/dist/esm/elements/Header.js +39 -53
  121. package/dist/esm/elements/Header.js.map +1 -1
  122. package/dist/esm/elements/HeaderFooterManager.js +36 -6
  123. package/dist/esm/elements/HeaderFooterManager.js.map +1 -1
  124. package/dist/esm/elements/Hyperlink.js +69 -44
  125. package/dist/esm/elements/Hyperlink.js.map +1 -1
  126. package/dist/esm/elements/Image.js +33 -6
  127. package/dist/esm/elements/Image.js.map +1 -1
  128. package/dist/esm/elements/ImageManager.js +11 -0
  129. package/dist/esm/elements/ImageManager.js.map +1 -1
  130. package/dist/esm/elements/Paragraph.js +91 -26
  131. package/dist/esm/elements/Paragraph.js.map +1 -1
  132. package/dist/esm/elements/Revision.js +369 -29
  133. package/dist/esm/elements/Revision.js.map +1 -1
  134. package/dist/esm/elements/Run.js +24 -4
  135. package/dist/esm/elements/Run.js.map +1 -1
  136. package/dist/esm/elements/Section.js +17 -7
  137. package/dist/esm/elements/Section.js.map +1 -1
  138. package/dist/esm/elements/Shape.js +50 -42
  139. package/dist/esm/elements/Shape.js.map +1 -1
  140. package/dist/esm/elements/StructuredDocumentTag.js +46 -6
  141. package/dist/esm/elements/StructuredDocumentTag.js.map +1 -1
  142. package/dist/esm/elements/Table.js +90 -42
  143. package/dist/esm/elements/Table.js.map +1 -1
  144. package/dist/esm/elements/TableCell.js +32 -13
  145. package/dist/esm/elements/TableCell.js.map +1 -1
  146. package/dist/esm/elements/TableOfContents.js +5 -7
  147. package/dist/esm/elements/TableOfContents.js.map +1 -1
  148. package/dist/esm/elements/TableRow.js +16 -1
  149. package/dist/esm/elements/TableRow.js.map +1 -1
  150. package/dist/esm/elements/TextBox.js +55 -42
  151. package/dist/esm/elements/TextBox.js.map +1 -1
  152. package/dist/esm/formatting/AbstractNumbering.js +1 -1
  153. package/dist/esm/formatting/AbstractNumbering.js.map +1 -1
  154. package/dist/esm/formatting/NumberingLevel.js +8 -6
  155. package/dist/esm/formatting/NumberingLevel.js.map +1 -1
  156. package/dist/esm/formatting/NumberingManager.js +16 -1
  157. package/dist/esm/formatting/NumberingManager.js.map +1 -1
  158. package/dist/esm/formatting/Style.js +14 -0
  159. package/dist/esm/formatting/Style.js.map +1 -1
  160. package/dist/esm/formatting/StylesManager.js +14 -2
  161. package/dist/esm/formatting/StylesManager.js.map +1 -1
  162. package/dist/esm/helpers/CleanupHelper.js +103 -26
  163. package/dist/esm/helpers/CleanupHelper.js.map +1 -1
  164. package/dist/esm/images/ImageOptimizer.js +52 -4
  165. package/dist/esm/images/ImageOptimizer.js.map +1 -1
  166. package/dist/esm/index.js +1 -0
  167. package/dist/esm/index.js.map +1 -1
  168. package/dist/esm/internal.js +1 -1
  169. package/dist/esm/internal.js.map +1 -1
  170. package/dist/esm/processors/CompatibilityUpgrader.js +7 -1
  171. package/dist/esm/processors/CompatibilityUpgrader.js.map +1 -1
  172. package/dist/esm/processors/InMemoryRevisionAcceptor.js +134 -13
  173. package/dist/esm/processors/InMemoryRevisionAcceptor.js.map +1 -1
  174. package/dist/esm/processors/RevisionWalker.js +58 -8
  175. package/dist/esm/processors/RevisionWalker.js.map +1 -1
  176. package/dist/esm/processors/SelectiveRevisionAcceptor.js +116 -17
  177. package/dist/esm/processors/SelectiveRevisionAcceptor.js.map +1 -1
  178. package/dist/esm/processors/cnfStyleDecoder.js +7 -7
  179. package/dist/esm/processors/cnfStyleDecoder.js.map +1 -1
  180. package/dist/esm/processors/stripTrackedChanges.js +16 -5
  181. package/dist/esm/processors/stripTrackedChanges.js.map +1 -1
  182. package/dist/esm/utils/deepClone.js +24 -11
  183. package/dist/esm/utils/deepClone.js.map +1 -1
  184. package/dist/esm/utils/units.js +1 -1
  185. package/dist/esm/utils/units.js.map +1 -1
  186. package/dist/esm/utils/validation.js +11 -23
  187. package/dist/esm/utils/validation.js.map +1 -1
  188. package/dist/esm/utils/xmlSanitization.js +131 -7
  189. package/dist/esm/utils/xmlSanitization.js.map +1 -1
  190. package/dist/esm/validation/RevisionAutoFixer.js +69 -55
  191. package/dist/esm/validation/RevisionAutoFixer.js.map +1 -1
  192. package/dist/esm/validation/RevisionValidator.js +24 -20
  193. package/dist/esm/validation/RevisionValidator.js.map +1 -1
  194. package/dist/esm/xml/XMLBuilder.js +52 -20
  195. package/dist/esm/xml/XMLBuilder.js.map +1 -1
  196. package/dist/esm/xml/XMLParser.js +55 -13
  197. package/dist/esm/xml/XMLParser.js.map +1 -1
  198. package/dist/esm/zip/ZipHandler.js +37 -13
  199. package/dist/esm/zip/ZipHandler.js.map +1 -1
  200. package/dist/esm/zip/ZipReader.js +53 -6
  201. package/dist/esm/zip/ZipReader.js.map +1 -1
  202. package/dist/esm/zip/errors.js +7 -0
  203. package/dist/esm/zip/errors.js.map +1 -1
  204. package/dist/esm/zip/types.js +4 -0
  205. package/dist/esm/zip/types.js.map +1 -1
  206. package/dist/formatting/AbstractNumbering.d.ts.map +1 -1
  207. package/dist/formatting/AbstractNumbering.js +1 -1
  208. package/dist/formatting/AbstractNumbering.js.map +1 -1
  209. package/dist/formatting/NumberingLevel.d.ts +1 -1
  210. package/dist/formatting/NumberingLevel.d.ts.map +1 -1
  211. package/dist/formatting/NumberingLevel.js +8 -6
  212. package/dist/formatting/NumberingLevel.js.map +1 -1
  213. package/dist/formatting/NumberingManager.d.ts.map +1 -1
  214. package/dist/formatting/NumberingManager.js +16 -1
  215. package/dist/formatting/NumberingManager.js.map +1 -1
  216. package/dist/formatting/Style.d.ts.map +1 -1
  217. package/dist/formatting/Style.js +14 -0
  218. package/dist/formatting/Style.js.map +1 -1
  219. package/dist/formatting/StylesManager.d.ts +2 -0
  220. package/dist/formatting/StylesManager.d.ts.map +1 -1
  221. package/dist/formatting/StylesManager.js +14 -2
  222. package/dist/formatting/StylesManager.js.map +1 -1
  223. package/dist/helpers/CleanupHelper.d.ts.map +1 -1
  224. package/dist/helpers/CleanupHelper.js +103 -26
  225. package/dist/helpers/CleanupHelper.js.map +1 -1
  226. package/dist/images/ImageOptimizer.d.ts.map +1 -1
  227. package/dist/images/ImageOptimizer.js +52 -4
  228. package/dist/images/ImageOptimizer.js.map +1 -1
  229. package/dist/index.d.ts +3 -1
  230. package/dist/index.d.ts.map +1 -1
  231. package/dist/index.js +4 -2
  232. package/dist/index.js.map +1 -1
  233. package/dist/internal.d.ts +1 -1
  234. package/dist/internal.d.ts.map +1 -1
  235. package/dist/internal.js +2 -1
  236. package/dist/internal.js.map +1 -1
  237. package/dist/processors/CompatibilityUpgrader.d.ts.map +1 -1
  238. package/dist/processors/CompatibilityUpgrader.js +7 -1
  239. package/dist/processors/CompatibilityUpgrader.js.map +1 -1
  240. package/dist/processors/InMemoryRevisionAcceptor.d.ts +1 -0
  241. package/dist/processors/InMemoryRevisionAcceptor.d.ts.map +1 -1
  242. package/dist/processors/InMemoryRevisionAcceptor.js +135 -13
  243. package/dist/processors/InMemoryRevisionAcceptor.js.map +1 -1
  244. package/dist/processors/RevisionWalker.d.ts +2 -0
  245. package/dist/processors/RevisionWalker.d.ts.map +1 -1
  246. package/dist/processors/RevisionWalker.js +58 -8
  247. package/dist/processors/RevisionWalker.js.map +1 -1
  248. package/dist/processors/SelectiveRevisionAcceptor.d.ts.map +1 -1
  249. package/dist/processors/SelectiveRevisionAcceptor.js +116 -17
  250. package/dist/processors/SelectiveRevisionAcceptor.js.map +1 -1
  251. package/dist/processors/cnfStyleDecoder.d.ts.map +1 -1
  252. package/dist/processors/cnfStyleDecoder.js +7 -7
  253. package/dist/processors/cnfStyleDecoder.js.map +1 -1
  254. package/dist/processors/stripTrackedChanges.d.ts.map +1 -1
  255. package/dist/processors/stripTrackedChanges.js +16 -5
  256. package/dist/processors/stripTrackedChanges.js.map +1 -1
  257. package/dist/utils/deepClone.d.ts.map +1 -1
  258. package/dist/utils/deepClone.js +24 -11
  259. package/dist/utils/deepClone.js.map +1 -1
  260. package/dist/utils/units.d.ts.map +1 -1
  261. package/dist/utils/units.js +1 -1
  262. package/dist/utils/units.js.map +1 -1
  263. package/dist/utils/validation.d.ts.map +1 -1
  264. package/dist/utils/validation.js +11 -23
  265. package/dist/utils/validation.js.map +1 -1
  266. package/dist/utils/xmlSanitization.d.ts +2 -0
  267. package/dist/utils/xmlSanitization.d.ts.map +1 -1
  268. package/dist/utils/xmlSanitization.js +133 -7
  269. package/dist/utils/xmlSanitization.js.map +1 -1
  270. package/dist/validation/RevisionAutoFixer.d.ts +6 -2
  271. package/dist/validation/RevisionAutoFixer.d.ts.map +1 -1
  272. package/dist/validation/RevisionAutoFixer.js +68 -54
  273. package/dist/validation/RevisionAutoFixer.js.map +1 -1
  274. package/dist/validation/RevisionValidator.d.ts +2 -0
  275. package/dist/validation/RevisionValidator.d.ts.map +1 -1
  276. package/dist/validation/RevisionValidator.js +26 -21
  277. package/dist/validation/RevisionValidator.js.map +1 -1
  278. package/dist/xml/XMLBuilder.d.ts +1 -0
  279. package/dist/xml/XMLBuilder.d.ts.map +1 -1
  280. package/dist/xml/XMLBuilder.js +52 -20
  281. package/dist/xml/XMLBuilder.js.map +1 -1
  282. package/dist/xml/XMLParser.d.ts +1 -0
  283. package/dist/xml/XMLParser.d.ts.map +1 -1
  284. package/dist/xml/XMLParser.js +55 -13
  285. package/dist/xml/XMLParser.js.map +1 -1
  286. package/dist/zip/ZipHandler.d.ts.map +1 -1
  287. package/dist/zip/ZipHandler.js +37 -13
  288. package/dist/zip/ZipHandler.js.map +1 -1
  289. package/dist/zip/ZipReader.d.ts.map +1 -1
  290. package/dist/zip/ZipReader.js +52 -5
  291. package/dist/zip/ZipReader.js.map +1 -1
  292. package/dist/zip/errors.d.ts +3 -0
  293. package/dist/zip/errors.d.ts.map +1 -1
  294. package/dist/zip/errors.js +9 -1
  295. package/dist/zip/errors.js.map +1 -1
  296. package/dist/zip/types.d.ts +4 -0
  297. package/dist/zip/types.d.ts.map +1 -1
  298. package/dist/zip/types.js +4 -0
  299. package/dist/zip/types.js.map +1 -1
  300. package/package.json +2 -2
  301. package/src/core/Document.ts +1159 -240
  302. package/src/core/DocumentGenerator.ts +106 -26
  303. package/src/core/DocumentParser.ts +681 -114
  304. package/src/core/RelationshipManager.ts +446 -442
  305. package/src/elements/Comment.ts +123 -18
  306. package/src/elements/CommentManager.ts +121 -22
  307. package/src/elements/EndnoteManager.ts +4 -1
  308. package/src/elements/Field.ts +134 -43
  309. package/src/elements/FieldHelpers.ts +20 -4
  310. package/src/elements/Footer.ts +62 -67
  311. package/src/elements/FootnoteManager.ts +4 -1
  312. package/src/elements/Header.ts +62 -67
  313. package/src/elements/HeaderFooterManager.ts +56 -8
  314. package/src/elements/Hyperlink.ts +150 -55
  315. package/src/elements/Image.ts +51 -7
  316. package/src/elements/ImageManager.ts +24 -0
  317. package/src/elements/Paragraph.ts +161 -40
  318. package/src/elements/Revision.ts +446 -47
  319. package/src/elements/Run.ts +44 -6
  320. package/src/elements/Section.ts +25 -9
  321. package/src/elements/Shape.ts +52 -44
  322. package/src/elements/StructuredDocumentTag.ts +83 -8
  323. package/src/elements/Table.ts +151 -50
  324. package/src/elements/TableCell.ts +57 -17
  325. package/src/elements/TableOfContents.ts +10 -9
  326. package/src/elements/TableRow.ts +35 -3
  327. package/src/elements/TextBox.ts +58 -43
  328. package/src/formatting/AbstractNumbering.ts +4 -2
  329. package/src/formatting/NumberingLevel.ts +50 -12
  330. package/src/formatting/NumberingManager.ts +32 -3
  331. package/src/formatting/Style.ts +14 -0
  332. package/src/formatting/StylesManager.ts +29 -2
  333. package/src/helpers/CleanupHelper.ts +122 -30
  334. package/src/images/ImageOptimizer.ts +64 -5
  335. package/src/index.ts +7 -0
  336. package/src/internal.ts +1 -0
  337. package/src/processors/CompatibilityUpgrader.ts +15 -2
  338. package/src/processors/InMemoryRevisionAcceptor.ts +276 -17
  339. package/src/processors/RevisionWalker.ts +83 -7
  340. package/src/processors/SelectiveRevisionAcceptor.ts +164 -28
  341. package/src/processors/cnfStyleDecoder.ts +18 -12
  342. package/src/processors/stripTrackedChanges.ts +47 -10
  343. package/src/utils/deepClone.ts +48 -14
  344. package/src/utils/units.ts +3 -1
  345. package/src/utils/validation.ts +30 -32
  346. package/src/utils/xmlSanitization.ts +218 -22
  347. package/src/validation/RevisionAutoFixer.ts +109 -65
  348. package/src/validation/RevisionValidator.ts +48 -23
  349. package/src/xml/XMLBuilder.ts +82 -22
  350. package/src/xml/XMLParser.ts +87 -20
  351. package/src/zip/ZipHandler.ts +61 -21
  352. package/src/zip/ZipReader.ts +135 -13
  353. package/src/zip/errors.ts +15 -0
  354. package/src/zip/types.ts +44 -2
@@ -1 +1 @@
1
- {"version":3,"file":"CompatibilityUpgrader.d.ts","sourceRoot":"","sources":["../../src/processors/CompatibilityUpgrader.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,aAAa;IAE5B,YAAY,EAAE,MAAM,CAAC;IAGrB,OAAO,EAAE,MAAM,CAAC;IAGhB,YAAY,EAAE,MAAM,EAAE,CAAC;IAGvB,aAAa,EAAE,MAAM,EAAE,CAAC;IAGxB,kBAAkB,EAAE,OAAO,CAAC;IAG5B,OAAO,EAAE,OAAO,CAAC;CAClB;AAKD,qBAAa,qBAAqB;IAchC,MAAM,CAAC,kBAAkB,CACvB,WAAW,EAAE,MAAM,EACnB,YAAY,SAAK,GAChB;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,aAAa,CAAA;KAAE;IA4IzC,MAAM,CAAC,sBAAsB,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG;QACjE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACnC,QAAQ,EAAE,OAAO,CAAC;KACnB;IAyBD,OAAO,CAAC,MAAM,CAAC,sBAAsB;CAMtC"}
1
+ {"version":3,"file":"CompatibilityUpgrader.d.ts","sourceRoot":"","sources":["../../src/processors/CompatibilityUpgrader.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,aAAa;IAE5B,YAAY,EAAE,MAAM,CAAC;IAGrB,OAAO,EAAE,MAAM,CAAC;IAGhB,YAAY,EAAE,MAAM,EAAE,CAAC;IAGvB,aAAa,EAAE,MAAM,EAAE,CAAC;IAGxB,kBAAkB,EAAE,OAAO,CAAC;IAG5B,OAAO,EAAE,OAAO,CAAC;CAClB;AAKD,qBAAa,qBAAqB;IAchC,MAAM,CAAC,kBAAkB,CACvB,WAAW,EAAE,MAAM,EACnB,YAAY,SAAK,GAChB;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,aAAa,CAAA;KAAE;IAyJzC,MAAM,CAAC,sBAAsB,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG;QACjE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACnC,QAAQ,EAAE,OAAO,CAAC;KACnB;IAyBD,OAAO,CAAC,MAAM,CAAC,sBAAsB;CAMtC"}
@@ -10,7 +10,13 @@ class CompatibilityUpgrader {
10
10
  const selfClosingCompat = /<w:compat\s*\/>/.exec(settingsXml);
11
11
  if (!compatBlockMatch && !selfClosingCompat) {
12
12
  const modernBlock = CompatibilityUpgrader.buildModernCompatBlock(legacyCompatFlags_js_1.MODERN_COMPAT_SETTINGS);
13
- const xml = settingsXml.replace(/<\/w:settings>/, modernBlock + '\n</w:settings>');
13
+ const followingSibling = /<(?:w:rsids|m:mathPr|w:themeFontLang|w:clrSchemeMapping|w:shapeDefaults|w:decimalSymbol|w:listSeparator)[\s/>]/.exec(settingsXml);
14
+ const xml = followingSibling
15
+ ? settingsXml.slice(0, followingSibling.index) +
16
+ modernBlock +
17
+ '\n ' +
18
+ settingsXml.slice(followingSibling.index)
19
+ : settingsXml.replace(/<\/w:settings>/, modernBlock + '\n</w:settings>');
14
20
  for (const s of legacyCompatFlags_js_1.MODERN_COMPAT_SETTINGS) {
15
21
  addedSettings.push(s.name);
16
22
  }
@@ -1 +1 @@
1
- {"version":3,"file":"CompatibilityUpgrader.js","sourceRoot":"","sources":["../../src/processors/CompatibilityUpgrader.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * CompatibilityUpgrader — Upgrades w:compat block in settings.xml to modern format.\n *\n * Equivalent to Word's File > Info > Convert operation for the compatibility\n * settings portion. Removes legacy boolean compat flags, updates compatSetting\n * entries, and manages modern namespaces.\n *\n * @module\n */\n\nimport {\n LEGACY_COMPAT_ELEMENT_NAMES,\n MODERN_COMPAT_SETTINGS,\n MS_WORD_COMPAT_URI,\n} from '../constants/legacyCompatFlags.js';\nimport type { CompatSetting } from '../types/compatibility-types.js';\n\n/**\n * Report of what changed during an upgrade operation.\n */\nexport interface UpgradeReport {\n /** Previous compatibility mode value (11, 12, 14, or 15) */\n previousMode: number;\n\n /** New compatibility mode (always 15 after upgrade) */\n newMode: number;\n\n /** Legacy compat flags that were removed (without w: prefix) */\n removedFlags: string[];\n\n /** Modern settings that were added (setting names) */\n addedSettings: string[];\n\n /** Whether namespaces were expanded */\n namespacesExpanded: boolean;\n\n /** Whether any changes were actually made (false if already mode 15 with no legacy flags) */\n changed: boolean;\n}\n\n/**\n * Upgrades w:compat blocks in settings.xml to modern Word 2013+ format.\n */\nexport class CompatibilityUpgrader {\n /**\n * Upgrades the w:compat block in settings.xml to mode 15.\n *\n * Operations performed:\n * 1. Remove all legacy boolean compat elements\n * 2. Remove existing Microsoft-URI w:compatSetting entries\n * 3. Insert modern w:compatSetting entries\n * 4. Preserve non-Microsoft w:compatSetting entries (custom URIs)\n *\n * @param settingsXml - The raw settings.xml content\n * @param previousMode - The current compatibility mode value (for the report)\n * @returns Object with upgraded XML and an UpgradeReport\n */\n static upgradeCompatBlock(\n settingsXml: string,\n previousMode = 12\n ): { xml: string; report: UpgradeReport } {\n const removedFlags: string[] = [];\n const addedSettings: string[] = [];\n\n // Check if already mode 15 with no legacy flags\n const compatBlockMatch = /<w:compat>([\\s\\S]*?)<\\/w:compat>/.exec(settingsXml);\n const selfClosingCompat = /<w:compat\\s*\\/>/.exec(settingsXml);\n\n if (!compatBlockMatch && !selfClosingCompat) {\n // No w:compat block — insert a full modern block before </w:settings>\n const modernBlock = CompatibilityUpgrader.buildModernCompatBlock(MODERN_COMPAT_SETTINGS);\n const xml = settingsXml.replace(/<\\/w:settings>/, modernBlock + '\\n</w:settings>');\n\n for (const s of MODERN_COMPAT_SETTINGS) {\n addedSettings.push(s.name);\n }\n\n return {\n xml,\n report: {\n previousMode,\n newMode: 15,\n removedFlags,\n addedSettings,\n namespacesExpanded: false,\n changed: true,\n },\n };\n }\n\n // Handle self-closing <w:compat/>\n if (selfClosingCompat) {\n const modernBlock = CompatibilityUpgrader.buildModernCompatBlock(MODERN_COMPAT_SETTINGS);\n const xml = settingsXml.replace(/<w:compat\\s*\\/>/, modernBlock);\n\n for (const s of MODERN_COMPAT_SETTINGS) {\n addedSettings.push(s.name);\n }\n\n return {\n xml,\n report: {\n previousMode,\n newMode: 15,\n removedFlags,\n addedSettings,\n namespacesExpanded: false,\n changed: true,\n },\n };\n }\n\n // Process existing w:compat block\n const compatBlock = compatBlockMatch![1] ?? '';\n\n // 1. Find and record legacy flags that will be removed\n const legacyFlagRegex = /<w:(\\w+)(?:\\s[^>]*)?\\/?>/g;\n let flagMatch;\n while ((flagMatch = legacyFlagRegex.exec(compatBlock)) !== null) {\n const tagName = flagMatch[1];\n if (tagName && tagName !== 'compatSetting' && LEGACY_COMPAT_ELEMENT_NAMES.has(tagName)) {\n removedFlags.push(tagName);\n }\n }\n\n // 2. Collect non-Microsoft compatSetting entries to preserve\n const preservedSettings: CompatSetting[] = [];\n const settingRegex = /<w:compatSetting\\s+([^>]*)\\/?\\s*>/g;\n let settingMatch;\n while ((settingMatch = settingRegex.exec(compatBlock)) !== null) {\n const attrs = settingMatch[1] ?? '';\n const nameMatch = /w:name\\s*=\\s*\"([^\"]*)\"/.exec(attrs);\n const uriMatch = /w:uri\\s*=\\s*\"([^\"]*)\"/.exec(attrs);\n const valMatch = /w:val\\s*=\\s*\"([^\"]*)\"/.exec(attrs);\n\n if (nameMatch?.[1] && uriMatch?.[1] && valMatch?.[1]) {\n // Preserve settings with non-Microsoft URIs\n if (uriMatch[1] !== MS_WORD_COMPAT_URI) {\n preservedSettings.push({\n name: nameMatch[1],\n uri: uriMatch[1],\n val: valMatch[1],\n });\n }\n }\n }\n\n // 3. Determine which modern settings are actually new\n const existingMsSettings = new Set<string>();\n const existingSettingRegex = /<w:compatSetting\\s+([^>]*)\\/?\\s*>/g;\n let existingMatch;\n while ((existingMatch = existingSettingRegex.exec(compatBlock)) !== null) {\n const attrs = existingMatch[1] ?? '';\n const nameMatch = /w:name\\s*=\\s*\"([^\"]*)\"/.exec(attrs);\n const uriMatch = /w:uri\\s*=\\s*\"([^\"]*)\"/.exec(attrs);\n if (nameMatch?.[1] && uriMatch?.[1] && uriMatch[1] === MS_WORD_COMPAT_URI) {\n existingMsSettings.add(nameMatch[1]);\n }\n }\n\n for (const s of MODERN_COMPAT_SETTINGS) {\n if (!existingMsSettings.has(s.name)) {\n addedSettings.push(s.name);\n }\n }\n // compatibilityMode value change counts as \"added\" if it existed but with different val\n if (existingMsSettings.has('compatibilityMode') && previousMode !== 15) {\n if (!addedSettings.includes('compatibilityMode')) {\n addedSettings.push('compatibilityMode');\n }\n }\n\n // 4. Build the new compat block\n const allSettings = [...MODERN_COMPAT_SETTINGS, ...preservedSettings];\n const modernBlock = CompatibilityUpgrader.buildModernCompatBlock(allSettings);\n\n // 5. Replace the old block\n const changed = removedFlags.length > 0 || addedSettings.length > 0 || previousMode !== 15;\n const xml = settingsXml.replace(/<w:compat>[\\s\\S]*?<\\/w:compat>/, modernBlock);\n\n return {\n xml,\n report: {\n previousMode,\n newMode: 15,\n removedFlags,\n addedSettings,\n namespacesExpanded: false,\n changed,\n },\n };\n }\n\n /**\n * Ensures namespace declarations include all modern extended namespaces\n * (w14, w15, w16se, w16cid, etc.) and returns the expanded set.\n *\n * @param namespaces - Current namespace record from document\n * @returns Updated namespace record with modern namespaces added\n */\n static ensureModernNamespaces(namespaces: Record<string, string>): {\n namespaces: Record<string, string>;\n expanded: boolean;\n } {\n const result = { ...namespaces };\n let expanded = false;\n\n const modernNamespaces: Record<string, string> = {\n 'xmlns:w14': 'http://schemas.microsoft.com/office/word/2010/wordml',\n 'xmlns:w15': 'http://schemas.microsoft.com/office/word/2012/wordml',\n 'xmlns:w16se': 'http://schemas.microsoft.com/office/word/2015/wordml/symex',\n 'xmlns:w16cid': 'http://schemas.microsoft.com/office/word/2016/wordml/cid',\n };\n\n for (const [key, value] of Object.entries(modernNamespaces)) {\n if (!result[key]) {\n result[key] = value;\n expanded = true;\n }\n }\n\n return { namespaces: result, expanded };\n }\n\n /**\n * Builds a <w:compat> block XML string from an array of compat settings.\n * Does not include legacy boolean flags (they are stripped during upgrade).\n */\n private static buildModernCompatBlock(settings: CompatSetting[]): string {\n const entries = settings.map(\n (s) => ` <w:compatSetting w:name=\"${s.name}\" w:uri=\"${s.uri}\" w:val=\"${s.val}\"/>`\n );\n return `<w:compat>\\n${entries.join('\\n')}\\n </w:compat>`;\n }\n}\n"]}
1
+ {"version":3,"file":"CompatibilityUpgrader.js","sourceRoot":"","sources":["../../src/processors/CompatibilityUpgrader.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * CompatibilityUpgrader — Upgrades w:compat block in settings.xml to modern format.\n *\n * Equivalent to Word's File > Info > Convert operation for the compatibility\n * settings portion. Removes legacy boolean compat flags, updates compatSetting\n * entries, and manages modern namespaces.\n *\n * @module\n */\n\nimport {\n LEGACY_COMPAT_ELEMENT_NAMES,\n MODERN_COMPAT_SETTINGS,\n MS_WORD_COMPAT_URI,\n} from '../constants/legacyCompatFlags.js';\nimport type { CompatSetting } from '../types/compatibility-types.js';\n\n/**\n * Report of what changed during an upgrade operation.\n */\nexport interface UpgradeReport {\n /** Previous compatibility mode value (11, 12, 14, or 15) */\n previousMode: number;\n\n /** New compatibility mode (always 15 after upgrade) */\n newMode: number;\n\n /** Legacy compat flags that were removed (without w: prefix) */\n removedFlags: string[];\n\n /** Modern settings that were added (setting names) */\n addedSettings: string[];\n\n /** Whether namespaces were expanded */\n namespacesExpanded: boolean;\n\n /** Whether any changes were actually made (false if already mode 15 with no legacy flags) */\n changed: boolean;\n}\n\n/**\n * Upgrades w:compat blocks in settings.xml to modern Word 2013+ format.\n */\nexport class CompatibilityUpgrader {\n /**\n * Upgrades the w:compat block in settings.xml to mode 15.\n *\n * Operations performed:\n * 1. Remove all legacy boolean compat elements\n * 2. Remove existing Microsoft-URI w:compatSetting entries\n * 3. Insert modern w:compatSetting entries\n * 4. Preserve non-Microsoft w:compatSetting entries (custom URIs)\n *\n * @param settingsXml - The raw settings.xml content\n * @param previousMode - The current compatibility mode value (for the report)\n * @returns Object with upgraded XML and an UpgradeReport\n */\n static upgradeCompatBlock(\n settingsXml: string,\n previousMode = 12\n ): { xml: string; report: UpgradeReport } {\n const removedFlags: string[] = [];\n const addedSettings: string[] = [];\n\n // Check if already mode 15 with no legacy flags\n const compatBlockMatch = /<w:compat>([\\s\\S]*?)<\\/w:compat>/.exec(settingsXml);\n const selfClosingCompat = /<w:compat\\s*\\/>/.exec(settingsXml);\n\n if (!compatBlockMatch && !selfClosingCompat) {\n // No w:compat block — insert a full modern block. CT_Settings is an\n // xsd:sequence where w:compat must precede rsids, mathPr, themeFontLang,\n // clrSchemeMapping, shapeDefaults, decimalSymbol, and listSeparator, so\n // anchor before the earliest of those; append before </w:settings> only\n // when none are present.\n const modernBlock = CompatibilityUpgrader.buildModernCompatBlock(MODERN_COMPAT_SETTINGS);\n const followingSibling =\n /<(?:w:rsids|m:mathPr|w:themeFontLang|w:clrSchemeMapping|w:shapeDefaults|w:decimalSymbol|w:listSeparator)[\\s/>]/.exec(\n settingsXml\n );\n const xml = followingSibling\n ? settingsXml.slice(0, followingSibling.index) +\n modernBlock +\n '\\n ' +\n settingsXml.slice(followingSibling.index)\n : settingsXml.replace(/<\\/w:settings>/, modernBlock + '\\n</w:settings>');\n\n for (const s of MODERN_COMPAT_SETTINGS) {\n addedSettings.push(s.name);\n }\n\n return {\n xml,\n report: {\n previousMode,\n newMode: 15,\n removedFlags,\n addedSettings,\n namespacesExpanded: false,\n changed: true,\n },\n };\n }\n\n // Handle self-closing <w:compat/>\n if (selfClosingCompat) {\n const modernBlock = CompatibilityUpgrader.buildModernCompatBlock(MODERN_COMPAT_SETTINGS);\n const xml = settingsXml.replace(/<w:compat\\s*\\/>/, modernBlock);\n\n for (const s of MODERN_COMPAT_SETTINGS) {\n addedSettings.push(s.name);\n }\n\n return {\n xml,\n report: {\n previousMode,\n newMode: 15,\n removedFlags,\n addedSettings,\n namespacesExpanded: false,\n changed: true,\n },\n };\n }\n\n // Process existing w:compat block\n const compatBlock = compatBlockMatch![1] ?? '';\n\n // 1. Find and record legacy flags that will be removed\n const legacyFlagRegex = /<w:(\\w+)(?:\\s[^>]*)?\\/?>/g;\n let flagMatch;\n while ((flagMatch = legacyFlagRegex.exec(compatBlock)) !== null) {\n const tagName = flagMatch[1];\n if (tagName && tagName !== 'compatSetting' && LEGACY_COMPAT_ELEMENT_NAMES.has(tagName)) {\n removedFlags.push(tagName);\n }\n }\n\n // 2. Collect non-Microsoft compatSetting entries to preserve\n const preservedSettings: CompatSetting[] = [];\n const settingRegex = /<w:compatSetting\\s+([^>]*)\\/?\\s*>/g;\n let settingMatch;\n while ((settingMatch = settingRegex.exec(compatBlock)) !== null) {\n const attrs = settingMatch[1] ?? '';\n const nameMatch = /w:name\\s*=\\s*\"([^\"]*)\"/.exec(attrs);\n const uriMatch = /w:uri\\s*=\\s*\"([^\"]*)\"/.exec(attrs);\n const valMatch = /w:val\\s*=\\s*\"([^\"]*)\"/.exec(attrs);\n\n if (nameMatch?.[1] && uriMatch?.[1] && valMatch?.[1]) {\n // Preserve settings with non-Microsoft URIs\n if (uriMatch[1] !== MS_WORD_COMPAT_URI) {\n preservedSettings.push({\n name: nameMatch[1],\n uri: uriMatch[1],\n val: valMatch[1],\n });\n }\n }\n }\n\n // 3. Determine which modern settings are actually new\n const existingMsSettings = new Set<string>();\n const existingSettingRegex = /<w:compatSetting\\s+([^>]*)\\/?\\s*>/g;\n let existingMatch;\n while ((existingMatch = existingSettingRegex.exec(compatBlock)) !== null) {\n const attrs = existingMatch[1] ?? '';\n const nameMatch = /w:name\\s*=\\s*\"([^\"]*)\"/.exec(attrs);\n const uriMatch = /w:uri\\s*=\\s*\"([^\"]*)\"/.exec(attrs);\n if (nameMatch?.[1] && uriMatch?.[1] && uriMatch[1] === MS_WORD_COMPAT_URI) {\n existingMsSettings.add(nameMatch[1]);\n }\n }\n\n for (const s of MODERN_COMPAT_SETTINGS) {\n if (!existingMsSettings.has(s.name)) {\n addedSettings.push(s.name);\n }\n }\n // compatibilityMode value change counts as \"added\" if it existed but with different val\n if (existingMsSettings.has('compatibilityMode') && previousMode !== 15) {\n if (!addedSettings.includes('compatibilityMode')) {\n addedSettings.push('compatibilityMode');\n }\n }\n\n // 4. Build the new compat block\n const allSettings = [...MODERN_COMPAT_SETTINGS, ...preservedSettings];\n const modernBlock = CompatibilityUpgrader.buildModernCompatBlock(allSettings);\n\n // 5. Replace the old block\n const changed = removedFlags.length > 0 || addedSettings.length > 0 || previousMode !== 15;\n const xml = settingsXml.replace(/<w:compat>[\\s\\S]*?<\\/w:compat>/, modernBlock);\n\n return {\n xml,\n report: {\n previousMode,\n newMode: 15,\n removedFlags,\n addedSettings,\n namespacesExpanded: false,\n changed,\n },\n };\n }\n\n /**\n * Ensures namespace declarations include all modern extended namespaces\n * (w14, w15, w16se, w16cid, etc.) and returns the expanded set.\n *\n * @param namespaces - Current namespace record from document\n * @returns Updated namespace record with modern namespaces added\n */\n static ensureModernNamespaces(namespaces: Record<string, string>): {\n namespaces: Record<string, string>;\n expanded: boolean;\n } {\n const result = { ...namespaces };\n let expanded = false;\n\n const modernNamespaces: Record<string, string> = {\n 'xmlns:w14': 'http://schemas.microsoft.com/office/word/2010/wordml',\n 'xmlns:w15': 'http://schemas.microsoft.com/office/word/2012/wordml',\n 'xmlns:w16se': 'http://schemas.microsoft.com/office/word/2015/wordml/symex',\n 'xmlns:w16cid': 'http://schemas.microsoft.com/office/word/2016/wordml/cid',\n };\n\n for (const [key, value] of Object.entries(modernNamespaces)) {\n if (!result[key]) {\n result[key] = value;\n expanded = true;\n }\n }\n\n return { namespaces: result, expanded };\n }\n\n /**\n * Builds a <w:compat> block XML string from an array of compat settings.\n * Does not include legacy boolean flags (they are stripped during upgrade).\n */\n private static buildModernCompatBlock(settings: CompatSetting[]): string {\n const entries = settings.map(\n (s) => ` <w:compatSetting w:name=\"${s.name}\" w:uri=\"${s.uri}\" w:val=\"${s.val}\"/>`\n );\n return `<w:compat>\\n${entries.join('\\n')}\\n </w:compat>`;\n }\n}\n"]}
@@ -18,6 +18,7 @@ export interface AcceptRevisionsResult {
18
18
  }
19
19
  export declare function stripRevisionsFromXml(xml: string): string;
20
20
  export declare function acceptRevisionsInMemory(doc: Document, options?: AcceptRevisionsOptions): AcceptRevisionsResult;
21
+ export declare function mergeParagraphsWithDeletedMarks(doc: Document, marked: Set<Paragraph>): void;
21
22
  export declare function paragraphHasRevisions(paragraph: Paragraph): boolean;
22
23
  export declare function getRevisionsFromParagraph(paragraph: Paragraph): Revision[];
23
24
  export declare function countRevisionsByType(doc: Document): Map<RevisionType, number>;
@@ -1 +1 @@
1
- {"version":3,"file":"InMemoryRevisionAcceptor.d.ts","sourceRoot":"","sources":["../../src/processors/InMemoryRevisionAcceptor.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAErD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAoBjE,MAAM,WAAW,sBAAsB;IAErC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAEhC,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAKD,MAAM,WAAW,qBAAqB;IAEpC,kBAAkB,EAAE,MAAM,CAAC;IAE3B,iBAAiB,EAAE,MAAM,CAAC;IAE1B,aAAa,EAAE,MAAM,CAAC;IAEtB,uBAAuB,EAAE,MAAM,CAAC;IAEhC,aAAa,EAAE,MAAM,CAAC;IAEtB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AA+BD,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAkEzD;AAaD,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,QAAQ,EACb,OAAO,GAAE,sBAA2B,GACnC,qBAAqB,CAwUvB;AA8LD,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAWnE;AAKD,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,SAAS,GAAG,QAAQ,EAAE,CAG1E;AAKD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,QAAQ,GAAG,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,CAa7E"}
1
+ {"version":3,"file":"InMemoryRevisionAcceptor.d.ts","sourceRoot":"","sources":["../../src/processors/InMemoryRevisionAcceptor.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAErD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAsBjE,MAAM,WAAW,sBAAsB;IAErC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAEhC,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAKD,MAAM,WAAW,qBAAqB;IAEpC,kBAAkB,EAAE,MAAM,CAAC;IAE3B,iBAAiB,EAAE,MAAM,CAAC;IAE1B,aAAa,EAAE,MAAM,CAAC;IAEtB,uBAAuB,EAAE,MAAM,CAAC;IAEhC,aAAa,EAAE,MAAM,CAAC;IAEtB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AA2DD,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAwEzD;AAaD,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,QAAQ,EACb,OAAO,GAAE,sBAA2B,GACnC,qBAAqB,CAgWvB;AA+ND,wBAAgB,+BAA+B,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,GAAG,IAAI,CAkC3F;AA0DD,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAWnE;AAKD,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,SAAS,GAAG,QAAQ,EAAE,CAG1E;AAKD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,QAAQ,GAAG,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,CAa7E"}
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.stripRevisionsFromXml = stripRevisionsFromXml;
4
4
  exports.acceptRevisionsInMemory = acceptRevisionsInMemory;
5
+ exports.mergeParagraphsWithDeletedMarks = mergeParagraphsWithDeletedMarks;
5
6
  exports.paragraphHasRevisions = paragraphHasRevisions;
6
7
  exports.getRevisionsFromParagraph = getRevisionsFromParagraph;
7
8
  exports.countRevisionsByType = countRevisionsByType;
@@ -9,6 +10,8 @@ const Paragraph_js_1 = require("../elements/Paragraph.js");
9
10
  const Revision_js_1 = require("../elements/Revision.js");
10
11
  const RevisionContent_js_1 = require("../elements/RevisionContent.js");
11
12
  const Field_js_1 = require("../elements/Field.js");
13
+ const RangeMarker_js_1 = require("../elements/RangeMarker.js");
14
+ const PreservedElement_js_1 = require("../elements/PreservedElement.js");
12
15
  const Table_js_1 = require("../elements/Table.js");
13
16
  const logger_js_1 = require("../utils/logger.js");
14
17
  function getLogger() {
@@ -24,6 +27,24 @@ const PROPERTY_REVISION_TYPES = [
24
27
  'sectionPropertiesChange',
25
28
  'numberingChange',
26
29
  ];
30
+ const MOVE_RANGE_MARKER_TYPES = new Set([
31
+ 'moveFromRangeStart',
32
+ 'moveFromRangeEnd',
33
+ 'moveToRangeStart',
34
+ 'moveToRangeEnd',
35
+ 'customXmlMoveFromRangeStart',
36
+ 'customXmlMoveFromRangeEnd',
37
+ 'customXmlMoveToRangeStart',
38
+ 'customXmlMoveToRangeEnd',
39
+ ]);
40
+ const INS_RANGE_MARKER_TYPES = new Set([
41
+ 'customXmlInsRangeStart',
42
+ 'customXmlInsRangeEnd',
43
+ ]);
44
+ const DEL_RANGE_MARKER_TYPES = new Set([
45
+ 'customXmlDelRangeStart',
46
+ 'customXmlDelRangeEnd',
47
+ ]);
27
48
  function stripRevisionsFromXml(xml) {
28
49
  let result = xml;
29
50
  const rangePatterns = [
@@ -53,18 +74,18 @@ function stripRevisionsFromXml(xml) {
53
74
  for (const pattern of propChangePatterns) {
54
75
  result = result.replace(pattern, '');
55
76
  }
77
+ result = result.replace(/<w:del\b[^>]*\/>/g, '');
56
78
  let prevLen = 0;
57
79
  while (result.length !== prevLen) {
58
80
  prevLen = result.length;
59
81
  result = result.replace(/<w:del\b[^>]*>[\s\S]*?<\/w:del>/g, '');
60
82
  }
61
- result = result.replace(/<w:del\b[^>]*\/>/g, '');
83
+ result = result.replace(/<w:moveFrom\b[^>]*\/>/g, '');
62
84
  prevLen = 0;
63
85
  while (result.length !== prevLen) {
64
86
  prevLen = result.length;
65
87
  result = result.replace(/<w:moveFrom\b[^>]*>[\s\S]*?<\/w:moveFrom>/g, '');
66
88
  }
67
- result = result.replace(/<w:moveFrom\b[^>]*\/>/g, '');
68
89
  result = result.replace(/<\/w:moveTo>/g, '');
69
90
  result = result.replace(/<w:moveTo\b[^>]*>/g, '');
70
91
  result = result.replace(/<\/w:ins>/g, '');
@@ -93,6 +114,7 @@ function acceptRevisionsInMemory(doc, options = {}) {
93
114
  emptyTablesRemoved: 0,
94
115
  };
95
116
  logger.info('Accepting revisions in-memory', { options: opts });
117
+ const acceptedMarkDeletions = [];
96
118
  if (opts.acceptMoves) {
97
119
  const revisionManager = doc.getRevisionManager();
98
120
  if (revisionManager) {
@@ -111,7 +133,7 @@ function acceptRevisionsInMemory(doc, options = {}) {
111
133
  }
112
134
  const paragraphs = doc.getAllParagraphs();
113
135
  for (const paragraph of paragraphs) {
114
- const paragraphResult = acceptRevisionsInParagraph(paragraph, opts);
136
+ const paragraphResult = acceptRevisionsInParagraph(paragraph, opts, acceptedMarkDeletions);
115
137
  result.insertionsAccepted += paragraphResult.insertionsAccepted;
116
138
  result.deletionsAccepted += paragraphResult.deletionsAccepted;
117
139
  result.movesAccepted += paragraphResult.movesAccepted;
@@ -167,7 +189,7 @@ function acceptRevisionsInMemory(doc, options = {}) {
167
189
  }
168
190
  }
169
191
  for (const paragraph of cell.getParagraphs()) {
170
- const paragraphResult = acceptRevisionsInParagraph(paragraph, opts);
192
+ const paragraphResult = acceptRevisionsInParagraph(paragraph, opts, acceptedMarkDeletions);
171
193
  result.insertionsAccepted += paragraphResult.insertionsAccepted;
172
194
  result.deletionsAccepted += paragraphResult.deletionsAccepted;
173
195
  result.movesAccepted += paragraphResult.movesAccepted;
@@ -202,7 +224,7 @@ function acceptRevisionsInMemory(doc, options = {}) {
202
224
  const elements = headerEntry.header.getElements();
203
225
  for (const element of elements) {
204
226
  if (element instanceof Paragraph_js_1.Paragraph) {
205
- const paragraphResult = acceptRevisionsInParagraph(element, opts);
227
+ const paragraphResult = acceptRevisionsInParagraph(element, opts, acceptedMarkDeletions);
206
228
  result.insertionsAccepted += paragraphResult.insertionsAccepted;
207
229
  result.deletionsAccepted += paragraphResult.deletionsAccepted;
208
230
  result.movesAccepted += paragraphResult.movesAccepted;
@@ -212,7 +234,7 @@ function acceptRevisionsInMemory(doc, options = {}) {
212
234
  for (const row of element.getRows()) {
213
235
  for (const cell of row.getCells()) {
214
236
  for (const paragraph of cell.getParagraphs()) {
215
- const paragraphResult = acceptRevisionsInParagraph(paragraph, opts);
237
+ const paragraphResult = acceptRevisionsInParagraph(paragraph, opts, acceptedMarkDeletions);
216
238
  result.insertionsAccepted += paragraphResult.insertionsAccepted;
217
239
  result.deletionsAccepted += paragraphResult.deletionsAccepted;
218
240
  result.movesAccepted += paragraphResult.movesAccepted;
@@ -241,7 +263,7 @@ function acceptRevisionsInMemory(doc, options = {}) {
241
263
  const elements = footerEntry.footer.getElements();
242
264
  for (const element of elements) {
243
265
  if (element instanceof Paragraph_js_1.Paragraph) {
244
- const paragraphResult = acceptRevisionsInParagraph(element, opts);
266
+ const paragraphResult = acceptRevisionsInParagraph(element, opts, acceptedMarkDeletions);
245
267
  result.insertionsAccepted += paragraphResult.insertionsAccepted;
246
268
  result.deletionsAccepted += paragraphResult.deletionsAccepted;
247
269
  result.movesAccepted += paragraphResult.movesAccepted;
@@ -251,7 +273,7 @@ function acceptRevisionsInMemory(doc, options = {}) {
251
273
  for (const row of element.getRows()) {
252
274
  for (const cell of row.getCells()) {
253
275
  for (const paragraph of cell.getParagraphs()) {
254
- const paragraphResult = acceptRevisionsInParagraph(paragraph, opts);
276
+ const paragraphResult = acceptRevisionsInParagraph(paragraph, opts, acceptedMarkDeletions);
255
277
  result.insertionsAccepted += paragraphResult.insertionsAccepted;
256
278
  result.deletionsAccepted += paragraphResult.deletionsAccepted;
257
279
  result.movesAccepted += paragraphResult.movesAccepted;
@@ -280,7 +302,7 @@ function acceptRevisionsInMemory(doc, options = {}) {
280
302
  if (footnoteManager) {
281
303
  for (const fn of footnoteManager.getAllFootnotes()) {
282
304
  for (const paragraph of fn.getParagraphs()) {
283
- const paragraphResult = acceptRevisionsInParagraph(paragraph, opts);
305
+ const paragraphResult = acceptRevisionsInParagraph(paragraph, opts, acceptedMarkDeletions);
284
306
  result.insertionsAccepted += paragraphResult.insertionsAccepted;
285
307
  result.deletionsAccepted += paragraphResult.deletionsAccepted;
286
308
  result.movesAccepted += paragraphResult.movesAccepted;
@@ -292,7 +314,7 @@ function acceptRevisionsInMemory(doc, options = {}) {
292
314
  if (endnoteManager) {
293
315
  for (const en of endnoteManager.getAllEndnotes()) {
294
316
  for (const paragraph of en.getParagraphs()) {
295
- const paragraphResult = acceptRevisionsInParagraph(paragraph, opts);
317
+ const paragraphResult = acceptRevisionsInParagraph(paragraph, opts, acceptedMarkDeletions);
296
318
  result.insertionsAccepted += paragraphResult.insertionsAccepted;
297
319
  result.deletionsAccepted += paragraphResult.deletionsAccepted;
298
320
  result.movesAccepted += paragraphResult.movesAccepted;
@@ -312,6 +334,9 @@ function acceptRevisionsInMemory(doc, options = {}) {
312
334
  revisionManager.clear();
313
335
  }
314
336
  doc.disableTrackChanges();
337
+ if (acceptedMarkDeletions.length > 0) {
338
+ mergeParagraphsWithDeletedMarks(doc, new Set(acceptedMarkDeletions));
339
+ }
315
340
  if (opts.cleanupEmptyTables) {
316
341
  result.emptyTablesRemoved = cleanupEmptyTables(doc, logger);
317
342
  }
@@ -330,7 +355,7 @@ function acceptRevisionsInMemory(doc, options = {}) {
330
355
  });
331
356
  return result;
332
357
  }
333
- function acceptRevisionsInParagraph(paragraph, options) {
358
+ function acceptRevisionsInParagraph(paragraph, options, acceptedMarkDeletions) {
334
359
  const result = {
335
360
  insertionsAccepted: 0,
336
361
  deletionsAccepted: 0,
@@ -431,6 +456,15 @@ function acceptRevisionsInParagraph(paragraph, options) {
431
456
  }
432
457
  newContent.push(item);
433
458
  }
459
+ else if (item instanceof RangeMarker_js_1.RangeMarker) {
460
+ const markerType = item.getType();
461
+ if ((options.acceptMoves && MOVE_RANGE_MARKER_TYPES.has(markerType)) ||
462
+ (options.acceptInsertions && INS_RANGE_MARKER_TYPES.has(markerType)) ||
463
+ (options.acceptDeletions && DEL_RANGE_MARKER_TYPES.has(markerType))) {
464
+ continue;
465
+ }
466
+ newContent.push(item);
467
+ }
434
468
  else {
435
469
  newContent.push(item);
436
470
  }
@@ -452,6 +486,7 @@ function acceptRevisionsInParagraph(paragraph, options) {
452
486
  if (formatting.paragraphMarkDeletion) {
453
487
  paragraph.clearParagraphMarkDeletion();
454
488
  result.deletionsAccepted++;
489
+ acceptedMarkDeletions?.push(paragraph);
455
490
  }
456
491
  }
457
492
  if (options.acceptInsertions) {
@@ -463,6 +498,56 @@ function acceptRevisionsInParagraph(paragraph, options) {
463
498
  }
464
499
  return result;
465
500
  }
501
+ function mergeParagraphsWithDeletedMarks(doc, marked) {
502
+ if (marked.size === 0) {
503
+ return;
504
+ }
505
+ mergeMarkedSequence(doc.getBodyElements(), marked, (para) => {
506
+ doc.removeElement(para);
507
+ });
508
+ for (const table of doc.getTables()) {
509
+ for (const row of table.getRows()) {
510
+ for (const cell of row.getCells()) {
511
+ const blockedBoundaries = new Set(cell.getRawNestedContent().map((item) => item.position));
512
+ mergeMarkedSequence(cell.getParagraphs(), marked, (para) => {
513
+ const index = cell.getParagraphs().indexOf(para);
514
+ if (index !== -1) {
515
+ cell.removeParagraph(index);
516
+ }
517
+ }, (index) => blockedBoundaries.has(index));
518
+ }
519
+ }
520
+ }
521
+ }
522
+ function mergeMarkedSequence(sequence, marked, removeParagraph, blockedBefore) {
523
+ let chain = [];
524
+ for (let i = 0; i < sequence.length; i++) {
525
+ const element = sequence[i];
526
+ if (!(element instanceof Paragraph_js_1.Paragraph)) {
527
+ chain = [];
528
+ continue;
529
+ }
530
+ if (blockedBefore?.(i)) {
531
+ chain = [];
532
+ }
533
+ if (marked.has(element)) {
534
+ chain.push(element);
535
+ continue;
536
+ }
537
+ if (chain.length > 0) {
538
+ const inherited = [];
539
+ for (const para of chain) {
540
+ inherited.push(...para.getContent());
541
+ }
542
+ element.setContent([...inherited, ...element.getContent()]);
543
+ for (const para of chain) {
544
+ para.setContent([]);
545
+ removeParagraph(para);
546
+ }
547
+ chain = [];
548
+ }
549
+ }
550
+ }
466
551
  function paragraphHasRevisions(paragraph) {
467
552
  const content = paragraph.getContent();
468
553
  if (content.some((item) => item instanceof Revision_js_1.Revision)) {
@@ -490,6 +575,40 @@ function countRevisionsByType(doc) {
490
575
  }
491
576
  return counts;
492
577
  }
578
+ const MARKER_PRESERVED_ELEMENT_TYPES = new Set([
579
+ 'w:proofErr',
580
+ 'w:permStart',
581
+ 'w:permEnd',
582
+ 'w:commentRangeStart',
583
+ 'w:commentRangeEnd',
584
+ ]);
585
+ function paragraphHasVisibleContent(para) {
586
+ if (para.getText().trim().length > 0) {
587
+ return true;
588
+ }
589
+ for (const item of para.getContent()) {
590
+ if (!item)
591
+ continue;
592
+ if (item instanceof Revision_js_1.Revision) {
593
+ return true;
594
+ }
595
+ if (item instanceof PreservedElement_js_1.PreservedElement) {
596
+ if (!MARKER_PRESERVED_ELEMENT_TYPES.has(item.getElementType())) {
597
+ return true;
598
+ }
599
+ continue;
600
+ }
601
+ const candidate = item;
602
+ if (typeof candidate.getImageElement === 'function' ||
603
+ typeof candidate.getShapeType === 'function' ||
604
+ typeof candidate.getTextContent === 'function' ||
605
+ typeof candidate.getUrl === 'function' ||
606
+ typeof candidate.getInstruction === 'function') {
607
+ return true;
608
+ }
609
+ }
610
+ return false;
611
+ }
493
612
  function cleanupEmptyTables(doc, logger) {
494
613
  const tables = doc.getTables();
495
614
  let removedCount = 0;
@@ -503,10 +622,13 @@ function cleanupEmptyTables(doc, logger) {
503
622
  for (const row of rows) {
504
623
  const cells = row.getCells();
505
624
  for (const cell of cells) {
625
+ if (cell.hasRawNestedContent()) {
626
+ hasContent = true;
627
+ break;
628
+ }
506
629
  const paragraphs = cell.getParagraphs();
507
630
  for (const para of paragraphs) {
508
- const text = para.getText().trim();
509
- if (text.length > 0) {
631
+ if (paragraphHasVisibleContent(para)) {
510
632
  hasContent = true;
511
633
  break;
512
634
  }