docxmlater 10.1.4 → 10.1.6

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 (372) hide show
  1. package/README.md +759 -754
  2. package/dist/constants/legacyCompatFlags.js +1 -1
  3. package/dist/constants/legacyCompatFlags.js.map +1 -1
  4. package/dist/constants/limits.js.map +1 -1
  5. package/dist/core/Document.d.ts +51 -50
  6. package/dist/core/Document.d.ts.map +1 -1
  7. package/dist/core/Document.js +486 -471
  8. package/dist/core/Document.js.map +1 -1
  9. package/dist/core/DocumentContent.d.ts +9 -9
  10. package/dist/core/DocumentContent.d.ts.map +1 -1
  11. package/dist/core/DocumentContent.js +1 -1
  12. package/dist/core/DocumentContent.js.map +1 -1
  13. package/dist/core/DocumentGenerator.d.ts +11 -11
  14. package/dist/core/DocumentGenerator.d.ts.map +1 -1
  15. package/dist/core/DocumentGenerator.js +251 -251
  16. package/dist/core/DocumentGenerator.js.map +1 -1
  17. package/dist/core/DocumentIdManager.js.map +1 -1
  18. package/dist/core/DocumentParser.d.ts +15 -15
  19. package/dist/core/DocumentParser.d.ts.map +1 -1
  20. package/dist/core/DocumentParser.js +2123 -2155
  21. package/dist/core/DocumentParser.js.map +1 -1
  22. package/dist/core/DocumentValidator.d.ts.map +1 -1
  23. package/dist/core/DocumentValidator.js +2 -5
  24. package/dist/core/DocumentValidator.js.map +1 -1
  25. package/dist/core/Relationship.js.map +1 -1
  26. package/dist/core/RelationshipManager.d.ts.map +1 -1
  27. package/dist/core/RelationshipManager.js +3 -3
  28. package/dist/core/RelationshipManager.js.map +1 -1
  29. package/dist/elements/AlternateContent.js.map +1 -1
  30. package/dist/elements/Bookmark.d.ts.map +1 -1
  31. package/dist/elements/Bookmark.js +3 -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.d.ts.map +1 -1
  36. package/dist/elements/Comment.js +9 -6
  37. package/dist/elements/Comment.js.map +1 -1
  38. package/dist/elements/CommentManager.d.ts.map +1 -1
  39. package/dist/elements/CommentManager.js +18 -17
  40. package/dist/elements/CommentManager.js.map +1 -1
  41. package/dist/elements/CommonTypes.d.ts +21 -21
  42. package/dist/elements/CommonTypes.d.ts.map +1 -1
  43. package/dist/elements/CommonTypes.js +56 -56
  44. package/dist/elements/CommonTypes.js.map +1 -1
  45. package/dist/elements/CustomXml.js.map +1 -1
  46. package/dist/elements/Endnote.d.ts.map +1 -1
  47. package/dist/elements/Endnote.js +6 -6
  48. package/dist/elements/Endnote.js.map +1 -1
  49. package/dist/elements/EndnoteManager.d.ts.map +1 -1
  50. package/dist/elements/EndnoteManager.js +6 -7
  51. package/dist/elements/EndnoteManager.js.map +1 -1
  52. package/dist/elements/Field.d.ts.map +1 -1
  53. package/dist/elements/Field.js +82 -25
  54. package/dist/elements/Field.js.map +1 -1
  55. package/dist/elements/FieldHelpers.d.ts.map +1 -1
  56. package/dist/elements/FieldHelpers.js.map +1 -1
  57. package/dist/elements/FontManager.d.ts.map +1 -1
  58. package/dist/elements/FontManager.js +1 -1
  59. package/dist/elements/FontManager.js.map +1 -1
  60. package/dist/elements/Footer.js +2 -2
  61. package/dist/elements/Footer.js.map +1 -1
  62. package/dist/elements/Footnote.d.ts.map +1 -1
  63. package/dist/elements/Footnote.js +6 -6
  64. package/dist/elements/Footnote.js.map +1 -1
  65. package/dist/elements/FootnoteManager.d.ts.map +1 -1
  66. package/dist/elements/FootnoteManager.js +6 -7
  67. package/dist/elements/FootnoteManager.js.map +1 -1
  68. package/dist/elements/Header.js +2 -2
  69. package/dist/elements/Header.js.map +1 -1
  70. package/dist/elements/HeaderFooterManager.js.map +1 -1
  71. package/dist/elements/Hyperlink.d.ts +5 -3
  72. package/dist/elements/Hyperlink.d.ts.map +1 -1
  73. package/dist/elements/Hyperlink.js +134 -76
  74. package/dist/elements/Hyperlink.js.map +1 -1
  75. package/dist/elements/Image.d.ts.map +1 -1
  76. package/dist/elements/Image.js +238 -106
  77. package/dist/elements/Image.js.map +1 -1
  78. package/dist/elements/ImageManager.d.ts.map +1 -1
  79. package/dist/elements/ImageManager.js +1 -1
  80. package/dist/elements/ImageManager.js.map +1 -1
  81. package/dist/elements/ImageRun.js +1 -1
  82. package/dist/elements/ImageRun.js.map +1 -1
  83. package/dist/elements/MathElement.js.map +1 -1
  84. package/dist/elements/Paragraph.d.ts +24 -24
  85. package/dist/elements/Paragraph.d.ts.map +1 -1
  86. package/dist/elements/Paragraph.js +181 -188
  87. package/dist/elements/Paragraph.js.map +1 -1
  88. package/dist/elements/PreservedElement.js.map +1 -1
  89. package/dist/elements/PropertyChangeTypes.d.ts.map +1 -1
  90. package/dist/elements/PropertyChangeTypes.js +6 -6
  91. package/dist/elements/PropertyChangeTypes.js.map +1 -1
  92. package/dist/elements/RangeMarker.d.ts.map +1 -1
  93. package/dist/elements/RangeMarker.js.map +1 -1
  94. package/dist/elements/Revision.d.ts.map +1 -1
  95. package/dist/elements/Revision.js +4 -5
  96. package/dist/elements/Revision.js.map +1 -1
  97. package/dist/elements/RevisionContent.js.map +1 -1
  98. package/dist/elements/RevisionManager.d.ts.map +1 -1
  99. package/dist/elements/RevisionManager.js +40 -48
  100. package/dist/elements/RevisionManager.js.map +1 -1
  101. package/dist/elements/Run.d.ts +16 -16
  102. package/dist/elements/Run.d.ts.map +1 -1
  103. package/dist/elements/Run.js +256 -238
  104. package/dist/elements/Run.js.map +1 -1
  105. package/dist/elements/Section.d.ts.map +1 -1
  106. package/dist/elements/Section.js +36 -11
  107. package/dist/elements/Section.js.map +1 -1
  108. package/dist/elements/Shape.d.ts.map +1 -1
  109. package/dist/elements/Shape.js.map +1 -1
  110. package/dist/elements/StructuredDocumentTag.d.ts +6 -6
  111. package/dist/elements/StructuredDocumentTag.d.ts.map +1 -1
  112. package/dist/elements/StructuredDocumentTag.js +99 -104
  113. package/dist/elements/StructuredDocumentTag.js.map +1 -1
  114. package/dist/elements/Table.d.ts +11 -11
  115. package/dist/elements/Table.d.ts.map +1 -1
  116. package/dist/elements/Table.js +102 -107
  117. package/dist/elements/Table.js.map +1 -1
  118. package/dist/elements/TableCell.d.ts +10 -10
  119. package/dist/elements/TableCell.d.ts.map +1 -1
  120. package/dist/elements/TableCell.js +105 -106
  121. package/dist/elements/TableCell.js.map +1 -1
  122. package/dist/elements/TableGridChange.d.ts.map +1 -1
  123. package/dist/elements/TableGridChange.js.map +1 -1
  124. package/dist/elements/TableOfContents.d.ts.map +1 -1
  125. package/dist/elements/TableOfContents.js +4 -4
  126. package/dist/elements/TableOfContents.js.map +1 -1
  127. package/dist/elements/TableOfContentsElement.js.map +1 -1
  128. package/dist/elements/TableRow.d.ts.map +1 -1
  129. package/dist/elements/TableRow.js +13 -6
  130. package/dist/elements/TableRow.js.map +1 -1
  131. package/dist/elements/TextBox.d.ts.map +1 -1
  132. package/dist/elements/TextBox.js +3 -5
  133. package/dist/elements/TextBox.js.map +1 -1
  134. package/dist/formatting/AbstractNumbering.d.ts +4 -4
  135. package/dist/formatting/AbstractNumbering.d.ts.map +1 -1
  136. package/dist/formatting/AbstractNumbering.js +54 -49
  137. package/dist/formatting/AbstractNumbering.js.map +1 -1
  138. package/dist/formatting/NumberingInstance.d.ts.map +1 -1
  139. package/dist/formatting/NumberingInstance.js +1 -3
  140. package/dist/formatting/NumberingInstance.js.map +1 -1
  141. package/dist/formatting/NumberingLevel.d.ts +5 -5
  142. package/dist/formatting/NumberingLevel.d.ts.map +1 -1
  143. package/dist/formatting/NumberingLevel.js +119 -125
  144. package/dist/formatting/NumberingLevel.js.map +1 -1
  145. package/dist/formatting/NumberingManager.d.ts +1 -0
  146. package/dist/formatting/NumberingManager.d.ts.map +1 -1
  147. package/dist/formatting/NumberingManager.js +27 -9
  148. package/dist/formatting/NumberingManager.js.map +1 -1
  149. package/dist/formatting/Style.d.ts +11 -11
  150. package/dist/formatting/Style.d.ts.map +1 -1
  151. package/dist/formatting/Style.js +219 -247
  152. package/dist/formatting/Style.js.map +1 -1
  153. package/dist/formatting/StylesManager.d.ts +2 -2
  154. package/dist/formatting/StylesManager.d.ts.map +1 -1
  155. package/dist/formatting/StylesManager.js +96 -102
  156. package/dist/formatting/StylesManager.js.map +1 -1
  157. package/dist/helpers/CleanupHelper.d.ts +1 -1
  158. package/dist/helpers/CleanupHelper.d.ts.map +1 -1
  159. package/dist/helpers/CleanupHelper.js +6 -6
  160. package/dist/helpers/CleanupHelper.js.map +1 -1
  161. package/dist/images/ImageOptimizer.js +7 -7
  162. package/dist/images/ImageOptimizer.js.map +1 -1
  163. package/dist/index.d.ts +9 -9
  164. package/dist/index.d.ts.map +1 -1
  165. package/dist/index.js.map +1 -1
  166. package/dist/managers/DrawingManager.js.map +1 -1
  167. package/dist/tracking/DocumentTrackingContext.d.ts.map +1 -1
  168. package/dist/tracking/DocumentTrackingContext.js +23 -7
  169. package/dist/tracking/DocumentTrackingContext.js.map +1 -1
  170. package/dist/tracking/TrackingContext.d.ts.map +1 -1
  171. package/dist/tracking/TrackingContext.js.map +1 -1
  172. package/dist/types/compatibility-types.js.map +1 -1
  173. package/dist/types/formatting.js.map +1 -1
  174. package/dist/types/list-types.d.ts +6 -6
  175. package/dist/types/list-types.js.map +1 -1
  176. package/dist/types/settings-types.js.map +1 -1
  177. package/dist/types/styleConfig.d.ts +2 -2
  178. package/dist/types/styleConfig.js.map +1 -1
  179. package/dist/utils/ChangelogGenerator.d.ts.map +1 -1
  180. package/dist/utils/ChangelogGenerator.js +97 -101
  181. package/dist/utils/ChangelogGenerator.js.map +1 -1
  182. package/dist/utils/CompatibilityUpgrader.d.ts.map +1 -1
  183. package/dist/utils/CompatibilityUpgrader.js +1 -1
  184. package/dist/utils/CompatibilityUpgrader.js.map +1 -1
  185. package/dist/utils/InMemoryRevisionAcceptor.d.ts.map +1 -1
  186. package/dist/utils/InMemoryRevisionAcceptor.js +1 -6
  187. package/dist/utils/InMemoryRevisionAcceptor.js.map +1 -1
  188. package/dist/utils/MoveOperationHelper.d.ts.map +1 -1
  189. package/dist/utils/MoveOperationHelper.js +1 -1
  190. package/dist/utils/MoveOperationHelper.js.map +1 -1
  191. package/dist/utils/RevisionAwareProcessor.d.ts.map +1 -1
  192. package/dist/utils/RevisionAwareProcessor.js +2 -4
  193. package/dist/utils/RevisionAwareProcessor.js.map +1 -1
  194. package/dist/utils/RevisionWalker.d.ts.map +1 -1
  195. package/dist/utils/RevisionWalker.js +4 -12
  196. package/dist/utils/RevisionWalker.js.map +1 -1
  197. package/dist/utils/SelectiveRevisionAcceptor.d.ts.map +1 -1
  198. package/dist/utils/SelectiveRevisionAcceptor.js +2 -6
  199. package/dist/utils/SelectiveRevisionAcceptor.js.map +1 -1
  200. package/dist/utils/ShadingResolver.d.ts.map +1 -1
  201. package/dist/utils/ShadingResolver.js +1 -1
  202. package/dist/utils/ShadingResolver.js.map +1 -1
  203. package/dist/utils/acceptRevisions.d.ts.map +1 -1
  204. package/dist/utils/acceptRevisions.js +23 -12
  205. package/dist/utils/acceptRevisions.js.map +1 -1
  206. package/dist/utils/cnfStyleDecoder.d.ts +1 -1
  207. package/dist/utils/cnfStyleDecoder.d.ts.map +1 -1
  208. package/dist/utils/cnfStyleDecoder.js +40 -40
  209. package/dist/utils/cnfStyleDecoder.js.map +1 -1
  210. package/dist/utils/corruptionDetection.d.ts.map +1 -1
  211. package/dist/utils/corruptionDetection.js.map +1 -1
  212. package/dist/utils/dateFormatting.js.map +1 -1
  213. package/dist/utils/deepClone.js +1 -1
  214. package/dist/utils/deepClone.js.map +1 -1
  215. package/dist/utils/diagnostics.d.ts.map +1 -1
  216. package/dist/utils/diagnostics.js +1 -1
  217. package/dist/utils/diagnostics.js.map +1 -1
  218. package/dist/utils/errorHandling.js.map +1 -1
  219. package/dist/utils/formatting.d.ts.map +1 -1
  220. package/dist/utils/formatting.js +10 -2
  221. package/dist/utils/formatting.js.map +1 -1
  222. package/dist/utils/list-detection.d.ts +2 -2
  223. package/dist/utils/list-detection.d.ts.map +1 -1
  224. package/dist/utils/list-detection.js +21 -23
  225. package/dist/utils/list-detection.js.map +1 -1
  226. package/dist/utils/logger.d.ts.map +1 -1
  227. package/dist/utils/logger.js +12 -7
  228. package/dist/utils/logger.js.map +1 -1
  229. package/dist/utils/parsingHelpers.js.map +1 -1
  230. package/dist/utils/stripTrackedChanges.d.ts.map +1 -1
  231. package/dist/utils/stripTrackedChanges.js +3 -3
  232. package/dist/utils/stripTrackedChanges.js.map +1 -1
  233. package/dist/utils/textDiff.d.ts +1 -1
  234. package/dist/utils/textDiff.js +8 -8
  235. package/dist/utils/textDiff.js.map +1 -1
  236. package/dist/utils/units.js.map +1 -1
  237. package/dist/utils/validation.d.ts.map +1 -1
  238. package/dist/utils/validation.js +24 -7
  239. package/dist/utils/validation.js.map +1 -1
  240. package/dist/utils/xmlSanitization.d.ts.map +1 -1
  241. package/dist/utils/xmlSanitization.js +3 -3
  242. package/dist/utils/xmlSanitization.js.map +1 -1
  243. package/dist/validation/RevisionAutoFixer.d.ts.map +1 -1
  244. package/dist/validation/RevisionAutoFixer.js +5 -5
  245. package/dist/validation/RevisionAutoFixer.js.map +1 -1
  246. package/dist/validation/RevisionValidator.d.ts.map +1 -1
  247. package/dist/validation/RevisionValidator.js +7 -9
  248. package/dist/validation/RevisionValidator.js.map +1 -1
  249. package/dist/validation/ValidationRules.js +3 -3
  250. package/dist/validation/ValidationRules.js.map +1 -1
  251. package/dist/validation/index.js.map +1 -1
  252. package/dist/xml/XMLBuilder.d.ts +1 -1
  253. package/dist/xml/XMLBuilder.d.ts.map +1 -1
  254. package/dist/xml/XMLBuilder.js +98 -100
  255. package/dist/xml/XMLBuilder.js.map +1 -1
  256. package/dist/xml/XMLParser.d.ts.map +1 -1
  257. package/dist/xml/XMLParser.js +61 -66
  258. package/dist/xml/XMLParser.js.map +1 -1
  259. package/dist/zip/ZipHandler.d.ts.map +1 -1
  260. package/dist/zip/ZipHandler.js.map +1 -1
  261. package/dist/zip/ZipReader.d.ts.map +1 -1
  262. package/dist/zip/ZipReader.js +1 -3
  263. package/dist/zip/ZipReader.js.map +1 -1
  264. package/dist/zip/ZipWriter.d.ts +1 -1
  265. package/dist/zip/ZipWriter.d.ts.map +1 -1
  266. package/dist/zip/ZipWriter.js +28 -36
  267. package/dist/zip/ZipWriter.js.map +1 -1
  268. package/dist/zip/types.js +1 -1
  269. package/dist/zip/types.js.map +1 -1
  270. package/package.json +92 -92
  271. package/src/__tests__/helper-methods.test.ts +512 -512
  272. package/src/constants/legacyCompatFlags.ts +138 -138
  273. package/src/constants/limits.ts +50 -50
  274. package/src/core/Document.ts +1010 -1145
  275. package/src/core/DocumentContent.ts +461 -467
  276. package/src/core/DocumentGenerator.ts +1133 -1104
  277. package/src/core/DocumentIdManager.ts +158 -158
  278. package/src/core/DocumentParser.ts +2347 -2716
  279. package/src/core/DocumentValidator.ts +363 -372
  280. package/src/core/Relationship.ts +367 -367
  281. package/src/core/RelationshipManager.ts +429 -428
  282. package/src/elements/AlternateContent.ts +42 -42
  283. package/src/elements/Bookmark.ts +212 -210
  284. package/src/elements/BookmarkManager.ts +247 -250
  285. package/src/elements/Comment.ts +356 -359
  286. package/src/elements/CommentManager.ts +499 -502
  287. package/src/elements/CommonTypes.ts +524 -549
  288. package/src/elements/CustomXml.ts +36 -36
  289. package/src/elements/Endnote.ts +221 -217
  290. package/src/elements/EndnoteManager.ts +246 -249
  291. package/src/elements/Field.ts +1292 -1233
  292. package/src/elements/FieldHelpers.ts +329 -333
  293. package/src/elements/FontManager.ts +336 -339
  294. package/src/elements/Footer.ts +269 -269
  295. package/src/elements/Footnote.ts +221 -217
  296. package/src/elements/FootnoteManager.ts +246 -249
  297. package/src/elements/Header.ts +269 -269
  298. package/src/elements/HeaderFooterManager.ts +219 -219
  299. package/src/elements/Hyperlink.ts +1288 -1193
  300. package/src/elements/Image.ts +1982 -1756
  301. package/src/elements/ImageManager.ts +437 -432
  302. package/src/elements/ImageRun.ts +59 -59
  303. package/src/elements/MathElement.ts +65 -65
  304. package/src/elements/Paragraph.ts +4347 -4287
  305. package/src/elements/PreservedElement.ts +53 -53
  306. package/src/elements/PropertyChangeTypes.ts +458 -442
  307. package/src/elements/RangeMarker.ts +382 -400
  308. package/src/elements/Revision.ts +1198 -1217
  309. package/src/elements/RevisionContent.ts +73 -73
  310. package/src/elements/RevisionManager.ts +1070 -1070
  311. package/src/elements/Run.ts +3103 -3073
  312. package/src/elements/Section.ts +1521 -1421
  313. package/src/elements/Shape.ts +884 -873
  314. package/src/elements/StructuredDocumentTag.ts +1176 -1207
  315. package/src/elements/Table.ts +2468 -2524
  316. package/src/elements/TableCell.ts +1617 -1621
  317. package/src/elements/TableGridChange.ts +149 -151
  318. package/src/elements/TableOfContents.ts +701 -691
  319. package/src/elements/TableOfContentsElement.ts +89 -89
  320. package/src/elements/TableRow.ts +960 -929
  321. package/src/elements/TextBox.ts +766 -768
  322. package/src/formatting/AbstractNumbering.ts +580 -579
  323. package/src/formatting/NumberingInstance.ts +295 -299
  324. package/src/formatting/NumberingLevel.ts +981 -1040
  325. package/src/formatting/NumberingManager.ts +875 -827
  326. package/src/formatting/Style.ts +1785 -1879
  327. package/src/formatting/StylesManager.ts +1090 -1130
  328. package/src/helpers/CleanupHelper.ts +524 -524
  329. package/src/images/ImageOptimizer.ts +274 -274
  330. package/src/index.ts +559 -554
  331. package/src/managers/DrawingManager.ts +319 -319
  332. package/src/tracking/DocumentTrackingContext.ts +687 -674
  333. package/src/tracking/TrackingContext.ts +175 -173
  334. package/src/types/compatibility-types.ts +49 -49
  335. package/src/types/formatting.ts +210 -210
  336. package/src/types/list-types.ts +14 -14
  337. package/src/types/settings-types.ts +59 -59
  338. package/src/types/styleConfig.ts +189 -189
  339. package/src/utils/ChangelogGenerator.ts +1583 -1581
  340. package/src/utils/CompatibilityUpgrader.ts +235 -237
  341. package/src/utils/InMemoryRevisionAcceptor.ts +691 -696
  342. package/src/utils/MoveOperationHelper.ts +233 -238
  343. package/src/utils/RevisionAwareProcessor.ts +518 -526
  344. package/src/utils/RevisionWalker.ts +427 -457
  345. package/src/utils/SelectiveRevisionAcceptor.ts +662 -683
  346. package/src/utils/ShadingResolver.ts +105 -107
  347. package/src/utils/acceptRevisions.ts +723 -714
  348. package/src/utils/cnfStyleDecoder.ts +212 -217
  349. package/src/utils/corruptionDetection.ts +346 -345
  350. package/src/utils/dateFormatting.ts +20 -20
  351. package/src/utils/deepClone.ts +77 -78
  352. package/src/utils/diagnostics.ts +125 -129
  353. package/src/utils/errorHandling.ts +80 -80
  354. package/src/utils/formatting.ts +220 -213
  355. package/src/utils/list-detection.ts +32 -42
  356. package/src/utils/logger.ts +412 -404
  357. package/src/utils/parsingHelpers.ts +190 -190
  358. package/src/utils/stripTrackedChanges.ts +356 -353
  359. package/src/utils/textDiff.ts +100 -100
  360. package/src/utils/units.ts +421 -421
  361. package/src/utils/validation.ts +553 -542
  362. package/src/utils/xmlSanitization.ts +179 -182
  363. package/src/validation/RevisionAutoFixer.ts +541 -542
  364. package/src/validation/RevisionValidator.ts +470 -460
  365. package/src/validation/ValidationRules.ts +338 -338
  366. package/src/validation/index.ts +30 -30
  367. package/src/xml/XMLBuilder.ts +857 -871
  368. package/src/xml/XMLParser.ts +877 -919
  369. package/src/zip/ZipHandler.ts +629 -637
  370. package/src/zip/ZipReader.ts +295 -299
  371. package/src/zip/ZipWriter.ts +374 -390
  372. package/src/zip/types.ts +116 -116
