@usejunior/docx-core 0.14.0 → 0.16.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/dist/.tsbuildinfo +1 -1
- package/dist/generation/index.d.ts +0 -1
- package/dist/generation/index.d.ts.map +1 -1
- package/dist/generation/index.js +0 -1
- package/dist/generation/index.js.map +1 -1
- package/dist/index.d.ts +7 -25
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -47
- 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 +13 -1
- package/dist/primitives/accept_changes.d.ts.map +1 -1
- package/dist/primitives/accept_changes.js +44 -29
- package/dist/primitives/accept_changes.js.map +1 -1
- package/dist/primitives/document.d.ts +51 -0
- package/dist/primitives/document.d.ts.map +1 -1
- package/dist/primitives/document.js +144 -1
- package/dist/primitives/document.js.map +1 -1
- package/dist/primitives/index.d.ts +1 -0
- package/dist/primitives/index.d.ts.map +1 -1
- package/dist/primitives/index.js +1 -0
- package/dist/primitives/index.js.map +1 -1
- package/dist/primitives/reject_changes.d.ts +4 -1
- package/dist/primitives/reject_changes.d.ts.map +1 -1
- package/dist/primitives/reject_changes.js +54 -30
- 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/package.json +8 -9
- 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/generation/recipes.d.ts +0 -144
- package/dist/generation/recipes.d.ts.map +0 -1
- package/dist/generation/recipes.js +0 -358
- package/dist/generation/recipes.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,87 @@
|
|
|
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 { type AcceptChangesResult, type RevisionFilter } from './accept_changes.js';
|
|
21
|
+
import { type RejectChangesResult } from './reject_changes.js';
|
|
22
|
+
/** Selector for a selective accept/reject operation. */
|
|
23
|
+
export interface AiEditSelector {
|
|
24
|
+
/** Explicit `w:id` values to target (strings or numbers). Primary signature. */
|
|
25
|
+
revisionIds?: Array<string | number>;
|
|
26
|
+
/** Convenience: resolve every revision authored by this `w:author` to its id. */
|
|
27
|
+
author?: string;
|
|
28
|
+
/**
|
|
29
|
+
* Opt in to best-effort operation on an ambiguous (overlapping) graph instead
|
|
30
|
+
* of hard-erroring. Foreign revisions are still left in place, but byte-identical
|
|
31
|
+
* preservation is not promised in ambiguous cases.
|
|
32
|
+
*/
|
|
33
|
+
normalizeFirst?: boolean;
|
|
34
|
+
}
|
|
35
|
+
/** One offending pair where a targeted revision overlaps a non-targeted one. */
|
|
36
|
+
export interface AiRevisionOverlap {
|
|
37
|
+
outerId: string | null;
|
|
38
|
+
outerLocalName: string;
|
|
39
|
+
outerAuthor: string | null;
|
|
40
|
+
innerId: string | null;
|
|
41
|
+
innerLocalName: string;
|
|
42
|
+
innerAuthor: string | null;
|
|
43
|
+
}
|
|
44
|
+
/** Thrown when selective accept/reject would touch an ambiguous revision graph. */
|
|
45
|
+
export declare class AmbiguousRevisionOverlapError extends Error {
|
|
46
|
+
readonly code = "AMBIGUOUS_REVISION_OVERLAP";
|
|
47
|
+
readonly overlaps: AiRevisionOverlap[];
|
|
48
|
+
constructor(overlaps: AiRevisionOverlap[]);
|
|
49
|
+
}
|
|
50
|
+
export interface SelectiveAcceptResult {
|
|
51
|
+
result: AcceptChangesResult;
|
|
52
|
+
selectedIds: string[];
|
|
53
|
+
overlaps: AiRevisionOverlap[];
|
|
54
|
+
}
|
|
55
|
+
export interface SelectiveRejectResult {
|
|
56
|
+
result: RejectChangesResult;
|
|
57
|
+
selectedIds: string[];
|
|
58
|
+
overlaps: AiRevisionOverlap[];
|
|
59
|
+
}
|
|
60
|
+
/** Every tracked-change element under `root` (any revision type). */
|
|
61
|
+
export declare function collectRevisionElements(root: Element | Document): Element[];
|
|
62
|
+
/**
|
|
63
|
+
* Resolve the target revision-id set from a selector, given the revision
|
|
64
|
+
* elements available across all stories. `revisionIds` wins when provided;
|
|
65
|
+
* otherwise `author` resolves to the ids of every revision it authored.
|
|
66
|
+
*/
|
|
67
|
+
export declare function resolveSelectedIds(revisionElements: Element[], selector: AiEditSelector): Set<string>;
|
|
68
|
+
/**
|
|
69
|
+
* Find ambiguous overlaps within a single story: a targeted content-wrapper
|
|
70
|
+
* revision that structurally contains — or is contained by — a non-targeted
|
|
71
|
+
* content-wrapper revision.
|
|
72
|
+
*/
|
|
73
|
+
export declare function detectAmbiguousOverlaps(root: Element | Document, selectedIds: Set<string>): AiRevisionOverlap[];
|
|
74
|
+
/** Build a revision filter that matches exactly the selected ids. */
|
|
75
|
+
export declare function selectedIdFilter(selectedIds: Set<string>): RevisionFilter;
|
|
76
|
+
/**
|
|
77
|
+
* Accept only the targeted revisions in a single story `doc`, leaving all other
|
|
78
|
+
* revisions byte-untouched. Hard-errors on an ambiguous overlap unless
|
|
79
|
+
* `normalizeFirst` is set. Mutates `doc` in place.
|
|
80
|
+
*/
|
|
81
|
+
export declare function acceptAIEdits(doc: Document, selector: AiEditSelector): SelectiveAcceptResult;
|
|
82
|
+
/**
|
|
83
|
+
* Reject only the targeted revisions in a single story `doc`, leaving all other
|
|
84
|
+
* revisions byte-untouched. Symmetric to {@link acceptAIEdits}.
|
|
85
|
+
*/
|
|
86
|
+
export declare function rejectAIEdits(doc: Document, selector: AiEditSelector): SelectiveRejectResult;
|
|
87
|
+
//# sourceMappingURL=accept_ai_edits.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accept_ai_edits.d.ts","sourceRoot":"","sources":["../../src/primitives/accept_ai_edits.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,OAAO,EAGL,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAiB,KAAK,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAmD9E,wDAAwD;AACxD,MAAM,WAAW,cAAc;IAC7B,gFAAgF;IAChF,WAAW,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IACrC,iFAAiF;IACjF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,gFAAgF;AAChF,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,mFAAmF;AACnF,qBAAa,6BAA8B,SAAQ,KAAK;IACtD,QAAQ,CAAC,IAAI,gCAAgC;IAC7C,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,EAAE,CAAC;gBAC3B,QAAQ,EAAE,iBAAiB,EAAE;CAS1C;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,mBAAmB,CAAC;IAC5B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,iBAAiB,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,mBAAmB,CAAC;IAC5B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,iBAAiB,EAAE,CAAC;CAC/B;AAUD,qEAAqE;AACrE,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,EAAE,CAQ3E;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,gBAAgB,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,cAAc,GAAG,GAAG,CAAC,MAAM,CAAC,CAgBrG;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,EAAE,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,iBAAiB,EAAE,CA6E/G;AAED,qEAAqE;AACrE,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,cAAc,CAKzE;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,GAAG,qBAAqB,CAQ5F;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,GAAG,qBAAqB,CAQ5F"}
|
|
@@ -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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"}
|
|
@@ -20,6 +20,16 @@ export type AcceptChangesResult = {
|
|
|
20
20
|
movesResolved: number;
|
|
21
21
|
propertyChangesResolved: number;
|
|
22
22
|
};
|
|
23
|
+
/**
|
|
24
|
+
* Predicate selecting which revision elements a sweep processes. The default
|
|
25
|
+
* ({@link ACCEPT_ALL}) processes every revision — the original whole-document
|
|
26
|
+
* behavior. `acceptAIEdits`/`rejectAIEdits` (#123) pass a predicate that matches
|
|
27
|
+
* only the targeted revision ids so foreign (non-target) revisions are left
|
|
28
|
+
* byte-untouched.
|
|
29
|
+
*/
|
|
30
|
+
export type RevisionFilter = (el: Element) => boolean;
|
|
31
|
+
/** The package-wide revision id (`w:id`) of a revision element, if any. */
|
|
32
|
+
export declare function revisionElementId(el: Element): string | null;
|
|
23
33
|
/**
|
|
24
34
|
* Accept all tracked changes in the document body or story root, producing a
|
|
25
35
|
* clean document with no revision markup.
|
|
@@ -27,5 +37,7 @@ export type AcceptChangesResult = {
|
|
|
27
37
|
* Mutates the Document in place (same convention as simplifyRedlines
|
|
28
38
|
* and mergeRuns).
|
|
29
39
|
*/
|
|
30
|
-
export declare function acceptChanges(doc: Document
|
|
40
|
+
export declare function acceptChanges(doc: Document, opts?: {
|
|
41
|
+
filter?: RevisionFilter;
|
|
42
|
+
}): AcceptChangesResult;
|
|
31
43
|
//# 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;;;;;;;;;;;;;;;GAeG;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;
|
|
1
|
+
{"version":3,"file":"accept_changes.d.ts","sourceRoot":"","sources":["../../src/primitives/accept_changes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;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;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,QAAQ,EACb,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,cAAc,CAAA;CAAE,GACjC,mBAAmB,CAwGrB"}
|
|
@@ -16,6 +16,11 @@
|
|
|
16
16
|
*/
|
|
17
17
|
import { OOXML } from './namespaces.js';
|
|
18
18
|
const W_NS = OOXML.W_NS;
|
|
19
|
+
const ACCEPT_ALL = () => true;
|
|
20
|
+
/** The package-wide revision id (`w:id`) of a revision element, if any. */
|
|
21
|
+
export function revisionElementId(el) {
|
|
22
|
+
return el.getAttributeNS(W_NS, 'id') ?? el.getAttribute('w:id');
|
|
23
|
+
}
|
|
19
24
|
// ── DOM helpers (internal) ──────────────────────────────────────────
|
|
20
25
|
function isW(node, localName) {
|
|
21
26
|
return (node.nodeType === 1 &&
|
|
@@ -34,8 +39,8 @@ function getDepth(node) {
|
|
|
34
39
|
function collectByLocalName(container, localName) {
|
|
35
40
|
return Array.from(container.getElementsByTagNameNS(W_NS, localName));
|
|
36
41
|
}
|
|
37
|
-
function removeAllByLocalName(container, localName) {
|
|
38
|
-
const elements = collectByLocalName(container, localName);
|
|
42
|
+
function removeAllByLocalName(container, localName, filter = ACCEPT_ALL) {
|
|
43
|
+
const elements = collectByLocalName(container, localName).filter(filter);
|
|
39
44
|
let count = 0;
|
|
40
45
|
for (const el of elements) {
|
|
41
46
|
if (el.parentNode) {
|
|
@@ -45,8 +50,8 @@ function removeAllByLocalName(container, localName) {
|
|
|
45
50
|
}
|
|
46
51
|
return count;
|
|
47
52
|
}
|
|
48
|
-
function unwrapAllByLocalName(container, localName) {
|
|
49
|
-
const elements = collectByLocalName(container, localName);
|
|
53
|
+
function unwrapAllByLocalName(container, localName, filter = ACCEPT_ALL) {
|
|
54
|
+
const elements = collectByLocalName(container, localName).filter(filter);
|
|
50
55
|
// Sort deepest-first to handle nested wrappers correctly
|
|
51
56
|
elements.sort((a, b) => getDepth(b) - getDepth(a));
|
|
52
57
|
let count = 0;
|
|
@@ -67,7 +72,7 @@ function unwrapAllByLocalName(container, localName) {
|
|
|
67
72
|
* Check if a paragraph has a paragraph-level revision marker.
|
|
68
73
|
* Pattern: w:p > w:pPr > w:rPr > w:del (or w:ins)
|
|
69
74
|
*/
|
|
70
|
-
function paragraphHasParaMarker(p, markerLocalName) {
|
|
75
|
+
function paragraphHasParaMarker(p, markerLocalName, filter = ACCEPT_ALL) {
|
|
71
76
|
for (let i = 0; i < p.childNodes.length; i++) {
|
|
72
77
|
const child = p.childNodes[i];
|
|
73
78
|
if (!isW(child, 'pPr'))
|
|
@@ -78,7 +83,7 @@ function paragraphHasParaMarker(p, markerLocalName) {
|
|
|
78
83
|
continue;
|
|
79
84
|
for (let k = 0; k < pPrChild.childNodes.length; k++) {
|
|
80
85
|
const rPrChild = pPrChild.childNodes[k];
|
|
81
|
-
if (isW(rPrChild, markerLocalName))
|
|
86
|
+
if (isW(rPrChild, markerLocalName) && filter(rPrChild))
|
|
82
87
|
return true;
|
|
83
88
|
}
|
|
84
89
|
}
|
|
@@ -236,7 +241,9 @@ function resolveParagraphMarkRevision(p) {
|
|
|
236
241
|
* Mutates the Document in place (same convention as simplifyRedlines
|
|
237
242
|
* and mergeRuns).
|
|
238
243
|
*/
|
|
239
|
-
export function acceptChanges(doc) {
|
|
244
|
+
export function acceptChanges(doc, opts) {
|
|
245
|
+
const filter = opts?.filter ?? ACCEPT_ALL;
|
|
246
|
+
const selective = filter !== ACCEPT_ALL;
|
|
240
247
|
const root = doc.getElementsByTagNameNS(W_NS, 'body').item(0) ?? doc.documentElement;
|
|
241
248
|
if (!root) {
|
|
242
249
|
return { insertionsAccepted: 0, deletionsAccepted: 0, movesResolved: 0, propertyChangesResolved: 0 };
|
|
@@ -255,27 +262,29 @@ export function acceptChanges(doc) {
|
|
|
255
262
|
// accept. safe-docx's deleted paragraphs always carry the mark now, so the
|
|
256
263
|
// mark-based rule suffices and is Word-faithful. (Mirrors acceptAllChanges and the
|
|
257
264
|
// reject-side rule.)
|
|
258
|
-
if (paragraphHasParaMarker(p, 'del')) {
|
|
265
|
+
if (paragraphHasParaMarker(p, 'del', filter)) {
|
|
259
266
|
markDeletedParagraphs.push(p);
|
|
260
267
|
}
|
|
261
268
|
}
|
|
262
269
|
// 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');
|
|
270
|
+
const deletionsAccepted = removeAllByLocalName(root, 'del', filter);
|
|
271
|
+
const moveFromRemoved = removeAllByLocalName(root, 'moveFrom', filter);
|
|
272
|
+
removeAllByLocalName(root, 'moveFromRangeStart', filter);
|
|
273
|
+
removeAllByLocalName(root, 'moveFromRangeEnd', filter);
|
|
274
|
+
removeAllByLocalName(root, 'moveToRangeStart', filter);
|
|
275
|
+
removeAllByLocalName(root, 'moveToRangeEnd', filter);
|
|
269
276
|
// Phase C — Unwrap insertions and move destinations (depth-sorted)
|
|
270
|
-
const insertionsAccepted = unwrapAllByLocalName(root, 'ins');
|
|
271
|
-
const moveToUnwrapped = unwrapAllByLocalName(root, 'moveTo');
|
|
277
|
+
const insertionsAccepted = unwrapAllByLocalName(root, 'ins', filter);
|
|
278
|
+
const moveToUnwrapped = unwrapAllByLocalName(root, 'moveTo', filter);
|
|
272
279
|
// Phase D — Remove property change records
|
|
273
280
|
let propertyChangesResolved = 0;
|
|
274
281
|
for (const localName of PR_CHANGE_LOCALS) {
|
|
275
|
-
propertyChangesResolved += removeAllByLocalName(root, localName);
|
|
282
|
+
propertyChangesResolved += removeAllByLocalName(root, localName, filter);
|
|
276
283
|
}
|
|
277
284
|
// Phase E — Cleanup
|
|
278
|
-
// Strip paragraph-level revision markers from w:pPr/w:rPr
|
|
285
|
+
// Strip paragraph-level revision markers from w:pPr/w:rPr (only those the
|
|
286
|
+
// filter selects, so a selective accept leaves foreign paragraph-mark
|
|
287
|
+
// revisions byte-untouched).
|
|
279
288
|
for (const p of collectByLocalName(root, 'p')) {
|
|
280
289
|
for (let i = 0; i < p.childNodes.length; i++) {
|
|
281
290
|
const child = p.childNodes[i];
|
|
@@ -289,7 +298,7 @@ export function acceptChanges(doc) {
|
|
|
289
298
|
const toRemove = [];
|
|
290
299
|
for (let k = 0; k < pPrChild.childNodes.length; k++) {
|
|
291
300
|
const rPrChild = pPrChild.childNodes[k];
|
|
292
|
-
if (isW(rPrChild, 'ins') || isW(rPrChild, 'del')) {
|
|
301
|
+
if ((isW(rPrChild, 'ins') || isW(rPrChild, 'del')) && filter(rPrChild)) {
|
|
293
302
|
toRemove.push(rPrChild);
|
|
294
303
|
}
|
|
295
304
|
}
|
|
@@ -305,16 +314,22 @@ export function acceptChanges(doc) {
|
|
|
305
314
|
for (const p of markDeletedParagraphs) {
|
|
306
315
|
resolveParagraphMarkRevision(p);
|
|
307
316
|
}
|
|
308
|
-
// Strip w:rsidDel attributes on remaining elements
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
el.
|
|
317
|
+
// Strip w:rsidDel attributes on remaining elements. Skipped in selective
|
|
318
|
+
// mode: rsidDel is a document-wide save-id, and a selective accept must not
|
|
319
|
+
// mutate elements outside the targeted revision set (the mixed-author
|
|
320
|
+
// byte-identical invariant, #125). The accepted revisions are removed/unwrapped
|
|
321
|
+
// above, taking their own rsidDel with them.
|
|
322
|
+
if (!selective) {
|
|
323
|
+
const allElements = root.getElementsByTagNameNS(W_NS, '*');
|
|
324
|
+
for (let i = 0; i < allElements.length; i++) {
|
|
325
|
+
const el = allElements[i];
|
|
326
|
+
if (el.hasAttributeNS(W_NS, 'rsidDel')) {
|
|
327
|
+
el.removeAttributeNS(W_NS, 'rsidDel');
|
|
328
|
+
}
|
|
329
|
+
// Also check prefixed form
|
|
330
|
+
if (el.hasAttribute('w:rsidDel')) {
|
|
331
|
+
el.removeAttribute('w:rsidDel');
|
|
332
|
+
}
|
|
318
333
|
}
|
|
319
334
|
}
|
|
320
335
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accept_changes.js","sourceRoot":"","sources":["../../src/primitives/accept_changes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAExC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"accept_changes.js","sourceRoot":"","sources":["../../src/primitives/accept_changes.ts"],"names":[],"mappings":"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"}
|