@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
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* accept_ai_edits — selective accept/reject of tracked changes by revision id or
|
|
3
|
+
* author (#123).
|
|
4
|
+
*
|
|
5
|
+
* The strongest argument for tracked-changes-as-canonical (#118/#120) is that
|
|
6
|
+
* acceptance can target only the AI actor's revisions, leaving any pre-existing
|
|
7
|
+
* third-party tracked changes byte-untouched. This module resolves a target set
|
|
8
|
+
* of revision ids (directly, or from an author string), refuses ambiguous
|
|
9
|
+
* overlaps by default, and drives the existing (whole-document) accept/reject
|
|
10
|
+
* engines through a revision-id filter so only the targeted revisions are
|
|
11
|
+
* resolved.
|
|
12
|
+
*
|
|
13
|
+
* Ambiguity: OOXML permits — but Word does not define behavior for — a revision
|
|
14
|
+
* of one actor structurally containing a revision of another (nested
|
|
15
|
+
* `w:ins`/`w:del`/`w:moveFrom`/`w:moveTo`). Selective accept/reject is defined
|
|
16
|
+
* only on a normalized, non-overlapping revision graph; the ambiguous case
|
|
17
|
+
* hard-errors with a structured list of the offending pairs unless the caller
|
|
18
|
+
* opts into `normalizeFirst` (best-effort, no byte-identical promise).
|
|
19
|
+
*/
|
|
20
|
+
import { OOXML } from './namespaces.js';
|
|
21
|
+
import { TRACKED_CHANGE_ELEMENT_NAME_SET } from './revision-vocabulary.js';
|
|
22
|
+
import { acceptChanges, revisionElementId, } from './accept_changes.js';
|
|
23
|
+
import { rejectChanges } from './reject_changes.js';
|
|
24
|
+
const W_NS = OOXML.W_NS;
|
|
25
|
+
/**
|
|
26
|
+
* Content-wrapper revisions whose cross-actor nesting is the ambiguous case the
|
|
27
|
+
* spec calls out ("Word doesn't support nested ins/del/move"). Property-change
|
|
28
|
+
* and cell-topology revisions are excluded: a `w:rPrChange` legitimately sits
|
|
29
|
+
* inside an inserted run without making acceptance ambiguous.
|
|
30
|
+
*/
|
|
31
|
+
const OVERLAP_CONTAINER_LOCALS = new Set(['ins', 'del', 'moveFrom', 'moveTo']);
|
|
32
|
+
/**
|
|
33
|
+
* Property-change revision records. Accepting removes the record; rejecting
|
|
34
|
+
* rewrites the enclosing property element — so a selected one that shares its
|
|
35
|
+
* property container with a foreign revision is ambiguous.
|
|
36
|
+
*/
|
|
37
|
+
const PROPERTY_CHANGE_LOCALS = new Set([
|
|
38
|
+
'rPrChange', 'pPrChange', 'sectPrChange', 'tblPrChange',
|
|
39
|
+
'tblPrExChange', 'trPrChange', 'tcPrChange', 'tblGridChange', 'numberingChange',
|
|
40
|
+
]);
|
|
41
|
+
/** A `w:ins`/`w:del` that is a paragraph-mark marker (child of `w:pPr > w:rPr`). */
|
|
42
|
+
function isParagraphMarkMarker(el) {
|
|
43
|
+
if (el.localName !== 'ins' && el.localName !== 'del')
|
|
44
|
+
return false;
|
|
45
|
+
const parent = el.parentNode;
|
|
46
|
+
const grand = parent?.parentNode;
|
|
47
|
+
return (!!parent && parent.namespaceURI === W_NS && parent.localName === 'rPr' &&
|
|
48
|
+
!!grand && grand.namespaceURI === W_NS && grand.localName === 'pPr');
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* The property element whose contents accept/reject would rewrite or drop when
|
|
52
|
+
* resolving `el`: the nearest enclosing `w:pPr` (so a paragraph-mark or pPrChange
|
|
53
|
+
* collision is seen across the whole paragraph properties), else `el`'s direct
|
|
54
|
+
* parent property element (a run's `w:rPr` for a run-level rPrChange).
|
|
55
|
+
*/
|
|
56
|
+
function enclosingPropertyContainer(el) {
|
|
57
|
+
let cur = el.parentNode;
|
|
58
|
+
while (cur) {
|
|
59
|
+
if (cur.nodeType === 1 && cur.namespaceURI === W_NS && cur.localName === 'pPr') {
|
|
60
|
+
return cur;
|
|
61
|
+
}
|
|
62
|
+
cur = cur.parentNode;
|
|
63
|
+
}
|
|
64
|
+
const parent = el.parentNode;
|
|
65
|
+
return parent && parent.nodeType === 1 ? parent : null;
|
|
66
|
+
}
|
|
67
|
+
/** Thrown when selective accept/reject would touch an ambiguous revision graph. */
|
|
68
|
+
export class AmbiguousRevisionOverlapError extends Error {
|
|
69
|
+
code = 'AMBIGUOUS_REVISION_OVERLAP';
|
|
70
|
+
overlaps;
|
|
71
|
+
constructor(overlaps) {
|
|
72
|
+
super(`Selective accept/reject is ambiguous: ${overlaps.length} revision overlap(s) where a ` +
|
|
73
|
+
`targeted revision structurally contains, or is contained by, a non-targeted revision. ` +
|
|
74
|
+
`Pass normalizeFirst to attempt best-effort resolution.`);
|
|
75
|
+
this.name = 'AmbiguousRevisionOverlapError';
|
|
76
|
+
this.overlaps = overlaps;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
function storyRoot(doc) {
|
|
80
|
+
return doc.getElementsByTagNameNS(W_NS, 'body').item(0) ?? doc.documentElement ?? null;
|
|
81
|
+
}
|
|
82
|
+
function revisionAuthor(el) {
|
|
83
|
+
return el.getAttributeNS(W_NS, 'author') ?? el.getAttribute('w:author');
|
|
84
|
+
}
|
|
85
|
+
/** Every tracked-change element under `root` (any revision type). */
|
|
86
|
+
export function collectRevisionElements(root) {
|
|
87
|
+
const out = [];
|
|
88
|
+
const all = root.getElementsByTagNameNS(W_NS, '*');
|
|
89
|
+
for (let i = 0; i < all.length; i++) {
|
|
90
|
+
const el = all[i];
|
|
91
|
+
if (TRACKED_CHANGE_ELEMENT_NAME_SET.has(el.localName))
|
|
92
|
+
out.push(el);
|
|
93
|
+
}
|
|
94
|
+
return out;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Resolve the target revision-id set from a selector, given the revision
|
|
98
|
+
* elements available across all stories. `revisionIds` wins when provided;
|
|
99
|
+
* otherwise `author` resolves to the ids of every revision it authored.
|
|
100
|
+
*/
|
|
101
|
+
export function resolveSelectedIds(revisionElements, selector) {
|
|
102
|
+
const ids = new Set();
|
|
103
|
+
if (selector.revisionIds && selector.revisionIds.length > 0) {
|
|
104
|
+
for (const id of selector.revisionIds)
|
|
105
|
+
ids.add(String(id));
|
|
106
|
+
return ids;
|
|
107
|
+
}
|
|
108
|
+
if (selector.author != null) {
|
|
109
|
+
for (const el of revisionElements) {
|
|
110
|
+
if (revisionAuthor(el) === selector.author) {
|
|
111
|
+
const id = revisionElementId(el);
|
|
112
|
+
if (id != null)
|
|
113
|
+
ids.add(id);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return ids;
|
|
117
|
+
}
|
|
118
|
+
throw new Error('AiEditSelector requires either revisionIds or author.');
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Find ambiguous overlaps within a single story: a targeted content-wrapper
|
|
122
|
+
* revision that structurally contains — or is contained by — a non-targeted
|
|
123
|
+
* content-wrapper revision.
|
|
124
|
+
*/
|
|
125
|
+
export function detectAmbiguousOverlaps(root, selectedIds) {
|
|
126
|
+
const overlaps = [];
|
|
127
|
+
const seen = new Set();
|
|
128
|
+
const record = (outer, inner) => {
|
|
129
|
+
const oid = revisionElementId(outer);
|
|
130
|
+
const iid = revisionElementId(inner);
|
|
131
|
+
const key = `${oid}|${iid}|${outer.localName}|${inner.localName}`;
|
|
132
|
+
if (seen.has(key))
|
|
133
|
+
return;
|
|
134
|
+
seen.add(key);
|
|
135
|
+
overlaps.push({
|
|
136
|
+
outerId: oid,
|
|
137
|
+
outerLocalName: outer.localName,
|
|
138
|
+
outerAuthor: revisionAuthor(outer),
|
|
139
|
+
innerId: iid,
|
|
140
|
+
innerLocalName: inner.localName,
|
|
141
|
+
innerAuthor: revisionAuthor(inner),
|
|
142
|
+
});
|
|
143
|
+
};
|
|
144
|
+
const isSelectedContainer = (el) => {
|
|
145
|
+
if (!OVERLAP_CONTAINER_LOCALS.has(el.localName))
|
|
146
|
+
return false;
|
|
147
|
+
const id = revisionElementId(el);
|
|
148
|
+
return id != null && selectedIds.has(id);
|
|
149
|
+
};
|
|
150
|
+
const all = root.getElementsByTagNameNS(W_NS, '*');
|
|
151
|
+
for (let i = 0; i < all.length; i++) {
|
|
152
|
+
const el = all[i];
|
|
153
|
+
if (!isSelectedContainer(el))
|
|
154
|
+
continue;
|
|
155
|
+
// Foreign container revision nested INSIDE the selected one.
|
|
156
|
+
const descendants = el.getElementsByTagNameNS(W_NS, '*');
|
|
157
|
+
for (let j = 0; j < descendants.length; j++) {
|
|
158
|
+
const d = descendants[j];
|
|
159
|
+
if (!OVERLAP_CONTAINER_LOCALS.has(d.localName))
|
|
160
|
+
continue;
|
|
161
|
+
const did = revisionElementId(d);
|
|
162
|
+
if (did == null || !selectedIds.has(did))
|
|
163
|
+
record(el, d);
|
|
164
|
+
}
|
|
165
|
+
// Selected revision nested INSIDE a foreign container revision.
|
|
166
|
+
let anc = el.parentNode;
|
|
167
|
+
while (anc) {
|
|
168
|
+
if (anc.nodeType === 1) {
|
|
169
|
+
const a = anc;
|
|
170
|
+
if (a.namespaceURI === W_NS && OVERLAP_CONTAINER_LOCALS.has(a.localName)) {
|
|
171
|
+
const aid = revisionElementId(a);
|
|
172
|
+
if (aid == null || !selectedIds.has(aid))
|
|
173
|
+
record(a, el);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
anc = anc.parentNode;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
// Property-container collision: a selected property-change or paragraph-mark
|
|
180
|
+
// revision that shares its property container (w:pPr or a run's w:rPr) with a
|
|
181
|
+
// foreign revision. Accepting a paragraph-mark merge drops the source w:pPr,
|
|
182
|
+
// and rejecting a property change rewrites the container — either would alter
|
|
183
|
+
// the foreign revision, so it is ambiguous.
|
|
184
|
+
for (let i = 0; i < all.length; i++) {
|
|
185
|
+
const el = all[i];
|
|
186
|
+
const isProperty = PROPERTY_CHANGE_LOCALS.has(el.localName) || isParagraphMarkMarker(el);
|
|
187
|
+
if (!isProperty)
|
|
188
|
+
continue;
|
|
189
|
+
const id = revisionElementId(el);
|
|
190
|
+
if (id == null || !selectedIds.has(id))
|
|
191
|
+
continue;
|
|
192
|
+
const container = enclosingPropertyContainer(el);
|
|
193
|
+
if (!container)
|
|
194
|
+
continue;
|
|
195
|
+
const siblings = container.getElementsByTagNameNS(W_NS, '*');
|
|
196
|
+
for (let j = 0; j < siblings.length; j++) {
|
|
197
|
+
const s = siblings[j];
|
|
198
|
+
if (s === el)
|
|
199
|
+
continue;
|
|
200
|
+
if (!TRACKED_CHANGE_ELEMENT_NAME_SET.has(s.localName))
|
|
201
|
+
continue;
|
|
202
|
+
const sid = revisionElementId(s);
|
|
203
|
+
if (sid == null || !selectedIds.has(sid))
|
|
204
|
+
record(el, s);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
return overlaps;
|
|
208
|
+
}
|
|
209
|
+
/** Build a revision filter that matches exactly the selected ids. */
|
|
210
|
+
export function selectedIdFilter(selectedIds) {
|
|
211
|
+
return (el) => {
|
|
212
|
+
const id = revisionElementId(el);
|
|
213
|
+
return id != null && selectedIds.has(id);
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Accept only the targeted revisions in a single story `doc`, leaving all other
|
|
218
|
+
* revisions byte-untouched. Hard-errors on an ambiguous overlap unless
|
|
219
|
+
* `normalizeFirst` is set. Mutates `doc` in place.
|
|
220
|
+
*/
|
|
221
|
+
export function acceptAIEdits(doc, selector) {
|
|
222
|
+
const root = storyRoot(doc);
|
|
223
|
+
if (!root)
|
|
224
|
+
return { result: emptyAccept(), selectedIds: [], overlaps: [] };
|
|
225
|
+
const selectedIds = resolveSelectedIds(collectRevisionElements(root), selector);
|
|
226
|
+
const overlaps = selector.normalizeFirst ? [] : detectAmbiguousOverlaps(root, selectedIds);
|
|
227
|
+
if (overlaps.length > 0)
|
|
228
|
+
throw new AmbiguousRevisionOverlapError(overlaps);
|
|
229
|
+
const result = acceptChanges(doc, { filter: selectedIdFilter(selectedIds) });
|
|
230
|
+
return { result, selectedIds: [...selectedIds], overlaps };
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Reject only the targeted revisions in a single story `doc`, leaving all other
|
|
234
|
+
* revisions byte-untouched. Symmetric to {@link acceptAIEdits}.
|
|
235
|
+
*/
|
|
236
|
+
export function rejectAIEdits(doc, selector) {
|
|
237
|
+
const root = storyRoot(doc);
|
|
238
|
+
if (!root)
|
|
239
|
+
return { result: emptyReject(), selectedIds: [], overlaps: [] };
|
|
240
|
+
const selectedIds = resolveSelectedIds(collectRevisionElements(root), selector);
|
|
241
|
+
const overlaps = selector.normalizeFirst ? [] : detectAmbiguousOverlaps(root, selectedIds);
|
|
242
|
+
if (overlaps.length > 0)
|
|
243
|
+
throw new AmbiguousRevisionOverlapError(overlaps);
|
|
244
|
+
const result = rejectChanges(doc, { filter: selectedIdFilter(selectedIds) });
|
|
245
|
+
return { result, selectedIds: [...selectedIds], overlaps };
|
|
246
|
+
}
|
|
247
|
+
function emptyAccept() {
|
|
248
|
+
return { insertionsAccepted: 0, deletionsAccepted: 0, movesResolved: 0, propertyChangesResolved: 0 };
|
|
249
|
+
}
|
|
250
|
+
function emptyReject() {
|
|
251
|
+
return { insertionsRemoved: 0, deletionsRestored: 0, movesReverted: 0, propertyChangesReverted: 0 };
|
|
252
|
+
}
|
|
253
|
+
//# sourceMappingURL=accept_ai_edits.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accept_ai_edits.js","sourceRoot":"","sources":["../../src/primitives/accept_ai_edits.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* accept_changes — accept all tracked changes in a OOXML document body.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* Resolves the supported revision subset by:
|
|
5
5
|
* - Removing w:del elements and their content
|
|
6
6
|
* - Unwrapping w:ins elements (promoting children)
|
|
7
7
|
* - Removing w:moveFrom (source), unwrapping w:moveTo (destination)
|
|
@@ -10,6 +10,10 @@
|
|
|
10
10
|
* mark was a tracked deletion into the following paragraph
|
|
11
11
|
* - Cleaning up move range markers and rsidDel attributes
|
|
12
12
|
*
|
|
13
|
+
* Numbering, table-grid/exception, cell-topology, custom XML, and extension
|
|
14
|
+
* conflict records are not semantically resolved here; see the advanced
|
|
15
|
+
* revision classification manifest.
|
|
16
|
+
*
|
|
13
17
|
* Operates on the W3C DOM (`@xmldom/xmldom`) — the same API used
|
|
14
18
|
* throughout docx-primitives-ts (contrast with docx-comparison's
|
|
15
19
|
* custom WmlElement AST).
|
|
@@ -20,12 +24,41 @@ export type AcceptChangesResult = {
|
|
|
20
24
|
movesResolved: number;
|
|
21
25
|
propertyChangesResolved: number;
|
|
22
26
|
};
|
|
27
|
+
/**
|
|
28
|
+
* Predicate selecting which revision elements a sweep processes. The default
|
|
29
|
+
* ({@link ACCEPT_ALL}) processes every revision — the original whole-document
|
|
30
|
+
* behavior. `acceptAIEdits`/`rejectAIEdits` (#123) pass a predicate that matches
|
|
31
|
+
* only the targeted revision ids so foreign (non-target) revisions are left
|
|
32
|
+
* byte-untouched.
|
|
33
|
+
*/
|
|
34
|
+
export type RevisionFilter = (el: Element) => boolean;
|
|
35
|
+
/** The package-wide revision id (`w:id`) of a revision element, if any. */
|
|
36
|
+
export declare function revisionElementId(el: Element): string | null;
|
|
23
37
|
/**
|
|
24
38
|
* Accept all tracked changes in the document body or story root, producing a
|
|
25
|
-
*
|
|
39
|
+
* document with supported revision records resolved.
|
|
26
40
|
*
|
|
27
41
|
* Mutates the Document in place (same convention as simplifyRedlines
|
|
28
42
|
* and mergeRuns).
|
|
43
|
+
*
|
|
44
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.13.5.21
|
|
45
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.13.5.22
|
|
46
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.13.5.25
|
|
47
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.13.5.26
|
|
48
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.13.5.29
|
|
49
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.13.5.30
|
|
50
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.13.5.31
|
|
51
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.13.5.32
|
|
52
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.13.5.34
|
|
53
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.13.5.36
|
|
54
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.13.5.37
|
|
55
|
+
* @ooxmlSpec ooxml.ecma376.5ed.part1.revisions.moves
|
|
56
|
+
* @ooxmlSpec ooxml.ecma376.5ed.part1.revisions.run-properties-paragraph-mark
|
|
57
|
+
* @ooxmlSpec ooxml.ecma376.5ed.part1.revisions.section-properties
|
|
58
|
+
* @ooxmlSpec ooxml.ecma376.5ed.part1.revisions.table-properties
|
|
59
|
+
* @ooxmlSpec ooxml.ecma376.5ed.part1.revisions.table-cell-properties
|
|
29
60
|
*/
|
|
30
|
-
export declare function acceptChanges(doc: Document
|
|
61
|
+
export declare function acceptChanges(doc: Document, opts?: {
|
|
62
|
+
filter?: RevisionFilter;
|
|
63
|
+
}): AcceptChangesResult;
|
|
31
64
|
//# sourceMappingURL=accept_changes.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accept_changes.d.ts","sourceRoot":"","sources":["../../src/primitives/accept_changes.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"accept_changes.d.ts","sourceRoot":"","sources":["../../src/primitives/accept_changes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAMH,MAAM,MAAM,mBAAmB,GAAG;IAChC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,uBAAuB,EAAE,MAAM,CAAC;CACjC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,EAAE,EAAE,OAAO,KAAK,OAAO,CAAC;AAItD,2EAA2E;AAC3E,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAE5D;AA2OD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,QAAQ,EACb,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,cAAc,CAAA;CAAE,GACjC,mBAAmB,CAwGrB"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* accept_changes — accept all tracked changes in a OOXML document body.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* Resolves the supported revision subset by:
|
|
5
5
|
* - Removing w:del elements and their content
|
|
6
6
|
* - Unwrapping w:ins elements (promoting children)
|
|
7
7
|
* - Removing w:moveFrom (source), unwrapping w:moveTo (destination)
|
|
@@ -10,12 +10,21 @@
|
|
|
10
10
|
* mark was a tracked deletion into the following paragraph
|
|
11
11
|
* - Cleaning up move range markers and rsidDel attributes
|
|
12
12
|
*
|
|
13
|
+
* Numbering, table-grid/exception, cell-topology, custom XML, and extension
|
|
14
|
+
* conflict records are not semantically resolved here; see the advanced
|
|
15
|
+
* revision classification manifest.
|
|
16
|
+
*
|
|
13
17
|
* Operates on the W3C DOM (`@xmldom/xmldom`) — the same API used
|
|
14
18
|
* throughout docx-primitives-ts (contrast with docx-comparison's
|
|
15
19
|
* custom WmlElement AST).
|
|
16
20
|
*/
|
|
17
21
|
import { OOXML } from './namespaces.js';
|
|
18
22
|
const W_NS = OOXML.W_NS;
|
|
23
|
+
const ACCEPT_ALL = () => true;
|
|
24
|
+
/** The package-wide revision id (`w:id`) of a revision element, if any. */
|
|
25
|
+
export function revisionElementId(el) {
|
|
26
|
+
return el.getAttributeNS(W_NS, 'id') ?? el.getAttribute('w:id');
|
|
27
|
+
}
|
|
19
28
|
// ── DOM helpers (internal) ──────────────────────────────────────────
|
|
20
29
|
function isW(node, localName) {
|
|
21
30
|
return (node.nodeType === 1 &&
|
|
@@ -34,8 +43,8 @@ function getDepth(node) {
|
|
|
34
43
|
function collectByLocalName(container, localName) {
|
|
35
44
|
return Array.from(container.getElementsByTagNameNS(W_NS, localName));
|
|
36
45
|
}
|
|
37
|
-
function removeAllByLocalName(container, localName) {
|
|
38
|
-
const elements = collectByLocalName(container, localName);
|
|
46
|
+
function removeAllByLocalName(container, localName, filter = ACCEPT_ALL) {
|
|
47
|
+
const elements = collectByLocalName(container, localName).filter(filter);
|
|
39
48
|
let count = 0;
|
|
40
49
|
for (const el of elements) {
|
|
41
50
|
if (el.parentNode) {
|
|
@@ -45,8 +54,8 @@ function removeAllByLocalName(container, localName) {
|
|
|
45
54
|
}
|
|
46
55
|
return count;
|
|
47
56
|
}
|
|
48
|
-
function unwrapAllByLocalName(container, localName) {
|
|
49
|
-
const elements = collectByLocalName(container, localName);
|
|
57
|
+
function unwrapAllByLocalName(container, localName, filter = ACCEPT_ALL) {
|
|
58
|
+
const elements = collectByLocalName(container, localName).filter(filter);
|
|
50
59
|
// Sort deepest-first to handle nested wrappers correctly
|
|
51
60
|
elements.sort((a, b) => getDepth(b) - getDepth(a));
|
|
52
61
|
let count = 0;
|
|
@@ -67,7 +76,7 @@ function unwrapAllByLocalName(container, localName) {
|
|
|
67
76
|
* Check if a paragraph has a paragraph-level revision marker.
|
|
68
77
|
* Pattern: w:p > w:pPr > w:rPr > w:del (or w:ins)
|
|
69
78
|
*/
|
|
70
|
-
function paragraphHasParaMarker(p, markerLocalName) {
|
|
79
|
+
function paragraphHasParaMarker(p, markerLocalName, filter = ACCEPT_ALL) {
|
|
71
80
|
for (let i = 0; i < p.childNodes.length; i++) {
|
|
72
81
|
const child = p.childNodes[i];
|
|
73
82
|
if (!isW(child, 'pPr'))
|
|
@@ -78,7 +87,7 @@ function paragraphHasParaMarker(p, markerLocalName) {
|
|
|
78
87
|
continue;
|
|
79
88
|
for (let k = 0; k < pPrChild.childNodes.length; k++) {
|
|
80
89
|
const rPrChild = pPrChild.childNodes[k];
|
|
81
|
-
if (isW(rPrChild, markerLocalName))
|
|
90
|
+
if (isW(rPrChild, markerLocalName) && filter(rPrChild))
|
|
82
91
|
return true;
|
|
83
92
|
}
|
|
84
93
|
}
|
|
@@ -231,12 +240,31 @@ function resolveParagraphMarkRevision(p) {
|
|
|
231
240
|
// ── Public API ──────────────────────────────────────────────────────
|
|
232
241
|
/**
|
|
233
242
|
* Accept all tracked changes in the document body or story root, producing a
|
|
234
|
-
*
|
|
243
|
+
* document with supported revision records resolved.
|
|
235
244
|
*
|
|
236
245
|
* Mutates the Document in place (same convention as simplifyRedlines
|
|
237
246
|
* and mergeRuns).
|
|
247
|
+
*
|
|
248
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.13.5.21
|
|
249
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.13.5.22
|
|
250
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.13.5.25
|
|
251
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.13.5.26
|
|
252
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.13.5.29
|
|
253
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.13.5.30
|
|
254
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.13.5.31
|
|
255
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.13.5.32
|
|
256
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.13.5.34
|
|
257
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.13.5.36
|
|
258
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.13.5.37
|
|
259
|
+
* @ooxmlSpec ooxml.ecma376.5ed.part1.revisions.moves
|
|
260
|
+
* @ooxmlSpec ooxml.ecma376.5ed.part1.revisions.run-properties-paragraph-mark
|
|
261
|
+
* @ooxmlSpec ooxml.ecma376.5ed.part1.revisions.section-properties
|
|
262
|
+
* @ooxmlSpec ooxml.ecma376.5ed.part1.revisions.table-properties
|
|
263
|
+
* @ooxmlSpec ooxml.ecma376.5ed.part1.revisions.table-cell-properties
|
|
238
264
|
*/
|
|
239
|
-
export function acceptChanges(doc) {
|
|
265
|
+
export function acceptChanges(doc, opts) {
|
|
266
|
+
const filter = opts?.filter ?? ACCEPT_ALL;
|
|
267
|
+
const selective = filter !== ACCEPT_ALL;
|
|
240
268
|
const root = doc.getElementsByTagNameNS(W_NS, 'body').item(0) ?? doc.documentElement;
|
|
241
269
|
if (!root) {
|
|
242
270
|
return { insertionsAccepted: 0, deletionsAccepted: 0, movesResolved: 0, propertyChangesResolved: 0 };
|
|
@@ -255,27 +283,29 @@ export function acceptChanges(doc) {
|
|
|
255
283
|
// accept. safe-docx's deleted paragraphs always carry the mark now, so the
|
|
256
284
|
// mark-based rule suffices and is Word-faithful. (Mirrors acceptAllChanges and the
|
|
257
285
|
// reject-side rule.)
|
|
258
|
-
if (paragraphHasParaMarker(p, 'del')) {
|
|
286
|
+
if (paragraphHasParaMarker(p, 'del', filter)) {
|
|
259
287
|
markDeletedParagraphs.push(p);
|
|
260
288
|
}
|
|
261
289
|
}
|
|
262
290
|
// Phase B — Remove deletions and move sources
|
|
263
|
-
const deletionsAccepted = removeAllByLocalName(root, 'del');
|
|
264
|
-
const moveFromRemoved = removeAllByLocalName(root, 'moveFrom');
|
|
265
|
-
removeAllByLocalName(root, 'moveFromRangeStart');
|
|
266
|
-
removeAllByLocalName(root, 'moveFromRangeEnd');
|
|
267
|
-
removeAllByLocalName(root, 'moveToRangeStart');
|
|
268
|
-
removeAllByLocalName(root, 'moveToRangeEnd');
|
|
291
|
+
const deletionsAccepted = removeAllByLocalName(root, 'del', filter);
|
|
292
|
+
const moveFromRemoved = removeAllByLocalName(root, 'moveFrom', filter);
|
|
293
|
+
removeAllByLocalName(root, 'moveFromRangeStart', filter);
|
|
294
|
+
removeAllByLocalName(root, 'moveFromRangeEnd', filter);
|
|
295
|
+
removeAllByLocalName(root, 'moveToRangeStart', filter);
|
|
296
|
+
removeAllByLocalName(root, 'moveToRangeEnd', filter);
|
|
269
297
|
// Phase C — Unwrap insertions and move destinations (depth-sorted)
|
|
270
|
-
const insertionsAccepted = unwrapAllByLocalName(root, 'ins');
|
|
271
|
-
const moveToUnwrapped = unwrapAllByLocalName(root, 'moveTo');
|
|
298
|
+
const insertionsAccepted = unwrapAllByLocalName(root, 'ins', filter);
|
|
299
|
+
const moveToUnwrapped = unwrapAllByLocalName(root, 'moveTo', filter);
|
|
272
300
|
// Phase D — Remove property change records
|
|
273
301
|
let propertyChangesResolved = 0;
|
|
274
302
|
for (const localName of PR_CHANGE_LOCALS) {
|
|
275
|
-
propertyChangesResolved += removeAllByLocalName(root, localName);
|
|
303
|
+
propertyChangesResolved += removeAllByLocalName(root, localName, filter);
|
|
276
304
|
}
|
|
277
305
|
// Phase E — Cleanup
|
|
278
|
-
// Strip paragraph-level revision markers from w:pPr/w:rPr
|
|
306
|
+
// Strip paragraph-level revision markers from w:pPr/w:rPr (only those the
|
|
307
|
+
// filter selects, so a selective accept leaves foreign paragraph-mark
|
|
308
|
+
// revisions byte-untouched).
|
|
279
309
|
for (const p of collectByLocalName(root, 'p')) {
|
|
280
310
|
for (let i = 0; i < p.childNodes.length; i++) {
|
|
281
311
|
const child = p.childNodes[i];
|
|
@@ -289,7 +319,7 @@ export function acceptChanges(doc) {
|
|
|
289
319
|
const toRemove = [];
|
|
290
320
|
for (let k = 0; k < pPrChild.childNodes.length; k++) {
|
|
291
321
|
const rPrChild = pPrChild.childNodes[k];
|
|
292
|
-
if (isW(rPrChild, 'ins') || isW(rPrChild, 'del')) {
|
|
322
|
+
if ((isW(rPrChild, 'ins') || isW(rPrChild, 'del')) && filter(rPrChild)) {
|
|
293
323
|
toRemove.push(rPrChild);
|
|
294
324
|
}
|
|
295
325
|
}
|
|
@@ -305,16 +335,22 @@ export function acceptChanges(doc) {
|
|
|
305
335
|
for (const p of markDeletedParagraphs) {
|
|
306
336
|
resolveParagraphMarkRevision(p);
|
|
307
337
|
}
|
|
308
|
-
// Strip w:rsidDel attributes on remaining elements
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
el.
|
|
338
|
+
// Strip w:rsidDel attributes on remaining elements. Skipped in selective
|
|
339
|
+
// mode: rsidDel is a document-wide save-id, and a selective accept must not
|
|
340
|
+
// mutate elements outside the targeted revision set (the mixed-author
|
|
341
|
+
// byte-identical invariant, #125). The accepted revisions are removed/unwrapped
|
|
342
|
+
// above, taking their own rsidDel with them.
|
|
343
|
+
if (!selective) {
|
|
344
|
+
const allElements = root.getElementsByTagNameNS(W_NS, '*');
|
|
345
|
+
for (let i = 0; i < allElements.length; i++) {
|
|
346
|
+
const el = allElements[i];
|
|
347
|
+
if (el.hasAttributeNS(W_NS, 'rsidDel')) {
|
|
348
|
+
el.removeAttributeNS(W_NS, 'rsidDel');
|
|
349
|
+
}
|
|
350
|
+
// Also check prefixed form
|
|
351
|
+
if (el.hasAttribute('w:rsidDel')) {
|
|
352
|
+
el.removeAttribute('w:rsidDel');
|
|
353
|
+
}
|
|
318
354
|
}
|
|
319
355
|
}
|
|
320
356
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accept_changes.js","sourceRoot":"","sources":["../../src/primitives/accept_changes.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"accept_changes.js","sourceRoot":"","sources":["../../src/primitives/accept_changes.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,11 +2,55 @@ export type ParagraphBookmark = {
|
|
|
2
2
|
name: string;
|
|
3
3
|
numericId: number;
|
|
4
4
|
};
|
|
5
|
+
/**
|
|
6
|
+
* Collect every bookmark name attached to a paragraph, in discovery order.
|
|
7
|
+
*
|
|
8
|
+
* Supports both attachment styles:
|
|
9
|
+
* 1) sibling: `<w:bookmarkStart/> <w:p/> <w:bookmarkEnd/>`
|
|
10
|
+
* 2) inside: `<w:p><w:bookmarkStart/> ... </w:p>`
|
|
11
|
+
*
|
|
12
|
+
* NOTE: this is a *reporting* helper — it answers "what names sit around/inside
|
|
13
|
+
* this paragraph", by adjacency. It deliberately does NOT pair start/end by
|
|
14
|
+
* `w:id`, so it can include a neighbouring point bookmark or one end of a
|
|
15
|
+
* multi-paragraph range. Do not use it to resolve a caller-supplied anchor;
|
|
16
|
+
* `findParagraphByBookmarkId` does the id-paired, exactly-one-paragraph check.
|
|
17
|
+
*/
|
|
18
|
+
export declare function getParagraphBookmarkNames(p: Element): string[];
|
|
19
|
+
/**
|
|
20
|
+
* The paragraph's canonical safe-docx id (`_bk_*`), or null when it has none.
|
|
21
|
+
*
|
|
22
|
+
* This intentionally stays `_bk_`-only: it is the id we *report* for a paragraph.
|
|
23
|
+
* To *resolve* an anchor the caller supplied, use `findParagraphByBookmarkId`,
|
|
24
|
+
* which accepts any bookmark name on the paragraph.
|
|
25
|
+
*/
|
|
5
26
|
export declare function getParagraphBookmarkId(p: Element): string | null;
|
|
6
27
|
export declare function cleanupInternalBookmarks(doc: Document): number;
|
|
7
28
|
export declare function insertParagraphBookmarks(doc: Document, _attachmentId: string): {
|
|
8
29
|
indexedParagraphs: number;
|
|
9
30
|
};
|
|
10
31
|
export declare function insertSingleParagraphBookmark(doc: Document, p: Element): string;
|
|
32
|
+
/**
|
|
33
|
+
* Resolve a caller-supplied anchor to its paragraph.
|
|
34
|
+
*
|
|
35
|
+
* Two strictly separated paths:
|
|
36
|
+
*
|
|
37
|
+
* 1. **Canonical `_bk_*`** — unchanged from before foreign anchors existed:
|
|
38
|
+
* the first paragraph whose reported id equals `bookmarkId`. A `_bk_*` anchor
|
|
39
|
+
* NEVER falls through to the foreign path, so widening cannot move an
|
|
40
|
+
* existing lookup (a paragraph can carry several `_bk_*` names; only the
|
|
41
|
+
* reported one may resolve it).
|
|
42
|
+
*
|
|
43
|
+
* 2. **Foreign name** (a host application's own stable paragraph bookmark, or a
|
|
44
|
+
* Word `_Toc*`/`_Ref*`) — accepted ONLY when the `w:id`-paired bookmark range
|
|
45
|
+
* covers exactly one paragraph. This rejects a zero-length point bookmark
|
|
46
|
+
* adjacent to a paragraph (covers none) and a heading/TOC bookmark spanning
|
|
47
|
+
* several (covers many). Both would otherwise resolve to a paragraph the
|
|
48
|
+
* bookmark does not actually mark — i.e. edit the wrong clause.
|
|
49
|
+
*
|
|
50
|
+
* Anything ambiguous returns null so the caller can fall back rather than guess.
|
|
51
|
+
* Matching is exact on the bookmark name.
|
|
52
|
+
*
|
|
53
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.13.6.2
|
|
54
|
+
*/
|
|
11
55
|
export declare function findParagraphByBookmarkId(doc: Document, bookmarkId: string): Element | null;
|
|
12
56
|
//# sourceMappingURL=bookmarks.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bookmarks.d.ts","sourceRoot":"","sources":["../../src/primitives/bookmarks.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;
|
|
1
|
+
{"version":3,"file":"bookmarks.d.ts","sourceRoot":"","sources":["../../src/primitives/bookmarks.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAgNF;;;;;;;;;;;;GAYG;AACH,wBAAgB,yBAAyB,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,EAAE,CA4B9D;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAKhE;AAED,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,QAAQ,GAAG,MAAM,CAuB9D;AAED,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,GAAG;IAAE,iBAAiB,EAAE,MAAM,CAAA;CAAE,CAkD5G;AAED,wBAAgB,6BAA6B,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,GAAG,MAAM,CAoC/E;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAa3F"}
|