docxmlater 10.0.2 → 10.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/constants/legacyCompatFlags.d.ts.map +1 -1
- package/dist/constants/legacyCompatFlags.js.map +1 -1
- package/dist/constants/limits.d.ts +0 -27
- package/dist/constants/limits.d.ts.map +1 -1
- package/dist/constants/limits.js +13 -13
- package/dist/constants/limits.js.map +1 -1
- package/dist/core/Document.d.ts +23 -19
- package/dist/core/Document.d.ts.map +1 -1
- package/dist/core/Document.js +197 -63
- package/dist/core/Document.js.map +1 -1
- package/dist/core/DocumentContent.d.ts.map +1 -1
- package/dist/core/DocumentContent.js.map +1 -1
- package/dist/core/DocumentGenerator.d.ts.map +1 -1
- package/dist/core/DocumentGenerator.js +59 -24
- package/dist/core/DocumentGenerator.js.map +1 -1
- package/dist/core/DocumentIdManager.d.ts.map +1 -1
- package/dist/core/DocumentIdManager.js.map +1 -1
- package/dist/core/DocumentParser.d.ts +6 -6
- package/dist/core/DocumentParser.d.ts.map +1 -1
- package/dist/core/DocumentParser.js +60 -54
- package/dist/core/DocumentParser.js.map +1 -1
- package/dist/core/DocumentValidator.d.ts.map +1 -1
- package/dist/core/DocumentValidator.js.map +1 -1
- package/dist/core/Relationship.d.ts.map +1 -1
- package/dist/core/Relationship.js +1 -1
- package/dist/core/Relationship.js.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.map +1 -1
- package/dist/elements/BookmarkManager.d.ts.map +1 -1
- package/dist/elements/BookmarkManager.js.map +1 -1
- package/dist/elements/Comment.js +1 -1
- package/dist/elements/Comment.js.map +1 -1
- package/dist/elements/CommentManager.d.ts.map +1 -1
- package/dist/elements/CommentManager.js +8 -2
- package/dist/elements/CommentManager.js.map +1 -1
- package/dist/elements/CommonTypes.d.ts.map +1 -1
- package/dist/elements/CommonTypes.js +1 -2
- 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.map +1 -1
- package/dist/elements/EndnoteManager.d.ts.map +1 -1
- package/dist/elements/EndnoteManager.js.map +1 -1
- package/dist/elements/Field.d.ts.map +1 -1
- package/dist/elements/Field.js +31 -28
- package/dist/elements/Field.js.map +1 -1
- package/dist/elements/FieldHelpers.d.ts.map +1 -1
- package/dist/elements/FieldHelpers.js +6 -6
- package/dist/elements/FieldHelpers.js.map +1 -1
- package/dist/elements/FontManager.d.ts.map +1 -1
- package/dist/elements/FontManager.js.map +1 -1
- package/dist/elements/Footer.js.map +1 -1
- package/dist/elements/Footnote.d.ts.map +1 -1
- package/dist/elements/Footnote.js.map +1 -1
- package/dist/elements/FootnoteManager.d.ts.map +1 -1
- package/dist/elements/FootnoteManager.js.map +1 -1
- package/dist/elements/Header.js.map +1 -1
- package/dist/elements/HeaderFooterManager.js.map +1 -1
- package/dist/elements/Hyperlink.d.ts.map +1 -1
- package/dist/elements/Hyperlink.js +5 -5
- package/dist/elements/Hyperlink.js.map +1 -1
- package/dist/elements/Image.d.ts +2 -2
- package/dist/elements/Image.d.ts.map +1 -1
- package/dist/elements/Image.js +21 -5
- package/dist/elements/Image.js.map +1 -1
- package/dist/elements/ImageManager.d.ts.map +1 -1
- package/dist/elements/ImageManager.js +2 -2
- package/dist/elements/ImageManager.js.map +1 -1
- package/dist/elements/ImageRun.js.map +1 -1
- package/dist/elements/MathElement.js.map +1 -1
- package/dist/elements/Paragraph.d.ts.map +1 -1
- package/dist/elements/Paragraph.js +128 -117
- package/dist/elements/Paragraph.js.map +1 -1
- package/dist/elements/PreservedElement.js.map +1 -1
- package/dist/elements/PropertyChangeTypes.js.map +1 -1
- package/dist/elements/RangeMarker.js.map +1 -1
- package/dist/elements/Revision.d.ts +1 -0
- package/dist/elements/Revision.d.ts.map +1 -1
- package/dist/elements/Revision.js +44 -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.map +1 -1
- package/dist/elements/Run.d.ts.map +1 -1
- package/dist/elements/Run.js +1 -3
- package/dist/elements/Run.js.map +1 -1
- package/dist/elements/Section.d.ts.map +1 -1
- package/dist/elements/Section.js +127 -118
- package/dist/elements/Section.js.map +1 -1
- package/dist/elements/Shape.d.ts.map +1 -1
- package/dist/elements/Shape.js +21 -0
- package/dist/elements/Shape.js.map +1 -1
- package/dist/elements/StructuredDocumentTag.d.ts.map +1 -1
- package/dist/elements/StructuredDocumentTag.js +20 -8
- package/dist/elements/StructuredDocumentTag.js.map +1 -1
- package/dist/elements/Table.d.ts +2 -2
- package/dist/elements/Table.d.ts.map +1 -1
- package/dist/elements/Table.js +29 -35
- package/dist/elements/Table.js.map +1 -1
- package/dist/elements/TableCell.d.ts +2 -2
- package/dist/elements/TableCell.d.ts.map +1 -1
- package/dist/elements/TableCell.js +63 -67
- package/dist/elements/TableCell.js.map +1 -1
- package/dist/elements/TableGridChange.js.map +1 -1
- package/dist/elements/TableOfContents.d.ts +6 -6
- package/dist/elements/TableOfContents.d.ts.map +1 -1
- 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 +65 -47
- package/dist/elements/TableRow.js.map +1 -1
- package/dist/elements/TextBox.d.ts.map +1 -1
- package/dist/elements/TextBox.js +1 -1
- package/dist/elements/TextBox.js.map +1 -1
- package/dist/formatting/AbstractNumbering.d.ts +1 -1
- package/dist/formatting/AbstractNumbering.d.ts.map +1 -1
- package/dist/formatting/AbstractNumbering.js +11 -11
- package/dist/formatting/AbstractNumbering.js.map +1 -1
- package/dist/formatting/NumberingInstance.d.ts.map +1 -1
- package/dist/formatting/NumberingInstance.js +4 -4
- package/dist/formatting/NumberingInstance.js.map +1 -1
- package/dist/formatting/NumberingLevel.d.ts.map +1 -1
- package/dist/formatting/NumberingLevel.js +26 -26
- package/dist/formatting/NumberingLevel.js.map +1 -1
- package/dist/formatting/NumberingManager.d.ts +1 -1
- package/dist/formatting/NumberingManager.d.ts.map +1 -1
- package/dist/formatting/NumberingManager.js.map +1 -1
- package/dist/formatting/Style.d.ts.map +1 -1
- package/dist/formatting/Style.js +87 -95
- package/dist/formatting/Style.js.map +1 -1
- package/dist/formatting/StylesManager.d.ts +3 -3
- package/dist/formatting/StylesManager.d.ts.map +1 -1
- package/dist/formatting/StylesManager.js.map +1 -1
- package/dist/helpers/CleanupHelper.js.map +1 -1
- package/dist/images/ImageOptimizer.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/managers/DrawingManager.d.ts.map +1 -1
- package/dist/managers/DrawingManager.js.map +1 -1
- package/dist/tracking/DocumentTrackingContext.js.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 +4 -4
- package/dist/types/list-types.d.ts.map +1 -1
- package/dist/types/list-types.js.map +1 -1
- package/dist/types/settings-types.js.map +1 -1
- package/dist/types/styleConfig.js.map +1 -1
- package/dist/utils/ChangelogGenerator.d.ts.map +1 -1
- package/dist/utils/ChangelogGenerator.js.map +1 -1
- package/dist/utils/CompatibilityUpgrader.d.ts.map +1 -1
- package/dist/utils/CompatibilityUpgrader.js +7 -7
- package/dist/utils/CompatibilityUpgrader.js.map +1 -1
- package/dist/utils/InMemoryRevisionAcceptor.js +1 -1
- package/dist/utils/InMemoryRevisionAcceptor.js.map +1 -1
- package/dist/utils/MoveOperationHelper.js.map +1 -1
- package/dist/utils/RevisionAwareProcessor.js.map +1 -1
- package/dist/utils/RevisionWalker.js.map +1 -1
- package/dist/utils/SelectiveRevisionAcceptor.js.map +1 -1
- package/dist/utils/ShadingResolver.js +1 -1
- package/dist/utils/ShadingResolver.js.map +1 -1
- package/dist/utils/acceptRevisions.d.ts +0 -28
- package/dist/utils/acceptRevisions.d.ts.map +1 -1
- package/dist/utils/acceptRevisions.js +5 -7
- package/dist/utils/acceptRevisions.js.map +1 -1
- package/dist/utils/cnfStyleDecoder.js +1 -1
- package/dist/utils/cnfStyleDecoder.js.map +1 -1
- package/dist/utils/corruptionDetection.js.map +1 -1
- package/dist/utils/dateFormatting.js.map +1 -1
- package/dist/utils/deepClone.d.ts +0 -1
- package/dist/utils/deepClone.d.ts.map +1 -1
- package/dist/utils/deepClone.js +0 -7
- package/dist/utils/deepClone.js.map +1 -1
- package/dist/utils/diagnostics.d.ts +2 -2
- package/dist/utils/diagnostics.d.ts.map +1 -1
- package/dist/utils/diagnostics.js.map +1 -1
- package/dist/utils/errorHandling.js.map +1 -1
- 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 +3 -3
- package/dist/utils/list-detection.js.map +1 -1
- package/dist/utils/logger.d.ts +2 -4
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +0 -2
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/parsingHelpers.js.map +1 -1
- package/dist/utils/stripTrackedChanges.d.ts +0 -19
- package/dist/utils/stripTrackedChanges.d.ts.map +1 -1
- package/dist/utils/stripTrackedChanges.js +0 -2
- package/dist/utils/stripTrackedChanges.js.map +1 -1
- 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.map +1 -1
- package/dist/utils/xmlSanitization.js.map +1 -1
- package/dist/validation/RevisionAutoFixer.js.map +1 -1
- package/dist/validation/RevisionValidator.js.map +1 -1
- package/dist/validation/ValidationRules.js.map +1 -1
- package/dist/validation/index.js.map +1 -1
- package/dist/xml/XMLBuilder.d.ts.map +1 -1
- package/dist/xml/XMLBuilder.js +10 -0
- package/dist/xml/XMLBuilder.js.map +1 -1
- package/dist/xml/XMLParser.d.ts.map +1 -1
- package/dist/xml/XMLParser.js +4 -5
- package/dist/xml/XMLParser.js.map +1 -1
- package/dist/zip/ZipHandler.js.map +1 -1
- package/dist/zip/ZipReader.js.map +1 -1
- package/dist/zip/ZipWriter.js.map +1 -1
- package/dist/zip/errors.js.map +1 -1
- package/dist/zip/types.js.map +1 -1
- package/package.json +34 -4
- package/src/__tests__/helper-methods.test.ts +512 -0
- package/src/constants/legacyCompatFlags.ts +138 -0
- package/src/constants/limits.ts +50 -0
- package/src/core/CLAUDE.md +109 -0
- package/src/core/Document.ts +15569 -0
- package/src/core/DocumentContent.ts +467 -0
- package/src/core/DocumentGenerator.ts +1104 -0
- package/src/core/DocumentIdManager.ts +158 -0
- package/src/core/DocumentParser.ts +10107 -0
- package/src/core/DocumentValidator.ts +372 -0
- package/src/core/Relationship.ts +367 -0
- package/src/core/RelationshipManager.ts +428 -0
- package/src/elements/AlternateContent.ts +42 -0
- package/src/elements/Bookmark.ts +210 -0
- package/src/elements/BookmarkManager.ts +250 -0
- package/src/elements/CLAUDE.md +126 -0
- package/src/elements/Comment.ts +359 -0
- package/src/elements/CommentManager.ts +502 -0
- package/src/elements/CommonTypes.ts +549 -0
- package/src/elements/CustomXml.ts +36 -0
- package/src/elements/Endnote.ts +217 -0
- package/src/elements/EndnoteManager.ts +249 -0
- package/src/elements/Field.ts +1233 -0
- package/src/elements/FieldHelpers.ts +333 -0
- package/src/elements/FontManager.ts +339 -0
- package/src/elements/Footer.ts +269 -0
- package/src/elements/Footnote.ts +217 -0
- package/src/elements/FootnoteManager.ts +249 -0
- package/src/elements/Header.ts +269 -0
- package/src/elements/HeaderFooterManager.ts +219 -0
- package/src/elements/Hyperlink.ts +1146 -0
- package/src/elements/Image.ts +1756 -0
- package/src/elements/ImageManager.ts +432 -0
- package/src/elements/ImageRun.ts +59 -0
- package/src/elements/MathElement.ts +65 -0
- package/src/elements/Paragraph.ts +4227 -0
- package/src/elements/PreservedElement.ts +53 -0
- package/src/elements/PropertyChangeTypes.ts +442 -0
- package/src/elements/RangeMarker.ts +400 -0
- package/src/elements/Revision.ts +1217 -0
- package/src/elements/RevisionContent.ts +73 -0
- package/src/elements/RevisionManager.ts +1070 -0
- package/src/elements/Run.ts +3068 -0
- package/src/elements/Section.ts +1421 -0
- package/src/elements/Shape.ts +873 -0
- package/src/elements/StructuredDocumentTag.ts +978 -0
- package/src/elements/Table.ts +2524 -0
- package/src/elements/TableCell.ts +1586 -0
- package/src/elements/TableGridChange.ts +151 -0
- package/src/elements/TableOfContents.ts +691 -0
- package/src/elements/TableOfContentsElement.ts +89 -0
- package/src/elements/TableRow.ts +906 -0
- package/src/elements/TextBox.ts +768 -0
- package/src/formatting/AbstractNumbering.ts +548 -0
- package/src/formatting/CLAUDE.md +74 -0
- package/src/formatting/NumberingInstance.ts +212 -0
- package/src/formatting/NumberingLevel.ts +1006 -0
- package/src/formatting/NumberingManager.ts +827 -0
- package/src/formatting/Style.ts +1833 -0
- package/src/formatting/StylesManager.ts +1005 -0
- package/src/helpers/CleanupHelper.ts +524 -0
- package/src/images/ImageOptimizer.ts +274 -0
- package/src/index.ts +554 -0
- package/src/managers/CLAUDE.md +47 -0
- package/src/managers/DrawingManager.ts +319 -0
- package/src/tracking/DocumentTrackingContext.ts +643 -0
- package/src/tracking/TrackingContext.ts +173 -0
- package/src/types/compatibility-types.ts +49 -0
- package/src/types/formatting.ts +210 -0
- package/src/types/list-types.ts +152 -0
- package/src/types/settings-types.ts +59 -0
- package/src/types/styleConfig.ts +189 -0
- package/src/utils/CLAUDE.md +153 -0
- package/src/utils/ChangelogGenerator.ts +1581 -0
- package/src/utils/CompatibilityUpgrader.ts +237 -0
- package/src/utils/InMemoryRevisionAcceptor.ts +668 -0
- package/src/utils/MoveOperationHelper.ts +238 -0
- package/src/utils/RevisionAwareProcessor.ts +526 -0
- package/src/utils/RevisionWalker.ts +457 -0
- package/src/utils/SelectiveRevisionAcceptor.ts +613 -0
- package/src/utils/ShadingResolver.ts +107 -0
- package/src/utils/acceptRevisions.ts +714 -0
- package/src/utils/cnfStyleDecoder.ts +217 -0
- package/src/utils/corruptionDetection.ts +345 -0
- package/src/utils/dateFormatting.ts +20 -0
- package/src/utils/deepClone.ts +78 -0
- package/src/utils/diagnostics.ts +129 -0
- package/src/utils/errorHandling.ts +80 -0
- package/src/utils/formatting.ts +213 -0
- package/src/utils/list-detection.ts +274 -0
- package/src/utils/logger.ts +404 -0
- package/src/utils/parsingHelpers.ts +190 -0
- package/src/utils/stripTrackedChanges.ts +353 -0
- package/src/utils/textDiff.ts +100 -0
- package/src/utils/units.ts +421 -0
- package/src/utils/validation.ts +542 -0
- package/src/utils/xmlSanitization.ts +182 -0
- package/src/validation/RevisionAutoFixer.ts +542 -0
- package/src/validation/RevisionValidator.ts +460 -0
- package/src/validation/ValidationRules.ts +338 -0
- package/src/validation/index.ts +30 -0
- package/src/xml/CLAUDE.md +65 -0
- package/src/xml/XMLBuilder.ts +871 -0
- package/src/xml/XMLParser.ts +919 -0
- package/src/zip/CLAUDE.md +55 -0
- package/src/zip/ZipHandler.ts +637 -0
- package/src/zip/ZipReader.ts +299 -0
- package/src/zip/ZipWriter.ts +390 -0
- package/src/zip/errors.ts +69 -0
- package/src/zip/types.ts +116 -0
- package/dist/core/ListNormalizer.d.ts +0 -23
- package/dist/core/ListNormalizer.d.ts.map +0 -1
- package/dist/core/ListNormalizer.js +0 -624
- package/dist/core/ListNormalizer.js.map +0 -1
- package/dist/images/index.d.ts +0 -2
- package/dist/images/index.d.ts.map +0 -1
- package/dist/images/index.js +0 -8
- package/dist/images/index.js.map +0 -1
- package/dist/ms-doc/cfb/CFBReader.d.ts +0 -35
- package/dist/ms-doc/cfb/CFBReader.d.ts.map +0 -1
- package/dist/ms-doc/cfb/CFBReader.js +0 -360
- package/dist/ms-doc/cfb/CFBReader.js.map +0 -1
- package/dist/ms-doc/converter/DocToDocxConverter.d.ts +0 -55
- package/dist/ms-doc/converter/DocToDocxConverter.d.ts.map +0 -1
- package/dist/ms-doc/converter/DocToDocxConverter.js +0 -324
- package/dist/ms-doc/converter/DocToDocxConverter.js.map +0 -1
- package/dist/ms-doc/fib/FIB.d.ts +0 -18
- package/dist/ms-doc/fib/FIB.d.ts.map +0 -1
- package/dist/ms-doc/fib/FIB.js +0 -342
- package/dist/ms-doc/fib/FIB.js.map +0 -1
- package/dist/ms-doc/fields/FieldParser.d.ts +0 -31
- package/dist/ms-doc/fields/FieldParser.d.ts.map +0 -1
- package/dist/ms-doc/fields/FieldParser.js +0 -266
- package/dist/ms-doc/fields/FieldParser.js.map +0 -1
- package/dist/ms-doc/images/PictureExtractor.d.ts +0 -22
- package/dist/ms-doc/images/PictureExtractor.d.ts.map +0 -1
- package/dist/ms-doc/images/PictureExtractor.js +0 -233
- package/dist/ms-doc/images/PictureExtractor.js.map +0 -1
- package/dist/ms-doc/index.d.ts +0 -20
- package/dist/ms-doc/index.d.ts.map +0 -1
- package/dist/ms-doc/index.js +0 -59
- package/dist/ms-doc/index.js.map +0 -1
- package/dist/ms-doc/properties/SPRM.d.ts +0 -210
- package/dist/ms-doc/properties/SPRM.d.ts.map +0 -1
- package/dist/ms-doc/properties/SPRM.js +0 -633
- package/dist/ms-doc/properties/SPRM.js.map +0 -1
- package/dist/ms-doc/sections/SectionParser.d.ts +0 -25
- package/dist/ms-doc/sections/SectionParser.d.ts.map +0 -1
- package/dist/ms-doc/sections/SectionParser.js +0 -214
- package/dist/ms-doc/sections/SectionParser.js.map +0 -1
- package/dist/ms-doc/styles/StyleSheet.d.ts +0 -23
- package/dist/ms-doc/styles/StyleSheet.d.ts.map +0 -1
- package/dist/ms-doc/styles/StyleSheet.js +0 -268
- package/dist/ms-doc/styles/StyleSheet.js.map +0 -1
- package/dist/ms-doc/subdocuments/SubdocumentParser.d.ts +0 -61
- package/dist/ms-doc/subdocuments/SubdocumentParser.d.ts.map +0 -1
- package/dist/ms-doc/subdocuments/SubdocumentParser.js +0 -208
- package/dist/ms-doc/subdocuments/SubdocumentParser.js.map +0 -1
- package/dist/ms-doc/tables/TableParser.d.ts +0 -29
- package/dist/ms-doc/tables/TableParser.d.ts.map +0 -1
- package/dist/ms-doc/tables/TableParser.js +0 -176
- package/dist/ms-doc/tables/TableParser.js.map +0 -1
- package/dist/ms-doc/text/PieceTable.d.ts +0 -21
- package/dist/ms-doc/text/PieceTable.d.ts.map +0 -1
- package/dist/ms-doc/text/PieceTable.js +0 -171
- package/dist/ms-doc/text/PieceTable.js.map +0 -1
- package/dist/ms-doc/types/Constants.d.ts +0 -99
- package/dist/ms-doc/types/Constants.d.ts.map +0 -1
- package/dist/ms-doc/types/Constants.js +0 -102
- package/dist/ms-doc/types/Constants.js.map +0 -1
- package/dist/ms-doc/types/DocTypes.d.ts +0 -368
- package/dist/ms-doc/types/DocTypes.d.ts.map +0 -1
- package/dist/ms-doc/types/DocTypes.js +0 -3
- package/dist/ms-doc/types/DocTypes.js.map +0 -1
- package/dist/tracking/index.d.ts +0 -3
- package/dist/tracking/index.d.ts.map +0 -1
- package/dist/tracking/index.js +0 -6
- package/dist/tracking/index.js.map +0 -1
|
@@ -0,0 +1,548 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AbstractNumbering - Defines a multi-level numbering scheme
|
|
3
|
+
*
|
|
4
|
+
* An abstract numbering definition is a template that defines up to 9 levels of
|
|
5
|
+
* list formatting. It's referenced by numbering instances which link it to actual
|
|
6
|
+
* paragraphs in the document.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { XMLBuilder, XMLElement } from "../xml/XMLBuilder";
|
|
10
|
+
import { NumberingLevel } from "./NumberingLevel";
|
|
11
|
+
import { defaultLogger } from "../utils/logger";
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Properties for creating an abstract numbering definition
|
|
15
|
+
*/
|
|
16
|
+
export interface AbstractNumberingProperties {
|
|
17
|
+
/** Unique identifier for this abstract numbering */
|
|
18
|
+
abstractNumId: number;
|
|
19
|
+
|
|
20
|
+
/** Optional name for the numbering scheme */
|
|
21
|
+
name?: string;
|
|
22
|
+
|
|
23
|
+
/** The numbering levels (up to 9 levels, 0-8) */
|
|
24
|
+
levels?: NumberingLevel[];
|
|
25
|
+
|
|
26
|
+
/** Optional multiLevel type (0 = single level, 1 = multilevel) */
|
|
27
|
+
multiLevelType?: number;
|
|
28
|
+
|
|
29
|
+
/** Optional link to a numbering style definition (ECMA-376 §17.9.21) */
|
|
30
|
+
numStyleLink?: string;
|
|
31
|
+
|
|
32
|
+
/** Optional link to a style that uses this abstract numbering (ECMA-376 §17.9.27) */
|
|
33
|
+
styleLink?: string;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Represents an abstract numbering definition
|
|
38
|
+
*
|
|
39
|
+
* Abstract numbering defines the template for a multi-level list. Each instance
|
|
40
|
+
* of a list in the document references an abstract numbering definition.
|
|
41
|
+
*/
|
|
42
|
+
export class AbstractNumbering {
|
|
43
|
+
private abstractNumId: number;
|
|
44
|
+
private name?: string;
|
|
45
|
+
private levels: Map<number, NumberingLevel>;
|
|
46
|
+
private multiLevelType: number;
|
|
47
|
+
private numStyleLink?: string;
|
|
48
|
+
private styleLink?: string;
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Creates a new abstract numbering definition
|
|
52
|
+
* @param idOrProps The abstract numbering ID (number) or properties object
|
|
53
|
+
* @param name Optional name (if first param is a number)
|
|
54
|
+
*/
|
|
55
|
+
constructor(idOrProps: number | AbstractNumberingProperties, name?: string) {
|
|
56
|
+
// Support both simple (numId) and object constructor patterns
|
|
57
|
+
if (typeof idOrProps === "number") {
|
|
58
|
+
// Simple constructor: new AbstractNumbering(id)
|
|
59
|
+
this.abstractNumId = idOrProps;
|
|
60
|
+
this.name = name;
|
|
61
|
+
this.levels = new Map();
|
|
62
|
+
this.multiLevelType = 1; // default multilevel
|
|
63
|
+
} else {
|
|
64
|
+
// Object constructor: new AbstractNumbering({ abstractNumId, ... })
|
|
65
|
+
const properties = idOrProps;
|
|
66
|
+
this.abstractNumId = properties.abstractNumId;
|
|
67
|
+
this.name = properties.name;
|
|
68
|
+
this.levels = new Map();
|
|
69
|
+
this.multiLevelType =
|
|
70
|
+
properties.multiLevelType !== undefined ? properties.multiLevelType : 1;
|
|
71
|
+
this.numStyleLink = properties.numStyleLink;
|
|
72
|
+
this.styleLink = properties.styleLink;
|
|
73
|
+
|
|
74
|
+
if (properties.levels) {
|
|
75
|
+
properties.levels.forEach((level) => {
|
|
76
|
+
this.addLevel(level);
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
this.validate();
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Validates the abstract numbering
|
|
86
|
+
*/
|
|
87
|
+
private validate(): void {
|
|
88
|
+
if (this.abstractNumId < 0) {
|
|
89
|
+
throw new Error("Abstract numbering ID must be non-negative");
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if (this.levels.size > 9) {
|
|
93
|
+
throw new Error("Cannot have more than 9 levels (0-8)");
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Gets the abstract numbering ID
|
|
99
|
+
*/
|
|
100
|
+
getAbstractNumId(): number {
|
|
101
|
+
return this.abstractNumId;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Alias for getAbstractNumId for backward compatibility
|
|
106
|
+
*/
|
|
107
|
+
getId(): number {
|
|
108
|
+
return this.abstractNumId;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Gets the name
|
|
113
|
+
*/
|
|
114
|
+
getName(): string | undefined {
|
|
115
|
+
return this.name;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Sets the name
|
|
120
|
+
* @param name The numbering scheme name
|
|
121
|
+
*/
|
|
122
|
+
setName(name: string): this {
|
|
123
|
+
this.name = name;
|
|
124
|
+
return this;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Gets the multi-level type
|
|
129
|
+
*/
|
|
130
|
+
getMultiLevelType(): string {
|
|
131
|
+
if (this.multiLevelType === 1) {
|
|
132
|
+
return "multilevel";
|
|
133
|
+
} else if (this.multiLevelType === 2) {
|
|
134
|
+
return "hybridMultilevel";
|
|
135
|
+
} else {
|
|
136
|
+
return "singleLevel";
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Sets the multi-level type
|
|
142
|
+
* @param type The multi-level type ('multilevel' or 'singleLevel')
|
|
143
|
+
*/
|
|
144
|
+
setMultiLevelType(
|
|
145
|
+
type: "multilevel" | "singleLevel" | "hybridMultilevel"
|
|
146
|
+
): this {
|
|
147
|
+
if (type === "multilevel") {
|
|
148
|
+
this.multiLevelType = 1;
|
|
149
|
+
} else if (type === "hybridMultilevel") {
|
|
150
|
+
this.multiLevelType = 2;
|
|
151
|
+
} else {
|
|
152
|
+
this.multiLevelType = 0;
|
|
153
|
+
}
|
|
154
|
+
return this;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Gets the numStyleLink (reference to a numbering style definition)
|
|
159
|
+
*/
|
|
160
|
+
getNumStyleLink(): string | undefined {
|
|
161
|
+
return this.numStyleLink;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Sets the numStyleLink
|
|
166
|
+
* @param link The numbering style name
|
|
167
|
+
*/
|
|
168
|
+
setNumStyleLink(link: string | undefined): this {
|
|
169
|
+
this.numStyleLink = link;
|
|
170
|
+
return this;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Gets the styleLink (reference to a style that uses this abstract numbering)
|
|
175
|
+
*/
|
|
176
|
+
getStyleLink(): string | undefined {
|
|
177
|
+
return this.styleLink;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Sets the styleLink
|
|
182
|
+
* @param link The style name
|
|
183
|
+
*/
|
|
184
|
+
setStyleLink(link: string | undefined): this {
|
|
185
|
+
this.styleLink = link;
|
|
186
|
+
return this;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Adds a numbering level
|
|
191
|
+
* @param level The numbering level to add
|
|
192
|
+
*/
|
|
193
|
+
addLevel(level: NumberingLevel): this {
|
|
194
|
+
const levelIndex = level.getLevel();
|
|
195
|
+
|
|
196
|
+
if (levelIndex < 0 || levelIndex > 8) {
|
|
197
|
+
throw new Error(`Level must be between 0 and 8, got ${levelIndex}`);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
this.levels.set(levelIndex, level);
|
|
201
|
+
return this;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Adds multiple numbering levels at once
|
|
206
|
+
* @param levels The numbering levels to add
|
|
207
|
+
*/
|
|
208
|
+
addLevels(levels: NumberingLevel[]): this {
|
|
209
|
+
levels.forEach((level) => this.addLevel(level));
|
|
210
|
+
return this;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* Gets a numbering level by index
|
|
215
|
+
* @param levelIndex The level index (0-8)
|
|
216
|
+
*/
|
|
217
|
+
getLevel(levelIndex: number): NumberingLevel | undefined {
|
|
218
|
+
return this.levels.get(levelIndex);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* Gets all levels
|
|
223
|
+
*/
|
|
224
|
+
getAllLevels(): NumberingLevel[] {
|
|
225
|
+
return Array.from(this.levels.values()).sort(
|
|
226
|
+
(a, b) => a.getLevel() - b.getLevel()
|
|
227
|
+
);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Alias for getAllLevels for backward compatibility
|
|
232
|
+
*/
|
|
233
|
+
getLevels(): NumberingLevel[] {
|
|
234
|
+
return this.getAllLevels();
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* Gets the number of levels defined
|
|
239
|
+
*/
|
|
240
|
+
getLevelCount(): number {
|
|
241
|
+
return this.levels.size;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Checks if a level exists
|
|
246
|
+
* @param levelIndex The level index (0-8)
|
|
247
|
+
*/
|
|
248
|
+
hasLevel(levelIndex: number): boolean {
|
|
249
|
+
return this.levels.has(levelIndex);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* Removes a level
|
|
254
|
+
* @param levelIndex The level index (0-8)
|
|
255
|
+
*/
|
|
256
|
+
removeLevel(levelIndex: number): boolean {
|
|
257
|
+
return this.levels.delete(levelIndex);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* Generates the WordprocessingML XML for this abstract numbering
|
|
262
|
+
*/
|
|
263
|
+
toXML(): XMLElement {
|
|
264
|
+
const children: XMLElement[] = [];
|
|
265
|
+
|
|
266
|
+
// CT_AbstractNum order per ECMA-376: nsid → multiLevelType → tmpl → name → styleLink → numStyleLink → lvl*
|
|
267
|
+
|
|
268
|
+
// Add multiLevelType
|
|
269
|
+
let multiLevelTypeValue: string;
|
|
270
|
+
if (this.multiLevelType === 1) {
|
|
271
|
+
multiLevelTypeValue = "multilevel";
|
|
272
|
+
} else if (this.multiLevelType === 2) {
|
|
273
|
+
multiLevelTypeValue = "hybridMultilevel";
|
|
274
|
+
} else {
|
|
275
|
+
multiLevelTypeValue = "singleLevel";
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
children.push(
|
|
279
|
+
XMLBuilder.wSelf("multiLevelType", {
|
|
280
|
+
"w:val": multiLevelTypeValue,
|
|
281
|
+
})
|
|
282
|
+
);
|
|
283
|
+
|
|
284
|
+
// Add name if present
|
|
285
|
+
if (this.name) {
|
|
286
|
+
children.push(XMLBuilder.wSelf("name", { "w:val": this.name }));
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
// Add styleLink / numStyleLink if present
|
|
290
|
+
if (this.styleLink) {
|
|
291
|
+
children.push(XMLBuilder.wSelf("styleLink", { "w:val": this.styleLink }));
|
|
292
|
+
}
|
|
293
|
+
if (this.numStyleLink) {
|
|
294
|
+
children.push(XMLBuilder.wSelf("numStyleLink", { "w:val": this.numStyleLink }));
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
// Add all levels in order
|
|
298
|
+
const sortedLevels = this.getAllLevels();
|
|
299
|
+
sortedLevels.forEach((level) => {
|
|
300
|
+
children.push(level.toXML());
|
|
301
|
+
});
|
|
302
|
+
|
|
303
|
+
// If no levels defined, add a default level 0
|
|
304
|
+
if (sortedLevels.length === 0) {
|
|
305
|
+
children.push(NumberingLevel.createDecimalLevel(0).toXML());
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
return XMLBuilder.w(
|
|
309
|
+
"abstractNum",
|
|
310
|
+
{ "w:abstractNumId": this.abstractNumId.toString() },
|
|
311
|
+
children
|
|
312
|
+
);
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
/**
|
|
316
|
+
* Creates a bullet list abstract numbering with specified levels
|
|
317
|
+
*
|
|
318
|
+
* Uses Calibri font for better UI compatibility. For advanced bullet symbol selection,
|
|
319
|
+
* use NumberingLevel.getBulletSymbolWithFont() to get recommended symbol/font pairs.
|
|
320
|
+
*
|
|
321
|
+
* @param abstractNumId The abstract numbering ID
|
|
322
|
+
* @param levels Number of levels (default: 9)
|
|
323
|
+
* @param bullets Array of bullet characters (default: ['•', '○', '▪'])
|
|
324
|
+
*
|
|
325
|
+
* @example
|
|
326
|
+
* // Standard bullet list
|
|
327
|
+
* const bulletList = AbstractNumbering.createBulletList(1);
|
|
328
|
+
*
|
|
329
|
+
* @example
|
|
330
|
+
* // Custom bullets using helper method
|
|
331
|
+
* const bullets = [];
|
|
332
|
+
* for (let i = 0; i < 9; i++) {
|
|
333
|
+
* const { symbol } = NumberingLevel.getBulletSymbolWithFont(i, 'square');
|
|
334
|
+
* bullets.push(symbol);
|
|
335
|
+
* }
|
|
336
|
+
* const squareList = AbstractNumbering.createBulletList(2, 9, bullets);
|
|
337
|
+
*/
|
|
338
|
+
static createBulletList(
|
|
339
|
+
abstractNumId: number,
|
|
340
|
+
levels = 9,
|
|
341
|
+
bullets?: string[] // Optional: custom bullets. If not provided, uses Word-native encoding
|
|
342
|
+
): AbstractNumbering {
|
|
343
|
+
const abstractNum = new AbstractNumbering({
|
|
344
|
+
abstractNumId,
|
|
345
|
+
name: "Bullet List",
|
|
346
|
+
multiLevelType: 1,
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
for (let i = 0; i < levels && i < 9; i++) {
|
|
350
|
+
if (bullets && bullets.length > 0) {
|
|
351
|
+
// Custom bullets provided - use them with default font
|
|
352
|
+
const bullet = bullets[i % bullets.length] || "•";
|
|
353
|
+
abstractNum.addLevel(NumberingLevel.createBulletLevel(i, bullet));
|
|
354
|
+
} else {
|
|
355
|
+
// No custom bullets - use Word-native encoding (correct font per level)
|
|
356
|
+
abstractNum.addLevel(NumberingLevel.createBulletLevel(i));
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
return abstractNum;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
/**
|
|
364
|
+
* Creates a numbered list abstract numbering with specified levels
|
|
365
|
+
* @param abstractNumId The abstract numbering ID
|
|
366
|
+
* @param levels Number of levels (default: 9)
|
|
367
|
+
* @param formats Array of formats for each level
|
|
368
|
+
*/
|
|
369
|
+
static createNumberedList(
|
|
370
|
+
abstractNumId: number,
|
|
371
|
+
levels = 9,
|
|
372
|
+
formats: ("decimal" | "lowerLetter" | "lowerRoman" | "upperLetter" | "upperRoman")[] = ["decimal", "lowerLetter", "lowerRoman", "upperLetter", "upperRoman"]
|
|
373
|
+
): AbstractNumbering {
|
|
374
|
+
const abstractNum = new AbstractNumbering({
|
|
375
|
+
abstractNumId,
|
|
376
|
+
name: "Numbered List",
|
|
377
|
+
multiLevelType: 1,
|
|
378
|
+
});
|
|
379
|
+
|
|
380
|
+
for (let i = 0; i < levels && i < 9; i++) {
|
|
381
|
+
const format = formats[i % formats.length] || "decimal";
|
|
382
|
+
const template = `%${i + 1}.`;
|
|
383
|
+
|
|
384
|
+
let level: NumberingLevel;
|
|
385
|
+
switch (format) {
|
|
386
|
+
case "lowerLetter":
|
|
387
|
+
level = NumberingLevel.createLowerLetterLevel(i, template);
|
|
388
|
+
break;
|
|
389
|
+
case "lowerRoman":
|
|
390
|
+
level = NumberingLevel.createLowerRomanLevel(i, template);
|
|
391
|
+
break;
|
|
392
|
+
case "upperLetter":
|
|
393
|
+
level = NumberingLevel.createUpperLetterLevel(i, template);
|
|
394
|
+
break;
|
|
395
|
+
case "upperRoman":
|
|
396
|
+
level = NumberingLevel.createUpperRomanLevel(i, template);
|
|
397
|
+
break;
|
|
398
|
+
case "decimal":
|
|
399
|
+
default:
|
|
400
|
+
level = NumberingLevel.createDecimalLevel(i, template);
|
|
401
|
+
break;
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
abstractNum.addLevel(level);
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
return abstractNum;
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
/**
|
|
411
|
+
* Creates a multi-level list with mixed formats
|
|
412
|
+
* @param abstractNumId The abstract numbering ID
|
|
413
|
+
*/
|
|
414
|
+
static createMultiLevelList(abstractNumId: number): AbstractNumbering {
|
|
415
|
+
const abstractNum = new AbstractNumbering({
|
|
416
|
+
abstractNumId,
|
|
417
|
+
name: "Multi-Level List",
|
|
418
|
+
multiLevelType: 1,
|
|
419
|
+
});
|
|
420
|
+
|
|
421
|
+
// Level 0: 1, 2, 3, ...
|
|
422
|
+
abstractNum.addLevel(NumberingLevel.createDecimalLevel(0, "%1."));
|
|
423
|
+
|
|
424
|
+
// Level 1: a, b, c, ...
|
|
425
|
+
abstractNum.addLevel(NumberingLevel.createLowerLetterLevel(1, "%2."));
|
|
426
|
+
|
|
427
|
+
// Level 2: i, ii, iii, ...
|
|
428
|
+
abstractNum.addLevel(NumberingLevel.createLowerRomanLevel(2, "%3."));
|
|
429
|
+
|
|
430
|
+
// Level 3: 1, 2, 3, ... (with more indent)
|
|
431
|
+
abstractNum.addLevel(NumberingLevel.createDecimalLevel(3, "%4."));
|
|
432
|
+
|
|
433
|
+
return abstractNum;
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
/**
|
|
437
|
+
* Creates an outline list abstract numbering
|
|
438
|
+
* @param abstractNumId The abstract numbering ID
|
|
439
|
+
*/
|
|
440
|
+
static createOutlineList(abstractNumId: number): AbstractNumbering {
|
|
441
|
+
const abstractNum = new AbstractNumbering({
|
|
442
|
+
abstractNumId,
|
|
443
|
+
name: "Outline List",
|
|
444
|
+
multiLevelType: 1,
|
|
445
|
+
});
|
|
446
|
+
|
|
447
|
+
// Level 0: I, II, III, ...
|
|
448
|
+
abstractNum.addLevel(NumberingLevel.createUpperRomanLevel(0, "%1."));
|
|
449
|
+
|
|
450
|
+
// Level 1: A, B, C, ...
|
|
451
|
+
abstractNum.addLevel(NumberingLevel.createUpperLetterLevel(1, "%2."));
|
|
452
|
+
|
|
453
|
+
// Level 2: 1, 2, 3, ...
|
|
454
|
+
abstractNum.addLevel(NumberingLevel.createDecimalLevel(2, "%3."));
|
|
455
|
+
|
|
456
|
+
// Level 3: a, b, c, ...
|
|
457
|
+
abstractNum.addLevel(NumberingLevel.createLowerLetterLevel(3, "%4."));
|
|
458
|
+
|
|
459
|
+
// Level 4: i, ii, iii, ...
|
|
460
|
+
abstractNum.addLevel(NumberingLevel.createLowerRomanLevel(4, "%5."));
|
|
461
|
+
|
|
462
|
+
// Level 5: A, B, C, ... (repeating)
|
|
463
|
+
abstractNum.addLevel(NumberingLevel.createUpperLetterLevel(5, "%6."));
|
|
464
|
+
|
|
465
|
+
// Level 6: 1, 2, 3, ... (repeating)
|
|
466
|
+
abstractNum.addLevel(NumberingLevel.createDecimalLevel(6, "%7."));
|
|
467
|
+
|
|
468
|
+
// Level 7: a, b, c, ... (repeating)
|
|
469
|
+
abstractNum.addLevel(NumberingLevel.createLowerLetterLevel(7, "%8."));
|
|
470
|
+
|
|
471
|
+
// Level 8: i, ii, iii, ... (repeating)
|
|
472
|
+
abstractNum.addLevel(NumberingLevel.createLowerRomanLevel(8, "%9."));
|
|
473
|
+
|
|
474
|
+
return abstractNum;
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
/**
|
|
478
|
+
* Factory method for creating an abstract numbering definition
|
|
479
|
+
* @param properties The abstract numbering properties
|
|
480
|
+
*/
|
|
481
|
+
static create(properties: AbstractNumberingProperties): AbstractNumbering {
|
|
482
|
+
return new AbstractNumbering(properties);
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
/**
|
|
486
|
+
* Creates an AbstractNumbering from XML element
|
|
487
|
+
* @param xml The XML string of the <w:abstractNum> element
|
|
488
|
+
* @returns AbstractNumbering instance
|
|
489
|
+
*/
|
|
490
|
+
static fromXML(xml: string): AbstractNumbering {
|
|
491
|
+
// Extract abstractNumId (required)
|
|
492
|
+
const abstractNumIdMatch = /<w:abstractNum[^>]*w:abstractNumId="([^"]+)"/.exec(xml);
|
|
493
|
+
if (!abstractNumIdMatch?.[1]) {
|
|
494
|
+
throw new Error("Missing required w:abstractNumId attribute");
|
|
495
|
+
}
|
|
496
|
+
const abstractNumId = parseInt(abstractNumIdMatch[1], 10);
|
|
497
|
+
|
|
498
|
+
// Extract name (optional)
|
|
499
|
+
const nameMatch = /<w:name[^>]*w:val="([^"]+)"/.exec(xml);
|
|
500
|
+
const name = nameMatch?.[1] ? nameMatch[1] : undefined;
|
|
501
|
+
|
|
502
|
+
// Extract multiLevelType (optional)
|
|
503
|
+
// Values: "singleLevel" = 0, "multilevel" = 1, "hybridMultilevel" = 2
|
|
504
|
+
const multiLevelTypeMatch = /<w:multiLevelType[^>]*w:val="([^"]+)"/.exec(xml);
|
|
505
|
+
let multiLevelType = 1; // default to multilevel
|
|
506
|
+
if (multiLevelTypeMatch?.[1]) {
|
|
507
|
+
const value = multiLevelTypeMatch[1];
|
|
508
|
+
if (value === "singleLevel") multiLevelType = 0;
|
|
509
|
+
else if (value === "multilevel") multiLevelType = 1;
|
|
510
|
+
else if (value === "hybridMultilevel") multiLevelType = 2;
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
// Extract numStyleLink (optional, ECMA-376 §17.9.21)
|
|
514
|
+
const numStyleLinkMatch = /<w:numStyleLink[^>]*w:val="([^"]+)"/.exec(xml);
|
|
515
|
+
const numStyleLink = numStyleLinkMatch?.[1] || undefined;
|
|
516
|
+
|
|
517
|
+
// Extract styleLink (optional, ECMA-376 §17.9.27)
|
|
518
|
+
const styleLinkMatch = /<w:styleLink[^>]*w:val="([^"]+)"/.exec(xml);
|
|
519
|
+
const styleLink = styleLinkMatch?.[1] || undefined;
|
|
520
|
+
|
|
521
|
+
// Create abstract numbering
|
|
522
|
+
const abstractNum = new AbstractNumbering({
|
|
523
|
+
abstractNumId,
|
|
524
|
+
name,
|
|
525
|
+
multiLevelType,
|
|
526
|
+
numStyleLink,
|
|
527
|
+
styleLink,
|
|
528
|
+
});
|
|
529
|
+
|
|
530
|
+
// Extract and parse all levels
|
|
531
|
+
const lvlRegex = /<w:lvl[^>]*>[\s\S]*?<\/w:lvl>/g;
|
|
532
|
+
const lvlMatches = xml.match(lvlRegex);
|
|
533
|
+
|
|
534
|
+
if (lvlMatches) {
|
|
535
|
+
for (const lvlXml of lvlMatches) {
|
|
536
|
+
try {
|
|
537
|
+
const level = NumberingLevel.fromXML(lvlXml);
|
|
538
|
+
abstractNum.addLevel(level);
|
|
539
|
+
} catch (error: unknown) {
|
|
540
|
+
// Skip malformed levels but continue parsing
|
|
541
|
+
defaultLogger.warn(`Failed to parse level: ${error}`);
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
return abstractNum;
|
|
547
|
+
}
|
|
548
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Formatting Module
|
|
2
|
+
|
|
3
|
+
`src/formatting/` — Styles and numbering systems.
|
|
4
|
+
|
|
5
|
+
## Style System
|
|
6
|
+
|
|
7
|
+
### Style (`Style.ts`)
|
|
8
|
+
|
|
9
|
+
Types: `paragraph`, `character`, `table`, `numbering`.
|
|
10
|
+
|
|
11
|
+
Properties: `styleId`, `type`, `name`, `basedOn` (inheritance), `next`, `link`, `runFormatting`, `paragraphFormatting`, `tableFormatting`, `isDefault`.
|
|
12
|
+
|
|
13
|
+
**Inheritance:** Styles inherit via `basedOn`. Resolution: default → basedOn chain → own formatting.
|
|
14
|
+
|
|
15
|
+
Built-in styles: `Normal`, `Heading1`-`Heading6`, `Title`, `Subtitle`, `DefaultParagraphFont`, `TableGrid`.
|
|
16
|
+
|
|
17
|
+
### StylesManager (`StylesManager.ts`)
|
|
18
|
+
|
|
19
|
+
Stores, validates, generates `word/styles.xml`, parses from existing documents. Validates unique IDs, basedOn existence, no circular inheritance.
|
|
20
|
+
|
|
21
|
+
## Numbering System
|
|
22
|
+
|
|
23
|
+
### Concepts
|
|
24
|
+
|
|
25
|
+
- **AbstractNumbering**: Reusable template defining structure (up to 9 levels) with format/indentation per level
|
|
26
|
+
- **NumberingInstance**: Links abstract numbering to usage (referenced by paragraphs via numId). Can override levels.
|
|
27
|
+
- **NumberingLevel**: Format for one level — format type, text pattern, alignment, indentation, font
|
|
28
|
+
|
|
29
|
+
### NumberingLevel (`NumberingLevel.ts`)
|
|
30
|
+
|
|
31
|
+
**Formats:** `decimal`, `upperRoman`, `lowerRoman`, `upperLetter`, `lowerLetter`, `bullet`.
|
|
32
|
+
|
|
33
|
+
**Level text:** `%1.` (level 1 number), `%1.%2.` (two levels), `•` (bullet).
|
|
34
|
+
|
|
35
|
+
**Standard indentation:** `leftIndent = 720 + (level * 360)` twips, `hangingIndent = 360` twips.
|
|
36
|
+
|
|
37
|
+
**Factory methods:**
|
|
38
|
+
```typescript
|
|
39
|
+
NumberingLevel.createBulletLevel(level, symbol)
|
|
40
|
+
NumberingLevel.createNumberedLevel(level, format, text)
|
|
41
|
+
NumberingLevel.calculateStandardIndentation(level)
|
|
42
|
+
NumberingLevel.getBulletSymbolWithFont(level, style)
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
**Text formatting:** `setItalic()`, `setUnderline(style)`, `setBold()`, `setColor()`.
|
|
46
|
+
|
|
47
|
+
### AbstractNumbering (`AbstractNumbering.ts`)
|
|
48
|
+
|
|
49
|
+
```typescript
|
|
50
|
+
AbstractNumbering.createNumberedList(id, maxLevels) // 1., 2., 3.
|
|
51
|
+
AbstractNumbering.createBulletedList(id, maxLevels) // bullet symbols
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### NumberingInstance (`NumberingInstance.ts`)
|
|
55
|
+
|
|
56
|
+
Links to abstract numbering. Level overrides:
|
|
57
|
+
```typescript
|
|
58
|
+
const instance = new NumberingInstance(numId, abstractNumId);
|
|
59
|
+
instance.addLevelOverride(0, customLevel);
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### NumberingManager (`NumberingManager.ts`)
|
|
63
|
+
|
|
64
|
+
Manages abstract numberings + instances. Generates `word/numbering.xml`. Assigns unique IDs.
|
|
65
|
+
|
|
66
|
+
```typescript
|
|
67
|
+
manager.addAbstractNumbering(abstractNum);
|
|
68
|
+
manager.addNumberingInstance(instance);
|
|
69
|
+
paragraph.setNumbering(numId, level);
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Key Behavior: Indentation vs Numbering
|
|
73
|
+
|
|
74
|
+
Per ECMA-376 §17.3.1.12, paragraph-level indentation overrides numbering-level indentation. The framework auto-clears conflicting paragraph indentation when numbering is applied (left, firstLine, hanging cleared; right preserved). To change list indentation, change the numbering **level** instead of setting indent directly.
|