@temelj/mdx 0.13.0 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +468 -82
- package/dist/character-entities.d.mts +4 -0
- package/dist/character-entities.d.mts.map +1 -0
- package/dist/character-entities.mjs +2132 -0
- package/dist/character-entities.mjs.map +1 -0
- package/dist/character-reference.d.mts +6 -0
- package/dist/character-reference.d.mts.map +1 -0
- package/dist/character-reference.mjs +18 -0
- package/dist/character-reference.mjs.map +1 -0
- package/dist/compile-analysis.d.mts +28 -0
- package/dist/compile-analysis.d.mts.map +1 -0
- package/dist/compile-analysis.mjs +74 -0
- package/dist/compile-analysis.mjs.map +1 -0
- package/dist/compile-emit.d.mts +9 -0
- package/dist/compile-emit.d.mts.map +1 -0
- package/dist/compile-emit.mjs +187 -0
- package/dist/compile-emit.mjs.map +1 -0
- package/dist/compile-esm.d.mts +34 -0
- package/dist/compile-esm.d.mts.map +1 -0
- package/dist/compile-esm.mjs +187 -0
- package/dist/compile-esm.mjs.map +1 -0
- package/dist/compile-names.d.mts +13 -0
- package/dist/compile-names.d.mts.map +1 -0
- package/dist/compile-names.mjs +32 -0
- package/dist/compile-names.mjs.map +1 -0
- package/dist/compiler.d.mts +69 -85
- package/dist/compiler.d.mts.map +1 -1
- package/dist/compiler.mjs +185 -418
- package/dist/compiler.mjs.map +1 -1
- package/dist/diagnostics.d.mts +37 -0
- package/dist/diagnostics.d.mts.map +1 -0
- package/dist/diagnostics.mjs +57 -0
- package/dist/diagnostics.mjs.map +1 -0
- package/dist/errors.d.mts +157 -0
- package/dist/errors.d.mts.map +1 -0
- package/dist/errors.mjs +263 -0
- package/dist/errors.mjs.map +1 -0
- package/dist/footnote-numbering.d.mts +27 -0
- package/dist/footnote-numbering.d.mts.map +1 -0
- package/dist/footnote-numbering.mjs +49 -0
- package/dist/footnote-numbering.mjs.map +1 -0
- package/dist/format-context.d.mts +46 -0
- package/dist/format-context.d.mts.map +1 -0
- package/dist/format-context.mjs +26 -0
- package/dist/format-context.mjs.map +1 -0
- package/dist/format-directive.d.mts +9 -0
- package/dist/format-directive.d.mts.map +1 -0
- package/dist/format-directive.mjs +99 -0
- package/dist/format-directive.mjs.map +1 -0
- package/dist/format-jsx.d.mts +8 -0
- package/dist/format-jsx.d.mts.map +1 -0
- package/dist/format-jsx.mjs +47 -0
- package/dist/format-jsx.mjs.map +1 -0
- package/dist/format-math.d.mts +9 -0
- package/dist/format-math.d.mts.map +1 -0
- package/dist/format-math.mjs +79 -0
- package/dist/format-math.mjs.map +1 -0
- package/dist/format-safe.d.mts +25 -0
- package/dist/format-safe.d.mts.map +1 -0
- package/dist/format-safe.mjs +366 -0
- package/dist/format-safe.mjs.map +1 -0
- package/dist/format-table.d.mts +8 -0
- package/dist/format-table.d.mts.map +1 -0
- package/dist/format-table.mjs +55 -0
- package/dist/format-table.mjs.map +1 -0
- package/dist/format-track.d.mts +18 -0
- package/dist/format-track.d.mts.map +1 -0
- package/dist/format-track.mjs +34 -0
- package/dist/format-track.mjs.map +1 -0
- package/dist/format.d.mts +7 -0
- package/dist/format.d.mts.map +1 -0
- package/dist/format.mjs +549 -0
- package/dist/format.mjs.map +1 -0
- package/dist/frontmatter.d.mts +15 -0
- package/dist/frontmatter.d.mts.map +1 -0
- package/dist/frontmatter.mjs +187 -0
- package/dist/frontmatter.mjs.map +1 -0
- package/dist/heading.d.mts +6 -0
- package/dist/heading.d.mts.map +1 -0
- package/dist/heading.mjs +19 -0
- package/dist/heading.mjs.map +1 -0
- package/dist/html-format.d.mts +32 -0
- package/dist/html-format.d.mts.map +1 -0
- package/dist/html-format.mjs +127 -0
- package/dist/html-format.mjs.map +1 -0
- package/dist/html-lower.d.mts +78 -0
- package/dist/html-lower.d.mts.map +1 -0
- package/dist/html-lower.mjs +583 -0
- package/dist/html-lower.mjs.map +1 -0
- package/dist/html-stream.d.mts +13 -0
- package/dist/html-stream.d.mts.map +1 -0
- package/dist/html-stream.mjs +32 -0
- package/dist/html-stream.mjs.map +1 -0
- package/dist/html.d.mts +120 -0
- package/dist/html.d.mts.map +1 -0
- package/dist/html.mjs +77 -0
- package/dist/html.mjs.map +1 -0
- package/dist/identifier.d.mts +4 -0
- package/dist/identifier.d.mts.map +1 -0
- package/dist/identifier.mjs +8 -0
- package/dist/identifier.mjs.map +1 -0
- package/dist/javascript-ast.d.mts +16 -0
- package/dist/javascript-ast.d.mts.map +1 -0
- package/dist/javascript-ast.mjs +39 -0
- package/dist/javascript-ast.mjs.map +1 -0
- package/dist/javascript-jsx.d.mts +24 -0
- package/dist/javascript-jsx.d.mts.map +1 -0
- package/dist/javascript-jsx.mjs +189 -0
- package/dist/javascript-jsx.mjs.map +1 -0
- package/dist/javascript.d.mts +9 -0
- package/dist/javascript.d.mts.map +1 -0
- package/dist/javascript.mjs +31 -0
- package/dist/javascript.mjs.map +1 -0
- package/dist/jsx-reference.d.mts +15 -0
- package/dist/jsx-reference.d.mts.map +1 -0
- package/dist/jsx-reference.mjs +31 -0
- package/dist/jsx-reference.mjs.map +1 -0
- package/dist/mod.d.mts +25 -8
- package/dist/mod.mjs +19 -7
- package/dist/model.d.mts +196 -0
- package/dist/model.d.mts.map +1 -0
- package/dist/model.mjs +113 -0
- package/dist/model.mjs.map +1 -0
- package/dist/parser/block-container-recognizers.d.mts +40 -0
- package/dist/parser/block-container-recognizers.d.mts.map +1 -0
- package/dist/parser/block-container-recognizers.mjs +90 -0
- package/dist/parser/block-container-recognizers.mjs.map +1 -0
- package/dist/parser/block-directive-recognizers.d.mts +22 -0
- package/dist/parser/block-directive-recognizers.d.mts.map +1 -0
- package/dist/parser/block-directive-recognizers.mjs +77 -0
- package/dist/parser/block-directive-recognizers.mjs.map +1 -0
- package/dist/parser/block-leaf-recognizers.d.mts +53 -0
- package/dist/parser/block-leaf-recognizers.d.mts.map +1 -0
- package/dist/parser/block-leaf-recognizers.mjs +386 -0
- package/dist/parser/block-leaf-recognizers.mjs.map +1 -0
- package/dist/parser/block-parser.d.mts +38 -0
- package/dist/parser/block-parser.d.mts.map +1 -0
- package/dist/parser/block-parser.mjs +895 -0
- package/dist/parser/block-parser.mjs.map +1 -0
- package/dist/parser/block-syntax.d.mts +240 -0
- package/dist/parser/block-syntax.d.mts.map +1 -0
- package/dist/parser/characters.d.mts +19 -0
- package/dist/parser/characters.d.mts.map +1 -0
- package/dist/parser/characters.mjs +52 -0
- package/dist/parser/characters.mjs.map +1 -0
- package/dist/parser/config.d.mts +16 -0
- package/dist/parser/config.d.mts.map +1 -0
- package/dist/parser/config.mjs +25 -0
- package/dist/parser/config.mjs.map +1 -0
- package/dist/parser/directive-attributes.d.mts +9 -0
- package/dist/parser/directive-attributes.d.mts.map +1 -0
- package/dist/parser/directive-attributes.mjs +24 -0
- package/dist/parser/directive-attributes.mjs.map +1 -0
- package/dist/parser/embedded-scanner.d.mts +18 -0
- package/dist/parser/embedded-scanner.d.mts.map +1 -0
- package/dist/parser/embedded-scanner.mjs +199 -0
- package/dist/parser/embedded-scanner.mjs.map +1 -0
- package/dist/parser/inline-autolink.d.mts +7 -0
- package/dist/parser/inline-autolink.d.mts.map +1 -0
- package/dist/parser/inline-autolink.mjs +42 -0
- package/dist/parser/inline-autolink.mjs.map +1 -0
- package/dist/parser/inline-character-reference.d.mts +7 -0
- package/dist/parser/inline-character-reference.d.mts.map +1 -0
- package/dist/parser/inline-character-reference.mjs +22 -0
- package/dist/parser/inline-character-reference.mjs.map +1 -0
- package/dist/parser/inline-code.d.mts +7 -0
- package/dist/parser/inline-code.d.mts.map +1 -0
- package/dist/parser/inline-code.mjs +29 -0
- package/dist/parser/inline-code.mjs.map +1 -0
- package/dist/parser/inline-directive.d.mts +9 -0
- package/dist/parser/inline-directive.d.mts.map +1 -0
- package/dist/parser/inline-directive.mjs +45 -0
- package/dist/parser/inline-directive.mjs.map +1 -0
- package/dist/parser/inline-embedded.d.mts +19 -0
- package/dist/parser/inline-embedded.d.mts.map +1 -0
- package/dist/parser/inline-embedded.mjs +92 -0
- package/dist/parser/inline-embedded.mjs.map +1 -0
- package/dist/parser/inline-emphasis.d.mts +11 -0
- package/dist/parser/inline-emphasis.d.mts.map +1 -0
- package/dist/parser/inline-emphasis.mjs +79 -0
- package/dist/parser/inline-emphasis.mjs.map +1 -0
- package/dist/parser/inline-input.d.mts +46 -0
- package/dist/parser/inline-input.d.mts.map +1 -0
- package/dist/parser/inline-input.mjs +137 -0
- package/dist/parser/inline-input.mjs.map +1 -0
- package/dist/parser/inline-link.d.mts +12 -0
- package/dist/parser/inline-link.d.mts.map +1 -0
- package/dist/parser/inline-link.mjs +187 -0
- package/dist/parser/inline-link.mjs.map +1 -0
- package/dist/parser/inline-math.d.mts +10 -0
- package/dist/parser/inline-math.d.mts.map +1 -0
- package/dist/parser/inline-math.mjs +46 -0
- package/dist/parser/inline-math.mjs.map +1 -0
- package/dist/parser/inline-output.d.mts +34 -0
- package/dist/parser/inline-output.d.mts.map +1 -0
- package/dist/parser/inline-output.mjs +62 -0
- package/dist/parser/inline-output.mjs.map +1 -0
- package/dist/parser/inline-parser.d.mts +14 -0
- package/dist/parser/inline-parser.d.mts.map +1 -0
- package/dist/parser/inline-parser.mjs +328 -0
- package/dist/parser/inline-parser.mjs.map +1 -0
- package/dist/parser/inline-pending.d.mts +23 -0
- package/dist/parser/inline-pending.d.mts.map +1 -0
- package/dist/parser/inline-pending.mjs +100 -0
- package/dist/parser/inline-pending.mjs.map +1 -0
- package/dist/parser/inline-syntax.d.mts +118 -0
- package/dist/parser/inline-syntax.d.mts.map +1 -0
- package/dist/parser/inline-syntax.mjs +1 -0
- package/dist/parser/javascript-boundary.d.mts +16 -0
- package/dist/parser/javascript-boundary.d.mts.map +1 -0
- package/dist/parser/javascript-boundary.mjs +42 -0
- package/dist/parser/javascript-boundary.mjs.map +1 -0
- package/dist/parser/javascript-scanner.d.mts +22 -0
- package/dist/parser/javascript-scanner.d.mts.map +1 -0
- package/dist/parser/javascript-scanner.mjs +122 -0
- package/dist/parser/javascript-scanner.mjs.map +1 -0
- package/dist/parser/materialize-cache.d.mts +34 -0
- package/dist/parser/materialize-cache.d.mts.map +1 -0
- package/dist/parser/materialize-cache.mjs +12 -0
- package/dist/parser/materialize-cache.mjs.map +1 -0
- package/dist/parser/materialize-jsx.d.mts +14 -0
- package/dist/parser/materialize-jsx.d.mts.map +1 -0
- package/dist/parser/materialize-jsx.mjs +76 -0
- package/dist/parser/materialize-jsx.mjs.map +1 -0
- package/dist/parser/materialize.d.mts +61 -0
- package/dist/parser/materialize.d.mts.map +1 -0
- package/dist/parser/materialize.mjs +736 -0
- package/dist/parser/materialize.mjs.map +1 -0
- package/dist/parser/recognizer.d.mts +20 -0
- package/dist/parser/recognizer.d.mts.map +1 -0
- package/dist/parser/recognizer.mjs +24 -0
- package/dist/parser/recognizer.mjs.map +1 -0
- package/dist/parser/session.d.mts +42 -0
- package/dist/parser/session.d.mts.map +1 -0
- package/dist/parser/session.mjs +89 -0
- package/dist/parser/session.mjs.map +1 -0
- package/dist/parser.d.mts +25 -0
- package/dist/parser.d.mts.map +1 -0
- package/dist/parser.mjs +37 -0
- package/dist/parser.mjs.map +1 -0
- package/dist/plugin-internal.d.mts +25 -0
- package/dist/plugin-internal.d.mts.map +1 -0
- package/dist/plugin-internal.mjs +99 -0
- package/dist/plugin-internal.mjs.map +1 -0
- package/dist/plugin.d.mts +37 -0
- package/dist/plugin.d.mts.map +1 -0
- package/dist/plugin.mjs +1 -0
- package/dist/plugins/code-block-metadata.d.mts +42 -0
- package/dist/plugins/code-block-metadata.d.mts.map +1 -0
- package/dist/plugins/code-block-metadata.mjs +133 -0
- package/dist/plugins/code-block-metadata.mjs.map +1 -0
- package/dist/plugins/heading-id.d.mts +15 -0
- package/dist/plugins/heading-id.d.mts.map +1 -0
- package/dist/plugins/heading-id.mjs +45 -0
- package/dist/plugins/heading-id.mjs.map +1 -0
- package/dist/plugins/lower-heading.d.mts +16 -0
- package/dist/plugins/lower-heading.d.mts.map +1 -0
- package/dist/plugins/lower-heading.mjs +28 -0
- package/dist/plugins/lower-heading.mjs.map +1 -0
- package/dist/plugins/math-render.d.mts +26 -0
- package/dist/plugins/math-render.d.mts.map +1 -0
- package/dist/plugins/math-render.mjs +51 -0
- package/dist/plugins/math-render.mjs.map +1 -0
- package/dist/plugins/mod.d.mts +9 -5
- package/dist/plugins/mod.mjs +8 -5
- package/dist/plugins/remove-esm.d.mts +10 -0
- package/dist/plugins/remove-esm.d.mts.map +1 -0
- package/dist/plugins/remove-esm.mjs +12 -0
- package/dist/plugins/remove-esm.mjs.map +1 -0
- package/dist/plugins/shiki.d.mts +21 -0
- package/dist/plugins/shiki.d.mts.map +1 -0
- package/dist/plugins/shiki.mjs +144 -0
- package/dist/plugins/shiki.mjs.map +1 -0
- package/dist/plugins/syntax-highlight.d.mts +38 -0
- package/dist/plugins/syntax-highlight.d.mts.map +1 -0
- package/dist/plugins/syntax-highlight.mjs +106 -0
- package/dist/plugins/syntax-highlight.mjs.map +1 -0
- package/dist/processor.d.mts +60 -0
- package/dist/processor.d.mts.map +1 -0
- package/dist/processor.mjs +106 -0
- package/dist/processor.mjs.map +1 -0
- package/dist/ranges.d.mts +10 -0
- package/dist/ranges.d.mts.map +1 -0
- package/dist/ranges.mjs +22 -0
- package/dist/ranges.mjs.map +1 -0
- package/dist/source-map.d.mts +28 -0
- package/dist/source-map.d.mts.map +1 -0
- package/dist/source-map.mjs +90 -0
- package/dist/source-map.mjs.map +1 -0
- package/dist/source-text.d.mts +35 -0
- package/dist/source-text.d.mts.map +1 -0
- package/dist/source-text.mjs +132 -0
- package/dist/source-text.mjs.map +1 -0
- package/dist/source.d.mts +86 -0
- package/dist/source.d.mts.map +1 -0
- package/dist/source.mjs +264 -0
- package/dist/source.mjs.map +1 -0
- package/dist/stream-events.d.mts +59 -0
- package/dist/stream-events.d.mts.map +1 -0
- package/dist/stream-events.mjs +115 -0
- package/dist/stream-events.mjs.map +1 -0
- package/dist/stream-session.d.mts +79 -0
- package/dist/stream-session.d.mts.map +1 -0
- package/dist/stream-session.mjs +904 -0
- package/dist/stream-session.mjs.map +1 -0
- package/dist/stream-tail.d.mts +84 -0
- package/dist/stream-tail.d.mts.map +1 -0
- package/dist/stream-tail.mjs +359 -0
- package/dist/stream-tail.mjs.map +1 -0
- package/dist/stream-types.d.mts +89 -0
- package/dist/stream-types.d.mts.map +1 -0
- package/dist/stream-types.mjs +1 -0
- package/dist/stream.d.mts +28 -0
- package/dist/stream.d.mts.map +1 -0
- package/dist/stream.mjs +68 -0
- package/dist/stream.mjs.map +1 -0
- package/dist/syntax-options.d.mts +21 -0
- package/dist/syntax-options.d.mts.map +1 -0
- package/dist/syntax-options.mjs +26 -0
- package/dist/syntax-options.mjs.map +1 -0
- package/dist/traversal.d.mts +25 -0
- package/dist/traversal.d.mts.map +1 -0
- package/dist/traversal.mjs +136 -0
- package/dist/traversal.mjs.map +1 -0
- package/dist/tree.d.mts +18 -0
- package/dist/tree.d.mts.map +1 -0
- package/dist/tree.mjs +43 -0
- package/dist/tree.mjs.map +1 -0
- package/dist/unified/adapter.d.mts +24 -0
- package/dist/unified/adapter.d.mts.map +1 -0
- package/dist/unified/adapter.mjs +44 -0
- package/dist/unified/adapter.mjs.map +1 -0
- package/dist/unified/mod.d.mts +2 -0
- package/dist/unified/mod.mjs +1 -0
- package/dist/unified/runtime.d.mts +10 -0
- package/dist/unified/runtime.d.mts.map +1 -0
- package/dist/unified/runtime.mjs +115 -0
- package/dist/unified/runtime.mjs.map +1 -0
- package/dist/unified/tree-bridge.d.mts +63 -0
- package/dist/unified/tree-bridge.d.mts.map +1 -0
- package/dist/unified/tree-bridge.mjs +876 -0
- package/dist/unified/tree-bridge.mjs.map +1 -0
- package/dist/uri.d.mts +5 -0
- package/dist/uri.d.mts.map +1 -0
- package/dist/uri.mjs +32 -0
- package/dist/uri.mjs.map +1 -0
- package/package.json +56 -27
- package/dist/plugins/heading-id/plugin.d.mts +0 -17
- package/dist/plugins/heading-id/plugin.d.mts.map +0 -1
- package/dist/plugins/heading-id/plugin.mjs +0 -23
- package/dist/plugins/heading-id/plugin.mjs.map +0 -1
- package/dist/plugins/remove-imports-exports.d.mts +0 -10
- package/dist/plugins/remove-imports-exports.d.mts.map +0 -1
- package/dist/plugins/remove-imports-exports.mjs +0 -15
- package/dist/plugins/remove-imports-exports.mjs.map +0 -1
- package/dist/plugins/syntax-highlight/code-meta.d.mts +0 -22
- package/dist/plugins/syntax-highlight/code-meta.d.mts.map +0 -1
- package/dist/plugins/syntax-highlight/code-meta.mjs +0 -38
- package/dist/plugins/syntax-highlight/code-meta.mjs.map +0 -1
- package/dist/plugins/syntax-highlight/plugin.d.mts +0 -57
- package/dist/plugins/syntax-highlight/plugin.d.mts.map +0 -1
- package/dist/plugins/syntax-highlight/plugin.mjs +0 -93
- package/dist/plugins/syntax-highlight/plugin.mjs.map +0 -1
- package/dist/plugins/tree-processor/plugin.d.mts +0 -19
- package/dist/plugins/tree-processor/plugin.d.mts.map +0 -1
- package/dist/plugins/tree-processor/plugin.mjs +0 -21
- package/dist/plugins/tree-processor/plugin.mjs.map +0 -1
- package/dist/types.d.mts +0 -2
- /package/dist/{types.mjs → parser/block-syntax.mjs} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"block-parser.mjs","names":["exhaustive"],"sources":["../../src/parser/block-parser.ts"],"sourcesContent":["import type { SourceRange } from \"../ranges.ts\";\nimport type { SourceText } from \"../source-text.ts\";\nimport type { ResolvedSyntaxOptions } from \"../syntax-options.ts\";\nimport type {\n BlockSyntax,\n ContainerFrame,\n ListItemSyntax,\n ListSyntax,\n OpenExpression,\n OpenIndentedCode,\n OpenJsx,\n OpenLeaf,\n OpenTable,\n PendingBlockSyntax,\n} from \"./block-syntax.ts\";\nimport type { InlineSegment } from \"./inline-input.ts\";\nimport type { RecognizerResult } from \"./recognizer.ts\";\n\nimport { sourceRange } from \"../ranges.ts\";\nimport { PhysicalLineScanner, type PhysicalLine } from \"../source.ts\";\nimport {\n blockQuoteMarker,\n footnoteMarker,\n isSiblingListItem,\n listMarker,\n taskListMarker,\n} from \"./block-container-recognizers.ts\";\nimport {\n directiveContainerMarker,\n isClosingDirectiveFence,\n recognizeLeafDirective,\n} from \"./block-directive-recognizers.ts\";\nimport {\n interruptsParagraph,\n isClosingFence,\n isClosingMathFence,\n recognizeAtxHeading,\n recognizeDefinition,\n recognizeFence,\n recognizeFrontmatter,\n recognizeMathFence,\n recognizeRawHtml,\n recognizeSameLineMath,\n recognizeSetext,\n recognizeTable,\n recognizeThematicBreak,\n tableRow,\n trimLineEndingOffset,\n} from \"./block-leaf-recognizers.ts\";\nimport { consumeIndent, isAsciiLetter, isBlank, isSpaceOrTab } from \"./characters.ts\";\nimport { JsxBoundaryScanner } from \"./embedded-scanner.ts\";\nimport { parseJavaScriptBoundary } from \"./javascript-boundary.ts\";\nimport { JavaScriptScanner } from \"./javascript-scanner.ts\";\nimport { matched, noMatch } from \"./recognizer.ts\";\n\nexport interface BlockParserCheckpoint {\n readonly length: number;\n readonly tail: BlockSyntax | undefined;\n}\n\n/** Receives each top-level block once later input can no longer change it. */\nexport type SettledBlockListener = (block: BlockSyntax, index: number) => void;\n\nexport class BlockParser {\n readonly #blocks: BlockSyntax[] = [];\n readonly #containers: ContainerFrame[] = [];\n readonly #leaf: LeafParser;\n readonly #syntax: ResolvedSyntaxOptions;\n readonly #onSettled: SettledBlockListener | undefined;\n #settled: number;\n readonly #items: ListItemGrowth = { draft: false, owned: new WeakMap() };\n\n public constructor(\n syntax: ResolvedSyntaxOptions,\n blocks: readonly BlockSyntax[] = [],\n onSettled?: SettledBlockListener,\n ) {\n this.#syntax = syntax;\n this.#leaf = new LeafParser(syntax);\n this.#blocks.push(...blocks);\n this.#onSettled = onSettled;\n this.#settled = settledLength(this.#blocks);\n }\n\n /** The number of top-level blocks that later input cannot change. */\n public get settledCount(): number {\n return this.#settled;\n }\n\n public checkpoint(): BlockParserCheckpoint | undefined {\n if (this.#containers.length !== 0 || !this.#leaf.idle) {\n return undefined;\n }\n\n const tail = this.#blocks.at(-1);\n\n // A checkpoint keeps this list, so its items must not grow in place any more.\n if (tail?.kind === \"list\") {\n this.#items.owned.delete(tail.items);\n }\n\n return { length: this.#blocks.length, tail };\n }\n\n public fork(checkpoint: BlockParserCheckpoint): BlockParser {\n const blocks = this.#blocks.slice(0, checkpoint.length);\n\n if (checkpoint.tail !== undefined) {\n blocks[blocks.length - 1] = checkpoint.tail;\n }\n\n return new BlockParser(this.#syntax, blocks, this.#onSettled);\n }\n\n /**\n * A copy of the unsettled part: a trailing list, the open containers, and\n * the active leaf. Finishing it costs only the open tail.\n */\n public tail(): BlockParser {\n const copy = new BlockParser(this.#syntax, this.#blocks.slice(this.#settled));\n copy.#items.draft = true;\n copy.#containers.push(...this.#containers);\n copy.#leaf.copyFrom(this.#leaf);\n\n return copy;\n }\n\n public pending(): PendingBlockSyntax | undefined {\n return this.#leaf.pending();\n }\n\n public write(source: SourceText, physicalLine: PhysicalLine): void {\n this.#leaf.rollback();\n this.writeLine(source, physicalLine);\n\n while (this.#onSettled !== undefined && this.#settled < settledLength(this.#blocks)) {\n this.#onSettled(this.#blocks[this.#settled], this.#settled);\n this.#settled++;\n }\n }\n\n private writeLine(source: SourceText, physicalLine: PhysicalLine): void {\n let cursor =\n physicalLine.range.start === 0 && source.char(0) === \"\\uFEFF\"\n ? physicalLine.content.start + 1\n : physicalLine.content.start;\n\n let matchedContainers = 0;\n\n for (const [index, frame] of this.#containers.entries()) {\n if (\n frame.kind === \"directiveContainer\" &&\n isClosingDirectiveFence(source, physicalLine, cursor, frame.fenceLength)\n ) {\n this.appendLeafBlocks(this.#leaf.finish());\n const current = this.#containers[index];\n\n if (current.kind !== \"directiveContainer\") {\n throw new Error(\"Directive frame changed while closing its leaf\");\n }\n\n this.#containers[index] = { ...current, end: physicalLine.range.end };\n this.closeContainers(index);\n\n return;\n }\n\n const continuation = continueContainer(source, physicalLine, cursor, frame);\n\n if (continuation === undefined) {\n break;\n }\n\n cursor = continuation;\n matchedContainers = index + 1;\n this.#containers[index] = { ...frame, end: physicalLine.range.end };\n }\n\n if (matchedContainers === this.#containers.length && this.#leaf.ownsFollowingLine) {\n this.appendLeafBlocks(this.#leaf.write(source, contentLine(physicalLine, cursor)));\n\n return;\n }\n\n const unmatched = matchedContainers < this.#containers.length;\n let line = contentLine(physicalLine, cursor);\n const unmatchedFrame = this.#containers[matchedContainers];\n\n const siblingItem =\n unmatchedFrame?.kind === \"listItem\" && isSiblingListItem(source, line, unmatchedFrame);\n\n const lazy = unmatched && !siblingItem && this.#leaf.canLazyContinue(source, line);\n\n if (lazy) {\n for (let index = matchedContainers; index < this.#containers.length; index++) {\n const frame = this.#containers[index];\n this.#containers[index] = { ...frame, end: physicalLine.range.end };\n }\n }\n\n if (!lazy) {\n if (unmatched) {\n this.appendLeafBlocks(this.#leaf.finish());\n this.closeContainers(matchedContainers);\n }\n\n if (this.#leaf.hasParagraph) {\n if (opensContainer(source, line, this.#syntax)) {\n this.appendLeafBlocks(this.#leaf.finish());\n cursor = openContainers(source, physicalLine, cursor, this.#containers, this.#syntax);\n }\n } else {\n cursor = openContainers(source, physicalLine, cursor, this.#containers, this.#syntax);\n }\n }\n\n line = contentLine(physicalLine, cursor);\n const task = taskListMarker(source, line, this.#containers, this.#leaf.hasParagraph);\n\n if (task !== undefined) {\n this.#containers[this.#containers.length - 1] = {\n ...task.frame,\n checked: task.checked,\n };\n line = contentLine(physicalLine, task.contentStart);\n }\n\n if (isBlankLine(source, line)) {\n markListBlank(this.#containers);\n } else {\n settleListBlank(this.#containers, lazy ? this.#containers.length : matchedContainers);\n }\n\n const allowFrontmatter =\n physicalLine.line === 1 && this.#blocks.length === 0 && this.#containers.length === 0;\n\n this.appendLeafBlocks(this.#leaf.write(source, line, allowFrontmatter));\n }\n\n public finish(source: SourceText): readonly BlockSyntax[] {\n this.#leaf.rollback();\n this.appendLeafBlocks(this.#leaf.finish(source));\n this.closeContainers(0);\n\n return [...this.#blocks];\n }\n\n private appendLeafBlocks(blocks: readonly BlockSyntax[]): void {\n for (const block of blocks) {\n appendBlock(this.#blocks, this.#containers, block);\n }\n }\n\n private closeContainers(keep: number): void {\n while (this.#containers.length > keep) {\n const frame = this.#containers.pop();\n\n if (frame === undefined) {\n throw new Error(\"Container stack changed while closing a frame\");\n }\n\n if (frame.kind === \"blockQuote\") {\n appendBlock(this.#blocks, this.#containers, {\n kind: \"blockQuote\",\n range: sourceRange(frame.start, frame.end),\n children: frame.children,\n });\n } else if (frame.kind === \"listItem\") {\n appendListItem(this.#blocks, this.#containers, frame, this.#items);\n } else if (frame.kind === \"footnoteDefinition\") {\n appendBlock(this.#blocks, this.#containers, {\n kind: \"footnoteDefinition\",\n range: sourceRange(frame.start, frame.end),\n identifier: frame.identifier,\n children: frame.children,\n });\n } else if (frame.kind === \"directiveContainer\") {\n appendBlock(this.#blocks, this.#containers, {\n kind: \"directive\",\n range: sourceRange(frame.start, frame.end),\n name: frame.name,\n label: frame.label,\n attributes: frame.attributes,\n children: frame.children,\n });\n }\n }\n }\n}\n\n/** Arrays an open leaf grows in place. Only the parser that created one extends it. */\nconst growable = new WeakSet<readonly unknown[]>();\n\nfunction isGrowable<T>(array: readonly T[]): array is T[] {\n return growable.has(array);\n}\n\n/**\n * Extensions a tail draft made to its parser's arrays, undone before the parser\n * reads them again. A draft lives for one update, so its lines never outlast it.\n */\ntype DraftLog = Array<readonly [unknown[], number]>;\n\nclass LeafParser {\n readonly #syntax: ResolvedSyntaxOptions;\n #active: OpenLeaf | undefined;\n /** Set on a tail draft: extensions are logged so the parser can undo them. */\n #draftLog: DraftLog | undefined;\n readonly #log: DraftLog = [];\n #expressionScanner: JavaScriptScanner | undefined;\n #jsxScanner: JsxBoundaryScanner | undefined;\n\n public constructor(syntax: ResolvedSyntaxOptions) {\n this.#syntax = syntax;\n }\n\n public get hasParagraph(): boolean {\n return this.#active?.kind === \"paragraph\";\n }\n\n public get idle(): boolean {\n return this.#active === undefined;\n }\n\n public get ownsFollowingLine(): boolean {\n const kind = this.#active?.kind;\n\n return (\n kind === \"fencedCode\" ||\n kind === \"html\" ||\n kind === \"frontmatter\" ||\n kind === \"math\" ||\n kind === \"expression\" ||\n kind === \"jsx\" ||\n kind === \"esm\"\n );\n }\n\n public copyFrom(source: LeafParser): void {\n source.rollback();\n this.#draftLog = source.#log;\n this.#active = source.#active;\n this.#expressionScanner = source.#expressionScanner?.clone();\n this.#jsxScanner = source.#jsxScanner?.clone();\n }\n\n /** Undoes a tail draft's extensions, so the open leaf holds only written lines. */\n public rollback(): void {\n for (let index = this.#log.length - 1; index >= 0; index--) {\n const [array, length] = this.#log[index];\n array.length = length;\n }\n\n this.#log.length = 0;\n }\n\n /**\n * Appends to a leaf array without copying it. A tail draft logs the old\n * length, so the parser it came from can undo the extension.\n */\n private grow<T>(array: readonly T[], ...items: T[]): readonly T[] {\n if (!isGrowable(array)) {\n const copy = [...array, ...items];\n growable.add(copy);\n\n return copy;\n }\n\n this.#draftLog?.push([array, array.length]);\n array.push(...items);\n\n return array;\n }\n\n public pending(): PendingBlockSyntax | undefined {\n const active = this.#active;\n\n if (active === undefined) {\n return;\n }\n\n if (active.kind === \"paragraph\") {\n return {\n kind: \"paragraph\",\n range: sourceRange(active.start, active.end),\n input: active.lines,\n };\n }\n\n if (active.kind === \"fencedCode\") {\n return {\n kind: \"fencedCode\",\n range: sourceRange(active.start, active.end),\n value: active.value,\n language: active.language,\n meta: active.meta,\n };\n }\n\n if (active.kind === \"math\") {\n return {\n kind: \"math\",\n range: sourceRange(active.start, active.end),\n value: active.value,\n format: active.format,\n };\n }\n\n if (active.kind === \"jsx\") {\n return {\n kind: \"jsx\",\n range: sourceRange(active.start, active.end),\n opening: this.#jsxScanner?.opening(),\n };\n }\n\n if (active.kind === \"expression\" || active.kind === \"esm\") {\n return {\n kind: active.kind,\n range: sourceRange(active.start, active.end),\n };\n }\n\n return;\n }\n\n public canLazyContinue(source: SourceText, line: PhysicalLine): boolean {\n return (\n this.#active?.kind === \"paragraph\" &&\n !isBlankLine(source, line) &&\n !this.interruptsParagraph(source, line) &&\n !opensContainer(source, line, this.#syntax)\n );\n }\n\n public write(\n source: SourceText,\n line: PhysicalLine,\n allowFrontmatter = false,\n ): readonly BlockSyntax[] {\n const blocks: BlockSyntax[] = [];\n\n if (this.continueActive(source, line, blocks)) {\n return blocks;\n }\n\n if (isBlankLine(source, line)) {\n return [...blocks, ...this.finish()];\n }\n\n if (this.continueParagraph(source, line, blocks)) {\n return blocks;\n }\n\n this.startLeaf(source, line, allowFrontmatter, blocks);\n\n return blocks;\n }\n\n /**\n * Feeds a line to an open leaf that owns its lines. Returns `false` when the\n * leaf closed without consuming the line, so the line starts new content.\n */\n private continueActive(source: SourceText, line: PhysicalLine, blocks: BlockSyntax[]): boolean {\n const active = this.#active;\n\n switch (active?.kind) {\n case \"expression\":\n case \"jsx\":\n this.continueEmbedded(source, line, active, blocks);\n\n return true;\n case \"esm\":\n if (isBlankLine(source, line)) {\n blocks.push(this.finishEmbedded(source));\n } else {\n this.#active = {\n ...active,\n end: line.range.end,\n value: this.grow(active.value, embeddedSegment(line)),\n };\n }\n\n return true;\n case \"html\":\n if (source.slice(line.content.start, line.content.end).includes(active.closing)) {\n blocks.push(this.closeActive(line.range.end));\n } else {\n this.#active = { ...active, end: line.range.end };\n }\n\n return true;\n case \"frontmatter\":\n if (source.slice(line.content.start, line.content.end).trim() === active.fence) {\n blocks.push(this.closeActive(line.range.end));\n } else {\n this.#active = { ...active, end: line.range.end, valueEnd: line.range.end };\n }\n\n return true;\n case \"math\":\n if (isClosingMathFence(source, line, active)) {\n blocks.push(this.closeActive(line.range.end));\n } else {\n this.#active = {\n ...active,\n end: line.range.end,\n value: this.grow(active.value, { kind: \"source\", range: line.range }),\n };\n }\n\n return true;\n case \"fencedCode\":\n if (isClosingFence(source, line, active)) {\n blocks.push(this.closeActive(line.range.end));\n } else {\n this.#active = {\n ...active,\n end: line.range.end,\n value: this.grow(active.value, { kind: \"source\", range: line.range }),\n };\n }\n\n return true;\n case \"indentedCode\":\n return this.continueIndentedCode(source, line, active, blocks);\n case \"table\":\n return this.continueTable(source, line, active, blocks);\n case \"paragraph\":\n case undefined:\n return false;\n default: {\n const exhaustive: never = active;\n\n return exhaustive;\n }\n }\n }\n\n private continueEmbedded(\n source: SourceText,\n line: PhysicalLine,\n active: OpenJsx | OpenExpression,\n blocks: BlockSyntax[],\n ): void {\n const scanner = active.kind === \"expression\" ? this.#expressionScanner : this.#jsxScanner;\n\n if (scanner === undefined) {\n throw new Error(`Missing retained scanner for ${active.kind}`);\n }\n\n const result = scanner.append(source.slice(line.range.start, line.range.end));\n this.#active = {\n ...active,\n end: line.range.end,\n value: this.grow(active.value, embeddedSegment(line)),\n };\n\n if (result.kind !== \"open\") {\n blocks.push(this.finishEmbedded(source, result.kind === \"invalid\"));\n }\n }\n\n /** Blank lines stay pending until more indented code follows them. */\n private continueIndentedCode(\n source: SourceText,\n line: PhysicalLine,\n active: OpenIndentedCode,\n blocks: BlockSyntax[],\n ): boolean {\n if (isBlankLine(source, line)) {\n this.#active = {\n ...active,\n end: line.range.end,\n pendingBlank: this.grow(active.pendingBlank, {\n kind: \"source\",\n range: sourceRange(line.content.end, line.range.end),\n }),\n };\n\n return true;\n }\n\n const indented = indentedCodeLine(source, line);\n\n if (indented !== undefined) {\n this.#active = {\n ...active,\n end: line.range.end,\n value: this.grow(active.value, ...active.pendingBlank, ...indented),\n pendingBlank: [],\n };\n\n return true;\n }\n\n blocks.push(this.closeActive());\n\n return false;\n }\n\n private continueTable(\n source: SourceText,\n line: PhysicalLine,\n active: OpenTable,\n blocks: BlockSyntax[],\n ): boolean {\n if (isBlankLine(source, line)) {\n blocks.push(this.closeActive());\n\n return false;\n }\n\n this.#active = {\n ...active,\n end: line.range.end,\n rows: this.grow(active.rows, tableRow(source, line.content)),\n };\n\n return true;\n }\n\n /**\n * A paragraph line can turn the paragraph into a setext heading or a table,\n * or continue it. Returns `false` when the line interrupts the paragraph.\n */\n private continueParagraph(\n source: SourceText,\n line: PhysicalLine,\n blocks: BlockSyntax[],\n ): boolean {\n const active = this.#active;\n\n if (active?.kind !== \"paragraph\") {\n return false;\n }\n\n const setext = recognizeSetext(source, line, active);\n\n if (setext.kind === \"matched\") {\n blocks.push(setext.value);\n this.#active = undefined;\n\n return true;\n }\n\n const table = recognizeTable(source, line, active);\n\n if (table.kind === \"matched\") {\n this.#active = table.value;\n\n return true;\n }\n\n if (this.interruptsParagraph(source, line)) {\n blocks.push(this.closeActive());\n\n return false;\n }\n\n this.#active = {\n kind: \"paragraph\",\n start: active.start,\n end: line.content.end,\n lines: this.grow(\n active.lines,\n { kind: \"source\", range: active.pendingEnding },\n { kind: \"source\", range: line.content },\n ),\n pendingEnding: sourceRange(line.content.end, line.range.end),\n };\n\n return true;\n }\n\n /** Starts the leaf a non-blank line opens, in CommonMark precedence order. */\n private startLeaf(\n source: SourceText,\n line: PhysicalLine,\n allowFrontmatter: boolean,\n blocks: BlockSyntax[],\n ): void {\n if (!startsParagraph(source, line.content.start)) {\n if (allowFrontmatter) {\n const frontmatter = recognizeFrontmatter(source, line, this.#syntax);\n\n if (frontmatter.kind === \"matched\") {\n this.#active = frontmatter.value;\n\n return;\n }\n }\n\n for (const recognize of [recognizeLeafDirective, recognizeSameLineMath]) {\n const result = recognize(source, line, this.#syntax);\n\n if (result.kind === \"matched\") {\n blocks.push(result.value);\n\n return;\n }\n }\n\n const math = recognizeMathFence(source, line, this.#syntax);\n\n if (math.kind === \"matched\") {\n this.#active = math.value;\n\n return;\n }\n\n if (this.startEmbedded(source, line, blocks)) {\n return;\n }\n\n for (const recognize of [\n recognizeRawHtml,\n recognizeDefinition,\n recognizeFence,\n recognizeAtxHeading,\n recognizeThematicBreak,\n ]) {\n const result = recognize(source, line);\n\n if (result.kind === \"matched\") {\n if (result.value.kind === \"openLeaf\") {\n this.#active = result.value.leaf;\n } else {\n blocks.push(result.value.block);\n }\n\n return;\n }\n }\n\n const indented = indentedCodeLine(source, line);\n\n if (indented !== undefined) {\n this.#active = {\n kind: \"indentedCode\",\n start: line.range.start,\n end: line.range.end,\n value: indented,\n pendingBlank: [],\n };\n\n return;\n }\n }\n\n this.#active = {\n kind: \"paragraph\",\n start: line.content.start,\n end: line.content.end,\n lines: [{ kind: \"source\", range: line.content }],\n pendingEnding: sourceRange(line.content.end, line.range.end),\n };\n }\n\n /**\n * Starts flow JSX, an expression, or ESM. Returns `false` when the construct\n * closes with more content on its line, which makes it phrasing content.\n */\n private startEmbedded(source: SourceText, line: PhysicalLine, blocks: BlockSyntax[]): boolean {\n const embedded = recognizeEmbeddedFlowStart(source, line);\n\n if (embedded.kind !== \"matched\") {\n return false;\n }\n\n this.#active = {\n kind: embedded.value.kind,\n start: line.content.start,\n end: line.range.end,\n value: [embeddedSegment(line)],\n };\n\n if (embedded.value.kind === \"esm\") {\n return true;\n }\n\n const start =\n embedded.value.kind === \"expression\" ? embedded.value.markerEnd : line.content.start;\n\n const text = source.slice(start, line.range.end);\n let result;\n\n if (embedded.value.kind === \"expression\") {\n this.#expressionScanner = new JavaScriptScanner(\"}\");\n result = this.#expressionScanner.append(text);\n } else {\n this.#jsxScanner = new JsxBoundaryScanner();\n result = this.#jsxScanner.append(text);\n }\n\n // Like MDX, a construct followed by more content on its line is phrasing content.\n const phrasing =\n result.kind === \"closed\" && !isBlank(source.slice(start + result.offset, line.content.end));\n\n if (!phrasing) {\n if (result.kind !== \"open\") {\n blocks.push(this.finishEmbedded(source, result.kind === \"invalid\"));\n }\n\n return true;\n }\n\n this.#active = undefined;\n this.#expressionScanner = undefined;\n this.#jsxScanner = undefined;\n\n return false;\n }\n\n public finish(source?: SourceText): readonly BlockSyntax[] {\n if (this.#active?.kind === \"esm\" && source !== undefined) {\n return [this.finishEmbedded(source)];\n }\n\n if (this.#active?.kind === \"frontmatter\" && source !== undefined) {\n const active = this.#active;\n this.#active = undefined;\n const contentEnd = trimLineEndingOffset(source, active.valueEnd);\n const paragraphStart = active.format === \"yaml\" ? active.valueStart : active.start;\n const fallback: BlockSyntax[] = [];\n\n if (active.format === \"yaml\") {\n fallback.push({\n kind: \"thematicBreak\",\n range: sourceRange(active.start, trimLineEndingOffset(source, active.valueStart)),\n });\n }\n\n if (contentEnd > paragraphStart) {\n fallback.push({\n kind: \"paragraph\",\n range: sourceRange(paragraphStart, contentEnd),\n input: [{ kind: \"source\", range: sourceRange(paragraphStart, contentEnd) }],\n });\n }\n\n return fallback;\n }\n\n if (\n this.#active?.kind === \"expression\" ||\n this.#active?.kind === \"jsx\" ||\n this.#active?.kind === \"esm\"\n ) {\n const active = this.#active;\n const opening = this.#jsxScanner?.opening();\n this.#active = undefined;\n this.#expressionScanner = undefined;\n this.#jsxScanner = undefined;\n\n return [\n {\n kind: \"invalidMdx\",\n range: sourceRange(active.start, active.end),\n syntax: active.kind,\n state: \"incomplete\",\n opening,\n },\n ];\n }\n\n return this.#active === undefined ? [] : [this.closeActive()];\n }\n\n private finishEmbedded(source: SourceText, structurallyInvalid = false): BlockSyntax {\n const active = this.#active;\n\n if (active?.kind !== \"expression\" && active?.kind !== \"jsx\" && active?.kind !== \"esm\") {\n throw new Error(\"Cannot finish a missing embedded flow leaf\");\n }\n\n this.#active = undefined;\n this.#expressionScanner = undefined;\n this.#jsxScanner = undefined;\n const authored = segmentsText(source, active.value);\n\n const javascript =\n active.kind === \"expression\"\n ? authored.slice(authored.indexOf(\"{\") + 1, authored.lastIndexOf(\"}\"))\n : authored;\n\n const boundary =\n structurallyInvalid || (active.kind === \"expression\" && javascript.trim() === \"\")\n ? undefined\n : parseJavaScriptBoundary(\n active.kind === \"jsx\" ? \"jsxExpression\" : active.kind,\n javascript,\n active.kind === \"expression\" ? active.start + authored.indexOf(\"{\") + 1 : active.start,\n );\n\n const valid =\n !structurallyInvalid &&\n ((active.kind === \"expression\" && javascript.trim() === \"\") || boundary?.kind === \"valid\");\n\n return valid\n ? { kind: active.kind, range: sourceRange(active.start, active.end) }\n : {\n kind: \"invalidMdx\",\n range: sourceRange(active.start, active.end),\n syntax: active.kind,\n // The construct is structurally closed, so later input cannot repair it.\n state: \"invalid\",\n };\n }\n\n private closeActive(end?: number): BlockSyntax {\n const active = this.#active;\n\n if (active === undefined) {\n throw new Error(\"Cannot close a missing leaf\");\n }\n\n this.#active = undefined;\n\n if (active.kind === \"paragraph\") {\n return {\n kind: \"paragraph\",\n range: sourceRange(active.start, active.end),\n input: active.lines,\n };\n }\n\n if (active.kind === \"fencedCode\") {\n return {\n kind: \"code\",\n range: sourceRange(active.start, end ?? active.end),\n value: active.value,\n fenced: true,\n language: active.language,\n meta: active.meta,\n };\n }\n\n if (active.kind === \"indentedCode\") {\n return {\n kind: \"code\",\n range: sourceRange(active.start, active.end),\n value: active.value,\n fenced: false,\n language: undefined,\n meta: undefined,\n };\n }\n\n if (active.kind === \"table\") {\n return {\n kind: \"table\",\n range: sourceRange(active.start, active.end),\n alignments: active.alignments,\n rows: active.rows,\n };\n }\n\n if (active.kind === \"frontmatter\") {\n return {\n kind: \"frontmatter\",\n range: sourceRange(active.start, end ?? active.end),\n value: sourceRange(active.valueStart, active.valueEnd),\n format: active.format,\n };\n }\n\n if (active.kind === \"math\") {\n return {\n kind: \"math\",\n range: sourceRange(active.start, end ?? active.end),\n value: active.value,\n format: active.format,\n meta: active.meta,\n };\n }\n\n if (active.kind === \"html\") {\n return {\n kind: \"rawHtml\",\n range: sourceRange(active.start, end ?? active.end),\n };\n }\n\n throw new Error(`Cannot close unimplemented ${active.kind} leaf`);\n }\n\n private interruptsParagraph(source: SourceText, line: PhysicalLine): boolean {\n if (startsParagraph(source, line.content.start)) {\n return false;\n }\n\n return (\n interruptsParagraph(source, line) ||\n recognizeLeafDirective(source, line, this.#syntax).kind === \"matched\" ||\n recognizeSameLineMath(source, line, this.#syntax).kind === \"matched\" ||\n recognizeMathFence(source, line, this.#syntax).kind === \"matched\" ||\n recognizeEmbeddedFlowStart(source, line).kind === \"matched\"\n );\n }\n}\n\ninterface EmbeddedFlowStart {\n readonly kind: \"esm\" | \"expression\" | \"jsx\";\n readonly markerEnd: number;\n}\n\n/** Unindented letters start paragraphs, except the ESM keywords import and export. */\nfunction startsParagraph(source: SourceText, start: number): boolean {\n const character = source.char(start);\n\n return isAsciiLetter(character) && character !== \"i\" && character !== \"e\";\n}\n\n/** Rejects ordinary content before slicing a potentially long, chunked line. */\nfunction isBlankLine(source: SourceText, line: PhysicalLine): boolean {\n return (\n line.content.start === line.content.end ||\n (isSpaceOrTab(source.char(line.content.start)) &&\n isBlank(source.slice(line.content.start, line.content.end)))\n );\n}\n\nfunction matchEmbeddedFlowStart(\n source: SourceText,\n line: PhysicalLine,\n): EmbeddedFlowStart | undefined {\n const start = consumeIndent(source, line.content.start, line.content.end, 3).offset;\n const content = source.slice(start, line.content.end);\n\n if (content.startsWith(\"{\")) {\n return { kind: \"expression\", markerEnd: start + 1 };\n }\n\n if (\n /^<(?:>|\\/(?:>|[A-Za-z_$][\\w$-]*(?:[.:][A-Za-z_$][\\w$-]*)*(?=[\\s>]|$))|[A-Za-z_$][\\w$-]*(?:[.:][A-Za-z_$][\\w$-]*)*(?=[\\s/{>]|$))/u.test(\n content,\n )\n ) {\n return { kind: \"jsx\", markerEnd: start + 1 };\n }\n\n if (/^(?:import\\s|export(?:\\s|\\{))/u.test(content)) {\n return { kind: \"esm\", markerEnd: start };\n }\n\n return;\n}\n\nfunction recognizeEmbeddedFlowStart(\n source: SourceText,\n line: PhysicalLine,\n): RecognizerResult<EmbeddedFlowStart> {\n const match = matchEmbeddedFlowStart(source, line);\n\n return match === undefined ? noMatch : matched(match);\n}\n\nfunction segmentsText(source: SourceText, segments: readonly InlineSegment[]): string {\n let value = \"\";\n\n for (const segment of segments) {\n value +=\n segment.kind === \"source\"\n ? source.slice(segment.range.start, segment.range.end)\n : \" \".repeat(segment.columns);\n }\n\n return value;\n}\n\n/**\n * Top-level blocks that later input cannot change. A closing list item merges\n * into a preceding list with the same marker, so only a trailing list can grow.\n */\nfunction settledLength(blocks: readonly BlockSyntax[]): number {\n return blocks.at(-1)?.kind === \"list\" ? blocks.length - 1 : blocks.length;\n}\n\nfunction appendBlock(root: BlockSyntax[], containers: ContainerFrame[], block: BlockSyntax): void {\n const parent = containers.at(-1);\n\n if (parent === undefined) {\n root.push(block);\n\n return;\n }\n\n if (parent.kind === \"directiveContainer\") {\n const children = [...parent.children, block];\n containers[containers.length - 1] = { ...parent, children };\n\n return;\n }\n\n const children = [...parent.children, block];\n const index = containers.length - 1;\n containers[index] = { ...parent, children: children };\n}\n\n/**\n * How a parser grows top-level lists. The parser pushes into item arrays it\n * owns, since only it extends them; a tail draft records its closed items\n * separately and never touches the parser's arrays.\n */\ninterface ListItemGrowth {\n draft: boolean;\n readonly owned: WeakMap<readonly ListItemSyntax[], ListItemSyntax[]>;\n}\n\nfunction appendListItem(\n root: BlockSyntax[],\n containers: ContainerFrame[],\n frame: Extract<ContainerFrame, { kind: \"listItem\" }>,\n growth: ListItemGrowth,\n): void {\n const item: ListItemSyntax = {\n range: sourceRange(frame.rangeStart, frame.end),\n checked: frame.checked,\n spread: frame.spread,\n children: frame.children,\n };\n\n const parent = containers.at(-1);\n // Top-level siblings change in place, so a growing list costs only its last entry.\n const siblings = parent === undefined ? root : [...parent.children];\n const previous = siblings.at(-1);\n\n if (\n previous?.kind === \"list\" &&\n previous.ordered === frame.ordered &&\n previous.marker === frame.markerCharacter\n ) {\n siblings[siblings.length - 1] = {\n ...previous,\n range: sourceRange(previous.range.start, frame.end),\n spread: previous.spread || previous.trailingBlank || frame.spread,\n ...grownItems(previous, item, parent === undefined ? growth : undefined),\n trailingBlank: frame.blankPending,\n };\n } else {\n siblings.push({\n kind: \"list\",\n range: sourceRange(frame.rangeStart, frame.end),\n ordered: frame.ordered,\n start: frame.start,\n spread: frame.spread,\n marker: frame.markerCharacter,\n items: [item],\n trailingBlank: frame.blankPending,\n });\n }\n\n if (parent !== undefined) {\n containers[containers.length - 1] = {\n ...parent,\n children: siblings,\n };\n }\n}\n\n/** The items after appending `item`, without copying the items a top-level list already has. */\nfunction grownItems(\n list: ListSyntax,\n item: ListItemSyntax,\n growth: ListItemGrowth | undefined,\n): Pick<ListSyntax, \"items\" | \"closing\"> {\n if (growth === undefined) {\n return { items: [...list.items, ...(list.closing ?? []), item] };\n }\n\n if (growth.draft) {\n return { items: list.items, closing: [...(list.closing ?? []), item] };\n }\n\n const owned = growth.owned.get(list.items);\n\n if (owned !== undefined) {\n owned.push(item);\n\n return { items: owned };\n }\n\n const items = [...list.items, item];\n growth.owned.set(items, items);\n\n return { items };\n}\n\nfunction continueContainer(\n source: SourceText,\n line: PhysicalLine,\n cursor: number,\n frame: ContainerFrame,\n): number | undefined {\n if (frame.kind === \"blockQuote\") {\n const marker = blockQuoteMarker(source, line.content.end, cursor);\n\n return marker?.contentStart;\n }\n\n if (frame.kind === \"listItem\") {\n if (isBlank(source.slice(cursor, line.content.end))) {\n return line.content.end;\n }\n\n return consumeColumns(source, cursor, line.content.end, frame.contentIndent);\n }\n\n if (frame.kind === \"footnoteDefinition\") {\n if (isBlank(source.slice(cursor, line.content.end))) {\n return line.content.end;\n }\n\n return consumeColumns(source, cursor, line.content.end, frame.contentIndent);\n }\n\n if (frame.kind === \"directiveContainer\") {\n return cursor;\n }\n\n return;\n}\n\nfunction openContainers(\n source: SourceText,\n line: PhysicalLine,\n initialCursor: number,\n containers: ContainerFrame[],\n syntax: ResolvedSyntaxOptions,\n): number {\n let cursor = initialCursor;\n\n while (cursor < line.content.end) {\n if (isAsciiLetter(source.char(cursor))) {\n break;\n }\n\n const quote = blockQuoteMarker(source, line.content.end, cursor);\n\n if (quote !== undefined) {\n containers.push({\n kind: \"blockQuote\",\n marker: sourceRange(quote.markerStart, quote.markerEnd),\n contentIndent: quote.contentStart - quote.markerEnd,\n start: quote.markerStart,\n end: line.range.end,\n children: [],\n });\n cursor = quote.contentStart;\n continue;\n }\n\n const footnote = footnoteMarker(source, line.content.end, cursor);\n\n if (footnote !== undefined) {\n containers.push({\n kind: \"footnoteDefinition\",\n marker: sourceRange(footnote.markerStart, footnote.markerEnd),\n identifier: footnote.identifier,\n contentIndent: 4,\n start: footnote.markerStart,\n end: line.range.end,\n children: [],\n });\n cursor = footnote.contentStart;\n continue;\n }\n\n const directive = syntax.directives\n ? directiveContainerMarker(source, line.content.end, cursor)\n : undefined;\n\n if (directive !== undefined) {\n containers.push({\n kind: \"directiveContainer\",\n marker: sourceRange(directive.markerStart, directive.markerEnd),\n name: directive.name,\n fenceLength: directive.fenceLength,\n start: directive.markerStart,\n end: line.range.end,\n children: [],\n label: directive.label,\n attributes: directive.attributes,\n });\n cursor = line.content.end;\n continue;\n }\n\n const adjusted = contentLine(line, cursor);\n\n if (recognizeThematicBreak(source, adjusted).kind === \"matched\") {\n break;\n }\n\n const list = listMarker(source, line.content.end, cursor);\n\n if (list === undefined) {\n break;\n }\n\n containers.push({\n kind: \"listItem\",\n marker: sourceRange(list.markerStart, list.markerEnd),\n markerCharacter: list.markerCharacter,\n contentIndent: list.contentIndent,\n ordered: list.ordered,\n start: list.start,\n checked: undefined,\n spread: false,\n blankPending: false,\n rangeStart: list.markerStart,\n end: line.range.end,\n children: [],\n });\n cursor = list.contentStart;\n }\n\n return cursor;\n}\n\nfunction opensContainer(\n source: SourceText,\n line: PhysicalLine,\n syntax: ResolvedSyntaxOptions,\n): boolean {\n if (isAsciiLetter(source.char(line.content.start))) {\n return false;\n }\n\n return (\n blockQuoteMarker(source, line.content.end, line.content.start) !== undefined ||\n footnoteMarker(source, line.content.end, line.content.start) !== undefined ||\n (syntax.directives &&\n directiveContainerMarker(source, line.content.end, line.content.start) !== undefined) ||\n (recognizeThematicBreak(source, line).kind !== \"matched\" &&\n listMarker(source, line.content.end, line.content.start, true) !== undefined)\n );\n}\n\nfunction consumeColumns(\n source: SourceText,\n start: number,\n end: number,\n required: number,\n): number | undefined {\n const indent = consumeIndent(source, start, end, required);\n\n return indent.columns >= required ? indent.offset : undefined;\n}\n\nfunction indentedCodeLine(\n source: SourceText,\n line: PhysicalLine,\n): readonly InlineSegment[] | undefined {\n const contentStart = consumeColumns(source, line.content.start, line.content.end, 4);\n\n return contentStart === undefined\n ? undefined\n : [\n {\n kind: \"source\",\n range: sourceRange(contentStart, line.range.end),\n },\n ];\n}\n\n/** Records a blank line in the trailing list items that directly contain it. */\nfunction markListBlank(containers: ContainerFrame[]): void {\n for (let index = containers.length - 1; index >= 0; index--) {\n const frame = containers[index];\n\n if (frame.kind !== \"listItem\") {\n return;\n }\n\n containers[index] = { ...frame, blankPending: true };\n }\n}\n\n/**\n * Resolves pending blank lines once content arrives. Only the deepest surviving\n * item receives a new direct child after the blank line, which makes it loose. A\n * new sibling item of a nested list keeps the blank inside that nested list.\n */\nfunction settleListBlank(containers: ContainerFrame[], surviving: number): void {\n const opened = containers[surviving];\n\n for (let index = 0; index < surviving; index++) {\n const frame = containers[index];\n\n if (frame.kind !== \"listItem\" || !frame.blankPending) {\n continue;\n }\n\n const last = frame.children.at(-1);\n\n const nestedSibling =\n opened?.kind === \"listItem\" &&\n last?.kind === \"list\" &&\n last.ordered === opened.ordered &&\n last.marker === opened.markerCharacter;\n\n containers[index] = {\n ...frame,\n blankPending: false,\n spread: frame.spread || (index === surviving - 1 && !nestedSibling),\n };\n }\n}\n\nfunction contentLine(line: PhysicalLine, contentStart: number): PhysicalLine {\n if (line.range.start === contentStart) {\n return line;\n }\n\n return {\n line: line.line,\n range: sourceRange(contentStart, line.range.end),\n content: sourceRange(contentStart, line.content.end),\n ending: line.ending,\n };\n}\n\n/**\n * Parses a nested flow region, such as multi-line JSX children, with offsets in\n * the enclosing source. Frontmatter is never recognized inside the region.\n */\nexport function parseFlowRange(\n source: SourceText,\n range: SourceRange,\n syntax: ResolvedSyntaxOptions,\n): readonly BlockSyntax[] {\n const scanner = new PhysicalLineScanner({ offset: range.start });\n const parser = new BlockParser({ ...syntax, frontmatter: [] });\n\n for (const physicalLine of [\n ...scanner.append(source.slice(range.start, range.end)),\n ...scanner.complete(),\n ]) {\n parser.write(source, physicalLine);\n }\n\n return parser.finish(source);\n}\n\n/** An embedded flow line from its content to the end of the line, including the ending. */\nfunction embeddedSegment(line: PhysicalLine): InlineSegment {\n return { kind: \"source\", range: sourceRange(line.content.start, line.range.end) };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
import { SourceRange } from "../ranges.mjs";
|
|
2
|
+
import { FrontmatterFormat, MathFormat } from "../syntax-options.mjs";
|
|
3
|
+
import { CommittedJsxOpening } from "./embedded-scanner.mjs";
|
|
4
|
+
import { InlineSegment } from "./inline-input.mjs";
|
|
5
|
+
//#region src/parser/block-syntax.d.ts
|
|
6
|
+
interface ContainerFrameBase {
|
|
7
|
+
readonly marker: SourceRange;
|
|
8
|
+
readonly children: readonly BlockSyntax[];
|
|
9
|
+
readonly end: number;
|
|
10
|
+
}
|
|
11
|
+
export interface BlockQuoteFrame extends ContainerFrameBase {
|
|
12
|
+
readonly kind: "blockQuote";
|
|
13
|
+
readonly contentIndent: number;
|
|
14
|
+
readonly start: number;
|
|
15
|
+
}
|
|
16
|
+
export interface ListItemFrame extends ContainerFrameBase {
|
|
17
|
+
readonly kind: "listItem";
|
|
18
|
+
readonly markerCharacter: "." | ")" | "*" | "+" | "-";
|
|
19
|
+
readonly contentIndent: number;
|
|
20
|
+
readonly ordered: boolean;
|
|
21
|
+
readonly start: number | undefined;
|
|
22
|
+
readonly checked: boolean | undefined;
|
|
23
|
+
readonly spread: boolean;
|
|
24
|
+
readonly blankPending: boolean;
|
|
25
|
+
readonly rangeStart: number;
|
|
26
|
+
}
|
|
27
|
+
export interface DirectiveContainerFrame extends ContainerFrameBase {
|
|
28
|
+
readonly kind: "directiveContainer";
|
|
29
|
+
readonly name: string;
|
|
30
|
+
readonly fenceLength: number;
|
|
31
|
+
readonly start: number;
|
|
32
|
+
readonly label: readonly InlineSegment[] | undefined;
|
|
33
|
+
readonly attributes: readonly DirectiveAttributeSyntax[];
|
|
34
|
+
}
|
|
35
|
+
export interface FootnoteDefinitionFrame extends ContainerFrameBase {
|
|
36
|
+
readonly kind: "footnoteDefinition";
|
|
37
|
+
readonly identifier: string;
|
|
38
|
+
readonly contentIndent: number;
|
|
39
|
+
readonly start: number;
|
|
40
|
+
}
|
|
41
|
+
export type ContainerFrame = BlockQuoteFrame | ListItemFrame | DirectiveContainerFrame | FootnoteDefinitionFrame;
|
|
42
|
+
interface OpenLeafBase {
|
|
43
|
+
readonly start: number;
|
|
44
|
+
readonly end: number;
|
|
45
|
+
}
|
|
46
|
+
export interface OpenParagraph extends OpenLeafBase {
|
|
47
|
+
readonly kind: "paragraph";
|
|
48
|
+
readonly lines: readonly InlineSegment[];
|
|
49
|
+
readonly pendingEnding: SourceRange;
|
|
50
|
+
}
|
|
51
|
+
export interface OpenFencedCode extends OpenLeafBase {
|
|
52
|
+
readonly kind: "fencedCode";
|
|
53
|
+
readonly value: readonly InlineSegment[];
|
|
54
|
+
readonly marker: "`" | "~";
|
|
55
|
+
readonly fenceLength: number;
|
|
56
|
+
readonly language: SourceRange | undefined;
|
|
57
|
+
readonly meta: SourceRange | undefined;
|
|
58
|
+
}
|
|
59
|
+
export interface OpenIndentedCode extends OpenLeafBase {
|
|
60
|
+
readonly kind: "indentedCode";
|
|
61
|
+
readonly value: readonly InlineSegment[];
|
|
62
|
+
readonly pendingBlank: readonly InlineSegment[];
|
|
63
|
+
}
|
|
64
|
+
export interface OpenHtml extends OpenLeafBase {
|
|
65
|
+
readonly kind: "html";
|
|
66
|
+
readonly closing: "-->" | ">" | "?>" | "]]>";
|
|
67
|
+
}
|
|
68
|
+
export interface OpenFrontmatter extends OpenLeafBase {
|
|
69
|
+
readonly kind: "frontmatter";
|
|
70
|
+
readonly valueStart: number;
|
|
71
|
+
readonly valueEnd: number;
|
|
72
|
+
readonly format: FrontmatterFormat;
|
|
73
|
+
readonly fence: "---" | "+++";
|
|
74
|
+
}
|
|
75
|
+
export interface OpenMath extends OpenLeafBase {
|
|
76
|
+
readonly kind: "math";
|
|
77
|
+
readonly value: readonly InlineSegment[];
|
|
78
|
+
readonly format: MathFormat;
|
|
79
|
+
readonly fence: "dollar" | "tex";
|
|
80
|
+
readonly fenceLength: number;
|
|
81
|
+
readonly meta: SourceRange | undefined;
|
|
82
|
+
}
|
|
83
|
+
interface OpenEmbeddedLeaf extends OpenLeafBase {
|
|
84
|
+
readonly value: readonly InlineSegment[];
|
|
85
|
+
}
|
|
86
|
+
export interface OpenJsx extends OpenEmbeddedLeaf {
|
|
87
|
+
readonly kind: "jsx";
|
|
88
|
+
}
|
|
89
|
+
export interface OpenExpression extends OpenEmbeddedLeaf {
|
|
90
|
+
readonly kind: "expression";
|
|
91
|
+
}
|
|
92
|
+
export interface OpenEsm extends OpenEmbeddedLeaf {
|
|
93
|
+
readonly kind: "esm";
|
|
94
|
+
}
|
|
95
|
+
export interface OpenTable extends OpenLeafBase {
|
|
96
|
+
readonly kind: "table";
|
|
97
|
+
readonly alignments: readonly TableAlignmentSyntax[];
|
|
98
|
+
readonly rows: readonly TableRowSyntax[];
|
|
99
|
+
}
|
|
100
|
+
export type OpenLeaf = OpenParagraph | OpenFencedCode | OpenIndentedCode | OpenHtml | OpenFrontmatter | OpenMath | OpenJsx | OpenExpression | OpenEsm | OpenTable;
|
|
101
|
+
interface BlockSyntaxBase {
|
|
102
|
+
readonly range: SourceRange;
|
|
103
|
+
}
|
|
104
|
+
export interface ParagraphSyntax extends BlockSyntaxBase {
|
|
105
|
+
readonly kind: "paragraph";
|
|
106
|
+
readonly input: readonly InlineSegment[];
|
|
107
|
+
}
|
|
108
|
+
export interface HeadingSyntax extends BlockSyntaxBase {
|
|
109
|
+
readonly kind: "heading";
|
|
110
|
+
readonly depth: 1 | 2 | 3 | 4 | 5 | 6;
|
|
111
|
+
readonly input: readonly InlineSegment[];
|
|
112
|
+
}
|
|
113
|
+
export interface CodeSyntax extends BlockSyntaxBase {
|
|
114
|
+
readonly kind: "code";
|
|
115
|
+
readonly value: readonly InlineSegment[];
|
|
116
|
+
readonly fenced: boolean;
|
|
117
|
+
readonly language: SourceRange | undefined;
|
|
118
|
+
readonly meta: SourceRange | undefined;
|
|
119
|
+
}
|
|
120
|
+
export interface ThematicBreakSyntax extends BlockSyntaxBase {
|
|
121
|
+
readonly kind: "thematicBreak";
|
|
122
|
+
}
|
|
123
|
+
export interface BlockQuoteSyntax extends BlockSyntaxBase {
|
|
124
|
+
readonly kind: "blockQuote";
|
|
125
|
+
readonly children: readonly BlockSyntax[];
|
|
126
|
+
}
|
|
127
|
+
export interface ListSyntax extends BlockSyntaxBase {
|
|
128
|
+
readonly kind: "list";
|
|
129
|
+
readonly ordered: boolean;
|
|
130
|
+
readonly start: number | undefined;
|
|
131
|
+
readonly spread: boolean;
|
|
132
|
+
readonly marker: "." | ")" | "*" | "+" | "-";
|
|
133
|
+
readonly items: readonly ListItemSyntax[];
|
|
134
|
+
/**
|
|
135
|
+
* Items a tail draft closed after `items`. A draft keeps the parser's item
|
|
136
|
+
* array instead of copying it, so finishing the open tail costs only its items.
|
|
137
|
+
*/
|
|
138
|
+
readonly closing?: readonly ListItemSyntax[];
|
|
139
|
+
readonly trailingBlank: boolean;
|
|
140
|
+
}
|
|
141
|
+
export interface DefinitionSyntax extends BlockSyntaxBase {
|
|
142
|
+
readonly kind: "definition";
|
|
143
|
+
readonly identifier: string;
|
|
144
|
+
readonly destination: SourceRange;
|
|
145
|
+
readonly title: SourceRange | undefined;
|
|
146
|
+
}
|
|
147
|
+
export interface FootnoteDefinitionSyntax extends BlockSyntaxBase {
|
|
148
|
+
readonly kind: "footnoteDefinition";
|
|
149
|
+
readonly identifier: string;
|
|
150
|
+
readonly children: readonly BlockSyntax[];
|
|
151
|
+
}
|
|
152
|
+
export interface RawHtmlSyntax extends BlockSyntaxBase {
|
|
153
|
+
readonly kind: "rawHtml";
|
|
154
|
+
}
|
|
155
|
+
export interface FrontmatterSyntax extends BlockSyntaxBase {
|
|
156
|
+
readonly kind: "frontmatter";
|
|
157
|
+
readonly value: SourceRange;
|
|
158
|
+
readonly format: FrontmatterFormat;
|
|
159
|
+
}
|
|
160
|
+
export interface DirectiveSyntax extends BlockSyntaxBase {
|
|
161
|
+
readonly kind: "directive";
|
|
162
|
+
readonly name: string;
|
|
163
|
+
readonly label: readonly InlineSegment[] | undefined;
|
|
164
|
+
readonly attributes: readonly DirectiveAttributeSyntax[];
|
|
165
|
+
readonly children: readonly BlockSyntax[];
|
|
166
|
+
}
|
|
167
|
+
export interface LeafDirectiveSyntax extends BlockSyntaxBase {
|
|
168
|
+
readonly kind: "leafDirective";
|
|
169
|
+
readonly name: string;
|
|
170
|
+
readonly label: readonly InlineSegment[] | undefined;
|
|
171
|
+
readonly attributes: readonly DirectiveAttributeSyntax[];
|
|
172
|
+
}
|
|
173
|
+
export interface MathSyntax extends BlockSyntaxBase {
|
|
174
|
+
readonly kind: "math";
|
|
175
|
+
readonly value: readonly InlineSegment[];
|
|
176
|
+
readonly format: MathFormat;
|
|
177
|
+
readonly meta: SourceRange | undefined;
|
|
178
|
+
}
|
|
179
|
+
export interface TableSyntax extends BlockSyntaxBase {
|
|
180
|
+
readonly kind: "table";
|
|
181
|
+
readonly alignments: readonly TableAlignmentSyntax[];
|
|
182
|
+
readonly rows: readonly TableRowSyntax[];
|
|
183
|
+
}
|
|
184
|
+
export interface JsxSyntax extends BlockSyntaxBase {
|
|
185
|
+
readonly kind: "jsx";
|
|
186
|
+
}
|
|
187
|
+
export interface ExpressionSyntax extends BlockSyntaxBase {
|
|
188
|
+
readonly kind: "expression";
|
|
189
|
+
}
|
|
190
|
+
export interface EsmSyntax extends BlockSyntaxBase {
|
|
191
|
+
readonly kind: "esm";
|
|
192
|
+
}
|
|
193
|
+
export interface InvalidMdxSyntax extends BlockSyntaxBase {
|
|
194
|
+
readonly opening?: CommittedJsxOpening;
|
|
195
|
+
readonly kind: "invalidMdx";
|
|
196
|
+
readonly syntax: "jsx" | "expression" | "esm";
|
|
197
|
+
readonly state: "incomplete" | "invalid";
|
|
198
|
+
}
|
|
199
|
+
export type BlockSyntax = ParagraphSyntax | HeadingSyntax | CodeSyntax | ThematicBreakSyntax | BlockQuoteSyntax | ListSyntax | DefinitionSyntax | FootnoteDefinitionSyntax | RawHtmlSyntax | FrontmatterSyntax | DirectiveSyntax | LeafDirectiveSyntax | MathSyntax | TableSyntax | JsxSyntax | ExpressionSyntax | EsmSyntax | InvalidMdxSyntax;
|
|
200
|
+
export interface ListItemSyntax {
|
|
201
|
+
readonly range: SourceRange;
|
|
202
|
+
readonly checked: boolean | undefined;
|
|
203
|
+
readonly spread: boolean;
|
|
204
|
+
readonly children: readonly BlockSyntax[];
|
|
205
|
+
}
|
|
206
|
+
export interface TableRowSyntax {
|
|
207
|
+
readonly range: SourceRange;
|
|
208
|
+
readonly cells: readonly (readonly InlineSegment[])[];
|
|
209
|
+
}
|
|
210
|
+
export type TableAlignmentSyntax = "center" | "left" | "none" | "right";
|
|
211
|
+
export interface DirectiveAttributeSyntax {
|
|
212
|
+
readonly name: string;
|
|
213
|
+
readonly value: string;
|
|
214
|
+
}
|
|
215
|
+
export type PendingParagraphSyntax = ParagraphSyntax;
|
|
216
|
+
export interface PendingFencedCodeSyntax extends BlockSyntaxBase {
|
|
217
|
+
readonly kind: "fencedCode";
|
|
218
|
+
readonly value: readonly InlineSegment[];
|
|
219
|
+
readonly language: SourceRange | undefined;
|
|
220
|
+
readonly meta: SourceRange | undefined;
|
|
221
|
+
}
|
|
222
|
+
export interface PendingMathSyntax extends BlockSyntaxBase {
|
|
223
|
+
readonly kind: "math";
|
|
224
|
+
readonly value: readonly InlineSegment[];
|
|
225
|
+
readonly format: MathFormat;
|
|
226
|
+
}
|
|
227
|
+
export interface PendingJsxSyntax extends BlockSyntaxBase {
|
|
228
|
+
readonly opening: CommittedJsxOpening | undefined;
|
|
229
|
+
readonly kind: "jsx";
|
|
230
|
+
}
|
|
231
|
+
export interface PendingExpressionSyntax extends BlockSyntaxBase {
|
|
232
|
+
readonly kind: "expression";
|
|
233
|
+
}
|
|
234
|
+
export interface PendingEsmSyntax extends BlockSyntaxBase {
|
|
235
|
+
readonly kind: "esm";
|
|
236
|
+
}
|
|
237
|
+
export type PendingBlockSyntax = PendingParagraphSyntax | PendingFencedCodeSyntax | PendingMathSyntax | PendingJsxSyntax | PendingExpressionSyntax | PendingEsmSyntax;
|
|
238
|
+
//#endregion
|
|
239
|
+
export {};
|
|
240
|
+
//# sourceMappingURL=block-syntax.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"block-syntax.d.mts","names":[],"sources":["../../src/parser/block-syntax.ts"],"mappings":";;;;;UAKU;WACC,QAAQ;WACR,mBAAmB;WACnB;;iBAGM,wBAAwB;WAC9B;WACA;WACA;;iBAGM,sBAAsB;WAC5B;WACA;WACA;WACA;WACA;WACA;WACA;WAEA;WACA;;iBAGM,gCAAgC;WACtC;WACA;WACA;WACA;WACA,gBAAgB;WAChB,qBAAqB;;iBAGf,gCAAgC;WACtC;WACA;WACA;WACA;;YAGC,iBACR,kBACA,gBACA,0BACA;UAEM;WACC;WACA;;iBAGM,sBAAsB;WAC5B;WACA,gBAAgB;WAChB,eAAe;;iBAGT,uBAAuB;WAC7B;WACA,gBAAgB;WAChB;WACA;WACA,UAAU;WACV,MAAM;;iBAGA,yBAAyB;WAC/B;WACA,gBAAgB;WAChB,uBAAuB;;iBAGjB,iBAAiB;WACvB;WACA;;iBAGM,wBAAwB;WAC9B;WACA;WACA;WACA,QAAQ;WACR;;iBAGM,iBAAiB;WACvB;WACA,gBAAgB;WAChB,QAAQ;WACR;WACA;WACA,MAAM;;UAGP,yBAAyB;WACxB,gBAAgB;;iBAGV,gBAAgB;WACtB;;iBAGM,uBAAuB;WAC7B;;iBAGM,gBAAgB;WACtB;;iBAGM,kBAAkB;WACxB;WACA,qBAAqB;WACrB,eAAe;;YAGd,WACR,gBACA,iBACA,mBACA,WACA,kBACA,WACA,UACA,iBACA,UACA;UAEM;WACC,OAAO;;iBAGD,wBAAwB;WAC9B;WACA,gBAAgB;;iBAGV,sBAAsB;WAC5B;WACA;WACA,gBAAgB;;iBAGV,mBAAmB;WACzB;WACA,gBAAgB;WAChB;WACA,UAAU;WACV,MAAM;;iBAGA,4BAA4B;WAClC;;iBAGM,yBAAyB;WAC/B;WACA,mBAAmB;;iBAGb,mBAAmB;WACzB;WACA;WACA;WACA;WACA;WACA,gBAAgB;;;;;WAKhB,mBAAmB;WAEnB;;iBAGM,yBAAyB;WAC/B;WACA;WACA,aAAa;WACb,OAAO;;iBAGD,iCAAiC;WACvC;WACA;WACA,mBAAmB;;iBAGb,sBAAsB;WAC5B;;iBAGM,0BAA0B;WAChC;WACA,OAAO;WACP,QAAQ;;iBAGF,wBAAwB;WAC9B;WACA;WACA,gBAAgB;WAChB,qBAAqB;WACrB,mBAAmB;;iBAGb,4BAA4B;WAClC;WACA;WACA,gBAAgB;WAChB,qBAAqB;;iBAGf,mBAAmB;WACzB;WACA,gBAAgB;WAChB,QAAQ;WACR,MAAM;;iBAGA,oBAAoB;WAC1B;WACA,qBAAqB;WACrB,eAAe;;iBAGT,kBAAkB;WACxB;;iBAGM,yBAAyB;WAC/B;;iBAGM,kBAAkB;WACxB;;iBAGM,yBAAyB;WAC/B,UAAU;WACV;WACA;WACA;;YAGC,cACR,kBACA,gBACA,aACA,sBACA,mBACA,aACA,mBACA,2BACA,gBACA,oBACA,kBACA,sBACA,aACA,cACA,YACA,mBACA,YACA;iBAEa;WACN,OAAO;WACP;WACA;WACA,mBAAmB;;iBAGb;WACN,OAAO;WACP,0BAA0B;;YAGzB;iBAEK;WACN;WACA;;YAGC,yBAAyB;iBAEpB,gCAAgC;WACtC;WACA,gBAAgB;WAChB,UAAU;WACV,MAAM;;iBAGA,0BAA0B;WAChC;WACA,gBAAgB;WAChB,QAAQ;;iBAGF,yBAAyB;WAC/B,SAAS;WACT;;iBAGM,gCAAgC;WACtC;;iBAGM,yBAAyB;WAC/B;;YAGC,qBACR,yBACA,0BACA,oBACA,mBACA,0BACA"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { SourceText } from "../source-text.mjs";
|
|
2
|
+
//#region src/parser/characters.d.ts
|
|
3
|
+
export declare function isAsciiDigit(value: string | undefined): boolean;
|
|
4
|
+
export declare function isAsciiLetter(value: string | undefined): boolean;
|
|
5
|
+
export declare function isSpaceOrTab(value: string | undefined): boolean;
|
|
6
|
+
export declare function isBlank(value: string): boolean;
|
|
7
|
+
export declare function findUnescaped(source: SourceText, target: string, start: number, end: number): number | undefined;
|
|
8
|
+
export declare function isEscaped(source: SourceText, offset: number, lowerBound: number): boolean;
|
|
9
|
+
export declare function isAsciiPunctuation(value: string): boolean;
|
|
10
|
+
export declare function isUnicodeWhitespace(value: string): boolean;
|
|
11
|
+
export declare function isUnicodePunctuation(value: string): boolean;
|
|
12
|
+
export interface ConsumedIndent {
|
|
13
|
+
readonly offset: number;
|
|
14
|
+
readonly columns: number;
|
|
15
|
+
}
|
|
16
|
+
/** Consumes source indentation using four-column tab stops. */
|
|
17
|
+
export declare function consumeIndent(source: SourceText, start: number, end: number, maximum: number): ConsumedIndent;
|
|
18
|
+
//#endregion
|
|
19
|
+
//# sourceMappingURL=characters.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"characters.d.mts","names":[],"sources":["../../src/parser/characters.ts"],"mappings":";;wBAMgB,aAAa;wBAIb,cAAc;wBAId,aAAa;wBAIb,QAAQ;wBAUR,cACd,QAAQ,YACR,gBACA,eACA;wBAWc,UAAU,QAAQ,YAAY,gBAAgB;wBAU9C,mBAAmB;wBASnB,oBAAoB;wBAIpB,qBAAqB;iBAIpB;WACN;WACA;;;wBAIK,cACd,QAAQ,YACR,eACA,aACA,kBACC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { nextTabColumn } from "../source.mjs";
|
|
2
|
+
//#region src/parser/characters.ts
|
|
3
|
+
function isAsciiDigit(value) {
|
|
4
|
+
return value !== void 0 && value >= "0" && value <= "9";
|
|
5
|
+
}
|
|
6
|
+
function isAsciiLetter(value) {
|
|
7
|
+
return value !== void 0 && /^[A-Za-z]$/u.test(value);
|
|
8
|
+
}
|
|
9
|
+
function isSpaceOrTab(value) {
|
|
10
|
+
return value === " " || value === " ";
|
|
11
|
+
}
|
|
12
|
+
function isBlank(value) {
|
|
13
|
+
for (const character of value) if (!isSpaceOrTab(character)) return false;
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
function findUnescaped(source, target, start, end) {
|
|
17
|
+
for (let offset = start; offset < end; offset++) if (source.char(offset) === target && !isEscaped(source, offset, start)) return offset;
|
|
18
|
+
}
|
|
19
|
+
function isEscaped(source, offset, lowerBound) {
|
|
20
|
+
let slashes = 0;
|
|
21
|
+
for (let index = offset - 1; index >= lowerBound && source.char(index) === "\\"; index--) slashes++;
|
|
22
|
+
return slashes % 2 === 1;
|
|
23
|
+
}
|
|
24
|
+
function isAsciiPunctuation(value) {
|
|
25
|
+
return value >= "!" && value <= "/" || value >= ":" && value <= "@" || value >= "[" && value <= "`" || value >= "{" && value <= "~";
|
|
26
|
+
}
|
|
27
|
+
function isUnicodeWhitespace(value) {
|
|
28
|
+
return /^\s$/u.test(value);
|
|
29
|
+
}
|
|
30
|
+
function isUnicodePunctuation(value) {
|
|
31
|
+
return value < "" ? isAsciiPunctuation(value) : /^[\p{P}\p{S}]$/u.test(value);
|
|
32
|
+
}
|
|
33
|
+
/** Consumes source indentation using four-column tab stops. */
|
|
34
|
+
function consumeIndent(source, start, end, maximum) {
|
|
35
|
+
let column = 1;
|
|
36
|
+
let offset = start;
|
|
37
|
+
while (offset < end) {
|
|
38
|
+
const character = source.char(offset);
|
|
39
|
+
const next = character === " " ? column + 1 : character === " " ? nextTabColumn(column) : column;
|
|
40
|
+
if (next === column || next - 1 > maximum) break;
|
|
41
|
+
column = next;
|
|
42
|
+
offset++;
|
|
43
|
+
}
|
|
44
|
+
return Object.freeze({
|
|
45
|
+
offset,
|
|
46
|
+
columns: column - 1
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
//#endregion
|
|
50
|
+
export { consumeIndent, findUnescaped, isAsciiDigit, isAsciiLetter, isAsciiPunctuation, isBlank, isEscaped, isSpaceOrTab, isUnicodePunctuation, isUnicodeWhitespace };
|
|
51
|
+
|
|
52
|
+
//# sourceMappingURL=characters.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"characters.mjs","names":[],"sources":["../../src/parser/characters.ts"],"sourcesContent":["import type { SourceText } from \"../source-text.ts\";\n\nimport { nextTabColumn } from \"../source.ts\";\n\n// Maybe refactor?\n\nexport function isAsciiDigit(value: string | undefined): boolean {\n return value !== undefined && value >= \"0\" && value <= \"9\";\n}\n\nexport function isAsciiLetter(value: string | undefined): boolean {\n return value !== undefined && /^[A-Za-z]$/u.test(value);\n}\n\nexport function isSpaceOrTab(value: string | undefined): boolean {\n return value === \" \" || value === \"\\t\";\n}\n\nexport function isBlank(value: string): boolean {\n for (const character of value) {\n if (!isSpaceOrTab(character)) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function findUnescaped(\n source: SourceText,\n target: string,\n start: number,\n end: number,\n): number | undefined {\n for (let offset = start; offset < end; offset++) {\n if (source.char(offset) === target && !isEscaped(source, offset, start)) {\n return offset;\n }\n }\n\n return;\n}\n\nexport function isEscaped(source: SourceText, offset: number, lowerBound: number): boolean {\n let slashes = 0;\n\n for (let index = offset - 1; index >= lowerBound && source.char(index) === \"\\\\\"; index--) {\n slashes++;\n }\n\n return slashes % 2 === 1;\n}\n\nexport function isAsciiPunctuation(value: string): boolean {\n return (\n (value >= \"!\" && value <= \"/\") ||\n (value >= \":\" && value <= \"@\") ||\n (value >= \"[\" && value <= \"`\") ||\n (value >= \"{\" && value <= \"~\")\n );\n}\n\nexport function isUnicodeWhitespace(value: string): boolean {\n return /^\\s$/u.test(value);\n}\n\nexport function isUnicodePunctuation(value: string): boolean {\n return value < \"\\x80\" ? isAsciiPunctuation(value) : /^[\\p{P}\\p{S}]$/u.test(value);\n}\n\nexport interface ConsumedIndent {\n readonly offset: number;\n readonly columns: number;\n}\n\n/** Consumes source indentation using four-column tab stops. */\nexport function consumeIndent(\n source: SourceText,\n start: number,\n end: number,\n maximum: number,\n): ConsumedIndent {\n let column = 1;\n let offset = start;\n\n while (offset < end) {\n const character = source.char(offset);\n\n const next =\n character === \" \" ? column + 1 : character === \"\\t\" ? nextTabColumn(column) : column;\n\n if (next === column || next - 1 > maximum) {\n break;\n }\n\n column = next;\n offset++;\n }\n\n return Object.freeze({ offset, columns: column - 1 });\n}\n"],"mappings":";;AAMA,SAAgB,aAAa,OAAoC;CAC/D,OAAO,UAAU,KAAA,KAAa,SAAS,OAAO,SAAS;AACzD;AAEA,SAAgB,cAAc,OAAoC;CAChE,OAAO,UAAU,KAAA,KAAa,cAAc,KAAK,KAAK;AACxD;AAEA,SAAgB,aAAa,OAAoC;CAC/D,OAAO,UAAU,OAAO,UAAU;AACpC;AAEA,SAAgB,QAAQ,OAAwB;CAC9C,KAAK,MAAM,aAAa,OACtB,IAAI,CAAC,aAAa,SAAS,GACzB,OAAO;CAIX,OAAO;AACT;AAEA,SAAgB,cACd,QACA,QACA,OACA,KACoB;CACpB,KAAK,IAAI,SAAS,OAAO,SAAS,KAAK,UACrC,IAAI,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC,UAAU,QAAQ,QAAQ,KAAK,GACpE,OAAO;AAKb;AAEA,SAAgB,UAAU,QAAoB,QAAgB,YAA6B;CACzF,IAAI,UAAU;CAEd,KAAK,IAAI,QAAQ,SAAS,GAAG,SAAS,cAAc,OAAO,KAAK,KAAK,MAAM,MAAM,SAC/E;CAGF,OAAO,UAAU,MAAM;AACzB;AAEA,SAAgB,mBAAmB,OAAwB;CACzD,OACG,SAAS,OAAO,SAAS,OACzB,SAAS,OAAO,SAAS,OACzB,SAAS,OAAO,SAAS,OACzB,SAAS,OAAO,SAAS;AAE9B;AAEA,SAAgB,oBAAoB,OAAwB;CAC1D,OAAO,QAAQ,KAAK,KAAK;AAC3B;AAEA,SAAgB,qBAAqB,OAAwB;CAC3D,OAAO,QAAQ,MAAS,mBAAmB,KAAK,IAAI,kBAAkB,KAAK,KAAK;AAClF;;AAQA,SAAgB,cACd,QACA,OACA,KACA,SACgB;CAChB,IAAI,SAAS;CACb,IAAI,SAAS;CAEb,OAAO,SAAS,KAAK;EACnB,MAAM,YAAY,OAAO,KAAK,MAAM;EAEpC,MAAM,OACJ,cAAc,MAAM,SAAS,IAAI,cAAc,MAAO,cAAc,MAAM,IAAI;EAEhF,IAAI,SAAS,UAAU,OAAO,IAAI,SAChC;EAGF,SAAS;EACT;CACF;CAEA,OAAO,OAAO,OAAO;EAAE;EAAQ,SAAS,SAAS;CAAE,CAAC;AACtD"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
//#region src/parser/config.d.ts
|
|
2
|
+
export interface ParserLimits {
|
|
3
|
+
readonly maximumNestingDepth?: number;
|
|
4
|
+
readonly maximumNodes?: number;
|
|
5
|
+
readonly maximumSourceLength?: number;
|
|
6
|
+
}
|
|
7
|
+
export type ParserLimit = keyof Required<ParserLimits> | "maximumPendingBlockLength";
|
|
8
|
+
export interface ResolvedParserLimits {
|
|
9
|
+
readonly maximumNestingDepth: number;
|
|
10
|
+
readonly maximumNodes: number;
|
|
11
|
+
readonly maximumSourceLength: number;
|
|
12
|
+
}
|
|
13
|
+
export declare const defaultParserLimits: ResolvedParserLimits;
|
|
14
|
+
export declare function resolveParserLimits(options?: ParserLimits): ResolvedParserLimits;
|
|
15
|
+
//#endregion
|
|
16
|
+
//# sourceMappingURL=config.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.mts","names":[],"sources":["../../src/parser/config.ts"],"mappings":";iBAEiB;WACN;WACA;WACA;;YAGC,oBAAoB,SAAS;iBAExB;WACN;WACA;WACA;;qBAGE,qBAAqB;wBAMlB,oBAAoB,UAAS,eAAoB"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { ConfigurationError } from "../errors.mjs";
|
|
2
|
+
//#region src/parser/config.ts
|
|
3
|
+
const defaultParserLimits = Object.freeze({
|
|
4
|
+
maximumNestingDepth: 1024,
|
|
5
|
+
maximumNodes: 1e6,
|
|
6
|
+
maximumSourceLength: 16777216
|
|
7
|
+
});
|
|
8
|
+
function resolveParserLimits(options = {}) {
|
|
9
|
+
const limits = {
|
|
10
|
+
maximumNestingDepth: options.maximumNestingDepth ?? defaultParserLimits.maximumNestingDepth,
|
|
11
|
+
maximumNodes: options.maximumNodes ?? defaultParserLimits.maximumNodes,
|
|
12
|
+
maximumSourceLength: options.maximumSourceLength ?? defaultParserLimits.maximumSourceLength
|
|
13
|
+
};
|
|
14
|
+
validateParserLimit("maximumNestingDepth", limits.maximumNestingDepth, 1);
|
|
15
|
+
validateParserLimit("maximumNodes", limits.maximumNodes, 1);
|
|
16
|
+
validateParserLimit("maximumSourceLength", limits.maximumSourceLength, 0);
|
|
17
|
+
return limits;
|
|
18
|
+
}
|
|
19
|
+
function validateParserLimit(option, value, minimum) {
|
|
20
|
+
if (!Number.isSafeInteger(value) || value < minimum) throw ConfigurationError.invalidParserLimit(option, value, minimum);
|
|
21
|
+
}
|
|
22
|
+
//#endregion
|
|
23
|
+
export { defaultParserLimits, resolveParserLimits };
|
|
24
|
+
|
|
25
|
+
//# sourceMappingURL=config.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.mjs","names":[],"sources":["../../src/parser/config.ts"],"sourcesContent":["import { ConfigurationError } from \"../errors.ts\";\n\nexport interface ParserLimits {\n readonly maximumNestingDepth?: number;\n readonly maximumNodes?: number;\n readonly maximumSourceLength?: number;\n}\n\nexport type ParserLimit = keyof Required<ParserLimits> | \"maximumPendingBlockLength\";\n\nexport interface ResolvedParserLimits {\n readonly maximumNestingDepth: number;\n readonly maximumNodes: number;\n readonly maximumSourceLength: number;\n}\n\nexport const defaultParserLimits: ResolvedParserLimits = Object.freeze({\n maximumNestingDepth: 1024,\n maximumNodes: 1_000_000,\n maximumSourceLength: 16 * 1024 * 1024,\n});\n\nexport function resolveParserLimits(options: ParserLimits = {}): ResolvedParserLimits {\n const limits: ResolvedParserLimits = {\n maximumNestingDepth: options.maximumNestingDepth ?? defaultParserLimits.maximumNestingDepth,\n maximumNodes: options.maximumNodes ?? defaultParserLimits.maximumNodes,\n maximumSourceLength: options.maximumSourceLength ?? defaultParserLimits.maximumSourceLength,\n };\n\n validateParserLimit(\"maximumNestingDepth\", limits.maximumNestingDepth, 1);\n validateParserLimit(\"maximumNodes\", limits.maximumNodes, 1);\n validateParserLimit(\"maximumSourceLength\", limits.maximumSourceLength, 0);\n\n return limits;\n}\n\nfunction validateParserLimit(option: string, value: number, minimum: number): void {\n if (!Number.isSafeInteger(value) || value < minimum) {\n throw ConfigurationError.invalidParserLimit(option, value, minimum);\n }\n}\n"],"mappings":";;AAgBA,MAAa,sBAA4C,OAAO,OAAO;CACrE,qBAAqB;CACrB,cAAc;CACd,qBAAqB;AACvB,CAAC;AAED,SAAgB,oBAAoB,UAAwB,CAAC,GAAyB;CACpF,MAAM,SAA+B;EACnC,qBAAqB,QAAQ,uBAAuB,oBAAoB;EACxE,cAAc,QAAQ,gBAAgB,oBAAoB;EAC1D,qBAAqB,QAAQ,uBAAuB,oBAAoB;CAC1E;CAEA,oBAAoB,uBAAuB,OAAO,qBAAqB,CAAC;CACxE,oBAAoB,gBAAgB,OAAO,cAAc,CAAC;CAC1D,oBAAoB,uBAAuB,OAAO,qBAAqB,CAAC;CAExE,OAAO;AACT;AAEA,SAAS,oBAAoB,QAAgB,OAAe,SAAuB;CACjF,IAAI,CAAC,OAAO,cAAc,KAAK,KAAK,QAAQ,SAC1C,MAAM,mBAAmB,mBAAmB,QAAQ,OAAO,OAAO;AAEtE"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { DirectiveAttributeSyntax } from "./block-syntax.mjs";
|
|
2
|
+
//#region src/parser/directive-attributes.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* Parses directive attributes with unique names. Like the directive syntax
|
|
5
|
+
* extension, classes accumulate and any other repeated name keeps its last value.
|
|
6
|
+
*/
|
|
7
|
+
export declare function parseDirectiveAttributes(source: string): readonly DirectiveAttributeSyntax[];
|
|
8
|
+
//#endregion
|
|
9
|
+
//# sourceMappingURL=directive-attributes.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"directive-attributes.d.mts","names":[],"sources":["../../src/parser/directive-attributes.ts"],"mappings":";;;;;;wBASgB,yBAAyB,0BAA0B"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
//#region src/parser/directive-attributes.ts
|
|
2
|
+
const attributePattern = /([A-Za-z_:][\w:.-]*)(?:=(?:"([^"]*)"|'([^']*)'|([^\s]+)))?|([.#])([\w-]+)/gu;
|
|
3
|
+
/**
|
|
4
|
+
* Parses directive attributes with unique names. Like the directive syntax
|
|
5
|
+
* extension, classes accumulate and any other repeated name keeps its last value.
|
|
6
|
+
*/
|
|
7
|
+
function parseDirectiveAttributes(source) {
|
|
8
|
+
const values = /* @__PURE__ */ new Map();
|
|
9
|
+
for (const match of source.matchAll(attributePattern)) {
|
|
10
|
+
const shortcut = match[5];
|
|
11
|
+
const name = shortcut === "#" ? "id" : shortcut === "." ? "class" : match[1];
|
|
12
|
+
const value = shortcut === void 0 ? match[2] ?? match[3] ?? match[4] ?? "" : match[6];
|
|
13
|
+
const previous = values.get(name);
|
|
14
|
+
values.set(name, name === "class" && previous !== void 0 && previous.length > 0 ? `${previous} ${value}` : value);
|
|
15
|
+
}
|
|
16
|
+
return [...values].map(([name, value]) => ({
|
|
17
|
+
name,
|
|
18
|
+
value
|
|
19
|
+
}));
|
|
20
|
+
}
|
|
21
|
+
//#endregion
|
|
22
|
+
export { parseDirectiveAttributes };
|
|
23
|
+
|
|
24
|
+
//# sourceMappingURL=directive-attributes.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"directive-attributes.mjs","names":[],"sources":["../../src/parser/directive-attributes.ts"],"sourcesContent":["import type { DirectiveAttributeSyntax } from \"./block-syntax.ts\";\n\nconst attributePattern =\n /([A-Za-z_:][\\w:.-]*)(?:=(?:\"([^\"]*)\"|'([^']*)'|([^\\s]+)))?|([.#])([\\w-]+)/gu;\n\n/**\n * Parses directive attributes with unique names. Like the directive syntax\n * extension, classes accumulate and any other repeated name keeps its last value.\n */\nexport function parseDirectiveAttributes(source: string): readonly DirectiveAttributeSyntax[] {\n const values = new Map<string, string>();\n\n for (const match of source.matchAll(attributePattern)) {\n const shortcut = match[5];\n const name = shortcut === \"#\" ? \"id\" : shortcut === \".\" ? \"class\" : match[1];\n const value = shortcut === undefined ? (match[2] ?? match[3] ?? match[4] ?? \"\") : match[6];\n const previous = values.get(name);\n\n values.set(\n name,\n name === \"class\" && previous !== undefined && previous.length > 0\n ? `${previous} ${value}`\n : value,\n );\n }\n\n return [...values].map(([name, value]) => ({ name, value }));\n}\n"],"mappings":";AAEA,MAAM,mBACJ;;;;;AAMF,SAAgB,yBAAyB,QAAqD;CAC5F,MAAM,yBAAS,IAAI,IAAoB;CAEvC,KAAK,MAAM,SAAS,OAAO,SAAS,gBAAgB,GAAG;EACrD,MAAM,WAAW,MAAM;EACvB,MAAM,OAAO,aAAa,MAAM,OAAO,aAAa,MAAM,UAAU,MAAM;EAC1E,MAAM,QAAQ,aAAa,KAAA,IAAa,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,KAAM,MAAM;EACxF,MAAM,WAAW,OAAO,IAAI,IAAI;EAEhC,OAAO,IACL,MACA,SAAS,WAAW,aAAa,KAAA,KAAa,SAAS,SAAS,IAC5D,GAAG,SAAS,GAAG,UACf,KACN;CACF;CAEA,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC,KAAK,CAAC,MAAM,YAAY;EAAE;EAAM;CAAM,EAAE;AAC7D"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { EmbeddedScannerResult } from "./javascript-scanner.mjs";
|
|
2
|
+
//#region src/parser/embedded-scanner.d.ts
|
|
3
|
+
/** Retained structural boundary state for one MDX JSX flow element or fragment. */
|
|
4
|
+
export declare class JsxBoundaryScanner {
|
|
5
|
+
#private;
|
|
6
|
+
append(text: string): EmbeddedScannerResult;
|
|
7
|
+
clone(): JsxBoundaryScanner;
|
|
8
|
+
opening(): CommittedJsxOpening;
|
|
9
|
+
get validPrefix(): boolean;
|
|
10
|
+
}
|
|
11
|
+
export interface CommittedJsxOpening {
|
|
12
|
+
readonly name: string | undefined;
|
|
13
|
+
readonly attributes: Readonly<Record<string, boolean | string>>;
|
|
14
|
+
readonly safe: boolean;
|
|
15
|
+
readonly end: number | undefined;
|
|
16
|
+
}
|
|
17
|
+
//#endregion
|
|
18
|
+
//# sourceMappingURL=embedded-scanner.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedded-scanner.d.mts","names":[],"sources":["../../src/parser/embedded-scanner.ts"],"mappings":";;;qBAKa;;EAUJ,OAAO,eAAe;EAqFtB,SAAS;EAcT,WAAW;MAIP;;iBASI;WACN;WACA,YAAY,SAAS;WACrB;WACA"}
|