docxmlater 10.1.3 → 10.1.5
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.
- package/README.md +759 -754
- package/dist/constants/legacyCompatFlags.js +1 -1
- package/dist/constants/legacyCompatFlags.js.map +1 -1
- package/dist/constants/limits.js.map +1 -1
- package/dist/core/Document.d.ts +50 -50
- package/dist/core/Document.d.ts.map +1 -1
- package/dist/core/Document.js +483 -471
- package/dist/core/Document.js.map +1 -1
- package/dist/core/DocumentContent.d.ts +9 -9
- package/dist/core/DocumentContent.d.ts.map +1 -1
- package/dist/core/DocumentContent.js +1 -1
- package/dist/core/DocumentContent.js.map +1 -1
- package/dist/core/DocumentGenerator.d.ts +11 -11
- package/dist/core/DocumentGenerator.d.ts.map +1 -1
- package/dist/core/DocumentGenerator.js +251 -251
- package/dist/core/DocumentGenerator.js.map +1 -1
- package/dist/core/DocumentIdManager.js.map +1 -1
- package/dist/core/DocumentParser.d.ts +15 -15
- package/dist/core/DocumentParser.d.ts.map +1 -1
- package/dist/core/DocumentParser.js +2123 -2155
- package/dist/core/DocumentParser.js.map +1 -1
- package/dist/core/DocumentValidator.d.ts.map +1 -1
- package/dist/core/DocumentValidator.js +2 -5
- package/dist/core/DocumentValidator.js.map +1 -1
- package/dist/core/Relationship.js.map +1 -1
- package/dist/core/RelationshipManager.d.ts.map +1 -1
- package/dist/core/RelationshipManager.js +3 -3
- package/dist/core/RelationshipManager.js.map +1 -1
- package/dist/elements/AlternateContent.js.map +1 -1
- package/dist/elements/Bookmark.d.ts.map +1 -1
- package/dist/elements/Bookmark.js +3 -1
- package/dist/elements/Bookmark.js.map +1 -1
- package/dist/elements/BookmarkManager.d.ts.map +1 -1
- package/dist/elements/BookmarkManager.js.map +1 -1
- package/dist/elements/Comment.d.ts.map +1 -1
- package/dist/elements/Comment.js +9 -6
- package/dist/elements/Comment.js.map +1 -1
- package/dist/elements/CommentManager.d.ts.map +1 -1
- package/dist/elements/CommentManager.js +18 -17
- package/dist/elements/CommentManager.js.map +1 -1
- package/dist/elements/CommonTypes.d.ts +21 -21
- package/dist/elements/CommonTypes.d.ts.map +1 -1
- package/dist/elements/CommonTypes.js +56 -56
- package/dist/elements/CommonTypes.js.map +1 -1
- package/dist/elements/CustomXml.js.map +1 -1
- package/dist/elements/Endnote.d.ts.map +1 -1
- package/dist/elements/Endnote.js +6 -6
- package/dist/elements/Endnote.js.map +1 -1
- package/dist/elements/EndnoteManager.d.ts.map +1 -1
- package/dist/elements/EndnoteManager.js +6 -7
- package/dist/elements/EndnoteManager.js.map +1 -1
- package/dist/elements/Field.d.ts.map +1 -1
- package/dist/elements/Field.js +82 -25
- package/dist/elements/Field.js.map +1 -1
- package/dist/elements/FieldHelpers.d.ts.map +1 -1
- package/dist/elements/FieldHelpers.js.map +1 -1
- package/dist/elements/FontManager.d.ts.map +1 -1
- package/dist/elements/FontManager.js +1 -1
- package/dist/elements/FontManager.js.map +1 -1
- package/dist/elements/Footer.js +2 -2
- package/dist/elements/Footer.js.map +1 -1
- package/dist/elements/Footnote.d.ts.map +1 -1
- package/dist/elements/Footnote.js +6 -6
- package/dist/elements/Footnote.js.map +1 -1
- package/dist/elements/FootnoteManager.d.ts.map +1 -1
- package/dist/elements/FootnoteManager.js +6 -7
- package/dist/elements/FootnoteManager.js.map +1 -1
- package/dist/elements/Header.js +2 -2
- package/dist/elements/Header.js.map +1 -1
- package/dist/elements/HeaderFooterManager.js.map +1 -1
- package/dist/elements/Hyperlink.d.ts +5 -3
- package/dist/elements/Hyperlink.d.ts.map +1 -1
- package/dist/elements/Hyperlink.js +134 -76
- package/dist/elements/Hyperlink.js.map +1 -1
- package/dist/elements/Image.d.ts.map +1 -1
- package/dist/elements/Image.js +238 -106
- package/dist/elements/Image.js.map +1 -1
- package/dist/elements/ImageManager.d.ts.map +1 -1
- package/dist/elements/ImageManager.js +1 -1
- package/dist/elements/ImageManager.js.map +1 -1
- package/dist/elements/ImageRun.js +1 -1
- package/dist/elements/ImageRun.js.map +1 -1
- package/dist/elements/MathElement.js.map +1 -1
- package/dist/elements/Paragraph.d.ts +24 -24
- package/dist/elements/Paragraph.d.ts.map +1 -1
- package/dist/elements/Paragraph.js +181 -188
- package/dist/elements/Paragraph.js.map +1 -1
- package/dist/elements/PreservedElement.js.map +1 -1
- package/dist/elements/PropertyChangeTypes.d.ts.map +1 -1
- package/dist/elements/PropertyChangeTypes.js +6 -6
- package/dist/elements/PropertyChangeTypes.js.map +1 -1
- package/dist/elements/RangeMarker.d.ts.map +1 -1
- package/dist/elements/RangeMarker.js.map +1 -1
- package/dist/elements/Revision.d.ts.map +1 -1
- package/dist/elements/Revision.js +4 -5
- package/dist/elements/Revision.js.map +1 -1
- package/dist/elements/RevisionContent.js.map +1 -1
- package/dist/elements/RevisionManager.d.ts.map +1 -1
- package/dist/elements/RevisionManager.js +40 -48
- package/dist/elements/RevisionManager.js.map +1 -1
- package/dist/elements/Run.d.ts +16 -16
- package/dist/elements/Run.d.ts.map +1 -1
- package/dist/elements/Run.js +256 -238
- package/dist/elements/Run.js.map +1 -1
- package/dist/elements/Section.d.ts.map +1 -1
- package/dist/elements/Section.js +36 -11
- package/dist/elements/Section.js.map +1 -1
- package/dist/elements/Shape.d.ts.map +1 -1
- package/dist/elements/Shape.js.map +1 -1
- package/dist/elements/StructuredDocumentTag.d.ts +6 -6
- package/dist/elements/StructuredDocumentTag.d.ts.map +1 -1
- package/dist/elements/StructuredDocumentTag.js +99 -104
- package/dist/elements/StructuredDocumentTag.js.map +1 -1
- package/dist/elements/Table.d.ts +11 -11
- package/dist/elements/Table.d.ts.map +1 -1
- package/dist/elements/Table.js +102 -107
- package/dist/elements/Table.js.map +1 -1
- package/dist/elements/TableCell.d.ts +10 -10
- package/dist/elements/TableCell.d.ts.map +1 -1
- package/dist/elements/TableCell.js +105 -106
- package/dist/elements/TableCell.js.map +1 -1
- package/dist/elements/TableGridChange.d.ts.map +1 -1
- package/dist/elements/TableGridChange.js.map +1 -1
- package/dist/elements/TableOfContents.d.ts.map +1 -1
- package/dist/elements/TableOfContents.js +4 -4
- package/dist/elements/TableOfContents.js.map +1 -1
- package/dist/elements/TableOfContentsElement.js.map +1 -1
- package/dist/elements/TableRow.d.ts.map +1 -1
- package/dist/elements/TableRow.js +13 -6
- package/dist/elements/TableRow.js.map +1 -1
- package/dist/elements/TextBox.d.ts.map +1 -1
- package/dist/elements/TextBox.js +3 -5
- package/dist/elements/TextBox.js.map +1 -1
- package/dist/formatting/AbstractNumbering.d.ts +4 -4
- package/dist/formatting/AbstractNumbering.d.ts.map +1 -1
- package/dist/formatting/AbstractNumbering.js +54 -49
- package/dist/formatting/AbstractNumbering.js.map +1 -1
- package/dist/formatting/NumberingInstance.d.ts.map +1 -1
- package/dist/formatting/NumberingInstance.js +1 -3
- package/dist/formatting/NumberingInstance.js.map +1 -1
- package/dist/formatting/NumberingLevel.d.ts +5 -5
- package/dist/formatting/NumberingLevel.d.ts.map +1 -1
- package/dist/formatting/NumberingLevel.js +119 -125
- package/dist/formatting/NumberingLevel.js.map +1 -1
- package/dist/formatting/NumberingManager.d.ts.map +1 -1
- package/dist/formatting/NumberingManager.js +9 -9
- package/dist/formatting/NumberingManager.js.map +1 -1
- package/dist/formatting/Style.d.ts +11 -11
- package/dist/formatting/Style.d.ts.map +1 -1
- package/dist/formatting/Style.js +219 -247
- package/dist/formatting/Style.js.map +1 -1
- package/dist/formatting/StylesManager.d.ts +2 -2
- package/dist/formatting/StylesManager.d.ts.map +1 -1
- package/dist/formatting/StylesManager.js +96 -102
- package/dist/formatting/StylesManager.js.map +1 -1
- package/dist/helpers/CleanupHelper.d.ts +1 -1
- package/dist/helpers/CleanupHelper.d.ts.map +1 -1
- package/dist/helpers/CleanupHelper.js +6 -6
- package/dist/helpers/CleanupHelper.js.map +1 -1
- package/dist/images/ImageOptimizer.js +7 -7
- package/dist/images/ImageOptimizer.js.map +1 -1
- package/dist/index.d.ts +9 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/managers/DrawingManager.js.map +1 -1
- package/dist/tracking/DocumentTrackingContext.d.ts.map +1 -1
- package/dist/tracking/DocumentTrackingContext.js +23 -7
- package/dist/tracking/DocumentTrackingContext.js.map +1 -1
- package/dist/tracking/TrackingContext.d.ts.map +1 -1
- package/dist/tracking/TrackingContext.js.map +1 -1
- package/dist/types/compatibility-types.js.map +1 -1
- package/dist/types/formatting.js.map +1 -1
- package/dist/types/list-types.d.ts +6 -6
- package/dist/types/list-types.js.map +1 -1
- package/dist/types/settings-types.js.map +1 -1
- package/dist/types/styleConfig.d.ts +2 -2
- package/dist/types/styleConfig.js.map +1 -1
- package/dist/utils/ChangelogGenerator.d.ts.map +1 -1
- package/dist/utils/ChangelogGenerator.js +97 -101
- package/dist/utils/ChangelogGenerator.js.map +1 -1
- package/dist/utils/CompatibilityUpgrader.d.ts.map +1 -1
- package/dist/utils/CompatibilityUpgrader.js +1 -1
- package/dist/utils/CompatibilityUpgrader.js.map +1 -1
- package/dist/utils/InMemoryRevisionAcceptor.d.ts.map +1 -1
- package/dist/utils/InMemoryRevisionAcceptor.js +1 -6
- package/dist/utils/InMemoryRevisionAcceptor.js.map +1 -1
- package/dist/utils/MoveOperationHelper.d.ts.map +1 -1
- package/dist/utils/MoveOperationHelper.js +1 -1
- package/dist/utils/MoveOperationHelper.js.map +1 -1
- package/dist/utils/RevisionAwareProcessor.d.ts.map +1 -1
- package/dist/utils/RevisionAwareProcessor.js +2 -4
- package/dist/utils/RevisionAwareProcessor.js.map +1 -1
- package/dist/utils/RevisionWalker.d.ts.map +1 -1
- package/dist/utils/RevisionWalker.js +4 -12
- package/dist/utils/RevisionWalker.js.map +1 -1
- package/dist/utils/SelectiveRevisionAcceptor.d.ts.map +1 -1
- package/dist/utils/SelectiveRevisionAcceptor.js +2 -6
- package/dist/utils/SelectiveRevisionAcceptor.js.map +1 -1
- package/dist/utils/ShadingResolver.d.ts.map +1 -1
- package/dist/utils/ShadingResolver.js +1 -1
- package/dist/utils/ShadingResolver.js.map +1 -1
- package/dist/utils/acceptRevisions.d.ts.map +1 -1
- package/dist/utils/acceptRevisions.js +23 -12
- package/dist/utils/acceptRevisions.js.map +1 -1
- package/dist/utils/cnfStyleDecoder.d.ts +1 -1
- package/dist/utils/cnfStyleDecoder.d.ts.map +1 -1
- package/dist/utils/cnfStyleDecoder.js +40 -40
- package/dist/utils/cnfStyleDecoder.js.map +1 -1
- package/dist/utils/corruptionDetection.d.ts.map +1 -1
- package/dist/utils/corruptionDetection.js.map +1 -1
- package/dist/utils/dateFormatting.js.map +1 -1
- package/dist/utils/deepClone.js +1 -1
- package/dist/utils/deepClone.js.map +1 -1
- package/dist/utils/diagnostics.d.ts.map +1 -1
- package/dist/utils/diagnostics.js +1 -1
- package/dist/utils/diagnostics.js.map +1 -1
- package/dist/utils/errorHandling.js.map +1 -1
- package/dist/utils/formatting.d.ts.map +1 -1
- package/dist/utils/formatting.js +10 -2
- package/dist/utils/formatting.js.map +1 -1
- package/dist/utils/list-detection.d.ts +2 -2
- package/dist/utils/list-detection.d.ts.map +1 -1
- package/dist/utils/list-detection.js +21 -23
- package/dist/utils/list-detection.js.map +1 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +12 -7
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/parsingHelpers.js.map +1 -1
- package/dist/utils/stripTrackedChanges.d.ts.map +1 -1
- package/dist/utils/stripTrackedChanges.js +3 -3
- package/dist/utils/stripTrackedChanges.js.map +1 -1
- package/dist/utils/textDiff.d.ts +1 -1
- package/dist/utils/textDiff.js +8 -8
- package/dist/utils/textDiff.js.map +1 -1
- package/dist/utils/units.js.map +1 -1
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/validation.js +24 -7
- package/dist/utils/validation.js.map +1 -1
- package/dist/utils/xmlSanitization.d.ts.map +1 -1
- package/dist/utils/xmlSanitization.js +3 -3
- package/dist/utils/xmlSanitization.js.map +1 -1
- package/dist/validation/RevisionAutoFixer.d.ts.map +1 -1
- package/dist/validation/RevisionAutoFixer.js +5 -5
- package/dist/validation/RevisionAutoFixer.js.map +1 -1
- package/dist/validation/RevisionValidator.d.ts.map +1 -1
- package/dist/validation/RevisionValidator.js +7 -9
- package/dist/validation/RevisionValidator.js.map +1 -1
- package/dist/validation/ValidationRules.js +3 -3
- package/dist/validation/ValidationRules.js.map +1 -1
- package/dist/validation/index.js.map +1 -1
- package/dist/xml/XMLBuilder.d.ts +1 -1
- package/dist/xml/XMLBuilder.d.ts.map +1 -1
- package/dist/xml/XMLBuilder.js +98 -100
- package/dist/xml/XMLBuilder.js.map +1 -1
- package/dist/xml/XMLParser.d.ts.map +1 -1
- package/dist/xml/XMLParser.js +61 -66
- package/dist/xml/XMLParser.js.map +1 -1
- package/dist/zip/ZipHandler.d.ts.map +1 -1
- package/dist/zip/ZipHandler.js.map +1 -1
- package/dist/zip/ZipReader.d.ts.map +1 -1
- package/dist/zip/ZipReader.js +1 -3
- package/dist/zip/ZipReader.js.map +1 -1
- package/dist/zip/ZipWriter.d.ts +1 -1
- package/dist/zip/ZipWriter.d.ts.map +1 -1
- package/dist/zip/ZipWriter.js +28 -36
- package/dist/zip/ZipWriter.js.map +1 -1
- package/dist/zip/types.js +1 -1
- package/dist/zip/types.js.map +1 -1
- package/package.json +92 -92
- package/src/__tests__/helper-methods.test.ts +512 -512
- package/src/constants/legacyCompatFlags.ts +138 -138
- package/src/constants/limits.ts +50 -50
- package/src/core/Document.ts +985 -1145
- package/src/core/DocumentContent.ts +461 -467
- package/src/core/DocumentGenerator.ts +1133 -1104
- package/src/core/DocumentIdManager.ts +158 -158
- package/src/core/DocumentParser.ts +2347 -2716
- package/src/core/DocumentValidator.ts +363 -372
- package/src/core/Relationship.ts +367 -367
- package/src/core/RelationshipManager.ts +429 -428
- package/src/elements/AlternateContent.ts +42 -42
- package/src/elements/Bookmark.ts +212 -210
- package/src/elements/BookmarkManager.ts +247 -250
- package/src/elements/Comment.ts +356 -359
- package/src/elements/CommentManager.ts +499 -502
- package/src/elements/CommonTypes.ts +524 -549
- package/src/elements/CustomXml.ts +36 -36
- package/src/elements/Endnote.ts +221 -217
- package/src/elements/EndnoteManager.ts +246 -249
- package/src/elements/Field.ts +1292 -1233
- package/src/elements/FieldHelpers.ts +329 -333
- package/src/elements/FontManager.ts +336 -339
- package/src/elements/Footer.ts +269 -269
- package/src/elements/Footnote.ts +221 -217
- package/src/elements/FootnoteManager.ts +246 -249
- package/src/elements/Header.ts +269 -269
- package/src/elements/HeaderFooterManager.ts +219 -219
- package/src/elements/Hyperlink.ts +1288 -1193
- package/src/elements/Image.ts +1982 -1756
- package/src/elements/ImageManager.ts +437 -432
- package/src/elements/ImageRun.ts +59 -59
- package/src/elements/MathElement.ts +65 -65
- package/src/elements/Paragraph.ts +4347 -4287
- package/src/elements/PreservedElement.ts +53 -53
- package/src/elements/PropertyChangeTypes.ts +458 -442
- package/src/elements/RangeMarker.ts +382 -400
- package/src/elements/Revision.ts +1198 -1217
- package/src/elements/RevisionContent.ts +73 -73
- package/src/elements/RevisionManager.ts +1070 -1070
- package/src/elements/Run.ts +3103 -3073
- package/src/elements/Section.ts +1521 -1421
- package/src/elements/Shape.ts +884 -873
- package/src/elements/StructuredDocumentTag.ts +1176 -1207
- package/src/elements/Table.ts +2468 -2524
- package/src/elements/TableCell.ts +1617 -1621
- package/src/elements/TableGridChange.ts +149 -151
- package/src/elements/TableOfContents.ts +701 -691
- package/src/elements/TableOfContentsElement.ts +89 -89
- package/src/elements/TableRow.ts +960 -929
- package/src/elements/TextBox.ts +766 -768
- package/src/formatting/AbstractNumbering.ts +580 -579
- package/src/formatting/NumberingInstance.ts +295 -299
- package/src/formatting/NumberingLevel.ts +981 -1040
- package/src/formatting/NumberingManager.ts +833 -827
- package/src/formatting/Style.ts +1785 -1879
- package/src/formatting/StylesManager.ts +1090 -1130
- package/src/helpers/CleanupHelper.ts +524 -524
- package/src/images/ImageOptimizer.ts +274 -274
- package/src/index.ts +559 -554
- package/src/managers/DrawingManager.ts +319 -319
- package/src/tracking/DocumentTrackingContext.ts +687 -674
- package/src/tracking/TrackingContext.ts +175 -173
- package/src/types/compatibility-types.ts +49 -49
- package/src/types/formatting.ts +210 -210
- package/src/types/list-types.ts +14 -14
- package/src/types/settings-types.ts +59 -59
- package/src/types/styleConfig.ts +189 -189
- package/src/utils/ChangelogGenerator.ts +1583 -1581
- package/src/utils/CompatibilityUpgrader.ts +235 -237
- package/src/utils/InMemoryRevisionAcceptor.ts +691 -696
- package/src/utils/MoveOperationHelper.ts +233 -238
- package/src/utils/RevisionAwareProcessor.ts +518 -526
- package/src/utils/RevisionWalker.ts +427 -457
- package/src/utils/SelectiveRevisionAcceptor.ts +662 -683
- package/src/utils/ShadingResolver.ts +105 -107
- package/src/utils/acceptRevisions.ts +723 -714
- package/src/utils/cnfStyleDecoder.ts +212 -217
- package/src/utils/corruptionDetection.ts +346 -345
- package/src/utils/dateFormatting.ts +20 -20
- package/src/utils/deepClone.ts +77 -78
- package/src/utils/diagnostics.ts +125 -129
- package/src/utils/errorHandling.ts +80 -80
- package/src/utils/formatting.ts +220 -213
- package/src/utils/list-detection.ts +32 -42
- package/src/utils/logger.ts +412 -404
- package/src/utils/parsingHelpers.ts +190 -190
- package/src/utils/stripTrackedChanges.ts +356 -353
- package/src/utils/textDiff.ts +100 -100
- package/src/utils/units.ts +421 -421
- package/src/utils/validation.ts +553 -542
- package/src/utils/xmlSanitization.ts +179 -182
- package/src/validation/RevisionAutoFixer.ts +541 -542
- package/src/validation/RevisionValidator.ts +470 -460
- package/src/validation/ValidationRules.ts +338 -338
- package/src/validation/index.ts +30 -30
- package/src/xml/XMLBuilder.ts +857 -871
- package/src/xml/XMLParser.ts +877 -919
- package/src/zip/ZipHandler.ts +629 -637
- package/src/zip/ZipReader.ts +295 -299
- package/src/zip/ZipWriter.ts +374 -390
- 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":"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","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"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NumberingManager.d.ts","sourceRoot":"","sources":["../../src/formatting/NumberingManager.ts"],"names":[],"mappings":"AAOA,OAAO,EAAc,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAMlD,MAAM,WAAW,6BAA6B;IAE5C,uBAAuB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACvC;AAKD,MAAM,WAAW,4BAA4B;IAC3C,mBAAmB,EAAE,MAAM,CAAC;IAC5B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAKD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,kBAAkB,CAAiC;IAC3D,OAAO,CAAC,SAAS,CAAiC;IAClD,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,SAAS,CAAS;IAG1B,OAAO,CAAC,SAAS,CAAS;IAG1B,OAAO,CAAC,uBAAuB,CAAqB;IACpD,OAAO,CAAC,eAAe,CAAqB;IAG5C,OAAO,CAAC,sBAAsB,CAAqB;IACnD,OAAO,CAAC,cAAc,CAAqB;gBAM/B,kBAAkB,UAAQ;IActC,OAAO,CAAC,2BAA2B;IAcnC,oBAAoB,CAAC,iBAAiB,EAAE,iBAAiB,GAAG,IAAI;IAkBhE,oBAAoB,CAAC,aAAa,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS;IAO1E,wBAAwB,IAAI,iBAAiB,EAAE;IAU/C,oBAAoB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO;IAQpD,uBAAuB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO;IA0BvD,WAAW,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI;IAyB9C,oBAAoB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI;IAQvD,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS;IAQzD,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS;IAOlE,eAAe,IAAI,iBAAiB,EAAE;
|
|
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
|
});
|
|
@@ -202,7 +202,7 @@ class NumberingManager {
|
|
|
202
202
|
throw new Error(`Invalid level ${level}. Level must be between 0 and 8.`);
|
|
203
203
|
}
|
|
204
204
|
return {
|
|
205
|
-
leftIndent: 720 +
|
|
205
|
+
leftIndent: 720 + level * 360,
|
|
206
206
|
hangingIndent: 360,
|
|
207
207
|
};
|
|
208
208
|
}
|
|
@@ -289,7 +289,7 @@ class NumberingManager {
|
|
|
289
289
|
instancesRemoved++;
|
|
290
290
|
}
|
|
291
291
|
const referencedAbstractNumIds = new Set();
|
|
292
|
-
this.instances.forEach(instance => {
|
|
292
|
+
this.instances.forEach((instance) => {
|
|
293
293
|
referencedAbstractNumIds.add(instance.getAbstractNumId());
|
|
294
294
|
});
|
|
295
295
|
const abstractsToRemove = [];
|
|
@@ -369,16 +369,16 @@ class NumberingManager {
|
|
|
369
369
|
const builder = new XMLBuilder_1.XMLBuilder();
|
|
370
370
|
const children = [];
|
|
371
371
|
const abstractNumberings = this.getAllAbstractNumberings();
|
|
372
|
-
abstractNumberings.forEach(abstractNum => {
|
|
372
|
+
abstractNumberings.forEach((abstractNum) => {
|
|
373
373
|
children.push(abstractNum.toXML());
|
|
374
374
|
});
|
|
375
375
|
const instances = this.getAllInstances();
|
|
376
|
-
instances.forEach(instance => {
|
|
376
|
+
instances.forEach((instance) => {
|
|
377
377
|
children.push(instance.toXML());
|
|
378
378
|
});
|
|
379
379
|
const numbering = XMLBuilder_1.XMLBuilder.w('numbering', {
|
|
380
380
|
'xmlns:w': 'http://schemas.openxmlformats.org/wordprocessingml/2006/main',
|
|
381
|
-
'xmlns:r': 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'
|
|
381
|
+
'xmlns:r': 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',
|
|
382
382
|
}, children);
|
|
383
383
|
builder.element(numbering.name, numbering.attributes, numbering.children);
|
|
384
384
|
return builder.build(true);
|
|
@@ -386,16 +386,16 @@ class NumberingManager {
|
|
|
386
386
|
toXML() {
|
|
387
387
|
const children = [];
|
|
388
388
|
const abstractNumberings = this.getAllAbstractNumberings();
|
|
389
|
-
abstractNumberings.forEach(abstractNum => {
|
|
389
|
+
abstractNumberings.forEach((abstractNum) => {
|
|
390
390
|
children.push(abstractNum.toXML());
|
|
391
391
|
});
|
|
392
392
|
const instances = this.getAllInstances();
|
|
393
|
-
instances.forEach(instance => {
|
|
393
|
+
instances.forEach((instance) => {
|
|
394
394
|
children.push(instance.toXML());
|
|
395
395
|
});
|
|
396
396
|
return XMLBuilder_1.XMLBuilder.w('numbering', {
|
|
397
397
|
'xmlns:w': 'http://schemas.openxmlformats.org/wordprocessingml/2006/main',
|
|
398
|
-
'xmlns:r': 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'
|
|
398
|
+
'xmlns:r': 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',
|
|
399
399
|
}, children);
|
|
400
400
|
}
|
|
401
401
|
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 * 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"]}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { XMLElement } from
|
|
2
|
-
import { ParagraphFormatting } from
|
|
3
|
-
import { RunFormatting } from
|
|
4
|
-
import { ShadingConfig } from
|
|
5
|
-
import { Heading2TableOptions } from
|
|
6
|
-
export type StyleType =
|
|
7
|
-
export type TableAlignment =
|
|
1
|
+
import { XMLElement } from '../xml/XMLBuilder';
|
|
2
|
+
import { ParagraphFormatting } from '../elements/Paragraph';
|
|
3
|
+
import { RunFormatting } from '../elements/Run';
|
|
4
|
+
import { ShadingConfig } from '../elements/CommonTypes';
|
|
5
|
+
import { Heading2TableOptions } from '../types/styleConfig';
|
|
6
|
+
export type StyleType = 'paragraph' | 'character' | 'table' | 'numbering';
|
|
7
|
+
export type TableAlignment = 'left' | 'center' | 'right';
|
|
8
8
|
export interface BorderProperties {
|
|
9
|
-
style?:
|
|
9
|
+
style?: 'none' | 'single' | 'double' | 'dashed' | 'dotted' | 'thick';
|
|
10
10
|
size?: number;
|
|
11
11
|
space?: number;
|
|
12
12
|
color?: string;
|
|
@@ -42,15 +42,15 @@ export interface TableCellStyleFormatting {
|
|
|
42
42
|
borders?: CellBorders;
|
|
43
43
|
shading?: ShadingProperties;
|
|
44
44
|
margins?: CellMargins;
|
|
45
|
-
verticalAlignment?:
|
|
45
|
+
verticalAlignment?: 'top' | 'center' | 'bottom';
|
|
46
46
|
}
|
|
47
47
|
export interface TableRowStyleFormatting {
|
|
48
48
|
cantSplit?: boolean;
|
|
49
49
|
isHeader?: boolean;
|
|
50
50
|
height?: number;
|
|
51
|
-
heightRule?:
|
|
51
|
+
heightRule?: 'auto' | 'exact' | 'atLeast';
|
|
52
52
|
}
|
|
53
|
-
export type ConditionalFormattingType =
|
|
53
|
+
export type ConditionalFormattingType = 'wholeTable' | 'firstRow' | 'lastRow' | 'firstCol' | 'lastCol' | 'band1Vert' | 'band2Vert' | 'band1Horz' | 'band2Horz' | 'nwCell' | 'neCell' | 'swCell' | 'seCell';
|
|
54
54
|
export interface ConditionalTableFormatting {
|
|
55
55
|
type: ConditionalFormattingType;
|
|
56
56
|
paragraphFormatting?: ParagraphFormatting;
|