@temelj/mdx 0.14.0 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +470 -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 +167 -420
- 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-decode.d.mts +15 -0
- package/dist/frontmatter-decode.d.mts.map +1 -0
- package/dist/frontmatter-decode.mjs +187 -0
- package/dist/frontmatter-decode.mjs.map +1 -0
- package/dist/frontmatter-schema.d.mts +8 -0
- package/dist/frontmatter-schema.d.mts.map +1 -0
- package/dist/frontmatter-schema.mjs +28 -0
- package/dist/frontmatter-schema.mjs.map +1 -0
- package/dist/frontmatter.d.mts +40 -0
- package/dist/frontmatter.d.mts.map +1 -0
- package/dist/frontmatter.mjs +109 -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 +26 -9
- package/dist/mod.mjs +20 -8
- 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 -6
- package/dist/plugins/mod.mjs +8 -6
- 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 +136 -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 -30
- 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/katex/plugin.d.mts +0 -39
- package/dist/plugins/katex/plugin.d.mts.map +0 -1
- package/dist/plugins/katex/plugin.mjs +0 -107
- package/dist/plugins/katex/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,34 @@
|
|
|
1
|
+
import { SourceText } from "../source-text.mjs";
|
|
2
|
+
import { InlineInput } from "./inline-input.mjs";
|
|
3
|
+
import { InlineSyntax } from "./inline-syntax.mjs";
|
|
4
|
+
//#region src/parser/inline-output.d.ts
|
|
5
|
+
export interface Delimiter {
|
|
6
|
+
readonly canClose: boolean;
|
|
7
|
+
readonly canOpen: boolean;
|
|
8
|
+
readonly marker: "*" | "_" | "~";
|
|
9
|
+
readonly originalLength: number;
|
|
10
|
+
length: number;
|
|
11
|
+
start: number;
|
|
12
|
+
}
|
|
13
|
+
export interface Bracket {
|
|
14
|
+
active: boolean;
|
|
15
|
+
readonly image: boolean;
|
|
16
|
+
readonly start: number;
|
|
17
|
+
}
|
|
18
|
+
export type Output = InlineSyntax | Delimiter | Bracket;
|
|
19
|
+
export interface InlineMatch {
|
|
20
|
+
readonly end: number;
|
|
21
|
+
readonly node: InlineSyntax;
|
|
22
|
+
}
|
|
23
|
+
export declare function convertOutput(input: InlineInput, output: readonly Output[], target?: InlineSyntax[]): InlineSyntax[];
|
|
24
|
+
export declare function findUnescapedInline(value: SourceText, target: string, start: number): number | undefined;
|
|
25
|
+
export declare function escapedAt(value: SourceText, offset: number, lowerBound: number): boolean;
|
|
26
|
+
export declare function textNode(input: InlineInput, value: SourceText, start: number, end: number): InlineSyntax;
|
|
27
|
+
export declare function delimiterText(input: InlineInput, delimiter: Delimiter): InlineSyntax;
|
|
28
|
+
export declare function bracketText(input: InlineInput, bracket: Bracket): InlineSyntax;
|
|
29
|
+
export declare function isDelimiter(output: Output): output is Delimiter;
|
|
30
|
+
export declare function isBracket(output: Output): output is Bracket;
|
|
31
|
+
export declare function markerRunEnd(value: SourceText, start: number, marker: string): number;
|
|
32
|
+
export declare function mergeText(nodes: readonly InlineSyntax[], merged?: InlineSyntax[]): InlineSyntax[];
|
|
33
|
+
//#endregion
|
|
34
|
+
//# sourceMappingURL=inline-output.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inline-output.d.mts","names":[],"sources":["../../src/parser/inline-output.ts"],"mappings":";;;;iBAQiB;WACN;WACA;WACA;WACA;EACT;EACA;;iBAGe;EACf;WACS;WACA;;YAGC,SAAS,eAAe,YAAY;iBAE/B;WACN;WACA,MAAM;;wBAGD,cACd,OAAO,aACP,iBAAiB,UACjB,SAAQ,iBACP;wBAaa,oBACd,OAAO,YACP,gBACA;wBAWc,UAAU,OAAO,YAAY,gBAAgB;wBAU7C,SACd,OAAO,aACP,OAAO,YACP,eACA,cACC;wBAQa,cAAc,OAAO,aAAa,WAAW,YAAY;wBAQzD,YAAY,OAAO,aAAa,SAAS,UAAU;wBAUnD,YAAY,QAAQ,SAAS,UAAU;wBAIvC,UAAU,QAAQ,SAAS,UAAU;wBAIrC,aAAa,OAAO,YAAY,eAAe;wBAU/C,UACd,gBAAgB,gBAChB,SAAQ,iBACP"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { sourceRange } from "../ranges.mjs";
|
|
2
|
+
//#region src/parser/inline-output.ts
|
|
3
|
+
function convertOutput(input, output, target = []) {
|
|
4
|
+
return mergeText(output.map((entry) => isDelimiter(entry) ? delimiterText(input, entry) : isBracket(entry) ? bracketText(input, entry) : entry), target);
|
|
5
|
+
}
|
|
6
|
+
function findUnescapedInline(value, target, start) {
|
|
7
|
+
for (let offset = start; offset < value.length; offset++) if (value.char(offset) === target && !escapedAt(value, offset, start)) return offset;
|
|
8
|
+
}
|
|
9
|
+
function escapedAt(value, offset, lowerBound) {
|
|
10
|
+
let slashes = 0;
|
|
11
|
+
for (let index = offset - 1; index >= lowerBound && value.char(index) === "\\"; index--) slashes++;
|
|
12
|
+
return slashes % 2 === 1;
|
|
13
|
+
}
|
|
14
|
+
function textNode(input, value, start, end) {
|
|
15
|
+
return {
|
|
16
|
+
kind: "text",
|
|
17
|
+
range: input.sourceRange(start, end),
|
|
18
|
+
value: value.slice(start, end)
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
function delimiterText(input, delimiter) {
|
|
22
|
+
return {
|
|
23
|
+
kind: "text",
|
|
24
|
+
range: input.sourceRange(delimiter.start, delimiter.start + delimiter.length),
|
|
25
|
+
value: delimiter.marker.repeat(delimiter.length)
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function bracketText(input, bracket) {
|
|
29
|
+
const end = bracket.start + (bracket.image ? 2 : 1);
|
|
30
|
+
return {
|
|
31
|
+
kind: "text",
|
|
32
|
+
range: input.sourceRange(bracket.start, end),
|
|
33
|
+
value: bracket.image ? "![" : "["
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function isDelimiter(output) {
|
|
37
|
+
return "marker" in output;
|
|
38
|
+
}
|
|
39
|
+
function isBracket(output) {
|
|
40
|
+
return "active" in output;
|
|
41
|
+
}
|
|
42
|
+
function markerRunEnd(value, start, marker) {
|
|
43
|
+
let end = start;
|
|
44
|
+
while (value.char(end) === marker) end++;
|
|
45
|
+
return end;
|
|
46
|
+
}
|
|
47
|
+
function mergeText(nodes, merged = []) {
|
|
48
|
+
for (const node of nodes) {
|
|
49
|
+
const previous = merged.at(-1);
|
|
50
|
+
if (previous?.kind === "text" && node.kind === "text" && previous.range.end === node.range.start) merged[merged.length - 1] = {
|
|
51
|
+
kind: "text",
|
|
52
|
+
range: sourceRange(previous.range.start, node.range.end),
|
|
53
|
+
value: previous.value + node.value
|
|
54
|
+
};
|
|
55
|
+
else merged.push(node);
|
|
56
|
+
}
|
|
57
|
+
return merged;
|
|
58
|
+
}
|
|
59
|
+
//#endregion
|
|
60
|
+
export { bracketText, convertOutput, delimiterText, escapedAt, findUnescapedInline, isBracket, isDelimiter, markerRunEnd, mergeText, textNode };
|
|
61
|
+
|
|
62
|
+
//# sourceMappingURL=inline-output.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inline-output.mjs","names":[],"sources":["../../src/parser/inline-output.ts"],"sourcesContent":["import type { SourceText } from \"../source-text.ts\";\nimport type { InlineInput } from \"./inline-input.ts\";\nimport type { InlineSyntax } from \"./inline-syntax.ts\";\n\nimport { sourceRange } from \"../ranges.ts\";\n\n// The inline parser's output sequence: parsed nodes, delimiter runs, and brackets.\n\nexport interface Delimiter {\n readonly canClose: boolean;\n readonly canOpen: boolean;\n readonly marker: \"*\" | \"_\" | \"~\";\n readonly originalLength: number;\n length: number;\n start: number;\n}\n\nexport interface Bracket {\n active: boolean;\n readonly image: boolean;\n readonly start: number;\n}\n\nexport type Output = InlineSyntax | Delimiter | Bracket;\n\nexport interface InlineMatch {\n readonly end: number;\n readonly node: InlineSyntax;\n}\n\nexport function convertOutput(\n input: InlineInput,\n output: readonly Output[],\n target: InlineSyntax[] = [],\n): InlineSyntax[] {\n return mergeText(\n output.map((entry) =>\n isDelimiter(entry)\n ? delimiterText(input, entry)\n : isBracket(entry)\n ? bracketText(input, entry)\n : entry,\n ),\n target,\n );\n}\n\nexport function findUnescapedInline(\n value: SourceText,\n target: string,\n start: number,\n): number | undefined {\n for (let offset = start; offset < value.length; offset++) {\n if (value.char(offset) === target && !escapedAt(value, offset, start)) {\n return offset;\n }\n }\n\n return;\n}\n\nexport function escapedAt(value: SourceText, offset: number, lowerBound: number): boolean {\n let slashes = 0;\n\n for (let index = offset - 1; index >= lowerBound && value.char(index) === \"\\\\\"; index--) {\n slashes++;\n }\n\n return slashes % 2 === 1;\n}\n\nexport function textNode(\n input: InlineInput,\n value: SourceText,\n start: number,\n end: number,\n): InlineSyntax {\n return {\n kind: \"text\",\n range: input.sourceRange(start, end),\n value: value.slice(start, end),\n };\n}\n\nexport function delimiterText(input: InlineInput, delimiter: Delimiter): InlineSyntax {\n return {\n kind: \"text\",\n range: input.sourceRange(delimiter.start, delimiter.start + delimiter.length),\n value: delimiter.marker.repeat(delimiter.length),\n };\n}\n\nexport function bracketText(input: InlineInput, bracket: Bracket): InlineSyntax {\n const end = bracket.start + (bracket.image ? 2 : 1);\n\n return {\n kind: \"text\",\n range: input.sourceRange(bracket.start, end),\n value: bracket.image ? \"![\" : \"[\",\n };\n}\n\nexport function isDelimiter(output: Output): output is Delimiter {\n return \"marker\" in output;\n}\n\nexport function isBracket(output: Output): output is Bracket {\n return \"active\" in output;\n}\n\nexport function markerRunEnd(value: SourceText, start: number, marker: string): number {\n let end = start;\n\n while (value.char(end) === marker) {\n end++;\n }\n\n return end;\n}\n\nexport function mergeText(\n nodes: readonly InlineSyntax[],\n merged: InlineSyntax[] = [],\n): InlineSyntax[] {\n for (const node of nodes) {\n const previous = merged.at(-1);\n\n if (\n previous?.kind === \"text\" &&\n node.kind === \"text\" &&\n previous.range.end === node.range.start\n ) {\n merged[merged.length - 1] = {\n kind: \"text\",\n range: sourceRange(previous.range.start, node.range.end),\n value: previous.value + node.value,\n };\n } else {\n merged.push(node);\n }\n }\n\n return merged;\n}\n"],"mappings":";;AA8BA,SAAgB,cACd,OACA,QACA,SAAyB,CAAC,GACV;CAChB,OAAO,UACL,OAAO,KAAK,UACV,YAAY,KAAK,IACb,cAAc,OAAO,KAAK,IAC1B,UAAU,KAAK,IACb,YAAY,OAAO,KAAK,IACxB,KACR,GACA,MACF;AACF;AAEA,SAAgB,oBACd,OACA,QACA,OACoB;CACpB,KAAK,IAAI,SAAS,OAAO,SAAS,MAAM,QAAQ,UAC9C,IAAI,MAAM,KAAK,MAAM,MAAM,UAAU,CAAC,UAAU,OAAO,QAAQ,KAAK,GAClE,OAAO;AAKb;AAEA,SAAgB,UAAU,OAAmB,QAAgB,YAA6B;CACxF,IAAI,UAAU;CAEd,KAAK,IAAI,QAAQ,SAAS,GAAG,SAAS,cAAc,MAAM,KAAK,KAAK,MAAM,MAAM,SAC9E;CAGF,OAAO,UAAU,MAAM;AACzB;AAEA,SAAgB,SACd,OACA,OACA,OACA,KACc;CACd,OAAO;EACL,MAAM;EACN,OAAO,MAAM,YAAY,OAAO,GAAG;EACnC,OAAO,MAAM,MAAM,OAAO,GAAG;CAC/B;AACF;AAEA,SAAgB,cAAc,OAAoB,WAAoC;CACpF,OAAO;EACL,MAAM;EACN,OAAO,MAAM,YAAY,UAAU,OAAO,UAAU,QAAQ,UAAU,MAAM;EAC5E,OAAO,UAAU,OAAO,OAAO,UAAU,MAAM;CACjD;AACF;AAEA,SAAgB,YAAY,OAAoB,SAAgC;CAC9E,MAAM,MAAM,QAAQ,SAAS,QAAQ,QAAQ,IAAI;CAEjD,OAAO;EACL,MAAM;EACN,OAAO,MAAM,YAAY,QAAQ,OAAO,GAAG;EAC3C,OAAO,QAAQ,QAAQ,OAAO;CAChC;AACF;AAEA,SAAgB,YAAY,QAAqC;CAC/D,OAAO,YAAY;AACrB;AAEA,SAAgB,UAAU,QAAmC;CAC3D,OAAO,YAAY;AACrB;AAEA,SAAgB,aAAa,OAAmB,OAAe,QAAwB;CACrF,IAAI,MAAM;CAEV,OAAO,MAAM,KAAK,GAAG,MAAM,QACzB;CAGF,OAAO;AACT;AAEA,SAAgB,UACd,OACA,SAAyB,CAAC,GACV;CAChB,KAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,WAAW,OAAO,GAAG,EAAE;EAE7B,IACE,UAAU,SAAS,UACnB,KAAK,SAAS,UACd,SAAS,MAAM,QAAQ,KAAK,MAAM,OAElC,OAAO,OAAO,SAAS,KAAK;GAC1B,MAAM;GACN,OAAO,YAAY,SAAS,MAAM,OAAO,KAAK,MAAM,GAAG;GACvD,OAAO,SAAS,QAAQ,KAAK;EAC/B;OAEA,OAAO,KAAK,IAAI;CAEpB;CAEA,OAAO;AACT"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ResolvedSyntaxOptions } from "../syntax-options.mjs";
|
|
2
|
+
import { InlineInput } from "./inline-input.mjs";
|
|
3
|
+
import { DefinitionLookup, InlineParseResult } from "./inline-syntax.mjs";
|
|
4
|
+
//#region src/parser/inline-parser.d.ts
|
|
5
|
+
/** A paragraph owns its continuation; edits start a new parse. */
|
|
6
|
+
export declare class InlineParser {
|
|
7
|
+
#private;
|
|
8
|
+
constructor(syntax: ResolvedSyntaxOptions);
|
|
9
|
+
parse(input: InlineInput, definitions?: DefinitionLookup): InlineParseResult;
|
|
10
|
+
}
|
|
11
|
+
/** Complete input uses the same grammar without retaining preview state. */
|
|
12
|
+
export declare function parseInline(input: InlineInput, syntax: ResolvedSyntaxOptions, definitions?: DefinitionLookup): InlineParseResult;
|
|
13
|
+
//#endregion
|
|
14
|
+
//# sourceMappingURL=inline-parser.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inline-parser.d.mts","names":[],"sources":["../../src/parser/inline-parser.ts"],"mappings":";;;;;qBAsDa;;EAKX,YAAmB,QAAQ;EAIpB,MACL,OAAO,aACP,cAAa,mBACZ;;;wBAoBW,YACd,OAAO,aACP,QAAQ,uBACR,cAAa,mBACZ"}
|
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
import { isAsciiPunctuation } from "./characters.mjs";
|
|
2
|
+
import { convertOutput, markerRunEnd, textNode } from "./inline-output.mjs";
|
|
3
|
+
import { matchLiteralAutolink } from "./inline-autolink.mjs";
|
|
4
|
+
import { characterReference } from "./inline-character-reference.mjs";
|
|
5
|
+
import { codeSpan } from "./inline-code.mjs";
|
|
6
|
+
import { directiveUnfinished, inlineDirective } from "./inline-directive.mjs";
|
|
7
|
+
import { angleNode, expressionNode } from "./inline-embedded.mjs";
|
|
8
|
+
import { createDelimiter, resolveCloser, resolveDelimiters } from "./inline-emphasis.mjs";
|
|
9
|
+
import { resolveBracket } from "./inline-link.mjs";
|
|
10
|
+
import { dollarMath, dollarUnclosed, texMath } from "./inline-math.mjs";
|
|
11
|
+
import { pendingInline } from "./inline-pending.mjs";
|
|
12
|
+
//#region src/parser/inline-parser.ts
|
|
13
|
+
/** A paragraph owns its continuation; edits start a new parse. */
|
|
14
|
+
var InlineParser = class {
|
|
15
|
+
#syntax;
|
|
16
|
+
#state;
|
|
17
|
+
#definitions = emptyDefinitions;
|
|
18
|
+
constructor(syntax) {
|
|
19
|
+
this.#syntax = syntax;
|
|
20
|
+
}
|
|
21
|
+
parse(input, definitions = emptyDefinitions) {
|
|
22
|
+
const previous = this.#state;
|
|
23
|
+
const state = previous === void 0 || definitions === this.#definitions || previous.references.every((id) => definitions.has(id) === this.#definitions.has(id)) ? previous : void 0;
|
|
24
|
+
this.#definitions = definitions;
|
|
25
|
+
const resumed = state !== void 0 && input.extends(state.input) ? state : void 0;
|
|
26
|
+
const scan = new InlineScan(input, this.#syntax, resumed, true, definitions);
|
|
27
|
+
const parsed = scan.run();
|
|
28
|
+
this.#state = scan.state;
|
|
29
|
+
return parsed;
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
/** Complete input uses the same grammar without retaining preview state. */
|
|
33
|
+
function parseInline(input, syntax, definitions = emptyDefinitions) {
|
|
34
|
+
return new InlineScan(input, syntax, void 0, false, definitions).run();
|
|
35
|
+
}
|
|
36
|
+
const emptyDefinitions = /* @__PURE__ */ new Set();
|
|
37
|
+
const INLINE_MARKERS = /[\\\r\n \t![\]`&{<_*~:$hHwW]/gu;
|
|
38
|
+
const EMAIL_MARKERS = /[\\\r\n \t![\]`&{<_*~:$A-Za-z\d.+-]/gu;
|
|
39
|
+
/** One inline parse: the output sequence, the delimiter and bracket stacks, and the cursor. */
|
|
40
|
+
var InlineScan = class {
|
|
41
|
+
state;
|
|
42
|
+
#input;
|
|
43
|
+
#value;
|
|
44
|
+
#syntax;
|
|
45
|
+
#resumed;
|
|
46
|
+
#preview;
|
|
47
|
+
#emailAutolinks;
|
|
48
|
+
#output;
|
|
49
|
+
#delimiters = [];
|
|
50
|
+
#brackets = [];
|
|
51
|
+
#invalid;
|
|
52
|
+
#definitions;
|
|
53
|
+
#references;
|
|
54
|
+
#openEmbedded;
|
|
55
|
+
#textStart;
|
|
56
|
+
#offset;
|
|
57
|
+
#safe;
|
|
58
|
+
/** A construct that failed only because input ended may still close, changing earlier output. */
|
|
59
|
+
#stable = true;
|
|
60
|
+
constructor(input, syntax, resumed, preview, definitions) {
|
|
61
|
+
const value = input.text();
|
|
62
|
+
this.#input = input;
|
|
63
|
+
this.#value = value;
|
|
64
|
+
this.#syntax = syntax;
|
|
65
|
+
this.#resumed = resumed;
|
|
66
|
+
this.#preview = preview;
|
|
67
|
+
this.#definitions = definitions;
|
|
68
|
+
this.#references = new Set(resumed?.references);
|
|
69
|
+
this.#output = resumed === void 0 ? [] : resumed.output;
|
|
70
|
+
this.#output.length = resumed?.outputLength ?? 0;
|
|
71
|
+
this.#invalid = resumed === void 0 ? [] : [...resumed.invalid];
|
|
72
|
+
this.#textStart = resumed?.textStart ?? 0;
|
|
73
|
+
this.#offset = resumed?.offset ?? 0;
|
|
74
|
+
this.#emailAutolinks = value.indexOf("@", this.#offset) !== -1;
|
|
75
|
+
}
|
|
76
|
+
run() {
|
|
77
|
+
while (this.#offset < this.#value.length) {
|
|
78
|
+
const character = this.#value.char(this.#offset) ?? "";
|
|
79
|
+
if (this.#preview) this.recordSafePoint(character);
|
|
80
|
+
if (!this.scanConstruct(character)) this.#offset = this.#value.findCharacter(this.#emailAutolinks ? EMAIL_MARKERS : INLINE_MARKERS, this.#offset + 1);
|
|
81
|
+
}
|
|
82
|
+
if (this.#preview) this.recordSafePoint();
|
|
83
|
+
this.flushText(this.#value.length);
|
|
84
|
+
resolveDelimiters(this.#input, this.#output, this.#delimiters, this.#syntax);
|
|
85
|
+
return this.result();
|
|
86
|
+
}
|
|
87
|
+
result() {
|
|
88
|
+
const input = this.#input;
|
|
89
|
+
const output = this.#output;
|
|
90
|
+
const resumed = this.#resumed;
|
|
91
|
+
const resumedLength = resumed?.outputLength ?? 0;
|
|
92
|
+
const unsettled = this.#preview ? pendingInline(input, this.#value, output, this.#openEmbedded, this.#syntax, resumed?.offset ?? 0, resumedLength, this.#safe?.offset) : void 0;
|
|
93
|
+
const pending = unsettled?.pending;
|
|
94
|
+
let safe = this.#safe;
|
|
95
|
+
if (safe !== void 0 && unsettled !== void 0 && unsettled.earliest < safe.offset) safe = void 0;
|
|
96
|
+
const nodes = resumed?.nodes ?? [];
|
|
97
|
+
let changedFrom = resumed?.nodesLength ?? 0;
|
|
98
|
+
if (resumed !== void 0) {
|
|
99
|
+
nodes.length = resumed.nodesLength;
|
|
100
|
+
if (resumed.lastNode !== void 0) {
|
|
101
|
+
nodes[nodes.length - 1] = resumed.lastNode;
|
|
102
|
+
if (resumed.lastNode.kind === "text") changedFrom--;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
const end = safe?.output ?? resumedLength;
|
|
106
|
+
if (end > resumedLength) convertOutput(input, output.slice(resumedLength, end), nodes);
|
|
107
|
+
this.state = safe === void 0 ? resumed : {
|
|
108
|
+
offset: safe.offset,
|
|
109
|
+
textStart: safe.textStart,
|
|
110
|
+
input,
|
|
111
|
+
output,
|
|
112
|
+
outputLength: safe.output,
|
|
113
|
+
invalid: this.#invalid.slice(0, safe.invalid),
|
|
114
|
+
references: [...this.#references].slice(0, safe.references),
|
|
115
|
+
nodes,
|
|
116
|
+
nodesLength: nodes.length,
|
|
117
|
+
lastNode: nodes.at(-1)
|
|
118
|
+
};
|
|
119
|
+
convertOutput(input, end === 0 ? output : output.slice(end), nodes);
|
|
120
|
+
return {
|
|
121
|
+
nodes,
|
|
122
|
+
invalid: this.#invalid,
|
|
123
|
+
pending,
|
|
124
|
+
changedFrom,
|
|
125
|
+
references: [...this.#references]
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
/** Consumes the construct at the cursor, in CommonMark precedence order. */
|
|
129
|
+
scanConstruct(character) {
|
|
130
|
+
switch (character) {
|
|
131
|
+
case ":": return this.scanDirective();
|
|
132
|
+
case "\\": return this.scanTexMath() || this.scanBackslash();
|
|
133
|
+
case "$": return this.scanDollarMath();
|
|
134
|
+
case "\n":
|
|
135
|
+
case "\r": return this.scanSpaceBreak(character);
|
|
136
|
+
case "!":
|
|
137
|
+
case "[": return this.scanOpenBracket(character);
|
|
138
|
+
case "]": return this.scanCloseBracket();
|
|
139
|
+
case "`": return this.scanCodeSpan();
|
|
140
|
+
case "&": return this.scanCharacterReference();
|
|
141
|
+
case "{": return this.scanExpression();
|
|
142
|
+
case "<": return this.scanAngle();
|
|
143
|
+
case "_": return this.scanAutolink(character) || this.scanDelimiterRun(character);
|
|
144
|
+
case "*":
|
|
145
|
+
case "~": return this.scanDelimiterRun(character);
|
|
146
|
+
default: return this.scanAutolink(character);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/** Known whitespace ends a token; open constructs keep their earlier retry point. */
|
|
150
|
+
recordSafePoint(character) {
|
|
151
|
+
const previous = this.#value.char(this.#offset - 1);
|
|
152
|
+
if (this.#stable && this.#offset > (this.#resumed?.offset ?? 0) && (character === " " || character === " " || previous === "\n" || previous === "\r" && character !== "\n") && this.#brackets.length === 0 && !this.#delimiters.some((delimiter) => delimiter.canOpen)) this.#safe = {
|
|
153
|
+
offset: this.#offset,
|
|
154
|
+
textStart: this.#textStart,
|
|
155
|
+
output: this.#output.length,
|
|
156
|
+
invalid: this.#invalid.length,
|
|
157
|
+
references: this.#references.size
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
scanDirective() {
|
|
161
|
+
if (!this.#syntax.directives) return false;
|
|
162
|
+
const directive = inlineDirective(this.#input, this.#value, this.#offset);
|
|
163
|
+
this.#stable &&= directive !== void 0 || !directiveUnfinished(this.#value, this.#offset);
|
|
164
|
+
return directive !== void 0 && this.emit(directive);
|
|
165
|
+
}
|
|
166
|
+
scanTexMath() {
|
|
167
|
+
if (this.#value.char(this.#offset + 1) !== "(" || !this.#syntax.math.includes("tex")) return false;
|
|
168
|
+
const math = texMath(this.#input, this.#value, this.#offset);
|
|
169
|
+
this.#stable &&= math !== void 0;
|
|
170
|
+
return math !== void 0 && this.emit(math);
|
|
171
|
+
}
|
|
172
|
+
scanDollarMath() {
|
|
173
|
+
if (!this.#syntax.math.includes("dollar")) return false;
|
|
174
|
+
const math = dollarMath(this.#input, this.#value, this.#offset);
|
|
175
|
+
this.#stable &&= math !== void 0 || !dollarUnclosed(this.#value, this.#offset);
|
|
176
|
+
return math !== void 0 && this.emit(math);
|
|
177
|
+
}
|
|
178
|
+
/** Two or more spaces before a line ending make a hard break. */
|
|
179
|
+
scanSpaceBreak(character) {
|
|
180
|
+
const value = this.#value;
|
|
181
|
+
let spaces = this.#offset;
|
|
182
|
+
while (spaces > this.#textStart && value.char(spaces - 1) === " ") spaces--;
|
|
183
|
+
if (this.#offset - spaces < 2) return false;
|
|
184
|
+
this.flushText(spaces);
|
|
185
|
+
const end = character === "\r" && value.char(this.#offset + 1) === "\n" ? this.#offset + 2 : this.#offset + 1;
|
|
186
|
+
this.#output.push({
|
|
187
|
+
kind: "hardBreak",
|
|
188
|
+
range: this.#input.sourceRange(spaces, end)
|
|
189
|
+
});
|
|
190
|
+
return this.advance(end);
|
|
191
|
+
}
|
|
192
|
+
scanAutolink(character) {
|
|
193
|
+
if (this.#brackets.length > 0) return false;
|
|
194
|
+
if (!this.#emailAutolinks && !"hHwW".includes(character)) return false;
|
|
195
|
+
const autolink = matchLiteralAutolink(this.#input, this.#value, this.#offset);
|
|
196
|
+
return autolink !== void 0 && this.emit(autolink);
|
|
197
|
+
}
|
|
198
|
+
scanOpenBracket(character) {
|
|
199
|
+
const image = character === "!" && this.#value.char(this.#offset + 1) === "[";
|
|
200
|
+
if (character !== "[" && !image) return false;
|
|
201
|
+
this.flushText(this.#offset);
|
|
202
|
+
const bracket = {
|
|
203
|
+
active: true,
|
|
204
|
+
image,
|
|
205
|
+
start: this.#offset
|
|
206
|
+
};
|
|
207
|
+
this.#output.push(bracket);
|
|
208
|
+
this.#brackets.push(bracket);
|
|
209
|
+
return this.advance(this.#offset + (image ? 2 : 1));
|
|
210
|
+
}
|
|
211
|
+
scanCloseBracket() {
|
|
212
|
+
const bracket = this.#brackets.at(-1);
|
|
213
|
+
if (bracket === void 0) return false;
|
|
214
|
+
this.flushText(this.#offset);
|
|
215
|
+
this.#brackets.pop();
|
|
216
|
+
const resolved = resolveBracket(this.#input, this.#value, this.#offset, bracket, this.#output, this.#delimiters, this.#syntax, this.#definitions, this.#references, this.#brackets.length > 0);
|
|
217
|
+
this.#stable &&= resolved !== void 0;
|
|
218
|
+
if (resolved === void 0) {
|
|
219
|
+
this.#output.push(textNode(this.#input, this.#value, this.#offset, this.#offset + 1));
|
|
220
|
+
return this.advance(this.#offset + 1);
|
|
221
|
+
}
|
|
222
|
+
if (resolved.link) {
|
|
223
|
+
for (const opener of this.#brackets) if (!opener.image) opener.active = false;
|
|
224
|
+
}
|
|
225
|
+
return this.advance(resolved.end);
|
|
226
|
+
}
|
|
227
|
+
/** A backslash before a line ending is a hard break; before punctuation, an escape. */
|
|
228
|
+
scanBackslash() {
|
|
229
|
+
const next = this.#value.char(this.#offset + 1);
|
|
230
|
+
if (next === "\n" || next === "\r") {
|
|
231
|
+
this.flushText(this.#offset);
|
|
232
|
+
const end = next === "\r" && this.#value.char(this.#offset + 2) === "\n" ? this.#offset + 3 : this.#offset + 2;
|
|
233
|
+
this.#output.push({
|
|
234
|
+
kind: "hardBreak",
|
|
235
|
+
range: this.#input.sourceRange(this.#offset, end)
|
|
236
|
+
});
|
|
237
|
+
return this.advance(end);
|
|
238
|
+
}
|
|
239
|
+
if (next === void 0 || !isAsciiPunctuation(next)) return false;
|
|
240
|
+
this.flushText(this.#offset);
|
|
241
|
+
this.#output.push(textNode(this.#input, this.#value, this.#offset + 1, this.#offset + 2));
|
|
242
|
+
return this.advance(this.#offset + 2);
|
|
243
|
+
}
|
|
244
|
+
scanCodeSpan() {
|
|
245
|
+
const code = codeSpan(this.#input, this.#value, this.#offset);
|
|
246
|
+
this.#stable &&= code !== void 0;
|
|
247
|
+
return code !== void 0 && this.emit(code);
|
|
248
|
+
}
|
|
249
|
+
scanCharacterReference() {
|
|
250
|
+
const reference = characterReference(this.#input, this.#value, this.#offset);
|
|
251
|
+
return reference !== void 0 && this.emit(reference);
|
|
252
|
+
}
|
|
253
|
+
scanExpression() {
|
|
254
|
+
const expression = expressionNode(this.#input, this.#value, this.#offset);
|
|
255
|
+
if (expression === void 0) return false;
|
|
256
|
+
const range = this.#input.sourceRange(this.#offset, expression.end);
|
|
257
|
+
this.flushText(this.#offset);
|
|
258
|
+
this.#stable &&= !expression.open;
|
|
259
|
+
if (expression.node === void 0) {
|
|
260
|
+
this.#invalid.push({
|
|
261
|
+
range,
|
|
262
|
+
syntax: "expression",
|
|
263
|
+
open: expression.open
|
|
264
|
+
});
|
|
265
|
+
if (expression.open) this.#openEmbedded = {
|
|
266
|
+
start: this.#offset,
|
|
267
|
+
pending: {
|
|
268
|
+
kind: "expression",
|
|
269
|
+
range
|
|
270
|
+
}
|
|
271
|
+
};
|
|
272
|
+
this.#output.push(textNode(this.#input, this.#value, this.#offset, expression.end));
|
|
273
|
+
} else this.#output.push(expression.node);
|
|
274
|
+
return this.advance(expression.end);
|
|
275
|
+
}
|
|
276
|
+
scanAngle() {
|
|
277
|
+
const angle = angleNode(this.#input, this.#value, this.#offset);
|
|
278
|
+
if (angle === void 0) return false;
|
|
279
|
+
const range = this.#input.sourceRange(this.#offset, angle.end);
|
|
280
|
+
this.flushText(this.#offset);
|
|
281
|
+
this.#stable &&= !angle.open;
|
|
282
|
+
if (angle.invalid) {
|
|
283
|
+
this.#invalid.push({
|
|
284
|
+
range,
|
|
285
|
+
syntax: "jsx",
|
|
286
|
+
open: angle.open
|
|
287
|
+
});
|
|
288
|
+
if (angle.open) this.#openEmbedded = {
|
|
289
|
+
start: this.#offset,
|
|
290
|
+
pending: {
|
|
291
|
+
kind: "jsx",
|
|
292
|
+
range
|
|
293
|
+
}
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
this.#output.push(angle.node);
|
|
297
|
+
return this.advance(angle.end);
|
|
298
|
+
}
|
|
299
|
+
scanDelimiterRun(character) {
|
|
300
|
+
const runEnd = markerRunEnd(this.#value, this.#offset, character);
|
|
301
|
+
if (character === "~" && runEnd - this.#offset < (this.#syntax.singleTilde ? 1 : 2)) return false;
|
|
302
|
+
this.flushText(this.#offset);
|
|
303
|
+
const delimiter = createDelimiter(this.#value, this.#offset, runEnd, character);
|
|
304
|
+
this.#output.push(delimiter);
|
|
305
|
+
this.#delimiters.push(delimiter);
|
|
306
|
+
resolveCloser(this.#input, this.#output, this.#delimiters, delimiter, this.#syntax, this.#brackets.at(-1)?.start ?? -1);
|
|
307
|
+
return this.advance(runEnd);
|
|
308
|
+
}
|
|
309
|
+
/** Appends a matched construct and moves the cursor after it. */
|
|
310
|
+
emit(match) {
|
|
311
|
+
this.flushText(this.#offset);
|
|
312
|
+
this.#output.push(match.node);
|
|
313
|
+
return this.advance(match.end);
|
|
314
|
+
}
|
|
315
|
+
advance(end) {
|
|
316
|
+
this.#offset = end;
|
|
317
|
+
this.#textStart = end;
|
|
318
|
+
return true;
|
|
319
|
+
}
|
|
320
|
+
flushText(end) {
|
|
321
|
+
if (end > this.#textStart) this.#output.push(textNode(this.#input, this.#value, this.#textStart, end));
|
|
322
|
+
this.#textStart = end;
|
|
323
|
+
}
|
|
324
|
+
};
|
|
325
|
+
//#endregion
|
|
326
|
+
export { InlineParser, parseInline };
|
|
327
|
+
|
|
328
|
+
//# sourceMappingURL=inline-parser.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inline-parser.mjs","names":[],"sources":["../../src/parser/inline-parser.ts"],"sourcesContent":["import type { SourceText } from \"../source-text.ts\";\nimport type { ResolvedSyntaxOptions } from \"../syntax-options.ts\";\nimport type { InlineInput } from \"./inline-input.ts\";\nimport type { Bracket, Delimiter, InlineMatch, Output } from \"./inline-output.ts\";\nimport type { PendingCandidate } from \"./inline-pending.ts\";\nimport type {\n DefinitionLookup,\n InlineParseResult,\n InlineSyntax,\n InvalidInlineSyntax,\n} from \"./inline-syntax.ts\";\n\nimport { isAsciiPunctuation } from \"./characters.ts\";\nimport { matchLiteralAutolink } from \"./inline-autolink.ts\";\nimport { characterReference } from \"./inline-character-reference.ts\";\nimport { codeSpan } from \"./inline-code.ts\";\nimport { directiveUnfinished, inlineDirective } from \"./inline-directive.ts\";\nimport { angleNode, expressionNode } from \"./inline-embedded.ts\";\nimport { createDelimiter, resolveCloser, resolveDelimiters } from \"./inline-emphasis.ts\";\nimport { resolveBracket } from \"./inline-link.ts\";\nimport { dollarMath, dollarUnclosed, texMath } from \"./inline-math.ts\";\nimport { convertOutput, markerRunEnd, textNode } from \"./inline-output.ts\";\nimport { pendingInline } from \"./inline-pending.ts\";\n\n/** Private arrays retained before the suffix that future input can still change. */\ninterface ResumeState {\n readonly offset: number;\n readonly textStart: number;\n /** The input the state came from. */\n readonly input: InlineInput;\n /**\n * The parse's own output array with its length at the safe\n * point. Entries before a safe point never change, so the next parse takes\n * the arrays over and truncates them instead of copying.\n */\n readonly output: Output[];\n readonly outputLength: number;\n readonly invalid: readonly InvalidInlineSyntax[];\n readonly references: readonly string[];\n /** `output` as nodes, which resumed parses extend in place to keep node identities. */\n readonly nodes: InlineSyntax[];\n readonly nodesLength: number;\n readonly lastNode: InlineSyntax | undefined;\n}\n\ninterface SafePoint {\n readonly offset: number;\n readonly textStart: number;\n readonly output: number;\n readonly invalid: number;\n readonly references: number;\n}\n\n/** A paragraph owns its continuation; edits start a new parse. */\nexport class InlineParser {\n readonly #syntax: ResolvedSyntaxOptions;\n #state: ResumeState | undefined;\n #definitions: DefinitionLookup = emptyDefinitions;\n\n public constructor(syntax: ResolvedSyntaxOptions) {\n this.#syntax = syntax;\n }\n\n public parse(\n input: InlineInput,\n definitions: DefinitionLookup = emptyDefinitions,\n ): InlineParseResult {\n const previous = this.#state;\n\n const stable =\n previous === undefined ||\n definitions === this.#definitions ||\n previous.references.every((id) => definitions.has(id) === this.#definitions.has(id));\n\n const state = stable ? previous : undefined;\n this.#definitions = definitions;\n const resumed = state !== undefined && input.extends(state.input) ? state : undefined;\n const scan = new InlineScan(input, this.#syntax, resumed, true, definitions);\n const parsed = scan.run();\n this.#state = scan.state;\n\n return parsed;\n }\n}\n\n/** Complete input uses the same grammar without retaining preview state. */\nexport function parseInline(\n input: InlineInput,\n syntax: ResolvedSyntaxOptions,\n definitions: DefinitionLookup = emptyDefinitions,\n): InlineParseResult {\n return new InlineScan(input, syntax, undefined, false, definitions).run();\n}\n\nconst emptyDefinitions: DefinitionLookup = new Set<string>();\n\nconst INLINE_MARKERS = /[\\\\\\r\\n \\t![\\]`&{<_*~:$hHwW]/gu;\n\nconst EMAIL_MARKERS = /[\\\\\\r\\n \\t![\\]`&{<_*~:$A-Za-z\\d.+-]/gu;\n\n/** One inline parse: the output sequence, the delimiter and bracket stacks, and the cursor. */\nclass InlineScan {\n public state: ResumeState | undefined;\n readonly #input: InlineInput;\n readonly #value: SourceText;\n readonly #syntax: ResolvedSyntaxOptions;\n readonly #resumed: ResumeState | undefined;\n readonly #preview: boolean;\n readonly #emailAutolinks: boolean;\n readonly #output: Output[];\n readonly #delimiters: Delimiter[] = [];\n readonly #brackets: Bracket[] = [];\n readonly #invalid: InvalidInlineSyntax[];\n readonly #definitions: DefinitionLookup;\n readonly #references: Set<string>;\n #openEmbedded: PendingCandidate | undefined;\n #textStart: number;\n #offset: number;\n #safe: SafePoint | undefined;\n /** A construct that failed only because input ended may still close, changing earlier output. */\n #stable = true;\n\n public constructor(\n input: InlineInput,\n syntax: ResolvedSyntaxOptions,\n resumed: ResumeState | undefined,\n preview: boolean,\n definitions: DefinitionLookup,\n ) {\n const value = input.text();\n this.#input = input;\n this.#value = value;\n this.#syntax = syntax;\n this.#resumed = resumed;\n this.#preview = preview;\n this.#definitions = definitions;\n this.#references = new Set(resumed?.references);\n this.#output = resumed === undefined ? [] : resumed.output;\n this.#output.length = resumed?.outputLength ?? 0;\n this.#invalid = resumed === undefined ? [] : [...resumed.invalid];\n this.#textStart = resumed?.textStart ?? 0;\n this.#offset = resumed?.offset ?? 0;\n this.#emailAutolinks = value.indexOf(\"@\", this.#offset) !== -1;\n }\n\n public run(): InlineParseResult {\n while (this.#offset < this.#value.length) {\n const character = this.#value.char(this.#offset) ?? \"\";\n\n if (this.#preview) {\n this.recordSafePoint(character);\n }\n\n if (!this.scanConstruct(character)) {\n this.#offset = this.#value.findCharacter(\n this.#emailAutolinks ? EMAIL_MARKERS : INLINE_MARKERS,\n this.#offset + 1,\n );\n }\n }\n\n // Input that ends with a line ending can resume after it.\n if (this.#preview) {\n this.recordSafePoint();\n }\n\n this.flushText(this.#value.length);\n resolveDelimiters(this.#input, this.#output, this.#delimiters, this.#syntax);\n\n return this.result();\n }\n\n private result(): InlineParseResult {\n const input = this.#input;\n const output = this.#output;\n const resumed = this.#resumed;\n const resumedLength = resumed?.outputLength ?? 0;\n\n const unsettled = this.#preview\n ? pendingInline(\n input,\n this.#value,\n output,\n this.#openEmbedded,\n this.#syntax,\n resumed?.offset ?? 0,\n resumedLength,\n this.#safe?.offset,\n )\n : undefined;\n\n const pending = unsettled?.pending;\n let safe = this.#safe;\n\n // Raw pending syntax can start inside a construct consumed by the grammar.\n // Keep that candidate in the retry region rather than skipping it next time.\n if (safe !== undefined && unsettled !== undefined && unsettled.earliest < safe.offset) {\n safe = undefined;\n }\n\n const nodes = resumed?.nodes ?? [];\n let changedFrom = resumed?.nodesLength ?? 0;\n\n if (resumed !== undefined) {\n nodes.length = resumed.nodesLength;\n\n if (resumed.lastNode !== undefined) {\n nodes[nodes.length - 1] = resumed.lastNode;\n\n if (resumed.lastNode.kind === \"text\") {\n changedFrom--;\n }\n }\n }\n\n const end = safe?.output ?? resumedLength;\n\n if (end > resumedLength) {\n convertOutput(input, output.slice(resumedLength, end), nodes);\n }\n\n this.state =\n safe === undefined\n ? resumed\n : {\n offset: safe.offset,\n textStart: safe.textStart,\n input,\n output,\n outputLength: safe.output,\n invalid: this.#invalid.slice(0, safe.invalid),\n references: [...this.#references].slice(0, safe.references),\n nodes,\n nodesLength: nodes.length,\n lastNode: nodes.at(-1),\n };\n\n convertOutput(input, end === 0 ? output : output.slice(end), nodes);\n\n return {\n nodes,\n invalid: this.#invalid,\n pending,\n changedFrom,\n references: [...this.#references],\n };\n }\n\n /** Consumes the construct at the cursor, in CommonMark precedence order. */\n private scanConstruct(character: string): boolean {\n switch (character) {\n case \":\":\n return this.scanDirective();\n case \"\\\\\":\n return this.scanTexMath() || this.scanBackslash();\n case \"$\":\n return this.scanDollarMath();\n case \"\\n\":\n case \"\\r\":\n return this.scanSpaceBreak(character);\n case \"!\":\n case \"[\":\n return this.scanOpenBracket(character);\n case \"]\":\n return this.scanCloseBracket();\n case \"`\":\n return this.scanCodeSpan();\n case \"&\":\n return this.scanCharacterReference();\n case \"{\":\n return this.scanExpression();\n case \"<\":\n return this.scanAngle();\n case \"_\":\n return this.scanAutolink(character) || this.scanDelimiterRun(character);\n case \"*\":\n case \"~\":\n return this.scanDelimiterRun(character);\n default:\n return this.scanAutolink(character);\n }\n }\n\n /** Known whitespace ends a token; open constructs keep their earlier retry point. */\n private recordSafePoint(character?: string): void {\n const previous = this.#value.char(this.#offset - 1);\n\n if (\n this.#stable &&\n this.#offset > (this.#resumed?.offset ?? 0) &&\n (character === \" \" ||\n character === \"\\t\" ||\n previous === \"\\n\" ||\n (previous === \"\\r\" && character !== \"\\n\")) &&\n this.#brackets.length === 0 &&\n !this.#delimiters.some((delimiter) => delimiter.canOpen)\n ) {\n this.#safe = {\n offset: this.#offset,\n textStart: this.#textStart,\n output: this.#output.length,\n invalid: this.#invalid.length,\n references: this.#references.size,\n };\n }\n }\n\n private scanDirective(): boolean {\n if (!this.#syntax.directives) {\n return false;\n }\n\n const directive = inlineDirective(this.#input, this.#value, this.#offset);\n this.#stable &&= directive !== undefined || !directiveUnfinished(this.#value, this.#offset);\n\n return directive !== undefined && this.emit(directive);\n }\n\n private scanTexMath(): boolean {\n if (this.#value.char(this.#offset + 1) !== \"(\" || !this.#syntax.math.includes(\"tex\")) {\n return false;\n }\n\n const math = texMath(this.#input, this.#value, this.#offset);\n this.#stable &&= math !== undefined;\n\n return math !== undefined && this.emit(math);\n }\n\n private scanDollarMath(): boolean {\n if (!this.#syntax.math.includes(\"dollar\")) {\n return false;\n }\n\n const math = dollarMath(this.#input, this.#value, this.#offset);\n this.#stable &&= math !== undefined || !dollarUnclosed(this.#value, this.#offset);\n\n return math !== undefined && this.emit(math);\n }\n\n /** Two or more spaces before a line ending make a hard break. */\n private scanSpaceBreak(character: \"\\n\" | \"\\r\"): boolean {\n const value = this.#value;\n let spaces = this.#offset;\n\n while (spaces > this.#textStart && value.char(spaces - 1) === \" \") {\n spaces--;\n }\n\n if (this.#offset - spaces < 2) {\n return false;\n }\n\n this.flushText(spaces);\n\n const end =\n character === \"\\r\" && value.char(this.#offset + 1) === \"\\n\"\n ? this.#offset + 2\n : this.#offset + 1;\n\n this.#output.push({ kind: \"hardBreak\", range: this.#input.sourceRange(spaces, end) });\n\n return this.advance(end);\n }\n\n private scanAutolink(character: string): boolean {\n if (this.#brackets.length > 0) {\n return false;\n }\n\n // Without an @, only HTTP and www prefixes can start a literal link.\n if (!this.#emailAutolinks && !\"hHwW\".includes(character)) {\n return false;\n }\n\n const autolink = matchLiteralAutolink(this.#input, this.#value, this.#offset);\n\n return autolink !== undefined && this.emit(autolink);\n }\n\n private scanOpenBracket(character: \"!\" | \"[\"): boolean {\n const image = character === \"!\" && this.#value.char(this.#offset + 1) === \"[\";\n\n if (character !== \"[\" && !image) {\n return false;\n }\n\n this.flushText(this.#offset);\n const bracket: Bracket = { active: true, image, start: this.#offset };\n this.#output.push(bracket);\n this.#brackets.push(bracket);\n\n return this.advance(this.#offset + (image ? 2 : 1));\n }\n\n private scanCloseBracket(): boolean {\n const bracket = this.#brackets.at(-1);\n\n if (bracket === undefined) {\n return false;\n }\n\n this.flushText(this.#offset);\n this.#brackets.pop();\n\n const resolved = resolveBracket(\n this.#input,\n this.#value,\n this.#offset,\n bracket,\n this.#output,\n this.#delimiters,\n this.#syntax,\n this.#definitions,\n this.#references,\n this.#brackets.length > 0,\n );\n\n this.#stable &&= resolved !== undefined;\n\n if (resolved === undefined) {\n this.#output.push(textNode(this.#input, this.#value, this.#offset, this.#offset + 1));\n\n return this.advance(this.#offset + 1);\n }\n\n // Links cannot contain links, so a link deactivates the open link brackets around it.\n if (resolved.link) {\n for (const opener of this.#brackets) {\n if (!opener.image) {\n opener.active = false;\n }\n }\n }\n\n return this.advance(resolved.end);\n }\n\n /** A backslash before a line ending is a hard break; before punctuation, an escape. */\n private scanBackslash(): boolean {\n const next = this.#value.char(this.#offset + 1);\n\n if (next === \"\\n\" || next === \"\\r\") {\n this.flushText(this.#offset);\n\n const end =\n next === \"\\r\" && this.#value.char(this.#offset + 2) === \"\\n\"\n ? this.#offset + 3\n : this.#offset + 2;\n\n this.#output.push({ kind: \"hardBreak\", range: this.#input.sourceRange(this.#offset, end) });\n\n return this.advance(end);\n }\n\n if (next === undefined || !isAsciiPunctuation(next)) {\n return false;\n }\n\n this.flushText(this.#offset);\n this.#output.push(textNode(this.#input, this.#value, this.#offset + 1, this.#offset + 2));\n\n return this.advance(this.#offset + 2);\n }\n\n private scanCodeSpan(): boolean {\n const code = codeSpan(this.#input, this.#value, this.#offset);\n this.#stable &&= code !== undefined;\n\n return code !== undefined && this.emit(code);\n }\n\n private scanCharacterReference(): boolean {\n const reference = characterReference(this.#input, this.#value, this.#offset);\n\n return reference !== undefined && this.emit(reference);\n }\n\n private scanExpression(): boolean {\n const expression = expressionNode(this.#input, this.#value, this.#offset);\n\n if (expression === undefined) {\n return false;\n }\n\n const range = this.#input.sourceRange(this.#offset, expression.end);\n this.flushText(this.#offset);\n this.#stable &&= !expression.open;\n\n if (expression.node === undefined) {\n this.#invalid.push({ range, syntax: \"expression\", open: expression.open });\n\n if (expression.open) {\n this.#openEmbedded = { start: this.#offset, pending: { kind: \"expression\", range } };\n }\n\n this.#output.push(textNode(this.#input, this.#value, this.#offset, expression.end));\n } else {\n this.#output.push(expression.node);\n }\n\n return this.advance(expression.end);\n }\n\n private scanAngle(): boolean {\n const angle = angleNode(this.#input, this.#value, this.#offset);\n\n if (angle === undefined) {\n return false;\n }\n\n const range = this.#input.sourceRange(this.#offset, angle.end);\n this.flushText(this.#offset);\n this.#stable &&= !angle.open;\n\n if (angle.invalid) {\n this.#invalid.push({ range, syntax: \"jsx\", open: angle.open });\n\n if (angle.open) {\n this.#openEmbedded = { start: this.#offset, pending: { kind: \"jsx\", range } };\n }\n }\n\n this.#output.push(angle.node);\n\n return this.advance(angle.end);\n }\n\n private scanDelimiterRun(character: \"*\" | \"_\" | \"~\"): boolean {\n const runEnd = markerRunEnd(this.#value, this.#offset, character);\n\n if (character === \"~\" && runEnd - this.#offset < (this.#syntax.singleTilde ? 1 : 2)) {\n return false;\n }\n\n this.flushText(this.#offset);\n const delimiter = createDelimiter(this.#value, this.#offset, runEnd, character);\n this.#output.push(delimiter);\n this.#delimiters.push(delimiter);\n resolveCloser(\n this.#input,\n this.#output,\n this.#delimiters,\n delimiter,\n this.#syntax,\n this.#brackets.at(-1)?.start ?? -1,\n );\n\n return this.advance(runEnd);\n }\n\n /** Appends a matched construct and moves the cursor after it. */\n private emit(match: InlineMatch): true {\n this.flushText(this.#offset);\n this.#output.push(match.node);\n\n return this.advance(match.end);\n }\n\n private advance(end: number): true {\n this.#offset = end;\n this.#textStart = end;\n\n return true;\n }\n\n private flushText(end: number): void {\n if (end > this.#textStart) {\n this.#output.push(textNode(this.#input, this.#value, this.#textStart, end));\n }\n\n this.#textStart = end;\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { ResolvedSyntaxOptions } from "../syntax-options.mjs";
|
|
2
|
+
import { SourceText } from "../source-text.mjs";
|
|
3
|
+
import { InlineInput } from "./inline-input.mjs";
|
|
4
|
+
import { InlinePendingSyntax } from "./inline-syntax.mjs";
|
|
5
|
+
import { Output } from "./inline-output.mjs";
|
|
6
|
+
//#region src/parser/inline-pending.d.ts
|
|
7
|
+
export interface PendingCandidate {
|
|
8
|
+
readonly start: number;
|
|
9
|
+
readonly pending: InlinePendingSyntax;
|
|
10
|
+
}
|
|
11
|
+
export interface PendingInlineResult {
|
|
12
|
+
readonly pending: InlinePendingSyntax | undefined;
|
|
13
|
+
/** Earliest raw syntax future input can change; the input length means none remains. */
|
|
14
|
+
readonly earliest: number;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* The construct still open at the end of the input. Before `from`, a safe
|
|
18
|
+
* point, every construct is closed, so scans start there, and at `fromOutput`
|
|
19
|
+
* in the output.
|
|
20
|
+
*/
|
|
21
|
+
export declare function pendingInline(input: InlineInput, value: SourceText, output: readonly Output[], openEmbedded: PendingCandidate | undefined, syntax: ResolvedSyntaxOptions, from: number, fromOutput: number, checkpoint: number | undefined): PendingInlineResult;
|
|
22
|
+
//#endregion
|
|
23
|
+
//# sourceMappingURL=inline-pending.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inline-pending.d.mts","names":[],"sources":["../../src/parser/inline-pending.ts"],"mappings":";;;;;;iBAUiB;WACN;WACA,SAAS;;iBAGH;WACN,SAAS;;WAET;;;;;;;wBAQK,cACd,OAAO,aACP,OAAO,YACP,iBAAiB,UACjB,cAAc,8BACd,QAAQ,uBACR,cACA,oBACA,iCACC"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { isUnicodeWhitespace } from "./characters.mjs";
|
|
2
|
+
import { convertOutput, isDelimiter, markerRunEnd, textNode } from "./inline-output.mjs";
|
|
3
|
+
import { codeSpan } from "./inline-code.mjs";
|
|
4
|
+
//#region src/parser/inline-pending.ts
|
|
5
|
+
/**
|
|
6
|
+
* The construct still open at the end of the input. Before `from`, a safe
|
|
7
|
+
* point, every construct is closed, so scans start there, and at `fromOutput`
|
|
8
|
+
* in the output.
|
|
9
|
+
*/
|
|
10
|
+
function pendingInline(input, value, output, openEmbedded, syntax, from, fromOutput, checkpoint) {
|
|
11
|
+
const candidates = openEmbedded === void 0 ? [] : [openEmbedded];
|
|
12
|
+
let earliest = value.length;
|
|
13
|
+
for (let index = output.length - 1; index >= fromOutput; index--) {
|
|
14
|
+
const opener = output[index];
|
|
15
|
+
if (!isDelimiter(opener) || !opener.canOpen || index === output.length - 1) continue;
|
|
16
|
+
const kind = opener.marker === "~" ? opener.length >= (syntax.singleTilde ? 1 : 2) ? "delete" : void 0 : opener.length >= 2 ? "strong" : "emphasis";
|
|
17
|
+
if (kind === void 0 || isUnicodeWhitespace(value.char(opener.start + opener.length) ?? "")) continue;
|
|
18
|
+
candidates.push({
|
|
19
|
+
start: opener.start,
|
|
20
|
+
pending: {
|
|
21
|
+
kind,
|
|
22
|
+
range: input.sourceRange(opener.start, input.length),
|
|
23
|
+
children: convertOutput(input, output.slice(index + 1))
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
break;
|
|
27
|
+
}
|
|
28
|
+
for (let offset = value.indexOf("`", from); offset !== -1;) {
|
|
29
|
+
const matched = codeSpan(input, value, offset);
|
|
30
|
+
if (matched !== void 0) {
|
|
31
|
+
if (checkpoint !== void 0 && offset < checkpoint && matched.end > checkpoint) earliest = Math.min(earliest, offset);
|
|
32
|
+
offset = value.indexOf("`", matched.end);
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
const openingEnd = markerRunEnd(value, offset, "`");
|
|
36
|
+
earliest = Math.min(earliest, offset);
|
|
37
|
+
if (openingEnd < value.length) candidates.push({
|
|
38
|
+
start: offset,
|
|
39
|
+
pending: {
|
|
40
|
+
kind: "code",
|
|
41
|
+
range: input.sourceRange(offset, input.length),
|
|
42
|
+
value: value.slice(openingEnd).replace(/\r\n|[\r\n]/gu, " ")
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
const suffix = value.slice(from);
|
|
48
|
+
const label = /!?\[[^\]]*\]?$/u.exec(suffix);
|
|
49
|
+
if (label !== null) earliest = Math.min(earliest, from + label.index);
|
|
50
|
+
const pendingLink = /(!?)\[([^\]]+)\]\(([^)]*)$/u.exec(suffix);
|
|
51
|
+
if (pendingLink !== null) {
|
|
52
|
+
const start = from + pendingLink.index;
|
|
53
|
+
const image = pendingLink[1] === "!";
|
|
54
|
+
candidates.push({
|
|
55
|
+
start,
|
|
56
|
+
pending: image ? {
|
|
57
|
+
kind: "image",
|
|
58
|
+
range: input.sourceRange(start, input.length),
|
|
59
|
+
alt: pendingLink[2]
|
|
60
|
+
} : {
|
|
61
|
+
kind: "link",
|
|
62
|
+
range: input.sourceRange(start, input.length),
|
|
63
|
+
children: [textNode(input, value, start + 1, start + 1 + pendingLink[2].length)]
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
if (syntax.math.includes("tex")) {
|
|
68
|
+
const start = value.lastIndexOf("\\(");
|
|
69
|
+
if (start !== -1 && value.indexOf("\\)", start + 2) === -1 && start + 2 < value.length) candidates.push({
|
|
70
|
+
start,
|
|
71
|
+
pending: {
|
|
72
|
+
kind: "math",
|
|
73
|
+
range: input.sourceRange(start, input.length),
|
|
74
|
+
value: value.slice(start + 2),
|
|
75
|
+
format: "tex"
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
if (syntax.math.includes("dollar")) {
|
|
80
|
+
const start = value.lastIndexOf("$");
|
|
81
|
+
if (start !== -1 && start + 1 < value.length && !isUnicodeWhitespace(value.char(start + 1) ?? "")) candidates.push({
|
|
82
|
+
start,
|
|
83
|
+
pending: {
|
|
84
|
+
kind: "math",
|
|
85
|
+
range: input.sourceRange(start, input.length),
|
|
86
|
+
value: value.slice(start + 1),
|
|
87
|
+
format: "dollar"
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
candidates.sort((left, right) => right.start - left.start);
|
|
92
|
+
return {
|
|
93
|
+
pending: candidates[0]?.pending,
|
|
94
|
+
earliest: Math.min(earliest, candidates.at(-1)?.start ?? value.length)
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
//#endregion
|
|
98
|
+
export { pendingInline };
|
|
99
|
+
|
|
100
|
+
//# sourceMappingURL=inline-pending.mjs.map
|