@usejunior/docx-core 0.9.1 → 0.10.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/atomizer.d.ts +15 -1
- package/dist/atomizer.d.ts.map +1 -1
- package/dist/atomizer.js +37 -1
- package/dist/atomizer.js.map +1 -1
- package/dist/baselines/atomizer/documentReconstructor.d.ts.map +1 -1
- package/dist/baselines/atomizer/documentReconstructor.js +218 -90
- package/dist/baselines/atomizer/documentReconstructor.js.map +1 -1
- package/dist/baselines/atomizer/formattingFidelity.d.ts +99 -0
- package/dist/baselines/atomizer/formattingFidelity.d.ts.map +1 -0
- package/dist/baselines/atomizer/formattingFidelity.js +449 -0
- package/dist/baselines/atomizer/formattingFidelity.js.map +1 -0
- package/dist/baselines/atomizer/inPlaceModifier-bookmarks.d.ts +37 -0
- package/dist/baselines/atomizer/inPlaceModifier-bookmarks.d.ts.map +1 -0
- package/dist/baselines/atomizer/inPlaceModifier-bookmarks.js +189 -0
- package/dist/baselines/atomizer/inPlaceModifier-bookmarks.js.map +1 -0
- package/dist/baselines/atomizer/inPlaceModifier-containers.d.ts +74 -0
- package/dist/baselines/atomizer/inPlaceModifier-containers.d.ts.map +1 -0
- package/dist/baselines/atomizer/inPlaceModifier-containers.js +171 -0
- package/dist/baselines/atomizer/inPlaceModifier-containers.js.map +1 -0
- package/dist/baselines/atomizer/inPlaceModifier-deletion.d.ts +88 -0
- package/dist/baselines/atomizer/inPlaceModifier-deletion.d.ts.map +1 -0
- package/dist/baselines/atomizer/inPlaceModifier-deletion.js +326 -0
- package/dist/baselines/atomizer/inPlaceModifier-deletion.js.map +1 -0
- package/dist/baselines/atomizer/inPlaceModifier-postprocess.d.ts +85 -0
- package/dist/baselines/atomizer/inPlaceModifier-postprocess.d.ts.map +1 -0
- package/dist/baselines/atomizer/inPlaceModifier-postprocess.js +402 -0
- package/dist/baselines/atomizer/inPlaceModifier-postprocess.js.map +1 -0
- package/dist/baselines/atomizer/inPlaceModifier-presplit.d.ts +39 -0
- package/dist/baselines/atomizer/inPlaceModifier-presplit.d.ts.map +1 -0
- package/dist/baselines/atomizer/inPlaceModifier-presplit.js +265 -0
- package/dist/baselines/atomizer/inPlaceModifier-presplit.js.map +1 -0
- package/dist/baselines/atomizer/inPlaceModifier-shared.d.ts +62 -0
- package/dist/baselines/atomizer/inPlaceModifier-shared.d.ts.map +1 -0
- package/dist/baselines/atomizer/inPlaceModifier-shared.js +139 -0
- package/dist/baselines/atomizer/inPlaceModifier-shared.js.map +1 -0
- package/dist/baselines/atomizer/inPlaceModifier-wrappers.d.ts +189 -0
- package/dist/baselines/atomizer/inPlaceModifier-wrappers.d.ts.map +1 -0
- package/dist/baselines/atomizer/inPlaceModifier-wrappers.js +427 -0
- package/dist/baselines/atomizer/inPlaceModifier-wrappers.js.map +1 -0
- package/dist/baselines/atomizer/inPlaceModifier.d.ts +6 -290
- package/dist/baselines/atomizer/inPlaceModifier.d.ts.map +1 -1
- package/dist/baselines/atomizer/inPlaceModifier.js +23 -1828
- package/dist/baselines/atomizer/inPlaceModifier.js.map +1 -1
- package/dist/baselines/atomizer/pipeline.d.ts +76 -1
- package/dist/baselines/atomizer/pipeline.d.ts.map +1 -1
- package/dist/baselines/atomizer/pipeline.js +204 -27
- package/dist/baselines/atomizer/pipeline.js.map +1 -1
- package/dist/baselines/atomizer/trackChangesAcceptorAst.d.ts.map +1 -1
- package/dist/baselines/atomizer/trackChangesAcceptorAst.js +56 -160
- package/dist/baselines/atomizer/trackChangesAcceptorAst.js.map +1 -1
- package/dist/compare-types.d.ts +151 -0
- package/dist/compare-types.d.ts.map +1 -0
- package/dist/compare-types.js +2 -0
- package/dist/compare-types.js.map +1 -0
- package/dist/core-types.d.ts +5 -1
- package/dist/core-types.d.ts.map +1 -1
- package/dist/core-types.js +5 -1
- package/dist/core-types.js.map +1 -1
- package/dist/footnotes.d.ts +8 -3
- package/dist/footnotes.d.ts.map +1 -1
- package/dist/footnotes.js +8 -3
- package/dist/footnotes.js.map +1 -1
- package/dist/index.d.ts +6 -150
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/integration/libreoffice-oracle.d.ts +41 -0
- package/dist/integration/libreoffice-oracle.d.ts.map +1 -0
- package/dist/integration/libreoffice-oracle.js +282 -0
- package/dist/integration/libreoffice-oracle.js.map +1 -0
- package/dist/primitives/accept_changes.d.ts +2 -2
- package/dist/primitives/accept_changes.d.ts.map +1 -1
- package/dist/primitives/accept_changes.js +24 -79
- package/dist/primitives/accept_changes.js.map +1 -1
- package/dist/primitives/comments.d.ts +12 -3
- package/dist/primitives/comments.d.ts.map +1 -1
- package/dist/primitives/comments.js +374 -97
- package/dist/primitives/comments.js.map +1 -1
- package/dist/primitives/content_fingerprint.d.ts +29 -0
- package/dist/primitives/content_fingerprint.d.ts.map +1 -0
- package/dist/primitives/content_fingerprint.js +63 -0
- package/dist/primitives/content_fingerprint.js.map +1 -0
- package/dist/primitives/document.d.ts +56 -15
- package/dist/primitives/document.d.ts.map +1 -1
- package/dist/primitives/document.js +303 -32
- package/dist/primitives/document.js.map +1 -1
- package/dist/primitives/document_view-comments.d.ts +18 -0
- package/dist/primitives/document_view-comments.d.ts.map +1 -0
- package/dist/primitives/document_view-comments.js +159 -0
- package/dist/primitives/document_view-comments.js.map +1 -0
- package/dist/primitives/document_view-headings.d.ts +45 -0
- package/dist/primitives/document_view-headings.d.ts.map +1 -0
- package/dist/primitives/document_view-headings.js +247 -0
- package/dist/primitives/document_view-headings.js.map +1 -0
- package/dist/primitives/document_view-styles.d.ts +11 -0
- package/dist/primitives/document_view-styles.d.ts.map +1 -0
- package/dist/primitives/document_view-styles.js +104 -0
- package/dist/primitives/document_view-styles.js.map +1 -0
- package/dist/primitives/document_view-toon.d.ts +37 -0
- package/dist/primitives/document_view-toon.d.ts.map +1 -0
- package/dist/primitives/document_view-toon.js +199 -0
- package/dist/primitives/document_view-toon.js.map +1 -0
- package/dist/primitives/document_view-types.d.ts +137 -0
- package/dist/primitives/document_view-types.d.ts.map +1 -0
- package/dist/primitives/document_view-types.js +2 -0
- package/dist/primitives/document_view-types.js.map +1 -0
- package/dist/primitives/document_view.d.ts +8 -106
- package/dist/primitives/document_view.d.ts.map +1 -1
- package/dist/primitives/document_view.js +134 -301
- package/dist/primitives/document_view.js.map +1 -1
- package/dist/primitives/dom-helpers.d.ts +9 -0
- package/dist/primitives/dom-helpers.d.ts.map +1 -1
- package/dist/primitives/dom-helpers.js +10 -1
- package/dist/primitives/dom-helpers.js.map +1 -1
- package/dist/primitives/footnotes.d.ts +4 -3
- package/dist/primitives/footnotes.d.ts.map +1 -1
- package/dist/primitives/footnotes.js +232 -44
- package/dist/primitives/footnotes.js.map +1 -1
- package/dist/primitives/formatting_tags.d.ts +6 -0
- package/dist/primitives/formatting_tags.d.ts.map +1 -1
- package/dist/primitives/formatting_tags.js +6 -1
- package/dist/primitives/formatting_tags.js.map +1 -1
- package/dist/primitives/index.d.ts +6 -0
- package/dist/primitives/index.d.ts.map +1 -1
- package/dist/primitives/index.js +5 -0
- package/dist/primitives/index.js.map +1 -1
- package/dist/primitives/layout.d.ts +4 -3
- package/dist/primitives/layout.d.ts.map +1 -1
- package/dist/primitives/layout.js +32 -3
- package/dist/primitives/layout.js.map +1 -1
- package/dist/primitives/merge_runs.d.ts +21 -3
- package/dist/primitives/merge_runs.d.ts.map +1 -1
- package/dist/primitives/merge_runs.js +32 -10
- package/dist/primitives/merge_runs.js.map +1 -1
- package/dist/primitives/namespaces.d.ts +6 -0
- package/dist/primitives/namespaces.d.ts.map +1 -1
- package/dist/primitives/namespaces.js +9 -0
- package/dist/primitives/namespaces.js.map +1 -1
- package/dist/primitives/reject_changes.d.ts +2 -2
- package/dist/primitives/reject_changes.d.ts.map +1 -1
- package/dist/primitives/reject_changes.js +24 -81
- package/dist/primitives/reject_changes.js.map +1 -1
- package/dist/primitives/semantic_tags.d.ts +7 -0
- package/dist/primitives/semantic_tags.d.ts.map +1 -1
- package/dist/primitives/semantic_tags.js +21 -3
- package/dist/primitives/semantic_tags.js.map +1 -1
- package/dist/primitives/serialize_html.d.ts +36 -0
- package/dist/primitives/serialize_html.d.ts.map +1 -0
- package/dist/primitives/serialize_html.js +393 -0
- package/dist/primitives/serialize_html.js.map +1 -0
- package/dist/primitives/serialize_markdown.d.ts +16 -0
- package/dist/primitives/serialize_markdown.d.ts.map +1 -0
- package/dist/primitives/serialize_markdown.js +300 -0
- package/dist/primitives/serialize_markdown.js.map +1 -0
- package/dist/primitives/serialize_plaintext.d.ts +15 -0
- package/dist/primitives/serialize_plaintext.d.ts.map +1 -0
- package/dist/primitives/serialize_plaintext.js +154 -0
- package/dist/primitives/serialize_plaintext.js.map +1 -0
- package/dist/primitives/styles.js +22 -22
- package/dist/primitives/styles.js.map +1 -1
- package/dist/primitives/tables.d.ts.map +1 -1
- package/dist/primitives/tables.js +13 -3
- package/dist/primitives/tables.js.map +1 -1
- package/dist/primitives/text.d.ts +2 -1
- package/dist/primitives/text.d.ts.map +1 -1
- package/dist/primitives/text.js +116 -12
- package/dist/primitives/text.js.map +1 -1
- package/dist/primitives/track-changes-emitter.d.ts +139 -0
- package/dist/primitives/track-changes-emitter.d.ts.map +1 -0
- package/dist/primitives/track-changes-emitter.js +241 -0
- package/dist/primitives/track-changes-emitter.js.map +1 -0
- package/dist/primitives/xml-helpers.d.ts +29 -0
- package/dist/primitives/xml-helpers.d.ts.map +1 -0
- package/dist/primitives/xml-helpers.js +35 -0
- package/dist/primitives/xml-helpers.js.map +1 -0
- package/dist/shared/ooxml/namespaces.d.ts +4 -1
- package/dist/shared/ooxml/namespaces.d.ts.map +1 -1
- package/dist/shared/ooxml/namespaces.js +4 -1
- package/dist/shared/ooxml/namespaces.js.map +1 -1
- package/package.json +7 -6
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Formatting-Fidelity Comparison Check
|
|
3
|
+
*
|
|
4
|
+
* Deterministic, in-engine measurement of formatting divergence between two
|
|
5
|
+
* word/document.xml views (e.g. inplace candidate vs rebuild candidate, or
|
|
6
|
+
* candidate vs expected). Both existing safety oracles are formatting-blind:
|
|
7
|
+
* the round-trip oracle compares text projections and the LibreOffice
|
|
8
|
+
* oracle's paragraphShape() records only paragraph count + visible-text
|
|
9
|
+
* presence — so rebuild mode's formatting loss passes every current gate
|
|
10
|
+
* silently. This module quantifies that loss and gates inplace fixes.
|
|
11
|
+
*
|
|
12
|
+
* Alignment strategy: paragraphs are aligned by their visible text content
|
|
13
|
+
* (LCS over paragraph texts), then run formatting is compared character by
|
|
14
|
+
* character within each aligned pair. Comparing per character — not per run —
|
|
15
|
+
* makes the check agnostic to run splits, which rebuild and inplace
|
|
16
|
+
* legitimately produce differently. Content divergence is the text oracle's
|
|
17
|
+
* job and is reported separately as alignment coverage, not folded into the
|
|
18
|
+
* formatting tallies.
|
|
19
|
+
*
|
|
20
|
+
* LibreOffice is deliberately not involved: it rewrites formatting on
|
|
21
|
+
* load/save (adds default w:pPr/w:rPr), so it cannot serve as a formatting
|
|
22
|
+
* oracle. This comparison runs entirely over our own emitted XML.
|
|
23
|
+
*
|
|
24
|
+
* @see https://github.com/UseJunior/safe-docx/issues/363
|
|
25
|
+
*/
|
|
26
|
+
export type FormattingScope = 'run' | 'paragraph' | 'table' | 'section';
|
|
27
|
+
export type FormattingDivergenceKind = 'added' | 'removed' | 'changed';
|
|
28
|
+
export interface FormattingDivergence {
|
|
29
|
+
scope: FormattingScope;
|
|
30
|
+
/** Friendly property name when known (e.g. "bold"), else the OOXML tag. */
|
|
31
|
+
property: string;
|
|
32
|
+
/** "added"/"removed" are relative to the expected view. */
|
|
33
|
+
kind: FormattingDivergenceKind;
|
|
34
|
+
/** Canonical serialization of the property in the expected view. */
|
|
35
|
+
expectedValue: string | null;
|
|
36
|
+
/** Canonical serialization of the property in the actual view. */
|
|
37
|
+
actualValue: string | null;
|
|
38
|
+
/**
|
|
39
|
+
* Document-order paragraph index in the expected view, or -1 for
|
|
40
|
+
* section-scope divergences (section breaks are aligned by index, not
|
|
41
|
+
* anchored to a paragraph).
|
|
42
|
+
*/
|
|
43
|
+
paragraphIndex: number;
|
|
44
|
+
/** Aligned text the divergence applies to (truncated). */
|
|
45
|
+
textSample: string;
|
|
46
|
+
}
|
|
47
|
+
export interface FormattingDimensionTally {
|
|
48
|
+
/** Units compared: chars (run), paragraphs (paragraph/table), section breaks (section). */
|
|
49
|
+
compared: number;
|
|
50
|
+
divergent: number;
|
|
51
|
+
/** (compared - divergent) / compared; 1 when nothing was compared. */
|
|
52
|
+
score: number;
|
|
53
|
+
}
|
|
54
|
+
export interface FormattingFidelityReport {
|
|
55
|
+
/**
|
|
56
|
+
* Alignment coverage × mean of the dimension scores that compared at
|
|
57
|
+
* least one unit. Exactly 1.0 iff content aligned fully and no formatting
|
|
58
|
+
* diverged, so the score doubles as an exact-preservation gate.
|
|
59
|
+
*/
|
|
60
|
+
score: number;
|
|
61
|
+
/** Character-weighted w:rPr comparison over aligned paragraph text. */
|
|
62
|
+
runFormatting: FormattingDimensionTally;
|
|
63
|
+
/** Per-paragraph w:pPr comparison (w:sectPr handled by the section dimension). */
|
|
64
|
+
paragraphFormatting: FormattingDimensionTally;
|
|
65
|
+
/** Per-paragraph w:tblPr/w:trPr/w:tcPr chain comparison for paragraphs inside tables. */
|
|
66
|
+
tableFormatting: FormattingDimensionTally;
|
|
67
|
+
/** Per-section-break w:sectPr comparison, aligned by document-order index. */
|
|
68
|
+
sectionFormatting: FormattingDimensionTally;
|
|
69
|
+
/** Paragraphs whose text could not be content-aligned (content divergence, not formatting). */
|
|
70
|
+
unalignedExpectedParagraphs: number;
|
|
71
|
+
unalignedActualParagraphs: number;
|
|
72
|
+
divergences: FormattingDivergence[];
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Compare the formatting carried by two word/document.xml views.
|
|
76
|
+
*
|
|
77
|
+
* The views are expected to hold comparable content (e.g. two reconstruction
|
|
78
|
+
* candidates for the same comparison, or the same projection of each); use
|
|
79
|
+
* compareProjectedFormattingFidelity to compare tracked-changes candidates
|
|
80
|
+
* whose revision-markup granularity may differ.
|
|
81
|
+
*/
|
|
82
|
+
export declare function compareFormattingFidelity(expectedDocumentXml: string, actualDocumentXml: string): FormattingFidelityReport;
|
|
83
|
+
export interface ProjectedFormattingFidelity {
|
|
84
|
+
/** Fidelity of accept-all(actual) measured against accept-all(expected). */
|
|
85
|
+
accept: FormattingFidelityReport;
|
|
86
|
+
/** Fidelity of reject-all(actual) measured against reject-all(expected). */
|
|
87
|
+
reject: FormattingFidelityReport;
|
|
88
|
+
/** min(accept.score, reject.score) — a candidate must preserve both projections. */
|
|
89
|
+
score: number;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Compare two tracked-changes candidates projection-to-projection, the same
|
|
93
|
+
* stance the round-trip text oracle adopted in #347: accept-all and
|
|
94
|
+
* reject-all projections strip revision markup, so candidates that encode
|
|
95
|
+
* the same result with different w:ins/w:del granularity score 1.0 unless
|
|
96
|
+
* their formatting actually diverges.
|
|
97
|
+
*/
|
|
98
|
+
export declare function compareProjectedFormattingFidelity(expectedCandidateXml: string, actualCandidateXml: string): ProjectedFormattingFidelity;
|
|
99
|
+
//# sourceMappingURL=formattingFidelity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formattingFidelity.d.ts","sourceRoot":"","sources":["../../../src/baselines/atomizer/formattingFidelity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAYH,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,WAAW,GAAG,OAAO,GAAG,SAAS,CAAC;AAExE,MAAM,MAAM,wBAAwB,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;AAEvE,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,eAAe,CAAC;IACvB,2EAA2E;IAC3E,QAAQ,EAAE,MAAM,CAAC;IACjB,2DAA2D;IAC3D,IAAI,EAAE,wBAAwB,CAAC;IAC/B,oEAAoE;IACpE,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,kEAAkE;IAClE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B;;;;OAIG;IACH,cAAc,EAAE,MAAM,CAAC;IACvB,0DAA0D;IAC1D,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,wBAAwB;IACvC,2FAA2F;IAC3F,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,sEAAsE;IACtE,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,wBAAwB;IACvC;;;;OAIG;IACH,KAAK,EAAE,MAAM,CAAC;IACd,uEAAuE;IACvE,aAAa,EAAE,wBAAwB,CAAC;IACxC,kFAAkF;IAClF,mBAAmB,EAAE,wBAAwB,CAAC;IAC9C,yFAAyF;IACzF,eAAe,EAAE,wBAAwB,CAAC;IAC1C,8EAA8E;IAC9E,iBAAiB,EAAE,wBAAwB,CAAC;IAC5C,+FAA+F;IAC/F,2BAA2B,EAAE,MAAM,CAAC;IACpC,yBAAyB,EAAE,MAAM,CAAC;IAClC,WAAW,EAAE,oBAAoB,EAAE,CAAC;CACrC;AAidD;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACvC,mBAAmB,EAAE,MAAM,EAC3B,iBAAiB,EAAE,MAAM,GACxB,wBAAwB,CAqC1B;AAMD,MAAM,WAAW,2BAA2B;IAC1C,4EAA4E;IAC5E,MAAM,EAAE,wBAAwB,CAAC;IACjC,4EAA4E;IAC5E,MAAM,EAAE,wBAAwB,CAAC;IACjC,oFAAoF;IACpF,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;GAMG;AACH,wBAAgB,kCAAkC,CAChD,oBAAoB,EAAE,MAAM,EAC5B,kBAAkB,EAAE,MAAM,GACzB,2BAA2B,CAU7B"}
|
|
@@ -0,0 +1,449 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Formatting-Fidelity Comparison Check
|
|
3
|
+
*
|
|
4
|
+
* Deterministic, in-engine measurement of formatting divergence between two
|
|
5
|
+
* word/document.xml views (e.g. inplace candidate vs rebuild candidate, or
|
|
6
|
+
* candidate vs expected). Both existing safety oracles are formatting-blind:
|
|
7
|
+
* the round-trip oracle compares text projections and the LibreOffice
|
|
8
|
+
* oracle's paragraphShape() records only paragraph count + visible-text
|
|
9
|
+
* presence — so rebuild mode's formatting loss passes every current gate
|
|
10
|
+
* silently. This module quantifies that loss and gates inplace fixes.
|
|
11
|
+
*
|
|
12
|
+
* Alignment strategy: paragraphs are aligned by their visible text content
|
|
13
|
+
* (LCS over paragraph texts), then run formatting is compared character by
|
|
14
|
+
* character within each aligned pair. Comparing per character — not per run —
|
|
15
|
+
* makes the check agnostic to run splits, which rebuild and inplace
|
|
16
|
+
* legitimately produce differently. Content divergence is the text oracle's
|
|
17
|
+
* job and is reported separately as alignment coverage, not folded into the
|
|
18
|
+
* formatting tallies.
|
|
19
|
+
*
|
|
20
|
+
* LibreOffice is deliberately not involved: it rewrites formatting on
|
|
21
|
+
* load/save (adds default w:pPr/w:rPr), so it cannot serve as a formatting
|
|
22
|
+
* oracle. This comparison runs entirely over our own emitted XML.
|
|
23
|
+
*
|
|
24
|
+
* @see https://github.com/UseJunior/safe-docx/issues/363
|
|
25
|
+
*/
|
|
26
|
+
import { parseDocumentXml } from './xmlToWmlElement.js';
|
|
27
|
+
import { acceptAllChanges, rejectAllChanges } from './trackChangesAcceptorAst.js';
|
|
28
|
+
import { childElements, findChildByTagName } from '../../primitives/index.js';
|
|
29
|
+
import { RUN_PROPERTY_FRIENDLY_NAMES } from '../../core-types.js';
|
|
30
|
+
import { PARAGRAPH_PROPERTY_FRIENDLY_NAMES } from '../../format-detection.js';
|
|
31
|
+
// =============================================================================
|
|
32
|
+
// Canonical property keys
|
|
33
|
+
// =============================================================================
|
|
34
|
+
/**
|
|
35
|
+
* Revision-tracking elements excluded from canonicalization at every depth.
|
|
36
|
+
* Two views that differ only in tracked-change provenance markup carry the
|
|
37
|
+
* same formatting.
|
|
38
|
+
*/
|
|
39
|
+
const REVISION_PROPERTY_TAGS = new Set([
|
|
40
|
+
'w:rPrChange',
|
|
41
|
+
'w:pPrChange',
|
|
42
|
+
'w:tblPrChange',
|
|
43
|
+
'w:trPrChange',
|
|
44
|
+
'w:tcPrChange',
|
|
45
|
+
'w:sectPrChange',
|
|
46
|
+
'w:ins',
|
|
47
|
+
'w:del',
|
|
48
|
+
'w:cellIns',
|
|
49
|
+
'w:cellDel',
|
|
50
|
+
'w:cellMerge',
|
|
51
|
+
]);
|
|
52
|
+
/** w:sectPr inside w:pPr is a section break — owned by the section dimension. */
|
|
53
|
+
const PPR_EXCLUDED_TAGS = new Set([...REVISION_PROPERTY_TAGS, 'w:sectPr']);
|
|
54
|
+
/**
|
|
55
|
+
* Canonical serialization: sorted attributes, children sorted by their own
|
|
56
|
+
* canonical form, revision markup dropped. A comparison key, not output XML —
|
|
57
|
+
* sorting trades element-order semantics for emitter-order independence.
|
|
58
|
+
* Namespace declarations (`xmlns`, `xmlns:*`) are skipped: they record where
|
|
59
|
+
* a prefix is bound, not formatting, and emitters legitimately declare the
|
|
60
|
+
* same binding at different depths (inline vs inherited from the root).
|
|
61
|
+
*/
|
|
62
|
+
function canonicalizeElement(el) {
|
|
63
|
+
const attrs = [];
|
|
64
|
+
for (let i = 0; i < el.attributes.length; i++) {
|
|
65
|
+
const attr = el.attributes[i];
|
|
66
|
+
if (attr.name === 'xmlns' || attr.name.startsWith('xmlns:'))
|
|
67
|
+
continue;
|
|
68
|
+
attrs.push(`${attr.name}="${attr.value}"`);
|
|
69
|
+
}
|
|
70
|
+
attrs.sort();
|
|
71
|
+
const attrPart = attrs.length > 0 ? ` ${attrs.join(' ')}` : '';
|
|
72
|
+
const children = childElements(el)
|
|
73
|
+
.filter((child) => !REVISION_PROPERTY_TAGS.has(child.tagName))
|
|
74
|
+
.map(canonicalizeElement)
|
|
75
|
+
.sort();
|
|
76
|
+
if (children.length === 0) {
|
|
77
|
+
const text = (el.textContent ?? '').trim();
|
|
78
|
+
return text.length > 0
|
|
79
|
+
? `<${el.tagName}${attrPart}>${text}</${el.tagName}>`
|
|
80
|
+
: `<${el.tagName}${attrPart}/>`;
|
|
81
|
+
}
|
|
82
|
+
return `<${el.tagName}${attrPart}>${children.join('')}</${el.tagName}>`;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Map of property tag → canonical serialization for the direct children of a
|
|
86
|
+
* property container (w:rPr, w:pPr, w:tcPr, ...). Repeated tags are merged
|
|
87
|
+
* into one sorted entry. An absent container equals an empty one.
|
|
88
|
+
*/
|
|
89
|
+
function propertyMap(container, excludedTags) {
|
|
90
|
+
const collected = new Map();
|
|
91
|
+
if (container) {
|
|
92
|
+
for (const child of childElements(container)) {
|
|
93
|
+
if (excludedTags.has(child.tagName))
|
|
94
|
+
continue;
|
|
95
|
+
const existing = collected.get(child.tagName);
|
|
96
|
+
if (existing)
|
|
97
|
+
existing.push(canonicalizeElement(child));
|
|
98
|
+
else
|
|
99
|
+
collected.set(child.tagName, [canonicalizeElement(child)]);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
const merged = new Map();
|
|
103
|
+
for (const [tag, values] of collected) {
|
|
104
|
+
merged.set(tag, values.sort().join(''));
|
|
105
|
+
}
|
|
106
|
+
return merged;
|
|
107
|
+
}
|
|
108
|
+
function containerKey(props) {
|
|
109
|
+
return [...props.keys()]
|
|
110
|
+
.sort()
|
|
111
|
+
.map((tag) => props.get(tag))
|
|
112
|
+
.join('');
|
|
113
|
+
}
|
|
114
|
+
function diffPropertyMaps(expected, actual, friendlyNames) {
|
|
115
|
+
const diffs = [];
|
|
116
|
+
const allTags = [...new Set([...expected.keys(), ...actual.keys()])].sort();
|
|
117
|
+
for (const tag of allTags) {
|
|
118
|
+
const expectedValue = expected.get(tag);
|
|
119
|
+
const actualValue = actual.get(tag);
|
|
120
|
+
if (expectedValue === actualValue)
|
|
121
|
+
continue;
|
|
122
|
+
diffs.push({
|
|
123
|
+
property: friendlyNames[tag] ?? tag,
|
|
124
|
+
kind: expectedValue === undefined
|
|
125
|
+
? 'added'
|
|
126
|
+
: actualValue === undefined
|
|
127
|
+
? 'removed'
|
|
128
|
+
: 'changed',
|
|
129
|
+
expectedValue: expectedValue ?? null,
|
|
130
|
+
actualValue: actualValue ?? null,
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
return diffs;
|
|
134
|
+
}
|
|
135
|
+
function tableLevelKey(level) {
|
|
136
|
+
return [
|
|
137
|
+
containerKey(propertyMap(level.tblPr, REVISION_PROPERTY_TAGS)),
|
|
138
|
+
containerKey(propertyMap(level.trPr, REVISION_PROPERTY_TAGS)),
|
|
139
|
+
containerKey(propertyMap(level.tcPr, REVISION_PROPERTY_TAGS)),
|
|
140
|
+
].join('§');
|
|
141
|
+
}
|
|
142
|
+
function collectRunText(el, currentRPrKey, currentRPr, unit) {
|
|
143
|
+
for (const child of childElements(el)) {
|
|
144
|
+
if (child.tagName === 'w:pPr')
|
|
145
|
+
continue;
|
|
146
|
+
if (child.tagName === 'w:r') {
|
|
147
|
+
const rPr = findChildByTagName(child, 'w:rPr');
|
|
148
|
+
const key = containerKey(propertyMap(rPr, REVISION_PROPERTY_TAGS));
|
|
149
|
+
collectRunText(child, key, rPr, unit);
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
if (child.tagName === 'w:t' || child.tagName === 'w:delText') {
|
|
153
|
+
const text = child.textContent ?? '';
|
|
154
|
+
unit.text += text;
|
|
155
|
+
for (let i = 0; i < text.length; i++) {
|
|
156
|
+
unit.charRPrKeys.push(currentRPrKey);
|
|
157
|
+
unit.charRPrElements.push(currentRPr);
|
|
158
|
+
}
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
// Recurse through revision wrappers, hyperlinks, smart tags, sdt, ...
|
|
162
|
+
collectRunText(child, currentRPrKey, currentRPr, unit);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
function buildParagraphUnit(paragraph, chain, index) {
|
|
166
|
+
const pPr = findChildByTagName(paragraph, 'w:pPr');
|
|
167
|
+
const pPrProps = propertyMap(pPr, PPR_EXCLUDED_TAGS);
|
|
168
|
+
const unit = {
|
|
169
|
+
index,
|
|
170
|
+
text: '',
|
|
171
|
+
charRPrKeys: [],
|
|
172
|
+
charRPrElements: [],
|
|
173
|
+
pPrProps,
|
|
174
|
+
pPrKey: containerKey(pPrProps),
|
|
175
|
+
tableChain: chain,
|
|
176
|
+
tableKey: chain.map(tableLevelKey).join('|'),
|
|
177
|
+
};
|
|
178
|
+
collectRunText(paragraph, '', null, unit);
|
|
179
|
+
return unit;
|
|
180
|
+
}
|
|
181
|
+
function collectParagraphUnits(container, chain, out) {
|
|
182
|
+
for (const child of childElements(container)) {
|
|
183
|
+
if (child.tagName === 'w:p') {
|
|
184
|
+
out.push(buildParagraphUnit(child, chain, out.length));
|
|
185
|
+
continue;
|
|
186
|
+
}
|
|
187
|
+
if (child.tagName === 'w:tbl') {
|
|
188
|
+
const tblPr = findChildByTagName(child, 'w:tblPr');
|
|
189
|
+
for (const row of childElements(child)) {
|
|
190
|
+
if (row.tagName !== 'w:tr')
|
|
191
|
+
continue;
|
|
192
|
+
const trPr = findChildByTagName(row, 'w:trPr');
|
|
193
|
+
for (const cell of childElements(row)) {
|
|
194
|
+
if (cell.tagName !== 'w:tc')
|
|
195
|
+
continue;
|
|
196
|
+
const tcPr = findChildByTagName(cell, 'w:tcPr');
|
|
197
|
+
collectParagraphUnits(cell, [...chain, { tblPr, trPr, tcPr }], out);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
// Recurse through sdt/customXml/revision wrappers that can hold blocks.
|
|
203
|
+
collectParagraphUnits(child, chain, out);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
function collectSectionProperties(root) {
|
|
207
|
+
const out = [];
|
|
208
|
+
const walk = (el) => {
|
|
209
|
+
for (const child of childElements(el)) {
|
|
210
|
+
if (child.tagName === 'w:sectPr') {
|
|
211
|
+
out.push(child);
|
|
212
|
+
continue;
|
|
213
|
+
}
|
|
214
|
+
walk(child);
|
|
215
|
+
}
|
|
216
|
+
};
|
|
217
|
+
walk(root);
|
|
218
|
+
return out;
|
|
219
|
+
}
|
|
220
|
+
// =============================================================================
|
|
221
|
+
// Content alignment
|
|
222
|
+
// =============================================================================
|
|
223
|
+
/**
|
|
224
|
+
* LCS over paragraph texts. O(n·m) — fine for a measurement/gate tool, not
|
|
225
|
+
* intended for hot paths.
|
|
226
|
+
*/
|
|
227
|
+
function alignParagraphsByText(expected, actual) {
|
|
228
|
+
if (expected.length === actual.length &&
|
|
229
|
+
expected.every((unit, i) => unit.text === actual[i].text)) {
|
|
230
|
+
return expected.map((unit, i) => [unit, actual[i]]);
|
|
231
|
+
}
|
|
232
|
+
const n = expected.length;
|
|
233
|
+
const m = actual.length;
|
|
234
|
+
const table = new Array((n + 1) * (m + 1)).fill(0);
|
|
235
|
+
const at = (i, j) => i * (m + 1) + j;
|
|
236
|
+
for (let i = n - 1; i >= 0; i--) {
|
|
237
|
+
for (let j = m - 1; j >= 0; j--) {
|
|
238
|
+
table[at(i, j)] =
|
|
239
|
+
expected[i].text === actual[j].text
|
|
240
|
+
? table[at(i + 1, j + 1)] + 1
|
|
241
|
+
: Math.max(table[at(i + 1, j)], table[at(i, j + 1)]);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
const pairs = [];
|
|
245
|
+
let i = 0;
|
|
246
|
+
let j = 0;
|
|
247
|
+
while (i < n && j < m) {
|
|
248
|
+
if (expected[i].text === actual[j].text) {
|
|
249
|
+
pairs.push([expected[i], actual[j]]);
|
|
250
|
+
i++;
|
|
251
|
+
j++;
|
|
252
|
+
}
|
|
253
|
+
else if (table[at(i + 1, j)] >= table[at(i, j + 1)]) {
|
|
254
|
+
i++;
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
j++;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
return pairs;
|
|
261
|
+
}
|
|
262
|
+
// =============================================================================
|
|
263
|
+
// Comparison
|
|
264
|
+
// =============================================================================
|
|
265
|
+
const TEXT_SAMPLE_LIMIT = 80;
|
|
266
|
+
function sampleText(text) {
|
|
267
|
+
return text.length > TEXT_SAMPLE_LIMIT ? `${text.slice(0, TEXT_SAMPLE_LIMIT)}…` : text;
|
|
268
|
+
}
|
|
269
|
+
function makeTally(compared, divergent) {
|
|
270
|
+
return {
|
|
271
|
+
compared,
|
|
272
|
+
divergent,
|
|
273
|
+
score: compared === 0 ? 1 : (compared - divergent) / compared,
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
function compareRunFormatting(pairs, divergences) {
|
|
277
|
+
let compared = 0;
|
|
278
|
+
let divergent = 0;
|
|
279
|
+
for (const [expected, actual] of pairs) {
|
|
280
|
+
compared += expected.text.length;
|
|
281
|
+
let rangeStart = -1;
|
|
282
|
+
const flushRange = (end) => {
|
|
283
|
+
if (rangeStart < 0)
|
|
284
|
+
return;
|
|
285
|
+
const diffs = diffPropertyMaps(propertyMap(expected.charRPrElements[rangeStart] ?? null, REVISION_PROPERTY_TAGS), propertyMap(actual.charRPrElements[rangeStart] ?? null, REVISION_PROPERTY_TAGS), RUN_PROPERTY_FRIENDLY_NAMES);
|
|
286
|
+
const textSample = sampleText(expected.text.slice(rangeStart, end));
|
|
287
|
+
for (const diff of diffs) {
|
|
288
|
+
divergences.push({
|
|
289
|
+
scope: 'run',
|
|
290
|
+
paragraphIndex: expected.index,
|
|
291
|
+
textSample,
|
|
292
|
+
...diff,
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
rangeStart = -1;
|
|
296
|
+
};
|
|
297
|
+
for (let i = 0; i < expected.text.length; i++) {
|
|
298
|
+
if (expected.charRPrKeys[i] === actual.charRPrKeys[i]) {
|
|
299
|
+
flushRange(i);
|
|
300
|
+
continue;
|
|
301
|
+
}
|
|
302
|
+
divergent++;
|
|
303
|
+
// Coalesce contiguous chars with the same key pair into one report range.
|
|
304
|
+
if (rangeStart >= 0 &&
|
|
305
|
+
(expected.charRPrKeys[i] !== expected.charRPrKeys[rangeStart] ||
|
|
306
|
+
actual.charRPrKeys[i] !== actual.charRPrKeys[rangeStart])) {
|
|
307
|
+
flushRange(i);
|
|
308
|
+
}
|
|
309
|
+
if (rangeStart < 0)
|
|
310
|
+
rangeStart = i;
|
|
311
|
+
}
|
|
312
|
+
flushRange(expected.text.length);
|
|
313
|
+
}
|
|
314
|
+
return makeTally(compared, divergent);
|
|
315
|
+
}
|
|
316
|
+
function compareParagraphFormatting(pairs, divergences) {
|
|
317
|
+
let divergent = 0;
|
|
318
|
+
for (const [expected, actual] of pairs) {
|
|
319
|
+
if (expected.pPrKey === actual.pPrKey)
|
|
320
|
+
continue;
|
|
321
|
+
divergent++;
|
|
322
|
+
for (const diff of diffPropertyMaps(expected.pPrProps, actual.pPrProps, PARAGRAPH_PROPERTY_FRIENDLY_NAMES)) {
|
|
323
|
+
divergences.push({
|
|
324
|
+
scope: 'paragraph',
|
|
325
|
+
paragraphIndex: expected.index,
|
|
326
|
+
textSample: sampleText(expected.text),
|
|
327
|
+
...diff,
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
return makeTally(pairs.length, divergent);
|
|
332
|
+
}
|
|
333
|
+
function compareTableFormatting(pairs, divergences) {
|
|
334
|
+
let compared = 0;
|
|
335
|
+
let divergent = 0;
|
|
336
|
+
for (const [expected, actual] of pairs) {
|
|
337
|
+
if (expected.tableChain.length === 0 && actual.tableChain.length === 0)
|
|
338
|
+
continue;
|
|
339
|
+
compared++;
|
|
340
|
+
if (expected.tableKey === actual.tableKey)
|
|
341
|
+
continue;
|
|
342
|
+
divergent++;
|
|
343
|
+
if (expected.tableChain.length !== actual.tableChain.length) {
|
|
344
|
+
divergences.push({
|
|
345
|
+
scope: 'table',
|
|
346
|
+
property: 'tableNesting',
|
|
347
|
+
kind: 'changed',
|
|
348
|
+
expectedValue: String(expected.tableChain.length),
|
|
349
|
+
actualValue: String(actual.tableChain.length),
|
|
350
|
+
paragraphIndex: expected.index,
|
|
351
|
+
textSample: sampleText(expected.text),
|
|
352
|
+
});
|
|
353
|
+
continue;
|
|
354
|
+
}
|
|
355
|
+
for (let level = 0; level < expected.tableChain.length; level++) {
|
|
356
|
+
const expectedLevel = expected.tableChain[level];
|
|
357
|
+
const actualLevel = actual.tableChain[level];
|
|
358
|
+
const containers = [
|
|
359
|
+
[expectedLevel.tblPr, actualLevel.tblPr],
|
|
360
|
+
[expectedLevel.trPr, actualLevel.trPr],
|
|
361
|
+
[expectedLevel.tcPr, actualLevel.tcPr],
|
|
362
|
+
];
|
|
363
|
+
for (const [expectedContainer, actualContainer] of containers) {
|
|
364
|
+
for (const diff of diffPropertyMaps(propertyMap(expectedContainer, REVISION_PROPERTY_TAGS), propertyMap(actualContainer, REVISION_PROPERTY_TAGS), {})) {
|
|
365
|
+
divergences.push({
|
|
366
|
+
scope: 'table',
|
|
367
|
+
paragraphIndex: expected.index,
|
|
368
|
+
textSample: sampleText(expected.text),
|
|
369
|
+
...diff,
|
|
370
|
+
});
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
return makeTally(compared, divergent);
|
|
376
|
+
}
|
|
377
|
+
function compareSectionFormatting(expectedRoot, actualRoot, divergences) {
|
|
378
|
+
const expectedSections = collectSectionProperties(expectedRoot);
|
|
379
|
+
const actualSections = collectSectionProperties(actualRoot);
|
|
380
|
+
const compared = Math.max(expectedSections.length, actualSections.length);
|
|
381
|
+
let divergent = 0;
|
|
382
|
+
for (let i = 0; i < compared; i++) {
|
|
383
|
+
const expectedProps = propertyMap(expectedSections[i] ?? null, REVISION_PROPERTY_TAGS);
|
|
384
|
+
const actualProps = propertyMap(actualSections[i] ?? null, REVISION_PROPERTY_TAGS);
|
|
385
|
+
if (containerKey(expectedProps) === containerKey(actualProps))
|
|
386
|
+
continue;
|
|
387
|
+
divergent++;
|
|
388
|
+
for (const diff of diffPropertyMaps(expectedProps, actualProps, {})) {
|
|
389
|
+
divergences.push({
|
|
390
|
+
scope: 'section',
|
|
391
|
+
paragraphIndex: -1,
|
|
392
|
+
textSample: '',
|
|
393
|
+
...diff,
|
|
394
|
+
});
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
return makeTally(compared, divergent);
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
400
|
+
* Compare the formatting carried by two word/document.xml views.
|
|
401
|
+
*
|
|
402
|
+
* The views are expected to hold comparable content (e.g. two reconstruction
|
|
403
|
+
* candidates for the same comparison, or the same projection of each); use
|
|
404
|
+
* compareProjectedFormattingFidelity to compare tracked-changes candidates
|
|
405
|
+
* whose revision-markup granularity may differ.
|
|
406
|
+
*/
|
|
407
|
+
export function compareFormattingFidelity(expectedDocumentXml, actualDocumentXml) {
|
|
408
|
+
const expectedRoot = parseDocumentXml(expectedDocumentXml);
|
|
409
|
+
const actualRoot = parseDocumentXml(actualDocumentXml);
|
|
410
|
+
const expectedUnits = [];
|
|
411
|
+
const actualUnits = [];
|
|
412
|
+
collectParagraphUnits(expectedRoot, [], expectedUnits);
|
|
413
|
+
collectParagraphUnits(actualRoot, [], actualUnits);
|
|
414
|
+
const pairs = alignParagraphsByText(expectedUnits, actualUnits);
|
|
415
|
+
const divergences = [];
|
|
416
|
+
const runFormatting = compareRunFormatting(pairs, divergences);
|
|
417
|
+
const paragraphFormatting = compareParagraphFormatting(pairs, divergences);
|
|
418
|
+
const tableFormatting = compareTableFormatting(pairs, divergences);
|
|
419
|
+
const sectionFormatting = compareSectionFormatting(expectedRoot, actualRoot, divergences);
|
|
420
|
+
const totalParagraphs = expectedUnits.length + actualUnits.length;
|
|
421
|
+
const alignmentCoverage = totalParagraphs === 0 ? 1 : (2 * pairs.length) / totalParagraphs;
|
|
422
|
+
const dimensions = [runFormatting, paragraphFormatting, tableFormatting, sectionFormatting].filter((dimension) => dimension.compared > 0);
|
|
423
|
+
const dimensionScore = dimensions.length === 0
|
|
424
|
+
? 1
|
|
425
|
+
: dimensions.reduce((sum, dimension) => sum + dimension.score, 0) / dimensions.length;
|
|
426
|
+
return {
|
|
427
|
+
score: alignmentCoverage * dimensionScore,
|
|
428
|
+
runFormatting,
|
|
429
|
+
paragraphFormatting,
|
|
430
|
+
tableFormatting,
|
|
431
|
+
sectionFormatting,
|
|
432
|
+
unalignedExpectedParagraphs: expectedUnits.length - pairs.length,
|
|
433
|
+
unalignedActualParagraphs: actualUnits.length - pairs.length,
|
|
434
|
+
divergences,
|
|
435
|
+
};
|
|
436
|
+
}
|
|
437
|
+
/**
|
|
438
|
+
* Compare two tracked-changes candidates projection-to-projection, the same
|
|
439
|
+
* stance the round-trip text oracle adopted in #347: accept-all and
|
|
440
|
+
* reject-all projections strip revision markup, so candidates that encode
|
|
441
|
+
* the same result with different w:ins/w:del granularity score 1.0 unless
|
|
442
|
+
* their formatting actually diverges.
|
|
443
|
+
*/
|
|
444
|
+
export function compareProjectedFormattingFidelity(expectedCandidateXml, actualCandidateXml) {
|
|
445
|
+
const accept = compareFormattingFidelity(acceptAllChanges(expectedCandidateXml), acceptAllChanges(actualCandidateXml));
|
|
446
|
+
const reject = compareFormattingFidelity(rejectAllChanges(expectedCandidateXml), rejectAllChanges(actualCandidateXml));
|
|
447
|
+
return { accept, reject, score: Math.min(accept.score, reject.score) };
|
|
448
|
+
}
|
|
449
|
+
//# sourceMappingURL=formattingFidelity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formattingFidelity.js","sourceRoot":"","sources":["../../../src/baselines/atomizer/formattingFidelity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC9E,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,iCAAiC,EAAE,MAAM,2BAA2B,CAAC;AA2D9E,gFAAgF;AAChF,0BAA0B;AAC1B,gFAAgF;AAEhF;;;;GAIG;AACH,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC;IACrC,aAAa;IACb,aAAa;IACb,eAAe;IACf,cAAc;IACd,cAAc;IACd,gBAAgB;IAChB,OAAO;IACP,OAAO;IACP,WAAW;IACX,WAAW;IACX,aAAa;CACd,CAAC,CAAC;AAEH,iFAAiF;AACjF,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,sBAAsB,EAAE,UAAU,CAAC,CAAC,CAAC;AAE3E;;;;;;;GAOG;AACH,SAAS,mBAAmB,CAAC,EAAW;IACtC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,MAAM,IAAI,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC,CAAE,CAAC;QAC/B,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,SAAS;QACtE,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IAC7C,CAAC;IACD,KAAK,CAAC,IAAI,EAAE,CAAC;IACb,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAE/D,MAAM,QAAQ,GAAG,aAAa,CAAC,EAAE,CAAC;SAC/B,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,sBAAsB,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;SAC7D,GAAG,CAAC,mBAAmB,CAAC;SACxB,IAAI,EAAE,CAAC;IACV,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3C,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC;YACpB,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,GAAG,QAAQ,IAAI,IAAI,KAAK,EAAE,CAAC,OAAO,GAAG;YACrD,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,GAAG,QAAQ,IAAI,CAAC;IACpC,CAAC;IACD,OAAO,IAAI,EAAE,CAAC,OAAO,GAAG,QAAQ,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,OAAO,GAAG,CAAC;AAC1E,CAAC;AAED;;;;GAIG;AACH,SAAS,WAAW,CAClB,SAAyB,EACzB,YAAiC;IAEjC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC9C,IAAI,SAAS,EAAE,CAAC;QACd,KAAK,MAAM,KAAK,IAAI,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7C,IAAI,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC;gBAAE,SAAS;YAC9C,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC9C,IAAI,QAAQ;gBAAE,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC;;gBACnD,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QACtC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,YAAY,CAAC,KAA0B;IAC9C,OAAO,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;SACrB,IAAI,EAAE;SACN,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;SAC7B,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AASD,SAAS,gBAAgB,CACvB,QAA6B,EAC7B,MAA2B,EAC3B,aAAqC;IAErC,MAAM,KAAK,GAAmB,EAAE,CAAC;IACjC,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5E,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,MAAM,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,aAAa,KAAK,WAAW;YAAE,SAAS;QAC5C,KAAK,CAAC,IAAI,CAAC;YACT,QAAQ,EAAE,aAAa,CAAC,GAAG,CAAC,IAAI,GAAG;YACnC,IAAI,EACF,aAAa,KAAK,SAAS;gBACzB,CAAC,CAAC,OAAO;gBACT,CAAC,CAAC,WAAW,KAAK,SAAS;oBACzB,CAAC,CAAC,SAAS;oBACX,CAAC,CAAC,SAAS;YACjB,aAAa,EAAE,aAAa,IAAI,IAAI;YACpC,WAAW,EAAE,WAAW,IAAI,IAAI;SACjC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AA4BD,SAAS,aAAa,CAAC,KAAsB;IAC3C,OAAO;QACL,YAAY,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,sBAAsB,CAAC,CAAC;QAC9D,YAAY,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAC;QAC7D,YAAY,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAC;KAC9D,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACd,CAAC;AAED,SAAS,cAAc,CACrB,EAAW,EACX,aAAqB,EACrB,UAA0B,EAC1B,IAAmB;IAEnB,KAAK,MAAM,KAAK,IAAI,aAAa,CAAC,EAAE,CAAC,EAAE,CAAC;QACtC,IAAI,KAAK,CAAC,OAAO,KAAK,OAAO;YAAE,SAAS;QACxC,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC/C,MAAM,GAAG,GAAG,YAAY,CAAC,WAAW,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAC,CAAC;YACnE,cAAc,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;YACtC,SAAS;QACX,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,IAAI,KAAK,CAAC,OAAO,KAAK,WAAW,EAAE,CAAC;YAC7D,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC;YACrC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;YAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACrC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBACrC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACxC,CAAC;YACD,SAAS;QACX,CAAC;QACD,sEAAsE;QACtE,cAAc,CAAC,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;IACzD,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CACzB,SAAkB,EAClB,KAAwB,EACxB,KAAa;IAEb,MAAM,GAAG,GAAG,kBAAkB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;IACrD,MAAM,IAAI,GAAkB;QAC1B,KAAK;QACL,IAAI,EAAE,EAAE;QACR,WAAW,EAAE,EAAE;QACf,eAAe,EAAE,EAAE;QACnB,QAAQ;QACR,MAAM,EAAE,YAAY,CAAC,QAAQ,CAAC;QAC9B,UAAU,EAAE,KAAK;QACjB,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;KAC7C,CAAC;IACF,cAAc,CAAC,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC1C,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,qBAAqB,CAC5B,SAAkB,EAClB,KAAwB,EACxB,GAAoB;IAEpB,KAAK,MAAM,KAAK,IAAI,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7C,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YAC5B,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;YACvD,SAAS;QACX,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;YAC9B,MAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YACnD,KAAK,MAAM,GAAG,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvC,IAAI,GAAG,CAAC,OAAO,KAAK,MAAM;oBAAE,SAAS;gBACrC,MAAM,IAAI,GAAG,kBAAkB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;gBAC/C,KAAK,MAAM,IAAI,IAAI,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;oBACtC,IAAI,IAAI,CAAC,OAAO,KAAK,MAAM;wBAAE,SAAS;oBACtC,MAAM,IAAI,GAAG,kBAAkB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;oBAChD,qBAAqB,CAAC,IAAI,EAAE,CAAC,GAAG,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;gBACtE,CAAC;YACH,CAAC;YACD,SAAS;QACX,CAAC;QACD,wEAAwE;QACxE,qBAAqB,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IAC3C,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,CAAC,IAAa;IAC7C,MAAM,GAAG,GAAc,EAAE,CAAC;IAC1B,MAAM,IAAI,GAAG,CAAC,EAAW,EAAQ,EAAE;QACjC,KAAK,MAAM,KAAK,IAAI,aAAa,CAAC,EAAE,CAAC,EAAE,CAAC;YACtC,IAAI,KAAK,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;gBACjC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAChB,SAAS;YACX,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,CAAC;QACd,CAAC;IACH,CAAC,CAAC;IACF,IAAI,CAAC,IAAI,CAAC,CAAC;IACX,OAAO,GAAG,CAAC;AACb,CAAC;AAED,gFAAgF;AAChF,oBAAoB;AACpB,gFAAgF;AAEhF;;;GAGG;AACH,SAAS,qBAAqB,CAC5B,QAAyB,EACzB,MAAuB;IAEvB,IACE,QAAQ,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM;QACjC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,EAC1D,CAAC;QACD,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC;IAC1B,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IACxB,MAAM,KAAK,GAAa,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7D,MAAM,EAAE,GAAG,CAAC,CAAS,EAAE,CAAS,EAAU,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAC7D,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAChC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACb,QAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAE,CAAC,IAAI;oBACnC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAE,GAAG,CAAC;oBAC9B,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAE,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAA0C,EAAE,CAAC;IACxD,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACtB,IAAI,QAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC;YAC1C,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAE,EAAE,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC;YACvC,CAAC,EAAE,CAAC;YACJ,CAAC,EAAE,CAAC;QACN,CAAC;aAAM,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAE,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAE,EAAE,CAAC;YACxD,CAAC,EAAE,CAAC;QACN,CAAC;aAAM,CAAC;YACN,CAAC,EAAE,CAAC;QACN,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,gFAAgF;AAChF,aAAa;AACb,gFAAgF;AAEhF,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAE7B,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,IAAI,CAAC,MAAM,GAAG,iBAAiB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AACzF,CAAC;AAED,SAAS,SAAS,CAAC,QAAgB,EAAE,SAAiB;IACpD,OAAO;QACL,QAAQ;QACR,SAAS;QACT,KAAK,EAAE,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,SAAS,CAAC,GAAG,QAAQ;KAC9D,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAC3B,KAA4C,EAC5C,WAAmC;IAEnC,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,KAAK,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACvC,QAAQ,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;QACjC,IAAI,UAAU,GAAG,CAAC,CAAC,CAAC;QACpB,MAAM,UAAU,GAAG,CAAC,GAAW,EAAQ,EAAE;YACvC,IAAI,UAAU,GAAG,CAAC;gBAAE,OAAO;YAC3B,MAAM,KAAK,GAAG,gBAAgB,CAC5B,WAAW,CAAC,QAAQ,CAAC,eAAe,CAAC,UAAU,CAAC,IAAI,IAAI,EAAE,sBAAsB,CAAC,EACjF,WAAW,CAAC,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC,IAAI,IAAI,EAAE,sBAAsB,CAAC,EAC/E,2BAA2B,CAC5B,CAAC;YACF,MAAM,UAAU,GAAG,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC;YACpE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,WAAW,CAAC,IAAI,CAAC;oBACf,KAAK,EAAE,KAAK;oBACZ,cAAc,EAAE,QAAQ,CAAC,KAAK;oBAC9B,UAAU;oBACV,GAAG,IAAI;iBACR,CAAC,CAAC;YACL,CAAC;YACD,UAAU,GAAG,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC;QACF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9C,IAAI,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtD,UAAU,CAAC,CAAC,CAAC,CAAC;gBACd,SAAS;YACX,CAAC;YACD,SAAS,EAAE,CAAC;YACZ,0EAA0E;YAC1E,IACE,UAAU,IAAI,CAAC;gBACf,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC;oBAC3D,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,EAC3D,CAAC;gBACD,UAAU,CAAC,CAAC,CAAC,CAAC;YAChB,CAAC;YACD,IAAI,UAAU,GAAG,CAAC;gBAAE,UAAU,GAAG,CAAC,CAAC;QACrC,CAAC;QACD,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,SAAS,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,0BAA0B,CACjC,KAA4C,EAC5C,WAAmC;IAEnC,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,KAAK,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACvC,IAAI,QAAQ,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM;YAAE,SAAS;QAChD,SAAS,EAAE,CAAC;QACZ,KAAK,MAAM,IAAI,IAAI,gBAAgB,CACjC,QAAQ,CAAC,QAAQ,EACjB,MAAM,CAAC,QAAQ,EACf,iCAAiC,CAClC,EAAE,CAAC;YACF,WAAW,CAAC,IAAI,CAAC;gBACf,KAAK,EAAE,WAAW;gBAClB,cAAc,EAAE,QAAQ,CAAC,KAAK;gBAC9B,UAAU,EAAE,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACrC,GAAG,IAAI;aACR,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,sBAAsB,CAC7B,KAA4C,EAC5C,WAAmC;IAEnC,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,KAAK,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACvC,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QACjF,QAAQ,EAAE,CAAC;QACX,IAAI,QAAQ,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ;YAAE,SAAS;QACpD,SAAS,EAAE,CAAC;QACZ,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,KAAK,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;YAC5D,WAAW,CAAC,IAAI,CAAC;gBACf,KAAK,EAAE,OAAO;gBACd,QAAQ,EAAE,cAAc;gBACxB,IAAI,EAAE,SAAS;gBACf,aAAa,EAAE,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC;gBACjD,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC;gBAC7C,cAAc,EAAE,QAAQ,CAAC,KAAK;gBAC9B,UAAU,EAAE,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC;aACtC,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;YAChE,MAAM,aAAa,GAAG,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAE,CAAC;YAClD,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAE,CAAC;YAC9C,MAAM,UAAU,GAA4C;gBAC1D,CAAC,aAAa,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC;gBACxC,CAAC,aAAa,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC;gBACtC,CAAC,aAAa,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC;aACvC,CAAC;YACF,KAAK,MAAM,CAAC,iBAAiB,EAAE,eAAe,CAAC,IAAI,UAAU,EAAE,CAAC;gBAC9D,KAAK,MAAM,IAAI,IAAI,gBAAgB,CACjC,WAAW,CAAC,iBAAiB,EAAE,sBAAsB,CAAC,EACtD,WAAW,CAAC,eAAe,EAAE,sBAAsB,CAAC,EACpD,EAAE,CACH,EAAE,CAAC;oBACF,WAAW,CAAC,IAAI,CAAC;wBACf,KAAK,EAAE,OAAO;wBACd,cAAc,EAAE,QAAQ,CAAC,KAAK;wBAC9B,UAAU,EAAE,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC;wBACrC,GAAG,IAAI;qBACR,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,wBAAwB,CAC/B,YAAqB,EACrB,UAAmB,EACnB,WAAmC;IAEnC,MAAM,gBAAgB,GAAG,wBAAwB,CAAC,YAAY,CAAC,CAAC;IAChE,MAAM,cAAc,GAAG,wBAAwB,CAAC,UAAU,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IAC1E,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,MAAM,aAAa,GAAG,WAAW,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,sBAAsB,CAAC,CAAC;QACvF,MAAM,WAAW,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,sBAAsB,CAAC,CAAC;QACnF,IAAI,YAAY,CAAC,aAAa,CAAC,KAAK,YAAY,CAAC,WAAW,CAAC;YAAE,SAAS;QACxE,SAAS,EAAE,CAAC;QACZ,KAAK,MAAM,IAAI,IAAI,gBAAgB,CAAC,aAAa,EAAE,WAAW,EAAE,EAAE,CAAC,EAAE,CAAC;YACpE,WAAW,CAAC,IAAI,CAAC;gBACf,KAAK,EAAE,SAAS;gBAChB,cAAc,EAAE,CAAC,CAAC;gBAClB,UAAU,EAAE,EAAE;gBACd,GAAG,IAAI;aACR,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;AACxC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,yBAAyB,CACvC,mBAA2B,EAC3B,iBAAyB;IAEzB,MAAM,YAAY,GAAG,gBAAgB,CAAC,mBAAmB,CAAC,CAAC;IAC3D,MAAM,UAAU,GAAG,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;IAEvD,MAAM,aAAa,GAAoB,EAAE,CAAC;IAC1C,MAAM,WAAW,GAAoB,EAAE,CAAC;IACxC,qBAAqB,CAAC,YAAY,EAAE,EAAE,EAAE,aAAa,CAAC,CAAC;IACvD,qBAAqB,CAAC,UAAU,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC;IAEnD,MAAM,KAAK,GAAG,qBAAqB,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;IAEhE,MAAM,WAAW,GAA2B,EAAE,CAAC;IAC/C,MAAM,aAAa,GAAG,oBAAoB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAC/D,MAAM,mBAAmB,GAAG,0BAA0B,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAC3E,MAAM,eAAe,GAAG,sBAAsB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IACnE,MAAM,iBAAiB,GAAG,wBAAwB,CAAC,YAAY,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;IAE1F,MAAM,eAAe,GAAG,aAAa,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC;IAClE,MAAM,iBAAiB,GAAG,eAAe,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,eAAe,CAAC;IAC3F,MAAM,UAAU,GAAG,CAAC,aAAa,EAAE,mBAAmB,EAAE,eAAe,EAAE,iBAAiB,CAAC,CAAC,MAAM,CAChG,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,GAAG,CAAC,CACtC,CAAC;IACF,MAAM,cAAc,GAClB,UAAU,CAAC,MAAM,KAAK,CAAC;QACrB,CAAC,CAAC,CAAC;QACH,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,SAAS,EAAE,EAAE,CAAC,GAAG,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC;IAE1F,OAAO;QACL,KAAK,EAAE,iBAAiB,GAAG,cAAc;QACzC,aAAa;QACb,mBAAmB;QACnB,eAAe;QACf,iBAAiB;QACjB,2BAA2B,EAAE,aAAa,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM;QAChE,yBAAyB,EAAE,WAAW,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM;QAC5D,WAAW;KACZ,CAAC;AACJ,CAAC;AAeD;;;;;;GAMG;AACH,MAAM,UAAU,kCAAkC,CAChD,oBAA4B,EAC5B,kBAA0B;IAE1B,MAAM,MAAM,GAAG,yBAAyB,CACtC,gBAAgB,CAAC,oBAAoB,CAAC,EACtC,gBAAgB,CAAC,kBAAkB,CAAC,CACrC,CAAC;IACF,MAAM,MAAM,GAAG,yBAAyB,CACtC,gBAAgB,CAAC,oBAAoB,CAAC,EACtC,gBAAgB,CAAC,kBAAkB,CAAC,CACrC,CAAC;IACF,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;AACzE,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-Place AST Modifier
|
|
3
|
+
*
|
|
4
|
+
* Modifies the revised document's AST in-place to add track changes markup.
|
|
5
|
+
* This replaces the reconstruction-based approach with direct tree manipulation.
|
|
6
|
+
*/
|
|
7
|
+
import { type RevisionIdState } from './inPlaceModifier-shared.js';
|
|
8
|
+
export interface ParagraphBoundaryBookmarkMarkers {
|
|
9
|
+
leading: Element[];
|
|
10
|
+
trailing: Element[];
|
|
11
|
+
sourceLeading: Element[];
|
|
12
|
+
sourceTrailing: Element[];
|
|
13
|
+
}
|
|
14
|
+
export declare function cloneParagraphBoundaryBookmarkMarkers(sourceParagraph: Element | undefined): ParagraphBoundaryBookmarkMarkers;
|
|
15
|
+
export declare function insertLeadingMarkers(paragraph: Element, markers: Element[]): Element | null;
|
|
16
|
+
export type BookmarkMarkerTag = 'w:bookmarkStart' | 'w:bookmarkEnd';
|
|
17
|
+
export declare function isBookmarkMarkerTag(tagName: string): tagName is BookmarkMarkerTag;
|
|
18
|
+
/**
|
|
19
|
+
* Collect direct paragraph bookmark markers adjacent to a source run.
|
|
20
|
+
*
|
|
21
|
+
* Markers between runs (or at paragraph boundaries) are represented as siblings
|
|
22
|
+
* of w:r under w:p. We clone nearby markers so reconstructed deleted/moveFrom
|
|
23
|
+
* fragments preserve bookmark names/IDs needed for Reject All parity.
|
|
24
|
+
*/
|
|
25
|
+
export declare function collectAdjacentSourceBookmarkMarkers(sourceRun: Element): Element[];
|
|
26
|
+
export interface BookmarkSurvivalContext {
|
|
27
|
+
isParagraphRemovedOnReject?: (paragraph: Element) => boolean;
|
|
28
|
+
}
|
|
29
|
+
export declare function markerSurvivesReject(marker: Element, context?: BookmarkSurvivalContext): boolean;
|
|
30
|
+
export declare function targetTreeHasEquivalentBookmarkMarker(targetParagraph: Element, marker: Element, context?: BookmarkSurvivalContext): boolean;
|
|
31
|
+
export declare function cloneUnemittedSourceBookmarkMarkers(sourceRun: Element, targetParagraph: Element, state: RevisionIdState, context?: BookmarkSurvivalContext): Element[];
|
|
32
|
+
export declare function insertMarkersBeforeWrapper(wrapper: Element, markers: Element[]): void;
|
|
33
|
+
export declare function filterEquivalentBookmarkMarkers(markers: Element[], targetNode: Element, context?: BookmarkSurvivalContext): Element[];
|
|
34
|
+
/**
|
|
35
|
+
* Track change wrapper tag names.
|
|
36
|
+
*/
|
|
37
|
+
//# sourceMappingURL=inPlaceModifier-bookmarks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inPlaceModifier-bookmarks.d.ts","sourceRoot":"","sources":["../../../src/baselines/atomizer/inPlaceModifier-bookmarks.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAKL,KAAK,eAAe,EACrB,MAAM,6BAA6B,CAAC;AAErC,MAAM,WAAW,gCAAgC;IAC/C,OAAO,EAAE,OAAO,EAAE,CAAC;IACnB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,aAAa,EAAE,OAAO,EAAE,CAAC;IACzB,cAAc,EAAE,OAAO,EAAE,CAAC;CAC3B;AAED,wBAAgB,qCAAqC,CACnD,eAAe,EAAE,OAAO,GAAG,SAAS,GACnC,gCAAgC,CAwClC;AAED,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,OAAO,EAClB,OAAO,EAAE,OAAO,EAAE,GACjB,OAAO,GAAG,IAAI,CAiBhB;AAED,MAAM,MAAM,iBAAiB,GAAG,iBAAiB,GAAG,eAAe,CAAC;AAEpE,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,IAAI,iBAAiB,CAEjF;AAED;;;;;;GAMG;AACH,wBAAgB,oCAAoC,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,EAAE,CAiClF;AAGD,MAAM,WAAW,uBAAuB;IACtC,0BAA0B,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,OAAO,CAAC;CAC9D;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,uBAAuB,GAAG,OAAO,CAgBhG;AAED,wBAAgB,qCAAqC,CACnD,eAAe,EAAE,OAAO,EACxB,MAAM,EAAE,OAAO,EACf,OAAO,CAAC,EAAE,uBAAuB,GAChC,OAAO,CA8BT;AAED,wBAAgB,mCAAmC,CACjD,SAAS,EAAE,OAAO,EAClB,eAAe,EAAE,OAAO,EACxB,KAAK,EAAE,eAAe,EACtB,OAAO,CAAC,EAAE,uBAAuB,GAChC,OAAO,EAAE,CAoBX;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,CAOrF;AAED,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,OAAO,EAAE,EAClB,UAAU,EAAE,OAAO,EACnB,OAAO,CAAC,EAAE,uBAAuB,GAChC,OAAO,EAAE,CAEX;AAED;;GAEG"}
|