@@ -1 +1 @@
1
- {"version":3,"file":"NumberingLevel.js","sourceRoot":"","sources":["../../src/formatting/NumberingLevel.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * NumberingLevel - Defines formatting for a single level in a list\r\n *\r\n * A numbering level specifies how a particular list level (0-8) should be formatted,\r\n * including the numbering format (bullet, decimal, roman, etc.), text template,\r\n * alignment, and indentation.\r\n */\r\n\r\nimport { XMLBuilder, XMLElement } from \"../xml/XMLBuilder\";\r\n\r\n/**\r\n * Word-native bullet character mappings\r\n *\r\n * Microsoft Word uses specific fonts with Private Use Area (PUA) characters\r\n * for bullet points. These mappings ensure 100% compatibility with Word's\r\n * native bullet rendering.\r\n *\r\n * Pattern: Levels 0,3,6 = filled bullet; 1,4,7 = open circle; 2,5,8 = filled square\r\n */\r\nexport const WORD_NATIVE_BULLETS = {\r\n /** Filled bullet (levels 0, 3, 6) - Symbol font U+F0B7 */\r\n FILLED_BULLET: { char: \"\\uF0B7\", font: \"Symbol\" },\r\n /** Open circle (levels 1, 4, 7) - Courier New U+006F (lowercase 'o') */\r\n OPEN_CIRCLE: { char: \"\\u006F\", font: \"Courier New\" },\r\n /** Filled square (levels 2, 5, 8) - Wingdings U+F0A7 */\r\n FILLED_SQUARE: { char: \"\\uF0A7\", font: \"Wingdings\" },\r\n} as const;\r\n\r\n/**\r\n * Type for Word-native bullet definition\r\n */\r\nexport type WordNativeBullet =\r\n (typeof WORD_NATIVE_BULLETS)[keyof typeof WORD_NATIVE_BULLETS];\r\n\r\n/**\r\n * Numbering format types supported by Word\r\n */\r\nexport type NumberFormat =\r\n | \"bullet\" // Bullet character\r\n | \"decimal\" // 1, 2, 3, ...\r\n | \"lowerRoman\" // i, ii, iii, ...\r\n | \"upperRoman\" // I, II, III, ...\r\n | \"lowerLetter\" // a, b, c, ...\r\n | \"upperLetter\" // A, B, C, ...\r\n | \"ordinal\" // 1st, 2nd, 3rd, ...\r\n | \"cardinalText\" // One, Two, Three, ...\r\n | \"ordinalText\" // First, Second, Third, ...\r\n | \"hex\" // 0x01, 0x02, ...\r\n | \"chicago\" // *, †, ‡, §, ...\r\n | \"decimal zero\"; // 01, 02, 03, ...\r\n\r\n/**\r\n * Alignment for the numbering text\r\n */\r\nexport type NumberAlignment = \"left\" | \"center\" | \"right\" | \"start\" | \"end\";\r\n\r\n/**\r\n * Properties for creating a numbering level\r\n */\r\nexport interface NumberingLevelProperties {\r\n /** The level index (0-8, where 0 is the outermost level) */\r\n level: number;\r\n\r\n /** The numbering format */\r\n format: NumberFormat;\r\n\r\n /** The text template (e.g., \"%1.\" for decimal, \"•\" for bullet) */\r\n text: string;\r\n\r\n /** Alignment of the numbering text */\r\n alignment?: NumberAlignment;\r\n\r\n /** Starting value (for numeric formats, default: 1) */\r\n start?: number;\r\n\r\n /** Left indentation in twips (can be negative for outdents into margin) */\r\n leftIndent?: number;\r\n\r\n /** Hanging indentation in twips (for the text after the number) */\r\n hangingIndent?: number;\r\n\r\n /** Font family for the numbering character (useful for bullets) */\r\n font?: string;\r\n\r\n /** Font size in half-points (e.g., 22 = 11pt) */\r\n fontSize?: number;\r\n\r\n /** Whether to show text after the number (default: true) */\r\n isLegalNumberingStyle?: boolean;\r\n\r\n /** Suffix after the number (tab, space, or nothing) */\r\n suffix?: \"tab\" | \"space\" | \"nothing\";\r\n\r\n /** Text color in hex (without #) */\r\n color?: string;\r\n\r\n /** Whether the numbering text is bold */\r\n bold?: boolean;\r\n\r\n /** Whether the numbering text is italic */\r\n italic?: boolean;\r\n\r\n /** Underline style for numbering text ('single', 'double', 'wave', 'dotted', 'dash', etc.) */\r\n underline?: string;\r\n\r\n /**\r\n * Level at which numbering should restart (w:lvlRestart per ECMA-376 Part 1 §17.9.11)\r\n * Specifies when to restart this level's numbering based on a higher-level change:\r\n * - 0: Never restart (continues throughout document)\r\n * - 1-8: Restart when the specified level changes\r\n * - undefined (default): Restart when level-1 changes (standard behavior)\r\n */\r\n lvlRestart?: number;\r\n\r\n /** Paragraph style ID linked to this numbering level (w:pStyle per ECMA-376 §17.9.23) */\r\n pStyle?: string;\r\n}\r\n\r\n/**\r\n * Represents a single level in a numbering definition\r\n */\r\nexport class NumberingLevel {\r\n private properties: Required<Omit<NumberingLevelProperties, 'lvlRestart' | 'underline' | 'pStyle'>> & Pick<NumberingLevelProperties, 'lvlRestart' | 'underline' | 'pStyle'>;\r\n\r\n /**\r\n * Creates a new numbering level\r\n * @param properties The level properties\r\n */\r\n constructor(properties: NumberingLevelProperties) {\r\n // Set defaults\r\n this.properties = {\r\n level: properties.level,\r\n format: properties.format,\r\n text: properties.text,\r\n alignment: properties.alignment || \"left\",\r\n start: properties.start !== undefined ? properties.start : 1,\r\n leftIndent:\r\n properties.leftIndent !== undefined\r\n ? properties.leftIndent\r\n : 720 + properties.level * 360,\r\n hangingIndent:\r\n properties.hangingIndent !== undefined ? properties.hangingIndent : 360,\r\n font: properties.font || \"Calibri\",\r\n fontSize: properties.fontSize || 22, // 11pt default\r\n isLegalNumberingStyle:\r\n properties.isLegalNumberingStyle !== undefined\r\n ? properties.isLegalNumberingStyle\r\n : false,\r\n suffix: properties.suffix || \"tab\",\r\n color: properties.color || \"000000\",\r\n bold: properties.bold !== undefined ? properties.bold : false,\r\n italic: properties.italic !== undefined ? properties.italic : false,\r\n underline: properties.underline,\r\n lvlRestart: properties.lvlRestart, // undefined means default behavior (restart on level-1 change)\r\n pStyle: properties.pStyle,\r\n };\r\n\r\n this.validate();\r\n }\r\n\r\n /**\r\n * Validates the level properties\r\n */\r\n private validate(): void {\r\n if (this.properties.level < 0 || this.properties.level > 8) {\r\n throw new Error(\r\n `Level must be between 0 and 8, got ${this.properties.level}`\r\n );\r\n }\r\n\r\n // Note: leftIndent CAN be negative (outdent into margin) per ECMA-376\r\n // This is valid and used for hanging indents where bullets appear in margin\r\n\r\n if (this.properties.hangingIndent < 0) {\r\n throw new Error(\"Hanging indent must be non-negative\");\r\n }\r\n\r\n if (this.properties.start < 0) {\r\n throw new Error(\"Start value must be non-negative\");\r\n }\r\n }\r\n\r\n /**\r\n * Calculates safe indentation values for a given level based on page constraints.\r\n *\r\n * Use this instead of default indentation when working with narrow pages or\r\n * deep nesting levels to ensure content stays within page margins.\r\n *\r\n * @param level The level index (0-8)\r\n * @param pageWidthTwips Page width in twips (default: 12240 = 8.5 inches)\r\n * @param leftMarginTwips Left margin in twips (default: 1440 = 1 inch)\r\n * @param rightMarginTwips Right margin in twips (default: 1440 = 1 inch)\r\n * @param minContentWidth Minimum content width in twips (default: 2880 = 2 inches)\r\n * @returns Safe indentation values that won't exceed available space\r\n *\r\n * @example\r\n * ```typescript\r\n * // For a narrow page (6\" wide with 0.5\" margins)\r\n * const indent = NumberingLevel.calculateSafeIndentation(\r\n * 5, // level 5\r\n * 8640, // 6 inches page width\r\n * 720, // 0.5 inch left margin\r\n * 720 // 0.5 inch right margin\r\n * );\r\n * ```\r\n */\r\n static calculateSafeIndentation(\r\n level: number,\r\n pageWidthTwips = 12240,\r\n leftMarginTwips = 1440,\r\n rightMarginTwips = 1440,\r\n minContentWidth = 2880\r\n ): { leftIndent: number; hangingIndent: number } {\r\n if (level < 0 || level > 8) {\r\n throw new Error(`Invalid level ${level}. Level must be between 0 and 8.`);\r\n }\r\n\r\n // Calculate available content width\r\n const availableWidth = pageWidthTwips - leftMarginTwips - rightMarginTwips;\r\n\r\n // Calculate max safe indent (leave space for content)\r\n const maxSafeIndent = Math.max(0, availableWidth - minContentWidth);\r\n\r\n // Standard indentation\r\n const standardLeftIndent = 720 + level * 360;\r\n const hangingIndent = 360;\r\n\r\n // Cap at safe maximum\r\n const safeLeftIndent = Math.min(standardLeftIndent, maxSafeIndent);\r\n\r\n return {\r\n leftIndent: safeLeftIndent,\r\n hangingIndent,\r\n };\r\n }\r\n\r\n /**\r\n * Gets the level index\r\n */\r\n getLevel(): number {\r\n return this.properties.level;\r\n }\r\n\r\n /**\r\n * Gets the numbering format\r\n */\r\n getFormat(): NumberFormat {\r\n return this.properties.format;\r\n }\r\n\r\n /**\r\n * Gets the level properties\r\n */\r\n getProperties(): Required<Omit<NumberingLevelProperties, 'lvlRestart' | 'underline' | 'pStyle'>> & Pick<NumberingLevelProperties, 'lvlRestart' | 'underline' | 'pStyle'> {\r\n return { ...this.properties };\r\n }\r\n\r\n /**\r\n * Sets the left indentation\r\n * @param twips Indentation in twips\r\n */\r\n setLeftIndent(twips: number): this {\r\n // Note: Negative values are valid (outdent into margin) per ECMA-376\r\n this.properties.leftIndent = twips;\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets the hanging indentation\r\n * @param twips Indentation in twips\r\n */\r\n setHangingIndent(twips: number): this {\r\n if (twips < 0) {\r\n throw new Error(\"Hanging indent must be non-negative\");\r\n }\r\n this.properties.hangingIndent = twips;\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets the font for the numbering character\r\n * @param font Font family name\r\n */\r\n setFont(font: string): this {\r\n this.properties.font = font;\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets the alignment\r\n * @param alignment Alignment type\r\n */\r\n setAlignment(alignment: NumberAlignment): this {\r\n this.properties.alignment = alignment;\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets the font size in half-points\r\n * @param halfPoints Font size in half-points (e.g., 24 = 12pt)\r\n */\r\n setFontSize(halfPoints: number): this {\r\n this.properties.fontSize = halfPoints;\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets the level text (bullet character or number template)\r\n * @param text The text template (e.g., '•' for bullets, '%1.' for numbered)\r\n */\r\n setText(text: string): this {\r\n this.properties.text = text;\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets the text color\r\n * @param color Hex color without # (e.g., '000000' for black)\r\n */\r\n setColor(color: string): this {\r\n this.properties.color = color;\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets whether the numbering text is bold\r\n * @param bold Whether to make bold\r\n */\r\n setBold(bold: boolean): this {\r\n this.properties.bold = bold;\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets whether the numbering text is italic\r\n * @param italic Whether to make italic\r\n */\r\n setItalic(italic: boolean): this {\r\n this.properties.italic = italic;\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets whether the numbering text is italic\r\n */\r\n getItalic(): boolean {\r\n return this.properties.italic ?? false;\r\n }\r\n\r\n /**\r\n * Sets the underline style for numbering text\r\n * @param style Underline style ('single', 'double', 'wave', 'dotted', 'dash', etc.)\r\n */\r\n setUnderline(style: string | undefined): this {\r\n this.properties.underline = style;\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets the underline style\r\n */\r\n getUnderline(): string | undefined {\r\n return this.properties.underline;\r\n }\r\n\r\n /**\r\n * Clears the underline style\r\n */\r\n clearUnderline(): this {\r\n this.properties.underline = undefined;\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets the level restart behavior (w:lvlRestart per ECMA-376 Part 1 §17.9.11)\r\n *\r\n * Controls when this level's numbering restarts based on higher-level changes:\r\n * - 0: Never restart (continues throughout document)\r\n * - 1-8: Restart when the specified level changes\r\n * - undefined: Restart when level-1 changes (standard/default behavior)\r\n *\r\n * @param level The level that triggers restart (0-8), or undefined for default\r\n * @example\r\n * // Level 1 that never restarts (continuous across document)\r\n * level1.setLvlRestart(0);\r\n *\r\n * // Level 2 that restarts when level 0 changes (not level 1)\r\n * level2.setLvlRestart(0);\r\n */\r\n setLvlRestart(level: number | undefined): this {\r\n if (level !== undefined && (level < 0 || level > 8)) {\r\n throw new Error(`lvlRestart must be between 0 and 8, got ${level}`);\r\n }\r\n this.properties.lvlRestart = level;\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets the level restart value\r\n * @returns The level that triggers restart, or undefined for default behavior\r\n */\r\n getLvlRestart(): number | undefined {\r\n return this.properties.lvlRestart;\r\n }\r\n\r\n /**\r\n * Sets the paragraph style ID linked to this numbering level\r\n * Links this level to a paragraph style definition (w:pStyle per ECMA-376 §17.9.23)\r\n * @param styleId The paragraph style ID\r\n */\r\n setParagraphStyle(styleId: string): this {\r\n this.properties.pStyle = styleId;\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets the paragraph style ID linked to this numbering level\r\n */\r\n getParagraphStyle(): string | undefined {\r\n return this.properties.pStyle;\r\n }\r\n\r\n /**\r\n * Sets the numbering format (decimal, lowerLetter, bullet, etc.)\r\n * @param format The numbering format\r\n */\r\n setFormat(format: NumberFormat): this {\r\n this.properties.format = NumberingLevel.normalizeFormat(format);\r\n return this;\r\n }\r\n\r\n /**\r\n * Normalizes display-string format values to ECMA-376 ST_NumberFormat names.\r\n * Accepts both standard format names and common display shortcuts.\r\n */\r\n static normalizeFormat(format: string): NumberFormat {\r\n const corrections: Record<string, NumberFormat> = {\r\n \"a.\": \"lowerLetter\",\r\n \"A.\": \"upperLetter\",\r\n \"i.\": \"lowerRoman\",\r\n \"I.\": \"upperRoman\",\r\n \"1.\": \"decimal\",\r\n };\r\n return (corrections[format] ?? format) as NumberFormat;\r\n }\r\n\r\n /**\r\n * Generates the WordprocessingML XML for this level\r\n */\r\n toXML(): XMLElement {\r\n // ECMA-376 CT_Lvl element order: start, numFmt, lvlRestart, pStyle, isLgl, suff, lvlText, lvlJc, pPr, rPr\r\n const children: XMLElement[] = [];\r\n\r\n // 1. Start value\r\n children.push(\r\n XMLBuilder.wSelf(\"start\", { \"w:val\": this.properties.start.toString() })\r\n );\r\n\r\n // 2. Number format\r\n children.push(\r\n XMLBuilder.wSelf(\"numFmt\", { \"w:val\": this.properties.format })\r\n );\r\n\r\n // 3. Level restart (w:lvlRestart per ECMA-376 Part 1 §17.9.11)\r\n if (this.properties.lvlRestart !== undefined) {\r\n children.push(\r\n XMLBuilder.wSelf(\"lvlRestart\", { \"w:val\": this.properties.lvlRestart.toString() })\r\n );\r\n }\r\n\r\n // 4. pStyle (paragraph style link)\r\n if (this.properties.pStyle) {\r\n children.push(\r\n XMLBuilder.wSelf(\"pStyle\", { \"w:val\": this.properties.pStyle })\r\n );\r\n }\r\n\r\n // 5. Legal numbering style\r\n if (this.properties.isLegalNumberingStyle) {\r\n children.push(XMLBuilder.wSelf(\"isLgl\"));\r\n }\r\n\r\n // 6. Suffix (what comes after the number)\r\n if (this.properties.suffix) {\r\n children.push(\r\n XMLBuilder.wSelf(\"suff\", { \"w:val\": this.properties.suffix })\r\n );\r\n }\r\n\r\n // 7. Level text (e.g., \"%1.\" or \"•\")\r\n children.push(\r\n XMLBuilder.wSelf(\"lvlText\", { \"w:val\": this.properties.text })\r\n );\r\n\r\n // 8. Alignment\r\n children.push(\r\n XMLBuilder.wSelf(\"lvlJc\", { \"w:val\": this.properties.alignment })\r\n );\r\n\r\n // 9. Paragraph properties (indentation)\r\n const ind = XMLBuilder.wSelf(\"ind\", {\r\n \"w:left\": this.properties.leftIndent.toString(),\r\n \"w:hanging\": this.properties.hangingIndent.toString(),\r\n });\r\n const pPr = XMLBuilder.w(\"pPr\", undefined, [ind]);\r\n children.push(pPr);\r\n\r\n // 10. Run properties (font)\r\n const rPrChildren: XMLElement[] = [];\r\n\r\n // Font\r\n rPrChildren.push(\r\n XMLBuilder.wSelf(\"rFonts\", {\r\n \"w:ascii\": this.properties.font,\r\n \"w:hAnsi\": this.properties.font,\r\n \"w:cs\": this.properties.font,\r\n \"w:hint\": \"default\",\r\n })\r\n );\r\n\r\n // Bold\r\n if (this.properties.bold) {\r\n rPrChildren.push(XMLBuilder.wSelf(\"b\"));\r\n rPrChildren.push(XMLBuilder.wSelf(\"bCs\"));\r\n }\r\n\r\n // Italic\r\n if (this.properties.italic) {\r\n rPrChildren.push(XMLBuilder.wSelf(\"i\"));\r\n rPrChildren.push(XMLBuilder.wSelf(\"iCs\"));\r\n }\r\n\r\n // Underline\r\n if (this.properties.underline) {\r\n rPrChildren.push(\r\n XMLBuilder.wSelf(\"u\", { \"w:val\": this.properties.underline })\r\n );\r\n }\r\n\r\n // Color\r\n if (this.properties.color) {\r\n rPrChildren.push(\r\n XMLBuilder.wSelf(\"color\", { \"w:val\": this.properties.color })\r\n );\r\n }\r\n\r\n // Font size\r\n rPrChildren.push(\r\n XMLBuilder.wSelf(\"sz\", { \"w:val\": this.properties.fontSize.toString() })\r\n );\r\n rPrChildren.push(\r\n XMLBuilder.wSelf(\"szCs\", { \"w:val\": this.properties.fontSize.toString() })\r\n );\r\n\r\n const rPr = XMLBuilder.w(\"rPr\", undefined, rPrChildren);\r\n children.push(rPr);\r\n\r\n return XMLBuilder.w(\r\n \"lvl\",\r\n { \"w:ilvl\": this.properties.level.toString() },\r\n children\r\n );\r\n }\r\n\r\n /**\r\n * Gets the recommended bullet symbol and font for a given level\r\n * @param level The level index (0-8)\r\n * @param style Optional bullet style ('standard', 'circle', 'square', 'arrow', 'check', 'word-native')\r\n * @returns Object with symbol and font properties\r\n */\r\n static getBulletSymbolWithFont(\r\n level: number,\r\n style:\r\n | \"standard\"\r\n | \"circle\"\r\n | \"square\"\r\n | \"arrow\"\r\n | \"check\"\r\n | \"word-native\" = \"standard\"\r\n ): { symbol: string; font: string } {\r\n const bulletSets = {\r\n // Standard style now uses Word-native encoding for maximum compatibility\r\n standard: [\r\n {\r\n symbol: WORD_NATIVE_BULLETS.FILLED_BULLET.char,\r\n font: WORD_NATIVE_BULLETS.FILLED_BULLET.font,\r\n }, // Level 0: Filled bullet (Symbol U+F0B7)\r\n {\r\n symbol: WORD_NATIVE_BULLETS.OPEN_CIRCLE.char,\r\n font: WORD_NATIVE_BULLETS.OPEN_CIRCLE.font,\r\n }, // Level 1: Open circle (Courier New U+006F)\r\n {\r\n symbol: WORD_NATIVE_BULLETS.FILLED_SQUARE.char,\r\n font: WORD_NATIVE_BULLETS.FILLED_SQUARE.font,\r\n }, // Level 2: Filled square (Wingdings U+F0A7)\r\n {\r\n symbol: WORD_NATIVE_BULLETS.FILLED_BULLET.char,\r\n font: WORD_NATIVE_BULLETS.FILLED_BULLET.font,\r\n }, // Level 3: Filled bullet\r\n {\r\n symbol: WORD_NATIVE_BULLETS.OPEN_CIRCLE.char,\r\n font: WORD_NATIVE_BULLETS.OPEN_CIRCLE.font,\r\n }, // Level 4: Open circle\r\n {\r\n symbol: WORD_NATIVE_BULLETS.FILLED_SQUARE.char,\r\n font: WORD_NATIVE_BULLETS.FILLED_SQUARE.font,\r\n }, // Level 5: Filled square\r\n {\r\n symbol: WORD_NATIVE_BULLETS.FILLED_BULLET.char,\r\n font: WORD_NATIVE_BULLETS.FILLED_BULLET.font,\r\n }, // Level 6: Filled bullet\r\n {\r\n symbol: WORD_NATIVE_BULLETS.OPEN_CIRCLE.char,\r\n font: WORD_NATIVE_BULLETS.OPEN_CIRCLE.font,\r\n }, // Level 7: Open circle\r\n {\r\n symbol: WORD_NATIVE_BULLETS.FILLED_SQUARE.char,\r\n font: WORD_NATIVE_BULLETS.FILLED_SQUARE.font,\r\n }, // Level 8: Filled square\r\n ],\r\n circle: [\r\n { symbol: \"●\", font: \"Calibri\" }, // Level 0: Filled circle (bold)\r\n { symbol: \"○\", font: \"Calibri\" }, // Level 1: Empty circle\r\n { symbol: \"◉\", font: \"Calibri\" }, // Level 2: Fisheye\r\n { symbol: \"◯\", font: \"Calibri\" }, // Level 3: Large circle\r\n { symbol: \"⦿\", font: \"Calibri\" }, // Level 4: Circled bullet\r\n { symbol: \"○\", font: \"Calibri\" }, // Level 5: Empty circle\r\n { symbol: \"●\", font: \"Calibri\" }, // Level 6: Filled circle\r\n { symbol: \"○\", font: \"Calibri\" }, // Level 7: Empty circle\r\n { symbol: \"◉\", font: \"Calibri\" }, // Level 8: Fisheye\r\n ],\r\n square: [\r\n { symbol: \"■\", font: \"Calibri\" }, // Level 0: Filled square\r\n { symbol: \"□\", font: \"Calibri\" }, // Level 1: Empty square\r\n { symbol: \"▪\", font: \"Calibri\" }, // Level 2: Small filled square\r\n { symbol: \"▫\", font: \"Calibri\" }, // Level 3: Small empty square\r\n { symbol: \"◼\", font: \"Calibri\" }, // Level 4: Medium filled square\r\n { symbol: \"◻\", font: \"Calibri\" }, // Level 5: Medium empty square\r\n { symbol: \"■\", font: \"Calibri\" }, // Level 6: Filled square\r\n { symbol: \"□\", font: \"Calibri\" }, // Level 7: Empty square\r\n { symbol: \"▪\", font: \"Calibri\" }, // Level 8: Small filled square\r\n ],\r\n arrow: [\r\n { symbol: \"➢\", font: \"Calibri\" }, // Level 0: Right arrow\r\n { symbol: \"➣\", font: \"Calibri\" }, // Level 1: Right arrow filled\r\n { symbol: \"➤\", font: \"Calibri\" }, // Level 2: Right arrow bold\r\n { symbol: \"➔\", font: \"Calibri\" }, // Level 3: Right arrow simple\r\n { symbol: \"➜\", font: \"Calibri\" }, // Level 4: Right arrow outline\r\n { symbol: \"➢\", font: \"Calibri\" }, // Level 5: Right arrow\r\n { symbol: \"➣\", font: \"Calibri\" }, // Level 6: Right arrow filled\r\n { symbol: \"➤\", font: \"Calibri\" }, // Level 7: Right arrow bold\r\n { symbol: \"➔\", font: \"Calibri\" }, // Level 8: Right arrow simple\r\n ],\r\n check: [\r\n { symbol: \"✓\", font: \"Calibri\" }, // Level 0: Check mark\r\n { symbol: \"✔\", font: \"Calibri\" }, // Level 1: Heavy check mark\r\n { symbol: \"☑\", font: \"Calibri\" }, // Level 2: Checked box\r\n { symbol: \"✓\", font: \"Calibri\" }, // Level 3: Check mark\r\n { symbol: \"✔\", font: \"Calibri\" }, // Level 4: Heavy check mark\r\n { symbol: \"☑\", font: \"Calibri\" }, // Level 5: Checked box\r\n { symbol: \"✓\", font: \"Calibri\" }, // Level 6: Check mark\r\n { symbol: \"✔\", font: \"Calibri\" }, // Level 7: Heavy check mark\r\n { symbol: \"☑\", font: \"Calibri\" }, // Level 8: Checked box\r\n ],\r\n \"word-native\": [\r\n // Word-native bullets using PUA characters with Symbol/Wingdings fonts\r\n {\r\n symbol: WORD_NATIVE_BULLETS.FILLED_BULLET.char,\r\n font: WORD_NATIVE_BULLETS.FILLED_BULLET.font,\r\n }, // Level 0: Filled bullet (Symbol U+F0B7)\r\n {\r\n symbol: WORD_NATIVE_BULLETS.OPEN_CIRCLE.char,\r\n font: WORD_NATIVE_BULLETS.OPEN_CIRCLE.font,\r\n }, // Level 1: Open circle (Courier New U+006F)\r\n {\r\n symbol: WORD_NATIVE_BULLETS.FILLED_SQUARE.char,\r\n font: WORD_NATIVE_BULLETS.FILLED_SQUARE.font,\r\n }, // Level 2: Filled square (Wingdings U+F0A7)\r\n {\r\n symbol: WORD_NATIVE_BULLETS.FILLED_BULLET.char,\r\n font: WORD_NATIVE_BULLETS.FILLED_BULLET.font,\r\n }, // Level 3: Filled bullet\r\n {\r\n symbol: WORD_NATIVE_BULLETS.OPEN_CIRCLE.char,\r\n font: WORD_NATIVE_BULLETS.OPEN_CIRCLE.font,\r\n }, // Level 4: Open circle\r\n {\r\n symbol: WORD_NATIVE_BULLETS.FILLED_SQUARE.char,\r\n font: WORD_NATIVE_BULLETS.FILLED_SQUARE.font,\r\n }, // Level 5: Filled square\r\n {\r\n symbol: WORD_NATIVE_BULLETS.FILLED_BULLET.char,\r\n font: WORD_NATIVE_BULLETS.FILLED_BULLET.font,\r\n }, // Level 6: Filled bullet\r\n {\r\n symbol: WORD_NATIVE_BULLETS.OPEN_CIRCLE.char,\r\n font: WORD_NATIVE_BULLETS.OPEN_CIRCLE.font,\r\n }, // Level 7: Open circle\r\n {\r\n symbol: WORD_NATIVE_BULLETS.FILLED_SQUARE.char,\r\n font: WORD_NATIVE_BULLETS.FILLED_SQUARE.font,\r\n }, // Level 8: Filled square\r\n ],\r\n };\r\n\r\n const selectedSet = bulletSets[style];\r\n const levelIndex = level % selectedSet.length;\r\n const result = selectedSet[levelIndex];\r\n\r\n // Fallback to standard bullet if somehow undefined\r\n return result || { symbol: \"•\", font: \"Calibri\" };\r\n }\r\n\r\n /**\r\n * Calculates the standard indentation values for a given level\r\n * @param level The level index (0-8)\r\n * @returns Object with leftIndent and hangingIndent in twips\r\n * @example\r\n * const indent = NumberingLevel.calculateStandardIndentation(0);\r\n * // Returns: { leftIndent: 720, hangingIndent: 360 } (0.5\" left, 0.25\" hanging)\r\n *\r\n * const indent2 = NumberingLevel.calculateStandardIndentation(2);\r\n * // Returns: { leftIndent: 1440, hangingIndent: 360 } (1.0\" left, 0.25\" hanging)\r\n */\r\n static calculateStandardIndentation(level: number): {\r\n leftIndent: number;\r\n hangingIndent: number;\r\n } {\r\n if (level < 0 || level > 8) {\r\n throw new Error(`Invalid level ${level}. Level must be between 0 and 8.`);\r\n }\r\n\r\n return {\r\n leftIndent: 720 + level * 360,\r\n hangingIndent: 360,\r\n };\r\n }\r\n\r\n /**\r\n * Gets the standard number format for a given level\r\n * @param level The level index (0-8)\r\n * @returns The recommended number format for this level\r\n * @example\r\n * NumberingLevel.getStandardNumberFormat(0); // 'decimal' (1., 2., 3.)\r\n * NumberingLevel.getStandardNumberFormat(1); // 'lowerLetter' (a., b., c.)\r\n * NumberingLevel.getStandardNumberFormat(2); // 'lowerRoman' (i., ii., iii.)\r\n * NumberingLevel.getStandardNumberFormat(3); // 'upperLetter' (A., B., C.)\r\n * NumberingLevel.getStandardNumberFormat(4); // 'upperRoman' (I., II., III.)\r\n */\r\n static getStandardNumberFormat(level: number): NumberFormat {\r\n if (level < 0 || level > 8) {\r\n throw new Error(`Invalid level ${level}. Level must be between 0 and 8.`);\r\n }\r\n\r\n const formats: NumberFormat[] = [\r\n \"decimal\", // Level 0: 1., 2., 3.\r\n \"lowerLetter\", // Level 1: a., b., c.\r\n \"lowerRoman\", // Level 2: i., ii., iii.\r\n \"upperLetter\", // Level 3: A., B., C.\r\n \"upperRoman\", // Level 4: I., II., III.\r\n ];\r\n\r\n const result = formats[level % formats.length];\r\n return result || \"decimal\"; // Fallback to decimal (should never happen)\r\n }\r\n\r\n /**\r\n * Creates a bullet list level\r\n *\r\n * When called without parameters, uses Word-native encoding for the level:\r\n * - Levels 0, 3, 6: Filled bullet (Symbol font, U+F0B7)\r\n * - Levels 1, 4, 7: Open circle (Courier New, U+006F)\r\n * - Levels 2, 5, 8: Filled square (Wingdings, U+F0A7)\r\n *\r\n * @param level The level index (0-8)\r\n * @param bullet Optional bullet character (defaults to Word-native for level)\r\n * @param font Optional font to use for the bullet (defaults to Word-native for level)\r\n */\r\n static createBulletLevel(\r\n level: number,\r\n bullet?: string,\r\n font?: string\r\n ): NumberingLevel {\r\n // Use Word-native defaults when not specified\r\n const defaults = NumberingLevel.getBulletSymbolWithFont(level, \"standard\");\r\n const actualBullet = bullet ?? defaults.symbol;\r\n const actualFont = font ?? defaults.font;\r\n\r\n return new NumberingLevel({\r\n level,\r\n format: \"bullet\",\r\n text: actualBullet,\r\n alignment: \"left\",\r\n font: actualFont,\r\n fontSize: 24, // 12pt\r\n bold: false,\r\n color: \"000000\",\r\n leftIndent: 720 + level * 360,\r\n hangingIndent: 360,\r\n });\r\n }\r\n\r\n /**\r\n * Creates a decimal list level (1, 2, 3, ...)\r\n * @param level The level index (0-8)\r\n * @param template The text template (default: '%1.')\r\n */\r\n static createDecimalLevel(\r\n level: number,\r\n template = `%${level + 1}.`\r\n ): NumberingLevel {\r\n return new NumberingLevel({\r\n level,\r\n format: \"decimal\",\r\n text: template,\r\n alignment: \"left\",\r\n font: \"Verdana\",\r\n fontSize: 24, // 12pt\r\n bold: false,\r\n color: \"000000\",\r\n leftIndent: 720 + level * 360,\r\n hangingIndent: 360,\r\n });\r\n }\r\n\r\n /**\r\n * Creates a lower roman list level (i, ii, iii, ...)\r\n * @param level The level index (0-8)\r\n * @param template The text template (default: '%1.')\r\n */\r\n static createLowerRomanLevel(\r\n level: number,\r\n template = `%${level + 1}.`\r\n ): NumberingLevel {\r\n return new NumberingLevel({\r\n level,\r\n format: \"lowerRoman\",\r\n text: template,\r\n alignment: \"left\",\r\n font: \"Verdana\",\r\n fontSize: 24, // 12pt\r\n bold: false,\r\n color: \"000000\",\r\n leftIndent: 720 + level * 360,\r\n hangingIndent: 360,\r\n });\r\n }\r\n\r\n /**\r\n * Creates an upper roman list level (I, II, III, ...)\r\n * @param level The level index (0-8)\r\n * @param template The text template (default: '%1.')\r\n */\r\n static createUpperRomanLevel(\r\n level: number,\r\n template = `%${level + 1}.`\r\n ): NumberingLevel {\r\n return new NumberingLevel({\r\n level,\r\n format: \"upperRoman\",\r\n text: template,\r\n alignment: \"left\",\r\n font: \"Verdana\",\r\n fontSize: 24, // 12pt\r\n bold: false,\r\n color: \"000000\",\r\n leftIndent: 720 + level * 360,\r\n hangingIndent: 360,\r\n });\r\n }\r\n\r\n /**\r\n * Creates a lower letter list level (a, b, c, ...)\r\n * @param level The level index (0-8)\r\n * @param template The text template (default: '%1.')\r\n */\r\n static createLowerLetterLevel(\r\n level: number,\r\n template = `%${level + 1}.`\r\n ): NumberingLevel {\r\n return new NumberingLevel({\r\n level,\r\n format: \"lowerLetter\",\r\n text: template,\r\n alignment: \"left\",\r\n font: \"Verdana\",\r\n fontSize: 24, // 12pt\r\n bold: false,\r\n color: \"000000\",\r\n leftIndent: 720 + level * 360,\r\n hangingIndent: 360,\r\n });\r\n }\r\n\r\n /**\r\n * Creates an upper letter list level (A, B, C, ...)\r\n * @param level The level index (0-8)\r\n * @param template The text template (default: '%1.')\r\n */\r\n static createUpperLetterLevel(\r\n level: number,\r\n template = `%${level + 1}.`\r\n ): NumberingLevel {\r\n return new NumberingLevel({\r\n level,\r\n format: \"upperLetter\",\r\n text: template,\r\n alignment: \"left\",\r\n font: \"Verdana\",\r\n fontSize: 24, // 12pt\r\n bold: false,\r\n color: \"000000\",\r\n leftIndent: 720 + level * 360,\r\n hangingIndent: 360,\r\n });\r\n }\r\n\r\n /**\r\n * Factory method for creating a numbering level\r\n * @param properties The level properties\r\n */\r\n static create(properties: NumberingLevelProperties): NumberingLevel {\r\n return new NumberingLevel(properties);\r\n }\r\n\r\n /**\r\n * Creates a NumberingLevel from XML element\r\n * @param xml The XML string of the <w:lvl> element\r\n * @returns NumberingLevel instance\r\n */\r\n static fromXML(xml: string): NumberingLevel {\r\n // Extract level index (required)\r\n const ilvlMatch = /<w:lvl[^>]*w:ilvl=\"([^\"]+)\"/.exec(xml);\r\n if (!ilvlMatch?.[1]) {\r\n throw new Error(\"Missing required w:ilvl attribute\");\r\n }\r\n const level = parseInt(ilvlMatch[1], 10);\r\n\r\n // Extract number format (required)\r\n const numFmtMatch = /<w:numFmt[^>]*w:val=\"([^\"]+)\"/.exec(xml);\r\n if (!numFmtMatch?.[1]) {\r\n throw new Error(\"Missing required w:numFmt element\");\r\n }\r\n const format = NumberingLevel.normalizeFormat(numFmtMatch[1]);\r\n\r\n // Extract level text (optional - can be empty for placeholder levels)\r\n const lvlTextMatch = /<w:lvlText[^>]*w:val=\"([^\"]*)\"/.exec(xml);\r\n const text = lvlTextMatch?.[1] !== undefined ? lvlTextMatch[1] : \"\";\r\n\r\n // Extract alignment (optional, default: left)\r\n const lvlJcMatch = /<w:lvlJc[^>]*w:val=\"([^\"]+)\"/.exec(xml);\r\n const alignment = (\r\n lvlJcMatch?.[1] ? lvlJcMatch[1] : \"left\"\r\n ) as NumberAlignment;\r\n\r\n // Extract start value (optional, default: 1)\r\n const startMatch = /<w:start[^>]*w:val=\"([^\"]+)\"/.exec(xml);\r\n const start = startMatch?.[1] ? parseInt(startMatch[1], 10) : 1;\r\n\r\n // Extract suffix (optional, default: tab)\r\n const suffixMatch = /<w:suff[^>]*w:val=\"([^\"]+)\"/.exec(xml);\r\n const suffix =\r\n suffixMatch?.[1]\r\n ? (suffixMatch[1] as \"tab\" | \"space\" | \"nothing\")\r\n : \"tab\";\r\n\r\n // Extract level restart (w:lvlRestart per ECMA-376 Part 1 §17.9.11)\r\n let lvlRestart: number | undefined;\r\n const lvlRestartMatch = /<w:lvlRestart[^>]*w:val=\"([^\"]+)\"/.exec(xml);\r\n if (lvlRestartMatch?.[1]) {\r\n lvlRestart = parseInt(lvlRestartMatch[1], 10);\r\n }\r\n\r\n // Extract pStyle (paragraph style link)\r\n let pStyle: string | undefined;\r\n const pStyleMatch = /<w:pStyle[^>]*w:val=\"([^\"]+)\"/.exec(xml);\r\n if (pStyleMatch?.[1]) {\r\n pStyle = pStyleMatch[1];\r\n }\r\n\r\n // Extract indentation from <w:pPr><w:ind>\r\n let leftIndent = 720 + level * 360; // default\r\n let hangingIndent = 360; // default\r\n const indMatch = /<w:ind[^>]*\\/>/.exec(xml);\r\n if (indMatch) {\r\n const indElement = indMatch[0];\r\n const leftMatch = /w:left=\"([^\"]+)\"/.exec(indElement);\r\n const hangingMatch = /w:hanging=\"([^\"]+)\"/.exec(indElement);\r\n\r\n if (leftMatch?.[1]) leftIndent = parseInt(leftMatch[1], 10);\r\n if (hangingMatch?.[1])\r\n hangingIndent = parseInt(hangingMatch[1], 10);\r\n }\r\n\r\n // Extract font and size from <w:rPr>\r\n let font = \"Calibri\";\r\n let fontSize = 22;\r\n\r\n const rFontsMatch = /<w:rFonts[^>]*\\/>/.exec(xml);\r\n if (rFontsMatch) {\r\n const rFontsElement = rFontsMatch[0];\r\n const asciiMatch = /w:ascii=\"([^\"]+)\"/.exec(rFontsElement);\r\n if (asciiMatch?.[1]) font = asciiMatch[1];\r\n }\r\n\r\n const szMatch = /<w:sz[^>]*w:val=\"([^\"]+)\"/.exec(xml);\r\n if (szMatch?.[1]) fontSize = parseInt(szMatch[1], 10);\r\n\r\n // List prefixes should never have bold, italic, or underline - ignore source XML formatting\r\n const bold = false;\r\n const italic = false;\r\n const underline: string | undefined = undefined;\r\n\r\n // Extract color from <w:rPr>\r\n let color: string | undefined;\r\n const colorMatch = /<w:color[^>]*w:val=\"([^\"]+)\"/.exec(xml);\r\n if (colorMatch?.[1]) {\r\n color = colorMatch[1];\r\n }\r\n\r\n return new NumberingLevel({\r\n level,\r\n format,\r\n text,\r\n alignment,\r\n start,\r\n leftIndent,\r\n hangingIndent,\r\n font,\r\n fontSize,\r\n suffix,\r\n bold,\r\n italic,\r\n underline,\r\n color,\r\n lvlRestart,\r\n pStyle,\r\n });\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"NumberingLevel.js","sourceRoot":"","sources":["../../src/formatting/NumberingLevel.ts"],"names":[],"mappings":";;;AAQA,kDAA2D;AAW9C,QAAA,mBAAmB,GAAG;IAEjC,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE;IAEjD,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE;IAEpD,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE;CAC5C,CAAC;AA8FX,MAAa,cAAc;IACjB,UAAU,CAGsD;IAMxE,YAAY,UAAoC;QAE9C,IAAI,CAAC,UAAU,GAAG;YAChB,KAAK,EAAE,UAAU,CAAC,KAAK;YACvB,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,SAAS,EAAE,UAAU,CAAC,SAAS,IAAI,MAAM;YACzC,KAAK,EAAE,UAAU,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC5D,UAAU,EACR,UAAU,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,GAAG,UAAU,CAAC,KAAK,GAAG,GAAG;YAC5F,aAAa,EAAE,UAAU,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG;YACtF,IAAI,EAAE,UAAU,CAAC,IAAI,IAAI,SAAS;YAClC,QAAQ,EAAE,UAAU,CAAC,QAAQ,IAAI,EAAE;YACnC,qBAAqB,EACnB,UAAU,CAAC,qBAAqB,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC,CAAC,KAAK;YAC3F,MAAM,EAAE,UAAU,CAAC,MAAM,IAAI,KAAK;YAClC,KAAK,EAAE,UAAU,CAAC,KAAK,IAAI,QAAQ;YACnC,IAAI,EAAE,UAAU,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK;YAC7D,MAAM,EAAE,UAAU,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK;YACnE,SAAS,EAAE,UAAU,CAAC,SAAS;YAC/B,UAAU,EAAE,UAAU,CAAC,UAAU;YACjC,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC;QAEF,IAAI,CAAC,QAAQ,EAAE,CAAC;IAClB,CAAC;IAKO,QAAQ;QACd,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;YAC3D,MAAM,IAAI,KAAK,CAAC,sCAAsC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;QACjF,CAAC;QAKD,IAAI,IAAI,CAAC,UAAU,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACzD,CAAC;QAED,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IA0BD,MAAM,CAAC,wBAAwB,CAC7B,KAAa,EACb,cAAc,GAAG,KAAK,EACtB,eAAe,GAAG,IAAI,EACtB,gBAAgB,GAAG,IAAI,EACvB,eAAe,GAAG,IAAI;QAEtB,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,iBAAiB,KAAK,kCAAkC,CAAC,CAAC;QAC5E,CAAC;QAGD,MAAM,cAAc,GAAG,cAAc,GAAG,eAAe,GAAG,gBAAgB,CAAC;QAG3E,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,GAAG,eAAe,CAAC,CAAC;QAGpE,MAAM,kBAAkB,GAAG,GAAG,GAAG,KAAK,GAAG,GAAG,CAAC;QAC7C,MAAM,aAAa,GAAG,GAAG,CAAC;QAG1B,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,kBAAkB,EAAE,aAAa,CAAC,CAAC;QAEnE,OAAO;YACL,UAAU,EAAE,cAAc;YAC1B,aAAa;SACd,CAAC;IACJ,CAAC;IAKD,QAAQ;QACN,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;IAC/B,CAAC;IAKD,SAAS;QACP,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;IAChC,CAAC;IAKD,aAAa;QAEX,OAAO,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;IAChC,CAAC;IAMD,aAAa,CAAC,KAAa;QAEzB,IAAI,CAAC,UAAU,CAAC,UAAU,GAAG,KAAK,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAMD,gBAAgB,CAAC,KAAa;QAC5B,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,aAAa,GAAG,KAAK,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IAMD,OAAO,CAAC,IAAY;QAClB,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAMD,YAAY,CAAC,SAA0B;QACrC,IAAI,CAAC,UAAU,CAAC,SAAS,GAAG,SAAS,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IAMD,WAAW,CAAC,UAAkB;QAC5B,IAAI,CAAC,UAAU,CAAC,QAAQ,GAAG,UAAU,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IAMD,OAAO,CAAC,IAAY;QAClB,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAMD,QAAQ,CAAC,KAAa;QACpB,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,KAAK,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAMD,OAAO,CAAC,IAAa;QACnB,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAMD,SAAS,CAAC,MAAe;QACvB,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,MAAM,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAKD,SAAS;QACP,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,KAAK,CAAC;IACzC,CAAC;IAMD,YAAY,CAAC,KAAyB;QACpC,IAAI,CAAC,UAAU,CAAC,SAAS,GAAG,KAAK,CAAC;QAClC,OAAO,IAAI,CAAC;IACd,CAAC;IAKD,YAAY;QACV,OAAO,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;IACnC,CAAC;IAKD,cAAc;QACZ,IAAI,CAAC,UAAU,CAAC,SAAS,GAAG,SAAS,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IAkBD,aAAa,CAAC,KAAyB;QACrC,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;YACpD,MAAM,IAAI,KAAK,CAAC,2CAA2C,KAAK,EAAE,CAAC,CAAC;QACtE,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,UAAU,GAAG,KAAK,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAMD,aAAa;QACX,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;IACpC,CAAC;IAOD,iBAAiB,CAAC,OAAe;QAC/B,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,OAAO,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IAKD,iBAAiB;QACf,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;IAChC,CAAC;IAMD,SAAS,CAAC,MAAoB;QAC5B,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,cAAc,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAChE,OAAO,IAAI,CAAC;IACd,CAAC;IAMD,MAAM,CAAC,eAAe,CAAC,MAAc;QACnC,MAAM,WAAW,GAAiC;YAChD,IAAI,EAAE,aAAa;YACnB,IAAI,EAAE,aAAa;YACnB,IAAI,EAAE,YAAY;YAClB,IAAI,EAAE,YAAY;YAClB,IAAI,EAAE,SAAS;SAChB,CAAC;QACF,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,MAAM,CAAiB,CAAC;IACzD,CAAC;IAKD,KAAK;QAEH,MAAM,QAAQ,GAAiB,EAAE,CAAC;QAGlC,QAAQ,CAAC,IAAI,CAAC,uBAAU,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;QAGxF,QAAQ,CAAC,IAAI,CAAC,uBAAU,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAG/E,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7C,QAAQ,CAAC,IAAI,CACX,uBAAU,CAAC,KAAK,CAAC,YAAY,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC,CACnF,CAAC;QACJ,CAAC;QAGD,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;YAC3B,QAAQ,CAAC,IAAI,CAAC,uBAAU,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACjF,CAAC;QAGD,IAAI,IAAI,CAAC,UAAU,CAAC,qBAAqB,EAAE,CAAC;YAC1C,QAAQ,CAAC,IAAI,CAAC,uBAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAC3C,CAAC;QAGD,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;YAC3B,QAAQ,CAAC,IAAI,CAAC,uBAAU,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC/E,CAAC;QAGD,QAAQ,CAAC,IAAI,CAAC,uBAAU,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAG9E,QAAQ,CAAC,IAAI,CAAC,uBAAU,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QAGjF,MAAM,GAAG,GAAG,uBAAU,CAAC,KAAK,CAAC,KAAK,EAAE;YAClC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,QAAQ,EAAE;YAC/C,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,QAAQ,EAAE;SACtD,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,uBAAU,CAAC,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAClD,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAGnB,MAAM,WAAW,GAAiB,EAAE,CAAC;QAGrC,WAAW,CAAC,IAAI,CACd,uBAAU,CAAC,KAAK,CAAC,QAAQ,EAAE;YACzB,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI;YAC/B,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI;YAC/B,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI;YAC5B,QAAQ,EAAE,SAAS;SACpB,CAAC,CACH,CAAC;QAGF,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;YACzB,WAAW,CAAC,IAAI,CAAC,uBAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;YACxC,WAAW,CAAC,IAAI,CAAC,uBAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5C,CAAC;QAGD,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;YAC3B,WAAW,CAAC,IAAI,CAAC,uBAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;YACxC,WAAW,CAAC,IAAI,CAAC,uBAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5C,CAAC;QAGD,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;YAC9B,WAAW,CAAC,IAAI,CAAC,uBAAU,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QAClF,CAAC;QAGD,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YAC1B,WAAW,CAAC,IAAI,CAAC,uBAAU,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAClF,CAAC;QAGD,WAAW,CAAC,IAAI,CAAC,uBAAU,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;QAC3F,WAAW,CAAC,IAAI,CAAC,uBAAU,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;QAE7F,MAAM,GAAG,GAAG,uBAAU,CAAC,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QACxD,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEnB,OAAO,uBAAU,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAC;IACvF,CAAC;IAQD,MAAM,CAAC,uBAAuB,CAC5B,KAAa,EACb,QAA8E,UAAU;QAExF,MAAM,UAAU,GAAG;YAEjB,QAAQ,EAAE;gBACR;oBACE,MAAM,EAAE,2BAAmB,CAAC,aAAa,CAAC,IAAI;oBAC9C,IAAI,EAAE,2BAAmB,CAAC,aAAa,CAAC,IAAI;iBAC7C;gBACD;oBACE,MAAM,EAAE,2BAAmB,CAAC,WAAW,CAAC,IAAI;oBAC5C,IAAI,EAAE,2BAAmB,CAAC,WAAW,CAAC,IAAI;iBAC3C;gBACD;oBACE,MAAM,EAAE,2BAAmB,CAAC,aAAa,CAAC,IAAI;oBAC9C,IAAI,EAAE,2BAAmB,CAAC,aAAa,CAAC,IAAI;iBAC7C;gBACD;oBACE,MAAM,EAAE,2BAAmB,CAAC,aAAa,CAAC,IAAI;oBAC9C,IAAI,EAAE,2BAAmB,CAAC,aAAa,CAAC,IAAI;iBAC7C;gBACD;oBACE,MAAM,EAAE,2BAAmB,CAAC,WAAW,CAAC,IAAI;oBAC5C,IAAI,EAAE,2BAAmB,CAAC,WAAW,CAAC,IAAI;iBAC3C;gBACD;oBACE,MAAM,EAAE,2BAAmB,CAAC,aAAa,CAAC,IAAI;oBAC9C,IAAI,EAAE,2BAAmB,CAAC,aAAa,CAAC,IAAI;iBAC7C;gBACD;oBACE,MAAM,EAAE,2BAAmB,CAAC,aAAa,CAAC,IAAI;oBAC9C,IAAI,EAAE,2BAAmB,CAAC,aAAa,CAAC,IAAI;iBAC7C;gBACD;oBACE,MAAM,EAAE,2BAAmB,CAAC,WAAW,CAAC,IAAI;oBAC5C,IAAI,EAAE,2BAAmB,CAAC,WAAW,CAAC,IAAI;iBAC3C;gBACD;oBACE,MAAM,EAAE,2BAAmB,CAAC,aAAa,CAAC,IAAI;oBAC9C,IAAI,EAAE,2BAAmB,CAAC,aAAa,CAAC,IAAI;iBAC7C;aACF;YACD,MAAM,EAAE;gBACN,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;gBAChC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;gBAChC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;gBAChC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;gBAChC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;gBAChC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;gBAChC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;gBAChC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;gBAChC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;aACjC;YACD,MAAM,EAAE;gBACN,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;gBAChC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;gBAChC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;gBAChC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;gBAChC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;gBAChC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;gBAChC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;gBAChC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;gBAChC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;aACjC;YACD,KAAK,EAAE;gBACL,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;gBAChC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;gBAChC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;gBAChC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;gBAChC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;gBAChC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;gBAChC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;gBAChC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;gBAChC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;aACjC;YACD,KAAK,EAAE;gBACL,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;gBAChC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;gBAChC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;gBAChC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;gBAChC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;gBAChC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;gBAChC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;gBAChC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;gBAChC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;aACjC;YACD,aAAa,EAAE;gBAEb;oBACE,MAAM,EAAE,2BAAmB,CAAC,aAAa,CAAC,IAAI;oBAC9C,IAAI,EAAE,2BAAmB,CAAC,aAAa,CAAC,IAAI;iBAC7C;gBACD;oBACE,MAAM,EAAE,2BAAmB,CAAC,WAAW,CAAC,IAAI;oBAC5C,IAAI,EAAE,2BAAmB,CAAC,WAAW,CAAC,IAAI;iBAC3C;gBACD;oBACE,MAAM,EAAE,2BAAmB,CAAC,aAAa,CAAC,IAAI;oBAC9C,IAAI,EAAE,2BAAmB,CAAC,aAAa,CAAC,IAAI;iBAC7C;gBACD;oBACE,MAAM,EAAE,2BAAmB,CAAC,aAAa,CAAC,IAAI;oBAC9C,IAAI,EAAE,2BAAmB,CAAC,aAAa,CAAC,IAAI;iBAC7C;gBACD;oBACE,MAAM,EAAE,2BAAmB,CAAC,WAAW,CAAC,IAAI;oBAC5C,IAAI,EAAE,2BAAmB,CAAC,WAAW,CAAC,IAAI;iBAC3C;gBACD;oBACE,MAAM,EAAE,2BAAmB,CAAC,aAAa,CAAC,IAAI;oBAC9C,IAAI,EAAE,2BAAmB,CAAC,aAAa,CAAC,IAAI;iBAC7C;gBACD;oBACE,MAAM,EAAE,2BAAmB,CAAC,aAAa,CAAC,IAAI;oBAC9C,IAAI,EAAE,2BAAmB,CAAC,aAAa,CAAC,IAAI;iBAC7C;gBACD;oBACE,MAAM,EAAE,2BAAmB,CAAC,WAAW,CAAC,IAAI;oBAC5C,IAAI,EAAE,2BAAmB,CAAC,WAAW,CAAC,IAAI;iBAC3C;gBACD;oBACE,MAAM,EAAE,2BAAmB,CAAC,aAAa,CAAC,IAAI;oBAC9C,IAAI,EAAE,2BAAmB,CAAC,aAAa,CAAC,IAAI;iBAC7C;aACF;SACF,CAAC;QAEF,MAAM,WAAW,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QACtC,MAAM,UAAU,GAAG,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC;QAC9C,MAAM,MAAM,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;QAGvC,OAAO,MAAM,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IACpD,CAAC;IAaD,MAAM,CAAC,4BAA4B,CAAC,KAAa;QAI/C,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,iBAAiB,KAAK,kCAAkC,CAAC,CAAC;QAC5E,CAAC;QAED,OAAO;YACL,UAAU,EAAE,GAAG,GAAG,KAAK,GAAG,GAAG;YAC7B,aAAa,EAAE,GAAG;SACnB,CAAC;IACJ,CAAC;IAaD,MAAM,CAAC,uBAAuB,CAAC,KAAa;QAC1C,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,iBAAiB,KAAK,kCAAkC,CAAC,CAAC;QAC5E,CAAC;QAED,MAAM,OAAO,GAAmB;YAC9B,SAAS;YACT,aAAa;YACb,YAAY;YACZ,aAAa;YACb,YAAY;SACb,CAAC;QAEF,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QAC/C,OAAO,MAAM,IAAI,SAAS,CAAC;IAC7B,CAAC;IAcD,MAAM,CAAC,iBAAiB,CAAC,KAAa,EAAE,MAAe,EAAE,IAAa;QAEpE,MAAM,QAAQ,GAAG,cAAc,CAAC,uBAAuB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QAC3E,MAAM,YAAY,GAAG,MAAM,IAAI,QAAQ,CAAC,MAAM,CAAC;QAC/C,MAAM,UAAU,GAAG,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC;QAEzC,OAAO,IAAI,cAAc,CAAC;YACxB,KAAK;YACL,MAAM,EAAE,QAAQ;YAChB,IAAI,EAAE,YAAY;YAClB,SAAS,EAAE,MAAM;YACjB,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE,EAAE;YACZ,IAAI,EAAE,KAAK;YACX,KAAK,EAAE,QAAQ;YACf,UAAU,EAAE,GAAG,GAAG,KAAK,GAAG,GAAG;YAC7B,aAAa,EAAE,GAAG;SACnB,CAAC,CAAC;IACL,CAAC;IAOD,MAAM,CAAC,kBAAkB,CAAC,KAAa,EAAE,QAAQ,GAAG,IAAI,KAAK,GAAG,CAAC,GAAG;QAClE,OAAO,IAAI,cAAc,CAAC;YACxB,KAAK;YACL,MAAM,EAAE,SAAS;YACjB,IAAI,EAAE,QAAQ;YACd,SAAS,EAAE,MAAM;YACjB,IAAI,EAAE,SAAS;YACf,QAAQ,EAAE,EAAE;YACZ,IAAI,EAAE,KAAK;YACX,KAAK,EAAE,QAAQ;YACf,UAAU,EAAE,GAAG,GAAG,KAAK,GAAG,GAAG;YAC7B,aAAa,EAAE,GAAG;SACnB,CAAC,CAAC;IACL,CAAC;IAOD,MAAM,CAAC,qBAAqB,CAAC,KAAa,EAAE,QAAQ,GAAG,IAAI,KAAK,GAAG,CAAC,GAAG;QACrE,OAAO,IAAI,cAAc,CAAC;YACxB,KAAK;YACL,MAAM,EAAE,YAAY;YACpB,IAAI,EAAE,QAAQ;YACd,SAAS,EAAE,MAAM;YACjB,IAAI,EAAE,SAAS;YACf,QAAQ,EAAE,EAAE;YACZ,IAAI,EAAE,KAAK;YACX,KAAK,EAAE,QAAQ;YACf,UAAU,EAAE,GAAG,GAAG,KAAK,GAAG,GAAG;YAC7B,aAAa,EAAE,GAAG;SACnB,CAAC,CAAC;IACL,CAAC;IAOD,MAAM,CAAC,qBAAqB,CAAC,KAAa,EAAE,QAAQ,GAAG,IAAI,KAAK,GAAG,CAAC,GAAG;QACrE,OAAO,IAAI,cAAc,CAAC;YACxB,KAAK;YACL,MAAM,EAAE,YAAY;YACpB,IAAI,EAAE,QAAQ;YACd,SAAS,EAAE,MAAM;YACjB,IAAI,EAAE,SAAS;YACf,QAAQ,EAAE,EAAE;YACZ,IAAI,EAAE,KAAK;YACX,KAAK,EAAE,QAAQ;YACf,UAAU,EAAE,GAAG,GAAG,KAAK,GAAG,GAAG;YAC7B,aAAa,EAAE,GAAG;SACnB,CAAC,CAAC;IACL,CAAC;IAOD,MAAM,CAAC,sBAAsB,CAAC,KAAa,EAAE,QAAQ,GAAG,IAAI,KAAK,GAAG,CAAC,GAAG;QACtE,OAAO,IAAI,cAAc,CAAC;YACxB,KAAK;YACL,MAAM,EAAE,aAAa;YACrB,IAAI,EAAE,QAAQ;YACd,SAAS,EAAE,MAAM;YACjB,IAAI,EAAE,SAAS;YACf,QAAQ,EAAE,EAAE;YACZ,IAAI,EAAE,KAAK;YACX,KAAK,EAAE,QAAQ;YACf,UAAU,EAAE,GAAG,GAAG,KAAK,GAAG,GAAG;YAC7B,aAAa,EAAE,GAAG;SACnB,CAAC,CAAC;IACL,CAAC;IAOD,MAAM,CAAC,sBAAsB,CAAC,KAAa,EAAE,QAAQ,GAAG,IAAI,KAAK,GAAG,CAAC,GAAG;QACtE,OAAO,IAAI,cAAc,CAAC;YACxB,KAAK;YACL,MAAM,EAAE,aAAa;YACrB,IAAI,EAAE,QAAQ;YACd,SAAS,EAAE,MAAM;YACjB,IAAI,EAAE,SAAS;YACf,QAAQ,EAAE,EAAE;YACZ,IAAI,EAAE,KAAK;YACX,KAAK,EAAE,QAAQ;YACf,UAAU,EAAE,GAAG,GAAG,KAAK,GAAG,GAAG;YAC7B,aAAa,EAAE,GAAG;SACnB,CAAC,CAAC;IACL,CAAC;IAMD,MAAM,CAAC,MAAM,CAAC,UAAoC;QAChD,OAAO,IAAI,cAAc,CAAC,UAAU,CAAC,CAAC;IACxC,CAAC;IAOD,MAAM,CAAC,OAAO,CAAC,GAAW;QAExB,MAAM,SAAS,GAAG,6BAA6B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1D,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACvD,CAAC;QACD,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAGzC,MAAM,WAAW,GAAG,+BAA+B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9D,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACvD,CAAC;QACD,MAAM,MAAM,GAAG,cAAc,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QAG9D,MAAM,YAAY,GAAG,gCAAgC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChE,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAGpE,MAAM,UAAU,GAAG,8BAA8B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5D,MAAM,SAAS,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAoB,CAAC;QAGhF,MAAM,UAAU,GAAG,8BAA8B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5D,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAGhE,MAAM,WAAW,GAAG,6BAA6B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,WAAW,CAAC,CAAC,CAAiC,CAAC,CAAC,CAAC,KAAK,CAAC;QAG1F,IAAI,UAA8B,CAAC;QACnC,MAAM,eAAe,GAAG,mCAAmC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACtE,IAAI,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzB,UAAU,GAAG,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAChD,CAAC;QAGD,IAAI,MAA0B,CAAC;QAC/B,MAAM,WAAW,GAAG,+BAA+B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9D,IAAI,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrB,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC1B,CAAC;QAGD,IAAI,UAAU,GAAG,GAAG,GAAG,KAAK,GAAG,GAAG,CAAC;QACnC,IAAI,aAAa,GAAG,GAAG,CAAC;QACxB,MAAM,QAAQ,GAAG,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5C,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,SAAS,GAAG,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACtD,MAAM,YAAY,GAAG,qBAAqB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAE5D,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC;gBAAE,UAAU,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC5D,IAAI,YAAY,EAAE,CAAC,CAAC,CAAC;gBAAE,aAAa,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACvE,CAAC;QAGD,IAAI,IAAI,GAAG,SAAS,CAAC;QACrB,IAAI,QAAQ,GAAG,EAAE,CAAC;QAElB,MAAM,WAAW,GAAG,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClD,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,aAAa,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YACrC,MAAM,UAAU,GAAG,mBAAmB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC3D,IAAI,UAAU,EAAE,CAAC,CAAC,CAAC;gBAAE,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAC5C,CAAC;QAED,MAAM,OAAO,GAAG,2BAA2B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACtD,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC;YAAE,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAGtD,MAAM,IAAI,GAAG,KAAK,CAAC;QACnB,MAAM,MAAM,GAAG,KAAK,CAAC;QACrB,MAAM,SAAS,GAAuB,SAAS,CAAC;QAGhD,IAAI,KAAyB,CAAC;QAC9B,MAAM,UAAU,GAAG,8BAA8B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5D,IAAI,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACpB,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC;QAED,OAAO,IAAI,cAAc,CAAC;YACxB,KAAK;YACL,MAAM;YACN,IAAI;YACJ,SAAS;YACT,KAAK;YACL,UAAU;YACV,aAAa;YACb,IAAI;YACJ,QAAQ;YACR,MAAM;YACN,IAAI;YACJ,MAAM;YACN,SAAS;YACT,KAAK;YACL,UAAU;YACV,MAAM;SACP,CAAC,CAAC;IACL,CAAC;CACF;AA51BD,wCA41BC","sourcesContent":["/**\n * NumberingLevel - Defines formatting for a single level in a list\n *\n * A numbering level specifies how a particular list level (0-8) should be formatted,\n * including the numbering format (bullet, decimal, roman, etc.), text template,\n * alignment, and indentation.\n */\n\nimport { XMLBuilder, XMLElement } from '../xml/XMLBuilder';\n\n/**\n * Word-native bullet character mappings\n *\n * Microsoft Word uses specific fonts with Private Use Area (PUA) characters\n * for bullet points. These mappings ensure 100% compatibility with Word's\n * native bullet rendering.\n *\n * Pattern: Levels 0,3,6 = filled bullet; 1,4,7 = open circle; 2,5,8 = filled square\n */\nexport const WORD_NATIVE_BULLETS = {\n /** Filled bullet (levels 0, 3, 6) - Symbol font U+F0B7 */\n FILLED_BULLET: { char: '\\uF0B7', font: 'Symbol' },\n /** Open circle (levels 1, 4, 7) - Courier New U+006F (lowercase 'o') */\n OPEN_CIRCLE: { char: '\\u006F', font: 'Courier New' },\n /** Filled square (levels 2, 5, 8) - Wingdings U+F0A7 */\n FILLED_SQUARE: { char: '\\uF0A7', font: 'Wingdings' },\n} as const;\n\n/**\n * Type for Word-native bullet definition\n */\nexport type WordNativeBullet = (typeof WORD_NATIVE_BULLETS)[keyof typeof WORD_NATIVE_BULLETS];\n\n/**\n * Numbering format types supported by Word\n */\nexport type NumberFormat =\n | 'bullet' // Bullet character\n | 'decimal' // 1, 2, 3, ...\n | 'lowerRoman' // i, ii, iii, ...\n | 'upperRoman' // I, II, III, ...\n | 'lowerLetter' // a, b, c, ...\n | 'upperLetter' // A, B, C, ...\n | 'ordinal' // 1st, 2nd, 3rd, ...\n | 'cardinalText' // One, Two, Three, ...\n | 'ordinalText' // First, Second, Third, ...\n | 'hex' // 0x01, 0x02, ...\n | 'chicago' // *, †, ‡, §, ...\n | 'decimal zero'; // 01, 02, 03, ...\n\n/**\n * Alignment for the numbering text\n */\nexport type NumberAlignment = 'left' | 'center' | 'right' | 'start' | 'end';\n\n/**\n * Properties for creating a numbering level\n */\nexport interface NumberingLevelProperties {\n /** The level index (0-8, where 0 is the outermost level) */\n level: number;\n\n /** The numbering format */\n format: NumberFormat;\n\n /** The text template (e.g., \"%1.\" for decimal, \"•\" for bullet) */\n text: string;\n\n /** Alignment of the numbering text */\n alignment?: NumberAlignment;\n\n /** Starting value (for numeric formats, default: 1) */\n start?: number;\n\n /** Left indentation in twips (can be negative for outdents into margin) */\n leftIndent?: number;\n\n /** Hanging indentation in twips (for the text after the number) */\n hangingIndent?: number;\n\n /** Font family for the numbering character (useful for bullets) */\n font?: string;\n\n /** Font size in half-points (e.g., 22 = 11pt) */\n fontSize?: number;\n\n /** Whether to show text after the number (default: true) */\n isLegalNumberingStyle?: boolean;\n\n /** Suffix after the number (tab, space, or nothing) */\n suffix?: 'tab' | 'space' | 'nothing';\n\n /** Text color in hex (without #) */\n color?: string;\n\n /** Whether the numbering text is bold */\n bold?: boolean;\n\n /** Whether the numbering text is italic */\n italic?: boolean;\n\n /** Underline style for numbering text ('single', 'double', 'wave', 'dotted', 'dash', etc.) */\n underline?: string;\n\n /**\n * Level at which numbering should restart (w:lvlRestart per ECMA-376 Part 1 §17.9.11)\n * Specifies when to restart this level's numbering based on a higher-level change:\n * - 0: Never restart (continues throughout document)\n * - 1-8: Restart when the specified level changes\n * - undefined (default): Restart when level-1 changes (standard behavior)\n */\n lvlRestart?: number;\n\n /** Paragraph style ID linked to this numbering level (w:pStyle per ECMA-376 §17.9.23) */\n pStyle?: string;\n}\n\n/**\n * Represents a single level in a numbering definition\n */\nexport class NumberingLevel {\n private properties: Required<\n Omit<NumberingLevelProperties, 'lvlRestart' | 'underline' | 'pStyle'>\n > &\n Pick<NumberingLevelProperties, 'lvlRestart' | 'underline' | 'pStyle'>;\n\n /**\n * Creates a new numbering level\n * @param properties The level properties\n */\n constructor(properties: NumberingLevelProperties) {\n // Set defaults\n this.properties = {\n level: properties.level,\n format: properties.format,\n text: properties.text,\n alignment: properties.alignment || 'left',\n start: properties.start !== undefined ? properties.start : 1,\n leftIndent:\n properties.leftIndent !== undefined ? properties.leftIndent : 720 + properties.level * 360,\n hangingIndent: properties.hangingIndent !== undefined ? properties.hangingIndent : 360,\n font: properties.font || 'Calibri',\n fontSize: properties.fontSize || 22, // 11pt default\n isLegalNumberingStyle:\n properties.isLegalNumberingStyle !== undefined ? properties.isLegalNumberingStyle : false,\n suffix: properties.suffix || 'tab',\n color: properties.color || '000000',\n bold: properties.bold !== undefined ? properties.bold : false,\n italic: properties.italic !== undefined ? properties.italic : false,\n underline: properties.underline,\n lvlRestart: properties.lvlRestart, // undefined means default behavior (restart on level-1 change)\n pStyle: properties.pStyle,\n };\n\n this.validate();\n }\n\n /**\n * Validates the level properties\n */\n private validate(): void {\n if (this.properties.level < 0 || this.properties.level > 8) {\n throw new Error(`Level must be between 0 and 8, got ${this.properties.level}`);\n }\n\n // Note: leftIndent CAN be negative (outdent into margin) per ECMA-376\n // This is valid and used for hanging indents where bullets appear in margin\n\n if (this.properties.hangingIndent < 0) {\n throw new Error('Hanging indent must be non-negative');\n }\n\n if (this.properties.start < 0) {\n throw new Error('Start value must be non-negative');\n }\n }\n\n /**\n * Calculates safe indentation values for a given level based on page constraints.\n *\n * Use this instead of default indentation when working with narrow pages or\n * deep nesting levels to ensure content stays within page margins.\n *\n * @param level The level index (0-8)\n * @param pageWidthTwips Page width in twips (default: 12240 = 8.5 inches)\n * @param leftMarginTwips Left margin in twips (default: 1440 = 1 inch)\n * @param rightMarginTwips Right margin in twips (default: 1440 = 1 inch)\n * @param minContentWidth Minimum content width in twips (default: 2880 = 2 inches)\n * @returns Safe indentation values that won't exceed available space\n *\n * @example\n * ```typescript\n * // For a narrow page (6\" wide with 0.5\" margins)\n * const indent = NumberingLevel.calculateSafeIndentation(\n * 5, // level 5\n * 8640, // 6 inches page width\n * 720, // 0.5 inch left margin\n * 720 // 0.5 inch right margin\n * );\n * ```\n */\n static calculateSafeIndentation(\n level: number,\n pageWidthTwips = 12240,\n leftMarginTwips = 1440,\n rightMarginTwips = 1440,\n minContentWidth = 2880\n ): { leftIndent: number; hangingIndent: number } {\n if (level < 0 || level > 8) {\n throw new Error(`Invalid level ${level}. Level must be between 0 and 8.`);\n }\n\n // Calculate available content width\n const availableWidth = pageWidthTwips - leftMarginTwips - rightMarginTwips;\n\n // Calculate max safe indent (leave space for content)\n const maxSafeIndent = Math.max(0, availableWidth - minContentWidth);\n\n // Standard indentation\n const standardLeftIndent = 720 + level * 360;\n const hangingIndent = 360;\n\n // Cap at safe maximum\n const safeLeftIndent = Math.min(standardLeftIndent, maxSafeIndent);\n\n return {\n leftIndent: safeLeftIndent,\n hangingIndent,\n };\n }\n\n /**\n * Gets the level index\n */\n getLevel(): number {\n return this.properties.level;\n }\n\n /**\n * Gets the numbering format\n */\n getFormat(): NumberFormat {\n return this.properties.format;\n }\n\n /**\n * Gets the level properties\n */\n getProperties(): Required<Omit<NumberingLevelProperties, 'lvlRestart' | 'underline' | 'pStyle'>> &\n Pick<NumberingLevelProperties, 'lvlRestart' | 'underline' | 'pStyle'> {\n return { ...this.properties };\n }\n\n /**\n * Sets the left indentation\n * @param twips Indentation in twips\n */\n setLeftIndent(twips: number): this {\n // Note: Negative values are valid (outdent into margin) per ECMA-376\n this.properties.leftIndent = twips;\n return this;\n }\n\n /**\n * Sets the hanging indentation\n * @param twips Indentation in twips\n */\n setHangingIndent(twips: number): this {\n if (twips < 0) {\n throw new Error('Hanging indent must be non-negative');\n }\n this.properties.hangingIndent = twips;\n return this;\n }\n\n /**\n * Sets the font for the numbering character\n * @param font Font family name\n */\n setFont(font: string): this {\n this.properties.font = font;\n return this;\n }\n\n /**\n * Sets the alignment\n * @param alignment Alignment type\n */\n setAlignment(alignment: NumberAlignment): this {\n this.properties.alignment = alignment;\n return this;\n }\n\n /**\n * Sets the font size in half-points\n * @param halfPoints Font size in half-points (e.g., 24 = 12pt)\n */\n setFontSize(halfPoints: number): this {\n this.properties.fontSize = halfPoints;\n return this;\n }\n\n /**\n * Sets the level text (bullet character or number template)\n * @param text The text template (e.g., '•' for bullets, '%1.' for numbered)\n */\n setText(text: string): this {\n this.properties.text = text;\n return this;\n }\n\n /**\n * Sets the text color\n * @param color Hex color without # (e.g., '000000' for black)\n */\n setColor(color: string): this {\n this.properties.color = color;\n return this;\n }\n\n /**\n * Sets whether the numbering text is bold\n * @param bold Whether to make bold\n */\n setBold(bold: boolean): this {\n this.properties.bold = bold;\n return this;\n }\n\n /**\n * Sets whether the numbering text is italic\n * @param italic Whether to make italic\n */\n setItalic(italic: boolean): this {\n this.properties.italic = italic;\n return this;\n }\n\n /**\n * Gets whether the numbering text is italic\n */\n getItalic(): boolean {\n return this.properties.italic ?? false;\n }\n\n /**\n * Sets the underline style for numbering text\n * @param style Underline style ('single', 'double', 'wave', 'dotted', 'dash', etc.)\n */\n setUnderline(style: string | undefined): this {\n this.properties.underline = style;\n return this;\n }\n\n /**\n * Gets the underline style\n */\n getUnderline(): string | undefined {\n return this.properties.underline;\n }\n\n /**\n * Clears the underline style\n */\n clearUnderline(): this {\n this.properties.underline = undefined;\n return this;\n }\n\n /**\n * Sets the level restart behavior (w:lvlRestart per ECMA-376 Part 1 §17.9.11)\n *\n * Controls when this level's numbering restarts based on higher-level changes:\n * - 0: Never restart (continues throughout document)\n * - 1-8: Restart when the specified level changes\n * - undefined: Restart when level-1 changes (standard/default behavior)\n *\n * @param level The level that triggers restart (0-8), or undefined for default\n * @example\n * // Level 1 that never restarts (continuous across document)\n * level1.setLvlRestart(0);\n *\n * // Level 2 that restarts when level 0 changes (not level 1)\n * level2.setLvlRestart(0);\n */\n setLvlRestart(level: number | undefined): this {\n if (level !== undefined && (level < 0 || level > 8)) {\n throw new Error(`lvlRestart must be between 0 and 8, got ${level}`);\n }\n this.properties.lvlRestart = level;\n return this;\n }\n\n /**\n * Gets the level restart value\n * @returns The level that triggers restart, or undefined for default behavior\n */\n getLvlRestart(): number | undefined {\n return this.properties.lvlRestart;\n }\n\n /**\n * Sets the paragraph style ID linked to this numbering level\n * Links this level to a paragraph style definition (w:pStyle per ECMA-376 §17.9.23)\n * @param styleId The paragraph style ID\n */\n setParagraphStyle(styleId: string): this {\n this.properties.pStyle = styleId;\n return this;\n }\n\n /**\n * Gets the paragraph style ID linked to this numbering level\n */\n getParagraphStyle(): string | undefined {\n return this.properties.pStyle;\n }\n\n /**\n * Sets the numbering format (decimal, lowerLetter, bullet, etc.)\n * @param format The numbering format\n */\n setFormat(format: NumberFormat): this {\n this.properties.format = NumberingLevel.normalizeFormat(format);\n return this;\n }\n\n /**\n * Normalizes display-string format values to ECMA-376 ST_NumberFormat names.\n * Accepts both standard format names and common display shortcuts.\n */\n static normalizeFormat(format: string): NumberFormat {\n const corrections: Record<string, NumberFormat> = {\n 'a.': 'lowerLetter',\n 'A.': 'upperLetter',\n 'i.': 'lowerRoman',\n 'I.': 'upperRoman',\n '1.': 'decimal',\n };\n return (corrections[format] ?? format) as NumberFormat;\n }\n\n /**\n * Generates the WordprocessingML XML for this level\n */\n toXML(): XMLElement {\n // ECMA-376 CT_Lvl element order: start, numFmt, lvlRestart, pStyle, isLgl, suff, lvlText, lvlJc, pPr, rPr\n const children: XMLElement[] = [];\n\n // 1. Start value\n children.push(XMLBuilder.wSelf('start', { 'w:val': this.properties.start.toString() }));\n\n // 2. Number format\n children.push(XMLBuilder.wSelf('numFmt', { 'w:val': this.properties.format }));\n\n // 3. Level restart (w:lvlRestart per ECMA-376 Part 1 §17.9.11)\n if (this.properties.lvlRestart !== undefined) {\n children.push(\n XMLBuilder.wSelf('lvlRestart', { 'w:val': this.properties.lvlRestart.toString() })\n );\n }\n\n // 4. pStyle (paragraph style link)\n if (this.properties.pStyle) {\n children.push(XMLBuilder.wSelf('pStyle', { 'w:val': this.properties.pStyle }));\n }\n\n // 5. Legal numbering style\n if (this.properties.isLegalNumberingStyle) {\n children.push(XMLBuilder.wSelf('isLgl'));\n }\n\n // 6. Suffix (what comes after the number)\n if (this.properties.suffix) {\n children.push(XMLBuilder.wSelf('suff', { 'w:val': this.properties.suffix }));\n }\n\n // 7. Level text (e.g., \"%1.\" or \"•\")\n children.push(XMLBuilder.wSelf('lvlText', { 'w:val': this.properties.text }));\n\n // 8. Alignment\n children.push(XMLBuilder.wSelf('lvlJc', { 'w:val': this.properties.alignment }));\n\n // 9. Paragraph properties (indentation)\n const ind = XMLBuilder.wSelf('ind', {\n 'w:left': this.properties.leftIndent.toString(),\n 'w:hanging': this.properties.hangingIndent.toString(),\n });\n const pPr = XMLBuilder.w('pPr', undefined, [ind]);\n children.push(pPr);\n\n // 10. Run properties (font)\n const rPrChildren: XMLElement[] = [];\n\n // Font\n rPrChildren.push(\n XMLBuilder.wSelf('rFonts', {\n 'w:ascii': this.properties.font,\n 'w:hAnsi': this.properties.font,\n 'w:cs': this.properties.font,\n 'w:hint': 'default',\n })\n );\n\n // Bold\n if (this.properties.bold) {\n rPrChildren.push(XMLBuilder.wSelf('b'));\n rPrChildren.push(XMLBuilder.wSelf('bCs'));\n }\n\n // Italic\n if (this.properties.italic) {\n rPrChildren.push(XMLBuilder.wSelf('i'));\n rPrChildren.push(XMLBuilder.wSelf('iCs'));\n }\n\n // Underline\n if (this.properties.underline) {\n rPrChildren.push(XMLBuilder.wSelf('u', { 'w:val': this.properties.underline }));\n }\n\n // Color\n if (this.properties.color) {\n rPrChildren.push(XMLBuilder.wSelf('color', { 'w:val': this.properties.color }));\n }\n\n // Font size\n rPrChildren.push(XMLBuilder.wSelf('sz', { 'w:val': this.properties.fontSize.toString() }));\n rPrChildren.push(XMLBuilder.wSelf('szCs', { 'w:val': this.properties.fontSize.toString() }));\n\n const rPr = XMLBuilder.w('rPr', undefined, rPrChildren);\n children.push(rPr);\n\n return XMLBuilder.w('lvl', { 'w:ilvl': this.properties.level.toString() }, children);\n }\n\n /**\n * Gets the recommended bullet symbol and font for a given level\n * @param level The level index (0-8)\n * @param style Optional bullet style ('standard', 'circle', 'square', 'arrow', 'check', 'word-native')\n * @returns Object with symbol and font properties\n */\n static getBulletSymbolWithFont(\n level: number,\n style: 'standard' | 'circle' | 'square' | 'arrow' | 'check' | 'word-native' = 'standard'\n ): { symbol: string; font: string } {\n const bulletSets = {\n // Standard style now uses Word-native encoding for maximum compatibility\n standard: [\n {\n symbol: WORD_NATIVE_BULLETS.FILLED_BULLET.char,\n font: WORD_NATIVE_BULLETS.FILLED_BULLET.font,\n }, // Level 0: Filled bullet (Symbol U+F0B7)\n {\n symbol: WORD_NATIVE_BULLETS.OPEN_CIRCLE.char,\n font: WORD_NATIVE_BULLETS.OPEN_CIRCLE.font,\n }, // Level 1: Open circle (Courier New U+006F)\n {\n symbol: WORD_NATIVE_BULLETS.FILLED_SQUARE.char,\n font: WORD_NATIVE_BULLETS.FILLED_SQUARE.font,\n }, // Level 2: Filled square (Wingdings U+F0A7)\n {\n symbol: WORD_NATIVE_BULLETS.FILLED_BULLET.char,\n font: WORD_NATIVE_BULLETS.FILLED_BULLET.font,\n }, // Level 3: Filled bullet\n {\n symbol: WORD_NATIVE_BULLETS.OPEN_CIRCLE.char,\n font: WORD_NATIVE_BULLETS.OPEN_CIRCLE.font,\n }, // Level 4: Open circle\n {\n symbol: WORD_NATIVE_BULLETS.FILLED_SQUARE.char,\n font: WORD_NATIVE_BULLETS.FILLED_SQUARE.font,\n }, // Level 5: Filled square\n {\n symbol: WORD_NATIVE_BULLETS.FILLED_BULLET.char,\n font: WORD_NATIVE_BULLETS.FILLED_BULLET.font,\n }, // Level 6: Filled bullet\n {\n symbol: WORD_NATIVE_BULLETS.OPEN_CIRCLE.char,\n font: WORD_NATIVE_BULLETS.OPEN_CIRCLE.font,\n }, // Level 7: Open circle\n {\n symbol: WORD_NATIVE_BULLETS.FILLED_SQUARE.char,\n font: WORD_NATIVE_BULLETS.FILLED_SQUARE.font,\n }, // Level 8: Filled square\n ],\n circle: [\n { symbol: '●', font: 'Calibri' }, // Level 0: Filled circle (bold)\n { symbol: '○', font: 'Calibri' }, // Level 1: Empty circle\n { symbol: '◉', font: 'Calibri' }, // Level 2: Fisheye\n { symbol: '◯', font: 'Calibri' }, // Level 3: Large circle\n { symbol: '⦿', font: 'Calibri' }, // Level 4: Circled bullet\n { symbol: '○', font: 'Calibri' }, // Level 5: Empty circle\n { symbol: '●', font: 'Calibri' }, // Level 6: Filled circle\n { symbol: '○', font: 'Calibri' }, // Level 7: Empty circle\n { symbol: '◉', font: 'Calibri' }, // Level 8: Fisheye\n ],\n square: [\n { symbol: '■', font: 'Calibri' }, // Level 0: Filled square\n { symbol: '□', font: 'Calibri' }, // Level 1: Empty square\n { symbol: '▪', font: 'Calibri' }, // Level 2: Small filled square\n { symbol: '▫', font: 'Calibri' }, // Level 3: Small empty square\n { symbol: '◼', font: 'Calibri' }, // Level 4: Medium filled square\n { symbol: '◻', font: 'Calibri' }, // Level 5: Medium empty square\n { symbol: '■', font: 'Calibri' }, // Level 6: Filled square\n { symbol: '□', font: 'Calibri' }, // Level 7: Empty square\n { symbol: '▪', font: 'Calibri' }, // Level 8: Small filled square\n ],\n arrow: [\n { symbol: '➢', font: 'Calibri' }, // Level 0: Right arrow\n { symbol: '➣', font: 'Calibri' }, // Level 1: Right arrow filled\n { symbol: '➤', font: 'Calibri' }, // Level 2: Right arrow bold\n { symbol: '➔', font: 'Calibri' }, // Level 3: Right arrow simple\n { symbol: '➜', font: 'Calibri' }, // Level 4: Right arrow outline\n { symbol: '➢', font: 'Calibri' }, // Level 5: Right arrow\n { symbol: '➣', font: 'Calibri' }, // Level 6: Right arrow filled\n { symbol: '➤', font: 'Calibri' }, // Level 7: Right arrow bold\n { symbol: '➔', font: 'Calibri' }, // Level 8: Right arrow simple\n ],\n check: [\n { symbol: '✓', font: 'Calibri' }, // Level 0: Check mark\n { symbol: '✔', font: 'Calibri' }, // Level 1: Heavy check mark\n { symbol: '☑', font: 'Calibri' }, // Level 2: Checked box\n { symbol: '✓', font: 'Calibri' }, // Level 3: Check mark\n { symbol: '✔', font: 'Calibri' }, // Level 4: Heavy check mark\n { symbol: '☑', font: 'Calibri' }, // Level 5: Checked box\n { symbol: '✓', font: 'Calibri' }, // Level 6: Check mark\n { symbol: '✔', font: 'Calibri' }, // Level 7: Heavy check mark\n { symbol: '☑', font: 'Calibri' }, // Level 8: Checked box\n ],\n 'word-native': [\n // Word-native bullets using PUA characters with Symbol/Wingdings fonts\n {\n symbol: WORD_NATIVE_BULLETS.FILLED_BULLET.char,\n font: WORD_NATIVE_BULLETS.FILLED_BULLET.font,\n }, // Level 0: Filled bullet (Symbol U+F0B7)\n {\n symbol: WORD_NATIVE_BULLETS.OPEN_CIRCLE.char,\n font: WORD_NATIVE_BULLETS.OPEN_CIRCLE.font,\n }, // Level 1: Open circle (Courier New U+006F)\n {\n symbol: WORD_NATIVE_BULLETS.FILLED_SQUARE.char,\n font: WORD_NATIVE_BULLETS.FILLED_SQUARE.font,\n }, // Level 2: Filled square (Wingdings U+F0A7)\n {\n symbol: WORD_NATIVE_BULLETS.FILLED_BULLET.char,\n font: WORD_NATIVE_BULLETS.FILLED_BULLET.font,\n }, // Level 3: Filled bullet\n {\n symbol: WORD_NATIVE_BULLETS.OPEN_CIRCLE.char,\n font: WORD_NATIVE_BULLETS.OPEN_CIRCLE.font,\n }, // Level 4: Open circle\n {\n symbol: WORD_NATIVE_BULLETS.FILLED_SQUARE.char,\n font: WORD_NATIVE_BULLETS.FILLED_SQUARE.font,\n }, // Level 5: Filled square\n {\n symbol: WORD_NATIVE_BULLETS.FILLED_BULLET.char,\n font: WORD_NATIVE_BULLETS.FILLED_BULLET.font,\n }, // Level 6: Filled bullet\n {\n symbol: WORD_NATIVE_BULLETS.OPEN_CIRCLE.char,\n font: WORD_NATIVE_BULLETS.OPEN_CIRCLE.font,\n }, // Level 7: Open circle\n {\n symbol: WORD_NATIVE_BULLETS.FILLED_SQUARE.char,\n font: WORD_NATIVE_BULLETS.FILLED_SQUARE.font,\n }, // Level 8: Filled square\n ],\n };\n\n const selectedSet = bulletSets[style];\n const levelIndex = level % selectedSet.length;\n const result = selectedSet[levelIndex];\n\n // Fallback to standard bullet if somehow undefined\n return result || { symbol: '•', font: 'Calibri' };\n }\n\n /**\n * Calculates the standard indentation values for a given level\n * @param level The level index (0-8)\n * @returns Object with leftIndent and hangingIndent in twips\n * @example\n * const indent = NumberingLevel.calculateStandardIndentation(0);\n * // Returns: { leftIndent: 720, hangingIndent: 360 } (0.5\" left, 0.25\" hanging)\n *\n * const indent2 = NumberingLevel.calculateStandardIndentation(2);\n * // Returns: { leftIndent: 1440, hangingIndent: 360 } (1.0\" left, 0.25\" hanging)\n */\n static calculateStandardIndentation(level: number): {\n leftIndent: number;\n hangingIndent: number;\n } {\n if (level < 0 || level > 8) {\n throw new Error(`Invalid level ${level}. Level must be between 0 and 8.`);\n }\n\n return {\n leftIndent: 720 + level * 360,\n hangingIndent: 360,\n };\n }\n\n /**\n * Gets the standard number format for a given level\n * @param level The level index (0-8)\n * @returns The recommended number format for this level\n * @example\n * NumberingLevel.getStandardNumberFormat(0); // 'decimal' (1., 2., 3.)\n * NumberingLevel.getStandardNumberFormat(1); // 'lowerLetter' (a., b., c.)\n * NumberingLevel.getStandardNumberFormat(2); // 'lowerRoman' (i., ii., iii.)\n * NumberingLevel.getStandardNumberFormat(3); // 'upperLetter' (A., B., C.)\n * NumberingLevel.getStandardNumberFormat(4); // 'upperRoman' (I., II., III.)\n */\n static getStandardNumberFormat(level: number): NumberFormat {\n if (level < 0 || level > 8) {\n throw new Error(`Invalid level ${level}. Level must be between 0 and 8.`);\n }\n\n const formats: NumberFormat[] = [\n 'decimal', // Level 0: 1., 2., 3.\n 'lowerLetter', // Level 1: a., b., c.\n 'lowerRoman', // Level 2: i., ii., iii.\n 'upperLetter', // Level 3: A., B., C.\n 'upperRoman', // Level 4: I., II., III.\n ];\n\n const result = formats[level % formats.length];\n return result || 'decimal'; // Fallback to decimal (should never happen)\n }\n\n /**\n * Creates a bullet list level\n *\n * When called without parameters, uses Word-native encoding for the level:\n * - Levels 0, 3, 6: Filled bullet (Symbol font, U+F0B7)\n * - Levels 1, 4, 7: Open circle (Courier New, U+006F)\n * - Levels 2, 5, 8: Filled square (Wingdings, U+F0A7)\n *\n * @param level The level index (0-8)\n * @param bullet Optional bullet character (defaults to Word-native for level)\n * @param font Optional font to use for the bullet (defaults to Word-native for level)\n */\n static createBulletLevel(level: number, bullet?: string, font?: string): NumberingLevel {\n // Use Word-native defaults when not specified\n const defaults = NumberingLevel.getBulletSymbolWithFont(level, 'standard');\n const actualBullet = bullet ?? defaults.symbol;\n const actualFont = font ?? defaults.font;\n\n return new NumberingLevel({\n level,\n format: 'bullet',\n text: actualBullet,\n alignment: 'left',\n font: actualFont,\n fontSize: 24, // 12pt\n bold: false,\n color: '000000',\n leftIndent: 720 + level * 360,\n hangingIndent: 360,\n });\n }\n\n /**\n * Creates a decimal list level (1, 2, 3, ...)\n * @param level The level index (0-8)\n * @param template The text template (default: '%1.')\n */\n static createDecimalLevel(level: number, template = `%${level + 1}.`): NumberingLevel {\n return new NumberingLevel({\n level,\n format: 'decimal',\n text: template,\n alignment: 'left',\n font: 'Verdana',\n fontSize: 24, // 12pt\n bold: false,\n color: '000000',\n leftIndent: 720 + level * 360,\n hangingIndent: 360,\n });\n }\n\n /**\n * Creates a lower roman list level (i, ii, iii, ...)\n * @param level The level index (0-8)\n * @param template The text template (default: '%1.')\n */\n static createLowerRomanLevel(level: number, template = `%${level + 1}.`): NumberingLevel {\n return new NumberingLevel({\n level,\n format: 'lowerRoman',\n text: template,\n alignment: 'left',\n font: 'Verdana',\n fontSize: 24, // 12pt\n bold: false,\n color: '000000',\n leftIndent: 720 + level * 360,\n hangingIndent: 360,\n });\n }\n\n /**\n * Creates an upper roman list level (I, II, III, ...)\n * @param level The level index (0-8)\n * @param template The text template (default: '%1.')\n */\n static createUpperRomanLevel(level: number, template = `%${level + 1}.`): NumberingLevel {\n return new NumberingLevel({\n level,\n format: 'upperRoman',\n text: template,\n alignment: 'left',\n font: 'Verdana',\n fontSize: 24, // 12pt\n bold: false,\n color: '000000',\n leftIndent: 720 + level * 360,\n hangingIndent: 360,\n });\n }\n\n /**\n * Creates a lower letter list level (a, b, c, ...)\n * @param level The level index (0-8)\n * @param template The text template (default: '%1.')\n */\n static createLowerLetterLevel(level: number, template = `%${level + 1}.`): NumberingLevel {\n return new NumberingLevel({\n level,\n format: 'lowerLetter',\n text: template,\n alignment: 'left',\n font: 'Verdana',\n fontSize: 24, // 12pt\n bold: false,\n color: '000000',\n leftIndent: 720 + level * 360,\n hangingIndent: 360,\n });\n }\n\n /**\n * Creates an upper letter list level (A, B, C, ...)\n * @param level The level index (0-8)\n * @param template The text template (default: '%1.')\n */\n static createUpperLetterLevel(level: number, template = `%${level + 1}.`): NumberingLevel {\n return new NumberingLevel({\n level,\n format: 'upperLetter',\n text: template,\n alignment: 'left',\n font: 'Verdana',\n fontSize: 24, // 12pt\n bold: false,\n color: '000000',\n leftIndent: 720 + level * 360,\n hangingIndent: 360,\n });\n }\n\n /**\n * Factory method for creating a numbering level\n * @param properties The level properties\n */\n static create(properties: NumberingLevelProperties): NumberingLevel {\n return new NumberingLevel(properties);\n }\n\n /**\n * Creates a NumberingLevel from XML element\n * @param xml The XML string of the <w:lvl> element\n * @returns NumberingLevel instance\n */\n static fromXML(xml: string): NumberingLevel {\n // Extract level index (required)\n const ilvlMatch = /<w:lvl[^>]*w:ilvl=\"([^\"]+)\"/.exec(xml);\n if (!ilvlMatch?.[1]) {\n throw new Error('Missing required w:ilvl attribute');\n }\n const level = parseInt(ilvlMatch[1], 10);\n\n // Extract number format (required)\n const numFmtMatch = /<w:numFmt[^>]*w:val=\"([^\"]+)\"/.exec(xml);\n if (!numFmtMatch?.[1]) {\n throw new Error('Missing required w:numFmt element');\n }\n const format = NumberingLevel.normalizeFormat(numFmtMatch[1]);\n\n // Extract level text (optional - can be empty for placeholder levels)\n const lvlTextMatch = /<w:lvlText[^>]*w:val=\"([^\"]*)\"/.exec(xml);\n const text = lvlTextMatch?.[1] !== undefined ? lvlTextMatch[1] : '';\n\n // Extract alignment (optional, default: left)\n const lvlJcMatch = /<w:lvlJc[^>]*w:val=\"([^\"]+)\"/.exec(xml);\n const alignment = (lvlJcMatch?.[1] ? lvlJcMatch[1] : 'left') as NumberAlignment;\n\n // Extract start value (optional, default: 1)\n const startMatch = /<w:start[^>]*w:val=\"([^\"]+)\"/.exec(xml);\n const start = startMatch?.[1] ? parseInt(startMatch[1], 10) : 1;\n\n // Extract suffix (optional, default: tab)\n const suffixMatch = /<w:suff[^>]*w:val=\"([^\"]+)\"/.exec(xml);\n const suffix = suffixMatch?.[1] ? (suffixMatch[1] as 'tab' | 'space' | 'nothing') : 'tab';\n\n // Extract level restart (w:lvlRestart per ECMA-376 Part 1 §17.9.11)\n let lvlRestart: number | undefined;\n const lvlRestartMatch = /<w:lvlRestart[^>]*w:val=\"([^\"]+)\"/.exec(xml);\n if (lvlRestartMatch?.[1]) {\n lvlRestart = parseInt(lvlRestartMatch[1], 10);\n }\n\n // Extract pStyle (paragraph style link)\n let pStyle: string | undefined;\n const pStyleMatch = /<w:pStyle[^>]*w:val=\"([^\"]+)\"/.exec(xml);\n if (pStyleMatch?.[1]) {\n pStyle = pStyleMatch[1];\n }\n\n // Extract indentation from <w:pPr><w:ind>\n let leftIndent = 720 + level * 360; // default\n let hangingIndent = 360; // default\n const indMatch = /<w:ind[^>]*\\/>/.exec(xml);\n if (indMatch) {\n const indElement = indMatch[0];\n const leftMatch = /w:left=\"([^\"]+)\"/.exec(indElement);\n const hangingMatch = /w:hanging=\"([^\"]+)\"/.exec(indElement);\n\n if (leftMatch?.[1]) leftIndent = parseInt(leftMatch[1], 10);\n if (hangingMatch?.[1]) hangingIndent = parseInt(hangingMatch[1], 10);\n }\n\n // Extract font and size from <w:rPr>\n let font = 'Calibri';\n let fontSize = 22;\n\n const rFontsMatch = /<w:rFonts[^>]*\\/>/.exec(xml);\n if (rFontsMatch) {\n const rFontsElement = rFontsMatch[0];\n const asciiMatch = /w:ascii=\"([^\"]+)\"/.exec(rFontsElement);\n if (asciiMatch?.[1]) font = asciiMatch[1];\n }\n\n const szMatch = /<w:sz[^>]*w:val=\"([^\"]+)\"/.exec(xml);\n if (szMatch?.[1]) fontSize = parseInt(szMatch[1], 10);\n\n // List prefixes should never have bold, italic, or underline - ignore source XML formatting\n const bold = false;\n const italic = false;\n const underline: string | undefined = undefined;\n\n // Extract color from <w:rPr>\n let color: string | undefined;\n const colorMatch = /<w:color[^>]*w:val=\"([^\"]+)\"/.exec(xml);\n if (colorMatch?.[1]) {\n color = colorMatch[1];\n }\n\n return new NumberingLevel({\n level,\n format,\n text,\n alignment,\n start,\n leftIndent,\n hangingIndent,\n font,\n fontSize,\n suffix,\n bold,\n italic,\n underline,\n color,\n lvlRestart,\n pStyle,\n });\n }\n}\n"]}
@@ -48,6 +48,7 @@ export declare class NumberingManager {
48
48
  createOutlineList(): number;
49
49
  createCustomList(levels: NumberingLevel[], name?: string): number;
50
50
  createInstance(abstractNumId: number): number;
51
+ restartNumbering(numId: number, level?: number, startValue?: number): number;
51
52
  getStandardIndentation(level: number): {
52
53
  leftIndent: number;
53
54
  hangingIndent: number;
@@ -1 +1 @@
1
- {"version":3,"file":"NumberingManager.d.ts","sourceRoot":"","sources":["../../src/formatting/NumberingManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"NumberingManager.d.ts","sourceRoot":"","sources":["../../src/formatting/NumberingManager.ts"],"names":[],"mappings":"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"}
@@ -56,7 +56,7 @@ class NumberingManager {
56
56
  instancesToRemove.push(numId);
57
57
  }
58
58
  });
59
- instancesToRemove.forEach(numId => {
59
+ instancesToRemove.forEach((numId) => {
60
60
  this.instances.delete(numId);
61
61
  this._removedNumIds.add(numId);
62
62
  });
@@ -197,12 +197,30 @@ class NumberingManager {
197
197
  this.addInstance(instance);
198
198
  return numId;
199
199
  }
200
+ restartNumbering(numId, level = 0, startValue = 1) {
201
+ if (level < 0 || level > 8) {
202
+ throw new Error(`Invalid level ${level}. Level must be between 0 and 8.`);
203
+ }
204
+ if (startValue < 1) {
205
+ throw new Error(`Invalid startValue ${startValue}. Start value must be at least 1.`);
206
+ }
207
+ const existingInstance = this.getInstance(numId);
208
+ if (!existingInstance) {
209
+ throw new Error(`Numbering instance ${numId} does not exist`);
210
+ }
211
+ const abstractNumId = existingInstance.getAbstractNumId();
212
+ const newNumId = this.nextNumId++;
213
+ const newInstance = NumberingInstance_1.NumberingInstance.create({ numId: newNumId, abstractNumId });
214
+ newInstance.setLevelOverride(level, startValue);
215
+ this.addInstance(newInstance);
216
+ return newNumId;
217
+ }
200
218
  getStandardIndentation(level) {
201
219
  if (level < 0 || level > 8) {
202
220
  throw new Error(`Invalid level ${level}. Level must be between 0 and 8.`);
203
221
  }
204
222
  return {
205
- leftIndent: 720 + (level * 360),
223
+ leftIndent: 720 + level * 360,
206
224
  hangingIndent: 360,
207
225
  };
208
226
  }
@@ -289,7 +307,7 @@ class NumberingManager {
289
307
  instancesRemoved++;
290
308
  }
291
309
  const referencedAbstractNumIds = new Set();
292
- this.instances.forEach(instance => {
310
+ this.instances.forEach((instance) => {
293
311
  referencedAbstractNumIds.add(instance.getAbstractNumId());
294
312
  });
295
313
  const abstractsToRemove = [];
@@ -369,16 +387,16 @@ class NumberingManager {
369
387
  const builder = new XMLBuilder_1.XMLBuilder();
370
388
  const children = [];
371
389
  const abstractNumberings = this.getAllAbstractNumberings();
372
- abstractNumberings.forEach(abstractNum => {
390
+ abstractNumberings.forEach((abstractNum) => {
373
391
  children.push(abstractNum.toXML());
374
392
  });
375
393
  const instances = this.getAllInstances();
376
- instances.forEach(instance => {
394
+ instances.forEach((instance) => {
377
395
  children.push(instance.toXML());
378
396
  });
379
397
  const numbering = XMLBuilder_1.XMLBuilder.w('numbering', {
380
398
  'xmlns:w': 'http://schemas.openxmlformats.org/wordprocessingml/2006/main',
381
- 'xmlns:r': 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'
399
+ 'xmlns:r': 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',
382
400
  }, children);
383
401
  builder.element(numbering.name, numbering.attributes, numbering.children);
384
402
  return builder.build(true);
@@ -386,16 +404,16 @@ class NumberingManager {
386
404
  toXML() {
387
405
  const children = [];
388
406
  const abstractNumberings = this.getAllAbstractNumberings();
389
- abstractNumberings.forEach(abstractNum => {
407
+ abstractNumberings.forEach((abstractNum) => {
390
408
  children.push(abstractNum.toXML());
391
409
  });
392
410
  const instances = this.getAllInstances();
393
- instances.forEach(instance => {
411
+ instances.forEach((instance) => {
394
412
  children.push(instance.toXML());
395
413
  });
396
414
  return XMLBuilder_1.XMLBuilder.w('numbering', {
397
415
  'xmlns:w': 'http://schemas.openxmlformats.org/wordprocessingml/2006/main',
398
- 'xmlns:r': 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'
416
+ 'xmlns:r': 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',
399
417
  }, children);
400
418
  }
401
419
  static create() {
@@ -1 +1 @@
1
- {"version":3,"file":"NumberingManager.js","sourceRoot":"","sources":["../../src/formatting/NumberingManager.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * NumberingManager - Manages numbering definitions and generates numbering.xml\r\n *\r\n * The NumberingManager is responsible for managing all abstract numbering definitions\r\n * and numbering instances in a document, and generating the numbering.xml file.\r\n */\r\n\r\nimport { XMLBuilder, XMLElement } from '../xml/XMLBuilder';\r\nimport { AbstractNumbering } from './AbstractNumbering';\r\nimport { NumberingInstance } from './NumberingInstance';\r\nimport { NumberingLevel } from './NumberingLevel';\r\nimport { defaultLogger } from '../utils/logger';\r\n\r\n/**\r\n * Options for numbering consolidation\r\n */\r\nexport interface NumberingConsolidationOptions {\r\n /** AbstractNumIds to exclude from consolidation (e.g., HLP/row-number lists) */\r\n protectedAbstractNumIds?: Set<number>;\r\n}\r\n\r\n/**\r\n * Result of numbering consolidation\r\n */\r\nexport interface NumberingConsolidationResult {\r\n abstractNumsRemoved: number;\r\n instancesRemapped: number;\r\n groupsConsolidated: number;\r\n}\r\n\r\n/**\r\n * Manages numbering definitions and instances for a document\r\n */\r\nexport class NumberingManager {\r\n private abstractNumberings: Map<number, AbstractNumbering>;\r\n private instances: Map<number, NumberingInstance>;\r\n private nextAbstractNumId: number;\r\n private nextNumId: number;\r\n\r\n // Track if numbering has been modified (for XML preservation)\r\n private _modified = false;\r\n\r\n // Track which specific definitions have been modified (for selective merging)\r\n private _modifiedAbstractNumIds = new Set<number>();\r\n private _modifiedNumIds = new Set<number>();\r\n\r\n // Track which definitions have been removed (for removal from original XML during merge)\r\n private _removedAbstractNumIds = new Set<number>();\r\n private _removedNumIds = new Set<number>();\r\n\r\n /**\r\n * Creates a new numbering manager\r\n * @param initializeDefaults Whether to initialize with default numbering definitions\r\n */\r\n constructor(initializeDefaults = false) {\r\n this.abstractNumberings = new Map();\r\n this.instances = new Map();\r\n this.nextAbstractNumId = 0;\r\n this.nextNumId = 1;\r\n\r\n if (initializeDefaults) {\r\n this.initializeDefaultNumberings();\r\n }\r\n }\r\n\r\n /**\r\n * Initializes default numbering definitions (bullet and numbered lists)\r\n */\r\n private initializeDefaultNumberings(): void {\r\n // Create default bullet list\r\n const bulletAbstract = AbstractNumbering.createBulletList(this.nextAbstractNumId++);\r\n this.addAbstractNumbering(bulletAbstract);\r\n\r\n // Create default numbered list\r\n const numberedAbstract = AbstractNumbering.createNumberedList(this.nextAbstractNumId++);\r\n this.addAbstractNumbering(numberedAbstract);\r\n }\r\n\r\n /**\r\n * Adds an abstract numbering definition\r\n * @param abstractNumbering The abstract numbering to add\r\n */\r\n addAbstractNumbering(abstractNumbering: AbstractNumbering): this {\r\n const id = abstractNumbering.getAbstractNumId();\r\n this.abstractNumberings.set(id, abstractNumbering);\r\n\r\n // Update next ID if necessary\r\n if (id >= this.nextAbstractNumId) {\r\n this.nextAbstractNumId = id + 1;\r\n }\r\n\r\n this._modified = true;\r\n this._modifiedAbstractNumIds.add(id);\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets an abstract numbering by ID\r\n * @param abstractNumId The abstract numbering ID\r\n */\r\n getAbstractNumbering(abstractNumId: number): AbstractNumbering | undefined {\r\n return this.abstractNumberings.get(abstractNumId);\r\n }\r\n\r\n /**\r\n * Gets all abstract numberings\r\n */\r\n getAllAbstractNumberings(): AbstractNumbering[] {\r\n return Array.from(this.abstractNumberings.values()).sort(\r\n (a, b) => a.getAbstractNumId() - b.getAbstractNumId()\r\n );\r\n }\r\n\r\n /**\r\n * Checks if an abstract numbering exists\r\n * @param abstractNumId The abstract numbering ID\r\n */\r\n hasAbstractNumbering(abstractNumId: number): boolean {\r\n return this.abstractNumberings.has(abstractNumId);\r\n }\r\n\r\n /**\r\n * Removes an abstract numbering\r\n * @param abstractNumId The abstract numbering ID\r\n */\r\n removeAbstractNumbering(abstractNumId: number): boolean {\r\n // Also remove all instances referencing this abstract numbering\r\n const instancesToRemove: number[] = [];\r\n this.instances.forEach((instance, numId) => {\r\n if (instance.getAbstractNumId() === abstractNumId) {\r\n instancesToRemove.push(numId);\r\n }\r\n });\r\n\r\n instancesToRemove.forEach(numId => {\r\n this.instances.delete(numId);\r\n this._removedNumIds.add(numId);\r\n });\r\n\r\n const deleted = this.abstractNumberings.delete(abstractNumId);\r\n if (deleted) {\r\n this._modified = true;\r\n this._removedAbstractNumIds.add(abstractNumId);\r\n }\r\n return deleted;\r\n }\r\n\r\n /**\r\n * Adds a numbering instance\r\n * @param instance The numbering instance to add\r\n */\r\n addInstance(instance: NumberingInstance): this {\r\n const numId = instance.getNumId();\r\n const abstractNumId = instance.getAbstractNumId();\r\n\r\n // Verify that the abstract numbering exists\r\n if (!this.hasAbstractNumbering(abstractNumId)) {\r\n throw new Error(`Abstract numbering ${abstractNumId} does not exist`);\r\n }\r\n\r\n this.instances.set(numId, instance);\r\n this._modified = true;\r\n this._modifiedNumIds.add(numId);\r\n\r\n // Update next ID if necessary\r\n if (numId >= this.nextNumId) {\r\n this.nextNumId = numId + 1;\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Alias for addInstance for backward compatibility\r\n * @param instance The numbering instance to add\r\n */\r\n addNumberingInstance(instance: NumberingInstance): this {\r\n return this.addInstance(instance);\r\n }\r\n\r\n /**\r\n * Gets a numbering instance by ID\r\n * @param numId The numbering instance ID\r\n */\r\n getInstance(numId: number): NumberingInstance | undefined {\r\n return this.instances.get(numId);\r\n }\r\n\r\n /**\r\n * Alias for getInstance for backward compatibility\r\n * @param numId The numbering instance ID\r\n */\r\n getNumberingInstance(numId: number): NumberingInstance | undefined {\r\n return this.getInstance(numId);\r\n }\r\n\r\n /**\r\n * Gets all numbering instances\r\n */\r\n getAllInstances(): NumberingInstance[] {\r\n return Array.from(this.instances.values()).sort(\r\n (a, b) => a.getNumId() - b.getNumId()\r\n );\r\n }\r\n\r\n /**\r\n * Checks if numbering has been modified since loading\r\n * Used for XML preservation optimization\r\n * @returns True if numbering was added or modified\r\n */\r\n isModified(): boolean {\r\n return this._modified;\r\n }\r\n\r\n /**\r\n * Marks an abstract numbering as modified for XML regeneration.\r\n * Use when modifying NumberingLevel properties directly (setLeftIndent, etc.)\r\n * which don't automatically trigger the modified flag.\r\n * @param abstractNumId The abstract numbering ID to mark as modified\r\n */\r\n markAbstractNumberingModified(abstractNumId: number): void {\r\n if (this.abstractNumberings.has(abstractNumId)) {\r\n this._modified = true;\r\n this._modifiedAbstractNumIds.add(abstractNumId);\r\n }\r\n }\r\n\r\n /**\r\n * Resets the modified flag\r\n * Called after parsing to indicate that loaded numbering doesn't count as modifications\r\n */\r\n resetModified(): void {\r\n this._modified = false;\r\n this._modifiedAbstractNumIds.clear();\r\n this._modifiedNumIds.clear();\r\n this._removedAbstractNumIds.clear();\r\n this._removedNumIds.clear();\r\n }\r\n\r\n /**\r\n * Gets the IDs of abstract numberings that have been modified since loading\r\n * Used for selective merging with original numbering.xml\r\n */\r\n getModifiedAbstractNumIds(): Set<number> {\r\n return new Set(this._modifiedAbstractNumIds);\r\n }\r\n\r\n /**\r\n * Gets the IDs of numbering instances that have been modified since loading\r\n * Used for selective merging with original numbering.xml\r\n */\r\n getModifiedNumIds(): Set<number> {\r\n return new Set(this._modifiedNumIds);\r\n }\r\n\r\n /**\r\n * Gets the IDs of abstract numberings that have been removed since loading\r\n * Used for removal from original numbering.xml during merge\r\n */\r\n getRemovedAbstractNumIds(): Set<number> {\r\n return new Set(this._removedAbstractNumIds);\r\n }\r\n\r\n /**\r\n * Gets the IDs of numbering instances that have been removed since loading\r\n * Used for removal from original numbering.xml during merge\r\n */\r\n getRemovedNumIds(): Set<number> {\r\n return new Set(this._removedNumIds);\r\n }\r\n\r\n /**\r\n * Alias for getAllInstances for backward compatibility\r\n */\r\n getAllNumberingInstances(): NumberingInstance[] {\r\n return this.getAllInstances();\r\n }\r\n\r\n /**\r\n * Checks if a numbering instance exists\r\n * @param numId The numbering instance ID\r\n */\r\n hasInstance(numId: number): boolean {\r\n return this.instances.has(numId);\r\n }\r\n\r\n /**\r\n * Removes a numbering instance\r\n * @param numId The numbering instance ID\r\n */\r\n removeInstance(numId: number): boolean {\r\n const deleted = this.instances.delete(numId);\r\n if (deleted) {\r\n this._modified = true;\r\n this._removedNumIds.add(numId);\r\n }\r\n return deleted;\r\n }\r\n\r\n /**\r\n * Creates a new bullet list and returns its numId\r\n * @param levels Number of levels (default: 9)\r\n * @param bullets Array of bullet characters\r\n */\r\n createBulletList(levels = 9, bullets?: string[]): number {\r\n // Create abstract numbering\r\n const abstractNumId = this.nextAbstractNumId++;\r\n // Only pass bullets if it's defined, so defaults are used otherwise\r\n const abstractNumbering = bullets\r\n ? AbstractNumbering.createBulletList(abstractNumId, levels, bullets)\r\n : AbstractNumbering.createBulletList(abstractNumId, levels);\r\n this.addAbstractNumbering(abstractNumbering);\r\n\r\n // Create instance\r\n const numId = this.nextNumId++;\r\n const instance = NumberingInstance.create({ numId, abstractNumId });\r\n this.addInstance(instance);\r\n\r\n return numId;\r\n }\r\n\r\n /**\r\n * Creates a new numbered list and returns its numId\r\n * @param levels Number of levels (default: 9)\r\n * @param formats Array of formats for each level\r\n */\r\n createNumberedList(\r\n levels = 9,\r\n formats?: ('decimal' | 'lowerLetter' | 'lowerRoman')[]\r\n ): number {\r\n // Create abstract numbering\r\n const abstractNumId = this.nextAbstractNumId++;\r\n // Only pass formats if it's defined, so defaults are used otherwise\r\n const abstractNumbering = formats\r\n ? AbstractNumbering.createNumberedList(abstractNumId, levels, formats)\r\n : AbstractNumbering.createNumberedList(abstractNumId, levels);\r\n this.addAbstractNumbering(abstractNumbering);\r\n\r\n // Create instance\r\n const numId = this.nextNumId++;\r\n const instance = NumberingInstance.create({ numId, abstractNumId });\r\n this.addInstance(instance);\r\n\r\n return numId;\r\n }\r\n\r\n /**\r\n * Creates a new multi-level list and returns its numId\r\n */\r\n createMultiLevelList(): number {\r\n // Create abstract numbering\r\n const abstractNumId = this.nextAbstractNumId++;\r\n const abstractNumbering = AbstractNumbering.createMultiLevelList(abstractNumId);\r\n this.addAbstractNumbering(abstractNumbering);\r\n\r\n // Create instance\r\n const numId = this.nextNumId++;\r\n const instance = NumberingInstance.create({ numId, abstractNumId });\r\n this.addInstance(instance);\r\n\r\n return numId;\r\n }\r\n\r\n /**\r\n * Creates a new outline list and returns its numId\r\n */\r\n createOutlineList(): number {\r\n // Create abstract numbering\r\n const abstractNumId = this.nextAbstractNumId++;\r\n const abstractNumbering = AbstractNumbering.createOutlineList(abstractNumId);\r\n this.addAbstractNumbering(abstractNumbering);\r\n\r\n // Create instance\r\n const numId = this.nextNumId++;\r\n const instance = NumberingInstance.create({ numId, abstractNumId });\r\n this.addInstance(instance);\r\n\r\n return numId;\r\n }\r\n\r\n /**\r\n * Creates a custom list with specified levels and returns its numId\r\n * @param levels Array of numbering levels\r\n * @param name Optional name for the list\r\n */\r\n createCustomList(levels: NumberingLevel[], name?: string): number {\r\n // Create abstract numbering\r\n const abstractNumId = this.nextAbstractNumId++;\r\n const abstractNumbering = AbstractNumbering.create({\r\n abstractNumId,\r\n name,\r\n levels,\r\n });\r\n this.addAbstractNumbering(abstractNumbering);\r\n\r\n // Create instance\r\n const numId = this.nextNumId++;\r\n const instance = NumberingInstance.create({ numId, abstractNumId });\r\n this.addInstance(instance);\r\n\r\n return numId;\r\n }\r\n\r\n /**\r\n * Creates a new instance of an existing abstract numbering\r\n * @param abstractNumId The abstract numbering ID to create an instance of\r\n */\r\n createInstance(abstractNumId: number): number {\r\n if (!this.hasAbstractNumbering(abstractNumId)) {\r\n throw new Error(`Abstract numbering ${abstractNumId} does not exist`);\r\n }\r\n\r\n const numId = this.nextNumId++;\r\n const instance = NumberingInstance.create({ numId, abstractNumId });\r\n this.addInstance(instance);\r\n\r\n return numId;\r\n }\r\n\r\n /**\r\n * Gets the framework's standard indentation for a list level\r\n *\r\n * The framework uses a consistent indentation scheme:\r\n * - leftIndent: 720 + (level * 360) twips\r\n * - hangingIndent: 360 twips\r\n *\r\n * Examples:\r\n * - Level 0: 720 twips (0.5 inch) left, 360 twips hanging\r\n * - Level 1: 1080 twips (0.75 inch) left, 360 twips hanging\r\n * - Level 2: 1440 twips (1.0 inch) left, 360 twips hanging\r\n *\r\n * @param level The level (0-8)\r\n * @returns Object with leftIndent and hangingIndent in twips\r\n * @example\r\n * ```typescript\r\n * const indent = manager.getStandardIndentation(0);\r\n * // Returns: { leftIndent: 720, hangingIndent: 360 }\r\n * ```\r\n */\r\n getStandardIndentation(level: number): { leftIndent: number; hangingIndent: number } {\r\n if (level < 0 || level > 8) {\r\n throw new Error(`Invalid level ${level}. Level must be between 0 and 8.`);\r\n }\r\n\r\n return {\r\n leftIndent: 720 + (level * 360),\r\n hangingIndent: 360,\r\n };\r\n }\r\n\r\n /**\r\n * Sets custom indentation for a specific level in a numbering definition\r\n *\r\n * This updates the indentation for a specific level across ALL paragraphs\r\n * that use this numId and level combination.\r\n *\r\n * @param numId The numbering instance ID\r\n * @param level The level to modify (0-8)\r\n * @param leftIndent Left indentation in twips\r\n * @param hangingIndent Hanging indentation in twips (optional, defaults to 360)\r\n * @returns true if successful, false if numId doesn't exist\r\n * @example\r\n * ```typescript\r\n * // Set level 0 to 0.5 inch left, 0.25 inch hanging\r\n * manager.setListIndentation(1, 0, 720, 360);\r\n * ```\r\n */\r\n setListIndentation(\r\n numId: number,\r\n level: number,\r\n leftIndent: number,\r\n hangingIndent = 360\r\n ): boolean {\r\n // Validate level\r\n if (level < 0 || level > 8) {\r\n throw new Error(`Invalid level ${level}. Level must be between 0 and 8.`);\r\n }\r\n\r\n // Validate indents (clamp negatives to 0)\r\n leftIndent = Math.max(0, leftIndent);\r\n hangingIndent = Math.max(0, hangingIndent);\r\n\r\n // Get the numbering instance\r\n const instance = this.getInstance(numId);\r\n if (!instance) {\r\n defaultLogger.warn(`Numbering instance ${numId} does not exist`);\r\n return false;\r\n }\r\n\r\n // Get the abstract numbering\r\n const abstractNum = this.getAbstractNumbering(instance.getAbstractNumId());\r\n if (!abstractNum) {\r\n defaultLogger.warn(`Abstract numbering for instance ${numId} does not exist`);\r\n return false;\r\n }\r\n\r\n // Get the level from the abstract numbering\r\n const numLevel = abstractNum.getLevel(level);\r\n if (!numLevel) {\r\n defaultLogger.warn(`Level ${level} does not exist in abstract numbering`);\r\n return false;\r\n }\r\n\r\n // Update the level's indentation\r\n numLevel.setLeftIndent(leftIndent);\r\n numLevel.setHangingIndent(hangingIndent);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Resets all levels in a numbering definition to standard indentation\r\n *\r\n * This applies the framework's standard indentation formula to all levels:\r\n * - leftIndent: 720 + (level * 360) twips\r\n * - hangingIndent: 360 twips\r\n *\r\n * @param numId The numbering instance ID\r\n * @returns true if successful, false if numId doesn't exist\r\n * @example\r\n * ```typescript\r\n * // Reset list 1 to standard indentation\r\n * manager.normalizeListIndentation(1);\r\n * ```\r\n */\r\n normalizeListIndentation(numId: number): boolean {\r\n // Get the numbering instance\r\n const instance = this.getInstance(numId);\r\n if (!instance) {\r\n defaultLogger.warn(`Numbering instance ${numId} does not exist`);\r\n return false;\r\n }\r\n\r\n // Get the abstract numbering\r\n const abstractNum = this.getAbstractNumbering(instance.getAbstractNumId());\r\n if (!abstractNum) {\r\n defaultLogger.warn(`Abstract numbering for instance ${numId} does not exist`);\r\n return false;\r\n }\r\n\r\n // Get all levels\r\n const levels = abstractNum.getAllLevels();\r\n\r\n // Apply standard indentation to each level\r\n for (const level of levels) {\r\n const standardIndent = this.getStandardIndentation(level.getLevel());\r\n level.setLeftIndent(standardIndent.leftIndent);\r\n level.setHangingIndent(standardIndent.hangingIndent);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Normalizes indentation for all lists in the document\r\n *\r\n * Applies standard indentation to every numbering instance:\r\n * - leftIndent: 720 + (level * 360) twips\r\n * - hangingIndent: 360 twips\r\n *\r\n * This ensures consistent spacing across all lists in the document.\r\n *\r\n * @returns Number of numbering instances updated\r\n * @example\r\n * ```typescript\r\n * const count = manager.normalizeAllListIndentation();\r\n * console.log(`Normalized ${count} lists`);\r\n * ```\r\n */\r\n normalizeAllListIndentation(): number {\r\n let count = 0;\r\n\r\n // Iterate over all instances\r\n for (const instance of this.getAllInstances()) {\r\n const success = this.normalizeListIndentation(instance.getNumId());\r\n if (success) {\r\n count++;\r\n }\r\n }\r\n\r\n return count;\r\n }\r\n\r\n /**\r\n * Gets the total number of abstract numberings\r\n */\r\n getAbstractNumberingCount(): number {\r\n return this.abstractNumberings.size;\r\n }\r\n\r\n /**\r\n * Gets the total number of numbering instances\r\n */\r\n getInstanceCount(): number {\r\n return this.instances.size;\r\n }\r\n\r\n /**\r\n * Clears all numbering definitions and instances\r\n */\r\n clear(): this {\r\n this.abstractNumberings.clear();\r\n this.instances.clear();\r\n this.nextAbstractNumId = 0;\r\n this.nextNumId = 1;\r\n return this;\r\n }\r\n\r\n /**\r\n * Removes unused numbering instances and abstract numberings\r\n *\r\n * This method cleans up numbering definitions that are no longer referenced\r\n * by any paragraphs in the document. It removes:\r\n * 1. Instances not in the usedNumIds set\r\n * 2. Abstract numberings not referenced by any remaining instance\r\n *\r\n * @param usedNumIds Set of numIds currently used by paragraphs\r\n * @returns Object with counts of removed instances and abstract numberings\r\n */\r\n cleanupUnusedNumbering(usedNumIds: Set<number>): { instancesRemoved: number; abstractsRemoved: number } {\r\n let instancesRemoved = 0;\r\n let abstractsRemoved = 0;\r\n\r\n // Step 1: Remove unused instances\r\n const instancesToRemove: number[] = [];\r\n this.instances.forEach((_instance, numId) => {\r\n if (!usedNumIds.has(numId)) {\r\n instancesToRemove.push(numId);\r\n }\r\n });\r\n\r\n for (const numId of instancesToRemove) {\r\n this.instances.delete(numId);\r\n this._modified = true;\r\n this._removedNumIds.add(numId);\r\n instancesRemoved++;\r\n }\r\n\r\n // Step 2: Find abstract numberings still referenced by remaining instances\r\n const referencedAbstractNumIds = new Set<number>();\r\n this.instances.forEach(instance => {\r\n referencedAbstractNumIds.add(instance.getAbstractNumId());\r\n });\r\n\r\n // Step 3: Remove unreferenced abstract numberings\r\n const abstractsToRemove: number[] = [];\r\n this.abstractNumberings.forEach((_abstractNum, abstractNumId) => {\r\n if (!referencedAbstractNumIds.has(abstractNumId)) {\r\n abstractsToRemove.push(abstractNumId);\r\n }\r\n });\r\n\r\n for (const abstractNumId of abstractsToRemove) {\r\n this.abstractNumberings.delete(abstractNumId);\r\n this._modified = true;\r\n this._removedAbstractNumIds.add(abstractNumId);\r\n abstractsRemoved++;\r\n }\r\n\r\n return { instancesRemoved, abstractsRemoved };\r\n }\r\n\r\n /**\r\n * Consolidates duplicate abstract numbering definitions\r\n *\r\n * Groups abstractNums by a deterministic fingerprint of their level properties\r\n * (format, text, font, fontSize, color, indentation, alignment, etc.).\r\n * For each group with >1 member, picks the lowest abstractNumId as canonical,\r\n * remaps all instances pointing to non-canonical IDs, and removes duplicates.\r\n *\r\n * This is safe because multiple num instances can reference the same abstractNum —\r\n * each instance maintains its own independent counter via level overrides.\r\n *\r\n * @param options Optional configuration (e.g., protected IDs to skip)\r\n * @returns Summary of what was consolidated\r\n */\r\n consolidateNumbering(options?: NumberingConsolidationOptions): NumberingConsolidationResult {\r\n const protectedIds = options?.protectedAbstractNumIds ?? new Set<number>();\r\n\r\n // 1. Compute fingerprint for each non-protected abstractNum\r\n const fingerprintGroups = new Map<string, number[]>();\r\n for (const abstractNum of this.abstractNumberings.values()) {\r\n const id = abstractNum.getAbstractNumId();\r\n if (protectedIds.has(id)) continue;\r\n\r\n const fingerprint = this._fingerprintAbstractNum(abstractNum);\r\n const group = fingerprintGroups.get(fingerprint);\r\n if (group) {\r\n group.push(id);\r\n } else {\r\n fingerprintGroups.set(fingerprint, [id]);\r\n }\r\n }\r\n\r\n // 2. For each group with >1 member, consolidate\r\n let abstractNumsRemoved = 0;\r\n let instancesRemapped = 0;\r\n let groupsConsolidated = 0;\r\n\r\n for (const [, ids] of fingerprintGroups) {\r\n if (ids.length <= 1) continue;\r\n\r\n // Sort to pick lowest ID as canonical\r\n ids.sort((a, b) => a - b);\r\n const canonicalId = ids[0]!;\r\n const duplicateIds = new Set(ids.slice(1));\r\n\r\n groupsConsolidated++;\r\n\r\n // Remap instances pointing to duplicate abstractNums\r\n for (const instance of this.instances.values()) {\r\n if (duplicateIds.has(instance.getAbstractNumId())) {\r\n instance.setAbstractNumId(canonicalId);\r\n this._modifiedNumIds.add(instance.getNumId());\r\n instancesRemapped++;\r\n }\r\n }\r\n\r\n // Remove duplicate abstractNums\r\n for (const dupId of duplicateIds) {\r\n this.abstractNumberings.delete(dupId);\r\n this._removedAbstractNumIds.add(dupId);\r\n abstractNumsRemoved++;\r\n }\r\n }\r\n\r\n if (abstractNumsRemoved > 0) {\r\n this._modified = true;\r\n }\r\n\r\n return { abstractNumsRemoved, instancesRemapped, groupsConsolidated };\r\n }\r\n\r\n /**\r\n * Computes a deterministic fingerprint for an abstract numbering definition\r\n * based on its multiLevelType and all level properties. Name and abstractNumId\r\n * are excluded since they don't affect rendering.\r\n */\r\n private _fingerprintAbstractNum(abstractNum: AbstractNumbering): string {\r\n const parts: string[] = [\r\n abstractNum.getNumStyleLink() ?? '',\r\n abstractNum.getStyleLink() ?? '',\r\n abstractNum.getMultiLevelType(),\r\n ];\r\n\r\n for (const level of abstractNum.getAllLevels()) {\r\n const props = level.getProperties();\r\n parts.push(\r\n `${props.level}|${props.format}|${props.text}|${props.font}|${props.fontSize}|` +\r\n `${props.color}|${props.leftIndent}|${props.hangingIndent}|${props.alignment}|` +\r\n `${props.start}|${props.bold}|${props.italic}|${props.underline ?? ''}|` +\r\n `${props.suffix}|${props.isLegalNumberingStyle}|${props.lvlRestart ?? ''}`\r\n );\r\n }\r\n\r\n return parts.join('::');\r\n }\r\n\r\n /**\r\n * Generates the complete numbering.xml content\r\n */\r\n generateNumberingXml(): string {\r\n const builder = new XMLBuilder();\r\n\r\n const children: XMLElement[] = [];\r\n\r\n // Add all abstract numberings\r\n const abstractNumberings = this.getAllAbstractNumberings();\r\n abstractNumberings.forEach(abstractNum => {\r\n children.push(abstractNum.toXML());\r\n });\r\n\r\n // Add all numbering instances\r\n const instances = this.getAllInstances();\r\n instances.forEach(instance => {\r\n children.push(instance.toXML());\r\n });\r\n\r\n const numbering = XMLBuilder.w('numbering', {\r\n 'xmlns:w': 'http://schemas.openxmlformats.org/wordprocessingml/2006/main',\r\n 'xmlns:r': 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'\r\n }, children);\r\n\r\n builder.element(numbering.name, numbering.attributes, numbering.children);\r\n\r\n // Generate XML with declaration\r\n return builder.build(true);\r\n }\r\n\r\n /**\r\n * Generates the numbering.xml as XMLElement (for API compatibility)\r\n */\r\n toXML(): XMLElement {\r\n const children: XMLElement[] = [];\r\n\r\n // Add all abstract numberings\r\n const abstractNumberings = this.getAllAbstractNumberings();\r\n abstractNumberings.forEach(abstractNum => {\r\n children.push(abstractNum.toXML());\r\n });\r\n\r\n // Add all numbering instances\r\n const instances = this.getAllInstances();\r\n instances.forEach(instance => {\r\n children.push(instance.toXML());\r\n });\r\n\r\n return XMLBuilder.w('numbering', {\r\n 'xmlns:w': 'http://schemas.openxmlformats.org/wordprocessingml/2006/main',\r\n 'xmlns:r': 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'\r\n }, children);\r\n }\r\n\r\n /**\r\n * Creates a numbering manager with default numbering definitions\r\n */\r\n static create(): NumberingManager {\r\n return new NumberingManager(false);\r\n }\r\n\r\n /**\r\n * Creates an empty numbering manager\r\n */\r\n static createEmpty(): NumberingManager {\r\n return new NumberingManager(false);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"NumberingManager.js","sourceRoot":"","sources":["../../src/formatting/NumberingManager.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * NumberingManager - Manages numbering definitions and generates numbering.xml\n *\n * The NumberingManager is responsible for managing all abstract numbering definitions\n * and numbering instances in a document, and generating the numbering.xml file.\n */\n\nimport { XMLBuilder, XMLElement } from '../xml/XMLBuilder';\nimport { AbstractNumbering } from './AbstractNumbering';\nimport { NumberingInstance } from './NumberingInstance';\nimport { NumberingLevel } from './NumberingLevel';\nimport { defaultLogger } from '../utils/logger';\n\n/**\n * Options for numbering consolidation\n */\nexport interface NumberingConsolidationOptions {\n /** AbstractNumIds to exclude from consolidation (e.g., HLP/row-number lists) */\n protectedAbstractNumIds?: Set<number>;\n}\n\n/**\n * Result of numbering consolidation\n */\nexport interface NumberingConsolidationResult {\n abstractNumsRemoved: number;\n instancesRemapped: number;\n groupsConsolidated: number;\n}\n\n/**\n * Manages numbering definitions and instances for a document\n */\nexport class NumberingManager {\n private abstractNumberings: Map<number, AbstractNumbering>;\n private instances: Map<number, NumberingInstance>;\n private nextAbstractNumId: number;\n private nextNumId: number;\n\n // Track if numbering has been modified (for XML preservation)\n private _modified = false;\n\n // Track which specific definitions have been modified (for selective merging)\n private _modifiedAbstractNumIds = new Set<number>();\n private _modifiedNumIds = new Set<number>();\n\n // Track which definitions have been removed (for removal from original XML during merge)\n private _removedAbstractNumIds = new Set<number>();\n private _removedNumIds = new Set<number>();\n\n /**\n * Creates a new numbering manager\n * @param initializeDefaults Whether to initialize with default numbering definitions\n */\n constructor(initializeDefaults = false) {\n this.abstractNumberings = new Map();\n this.instances = new Map();\n this.nextAbstractNumId = 0;\n this.nextNumId = 1;\n\n if (initializeDefaults) {\n this.initializeDefaultNumberings();\n }\n }\n\n /**\n * Initializes default numbering definitions (bullet and numbered lists)\n */\n private initializeDefaultNumberings(): void {\n // Create default bullet list\n const bulletAbstract = AbstractNumbering.createBulletList(this.nextAbstractNumId++);\n this.addAbstractNumbering(bulletAbstract);\n\n // Create default numbered list\n const numberedAbstract = AbstractNumbering.createNumberedList(this.nextAbstractNumId++);\n this.addAbstractNumbering(numberedAbstract);\n }\n\n /**\n * Adds an abstract numbering definition\n * @param abstractNumbering The abstract numbering to add\n */\n addAbstractNumbering(abstractNumbering: AbstractNumbering): this {\n const id = abstractNumbering.getAbstractNumId();\n this.abstractNumberings.set(id, abstractNumbering);\n\n // Update next ID if necessary\n if (id >= this.nextAbstractNumId) {\n this.nextAbstractNumId = id + 1;\n }\n\n this._modified = true;\n this._modifiedAbstractNumIds.add(id);\n return this;\n }\n\n /**\n * Gets an abstract numbering by ID\n * @param abstractNumId The abstract numbering ID\n */\n getAbstractNumbering(abstractNumId: number): AbstractNumbering | undefined {\n return this.abstractNumberings.get(abstractNumId);\n }\n\n /**\n * Gets all abstract numberings\n */\n getAllAbstractNumberings(): AbstractNumbering[] {\n return Array.from(this.abstractNumberings.values()).sort(\n (a, b) => a.getAbstractNumId() - b.getAbstractNumId()\n );\n }\n\n /**\n * Checks if an abstract numbering exists\n * @param abstractNumId The abstract numbering ID\n */\n hasAbstractNumbering(abstractNumId: number): boolean {\n return this.abstractNumberings.has(abstractNumId);\n }\n\n /**\n * Removes an abstract numbering\n * @param abstractNumId The abstract numbering ID\n */\n removeAbstractNumbering(abstractNumId: number): boolean {\n // Also remove all instances referencing this abstract numbering\n const instancesToRemove: number[] = [];\n this.instances.forEach((instance, numId) => {\n if (instance.getAbstractNumId() === abstractNumId) {\n instancesToRemove.push(numId);\n }\n });\n\n instancesToRemove.forEach((numId) => {\n this.instances.delete(numId);\n this._removedNumIds.add(numId);\n });\n\n const deleted = this.abstractNumberings.delete(abstractNumId);\n if (deleted) {\n this._modified = true;\n this._removedAbstractNumIds.add(abstractNumId);\n }\n return deleted;\n }\n\n /**\n * Adds a numbering instance\n * @param instance The numbering instance to add\n */\n addInstance(instance: NumberingInstance): this {\n const numId = instance.getNumId();\n const abstractNumId = instance.getAbstractNumId();\n\n // Verify that the abstract numbering exists\n if (!this.hasAbstractNumbering(abstractNumId)) {\n throw new Error(`Abstract numbering ${abstractNumId} does not exist`);\n }\n\n this.instances.set(numId, instance);\n this._modified = true;\n this._modifiedNumIds.add(numId);\n\n // Update next ID if necessary\n if (numId >= this.nextNumId) {\n this.nextNumId = numId + 1;\n }\n\n return this;\n }\n\n /**\n * Alias for addInstance for backward compatibility\n * @param instance The numbering instance to add\n */\n addNumberingInstance(instance: NumberingInstance): this {\n return this.addInstance(instance);\n }\n\n /**\n * Gets a numbering instance by ID\n * @param numId The numbering instance ID\n */\n getInstance(numId: number): NumberingInstance | undefined {\n return this.instances.get(numId);\n }\n\n /**\n * Alias for getInstance for backward compatibility\n * @param numId The numbering instance ID\n */\n getNumberingInstance(numId: number): NumberingInstance | undefined {\n return this.getInstance(numId);\n }\n\n /**\n * Gets all numbering instances\n */\n getAllInstances(): NumberingInstance[] {\n return Array.from(this.instances.values()).sort((a, b) => a.getNumId() - b.getNumId());\n }\n\n /**\n * Checks if numbering has been modified since loading\n * Used for XML preservation optimization\n * @returns True if numbering was added or modified\n */\n isModified(): boolean {\n return this._modified;\n }\n\n /**\n * Marks an abstract numbering as modified for XML regeneration.\n * Use when modifying NumberingLevel properties directly (setLeftIndent, etc.)\n * which don't automatically trigger the modified flag.\n * @param abstractNumId The abstract numbering ID to mark as modified\n */\n markAbstractNumberingModified(abstractNumId: number): void {\n if (this.abstractNumberings.has(abstractNumId)) {\n this._modified = true;\n this._modifiedAbstractNumIds.add(abstractNumId);\n }\n }\n\n /**\n * Resets the modified flag\n * Called after parsing to indicate that loaded numbering doesn't count as modifications\n */\n resetModified(): void {\n this._modified = false;\n this._modifiedAbstractNumIds.clear();\n this._modifiedNumIds.clear();\n this._removedAbstractNumIds.clear();\n this._removedNumIds.clear();\n }\n\n /**\n * Gets the IDs of abstract numberings that have been modified since loading\n * Used for selective merging with original numbering.xml\n */\n getModifiedAbstractNumIds(): Set<number> {\n return new Set(this._modifiedAbstractNumIds);\n }\n\n /**\n * Gets the IDs of numbering instances that have been modified since loading\n * Used for selective merging with original numbering.xml\n */\n getModifiedNumIds(): Set<number> {\n return new Set(this._modifiedNumIds);\n }\n\n /**\n * Gets the IDs of abstract numberings that have been removed since loading\n * Used for removal from original numbering.xml during merge\n */\n getRemovedAbstractNumIds(): Set<number> {\n return new Set(this._removedAbstractNumIds);\n }\n\n /**\n * Gets the IDs of numbering instances that have been removed since loading\n * Used for removal from original numbering.xml during merge\n */\n getRemovedNumIds(): Set<number> {\n return new Set(this._removedNumIds);\n }\n\n /**\n * Alias for getAllInstances for backward compatibility\n */\n getAllNumberingInstances(): NumberingInstance[] {\n return this.getAllInstances();\n }\n\n /**\n * Checks if a numbering instance exists\n * @param numId The numbering instance ID\n */\n hasInstance(numId: number): boolean {\n return this.instances.has(numId);\n }\n\n /**\n * Removes a numbering instance\n * @param numId The numbering instance ID\n */\n removeInstance(numId: number): boolean {\n const deleted = this.instances.delete(numId);\n if (deleted) {\n this._modified = true;\n this._removedNumIds.add(numId);\n }\n return deleted;\n }\n\n /**\n * Creates a new bullet list and returns its numId\n * @param levels Number of levels (default: 9)\n * @param bullets Array of bullet characters\n */\n createBulletList(levels = 9, bullets?: string[]): number {\n // Create abstract numbering\n const abstractNumId = this.nextAbstractNumId++;\n // Only pass bullets if it's defined, so defaults are used otherwise\n const abstractNumbering = bullets\n ? AbstractNumbering.createBulletList(abstractNumId, levels, bullets)\n : AbstractNumbering.createBulletList(abstractNumId, levels);\n this.addAbstractNumbering(abstractNumbering);\n\n // Create instance\n const numId = this.nextNumId++;\n const instance = NumberingInstance.create({ numId, abstractNumId });\n this.addInstance(instance);\n\n return numId;\n }\n\n /**\n * Creates a new numbered list and returns its numId\n * @param levels Number of levels (default: 9)\n * @param formats Array of formats for each level\n */\n createNumberedList(levels = 9, formats?: ('decimal' | 'lowerLetter' | 'lowerRoman')[]): number {\n // Create abstract numbering\n const abstractNumId = this.nextAbstractNumId++;\n // Only pass formats if it's defined, so defaults are used otherwise\n const abstractNumbering = formats\n ? AbstractNumbering.createNumberedList(abstractNumId, levels, formats)\n : AbstractNumbering.createNumberedList(abstractNumId, levels);\n this.addAbstractNumbering(abstractNumbering);\n\n // Create instance\n const numId = this.nextNumId++;\n const instance = NumberingInstance.create({ numId, abstractNumId });\n this.addInstance(instance);\n\n return numId;\n }\n\n /**\n * Creates a new multi-level list and returns its numId\n */\n createMultiLevelList(): number {\n // Create abstract numbering\n const abstractNumId = this.nextAbstractNumId++;\n const abstractNumbering = AbstractNumbering.createMultiLevelList(abstractNumId);\n this.addAbstractNumbering(abstractNumbering);\n\n // Create instance\n const numId = this.nextNumId++;\n const instance = NumberingInstance.create({ numId, abstractNumId });\n this.addInstance(instance);\n\n return numId;\n }\n\n /**\n * Creates a new outline list and returns its numId\n */\n createOutlineList(): number {\n // Create abstract numbering\n const abstractNumId = this.nextAbstractNumId++;\n const abstractNumbering = AbstractNumbering.createOutlineList(abstractNumId);\n this.addAbstractNumbering(abstractNumbering);\n\n // Create instance\n const numId = this.nextNumId++;\n const instance = NumberingInstance.create({ numId, abstractNumId });\n this.addInstance(instance);\n\n return numId;\n }\n\n /**\n * Creates a custom list with specified levels and returns its numId\n * @param levels Array of numbering levels\n * @param name Optional name for the list\n */\n createCustomList(levels: NumberingLevel[], name?: string): number {\n // Create abstract numbering\n const abstractNumId = this.nextAbstractNumId++;\n const abstractNumbering = AbstractNumbering.create({\n abstractNumId,\n name,\n levels,\n });\n this.addAbstractNumbering(abstractNumbering);\n\n // Create instance\n const numId = this.nextNumId++;\n const instance = NumberingInstance.create({ numId, abstractNumId });\n this.addInstance(instance);\n\n return numId;\n }\n\n /**\n * Creates a new instance of an existing abstract numbering\n * @param abstractNumId The abstract numbering ID to create an instance of\n */\n createInstance(abstractNumId: number): number {\n if (!this.hasAbstractNumbering(abstractNumId)) {\n throw new Error(`Abstract numbering ${abstractNumId} does not exist`);\n }\n\n const numId = this.nextNumId++;\n const instance = NumberingInstance.create({ numId, abstractNumId });\n this.addInstance(instance);\n\n return numId;\n }\n\n /**\n * Creates a new numbering instance that restarts numbering for an existing list\n *\n * This creates a new `<w:num>` referencing the same `<w:abstractNum>` as the\n * given numId, but with a `<w:lvlOverride>/<w:startOverride>` to restart\n * counting at the specified value.\n *\n * @param numId The existing numbering instance ID to base the restart on\n * @param level The level to restart (0-8, default: 0)\n * @param startValue The value to restart from (>= 1, default: 1)\n * @returns The new numId to use with paragraph.setNumbering()\n *\n * @example\n * ```typescript\n * const listId = manager.createNumberedList();\n * // ... add items ...\n * const restartId = manager.restartNumbering(listId);\n * // restartId starts counting from 1 again, same list style\n * ```\n */\n restartNumbering(numId: number, level = 0, startValue = 1): number {\n if (level < 0 || level > 8) {\n throw new Error(`Invalid level ${level}. Level must be between 0 and 8.`);\n }\n if (startValue < 1) {\n throw new Error(`Invalid startValue ${startValue}. Start value must be at least 1.`);\n }\n\n const existingInstance = this.getInstance(numId);\n if (!existingInstance) {\n throw new Error(`Numbering instance ${numId} does not exist`);\n }\n\n const abstractNumId = existingInstance.getAbstractNumId();\n const newNumId = this.nextNumId++;\n const newInstance = NumberingInstance.create({ numId: newNumId, abstractNumId });\n newInstance.setLevelOverride(level, startValue);\n this.addInstance(newInstance);\n\n return newNumId;\n }\n\n /**\n * Gets the framework's standard indentation for a list level\n *\n * The framework uses a consistent indentation scheme:\n * - leftIndent: 720 + (level * 360) twips\n * - hangingIndent: 360 twips\n *\n * Examples:\n * - Level 0: 720 twips (0.5 inch) left, 360 twips hanging\n * - Level 1: 1080 twips (0.75 inch) left, 360 twips hanging\n * - Level 2: 1440 twips (1.0 inch) left, 360 twips hanging\n *\n * @param level The level (0-8)\n * @returns Object with leftIndent and hangingIndent in twips\n * @example\n * ```typescript\n * const indent = manager.getStandardIndentation(0);\n * // Returns: { leftIndent: 720, hangingIndent: 360 }\n * ```\n */\n getStandardIndentation(level: number): { leftIndent: number; hangingIndent: number } {\n if (level < 0 || level > 8) {\n throw new Error(`Invalid level ${level}. Level must be between 0 and 8.`);\n }\n\n return {\n leftIndent: 720 + level * 360,\n hangingIndent: 360,\n };\n }\n\n /**\n * Sets custom indentation for a specific level in a numbering definition\n *\n * This updates the indentation for a specific level across ALL paragraphs\n * that use this numId and level combination.\n *\n * @param numId The numbering instance ID\n * @param level The level to modify (0-8)\n * @param leftIndent Left indentation in twips\n * @param hangingIndent Hanging indentation in twips (optional, defaults to 360)\n * @returns true if successful, false if numId doesn't exist\n * @example\n * ```typescript\n * // Set level 0 to 0.5 inch left, 0.25 inch hanging\n * manager.setListIndentation(1, 0, 720, 360);\n * ```\n */\n setListIndentation(\n numId: number,\n level: number,\n leftIndent: number,\n hangingIndent = 360\n ): boolean {\n // Validate level\n if (level < 0 || level > 8) {\n throw new Error(`Invalid level ${level}. Level must be between 0 and 8.`);\n }\n\n // Validate indents (clamp negatives to 0)\n leftIndent = Math.max(0, leftIndent);\n hangingIndent = Math.max(0, hangingIndent);\n\n // Get the numbering instance\n const instance = this.getInstance(numId);\n if (!instance) {\n defaultLogger.warn(`Numbering instance ${numId} does not exist`);\n return false;\n }\n\n // Get the abstract numbering\n const abstractNum = this.getAbstractNumbering(instance.getAbstractNumId());\n if (!abstractNum) {\n defaultLogger.warn(`Abstract numbering for instance ${numId} does not exist`);\n return false;\n }\n\n // Get the level from the abstract numbering\n const numLevel = abstractNum.getLevel(level);\n if (!numLevel) {\n defaultLogger.warn(`Level ${level} does not exist in abstract numbering`);\n return false;\n }\n\n // Update the level's indentation\n numLevel.setLeftIndent(leftIndent);\n numLevel.setHangingIndent(hangingIndent);\n\n return true;\n }\n\n /**\n * Resets all levels in a numbering definition to standard indentation\n *\n * This applies the framework's standard indentation formula to all levels:\n * - leftIndent: 720 + (level * 360) twips\n * - hangingIndent: 360 twips\n *\n * @param numId The numbering instance ID\n * @returns true if successful, false if numId doesn't exist\n * @example\n * ```typescript\n * // Reset list 1 to standard indentation\n * manager.normalizeListIndentation(1);\n * ```\n */\n normalizeListIndentation(numId: number): boolean {\n // Get the numbering instance\n const instance = this.getInstance(numId);\n if (!instance) {\n defaultLogger.warn(`Numbering instance ${numId} does not exist`);\n return false;\n }\n\n // Get the abstract numbering\n const abstractNum = this.getAbstractNumbering(instance.getAbstractNumId());\n if (!abstractNum) {\n defaultLogger.warn(`Abstract numbering for instance ${numId} does not exist`);\n return false;\n }\n\n // Get all levels\n const levels = abstractNum.getAllLevels();\n\n // Apply standard indentation to each level\n for (const level of levels) {\n const standardIndent = this.getStandardIndentation(level.getLevel());\n level.setLeftIndent(standardIndent.leftIndent);\n level.setHangingIndent(standardIndent.hangingIndent);\n }\n\n return true;\n }\n\n /**\n * Normalizes indentation for all lists in the document\n *\n * Applies standard indentation to every numbering instance:\n * - leftIndent: 720 + (level * 360) twips\n * - hangingIndent: 360 twips\n *\n * This ensures consistent spacing across all lists in the document.\n *\n * @returns Number of numbering instances updated\n * @example\n * ```typescript\n * const count = manager.normalizeAllListIndentation();\n * console.log(`Normalized ${count} lists`);\n * ```\n */\n normalizeAllListIndentation(): number {\n let count = 0;\n\n // Iterate over all instances\n for (const instance of this.getAllInstances()) {\n const success = this.normalizeListIndentation(instance.getNumId());\n if (success) {\n count++;\n }\n }\n\n return count;\n }\n\n /**\n * Gets the total number of abstract numberings\n */\n getAbstractNumberingCount(): number {\n return this.abstractNumberings.size;\n }\n\n /**\n * Gets the total number of numbering instances\n */\n getInstanceCount(): number {\n return this.instances.size;\n }\n\n /**\n * Clears all numbering definitions and instances\n */\n clear(): this {\n this.abstractNumberings.clear();\n this.instances.clear();\n this.nextAbstractNumId = 0;\n this.nextNumId = 1;\n return this;\n }\n\n /**\n * Removes unused numbering instances and abstract numberings\n *\n * This method cleans up numbering definitions that are no longer referenced\n * by any paragraphs in the document. It removes:\n * 1. Instances not in the usedNumIds set\n * 2. Abstract numberings not referenced by any remaining instance\n *\n * @param usedNumIds Set of numIds currently used by paragraphs\n * @returns Object with counts of removed instances and abstract numberings\n */\n cleanupUnusedNumbering(usedNumIds: Set<number>): {\n instancesRemoved: number;\n abstractsRemoved: number;\n } {\n let instancesRemoved = 0;\n let abstractsRemoved = 0;\n\n // Step 1: Remove unused instances\n const instancesToRemove: number[] = [];\n this.instances.forEach((_instance, numId) => {\n if (!usedNumIds.has(numId)) {\n instancesToRemove.push(numId);\n }\n });\n\n for (const numId of instancesToRemove) {\n this.instances.delete(numId);\n this._modified = true;\n this._removedNumIds.add(numId);\n instancesRemoved++;\n }\n\n // Step 2: Find abstract numberings still referenced by remaining instances\n const referencedAbstractNumIds = new Set<number>();\n this.instances.forEach((instance) => {\n referencedAbstractNumIds.add(instance.getAbstractNumId());\n });\n\n // Step 3: Remove unreferenced abstract numberings\n const abstractsToRemove: number[] = [];\n this.abstractNumberings.forEach((_abstractNum, abstractNumId) => {\n if (!referencedAbstractNumIds.has(abstractNumId)) {\n abstractsToRemove.push(abstractNumId);\n }\n });\n\n for (const abstractNumId of abstractsToRemove) {\n this.abstractNumberings.delete(abstractNumId);\n this._modified = true;\n this._removedAbstractNumIds.add(abstractNumId);\n abstractsRemoved++;\n }\n\n return { instancesRemoved, abstractsRemoved };\n }\n\n /**\n * Consolidates duplicate abstract numbering definitions\n *\n * Groups abstractNums by a deterministic fingerprint of their level properties\n * (format, text, font, fontSize, color, indentation, alignment, etc.).\n * For each group with >1 member, picks the lowest abstractNumId as canonical,\n * remaps all instances pointing to non-canonical IDs, and removes duplicates.\n *\n * This is safe because multiple num instances can reference the same abstractNum —\n * each instance maintains its own independent counter via level overrides.\n *\n * @param options Optional configuration (e.g., protected IDs to skip)\n * @returns Summary of what was consolidated\n */\n consolidateNumbering(options?: NumberingConsolidationOptions): NumberingConsolidationResult {\n const protectedIds = options?.protectedAbstractNumIds ?? new Set<number>();\n\n // 1. Compute fingerprint for each non-protected abstractNum\n const fingerprintGroups = new Map<string, number[]>();\n for (const abstractNum of this.abstractNumberings.values()) {\n const id = abstractNum.getAbstractNumId();\n if (protectedIds.has(id)) continue;\n\n const fingerprint = this._fingerprintAbstractNum(abstractNum);\n const group = fingerprintGroups.get(fingerprint);\n if (group) {\n group.push(id);\n } else {\n fingerprintGroups.set(fingerprint, [id]);\n }\n }\n\n // 2. For each group with >1 member, consolidate\n let abstractNumsRemoved = 0;\n let instancesRemapped = 0;\n let groupsConsolidated = 0;\n\n for (const [, ids] of fingerprintGroups) {\n if (ids.length <= 1) continue;\n\n // Sort to pick lowest ID as canonical\n ids.sort((a, b) => a - b);\n const canonicalId = ids[0]!;\n const duplicateIds = new Set(ids.slice(1));\n\n groupsConsolidated++;\n\n // Remap instances pointing to duplicate abstractNums\n for (const instance of this.instances.values()) {\n if (duplicateIds.has(instance.getAbstractNumId())) {\n instance.setAbstractNumId(canonicalId);\n this._modifiedNumIds.add(instance.getNumId());\n instancesRemapped++;\n }\n }\n\n // Remove duplicate abstractNums\n for (const dupId of duplicateIds) {\n this.abstractNumberings.delete(dupId);\n this._removedAbstractNumIds.add(dupId);\n abstractNumsRemoved++;\n }\n }\n\n if (abstractNumsRemoved > 0) {\n this._modified = true;\n }\n\n return { abstractNumsRemoved, instancesRemapped, groupsConsolidated };\n }\n\n /**\n * Computes a deterministic fingerprint for an abstract numbering definition\n * based on its multiLevelType and all level properties. Name and abstractNumId\n * are excluded since they don't affect rendering.\n */\n private _fingerprintAbstractNum(abstractNum: AbstractNumbering): string {\n const parts: string[] = [\n abstractNum.getNumStyleLink() ?? '',\n abstractNum.getStyleLink() ?? '',\n abstractNum.getMultiLevelType(),\n ];\n\n for (const level of abstractNum.getAllLevels()) {\n const props = level.getProperties();\n parts.push(\n `${props.level}|${props.format}|${props.text}|${props.font}|${props.fontSize}|` +\n `${props.color}|${props.leftIndent}|${props.hangingIndent}|${props.alignment}|` +\n `${props.start}|${props.bold}|${props.italic}|${props.underline ?? ''}|` +\n `${props.suffix}|${props.isLegalNumberingStyle}|${props.lvlRestart ?? ''}`\n );\n }\n\n return parts.join('::');\n }\n\n /**\n * Generates the complete numbering.xml content\n */\n generateNumberingXml(): string {\n const builder = new XMLBuilder();\n\n const children: XMLElement[] = [];\n\n // Add all abstract numberings\n const abstractNumberings = this.getAllAbstractNumberings();\n abstractNumberings.forEach((abstractNum) => {\n children.push(abstractNum.toXML());\n });\n\n // Add all numbering instances\n const instances = this.getAllInstances();\n instances.forEach((instance) => {\n children.push(instance.toXML());\n });\n\n const numbering = XMLBuilder.w(\n 'numbering',\n {\n 'xmlns:w': 'http://schemas.openxmlformats.org/wordprocessingml/2006/main',\n 'xmlns:r': 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',\n },\n children\n );\n\n builder.element(numbering.name, numbering.attributes, numbering.children);\n\n // Generate XML with declaration\n return builder.build(true);\n }\n\n /**\n * Generates the numbering.xml as XMLElement (for API compatibility)\n */\n toXML(): XMLElement {\n const children: XMLElement[] = [];\n\n // Add all abstract numberings\n const abstractNumberings = this.getAllAbstractNumberings();\n abstractNumberings.forEach((abstractNum) => {\n children.push(abstractNum.toXML());\n });\n\n // Add all numbering instances\n const instances = this.getAllInstances();\n instances.forEach((instance) => {\n children.push(instance.toXML());\n });\n\n return XMLBuilder.w(\n 'numbering',\n {\n 'xmlns:w': 'http://schemas.openxmlformats.org/wordprocessingml/2006/main',\n 'xmlns:r': 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',\n },\n children\n );\n }\n\n /**\n * Creates a numbering manager with default numbering definitions\n */\n static create(): NumberingManager {\n return new NumberingManager(false);\n }\n\n /**\n * Creates an empty numbering manager\n */\n static createEmpty(): NumberingManager {\n return new NumberingManager(false);\n }\n}\n"]}