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
package/src/utils/textDiff.ts
CHANGED
|
@@ -1,100 +1,100 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Text diff utility for character-level granular tracked changes.
|
|
3
|
-
*
|
|
4
|
-
* Uses a prefix/suffix diff algorithm to compute minimal edit operations
|
|
5
|
-
* between two strings. This allows tracked changes to show only the
|
|
6
|
-
* actual differences instead of marking entire runs as deleted/inserted.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Represents a segment of a diff result.
|
|
11
|
-
*/
|
|
12
|
-
export interface DiffSegment {
|
|
13
|
-
/** Whether this segment is unchanged, deleted, or inserted */
|
|
14
|
-
type:
|
|
15
|
-
/** The text content of this segment */
|
|
16
|
-
text: string;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Computes minimal diff segments between two strings.
|
|
21
|
-
*
|
|
22
|
-
* Algorithm: Find common prefix, then common suffix from the remaining text,
|
|
23
|
-
* then the middle portion is a delete (from old) + insert (from new).
|
|
24
|
-
*
|
|
25
|
-
* This handles the most common edit patterns optimally:
|
|
26
|
-
* - Space removal: "word word" → "word word" → [equal "word ", delete " ", equal "word"]
|
|
27
|
-
* - Word replacement: "The quick fox" → "The slow fox" → [equal "The ", delete "quick", insert "slow", equal " fox"]
|
|
28
|
-
* - Prefix change: "Hello World" → "Goodbye World" → [delete "Hello", insert "Goodbye", equal " World"]
|
|
29
|
-
* - Suffix change: "Hello World" → "Hello Earth" → [equal "Hello ", delete "World", insert "Earth"]
|
|
30
|
-
*
|
|
31
|
-
* @param oldText - The original text
|
|
32
|
-
* @param newText - The new text
|
|
33
|
-
* @returns Array of diff segments
|
|
34
|
-
*/
|
|
35
|
-
export function diffText(oldText: string, newText: string): DiffSegment[] {
|
|
36
|
-
// Identical strings — no changes
|
|
37
|
-
if (oldText === newText) {
|
|
38
|
-
return oldText.length > 0 ? [{ type:
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
// Empty old — entire new text is an insertion
|
|
42
|
-
if (oldText.length === 0) {
|
|
43
|
-
return newText.length > 0 ? [{ type:
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
// Empty new — entire old text is a deletion
|
|
47
|
-
if (newText.length === 0) {
|
|
48
|
-
return [{ type:
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
// Find common prefix length
|
|
52
|
-
let prefixLen = 0;
|
|
53
|
-
const minLen = Math.min(oldText.length, newText.length);
|
|
54
|
-
while (prefixLen < minLen && oldText[prefixLen] === newText[prefixLen]) {
|
|
55
|
-
prefixLen++;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
// Find common suffix length (not overlapping with prefix)
|
|
59
|
-
let suffixLen = 0;
|
|
60
|
-
const maxSuffix = minLen - prefixLen;
|
|
61
|
-
while (
|
|
62
|
-
suffixLen < maxSuffix &&
|
|
63
|
-
oldText[oldText.length - 1 - suffixLen] === newText[newText.length - 1 - suffixLen]
|
|
64
|
-
) {
|
|
65
|
-
suffixLen++;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
const segments: DiffSegment[] = [];
|
|
69
|
-
|
|
70
|
-
// Common prefix
|
|
71
|
-
if (prefixLen > 0) {
|
|
72
|
-
segments.push({ type:
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
// Middle portion — what changed
|
|
76
|
-
const oldMiddle = oldText.slice(prefixLen, oldText.length - suffixLen);
|
|
77
|
-
const newMiddle = newText.slice(prefixLen, newText.length - suffixLen);
|
|
78
|
-
|
|
79
|
-
if (oldMiddle.length > 0) {
|
|
80
|
-
segments.push({ type:
|
|
81
|
-
}
|
|
82
|
-
if (newMiddle.length > 0) {
|
|
83
|
-
segments.push({ type:
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
// Common suffix
|
|
87
|
-
if (suffixLen > 0) {
|
|
88
|
-
segments.push({ type:
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
return segments;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* Checks whether a diff result has any unchanged (equal) portions.
|
|
96
|
-
* If false, the entire text was replaced (no benefit from granular tracking).
|
|
97
|
-
*/
|
|
98
|
-
export function diffHasUnchangedParts(segments: DiffSegment[]): boolean {
|
|
99
|
-
return segments.some(s => s.type ===
|
|
100
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Text diff utility for character-level granular tracked changes.
|
|
3
|
+
*
|
|
4
|
+
* Uses a prefix/suffix diff algorithm to compute minimal edit operations
|
|
5
|
+
* between two strings. This allows tracked changes to show only the
|
|
6
|
+
* actual differences instead of marking entire runs as deleted/inserted.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Represents a segment of a diff result.
|
|
11
|
+
*/
|
|
12
|
+
export interface DiffSegment {
|
|
13
|
+
/** Whether this segment is unchanged, deleted, or inserted */
|
|
14
|
+
type: 'equal' | 'delete' | 'insert';
|
|
15
|
+
/** The text content of this segment */
|
|
16
|
+
text: string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Computes minimal diff segments between two strings.
|
|
21
|
+
*
|
|
22
|
+
* Algorithm: Find common prefix, then common suffix from the remaining text,
|
|
23
|
+
* then the middle portion is a delete (from old) + insert (from new).
|
|
24
|
+
*
|
|
25
|
+
* This handles the most common edit patterns optimally:
|
|
26
|
+
* - Space removal: "word word" → "word word" → [equal "word ", delete " ", equal "word"]
|
|
27
|
+
* - Word replacement: "The quick fox" → "The slow fox" → [equal "The ", delete "quick", insert "slow", equal " fox"]
|
|
28
|
+
* - Prefix change: "Hello World" → "Goodbye World" → [delete "Hello", insert "Goodbye", equal " World"]
|
|
29
|
+
* - Suffix change: "Hello World" → "Hello Earth" → [equal "Hello ", delete "World", insert "Earth"]
|
|
30
|
+
*
|
|
31
|
+
* @param oldText - The original text
|
|
32
|
+
* @param newText - The new text
|
|
33
|
+
* @returns Array of diff segments
|
|
34
|
+
*/
|
|
35
|
+
export function diffText(oldText: string, newText: string): DiffSegment[] {
|
|
36
|
+
// Identical strings — no changes
|
|
37
|
+
if (oldText === newText) {
|
|
38
|
+
return oldText.length > 0 ? [{ type: 'equal', text: oldText }] : [];
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Empty old — entire new text is an insertion
|
|
42
|
+
if (oldText.length === 0) {
|
|
43
|
+
return newText.length > 0 ? [{ type: 'insert', text: newText }] : [];
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Empty new — entire old text is a deletion
|
|
47
|
+
if (newText.length === 0) {
|
|
48
|
+
return [{ type: 'delete', text: oldText }];
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Find common prefix length
|
|
52
|
+
let prefixLen = 0;
|
|
53
|
+
const minLen = Math.min(oldText.length, newText.length);
|
|
54
|
+
while (prefixLen < minLen && oldText[prefixLen] === newText[prefixLen]) {
|
|
55
|
+
prefixLen++;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Find common suffix length (not overlapping with prefix)
|
|
59
|
+
let suffixLen = 0;
|
|
60
|
+
const maxSuffix = minLen - prefixLen;
|
|
61
|
+
while (
|
|
62
|
+
suffixLen < maxSuffix &&
|
|
63
|
+
oldText[oldText.length - 1 - suffixLen] === newText[newText.length - 1 - suffixLen]
|
|
64
|
+
) {
|
|
65
|
+
suffixLen++;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const segments: DiffSegment[] = [];
|
|
69
|
+
|
|
70
|
+
// Common prefix
|
|
71
|
+
if (prefixLen > 0) {
|
|
72
|
+
segments.push({ type: 'equal', text: oldText.slice(0, prefixLen) });
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Middle portion — what changed
|
|
76
|
+
const oldMiddle = oldText.slice(prefixLen, oldText.length - suffixLen);
|
|
77
|
+
const newMiddle = newText.slice(prefixLen, newText.length - suffixLen);
|
|
78
|
+
|
|
79
|
+
if (oldMiddle.length > 0) {
|
|
80
|
+
segments.push({ type: 'delete', text: oldMiddle });
|
|
81
|
+
}
|
|
82
|
+
if (newMiddle.length > 0) {
|
|
83
|
+
segments.push({ type: 'insert', text: newMiddle });
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Common suffix
|
|
87
|
+
if (suffixLen > 0) {
|
|
88
|
+
segments.push({ type: 'equal', text: oldText.slice(oldText.length - suffixLen) });
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
return segments;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Checks whether a diff result has any unchanged (equal) portions.
|
|
96
|
+
* If false, the entire text was replaced (no benefit from granular tracking).
|
|
97
|
+
*/
|
|
98
|
+
export function diffHasUnchangedParts(segments: DiffSegment[]): boolean {
|
|
99
|
+
return segments.some((s) => s.type === 'equal');
|
|
100
|
+
}
|