docxmlater 10.0.2 → 10.0.3

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 (393) hide show
  1. package/README.md +2 -2
  2. package/dist/constants/legacyCompatFlags.d.ts.map +1 -1
  3. package/dist/constants/legacyCompatFlags.js.map +1 -1
  4. package/dist/constants/limits.d.ts +0 -27
  5. package/dist/constants/limits.d.ts.map +1 -1
  6. package/dist/constants/limits.js +13 -13
  7. package/dist/constants/limits.js.map +1 -1
  8. package/dist/core/Document.d.ts +23 -19
  9. package/dist/core/Document.d.ts.map +1 -1
  10. package/dist/core/Document.js +197 -63
  11. package/dist/core/Document.js.map +1 -1
  12. package/dist/core/DocumentContent.d.ts.map +1 -1
  13. package/dist/core/DocumentContent.js.map +1 -1
  14. package/dist/core/DocumentGenerator.d.ts.map +1 -1
  15. package/dist/core/DocumentGenerator.js +59 -24
  16. package/dist/core/DocumentGenerator.js.map +1 -1
  17. package/dist/core/DocumentIdManager.d.ts.map +1 -1
  18. package/dist/core/DocumentIdManager.js.map +1 -1
  19. package/dist/core/DocumentParser.d.ts +6 -6
  20. package/dist/core/DocumentParser.d.ts.map +1 -1
  21. package/dist/core/DocumentParser.js +60 -54
  22. package/dist/core/DocumentParser.js.map +1 -1
  23. package/dist/core/DocumentValidator.d.ts.map +1 -1
  24. package/dist/core/DocumentValidator.js.map +1 -1
  25. package/dist/core/Relationship.d.ts.map +1 -1
  26. package/dist/core/Relationship.js +1 -1
  27. package/dist/core/Relationship.js.map +1 -1
  28. package/dist/core/RelationshipManager.js +3 -3
  29. package/dist/core/RelationshipManager.js.map +1 -1
  30. package/dist/elements/AlternateContent.js.map +1 -1
  31. package/dist/elements/Bookmark.d.ts.map +1 -1
  32. package/dist/elements/Bookmark.js.map +1 -1
  33. package/dist/elements/BookmarkManager.d.ts.map +1 -1
  34. package/dist/elements/BookmarkManager.js.map +1 -1
  35. package/dist/elements/Comment.js +1 -1
  36. package/dist/elements/Comment.js.map +1 -1
  37. package/dist/elements/CommentManager.d.ts.map +1 -1
  38. package/dist/elements/CommentManager.js +8 -2
  39. package/dist/elements/CommentManager.js.map +1 -1
  40. package/dist/elements/CommonTypes.d.ts.map +1 -1
  41. package/dist/elements/CommonTypes.js +1 -2
  42. package/dist/elements/CommonTypes.js.map +1 -1
  43. package/dist/elements/CustomXml.js.map +1 -1
  44. package/dist/elements/Endnote.d.ts.map +1 -1
  45. package/dist/elements/Endnote.js.map +1 -1
  46. package/dist/elements/EndnoteManager.d.ts.map +1 -1
  47. package/dist/elements/EndnoteManager.js.map +1 -1
  48. package/dist/elements/Field.d.ts.map +1 -1
  49. package/dist/elements/Field.js +31 -28
  50. package/dist/elements/Field.js.map +1 -1
  51. package/dist/elements/FieldHelpers.d.ts.map +1 -1
  52. package/dist/elements/FieldHelpers.js +6 -6
  53. package/dist/elements/FieldHelpers.js.map +1 -1
  54. package/dist/elements/FontManager.d.ts.map +1 -1
  55. package/dist/elements/FontManager.js.map +1 -1
  56. package/dist/elements/Footer.js.map +1 -1
  57. package/dist/elements/Footnote.d.ts.map +1 -1
  58. package/dist/elements/Footnote.js.map +1 -1
  59. package/dist/elements/FootnoteManager.d.ts.map +1 -1
  60. package/dist/elements/FootnoteManager.js.map +1 -1
  61. package/dist/elements/Header.js.map +1 -1
  62. package/dist/elements/HeaderFooterManager.js.map +1 -1
  63. package/dist/elements/Hyperlink.d.ts.map +1 -1
  64. package/dist/elements/Hyperlink.js +5 -5
  65. package/dist/elements/Hyperlink.js.map +1 -1
  66. package/dist/elements/Image.d.ts +2 -2
  67. package/dist/elements/Image.d.ts.map +1 -1
  68. package/dist/elements/Image.js +21 -5
  69. package/dist/elements/Image.js.map +1 -1
  70. package/dist/elements/ImageManager.d.ts.map +1 -1
  71. package/dist/elements/ImageManager.js +2 -2
  72. package/dist/elements/ImageManager.js.map +1 -1
  73. package/dist/elements/ImageRun.js.map +1 -1
  74. package/dist/elements/MathElement.js.map +1 -1
  75. package/dist/elements/Paragraph.d.ts.map +1 -1
  76. package/dist/elements/Paragraph.js +128 -117
  77. package/dist/elements/Paragraph.js.map +1 -1
  78. package/dist/elements/PreservedElement.js.map +1 -1
  79. package/dist/elements/PropertyChangeTypes.js.map +1 -1
  80. package/dist/elements/RangeMarker.js.map +1 -1
  81. package/dist/elements/Revision.d.ts +1 -0
  82. package/dist/elements/Revision.d.ts.map +1 -1
  83. package/dist/elements/Revision.js +44 -5
  84. package/dist/elements/Revision.js.map +1 -1
  85. package/dist/elements/RevisionContent.js.map +1 -1
  86. package/dist/elements/RevisionManager.d.ts.map +1 -1
  87. package/dist/elements/RevisionManager.js.map +1 -1
  88. package/dist/elements/Run.d.ts.map +1 -1
  89. package/dist/elements/Run.js +1 -3
  90. package/dist/elements/Run.js.map +1 -1
  91. package/dist/elements/Section.d.ts.map +1 -1
  92. package/dist/elements/Section.js +127 -118
  93. package/dist/elements/Section.js.map +1 -1
  94. package/dist/elements/Shape.d.ts.map +1 -1
  95. package/dist/elements/Shape.js +21 -0
  96. package/dist/elements/Shape.js.map +1 -1
  97. package/dist/elements/StructuredDocumentTag.d.ts.map +1 -1
  98. package/dist/elements/StructuredDocumentTag.js +20 -8
  99. package/dist/elements/StructuredDocumentTag.js.map +1 -1
  100. package/dist/elements/Table.d.ts +2 -2
  101. package/dist/elements/Table.d.ts.map +1 -1
  102. package/dist/elements/Table.js +29 -35
  103. package/dist/elements/Table.js.map +1 -1
  104. package/dist/elements/TableCell.d.ts +2 -2
  105. package/dist/elements/TableCell.d.ts.map +1 -1
  106. package/dist/elements/TableCell.js +63 -67
  107. package/dist/elements/TableCell.js.map +1 -1
  108. package/dist/elements/TableGridChange.js.map +1 -1
  109. package/dist/elements/TableOfContents.d.ts +6 -6
  110. package/dist/elements/TableOfContents.d.ts.map +1 -1
  111. package/dist/elements/TableOfContents.js.map +1 -1
  112. package/dist/elements/TableOfContentsElement.js.map +1 -1
  113. package/dist/elements/TableRow.d.ts.map +1 -1
  114. package/dist/elements/TableRow.js +65 -47
  115. package/dist/elements/TableRow.js.map +1 -1
  116. package/dist/elements/TextBox.d.ts.map +1 -1
  117. package/dist/elements/TextBox.js +1 -1
  118. package/dist/elements/TextBox.js.map +1 -1
  119. package/dist/formatting/AbstractNumbering.d.ts +1 -1
  120. package/dist/formatting/AbstractNumbering.d.ts.map +1 -1
  121. package/dist/formatting/AbstractNumbering.js +11 -11
  122. package/dist/formatting/AbstractNumbering.js.map +1 -1
  123. package/dist/formatting/NumberingInstance.d.ts.map +1 -1
  124. package/dist/formatting/NumberingInstance.js +4 -4
  125. package/dist/formatting/NumberingInstance.js.map +1 -1
  126. package/dist/formatting/NumberingLevel.d.ts.map +1 -1
  127. package/dist/formatting/NumberingLevel.js +26 -26
  128. package/dist/formatting/NumberingLevel.js.map +1 -1
  129. package/dist/formatting/NumberingManager.d.ts +1 -1
  130. package/dist/formatting/NumberingManager.d.ts.map +1 -1
  131. package/dist/formatting/NumberingManager.js.map +1 -1
  132. package/dist/formatting/Style.d.ts.map +1 -1
  133. package/dist/formatting/Style.js +87 -95
  134. package/dist/formatting/Style.js.map +1 -1
  135. package/dist/formatting/StylesManager.d.ts +3 -3
  136. package/dist/formatting/StylesManager.d.ts.map +1 -1
  137. package/dist/formatting/StylesManager.js.map +1 -1
  138. package/dist/helpers/CleanupHelper.js.map +1 -1
  139. package/dist/images/ImageOptimizer.js.map +1 -1
  140. package/dist/index.js.map +1 -1
  141. package/dist/managers/DrawingManager.d.ts.map +1 -1
  142. package/dist/managers/DrawingManager.js.map +1 -1
  143. package/dist/tracking/DocumentTrackingContext.js.map +1 -1
  144. package/dist/tracking/TrackingContext.js.map +1 -1
  145. package/dist/types/compatibility-types.js.map +1 -1
  146. package/dist/types/formatting.js.map +1 -1
  147. package/dist/types/list-types.d.ts +4 -4
  148. package/dist/types/list-types.d.ts.map +1 -1
  149. package/dist/types/list-types.js.map +1 -1
  150. package/dist/types/settings-types.js.map +1 -1
  151. package/dist/types/styleConfig.js.map +1 -1
  152. package/dist/utils/ChangelogGenerator.d.ts.map +1 -1
  153. package/dist/utils/ChangelogGenerator.js.map +1 -1
  154. package/dist/utils/CompatibilityUpgrader.d.ts.map +1 -1
  155. package/dist/utils/CompatibilityUpgrader.js +7 -7
  156. package/dist/utils/CompatibilityUpgrader.js.map +1 -1
  157. package/dist/utils/InMemoryRevisionAcceptor.js +1 -1
  158. package/dist/utils/InMemoryRevisionAcceptor.js.map +1 -1
  159. package/dist/utils/MoveOperationHelper.js.map +1 -1
  160. package/dist/utils/RevisionAwareProcessor.js.map +1 -1
  161. package/dist/utils/RevisionWalker.js.map +1 -1
  162. package/dist/utils/SelectiveRevisionAcceptor.js.map +1 -1
  163. package/dist/utils/ShadingResolver.js +1 -1
  164. package/dist/utils/ShadingResolver.js.map +1 -1
  165. package/dist/utils/acceptRevisions.d.ts +0 -28
  166. package/dist/utils/acceptRevisions.d.ts.map +1 -1
  167. package/dist/utils/acceptRevisions.js +5 -7
  168. package/dist/utils/acceptRevisions.js.map +1 -1
  169. package/dist/utils/cnfStyleDecoder.js +1 -1
  170. package/dist/utils/cnfStyleDecoder.js.map +1 -1
  171. package/dist/utils/corruptionDetection.js.map +1 -1
  172. package/dist/utils/dateFormatting.js.map +1 -1
  173. package/dist/utils/deepClone.d.ts +0 -1
  174. package/dist/utils/deepClone.d.ts.map +1 -1
  175. package/dist/utils/deepClone.js +0 -7
  176. package/dist/utils/deepClone.js.map +1 -1
  177. package/dist/utils/diagnostics.d.ts +2 -2
  178. package/dist/utils/diagnostics.d.ts.map +1 -1
  179. package/dist/utils/diagnostics.js.map +1 -1
  180. package/dist/utils/errorHandling.js.map +1 -1
  181. package/dist/utils/formatting.js.map +1 -1
  182. package/dist/utils/list-detection.d.ts +2 -2
  183. package/dist/utils/list-detection.d.ts.map +1 -1
  184. package/dist/utils/list-detection.js +3 -3
  185. package/dist/utils/list-detection.js.map +1 -1
  186. package/dist/utils/logger.d.ts +2 -4
  187. package/dist/utils/logger.d.ts.map +1 -1
  188. package/dist/utils/logger.js +0 -2
  189. package/dist/utils/logger.js.map +1 -1
  190. package/dist/utils/parsingHelpers.js.map +1 -1
  191. package/dist/utils/stripTrackedChanges.d.ts +0 -19
  192. package/dist/utils/stripTrackedChanges.d.ts.map +1 -1
  193. package/dist/utils/stripTrackedChanges.js +0 -2
  194. package/dist/utils/stripTrackedChanges.js.map +1 -1
  195. package/dist/utils/textDiff.js.map +1 -1
  196. package/dist/utils/units.js.map +1 -1
  197. package/dist/utils/validation.d.ts.map +1 -1
  198. package/dist/utils/validation.js.map +1 -1
  199. package/dist/utils/xmlSanitization.js.map +1 -1
  200. package/dist/validation/RevisionAutoFixer.js.map +1 -1
  201. package/dist/validation/RevisionValidator.js.map +1 -1
  202. package/dist/validation/ValidationRules.js.map +1 -1
  203. package/dist/validation/index.js.map +1 -1
  204. package/dist/xml/XMLBuilder.d.ts.map +1 -1
  205. package/dist/xml/XMLBuilder.js +10 -0
  206. package/dist/xml/XMLBuilder.js.map +1 -1
  207. package/dist/xml/XMLParser.d.ts.map +1 -1
  208. package/dist/xml/XMLParser.js +4 -5
  209. package/dist/xml/XMLParser.js.map +1 -1
  210. package/dist/zip/ZipHandler.js.map +1 -1
  211. package/dist/zip/ZipReader.js.map +1 -1
  212. package/dist/zip/ZipWriter.js.map +1 -1
  213. package/dist/zip/errors.js.map +1 -1
  214. package/dist/zip/types.js.map +1 -1
  215. package/package.json +34 -4
  216. package/src/__tests__/helper-methods.test.ts +512 -0
  217. package/src/constants/legacyCompatFlags.ts +138 -0
  218. package/src/constants/limits.ts +50 -0
  219. package/src/core/CLAUDE.md +109 -0
  220. package/src/core/Document.ts +15569 -0
  221. package/src/core/DocumentContent.ts +467 -0
  222. package/src/core/DocumentGenerator.ts +1104 -0
  223. package/src/core/DocumentIdManager.ts +158 -0
  224. package/src/core/DocumentParser.ts +10107 -0
  225. package/src/core/DocumentValidator.ts +372 -0
  226. package/src/core/Relationship.ts +367 -0
  227. package/src/core/RelationshipManager.ts +428 -0
  228. package/src/elements/AlternateContent.ts +42 -0
  229. package/src/elements/Bookmark.ts +210 -0
  230. package/src/elements/BookmarkManager.ts +250 -0
  231. package/src/elements/CLAUDE.md +126 -0
  232. package/src/elements/Comment.ts +359 -0
  233. package/src/elements/CommentManager.ts +502 -0
  234. package/src/elements/CommonTypes.ts +549 -0
  235. package/src/elements/CustomXml.ts +36 -0
  236. package/src/elements/Endnote.ts +217 -0
  237. package/src/elements/EndnoteManager.ts +249 -0
  238. package/src/elements/Field.ts +1233 -0
  239. package/src/elements/FieldHelpers.ts +333 -0
  240. package/src/elements/FontManager.ts +339 -0
  241. package/src/elements/Footer.ts +269 -0
  242. package/src/elements/Footnote.ts +217 -0
  243. package/src/elements/FootnoteManager.ts +249 -0
  244. package/src/elements/Header.ts +269 -0
  245. package/src/elements/HeaderFooterManager.ts +219 -0
  246. package/src/elements/Hyperlink.ts +1146 -0
  247. package/src/elements/Image.ts +1756 -0
  248. package/src/elements/ImageManager.ts +432 -0
  249. package/src/elements/ImageRun.ts +59 -0
  250. package/src/elements/MathElement.ts +65 -0
  251. package/src/elements/Paragraph.ts +4227 -0
  252. package/src/elements/PreservedElement.ts +53 -0
  253. package/src/elements/PropertyChangeTypes.ts +442 -0
  254. package/src/elements/RangeMarker.ts +400 -0
  255. package/src/elements/Revision.ts +1217 -0
  256. package/src/elements/RevisionContent.ts +73 -0
  257. package/src/elements/RevisionManager.ts +1070 -0
  258. package/src/elements/Run.ts +3068 -0
  259. package/src/elements/Section.ts +1421 -0
  260. package/src/elements/Shape.ts +873 -0
  261. package/src/elements/StructuredDocumentTag.ts +978 -0
  262. package/src/elements/Table.ts +2524 -0
  263. package/src/elements/TableCell.ts +1586 -0
  264. package/src/elements/TableGridChange.ts +151 -0
  265. package/src/elements/TableOfContents.ts +691 -0
  266. package/src/elements/TableOfContentsElement.ts +89 -0
  267. package/src/elements/TableRow.ts +906 -0
  268. package/src/elements/TextBox.ts +768 -0
  269. package/src/formatting/AbstractNumbering.ts +548 -0
  270. package/src/formatting/CLAUDE.md +74 -0
  271. package/src/formatting/NumberingInstance.ts +212 -0
  272. package/src/formatting/NumberingLevel.ts +1006 -0
  273. package/src/formatting/NumberingManager.ts +827 -0
  274. package/src/formatting/Style.ts +1833 -0
  275. package/src/formatting/StylesManager.ts +1005 -0
  276. package/src/helpers/CleanupHelper.ts +524 -0
  277. package/src/images/ImageOptimizer.ts +274 -0
  278. package/src/index.ts +554 -0
  279. package/src/managers/CLAUDE.md +47 -0
  280. package/src/managers/DrawingManager.ts +319 -0
  281. package/src/tracking/DocumentTrackingContext.ts +643 -0
  282. package/src/tracking/TrackingContext.ts +173 -0
  283. package/src/types/compatibility-types.ts +49 -0
  284. package/src/types/formatting.ts +210 -0
  285. package/src/types/list-types.ts +152 -0
  286. package/src/types/settings-types.ts +59 -0
  287. package/src/types/styleConfig.ts +189 -0
  288. package/src/utils/CLAUDE.md +153 -0
  289. package/src/utils/ChangelogGenerator.ts +1581 -0
  290. package/src/utils/CompatibilityUpgrader.ts +237 -0
  291. package/src/utils/InMemoryRevisionAcceptor.ts +668 -0
  292. package/src/utils/MoveOperationHelper.ts +238 -0
  293. package/src/utils/RevisionAwareProcessor.ts +526 -0
  294. package/src/utils/RevisionWalker.ts +457 -0
  295. package/src/utils/SelectiveRevisionAcceptor.ts +613 -0
  296. package/src/utils/ShadingResolver.ts +107 -0
  297. package/src/utils/acceptRevisions.ts +714 -0
  298. package/src/utils/cnfStyleDecoder.ts +217 -0
  299. package/src/utils/corruptionDetection.ts +345 -0
  300. package/src/utils/dateFormatting.ts +20 -0
  301. package/src/utils/deepClone.ts +78 -0
  302. package/src/utils/diagnostics.ts +129 -0
  303. package/src/utils/errorHandling.ts +80 -0
  304. package/src/utils/formatting.ts +213 -0
  305. package/src/utils/list-detection.ts +274 -0
  306. package/src/utils/logger.ts +404 -0
  307. package/src/utils/parsingHelpers.ts +190 -0
  308. package/src/utils/stripTrackedChanges.ts +353 -0
  309. package/src/utils/textDiff.ts +100 -0
  310. package/src/utils/units.ts +421 -0
  311. package/src/utils/validation.ts +542 -0
  312. package/src/utils/xmlSanitization.ts +182 -0
  313. package/src/validation/RevisionAutoFixer.ts +542 -0
  314. package/src/validation/RevisionValidator.ts +460 -0
  315. package/src/validation/ValidationRules.ts +338 -0
  316. package/src/validation/index.ts +30 -0
  317. package/src/xml/CLAUDE.md +65 -0
  318. package/src/xml/XMLBuilder.ts +871 -0
  319. package/src/xml/XMLParser.ts +919 -0
  320. package/src/zip/CLAUDE.md +55 -0
  321. package/src/zip/ZipHandler.ts +637 -0
  322. package/src/zip/ZipReader.ts +299 -0
  323. package/src/zip/ZipWriter.ts +390 -0
  324. package/src/zip/errors.ts +69 -0
  325. package/src/zip/types.ts +116 -0
  326. package/dist/core/ListNormalizer.d.ts +0 -23
  327. package/dist/core/ListNormalizer.d.ts.map +0 -1
  328. package/dist/core/ListNormalizer.js +0 -624
  329. package/dist/core/ListNormalizer.js.map +0 -1
  330. package/dist/images/index.d.ts +0 -2
  331. package/dist/images/index.d.ts.map +0 -1
  332. package/dist/images/index.js +0 -8
  333. package/dist/images/index.js.map +0 -1
  334. package/dist/ms-doc/cfb/CFBReader.d.ts +0 -35
  335. package/dist/ms-doc/cfb/CFBReader.d.ts.map +0 -1
  336. package/dist/ms-doc/cfb/CFBReader.js +0 -360
  337. package/dist/ms-doc/cfb/CFBReader.js.map +0 -1
  338. package/dist/ms-doc/converter/DocToDocxConverter.d.ts +0 -55
  339. package/dist/ms-doc/converter/DocToDocxConverter.d.ts.map +0 -1
  340. package/dist/ms-doc/converter/DocToDocxConverter.js +0 -324
  341. package/dist/ms-doc/converter/DocToDocxConverter.js.map +0 -1
  342. package/dist/ms-doc/fib/FIB.d.ts +0 -18
  343. package/dist/ms-doc/fib/FIB.d.ts.map +0 -1
  344. package/dist/ms-doc/fib/FIB.js +0 -342
  345. package/dist/ms-doc/fib/FIB.js.map +0 -1
  346. package/dist/ms-doc/fields/FieldParser.d.ts +0 -31
  347. package/dist/ms-doc/fields/FieldParser.d.ts.map +0 -1
  348. package/dist/ms-doc/fields/FieldParser.js +0 -266
  349. package/dist/ms-doc/fields/FieldParser.js.map +0 -1
  350. package/dist/ms-doc/images/PictureExtractor.d.ts +0 -22
  351. package/dist/ms-doc/images/PictureExtractor.d.ts.map +0 -1
  352. package/dist/ms-doc/images/PictureExtractor.js +0 -233
  353. package/dist/ms-doc/images/PictureExtractor.js.map +0 -1
  354. package/dist/ms-doc/index.d.ts +0 -20
  355. package/dist/ms-doc/index.d.ts.map +0 -1
  356. package/dist/ms-doc/index.js +0 -59
  357. package/dist/ms-doc/index.js.map +0 -1
  358. package/dist/ms-doc/properties/SPRM.d.ts +0 -210
  359. package/dist/ms-doc/properties/SPRM.d.ts.map +0 -1
  360. package/dist/ms-doc/properties/SPRM.js +0 -633
  361. package/dist/ms-doc/properties/SPRM.js.map +0 -1
  362. package/dist/ms-doc/sections/SectionParser.d.ts +0 -25
  363. package/dist/ms-doc/sections/SectionParser.d.ts.map +0 -1
  364. package/dist/ms-doc/sections/SectionParser.js +0 -214
  365. package/dist/ms-doc/sections/SectionParser.js.map +0 -1
  366. package/dist/ms-doc/styles/StyleSheet.d.ts +0 -23
  367. package/dist/ms-doc/styles/StyleSheet.d.ts.map +0 -1
  368. package/dist/ms-doc/styles/StyleSheet.js +0 -268
  369. package/dist/ms-doc/styles/StyleSheet.js.map +0 -1
  370. package/dist/ms-doc/subdocuments/SubdocumentParser.d.ts +0 -61
  371. package/dist/ms-doc/subdocuments/SubdocumentParser.d.ts.map +0 -1
  372. package/dist/ms-doc/subdocuments/SubdocumentParser.js +0 -208
  373. package/dist/ms-doc/subdocuments/SubdocumentParser.js.map +0 -1
  374. package/dist/ms-doc/tables/TableParser.d.ts +0 -29
  375. package/dist/ms-doc/tables/TableParser.d.ts.map +0 -1
  376. package/dist/ms-doc/tables/TableParser.js +0 -176
  377. package/dist/ms-doc/tables/TableParser.js.map +0 -1
  378. package/dist/ms-doc/text/PieceTable.d.ts +0 -21
  379. package/dist/ms-doc/text/PieceTable.d.ts.map +0 -1
  380. package/dist/ms-doc/text/PieceTable.js +0 -171
  381. package/dist/ms-doc/text/PieceTable.js.map +0 -1
  382. package/dist/ms-doc/types/Constants.d.ts +0 -99
  383. package/dist/ms-doc/types/Constants.d.ts.map +0 -1
  384. package/dist/ms-doc/types/Constants.js +0 -102
  385. package/dist/ms-doc/types/Constants.js.map +0 -1
  386. package/dist/ms-doc/types/DocTypes.d.ts +0 -368
  387. package/dist/ms-doc/types/DocTypes.d.ts.map +0 -1
  388. package/dist/ms-doc/types/DocTypes.js +0 -3
  389. package/dist/ms-doc/types/DocTypes.js.map +0 -1
  390. package/dist/tracking/index.d.ts +0 -3
  391. package/dist/tracking/index.d.ts.map +0 -1
  392. package/dist/tracking/index.js +0 -6
  393. package/dist/tracking/index.js.map +0 -1
