@usejunior/docx-core 0.2.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/README.md +0 -2
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/atomizer.d.ts.map +1 -1
  4. package/dist/atomizer.js +16 -3
  5. package/dist/atomizer.js.map +1 -1
  6. package/dist/baselines/atomizer/documentReconstructor.d.ts.map +1 -1
  7. package/dist/baselines/atomizer/documentReconstructor.js +11 -5
  8. package/dist/baselines/atomizer/documentReconstructor.js.map +1 -1
  9. package/dist/baselines/atomizer/inPlaceModifier.d.ts +81 -1
  10. package/dist/baselines/atomizer/inPlaceModifier.d.ts.map +1 -1
  11. package/dist/baselines/atomizer/inPlaceModifier.js +618 -34
  12. package/dist/baselines/atomizer/inPlaceModifier.js.map +1 -1
  13. package/dist/baselines/atomizer/pipeline.d.ts +1 -1
  14. package/dist/baselines/atomizer/pipeline.d.ts.map +1 -1
  15. package/dist/baselines/atomizer/pipeline.js +70 -1
  16. package/dist/baselines/atomizer/pipeline.js.map +1 -1
  17. package/dist/baselines/atomizer/premergeRuns.d.ts.map +1 -1
  18. package/dist/baselines/atomizer/premergeRuns.js +3 -0
  19. package/dist/baselines/atomizer/premergeRuns.js.map +1 -1
  20. package/dist/baselines/atomizer/trackChangesAcceptorAst.d.ts.map +1 -1
  21. package/dist/baselines/atomizer/trackChangesAcceptorAst.js +63 -33
  22. package/dist/baselines/atomizer/trackChangesAcceptorAst.js.map +1 -1
  23. package/dist/cli/compare-two.js +4 -4
  24. package/dist/cli/compare-two.js.map +1 -1
  25. package/dist/index.d.ts +6 -6
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +7 -7
  28. package/dist/index.js.map +1 -1
  29. package/dist/primitives/document.d.ts +12 -0
  30. package/dist/primitives/document.d.ts.map +1 -1
  31. package/dist/primitives/document.js +17 -2
  32. package/dist/primitives/document.js.map +1 -1
  33. package/dist/primitives/document_view.d.ts +2 -0
  34. package/dist/primitives/document_view.d.ts.map +1 -1
  35. package/dist/primitives/document_view.js +3 -2
  36. package/dist/primitives/document_view.js.map +1 -1
  37. package/dist/primitives/formatting_tags.d.ts +14 -2
  38. package/dist/primitives/formatting_tags.d.ts.map +1 -1
  39. package/dist/primitives/formatting_tags.js +13 -11
  40. package/dist/primitives/formatting_tags.js.map +1 -1
  41. package/dist/primitives/matching.d.ts +12 -0
  42. package/dist/primitives/matching.d.ts.map +1 -1
  43. package/dist/primitives/matching.js +54 -0
  44. package/dist/primitives/matching.js.map +1 -1
  45. package/dist/primitives/merge_runs.d.ts.map +1 -1
  46. package/dist/primitives/merge_runs.js +48 -0
  47. package/dist/primitives/merge_runs.js.map +1 -1
  48. package/dist/shared/validators/structural.d.ts +31 -0
  49. package/dist/shared/validators/structural.d.ts.map +1 -0
  50. package/dist/shared/validators/structural.js +110 -0
  51. package/dist/shared/validators/structural.js.map +1 -0
  52. package/package.json +2 -2
  53. package/dist/baselines/diffmatch/documentBuilder.d.ts +0 -44
  54. package/dist/baselines/diffmatch/documentBuilder.d.ts.map +0 -1
  55. package/dist/baselines/diffmatch/documentBuilder.js +0 -227
  56. package/dist/baselines/diffmatch/documentBuilder.js.map +0 -1
  57. package/dist/baselines/diffmatch/paragraphAlignment.d.ts +0 -75
  58. package/dist/baselines/diffmatch/paragraphAlignment.d.ts.map +0 -1
  59. package/dist/baselines/diffmatch/paragraphAlignment.js +0 -206
  60. package/dist/baselines/diffmatch/paragraphAlignment.js.map +0 -1
  61. package/dist/baselines/diffmatch/pipeline.d.ts +0 -33
  62. package/dist/baselines/diffmatch/pipeline.d.ts.map +0 -1
  63. package/dist/baselines/diffmatch/pipeline.js +0 -84
  64. package/dist/baselines/diffmatch/pipeline.js.map +0 -1
  65. package/dist/baselines/diffmatch/runDiff.d.ts +0 -53
  66. package/dist/baselines/diffmatch/runDiff.d.ts.map +0 -1
  67. package/dist/baselines/diffmatch/runDiff.js +0 -253
  68. package/dist/baselines/diffmatch/runDiff.js.map +0 -1
  69. package/dist/baselines/diffmatch/trackChangesRenderer.d.ts +0 -64
  70. package/dist/baselines/diffmatch/trackChangesRenderer.d.ts.map +0 -1
  71. package/dist/baselines/diffmatch/trackChangesRenderer.js +0 -178
  72. package/dist/baselines/diffmatch/trackChangesRenderer.js.map +0 -1
  73. package/dist/baselines/diffmatch/xmlParser.d.ts +0 -45
  74. package/dist/baselines/diffmatch/xmlParser.d.ts.map +0 -1
  75. package/dist/baselines/diffmatch/xmlParser.js +0 -216
  76. package/dist/baselines/diffmatch/xmlParser.js.map +0 -1
  77. package/dist/benchmark/metrics.d.ts +0 -72
  78. package/dist/benchmark/metrics.d.ts.map +0 -1
  79. package/dist/benchmark/metrics.js +0 -45
  80. package/dist/benchmark/metrics.js.map +0 -1
  81. package/dist/benchmark/reporter.d.ts +0 -23
  82. package/dist/benchmark/reporter.d.ts.map +0 -1
  83. package/dist/benchmark/reporter.js +0 -147
  84. package/dist/benchmark/reporter.js.map +0 -1
  85. package/dist/benchmark/runner.d.ts +0 -30
  86. package/dist/benchmark/runner.d.ts.map +0 -1
  87. package/dist/benchmark/runner.js +0 -233
  88. package/dist/benchmark/runner.js.map +0 -1
