@usejunior/docx-core 0.9.1 → 0.11.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/LICENSE +202 -21
- package/NOTICE +2 -0
- package/README.md +2 -2
- package/dist/.tsbuildinfo +1 -1
- package/dist/atomizer.d.ts +28 -8
- package/dist/atomizer.d.ts.map +1 -1
- package/dist/atomizer.js +96 -25
- package/dist/atomizer.js.map +1 -1
- package/dist/baselines/atomizer/auxiliaryIdCollision.d.ts +99 -0
- package/dist/baselines/atomizer/auxiliaryIdCollision.d.ts.map +1 -0
- package/dist/baselines/atomizer/auxiliaryIdCollision.js +415 -0
- package/dist/baselines/atomizer/auxiliaryIdCollision.js.map +1 -0
- package/dist/baselines/atomizer/documentReconstructor.d.ts.map +1 -1
- package/dist/baselines/atomizer/documentReconstructor.js +333 -112
- 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 +198 -0
- package/dist/baselines/atomizer/inPlaceModifier-wrappers.d.ts.map +1 -0
- package/dist/baselines/atomizer/inPlaceModifier-wrappers.js +475 -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 +36 -2
- package/dist/baselines/atomizer/pipeline.d.ts.map +1 -1
- package/dist/baselines/atomizer/pipeline.js +216 -144
- 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 +199 -173
- package/dist/baselines/atomizer/trackChangesAcceptorAst.js.map +1 -1
- package/dist/baselines/wmlcomparer/DotnetCli.d.ts.map +1 -1
- package/dist/baselines/wmlcomparer/DotnetCli.js +7 -0
- package/dist/baselines/wmlcomparer/DotnetCli.js.map +1 -1
- package/dist/cli/compare-two.d.ts.map +1 -1
- package/dist/cli/compare-two.js +3 -1
- package/dist/cli/compare-two.js.map +1 -1
- package/dist/cli/conformance-adapter.d.ts +3 -0
- package/dist/cli/conformance-adapter.d.ts.map +1 -0
- package/dist/cli/conformance-adapter.js +93 -0
- package/dist/cli/conformance-adapter.js.map +1 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +5 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/compare-types.d.ts +197 -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/generation/compile.d.ts +21 -0
- package/dist/generation/compile.d.ts.map +1 -0
- package/dist/generation/compile.js +46 -0
- package/dist/generation/compile.js.map +1 -0
- package/dist/generation/context.d.ts +42 -0
- package/dist/generation/context.d.ts.map +1 -0
- package/dist/generation/context.js +65 -0
- package/dist/generation/context.js.map +1 -0
- package/dist/generation/emit/comments-part.d.ts +36 -0
- package/dist/generation/emit/comments-part.d.ts.map +1 -0
- package/dist/generation/emit/comments-part.js +116 -0
- package/dist/generation/emit/comments-part.js.map +1 -0
- package/dist/generation/emit/document-part.d.ts +24 -0
- package/dist/generation/emit/document-part.d.ts.map +1 -0
- package/dist/generation/emit/document-part.js +60 -0
- package/dist/generation/emit/document-part.js.map +1 -0
- package/dist/generation/emit/emit-context.d.ts +26 -0
- package/dist/generation/emit/emit-context.d.ts.map +1 -0
- package/dist/generation/emit/emit-context.js +19 -0
- package/dist/generation/emit/emit-context.js.map +1 -0
- package/dist/generation/emit/header-footer-part.d.ts +23 -0
- package/dist/generation/emit/header-footer-part.d.ts.map +1 -0
- package/dist/generation/emit/header-footer-part.js +57 -0
- package/dist/generation/emit/header-footer-part.js.map +1 -0
- package/dist/generation/emit/numbering-part.d.ts +29 -0
- package/dist/generation/emit/numbering-part.d.ts.map +1 -0
- package/dist/generation/emit/numbering-part.js +100 -0
- package/dist/generation/emit/numbering-part.js.map +1 -0
- package/dist/generation/emit/package-parts.d.ts +24 -0
- package/dist/generation/emit/package-parts.d.ts.map +1 -0
- package/dist/generation/emit/package-parts.js +121 -0
- package/dist/generation/emit/package-parts.js.map +1 -0
- package/dist/generation/emit/paragraph.d.ts +24 -0
- package/dist/generation/emit/paragraph.d.ts.map +1 -0
- package/dist/generation/emit/paragraph.js +63 -0
- package/dist/generation/emit/paragraph.js.map +1 -0
- package/dist/generation/emit/properties.d.ts +34 -0
- package/dist/generation/emit/properties.d.ts.map +1 -0
- package/dist/generation/emit/properties.js +138 -0
- package/dist/generation/emit/properties.js.map +1 -0
- package/dist/generation/emit/run.d.ts +15 -0
- package/dist/generation/emit/run.d.ts.map +1 -0
- package/dist/generation/emit/run.js +71 -0
- package/dist/generation/emit/run.js.map +1 -0
- package/dist/generation/emit/section.d.ts +29 -0
- package/dist/generation/emit/section.d.ts.map +1 -0
- package/dist/generation/emit/section.js +117 -0
- package/dist/generation/emit/section.js.map +1 -0
- package/dist/generation/emit/settings-part.d.ts +13 -0
- package/dist/generation/emit/settings-part.d.ts.map +1 -0
- package/dist/generation/emit/settings-part.js +24 -0
- package/dist/generation/emit/settings-part.js.map +1 -0
- package/dist/generation/emit/styles-part.d.ts +16 -0
- package/dist/generation/emit/styles-part.d.ts.map +1 -0
- package/dist/generation/emit/styles-part.js +80 -0
- package/dist/generation/emit/styles-part.js.map +1 -0
- package/dist/generation/emit/table.d.ts +26 -0
- package/dist/generation/emit/table.d.ts.map +1 -0
- package/dist/generation/emit/table.js +196 -0
- package/dist/generation/emit/table.js.map +1 -0
- package/dist/generation/errors.d.ts +22 -0
- package/dist/generation/errors.d.ts.map +1 -0
- package/dist/generation/errors.js +29 -0
- package/dist/generation/errors.js.map +1 -0
- package/dist/generation/index.d.ts +13 -0
- package/dist/generation/index.d.ts.map +1 -0
- package/dist/generation/index.js +12 -0
- package/dist/generation/index.js.map +1 -0
- package/dist/generation/ordering.d.ts +46 -0
- package/dist/generation/ordering.d.ts.map +1 -0
- package/dist/generation/ordering.js +119 -0
- package/dist/generation/ordering.js.map +1 -0
- package/dist/generation/recipes.d.ts +47 -0
- package/dist/generation/recipes.d.ts.map +1 -0
- package/dist/generation/recipes.js +84 -0
- package/dist/generation/recipes.js.map +1 -0
- package/dist/generation/structural-checks.d.ts +24 -0
- package/dist/generation/structural-checks.d.ts.map +1 -0
- package/dist/generation/structural-checks.js +318 -0
- package/dist/generation/structural-checks.js.map +1 -0
- package/dist/generation/types.d.ts +217 -0
- package/dist/generation/types.d.ts.map +1 -0
- package/dist/generation/types.js +16 -0
- package/dist/generation/types.js.map +1 -0
- package/dist/generation/validate-spec.d.ts +27 -0
- package/dist/generation/validate-spec.d.ts.map +1 -0
- package/dist/generation/validate-spec.js +307 -0
- package/dist/generation/validate-spec.js.map +1 -0
- package/dist/index.d.ts +9 -150
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -1
- package/dist/integration/generation-probes.d.ts +15 -0
- package/dist/integration/generation-probes.d.ts.map +1 -0
- package/dist/integration/generation-probes.js +84 -0
- package/dist/integration/generation-probes.js.map +1 -0
- package/dist/integration/libreoffice-oracle.d.ts +49 -0
- package/dist/integration/libreoffice-oracle.d.ts.map +1 -0
- package/dist/integration/libreoffice-oracle.js +290 -0
- package/dist/integration/libreoffice-oracle.js.map +1 -0
- package/dist/integration/synthetic-docx-fixture.d.ts +72 -0
- package/dist/integration/synthetic-docx-fixture.d.ts.map +1 -1
- package/dist/integration/synthetic-docx-fixture.js +131 -4
- package/dist/integration/synthetic-docx-fixture.js.map +1 -1
- package/dist/primitives/accept_changes.d.ts +4 -3
- package/dist/primitives/accept_changes.d.ts.map +1 -1
- package/dist/primitives/accept_changes.js +163 -77
- 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 +94 -15
- package/dist/primitives/document.d.ts.map +1 -1
- package/dist/primitives/document.js +373 -36
- 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 +160 -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 +152 -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 +153 -312
- 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 +7 -0
- package/dist/primitives/formatting_tags.d.ts.map +1 -1
- package/dist/primitives/formatting_tags.js +22 -11
- package/dist/primitives/formatting_tags.js.map +1 -1
- package/dist/primitives/index.d.ts +10 -0
- package/dist/primitives/index.d.ts.map +1 -1
- package/dist/primitives/index.js +9 -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 +45 -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/minimal_save.d.ts +38 -0
- package/dist/primitives/minimal_save.d.ts.map +1 -0
- package/dist/primitives/minimal_save.js +323 -0
- package/dist/primitives/minimal_save.js.map +1 -0
- package/dist/primitives/namespaces.d.ts +47 -0
- package/dist/primitives/namespaces.d.ts.map +1 -1
- package/dist/primitives/namespaces.js +52 -0
- package/dist/primitives/namespaces.js.map +1 -1
- package/dist/primitives/reject_changes.d.ts +6 -4
- package/dist/primitives/reject_changes.d.ts.map +1 -1
- package/dist/primitives/reject_changes.js +187 -91
- package/dist/primitives/reject_changes.js.map +1 -1
- package/dist/primitives/revision-parts.d.ts +7 -0
- package/dist/primitives/revision-parts.d.ts.map +1 -0
- package/dist/primitives/revision-parts.js +27 -0
- package/dist/primitives/revision-parts.js.map +1 -0
- package/dist/primitives/revision-vocabulary.d.ts +7 -0
- package/dist/primitives/revision-vocabulary.d.ts.map +1 -0
- package/dist/primitives/revision-vocabulary.js +39 -0
- package/dist/primitives/revision-vocabulary.js.map +1 -0
- package/dist/primitives/schema-corpus-capture.d.ts +19 -0
- package/dist/primitives/schema-corpus-capture.d.ts.map +1 -0
- package/dist/primitives/schema-corpus-capture.js +29 -0
- package/dist/primitives/schema-corpus-capture.js.map +1 -0
- package/dist/primitives/sectPrAudit.d.ts +19 -0
- package/dist/primitives/sectPrAudit.d.ts.map +1 -0
- package/dist/primitives/sectPrAudit.js +165 -0
- package/dist/primitives/sectPrAudit.js.map +1 -0
- 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 +23 -4
- package/dist/primitives/semantic_tags.js.map +1 -1
- package/dist/primitives/serialize_html.d.ts +37 -0
- package/dist/primitives/serialize_html.d.ts.map +1 -0
- package/dist/primitives/serialize_html.js +395 -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.d.ts +15 -0
- package/dist/primitives/styles.d.ts.map +1 -1
- package/dist/primitives/styles.js +33 -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 +148 -0
- package/dist/primitives/track-changes-emitter.d.ts.map +1 -0
- package/dist/primitives/track-changes-emitter.js +291 -0
- package/dist/primitives/track-changes-emitter.js.map +1 -0
- package/dist/primitives/validate_ai_revisions.d.ts +35 -0
- package/dist/primitives/validate_ai_revisions.d.ts.map +1 -0
- package/dist/primitives/validate_ai_revisions.js +323 -0
- package/dist/primitives/validate_ai_revisions.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/primitives/xml.d.ts +5 -0
- package/dist/primitives/xml.d.ts.map +1 -1
- package/dist/primitives/xml.js +5 -0
- package/dist/primitives/xml.js.map +1 -1
- package/dist/primitives/zip.d.ts +1 -0
- package/dist/primitives/zip.d.ts.map +1 -1
- package/dist/primitives/zip.js +21 -3
- package/dist/primitives/zip.js.map +1 -1
- package/dist/shared/field-structure.d.ts +14 -0
- package/dist/shared/field-structure.d.ts.map +1 -0
- package/dist/shared/field-structure.js +166 -0
- package/dist/shared/field-structure.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 +13 -9
|
@@ -0,0 +1,326 @@
|
|
|
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 { childElements, findChildByTagName, insertAfterElement } from '../../primitives/index.js';
|
|
8
|
+
import { allocateRevisionId, convertToDelText, createEl, findAncestorByTag, getMoveRangeIds, } from './inPlaceModifier-shared.js';
|
|
9
|
+
import { cloneUnemittedSourceBookmarkMarkers, insertMarkersBeforeWrapper, } from './inPlaceModifier-bookmarks.js';
|
|
10
|
+
import { getAtomRuns, isCollapsedFieldAtom, wrapAsDeleted } from './inPlaceModifier-wrappers.js';
|
|
11
|
+
export function getInsertableAtomContentElements(atom, filterRun) {
|
|
12
|
+
if (atom.collapsedFieldAtoms && atom.collapsedFieldAtoms.length > 0) {
|
|
13
|
+
if (filterRun) {
|
|
14
|
+
return atom.collapsedFieldAtoms
|
|
15
|
+
.filter((fieldAtom) => {
|
|
16
|
+
const run = fieldAtom.sourceRunElement ?? findAncestorByTag(fieldAtom, 'w:r');
|
|
17
|
+
return run === filterRun;
|
|
18
|
+
})
|
|
19
|
+
.map((fieldAtom) => fieldAtom.contentElement);
|
|
20
|
+
}
|
|
21
|
+
return atom.collapsedFieldAtoms.map((fieldAtom) => fieldAtom.contentElement);
|
|
22
|
+
}
|
|
23
|
+
return [atom.contentElement];
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Clone a source run and replace its non-rPr children with atom content.
|
|
27
|
+
*
|
|
28
|
+
* This keeps run-level formatting while allowing atom-level fragment insertion.
|
|
29
|
+
*
|
|
30
|
+
* @param filterRun - When provided, only include content elements belonging
|
|
31
|
+
* to this source run (for multi-run collapsed field replay).
|
|
32
|
+
*/
|
|
33
|
+
export function cloneRunWithAtomContent(sourceRun, atom, filterRun) {
|
|
34
|
+
const clonedRun = sourceRun.cloneNode(true);
|
|
35
|
+
const retainedChildren = [];
|
|
36
|
+
for (const child of childElements(clonedRun)) {
|
|
37
|
+
if (child.tagName === 'w:rPr') {
|
|
38
|
+
retainedChildren.push(child);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// Remove all current children from clonedRun
|
|
42
|
+
while (clonedRun.firstChild)
|
|
43
|
+
clonedRun.removeChild(clonedRun.firstChild);
|
|
44
|
+
// Re-append retained rPr children
|
|
45
|
+
for (const child of retainedChildren) {
|
|
46
|
+
clonedRun.appendChild(child);
|
|
47
|
+
}
|
|
48
|
+
for (const contentElement of getInsertableAtomContentElements(atom, filterRun)) {
|
|
49
|
+
const fragment = contentElement.cloneNode(true);
|
|
50
|
+
clonedRun.appendChild(fragment);
|
|
51
|
+
}
|
|
52
|
+
return clonedRun;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Clone a deleted run from the original document and insert it into the revised document.
|
|
56
|
+
*
|
|
57
|
+
* For a single-content atom this wraps one cloned run in `<w:del>` and returns
|
|
58
|
+
* the `<w:del>` element. For a collapsed-field atom (issue #217), control
|
|
59
|
+
* routes to `insertFragmentedDeletedField` which emits multiple sibling
|
|
60
|
+
* elements — `w:fldChar` runs at sibling level (unwrapped) and individual
|
|
61
|
+
* `<w:del>` wrappers around each payload run — and returns the LAST inserted
|
|
62
|
+
* sibling (which may be a `<w:r>` carrying the end fldChar, not a `<w:del>`).
|
|
63
|
+
* Callers use the return value purely as the next insertion anchor.
|
|
64
|
+
*
|
|
65
|
+
* @param deletedAtom - Atom with the deleted content
|
|
66
|
+
* @param insertAfterRun - The run to insert after (null to insert at beginning of paragraph)
|
|
67
|
+
* @param targetParagraph - The paragraph to insert into
|
|
68
|
+
* @param author - Author name
|
|
69
|
+
* @param dateStr - Formatted date
|
|
70
|
+
* @param state - Revision ID state
|
|
71
|
+
* @returns The last inserted sibling element (a `<w:del>` for non-collapsed-field
|
|
72
|
+
* atoms; possibly a `<w:r>` for fragmented collapsed-field atoms), or null
|
|
73
|
+
* if insertion failed.
|
|
74
|
+
*/
|
|
75
|
+
export function insertDeletedRun(deletedAtom, insertAfterRun, targetParagraph, author, dateStr, state, context) {
|
|
76
|
+
// Get the source run element from the deleted atom
|
|
77
|
+
const sourceRun = deletedAtom.sourceRunElement;
|
|
78
|
+
if (!sourceRun) {
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
const runs = getAtomRuns(deletedAtom);
|
|
82
|
+
// ECMA-376 Part 4 fragmentation (issue #217): for a collapsed-field atom,
|
|
83
|
+
// emit w:fldChar runs at sibling level (unwrapped) and wrap only the
|
|
84
|
+
// payload runs (w:instrText, w:t, etc.) in <w:del>. w:fldChar inside
|
|
85
|
+
// <w:del> is non-conformant and Word treats it as fatal. Iterates the
|
|
86
|
+
// constituent collapsedFieldAtoms (not the deduped source runs) so a
|
|
87
|
+
// mixed-run field — where multiple field elements share one source `<w:r>` —
|
|
88
|
+
// is correctly split into one cloned run per field element.
|
|
89
|
+
if (isCollapsedFieldAtom(deletedAtom)) {
|
|
90
|
+
return insertFragmentedDeletedField(deletedAtom, sourceRun, insertAfterRun, targetParagraph, author, dateStr, state, context);
|
|
91
|
+
}
|
|
92
|
+
// Avoid an unused variable when the collapsed-field branch above is not taken.
|
|
93
|
+
void runs;
|
|
94
|
+
// Single-run path: wrap the cloned run in one <w:del>.
|
|
95
|
+
const id = allocateRevisionId(state);
|
|
96
|
+
const del = createEl('w:del', {
|
|
97
|
+
'w:id': String(id),
|
|
98
|
+
'w:author': author,
|
|
99
|
+
'w:date': dateStr,
|
|
100
|
+
});
|
|
101
|
+
const clonedRun = cloneRunWithAtomContent(sourceRun, deletedAtom);
|
|
102
|
+
convertToDelText(clonedRun);
|
|
103
|
+
del.appendChild(clonedRun);
|
|
104
|
+
// Insert at correct position
|
|
105
|
+
if (insertAfterRun) {
|
|
106
|
+
insertAfterElement(insertAfterRun, del);
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
// Insert at the beginning of the paragraph (after pPr if present)
|
|
110
|
+
const pPr = findChildByTagName(targetParagraph, 'w:pPr');
|
|
111
|
+
if (pPr) {
|
|
112
|
+
insertAfterElement(pPr, del);
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
targetParagraph.insertBefore(del, targetParagraph.firstChild);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
const sourceMarkers = cloneUnemittedSourceBookmarkMarkers(sourceRun, targetParagraph, state, context);
|
|
119
|
+
if (sourceMarkers.length > 0)
|
|
120
|
+
insertMarkersBeforeWrapper(del, sourceMarkers);
|
|
121
|
+
return del;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Emit a fragmented deletion of a collapsed-field atom: walks the constituent
|
|
125
|
+
* source runs in document order, cloning each into the target paragraph as
|
|
126
|
+
* either a sibling-level unwrapped run (for `w:fldChar`) or a `<w:del>`-wrapped
|
|
127
|
+
* run (for payload runs whose text is renamed to `w:delText` / `w:delInstrText`).
|
|
128
|
+
*
|
|
129
|
+
* Returns the last sibling element inserted, which the caller uses as the
|
|
130
|
+
* next insertion anchor (preserving the contract of `insertDeletedRun`).
|
|
131
|
+
*
|
|
132
|
+
* @conformance ECMA-376 edition 5, Part 4 § 17.16.5
|
|
133
|
+
*
|
|
134
|
+
* Rule: `w:delInstrText` MUST appear inside `<w:del>`;
|
|
135
|
+
* by extension and by issue #217's deep-research conclusion, `w:fldChar` runs
|
|
136
|
+
* stay at sibling level.
|
|
137
|
+
*/
|
|
138
|
+
export function insertFragmentedDeletedField(deletedAtom, sourceRun, insertAfterRun, targetParagraph, author, dateStr, state, context) {
|
|
139
|
+
const fieldAtoms = deletedAtom.collapsedFieldAtoms;
|
|
140
|
+
if (!fieldAtoms || fieldAtoms.length === 0)
|
|
141
|
+
return null;
|
|
142
|
+
let anchor = insertAfterRun;
|
|
143
|
+
let firstInserted = null;
|
|
144
|
+
let lastInserted = null;
|
|
145
|
+
const pPr = findChildByTagName(targetParagraph, 'w:pPr');
|
|
146
|
+
const place = (el) => {
|
|
147
|
+
if (anchor) {
|
|
148
|
+
insertAfterElement(anchor, el);
|
|
149
|
+
}
|
|
150
|
+
else if (pPr) {
|
|
151
|
+
insertAfterElement(pPr, el);
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
targetParagraph.insertBefore(el, targetParagraph.firstChild);
|
|
155
|
+
}
|
|
156
|
+
if (firstInserted === null)
|
|
157
|
+
firstInserted = el;
|
|
158
|
+
lastInserted = el;
|
|
159
|
+
anchor = el;
|
|
160
|
+
};
|
|
161
|
+
for (const fieldAtom of fieldAtoms) {
|
|
162
|
+
// Each constituent field atom produces its own cloned run carrying exactly
|
|
163
|
+
// one content element (fldChar / instrText / t). This is critical for
|
|
164
|
+
// mixed-run fields where multiple field elements share a single `<w:r>` in
|
|
165
|
+
// the source — we MUST emit them as separate runs so we can fragment
|
|
166
|
+
// fldChars out of the `<w:del>` wrapper.
|
|
167
|
+
const baseRun = fieldAtom.sourceRunElement ?? findAncestorByTag(fieldAtom, 'w:r') ?? sourceRun;
|
|
168
|
+
if (!baseRun)
|
|
169
|
+
continue;
|
|
170
|
+
const clonedRun = cloneRunWithAtomContent(baseRun, fieldAtom);
|
|
171
|
+
const contentTag = fieldAtom.contentElement.tagName;
|
|
172
|
+
if (contentTag === 'w:fldChar') {
|
|
173
|
+
// Sibling level — unwrapped.
|
|
174
|
+
place(clonedRun);
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
177
|
+
// Payload — wrap in <w:del> and rename w:t→w:delText / w:instrText→w:delInstrText.
|
|
178
|
+
convertToDelText(clonedRun);
|
|
179
|
+
const id = allocateRevisionId(state);
|
|
180
|
+
const del = createEl('w:del', {
|
|
181
|
+
'w:id': String(id),
|
|
182
|
+
'w:author': author,
|
|
183
|
+
'w:date': dateStr,
|
|
184
|
+
});
|
|
185
|
+
del.appendChild(clonedRun);
|
|
186
|
+
place(del);
|
|
187
|
+
}
|
|
188
|
+
if (firstInserted) {
|
|
189
|
+
const sourceMarkers = cloneUnemittedSourceBookmarkMarkers(sourceRun, targetParagraph, state, context);
|
|
190
|
+
if (sourceMarkers.length > 0)
|
|
191
|
+
insertMarkersBeforeWrapper(firstInserted, sourceMarkers);
|
|
192
|
+
}
|
|
193
|
+
return lastInserted;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Clone a moved-from run from the original document and insert it into the revised document.
|
|
197
|
+
*
|
|
198
|
+
* MovedSource atoms have their sourceRunElement in the ORIGINAL tree, but we need to
|
|
199
|
+
* insert the content into the REVISED tree. This function clones the run, wraps it with
|
|
200
|
+
* <w:moveFrom> and range markers, and inserts at the correct position.
|
|
201
|
+
*
|
|
202
|
+
* @param atom - Atom with the moved-from content
|
|
203
|
+
* @param moveName - Name for linking source and destination
|
|
204
|
+
* @param insertAfterRun - The run to insert after (null to insert at beginning of paragraph)
|
|
205
|
+
* @param targetParagraph - The paragraph to insert into
|
|
206
|
+
* @param author - Author name
|
|
207
|
+
* @param dateStr - Formatted date
|
|
208
|
+
* @param state - Revision ID state
|
|
209
|
+
* @returns The inserted moveFrom element, or null if insertion failed
|
|
210
|
+
*/
|
|
211
|
+
export function insertMoveFromRun(atom, moveName, insertAfterRun, targetParagraph, author, dateStr, state, context) {
|
|
212
|
+
// Get the source run element from the atom (in original tree)
|
|
213
|
+
const sourceRun = atom.sourceRunElement;
|
|
214
|
+
if (!sourceRun) {
|
|
215
|
+
return null;
|
|
216
|
+
}
|
|
217
|
+
// For collapsed field atoms, replay one cloned run per original source run.
|
|
218
|
+
const runs = getAtomRuns(atom);
|
|
219
|
+
const clonedRuns = [];
|
|
220
|
+
if (runs.length > 1) {
|
|
221
|
+
for (const run of runs) {
|
|
222
|
+
const clonedRun = cloneRunWithAtomContent(run, atom, run);
|
|
223
|
+
convertToDelText(clonedRun);
|
|
224
|
+
clonedRuns.push(clonedRun);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
const clonedRun = cloneRunWithAtomContent(sourceRun, atom);
|
|
229
|
+
convertToDelText(clonedRun);
|
|
230
|
+
clonedRuns.push(clonedRun);
|
|
231
|
+
}
|
|
232
|
+
// Get or allocate move range IDs
|
|
233
|
+
const ids = getMoveRangeIds(state, moveName);
|
|
234
|
+
const moveId = allocateRevisionId(state);
|
|
235
|
+
// Create range start marker
|
|
236
|
+
const rangeStart = createEl('w:moveFromRangeStart', {
|
|
237
|
+
'w:id': String(ids.sourceRangeId),
|
|
238
|
+
'w:name': moveName,
|
|
239
|
+
'w:author': author,
|
|
240
|
+
'w:date': dateStr,
|
|
241
|
+
});
|
|
242
|
+
// Create moveFrom wrapper
|
|
243
|
+
const moveFrom = createEl('w:moveFrom', {
|
|
244
|
+
'w:id': String(moveId),
|
|
245
|
+
'w:author': author,
|
|
246
|
+
'w:date': dateStr,
|
|
247
|
+
});
|
|
248
|
+
// Create range end marker
|
|
249
|
+
const rangeEnd = createEl('w:moveFromRangeEnd', {
|
|
250
|
+
'w:id': String(ids.sourceRangeId),
|
|
251
|
+
});
|
|
252
|
+
// Add cloned run(s) as children of moveFrom
|
|
253
|
+
for (const clonedRun of clonedRuns) {
|
|
254
|
+
moveFrom.appendChild(clonedRun);
|
|
255
|
+
}
|
|
256
|
+
// Insert at correct position: rangeStart -> moveFrom(run) -> rangeEnd
|
|
257
|
+
if (insertAfterRun) {
|
|
258
|
+
insertAfterElement(insertAfterRun, rangeStart);
|
|
259
|
+
insertAfterElement(rangeStart, moveFrom);
|
|
260
|
+
insertAfterElement(moveFrom, rangeEnd);
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
// Insert at the beginning of the paragraph (after pPr if present)
|
|
264
|
+
const pPr = findChildByTagName(targetParagraph, 'w:pPr');
|
|
265
|
+
if (pPr) {
|
|
266
|
+
insertAfterElement(pPr, rangeStart);
|
|
267
|
+
insertAfterElement(rangeStart, moveFrom);
|
|
268
|
+
insertAfterElement(moveFrom, rangeEnd);
|
|
269
|
+
}
|
|
270
|
+
else {
|
|
271
|
+
targetParagraph.insertBefore(rangeEnd, targetParagraph.firstChild);
|
|
272
|
+
targetParagraph.insertBefore(moveFrom, rangeEnd);
|
|
273
|
+
targetParagraph.insertBefore(rangeStart, moveFrom);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
const sourceMarkers = cloneUnemittedSourceBookmarkMarkers(sourceRun, targetParagraph, state, context);
|
|
277
|
+
if (sourceMarkers.length > 0)
|
|
278
|
+
insertMarkersBeforeWrapper(moveFrom, sourceMarkers);
|
|
279
|
+
return moveFrom;
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Clone a deleted paragraph from the original document and insert it.
|
|
283
|
+
*
|
|
284
|
+
* @param deletedAtom - Atom representing the deleted paragraph
|
|
285
|
+
* @param insertAfterParagraph - Paragraph to insert after (null to insert at body start)
|
|
286
|
+
* @param targetBody - The body element to insert into
|
|
287
|
+
* @param author - Author name
|
|
288
|
+
* @param dateStr - Formatted date
|
|
289
|
+
* @param state - Revision ID state
|
|
290
|
+
* @returns The inserted paragraph, or null if insertion failed
|
|
291
|
+
*/
|
|
292
|
+
export function insertDeletedParagraph(deletedAtom, insertAfterParagraph, targetContainer, author, dateStr, state) {
|
|
293
|
+
// Get the source paragraph from the deleted atom
|
|
294
|
+
const sourceParagraph = deletedAtom.sourceParagraphElement;
|
|
295
|
+
if (!sourceParagraph) {
|
|
296
|
+
return null;
|
|
297
|
+
}
|
|
298
|
+
// Clone the paragraph
|
|
299
|
+
const clonedParagraph = sourceParagraph.cloneNode(true);
|
|
300
|
+
// Wrap runs with w:del (wrapAsDeleted handles w:t -> w:delText conversion internally)
|
|
301
|
+
const runs = Array.from(clonedParagraph.getElementsByTagName('w:r'));
|
|
302
|
+
for (const run of runs) {
|
|
303
|
+
wrapAsDeleted(run, author, dateStr, state);
|
|
304
|
+
}
|
|
305
|
+
// Insert at correct position, preserving w:tcPr as first child when target is a table cell
|
|
306
|
+
if (insertAfterParagraph) {
|
|
307
|
+
insertAfterElement(insertAfterParagraph, clonedParagraph);
|
|
308
|
+
}
|
|
309
|
+
else {
|
|
310
|
+
const tcPr = targetContainer.tagName === 'w:tc'
|
|
311
|
+
? findChildByTagName(targetContainer, 'w:tcPr')
|
|
312
|
+
: null;
|
|
313
|
+
if (tcPr) {
|
|
314
|
+
insertAfterElement(tcPr, clonedParagraph);
|
|
315
|
+
}
|
|
316
|
+
else {
|
|
317
|
+
targetContainer.insertBefore(clonedParagraph, targetContainer.firstChild);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
return clonedParagraph;
|
|
321
|
+
}
|
|
322
|
+
// Field-character tag names that should not be split.
|
|
323
|
+
export const FIELD_CHAR_TAG_NAMES = new Set([
|
|
324
|
+
'w:fldChar', 'w:instrText', 'w:delInstrText',
|
|
325
|
+
]);
|
|
326
|
+
//# sourceMappingURL=inPlaceModifier-deletion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inPlaceModifier-deletion.js","sourceRoot":"","sources":["../../../src/baselines/atomizer/inPlaceModifier-deletion.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
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 { CorrelationStatus, type ComparisonUnitAtom } from '../../core-types.js';
|
|
8
|
+
export declare const DELETION_LIKE_STATUSES: ReadonlySet<CorrelationStatus>;
|
|
9
|
+
export declare const INSERTION_LIKE_STATUSES: ReadonlySet<CorrelationStatus>;
|
|
10
|
+
/**
|
|
11
|
+
* Reorder merged atoms so that within each contiguous block of non-equal atoms,
|
|
12
|
+
* all deletion-like atoms come before all insertion-like atoms.
|
|
13
|
+
*
|
|
14
|
+
* This produces grouped tracked changes ("<del>old words</del><ins>new words</ins>")
|
|
15
|
+
* instead of alternating word-by-word pairs ("<del>old1</del><ins>new1</ins><del>old2</del>...").
|
|
16
|
+
*/
|
|
17
|
+
export declare function groupDeletionsBeforeInsertions(atoms: ComparisonUnitAtom[]): ComparisonUnitAtom[];
|
|
18
|
+
export declare function mergeAdjacentTrackChangeSiblings(root: Element): void;
|
|
19
|
+
/**
|
|
20
|
+
* Build a normalized content signature for a run's non-rPr children.
|
|
21
|
+
* On the del side, maps w:delText → w:t and w:delInstrText → w:instrText
|
|
22
|
+
* so that content from del wrappers can be compared to ins wrappers.
|
|
23
|
+
*/
|
|
24
|
+
export declare function normalizeRunContentSignature(run: Element, isDelSide: boolean): string;
|
|
25
|
+
/**
|
|
26
|
+
* Check if an adjacent w:del + w:ins pair is a no-op (identical text and formatting).
|
|
27
|
+
* Both wrappers must contain the same number of runs with matching rPr and content.
|
|
28
|
+
*/
|
|
29
|
+
export declare function isNoOpPair(del: Element, ins: Element): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Suppress no-op del/ins pairs — adjacent w:del + w:ins wrappers where the
|
|
32
|
+
* content and formatting are identical. These arise from field-adjacent atoms
|
|
33
|
+
* that are false-positive changes.
|
|
34
|
+
*
|
|
35
|
+
* When a no-op is detected, both wrappers are unwrapped, leaving the ins-side
|
|
36
|
+
* runs as plain (non-tracked) children. The del-side runs are removed.
|
|
37
|
+
*/
|
|
38
|
+
export declare function suppressNoOpChangePairs(root: Element): void;
|
|
39
|
+
/**
|
|
40
|
+
* Narrow whitespace predicate for bridging: returns true only if a w:r element's
|
|
41
|
+
* visible children are exclusively w:t elements with whitespace-only text content.
|
|
42
|
+
* Excludes w:tab, w:br, w:cr which have layout significance.
|
|
43
|
+
*/
|
|
44
|
+
export declare function isInlineWhitespaceOnlyRun(run: Element): boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Merge track-change wrappers (w:del or w:ins) that are separated by a
|
|
47
|
+
* whitespace-only run. This groups "word-by-word" tracked changes into
|
|
48
|
+
* contiguous blocks for cleaner presentation.
|
|
49
|
+
*
|
|
50
|
+
* For w:del: clones the whitespace run, converts w:t→w:delText, and absorbs
|
|
51
|
+
* both the whitespace and the second wrapper's children into the first wrapper.
|
|
52
|
+
*
|
|
53
|
+
* For w:ins: moves the whitespace run into the first wrapper, then absorbs
|
|
54
|
+
* the second wrapper's children.
|
|
55
|
+
*
|
|
56
|
+
* Both projections (Accept All, Reject All) remain correct because each
|
|
57
|
+
* wrapper independently contains the whitespace it needs.
|
|
58
|
+
*/
|
|
59
|
+
export declare function mergeWhitespaceBridgedTrackChanges(root: Element): void;
|
|
60
|
+
/**
|
|
61
|
+
* Convert w:t → w:delText and w:instrText → w:delInstrText within a run,
|
|
62
|
+
* preserving xml:space attributes. Used for cloning whitespace runs into
|
|
63
|
+
* w:del wrappers during pair-chain coalescing.
|
|
64
|
+
*/
|
|
65
|
+
export declare function convertRunTextToDelText(run: Element): void;
|
|
66
|
+
/**
|
|
67
|
+
* Coalesce alternating del/ins pair chains separated by whitespace-only runs
|
|
68
|
+
* into single grouped del + ins wrappers.
|
|
69
|
+
*
|
|
70
|
+
* Pattern: [w:del, w:ins, ws-segment..., w:del, w:ins, ws-segment..., w:del, w:ins]
|
|
71
|
+
*
|
|
72
|
+
* For each whitespace segment between consecutive [del, ins] pairs:
|
|
73
|
+
* 1. Clone each ws-run → convert to delText → append to first del
|
|
74
|
+
* 2. Clone each ws-run → keep as w:t → append to first ins
|
|
75
|
+
* 3. Move nextDel's children into first del
|
|
76
|
+
* 4. Move nextIns's children into first ins
|
|
77
|
+
* 5. Remove original ws-runs, empty nextDel, empty nextIns from parent
|
|
78
|
+
*
|
|
79
|
+
* Safety invariants:
|
|
80
|
+
* - Only bridges when both del AND ins absorb the whitespace (both projections correct)
|
|
81
|
+
* - Incomplete tail [del, ins, ws, del] (no trailing ins) → stop chain, don't bridge
|
|
82
|
+
* - All wrappers in chain must share same w:author and w:date
|
|
83
|
+
*/
|
|
84
|
+
export declare function coalesceDelInsPairChains(root: Element): void;
|
|
85
|
+
//# sourceMappingURL=inPlaceModifier-postprocess.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inPlaceModifier-postprocess.d.ts","sourceRoot":"","sources":["../../../src/baselines/atomizer/inPlaceModifier-postprocess.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,iBAAiB,EAAE,KAAK,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAMjF,eAAO,MAAM,sBAAsB,EAAE,WAAW,CAAC,iBAAiB,CAGhE,CAAC;AAEH,eAAO,MAAM,uBAAuB,EAAE,WAAW,CAAC,iBAAiB,CAGjE,CAAC;AAEH;;;;;;GAMG;AACH,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,kBAAkB,EAAE,GAAG,kBAAkB,EAAE,CAmChG;AAGD,wBAAgB,gCAAgC,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAkCpE;AAMD;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,GAAG,MAAM,CAkBrF;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAuB9D;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CA6B3D;AAMD;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAuB/D;AAGD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kCAAkC,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAyCtE;AAMD;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAkB1D;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CA2G5D"}
|