@@ -0,0 +1,613 @@
1
+ /**
2
+ * SelectiveRevisionAcceptor - Accept or reject specific revisions based on criteria
3
+ *
4
+ * Provides granular control over revision acceptance using in-memory DOM transformation.
5
+ * Extends the all-or-nothing approach with selective acceptance by author, type, date,
6
+ * and custom criteria.
7
+ *
8
+ * Uses the industry-standard in-memory transformation approach (like OpenXML PowerTools),
9
+ * allowing subsequent modifications to be saved correctly.
10
+ *
11
+ * @module SelectiveRevisionAcceptor
12
+ * @see https://github.com/OfficeDev/Open-Xml-PowerTools - RevisionAccepter.cs
13
+ */
14
+
15
+ import type { Document } from '../core/Document';
16
+ import type { Paragraph, ParagraphContent } from '../elements/Paragraph';
17
+ import { Revision, RevisionType } from '../elements/Revision';
18
+ import type { Run } from '../elements/Run';
19
+ import type { Hyperlink } from '../elements/Hyperlink';
20
+ import { isRunContent, isHyperlinkContent } from '../elements/RevisionContent';
21
+ import { ChangeCategory } from './ChangelogGenerator';
22
+ import { SelectionCriteria } from './RevisionAwareProcessor';
23
+
24
+ /**
25
+ * Result of selective revision acceptance.
26
+ */
27
+ export interface SelectiveAcceptResult {
28
+ /** IDs of accepted revisions */
29
+ accepted: string[];
30
+ /** IDs of rejected/removed revisions */
31
+ rejected: string[];
32
+ /** IDs of revisions that remain */
33
+ remaining: string[];
34
+ /** Summary of actions taken */
35
+ summary: {
36
+ totalProcessed: number;
37
+ acceptedCount: number;
38
+ rejectedCount: number;
39
+ remainingCount: number;
40
+ };
41
+ }
42
+
43
+ /**
44
+ * Provides granular control over revision acceptance using in-memory DOM transformation.
45
+ * Allows subsequent modifications to be saved correctly.
46
+ */
47
+ export class SelectiveRevisionAcceptor {
48
+ /**
49
+ * Accept revisions matching criteria using in-memory DOM transformation.
50
+ * Matching revisions: content kept, revision wrapper removed.
51
+ * Non-matching revisions: preserved in the document.
52
+ *
53
+ * @param doc - Document to process
54
+ * @param criteria - Selection criteria
55
+ * @returns Result with accepted, rejected, and remaining revision IDs
56
+ */
57
+ static accept(
58
+ doc: Document,
59
+ criteria: SelectionCriteria
60
+ ): SelectiveAcceptResult {
61
+ const accepted: string[] = [];
62
+ const remaining: string[] = [];
63
+
64
+ // Check if doc has full Document API (getAllParagraphs, getTables)
65
+ // or if it's a minimal mock (only getRevisionManager)
66
+ const hasFullApi = typeof (doc as any).getAllParagraphs === 'function';
67
+
68
+ if (hasFullApi) {
69
+ // Full in-memory DOM transformation
70
+ const paragraphs = (doc as any).getAllParagraphs();
71
+ for (const paragraph of paragraphs) {
72
+ this.processSelectiveParagraph(paragraph, criteria, 'accept', accepted, remaining);
73
+ }
74
+
75
+ // Process paragraphs in tables
76
+ const tables = (doc as any).getTables();
77
+ for (const table of tables) {
78
+ for (const row of table.getRows()) {
79
+ for (const cell of row.getCells()) {
80
+ for (const paragraph of cell.getParagraphs()) {
81
+ this.processSelectiveParagraph(paragraph, criteria, 'accept', accepted, remaining);
82
+ }
83
+ }
84
+ }
85
+ }
86
+ } else {
87
+ // Fallback: Filter revisions from RevisionManager only (for backward compatibility)
88
+ const revisionManager = doc.getRevisionManager();
89
+ if (revisionManager) {
90
+ const allRevisions = revisionManager.getAllRevisions();
91
+ for (const rev of allRevisions) {
92
+ if (this.matchesCriteria(rev, criteria)) {
93
+ accepted.push(rev.getId().toString());
94
+ } else {
95
+ remaining.push(rev.getId().toString());
96
+ }
97
+ }
98
+ }
99
+ }
100
+
101
+ // Clear accepted revisions from RevisionManager
102
+ const revisionManager = doc.getRevisionManager();
103
+ if (revisionManager) {
104
+ for (const id of accepted) {
105
+ revisionManager.removeById(parseInt(id, 10));
106
+ }
107
+ }
108
+
109
+ return {
110
+ accepted,
111
+ rejected: [],
112
+ remaining,
113
+ summary: {
114
+ totalProcessed: accepted.length + remaining.length,
115
+ acceptedCount: accepted.length,
116
+ rejectedCount: 0,
117
+ remainingCount: remaining.length,
118
+ },
119
+ };
120
+ }
121
+
122
+ /**
123
+ * Reject revisions matching criteria using in-memory DOM transformation.
124
+ * Matching revisions: content AND wrapper removed (opposite of accept).
125
+ * Non-matching revisions: preserved in the document.
126
+ *
127
+ * For insertions: Rejecting removes the inserted content entirely.
128
+ * For deletions: Rejecting keeps the deleted content (opposite of accepting).
129
+ *
130
+ * @param doc - Document to process
131
+ * @param criteria - Selection criteria
132
+ * @returns Result with accepted, rejected, and remaining revision IDs
133
+ */
134
+ static reject(
135
+ doc: Document,
136
+ criteria: SelectionCriteria
137
+ ): SelectiveAcceptResult {
138
+ const rejected: string[] = [];
139
+ const remaining: string[] = [];
140
+
141
+ // Check if doc has full Document API (getAllParagraphs, getTables)
142
+ // or if it's a minimal mock (only getRevisionManager)
143
+ const hasFullApi = typeof (doc as any).getAllParagraphs === 'function';
144
+
145
+ if (hasFullApi) {
146
+ // Full in-memory DOM transformation
147
+ const paragraphs = (doc as any).getAllParagraphs();
148
+ for (const paragraph of paragraphs) {
149
+ this.processSelectiveParagraph(paragraph, criteria, 'reject', rejected, remaining);
150
+ }
151
+
152
+ // Process paragraphs in tables
153
+ const tables = (doc as any).getTables();
154
+ for (const table of tables) {
155
+ for (const row of table.getRows()) {
156
+ for (const cell of row.getCells()) {
157
+ for (const paragraph of cell.getParagraphs()) {
158
+ this.processSelectiveParagraph(paragraph, criteria, 'reject', rejected, remaining);
159
+ }
160
+ }
161
+ }
162
+ }
163
+ } else {
164
+ // Fallback: Filter revisions from RevisionManager only (for backward compatibility)
165
+ const revisionManager = doc.getRevisionManager();
166
+ if (revisionManager) {
167
+ const allRevisions = revisionManager.getAllRevisions();
168
+ for (const rev of allRevisions) {
169
+ if (this.matchesCriteria(rev, criteria)) {
170
+ rejected.push(rev.getId().toString());
171
+ } else {
172
+ remaining.push(rev.getId().toString());
173
+ }
174
+ }
175
+ }
176
+ }
177
+
178
+ // Clear rejected revisions from RevisionManager
179
+ const revisionManager = doc.getRevisionManager();
180
+ if (revisionManager) {
181
+ for (const id of rejected) {
182
+ revisionManager.removeById(parseInt(id, 10));
183
+ }
184
+ }
185
+
186
+ return {
187
+ accepted: [],
188
+ rejected,
189
+ remaining,
190
+ summary: {
191
+ totalProcessed: rejected.length + remaining.length,
192
+ acceptedCount: 0,
193
+ rejectedCount: rejected.length,
194
+ remainingCount: remaining.length,
195
+ },
196
+ };
197
+ }
198
+
199
+ /**
200
+ * Process a paragraph for selective revision acceptance/rejection.
201
+ * Transforms matching revisions in-place using DOM transformation.
202
+ */
203
+ private static processSelectiveParagraph(
204
+ paragraph: Paragraph,
205
+ criteria: SelectionCriteria,
206
+ action: 'accept' | 'reject',
207
+ processedIds: string[],
208
+ remainingIds: string[]
209
+ ): void {
210
+ const content = paragraph.getContent();
211
+ const newContent: ParagraphContent[] = [];
212
+
213
+ for (const item of content) {
214
+ if (item instanceof Revision) {
215
+ const revisionId = item.getId().toString();
216
+
217
+ if (this.matchesCriteria(item, criteria)) {
218
+ // This revision matches the criteria - process it
219
+ processedIds.push(revisionId);
220
+
221
+ if (action === 'accept') {
222
+ // Accept: Transform based on revision type
223
+ this.acceptRevisionItem(item, newContent);
224
+ } else {
225
+ // Reject: Transform opposite of accept
226
+ this.rejectRevisionItem(item, newContent);
227
+ }
228
+ } else {
229
+ // This revision doesn't match - keep it
230
+ remainingIds.push(revisionId);
231
+ newContent.push(item);
232
+ }
233
+ } else {
234
+ // Non-revision content - keep as-is
235
+ newContent.push(item);
236
+ }
237
+ }
238
+
239
+ // Replace paragraph content with the transformed content
240
+ paragraph.setContent(newContent);
241
+ }
242
+
243
+ /**
244
+ * Accept a single revision item (unwrap insertions, remove deletions).
245
+ */
246
+ private static acceptRevisionItem(
247
+ revision: Revision,
248
+ newContent: ParagraphContent[]
249
+ ): void {
250
+ const revisionType = revision.getType();
251
+ const childContent = revision.getContent();
252
+
253
+ switch (revisionType) {
254
+ case 'insert':
255
+ case 'moveTo':
256
+ // Unwrap: Extract child content into parent position
257
+ for (const child of childContent) {
258
+ if (isRunContent(child)) {
259
+ newContent.push(child as Run);
260
+ } else if (isHyperlinkContent(child)) {
261
+ newContent.push(child);
262
+ }
263
+ }
264
+ break;
265
+
266
+ case 'delete':
267
+ case 'moveFrom':
268
+ // Remove: Don't add to newContent - content is deleted
269
+ break;
270
+
271
+ case 'runPropertiesChange':
272
+ case 'paragraphPropertiesChange':
273
+ case 'tablePropertiesChange':
274
+ case 'tableExceptionPropertiesChange':
275
+ case 'tableRowPropertiesChange':
276
+ case 'tableCellPropertiesChange':
277
+ case 'sectionPropertiesChange':
278
+ case 'numberingChange':
279
+ // Property changes: Keep content, remove change metadata
280
+ for (const child of childContent) {
281
+ if (isRunContent(child)) {
282
+ newContent.push(child as Run);
283
+ } else if (isHyperlinkContent(child)) {
284
+ newContent.push(child);
285
+ }
286
+ }
287
+ break;
288
+
289
+ default:
290
+ // Unknown type - keep the revision as-is for safety
291
+ newContent.push(revision);
292
+ }
293
+ }
294
+
295
+ /**
296
+ * Reject a single revision item (opposite of accept).
297
+ * - Rejecting an insertion removes the content
298
+ * - Rejecting a deletion keeps the content (unwraps it)
299
+ */
300
+ private static rejectRevisionItem(
301
+ revision: Revision,
302
+ newContent: ParagraphContent[]
303
+ ): void {
304
+ const revisionType = revision.getType();
305
+ const childContent = revision.getContent();
306
+
307
+ switch (revisionType) {
308
+ case 'insert':
309
+ case 'moveTo':
310
+ // Reject insertion: Remove the inserted content entirely
311
+ break;
312
+
313
+ case 'delete':
314
+ case 'moveFrom':
315
+ // Reject deletion: Keep the deleted content (unwrap)
316
+ for (const child of childContent) {
317
+ if (isRunContent(child)) {
318
+ newContent.push(child as Run);
319
+ } else if (isHyperlinkContent(child)) {
320
+ newContent.push(child);
321
+ }
322
+ }
323
+ break;
324
+
325
+ case 'runPropertiesChange':
326
+ case 'paragraphPropertiesChange':
327
+ case 'tablePropertiesChange':
328
+ case 'tableExceptionPropertiesChange':
329
+ case 'tableRowPropertiesChange':
330
+ case 'tableCellPropertiesChange':
331
+ case 'sectionPropertiesChange':
332
+ case 'numberingChange':
333
+ // Rejecting property changes: Would need to restore old properties
334
+ // For now, just keep content without the change metadata
335
+ // (Full implementation would restore previousProperties)
336
+ for (const child of childContent) {
337
+ if (isRunContent(child)) {
338
+ newContent.push(child as Run);
339
+ } else if (isHyperlinkContent(child)) {
340
+ newContent.push(child);
341
+ }
342
+ }
343
+ break;
344
+
345
+ default:
346
+ // Unknown type - keep the revision as-is for safety
347
+ newContent.push(revision);
348
+ }
349
+ }
350
+
351
+ /**
352
+ * Preview what would happen without making changes.
353
+ *
354
+ * @param doc - Document to analyze
355
+ * @param criteria - Selection criteria
356
+ * @param action - Action to preview
357
+ * @returns Preview of what would happen
358
+ */
359
+ static preview(
360
+ doc: Document,
361
+ criteria: SelectionCriteria,
362
+ action: 'accept' | 'reject'
363
+ ): SelectiveAcceptResult {
364
+ // Preview is the same as the actual operation but without side effects
365
+ return action === 'accept'
366
+ ? this.accept(doc, criteria)
367
+ : this.reject(doc, criteria);
368
+ }
369
+
370
+ /**
371
+ * Accept all revisions by a specific author.
372
+ *
373
+ * @param doc - Document to process
374
+ * @param author - Author name to accept
375
+ * @returns Result with accepted, rejected, and remaining revision IDs
376
+ */
377
+ static acceptByAuthor(doc: Document, author: string): SelectiveAcceptResult {
378
+ return this.accept(doc, { authors: [author] });
379
+ }
380
+
381
+ /**
382
+ * Reject all revisions by a specific author.
383
+ *
384
+ * @param doc - Document to process
385
+ * @param author - Author name to reject
386
+ * @returns Result with accepted, rejected, and remaining revision IDs
387
+ */
388
+ static rejectByAuthor(doc: Document, author: string): SelectiveAcceptResult {
389
+ return this.reject(doc, { authors: [author] });
390
+ }
391
+
392
+ /**
393
+ * Accept all revisions of specific types.
394
+ *
395
+ * @param doc - Document to process
396
+ * @param types - Revision types to accept
397
+ * @returns Result with accepted, rejected, and remaining revision IDs
398
+ */
399
+ static acceptByType(doc: Document, types: RevisionType[]): SelectiveAcceptResult {
400
+ return this.accept(doc, { types });
401
+ }
402
+
403
+ /**
404
+ * Reject all revisions of specific types.
405
+ *
406
+ * @param doc - Document to process
407
+ * @param types - Revision types to reject
408
+ * @returns Result with accepted, rejected, and remaining revision IDs
409
+ */
410
+ static rejectByType(doc: Document, types: RevisionType[]): SelectiveAcceptResult {
411
+ return this.reject(doc, { types });
412
+ }
413
+
414
+ /**
415
+ * Accept all revisions before a specific date.
416
+ *
417
+ * @param doc - Document to process
418
+ * @param date - Cutoff date (exclusive)
419
+ * @returns Result with accepted, rejected, and remaining revision IDs
420
+ */
421
+ static acceptBeforeDate(doc: Document, date: Date): SelectiveAcceptResult {
422
+ return this.accept(doc, {
423
+ dateRange: { start: new Date(0), end: date },
424
+ });
425
+ }
426
+
427
+ /**
428
+ * Accept all revisions after a specific date.
429
+ *
430
+ * @param doc - Document to process
431
+ * @param date - Start date (exclusive)
432
+ * @returns Result with accepted, rejected, and remaining revision IDs
433
+ */
434
+ static acceptAfterDate(doc: Document, date: Date): SelectiveAcceptResult {
435
+ return this.accept(doc, {
436
+ dateRange: { start: date, end: new Date() },
437
+ });
438
+ }
439
+
440
+ /**
441
+ * Accept all insertions only.
442
+ *
443
+ * @param doc - Document to process
444
+ * @returns Result with accepted, rejected, and remaining revision IDs
445
+ */
446
+ static acceptInsertionsOnly(doc: Document): SelectiveAcceptResult {
447
+ return this.accept(doc, { types: ['insert'] });
448
+ }
449
+
450
+ /**
451
+ * Accept all deletions only.
452
+ *
453
+ * @param doc - Document to process
454
+ * @returns Result with accepted, rejected, and remaining revision IDs
455
+ */
456
+ static acceptDeletionsOnly(doc: Document): SelectiveAcceptResult {
457
+ return this.accept(doc, { types: ['delete'] });
458
+ }
459
+
460
+ /**
461
+ * Reject all formatting changes (keep content changes).
462
+ *
463
+ * @param doc - Document to process
464
+ * @returns Result with accepted, rejected, and remaining revision IDs
465
+ */
466
+ static rejectFormattingChanges(doc: Document): SelectiveAcceptResult {
467
+ return this.reject(doc, { categories: ['formatting'] });
468
+ }
469
+
470
+ /**
471
+ * Accept content changes only (reject formatting).
472
+ *
473
+ * @param doc - Document to process
474
+ * @returns Result with accepted, rejected, and remaining revision IDs
475
+ */
476
+ static acceptContentChangesOnly(doc: Document): SelectiveAcceptResult {
477
+ return this.accept(doc, { categories: ['content'] });
478
+ }
479
+
480
+ /**
481
+ * Partition revisions into matching and non-matching based on criteria.
482
+ */
483
+ private static partitionRevisions(
484
+ revisions: Revision[],
485
+ criteria: SelectionCriteria
486
+ ): { matching: Revision[]; nonMatching: Revision[] } {
487
+ const matching: Revision[] = [];
488
+ const nonMatching: Revision[] = [];
489
+
490
+ for (const rev of revisions) {
491
+ if (this.matchesCriteria(rev, criteria)) {
492
+ matching.push(rev);
493
+ } else {
494
+ nonMatching.push(rev);
495
+ }
496
+ }
497
+
498
+ return { matching, nonMatching };
499
+ }
500
+
501
+ /**
502
+ * Check if a revision matches the given criteria.
503
+ */
504
+ private static matchesCriteria(
505
+ revision: Revision,
506
+ criteria: SelectionCriteria
507
+ ): boolean {
508
+ // If no criteria specified, match nothing
509
+ if (
510
+ !criteria.ids &&
511
+ !criteria.types &&
512
+ !criteria.authors &&
513
+ !criteria.dateRange &&
514
+ !criteria.categories &&
515
+ !criteria.custom
516
+ ) {
517
+ return false;
518
+ }
519
+
520
+ // Filter by IDs
521
+ if (criteria.ids && !criteria.ids.includes(revision.getId())) {
522
+ return false;
523
+ }
524
+
525
+ // Filter by types
526
+ if (criteria.types && !criteria.types.includes(revision.getType())) {
527
+ return false;
528
+ }
529
+
530
+ // Filter by authors
531
+ if (criteria.authors && !criteria.authors.includes(revision.getAuthor())) {
532
+ return false;
533
+ }
534
+
535
+ // Filter by date range
536
+ if (criteria.dateRange) {
537
+ const date = revision.getDate();
538
+ if (date < criteria.dateRange.start || date > criteria.dateRange.end) {
539
+ return false;
540
+ }
541
+ }
542
+
543
+ // Filter by categories
544
+ if (criteria.categories) {
545
+ const category = this.getRevisionCategory(revision);
546
+ if (!criteria.categories.includes(category)) {
547
+ return false;
548
+ }
549
+ }
550
+
551
+ // Custom filter
552
+ if (criteria.custom && !criteria.custom(revision)) {
553
+ return false;
554
+ }
555
+
556
+ return true;
557
+ }
558
+
559
+ /**
560
+ * Get the semantic category of a revision.
561
+ */
562
+ private static getRevisionCategory(revision: Revision): ChangeCategory {
563
+ const type = revision.getType();
564
+
565
+ if (type === 'insert' || type === 'delete') {
566
+ return 'content';
567
+ }
568
+ if (
569
+ type === 'runPropertiesChange' ||
570
+ type === 'paragraphPropertiesChange' ||
571
+ type === 'numberingChange'
572
+ ) {
573
+ return 'formatting';
574
+ }
575
+ if (
576
+ type === 'moveFrom' ||
577
+ type === 'moveTo' ||
578
+ type === 'sectionPropertiesChange'
579
+ ) {
580
+ return 'structural';
581
+ }
582
+ if (
583
+ type === 'tablePropertiesChange' ||
584
+ type === 'tableExceptionPropertiesChange' ||
585
+ type === 'tableRowPropertiesChange' ||
586
+ type === 'tableCellPropertiesChange' ||
587
+ type === 'tableCellInsert' ||
588
+ type === 'tableCellDelete' ||
589
+ type === 'tableCellMerge'
590
+ ) {
591
+ return 'table';
592
+ }
593
+
594
+ return 'content';
595
+ }
596
+
597
+ /**
598
+ * Create an empty result.
599
+ */
600
+ private static emptyResult(): SelectiveAcceptResult {
601
+ return {
602
+ accepted: [],
603
+ rejected: [],
604
+ remaining: [],
605
+ summary: {
606
+ totalProcessed: 0,
607
+ acceptedCount: 0,
608
+ rejectedCount: 0,
609
+ remainingCount: 0,
610
+ },
611
+ };
612
+ }
613
+ }
@@ -0,0 +1,107 @@
1
+ /**
2
+ * ShadingResolver - Resolves effective cell shading through the ECMA-376 style hierarchy
3
+ *
4
+ * Per ECMA-376 §17.7.6, cell shading is resolved in priority order:
5
+ * 1. Direct cell shading
6
+ * 2. Row table property exceptions (tblPrEx)
7
+ * 3. Conditional table style (tblStylePr) based on cnfStyle bitmask
8
+ * 4. Table style default cell shading
9
+ * 5. Direct table shading
10
+ *
11
+ * Special values:
12
+ * - pattern: "nil" = explicitly clear (stop resolution)
13
+ * - fill: "auto" = inherit (continue resolution)
14
+ */
15
+
16
+ import type { ShadingConfig } from '../elements/CommonTypes';
17
+ import type { Table } from '../elements/Table';
18
+ import type { TableCell } from '../elements/TableCell';
19
+ import type { StylesManager } from '../formatting/StylesManager';
20
+ import { getActiveConditionalsInPriorityOrder } from './cnfStyleDecoder';
21
+ import type { ConditionalFormattingType } from '../formatting/Style';
22
+
23
+ /**
24
+ * Resolves the effective shading for a table cell through the style hierarchy.
25
+ *
26
+ * @param cell - The table cell to resolve shading for
27
+ * @param table - The parent table
28
+ * @param stylesManager - The document's styles manager for style lookup
29
+ * @returns The resolved ShadingConfig, or undefined if no shading applies
30
+ */
31
+ export function resolveCellShading(
32
+ cell: TableCell,
33
+ table: Table,
34
+ stylesManager: StylesManager
35
+ ): ShadingConfig | undefined {
36
+ // 1. Direct cell shading
37
+ const directShading = cell.getShading();
38
+ if (directShading) {
39
+ if (directShading.pattern === 'nil') return undefined;
40
+ if (directShading.fill && directShading.fill !== 'auto') return directShading;
41
+ }
42
+
43
+ // 2. Row table property exceptions
44
+ const row = findRowForCell(cell, table);
45
+ if (row) {
46
+ const exceptions = row.getTablePropertyExceptions();
47
+ if (exceptions?.shading) {
48
+ if (exceptions.shading.pattern === 'nil') return undefined;
49
+ if (exceptions.shading.fill && exceptions.shading.fill !== 'auto') return exceptions.shading;
50
+ }
51
+ }
52
+
53
+ // 3. Conditional table style shading
54
+ const tableStyleId = table.getStyle();
55
+ if (tableStyleId) {
56
+ const style = stylesManager.getStyle(tableStyleId);
57
+ if (style) {
58
+ const styleProps = style.getProperties();
59
+ const conditionals = styleProps.tableStyle?.conditionalFormatting;
60
+ if (conditionals) {
61
+ const cnfStyle = cell.getCnfStyle();
62
+ if (cnfStyle) {
63
+ const activeConditionals = getActiveConditionalsInPriorityOrder(cnfStyle);
64
+ for (const condType of activeConditionals) {
65
+ const match = conditionals.find(
66
+ (c) => c.type === (condType)
67
+ );
68
+ if (match?.cellFormatting?.shading) {
69
+ const condShading = match.cellFormatting.shading;
70
+ if (condShading.pattern === 'nil') return undefined;
71
+ return condShading;
72
+ }
73
+ }
74
+ }
75
+ }
76
+
77
+ // 4. Table style default cell shading
78
+ if (styleProps.tableStyle?.cell?.shading) {
79
+ const defaultCellShading = styleProps.tableStyle.cell.shading;
80
+ if (defaultCellShading.pattern === 'nil') return undefined;
81
+ return defaultCellShading;
82
+ }
83
+ }
84
+ }
85
+
86
+ // 5. Direct table shading
87
+ const tableShading = table.getShading();
88
+ if (tableShading) {
89
+ if (tableShading.pattern === 'nil') return undefined;
90
+ return tableShading;
91
+ }
92
+
93
+ return undefined;
94
+ }
95
+
96
+ /**
97
+ * Finds the row that contains a given cell.
98
+ */
99
+ function findRowForCell(cell: TableCell, table: Table) {
100
+ for (const row of table.getRows()) {
101
+ const cells = row.getCells();
102
+ if (cells.includes(cell)) {
103
+ return row;
104
+ }
105
+ }
106
+ return undefined;
107
+ }