@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,395 @@
|
|
|
1
|
+
// DOCX → HTML serializer (semantic tier, mammoth.js-style).
|
|
2
|
+
//
|
|
3
|
+
// Like `serialize_markdown.ts`, this is a *serializer over the existing structured document
|
|
4
|
+
// model* — it does no OOXML parsing. `DocxDocument.buildDocumentView({ showFormatting: true })`
|
|
5
|
+
// already yields a `DocumentViewNode[]` carrying headings, list metadata, grid-aware table
|
|
6
|
+
// context, injected `[^n]` footnote markers, and an HTML-shaped inline-tag string
|
|
7
|
+
// (`tagged_text`). This module turns that model into semantic HTML.
|
|
8
|
+
//
|
|
9
|
+
// It renders the *same* inline tokens as the Markdown emitter via the shared
|
|
10
|
+
// `tokenizeToonInline` core, so the two serializers never re-derive the tag grammar and drift
|
|
11
|
+
// from the emitter in `formatting_tags.ts`. Where Markdown is lossy, HTML is richer: highlight
|
|
12
|
+
// becomes `<mark>`, font runs become a styled `<span>`, and lists nest as real `<ul>/<ol>`.
|
|
13
|
+
//
|
|
14
|
+
// This is the *semantic* tier, not pixel-faithful HTML+CSS: exact layout is not reproduced.
|
|
15
|
+
import { tokenizeToonInline } from './document_view.js';
|
|
16
|
+
import { escapeHtmlAttribute } from './formatting_tags.js';
|
|
17
|
+
/** Footnote markers already injected into `tagged_text`, e.g. `[^1]`, `[^12]`. */
|
|
18
|
+
const FOOTNOTE_MARKER_RE = /\[\^(\d+)\]/g;
|
|
19
|
+
/** Escape the characters that are significant in HTML *text* content. */
|
|
20
|
+
function escapeHtmlText(text) {
|
|
21
|
+
return text.replaceAll('&', '&').replaceAll('<', '<').replaceAll('>', '>');
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Escape literal text and turn any injected `[^n]` footnote marker into a trusted superscript
|
|
25
|
+
* anchor. Order matters: the literal spans are escaped, but the generated `<sup>` is emitted
|
|
26
|
+
* verbatim (escaping it would render the markup literally).
|
|
27
|
+
*
|
|
28
|
+
* When a `refs` registry is supplied, the first marker for footnote N keeps `id="fnref-N"` (the
|
|
29
|
+
* definition's back-link target); later repeats get a unique `id="fnref-N-k"` so the document
|
|
30
|
+
* never carries duplicate ids.
|
|
31
|
+
*/
|
|
32
|
+
function renderTextWithFootnotes(raw, refs) {
|
|
33
|
+
let out = '';
|
|
34
|
+
let last = 0;
|
|
35
|
+
for (const match of raw.matchAll(FOOTNOTE_MARKER_RE)) {
|
|
36
|
+
const idx = match.index ?? 0;
|
|
37
|
+
out += escapeHtmlText(raw.slice(last, idx));
|
|
38
|
+
const n = match[1];
|
|
39
|
+
let id = `fnref-${n}`;
|
|
40
|
+
if (refs) {
|
|
41
|
+
const k = (refs.get(Number(n)) ?? 0) + 1;
|
|
42
|
+
refs.set(Number(n), k);
|
|
43
|
+
if (k > 1)
|
|
44
|
+
id = `fnref-${n}-${k}`;
|
|
45
|
+
}
|
|
46
|
+
out += `<sup id="${id}"><a href="#fn-${n}">${n}</a></sup>`;
|
|
47
|
+
last = idx + match[0].length;
|
|
48
|
+
}
|
|
49
|
+
out += escapeHtmlText(raw.slice(last));
|
|
50
|
+
return out;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Allow only schemes that are safe to follow from a rendered document. The href arrives already
|
|
54
|
+
* attribute-escaped from `formatting_tags.ts`; a `javascript:`/`data:`/`vbscript:` URL would
|
|
55
|
+
* otherwise pass through and execute on click. Relative URLs and fragments (no scheme) are kept.
|
|
56
|
+
*/
|
|
57
|
+
const SAFE_URL_SCHEMES = new Set(['http', 'https', 'mailto', 'tel']);
|
|
58
|
+
export function isSafeHref(href) {
|
|
59
|
+
// Strip whitespace/control chars browsers ignore (e.g. `java\tscript:`) before scheme-matching.
|
|
60
|
+
const v = href.replace(/[\u0000-\u0020]/g, '').toLowerCase();
|
|
61
|
+
const scheme = /^([a-z][a-z0-9+.-]*):/.exec(v);
|
|
62
|
+
return scheme ? SAFE_URL_SCHEMES.has(scheme[1]) : true;
|
|
63
|
+
}
|
|
64
|
+
// ── Font (`<font ...>`) → sanitized inline style ─────────────────────────────
|
|
65
|
+
// The values come from `formatting_tags.ts`: color is a raw hex string (no `#`), size is in
|
|
66
|
+
// *points* (display units), face is a font name. Every value is sanitized so a hostile font
|
|
67
|
+
// name cannot break out of the `style` attribute.
|
|
68
|
+
function sanitizeColor(raw) {
|
|
69
|
+
if (!raw)
|
|
70
|
+
return null;
|
|
71
|
+
const hex = raw.replace(/^#/, '');
|
|
72
|
+
return /^[0-9A-Fa-f]{3,8}$/.test(hex) ? `#${hex}` : null;
|
|
73
|
+
}
|
|
74
|
+
function sanitizeFontSize(raw) {
|
|
75
|
+
if (!raw)
|
|
76
|
+
return null;
|
|
77
|
+
const n = Number(raw);
|
|
78
|
+
return Number.isFinite(n) && n > 0 ? `${n}pt` : null;
|
|
79
|
+
}
|
|
80
|
+
function sanitizeFontFamily(raw) {
|
|
81
|
+
if (!raw)
|
|
82
|
+
return null;
|
|
83
|
+
// Strip anything that could terminate the value or the attribute; keep ordinary name chars.
|
|
84
|
+
const clean = raw.replace(/[<>"';{}()]/g, '').trim();
|
|
85
|
+
return clean ? `'${clean}'` : null;
|
|
86
|
+
}
|
|
87
|
+
function fontTagToSpan(tag) {
|
|
88
|
+
const color = sanitizeColor(/color="([^"]*)"/.exec(tag)?.[1]);
|
|
89
|
+
const size = sanitizeFontSize(/size="([^"]*)"/.exec(tag)?.[1]);
|
|
90
|
+
const face = sanitizeFontFamily(/face="([^"]*)"/.exec(tag)?.[1]);
|
|
91
|
+
const decls = [];
|
|
92
|
+
if (color)
|
|
93
|
+
decls.push(`color:${color}`);
|
|
94
|
+
if (size)
|
|
95
|
+
decls.push(`font-size:${size}`);
|
|
96
|
+
if (face)
|
|
97
|
+
decls.push(`font-family:${face}`);
|
|
98
|
+
// A `<font>` with no usable attribute degrades to a bare span (still balances `</font>`).
|
|
99
|
+
if (decls.length === 0)
|
|
100
|
+
return '<span>';
|
|
101
|
+
return `<span style="${escapeHtmlAttribute(decls.join(';'))}">`;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Convert one TOON inline-tag string (a `DocumentViewNode.tagged_text` value) to inline HTML.
|
|
105
|
+
* This is the HTML parallel of `inlineTagsToMarkdown` and the reusable core of the serializer.
|
|
106
|
+
*
|
|
107
|
+
* Tag mapping:
|
|
108
|
+
* - `<b>`/`<i>`/`<u>`/`<a href="...">` → passed through verbatim (already valid, attribute-escaped HTML)
|
|
109
|
+
* - `<highlight>` → `<mark>`
|
|
110
|
+
* - `<font color=… size=… face=…>` → `<span style="…">` (values sanitized)
|
|
111
|
+
*
|
|
112
|
+
* Literal text spans are HTML-escaped; injected `[^n]` footnote markers become `<sup>` anchors.
|
|
113
|
+
*/
|
|
114
|
+
export function inlineTagsToHtml(text, refs) {
|
|
115
|
+
let out = '';
|
|
116
|
+
for (const token of tokenizeToonInline(text)) {
|
|
117
|
+
if (token.kind === 'text') {
|
|
118
|
+
out += renderTextWithFootnotes(token.value, refs);
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
const tag = token.value;
|
|
122
|
+
// The serializer renders compact-mode views, but tolerate the full-mode attributed form
|
|
123
|
+
// (<highlight color="...">) so a full-mode tagged_text can't leak raw markup into HTML.
|
|
124
|
+
if (tag === '<highlight>' || tag.startsWith('<highlight '))
|
|
125
|
+
out += '<mark>';
|
|
126
|
+
else if (tag === '</highlight>')
|
|
127
|
+
out += '</mark>';
|
|
128
|
+
else if (tag.startsWith('<font '))
|
|
129
|
+
out += fontTagToSpan(tag);
|
|
130
|
+
else if (tag === '</font>')
|
|
131
|
+
out += '</span>';
|
|
132
|
+
else if (tag.startsWith('<a ')) {
|
|
133
|
+
// Drop the href for unsafe schemes (e.g. `javascript:`); keep the anchor so `</a>` still
|
|
134
|
+
// balances and the link text survives as plain text.
|
|
135
|
+
const href = /href="([^"]*)"/.exec(tag)?.[1] ?? '';
|
|
136
|
+
out += isSafeHref(href) ? tag : '<a>';
|
|
137
|
+
}
|
|
138
|
+
// <b>/<i>/<u> and `</a>` and the closers are already valid HTML — pass through.
|
|
139
|
+
else
|
|
140
|
+
out += tag;
|
|
141
|
+
}
|
|
142
|
+
return out;
|
|
143
|
+
}
|
|
144
|
+
/** A heading is structural (gets `<hN>`) only when Word's style told us so and gave a level. */
|
|
145
|
+
function isStructuralHeading(node) {
|
|
146
|
+
return node.heading?.source === 'word_style' && typeof node.heading.level === 'number';
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Render a run of nodes that share a `table_context.table_id` as an HTML `<table>`.
|
|
150
|
+
*
|
|
151
|
+
* Lossy by design (the view model discards `gridSpan`/`vMerge` span width):
|
|
152
|
+
* - Horizontally merged cells (`gridSpan`) advance `col_index`, leaving grid gaps that we fill
|
|
153
|
+
* with empty cells so every row has the full column count.
|
|
154
|
+
* - Vertically merged cells and nested tables flatten into the body-level grid; multi-paragraph
|
|
155
|
+
* cells join with `<br/>`.
|
|
156
|
+
*/
|
|
157
|
+
function renderTable(group, refs) {
|
|
158
|
+
let totalCols = 0;
|
|
159
|
+
for (const n of group) {
|
|
160
|
+
const tc = n.table_context;
|
|
161
|
+
if (!tc)
|
|
162
|
+
continue;
|
|
163
|
+
totalCols = Math.max(totalCols, tc.total_cols, tc.col_index + 1);
|
|
164
|
+
}
|
|
165
|
+
if (totalCols <= 0)
|
|
166
|
+
return '';
|
|
167
|
+
const rows = new Map();
|
|
168
|
+
const rowOrder = [];
|
|
169
|
+
const headerRows = new Set();
|
|
170
|
+
for (const n of group) {
|
|
171
|
+
const tc = n.table_context;
|
|
172
|
+
if (!tc)
|
|
173
|
+
continue;
|
|
174
|
+
if (!rows.has(tc.row_index)) {
|
|
175
|
+
rows.set(tc.row_index, new Map());
|
|
176
|
+
rowOrder.push(tc.row_index);
|
|
177
|
+
}
|
|
178
|
+
const cellMap = rows.get(tc.row_index);
|
|
179
|
+
const cellHtml = inlineTagsToHtml(n.tagged_text, refs).replace(/\s*\n+\s*/g, '<br/>').trim();
|
|
180
|
+
const parts = cellMap.get(tc.col_index) ?? [];
|
|
181
|
+
if (cellHtml)
|
|
182
|
+
parts.push(cellHtml);
|
|
183
|
+
cellMap.set(tc.col_index, parts);
|
|
184
|
+
if (tc.is_header_row)
|
|
185
|
+
headerRows.add(tc.row_index);
|
|
186
|
+
}
|
|
187
|
+
rowOrder.sort((a, b) => a - b);
|
|
188
|
+
if (rowOrder.length === 0)
|
|
189
|
+
return '';
|
|
190
|
+
const cellsFor = (rowIndex) => {
|
|
191
|
+
const cellMap = rows.get(rowIndex) ?? new Map();
|
|
192
|
+
const cells = [];
|
|
193
|
+
for (let c = 0; c < totalCols; c++)
|
|
194
|
+
cells.push((cellMap.get(c) ?? []).join('<br/>'));
|
|
195
|
+
return cells;
|
|
196
|
+
};
|
|
197
|
+
// Prefer the first row Word flagged as a header; otherwise treat the first row as the header.
|
|
198
|
+
const headerRowIndex = rowOrder.find((ri) => headerRows.has(ri)) ?? rowOrder[0];
|
|
199
|
+
const lines = ['<table>'];
|
|
200
|
+
lines.push('<thead>');
|
|
201
|
+
lines.push(`<tr>${cellsFor(headerRowIndex).map((c) => `<th>${c}</th>`).join('')}</tr>`);
|
|
202
|
+
lines.push('</thead>');
|
|
203
|
+
lines.push('<tbody>');
|
|
204
|
+
for (const ri of rowOrder) {
|
|
205
|
+
if (ri === headerRowIndex)
|
|
206
|
+
continue;
|
|
207
|
+
lines.push(`<tr>${cellsFor(ri).map((c) => `<td>${c}</td>`).join('')}</tr>`);
|
|
208
|
+
}
|
|
209
|
+
lines.push('</tbody>');
|
|
210
|
+
lines.push('</table>');
|
|
211
|
+
return lines.join('\n');
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Stateful nested-list builder. Auto list levels come straight from OOXML `ilvl` with no
|
|
215
|
+
* monotonicity guarantee, so the open/close logic must be robust to level jumps, interruptions,
|
|
216
|
+
* and same-level kind changes — a naive open-on-increase/close-on-decrease stack would emit
|
|
217
|
+
* malformed HTML.
|
|
218
|
+
*/
|
|
219
|
+
class ListBuilder {
|
|
220
|
+
// Each open list records its tag AND the item `level` that opened it. Storing the level (not
|
|
221
|
+
// just depth) is what keeps consecutive same-level items siblings even after a level jump that
|
|
222
|
+
// skipped intermediate depths — depth alone would drift deeper on every repeated jumped level.
|
|
223
|
+
stack = [];
|
|
224
|
+
out = [];
|
|
225
|
+
/** Append one list item at the given 0-based level with the given list tag. */
|
|
226
|
+
item(level, tag, content) {
|
|
227
|
+
const lvl = Math.max(0, level);
|
|
228
|
+
// Close any lists deeper than this item's level.
|
|
229
|
+
while (this.stack.length > 0 && this.stack[this.stack.length - 1].level > lvl) {
|
|
230
|
+
this.out.push('</li>');
|
|
231
|
+
this.out.push(`</${this.stack.pop().tag}>`);
|
|
232
|
+
}
|
|
233
|
+
const top = this.stack[this.stack.length - 1];
|
|
234
|
+
if (top && top.level === lvl) {
|
|
235
|
+
// Sibling at the same list level: close the previous item; swap list kind if it changed.
|
|
236
|
+
this.out.push('</li>');
|
|
237
|
+
if (top.tag !== tag) {
|
|
238
|
+
this.out.push(`</${this.stack.pop().tag}>`);
|
|
239
|
+
this.out.push(`<${tag}>`);
|
|
240
|
+
this.stack.push({ tag, level: lvl });
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
else {
|
|
244
|
+
// Deeper than the current top (or the first item): open one nested list inside the open
|
|
245
|
+
// <li>. We record the item's actual level, so a jump of >1 opens a single step and a later
|
|
246
|
+
// same-level item lands here as a sibling rather than nesting further.
|
|
247
|
+
this.out.push(`<${tag}>`);
|
|
248
|
+
this.stack.push({ tag, level: lvl });
|
|
249
|
+
}
|
|
250
|
+
this.out.push(`<li>${content}`);
|
|
251
|
+
}
|
|
252
|
+
/** True when at least one list is currently open. */
|
|
253
|
+
get isOpen() {
|
|
254
|
+
return this.stack.length > 0;
|
|
255
|
+
}
|
|
256
|
+
/** Close every open list and return the accumulated HTML. */
|
|
257
|
+
flush() {
|
|
258
|
+
while (this.stack.length > 0) {
|
|
259
|
+
this.out.push('</li>');
|
|
260
|
+
this.out.push(`</${this.stack.pop().tag}>`);
|
|
261
|
+
}
|
|
262
|
+
const html = this.out.join('\n');
|
|
263
|
+
this.out = [];
|
|
264
|
+
return html;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
function renderListContent(node, refs) {
|
|
268
|
+
const lm = node.list_metadata;
|
|
269
|
+
const html = inlineTagsToHtml(node.tagged_text, refs).trim();
|
|
270
|
+
// Auto-numbered lists become <ol> (the renderer numbers them). Manual/legal labels keep their
|
|
271
|
+
// literal text (`Section 2.1`, `(a)`) prefixed inside a <ul> item — a bare number would
|
|
272
|
+
// silently destroy meaningful legal labels. `is_auto_numbered` is the reliable signal:
|
|
273
|
+
// an auto `1.` can classify as NUMBERED_HEADING, so label_type alone is not enough.
|
|
274
|
+
if (lm.is_auto_numbered)
|
|
275
|
+
return { tag: 'ol', content: html };
|
|
276
|
+
const label = lm.label_string?.trim() ?? '';
|
|
277
|
+
return { tag: 'ul', content: label ? `${escapeHtmlText(label)} ${html}` : html };
|
|
278
|
+
}
|
|
279
|
+
function renderFootnotes(footnotes, refs) {
|
|
280
|
+
const defs = footnotes.filter((fn) => fn.displayNumber > 0);
|
|
281
|
+
if (defs.length === 0)
|
|
282
|
+
return '';
|
|
283
|
+
const items = defs.map((fn) => {
|
|
284
|
+
const body = escapeHtmlText(fn.text.replace(/\s+/g, ' ').trim());
|
|
285
|
+
// Only link back when the marker was actually rendered in the body — otherwise the `#fnref-n`
|
|
286
|
+
// target does not exist (an unreferenced/orphan footnote definition), so omit the back-link.
|
|
287
|
+
const backlink = refs.has(fn.displayNumber) ? ` <a href="#fnref-${fn.displayNumber}">↩</a>` : '';
|
|
288
|
+
return `<li id="fn-${fn.displayNumber}">${body}${backlink}</li>`;
|
|
289
|
+
});
|
|
290
|
+
return ['<section class="footnotes">', '<hr/>', '<ol>', ...items, '</ol>', '</section>'].join('\n');
|
|
291
|
+
}
|
|
292
|
+
const DOCUMENT_STYLE = `
|
|
293
|
+
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; max-width: 50rem; margin: 2rem auto; padding: 0 1rem; line-height: 1.5; color: #1a1a1a; }
|
|
294
|
+
table { border-collapse: collapse; margin: 1rem 0; }
|
|
295
|
+
th, td { border: 1px solid #ccc; padding: 0.3rem 0.6rem; text-align: left; vertical-align: top; }
|
|
296
|
+
th { background: #f5f5f5; }
|
|
297
|
+
mark { background: #fef08a; }
|
|
298
|
+
.footnotes { margin-top: 2rem; font-size: 0.9em; color: #444; }
|
|
299
|
+
.footnotes hr { border: none; border-top: 1px solid #ccc; }
|
|
300
|
+
sup a { text-decoration: none; }
|
|
301
|
+
`.trim();
|
|
302
|
+
/** Strip inline tags from a heading's tagged text to make a plain-text `<title>`. */
|
|
303
|
+
function deriveTitle(nodes) {
|
|
304
|
+
const first = nodes.find(isStructuralHeading);
|
|
305
|
+
if (!first)
|
|
306
|
+
return 'Document';
|
|
307
|
+
const plain = tokenizeToonInline(first.tagged_text)
|
|
308
|
+
.filter((t) => t.kind === 'text')
|
|
309
|
+
.map((t) => t.value)
|
|
310
|
+
.join('')
|
|
311
|
+
.replace(/\[\^\d+\]/g, '')
|
|
312
|
+
.trim();
|
|
313
|
+
return plain || 'Document';
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Serialize a structured document view to semantic HTML.
|
|
317
|
+
*
|
|
318
|
+
* @param nodes Block nodes from `buildDocumentView({ showFormatting: true }).nodes`.
|
|
319
|
+
* @param footnotes Footnotes from `DocxDocument.getFootnotes()` (already sorted by
|
|
320
|
+
* `displayNumber`); rendered as a footnotes `<section>` with back-links.
|
|
321
|
+
*/
|
|
322
|
+
export function serializeToHtml(nodes, footnotes = [], opts = {}) {
|
|
323
|
+
const blocks = [];
|
|
324
|
+
// Footnote markers rendered in the body, used to dedupe ids and gate definition back-links.
|
|
325
|
+
const refs = new Map();
|
|
326
|
+
let lists = null;
|
|
327
|
+
const closeLists = () => {
|
|
328
|
+
if (lists && lists.isOpen)
|
|
329
|
+
blocks.push(lists.flush());
|
|
330
|
+
lists = null;
|
|
331
|
+
};
|
|
332
|
+
for (let i = 0; i < nodes.length; i++) {
|
|
333
|
+
const node = nodes[i];
|
|
334
|
+
// ── Tables: consume the whole run of same-table_id nodes at once ──
|
|
335
|
+
if (node.table_context) {
|
|
336
|
+
closeLists();
|
|
337
|
+
const tableId = node.table_context.table_id;
|
|
338
|
+
const group = [];
|
|
339
|
+
while (i < nodes.length && nodes[i].table_context?.table_id === tableId) {
|
|
340
|
+
group.push(nodes[i]);
|
|
341
|
+
i++;
|
|
342
|
+
}
|
|
343
|
+
i--; // for-loop will re-increment
|
|
344
|
+
const table = renderTable(group, refs);
|
|
345
|
+
if (table)
|
|
346
|
+
blocks.push(table);
|
|
347
|
+
continue;
|
|
348
|
+
}
|
|
349
|
+
// ── Structural (Word-styled) headings ──
|
|
350
|
+
if (isStructuralHeading(node)) {
|
|
351
|
+
closeLists();
|
|
352
|
+
const level = Math.min(6, Math.max(1, node.heading.level));
|
|
353
|
+
blocks.push(`<h${level}>${inlineTagsToHtml(node.tagged_text, refs).trim()}</h${level}>`);
|
|
354
|
+
continue;
|
|
355
|
+
}
|
|
356
|
+
// ── List items: accumulated in a stateful nested-list builder ──
|
|
357
|
+
if (node.list_metadata.list_level >= 0) {
|
|
358
|
+
if (!lists)
|
|
359
|
+
lists = new ListBuilder();
|
|
360
|
+
const { tag, content } = renderListContent(node, refs);
|
|
361
|
+
lists.item(Math.max(0, node.list_metadata.list_level), tag, content);
|
|
362
|
+
continue;
|
|
363
|
+
}
|
|
364
|
+
// ── Normal paragraphs (heuristic headings land here: their run-in bold is already in the
|
|
365
|
+
// inline tags, so they stay <p> rather than being promoted to a heading). ──
|
|
366
|
+
closeLists();
|
|
367
|
+
const html = inlineTagsToHtml(node.tagged_text, refs).trim();
|
|
368
|
+
if (html)
|
|
369
|
+
blocks.push(`<p>${html}</p>`);
|
|
370
|
+
}
|
|
371
|
+
closeLists();
|
|
372
|
+
const footnotesHtml = renderFootnotes(footnotes, refs);
|
|
373
|
+
if (footnotesHtml)
|
|
374
|
+
blocks.push(footnotesHtml);
|
|
375
|
+
const body = blocks.join('\n');
|
|
376
|
+
if (opts.fragment)
|
|
377
|
+
return `${body}\n`;
|
|
378
|
+
const title = escapeHtmlText(opts.title ?? deriveTitle(nodes));
|
|
379
|
+
return [
|
|
380
|
+
'<!DOCTYPE html>',
|
|
381
|
+
'<html lang="en">',
|
|
382
|
+
'<head>',
|
|
383
|
+
'<meta charset="utf-8"/>',
|
|
384
|
+
'<meta name="viewport" content="width=device-width, initial-scale=1"/>',
|
|
385
|
+
`<title>${title}</title>`,
|
|
386
|
+
`<style>\n${DOCUMENT_STYLE}\n</style>`,
|
|
387
|
+
'</head>',
|
|
388
|
+
'<body>',
|
|
389
|
+
body,
|
|
390
|
+
'</body>',
|
|
391
|
+
'</html>',
|
|
392
|
+
'',
|
|
393
|
+
].join('\n');
|
|
394
|
+
}
|
|
395
|
+
//# sourceMappingURL=serialize_html.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serialize_html.js","sourceRoot":"","sources":["../../src/primitives/serialize_html.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { DocumentViewNode } from './document_view.js';
|
|
2
|
+
import type { Footnote } from './footnotes.js';
|
|
3
|
+
export declare function inlineTagsToMarkdown(text: string): string;
|
|
4
|
+
export interface SerializeMarkdownOptions {
|
|
5
|
+
/** Reserved for future knobs (heading promotion, table policy). Currently unused. */
|
|
6
|
+
readonly _reserved?: never;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Serialize a structured document view to GitHub-Flavored Markdown.
|
|
10
|
+
*
|
|
11
|
+
* @param nodes Block nodes from `buildDocumentView({ showFormatting: true }).nodes`.
|
|
12
|
+
* @param footnotes Footnotes from `DocxDocument.getFootnotes()` (already sorted by
|
|
13
|
+
* `displayNumber`); appended as `[^n]: …` definitions.
|
|
14
|
+
*/
|
|
15
|
+
export declare function serializeToMarkdown(nodes: DocumentViewNode[], footnotes?: Footnote[], _opts?: SerializeMarkdownOptions): string;
|
|
16
|
+
//# sourceMappingURL=serialize_markdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serialize_markdown.d.ts","sourceRoot":"","sources":["../../src/primitives/serialize_markdown.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAiE/C,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA0EzD;AA4FD,MAAM,WAAW,wBAAwB;IACvC,qFAAqF;IACrF,QAAQ,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC;CAC5B;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,gBAAgB,EAAE,EACzB,SAAS,GAAE,QAAQ,EAAO,EAC1B,KAAK,GAAE,wBAA6B,GACnC,MAAM,CA0ER"}
|