@usejunior/docx-core 0.15.0 → 0.17.0
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 +18 -83
- package/dist/.tsbuildinfo +1 -1
- package/dist/cli/conformance-adapter.d.ts +14 -0
- package/dist/cli/conformance-adapter.d.ts.map +1 -1
- package/dist/cli/conformance-adapter.js +104 -12
- package/dist/cli/conformance-adapter.js.map +1 -1
- package/dist/footnotes.d.ts +7 -5
- package/dist/footnotes.d.ts.map +1 -1
- package/dist/footnotes.js +7 -5
- package/dist/footnotes.js.map +1 -1
- package/dist/generated/ecma-376-vocabulary.d.ts +93 -0
- package/dist/generated/ecma-376-vocabulary.d.ts.map +1 -0
- package/dist/generated/ecma-376-vocabulary.js +87 -0
- package/dist/generated/ecma-376-vocabulary.js.map +1 -0
- package/dist/generation/compile.js +2 -2
- package/dist/generation/compile.js.map +1 -1
- package/dist/generation/emit/comments-part.d.ts +2 -0
- package/dist/generation/emit/comments-part.d.ts.map +1 -1
- package/dist/generation/emit/comments-part.js +2 -0
- package/dist/generation/emit/comments-part.js.map +1 -1
- package/dist/generation/emit/paragraph.d.ts +3 -0
- package/dist/generation/emit/paragraph.d.ts.map +1 -1
- package/dist/generation/emit/paragraph.js +3 -0
- package/dist/generation/emit/paragraph.js.map +1 -1
- package/dist/generation/emit/run.d.ts.map +1 -1
- package/dist/generation/emit/run.js +6 -1
- package/dist/generation/emit/run.js.map +1 -1
- package/dist/generation/emit/settings-part.d.ts +12 -3
- package/dist/generation/emit/settings-part.d.ts.map +1 -1
- package/dist/generation/emit/settings-part.js +23 -5
- package/dist/generation/emit/settings-part.js.map +1 -1
- package/dist/generation/ordering.d.ts +3 -1
- package/dist/generation/ordering.d.ts.map +1 -1
- package/dist/generation/ordering.js +3 -1
- package/dist/generation/ordering.js.map +1 -1
- package/dist/generation/schema-enum-domains.d.ts +27 -0
- package/dist/generation/schema-enum-domains.d.ts.map +1 -0
- package/dist/generation/schema-enum-domains.js +69 -0
- package/dist/generation/schema-enum-domains.js.map +1 -0
- package/dist/generation/structural-checks.js +7 -1
- package/dist/generation/structural-checks.js.map +1 -1
- package/dist/generation/validate-spec.d.ts.map +1 -1
- package/dist/generation/validate-spec.js +149 -31
- package/dist/generation/validate-spec.js.map +1 -1
- package/dist/index.d.ts +7 -24
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -46
- package/dist/index.js.map +1 -1
- package/dist/primitives/accept_ai_edits.d.ts +87 -0
- package/dist/primitives/accept_ai_edits.d.ts.map +1 -0
- package/dist/primitives/accept_ai_edits.js +253 -0
- package/dist/primitives/accept_ai_edits.js.map +1 -0
- package/dist/primitives/accept_changes.d.ts +36 -3
- package/dist/primitives/accept_changes.d.ts.map +1 -1
- package/dist/primitives/accept_changes.js +67 -31
- package/dist/primitives/accept_changes.js.map +1 -1
- package/dist/primitives/bookmarks.d.ts +44 -0
- package/dist/primitives/bookmarks.d.ts.map +1 -1
- package/dist/primitives/bookmarks.js +149 -11
- package/dist/primitives/bookmarks.js.map +1 -1
- package/dist/primitives/document.d.ts +53 -1
- package/dist/primitives/document.d.ts.map +1 -1
- package/dist/primitives/document.js +146 -2
- package/dist/primitives/document.js.map +1 -1
- package/dist/primitives/dom-helpers.d.ts.map +1 -1
- package/dist/primitives/dom-helpers.js +7 -2
- package/dist/primitives/dom-helpers.js.map +1 -1
- package/dist/primitives/index.d.ts +2 -1
- package/dist/primitives/index.d.ts.map +1 -1
- package/dist/primitives/index.js +2 -1
- package/dist/primitives/index.js.map +1 -1
- package/dist/primitives/layout.d.ts.map +1 -1
- package/dist/primitives/layout.js +41 -1
- package/dist/primitives/layout.js.map +1 -1
- package/dist/primitives/namespaces.d.ts +2 -0
- package/dist/primitives/namespaces.d.ts.map +1 -1
- package/dist/primitives/namespaces.js +2 -0
- package/dist/primitives/namespaces.js.map +1 -1
- package/dist/primitives/reject_changes.d.ts +21 -2
- package/dist/primitives/reject_changes.d.ts.map +1 -1
- package/dist/primitives/reject_changes.js +71 -31
- package/dist/primitives/reject_changes.js.map +1 -1
- package/dist/primitives/relationships.d.ts +33 -0
- package/dist/primitives/relationships.d.ts.map +1 -1
- package/dist/primitives/relationships.js +84 -1
- package/dist/primitives/relationships.js.map +1 -1
- package/dist/primitives/sectPrAudit.d.ts +11 -2
- package/dist/primitives/sectPrAudit.d.ts.map +1 -1
- package/dist/primitives/sectPrAudit.js +148 -23
- package/dist/primitives/sectPrAudit.js.map +1 -1
- package/dist/primitives/track-changes-emitter.d.ts +4 -0
- package/dist/primitives/track-changes-emitter.d.ts.map +1 -1
- package/dist/primitives/track-changes-emitter.js +5 -2
- package/dist/primitives/track-changes-emitter.js.map +1 -1
- package/dist/primitives/validate_ai_revisions.d.ts.map +1 -1
- package/dist/primitives/validate_ai_revisions.js +13 -5
- package/dist/primitives/validate_ai_revisions.js.map +1 -1
- package/dist/primitives/zip.d.ts.map +1 -1
- package/dist/primitives/zip.js +6 -2
- package/dist/primitives/zip.js.map +1 -1
- package/dist/shared/field-structure.d.ts +6 -0
- package/dist/shared/field-structure.d.ts.map +1 -1
- package/dist/shared/field-structure.js +6 -0
- package/dist/shared/field-structure.js.map +1 -1
- package/package.json +4 -8
- package/dist/atomizer.d.ts +0 -273
- package/dist/atomizer.d.ts.map +0 -1
- package/dist/atomizer.js +0 -1002
- package/dist/atomizer.js.map +0 -1
- package/dist/baselines/atomizer/atomLcs.d.ts +0 -82
- package/dist/baselines/atomizer/atomLcs.d.ts.map +0 -1
- package/dist/baselines/atomizer/atomLcs.js +0 -376
- package/dist/baselines/atomizer/atomLcs.js.map +0 -1
- package/dist/baselines/atomizer/auxiliaryIdCollision.d.ts +0 -99
- package/dist/baselines/atomizer/auxiliaryIdCollision.d.ts.map +0 -1
- package/dist/baselines/atomizer/auxiliaryIdCollision.js +0 -415
- package/dist/baselines/atomizer/auxiliaryIdCollision.js.map +0 -1
- package/dist/baselines/atomizer/consumerCompatibility.d.ts +0 -2
- package/dist/baselines/atomizer/consumerCompatibility.d.ts.map +0 -1
- package/dist/baselines/atomizer/consumerCompatibility.js +0 -188
- package/dist/baselines/atomizer/consumerCompatibility.js.map +0 -1
- package/dist/baselines/atomizer/debug.d.ts +0 -41
- package/dist/baselines/atomizer/debug.d.ts.map +0 -1
- package/dist/baselines/atomizer/debug.js +0 -85
- package/dist/baselines/atomizer/debug.js.map +0 -1
- package/dist/baselines/atomizer/documentReconstructor.d.ts +0 -75
- package/dist/baselines/atomizer/documentReconstructor.d.ts.map +0 -1
- package/dist/baselines/atomizer/documentReconstructor.js +0 -1449
- package/dist/baselines/atomizer/documentReconstructor.js.map +0 -1
- package/dist/baselines/atomizer/formattingFidelity.d.ts +0 -99
- package/dist/baselines/atomizer/formattingFidelity.d.ts.map +0 -1
- package/dist/baselines/atomizer/formattingFidelity.js +0 -449
- package/dist/baselines/atomizer/formattingFidelity.js.map +0 -1
- package/dist/baselines/atomizer/hierarchicalLcs.d.ts +0 -121
- package/dist/baselines/atomizer/hierarchicalLcs.d.ts.map +0 -1
- package/dist/baselines/atomizer/hierarchicalLcs.js +0 -753
- package/dist/baselines/atomizer/hierarchicalLcs.js.map +0 -1
- package/dist/baselines/atomizer/inPlaceModifier-bookmarks.d.ts +0 -37
- package/dist/baselines/atomizer/inPlaceModifier-bookmarks.d.ts.map +0 -1
- package/dist/baselines/atomizer/inPlaceModifier-bookmarks.js +0 -189
- package/dist/baselines/atomizer/inPlaceModifier-bookmarks.js.map +0 -1
- package/dist/baselines/atomizer/inPlaceModifier-containers.d.ts +0 -74
- package/dist/baselines/atomizer/inPlaceModifier-containers.d.ts.map +0 -1
- package/dist/baselines/atomizer/inPlaceModifier-containers.js +0 -171
- package/dist/baselines/atomizer/inPlaceModifier-containers.js.map +0 -1
- package/dist/baselines/atomizer/inPlaceModifier-deletion.d.ts +0 -88
- package/dist/baselines/atomizer/inPlaceModifier-deletion.d.ts.map +0 -1
- package/dist/baselines/atomizer/inPlaceModifier-deletion.js +0 -326
- package/dist/baselines/atomizer/inPlaceModifier-deletion.js.map +0 -1
- package/dist/baselines/atomizer/inPlaceModifier-postprocess.d.ts +0 -85
- package/dist/baselines/atomizer/inPlaceModifier-postprocess.d.ts.map +0 -1
- package/dist/baselines/atomizer/inPlaceModifier-postprocess.js +0 -402
- package/dist/baselines/atomizer/inPlaceModifier-postprocess.js.map +0 -1
- package/dist/baselines/atomizer/inPlaceModifier-presplit.d.ts +0 -39
- package/dist/baselines/atomizer/inPlaceModifier-presplit.d.ts.map +0 -1
- package/dist/baselines/atomizer/inPlaceModifier-presplit.js +0 -265
- package/dist/baselines/atomizer/inPlaceModifier-presplit.js.map +0 -1
- package/dist/baselines/atomizer/inPlaceModifier-shared.d.ts +0 -62
- package/dist/baselines/atomizer/inPlaceModifier-shared.d.ts.map +0 -1
- package/dist/baselines/atomizer/inPlaceModifier-shared.js +0 -139
- package/dist/baselines/atomizer/inPlaceModifier-shared.js.map +0 -1
- package/dist/baselines/atomizer/inPlaceModifier-wrappers.d.ts +0 -198
- package/dist/baselines/atomizer/inPlaceModifier-wrappers.d.ts.map +0 -1
- package/dist/baselines/atomizer/inPlaceModifier-wrappers.js +0 -475
- package/dist/baselines/atomizer/inPlaceModifier-wrappers.js.map +0 -1
- package/dist/baselines/atomizer/inPlaceModifier.d.ts +0 -27
- package/dist/baselines/atomizer/inPlaceModifier.d.ts.map +0 -1
- package/dist/baselines/atomizer/inPlaceModifier.js +0 -648
- package/dist/baselines/atomizer/inPlaceModifier.js.map +0 -1
- package/dist/baselines/atomizer/numberingIntegration.d.ts +0 -59
- package/dist/baselines/atomizer/numberingIntegration.d.ts.map +0 -1
- package/dist/baselines/atomizer/numberingIntegration.js +0 -209
- package/dist/baselines/atomizer/numberingIntegration.js.map +0 -1
- package/dist/baselines/atomizer/pipeline.d.ts +0 -103
- package/dist/baselines/atomizer/pipeline.d.ts.map +0 -1
- package/dist/baselines/atomizer/pipeline.js +0 -1160
- package/dist/baselines/atomizer/pipeline.js.map +0 -1
- package/dist/baselines/atomizer/premergeRuns.d.ts +0 -26
- package/dist/baselines/atomizer/premergeRuns.d.ts.map +0 -1
- package/dist/baselines/atomizer/premergeRuns.js +0 -153
- package/dist/baselines/atomizer/premergeRuns.js.map +0 -1
- package/dist/baselines/atomizer/trackChangesAcceptor.d.ts +0 -63
- package/dist/baselines/atomizer/trackChangesAcceptor.d.ts.map +0 -1
- package/dist/baselines/atomizer/trackChangesAcceptor.js +0 -254
- package/dist/baselines/atomizer/trackChangesAcceptor.js.map +0 -1
- package/dist/baselines/atomizer/trackChangesAcceptorAst.d.ts +0 -64
- package/dist/baselines/atomizer/trackChangesAcceptorAst.d.ts.map +0 -1
- package/dist/baselines/atomizer/trackChangesAcceptorAst.js +0 -642
- package/dist/baselines/atomizer/trackChangesAcceptorAst.js.map +0 -1
- package/dist/baselines/atomizer/xmlToWmlElement.d.ts +0 -65
- package/dist/baselines/atomizer/xmlToWmlElement.d.ts.map +0 -1
- package/dist/baselines/atomizer/xmlToWmlElement.js +0 -96
- package/dist/baselines/atomizer/xmlToWmlElement.js.map +0 -1
- package/dist/baselines/wmlcomparer/DocxodusWasm.d.ts +0 -51
- package/dist/baselines/wmlcomparer/DocxodusWasm.d.ts.map +0 -1
- package/dist/baselines/wmlcomparer/DocxodusWasm.js +0 -83
- package/dist/baselines/wmlcomparer/DocxodusWasm.js.map +0 -1
- package/dist/baselines/wmlcomparer/DotnetCli.d.ts +0 -40
- package/dist/baselines/wmlcomparer/DotnetCli.d.ts.map +0 -1
- package/dist/baselines/wmlcomparer/DotnetCli.js +0 -142
- package/dist/baselines/wmlcomparer/DotnetCli.js.map +0 -1
- package/dist/cli/compare-two.d.ts +0 -28
- package/dist/cli/compare-two.d.ts.map +0 -1
- package/dist/cli/compare-two.js +0 -112
- package/dist/cli/compare-two.js.map +0 -1
- package/dist/cli/index.d.ts +0 -3
- package/dist/cli/index.d.ts.map +0 -1
- package/dist/cli/index.js +0 -25
- package/dist/cli/index.js.map +0 -1
- package/dist/compare-types.d.ts +0 -197
- package/dist/compare-types.d.ts.map +0 -1
- package/dist/compare-types.js +0 -2
- package/dist/compare-types.js.map +0 -1
- package/dist/format-detection.d.ts +0 -120
- package/dist/format-detection.d.ts.map +0 -1
- package/dist/format-detection.js +0 -339
- package/dist/format-detection.js.map +0 -1
- package/dist/move-detection.d.ts +0 -211
- package/dist/move-detection.d.ts.map +0 -1
- package/dist/move-detection.js +0 -390
- package/dist/move-detection.js.map +0 -1
package/dist/format-detection.js
DELETED
|
@@ -1,339 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Format Change Detection Module
|
|
3
|
-
*
|
|
4
|
-
* Detects formatting changes (bold, italic, font size, etc.) between
|
|
5
|
-
* documents after LCS comparison. Runs on atoms marked as Equal to
|
|
6
|
-
* identify text that matches but has different formatting.
|
|
7
|
-
*
|
|
8
|
-
* Pipeline position:
|
|
9
|
-
* LCS() → FlattenToAtomList() → detectMovesInAtomList() → detectFormatChangesInAtomList() → CoalesceRecurse()
|
|
10
|
-
*
|
|
11
|
-
* @see design.md Decision 10: Format Change Detection as Post-LCS Phase
|
|
12
|
-
*/
|
|
13
|
-
import { CorrelationStatus, DEFAULT_FORMAT_DETECTION_SETTINGS, RUN_PROPERTY_FRIENDLY_NAMES, } from './core-types.js';
|
|
14
|
-
import { getLeafText, childElements } from './primitives/index.js';
|
|
15
|
-
import { parseXml } from './primitives/xml.js';
|
|
16
|
-
// =============================================================================
|
|
17
|
-
// Run Property Extraction
|
|
18
|
-
// =============================================================================
|
|
19
|
-
/**
|
|
20
|
-
* Extract run properties (w:rPr) from an atom's ancestor elements.
|
|
21
|
-
*
|
|
22
|
-
* Finds the w:r (run) element in ancestors and extracts its w:rPr child.
|
|
23
|
-
*
|
|
24
|
-
* @param atom - The atom to extract properties from
|
|
25
|
-
* @returns The w:rPr element, or null if not found
|
|
26
|
-
*
|
|
27
|
-
* @example
|
|
28
|
-
* // For an atom inside <w:r><w:rPr><w:b/></w:rPr><w:t>text</w:t></w:r>
|
|
29
|
-
* // Returns the <w:rPr><w:b/></w:rPr> element
|
|
30
|
-
*/
|
|
31
|
-
export function getRunPropertiesFromAtom(atom) {
|
|
32
|
-
// Find the w:r ancestor element
|
|
33
|
-
const runElement = atom.ancestorElements?.find((a) => a.tagName === 'w:r');
|
|
34
|
-
if (!runElement) {
|
|
35
|
-
return null;
|
|
36
|
-
}
|
|
37
|
-
// Get the rPr child element
|
|
38
|
-
for (const child of childElements(runElement)) {
|
|
39
|
-
if (child.tagName === 'w:rPr')
|
|
40
|
-
return child;
|
|
41
|
-
}
|
|
42
|
-
return null;
|
|
43
|
-
}
|
|
44
|
-
function extractNormalizedProperties(rPr) {
|
|
45
|
-
if (!rPr) {
|
|
46
|
-
return { children: [] };
|
|
47
|
-
}
|
|
48
|
-
const normalizedChildren = childElements(rPr)
|
|
49
|
-
// Remove revision tracking elements
|
|
50
|
-
.filter((e) => e.tagName !== 'w:rPrChange')
|
|
51
|
-
// Sort by tag name for deterministic comparison
|
|
52
|
-
.sort((a, b) => a.tagName.localeCompare(b.tagName))
|
|
53
|
-
// Normalize each child
|
|
54
|
-
.map((e) => {
|
|
55
|
-
const attrs = [];
|
|
56
|
-
for (let i = 0; i < e.attributes.length; i++) {
|
|
57
|
-
const attr = e.attributes[i];
|
|
58
|
-
attrs.push([attr.name, attr.value]);
|
|
59
|
-
}
|
|
60
|
-
attrs.sort(([a], [b]) => a.localeCompare(b));
|
|
61
|
-
const text = getLeafText(e);
|
|
62
|
-
const prop = { tagName: e.tagName, attrs };
|
|
63
|
-
if (text !== undefined)
|
|
64
|
-
prop.text = text;
|
|
65
|
-
return prop;
|
|
66
|
-
});
|
|
67
|
-
return { children: normalizedChildren };
|
|
68
|
-
}
|
|
69
|
-
// =============================================================================
|
|
70
|
-
// Run Property Comparison
|
|
71
|
-
// =============================================================================
|
|
72
|
-
/**
|
|
73
|
-
* Serialize normalized properties to a string for comparison.
|
|
74
|
-
*/
|
|
75
|
-
function serializeNormalizedProperties(rPr) {
|
|
76
|
-
const parts = [];
|
|
77
|
-
for (const child of rPr.children) {
|
|
78
|
-
const attrs = child.attrs
|
|
79
|
-
.map(([k, v]) => `${k}="${v}"`)
|
|
80
|
-
.join(' ');
|
|
81
|
-
const textPart = child.text ? `|${child.text}` : '';
|
|
82
|
-
parts.push(`<${child.tagName} ${attrs}${textPart}/>`);
|
|
83
|
-
}
|
|
84
|
-
return parts.join('');
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* Check if two run properties are equal after normalization.
|
|
88
|
-
*/
|
|
89
|
-
export function areRunPropertiesEqual(rPr1, rPr2) {
|
|
90
|
-
const norm1 = extractNormalizedProperties(rPr1);
|
|
91
|
-
const norm2 = extractNormalizedProperties(rPr2);
|
|
92
|
-
return serializeNormalizedProperties(norm1) === serializeNormalizedProperties(norm2);
|
|
93
|
-
}
|
|
94
|
-
// Keep legacy overload for callers that pass WmlElement (= Element)
|
|
95
|
-
export { areRunPropertiesEqual as areNormalizedRunPropertiesEqual };
|
|
96
|
-
// =============================================================================
|
|
97
|
-
// Changed Property Detection
|
|
98
|
-
// =============================================================================
|
|
99
|
-
/**
|
|
100
|
-
* Get the set of property tag names from a normalized rPr.
|
|
101
|
-
*/
|
|
102
|
-
function getPropertyTagNames(rPr) {
|
|
103
|
-
return new Set(rPr.children.map((c) => c.tagName));
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* Find a property element by tag name in a normalized rPr.
|
|
107
|
-
*/
|
|
108
|
-
function findPropertyByTag(rPr, tagName) {
|
|
109
|
-
return rPr.children.find((c) => c.tagName === tagName);
|
|
110
|
-
}
|
|
111
|
-
/**
|
|
112
|
-
* Check if two property elements have the same value.
|
|
113
|
-
*/
|
|
114
|
-
function arePropertiesValueEqual(prop1, prop2) {
|
|
115
|
-
if (!prop1 && !prop2)
|
|
116
|
-
return true;
|
|
117
|
-
if (!prop1 || !prop2)
|
|
118
|
-
return false;
|
|
119
|
-
const str1 = serializeNormalizedProperties({ children: [prop1] });
|
|
120
|
-
const str2 = serializeNormalizedProperties({ children: [prop2] });
|
|
121
|
-
return str1 === str2;
|
|
122
|
-
}
|
|
123
|
-
/**
|
|
124
|
-
* Get the list of property names that changed between two run properties.
|
|
125
|
-
*
|
|
126
|
-
* Returns friendly names (e.g., "bold", "italic") when available,
|
|
127
|
-
* otherwise returns the OOXML tag name.
|
|
128
|
-
*
|
|
129
|
-
* @param oldRPr - Old run properties element (or null)
|
|
130
|
-
* @param newRPr - New run properties element (or null)
|
|
131
|
-
* @returns Array of changed property names
|
|
132
|
-
*/
|
|
133
|
-
export function getChangedPropertyNames(oldRPr, newRPr) {
|
|
134
|
-
const changed = [];
|
|
135
|
-
const normalizedOld = extractNormalizedProperties(oldRPr);
|
|
136
|
-
const normalizedNew = extractNormalizedProperties(newRPr);
|
|
137
|
-
const oldTags = getPropertyTagNames(normalizedOld);
|
|
138
|
-
const newTags = getPropertyTagNames(normalizedNew);
|
|
139
|
-
// All unique tags from both
|
|
140
|
-
const allTags = new Set([...oldTags, ...newTags]);
|
|
141
|
-
for (const tag of allTags) {
|
|
142
|
-
const oldProp = findPropertyByTag(normalizedOld, tag);
|
|
143
|
-
const newProp = findPropertyByTag(normalizedNew, tag);
|
|
144
|
-
if (!arePropertiesValueEqual(oldProp, newProp)) {
|
|
145
|
-
// Use friendly name if available
|
|
146
|
-
const friendlyName = RUN_PROPERTY_FRIENDLY_NAMES[tag] ?? tag;
|
|
147
|
-
changed.push(friendlyName);
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
return changed.sort();
|
|
151
|
-
}
|
|
152
|
-
/**
|
|
153
|
-
* Categorize changed properties into added, removed, and modified.
|
|
154
|
-
*
|
|
155
|
-
* @param oldRPr - Old run properties element (or null)
|
|
156
|
-
* @param newRPr - New run properties element (or null)
|
|
157
|
-
* @returns Object with added, removed, and changed arrays
|
|
158
|
-
*/
|
|
159
|
-
export function categorizePropertyChanges(oldRPr, newRPr) {
|
|
160
|
-
const added = [];
|
|
161
|
-
const removed = [];
|
|
162
|
-
const changed = [];
|
|
163
|
-
const normalizedOld = extractNormalizedProperties(oldRPr);
|
|
164
|
-
const normalizedNew = extractNormalizedProperties(newRPr);
|
|
165
|
-
const oldTags = getPropertyTagNames(normalizedOld);
|
|
166
|
-
const newTags = getPropertyTagNames(normalizedNew);
|
|
167
|
-
// Check for added properties (in new but not old)
|
|
168
|
-
for (const tag of newTags) {
|
|
169
|
-
if (!oldTags.has(tag)) {
|
|
170
|
-
const friendlyName = RUN_PROPERTY_FRIENDLY_NAMES[tag] ?? tag;
|
|
171
|
-
added.push(friendlyName);
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
// Check for removed properties (in old but not new)
|
|
175
|
-
for (const tag of oldTags) {
|
|
176
|
-
if (!newTags.has(tag)) {
|
|
177
|
-
const friendlyName = RUN_PROPERTY_FRIENDLY_NAMES[tag] ?? tag;
|
|
178
|
-
removed.push(friendlyName);
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
// Check for changed properties (in both but different value)
|
|
182
|
-
for (const tag of oldTags) {
|
|
183
|
-
if (newTags.has(tag)) {
|
|
184
|
-
const oldProp = findPropertyByTag(normalizedOld, tag);
|
|
185
|
-
const newProp = findPropertyByTag(normalizedNew, tag);
|
|
186
|
-
if (!arePropertiesValueEqual(oldProp, newProp)) {
|
|
187
|
-
const friendlyName = RUN_PROPERTY_FRIENDLY_NAMES[tag] ?? tag;
|
|
188
|
-
changed.push(friendlyName);
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
return {
|
|
193
|
-
added: added.sort(),
|
|
194
|
-
removed: removed.sort(),
|
|
195
|
-
changed: changed.sort(),
|
|
196
|
-
};
|
|
197
|
-
}
|
|
198
|
-
// =============================================================================
|
|
199
|
-
// Main Algorithm
|
|
200
|
-
// =============================================================================
|
|
201
|
-
/**
|
|
202
|
-
* Detect format changes in a flat list of atoms.
|
|
203
|
-
*
|
|
204
|
-
* Runs after LCS and move detection to identify Equal atoms where the text
|
|
205
|
-
* matches but formatting differs. Updates atoms in place with format change status.
|
|
206
|
-
*
|
|
207
|
-
* @param atoms - The atom list to process (modified in place)
|
|
208
|
-
* @param settings - Format detection settings (optional, uses defaults)
|
|
209
|
-
*/
|
|
210
|
-
export function detectFormatChangesInAtomList(atoms, settings = DEFAULT_FORMAT_DETECTION_SETTINGS) {
|
|
211
|
-
if (!settings.detectFormatChanges) {
|
|
212
|
-
return;
|
|
213
|
-
}
|
|
214
|
-
for (const atom of atoms) {
|
|
215
|
-
// Only check Equal atoms that have a "before" reference
|
|
216
|
-
if (atom.correlationStatus !== CorrelationStatus.Equal) {
|
|
217
|
-
continue;
|
|
218
|
-
}
|
|
219
|
-
if (!atom.comparisonUnitAtomBefore) {
|
|
220
|
-
continue;
|
|
221
|
-
}
|
|
222
|
-
// Extract rPr from both documents
|
|
223
|
-
const oldRPr = getRunPropertiesFromAtom(atom.comparisonUnitAtomBefore);
|
|
224
|
-
const newRPr = getRunPropertiesFromAtom(atom);
|
|
225
|
-
// Compare run properties
|
|
226
|
-
if (!areRunPropertiesEqual(oldRPr, newRPr)) {
|
|
227
|
-
atom.correlationStatus = CorrelationStatus.FormatChanged;
|
|
228
|
-
atom.formatChange = {
|
|
229
|
-
oldRunProperties: oldRPr,
|
|
230
|
-
newRunProperties: newRPr,
|
|
231
|
-
changedProperties: getChangedPropertyNames(oldRPr, newRPr),
|
|
232
|
-
};
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
/**
|
|
237
|
-
* Merge format change markup into a run's existing rPr element.
|
|
238
|
-
*
|
|
239
|
-
* Adds the w:rPrChange element as the last child of w:rPr.
|
|
240
|
-
*
|
|
241
|
-
* @param runElement - The w:r element to modify
|
|
242
|
-
* @param rPrChange - The w:rPrChange element to insert
|
|
243
|
-
*/
|
|
244
|
-
export function mergeFormatChangeIntoRun(runElement, rPrChange) {
|
|
245
|
-
if (runElement.tagName !== 'w:r') {
|
|
246
|
-
return;
|
|
247
|
-
}
|
|
248
|
-
// Find existing rPr
|
|
249
|
-
let rPr = null;
|
|
250
|
-
for (const child of childElements(runElement)) {
|
|
251
|
-
if (child.tagName === 'w:rPr') {
|
|
252
|
-
rPr = child;
|
|
253
|
-
break;
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
if (!rPr) {
|
|
257
|
-
// Create rPr as first child
|
|
258
|
-
const doc = runElement.ownerDocument;
|
|
259
|
-
rPr = doc.createElementNS('http://schemas.openxmlformats.org/wordprocessingml/2006/main', 'w:rPr');
|
|
260
|
-
runElement.insertBefore(rPr, runElement.firstChild);
|
|
261
|
-
}
|
|
262
|
-
// Add rPrChange as last child of rPr
|
|
263
|
-
rPr.appendChild(rPrChange);
|
|
264
|
-
}
|
|
265
|
-
// =============================================================================
|
|
266
|
-
// Paragraph Property Change Support (Future Enhancement)
|
|
267
|
-
// =============================================================================
|
|
268
|
-
/**
|
|
269
|
-
* Extract paragraph properties (w:pPr) from an element.
|
|
270
|
-
*
|
|
271
|
-
* @param paragraphElement - The w:p element
|
|
272
|
-
* @returns The w:pPr element, or null if not found
|
|
273
|
-
*/
|
|
274
|
-
export function getParagraphProperties(paragraphElement) {
|
|
275
|
-
if (paragraphElement.tagName !== 'w:p') {
|
|
276
|
-
return null;
|
|
277
|
-
}
|
|
278
|
-
for (const child of childElements(paragraphElement)) {
|
|
279
|
-
if (child.tagName === 'w:pPr')
|
|
280
|
-
return child;
|
|
281
|
-
}
|
|
282
|
-
return null;
|
|
283
|
-
}
|
|
284
|
-
/**
|
|
285
|
-
* Paragraph property friendly names.
|
|
286
|
-
*/
|
|
287
|
-
export const PARAGRAPH_PROPERTY_FRIENDLY_NAMES = {
|
|
288
|
-
'w:jc': 'alignment',
|
|
289
|
-
'w:ind': 'indentation',
|
|
290
|
-
'w:spacing': 'spacing',
|
|
291
|
-
'w:pStyle': 'style',
|
|
292
|
-
'w:numPr': 'numbering',
|
|
293
|
-
'w:pBdr': 'borders',
|
|
294
|
-
'w:shd': 'shading',
|
|
295
|
-
'w:tabs': 'tabs',
|
|
296
|
-
'w:keepNext': 'keepWithNext',
|
|
297
|
-
'w:keepLines': 'keepLinesTogether',
|
|
298
|
-
'w:pageBreakBefore': 'pageBreakBefore',
|
|
299
|
-
'w:widowControl': 'widowControl',
|
|
300
|
-
'w:outlineLvl': 'outlineLevel',
|
|
301
|
-
};
|
|
302
|
-
// =============================================================================
|
|
303
|
-
// Legacy API — kept for backward compatibility during migration
|
|
304
|
-
// =============================================================================
|
|
305
|
-
/**
|
|
306
|
-
* @deprecated Use areRunPropertiesEqual directly with Element params
|
|
307
|
-
*/
|
|
308
|
-
export function normalizeRunProperties(rPr) {
|
|
309
|
-
return extractNormalizedProperties(rPr);
|
|
310
|
-
}
|
|
311
|
-
/**
|
|
312
|
-
* @deprecated Use getParagraphProperties directly
|
|
313
|
-
*/
|
|
314
|
-
export function normalizeParagraphProperties(pPr) {
|
|
315
|
-
return extractNormalizedProperties(pPr);
|
|
316
|
-
}
|
|
317
|
-
/**
|
|
318
|
-
* @deprecated Removed — use generateFormatChangeMarkup with DOM approach
|
|
319
|
-
*/
|
|
320
|
-
export function generateFormatChangeMarkup(formatChange, options) {
|
|
321
|
-
const doc = parseXml('<root/>');
|
|
322
|
-
const dateStr = options.dateTime.toISOString();
|
|
323
|
-
const W_NS = 'http://schemas.openxmlformats.org/wordprocessingml/2006/main';
|
|
324
|
-
const rPrChange = doc.createElementNS(W_NS, 'w:rPrChange');
|
|
325
|
-
rPrChange.setAttribute('w:id', options.id.toString());
|
|
326
|
-
rPrChange.setAttribute('w:author', options.author);
|
|
327
|
-
rPrChange.setAttribute('w:date', dateStr);
|
|
328
|
-
const rPr = doc.createElementNS(W_NS, 'w:rPr');
|
|
329
|
-
rPrChange.appendChild(rPr);
|
|
330
|
-
if (formatChange.oldRunProperties) {
|
|
331
|
-
for (const child of childElements(formatChange.oldRunProperties)) {
|
|
332
|
-
if (child.tagName === 'w:rPrChange')
|
|
333
|
-
continue;
|
|
334
|
-
rPr.appendChild(child.cloneNode(true));
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
return rPrChange;
|
|
338
|
-
}
|
|
339
|
-
//# sourceMappingURL=format-detection.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"format-detection.js","sourceRoot":"","sources":["../src/format-detection.ts"],"names":[],"mappings":"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"}
|
package/dist/move-detection.d.ts
DELETED
|
@@ -1,211 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Move Detection Module
|
|
3
|
-
*
|
|
4
|
-
* Detects relocated content after LCS comparison by matching deleted blocks
|
|
5
|
-
* with inserted blocks using Jaccard word similarity.
|
|
6
|
-
*
|
|
7
|
-
* Pipeline position:
|
|
8
|
-
* LCS() → MarkRowsAsDeletedOrInserted() → FlattenToAtomList() → detectMovesInAtomList() → CoalesceRecurse()
|
|
9
|
-
*
|
|
10
|
-
* @see WmlComparer.cs DetectMovesInAtomList() line 3811
|
|
11
|
-
*/
|
|
12
|
-
import { AtomBlock, ComparisonUnitAtom, CorrelationStatus, MoveDetectionSettings } from './core-types.js';
|
|
13
|
-
/**
|
|
14
|
-
* Extract text content from an atom.
|
|
15
|
-
*
|
|
16
|
-
* @param atom - The atom to extract text from
|
|
17
|
-
* @returns The text content, or empty string for non-text atoms
|
|
18
|
-
*/
|
|
19
|
-
export declare function getAtomText(atom: ComparisonUnitAtom): string;
|
|
20
|
-
/**
|
|
21
|
-
* Extract text from a sequence of atoms.
|
|
22
|
-
*
|
|
23
|
-
* @param atoms - The atoms to extract text from
|
|
24
|
-
* @returns Combined text content
|
|
25
|
-
*/
|
|
26
|
-
export declare function getAtomsText(atoms: ComparisonUnitAtom[]): string;
|
|
27
|
-
/**
|
|
28
|
-
* Count words in text.
|
|
29
|
-
*
|
|
30
|
-
* @param text - The text to count words in
|
|
31
|
-
* @returns Number of words
|
|
32
|
-
*/
|
|
33
|
-
export declare function countWords(text: string): number;
|
|
34
|
-
/**
|
|
35
|
-
* Calculate Jaccard similarity between two texts based on word sets.
|
|
36
|
-
*
|
|
37
|
-
* Jaccard index = |intersection| / |union|
|
|
38
|
-
*
|
|
39
|
-
* Benefits:
|
|
40
|
-
* - Order-independent: "fox quick brown" matches "brown quick fox"
|
|
41
|
-
* - Handles insertions/deletions well: adding one word to a 10-word block only slightly reduces similarity
|
|
42
|
-
* - O(n) complexity where n = total words
|
|
43
|
-
*
|
|
44
|
-
* @param text1 - First text
|
|
45
|
-
* @param text2 - Second text
|
|
46
|
-
* @param caseInsensitive - Whether to ignore case (default: true)
|
|
47
|
-
* @returns Similarity score between 0 and 1
|
|
48
|
-
*
|
|
49
|
-
* @example
|
|
50
|
-
* jaccardWordSimilarity("The quick brown fox", "The quick brown dog")
|
|
51
|
-
* // Returns 0.6 (3 common words / 5 total unique words)
|
|
52
|
-
*/
|
|
53
|
-
export declare function jaccardWordSimilarity(text1: string, text2: string, caseInsensitive?: boolean): number;
|
|
54
|
-
/**
|
|
55
|
-
* Group consecutive atoms by correlation status.
|
|
56
|
-
*
|
|
57
|
-
* Creates blocks of atoms with the same status (Deleted or Inserted).
|
|
58
|
-
*
|
|
59
|
-
* @param atoms - The atoms to group
|
|
60
|
-
* @returns Array of atom blocks
|
|
61
|
-
*/
|
|
62
|
-
export declare function groupIntoBlocks(atoms: ComparisonUnitAtom[]): AtomBlock[];
|
|
63
|
-
/**
|
|
64
|
-
* Result of finding the best match for a deleted block.
|
|
65
|
-
*/
|
|
66
|
-
interface MatchResult {
|
|
67
|
-
/** The matching inserted block */
|
|
68
|
-
block: AtomBlock;
|
|
69
|
-
/** Similarity score between 0 and 1 */
|
|
70
|
-
similarity: number;
|
|
71
|
-
/** Index in the insertedBlocks array */
|
|
72
|
-
index: number;
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* Find the best matching inserted block for a deleted block.
|
|
76
|
-
*
|
|
77
|
-
* @param deleted - The deleted block to match
|
|
78
|
-
* @param insertedBlocks - Available inserted blocks
|
|
79
|
-
* @param settings - Move detection settings
|
|
80
|
-
* @returns The best match, or undefined if no match meets threshold
|
|
81
|
-
*/
|
|
82
|
-
export declare function findBestMatch(deleted: AtomBlock, insertedBlocks: AtomBlock[], settings: MoveDetectionSettings): MatchResult | undefined;
|
|
83
|
-
/**
|
|
84
|
-
* Mark atoms as part of a move operation.
|
|
85
|
-
*
|
|
86
|
-
* @param atoms - Atoms to mark
|
|
87
|
-
* @param status - New correlation status (MovedSource or MovedDestination)
|
|
88
|
-
* @param moveGroupId - ID linking source and destination
|
|
89
|
-
* @param moveName - Name for move tracking (e.g., "move1")
|
|
90
|
-
*/
|
|
91
|
-
export declare function markAsMove(atoms: ComparisonUnitAtom[], status: CorrelationStatus.MovedSource | CorrelationStatus.MovedDestination, moveGroupId: number, moveName: string): void;
|
|
92
|
-
/**
|
|
93
|
-
* Detect moves in a flat list of atoms.
|
|
94
|
-
*
|
|
95
|
-
* Runs after LCS comparison to identify deleted blocks that were actually
|
|
96
|
-
* moved to a new location. Updates atoms in place with move status.
|
|
97
|
-
*
|
|
98
|
-
* @param atoms - The atom list to process (modified in place)
|
|
99
|
-
* @param settings - Move detection settings (optional, uses defaults)
|
|
100
|
-
*
|
|
101
|
-
* @see WmlComparer.cs DetectMovesInAtomList() line 3811
|
|
102
|
-
*
|
|
103
|
-
* @example
|
|
104
|
-
* const atoms = atomizeTree(document, [], part);
|
|
105
|
-
* runLCSComparison(atoms);
|
|
106
|
-
* detectMovesInAtomList(atoms); // Updates atoms in place
|
|
107
|
-
*/
|
|
108
|
-
export declare function detectMovesInAtomList(atoms: ComparisonUnitAtom[], settings?: MoveDetectionSettings): void;
|
|
109
|
-
/**
|
|
110
|
-
* Options for generating move markup.
|
|
111
|
-
*/
|
|
112
|
-
export interface MoveMarkupOptions {
|
|
113
|
-
/** Author name for revision tracking */
|
|
114
|
-
author: string;
|
|
115
|
-
/** Timestamp for revisions */
|
|
116
|
-
dateTime: Date;
|
|
117
|
-
/** Starting ID for range markers */
|
|
118
|
-
startId: number;
|
|
119
|
-
}
|
|
120
|
-
/**
|
|
121
|
-
* Generated move markup for a block.
|
|
122
|
-
*/
|
|
123
|
-
export interface MoveMarkup {
|
|
124
|
-
/** Range start element */
|
|
125
|
-
rangeStart: Element;
|
|
126
|
-
/** Move content wrapper element */
|
|
127
|
-
moveWrapper: Element;
|
|
128
|
-
/** Range end element */
|
|
129
|
-
rangeEnd: Element;
|
|
130
|
-
/** Next available ID after these elements */
|
|
131
|
-
nextId: number;
|
|
132
|
-
}
|
|
133
|
-
/**
|
|
134
|
-
* Generate move source markup (w:moveFrom with range markers).
|
|
135
|
-
*
|
|
136
|
-
* @param moveName - Name linking source and destination (e.g., "move1")
|
|
137
|
-
* @param content - Child elements to wrap
|
|
138
|
-
* @param options - Markup generation options
|
|
139
|
-
* @returns Move markup elements
|
|
140
|
-
*
|
|
141
|
-
* @example
|
|
142
|
-
* Output structure:
|
|
143
|
-
* <w:moveFromRangeStart w:id="1" w:name="move1" w:author="..." w:date="..."/>
|
|
144
|
-
* <w:moveFrom w:id="2" w:author="..." w:date="...">
|
|
145
|
-
* <!-- content -->
|
|
146
|
-
* </w:moveFrom>
|
|
147
|
-
* <w:moveFromRangeEnd w:id="1"/>
|
|
148
|
-
*/
|
|
149
|
-
export declare function generateMoveSourceMarkup(moveName: string, content: Element[], options: MoveMarkupOptions): MoveMarkup;
|
|
150
|
-
/**
|
|
151
|
-
* Generate move destination markup (w:moveTo with range markers).
|
|
152
|
-
*
|
|
153
|
-
* @param moveName - Name linking source and destination (e.g., "move1")
|
|
154
|
-
* @param content - Child elements to wrap
|
|
155
|
-
* @param options - Markup generation options
|
|
156
|
-
* @returns Move markup elements
|
|
157
|
-
*
|
|
158
|
-
* @example
|
|
159
|
-
* Output structure:
|
|
160
|
-
* <w:moveToRangeStart w:id="3" w:name="move1" w:author="..." w:date="..."/>
|
|
161
|
-
* <w:moveTo w:id="4" w:author="..." w:date="...">
|
|
162
|
-
* <!-- content -->
|
|
163
|
-
* </w:moveTo>
|
|
164
|
-
* <w:moveToRangeEnd w:id="3"/>
|
|
165
|
-
*/
|
|
166
|
-
export declare function generateMoveDestinationMarkup(moveName: string, content: Element[], options: MoveMarkupOptions): MoveMarkup;
|
|
167
|
-
/**
|
|
168
|
-
* State for tracking revision IDs during markup generation.
|
|
169
|
-
*/
|
|
170
|
-
export interface RevisionIdState {
|
|
171
|
-
/** Next available ID */
|
|
172
|
-
nextId: number;
|
|
173
|
-
/** Move name to range start ID mapping */
|
|
174
|
-
moveRangeIds: Map<string, {
|
|
175
|
-
sourceRangeId: number;
|
|
176
|
-
destRangeId: number;
|
|
177
|
-
}>;
|
|
178
|
-
}
|
|
179
|
-
/**
|
|
180
|
-
* Create initial revision ID state.
|
|
181
|
-
*
|
|
182
|
-
* @param startId - Starting ID (default: 1)
|
|
183
|
-
* @returns Initial state
|
|
184
|
-
*/
|
|
185
|
-
export declare function createRevisionIdState(startId?: number): RevisionIdState;
|
|
186
|
-
/**
|
|
187
|
-
* Allocate IDs for a move operation.
|
|
188
|
-
*
|
|
189
|
-
* Ensures source and destination use consistent IDs for proper linking.
|
|
190
|
-
*
|
|
191
|
-
* @param state - Revision ID state (modified in place)
|
|
192
|
-
* @param moveName - Move name (e.g., "move1")
|
|
193
|
-
* @returns IDs for source and destination markup
|
|
194
|
-
*/
|
|
195
|
-
export declare function allocateMoveIds(state: RevisionIdState, moveName: string): {
|
|
196
|
-
sourceRangeId: number;
|
|
197
|
-
sourceMoveId: number;
|
|
198
|
-
destRangeId: number;
|
|
199
|
-
destMoveId: number;
|
|
200
|
-
};
|
|
201
|
-
/**
|
|
202
|
-
* Fix up revision IDs after all moves have been processed.
|
|
203
|
-
*
|
|
204
|
-
* Ensures proper ID pairing between source and destination elements.
|
|
205
|
-
* This is a post-processing step after markup generation.
|
|
206
|
-
*
|
|
207
|
-
* @param state - The revision ID state
|
|
208
|
-
*/
|
|
209
|
-
export declare function fixUpRevisionIds(_state: RevisionIdState): void;
|
|
210
|
-
export {};
|
|
211
|
-
//# sourceMappingURL=move-detection.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"move-detection.d.ts","sourceRoot":"","sources":["../src/move-detection.ts"],"names":[],"mappings":"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"}
|