@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
|
@@ -1,642 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Track Changes Acceptor/Rejector (AST-based)
|
|
3
|
-
*
|
|
4
|
-
* AST-based utilities to accept or reject all track changes in a document.
|
|
5
|
-
* Replaces the regex-based implementation for better reliability with nested structures.
|
|
6
|
-
*/
|
|
7
|
-
import { parseDocumentXml, serializeToXml } from './xmlToWmlElement.js';
|
|
8
|
-
import { removeAllByTagName, unwrapAllByTagName, findAllByTagName, renameElement, insertChildAt, childElements, getLeafText, NODE_TYPE, } from '../../primitives/index.js';
|
|
9
|
-
/**
|
|
10
|
-
* Remove w:hyperlink elements left with no element children after change
|
|
11
|
-
* resolution. Word drops a hyperlink whose entire content was a resolved
|
|
12
|
-
* tracked change (all link text deleted + accepted, or all link text
|
|
13
|
-
* inserted + rejected); keeping the empty wrapper would ship a contentless
|
|
14
|
-
* `<w:hyperlink r:id=".."/>` husk. Hyperlinks that still hold any element
|
|
15
|
-
* (runs, bookmarks, range markers) are kept.
|
|
16
|
-
*
|
|
17
|
-
* @conformance ECMA-376 edition 5, Part 1 § 17.16.22
|
|
18
|
-
* @see https://github.com/UseJunior/safe-docx/issues/368
|
|
19
|
-
*/
|
|
20
|
-
function removeEmptyHyperlinks(root) {
|
|
21
|
-
for (const hyperlink of findAllByTagName(root, 'w:hyperlink')) {
|
|
22
|
-
if (childElements(hyperlink).length === 0 && hyperlink.parentNode) {
|
|
23
|
-
hyperlink.parentNode.removeChild(hyperlink);
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
/** xmldom does not implement parentElement; use parentNode with an Element guard. */
|
|
28
|
-
function parentElement(node) {
|
|
29
|
-
const p = node.parentNode;
|
|
30
|
-
return p && p.nodeType === NODE_TYPE.ELEMENT ? p : undefined;
|
|
31
|
-
}
|
|
32
|
-
function getParagraphPPr(p) {
|
|
33
|
-
return childElements(p).find((c) => c.tagName === 'w:pPr');
|
|
34
|
-
}
|
|
35
|
-
function paragraphHasParaMarker(p, tagName) {
|
|
36
|
-
// Strict paragraph-mark marker shape: w:p > w:pPr > w:rPr > (w:ins | w:del),
|
|
37
|
-
// navigated by direct children only — NOT a descendant search. A descendant
|
|
38
|
-
// search would mistake a marker nested inside a w:pPrChange snapshot (which
|
|
39
|
-
// stores a prior w:pPr/w:rPr) for the live paragraph mark, and would diverge
|
|
40
|
-
// from the primitive rejectChanges (primitives/reject_changes.ts), which both
|
|
41
|
-
// reject paths must agree with.
|
|
42
|
-
const pPr = getParagraphPPr(p);
|
|
43
|
-
if (!pPr)
|
|
44
|
-
return false;
|
|
45
|
-
const rPr = childElements(pPr).find((c) => c.tagName === 'w:rPr');
|
|
46
|
-
if (!rPr)
|
|
47
|
-
return false;
|
|
48
|
-
return childElements(rPr).some((c) => c.tagName === tagName);
|
|
49
|
-
}
|
|
50
|
-
function removeParaMarkers(root) {
|
|
51
|
-
// Remove paragraph-level revision markers (<w:ins/> / <w:del/>) that live under <w:pPr>.
|
|
52
|
-
for (const p of findAllByTagName(root, 'w:p')) {
|
|
53
|
-
const pPr = getParagraphPPr(p);
|
|
54
|
-
if (!pPr)
|
|
55
|
-
continue;
|
|
56
|
-
const markers = [
|
|
57
|
-
...findAllByTagName(pPr, 'w:ins'),
|
|
58
|
-
...findAllByTagName(pPr, 'w:del'),
|
|
59
|
-
];
|
|
60
|
-
for (const m of markers) {
|
|
61
|
-
if (m.parentNode)
|
|
62
|
-
m.parentNode.removeChild(m);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
function findContainingParagraph(node) {
|
|
67
|
-
let current = node;
|
|
68
|
-
while (current) {
|
|
69
|
-
if (current.tagName === 'w:p') {
|
|
70
|
-
return current;
|
|
71
|
-
}
|
|
72
|
-
current = parentElement(current);
|
|
73
|
-
}
|
|
74
|
-
return undefined;
|
|
75
|
-
}
|
|
76
|
-
function findNeighborParagraphOutsideRemoval(paragraph, paragraphsToRemove, direction) {
|
|
77
|
-
const parent = parentElement(paragraph);
|
|
78
|
-
if (!parent) {
|
|
79
|
-
return undefined;
|
|
80
|
-
}
|
|
81
|
-
const siblings = childElements(parent);
|
|
82
|
-
const paragraphIndex = siblings.indexOf(paragraph);
|
|
83
|
-
if (paragraphIndex < 0) {
|
|
84
|
-
return undefined;
|
|
85
|
-
}
|
|
86
|
-
const step = direction === 'previous' ? -1 : 1;
|
|
87
|
-
for (let i = paragraphIndex + step; i >= 0 && i < siblings.length; i += step) {
|
|
88
|
-
const sibling = siblings[i];
|
|
89
|
-
if (sibling?.tagName !== 'w:p') {
|
|
90
|
-
continue;
|
|
91
|
-
}
|
|
92
|
-
if (paragraphsToRemove.has(sibling)) {
|
|
93
|
-
continue;
|
|
94
|
-
}
|
|
95
|
-
return sibling;
|
|
96
|
-
}
|
|
97
|
-
return undefined;
|
|
98
|
-
}
|
|
99
|
-
function paragraphContentStartIndex(paragraph) {
|
|
100
|
-
const children = childElements(paragraph);
|
|
101
|
-
let idx = 0;
|
|
102
|
-
while (idx < children.length && children[idx]?.tagName === 'w:pPr') {
|
|
103
|
-
idx++;
|
|
104
|
-
}
|
|
105
|
-
return idx;
|
|
106
|
-
}
|
|
107
|
-
// Marker-ish elements that may sit between two paragraphs at block level
|
|
108
|
-
// without ending the search for a merge target: the full EG_RangeMarkupElements
|
|
109
|
-
// schema group (wml.xsd), plus permStart/permEnd range markers and proofErr
|
|
110
|
-
// proofing anchors.
|
|
111
|
-
const RANGE_MARKUP_BLOCK_SIBLING_TAGS = new Set([
|
|
112
|
-
'w:bookmarkStart', 'w:bookmarkEnd',
|
|
113
|
-
'w:commentRangeStart', 'w:commentRangeEnd',
|
|
114
|
-
'w:moveFromRangeStart', 'w:moveFromRangeEnd',
|
|
115
|
-
'w:moveToRangeStart', 'w:moveToRangeEnd',
|
|
116
|
-
'w:customXmlInsRangeStart', 'w:customXmlInsRangeEnd',
|
|
117
|
-
'w:customXmlDelRangeStart', 'w:customXmlDelRangeEnd',
|
|
118
|
-
'w:customXmlMoveFromRangeStart', 'w:customXmlMoveFromRangeEnd',
|
|
119
|
-
'w:customXmlMoveToRangeStart', 'w:customXmlMoveToRangeEnd',
|
|
120
|
-
'w:permStart', 'w:permEnd',
|
|
121
|
-
'w:proofErr',
|
|
122
|
-
]);
|
|
123
|
-
/**
|
|
124
|
-
* Find the next sibling paragraph a paragraph-mark revision can merge into,
|
|
125
|
-
* skipping block-level range/annotation markers. Returns undefined when the
|
|
126
|
-
* next block is not a paragraph (table, sdt, sectPr, end of parent).
|
|
127
|
-
*/
|
|
128
|
-
function findFollowingSiblingParagraph(p) {
|
|
129
|
-
const parent = parentElement(p);
|
|
130
|
-
if (!parent)
|
|
131
|
-
return undefined;
|
|
132
|
-
const siblings = childElements(parent);
|
|
133
|
-
const idx = siblings.indexOf(p);
|
|
134
|
-
if (idx < 0)
|
|
135
|
-
return undefined;
|
|
136
|
-
for (let i = idx + 1; i < siblings.length; i++) {
|
|
137
|
-
const sibling = siblings[i];
|
|
138
|
-
if (sibling.tagName === 'w:p')
|
|
139
|
-
return sibling;
|
|
140
|
-
if (RANGE_MARKUP_BLOCK_SIBLING_TAGS.has(sibling.tagName))
|
|
141
|
-
continue;
|
|
142
|
-
return undefined;
|
|
143
|
-
}
|
|
144
|
-
return undefined;
|
|
145
|
-
}
|
|
146
|
-
/** True iff the paragraph still holds content beyond w:pPr and bare annotation markers. */
|
|
147
|
-
function paragraphHasContent(p) {
|
|
148
|
-
return childElements(p).some((c) => c.tagName !== 'w:pPr' && !RANGE_MARKUP_BLOCK_SIBLING_TAGS.has(c.tagName));
|
|
149
|
-
}
|
|
150
|
-
/**
|
|
151
|
-
* True iff removing an emptied mark-revised paragraph keeps its parent
|
|
152
|
-
* structurally valid for Word: the parent must retain at least one block
|
|
153
|
-
* element, must not end on a w:tbl (a trailing table needs a following
|
|
154
|
-
* paragraph), and two tables must not become adjacent (Word merges
|
|
155
|
-
* back-to-back tables). w:sectPr is ignored — a trailing body sectPr is not a
|
|
156
|
-
* block element.
|
|
157
|
-
*/
|
|
158
|
-
function canSafelyRemoveEmptyParagraph(p) {
|
|
159
|
-
const parent = parentElement(p);
|
|
160
|
-
if (!parent)
|
|
161
|
-
return false;
|
|
162
|
-
const siblings = childElements(parent).filter((c) => !RANGE_MARKUP_BLOCK_SIBLING_TAGS.has(c.tagName) && c.tagName !== 'w:sectPr');
|
|
163
|
-
const idx = siblings.indexOf(p);
|
|
164
|
-
if (idx < 0)
|
|
165
|
-
return false;
|
|
166
|
-
const prev = siblings[idx - 1];
|
|
167
|
-
const next = siblings[idx + 1];
|
|
168
|
-
if (!prev && !next)
|
|
169
|
-
return false;
|
|
170
|
-
if (prev?.tagName === 'w:tbl' && !next)
|
|
171
|
-
return false;
|
|
172
|
-
if (prev?.tagName === 'w:tbl' && next?.tagName === 'w:tbl')
|
|
173
|
-
return false;
|
|
174
|
-
return true;
|
|
175
|
-
}
|
|
176
|
-
/**
|
|
177
|
-
* Resolve a paragraph whose paragraph MARK revision was applied (deleted mark
|
|
178
|
-
* accepted, or inserted mark rejected): the paragraph break disappears, so the
|
|
179
|
-
* paragraph's remaining content merges into the FOLLOWING paragraph. The
|
|
180
|
-
* surviving (following) paragraph keeps its own w:pPr — formatting follows the
|
|
181
|
-
* surviving paragraph mark — and the merged-away paragraph's w:pPr is dropped.
|
|
182
|
-
*
|
|
183
|
-
* The revision targets only the mark, never the paragraph's contents, so the
|
|
184
|
-
* contents must not be dropped wholesale (they are removed only via their own
|
|
185
|
-
* run-level w:del / w:ins wrappers). When no following sibling paragraph
|
|
186
|
-
* exists (last block, or the next block is a table), there is no break to
|
|
187
|
-
* remove into: content-bearing paragraphs are kept, and emptied ones are
|
|
188
|
-
* removed only where removal keeps the parent structurally valid
|
|
189
|
-
* (canSafelyRemoveEmptyParagraph).
|
|
190
|
-
*
|
|
191
|
-
* @conformance ECMA-376 edition 5, Part 1 § 17.13.5.15
|
|
192
|
-
* @conformance ECMA-376 edition 5, Part 1 § 17.13.5.20
|
|
193
|
-
* @see https://github.com/UseJunior/safe-docx/issues/431
|
|
194
|
-
*/
|
|
195
|
-
function resolveParagraphMarkRevision(p) {
|
|
196
|
-
const parent = p.parentNode;
|
|
197
|
-
if (!parent)
|
|
198
|
-
return;
|
|
199
|
-
const target = findFollowingSiblingParagraph(p);
|
|
200
|
-
if (!target) {
|
|
201
|
-
if (!paragraphHasContent(p) && canSafelyRemoveEmptyParagraph(p)) {
|
|
202
|
-
parent.removeChild(p);
|
|
203
|
-
}
|
|
204
|
-
return;
|
|
205
|
-
}
|
|
206
|
-
// The merged content precedes the target's own content in document order.
|
|
207
|
-
let insertIndex = paragraphContentStartIndex(target);
|
|
208
|
-
for (const child of childElements(p)) {
|
|
209
|
-
if (child.tagName === 'w:pPr')
|
|
210
|
-
continue;
|
|
211
|
-
p.removeChild(child);
|
|
212
|
-
insertChildAt(target, child, insertIndex);
|
|
213
|
-
insertIndex++;
|
|
214
|
-
}
|
|
215
|
-
parent.removeChild(p);
|
|
216
|
-
}
|
|
217
|
-
function moveBookmarkMarker(marker, targetParagraph, position) {
|
|
218
|
-
if (marker.tagName === 'w:bookmarkStart') {
|
|
219
|
-
const markerId = marker.getAttribute('w:id');
|
|
220
|
-
const markerName = marker.getAttribute('w:name');
|
|
221
|
-
for (const existing of findAllByTagName(targetParagraph, 'w:bookmarkStart')) {
|
|
222
|
-
if (markerId && existing.getAttribute('w:id') === markerId) {
|
|
223
|
-
if (marker.parentNode)
|
|
224
|
-
marker.parentNode.removeChild(marker);
|
|
225
|
-
return;
|
|
226
|
-
}
|
|
227
|
-
if (markerName && existing.getAttribute('w:name') === markerName) {
|
|
228
|
-
if (marker.parentNode)
|
|
229
|
-
marker.parentNode.removeChild(marker);
|
|
230
|
-
return;
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
if (marker.tagName === 'w:bookmarkEnd') {
|
|
235
|
-
const markerId = marker.getAttribute('w:id');
|
|
236
|
-
if (markerId) {
|
|
237
|
-
for (const existing of findAllByTagName(targetParagraph, 'w:bookmarkEnd')) {
|
|
238
|
-
if (existing.getAttribute('w:id') === markerId) {
|
|
239
|
-
if (marker.parentNode)
|
|
240
|
-
marker.parentNode.removeChild(marker);
|
|
241
|
-
return;
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
if (marker.parentNode) {
|
|
247
|
-
marker.parentNode.removeChild(marker);
|
|
248
|
-
}
|
|
249
|
-
if (position === 'start') {
|
|
250
|
-
insertChildAt(targetParagraph, marker, paragraphContentStartIndex(targetParagraph));
|
|
251
|
-
return;
|
|
252
|
-
}
|
|
253
|
-
targetParagraph.appendChild(marker);
|
|
254
|
-
}
|
|
255
|
-
function collectBookmarksById(nodes) {
|
|
256
|
-
const byId = new Map();
|
|
257
|
-
for (const node of nodes) {
|
|
258
|
-
const id = node.getAttribute('w:id');
|
|
259
|
-
if (!id) {
|
|
260
|
-
continue;
|
|
261
|
-
}
|
|
262
|
-
const existing = byId.get(id);
|
|
263
|
-
if (existing) {
|
|
264
|
-
existing.push(node);
|
|
265
|
-
}
|
|
266
|
-
else {
|
|
267
|
-
byId.set(id, [node]);
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
return byId;
|
|
271
|
-
}
|
|
272
|
-
function hasCounterpartOutsideRemovedParagraphs(counterpartNodes, paragraphsToRemove, sourceParagraph) {
|
|
273
|
-
if (!counterpartNodes || counterpartNodes.length === 0) {
|
|
274
|
-
return false;
|
|
275
|
-
}
|
|
276
|
-
for (const node of counterpartNodes) {
|
|
277
|
-
if (!node.parentNode) {
|
|
278
|
-
continue;
|
|
279
|
-
}
|
|
280
|
-
const nodeParagraph = findContainingParagraph(node);
|
|
281
|
-
if (!nodeParagraph || nodeParagraph === sourceParagraph) {
|
|
282
|
-
continue;
|
|
283
|
-
}
|
|
284
|
-
if (!paragraphsToRemove.has(nodeParagraph)) {
|
|
285
|
-
return true;
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
return false;
|
|
289
|
-
}
|
|
290
|
-
function collectReferencedBookmarkNamesOutsideRemovedParagraphs(root, paragraphsToRemove) {
|
|
291
|
-
const names = new Set();
|
|
292
|
-
const refRegex = /\b(?:PAGEREF|REF)\s+([^\s\\]+)/g;
|
|
293
|
-
for (const instrText of findAllByTagName(root, 'w:instrText')) {
|
|
294
|
-
const paragraph = findContainingParagraph(instrText);
|
|
295
|
-
if (paragraph && paragraphsToRemove.has(paragraph)) {
|
|
296
|
-
continue;
|
|
297
|
-
}
|
|
298
|
-
const text = getLeafText(instrText) ?? '';
|
|
299
|
-
for (const match of text.matchAll(refRegex)) {
|
|
300
|
-
const name = match[1]?.trim();
|
|
301
|
-
if (name) {
|
|
302
|
-
names.add(name);
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
return names;
|
|
307
|
-
}
|
|
308
|
-
function getBookmarkNameForId(startsById, id) {
|
|
309
|
-
const starts = startsById.get(id);
|
|
310
|
-
if (!starts)
|
|
311
|
-
return undefined;
|
|
312
|
-
for (const start of starts) {
|
|
313
|
-
const name = start.getAttribute('w:name');
|
|
314
|
-
if (name)
|
|
315
|
-
return name;
|
|
316
|
-
}
|
|
317
|
-
return undefined;
|
|
318
|
-
}
|
|
319
|
-
/**
|
|
320
|
-
* Preserve bookmark markers that span outside paragraphs being removed during Reject All.
|
|
321
|
-
*
|
|
322
|
-
* Inserted paragraphs are removed wholesale. If they contain a bookmark boundary whose
|
|
323
|
-
* counterpart sits in a kept paragraph, dropping that boundary corrupts bookmark pairing.
|
|
324
|
-
* Move those boundary markers into adjacent kept paragraphs before removal.
|
|
325
|
-
*/
|
|
326
|
-
function preserveCrossParagraphBookmarksForReject(root, paragraphsToRemove) {
|
|
327
|
-
if (paragraphsToRemove.size === 0) {
|
|
328
|
-
return;
|
|
329
|
-
}
|
|
330
|
-
const startsById = collectBookmarksById(findAllByTagName(root, 'w:bookmarkStart'));
|
|
331
|
-
const endsById = collectBookmarksById(findAllByTagName(root, 'w:bookmarkEnd'));
|
|
332
|
-
const referencedNamesOutsideRemoved = collectReferencedBookmarkNamesOutsideRemovedParagraphs(root, paragraphsToRemove);
|
|
333
|
-
for (const paragraph of paragraphsToRemove) {
|
|
334
|
-
const startTarget = findNeighborParagraphOutsideRemoval(paragraph, paragraphsToRemove, 'next') ??
|
|
335
|
-
findNeighborParagraphOutsideRemoval(paragraph, paragraphsToRemove, 'previous');
|
|
336
|
-
const endTarget = findNeighborParagraphOutsideRemoval(paragraph, paragraphsToRemove, 'previous') ??
|
|
337
|
-
findNeighborParagraphOutsideRemoval(paragraph, paragraphsToRemove, 'next');
|
|
338
|
-
if (!startTarget && !endTarget) {
|
|
339
|
-
continue;
|
|
340
|
-
}
|
|
341
|
-
for (const start of findAllByTagName(paragraph, 'w:bookmarkStart')) {
|
|
342
|
-
if (!start.parentNode || !startTarget) {
|
|
343
|
-
continue;
|
|
344
|
-
}
|
|
345
|
-
if (parentElement(start) === paragraph && findFollowingSiblingParagraph(paragraph)) {
|
|
346
|
-
// A direct child of a merging paragraph rides the Step-3 merge in
|
|
347
|
-
// document order; pre-moving it here would reorder the boundary
|
|
348
|
-
// relative to the surviving untracked content.
|
|
349
|
-
continue;
|
|
350
|
-
}
|
|
351
|
-
const id = start.getAttribute('w:id');
|
|
352
|
-
if (!id) {
|
|
353
|
-
continue;
|
|
354
|
-
}
|
|
355
|
-
const startName = start.getAttribute('w:name');
|
|
356
|
-
const hasDuplicateStartOutside = hasCounterpartOutsideRemovedParagraphs(startsById.get(id), paragraphsToRemove, paragraph);
|
|
357
|
-
if (hasDuplicateStartOutside) {
|
|
358
|
-
// A surviving start marker with this ID already exists outside removed
|
|
359
|
-
// paragraphs. Moving this marker would create duplicate starts after
|
|
360
|
-
// Reject All.
|
|
361
|
-
continue;
|
|
362
|
-
}
|
|
363
|
-
const hasCounterpartOutside = hasCounterpartOutsideRemovedParagraphs(endsById.get(id), paragraphsToRemove, paragraph);
|
|
364
|
-
const referencedOutside = startName ? referencedNamesOutsideRemoved.has(startName) : false;
|
|
365
|
-
if (!hasCounterpartOutside && !referencedOutside) {
|
|
366
|
-
continue;
|
|
367
|
-
}
|
|
368
|
-
moveBookmarkMarker(start, startTarget, 'start');
|
|
369
|
-
}
|
|
370
|
-
for (const end of findAllByTagName(paragraph, 'w:bookmarkEnd')) {
|
|
371
|
-
if (!end.parentNode || !endTarget) {
|
|
372
|
-
continue;
|
|
373
|
-
}
|
|
374
|
-
if (parentElement(end) === paragraph && findFollowingSiblingParagraph(paragraph)) {
|
|
375
|
-
// A direct child of a merging paragraph rides the Step-3 merge in
|
|
376
|
-
// document order; pre-moving it here would reorder the boundary
|
|
377
|
-
// relative to the surviving untracked content.
|
|
378
|
-
continue;
|
|
379
|
-
}
|
|
380
|
-
const id = end.getAttribute('w:id');
|
|
381
|
-
if (!id) {
|
|
382
|
-
continue;
|
|
383
|
-
}
|
|
384
|
-
const hasDuplicateEndOutside = hasCounterpartOutsideRemovedParagraphs(endsById.get(id), paragraphsToRemove, paragraph);
|
|
385
|
-
if (hasDuplicateEndOutside) {
|
|
386
|
-
// A surviving end marker with this ID already exists outside removed
|
|
387
|
-
// paragraphs. Moving this marker would create duplicate ends after
|
|
388
|
-
// Reject All.
|
|
389
|
-
continue;
|
|
390
|
-
}
|
|
391
|
-
const hasCounterpartOutside = hasCounterpartOutsideRemovedParagraphs(startsById.get(id), paragraphsToRemove, paragraph);
|
|
392
|
-
const pairedName = getBookmarkNameForId(startsById, id);
|
|
393
|
-
const referencedOutside = pairedName ? referencedNamesOutsideRemoved.has(pairedName) : false;
|
|
394
|
-
if (!hasCounterpartOutside && !referencedOutside) {
|
|
395
|
-
continue;
|
|
396
|
-
}
|
|
397
|
-
moveBookmarkMarker(end, endTarget, 'end');
|
|
398
|
-
}
|
|
399
|
-
}
|
|
400
|
-
}
|
|
401
|
-
/**
|
|
402
|
-
* Accept all track changes in document XML (AST-based).
|
|
403
|
-
*
|
|
404
|
-
* - Removes w:del elements entirely (deleted content disappears)
|
|
405
|
-
* - Unwraps w:ins elements (inserted content becomes normal)
|
|
406
|
-
* - Handles w:moveFrom (remove) and w:moveTo (unwrap)
|
|
407
|
-
* - Removes format change tracking elements
|
|
408
|
-
*
|
|
409
|
-
* @param documentXml - The document.xml content with track changes
|
|
410
|
-
* @returns Document XML with all changes accepted
|
|
411
|
-
*/
|
|
412
|
-
export function acceptAllChanges(documentXml) {
|
|
413
|
-
const root = parseDocumentXml(documentXml);
|
|
414
|
-
// Merge a paragraph on Accept All iff its paragraph MARK is a tracked deletion
|
|
415
|
-
// (<w:pPr><w:rPr><w:del .../></w:rPr>) — the paragraph BREAK itself was deleted, so accepting
|
|
416
|
-
// the deletion merges the paragraph's surviving content into the following paragraph
|
|
417
|
-
// (resolveParagraphMarkRevision). The contents are deleted only via their own run-level
|
|
418
|
-
// w:del wrappers. This is the Word/LibreOffice-faithful, purely mark-based rule (the
|
|
419
|
-
// accept-side mirror of rejectAllChanges).
|
|
420
|
-
//
|
|
421
|
-
// We deliberately do NOT touch a paragraph based on content (e.g. "all runs are inside w:del"
|
|
422
|
-
// or "w:moveFrom"). A run-level deletion under an UNTRACKED paragraph mark means text was
|
|
423
|
-
// deleted from a pre-existing paragraph; Word and LibreOffice both keep that paragraph (empty)
|
|
424
|
-
// on accept, and a content-based drop over-deletes it. safe-docx's own deleted paragraphs
|
|
425
|
-
// always carry the PPR-DEL mark (wrapParagraphAsDeleted), so the mark-based rule covers them
|
|
426
|
-
// without the old content heuristic.
|
|
427
|
-
const markDeletedParagraphs = [];
|
|
428
|
-
for (const p of findAllByTagName(root, 'w:p')) {
|
|
429
|
-
if (paragraphHasParaMarker(p, 'w:del')) {
|
|
430
|
-
markDeletedParagraphs.push(p);
|
|
431
|
-
}
|
|
432
|
-
}
|
|
433
|
-
// Remove w:del elements entirely (deleted content disappears)
|
|
434
|
-
removeAllByTagName(root, 'w:del');
|
|
435
|
-
// Remove w:moveFrom elements entirely
|
|
436
|
-
removeAllByTagName(root, 'w:moveFrom');
|
|
437
|
-
// Remove move range markers
|
|
438
|
-
removeAllByTagName(root, 'w:moveFromRangeStart');
|
|
439
|
-
removeAllByTagName(root, 'w:moveFromRangeEnd');
|
|
440
|
-
removeAllByTagName(root, 'w:moveToRangeStart');
|
|
441
|
-
removeAllByTagName(root, 'w:moveToRangeEnd');
|
|
442
|
-
// Unwrap w:ins elements (keep content, remove wrapper)
|
|
443
|
-
unwrapAllByTagName(root, 'w:ins');
|
|
444
|
-
// Unwrap w:moveTo elements
|
|
445
|
-
unwrapAllByTagName(root, 'w:moveTo');
|
|
446
|
-
// Remove format change tracking
|
|
447
|
-
removeAllByTagName(root, 'w:rPrChange');
|
|
448
|
-
removeAllByTagName(root, 'w:pPrChange');
|
|
449
|
-
// Strip paragraph-level markers now that changes are accepted.
|
|
450
|
-
removeParaMarkers(root);
|
|
451
|
-
// Resolve the PPR-DEL-marked paragraphs (their paragraph mark was deleted):
|
|
452
|
-
// merge each into its following paragraph (document order, so consecutive
|
|
453
|
-
// mark-deleted paragraphs cascade forward into the first surviving one).
|
|
454
|
-
for (const p of markDeletedParagraphs) {
|
|
455
|
-
resolveParagraphMarkRevision(p);
|
|
456
|
-
}
|
|
457
|
-
// Drop hyperlink wrappers emptied by the accepted deletions above.
|
|
458
|
-
removeEmptyHyperlinks(root);
|
|
459
|
-
return serializeToXml(root);
|
|
460
|
-
}
|
|
461
|
-
/**
|
|
462
|
-
* Reject all track changes in document XML (AST-based).
|
|
463
|
-
*
|
|
464
|
-
* - Removes w:ins elements entirely (inserted content disappears)
|
|
465
|
-
* - Unwraps w:del elements and converts w:delText to w:t
|
|
466
|
-
* - Handles w:moveFrom (unwrap) and w:moveTo (remove)
|
|
467
|
-
* - Removes format change tracking elements
|
|
468
|
-
*
|
|
469
|
-
* @param documentXml - The document.xml content with track changes
|
|
470
|
-
* @returns Document XML with all changes rejected
|
|
471
|
-
*/
|
|
472
|
-
export function rejectAllChanges(documentXml) {
|
|
473
|
-
const root = parseDocumentXml(documentXml);
|
|
474
|
-
// Step 1: Merge a paragraph on Reject All iff its paragraph MARK is a tracked
|
|
475
|
-
// insertion (<w:pPr><w:rPr><w:ins .../></w:rPr>) — i.e. the paragraph break itself
|
|
476
|
-
// was inserted, so rejecting the insertion merges the paragraph's surviving content
|
|
477
|
-
// into the following paragraph (resolveParagraphMarkRevision). The contents
|
|
478
|
-
// disappear only via their own run-level w:ins wrappers. This is the
|
|
479
|
-
// Word/LibreOffice-faithful, purely mark-based rule.
|
|
480
|
-
//
|
|
481
|
-
// We deliberately do NOT touch a paragraph based on content (e.g. "all runs are inside
|
|
482
|
-
// w:ins"). A run-level insertion under an UNTRACKED paragraph mark means text was
|
|
483
|
-
// inserted into a pre-existing paragraph; Word and LibreOffice both keep that
|
|
484
|
-
// paragraph (empty) on reject, and a content-based drop over-deletes it. safe-docx's
|
|
485
|
-
// own inserted paragraphs always carry the PPR-INS mark now (wrapParagraphAsInserted),
|
|
486
|
-
// so the mark-based rule covers them without the old content heuristic.
|
|
487
|
-
const markInsertedParagraphs = new Set();
|
|
488
|
-
for (const p of findAllByTagName(root, 'w:p')) {
|
|
489
|
-
if (paragraphHasParaMarker(p, 'w:ins')) {
|
|
490
|
-
markInsertedParagraphs.add(p);
|
|
491
|
-
}
|
|
492
|
-
}
|
|
493
|
-
// Bookmarks nested inside w:ins content are dropped with Step 2's wrapper
|
|
494
|
-
// removal, so boundaries whose counterpart lives in a kept paragraph must
|
|
495
|
-
// move out first. (Direct-child bookmarks would survive the Step-3 merge.)
|
|
496
|
-
preserveCrossParagraphBookmarksForReject(root, markInsertedParagraphs);
|
|
497
|
-
// Step 2: Remove w:ins elements entirely (inserted content disappears)
|
|
498
|
-
removeAllByTagName(root, 'w:ins');
|
|
499
|
-
// Step 3: Resolve the PPR-INS-marked paragraphs (their paragraph mark was
|
|
500
|
-
// inserted): merge each into its following paragraph (document order, so
|
|
501
|
-
// consecutive mark-inserted paragraphs cascade forward into the first
|
|
502
|
-
// surviving one).
|
|
503
|
-
for (const p of markInsertedParagraphs) {
|
|
504
|
-
resolveParagraphMarkRevision(p);
|
|
505
|
-
}
|
|
506
|
-
// Remove w:moveTo elements entirely
|
|
507
|
-
removeAllByTagName(root, 'w:moveTo');
|
|
508
|
-
// Remove move range markers
|
|
509
|
-
removeAllByTagName(root, 'w:moveFromRangeStart');
|
|
510
|
-
removeAllByTagName(root, 'w:moveFromRangeEnd');
|
|
511
|
-
removeAllByTagName(root, 'w:moveToRangeStart');
|
|
512
|
-
removeAllByTagName(root, 'w:moveToRangeEnd');
|
|
513
|
-
// Unwrap w:del elements (keep content, remove wrapper)
|
|
514
|
-
unwrapAllByTagName(root, 'w:del');
|
|
515
|
-
// Unwrap w:moveFrom elements
|
|
516
|
-
unwrapAllByTagName(root, 'w:moveFrom');
|
|
517
|
-
// Convert w:delText to w:t
|
|
518
|
-
for (const delText of findAllByTagName(root, 'w:delText')) {
|
|
519
|
-
renameElement(delText, 'w:t');
|
|
520
|
-
}
|
|
521
|
-
// Convert w:delInstrText to w:instrText
|
|
522
|
-
for (const delInstrText of findAllByTagName(root, 'w:delInstrText')) {
|
|
523
|
-
renameElement(delInstrText, 'w:instrText');
|
|
524
|
-
}
|
|
525
|
-
// Remove format change tracking
|
|
526
|
-
removeAllByTagName(root, 'w:rPrChange');
|
|
527
|
-
removeAllByTagName(root, 'w:pPrChange');
|
|
528
|
-
// Strip paragraph-level markers now that changes are rejected.
|
|
529
|
-
removeParaMarkers(root);
|
|
530
|
-
// Drop hyperlink wrappers emptied by the rejected insertions above.
|
|
531
|
-
removeEmptyHyperlinks(root);
|
|
532
|
-
return serializeToXml(root);
|
|
533
|
-
}
|
|
534
|
-
/**
|
|
535
|
-
* Extract plain text content from document XML (AST-based).
|
|
536
|
-
*
|
|
537
|
-
* @param documentXml - The document.xml content
|
|
538
|
-
* @returns Plain text content
|
|
539
|
-
*/
|
|
540
|
-
export function extractTextContent(documentXml) {
|
|
541
|
-
const root = parseDocumentXml(documentXml);
|
|
542
|
-
const texts = [];
|
|
543
|
-
// Extract text from w:t elements
|
|
544
|
-
for (const t of findAllByTagName(root, 'w:t')) {
|
|
545
|
-
const text = getLeafText(t) ?? '';
|
|
546
|
-
if (text) {
|
|
547
|
-
texts.push(text);
|
|
548
|
-
}
|
|
549
|
-
}
|
|
550
|
-
// Also extract from w:delText (for rejected changes before conversion)
|
|
551
|
-
for (const delText of findAllByTagName(root, 'w:delText')) {
|
|
552
|
-
const text = getLeafText(delText) ?? '';
|
|
553
|
-
if (text) {
|
|
554
|
-
texts.push(text);
|
|
555
|
-
}
|
|
556
|
-
}
|
|
557
|
-
return texts.join('');
|
|
558
|
-
}
|
|
559
|
-
/**
|
|
560
|
-
* Extract text in document order, respecting paragraph breaks (AST-based).
|
|
561
|
-
*/
|
|
562
|
-
export function extractTextWithParagraphs(documentXml) {
|
|
563
|
-
const root = parseDocumentXml(documentXml);
|
|
564
|
-
const paragraphs = [];
|
|
565
|
-
// Find all paragraphs
|
|
566
|
-
for (const p of findAllByTagName(root, 'w:p')) {
|
|
567
|
-
const texts = [];
|
|
568
|
-
// Extract text from w:t elements within this paragraph
|
|
569
|
-
for (const t of findAllByTagName(p, 'w:t')) {
|
|
570
|
-
const text = getLeafText(t) ?? '';
|
|
571
|
-
if (text) {
|
|
572
|
-
texts.push(text);
|
|
573
|
-
}
|
|
574
|
-
}
|
|
575
|
-
// Also check w:delText
|
|
576
|
-
for (const delText of findAllByTagName(p, 'w:delText')) {
|
|
577
|
-
const text = getLeafText(delText) ?? '';
|
|
578
|
-
if (text) {
|
|
579
|
-
texts.push(text);
|
|
580
|
-
}
|
|
581
|
-
}
|
|
582
|
-
paragraphs.push(texts.join(''));
|
|
583
|
-
}
|
|
584
|
-
return paragraphs.join('\n');
|
|
585
|
-
}
|
|
586
|
-
/**
|
|
587
|
-
* Normalize text for comparison (handles whitespace differences).
|
|
588
|
-
*
|
|
589
|
-
* Performs the following normalization:
|
|
590
|
-
* - Convert CRLF and CR to LF
|
|
591
|
-
* - Convert tabs to spaces
|
|
592
|
-
* - Collapse multiple spaces to single space
|
|
593
|
-
* - Strip trailing spaces from each line
|
|
594
|
-
* - Collapse multiple newlines to single newline
|
|
595
|
-
* - Trim leading/trailing whitespace
|
|
596
|
-
*/
|
|
597
|
-
export function normalizeText(text) {
|
|
598
|
-
return text
|
|
599
|
-
.replace(/\r\n/g, '\n')
|
|
600
|
-
.replace(/\r/g, '\n')
|
|
601
|
-
.replace(/\t/g, ' ')
|
|
602
|
-
.replace(/ +/g, ' ')
|
|
603
|
-
.replace(/ \n/g, '\n') // Strip trailing spaces from lines
|
|
604
|
-
.replace(/\n /g, '\n') // Strip leading spaces from lines
|
|
605
|
-
.replace(/\n+/g, '\n')
|
|
606
|
-
.trim();
|
|
607
|
-
}
|
|
608
|
-
/**
|
|
609
|
-
* Compare two texts and return detailed differences.
|
|
610
|
-
*/
|
|
611
|
-
export function compareTexts(expected, actual) {
|
|
612
|
-
const normalizedExpected = normalizeText(expected);
|
|
613
|
-
const normalizedActual = normalizeText(actual);
|
|
614
|
-
const differences = [];
|
|
615
|
-
if (expected !== actual) {
|
|
616
|
-
// Find first difference
|
|
617
|
-
let firstDiff = 0;
|
|
618
|
-
while (firstDiff < expected.length && firstDiff < actual.length) {
|
|
619
|
-
if (expected[firstDiff] !== actual[firstDiff]) {
|
|
620
|
-
break;
|
|
621
|
-
}
|
|
622
|
-
firstDiff++;
|
|
623
|
-
}
|
|
624
|
-
if (firstDiff < expected.length || firstDiff < actual.length) {
|
|
625
|
-
const context = 50;
|
|
626
|
-
const start = Math.max(0, firstDiff - context);
|
|
627
|
-
const expectedSnippet = expected.slice(start, firstDiff + context);
|
|
628
|
-
const actualSnippet = actual.slice(start, firstDiff + context);
|
|
629
|
-
differences.push(`First difference at position ${firstDiff}:`);
|
|
630
|
-
differences.push(` Expected: "...${expectedSnippet}..."`);
|
|
631
|
-
differences.push(` Actual: "...${actualSnippet}..."`);
|
|
632
|
-
}
|
|
633
|
-
}
|
|
634
|
-
return {
|
|
635
|
-
identical: expected === actual,
|
|
636
|
-
normalizedIdentical: normalizedExpected === normalizedActual,
|
|
637
|
-
expectedLength: expected.length,
|
|
638
|
-
actualLength: actual.length,
|
|
639
|
-
differences,
|
|
640
|
-
};
|
|
641
|
-
}
|
|
642
|
-
//# sourceMappingURL=trackChangesAcceptorAst.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"trackChangesAcceptorAst.js","sourceRoot":"","sources":["../../../src/baselines/atomizer/trackChangesAcceptorAst.ts"],"names":[],"mappings":"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"}
|