@usejunior/docx-core 0.0.1 → 0.1.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.
- package/LICENSE +21 -0
- package/README.md +86 -28
- package/dist/.tsbuildinfo +1 -0
- package/dist/atomizer.d.ts +218 -0
- package/dist/atomizer.d.ts.map +1 -0
- package/dist/atomizer.js +856 -0
- package/dist/atomizer.js.map +1 -0
- package/dist/baselines/atomizer/atomLcs.d.ts +96 -0
- package/dist/baselines/atomizer/atomLcs.d.ts.map +1 -0
- package/dist/baselines/atomizer/atomLcs.js +347 -0
- package/dist/baselines/atomizer/atomLcs.js.map +1 -0
- package/dist/baselines/atomizer/debug.d.ts +41 -0
- package/dist/baselines/atomizer/debug.d.ts.map +1 -0
- package/dist/baselines/atomizer/debug.js +85 -0
- package/dist/baselines/atomizer/debug.js.map +1 -0
- package/dist/baselines/atomizer/documentReconstructor.d.ts +64 -0
- package/dist/baselines/atomizer/documentReconstructor.d.ts.map +1 -0
- package/dist/baselines/atomizer/documentReconstructor.js +939 -0
- package/dist/baselines/atomizer/documentReconstructor.js.map +1 -0
- package/dist/baselines/atomizer/hierarchicalLcs.d.ts +111 -0
- package/dist/baselines/atomizer/hierarchicalLcs.d.ts.map +1 -0
- package/dist/baselines/atomizer/hierarchicalLcs.js +469 -0
- package/dist/baselines/atomizer/hierarchicalLcs.js.map +1 -0
- package/dist/baselines/atomizer/inPlaceModifier.d.ts +183 -0
- package/dist/baselines/atomizer/inPlaceModifier.d.ts.map +1 -0
- package/dist/baselines/atomizer/inPlaceModifier.js +1600 -0
- package/dist/baselines/atomizer/inPlaceModifier.js.map +1 -0
- package/dist/baselines/atomizer/numberingIntegration.d.ts +59 -0
- package/dist/baselines/atomizer/numberingIntegration.d.ts.map +1 -0
- package/dist/baselines/atomizer/numberingIntegration.js +209 -0
- package/dist/baselines/atomizer/numberingIntegration.js.map +1 -0
- package/dist/baselines/atomizer/pipeline.d.ts +65 -0
- package/dist/baselines/atomizer/pipeline.d.ts.map +1 -0
- package/dist/baselines/atomizer/pipeline.js +510 -0
- package/dist/baselines/atomizer/pipeline.js.map +1 -0
- package/dist/baselines/atomizer/premergeRuns.d.ts +26 -0
- package/dist/baselines/atomizer/premergeRuns.d.ts.map +1 -0
- package/dist/baselines/atomizer/premergeRuns.js +150 -0
- package/dist/baselines/atomizer/premergeRuns.js.map +1 -0
- package/dist/baselines/atomizer/trackChangesAcceptor.d.ts +63 -0
- package/dist/baselines/atomizer/trackChangesAcceptor.d.ts.map +1 -0
- package/dist/baselines/atomizer/trackChangesAcceptor.js +254 -0
- package/dist/baselines/atomizer/trackChangesAcceptor.js.map +1 -0
- package/dist/baselines/atomizer/trackChangesAcceptorAst.d.ts +64 -0
- package/dist/baselines/atomizer/trackChangesAcceptorAst.d.ts.map +1 -0
- package/dist/baselines/atomizer/trackChangesAcceptorAst.js +586 -0
- package/dist/baselines/atomizer/trackChangesAcceptorAst.js.map +1 -0
- package/dist/baselines/atomizer/xmlToWmlElement.d.ts +65 -0
- package/dist/baselines/atomizer/xmlToWmlElement.d.ts.map +1 -0
- package/dist/baselines/atomizer/xmlToWmlElement.js +95 -0
- package/dist/baselines/atomizer/xmlToWmlElement.js.map +1 -0
- package/dist/baselines/diffmatch/documentBuilder.d.ts +44 -0
- package/dist/baselines/diffmatch/documentBuilder.d.ts.map +1 -0
- package/dist/baselines/diffmatch/documentBuilder.js +227 -0
- package/dist/baselines/diffmatch/documentBuilder.js.map +1 -0
- package/dist/baselines/diffmatch/paragraphAlignment.d.ts +75 -0
- package/dist/baselines/diffmatch/paragraphAlignment.d.ts.map +1 -0
- package/dist/baselines/diffmatch/paragraphAlignment.js +206 -0
- package/dist/baselines/diffmatch/paragraphAlignment.js.map +1 -0
- package/dist/baselines/diffmatch/pipeline.d.ts +33 -0
- package/dist/baselines/diffmatch/pipeline.d.ts.map +1 -0
- package/dist/baselines/diffmatch/pipeline.js +84 -0
- package/dist/baselines/diffmatch/pipeline.js.map +1 -0
- package/dist/baselines/diffmatch/runDiff.d.ts +53 -0
- package/dist/baselines/diffmatch/runDiff.d.ts.map +1 -0
- package/dist/baselines/diffmatch/runDiff.js +253 -0
- package/dist/baselines/diffmatch/runDiff.js.map +1 -0
- package/dist/baselines/diffmatch/trackChangesRenderer.d.ts +64 -0
- package/dist/baselines/diffmatch/trackChangesRenderer.d.ts.map +1 -0
- package/dist/baselines/diffmatch/trackChangesRenderer.js +178 -0
- package/dist/baselines/diffmatch/trackChangesRenderer.js.map +1 -0
- package/dist/baselines/diffmatch/xmlParser.d.ts +45 -0
- package/dist/baselines/diffmatch/xmlParser.d.ts.map +1 -0
- package/dist/baselines/diffmatch/xmlParser.js +344 -0
- package/dist/baselines/diffmatch/xmlParser.js.map +1 -0
- package/dist/baselines/wmlcomparer/DocxodusWasm.d.ts +51 -0
- package/dist/baselines/wmlcomparer/DocxodusWasm.d.ts.map +1 -0
- package/dist/baselines/wmlcomparer/DocxodusWasm.js +83 -0
- package/dist/baselines/wmlcomparer/DocxodusWasm.js.map +1 -0
- package/dist/baselines/wmlcomparer/DotnetCli.d.ts +40 -0
- package/dist/baselines/wmlcomparer/DotnetCli.d.ts.map +1 -0
- package/dist/baselines/wmlcomparer/DotnetCli.js +135 -0
- package/dist/baselines/wmlcomparer/DotnetCli.js.map +1 -0
- package/dist/benchmark/metrics.d.ts +72 -0
- package/dist/benchmark/metrics.d.ts.map +1 -0
- package/dist/benchmark/metrics.js +45 -0
- package/dist/benchmark/metrics.js.map +1 -0
- package/dist/benchmark/reporter.d.ts +23 -0
- package/dist/benchmark/reporter.d.ts.map +1 -0
- package/dist/benchmark/reporter.js +147 -0
- package/dist/benchmark/reporter.js.map +1 -0
- package/dist/benchmark/runner.d.ts +30 -0
- package/dist/benchmark/runner.d.ts.map +1 -0
- package/dist/benchmark/runner.js +233 -0
- package/dist/benchmark/runner.js.map +1 -0
- package/dist/cli/compare-two.d.ts +28 -0
- package/dist/cli/compare-two.d.ts.map +1 -0
- package/dist/cli/compare-two.js +110 -0
- package/dist/cli/compare-two.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +21 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core-types.d.ts +296 -0
- package/dist/core-types.d.ts.map +1 -0
- package/dist/core-types.js +122 -0
- package/dist/core-types.js.map +1 -0
- package/dist/footnotes.d.ts +144 -0
- package/dist/footnotes.d.ts.map +1 -0
- package/dist/footnotes.js +291 -0
- package/dist/footnotes.js.map +1 -0
- package/dist/format-detection.d.ts +120 -0
- package/dist/format-detection.d.ts.map +1 -0
- package/dist/format-detection.js +338 -0
- package/dist/format-detection.js.map +1 -0
- package/dist/index.d.ts +177 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +55 -0
- package/dist/index.js.map +1 -0
- package/dist/integration/output-artifacts.d.ts +6 -0
- package/dist/integration/output-artifacts.d.ts.map +1 -0
- package/dist/integration/output-artifacts.js +30 -0
- package/dist/integration/output-artifacts.js.map +1 -0
- package/dist/move-detection.d.ts +211 -0
- package/dist/move-detection.d.ts.map +1 -0
- package/dist/move-detection.js +391 -0
- package/dist/move-detection.js.map +1 -0
- package/dist/numbering.d.ts +136 -0
- package/dist/numbering.d.ts.map +1 -0
- package/dist/numbering.js +446 -0
- package/dist/numbering.js.map +1 -0
- package/dist/primitives/accept_changes.d.ts +30 -0
- package/dist/primitives/accept_changes.d.ts.map +1 -0
- package/dist/primitives/accept_changes.js +241 -0
- package/dist/primitives/accept_changes.js.map +1 -0
- package/dist/primitives/bookmarks.d.ts +12 -0
- package/dist/primitives/bookmarks.d.ts.map +1 -0
- package/dist/primitives/bookmarks.js +248 -0
- package/dist/primitives/bookmarks.js.map +1 -0
- package/dist/primitives/comments.d.ts +88 -0
- package/dist/primitives/comments.d.ts.map +1 -0
- package/dist/primitives/comments.js +703 -0
- package/dist/primitives/comments.js.map +1 -0
- package/dist/primitives/document.d.ts +168 -0
- package/dist/primitives/document.d.ts.map +1 -0
- package/dist/primitives/document.js +532 -0
- package/dist/primitives/document.js.map +1 -0
- package/dist/primitives/document_view.d.ts +93 -0
- package/dist/primitives/document_view.d.ts.map +1 -0
- package/dist/primitives/document_view.js +722 -0
- package/dist/primitives/document_view.js.map +1 -0
- package/dist/primitives/dom-helpers.d.ts +94 -0
- package/dist/primitives/dom-helpers.d.ts.map +1 -0
- package/dist/primitives/dom-helpers.js +219 -0
- package/dist/primitives/dom-helpers.js.map +1 -0
- package/dist/primitives/errors.d.ts +7 -0
- package/dist/primitives/errors.d.ts.map +1 -0
- package/dist/primitives/errors.js +10 -0
- package/dist/primitives/errors.js.map +1 -0
- package/dist/primitives/extract_revisions.d.ts +50 -0
- package/dist/primitives/extract_revisions.d.ts.map +1 -0
- package/dist/primitives/extract_revisions.js +340 -0
- package/dist/primitives/extract_revisions.js.map +1 -0
- package/dist/primitives/footnotes.d.ts +37 -0
- package/dist/primitives/footnotes.d.ts.map +1 -0
- package/dist/primitives/footnotes.js +552 -0
- package/dist/primitives/footnotes.js.map +1 -0
- package/dist/primitives/formatting_tags.d.ts +30 -0
- package/dist/primitives/formatting_tags.d.ts.map +1 -0
- package/dist/primitives/formatting_tags.js +217 -0
- package/dist/primitives/formatting_tags.js.map +1 -0
- package/dist/primitives/index.d.ts +26 -0
- package/dist/primitives/index.d.ts.map +1 -0
- package/dist/primitives/index.js +26 -0
- package/dist/primitives/index.js.map +1 -0
- package/dist/primitives/layout.d.ts +53 -0
- package/dist/primitives/layout.d.ts.map +1 -0
- package/dist/primitives/layout.js +178 -0
- package/dist/primitives/layout.js.map +1 -0
- package/dist/primitives/list_labels.d.ts +19 -0
- package/dist/primitives/list_labels.d.ts.map +1 -0
- package/dist/primitives/list_labels.js +57 -0
- package/dist/primitives/list_labels.js.map +1 -0
- package/dist/primitives/matching.d.ts +17 -0
- package/dist/primitives/matching.d.ts.map +1 -0
- package/dist/primitives/matching.js +144 -0
- package/dist/primitives/matching.js.map +1 -0
- package/dist/primitives/merge_runs.d.ts +23 -0
- package/dist/primitives/merge_runs.d.ts.map +1 -0
- package/dist/primitives/merge_runs.js +195 -0
- package/dist/primitives/merge_runs.js.map +1 -0
- package/dist/primitives/namespaces.d.ts +90 -0
- package/dist/primitives/namespaces.d.ts.map +1 -0
- package/dist/primitives/namespaces.js +107 -0
- package/dist/primitives/namespaces.js.map +1 -0
- package/dist/primitives/numbering.d.ts +27 -0
- package/dist/primitives/numbering.d.ts.map +1 -0
- package/dist/primitives/numbering.js +182 -0
- package/dist/primitives/numbering.js.map +1 -0
- package/dist/primitives/prevent_double_elevation.d.ts +18 -0
- package/dist/primitives/prevent_double_elevation.d.ts.map +1 -0
- package/dist/primitives/prevent_double_elevation.js +190 -0
- package/dist/primitives/prevent_double_elevation.js.map +1 -0
- package/dist/primitives/reject_changes.d.ts +27 -0
- package/dist/primitives/reject_changes.d.ts.map +1 -0
- package/dist/primitives/reject_changes.js +371 -0
- package/dist/primitives/reject_changes.js.map +1 -0
- package/dist/primitives/relationships.d.ts +7 -0
- package/dist/primitives/relationships.d.ts.map +1 -0
- package/dist/primitives/relationships.js +24 -0
- package/dist/primitives/relationships.js.map +1 -0
- package/dist/primitives/semantic_tags.d.ts +32 -0
- package/dist/primitives/semantic_tags.d.ts.map +1 -0
- package/dist/primitives/semantic_tags.js +139 -0
- package/dist/primitives/semantic_tags.js.map +1 -0
- package/dist/primitives/simplify_redlines.d.ts +19 -0
- package/dist/primitives/simplify_redlines.d.ts.map +1 -0
- package/dist/primitives/simplify_redlines.js +94 -0
- package/dist/primitives/simplify_redlines.js.map +1 -0
- package/dist/primitives/styles.d.ts +36 -0
- package/dist/primitives/styles.d.ts.map +1 -0
- package/dist/primitives/styles.js +190 -0
- package/dist/primitives/styles.js.map +1 -0
- package/dist/primitives/text.d.ts +27 -0
- package/dist/primitives/text.d.ts.map +1 -0
- package/dist/primitives/text.js +416 -0
- package/dist/primitives/text.js.map +1 -0
- package/dist/primitives/validate_document.d.ts +24 -0
- package/dist/primitives/validate_document.d.ts.map +1 -0
- package/dist/primitives/validate_document.js +147 -0
- package/dist/primitives/validate_document.js.map +1 -0
- package/dist/primitives/xml.d.ts +5 -0
- package/dist/primitives/xml.d.ts.map +1 -0
- package/dist/primitives/xml.js +19 -0
- package/dist/primitives/xml.js.map +1 -0
- package/dist/primitives/zip.d.ts +25 -0
- package/dist/primitives/zip.d.ts.map +1 -0
- package/dist/primitives/zip.js +78 -0
- package/dist/primitives/zip.js.map +1 -0
- package/dist/shared/docx/DocxArchive.d.ts +94 -0
- package/dist/shared/docx/DocxArchive.d.ts.map +1 -0
- package/dist/shared/docx/DocxArchive.js +169 -0
- package/dist/shared/docx/DocxArchive.js.map +1 -0
- package/dist/shared/ooxml/namespaces.d.ts +149 -0
- package/dist/shared/ooxml/namespaces.d.ts.map +1 -0
- package/dist/shared/ooxml/namespaces.js +224 -0
- package/dist/shared/ooxml/namespaces.js.map +1 -0
- package/dist/shared/ooxml/types.d.ts +136 -0
- package/dist/shared/ooxml/types.d.ts.map +1 -0
- package/dist/shared/ooxml/types.js +7 -0
- package/dist/shared/ooxml/types.js.map +1 -0
- package/package.json +63 -6
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"documentReconstructor.js","sourceRoot":"","sources":["../../../src/baselines/atomizer/documentReconstructor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hierarchical LCS Comparison
|
|
3
|
+
*
|
|
4
|
+
* Implements two-level comparison like WmlComparer:
|
|
5
|
+
* 1. First pass: LCS on paragraph GROUPS (coarse alignment)
|
|
6
|
+
* 2. Second pass: LCS on atoms WITHIN matched groups (fine alignment)
|
|
7
|
+
*
|
|
8
|
+
* This prevents atoms from one paragraph matching random fragments
|
|
9
|
+
* in other paragraphs.
|
|
10
|
+
*
|
|
11
|
+
* Additionally, large paragraphs (like definition sections) are split
|
|
12
|
+
* on soft breaks (w:br) to prevent cross-definition contamination.
|
|
13
|
+
*/
|
|
14
|
+
import type { ComparisonUnitAtom } from '../../core-types.js';
|
|
15
|
+
import { type LcsResult } from './atomLcs.js';
|
|
16
|
+
/**
|
|
17
|
+
* Default paragraph-level similarity threshold used for group matching.
|
|
18
|
+
*
|
|
19
|
+
* Lower values favor treating modified paragraphs as aligned pairs (so atom-level
|
|
20
|
+
* comparison can run), while higher values favor whole-paragraph replacement.
|
|
21
|
+
*/
|
|
22
|
+
export declare const DEFAULT_PARAGRAPH_SIMILARITY_THRESHOLD = 0.25;
|
|
23
|
+
/**
|
|
24
|
+
* A group of atoms belonging to the same paragraph.
|
|
25
|
+
* Used for paragraph-level comparison.
|
|
26
|
+
*/
|
|
27
|
+
export interface ComparisonUnitGroup {
|
|
28
|
+
/** Paragraph index from atom.paragraphIndex */
|
|
29
|
+
paragraphIndex: number;
|
|
30
|
+
/** Atoms in this paragraph */
|
|
31
|
+
atoms: ComparisonUnitAtom[];
|
|
32
|
+
/** Hash of concatenated text content for paragraph-level matching */
|
|
33
|
+
textHash: string;
|
|
34
|
+
/** Hash of normalized text used only for matching heuristics */
|
|
35
|
+
normalizedTextHash: string;
|
|
36
|
+
/** Concatenated text content for similarity calculation */
|
|
37
|
+
textContent: string;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Options for hierarchical comparison.
|
|
41
|
+
*/
|
|
42
|
+
export interface HierarchicalCompareOptions {
|
|
43
|
+
/** Minimum similarity (0-1) to consider groups as matching. Default: 0.25 */
|
|
44
|
+
similarityThreshold?: number;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Result of paragraph-level LCS comparison.
|
|
48
|
+
*/
|
|
49
|
+
export interface GroupLcsResult {
|
|
50
|
+
/** Matched paragraph pairs */
|
|
51
|
+
matchedGroups: Array<{
|
|
52
|
+
originalIndex: number;
|
|
53
|
+
revisedIndex: number;
|
|
54
|
+
}>;
|
|
55
|
+
/** Indices of paragraphs only in original (deleted) */
|
|
56
|
+
deletedGroupIndices: number[];
|
|
57
|
+
/** Indices of paragraphs only in revised (inserted) */
|
|
58
|
+
insertedGroupIndices: number[];
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Group atoms by paragraph index.
|
|
62
|
+
*
|
|
63
|
+
* @param atoms - Atoms with paragraphIndex set
|
|
64
|
+
* @returns Array of paragraph groups in document order
|
|
65
|
+
*/
|
|
66
|
+
export declare function groupAtomsByParagraphIndex(atoms: ComparisonUnitAtom[]): ComparisonUnitGroup[];
|
|
67
|
+
/**
|
|
68
|
+
* Group atoms by paragraph, then split large paragraphs on soft breaks (w:br).
|
|
69
|
+
*
|
|
70
|
+
* This handles mega-paragraphs like definition sections where many definitions
|
|
71
|
+
* are in a single paragraph separated by soft breaks. Without this split,
|
|
72
|
+
* the atom-level LCS can match fragments across definition boundaries.
|
|
73
|
+
*
|
|
74
|
+
* @param atoms - Atoms with paragraphIndex set
|
|
75
|
+
* @returns Array of groups, potentially more than the number of paragraphs
|
|
76
|
+
*/
|
|
77
|
+
export declare function groupAtomsByParagraphAndBreaks(atoms: ComparisonUnitAtom[]): ComparisonUnitGroup[];
|
|
78
|
+
/**
|
|
79
|
+
* Compute LCS on paragraph groups with similarity fallback.
|
|
80
|
+
*
|
|
81
|
+
* Two passes:
|
|
82
|
+
* 1. LCS with exact text hash matching (fast path)
|
|
83
|
+
* 2. Similarity matching for unmatched groups (fallback)
|
|
84
|
+
*
|
|
85
|
+
* @param originalGroups - Groups from original document
|
|
86
|
+
* @param revisedGroups - Groups from revised document
|
|
87
|
+
* @param similarityThreshold - Minimum similarity to consider a match (default: 0.25)
|
|
88
|
+
*/
|
|
89
|
+
export declare function computeGroupLcs(originalGroups: ComparisonUnitGroup[], revisedGroups: ComparisonUnitGroup[], similarityThreshold?: number): GroupLcsResult;
|
|
90
|
+
/**
|
|
91
|
+
* Perform hierarchical LCS comparison.
|
|
92
|
+
*
|
|
93
|
+
* Pipeline:
|
|
94
|
+
* 1. Group atoms by paragraph
|
|
95
|
+
* 2. LCS on paragraph groups (coarse alignment) with similarity fallback
|
|
96
|
+
* 3. For matched groups: LCS on atoms within them
|
|
97
|
+
* 4. For unmatched groups: mark all atoms as deleted/inserted
|
|
98
|
+
*
|
|
99
|
+
* @param originalAtoms - Atoms from original document
|
|
100
|
+
* @param revisedAtoms - Atoms from revised document
|
|
101
|
+
* @param options - Comparison options including similarity threshold
|
|
102
|
+
* @returns Combined atom-level LCS result
|
|
103
|
+
*/
|
|
104
|
+
export declare function hierarchicalCompare(originalAtoms: ComparisonUnitAtom[], revisedAtoms: ComparisonUnitAtom[], options?: HierarchicalCompareOptions): LcsResult;
|
|
105
|
+
/**
|
|
106
|
+
* Mark correlation status using hierarchical comparison result.
|
|
107
|
+
*
|
|
108
|
+
* Same as regular markCorrelationStatus but uses hierarchical LCS result.
|
|
109
|
+
*/
|
|
110
|
+
export declare function markHierarchicalCorrelationStatus(original: ComparisonUnitAtom[], revised: ComparisonUnitAtom[], lcsResult: LcsResult): void;
|
|
111
|
+
//# sourceMappingURL=hierarchicalLcs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hierarchicalLcs.d.ts","sourceRoot":"","sources":["../../../src/baselines/atomizer/hierarchicalLcs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAG9D,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAS9D;;;;;GAKG;AACH,eAAO,MAAM,sCAAsC,OAAO,CAAC;AAE3D;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,+CAA+C;IAC/C,cAAc,EAAE,MAAM,CAAC;IACvB,8BAA8B;IAC9B,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,qEAAqE;IACrE,QAAQ,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,kBAAkB,EAAE,MAAM,CAAC;IAC3B,2DAA2D;IAC3D,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,6EAA6E;IAC7E,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,8BAA8B;IAC9B,aAAa,EAAE,KAAK,CAAC;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtE,uDAAuD;IACvD,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,uDAAuD;IACvD,oBAAoB,EAAE,MAAM,EAAE,CAAC;CAChC;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,kBAAkB,EAAE,GAC1B,mBAAmB,EAAE,CA0CvB;AA+BD;;;;;;;;;GASG;AACH,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,kBAAkB,EAAE,GAC1B,mBAAmB,EAAE,CAkDvB;AAyGD;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,cAAc,EAAE,mBAAmB,EAAE,EACrC,aAAa,EAAE,mBAAmB,EAAE,EACpC,mBAAmB,SAAyC,GAC3D,cAAc,CAyGhB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CACjC,aAAa,EAAE,kBAAkB,EAAE,EACnC,YAAY,EAAE,kBAAkB,EAAE,EAClC,OAAO,GAAE,0BAA+B,GACvC,SAAS,CAiIX;AAED;;;;GAIG;AACH,wBAAgB,iCAAiC,CAC/C,QAAQ,EAAE,kBAAkB,EAAE,EAC9B,OAAO,EAAE,kBAAkB,EAAE,EAC7B,SAAS,EAAE,SAAS,GACnB,IAAI,CAsBN"}
|
|
@@ -0,0 +1,469 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hierarchical LCS Comparison
|
|
3
|
+
*
|
|
4
|
+
* Implements two-level comparison like WmlComparer:
|
|
5
|
+
* 1. First pass: LCS on paragraph GROUPS (coarse alignment)
|
|
6
|
+
* 2. Second pass: LCS on atoms WITHIN matched groups (fine alignment)
|
|
7
|
+
*
|
|
8
|
+
* This prevents atoms from one paragraph matching random fragments
|
|
9
|
+
* in other paragraphs.
|
|
10
|
+
*
|
|
11
|
+
* Additionally, large paragraphs (like definition sections) are split
|
|
12
|
+
* on soft breaks (w:br) to prevent cross-definition contamination.
|
|
13
|
+
*/
|
|
14
|
+
import { CorrelationStatus } from '../../core-types.js';
|
|
15
|
+
import { sha1, EMPTY_PARAGRAPH_TAG } from '../../atomizer.js';
|
|
16
|
+
import { computeAtomLcs } from './atomLcs.js';
|
|
17
|
+
import { debug } from './debug.js';
|
|
18
|
+
/**
|
|
19
|
+
* Maximum atoms in a group before we split on w:br boundaries.
|
|
20
|
+
* This handles mega-paragraphs like definition sections.
|
|
21
|
+
*/
|
|
22
|
+
const MAX_ATOMS_BEFORE_SPLIT = 50;
|
|
23
|
+
/**
|
|
24
|
+
* Default paragraph-level similarity threshold used for group matching.
|
|
25
|
+
*
|
|
26
|
+
* Lower values favor treating modified paragraphs as aligned pairs (so atom-level
|
|
27
|
+
* comparison can run), while higher values favor whole-paragraph replacement.
|
|
28
|
+
*/
|
|
29
|
+
export const DEFAULT_PARAGRAPH_SIMILARITY_THRESHOLD = 0.25;
|
|
30
|
+
/**
|
|
31
|
+
* Group atoms by paragraph index.
|
|
32
|
+
*
|
|
33
|
+
* @param atoms - Atoms with paragraphIndex set
|
|
34
|
+
* @returns Array of paragraph groups in document order
|
|
35
|
+
*/
|
|
36
|
+
export function groupAtomsByParagraphIndex(atoms) {
|
|
37
|
+
const groups = new Map();
|
|
38
|
+
for (const atom of atoms) {
|
|
39
|
+
const idx = atom.paragraphIndex ?? -1;
|
|
40
|
+
if (!groups.has(idx)) {
|
|
41
|
+
groups.set(idx, []);
|
|
42
|
+
}
|
|
43
|
+
groups.get(idx).push(atom);
|
|
44
|
+
}
|
|
45
|
+
// Convert to array sorted by paragraph index
|
|
46
|
+
const result = [];
|
|
47
|
+
const sortedIndices = [...groups.keys()].sort((a, b) => a - b);
|
|
48
|
+
for (const idx of sortedIndices) {
|
|
49
|
+
const atoms = groups.get(idx);
|
|
50
|
+
const textContent = extractGroupTextContent(atoms);
|
|
51
|
+
// For empty paragraph groups, use the atom's sha1Hash (which has context)
|
|
52
|
+
// instead of the empty text hash. This prevents all empty paragraphs from
|
|
53
|
+
// matching each other regardless of position.
|
|
54
|
+
const isEmptyParagraphGroup = atoms.length === 1 &&
|
|
55
|
+
atoms[0].contentElement.tagName === EMPTY_PARAGRAPH_TAG;
|
|
56
|
+
const textHash = isEmptyParagraphGroup
|
|
57
|
+
? atoms[0].sha1Hash // Use context-aware atom hash
|
|
58
|
+
: sha1(textContent);
|
|
59
|
+
const normalizedTextHash = isEmptyParagraphGroup
|
|
60
|
+
? textHash
|
|
61
|
+
: sha1(normalizeText(textContent));
|
|
62
|
+
result.push({
|
|
63
|
+
paragraphIndex: idx,
|
|
64
|
+
atoms,
|
|
65
|
+
textHash,
|
|
66
|
+
normalizedTextHash,
|
|
67
|
+
textContent,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
return result;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Create a ComparisonUnitGroup from a list of atoms.
|
|
74
|
+
*/
|
|
75
|
+
function createGroup(atoms, groupIndex) {
|
|
76
|
+
const textContent = extractGroupTextContent(atoms);
|
|
77
|
+
// For empty paragraph groups, use the atom's sha1Hash (which has context)
|
|
78
|
+
const isEmptyGroup = atoms.length === 1 &&
|
|
79
|
+
atoms[0].contentElement.tagName === EMPTY_PARAGRAPH_TAG;
|
|
80
|
+
const textHash = isEmptyGroup
|
|
81
|
+
? atoms[0].sha1Hash
|
|
82
|
+
: sha1(textContent);
|
|
83
|
+
const normalizedTextHash = isEmptyGroup
|
|
84
|
+
? textHash
|
|
85
|
+
: sha1(normalizeText(textContent));
|
|
86
|
+
return {
|
|
87
|
+
paragraphIndex: groupIndex,
|
|
88
|
+
atoms,
|
|
89
|
+
textHash,
|
|
90
|
+
normalizedTextHash,
|
|
91
|
+
textContent,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Group atoms by paragraph, then split large paragraphs on soft breaks (w:br).
|
|
96
|
+
*
|
|
97
|
+
* This handles mega-paragraphs like definition sections where many definitions
|
|
98
|
+
* are in a single paragraph separated by soft breaks. Without this split,
|
|
99
|
+
* the atom-level LCS can match fragments across definition boundaries.
|
|
100
|
+
*
|
|
101
|
+
* @param atoms - Atoms with paragraphIndex set
|
|
102
|
+
* @returns Array of groups, potentially more than the number of paragraphs
|
|
103
|
+
*/
|
|
104
|
+
export function groupAtomsByParagraphAndBreaks(atoms) {
|
|
105
|
+
// First, group by paragraph index
|
|
106
|
+
const paragraphMap = new Map();
|
|
107
|
+
for (const atom of atoms) {
|
|
108
|
+
const idx = atom.paragraphIndex ?? -1;
|
|
109
|
+
if (!paragraphMap.has(idx)) {
|
|
110
|
+
paragraphMap.set(idx, []);
|
|
111
|
+
}
|
|
112
|
+
paragraphMap.get(idx).push(atom);
|
|
113
|
+
}
|
|
114
|
+
// Convert to array sorted by paragraph index
|
|
115
|
+
const sortedIndices = [...paragraphMap.keys()].sort((a, b) => a - b);
|
|
116
|
+
// Now process each paragraph, splitting large ones on w:br
|
|
117
|
+
const result = [];
|
|
118
|
+
let groupIndex = 0;
|
|
119
|
+
for (const paraIdx of sortedIndices) {
|
|
120
|
+
const paraAtoms = paragraphMap.get(paraIdx);
|
|
121
|
+
// Small paragraph - keep as-is
|
|
122
|
+
if (paraAtoms.length <= MAX_ATOMS_BEFORE_SPLIT) {
|
|
123
|
+
result.push(createGroup(paraAtoms, groupIndex++));
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
// Large paragraph - split on w:br boundaries
|
|
127
|
+
let currentAtoms = [];
|
|
128
|
+
for (const atom of paraAtoms) {
|
|
129
|
+
currentAtoms.push(atom);
|
|
130
|
+
// Split AFTER w:br (keep the break with the preceding content)
|
|
131
|
+
if (atom.contentElement.tagName === 'w:br') {
|
|
132
|
+
if (currentAtoms.length > 0) {
|
|
133
|
+
result.push(createGroup(currentAtoms, groupIndex++));
|
|
134
|
+
currentAtoms = [];
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// Don't forget trailing atoms after last break
|
|
139
|
+
if (currentAtoms.length > 0) {
|
|
140
|
+
result.push(createGroup(currentAtoms, groupIndex++));
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return result;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Extract concatenated text content from a group of atoms.
|
|
147
|
+
* Used for paragraph-level comparison and similarity calculation.
|
|
148
|
+
*/
|
|
149
|
+
function extractGroupTextContent(atoms) {
|
|
150
|
+
const textParts = [];
|
|
151
|
+
for (const atom of atoms) {
|
|
152
|
+
// Treat run separators as visible token boundaries for similarity purposes.
|
|
153
|
+
if (atom.contentElement.tagName === 'w:br' ||
|
|
154
|
+
atom.contentElement.tagName === 'w:cr' ||
|
|
155
|
+
atom.contentElement.tagName === 'w:tab') {
|
|
156
|
+
textParts.push(' ');
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
const text = atom.contentElement.textContent;
|
|
160
|
+
if (text) {
|
|
161
|
+
textParts.push(text);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return textParts.join('');
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Normalize text for similarity comparison.
|
|
168
|
+
* - Trim whitespace
|
|
169
|
+
* - Collapse multiple spaces
|
|
170
|
+
* - Lowercase for case-insensitive comparison
|
|
171
|
+
*/
|
|
172
|
+
function normalizeText(text) {
|
|
173
|
+
return text
|
|
174
|
+
.trim()
|
|
175
|
+
.replace(/\s+/g, ' ')
|
|
176
|
+
.toLowerCase();
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Check if a group contains only empty paragraph atoms.
|
|
180
|
+
*/
|
|
181
|
+
function isEmptyParagraphGroup(group) {
|
|
182
|
+
return group.atoms.length === 1 &&
|
|
183
|
+
group.atoms[0].contentElement.tagName === EMPTY_PARAGRAPH_TAG;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Paragraph groups are considered coarse-equal if:
|
|
187
|
+
* 1) Their raw text hash matches exactly, or
|
|
188
|
+
* 2) Their normalized-text hash matches (heuristic assist only).
|
|
189
|
+
*
|
|
190
|
+
* Empty paragraphs intentionally require strict hash equality.
|
|
191
|
+
*/
|
|
192
|
+
function groupsCoarselyEqual(a, b) {
|
|
193
|
+
if (a.textHash === b.textHash) {
|
|
194
|
+
return true;
|
|
195
|
+
}
|
|
196
|
+
if (isEmptyParagraphGroup(a) || isEmptyParagraphGroup(b)) {
|
|
197
|
+
return false;
|
|
198
|
+
}
|
|
199
|
+
return a.normalizedTextHash === b.normalizedTextHash;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Compute similarity between two groups using Jaccard index on words.
|
|
203
|
+
*
|
|
204
|
+
* @returns Value between 0 (completely different) and 1 (identical)
|
|
205
|
+
*/
|
|
206
|
+
function computeGroupSimilarity(a, b) {
|
|
207
|
+
// For empty paragraph groups, only consider them similar if their
|
|
208
|
+
// context-aware hashes match. This prevents empty paragraphs from
|
|
209
|
+
// matching each other regardless of position.
|
|
210
|
+
if (isEmptyParagraphGroup(a) || isEmptyParagraphGroup(b)) {
|
|
211
|
+
// If one is empty and the other isn't, they're not similar
|
|
212
|
+
if (isEmptyParagraphGroup(a) !== isEmptyParagraphGroup(b)) {
|
|
213
|
+
return 0;
|
|
214
|
+
}
|
|
215
|
+
// Both are empty paragraph groups - compare their context-aware hashes
|
|
216
|
+
// They must match exactly (return 1) or not at all (return 0)
|
|
217
|
+
return a.textHash === b.textHash ? 1 : 0;
|
|
218
|
+
}
|
|
219
|
+
const textA = normalizeText(a.textContent);
|
|
220
|
+
const textB = normalizeText(b.textContent);
|
|
221
|
+
const wordsA = new Set(textA.split(' ').filter(w => w.length > 0));
|
|
222
|
+
const wordsB = new Set(textB.split(' ').filter(w => w.length > 0));
|
|
223
|
+
if (wordsA.size === 0 && wordsB.size === 0) {
|
|
224
|
+
return 1; // Both empty
|
|
225
|
+
}
|
|
226
|
+
if (wordsA.size === 0 || wordsB.size === 0) {
|
|
227
|
+
return 0; // One empty
|
|
228
|
+
}
|
|
229
|
+
const intersection = new Set([...wordsA].filter(x => wordsB.has(x)));
|
|
230
|
+
const union = new Set([...wordsA, ...wordsB]);
|
|
231
|
+
return intersection.size / union.size;
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Compute LCS on paragraph groups with similarity fallback.
|
|
235
|
+
*
|
|
236
|
+
* Two passes:
|
|
237
|
+
* 1. LCS with exact text hash matching (fast path)
|
|
238
|
+
* 2. Similarity matching for unmatched groups (fallback)
|
|
239
|
+
*
|
|
240
|
+
* @param originalGroups - Groups from original document
|
|
241
|
+
* @param revisedGroups - Groups from revised document
|
|
242
|
+
* @param similarityThreshold - Minimum similarity to consider a match (default: 0.25)
|
|
243
|
+
*/
|
|
244
|
+
export function computeGroupLcs(originalGroups, revisedGroups, similarityThreshold = DEFAULT_PARAGRAPH_SIMILARITY_THRESHOLD) {
|
|
245
|
+
const n = originalGroups.length;
|
|
246
|
+
const m = revisedGroups.length;
|
|
247
|
+
// === Pass 1: LCS with exact hash and normalized-hash matching ===
|
|
248
|
+
const dp = Array(n + 1)
|
|
249
|
+
.fill(null)
|
|
250
|
+
.map(() => Array(m + 1).fill(0));
|
|
251
|
+
for (let i = 1; i <= n; i++) {
|
|
252
|
+
for (let j = 1; j <= m; j++) {
|
|
253
|
+
if (groupsCoarselyEqual(originalGroups[i - 1], revisedGroups[j - 1])) {
|
|
254
|
+
dp[i][j] = dp[i - 1][j - 1] + 1;
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
// Backtrack to find matched groups
|
|
262
|
+
const matchedGroups = [];
|
|
263
|
+
let i = n;
|
|
264
|
+
let j = m;
|
|
265
|
+
while (i > 0 && j > 0) {
|
|
266
|
+
if (groupsCoarselyEqual(originalGroups[i - 1], revisedGroups[j - 1])) {
|
|
267
|
+
matchedGroups.unshift({ originalIndex: i - 1, revisedIndex: j - 1 });
|
|
268
|
+
i--;
|
|
269
|
+
j--;
|
|
270
|
+
}
|
|
271
|
+
else if (dp[i - 1][j] > dp[i][j - 1]) {
|
|
272
|
+
i--;
|
|
273
|
+
}
|
|
274
|
+
else {
|
|
275
|
+
j--;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
// Find initially unmatched indices
|
|
279
|
+
const matchedOriginal = new Set(matchedGroups.map((m) => m.originalIndex));
|
|
280
|
+
const matchedRevised = new Set(matchedGroups.map((m) => m.revisedIndex));
|
|
281
|
+
let unmatchedOriginal = [];
|
|
282
|
+
for (let idx = 0; idx < n; idx++) {
|
|
283
|
+
if (!matchedOriginal.has(idx)) {
|
|
284
|
+
unmatchedOriginal.push(idx);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
let unmatchedRevised = [];
|
|
288
|
+
for (let idx = 0; idx < m; idx++) {
|
|
289
|
+
if (!matchedRevised.has(idx)) {
|
|
290
|
+
unmatchedRevised.push(idx);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
// === Pass 2: Similarity matching for unmatched groups ===
|
|
294
|
+
// Try to find near-matches for paragraphs that were modified significantly
|
|
295
|
+
const similarityMatches = [];
|
|
296
|
+
for (const origIdx of unmatchedOriginal) {
|
|
297
|
+
const origGroup = originalGroups[origIdx];
|
|
298
|
+
let bestMatch = null;
|
|
299
|
+
for (const revIdx of unmatchedRevised) {
|
|
300
|
+
const revGroup = revisedGroups[revIdx];
|
|
301
|
+
const similarity = computeGroupSimilarity(origGroup, revGroup);
|
|
302
|
+
if (similarity >= similarityThreshold) {
|
|
303
|
+
if (!bestMatch || similarity > bestMatch.similarity) {
|
|
304
|
+
bestMatch = { revisedIndex: revIdx, similarity };
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
if (bestMatch) {
|
|
309
|
+
similarityMatches.push({ originalIndex: origIdx, revisedIndex: bestMatch.revisedIndex });
|
|
310
|
+
// Remove from unmatched revised
|
|
311
|
+
unmatchedRevised = unmatchedRevised.filter(idx => idx !== bestMatch.revisedIndex);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
// Combine exact matches and similarity matches
|
|
315
|
+
const allMatches = [...matchedGroups, ...similarityMatches];
|
|
316
|
+
// Update matched sets
|
|
317
|
+
for (const match of similarityMatches) {
|
|
318
|
+
matchedOriginal.add(match.originalIndex);
|
|
319
|
+
matchedRevised.add(match.revisedIndex);
|
|
320
|
+
}
|
|
321
|
+
// Final deleted and inserted indices
|
|
322
|
+
const deletedGroupIndices = [];
|
|
323
|
+
for (let idx = 0; idx < n; idx++) {
|
|
324
|
+
if (!matchedOriginal.has(idx)) {
|
|
325
|
+
deletedGroupIndices.push(idx);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
const insertedGroupIndices = [];
|
|
329
|
+
for (let idx = 0; idx < m; idx++) {
|
|
330
|
+
if (!matchedRevised.has(idx)) {
|
|
331
|
+
insertedGroupIndices.push(idx);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
return { matchedGroups: allMatches, deletedGroupIndices, insertedGroupIndices };
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Perform hierarchical LCS comparison.
|
|
338
|
+
*
|
|
339
|
+
* Pipeline:
|
|
340
|
+
* 1. Group atoms by paragraph
|
|
341
|
+
* 2. LCS on paragraph groups (coarse alignment) with similarity fallback
|
|
342
|
+
* 3. For matched groups: LCS on atoms within them
|
|
343
|
+
* 4. For unmatched groups: mark all atoms as deleted/inserted
|
|
344
|
+
*
|
|
345
|
+
* @param originalAtoms - Atoms from original document
|
|
346
|
+
* @param revisedAtoms - Atoms from revised document
|
|
347
|
+
* @param options - Comparison options including similarity threshold
|
|
348
|
+
* @returns Combined atom-level LCS result
|
|
349
|
+
*/
|
|
350
|
+
export function hierarchicalCompare(originalAtoms, revisedAtoms, options = {}) {
|
|
351
|
+
const { similarityThreshold = DEFAULT_PARAGRAPH_SIMILARITY_THRESHOLD } = options;
|
|
352
|
+
// Step 1: Group atoms by paragraph, splitting large paragraphs on w:br
|
|
353
|
+
const originalGroups = groupAtomsByParagraphAndBreaks(originalAtoms);
|
|
354
|
+
const revisedGroups = groupAtomsByParagraphAndBreaks(revisedAtoms);
|
|
355
|
+
// Count empty paragraph groups
|
|
356
|
+
const origEmptyGroups = originalGroups.filter(g => isEmptyParagraphGroup(g));
|
|
357
|
+
const revEmptyGroups = revisedGroups.filter(g => isEmptyParagraphGroup(g));
|
|
358
|
+
debug('hierarchicalLcs', `${originalGroups.length} original groups (${origEmptyGroups.length} empty), ${revisedGroups.length} revised groups (${revEmptyGroups.length} empty)`);
|
|
359
|
+
// Step 2: LCS on paragraph groups with similarity fallback
|
|
360
|
+
const groupLcs = computeGroupLcs(originalGroups, revisedGroups, similarityThreshold);
|
|
361
|
+
// Count empty paragraphs in each category
|
|
362
|
+
const matchedEmptyCount = groupLcs.matchedGroups.filter(m => isEmptyParagraphGroup(originalGroups[m.originalIndex])).length;
|
|
363
|
+
const deletedEmptyCount = groupLcs.deletedGroupIndices.filter(i => isEmptyParagraphGroup(originalGroups[i])).length;
|
|
364
|
+
const insertedEmptyCount = groupLcs.insertedGroupIndices.filter(i => isEmptyParagraphGroup(revisedGroups[i])).length;
|
|
365
|
+
debug('hierarchicalLcs', `Group LCS: ${groupLcs.matchedGroups.length} matched (${matchedEmptyCount} empty), ${groupLcs.deletedGroupIndices.length} deleted (${deletedEmptyCount} empty), ${groupLcs.insertedGroupIndices.length} inserted (${insertedEmptyCount} empty)`);
|
|
366
|
+
// Step 3: Build combined atom-level result
|
|
367
|
+
const allMatches = [];
|
|
368
|
+
const deletedIndices = [];
|
|
369
|
+
const insertedIndices = [];
|
|
370
|
+
// Build atom index maps for quick lookup
|
|
371
|
+
const origAtomToIndex = new Map();
|
|
372
|
+
for (let i = 0; i < originalAtoms.length; i++) {
|
|
373
|
+
origAtomToIndex.set(originalAtoms[i], i);
|
|
374
|
+
}
|
|
375
|
+
const revAtomToIndex = new Map();
|
|
376
|
+
for (let i = 0; i < revisedAtoms.length; i++) {
|
|
377
|
+
revAtomToIndex.set(revisedAtoms[i], i);
|
|
378
|
+
}
|
|
379
|
+
// For matched groups: do atom-level LCS within them
|
|
380
|
+
for (const match of groupLcs.matchedGroups) {
|
|
381
|
+
const origGroup = originalGroups[match.originalIndex];
|
|
382
|
+
const revGroup = revisedGroups[match.revisedIndex];
|
|
383
|
+
// Check if this was an exact match (hash) or similarity match
|
|
384
|
+
const isExactMatch = origGroup.textHash === revGroup.textHash;
|
|
385
|
+
// For LOW similarity matches (< threshold), skip atom LCS to avoid spurious
|
|
386
|
+
// matches on common fragments. Use the same threshold as paragraph matching.
|
|
387
|
+
const similarity = isExactMatch ? 1.0 : computeGroupSimilarity(origGroup, revGroup);
|
|
388
|
+
const useAtomLcs = similarity >= similarityThreshold;
|
|
389
|
+
if (!isExactMatch && !useAtomLcs) {
|
|
390
|
+
debug('hierarchicalLcs', `Low similarity match (${similarity.toFixed(2)}): origGroup[${match.originalIndex}] "${origGroup.textContent.slice(0, 50)}..." vs revGroup[${match.revisedIndex}] "${revGroup.textContent.slice(0, 50)}..."`);
|
|
391
|
+
}
|
|
392
|
+
if (isExactMatch || useAtomLcs) {
|
|
393
|
+
// High-similarity match: do atom-level LCS for fine-grained changes
|
|
394
|
+
const withinLcs = computeAtomLcs(origGroup.atoms, revGroup.atoms);
|
|
395
|
+
// Translate local indices to global indices
|
|
396
|
+
for (const atomMatch of withinLcs.matches) {
|
|
397
|
+
const origAtom = origGroup.atoms[atomMatch.originalIndex];
|
|
398
|
+
const revAtom = revGroup.atoms[atomMatch.revisedIndex];
|
|
399
|
+
allMatches.push({
|
|
400
|
+
originalIndex: origAtomToIndex.get(origAtom),
|
|
401
|
+
revisedIndex: revAtomToIndex.get(revAtom),
|
|
402
|
+
});
|
|
403
|
+
}
|
|
404
|
+
for (const localIdx of withinLcs.deletedIndices) {
|
|
405
|
+
const origAtom = origGroup.atoms[localIdx];
|
|
406
|
+
deletedIndices.push(origAtomToIndex.get(origAtom));
|
|
407
|
+
}
|
|
408
|
+
for (const localIdx of withinLcs.insertedIndices) {
|
|
409
|
+
const revAtom = revGroup.atoms[localIdx];
|
|
410
|
+
insertedIndices.push(revAtomToIndex.get(revAtom));
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
else {
|
|
414
|
+
// Low similarity match: treat entire paragraph as replaced
|
|
415
|
+
// This prevents spurious atom matches on common fragments
|
|
416
|
+
for (const atom of origGroup.atoms) {
|
|
417
|
+
deletedIndices.push(origAtomToIndex.get(atom));
|
|
418
|
+
}
|
|
419
|
+
for (const atom of revGroup.atoms) {
|
|
420
|
+
insertedIndices.push(revAtomToIndex.get(atom));
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
// For deleted groups: mark all atoms as deleted
|
|
425
|
+
for (const groupIdx of groupLcs.deletedGroupIndices) {
|
|
426
|
+
const group = originalGroups[groupIdx];
|
|
427
|
+
for (const atom of group.atoms) {
|
|
428
|
+
deletedIndices.push(origAtomToIndex.get(atom));
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
// For inserted groups: mark all atoms as inserted
|
|
432
|
+
for (const groupIdx of groupLcs.insertedGroupIndices) {
|
|
433
|
+
const group = revisedGroups[groupIdx];
|
|
434
|
+
for (const atom of group.atoms) {
|
|
435
|
+
insertedIndices.push(revAtomToIndex.get(atom));
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
debug('hierarchicalLcs', `Hierarchical result: ${allMatches.length} matches, ${deletedIndices.length} deleted, ${insertedIndices.length} inserted`);
|
|
439
|
+
return {
|
|
440
|
+
matches: allMatches,
|
|
441
|
+
deletedIndices,
|
|
442
|
+
insertedIndices,
|
|
443
|
+
};
|
|
444
|
+
}
|
|
445
|
+
/**
|
|
446
|
+
* Mark correlation status using hierarchical comparison result.
|
|
447
|
+
*
|
|
448
|
+
* Same as regular markCorrelationStatus but uses hierarchical LCS result.
|
|
449
|
+
*/
|
|
450
|
+
export function markHierarchicalCorrelationStatus(original, revised, lcsResult) {
|
|
451
|
+
// Mark matched atoms as Equal and link them
|
|
452
|
+
for (const match of lcsResult.matches) {
|
|
453
|
+
const origAtom = original[match.originalIndex];
|
|
454
|
+
const revAtom = revised[match.revisedIndex];
|
|
455
|
+
origAtom.correlationStatus = CorrelationStatus.Equal;
|
|
456
|
+
revAtom.correlationStatus = CorrelationStatus.Equal;
|
|
457
|
+
// Link revised atom to original for format change detection
|
|
458
|
+
revAtom.comparisonUnitAtomBefore = origAtom;
|
|
459
|
+
}
|
|
460
|
+
// Mark deleted atoms
|
|
461
|
+
for (const idx of lcsResult.deletedIndices) {
|
|
462
|
+
original[idx].correlationStatus = CorrelationStatus.Deleted;
|
|
463
|
+
}
|
|
464
|
+
// Mark inserted atoms
|
|
465
|
+
for (const idx of lcsResult.insertedIndices) {
|
|
466
|
+
revised[idx].correlationStatus = CorrelationStatus.Inserted;
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
//# sourceMappingURL=hierarchicalLcs.js.map
|