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
@@ -0,0 +1,1456 @@
1
+ import { TableRow } from './TableRow.js';
2
+ import { TableCell } from './TableCell.js';
3
+ import { Revision } from './Revision.js';
4
+ import { XMLBuilder } from '../xml/XMLBuilder.js';
5
+ import { deepClone } from '../utils/deepClone.js';
6
+ import { TableGridChange } from './TableGridChange.js';
7
+ import { buildShadingAttributes, } from './CommonTypes.js';
8
+ function buildTblLookAttributes(hex) {
9
+ const raw = typeof hex === 'number' ? hex.toString(16) : String(hex ?? '');
10
+ const normalized = raw.toUpperCase().padStart(4, '0');
11
+ const value = parseInt(normalized, 16) || 0;
12
+ return {
13
+ 'w:val': normalized,
14
+ 'w:firstRow': (value & 0x0020) !== 0 ? '1' : '0',
15
+ 'w:lastRow': (value & 0x0040) !== 0 ? '1' : '0',
16
+ 'w:firstColumn': (value & 0x0080) !== 0 ? '1' : '0',
17
+ 'w:lastColumn': (value & 0x0100) !== 0 ? '1' : '0',
18
+ 'w:noHBand': (value & 0x0200) !== 0 ? '1' : '0',
19
+ 'w:noVBand': (value & 0x0400) !== 0 ? '1' : '0',
20
+ };
21
+ }
22
+ export class Table {
23
+ rows = [];
24
+ formatting;
25
+ _stylesManager;
26
+ trackingContext;
27
+ tblPrChange;
28
+ tblGridChange;
29
+ constructor(rows, columns, formatting = {}) {
30
+ if (formatting.width === undefined) {
31
+ formatting.width = 9360;
32
+ }
33
+ this.formatting = formatting;
34
+ if (rows !== undefined && rows > 0 && columns !== undefined && columns > 0) {
35
+ for (let i = 0; i < rows; i++) {
36
+ const row = new TableRow(columns);
37
+ row._setParentTable(this);
38
+ this.rows.push(row);
39
+ }
40
+ }
41
+ }
42
+ _setTrackingContext(context) {
43
+ this.trackingContext = context;
44
+ }
45
+ getTblPrChange() {
46
+ return this.tblPrChange;
47
+ }
48
+ setTblPrChange(change) {
49
+ this.tblPrChange = change;
50
+ }
51
+ clearTblPrChange() {
52
+ this.tblPrChange = undefined;
53
+ }
54
+ getTblGridChange() {
55
+ return this.tblGridChange;
56
+ }
57
+ setTblGridChange(change) {
58
+ this.tblGridChange = change;
59
+ }
60
+ addRow(row) {
61
+ this.rows.push(row);
62
+ row._setParentTable(this);
63
+ return this;
64
+ }
65
+ addRowFromArray(cells) {
66
+ const row = new TableRow();
67
+ for (const text of cells) {
68
+ row.createCell(text || undefined);
69
+ }
70
+ this.rows.push(row);
71
+ row._setParentTable(this);
72
+ return row;
73
+ }
74
+ addSummaryRow(options) {
75
+ const label = options?.label ?? 'Total';
76
+ const startRow = options?.startRow ?? 1;
77
+ const colCount = this.getColumnCount();
78
+ const defaultCompute = (values) => {
79
+ const nums = values.map((v) => parseFloat(v)).filter((n) => !isNaN(n));
80
+ if (nums.length === 0)
81
+ return '';
82
+ return String(nums.reduce((a, b) => a + b, 0));
83
+ };
84
+ const compute = options?.compute ?? defaultCompute;
85
+ const cells = [];
86
+ for (let c = 0; c < colCount; c++) {
87
+ if (c === 0) {
88
+ cells.push(label);
89
+ continue;
90
+ }
91
+ const colTexts = this.getColumnTexts(c);
92
+ const dataValues = colTexts.slice(startRow);
93
+ cells.push(compute(dataValues, c));
94
+ }
95
+ return this.addRowFromArray(cells);
96
+ }
97
+ createRow(cellCount, formatting) {
98
+ const row = new TableRow(cellCount, formatting);
99
+ this.rows.push(row);
100
+ row._setParentTable(this);
101
+ return row;
102
+ }
103
+ getRow(index) {
104
+ return this.rows[index];
105
+ }
106
+ getRows() {
107
+ return [...this.rows];
108
+ }
109
+ getFirstParagraph() {
110
+ if (this.rows.length === 0)
111
+ return null;
112
+ const firstRow = this.rows[0];
113
+ if (!firstRow)
114
+ return null;
115
+ const cells = firstRow.getCells();
116
+ if (cells.length === 0)
117
+ return null;
118
+ const paras = cells[0]?.getParagraphs();
119
+ return paras && paras.length > 0 ? (paras[0] ?? null) : null;
120
+ }
121
+ getLastParagraph() {
122
+ for (let r = this.rows.length - 1; r >= 0; r--) {
123
+ const row = this.rows[r];
124
+ if (!row)
125
+ continue;
126
+ const cells = row.getCells();
127
+ for (let c = cells.length - 1; c >= 0; c--) {
128
+ const cell = cells[c];
129
+ if (!cell)
130
+ continue;
131
+ const paras = cell.getParagraphs();
132
+ if (paras.length > 0) {
133
+ return paras[paras.length - 1] ?? null;
134
+ }
135
+ }
136
+ }
137
+ return null;
138
+ }
139
+ getRowCount() {
140
+ return this.rows.length;
141
+ }
142
+ getCell(rowIndex, columnIndex) {
143
+ const row = this.getRow(rowIndex);
144
+ return row ? row.getCell(columnIndex) : undefined;
145
+ }
146
+ setCell(rowIndex, colIndex, text) {
147
+ const cell = this.getCell(rowIndex, colIndex);
148
+ if (!cell)
149
+ return this;
150
+ const paragraphs = cell.getParagraphs();
151
+ if (paragraphs.length > 0) {
152
+ paragraphs[0].setText(text);
153
+ for (let p = paragraphs.length - 1; p >= 1; p--) {
154
+ cell.removeParagraph(p);
155
+ }
156
+ }
157
+ else {
158
+ cell.createParagraph(text);
159
+ }
160
+ return this;
161
+ }
162
+ setWidth(twips) {
163
+ const prev = this.formatting.width;
164
+ this.formatting.width = twips;
165
+ if (this.trackingContext?.isEnabled() && prev !== twips) {
166
+ this.trackingContext.trackTableChange(this, 'width', prev, twips);
167
+ }
168
+ return this;
169
+ }
170
+ setAlignment(alignment) {
171
+ const prev = this.formatting.alignment;
172
+ this.formatting.alignment = alignment;
173
+ if (this.trackingContext?.isEnabled() && prev !== alignment) {
174
+ this.trackingContext.trackTableChange(this, 'alignment', prev, alignment);
175
+ }
176
+ return this;
177
+ }
178
+ setLayout(layout) {
179
+ const prev = this.formatting.layout;
180
+ this.formatting.layout = layout === 'auto' ? 'autofit' : layout;
181
+ if (this.trackingContext?.isEnabled() && prev !== this.formatting.layout) {
182
+ this.trackingContext.trackTableChange(this, 'layout', prev, this.formatting.layout);
183
+ }
184
+ return this;
185
+ }
186
+ setBorders(borders, options) {
187
+ const prev = this.formatting.borders;
188
+ this.formatting.borders = borders;
189
+ if (this.trackingContext?.isEnabled() && prev !== borders) {
190
+ this.trackingContext.trackTableChange(this, 'borders', prev, borders);
191
+ }
192
+ if (options?.applyToCells !== false) {
193
+ const cellBorders = {
194
+ top: borders.top,
195
+ bottom: borders.bottom,
196
+ left: borders.left,
197
+ right: borders.right,
198
+ };
199
+ for (const row of this.rows) {
200
+ const exceptions = row.getTablePropertyExceptions();
201
+ if (exceptions?.borders) {
202
+ row.setTablePropertyExceptions({
203
+ ...exceptions,
204
+ borders: borders,
205
+ });
206
+ }
207
+ for (const cell of row.getCells()) {
208
+ cell.setBorders(cellBorders);
209
+ }
210
+ }
211
+ }
212
+ return this;
213
+ }
214
+ setAllBorders(border, options) {
215
+ return this.setBorders({
216
+ top: border,
217
+ bottom: border,
218
+ left: border,
219
+ right: border,
220
+ insideH: border,
221
+ insideV: border,
222
+ }, options);
223
+ }
224
+ setFirstRowShading(color) {
225
+ if (this.rows.length > 0) {
226
+ const firstRow = this.rows[0];
227
+ if (firstRow) {
228
+ for (const cell of firstRow.getCells()) {
229
+ cell.setShading({ fill: color });
230
+ }
231
+ }
232
+ }
233
+ return this;
234
+ }
235
+ setFirstRowFormatting(options) {
236
+ if (this.rows.length === 0) {
237
+ return this;
238
+ }
239
+ const firstRow = this.rows[0];
240
+ if (!firstRow) {
241
+ return this;
242
+ }
243
+ for (const cell of firstRow.getCells()) {
244
+ const paragraphs = cell.getParagraphs();
245
+ if (options.shading) {
246
+ cell.setShading({ fill: options.shading });
247
+ }
248
+ for (const para of paragraphs) {
249
+ if (options.alignment) {
250
+ para.setAlignment(options.alignment);
251
+ }
252
+ if (options.spacingBefore !== undefined) {
253
+ para.setSpaceBefore(options.spacingBefore);
254
+ }
255
+ if (options.spacingAfter !== undefined) {
256
+ para.setSpaceAfter(options.spacingAfter);
257
+ }
258
+ const runs = para.getRuns();
259
+ for (const run of runs) {
260
+ if (options.bold !== undefined) {
261
+ run.setBold(options.bold);
262
+ }
263
+ if (options.italic !== undefined) {
264
+ run.setItalic(options.italic);
265
+ }
266
+ if (options.underline !== undefined) {
267
+ run.setUnderline(options.underline);
268
+ }
269
+ }
270
+ }
271
+ }
272
+ return this;
273
+ }
274
+ setCellSpacing(twips) {
275
+ const prev = this.formatting.cellSpacing;
276
+ this.formatting.cellSpacing = twips;
277
+ if (this.trackingContext?.isEnabled() && prev !== twips) {
278
+ this.trackingContext.trackTableChange(this, 'cellSpacing', prev, twips);
279
+ }
280
+ return this;
281
+ }
282
+ setIndent(twips) {
283
+ const prev = this.formatting.indent;
284
+ this.formatting.indent = twips;
285
+ if (this.trackingContext?.isEnabled() && prev !== twips) {
286
+ this.trackingContext.trackTableChange(this, 'indent', prev, twips);
287
+ }
288
+ return this;
289
+ }
290
+ setIndentType(type) {
291
+ const prev = this.formatting.indentType;
292
+ this.formatting.indentType = type;
293
+ if (this.trackingContext?.isEnabled() && prev !== type) {
294
+ this.trackingContext.trackTableChange(this, 'indentType', prev, type);
295
+ }
296
+ return this;
297
+ }
298
+ getIndentType() {
299
+ return this.formatting.indentType;
300
+ }
301
+ setStyle(style) {
302
+ const prev = this.formatting.style;
303
+ this.formatting.style = style;
304
+ if (this.trackingContext?.isEnabled() && prev !== style) {
305
+ this.trackingContext.trackTableChange(this, 'style', prev, style);
306
+ }
307
+ return this;
308
+ }
309
+ setTblLook(tblLook) {
310
+ const prev = this.formatting.tblLook;
311
+ this.formatting.tblLook = tblLook;
312
+ if (this.trackingContext?.isEnabled() && prev !== tblLook) {
313
+ this.trackingContext.trackTableChange(this, 'tblLook', prev, tblLook);
314
+ }
315
+ return this;
316
+ }
317
+ setStyleRowBandSize(size) {
318
+ const prev = this.formatting.tblStyleRowBandSize;
319
+ this.formatting.tblStyleRowBandSize = size;
320
+ if (this.trackingContext?.isEnabled() && prev !== size) {
321
+ this.trackingContext.trackTableChange(this, 'tblStyleRowBandSize', prev, size);
322
+ }
323
+ return this;
324
+ }
325
+ setStyleColBandSize(size) {
326
+ const prev = this.formatting.tblStyleColBandSize;
327
+ this.formatting.tblStyleColBandSize = size;
328
+ if (this.trackingContext?.isEnabled() && prev !== size) {
329
+ this.trackingContext.trackTableChange(this, 'tblStyleColBandSize', prev, size);
330
+ }
331
+ return this;
332
+ }
333
+ getTblLookFlags() {
334
+ const hex = this.formatting.tblLook || '0000';
335
+ const value = parseInt(hex, 16) || 0;
336
+ return {
337
+ firstRow: (value & 0x0020) !== 0,
338
+ lastRow: (value & 0x0040) !== 0,
339
+ firstColumn: (value & 0x0080) !== 0,
340
+ lastColumn: (value & 0x0100) !== 0,
341
+ noHBand: (value & 0x0200) !== 0,
342
+ noVBand: (value & 0x0400) !== 0,
343
+ };
344
+ }
345
+ applyConditionalFormatting(rules) {
346
+ const rows = this.getRows();
347
+ if (rules.headerRow && rows.length > 0) {
348
+ const headerFormatting = rules.headerRow === true
349
+ ? { shading: { fill: '4472C4' } }
350
+ : rules.headerRow;
351
+ const headerRow = rows[0];
352
+ if (headerRow) {
353
+ for (const cell of headerRow.getCells()) {
354
+ this.applyCellFormatting(cell, headerFormatting);
355
+ }
356
+ }
357
+ }
358
+ if (rules.alternatingRows) {
359
+ rows.forEach((row, index) => {
360
+ const isEven = index % 2 === 0;
361
+ const formatting = isEven ? rules.alternatingRows?.even : rules.alternatingRows?.odd;
362
+ if (formatting) {
363
+ for (const cell of row.getCells()) {
364
+ this.applyCellFormatting(cell, formatting);
365
+ }
366
+ }
367
+ });
368
+ }
369
+ if (rules.contentRules && rules.contentRules.length > 0) {
370
+ rows.forEach((row, rowIndex) => {
371
+ row.getCells().forEach((cell, colIndex) => {
372
+ const cellText = cell
373
+ .getParagraphs()
374
+ .map((p) => p.getText())
375
+ .join('');
376
+ for (const rule of rules.contentRules) {
377
+ if (rule.condition(cellText, rowIndex, colIndex)) {
378
+ this.applyCellFormatting(cell, rule.formatting);
379
+ }
380
+ }
381
+ });
382
+ });
383
+ }
384
+ return this;
385
+ }
386
+ applyCellFormatting(cell, formatting) {
387
+ if (formatting.shading) {
388
+ cell.setShading(formatting.shading);
389
+ }
390
+ if (formatting.borders) {
391
+ cell.setBorders(formatting.borders);
392
+ }
393
+ if (formatting.textDirection) {
394
+ cell.setTextDirection(formatting.textDirection);
395
+ }
396
+ if (formatting.verticalAlignment) {
397
+ cell.setVerticalAlignment(formatting.verticalAlignment);
398
+ }
399
+ if (formatting.width !== undefined) {
400
+ cell.setWidth(formatting.width);
401
+ }
402
+ if (formatting.margins) {
403
+ cell.setMargins(formatting.margins);
404
+ }
405
+ }
406
+ setPosition(position) {
407
+ const prev = this.formatting.position;
408
+ this.formatting.position = position;
409
+ if (this.trackingContext?.isEnabled() && prev !== position) {
410
+ this.trackingContext.trackTableChange(this, 'position', prev, position);
411
+ }
412
+ return this;
413
+ }
414
+ setOverlap(overlap) {
415
+ const prev = this.formatting.overlap;
416
+ this.formatting.overlap = overlap;
417
+ if (this.trackingContext?.isEnabled() && prev !== overlap) {
418
+ this.trackingContext.trackTableChange(this, 'overlap', prev, overlap);
419
+ }
420
+ return this;
421
+ }
422
+ setBidiVisual(bidi) {
423
+ const prev = this.formatting.bidiVisual;
424
+ this.formatting.bidiVisual = bidi;
425
+ if (this.trackingContext?.isEnabled() && prev !== bidi) {
426
+ this.trackingContext.trackTableChange(this, 'bidiVisual', prev, bidi);
427
+ }
428
+ return this;
429
+ }
430
+ setTableGrid(widths) {
431
+ const prev = this.formatting.tableGrid;
432
+ this.formatting.tableGrid = widths;
433
+ if (this.trackingContext?.isEnabled() && prev) {
434
+ if (!this.tblGridChange) {
435
+ const revisionManager = this.trackingContext.getRevisionManager();
436
+ this.tblGridChange = TableGridChange.create(revisionManager.consumeNextId(), prev.map((w) => ({ width: w })), this.trackingContext.getAuthor(), new Date());
437
+ }
438
+ }
439
+ return this;
440
+ }
441
+ setCaption(caption) {
442
+ const prev = this.formatting.caption;
443
+ this.formatting.caption = caption;
444
+ if (this.trackingContext?.isEnabled() && prev !== caption) {
445
+ this.trackingContext.trackTableChange(this, 'caption', prev, caption);
446
+ }
447
+ return this;
448
+ }
449
+ setDescription(description) {
450
+ const prev = this.formatting.description;
451
+ this.formatting.description = description;
452
+ if (this.trackingContext?.isEnabled() && prev !== description) {
453
+ this.trackingContext.trackTableChange(this, 'description', prev, description);
454
+ }
455
+ return this;
456
+ }
457
+ setShading(shading) {
458
+ const prev = this.formatting.shading;
459
+ this.formatting.shading = shading;
460
+ if (this.trackingContext?.isEnabled() && prev !== shading) {
461
+ this.trackingContext.trackTableChange(this, 'shading', prev, shading);
462
+ }
463
+ return this;
464
+ }
465
+ getShading() {
466
+ return this.formatting.shading;
467
+ }
468
+ setWidthType(type) {
469
+ const prev = this.formatting.widthType;
470
+ this.formatting.widthType = type;
471
+ if (this.trackingContext?.isEnabled() && prev !== type) {
472
+ this.trackingContext.trackTableChange(this, 'widthType', prev, type);
473
+ }
474
+ return this;
475
+ }
476
+ setCellSpacingType(type) {
477
+ const prev = this.formatting.cellSpacingType;
478
+ this.formatting.cellSpacingType = type;
479
+ if (this.trackingContext?.isEnabled() && prev !== type) {
480
+ this.trackingContext.trackTableChange(this, 'cellSpacingType', prev, type);
481
+ }
482
+ return this;
483
+ }
484
+ getFormatting() {
485
+ return { ...this.formatting };
486
+ }
487
+ getWidth() {
488
+ return this.formatting.width;
489
+ }
490
+ getWidthType() {
491
+ return this.formatting.widthType;
492
+ }
493
+ getAlignment() {
494
+ return this.formatting.alignment;
495
+ }
496
+ getLayout() {
497
+ return this.formatting.layout;
498
+ }
499
+ getIndent() {
500
+ return this.formatting.indent;
501
+ }
502
+ getBorders() {
503
+ return this.formatting.borders;
504
+ }
505
+ getColumnWidths() {
506
+ return [...(this.formatting.tableGrid || [])];
507
+ }
508
+ getCellSpacing() {
509
+ return this.formatting.cellSpacing;
510
+ }
511
+ getCellMargins() {
512
+ return this.formatting.cellMargins;
513
+ }
514
+ setCellMargins(margins) {
515
+ const prev = this.formatting.cellMargins;
516
+ this.formatting.cellMargins = margins;
517
+ if (this.trackingContext?.isEnabled() && prev !== margins) {
518
+ this.trackingContext.trackTableChange(this, 'cellMargins', prev, margins);
519
+ }
520
+ return this;
521
+ }
522
+ getStyle() {
523
+ return this.formatting.style;
524
+ }
525
+ getTblLook() {
526
+ return this.formatting.tblLook;
527
+ }
528
+ getPosition() {
529
+ return this.formatting.position ? { ...this.formatting.position } : undefined;
530
+ }
531
+ getOverlap() {
532
+ return this.formatting.overlap;
533
+ }
534
+ getBidiVisual() {
535
+ return this.formatting.bidiVisual;
536
+ }
537
+ getTableGrid() {
538
+ return this.formatting.tableGrid ? [...this.formatting.tableGrid] : undefined;
539
+ }
540
+ getCaption() {
541
+ return this.formatting.caption;
542
+ }
543
+ getDescription() {
544
+ return this.formatting.description;
545
+ }
546
+ getCellSpacingType() {
547
+ return this.formatting.cellSpacingType;
548
+ }
549
+ hasRows() {
550
+ return this.rows.length > 0;
551
+ }
552
+ isFloating() {
553
+ return this.formatting.position !== undefined;
554
+ }
555
+ hasStyle() {
556
+ return this.formatting.style !== undefined && this.formatting.style !== '';
557
+ }
558
+ _setStylesManager(manager) {
559
+ this._stylesManager = manager;
560
+ for (const row of this.rows) {
561
+ for (const cell of row.getCells()) {
562
+ for (const para of cell.getParagraphs()) {
563
+ para._setStylesManager(manager);
564
+ }
565
+ }
566
+ }
567
+ }
568
+ _getStylesManager() {
569
+ return this._stylesManager;
570
+ }
571
+ toXML() {
572
+ const tblPrChildren = [];
573
+ if (this.formatting.style) {
574
+ tblPrChildren.push(XMLBuilder.wSelf('tblStyle', { 'w:val': this.formatting.style }));
575
+ }
576
+ if (this.formatting.position) {
577
+ const pos = this.formatting.position;
578
+ const posAttrs = {};
579
+ if (pos.x !== undefined)
580
+ posAttrs['w:tblpX'] = pos.x;
581
+ if (pos.y !== undefined)
582
+ posAttrs['w:tblpY'] = pos.y;
583
+ if (pos.horizontalAnchor)
584
+ posAttrs['w:horzAnchor'] = pos.horizontalAnchor;
585
+ if (pos.verticalAnchor)
586
+ posAttrs['w:vertAnchor'] = pos.verticalAnchor;
587
+ if (pos.horizontalAlignment)
588
+ posAttrs['w:tblpXSpec'] = pos.horizontalAlignment;
589
+ if (pos.verticalAlignment)
590
+ posAttrs['w:tblpYSpec'] = pos.verticalAlignment;
591
+ if (pos.leftFromText !== undefined)
592
+ posAttrs['w:leftFromText'] = pos.leftFromText;
593
+ if (pos.rightFromText !== undefined)
594
+ posAttrs['w:rightFromText'] = pos.rightFromText;
595
+ if (pos.topFromText !== undefined)
596
+ posAttrs['w:topFromText'] = pos.topFromText;
597
+ if (pos.bottomFromText !== undefined)
598
+ posAttrs['w:bottomFromText'] = pos.bottomFromText;
599
+ if (Object.keys(posAttrs).length > 0) {
600
+ tblPrChildren.push(XMLBuilder.wSelf('tblpPr', posAttrs));
601
+ }
602
+ }
603
+ if (this.formatting.overlap !== undefined) {
604
+ tblPrChildren.push(XMLBuilder.wSelf('tblOverlap', {
605
+ 'w:val': this.formatting.overlap ? 'overlap' : 'never',
606
+ }));
607
+ }
608
+ if (this.formatting.bidiVisual !== undefined) {
609
+ if (this.formatting.bidiVisual) {
610
+ tblPrChildren.push(XMLBuilder.wSelf('bidiVisual'));
611
+ }
612
+ else {
613
+ tblPrChildren.push(XMLBuilder.wSelf('bidiVisual', { 'w:val': 'off' }));
614
+ }
615
+ }
616
+ if (this.formatting.width !== undefined) {
617
+ const widthType = this.formatting.widthType || 'dxa';
618
+ tblPrChildren.push(XMLBuilder.wSelf('tblW', {
619
+ 'w:w': this.formatting.width,
620
+ 'w:type': widthType,
621
+ }));
622
+ }
623
+ if (this.formatting.alignment) {
624
+ tblPrChildren.push(XMLBuilder.wSelf('jc', { 'w:val': this.formatting.alignment }));
625
+ }
626
+ if (this.formatting.cellSpacing !== undefined) {
627
+ const cellSpacingType = this.formatting.cellSpacingType || 'dxa';
628
+ tblPrChildren.push(XMLBuilder.wSelf('tblCellSpacing', {
629
+ 'w:w': this.formatting.cellSpacing,
630
+ 'w:type': cellSpacingType,
631
+ }));
632
+ }
633
+ if (this.formatting.indent !== undefined) {
634
+ tblPrChildren.push(XMLBuilder.wSelf('tblInd', {
635
+ 'w:w': this.formatting.indent,
636
+ 'w:type': this.formatting.indentType || 'dxa',
637
+ }));
638
+ }
639
+ if (this.formatting.borders) {
640
+ const borderElements = [];
641
+ const borders = this.formatting.borders;
642
+ if (borders.top) {
643
+ borderElements.push(XMLBuilder.createBorder('top', borders.top));
644
+ }
645
+ if (borders.left) {
646
+ borderElements.push(XMLBuilder.createBorder('left', borders.left));
647
+ }
648
+ if (borders.bottom) {
649
+ borderElements.push(XMLBuilder.createBorder('bottom', borders.bottom));
650
+ }
651
+ if (borders.right) {
652
+ borderElements.push(XMLBuilder.createBorder('right', borders.right));
653
+ }
654
+ if (borders.insideH) {
655
+ borderElements.push(XMLBuilder.createBorder('insideH', borders.insideH));
656
+ }
657
+ if (borders.insideV) {
658
+ borderElements.push(XMLBuilder.createBorder('insideV', borders.insideV));
659
+ }
660
+ if (borderElements.length > 0) {
661
+ tblPrChildren.push(XMLBuilder.w('tblBorders', undefined, borderElements));
662
+ }
663
+ }
664
+ if (this.formatting.shading) {
665
+ const shdAttrs = buildShadingAttributes(this.formatting.shading);
666
+ if (Object.keys(shdAttrs).length > 0) {
667
+ tblPrChildren.push(XMLBuilder.wSelf('shd', shdAttrs));
668
+ }
669
+ }
670
+ if (this.formatting.layout) {
671
+ tblPrChildren.push(XMLBuilder.wSelf('tblLayout', { 'w:type': this.formatting.layout }));
672
+ }
673
+ if (this.formatting.cellMargins) {
674
+ const marginElements = [];
675
+ if (this.formatting.cellMargins.top !== undefined) {
676
+ marginElements.push(XMLBuilder.wSelf('top', {
677
+ 'w:w': this.formatting.cellMargins.top,
678
+ 'w:type': 'dxa',
679
+ }));
680
+ }
681
+ if (this.formatting.cellMargins.left !== undefined) {
682
+ marginElements.push(XMLBuilder.wSelf('left', {
683
+ 'w:w': this.formatting.cellMargins.left,
684
+ 'w:type': 'dxa',
685
+ }));
686
+ }
687
+ if (this.formatting.cellMargins.bottom !== undefined) {
688
+ marginElements.push(XMLBuilder.wSelf('bottom', {
689
+ 'w:w': this.formatting.cellMargins.bottom,
690
+ 'w:type': 'dxa',
691
+ }));
692
+ }
693
+ if (this.formatting.cellMargins.right !== undefined) {
694
+ marginElements.push(XMLBuilder.wSelf('right', {
695
+ 'w:w': this.formatting.cellMargins.right,
696
+ 'w:type': 'dxa',
697
+ }));
698
+ }
699
+ if (marginElements.length > 0) {
700
+ tblPrChildren.push(XMLBuilder.w('tblCellMar', undefined, marginElements));
701
+ }
702
+ }
703
+ if (this.formatting.tblLook) {
704
+ tblPrChildren.push(XMLBuilder.wSelf('tblLook', buildTblLookAttributes(this.formatting.tblLook)));
705
+ }
706
+ if (this.formatting.caption) {
707
+ tblPrChildren.push(XMLBuilder.wSelf('tblCaption', { 'w:val': this.formatting.caption }));
708
+ }
709
+ if (this.formatting.description) {
710
+ tblPrChildren.push(XMLBuilder.wSelf('tblDescription', {
711
+ 'w:val': this.formatting.description,
712
+ }));
713
+ }
714
+ if (this.tblPrChange) {
715
+ const changeAttrs = {
716
+ 'w:id': this.tblPrChange.id,
717
+ 'w:author': this.tblPrChange.author,
718
+ 'w:date': this.tblPrChange.date,
719
+ };
720
+ const prevTblPrChildren = [];
721
+ const prev = this.tblPrChange.previousProperties;
722
+ if (prev) {
723
+ if (prev.style) {
724
+ prevTblPrChildren.push(XMLBuilder.wSelf('tblStyle', { 'w:val': prev.style }));
725
+ }
726
+ if (prev.position) {
727
+ const posAttrs = {};
728
+ const pos = prev.position;
729
+ if (pos.x !== undefined)
730
+ posAttrs['w:tblpX'] = pos.x;
731
+ if (pos.y !== undefined)
732
+ posAttrs['w:tblpY'] = pos.y;
733
+ if (pos.horizontalAnchor)
734
+ posAttrs['w:horzAnchor'] = pos.horizontalAnchor;
735
+ if (pos.verticalAnchor)
736
+ posAttrs['w:vertAnchor'] = pos.verticalAnchor;
737
+ if (pos.leftFromText !== undefined)
738
+ posAttrs['w:leftFromText'] = pos.leftFromText;
739
+ if (pos.rightFromText !== undefined)
740
+ posAttrs['w:rightFromText'] = pos.rightFromText;
741
+ if (pos.topFromText !== undefined)
742
+ posAttrs['w:topFromText'] = pos.topFromText;
743
+ if (pos.bottomFromText !== undefined)
744
+ posAttrs['w:bottomFromText'] = pos.bottomFromText;
745
+ if (Object.keys(posAttrs).length > 0) {
746
+ prevTblPrChildren.push(XMLBuilder.wSelf('tblpPr', posAttrs));
747
+ }
748
+ }
749
+ if (prev.overlap) {
750
+ prevTblPrChildren.push(XMLBuilder.wSelf('tblOverlap', { 'w:val': prev.overlap }));
751
+ }
752
+ if (prev.bidiVisual !== undefined) {
753
+ if (prev.bidiVisual) {
754
+ prevTblPrChildren.push(XMLBuilder.wSelf('bidiVisual'));
755
+ }
756
+ else {
757
+ prevTblPrChildren.push(XMLBuilder.wSelf('bidiVisual', { 'w:val': 'off' }));
758
+ }
759
+ }
760
+ if (prev.tblStyleRowBandSize !== undefined) {
761
+ prevTblPrChildren.push(XMLBuilder.wSelf('tblStyleRowBandSize', { 'w:val': prev.tblStyleRowBandSize }));
762
+ }
763
+ if (prev.tblStyleColBandSize !== undefined) {
764
+ prevTblPrChildren.push(XMLBuilder.wSelf('tblStyleColBandSize', { 'w:val': prev.tblStyleColBandSize }));
765
+ }
766
+ if (prev.width !== undefined) {
767
+ prevTblPrChildren.push(XMLBuilder.wSelf('tblW', {
768
+ 'w:w': prev.width,
769
+ 'w:type': prev.widthType || 'dxa',
770
+ }));
771
+ }
772
+ if (prev.alignment) {
773
+ prevTblPrChildren.push(XMLBuilder.wSelf('jc', { 'w:val': prev.alignment }));
774
+ }
775
+ if (prev.cellSpacing !== undefined) {
776
+ const csAttrs = {
777
+ 'w:w': prev.cellSpacing,
778
+ 'w:type': prev.cellSpacingType || 'dxa',
779
+ };
780
+ prevTblPrChildren.push(XMLBuilder.wSelf('tblCellSpacing', csAttrs));
781
+ }
782
+ if (prev.indent !== undefined) {
783
+ prevTblPrChildren.push(XMLBuilder.wSelf('tblInd', { 'w:w': prev.indent, 'w:type': prev.indentType || 'dxa' }));
784
+ }
785
+ if (prev.borders) {
786
+ const borderChildren = [];
787
+ const bNames = ['top', 'left', 'bottom', 'right', 'insideH', 'insideV'];
788
+ for (const name of bNames) {
789
+ const b = prev.borders[name];
790
+ if (b) {
791
+ const bAttrs = { 'w:val': b.style ?? 'nil' };
792
+ if (b.size !== undefined)
793
+ bAttrs['w:sz'] = b.size;
794
+ if (b.color)
795
+ bAttrs['w:color'] = b.color;
796
+ const bx = b;
797
+ if (bx.space !== undefined)
798
+ bAttrs['w:space'] = bx.space;
799
+ if (bx.themeColor)
800
+ bAttrs['w:themeColor'] = bx.themeColor;
801
+ if (bx.themeTint)
802
+ bAttrs['w:themeTint'] = bx.themeTint;
803
+ if (bx.themeShade)
804
+ bAttrs['w:themeShade'] = bx.themeShade;
805
+ if (bx.shadow !== undefined)
806
+ bAttrs['w:shadow'] = bx.shadow ? '1' : '0';
807
+ if (bx.frame !== undefined)
808
+ bAttrs['w:frame'] = bx.frame ? '1' : '0';
809
+ borderChildren.push(XMLBuilder.wSelf(name, bAttrs));
810
+ }
811
+ }
812
+ if (borderChildren.length > 0) {
813
+ prevTblPrChildren.push(XMLBuilder.w('tblBorders', undefined, borderChildren));
814
+ }
815
+ }
816
+ if (prev.shading) {
817
+ const shadingAttrs = buildShadingAttributes(prev.shading);
818
+ if (Object.keys(shadingAttrs).length > 0) {
819
+ prevTblPrChildren.push(XMLBuilder.wSelf('shd', shadingAttrs));
820
+ }
821
+ }
822
+ if (prev.layout) {
823
+ prevTblPrChildren.push(XMLBuilder.wSelf('tblLayout', { 'w:type': prev.layout }));
824
+ }
825
+ if (prev.cellMargins) {
826
+ const cmChildren = [];
827
+ if (prev.cellMargins.top !== undefined) {
828
+ cmChildren.push(XMLBuilder.wSelf('top', { 'w:w': prev.cellMargins.top, 'w:type': 'dxa' }));
829
+ }
830
+ if (prev.cellMargins.left !== undefined) {
831
+ cmChildren.push(XMLBuilder.wSelf('left', { 'w:w': prev.cellMargins.left, 'w:type': 'dxa' }));
832
+ }
833
+ if (prev.cellMargins.bottom !== undefined) {
834
+ cmChildren.push(XMLBuilder.wSelf('bottom', { 'w:w': prev.cellMargins.bottom, 'w:type': 'dxa' }));
835
+ }
836
+ if (prev.cellMargins.right !== undefined) {
837
+ cmChildren.push(XMLBuilder.wSelf('right', { 'w:w': prev.cellMargins.right, 'w:type': 'dxa' }));
838
+ }
839
+ if (cmChildren.length > 0) {
840
+ prevTblPrChildren.push(XMLBuilder.w('tblCellMar', undefined, cmChildren));
841
+ }
842
+ }
843
+ if (prev.tblLook) {
844
+ prevTblPrChildren.push(XMLBuilder.wSelf('tblLook', buildTblLookAttributes(prev.tblLook)));
845
+ }
846
+ if (prev.caption) {
847
+ prevTblPrChildren.push(XMLBuilder.wSelf('tblCaption', { 'w:val': prev.caption }));
848
+ }
849
+ if (prev.description) {
850
+ prevTblPrChildren.push(XMLBuilder.wSelf('tblDescription', { 'w:val': prev.description }));
851
+ }
852
+ }
853
+ const prevTblPr = XMLBuilder.w('tblPr', undefined, prevTblPrChildren);
854
+ tblPrChildren.push(XMLBuilder.w('tblPrChange', changeAttrs, [prevTblPr]));
855
+ }
856
+ const tableChildren = [];
857
+ tableChildren.push(XMLBuilder.w('tblPr', undefined, tblPrChildren));
858
+ const gridWidths = this.formatting.tableGrid;
859
+ const maxColumns = gridWidths
860
+ ? gridWidths.length
861
+ : Math.max(...this.rows.map((row) => row.getTotalGridSpan()), 0);
862
+ const gridColumnCount = maxColumns > 0 ? maxColumns : 1;
863
+ const tblGridChildren = [];
864
+ for (let i = 0; i < gridColumnCount; i++) {
865
+ if (gridWidths?.[i] !== undefined) {
866
+ tblGridChildren.push(XMLBuilder.wSelf('gridCol', { 'w:w': gridWidths[i] }));
867
+ }
868
+ else {
869
+ tblGridChildren.push(XMLBuilder.wSelf('gridCol', { 'w:w': 2880 }));
870
+ }
871
+ }
872
+ if (this.tblGridChange) {
873
+ tblGridChildren.push(this.tblGridChange.toXML());
874
+ }
875
+ tableChildren.push(XMLBuilder.w('tblGrid', undefined, tblGridChildren));
876
+ for (const row of this.rows) {
877
+ tableChildren.push(row.toXML());
878
+ }
879
+ return XMLBuilder.w('tbl', undefined, tableChildren);
880
+ }
881
+ removeRow(index) {
882
+ if (index >= 0 && index < this.rows.length) {
883
+ if (this.rows.length <= 1 && !this.trackingContext?.isEnabled()) {
884
+ return false;
885
+ }
886
+ if (this.trackingContext?.isEnabled()) {
887
+ const author = this.trackingContext.getAuthor();
888
+ const row = this.rows[index];
889
+ for (const cell of row.getCells()) {
890
+ const cellDelRevision = Revision.createTableCellDelete(author, []);
891
+ cell.setCellRevision(cellDelRevision);
892
+ for (const para of cell.getParagraphs()) {
893
+ const runs = para.getRuns();
894
+ if (runs.length > 0) {
895
+ const deletion = Revision.createDeletion(author, runs);
896
+ para.addRevision(deletion);
897
+ }
898
+ }
899
+ }
900
+ return true;
901
+ }
902
+ this.rows.splice(index, 1);
903
+ return true;
904
+ }
905
+ return false;
906
+ }
907
+ _removeRowAtIndex(index) {
908
+ if (index < 0 || index >= this.rows.length)
909
+ return false;
910
+ this.rows.splice(index, 1);
911
+ return true;
912
+ }
913
+ insertRow(index, row) {
914
+ if (index < 0)
915
+ index = 0;
916
+ if (index > this.rows.length)
917
+ index = this.rows.length;
918
+ if (!row) {
919
+ const gridColumns = this.formatting.tableGrid
920
+ ? this.formatting.tableGrid.length
921
+ : Math.max(...this.rows.map((r) => r.getTotalGridSpan()), 1);
922
+ row = new TableRow(gridColumns);
923
+ }
924
+ this.rows.splice(index, 0, row);
925
+ if (this.trackingContext?.isEnabled()) {
926
+ const author = this.trackingContext.getAuthor();
927
+ for (const cell of row.getCells()) {
928
+ const revision = Revision.createTableCellInsert(author, []);
929
+ cell.setCellRevision(revision);
930
+ }
931
+ }
932
+ return row;
933
+ }
934
+ addColumn(index) {
935
+ const isTracking = this.trackingContext?.isEnabled();
936
+ const author = isTracking ? this.trackingContext.getAuthor() : '';
937
+ for (const row of this.rows) {
938
+ const cell = new TableCell();
939
+ if (isTracking) {
940
+ const revision = Revision.createTableCellInsert(author, []);
941
+ cell.setCellRevision(revision);
942
+ }
943
+ const cells = row.getCells();
944
+ if (index === undefined || index >= cells.length) {
945
+ row.addCell(cell);
946
+ }
947
+ else {
948
+ const idx = Math.max(0, index);
949
+ row.insertCellAt(idx, cell);
950
+ }
951
+ }
952
+ return this;
953
+ }
954
+ removeColumn(index) {
955
+ if (index < 0 || this.rows.length === 0) {
956
+ return false;
957
+ }
958
+ if (this.trackingContext?.isEnabled()) {
959
+ const author = this.trackingContext.getAuthor();
960
+ let marked = false;
961
+ for (const row of this.rows) {
962
+ const cells = row.getCells();
963
+ if (index < cells.length) {
964
+ const revision = Revision.createTableCellDelete(author, []);
965
+ cells[index].setCellRevision(revision);
966
+ marked = true;
967
+ }
968
+ }
969
+ return marked;
970
+ }
971
+ let removed = false;
972
+ for (const row of this.rows) {
973
+ const cells = row.getCells();
974
+ if (index < cells.length) {
975
+ row.removeCellAt(index);
976
+ removed = true;
977
+ }
978
+ }
979
+ return removed;
980
+ }
981
+ getColumnCount() {
982
+ if (this.rows.length === 0) {
983
+ return 0;
984
+ }
985
+ return Math.max(...this.rows.map((row) => row.getCellCount()));
986
+ }
987
+ getColumnCells(colIndex) {
988
+ const cells = [];
989
+ for (const row of this.rows) {
990
+ const cell = row.getCell(colIndex);
991
+ if (cell)
992
+ cells.push(cell);
993
+ }
994
+ return cells;
995
+ }
996
+ getColumnTexts(colIndex) {
997
+ return this.getColumnCells(colIndex).map((cell) => cell.getText());
998
+ }
999
+ mapColumn(colIndex, transform) {
1000
+ for (let r = 0; r < this.rows.length; r++) {
1001
+ const cell = this.rows[r].getCell(colIndex);
1002
+ if (!cell)
1003
+ continue;
1004
+ const currentText = cell.getText();
1005
+ const newText = transform(currentText, r);
1006
+ if (newText !== currentText) {
1007
+ const paragraphs = cell.getParagraphs();
1008
+ if (paragraphs.length > 0) {
1009
+ const firstPara = paragraphs[0];
1010
+ firstPara.setText(newText);
1011
+ for (let p = paragraphs.length - 1; p >= 1; p--) {
1012
+ cell.removeParagraph(p);
1013
+ }
1014
+ }
1015
+ else {
1016
+ cell.createParagraph(newText);
1017
+ }
1018
+ }
1019
+ }
1020
+ return this;
1021
+ }
1022
+ forEachCell(callback) {
1023
+ for (let r = 0; r < this.rows.length; r++) {
1024
+ const cells = this.rows[r].getCells();
1025
+ for (let c = 0; c < cells.length; c++) {
1026
+ const result = callback(r, c, cells[c]);
1027
+ if (result === false)
1028
+ return;
1029
+ }
1030
+ }
1031
+ }
1032
+ findCell(predicate) {
1033
+ for (let r = 0; r < this.rows.length; r++) {
1034
+ const cells = this.rows[r].getCells();
1035
+ for (let c = 0; c < cells.length; c++) {
1036
+ if (predicate(cells[c], r, c)) {
1037
+ return { row: r, col: c, cell: cells[c] };
1038
+ }
1039
+ }
1040
+ }
1041
+ return undefined;
1042
+ }
1043
+ filterRows(predicate) {
1044
+ const indices = [];
1045
+ for (let r = 0; r < this.rows.length; r++) {
1046
+ if (predicate(this.rows[r].getCells(), r)) {
1047
+ indices.push(r);
1048
+ }
1049
+ }
1050
+ return indices;
1051
+ }
1052
+ removeEmptyRows() {
1053
+ const emptyIndices = this.filterRows((cells) => cells.every((c) => c.getText().trim() === ''));
1054
+ const toRemove = emptyIndices.length === this.rows.length
1055
+ ? emptyIndices.slice(1)
1056
+ : emptyIndices;
1057
+ for (let i = toRemove.length - 1; i >= 0; i--) {
1058
+ this.removeRow(toRemove[i]);
1059
+ }
1060
+ return toRemove.length;
1061
+ }
1062
+ removeEmptyColumns() {
1063
+ const colCount = this.getColumnCount();
1064
+ let removed = 0;
1065
+ for (let c = colCount - 1; c >= 0; c--) {
1066
+ const columnCells = this.getColumnCells(c);
1067
+ const isEmpty = columnCells.every((cell) => cell.getText().trim() === '');
1068
+ if (isEmpty) {
1069
+ this.removeColumn(c);
1070
+ removed++;
1071
+ }
1072
+ }
1073
+ return removed;
1074
+ }
1075
+ setColumnWidths(widths) {
1076
+ this.formatting.tableGrid = widths.map((w) => (w === null ? undefined : w));
1077
+ return this;
1078
+ }
1079
+ static create(rows, columns, formatting) {
1080
+ return new Table(rows, columns, formatting);
1081
+ }
1082
+ static fromArray(data, formatting) {
1083
+ if (data.length === 0)
1084
+ return new Table(0, 0, formatting);
1085
+ const maxCols = Math.max(...data.map((row) => row.length));
1086
+ const table = new Table(0, 0, formatting);
1087
+ for (const rowData of data) {
1088
+ const row = new TableRow();
1089
+ for (let c = 0; c < maxCols; c++) {
1090
+ const text = c < rowData.length ? rowData[c] : undefined;
1091
+ row.createCell(text || undefined);
1092
+ }
1093
+ table.addRow(row);
1094
+ }
1095
+ return table;
1096
+ }
1097
+ mergeCells(startRow, startCol, endRow, endCol) {
1098
+ if (startRow < 0 || endRow >= this.rows.length || startCol < 0 || endCol < 0) {
1099
+ return this;
1100
+ }
1101
+ if (endRow < startRow || endCol < startCol) {
1102
+ return this;
1103
+ }
1104
+ const cell = this.getCell(startRow, startCol);
1105
+ if (!cell) {
1106
+ return this;
1107
+ }
1108
+ for (let row = startRow; row <= endRow; row++) {
1109
+ for (let col = startCol; col <= endCol; col++) {
1110
+ const checkCell = this.getCell(row, col);
1111
+ if (!checkCell)
1112
+ continue;
1113
+ const vMerge = checkCell.getVerticalMerge();
1114
+ if (vMerge) {
1115
+ if (row === startRow && col === startCol && vMerge === 'restart') {
1116
+ continue;
1117
+ }
1118
+ throw new Error(`Cannot merge cells: Cell at row ${row}, column ${col} is already part of a vertical merge region. ` +
1119
+ `Use splitCell() or clear existing merges before creating new merge regions.`);
1120
+ }
1121
+ const colSpan = checkCell.getColumnSpan();
1122
+ if (colSpan > 1) {
1123
+ if (row === startRow && col === startCol) {
1124
+ continue;
1125
+ }
1126
+ throw new Error(`Cannot merge cells: Cell at row ${row}, column ${col} already has a column span of ${colSpan}. ` +
1127
+ `Use splitCell() or clear existing merges before creating new merge regions.`);
1128
+ }
1129
+ }
1130
+ }
1131
+ if (endCol > startCol) {
1132
+ cell.setColumnSpan(endCol - startCol + 1);
1133
+ }
1134
+ if (endRow > startRow) {
1135
+ cell.setVerticalMerge('restart');
1136
+ for (let row = startRow + 1; row <= endRow; row++) {
1137
+ const mergeCell = this.getCell(row, startCol);
1138
+ if (mergeCell) {
1139
+ mergeCell.setVerticalMerge('continue');
1140
+ if (endCol > startCol) {
1141
+ mergeCell.setColumnSpan(endCol - startCol + 1);
1142
+ }
1143
+ }
1144
+ }
1145
+ }
1146
+ if (this.trackingContext?.isEnabled()) {
1147
+ const author = this.trackingContext.getAuthor();
1148
+ for (let row = startRow; row <= endRow; row++) {
1149
+ for (let col = startCol; col <= endCol; col++) {
1150
+ if (row === startRow && col === startCol)
1151
+ continue;
1152
+ const absorbedCell = this.getCell(row, col);
1153
+ if (absorbedCell) {
1154
+ const revision = Revision.createTableCellMerge(author, []);
1155
+ absorbedCell.setCellRevision(revision);
1156
+ }
1157
+ }
1158
+ }
1159
+ }
1160
+ return this;
1161
+ }
1162
+ splitCell(row, col) {
1163
+ const cell = this.getCell(row, col);
1164
+ if (cell) {
1165
+ cell.setColumnSpan(1);
1166
+ cell.setVerticalMerge(undefined);
1167
+ }
1168
+ return this;
1169
+ }
1170
+ canMergeCells(startRow, startCol, endRow, endCol) {
1171
+ const conflicts = [];
1172
+ if (startRow < 0 ||
1173
+ endRow >= this.rows.length ||
1174
+ startCol < 0 ||
1175
+ endCol < 0 ||
1176
+ endRow < startRow ||
1177
+ endCol < startCol) {
1178
+ conflicts.push('Invalid cell range specified');
1179
+ return { valid: false, conflicts };
1180
+ }
1181
+ for (let row = startRow; row <= endRow; row++) {
1182
+ for (let col = startCol; col <= endCol; col++) {
1183
+ const checkCell = this.getCell(row, col);
1184
+ if (!checkCell) {
1185
+ conflicts.push(`Cell at row ${row}, column ${col} does not exist`);
1186
+ continue;
1187
+ }
1188
+ const vMerge = checkCell.getVerticalMerge();
1189
+ if (vMerge) {
1190
+ if (!(row === startRow && col === startCol && vMerge === 'restart')) {
1191
+ conflicts.push(`Cell at row ${row}, column ${col} is part of a vertical merge (${vMerge})`);
1192
+ }
1193
+ }
1194
+ const colSpan = checkCell.getColumnSpan();
1195
+ if (colSpan > 1) {
1196
+ if (!(row === startRow && col === startCol)) {
1197
+ conflicts.push(`Cell at row ${row}, column ${col} has column span of ${colSpan}`);
1198
+ }
1199
+ }
1200
+ }
1201
+ }
1202
+ return { valid: conflicts.length === 0, conflicts };
1203
+ }
1204
+ moveCell(fromRow, fromCol, toRow, toCol) {
1205
+ const fromCell = this.getCell(fromRow, fromCol);
1206
+ const toCell = this.getCell(toRow, toCol);
1207
+ if (!fromCell || !toCell) {
1208
+ return this;
1209
+ }
1210
+ const paragraphs = fromCell.getParagraphs();
1211
+ for (const para of paragraphs) {
1212
+ toCell.addParagraph(para);
1213
+ }
1214
+ const formatting = fromCell.getFormatting();
1215
+ if (formatting.shading)
1216
+ toCell.setShading(formatting.shading);
1217
+ if (formatting.borders)
1218
+ toCell.setBorders(formatting.borders);
1219
+ if (formatting.width)
1220
+ toCell.setWidth(formatting.width);
1221
+ if (formatting.verticalAlignment)
1222
+ toCell.setVerticalAlignment(formatting.verticalAlignment);
1223
+ const row = this.getRow(fromRow);
1224
+ if (row) {
1225
+ const cells = row.getCells();
1226
+ cells[fromCol] = new TableCell();
1227
+ }
1228
+ return this;
1229
+ }
1230
+ swapCells(row1, col1, row2, col2) {
1231
+ const row1Obj = this.getRow(row1);
1232
+ const row2Obj = this.getRow(row2);
1233
+ if (!row1Obj || !row2Obj) {
1234
+ return this;
1235
+ }
1236
+ const cells1 = row1Obj.getCells();
1237
+ const cells2 = row2Obj.getCells();
1238
+ if (col1 >= cells1.length || col2 >= cells2.length) {
1239
+ return this;
1240
+ }
1241
+ const temp = cells1[col1];
1242
+ cells1[col1] = cells2[col2];
1243
+ cells2[col2] = temp;
1244
+ return this;
1245
+ }
1246
+ setColumnWidth(columnIndex, width) {
1247
+ const tableGrid = this.formatting.tableGrid || [];
1248
+ tableGrid[columnIndex] = width;
1249
+ this.formatting.tableGrid = tableGrid;
1250
+ return this;
1251
+ }
1252
+ insertRows(startIndex, count) {
1253
+ const insertedRows = [];
1254
+ const columnCount = this.formatting.tableGrid
1255
+ ? this.formatting.tableGrid.length
1256
+ : Math.max(...this.rows.map((r) => r.getTotalGridSpan()), 1);
1257
+ for (let i = 0; i < count; i++) {
1258
+ const row = new TableRow(columnCount);
1259
+ this.insertRow(startIndex + i, row);
1260
+ insertedRows.push(row);
1261
+ }
1262
+ return insertedRows;
1263
+ }
1264
+ removeRows(startIndex, count) {
1265
+ if (startIndex < 0 || startIndex >= this.rows.length || count <= 0) {
1266
+ return false;
1267
+ }
1268
+ const actualCount = Math.min(count, this.rows.length - startIndex);
1269
+ if (this.trackingContext?.isEnabled()) {
1270
+ const author = this.trackingContext.getAuthor();
1271
+ for (let i = startIndex; i < startIndex + actualCount; i++) {
1272
+ const row = this.rows[i];
1273
+ for (const cell of row.getCells()) {
1274
+ const cellDelRevision = Revision.createTableCellDelete(author, []);
1275
+ cell.setCellRevision(cellDelRevision);
1276
+ for (const para of cell.getParagraphs()) {
1277
+ const runs = para.getRuns();
1278
+ if (runs.length > 0) {
1279
+ const deletion = Revision.createDeletion(author, runs);
1280
+ para.addRevision(deletion);
1281
+ }
1282
+ }
1283
+ }
1284
+ }
1285
+ return true;
1286
+ }
1287
+ this.rows.splice(startIndex, actualCount);
1288
+ return actualCount > 0;
1289
+ }
1290
+ sortRows(columnIndex, options) {
1291
+ const ascending = options?.ascending ?? true;
1292
+ const numeric = options?.numeric ?? false;
1293
+ const skipHeaderRow = options?.skipHeaderRow ?? true;
1294
+ if (this.rows.length <= 1) {
1295
+ return this;
1296
+ }
1297
+ const headerRow = skipHeaderRow ? this.rows.shift() : null;
1298
+ const rowsToSort = [...this.rows];
1299
+ rowsToSort.sort((a, b) => {
1300
+ const cellA = a.getCell(columnIndex);
1301
+ const cellB = b.getCell(columnIndex);
1302
+ const textA = cellA?.getText().trim() || '';
1303
+ const textB = cellB?.getText().trim() || '';
1304
+ let comparison;
1305
+ if (numeric) {
1306
+ const numA = parseFloat(textA) || 0;
1307
+ const numB = parseFloat(textB) || 0;
1308
+ comparison = numA - numB;
1309
+ }
1310
+ else {
1311
+ comparison = textA.localeCompare(textB);
1312
+ }
1313
+ return ascending ? comparison : -comparison;
1314
+ });
1315
+ this.rows = headerRow ? [headerRow, ...rowsToSort] : rowsToSort;
1316
+ return this;
1317
+ }
1318
+ toArray() {
1319
+ return this.rows.map((row) => row.getCells().map((cell) => cell.getText()));
1320
+ }
1321
+ toPlainText(columnSeparator = '\t', rowSeparator = '\n') {
1322
+ return this.rows
1323
+ .map((row) => row
1324
+ .getCells()
1325
+ .map((cell) => cell.getText())
1326
+ .join(columnSeparator))
1327
+ .join(rowSeparator);
1328
+ }
1329
+ toCSV(delimiter = ',') {
1330
+ return this.rows
1331
+ .map((row) => row
1332
+ .getCells()
1333
+ .map((cell) => {
1334
+ const text = cell.getText();
1335
+ if (text.includes(delimiter) || text.includes('"') || text.includes('\n')) {
1336
+ return '"' + text.replace(/"/g, '""') + '"';
1337
+ }
1338
+ return text;
1339
+ })
1340
+ .join(delimiter))
1341
+ .join('\n');
1342
+ }
1343
+ static fromCSV(csv, delimiter = ',', formatting) {
1344
+ const rows = [];
1345
+ let currentRow = [];
1346
+ let currentField = '';
1347
+ let inQuotes = false;
1348
+ let i = 0;
1349
+ while (i < csv.length) {
1350
+ const ch = csv[i];
1351
+ if (inQuotes) {
1352
+ if (ch === '"') {
1353
+ if (i + 1 < csv.length && csv[i + 1] === '"') {
1354
+ currentField += '"';
1355
+ i += 2;
1356
+ }
1357
+ else {
1358
+ inQuotes = false;
1359
+ i++;
1360
+ }
1361
+ }
1362
+ else {
1363
+ currentField += ch;
1364
+ i++;
1365
+ }
1366
+ }
1367
+ else {
1368
+ if (ch === '"') {
1369
+ inQuotes = true;
1370
+ i++;
1371
+ }
1372
+ else if (ch === delimiter) {
1373
+ currentRow.push(currentField);
1374
+ currentField = '';
1375
+ i++;
1376
+ }
1377
+ else if (ch === '\n') {
1378
+ currentRow.push(currentField);
1379
+ currentField = '';
1380
+ rows.push(currentRow);
1381
+ currentRow = [];
1382
+ i++;
1383
+ }
1384
+ else if (ch === '\r') {
1385
+ if (i + 1 < csv.length && csv[i + 1] === '\n') {
1386
+ i++;
1387
+ }
1388
+ currentRow.push(currentField);
1389
+ currentField = '';
1390
+ rows.push(currentRow);
1391
+ currentRow = [];
1392
+ i++;
1393
+ }
1394
+ else {
1395
+ currentField += ch;
1396
+ i++;
1397
+ }
1398
+ }
1399
+ }
1400
+ if (currentField || currentRow.length > 0) {
1401
+ currentRow.push(currentField);
1402
+ rows.push(currentRow);
1403
+ }
1404
+ if (rows.length === 0)
1405
+ return new Table(0, 0, formatting);
1406
+ return Table.fromArray(rows, formatting);
1407
+ }
1408
+ transpose() {
1409
+ const srcRows = this.rows.length;
1410
+ if (srcRows === 0)
1411
+ return new Table(0, 0);
1412
+ const srcCols = this.getColumnCount();
1413
+ if (srcCols === 0)
1414
+ return new Table(0, 0);
1415
+ const transposed = new Table(0, 0);
1416
+ for (let c = 0; c < srcCols; c++) {
1417
+ const newRow = new TableRow();
1418
+ for (let r = 0; r < srcRows; r++) {
1419
+ const srcCell = this.getCell(r, c);
1420
+ if (srcCell) {
1421
+ newRow.addCell(srcCell.clone());
1422
+ }
1423
+ else {
1424
+ newRow.createCell();
1425
+ }
1426
+ }
1427
+ transposed.addRow(newRow);
1428
+ }
1429
+ return transposed;
1430
+ }
1431
+ clone() {
1432
+ const clonedFormatting = deepClone(this.formatting);
1433
+ const clonedTable = new Table(0, 0, clonedFormatting);
1434
+ for (const row of this.rows) {
1435
+ clonedTable.addRow(row.clone());
1436
+ }
1437
+ return clonedTable;
1438
+ }
1439
+ duplicateRow(rowIndex, count = 1) {
1440
+ if (rowIndex < 0 || rowIndex >= this.rows.length) {
1441
+ throw new RangeError(`Row index ${rowIndex} is out of bounds (0-${this.rows.length - 1})`);
1442
+ }
1443
+ if (count < 1)
1444
+ return [];
1445
+ const sourceRow = this.rows[rowIndex];
1446
+ const inserted = [];
1447
+ for (let i = 0; i < count; i++) {
1448
+ const clonedRow = sourceRow.clone();
1449
+ this.rows.splice(rowIndex + 1 + i, 0, clonedRow);
1450
+ clonedRow._setParentTable(this);
1451
+ inserted.push(clonedRow);
1452
+ }
1453
+ return inserted;
1454
+ }
1455
+ }
1456
+ //# sourceMappingURL=Table.js.map