@@ -1,206 +0,0 @@
1
- /**
2
- * Baseline B: Paragraph alignment using LCS (Longest Common Subsequence).
3
- *
4
- * Aligns paragraphs between original and revised documents to identify:
5
- * - Matched paragraphs (same or similar content)
6
- * - Inserted paragraphs (only in revised)
7
- * - Deleted paragraphs (only in original)
8
- * - Modified paragraphs (matched but with differences)
9
- */
10
- import { createHash } from 'crypto';
11
- /**
12
- * Compute a hash for a paragraph's normalized text.
13
- *
14
- * Used for fast comparison during LCS.
15
- */
16
- export function hashParagraph(text) {
17
- const normalized = normalizeParagraphText(text);
18
- return createHash('sha1').update(normalized).digest('hex');
19
- }
20
- /**
21
- * Normalize paragraph text for comparison.
22
- *
23
- * - Trim whitespace
24
- * - Collapse multiple spaces
25
- * - Lowercase for case-insensitive comparison
26
- */
27
- export function normalizeParagraphText(text) {
28
- return text
29
- .trim()
30
- .replace(/\s+/g, ' ')
31
- .toLowerCase();
32
- }
33
- /**
34
- * Compute similarity between two strings using Jaccard index on words.
35
- *
36
- * @returns Value between 0 (completely different) and 1 (identical)
37
- */
38
- export function computeSimilarity(a, b) {
39
- const wordsA = new Set(normalizeParagraphText(a).split(' ').filter(w => w.length > 0));
40
- const wordsB = new Set(normalizeParagraphText(b).split(' ').filter(w => w.length > 0));
41
- if (wordsA.size === 0 && wordsB.size === 0) {
42
- return 1; // Both empty
43
- }
44
- if (wordsA.size === 0 || wordsB.size === 0) {
45
- return 0; // One empty
46
- }
47
- const intersection = new Set([...wordsA].filter(x => wordsB.has(x)));
48
- const union = new Set([...wordsA, ...wordsB]);
49
- return intersection.size / union.size;
50
- }
51
- /**
52
- * Compute the Longest Common Subsequence of two arrays using dynamic programming.
53
- *
54
- * @param a - First array
55
- * @param b - Second array
56
- * @param keyFn - Function to extract comparison key from elements
57
- * @returns Array of [indexA, indexB] pairs representing the LCS
58
- */
59
- export function lcs(a, b, keyFn) {
60
- const m = a.length;
61
- const n = b.length;
62
- // Build DP table
63
- const dp = Array.from({ length: m + 1 }, () => Array.from({ length: n + 1 }, () => 0));
64
- for (let i = 1; i <= m; i++) {
65
- for (let j = 1; j <= n; j++) {
66
- if (keyFn(a[i - 1]) === keyFn(b[j - 1])) {
67
- dp[i][j] = dp[i - 1][j - 1] + 1;
68
- }
69
- else {
70
- dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
71
- }
72
- }
73
- }
74
- // Backtrack to find LCS
75
- const result = [];
76
- let i = m;
77
- let j = n;
78
- while (i > 0 && j > 0) {
79
- if (keyFn(a[i - 1]) === keyFn(b[j - 1])) {
80
- result.push([i - 1, j - 1]);
81
- i--;
82
- j--;
83
- }
84
- else if (dp[i - 1][j] > dp[i][j - 1]) {
85
- i--;
86
- }
87
- else {
88
- j--;
89
- }
90
- }
91
- return result.reverse();
92
- }
93
- /**
94
- * Align paragraphs between original and revised documents.
95
- *
96
- * Uses hash-based LCS to find matching paragraphs, then classifies
97
- * unmatched paragraphs as inserted or deleted.
98
- *
99
- * @param original - Paragraphs from original document
100
- * @param revised - Paragraphs from revised document
101
- * @param similarityThreshold - Minimum similarity to consider a match (default: 0.5)
102
- */
103
- export function alignParagraphs(original, revised, similarityThreshold = 0.5) {
104
- // Compute hashes for all paragraphs
105
- const originalHashes = original.map(p => ({
106
- para: p,
107
- hash: hashParagraph(p.text),
108
- }));
109
- const revisedHashes = revised.map(p => ({
110
- para: p,
111
- hash: hashParagraph(p.text),
112
- }));
113
- // Find LCS based on hashes
114
- const lcsResult = lcs(originalHashes, revisedHashes, item => item.hash);
115
- // Build sets of matched indices
116
- const matchedOriginal = new Set(lcsResult.map(([i]) => i));
117
- const matchedRevised = new Set(lcsResult.map(([, j]) => j));
118
- // Build alignment result
119
- const result = {
120
- matched: [],
121
- deleted: [],
122
- inserted: [],
123
- };
124
- // Add matched paragraphs
125
- for (const [origIdx, revIdx] of lcsResult) {
126
- const origPara = original[origIdx];
127
- const revPara = revised[revIdx];
128
- const similarity = computeSimilarity(origPara.text, revPara.text);
129
- result.matched.push({
130
- original: origPara,
131
- revised: revPara,
132
- similarity,
133
- });
134
- }
135
- // Add deleted paragraphs (in original but not matched)
136
- for (let i = 0; i < original.length; i++) {
137
- if (!matchedOriginal.has(i)) {
138
- result.deleted.push(original[i]);
139
- }
140
- }
141
- // Add inserted paragraphs (in revised but not matched)
142
- for (let j = 0; j < revised.length; j++) {
143
- if (!matchedRevised.has(j)) {
144
- result.inserted.push(revised[j]);
145
- }
146
- }
147
- // Try to find near-matches for unmatched paragraphs
148
- // This helps with paragraphs that were modified significantly
149
- const unmatchedOriginal = [...result.deleted];
150
- const unmatchedRevised = [...result.inserted];
151
- result.deleted = [];
152
- result.inserted = [];
153
- for (const origPara of unmatchedOriginal) {
154
- let bestMatch = null;
155
- for (const revPara of unmatchedRevised) {
156
- const similarity = computeSimilarity(origPara.text, revPara.text);
157
- if (similarity >= similarityThreshold) {
158
- if (!bestMatch || similarity > bestMatch.similarity) {
159
- bestMatch = { para: revPara, similarity };
160
- }
161
- }
162
- }
163
- if (bestMatch) {
164
- // Remove from unmatched revised
165
- const idx = unmatchedRevised.indexOf(bestMatch.para);
166
- if (idx !== -1) {
167
- unmatchedRevised.splice(idx, 1);
168
- }
169
- result.matched.push({
170
- original: origPara,
171
- revised: bestMatch.para,
172
- similarity: bestMatch.similarity,
173
- });
174
- }
175
- else {
176
- result.deleted.push(origPara);
177
- }
178
- }
179
- // Remaining unmatched revised are insertions
180
- result.inserted = unmatchedRevised;
181
- return result;
182
- }
183
- /**
184
- * Classify alignment result into more granular categories.
185
- */
186
- export function classifyAlignment(alignment) {
187
- const result = {
188
- identical: [],
189
- modified: [],
190
- deleted: alignment.deleted,
191
- inserted: alignment.inserted,
192
- };
193
- for (const match of alignment.matched) {
194
- if (match.similarity >= 0.9999) {
195
- result.identical.push({
196
- original: match.original,
197
- revised: match.revised,
198
- });
199
- }
200
- else {
201
- result.modified.push(match);
202
- }
203
- }
204
- return result;
205
- }
206
- //# sourceMappingURL=paragraphAlignment.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"paragraphAlignment.js","sourceRoot":"","sources":["../../../src/baselines/diffmatch/paragraphAlignment.ts"],"names":[],"mappings":"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"}
@@ -1,33 +0,0 @@
1
- /**
2
- * Baseline B: Pure TypeScript document comparison pipeline.
3
- *
4
- * Orchestrates the comparison flow:
5
- * 1. Load DOCX archives
6
- * 2. Extract paragraphs
7
- * 3. Align paragraphs (LCS + similarity)
8
- * 4. Diff runs within matched paragraphs
9
- * 5. Render track changes
10
- * 6. Build output document
11
- */
12
- import type { CompareResult } from '../../index.js';
13
- /**
14
- * Options for Baseline B comparison.
15
- */
16
- export interface BaselineBOptions {
17
- /** Author name for track changes. Default: "Comparison" */
18
- author?: string;
19
- /** Timestamp for track changes. Default: current time */
20
- date?: Date;
21
- /** Minimum similarity to consider paragraphs matched. Default: 0.5 */
22
- similarityThreshold?: number;
23
- }
24
- /**
25
- * Compare two DOCX documents using the Baseline B (pure TypeScript) approach.
26
- *
27
- * @param original - Original document as Buffer
28
- * @param revised - Revised document as Buffer
29
- * @param options - Comparison options
30
- * @returns Comparison result with track changes document
31
- */
32
- export declare function compareDocumentsBaselineB(original: Buffer, revised: Buffer, options?: BaselineBOptions): Promise<CompareResult>;
33
- //# sourceMappingURL=pipeline.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../../src/baselines/diffmatch/pipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAgB,MAAM,gBAAgB,CAAC;AAWlE;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,2DAA2D;IAC3D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,sEAAsE;IACtE,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;;;;;;GAOG;AACH,wBAAsB,yBAAyB,CAC7C,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,aAAa,CAAC,CAqDxB"}
@@ -1,84 +0,0 @@
1
- /**
2
- * Baseline B: Pure TypeScript document comparison pipeline.
3
- *
4
- * Orchestrates the comparison flow:
5
- * 1. Load DOCX archives
6
- * 2. Extract paragraphs
7
- * 3. Align paragraphs (LCS + similarity)
8
- * 4. Diff runs within matched paragraphs
9
- * 5. Render track changes
10
- * 6. Build output document
11
- */
12
- import { DocxArchive } from '../../shared/docx/DocxArchive.js';
13
- import { extractParagraphs } from './xmlParser.js';
14
- import { alignParagraphs, classifyAlignment } from './paragraphAlignment.js';
15
- import { resetRevisionIds } from './trackChangesRenderer.js';
16
- import { generateParagraphOperations, buildDocumentWithTrackChanges, } from './documentBuilder.js';
17
- /**
18
- * Compare two DOCX documents using the Baseline B (pure TypeScript) approach.
19
- *
20
- * @param original - Original document as Buffer
21
- * @param revised - Revised document as Buffer
22
- * @param options - Comparison options
23
- * @returns Comparison result with track changes document
24
- */
25
- export async function compareDocumentsBaselineB(original, revised, options = {}) {
26
- const { author = 'Comparison', date = new Date(), similarityThreshold = 0.5, } = options;
27
- // 1. Load archives
28
- const originalArchive = await DocxArchive.load(original);
29
- const revisedArchive = await DocxArchive.load(revised);
30
- // 2. Extract document XML
31
- const originalXml = await originalArchive.getDocumentXml();
32
- const revisedXml = await revisedArchive.getDocumentXml();
33
- // 3. Extract paragraphs from both documents
34
- const originalParagraphs = extractParagraphs(originalXml);
35
- const revisedParagraphs = extractParagraphs(revisedXml);
36
- // 4. Reset revision ID counter for this comparison
37
- resetRevisionIds();
38
- // 5. Align paragraphs between documents
39
- const alignment = alignParagraphs(originalParagraphs, revisedParagraphs, similarityThreshold);
40
- // 6. Generate paragraph operations with track changes
41
- const operations = generateParagraphOperations(alignment, originalParagraphs, revisedParagraphs, { author, date });
42
- // 7. Build new document.xml with track changes
43
- const newDocumentXml = buildDocumentWithTrackChanges(originalXml, operations);
44
- // 8. Clone original archive and update document.xml
45
- const resultArchive = await originalArchive.clone();
46
- resultArchive.setDocumentXml(newDocumentXml);
47
- // 9. Save result and compute stats
48
- const resultBuffer = await resultArchive.save();
49
- const stats = computeStats(alignment, operations);
50
- return {
51
- document: resultBuffer,
52
- stats,
53
- engine: 'diffmatch',
54
- };
55
- }
56
- /**
57
- * Compute comparison statistics from alignment and operations.
58
- */
59
- function computeStats(alignment, operations) {
60
- // Count operations
61
- let insertions = 0;
62
- let deletions = 0;
63
- let modifications = 0;
64
- for (const op of operations) {
65
- if (op.type === 'inserted') {
66
- insertions++;
67
- }
68
- else if (op.type === 'deleted') {
69
- deletions++;
70
- }
71
- else if (op.type === 'modified') {
72
- modifications++;
73
- }
74
- }
75
- // Also count modifications from alignment for more accurate stats
76
- const classification = classifyAlignment(alignment);
77
- modifications = classification.modified.length;
78
- return {
79
- insertions,
80
- deletions,
81
- modifications,
82
- };
83
- }
84
- //# sourceMappingURL=pipeline.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../../src/baselines/diffmatch/pipeline.ts"],"names":[],"mappings":"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"}
@@ -1,53 +0,0 @@
1
- /**
2
- * Baseline B: Run-level diff using diff-match-patch.
3
- *
4
- * Performs character-level diff on matched paragraphs, then maps
5
- * the diff operations back to run boundaries for track changes generation.
6
- */
7
- import type { RunInfo, RunDiffResult, DiffOp } from '../../shared/ooxml/types.js';
8
- /**
9
- * Compute a diff between two strings.
10
- *
11
- * @param original - Original text
12
- * @param revised - Revised text
13
- * @param cleanupSemantic - Apply semantic cleanup (default: true)
14
- * @returns Array of diff operations [operation, text]
15
- */
16
- export declare function computeDiff(original: string, revised: string, cleanupSemantic?: boolean): DiffOp[];
17
- /**
18
- * Compute a word-level diff (more suitable for document comparison).
19
- *
20
- * Tokenizes input by words, performs diff, then reconstructs.
21
- */
22
- export declare function computeWordDiff(original: string, revised: string): DiffOp[];
23
- /**
24
- * Split a run at a given character offset.
25
- *
26
- * @param run - The run to split
27
- * @param offset - Character offset to split at
28
- * @returns [before, after] runs
29
- */
30
- export declare function splitRun(run: RunInfo, offset: number): [RunInfo, RunInfo];
31
- /**
32
- * Extract text from runs.
33
- */
34
- export declare function extractText(runs: RunInfo[]): string;
35
- /**
36
- * Compute run-level diff between original and revised runs.
37
- *
38
- * Maps character-level diff back to run boundaries, splitting runs
39
- * when necessary.
40
- *
41
- * @param originalRuns - Runs from original paragraph
42
- * @param revisedRuns - Runs from revised paragraph
43
- * @returns Merged runs with revision markers
44
- */
45
- export declare function diffRuns(originalRuns: RunInfo[], revisedRuns: RunInfo[]): RunDiffResult;
46
- /**
47
- * Count changes in a diff result.
48
- */
49
- export declare function countChanges(diffs: DiffOp[]): {
50
- insertions: number;
51
- deletions: number;
52
- };
53
- //# sourceMappingURL=runDiff.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"runDiff.d.ts","sourceRoot":"","sources":["../../../src/baselines/diffmatch/runDiff.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AAclF;;;;;;;GAOG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,eAAe,UAAO,GACrB,MAAM,EAAE,CAQV;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAkB3E;AAuFD;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAgBzE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,CAEnD;AAED;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CACtB,YAAY,EAAE,OAAO,EAAE,EACvB,WAAW,EAAE,OAAO,EAAE,GACrB,aAAa,CAkGf;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAavF"}
@@ -1,253 +0,0 @@
1
- /**
2
- * Baseline B: Run-level diff using diff-match-patch.
3
- *
4
- * Performs character-level diff on matched paragraphs, then maps
5
- * the diff operations back to run boundaries for track changes generation.
6
- */
7
- import DiffMatchPatch from 'diff-match-patch';
8
- /** Diff operation codes from diff-match-patch */
9
- const DIFF_DELETE = -1;
10
- const DIFF_INSERT = 1;
11
- const DIFF_EQUAL = 0;
12
- /** Create a shared diff-match-patch instance */
13
- const dmp = new DiffMatchPatch();
14
- // Configure diff-match-patch for better document comparison
15
- dmp.Diff_Timeout = 5; // 5 seconds timeout
16
- dmp.Diff_EditCost = 4; // Favor fewer, larger edits
17
- /**
18
- * Compute a diff between two strings.
19
- *
20
- * @param original - Original text
21
- * @param revised - Revised text
22
- * @param cleanupSemantic - Apply semantic cleanup (default: true)
23
- * @returns Array of diff operations [operation, text]
24
- */
25
- export function computeDiff(original, revised, cleanupSemantic = true) {
26
- const diffs = dmp.diff_main(original, revised);
27
- if (cleanupSemantic) {
28
- dmp.diff_cleanupSemantic(diffs);
29
- }
30
- return diffs;
31
- }
32
- /**
33
- * Compute a word-level diff (more suitable for document comparison).
34
- *
35
- * Tokenizes input by words, performs diff, then reconstructs.
36
- */
37
- export function computeWordDiff(original, revised) {
38
- // Tokenize by words (keep punctuation attached to words)
39
- const tokenize = (text) => {
40
- return text.match(/\S+\s*/g) ?? [];
41
- };
42
- const originalTokens = tokenize(original);
43
- const revisedTokens = tokenize(revised);
44
- // Convert tokens to characters for diff-match-patch (1 token = 1 char)
45
- const { chars1, chars2, lineArray } = tokensToChars(originalTokens, revisedTokens);
46
- // Compute diff on character representation
47
- const diffs = dmp.diff_main(chars1, chars2);
48
- dmp.diff_cleanupSemantic(diffs);
49
- // Convert back to actual text
50
- return charsToTokens(diffs, lineArray);
51
- }
52
- /**
53
- * Convert token arrays to character sequences for diffing.
54
- */
55
- function tokensToChars(tokens1, tokens2) {
56
- const tokenSet = new Map();
57
- const lineArray = [];
58
- const encode = (tokens) => {
59
- let chars = '';
60
- for (const token of tokens) {
61
- if (!tokenSet.has(token)) {
62
- tokenSet.set(token, lineArray.length);
63
- lineArray.push(token);
64
- }
65
- chars += String.fromCharCode(tokenSet.get(token));
66
- }
67
- return chars;
68
- };
69
- const chars1 = encode(tokens1);
70
- const chars2 = encode(tokens2);
71
- return { chars1, chars2, lineArray };
72
- }
73
- /**
74
- * Convert character diff back to token diff.
75
- */
76
- function charsToTokens(diffs, lineArray) {
77
- const result = [];
78
- for (const [op, chars] of diffs) {
79
- let text = '';
80
- for (let i = 0; i < chars.length; i++) {
81
- text += lineArray[chars.charCodeAt(i)] ?? '';
82
- }
83
- if (text) {
84
- result.push([op, text]);
85
- }
86
- }
87
- return result;
88
- }
89
- /**
90
- * Map a character offset to a position in the run array.
91
- */
92
- function offsetToRunPosition(runs, offset) {
93
- let charCount = 0;
94
- for (let i = 0; i < runs.length; i++) {
95
- const run = runs[i];
96
- const runLength = run.text.length;
97
- if (charCount + runLength > offset) {
98
- return {
99
- runIndex: i,
100
- charOffset: offset - charCount,
101
- };
102
- }
103
- charCount += runLength;
104
- }
105
- // Offset is at or past end
106
- return {
107
- runIndex: runs.length - 1,
108
- charOffset: runs[runs.length - 1]?.text.length ?? 0,
109
- };
110
- }
111
- /**
112
- * Split a run at a given character offset.
113
- *
114
- * @param run - The run to split
115
- * @param offset - Character offset to split at
116
- * @returns [before, after] runs
117
- */
118
- export function splitRun(run, offset) {
119
- const before = {
120
- text: run.text.slice(0, offset),
121
- start: run.start,
122
- end: run.start + offset,
123
- properties: run.properties ? { ...run.properties } : undefined,
124
- };
125
- const after = {
126
- text: run.text.slice(offset),
127
- start: run.start + offset,
128
- end: run.end,
129
- properties: run.properties ? { ...run.properties } : undefined,
130
- };
131
- return [before, after];
132
- }
133
- /**
134
- * Extract text from runs.
135
- */
136
- export function extractText(runs) {
137
- return runs.map(r => r.text).join('');
138
- }
139
- /**
140
- * Compute run-level diff between original and revised runs.
141
- *
142
- * Maps character-level diff back to run boundaries, splitting runs
143
- * when necessary.
144
- *
145
- * @param originalRuns - Runs from original paragraph
146
- * @param revisedRuns - Runs from revised paragraph
147
- * @returns Merged runs with revision markers
148
- */
149
- export function diffRuns(originalRuns, revisedRuns) {
150
- const originalText = extractText(originalRuns);
151
- const revisedText = extractText(revisedRuns);
152
- // Compute character-level diff
153
- const diffs = computeDiff(originalText, revisedText);
154
- // Build merged runs with revision markers
155
- const mergedRuns = [];
156
- let originalOffset = 0;
157
- let revisedOffset = 0;
158
- for (const [op, text] of diffs) {
159
- if (op === DIFF_EQUAL) {
160
- // Equal text - use revised runs' formatting
161
- const startPos = offsetToRunPosition(revisedRuns, revisedOffset);
162
- const endPos = offsetToRunPosition(revisedRuns, revisedOffset + text.length);
163
- // Extract runs that cover this range
164
- for (let i = startPos.runIndex; i <= endPos.runIndex && i < revisedRuns.length; i++) {
165
- const run = revisedRuns[i];
166
- const runStart = i === startPos.runIndex ? startPos.charOffset : 0;
167
- const runEnd = i === endPos.runIndex ? endPos.charOffset : run.text.length;
168
- if (runEnd > runStart) {
169
- mergedRuns.push({
170
- text: run.text.slice(runStart, runEnd),
171
- start: revisedOffset + runStart,
172
- end: revisedOffset + runEnd,
173
- properties: run.properties,
174
- });
175
- }
176
- }
177
- originalOffset += text.length;
178
- revisedOffset += text.length;
179
- }
180
- else if (op === DIFF_DELETE) {
181
- // Deleted text - use original runs' formatting, mark as deletion
182
- const startPos = offsetToRunPosition(originalRuns, originalOffset);
183
- const endPos = offsetToRunPosition(originalRuns, originalOffset + text.length);
184
- for (let i = startPos.runIndex; i <= endPos.runIndex && i < originalRuns.length; i++) {
185
- const run = originalRuns[i];
186
- const runStart = i === startPos.runIndex ? startPos.charOffset : 0;
187
- const runEnd = i === endPos.runIndex ? endPos.charOffset : run.text.length;
188
- if (runEnd > runStart) {
189
- mergedRuns.push({
190
- text: run.text.slice(runStart, runEnd),
191
- start: originalOffset + runStart,
192
- end: originalOffset + runEnd,
193
- properties: run.properties,
194
- revision: {
195
- id: 0, // Will be assigned later
196
- author: '',
197
- date: new Date(),
198
- type: 'deletion',
199
- },
200
- });
201
- }
202
- }
203
- originalOffset += text.length;
204
- }
205
- else if (op === DIFF_INSERT) {
206
- // Inserted text - use revised runs' formatting, mark as insertion
207
- const startPos = offsetToRunPosition(revisedRuns, revisedOffset);
208
- const endPos = offsetToRunPosition(revisedRuns, revisedOffset + text.length);
209
- for (let i = startPos.runIndex; i <= endPos.runIndex && i < revisedRuns.length; i++) {
210
- const run = revisedRuns[i];
211
- const runStart = i === startPos.runIndex ? startPos.charOffset : 0;
212
- const runEnd = i === endPos.runIndex ? endPos.charOffset : run.text.length;
213
- if (runEnd > runStart) {
214
- mergedRuns.push({
215
- text: run.text.slice(runStart, runEnd),
216
- start: revisedOffset + runStart,
217
- end: revisedOffset + runEnd,
218
- properties: run.properties,
219
- revision: {
220
- id: 0, // Will be assigned later
221
- author: '',
222
- date: new Date(),
223
- type: 'insertion',
224
- },
225
- });
226
- }
227
- }
228
- revisedOffset += text.length;
229
- }
230
- }
231
- return {
232
- originalRuns,
233
- revisedRuns,
234
- mergedRuns,
235
- };
236
- }
237
- /**
238
- * Count changes in a diff result.
239
- */
240
- export function countChanges(diffs) {
241
- let insertions = 0;
242
- let deletions = 0;
243
- for (const [op, text] of diffs) {
244
- if (op === DIFF_INSERT) {
245
- insertions += text.length;
246
- }
247
- else if (op === DIFF_DELETE) {
248
- deletions += text.length;
249
- }
250
- }
251
- return { insertions, deletions };
252
- }
253
- //# sourceMappingURL=runDiff.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"runDiff.js","sourceRoot":"","sources":["../../../src/baselines/diffmatch/runDiff.ts"],"names":[],"mappings":"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"}