@temelj/mdx 0.14.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 -9
- package/dist/mod.mjs +19 -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 +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 -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,386 @@
|
|
|
1
|
+
import { normalizeIdentifier } from "../identifier.mjs";
|
|
2
|
+
import { sourceRange } from "../ranges.mjs";
|
|
3
|
+
import { consumeIndent, findUnescaped, isEscaped, isSpaceOrTab } from "./characters.mjs";
|
|
4
|
+
import { matched, noMatch } from "./recognizer.mjs";
|
|
5
|
+
//#region src/parser/block-leaf-recognizers.ts
|
|
6
|
+
const recognizeRawHtml = (source, line) => {
|
|
7
|
+
const content = source.slice(line.content.start, line.content.end);
|
|
8
|
+
const indent = leadingIndent(content);
|
|
9
|
+
if (indent > 3) return noMatch;
|
|
10
|
+
const value = content.slice(indent);
|
|
11
|
+
const closing = value.startsWith("<!--") ? "-->" : value.startsWith("<?") ? "?>" : value.startsWith("<![CDATA[") ? "]]>" : /^<![A-Z]/u.test(value) ? ">" : void 0;
|
|
12
|
+
if (closing === void 0) return noMatch;
|
|
13
|
+
const range = sourceRange(line.range.start, line.range.end);
|
|
14
|
+
return value.includes(closing, 2) ? matched({
|
|
15
|
+
kind: "block",
|
|
16
|
+
block: {
|
|
17
|
+
kind: "rawHtml",
|
|
18
|
+
range
|
|
19
|
+
}
|
|
20
|
+
}) : matched({
|
|
21
|
+
kind: "openLeaf",
|
|
22
|
+
leaf: {
|
|
23
|
+
kind: "html",
|
|
24
|
+
start: line.range.start,
|
|
25
|
+
end: line.range.end,
|
|
26
|
+
closing
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
};
|
|
30
|
+
function matchFrontmatter(source, line, syntax) {
|
|
31
|
+
const value = source.slice(line.content.start, line.content.end).trim();
|
|
32
|
+
const format = value === "---" ? "yaml" : value === "+++" ? "toml" : void 0;
|
|
33
|
+
if (format === void 0 || !syntax.frontmatter.includes(format)) return;
|
|
34
|
+
return {
|
|
35
|
+
kind: "frontmatter",
|
|
36
|
+
start: line.range.start,
|
|
37
|
+
end: line.range.end,
|
|
38
|
+
valueStart: line.range.end,
|
|
39
|
+
valueEnd: line.range.end,
|
|
40
|
+
format,
|
|
41
|
+
fence: format === "yaml" ? "---" : "+++"
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
function recognizeFrontmatter(source, line, syntax) {
|
|
45
|
+
const match = matchFrontmatter(source, line, syntax);
|
|
46
|
+
return match === void 0 ? noMatch : matched(match);
|
|
47
|
+
}
|
|
48
|
+
function matchMathFence(source, line, syntax) {
|
|
49
|
+
const content = source.slice(line.content.start, line.content.end);
|
|
50
|
+
const indent = leadingIndent(content);
|
|
51
|
+
if (indent > 3) return;
|
|
52
|
+
if (syntax.math.includes("tex") && content.slice(indent).trim() === "\\[") return {
|
|
53
|
+
kind: "math",
|
|
54
|
+
start: line.range.start,
|
|
55
|
+
end: line.range.end,
|
|
56
|
+
value: [],
|
|
57
|
+
format: "tex",
|
|
58
|
+
fence: "tex",
|
|
59
|
+
fenceLength: 2,
|
|
60
|
+
meta: void 0
|
|
61
|
+
};
|
|
62
|
+
if (!syntax.math.includes("dollar") || content[indent] !== "$") return;
|
|
63
|
+
let markerEnd = indent;
|
|
64
|
+
while (content[markerEnd] === "$") markerEnd++;
|
|
65
|
+
const fenceLength = markerEnd - indent;
|
|
66
|
+
if (fenceLength < 2) return;
|
|
67
|
+
let metaStart = markerEnd;
|
|
68
|
+
while (isSpaceOrTab(content[metaStart])) metaStart++;
|
|
69
|
+
return {
|
|
70
|
+
kind: "math",
|
|
71
|
+
start: line.range.start,
|
|
72
|
+
end: line.range.end,
|
|
73
|
+
value: [],
|
|
74
|
+
format: "dollar",
|
|
75
|
+
fence: "dollar",
|
|
76
|
+
fenceLength,
|
|
77
|
+
meta: metaStart === content.length ? void 0 : sourceRange(line.content.start + metaStart, line.content.end)
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
function recognizeMathFence(source, line, syntax) {
|
|
81
|
+
const match = matchMathFence(source, line, syntax);
|
|
82
|
+
return match === void 0 ? noMatch : matched(match);
|
|
83
|
+
}
|
|
84
|
+
function matchSameLineMath(source, line, syntax) {
|
|
85
|
+
const content = source.slice(line.content.start, line.content.end);
|
|
86
|
+
const indent = leadingIndent(content);
|
|
87
|
+
if (indent > 3) return;
|
|
88
|
+
const value = content.slice(indent);
|
|
89
|
+
const trimmed = value.trimEnd();
|
|
90
|
+
if (syntax.math.includes("tex") && trimmed.startsWith("\\[") && trimmed.endsWith("\\]") && trimmed.length > 4) return {
|
|
91
|
+
kind: "math",
|
|
92
|
+
range: sourceRange(line.range.start, line.content.end),
|
|
93
|
+
value: [{
|
|
94
|
+
kind: "source",
|
|
95
|
+
range: sourceRange(line.content.start + indent + 2, line.content.start + indent + trimmed.length - 2)
|
|
96
|
+
}],
|
|
97
|
+
format: "tex",
|
|
98
|
+
meta: void 0
|
|
99
|
+
};
|
|
100
|
+
if (!syntax.math.includes("dollar") || !value.startsWith("$$")) return;
|
|
101
|
+
let fenceLength = 0;
|
|
102
|
+
while (value[fenceLength] === "$") fenceLength++;
|
|
103
|
+
let closingStart = value.length;
|
|
104
|
+
while (value[closingStart - 1] === "$") closingStart--;
|
|
105
|
+
if (value.length - closingStart < fenceLength || closingStart <= fenceLength) return;
|
|
106
|
+
return {
|
|
107
|
+
kind: "math",
|
|
108
|
+
range: sourceRange(line.range.start, line.content.end),
|
|
109
|
+
value: [{
|
|
110
|
+
kind: "source",
|
|
111
|
+
range: sourceRange(line.content.start + indent + fenceLength, line.content.start + indent + closingStart)
|
|
112
|
+
}],
|
|
113
|
+
format: "dollar",
|
|
114
|
+
meta: void 0
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
function recognizeSameLineMath(source, line, syntax) {
|
|
118
|
+
const match = matchSameLineMath(source, line, syntax);
|
|
119
|
+
return match === void 0 ? noMatch : matched(match);
|
|
120
|
+
}
|
|
121
|
+
function trimLineEndingOffset(source, end) {
|
|
122
|
+
return source.char(end - 1) === "\n" && source.char(end - 2) === "\r" ? end - 2 : source.char(end - 1) === "\n" || source.char(end - 1) === "\r" ? end - 1 : end;
|
|
123
|
+
}
|
|
124
|
+
function isClosingMathFence(source, line, active) {
|
|
125
|
+
const content = source.slice(line.content.start, line.content.end);
|
|
126
|
+
const indent = leadingIndent(content);
|
|
127
|
+
if (indent > 3) return false;
|
|
128
|
+
if (active.fence === "tex") return content.slice(indent).trim() === "\\]";
|
|
129
|
+
let markerEnd = indent;
|
|
130
|
+
while (content[markerEnd] === "$") markerEnd++;
|
|
131
|
+
if (markerEnd - indent < active.fenceLength) return false;
|
|
132
|
+
while (isSpaceOrTab(content[markerEnd])) markerEnd++;
|
|
133
|
+
return markerEnd === content.length;
|
|
134
|
+
}
|
|
135
|
+
const recognizeDefinition = (source, line) => {
|
|
136
|
+
const end = line.content.end;
|
|
137
|
+
const labelStart = consumeIndent(source, line.content.start, end, 3).offset;
|
|
138
|
+
if (source.char(labelStart) !== "[") return noMatch;
|
|
139
|
+
const labelEnd = findUnescaped(source, "]", labelStart + 1, end);
|
|
140
|
+
if (labelEnd === void 0 || labelEnd === labelStart + 1 || labelEnd - labelStart > 1e3 || source.char(labelEnd + 1) !== ":" || source.char(labelStart + 1) === "^") return noMatch;
|
|
141
|
+
let cursor = labelEnd + 2;
|
|
142
|
+
while (cursor < end && isSpaceOrTab(source.char(cursor))) cursor++;
|
|
143
|
+
const destination = definitionDestination(source, cursor, end);
|
|
144
|
+
if (destination === void 0) return noMatch;
|
|
145
|
+
cursor = destination.next;
|
|
146
|
+
const beforeTitle = cursor;
|
|
147
|
+
while (cursor < end && isSpaceOrTab(source.char(cursor))) cursor++;
|
|
148
|
+
let title;
|
|
149
|
+
if (cursor < end) {
|
|
150
|
+
if (cursor === beforeTitle) return noMatch;
|
|
151
|
+
const opener = source.char(cursor);
|
|
152
|
+
const closer = opener === "(" ? ")" : opener === "\"" ? "\"" : opener === "'" ? "'" : void 0;
|
|
153
|
+
if (closer === void 0) return noMatch;
|
|
154
|
+
const titleEnd = findUnescaped(source, closer, cursor + 1, end);
|
|
155
|
+
if (titleEnd === void 0) return noMatch;
|
|
156
|
+
title = sourceRange(cursor + 1, titleEnd);
|
|
157
|
+
cursor = titleEnd + 1;
|
|
158
|
+
while (cursor < end && isSpaceOrTab(source.char(cursor))) cursor++;
|
|
159
|
+
}
|
|
160
|
+
if (cursor !== end) return noMatch;
|
|
161
|
+
return matched({
|
|
162
|
+
kind: "block",
|
|
163
|
+
block: {
|
|
164
|
+
kind: "definition",
|
|
165
|
+
range: sourceRange(line.range.start, line.content.end),
|
|
166
|
+
identifier: normalizeIdentifier(source.slice(labelStart + 1, labelEnd)),
|
|
167
|
+
destination: destination.range,
|
|
168
|
+
title
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
};
|
|
172
|
+
function definitionDestination(source, start, end) {
|
|
173
|
+
if (source.char(start) === "<") {
|
|
174
|
+
const close = findUnescaped(source, ">", start + 1, end);
|
|
175
|
+
return close === void 0 ? void 0 : {
|
|
176
|
+
range: sourceRange(start + 1, close),
|
|
177
|
+
next: close + 1
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
let cursor = start;
|
|
181
|
+
let depth = 0;
|
|
182
|
+
while (cursor < end && !isSpaceOrTab(source.char(cursor))) {
|
|
183
|
+
const character = source.char(cursor);
|
|
184
|
+
if (character === "(" && !isEscaped(source, cursor, start)) {
|
|
185
|
+
depth++;
|
|
186
|
+
if (depth > 32) return;
|
|
187
|
+
} else if (character === ")" && !isEscaped(source, cursor, start)) {
|
|
188
|
+
if (depth === 0) break;
|
|
189
|
+
depth--;
|
|
190
|
+
}
|
|
191
|
+
cursor++;
|
|
192
|
+
}
|
|
193
|
+
return cursor === start || depth !== 0 ? void 0 : {
|
|
194
|
+
range: sourceRange(start, cursor),
|
|
195
|
+
next: cursor
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
const recognizeAtxHeading = (source, line) => {
|
|
199
|
+
const content = source.slice(line.content.start, line.content.end);
|
|
200
|
+
const indent = leadingIndent(content);
|
|
201
|
+
if (indent > 3 || content[indent] !== "#") return noMatch;
|
|
202
|
+
let markerEnd = indent;
|
|
203
|
+
while (content[markerEnd] === "#") markerEnd++;
|
|
204
|
+
const depth = markerEnd - indent;
|
|
205
|
+
if (depth > 6 || markerEnd < content.length && !isSpaceOrTab(content[markerEnd])) return noMatch;
|
|
206
|
+
let valueStart = markerEnd;
|
|
207
|
+
while (isSpaceOrTab(content[valueStart])) valueStart++;
|
|
208
|
+
let valueEnd = content.length;
|
|
209
|
+
while (valueEnd > valueStart && isSpaceOrTab(content[valueEnd - 1])) valueEnd--;
|
|
210
|
+
let closingStart = valueEnd;
|
|
211
|
+
while (content[closingStart - 1] === "#") closingStart--;
|
|
212
|
+
if (closingStart < valueEnd && (closingStart === valueStart || isSpaceOrTab(content[closingStart - 1]))) {
|
|
213
|
+
valueEnd = closingStart;
|
|
214
|
+
while (valueEnd > valueStart && isSpaceOrTab(content[valueEnd - 1])) valueEnd--;
|
|
215
|
+
}
|
|
216
|
+
const inputRange = sourceRange(line.content.start + valueStart, line.content.start + valueEnd);
|
|
217
|
+
return matched({
|
|
218
|
+
kind: "block",
|
|
219
|
+
block: {
|
|
220
|
+
kind: "heading",
|
|
221
|
+
range: sourceRange(line.range.start, line.content.end),
|
|
222
|
+
depth: headingDepth(depth),
|
|
223
|
+
input: [{
|
|
224
|
+
kind: "source",
|
|
225
|
+
range: inputRange
|
|
226
|
+
}]
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
};
|
|
230
|
+
const recognizeThematicBreak = (source, line) => {
|
|
231
|
+
const content = source.slice(line.content.start, line.content.end);
|
|
232
|
+
const indent = leadingIndent(content);
|
|
233
|
+
const marker = content[indent];
|
|
234
|
+
if (indent > 3 || marker !== "*" && marker !== "-" && marker !== "_") return noMatch;
|
|
235
|
+
let count = 0;
|
|
236
|
+
for (let index = indent; index < content.length; index++) {
|
|
237
|
+
const character = content[index];
|
|
238
|
+
if (character === marker) count++;
|
|
239
|
+
else if (!isSpaceOrTab(character)) return noMatch;
|
|
240
|
+
}
|
|
241
|
+
return count < 3 ? noMatch : matched({
|
|
242
|
+
kind: "block",
|
|
243
|
+
block: {
|
|
244
|
+
kind: "thematicBreak",
|
|
245
|
+
range: sourceRange(line.range.start, line.content.end)
|
|
246
|
+
}
|
|
247
|
+
});
|
|
248
|
+
};
|
|
249
|
+
const recognizeFence = (source, line) => {
|
|
250
|
+
const content = source.slice(line.content.start, line.content.end);
|
|
251
|
+
const indent = leadingIndent(content);
|
|
252
|
+
const marker = content[indent];
|
|
253
|
+
if (indent > 3 || marker !== "`" && marker !== "~") return noMatch;
|
|
254
|
+
let markerEnd = indent;
|
|
255
|
+
while (content[markerEnd] === marker) markerEnd++;
|
|
256
|
+
const fenceLength = markerEnd - indent;
|
|
257
|
+
if (fenceLength < 3 || marker === "`" && content.slice(markerEnd).includes("`")) return noMatch;
|
|
258
|
+
let infoStart = markerEnd;
|
|
259
|
+
while (isSpaceOrTab(content[infoStart])) infoStart++;
|
|
260
|
+
let languageEnd = infoStart;
|
|
261
|
+
while (languageEnd < content.length && !isSpaceOrTab(content[languageEnd])) languageEnd++;
|
|
262
|
+
let metaStart = languageEnd;
|
|
263
|
+
while (isSpaceOrTab(content[metaStart])) metaStart++;
|
|
264
|
+
return matched({
|
|
265
|
+
kind: "openLeaf",
|
|
266
|
+
leaf: {
|
|
267
|
+
kind: "fencedCode",
|
|
268
|
+
start: line.range.start,
|
|
269
|
+
end: line.range.end,
|
|
270
|
+
value: [],
|
|
271
|
+
marker,
|
|
272
|
+
fenceLength,
|
|
273
|
+
language: languageEnd === infoStart ? void 0 : sourceRange(line.content.start + infoStart, line.content.start + languageEnd),
|
|
274
|
+
meta: metaStart === content.length ? void 0 : sourceRange(line.content.start + metaStart, line.content.end)
|
|
275
|
+
}
|
|
276
|
+
});
|
|
277
|
+
};
|
|
278
|
+
function recognizeTable(source, line, paragraph) {
|
|
279
|
+
if (paragraph.lines.length !== 1) return noMatch;
|
|
280
|
+
const headerSegment = paragraph.lines[0];
|
|
281
|
+
if (headerSegment.kind !== "source") return noMatch;
|
|
282
|
+
const header = tableRow(source, headerSegment.range);
|
|
283
|
+
const delimiterCells = tableCellRanges(source, line.content);
|
|
284
|
+
if (header.cells.length !== delimiterCells.length || delimiterCells.length === 0) return noMatch;
|
|
285
|
+
const alignments = [];
|
|
286
|
+
for (const segments of delimiterCells) {
|
|
287
|
+
const segment = segments[0];
|
|
288
|
+
if (segment?.kind !== "source") return noMatch;
|
|
289
|
+
const value = source.slice(segment.range.start, segment.range.end);
|
|
290
|
+
if (!/^:?-+:?$/u.test(value)) return noMatch;
|
|
291
|
+
alignments.push(value.startsWith(":") ? value.endsWith(":") ? "center" : "left" : value.endsWith(":") ? "right" : "none");
|
|
292
|
+
}
|
|
293
|
+
return matched({
|
|
294
|
+
kind: "table",
|
|
295
|
+
start: paragraph.start,
|
|
296
|
+
end: line.range.end,
|
|
297
|
+
alignments,
|
|
298
|
+
rows: [header]
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
function tableRow(source, range) {
|
|
302
|
+
return {
|
|
303
|
+
range,
|
|
304
|
+
cells: tableCellRanges(source, range)
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
function tableCellRanges(source, range) {
|
|
308
|
+
let start = range.start;
|
|
309
|
+
let end = range.end;
|
|
310
|
+
while (start < end && isSpaceOrTab(source.char(start))) start++;
|
|
311
|
+
while (end > start && isSpaceOrTab(source.char(end - 1))) end--;
|
|
312
|
+
if (source.char(start) === "|") start++;
|
|
313
|
+
if (source.char(end - 1) === "|" && !isEscaped(source, end - 1, start)) end--;
|
|
314
|
+
const cells = [];
|
|
315
|
+
let cellStart = start;
|
|
316
|
+
let codeFence = 0;
|
|
317
|
+
for (let offset = start; offset <= end; offset++) {
|
|
318
|
+
const character = source.char(offset);
|
|
319
|
+
if (character === "`" && !isEscaped(source, offset, start)) {
|
|
320
|
+
let runEnd = offset;
|
|
321
|
+
while (source.char(runEnd) === "`") runEnd++;
|
|
322
|
+
const run = runEnd - offset;
|
|
323
|
+
codeFence = codeFence === 0 ? run : codeFence === run ? 0 : codeFence;
|
|
324
|
+
offset = runEnd - 1;
|
|
325
|
+
}
|
|
326
|
+
if (offset === end || character === "|" && codeFence === 0 && !isEscaped(source, offset, start)) {
|
|
327
|
+
let valueStart = cellStart;
|
|
328
|
+
let valueEnd = offset;
|
|
329
|
+
while (valueStart < valueEnd && isSpaceOrTab(source.char(valueStart))) valueStart++;
|
|
330
|
+
while (valueEnd > valueStart && isSpaceOrTab(source.char(valueEnd - 1))) valueEnd--;
|
|
331
|
+
cells.push([{
|
|
332
|
+
kind: "source",
|
|
333
|
+
range: sourceRange(valueStart, valueEnd)
|
|
334
|
+
}]);
|
|
335
|
+
cellStart = offset + 1;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
return cells;
|
|
339
|
+
}
|
|
340
|
+
function recognizeSetext(source, line, paragraph) {
|
|
341
|
+
const content = source.slice(line.content.start, line.content.end);
|
|
342
|
+
const indent = leadingIndent(content);
|
|
343
|
+
const marker = content[indent];
|
|
344
|
+
if (indent > 3 || marker !== "=" && marker !== "-") return noMatch;
|
|
345
|
+
let index = indent;
|
|
346
|
+
while (content[index] === marker) index++;
|
|
347
|
+
while (isSpaceOrTab(content[index])) index++;
|
|
348
|
+
if (index !== content.length) return noMatch;
|
|
349
|
+
return matched({
|
|
350
|
+
kind: "heading",
|
|
351
|
+
range: sourceRange(paragraph.start, line.content.end),
|
|
352
|
+
depth: marker === "=" ? 1 : 2,
|
|
353
|
+
input: paragraph.lines
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
function isClosingFence(source, line, active) {
|
|
357
|
+
const content = source.slice(line.content.start, line.content.end);
|
|
358
|
+
const indent = leadingIndent(content);
|
|
359
|
+
if (indent > 3 || content[indent] !== active.marker) return false;
|
|
360
|
+
let markerEnd = indent;
|
|
361
|
+
while (content[markerEnd] === active.marker) markerEnd++;
|
|
362
|
+
if (markerEnd - indent < active.fenceLength) return false;
|
|
363
|
+
while (isSpaceOrTab(content[markerEnd])) markerEnd++;
|
|
364
|
+
return markerEnd === content.length;
|
|
365
|
+
}
|
|
366
|
+
function interruptsParagraph(source, line) {
|
|
367
|
+
return [
|
|
368
|
+
recognizeRawHtml,
|
|
369
|
+
recognizeFence,
|
|
370
|
+
recognizeAtxHeading,
|
|
371
|
+
recognizeThematicBreak
|
|
372
|
+
].some((recognize) => recognize(source, line).kind === "matched");
|
|
373
|
+
}
|
|
374
|
+
function headingDepth(value) {
|
|
375
|
+
if (value === 1 || value === 2 || value === 3 || value === 4 || value === 5 || value === 6) return value;
|
|
376
|
+
throw new Error(`Invalid ATX heading depth ${value}`);
|
|
377
|
+
}
|
|
378
|
+
function leadingIndent(value) {
|
|
379
|
+
let index = 0;
|
|
380
|
+
while (value[index] === " ") index++;
|
|
381
|
+
return index;
|
|
382
|
+
}
|
|
383
|
+
//#endregion
|
|
384
|
+
export { interruptsParagraph, isClosingFence, isClosingMathFence, recognizeAtxHeading, recognizeDefinition, recognizeFence, recognizeFrontmatter, recognizeMathFence, recognizeRawHtml, recognizeSameLineMath, recognizeSetext, recognizeTable, recognizeThematicBreak, tableRow, trimLineEndingOffset };
|
|
385
|
+
|
|
386
|
+
//# sourceMappingURL=block-leaf-recognizers.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"block-leaf-recognizers.mjs","names":[],"sources":["../../src/parser/block-leaf-recognizers.ts"],"sourcesContent":["import type { SourceRange } from \"../ranges.ts\";\nimport type { SourceText } from \"../source-text.ts\";\nimport type { PhysicalLine } from \"../source.ts\";\nimport type { ResolvedSyntaxOptions } from \"../syntax-options.ts\";\nimport type {\n BlockSyntax,\n OpenLeaf,\n TableAlignmentSyntax,\n TableRowSyntax,\n} from \"./block-syntax.ts\";\nimport type { InlineSegment } from \"./inline-input.ts\";\nimport type { RecognizerResult } from \"./recognizer.ts\";\n\nimport { normalizeIdentifier } from \"../identifier.ts\";\nimport { sourceRange } from \"../ranges.ts\";\nimport { consumeIndent } from \"./characters.ts\";\nimport { findUnescaped, isEscaped, isSpaceOrTab } from \"./characters.ts\";\nimport { matched, noMatch } from \"./recognizer.ts\";\n\ninterface RecognizedCompleteBlock {\n readonly kind: \"block\";\n readonly block: BlockSyntax;\n}\n\ninterface RecognizedOpenLeaf {\n readonly kind: \"openLeaf\";\n readonly leaf: Extract<OpenLeaf, { kind: \"fencedCode\" | \"html\" }>;\n}\n\ntype RecognizedBlock = RecognizedCompleteBlock | RecognizedOpenLeaf;\n\ntype BlockRecognizer = (\n source: SourceText,\n line: PhysicalLine,\n) => RecognizerResult<RecognizedBlock>;\n\nexport const recognizeRawHtml: BlockRecognizer = (source, line) => {\n const content = source.slice(line.content.start, line.content.end);\n const indent = leadingIndent(content);\n\n if (indent > 3) {\n return noMatch;\n }\n\n const value = content.slice(indent);\n\n const closing = value.startsWith(\"<!--\")\n ? \"-->\"\n : value.startsWith(\"<?\")\n ? \"?>\"\n : value.startsWith(\"<![CDATA[\")\n ? \"]]>\"\n : /^<![A-Z]/u.test(value)\n ? \">\"\n : undefined;\n\n if (closing === undefined) {\n return noMatch;\n }\n\n const range = sourceRange(line.range.start, line.range.end);\n\n return value.includes(closing, 2)\n ? matched({\n kind: \"block\",\n block: { kind: \"rawHtml\", range },\n })\n : matched({\n kind: \"openLeaf\",\n leaf: {\n kind: \"html\",\n start: line.range.start,\n end: line.range.end,\n closing,\n },\n });\n};\n\nfunction matchFrontmatter(\n source: SourceText,\n line: PhysicalLine,\n syntax: ResolvedSyntaxOptions,\n): Extract<OpenLeaf, { kind: \"frontmatter\" }> | undefined {\n const value = source.slice(line.content.start, line.content.end).trim();\n const format = value === \"---\" ? \"yaml\" : value === \"+++\" ? \"toml\" : undefined;\n\n if (format === undefined || !syntax.frontmatter.includes(format)) {\n return;\n }\n\n return {\n kind: \"frontmatter\",\n start: line.range.start,\n end: line.range.end,\n valueStart: line.range.end,\n valueEnd: line.range.end,\n format,\n fence: format === \"yaml\" ? \"---\" : \"+++\",\n };\n}\n\nexport function recognizeFrontmatter(\n source: SourceText,\n line: PhysicalLine,\n syntax: ResolvedSyntaxOptions,\n): RecognizerResult<Extract<OpenLeaf, { kind: \"frontmatter\" }>> {\n const match = matchFrontmatter(source, line, syntax);\n\n return match === undefined ? noMatch : matched(match);\n}\n\nfunction matchMathFence(\n source: SourceText,\n line: PhysicalLine,\n syntax: ResolvedSyntaxOptions,\n): Extract<OpenLeaf, { kind: \"math\" }> | undefined {\n const content = source.slice(line.content.start, line.content.end);\n const indent = leadingIndent(content);\n\n if (indent > 3) {\n return;\n }\n\n if (syntax.math.includes(\"tex\") && content.slice(indent).trim() === \"\\\\[\") {\n return {\n kind: \"math\",\n start: line.range.start,\n end: line.range.end,\n value: [],\n format: \"tex\",\n fence: \"tex\",\n fenceLength: 2,\n meta: undefined,\n };\n }\n\n if (!syntax.math.includes(\"dollar\") || content[indent] !== \"$\") {\n return;\n }\n\n let markerEnd = indent;\n\n while (content[markerEnd] === \"$\") {\n markerEnd++;\n }\n\n const fenceLength = markerEnd - indent;\n\n if (fenceLength < 2) {\n return;\n }\n\n let metaStart = markerEnd;\n\n while (isSpaceOrTab(content[metaStart])) {\n metaStart++;\n }\n\n return {\n kind: \"math\",\n start: line.range.start,\n end: line.range.end,\n value: [],\n format: \"dollar\",\n fence: \"dollar\",\n fenceLength,\n meta:\n metaStart === content.length\n ? undefined\n : sourceRange(line.content.start + metaStart, line.content.end),\n };\n}\n\nexport function recognizeMathFence(\n source: SourceText,\n line: PhysicalLine,\n syntax: ResolvedSyntaxOptions,\n): RecognizerResult<Extract<OpenLeaf, { kind: \"math\" }>> {\n const match = matchMathFence(source, line, syntax);\n\n return match === undefined ? noMatch : matched(match);\n}\n\nfunction matchSameLineMath(\n source: SourceText,\n line: PhysicalLine,\n syntax: ResolvedSyntaxOptions,\n): Extract<BlockSyntax, { kind: \"math\" }> | undefined {\n const content = source.slice(line.content.start, line.content.end);\n const indent = leadingIndent(content);\n\n if (indent > 3) {\n return;\n }\n\n const value = content.slice(indent);\n const trimmed = value.trimEnd();\n\n if (\n syntax.math.includes(\"tex\") &&\n trimmed.startsWith(\"\\\\[\") &&\n trimmed.endsWith(\"\\\\]\") &&\n trimmed.length > 4\n ) {\n return {\n kind: \"math\",\n range: sourceRange(line.range.start, line.content.end),\n value: [\n {\n kind: \"source\",\n range: sourceRange(\n line.content.start + indent + 2,\n line.content.start + indent + trimmed.length - 2,\n ),\n },\n ],\n format: \"tex\",\n meta: undefined,\n };\n }\n\n if (!syntax.math.includes(\"dollar\") || !value.startsWith(\"$$\")) {\n return;\n }\n\n let fenceLength = 0;\n\n while (value[fenceLength] === \"$\") {\n fenceLength++;\n }\n\n let closingStart = value.length;\n\n while (value[closingStart - 1] === \"$\") {\n closingStart--;\n }\n\n if (value.length - closingStart < fenceLength || closingStart <= fenceLength) {\n return;\n }\n\n return {\n kind: \"math\",\n range: sourceRange(line.range.start, line.content.end),\n value: [\n {\n kind: \"source\",\n range: sourceRange(\n line.content.start + indent + fenceLength,\n line.content.start + indent + closingStart,\n ),\n },\n ],\n format: \"dollar\",\n meta: undefined,\n };\n}\n\nexport function recognizeSameLineMath(\n source: SourceText,\n line: PhysicalLine,\n syntax: ResolvedSyntaxOptions,\n): RecognizerResult<Extract<BlockSyntax, { kind: \"math\" }>> {\n const match = matchSameLineMath(source, line, syntax);\n\n return match === undefined ? noMatch : matched(match);\n}\n\nexport function trimLineEndingOffset(source: SourceText, end: number): number {\n return source.char(end - 1) === \"\\n\" && source.char(end - 2) === \"\\r\"\n ? end - 2\n : source.char(end - 1) === \"\\n\" || source.char(end - 1) === \"\\r\"\n ? end - 1\n : end;\n}\n\nexport function isClosingMathFence(\n source: SourceText,\n line: PhysicalLine,\n active: Extract<OpenLeaf, { kind: \"math\" }>,\n): boolean {\n const content = source.slice(line.content.start, line.content.end);\n const indent = leadingIndent(content);\n\n if (indent > 3) {\n return false;\n }\n\n if (active.fence === \"tex\") {\n return content.slice(indent).trim() === \"\\\\]\";\n }\n\n let markerEnd = indent;\n\n while (content[markerEnd] === \"$\") {\n markerEnd++;\n }\n\n if (markerEnd - indent < active.fenceLength) {\n return false;\n }\n\n while (isSpaceOrTab(content[markerEnd])) {\n markerEnd++;\n }\n\n return markerEnd === content.length;\n}\n\nexport const recognizeDefinition: BlockRecognizer = (source, line) => {\n const end = line.content.end;\n const indent = consumeIndent(source, line.content.start, end, 3);\n const labelStart = indent.offset;\n\n if (source.char(labelStart) !== \"[\") {\n return noMatch;\n }\n\n const labelEnd = findUnescaped(source, \"]\", labelStart + 1, end);\n\n if (\n labelEnd === undefined ||\n labelEnd === labelStart + 1 ||\n labelEnd - labelStart > 1000 ||\n source.char(labelEnd + 1) !== \":\" ||\n source.char(labelStart + 1) === \"^\"\n ) {\n return noMatch;\n }\n\n let cursor = labelEnd + 2;\n\n while (cursor < end && isSpaceOrTab(source.char(cursor))) {\n cursor++;\n }\n\n const destination = definitionDestination(source, cursor, end);\n\n if (destination === undefined) {\n return noMatch;\n }\n\n cursor = destination.next;\n const beforeTitle = cursor;\n\n while (cursor < end && isSpaceOrTab(source.char(cursor))) {\n cursor++;\n }\n\n let title: SourceRange | undefined;\n\n if (cursor < end) {\n if (cursor === beforeTitle) {\n return noMatch;\n }\n\n const opener = source.char(cursor);\n const closer = opener === \"(\" ? \")\" : opener === '\"' ? '\"' : opener === \"'\" ? \"'\" : undefined;\n\n if (closer === undefined) {\n return noMatch;\n }\n\n const titleEnd = findUnescaped(source, closer, cursor + 1, end);\n\n if (titleEnd === undefined) {\n return noMatch;\n }\n\n title = sourceRange(cursor + 1, titleEnd);\n cursor = titleEnd + 1;\n\n while (cursor < end && isSpaceOrTab(source.char(cursor))) {\n cursor++;\n }\n }\n\n if (cursor !== end) {\n return noMatch;\n }\n\n return matched({\n kind: \"block\",\n block: {\n kind: \"definition\",\n range: sourceRange(line.range.start, line.content.end),\n identifier: normalizeIdentifier(source.slice(labelStart + 1, labelEnd)),\n destination: destination.range,\n title,\n },\n });\n};\n\ninterface DefinitionDestination {\n readonly range: SourceRange;\n readonly next: number;\n}\n\nfunction definitionDestination(\n source: SourceText,\n start: number,\n end: number,\n): DefinitionDestination | undefined {\n if (source.char(start) === \"<\") {\n const close = findUnescaped(source, \">\", start + 1, end);\n\n return close === undefined\n ? undefined\n : { range: sourceRange(start + 1, close), next: close + 1 };\n }\n\n let cursor = start;\n let depth = 0;\n\n while (cursor < end && !isSpaceOrTab(source.char(cursor))) {\n const character = source.char(cursor);\n\n if (character === \"(\" && !isEscaped(source, cursor, start)) {\n depth++;\n\n if (depth > 32) {\n return;\n }\n } else if (character === \")\" && !isEscaped(source, cursor, start)) {\n if (depth === 0) {\n break;\n }\n\n depth--;\n }\n\n cursor++;\n }\n\n return cursor === start || depth !== 0\n ? undefined\n : { range: sourceRange(start, cursor), next: cursor };\n}\n\nexport const recognizeAtxHeading: BlockRecognizer = (source, line) => {\n const content = source.slice(line.content.start, line.content.end);\n const indent = leadingIndent(content);\n\n if (indent > 3 || content[indent] !== \"#\") {\n return noMatch;\n }\n\n let markerEnd = indent;\n\n while (content[markerEnd] === \"#\") {\n markerEnd++;\n }\n\n const depth = markerEnd - indent;\n\n if (depth > 6 || (markerEnd < content.length && !isSpaceOrTab(content[markerEnd]))) {\n return noMatch;\n }\n\n let valueStart = markerEnd;\n\n while (isSpaceOrTab(content[valueStart])) {\n valueStart++;\n }\n\n let valueEnd = content.length;\n\n while (valueEnd > valueStart && isSpaceOrTab(content[valueEnd - 1])) {\n valueEnd--;\n }\n\n let closingStart = valueEnd;\n\n while (content[closingStart - 1] === \"#\") {\n closingStart--;\n }\n\n if (\n closingStart < valueEnd &&\n (closingStart === valueStart || isSpaceOrTab(content[closingStart - 1]))\n ) {\n valueEnd = closingStart;\n\n while (valueEnd > valueStart && isSpaceOrTab(content[valueEnd - 1])) {\n valueEnd--;\n }\n }\n\n const inputRange = sourceRange(line.content.start + valueStart, line.content.start + valueEnd);\n\n return matched({\n kind: \"block\",\n block: {\n kind: \"heading\",\n range: sourceRange(line.range.start, line.content.end),\n depth: headingDepth(depth),\n input: [{ kind: \"source\", range: inputRange }],\n },\n });\n};\n\nexport const recognizeThematicBreak: BlockRecognizer = (source, line) => {\n const content = source.slice(line.content.start, line.content.end);\n const indent = leadingIndent(content);\n const marker = content[indent];\n\n if (indent > 3 || (marker !== \"*\" && marker !== \"-\" && marker !== \"_\")) {\n return noMatch;\n }\n\n let count = 0;\n\n for (let index = indent; index < content.length; index++) {\n const character = content[index];\n\n if (character === marker) {\n count++;\n } else if (!isSpaceOrTab(character)) {\n return noMatch;\n }\n }\n\n return count < 3\n ? noMatch\n : matched({\n kind: \"block\",\n block: {\n kind: \"thematicBreak\",\n range: sourceRange(line.range.start, line.content.end),\n },\n });\n};\n\nexport const recognizeFence: BlockRecognizer = (source, line) => {\n const content = source.slice(line.content.start, line.content.end);\n const indent = leadingIndent(content);\n const marker = content[indent];\n\n if (indent > 3 || (marker !== \"`\" && marker !== \"~\")) {\n return noMatch;\n }\n\n let markerEnd = indent;\n\n while (content[markerEnd] === marker) {\n markerEnd++;\n }\n\n const fenceLength = markerEnd - indent;\n\n if (fenceLength < 3 || (marker === \"`\" && content.slice(markerEnd).includes(\"`\"))) {\n return noMatch;\n }\n\n let infoStart = markerEnd;\n\n while (isSpaceOrTab(content[infoStart])) {\n infoStart++;\n }\n\n let languageEnd = infoStart;\n\n while (languageEnd < content.length && !isSpaceOrTab(content[languageEnd])) {\n languageEnd++;\n }\n\n let metaStart = languageEnd;\n\n while (isSpaceOrTab(content[metaStart])) {\n metaStart++;\n }\n\n return matched({\n kind: \"openLeaf\",\n leaf: {\n kind: \"fencedCode\",\n start: line.range.start,\n end: line.range.end,\n value: [],\n marker,\n fenceLength,\n language:\n languageEnd === infoStart\n ? undefined\n : sourceRange(line.content.start + infoStart, line.content.start + languageEnd),\n meta:\n metaStart === content.length\n ? undefined\n : sourceRange(line.content.start + metaStart, line.content.end),\n },\n });\n};\n\nexport function recognizeTable(\n source: SourceText,\n line: PhysicalLine,\n paragraph: Extract<OpenLeaf, { kind: \"paragraph\" }>,\n): RecognizerResult<Extract<OpenLeaf, { kind: \"table\" }>> {\n if (paragraph.lines.length !== 1) {\n return noMatch;\n }\n\n const headerSegment = paragraph.lines[0];\n\n if (headerSegment.kind !== \"source\") {\n return noMatch;\n }\n\n const header = tableRow(source, headerSegment.range);\n const delimiterCells = tableCellRanges(source, line.content);\n\n if (header.cells.length !== delimiterCells.length || delimiterCells.length === 0) {\n return noMatch;\n }\n\n const alignments: TableAlignmentSyntax[] = [];\n\n for (const segments of delimiterCells) {\n const segment = segments[0];\n\n if (segment?.kind !== \"source\") {\n return noMatch;\n }\n\n const value = source.slice(segment.range.start, segment.range.end);\n\n if (!/^:?-+:?$/u.test(value)) {\n return noMatch;\n }\n\n alignments.push(\n value.startsWith(\":\")\n ? value.endsWith(\":\")\n ? \"center\"\n : \"left\"\n : value.endsWith(\":\")\n ? \"right\"\n : \"none\",\n );\n }\n\n return matched({\n kind: \"table\",\n start: paragraph.start,\n end: line.range.end,\n alignments: alignments,\n rows: [header],\n });\n}\n\nexport function tableRow(source: SourceText, range: SourceRange): TableRowSyntax {\n return { range, cells: tableCellRanges(source, range) };\n}\n\nfunction tableCellRanges(\n source: SourceText,\n range: SourceRange,\n): readonly (readonly InlineSegment[])[] {\n let start = range.start;\n let end = range.end;\n\n while (start < end && isSpaceOrTab(source.char(start))) {\n start++;\n }\n\n while (end > start && isSpaceOrTab(source.char(end - 1))) {\n end--;\n }\n\n if (source.char(start) === \"|\") {\n start++;\n }\n\n if (source.char(end - 1) === \"|\" && !isEscaped(source, end - 1, start)) {\n end--;\n }\n\n const cells: (readonly InlineSegment[])[] = [];\n let cellStart = start;\n let codeFence = 0;\n\n for (let offset = start; offset <= end; offset++) {\n const character = source.char(offset);\n\n if (character === \"`\" && !isEscaped(source, offset, start)) {\n let runEnd = offset;\n\n while (source.char(runEnd) === \"`\") {\n runEnd++;\n }\n\n const run = runEnd - offset;\n codeFence = codeFence === 0 ? run : codeFence === run ? 0 : codeFence;\n offset = runEnd - 1;\n }\n\n if (\n offset === end ||\n (character === \"|\" && codeFence === 0 && !isEscaped(source, offset, start))\n ) {\n let valueStart = cellStart;\n let valueEnd = offset;\n\n while (valueStart < valueEnd && isSpaceOrTab(source.char(valueStart))) {\n valueStart++;\n }\n\n while (valueEnd > valueStart && isSpaceOrTab(source.char(valueEnd - 1))) {\n valueEnd--;\n }\n\n cells.push([{ kind: \"source\", range: sourceRange(valueStart, valueEnd) }]);\n cellStart = offset + 1;\n }\n }\n\n return cells;\n}\n\nexport function recognizeSetext(\n source: SourceText,\n line: PhysicalLine,\n paragraph: Extract<OpenLeaf, { kind: \"paragraph\" }>,\n): RecognizerResult<BlockSyntax> {\n const content = source.slice(line.content.start, line.content.end);\n const indent = leadingIndent(content);\n const marker = content[indent];\n\n if (indent > 3 || (marker !== \"=\" && marker !== \"-\")) {\n return noMatch;\n }\n\n let index = indent;\n\n while (content[index] === marker) {\n index++;\n }\n\n while (isSpaceOrTab(content[index])) {\n index++;\n }\n\n if (index !== content.length) {\n return noMatch;\n }\n\n return matched({\n kind: \"heading\",\n range: sourceRange(paragraph.start, line.content.end),\n depth: marker === \"=\" ? 1 : 2,\n input: paragraph.lines,\n });\n}\n\nexport function isClosingFence(\n source: SourceText,\n line: PhysicalLine,\n active: Extract<OpenLeaf, { kind: \"fencedCode\" }>,\n): boolean {\n const content = source.slice(line.content.start, line.content.end);\n const indent = leadingIndent(content);\n\n if (indent > 3 || content[indent] !== active.marker) {\n return false;\n }\n\n let markerEnd = indent;\n\n while (content[markerEnd] === active.marker) {\n markerEnd++;\n }\n\n if (markerEnd - indent < active.fenceLength) {\n return false;\n }\n\n while (isSpaceOrTab(content[markerEnd])) {\n markerEnd++;\n }\n\n return markerEnd === content.length;\n}\n\nexport function interruptsParagraph(source: SourceText, line: PhysicalLine): boolean {\n return [recognizeRawHtml, recognizeFence, recognizeAtxHeading, recognizeThematicBreak].some(\n (recognize) => recognize(source, line).kind === \"matched\",\n );\n}\n\nfunction headingDepth(value: number): 1 | 2 | 3 | 4 | 5 | 6 {\n if (value === 1 || value === 2 || value === 3 || value === 4 || value === 5 || value === 6) {\n return value;\n }\n\n throw new Error(`Invalid ATX heading depth ${value}`);\n}\n\nfunction leadingIndent(value: string): number {\n let index = 0;\n\n while (value[index] === \" \") {\n index++;\n }\n\n return index;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { SourceRange } from "../ranges.mjs";
|
|
2
|
+
import { ResolvedSyntaxOptions } from "../syntax-options.mjs";
|
|
3
|
+
import { SourceText } from "../source-text.mjs";
|
|
4
|
+
import { PhysicalLine } from "../source.mjs";
|
|
5
|
+
import { BlockSyntax, PendingBlockSyntax } from "./block-syntax.mjs";
|
|
6
|
+
//#region src/parser/block-parser.d.ts
|
|
7
|
+
export interface BlockParserCheckpoint {
|
|
8
|
+
readonly length: number;
|
|
9
|
+
readonly tail: BlockSyntax | undefined;
|
|
10
|
+
}
|
|
11
|
+
/** Receives each top-level block once later input can no longer change it. */
|
|
12
|
+
export type SettledBlockListener = (block: BlockSyntax, index: number) => void;
|
|
13
|
+
export declare class BlockParser {
|
|
14
|
+
#private;
|
|
15
|
+
constructor(syntax: ResolvedSyntaxOptions, blocks?: readonly BlockSyntax[], onSettled?: SettledBlockListener);
|
|
16
|
+
/** The number of top-level blocks that later input cannot change. */
|
|
17
|
+
get settledCount(): number;
|
|
18
|
+
checkpoint(): BlockParserCheckpoint | undefined;
|
|
19
|
+
fork(checkpoint: BlockParserCheckpoint): BlockParser;
|
|
20
|
+
/**
|
|
21
|
+
* A copy of the unsettled part: a trailing list, the open containers, and
|
|
22
|
+
* the active leaf. Finishing it costs only the open tail.
|
|
23
|
+
*/
|
|
24
|
+
tail(): BlockParser;
|
|
25
|
+
pending(): PendingBlockSyntax | undefined;
|
|
26
|
+
write(source: SourceText, physicalLine: PhysicalLine): void;
|
|
27
|
+
private writeLine;
|
|
28
|
+
finish(source: SourceText): readonly BlockSyntax[];
|
|
29
|
+
private appendLeafBlocks;
|
|
30
|
+
private closeContainers;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Parses a nested flow region, such as multi-line JSX children, with offsets in
|
|
34
|
+
* the enclosing source. Frontmatter is never recognized inside the region.
|
|
35
|
+
*/
|
|
36
|
+
export declare function parseFlowRange(source: SourceText, range: SourceRange, syntax: ResolvedSyntaxOptions): readonly BlockSyntax[];
|
|
37
|
+
//#endregion
|
|
38
|
+
//# sourceMappingURL=block-parser.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"block-parser.d.mts","names":[],"sources":["../../src/parser/block-parser.ts"],"mappings":";;;;;;iBAuDiB;WACN;WACA,MAAM;;;YAIL,wBAAwB,OAAO,aAAa;qBAE3C;;EASX,YACE,QAAQ,uBACR,kBAAiB,eACjB,YAAY;;MAUH;EAIJ,cAAc;EAed,KAAK,YAAY,wBAAwB;;;;;EAczC,QAAQ;EASR,WAAW;EAIX,MAAM,QAAQ,YAAY,cAAc;UAUvC;EAkGD,OAAO,QAAQ,sBAAsB;UAQpC;UAMA;;;;;;wBAupCM,eACd,QAAQ,YACR,OAAO,aACP,QAAQ,iCACE"}
|