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,250 +1,247 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* BookmarkManager - Manages bookmarks in a document
|
|
3
|
-
*
|
|
4
|
-
* Tracks all bookmarks, assigns unique IDs, and ensures name uniqueness.
|
|
5
|
-
*
|
|
6
|
-
* Per ECMA-376, bookmark IDs must be unique across ALL annotation types
|
|
7
|
-
* in a document. Use setIdProvider() to connect to a centralized ID allocator.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import { Bookmark } from './Bookmark';
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Type for the centralized ID provider callback.
|
|
14
|
-
* Returns the next available annotation ID from a shared counter.
|
|
15
|
-
*/
|
|
16
|
-
export type IdProviderCallback = () => number;
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Type for callback to notify of existing IDs (for synchronization).
|
|
20
|
-
* Called when registering an existing bookmark to keep the central counter in sync.
|
|
21
|
-
*/
|
|
22
|
-
export type IdExistsCallback = (existingId: number) => void;
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Manages document bookmarks
|
|
26
|
-
*/
|
|
27
|
-
export class BookmarkManager {
|
|
28
|
-
private bookmarks = new Map<string, Bookmark>();
|
|
29
|
-
private nextId = 0;
|
|
30
|
-
private idProvider: IdProviderCallback | null = null;
|
|
31
|
-
private idExistsNotifier: IdExistsCallback | null = null;
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Sets the centralized ID provider callback.
|
|
35
|
-
* When set, IDs will be allocated from the centralized DocumentIdManager
|
|
36
|
-
* instead of the local nextId counter.
|
|
37
|
-
*
|
|
38
|
-
* @param provider - Callback that returns the next available ID
|
|
39
|
-
* @param existsNotifier - Optional callback to notify when existing IDs are found
|
|
40
|
-
*/
|
|
41
|
-
setIdProvider(provider: IdProviderCallback, existsNotifier?: IdExistsCallback): void {
|
|
42
|
-
this.idProvider = provider;
|
|
43
|
-
this.idExistsNotifier = existsNotifier || null;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* Registers a bookmark with the manager
|
|
48
|
-
* Assigns a unique ID and ensures name uniqueness
|
|
49
|
-
* @param bookmark - Bookmark to register
|
|
50
|
-
* @returns The registered bookmark (same instance)
|
|
51
|
-
* @throws Error if a bookmark with the same name already exists
|
|
52
|
-
*/
|
|
53
|
-
register(bookmark: Bookmark): Bookmark {
|
|
54
|
-
const name = bookmark.getName();
|
|
55
|
-
|
|
56
|
-
// Check for duplicate names
|
|
57
|
-
if (this.bookmarks.has(name)) {
|
|
58
|
-
throw new Error(
|
|
59
|
-
`Bookmark with name "${name}" already exists. Bookmark names must be unique within a document.`
|
|
60
|
-
);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
// Assign unique ID - use centralized provider if available
|
|
64
|
-
const id = this.idProvider ? this.idProvider() : this.nextId++;
|
|
65
|
-
bookmark.setId(id);
|
|
66
|
-
|
|
67
|
-
// Store bookmark
|
|
68
|
-
this.bookmarks.set(name, bookmark);
|
|
69
|
-
|
|
70
|
-
return bookmark;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* Registers an existing bookmark, preserving its ID
|
|
75
|
-
* Used when loading documents to preserve original bookmark IDs and avoid collisions
|
|
76
|
-
* @param bookmark - Bookmark with existing ID to register
|
|
77
|
-
* @returns The registered bookmark (same instance)
|
|
78
|
-
* @throws Error if a bookmark with the same name already exists
|
|
79
|
-
*/
|
|
80
|
-
registerExisting(bookmark: Bookmark): Bookmark {
|
|
81
|
-
const name = bookmark.getName();
|
|
82
|
-
const existingId = bookmark.getId();
|
|
83
|
-
|
|
84
|
-
// Check for duplicate names
|
|
85
|
-
if (this.bookmarks.has(name)) {
|
|
86
|
-
throw new Error(
|
|
87
|
-
`Bookmark with name "${name}" already exists. Bookmark names must be unique within a document.`
|
|
88
|
-
);
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
// Notify centralized ID manager about this existing ID
|
|
92
|
-
if (this.idExistsNotifier) {
|
|
93
|
-
this.idExistsNotifier(existingId);
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
// Also update local nextId to avoid collisions (for fallback)
|
|
97
|
-
if (existingId >= this.nextId) {
|
|
98
|
-
this.nextId = existingId + 1;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
// Store bookmark (keep its existing ID)
|
|
102
|
-
this.bookmarks.set(name, bookmark);
|
|
103
|
-
|
|
104
|
-
return bookmark;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* Gets a bookmark by name
|
|
109
|
-
* @param name - Bookmark name
|
|
110
|
-
* @returns The bookmark, or undefined if not found
|
|
111
|
-
*/
|
|
112
|
-
getBookmark(name: string): Bookmark | undefined {
|
|
113
|
-
return this.bookmarks.get(name);
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
/**
|
|
117
|
-
* Checks if a bookmark exists
|
|
118
|
-
* @param name - Bookmark name
|
|
119
|
-
* @returns True if the bookmark exists
|
|
120
|
-
*/
|
|
121
|
-
hasBookmark(name: string): boolean {
|
|
122
|
-
return this.bookmarks.has(name);
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
/**
|
|
126
|
-
* Gets all bookmarks
|
|
127
|
-
* @returns Array of all bookmarks
|
|
128
|
-
*/
|
|
129
|
-
getAllBookmarks(): Bookmark[] {
|
|
130
|
-
return Array.from(this.bookmarks.values());
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
/**
|
|
134
|
-
* Gets the number of bookmarks
|
|
135
|
-
* @returns Number of bookmarks
|
|
136
|
-
*/
|
|
137
|
-
getCount(): number {
|
|
138
|
-
return this.bookmarks.size;
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
/**
|
|
142
|
-
* Removes a bookmark
|
|
143
|
-
* @param name - Bookmark name
|
|
144
|
-
* @returns True if the bookmark was removed
|
|
145
|
-
*/
|
|
146
|
-
removeBookmark(name: string): boolean {
|
|
147
|
-
return this.bookmarks.delete(name);
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
/**
|
|
151
|
-
* Clears all bookmarks
|
|
152
|
-
*/
|
|
153
|
-
clear(): void {
|
|
154
|
-
this.bookmarks.clear();
|
|
155
|
-
this.nextId = 0;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
/**
|
|
159
|
-
* Sets the next ID to be assigned
|
|
160
|
-
* Used when loading documents to avoid ID collisions with existing bookmarks
|
|
161
|
-
* @param id - The next ID value to use
|
|
162
|
-
*/
|
|
163
|
-
setNextId(id: number): void {
|
|
164
|
-
this.nextId = id;
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
/**
|
|
168
|
-
* Gets a unique bookmark name by adding a suffix if needed
|
|
169
|
-
* Ensures the returned name is always within the 40-character limit
|
|
170
|
-
* @param baseName - Base name for the bookmark
|
|
171
|
-
* @returns A unique bookmark name (max 40 characters)
|
|
172
|
-
*/
|
|
173
|
-
getUniqueName(baseName: string): string {
|
|
174
|
-
const maxLength = 40;
|
|
175
|
-
|
|
176
|
-
if (!this.hasBookmark(baseName)) {
|
|
177
|
-
return baseName;
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
// Try adding numbers until we find a unique name
|
|
181
|
-
let counter = 1;
|
|
182
|
-
while (counter <= 1000) {
|
|
183
|
-
const suffix = `_${counter}`;
|
|
184
|
-
|
|
185
|
-
// Truncate base name to leave room for suffix within 40-char limit
|
|
186
|
-
const maxBase = maxLength - suffix.length;
|
|
187
|
-
const truncatedBase =
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
*
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
return new BookmarkManager();
|
|
249
|
-
}
|
|
250
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* BookmarkManager - Manages bookmarks in a document
|
|
3
|
+
*
|
|
4
|
+
* Tracks all bookmarks, assigns unique IDs, and ensures name uniqueness.
|
|
5
|
+
*
|
|
6
|
+
* Per ECMA-376, bookmark IDs must be unique across ALL annotation types
|
|
7
|
+
* in a document. Use setIdProvider() to connect to a centralized ID allocator.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { Bookmark } from './Bookmark';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Type for the centralized ID provider callback.
|
|
14
|
+
* Returns the next available annotation ID from a shared counter.
|
|
15
|
+
*/
|
|
16
|
+
export type IdProviderCallback = () => number;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Type for callback to notify of existing IDs (for synchronization).
|
|
20
|
+
* Called when registering an existing bookmark to keep the central counter in sync.
|
|
21
|
+
*/
|
|
22
|
+
export type IdExistsCallback = (existingId: number) => void;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Manages document bookmarks
|
|
26
|
+
*/
|
|
27
|
+
export class BookmarkManager {
|
|
28
|
+
private bookmarks = new Map<string, Bookmark>();
|
|
29
|
+
private nextId = 0;
|
|
30
|
+
private idProvider: IdProviderCallback | null = null;
|
|
31
|
+
private idExistsNotifier: IdExistsCallback | null = null;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Sets the centralized ID provider callback.
|
|
35
|
+
* When set, IDs will be allocated from the centralized DocumentIdManager
|
|
36
|
+
* instead of the local nextId counter.
|
|
37
|
+
*
|
|
38
|
+
* @param provider - Callback that returns the next available ID
|
|
39
|
+
* @param existsNotifier - Optional callback to notify when existing IDs are found
|
|
40
|
+
*/
|
|
41
|
+
setIdProvider(provider: IdProviderCallback, existsNotifier?: IdExistsCallback): void {
|
|
42
|
+
this.idProvider = provider;
|
|
43
|
+
this.idExistsNotifier = existsNotifier || null;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Registers a bookmark with the manager
|
|
48
|
+
* Assigns a unique ID and ensures name uniqueness
|
|
49
|
+
* @param bookmark - Bookmark to register
|
|
50
|
+
* @returns The registered bookmark (same instance)
|
|
51
|
+
* @throws Error if a bookmark with the same name already exists
|
|
52
|
+
*/
|
|
53
|
+
register(bookmark: Bookmark): Bookmark {
|
|
54
|
+
const name = bookmark.getName();
|
|
55
|
+
|
|
56
|
+
// Check for duplicate names
|
|
57
|
+
if (this.bookmarks.has(name)) {
|
|
58
|
+
throw new Error(
|
|
59
|
+
`Bookmark with name "${name}" already exists. Bookmark names must be unique within a document.`
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Assign unique ID - use centralized provider if available
|
|
64
|
+
const id = this.idProvider ? this.idProvider() : this.nextId++;
|
|
65
|
+
bookmark.setId(id);
|
|
66
|
+
|
|
67
|
+
// Store bookmark
|
|
68
|
+
this.bookmarks.set(name, bookmark);
|
|
69
|
+
|
|
70
|
+
return bookmark;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Registers an existing bookmark, preserving its ID
|
|
75
|
+
* Used when loading documents to preserve original bookmark IDs and avoid collisions
|
|
76
|
+
* @param bookmark - Bookmark with existing ID to register
|
|
77
|
+
* @returns The registered bookmark (same instance)
|
|
78
|
+
* @throws Error if a bookmark with the same name already exists
|
|
79
|
+
*/
|
|
80
|
+
registerExisting(bookmark: Bookmark): Bookmark {
|
|
81
|
+
const name = bookmark.getName();
|
|
82
|
+
const existingId = bookmark.getId();
|
|
83
|
+
|
|
84
|
+
// Check for duplicate names
|
|
85
|
+
if (this.bookmarks.has(name)) {
|
|
86
|
+
throw new Error(
|
|
87
|
+
`Bookmark with name "${name}" already exists. Bookmark names must be unique within a document.`
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Notify centralized ID manager about this existing ID
|
|
92
|
+
if (this.idExistsNotifier) {
|
|
93
|
+
this.idExistsNotifier(existingId);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Also update local nextId to avoid collisions (for fallback)
|
|
97
|
+
if (existingId >= this.nextId) {
|
|
98
|
+
this.nextId = existingId + 1;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// Store bookmark (keep its existing ID)
|
|
102
|
+
this.bookmarks.set(name, bookmark);
|
|
103
|
+
|
|
104
|
+
return bookmark;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Gets a bookmark by name
|
|
109
|
+
* @param name - Bookmark name
|
|
110
|
+
* @returns The bookmark, or undefined if not found
|
|
111
|
+
*/
|
|
112
|
+
getBookmark(name: string): Bookmark | undefined {
|
|
113
|
+
return this.bookmarks.get(name);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Checks if a bookmark exists
|
|
118
|
+
* @param name - Bookmark name
|
|
119
|
+
* @returns True if the bookmark exists
|
|
120
|
+
*/
|
|
121
|
+
hasBookmark(name: string): boolean {
|
|
122
|
+
return this.bookmarks.has(name);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Gets all bookmarks
|
|
127
|
+
* @returns Array of all bookmarks
|
|
128
|
+
*/
|
|
129
|
+
getAllBookmarks(): Bookmark[] {
|
|
130
|
+
return Array.from(this.bookmarks.values());
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Gets the number of bookmarks
|
|
135
|
+
* @returns Number of bookmarks
|
|
136
|
+
*/
|
|
137
|
+
getCount(): number {
|
|
138
|
+
return this.bookmarks.size;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Removes a bookmark
|
|
143
|
+
* @param name - Bookmark name
|
|
144
|
+
* @returns True if the bookmark was removed
|
|
145
|
+
*/
|
|
146
|
+
removeBookmark(name: string): boolean {
|
|
147
|
+
return this.bookmarks.delete(name);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Clears all bookmarks
|
|
152
|
+
*/
|
|
153
|
+
clear(): void {
|
|
154
|
+
this.bookmarks.clear();
|
|
155
|
+
this.nextId = 0;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Sets the next ID to be assigned
|
|
160
|
+
* Used when loading documents to avoid ID collisions with existing bookmarks
|
|
161
|
+
* @param id - The next ID value to use
|
|
162
|
+
*/
|
|
163
|
+
setNextId(id: number): void {
|
|
164
|
+
this.nextId = id;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Gets a unique bookmark name by adding a suffix if needed
|
|
169
|
+
* Ensures the returned name is always within the 40-character limit
|
|
170
|
+
* @param baseName - Base name for the bookmark
|
|
171
|
+
* @returns A unique bookmark name (max 40 characters)
|
|
172
|
+
*/
|
|
173
|
+
getUniqueName(baseName: string): string {
|
|
174
|
+
const maxLength = 40;
|
|
175
|
+
|
|
176
|
+
if (!this.hasBookmark(baseName)) {
|
|
177
|
+
return baseName;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// Try adding numbers until we find a unique name
|
|
181
|
+
let counter = 1;
|
|
182
|
+
while (counter <= 1000) {
|
|
183
|
+
const suffix = `_${counter}`;
|
|
184
|
+
|
|
185
|
+
// Truncate base name to leave room for suffix within 40-char limit
|
|
186
|
+
const maxBase = maxLength - suffix.length;
|
|
187
|
+
const truncatedBase = baseName.length > maxBase ? baseName.substring(0, maxBase) : baseName;
|
|
188
|
+
|
|
189
|
+
const uniqueName = `${truncatedBase}${suffix}`;
|
|
190
|
+
|
|
191
|
+
if (!this.hasBookmark(uniqueName)) {
|
|
192
|
+
return uniqueName;
|
|
193
|
+
}
|
|
194
|
+
counter++;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
throw new Error(`Could not generate unique bookmark name from base "${baseName}"`);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Creates and registers a new bookmark with a unique name
|
|
202
|
+
* @param name - Desired bookmark name
|
|
203
|
+
* @returns The created and registered bookmark
|
|
204
|
+
*/
|
|
205
|
+
createBookmark(name: string): Bookmark {
|
|
206
|
+
const uniqueName = this.getUniqueName(name);
|
|
207
|
+
const bookmark = Bookmark.create(uniqueName);
|
|
208
|
+
return this.register(bookmark);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Creates and registers a bookmark for a heading
|
|
213
|
+
* Automatically generates a unique name from the heading text
|
|
214
|
+
* @param headingText - The text of the heading
|
|
215
|
+
* @returns The created and registered bookmark
|
|
216
|
+
*/
|
|
217
|
+
createHeadingBookmark(headingText: string): Bookmark {
|
|
218
|
+
const bookmark = Bookmark.createForHeading(headingText);
|
|
219
|
+
const uniqueName = this.getUniqueName(bookmark.getName());
|
|
220
|
+
bookmark.setName(uniqueName);
|
|
221
|
+
return this.register(bookmark);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Gets statistics about bookmarks
|
|
226
|
+
* @returns Object with bookmark statistics
|
|
227
|
+
*/
|
|
228
|
+
getStats(): {
|
|
229
|
+
total: number;
|
|
230
|
+
nextId: number;
|
|
231
|
+
names: string[];
|
|
232
|
+
} {
|
|
233
|
+
return {
|
|
234
|
+
total: this.bookmarks.size,
|
|
235
|
+
nextId: this.nextId,
|
|
236
|
+
names: Array.from(this.bookmarks.keys()),
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Creates a new BookmarkManager
|
|
242
|
+
* @returns New BookmarkManager instance
|
|
243
|
+
*/
|
|
244
|
+
static create(): BookmarkManager {
|
|
245
|
+
return new BookmarkManager();
|
|
246
|
+
}
|
|
247
|
+
}
|