docxmlater 11.0.9 → 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 +431 -85
  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 +431 -85
  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 +692 -120
  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,4 +1,5 @@
1
1
  import { Run } from './Run.js';
2
+ import { XMLBuilder } from '../xml/XMLBuilder.js';
2
3
  import { isRunContent, isHyperlinkContent } from './RevisionContent.js';
3
4
  import { formatDateForXml } from '../utils/dateFormatting.js';
4
5
  export class Revision {
@@ -188,9 +189,6 @@ export class Revision {
188
189
  'w:author': this.author,
189
190
  'w:date': this.formatDate(this.date),
190
191
  };
191
- if ((this.type === 'moveFrom' || this.type === 'moveTo') && this.moveId) {
192
- attributes['w:moveId'] = this.moveId;
193
- }
194
192
  const elementName = this.getElementName();
195
193
  const children = [];
196
194
  if (this.isPropertyChangeType()) {
@@ -198,10 +196,50 @@ export class Revision {
198
196
  children.push(this.createPropertiesElement());
199
197
  }
200
198
  }
201
- const firstItem = this.content[0];
202
- const singleHyperlink = this.content.length === 1 && firstItem && isHyperlinkContent(firstItem) ? firstItem : null;
203
- if (singleHyperlink && !this.isPropertyChangeType()) {
204
- return this.createHyperlinkWrappedRevisionXml(singleHyperlink, elementName, attributes);
199
+ if (!this.isPropertyChangeType()) {
200
+ const segments = [];
201
+ const segmentAttributes = (segmentIndex) => segmentIndex === 0
202
+ ? attributes
203
+ : {
204
+ ...attributes,
205
+ 'w:id': String(500000000 + (this.id % 1000000) * 1000 + segmentIndex),
206
+ };
207
+ let pendingRuns = [];
208
+ const flushRuns = () => {
209
+ if (pendingRuns.length > 0) {
210
+ segments.push({
211
+ name: elementName,
212
+ attributes: segmentAttributes(segments.length),
213
+ children: pendingRuns,
214
+ });
215
+ pendingRuns = [];
216
+ }
217
+ };
218
+ for (const item of this.content) {
219
+ if (isHyperlinkContent(item)) {
220
+ flushRuns();
221
+ segments.push(this.createHyperlinkWrappedRevisionXml(item, elementName, segmentAttributes(segments.length)));
222
+ }
223
+ else if (isRunContent(item)) {
224
+ if (this.type === 'delete' || this.type === 'moveFrom') {
225
+ pendingRuns.push(this.createDeletedRunXml(item));
226
+ }
227
+ else {
228
+ pendingRuns.push(item.toXML());
229
+ }
230
+ }
231
+ }
232
+ flushRuns();
233
+ if (segments.length === 0) {
234
+ return { name: elementName, attributes, children: [] };
235
+ }
236
+ if (segments.length === 1) {
237
+ return segments[0];
238
+ }
239
+ return {
240
+ name: '__rawXml',
241
+ rawXml: segments.map((segment) => XMLBuilder.elementToString(segment)).join(''),
242
+ };
205
243
  }
206
244
  for (const item of this.content) {
207
245
  if (isHyperlinkContent(item)) {
@@ -209,24 +247,13 @@ export class Revision {
209
247
  if (hyperlinkXml.children) {
210
248
  for (const child of hyperlinkXml.children) {
211
249
  if (typeof child === 'object' && child.name === 'w:r') {
212
- if (this.type === 'delete' || this.type === 'moveFrom') {
213
- children.push(this.convertRunXmlToDeleted(child));
214
- }
215
- else {
216
- children.push(child);
217
- }
250
+ children.push(child);
218
251
  }
219
252
  }
220
253
  }
221
254
  }
222
255
  else if (isRunContent(item)) {
223
- if (this.type === 'delete' || this.type === 'moveFrom') {
224
- const runXml = this.createDeletedRunXml(item);
225
- children.push(runXml);
226
- }
227
- else {
228
- children.push(item.toXML());
229
- }
256
+ children.push(item.toXML());
230
257
  }
231
258
  }
232
259
  return {
@@ -279,27 +306,340 @@ export class Revision {
279
306
  propElementName = 'w:numPr';
280
307
  break;
281
308
  }
309
+ const keyMap = Revision.PROPERTY_KEY_TO_ELEMENT[this.type] ?? {};
282
310
  const propChildren = [];
283
311
  if (this.previousProperties) {
284
312
  for (const [key, value] of Object.entries(this.previousProperties)) {
285
- if (typeof value === 'boolean' && value) {
286
- propChildren.push({ name: `w:${key}`, attributes: {}, children: [] });
287
- }
288
- else if (typeof value === 'string' || typeof value === 'number') {
289
- propChildren.push({
290
- name: `w:${key}`,
291
- attributes: { 'w:val': value.toString() },
292
- children: [],
293
- });
313
+ const child = this.createPreviousPropertyXml(`w:${keyMap[key] ?? key}`, value);
314
+ if (child) {
315
+ propChildren.push(child);
294
316
  }
295
317
  }
296
318
  }
319
+ const order = Revision.PROPERTY_CHILD_ORDER[propElementName];
320
+ if (order) {
321
+ const rank = (name) => {
322
+ const index = order.indexOf(name);
323
+ return index === -1 ? order.length : index;
324
+ };
325
+ propChildren.sort((a, b) => rank(a.name) - rank(b.name));
326
+ }
297
327
  return {
298
328
  name: propElementName,
299
329
  attributes: {},
300
330
  children: propChildren,
301
331
  };
302
332
  }
333
+ static PROPERTY_KEY_TO_ELEMENT = {
334
+ paragraphPropertiesChange: {
335
+ alignment: 'jc',
336
+ style: 'pStyle',
337
+ styleId: 'pStyle',
338
+ indentation: 'ind',
339
+ numbering: 'numPr',
340
+ outlineLevel: 'outlineLvl',
341
+ shading: 'shd',
342
+ borders: 'pBdr',
343
+ },
344
+ tablePropertiesChange: {
345
+ alignment: 'jc',
346
+ style: 'tblStyle',
347
+ styleId: 'tblStyle',
348
+ width: 'tblW',
349
+ indent: 'tblInd',
350
+ borders: 'tblBorders',
351
+ shading: 'shd',
352
+ layout: 'tblLayout',
353
+ cellMargins: 'tblCellMar',
354
+ cellSpacing: 'tblCellSpacing',
355
+ },
356
+ tableExceptionPropertiesChange: {
357
+ alignment: 'jc',
358
+ width: 'tblW',
359
+ indent: 'tblInd',
360
+ borders: 'tblBorders',
361
+ shading: 'shd',
362
+ layout: 'tblLayout',
363
+ cellMargins: 'tblCellMar',
364
+ cellSpacing: 'tblCellSpacing',
365
+ },
366
+ tableRowPropertiesChange: {
367
+ alignment: 'jc',
368
+ height: 'trHeight',
369
+ isHeader: 'tblHeader',
370
+ cellSpacing: 'tblCellSpacing',
371
+ },
372
+ tableCellPropertiesChange: {
373
+ width: 'tcW',
374
+ borders: 'tcBorders',
375
+ shading: 'shd',
376
+ verticalAlignment: 'vAlign',
377
+ margins: 'tcMar',
378
+ },
379
+ sectionPropertiesChange: {
380
+ pageSize: 'pgSz',
381
+ margins: 'pgMar',
382
+ columns: 'cols',
383
+ pageNumbering: 'pgNumType',
384
+ },
385
+ };
386
+ static PROPERTY_CHILD_ORDER = {
387
+ 'w:pPr': [
388
+ 'w:pStyle',
389
+ 'w:keepNext',
390
+ 'w:keepLines',
391
+ 'w:pageBreakBefore',
392
+ 'w:framePr',
393
+ 'w:widowControl',
394
+ 'w:numPr',
395
+ 'w:suppressLineNumbers',
396
+ 'w:pBdr',
397
+ 'w:shd',
398
+ 'w:tabs',
399
+ 'w:suppressAutoHyphens',
400
+ 'w:kinsoku',
401
+ 'w:wordWrap',
402
+ 'w:overflowPunct',
403
+ 'w:topLinePunct',
404
+ 'w:autoSpaceDE',
405
+ 'w:autoSpaceDN',
406
+ 'w:bidi',
407
+ 'w:adjustRightInd',
408
+ 'w:snapToGrid',
409
+ 'w:spacing',
410
+ 'w:ind',
411
+ 'w:contextualSpacing',
412
+ 'w:mirrorIndents',
413
+ 'w:suppressOverlap',
414
+ 'w:jc',
415
+ 'w:textDirection',
416
+ 'w:textAlignment',
417
+ 'w:textboxTightWrap',
418
+ 'w:outlineLvl',
419
+ ],
420
+ 'w:tblPr': [
421
+ 'w:tblStyle',
422
+ 'w:tblpPr',
423
+ 'w:tblOverlap',
424
+ 'w:bidiVisual',
425
+ 'w:tblStyleRowBandSize',
426
+ 'w:tblStyleColBandSize',
427
+ 'w:tblW',
428
+ 'w:jc',
429
+ 'w:tblCellSpacing',
430
+ 'w:tblInd',
431
+ 'w:tblBorders',
432
+ 'w:shd',
433
+ 'w:tblLayout',
434
+ 'w:tblCellMar',
435
+ 'w:tblLook',
436
+ 'w:tblCaption',
437
+ 'w:tblDescription',
438
+ ],
439
+ 'w:tblPrEx': [
440
+ 'w:tblW',
441
+ 'w:jc',
442
+ 'w:tblCellSpacing',
443
+ 'w:tblInd',
444
+ 'w:tblBorders',
445
+ 'w:shd',
446
+ 'w:tblLayout',
447
+ 'w:tblCellMar',
448
+ 'w:tblLook',
449
+ ],
450
+ 'w:trPr': [
451
+ 'w:cnfStyle',
452
+ 'w:divId',
453
+ 'w:gridBefore',
454
+ 'w:gridAfter',
455
+ 'w:wBefore',
456
+ 'w:wAfter',
457
+ 'w:cantSplit',
458
+ 'w:trHeight',
459
+ 'w:tblHeader',
460
+ 'w:tblCellSpacing',
461
+ 'w:jc',
462
+ 'w:hidden',
463
+ ],
464
+ 'w:tcPr': [
465
+ 'w:cnfStyle',
466
+ 'w:tcW',
467
+ 'w:gridSpan',
468
+ 'w:hMerge',
469
+ 'w:vMerge',
470
+ 'w:tcBorders',
471
+ 'w:shd',
472
+ 'w:noWrap',
473
+ 'w:tcMar',
474
+ 'w:textDirection',
475
+ 'w:tcFitText',
476
+ 'w:vAlign',
477
+ 'w:hideMark',
478
+ ],
479
+ 'w:sectPr': [
480
+ 'w:headerReference',
481
+ 'w:footerReference',
482
+ 'w:footnotePr',
483
+ 'w:endnotePr',
484
+ 'w:type',
485
+ 'w:pgSz',
486
+ 'w:pgMar',
487
+ 'w:paperSrc',
488
+ 'w:pgBorders',
489
+ 'w:lnNumType',
490
+ 'w:pgNumType',
491
+ 'w:cols',
492
+ 'w:formProt',
493
+ 'w:vAlign',
494
+ 'w:noEndnote',
495
+ 'w:titlePg',
496
+ 'w:textDirection',
497
+ 'w:bidi',
498
+ 'w:rtlGutter',
499
+ 'w:docGrid',
500
+ ],
501
+ 'w:numPr': ['w:ilvl', 'w:numId', 'w:numberingChange', 'w:ins'],
502
+ };
503
+ createPreviousPropertyXml(name, value) {
504
+ if (typeof value === 'boolean') {
505
+ return { name, attributes: value ? {} : { 'w:val': '0' }, children: [] };
506
+ }
507
+ if (typeof value === 'string' || typeof value === 'number') {
508
+ return { name, attributes: { 'w:val': value.toString() }, children: [] };
509
+ }
510
+ if (value && typeof value === 'object') {
511
+ return this.createObjectPropertyXml(name, value);
512
+ }
513
+ return null;
514
+ }
515
+ createObjectPropertyXml(name, value) {
516
+ switch (name) {
517
+ case 'w:spacing':
518
+ return {
519
+ name,
520
+ attributes: XMLBuilder.buildAttributes({
521
+ 'w:before': value.before,
522
+ 'w:beforeLines': value.beforeLines,
523
+ 'w:beforeAutospacing': value.beforeAutospacing === undefined
524
+ ? undefined
525
+ : value.beforeAutospacing
526
+ ? '1'
527
+ : '0',
528
+ 'w:after': value.after,
529
+ 'w:afterLines': value.afterLines,
530
+ 'w:afterAutospacing': value.afterAutospacing === undefined ? undefined : value.afterAutospacing ? '1' : '0',
531
+ 'w:line': value.line,
532
+ 'w:lineRule': value.lineRule,
533
+ }),
534
+ children: [],
535
+ };
536
+ case 'w:ind':
537
+ return {
538
+ name,
539
+ attributes: XMLBuilder.buildAttributes({
540
+ 'w:start': value.start,
541
+ 'w:end': value.end,
542
+ 'w:left': value.left,
543
+ 'w:leftChars': value.leftChars,
544
+ 'w:right': value.right,
545
+ 'w:rightChars': value.rightChars,
546
+ 'w:firstLine': value.firstLine,
547
+ 'w:firstLineChars': value.firstLineChars,
548
+ 'w:hanging': value.hanging,
549
+ 'w:hangingChars': value.hangingChars,
550
+ }),
551
+ children: [],
552
+ };
553
+ case 'w:numPr': {
554
+ const numPrChildren = [];
555
+ const level = value.level ?? value.ilvl;
556
+ const numId = value.numId ?? value.id;
557
+ if (level !== undefined) {
558
+ numPrChildren.push({
559
+ name: 'w:ilvl',
560
+ attributes: { 'w:val': String(level) },
561
+ children: [],
562
+ });
563
+ }
564
+ if (numId !== undefined) {
565
+ numPrChildren.push({
566
+ name: 'w:numId',
567
+ attributes: { 'w:val': String(numId) },
568
+ children: [],
569
+ });
570
+ }
571
+ return numPrChildren.length > 0 ? { name, attributes: {}, children: numPrChildren } : null;
572
+ }
573
+ case 'w:shd':
574
+ return XMLBuilder.createShading(value);
575
+ case 'w:pBdr':
576
+ case 'w:tblBorders':
577
+ case 'w:tcBorders': {
578
+ const sides = name === 'w:pBdr'
579
+ ? ['top', 'left', 'bottom', 'right', 'between', 'bar']
580
+ : ['top', 'left', 'bottom', 'right', 'insideH', 'insideV'];
581
+ const borderChildren = [];
582
+ for (const side of sides) {
583
+ if (value[side]) {
584
+ borderChildren.push(XMLBuilder.createBorder(side, value[side]));
585
+ }
586
+ }
587
+ return borderChildren.length > 0
588
+ ? { name, attributes: {}, children: borderChildren }
589
+ : null;
590
+ }
591
+ case 'w:tblW':
592
+ case 'w:tcW':
593
+ case 'w:tblInd':
594
+ case 'w:tblCellSpacing':
595
+ return {
596
+ name,
597
+ attributes: XMLBuilder.buildAttributes({
598
+ 'w:w': value.w ?? value.width ?? value.value,
599
+ 'w:type': value.type ?? 'dxa',
600
+ }),
601
+ children: [],
602
+ };
603
+ case 'w:trHeight':
604
+ return {
605
+ name,
606
+ attributes: XMLBuilder.buildAttributes({
607
+ 'w:val': value.value ?? value.val ?? value.height,
608
+ 'w:hRule': value.rule ?? value.hRule,
609
+ }),
610
+ children: [],
611
+ };
612
+ case 'w:tcMar':
613
+ case 'w:tblCellMar':
614
+ return XMLBuilder.createMargins(name.slice(2), value);
615
+ case 'w:pgSz':
616
+ return {
617
+ name,
618
+ attributes: XMLBuilder.buildAttributes({
619
+ 'w:w': value.width ?? value.w,
620
+ 'w:h': value.height ?? value.h,
621
+ 'w:orient': value.orientation ?? value.orient,
622
+ }),
623
+ children: [],
624
+ };
625
+ case 'w:pgMar':
626
+ return {
627
+ name,
628
+ attributes: XMLBuilder.buildAttributes({
629
+ 'w:top': value.top,
630
+ 'w:right': value.right,
631
+ 'w:bottom': value.bottom,
632
+ 'w:left': value.left,
633
+ 'w:header': value.header,
634
+ 'w:footer': value.footer,
635
+ 'w:gutter': value.gutter,
636
+ }),
637
+ children: [],
638
+ };
639
+ default:
640
+ return null;
641
+ }
642
+ }
303
643
  createDeletedRunXml(run) {
304
644
  const runXml = run.toXML();
305
645
  const deletedTextElement = this.isFieldInstruction ? 'w:delInstrText' : 'w:delText';