@temelj/mdx 0.13.0 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +468 -82
- package/dist/character-entities.d.mts +4 -0
- package/dist/character-entities.d.mts.map +1 -0
- package/dist/character-entities.mjs +2132 -0
- package/dist/character-entities.mjs.map +1 -0
- package/dist/character-reference.d.mts +6 -0
- package/dist/character-reference.d.mts.map +1 -0
- package/dist/character-reference.mjs +18 -0
- package/dist/character-reference.mjs.map +1 -0
- package/dist/compile-analysis.d.mts +28 -0
- package/dist/compile-analysis.d.mts.map +1 -0
- package/dist/compile-analysis.mjs +74 -0
- package/dist/compile-analysis.mjs.map +1 -0
- package/dist/compile-emit.d.mts +9 -0
- package/dist/compile-emit.d.mts.map +1 -0
- package/dist/compile-emit.mjs +187 -0
- package/dist/compile-emit.mjs.map +1 -0
- package/dist/compile-esm.d.mts +34 -0
- package/dist/compile-esm.d.mts.map +1 -0
- package/dist/compile-esm.mjs +187 -0
- package/dist/compile-esm.mjs.map +1 -0
- package/dist/compile-names.d.mts +13 -0
- package/dist/compile-names.d.mts.map +1 -0
- package/dist/compile-names.mjs +32 -0
- package/dist/compile-names.mjs.map +1 -0
- package/dist/compiler.d.mts +69 -85
- package/dist/compiler.d.mts.map +1 -1
- package/dist/compiler.mjs +185 -418
- package/dist/compiler.mjs.map +1 -1
- package/dist/diagnostics.d.mts +37 -0
- package/dist/diagnostics.d.mts.map +1 -0
- package/dist/diagnostics.mjs +57 -0
- package/dist/diagnostics.mjs.map +1 -0
- package/dist/errors.d.mts +157 -0
- package/dist/errors.d.mts.map +1 -0
- package/dist/errors.mjs +263 -0
- package/dist/errors.mjs.map +1 -0
- package/dist/footnote-numbering.d.mts +27 -0
- package/dist/footnote-numbering.d.mts.map +1 -0
- package/dist/footnote-numbering.mjs +49 -0
- package/dist/footnote-numbering.mjs.map +1 -0
- package/dist/format-context.d.mts +46 -0
- package/dist/format-context.d.mts.map +1 -0
- package/dist/format-context.mjs +26 -0
- package/dist/format-context.mjs.map +1 -0
- package/dist/format-directive.d.mts +9 -0
- package/dist/format-directive.d.mts.map +1 -0
- package/dist/format-directive.mjs +99 -0
- package/dist/format-directive.mjs.map +1 -0
- package/dist/format-jsx.d.mts +8 -0
- package/dist/format-jsx.d.mts.map +1 -0
- package/dist/format-jsx.mjs +47 -0
- package/dist/format-jsx.mjs.map +1 -0
- package/dist/format-math.d.mts +9 -0
- package/dist/format-math.d.mts.map +1 -0
- package/dist/format-math.mjs +79 -0
- package/dist/format-math.mjs.map +1 -0
- package/dist/format-safe.d.mts +25 -0
- package/dist/format-safe.d.mts.map +1 -0
- package/dist/format-safe.mjs +366 -0
- package/dist/format-safe.mjs.map +1 -0
- package/dist/format-table.d.mts +8 -0
- package/dist/format-table.d.mts.map +1 -0
- package/dist/format-table.mjs +55 -0
- package/dist/format-table.mjs.map +1 -0
- package/dist/format-track.d.mts +18 -0
- package/dist/format-track.d.mts.map +1 -0
- package/dist/format-track.mjs +34 -0
- package/dist/format-track.mjs.map +1 -0
- package/dist/format.d.mts +7 -0
- package/dist/format.d.mts.map +1 -0
- package/dist/format.mjs +549 -0
- package/dist/format.mjs.map +1 -0
- package/dist/frontmatter.d.mts +15 -0
- package/dist/frontmatter.d.mts.map +1 -0
- package/dist/frontmatter.mjs +187 -0
- package/dist/frontmatter.mjs.map +1 -0
- package/dist/heading.d.mts +6 -0
- package/dist/heading.d.mts.map +1 -0
- package/dist/heading.mjs +19 -0
- package/dist/heading.mjs.map +1 -0
- package/dist/html-format.d.mts +32 -0
- package/dist/html-format.d.mts.map +1 -0
- package/dist/html-format.mjs +127 -0
- package/dist/html-format.mjs.map +1 -0
- package/dist/html-lower.d.mts +78 -0
- package/dist/html-lower.d.mts.map +1 -0
- package/dist/html-lower.mjs +583 -0
- package/dist/html-lower.mjs.map +1 -0
- package/dist/html-stream.d.mts +13 -0
- package/dist/html-stream.d.mts.map +1 -0
- package/dist/html-stream.mjs +32 -0
- package/dist/html-stream.mjs.map +1 -0
- package/dist/html.d.mts +120 -0
- package/dist/html.d.mts.map +1 -0
- package/dist/html.mjs +77 -0
- package/dist/html.mjs.map +1 -0
- package/dist/identifier.d.mts +4 -0
- package/dist/identifier.d.mts.map +1 -0
- package/dist/identifier.mjs +8 -0
- package/dist/identifier.mjs.map +1 -0
- package/dist/javascript-ast.d.mts +16 -0
- package/dist/javascript-ast.d.mts.map +1 -0
- package/dist/javascript-ast.mjs +39 -0
- package/dist/javascript-ast.mjs.map +1 -0
- package/dist/javascript-jsx.d.mts +24 -0
- package/dist/javascript-jsx.d.mts.map +1 -0
- package/dist/javascript-jsx.mjs +189 -0
- package/dist/javascript-jsx.mjs.map +1 -0
- package/dist/javascript.d.mts +9 -0
- package/dist/javascript.d.mts.map +1 -0
- package/dist/javascript.mjs +31 -0
- package/dist/javascript.mjs.map +1 -0
- package/dist/jsx-reference.d.mts +15 -0
- package/dist/jsx-reference.d.mts.map +1 -0
- package/dist/jsx-reference.mjs +31 -0
- package/dist/jsx-reference.mjs.map +1 -0
- package/dist/mod.d.mts +25 -8
- package/dist/mod.mjs +19 -7
- package/dist/model.d.mts +196 -0
- package/dist/model.d.mts.map +1 -0
- package/dist/model.mjs +113 -0
- package/dist/model.mjs.map +1 -0
- package/dist/parser/block-container-recognizers.d.mts +40 -0
- package/dist/parser/block-container-recognizers.d.mts.map +1 -0
- package/dist/parser/block-container-recognizers.mjs +90 -0
- package/dist/parser/block-container-recognizers.mjs.map +1 -0
- package/dist/parser/block-directive-recognizers.d.mts +22 -0
- package/dist/parser/block-directive-recognizers.d.mts.map +1 -0
- package/dist/parser/block-directive-recognizers.mjs +77 -0
- package/dist/parser/block-directive-recognizers.mjs.map +1 -0
- package/dist/parser/block-leaf-recognizers.d.mts +53 -0
- package/dist/parser/block-leaf-recognizers.d.mts.map +1 -0
- package/dist/parser/block-leaf-recognizers.mjs +386 -0
- package/dist/parser/block-leaf-recognizers.mjs.map +1 -0
- package/dist/parser/block-parser.d.mts +38 -0
- package/dist/parser/block-parser.d.mts.map +1 -0
- package/dist/parser/block-parser.mjs +895 -0
- package/dist/parser/block-parser.mjs.map +1 -0
- package/dist/parser/block-syntax.d.mts +240 -0
- package/dist/parser/block-syntax.d.mts.map +1 -0
- package/dist/parser/characters.d.mts +19 -0
- package/dist/parser/characters.d.mts.map +1 -0
- package/dist/parser/characters.mjs +52 -0
- package/dist/parser/characters.mjs.map +1 -0
- package/dist/parser/config.d.mts +16 -0
- package/dist/parser/config.d.mts.map +1 -0
- package/dist/parser/config.mjs +25 -0
- package/dist/parser/config.mjs.map +1 -0
- package/dist/parser/directive-attributes.d.mts +9 -0
- package/dist/parser/directive-attributes.d.mts.map +1 -0
- package/dist/parser/directive-attributes.mjs +24 -0
- package/dist/parser/directive-attributes.mjs.map +1 -0
- package/dist/parser/embedded-scanner.d.mts +18 -0
- package/dist/parser/embedded-scanner.d.mts.map +1 -0
- package/dist/parser/embedded-scanner.mjs +199 -0
- package/dist/parser/embedded-scanner.mjs.map +1 -0
- package/dist/parser/inline-autolink.d.mts +7 -0
- package/dist/parser/inline-autolink.d.mts.map +1 -0
- package/dist/parser/inline-autolink.mjs +42 -0
- package/dist/parser/inline-autolink.mjs.map +1 -0
- package/dist/parser/inline-character-reference.d.mts +7 -0
- package/dist/parser/inline-character-reference.d.mts.map +1 -0
- package/dist/parser/inline-character-reference.mjs +22 -0
- package/dist/parser/inline-character-reference.mjs.map +1 -0
- package/dist/parser/inline-code.d.mts +7 -0
- package/dist/parser/inline-code.d.mts.map +1 -0
- package/dist/parser/inline-code.mjs +29 -0
- package/dist/parser/inline-code.mjs.map +1 -0
- package/dist/parser/inline-directive.d.mts +9 -0
- package/dist/parser/inline-directive.d.mts.map +1 -0
- package/dist/parser/inline-directive.mjs +45 -0
- package/dist/parser/inline-directive.mjs.map +1 -0
- package/dist/parser/inline-embedded.d.mts +19 -0
- package/dist/parser/inline-embedded.d.mts.map +1 -0
- package/dist/parser/inline-embedded.mjs +92 -0
- package/dist/parser/inline-embedded.mjs.map +1 -0
- package/dist/parser/inline-emphasis.d.mts +11 -0
- package/dist/parser/inline-emphasis.d.mts.map +1 -0
- package/dist/parser/inline-emphasis.mjs +79 -0
- package/dist/parser/inline-emphasis.mjs.map +1 -0
- package/dist/parser/inline-input.d.mts +46 -0
- package/dist/parser/inline-input.d.mts.map +1 -0
- package/dist/parser/inline-input.mjs +137 -0
- package/dist/parser/inline-input.mjs.map +1 -0
- package/dist/parser/inline-link.d.mts +12 -0
- package/dist/parser/inline-link.d.mts.map +1 -0
- package/dist/parser/inline-link.mjs +187 -0
- package/dist/parser/inline-link.mjs.map +1 -0
- package/dist/parser/inline-math.d.mts +10 -0
- package/dist/parser/inline-math.d.mts.map +1 -0
- package/dist/parser/inline-math.mjs +46 -0
- package/dist/parser/inline-math.mjs.map +1 -0
- package/dist/parser/inline-output.d.mts +34 -0
- package/dist/parser/inline-output.d.mts.map +1 -0
- package/dist/parser/inline-output.mjs +62 -0
- package/dist/parser/inline-output.mjs.map +1 -0
- package/dist/parser/inline-parser.d.mts +14 -0
- package/dist/parser/inline-parser.d.mts.map +1 -0
- package/dist/parser/inline-parser.mjs +328 -0
- package/dist/parser/inline-parser.mjs.map +1 -0
- package/dist/parser/inline-pending.d.mts +23 -0
- package/dist/parser/inline-pending.d.mts.map +1 -0
- package/dist/parser/inline-pending.mjs +100 -0
- package/dist/parser/inline-pending.mjs.map +1 -0
- package/dist/parser/inline-syntax.d.mts +118 -0
- package/dist/parser/inline-syntax.d.mts.map +1 -0
- package/dist/parser/inline-syntax.mjs +1 -0
- package/dist/parser/javascript-boundary.d.mts +16 -0
- package/dist/parser/javascript-boundary.d.mts.map +1 -0
- package/dist/parser/javascript-boundary.mjs +42 -0
- package/dist/parser/javascript-boundary.mjs.map +1 -0
- package/dist/parser/javascript-scanner.d.mts +22 -0
- package/dist/parser/javascript-scanner.d.mts.map +1 -0
- package/dist/parser/javascript-scanner.mjs +122 -0
- package/dist/parser/javascript-scanner.mjs.map +1 -0
- package/dist/parser/materialize-cache.d.mts +34 -0
- package/dist/parser/materialize-cache.d.mts.map +1 -0
- package/dist/parser/materialize-cache.mjs +12 -0
- package/dist/parser/materialize-cache.mjs.map +1 -0
- package/dist/parser/materialize-jsx.d.mts +14 -0
- package/dist/parser/materialize-jsx.d.mts.map +1 -0
- package/dist/parser/materialize-jsx.mjs +76 -0
- package/dist/parser/materialize-jsx.mjs.map +1 -0
- package/dist/parser/materialize.d.mts +61 -0
- package/dist/parser/materialize.d.mts.map +1 -0
- package/dist/parser/materialize.mjs +736 -0
- package/dist/parser/materialize.mjs.map +1 -0
- package/dist/parser/recognizer.d.mts +20 -0
- package/dist/parser/recognizer.d.mts.map +1 -0
- package/dist/parser/recognizer.mjs +24 -0
- package/dist/parser/recognizer.mjs.map +1 -0
- package/dist/parser/session.d.mts +42 -0
- package/dist/parser/session.d.mts.map +1 -0
- package/dist/parser/session.mjs +89 -0
- package/dist/parser/session.mjs.map +1 -0
- package/dist/parser.d.mts +25 -0
- package/dist/parser.d.mts.map +1 -0
- package/dist/parser.mjs +37 -0
- package/dist/parser.mjs.map +1 -0
- package/dist/plugin-internal.d.mts +25 -0
- package/dist/plugin-internal.d.mts.map +1 -0
- package/dist/plugin-internal.mjs +99 -0
- package/dist/plugin-internal.mjs.map +1 -0
- package/dist/plugin.d.mts +37 -0
- package/dist/plugin.d.mts.map +1 -0
- package/dist/plugin.mjs +1 -0
- package/dist/plugins/code-block-metadata.d.mts +42 -0
- package/dist/plugins/code-block-metadata.d.mts.map +1 -0
- package/dist/plugins/code-block-metadata.mjs +133 -0
- package/dist/plugins/code-block-metadata.mjs.map +1 -0
- package/dist/plugins/heading-id.d.mts +15 -0
- package/dist/plugins/heading-id.d.mts.map +1 -0
- package/dist/plugins/heading-id.mjs +45 -0
- package/dist/plugins/heading-id.mjs.map +1 -0
- package/dist/plugins/lower-heading.d.mts +16 -0
- package/dist/plugins/lower-heading.d.mts.map +1 -0
- package/dist/plugins/lower-heading.mjs +28 -0
- package/dist/plugins/lower-heading.mjs.map +1 -0
- package/dist/plugins/math-render.d.mts +26 -0
- package/dist/plugins/math-render.d.mts.map +1 -0
- package/dist/plugins/math-render.mjs +51 -0
- package/dist/plugins/math-render.mjs.map +1 -0
- package/dist/plugins/mod.d.mts +9 -5
- package/dist/plugins/mod.mjs +8 -5
- package/dist/plugins/remove-esm.d.mts +10 -0
- package/dist/plugins/remove-esm.d.mts.map +1 -0
- package/dist/plugins/remove-esm.mjs +12 -0
- package/dist/plugins/remove-esm.mjs.map +1 -0
- package/dist/plugins/shiki.d.mts +21 -0
- package/dist/plugins/shiki.d.mts.map +1 -0
- package/dist/plugins/shiki.mjs +144 -0
- package/dist/plugins/shiki.mjs.map +1 -0
- package/dist/plugins/syntax-highlight.d.mts +38 -0
- package/dist/plugins/syntax-highlight.d.mts.map +1 -0
- package/dist/plugins/syntax-highlight.mjs +106 -0
- package/dist/plugins/syntax-highlight.mjs.map +1 -0
- package/dist/processor.d.mts +60 -0
- package/dist/processor.d.mts.map +1 -0
- package/dist/processor.mjs +106 -0
- package/dist/processor.mjs.map +1 -0
- package/dist/ranges.d.mts +10 -0
- package/dist/ranges.d.mts.map +1 -0
- package/dist/ranges.mjs +22 -0
- package/dist/ranges.mjs.map +1 -0
- package/dist/source-map.d.mts +28 -0
- package/dist/source-map.d.mts.map +1 -0
- package/dist/source-map.mjs +90 -0
- package/dist/source-map.mjs.map +1 -0
- package/dist/source-text.d.mts +35 -0
- package/dist/source-text.d.mts.map +1 -0
- package/dist/source-text.mjs +132 -0
- package/dist/source-text.mjs.map +1 -0
- package/dist/source.d.mts +86 -0
- package/dist/source.d.mts.map +1 -0
- package/dist/source.mjs +264 -0
- package/dist/source.mjs.map +1 -0
- package/dist/stream-events.d.mts +59 -0
- package/dist/stream-events.d.mts.map +1 -0
- package/dist/stream-events.mjs +115 -0
- package/dist/stream-events.mjs.map +1 -0
- package/dist/stream-session.d.mts +79 -0
- package/dist/stream-session.d.mts.map +1 -0
- package/dist/stream-session.mjs +904 -0
- package/dist/stream-session.mjs.map +1 -0
- package/dist/stream-tail.d.mts +84 -0
- package/dist/stream-tail.d.mts.map +1 -0
- package/dist/stream-tail.mjs +359 -0
- package/dist/stream-tail.mjs.map +1 -0
- package/dist/stream-types.d.mts +89 -0
- package/dist/stream-types.d.mts.map +1 -0
- package/dist/stream-types.mjs +1 -0
- package/dist/stream.d.mts +28 -0
- package/dist/stream.d.mts.map +1 -0
- package/dist/stream.mjs +68 -0
- package/dist/stream.mjs.map +1 -0
- package/dist/syntax-options.d.mts +21 -0
- package/dist/syntax-options.d.mts.map +1 -0
- package/dist/syntax-options.mjs +26 -0
- package/dist/syntax-options.mjs.map +1 -0
- package/dist/traversal.d.mts +25 -0
- package/dist/traversal.d.mts.map +1 -0
- package/dist/traversal.mjs +136 -0
- package/dist/traversal.mjs.map +1 -0
- package/dist/tree.d.mts +18 -0
- package/dist/tree.d.mts.map +1 -0
- package/dist/tree.mjs +43 -0
- package/dist/tree.mjs.map +1 -0
- package/dist/unified/adapter.d.mts +24 -0
- package/dist/unified/adapter.d.mts.map +1 -0
- package/dist/unified/adapter.mjs +44 -0
- package/dist/unified/adapter.mjs.map +1 -0
- package/dist/unified/mod.d.mts +2 -0
- package/dist/unified/mod.mjs +1 -0
- package/dist/unified/runtime.d.mts +10 -0
- package/dist/unified/runtime.d.mts.map +1 -0
- package/dist/unified/runtime.mjs +115 -0
- package/dist/unified/runtime.mjs.map +1 -0
- package/dist/unified/tree-bridge.d.mts +63 -0
- package/dist/unified/tree-bridge.d.mts.map +1 -0
- package/dist/unified/tree-bridge.mjs +876 -0
- package/dist/unified/tree-bridge.mjs.map +1 -0
- package/dist/uri.d.mts +5 -0
- package/dist/uri.d.mts.map +1 -0
- package/dist/uri.mjs +32 -0
- package/dist/uri.mjs.map +1 -0
- package/package.json +56 -27
- package/dist/plugins/heading-id/plugin.d.mts +0 -17
- package/dist/plugins/heading-id/plugin.d.mts.map +0 -1
- package/dist/plugins/heading-id/plugin.mjs +0 -23
- package/dist/plugins/heading-id/plugin.mjs.map +0 -1
- package/dist/plugins/remove-imports-exports.d.mts +0 -10
- package/dist/plugins/remove-imports-exports.d.mts.map +0 -1
- package/dist/plugins/remove-imports-exports.mjs +0 -15
- package/dist/plugins/remove-imports-exports.mjs.map +0 -1
- package/dist/plugins/syntax-highlight/code-meta.d.mts +0 -22
- package/dist/plugins/syntax-highlight/code-meta.d.mts.map +0 -1
- package/dist/plugins/syntax-highlight/code-meta.mjs +0 -38
- package/dist/plugins/syntax-highlight/code-meta.mjs.map +0 -1
- package/dist/plugins/syntax-highlight/plugin.d.mts +0 -57
- package/dist/plugins/syntax-highlight/plugin.d.mts.map +0 -1
- package/dist/plugins/syntax-highlight/plugin.mjs +0 -93
- package/dist/plugins/syntax-highlight/plugin.mjs.map +0 -1
- package/dist/plugins/tree-processor/plugin.d.mts +0 -19
- package/dist/plugins/tree-processor/plugin.d.mts.map +0 -1
- package/dist/plugins/tree-processor/plugin.mjs +0 -21
- package/dist/plugins/tree-processor/plugin.mjs.map +0 -1
- package/dist/types.d.mts +0 -2
- /package/dist/{types.mjs → parser/block-syntax.mjs} +0 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { MdxError } from "../errors.mjs";
|
|
2
|
+
//#region src/plugins/code-block-metadata.d.ts
|
|
3
|
+
export interface CodeLineRange {
|
|
4
|
+
readonly end: number;
|
|
5
|
+
readonly start: number;
|
|
6
|
+
}
|
|
7
|
+
export type CodeLineSelection = {
|
|
8
|
+
readonly kind: "all";
|
|
9
|
+
} | {
|
|
10
|
+
readonly kind: "ranges";
|
|
11
|
+
readonly ranges: readonly CodeLineRange[];
|
|
12
|
+
};
|
|
13
|
+
export interface CodeLineNumbers {
|
|
14
|
+
readonly lines: CodeLineSelection;
|
|
15
|
+
readonly start: number;
|
|
16
|
+
}
|
|
17
|
+
export interface CodeBlockMetadata {
|
|
18
|
+
readonly commandLines?: CodeLineSelection;
|
|
19
|
+
readonly fileName?: string;
|
|
20
|
+
readonly highlightedLines?: CodeLineSelection;
|
|
21
|
+
readonly lineNumbers?: CodeLineNumbers;
|
|
22
|
+
readonly raw?: string;
|
|
23
|
+
}
|
|
24
|
+
export interface CodeBlockMetadataIssue {
|
|
25
|
+
readonly field?: "commandLines" | "fileName" | "highlightLines" | "lineNumbers";
|
|
26
|
+
readonly message: string;
|
|
27
|
+
}
|
|
28
|
+
export declare class CodeBlockMetadataError extends MdxError {
|
|
29
|
+
readonly issues: readonly CodeBlockMetadataIssue[];
|
|
30
|
+
readonly metadata: CodeBlockMetadata;
|
|
31
|
+
private constructor();
|
|
32
|
+
static invalidJson(this: void, raw: string, cause: unknown): CodeBlockMetadataError;
|
|
33
|
+
static invalidFields(this: void, issues: readonly CodeBlockMetadataIssue[], metadata: CodeBlockMetadata): CodeBlockMetadataError;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Parses JSON metadata for fenced code blocks without changing the authored value.
|
|
37
|
+
* @throws {CodeBlockMetadataError} Invalid metadata, with issues and partial metadata.
|
|
38
|
+
*/
|
|
39
|
+
export declare function parseCodeBlockMetadata(raw?: string): CodeBlockMetadata;
|
|
40
|
+
export declare function codeLineSelected(selection: CodeLineSelection, line: number): boolean;
|
|
41
|
+
//#endregion
|
|
42
|
+
//# sourceMappingURL=code-block-metadata.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-block-metadata.d.mts","names":[],"sources":["../../src/plugins/code-block-metadata.ts"],"mappings":";;iBAIiB;WACN;WACA;;YAGC;WACG;;WACA;WAAyB,iBAAiB;;iBAExC;WACN,OAAO;WACP;;iBAGM;WACN,eAAe;WACf;WACA,mBAAmB;WACnB,cAAc;WACd;;iBAKM;WACN;WACA;;qBAGE,+BAA+B;WAC1B,iBAAiB;WACjB,UAAU;UAEnB;SAgBO,YAAY,YAAY,aAAa,iBAAiB;SAStD,cACZ,YACA,iBAAiB,0BACjB,UAAU,oBACT;;;;;;wBAaW,uBAAuB,eAAe;wBAsEtC,iBAAiB,WAAW,mBAAmB"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { MdxError } from "../errors.mjs";
|
|
2
|
+
import { isNumber, isPlainObject, isString } from "@temelj/value";
|
|
3
|
+
//#region src/plugins/code-block-metadata.ts
|
|
4
|
+
var CodeBlockMetadataError = class CodeBlockMetadataError extends MdxError {
|
|
5
|
+
issues;
|
|
6
|
+
metadata;
|
|
7
|
+
constructor(issues, metadata, options, context) {
|
|
8
|
+
super("CodeBlockMetadataError", `Invalid code block metadata: ${issues.map((issue) => issue.message).join("; ")}`, options, context);
|
|
9
|
+
this.issues = Object.freeze([...issues]);
|
|
10
|
+
this.metadata = Object.freeze(metadata);
|
|
11
|
+
}
|
|
12
|
+
static invalidJson(raw, cause) {
|
|
13
|
+
return new CodeBlockMetadataError([{ message: "Code block metadata must be a valid JSON object" }], { raw }, { cause }, CodeBlockMetadataError.invalidJson);
|
|
14
|
+
}
|
|
15
|
+
static invalidFields(issues, metadata) {
|
|
16
|
+
return new CodeBlockMetadataError(issues, metadata, {}, CodeBlockMetadataError.invalidFields);
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
const allLines = { kind: "all" };
|
|
20
|
+
const selectorPattern = /^\s*\d+(?:\s*-\s*\d+)?(?:\s*,\s*\d+(?:\s*-\s*\d+)?)*\s*$/u;
|
|
21
|
+
/**
|
|
22
|
+
* Parses JSON metadata for fenced code blocks without changing the authored value.
|
|
23
|
+
* @throws {CodeBlockMetadataError} Invalid metadata, with issues and partial metadata.
|
|
24
|
+
*/
|
|
25
|
+
function parseCodeBlockMetadata(raw) {
|
|
26
|
+
if (raw === void 0 || raw.trim().length === 0) return { raw };
|
|
27
|
+
let input;
|
|
28
|
+
try {
|
|
29
|
+
input = JSON.parse(raw);
|
|
30
|
+
} catch (cause) {
|
|
31
|
+
throw CodeBlockMetadataError.invalidJson(raw, cause);
|
|
32
|
+
}
|
|
33
|
+
if (!isPlainObject(input)) throw CodeBlockMetadataError.invalidFields([{ message: "Code block metadata must be a JSON object" }], { raw });
|
|
34
|
+
const issues = [];
|
|
35
|
+
const metadata = { raw };
|
|
36
|
+
const fileName = "fileName" in input ? input.fileName : void 0;
|
|
37
|
+
if (fileName !== void 0) {
|
|
38
|
+
if (!isString(fileName) || fileName.trim().length === 0) issues.push({
|
|
39
|
+
field: "fileName",
|
|
40
|
+
message: "\"fileName\" must be a non-empty string"
|
|
41
|
+
});
|
|
42
|
+
else metadata.fileName = fileName.trim();
|
|
43
|
+
}
|
|
44
|
+
const highlighted = parseSelectionField("highlightLines" in input ? input.highlightLines : void 0, "highlightLines", issues);
|
|
45
|
+
if (highlighted !== void 0) metadata.highlightedLines = highlighted;
|
|
46
|
+
const commands = parseSelectionField("commandLines" in input ? input.commandLines : void 0, "commandLines", issues);
|
|
47
|
+
if (commands !== void 0) metadata.commandLines = commands;
|
|
48
|
+
const lineNumbers = parseLineNumbers("lineNumbers" in input ? input.lineNumbers : void 0, issues);
|
|
49
|
+
if (lineNumbers !== void 0) metadata.lineNumbers = lineNumbers;
|
|
50
|
+
if (issues.length > 0) throw CodeBlockMetadataError.invalidFields(issues, metadata);
|
|
51
|
+
return metadata;
|
|
52
|
+
}
|
|
53
|
+
function codeLineSelected(selection, line) {
|
|
54
|
+
return selection.kind === "all" || selection.ranges.some((range) => range.start <= line && line <= range.end);
|
|
55
|
+
}
|
|
56
|
+
function parseLineNumbers(value, issues) {
|
|
57
|
+
if (value === void 0 || value === false) return;
|
|
58
|
+
if (value === true) return {
|
|
59
|
+
lines: allLines,
|
|
60
|
+
start: 1
|
|
61
|
+
};
|
|
62
|
+
if (!isPlainObject(value)) {
|
|
63
|
+
issues.push({
|
|
64
|
+
field: "lineNumbers",
|
|
65
|
+
message: "\"lineNumbers\" must be a boolean or an object"
|
|
66
|
+
});
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
const start = "start" in value ? value.start ?? 1 : 1;
|
|
70
|
+
const validStart = isNumber(start) && Number.isSafeInteger(start) && start >= 1;
|
|
71
|
+
if (!validStart) issues.push({
|
|
72
|
+
field: "lineNumbers",
|
|
73
|
+
message: "\"lineNumbers.start\" must be a positive safe integer"
|
|
74
|
+
});
|
|
75
|
+
const lines = parseSelectionField(("lines" in value ? value.lines : void 0) ?? true, "lineNumbers", issues);
|
|
76
|
+
if (!validStart || lines === void 0) return;
|
|
77
|
+
return {
|
|
78
|
+
lines,
|
|
79
|
+
start
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
function parseSelectionField(value, field, issues) {
|
|
83
|
+
if (value === void 0 || value === false) return;
|
|
84
|
+
if (value === true) return allLines;
|
|
85
|
+
if (!isString(value)) {
|
|
86
|
+
issues.push({
|
|
87
|
+
field,
|
|
88
|
+
message: `"${field}" must be a boolean or line selector string`
|
|
89
|
+
});
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
if (!selectorPattern.test(value)) {
|
|
93
|
+
issues.push({
|
|
94
|
+
field,
|
|
95
|
+
message: `"${field}" contains an invalid line selector`
|
|
96
|
+
});
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
const ranges = value.split(",").map((part) => {
|
|
100
|
+
const [startValue = "", endValue = startValue] = part.split("-");
|
|
101
|
+
return {
|
|
102
|
+
start: Number(startValue.trim()),
|
|
103
|
+
end: Number(endValue.trim())
|
|
104
|
+
};
|
|
105
|
+
});
|
|
106
|
+
ranges.sort((left, right) => left.start - right.start || left.end - right.end);
|
|
107
|
+
let previous;
|
|
108
|
+
for (const range of ranges) {
|
|
109
|
+
if (!Number.isSafeInteger(range.start) || !Number.isSafeInteger(range.end) || range.start < 1 || range.end < range.start) {
|
|
110
|
+
issues.push({
|
|
111
|
+
field,
|
|
112
|
+
message: `"${field}" contains an invalid line range`
|
|
113
|
+
});
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
if (previous !== void 0 && range.start <= previous.end) {
|
|
117
|
+
issues.push({
|
|
118
|
+
field,
|
|
119
|
+
message: `"${field}" contains overlapping line ranges`
|
|
120
|
+
});
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
previous = range;
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
kind: "ranges",
|
|
127
|
+
ranges
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
//#endregion
|
|
131
|
+
export { CodeBlockMetadataError, codeLineSelected, parseCodeBlockMetadata };
|
|
132
|
+
|
|
133
|
+
//# sourceMappingURL=code-block-metadata.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-block-metadata.mjs","names":[],"sources":["../../src/plugins/code-block-metadata.ts"],"sourcesContent":["import { isString, isNumber, isPlainObject } from \"@temelj/value\";\n\nimport { MdxError } from \"../errors.ts\";\n\nexport interface CodeLineRange {\n readonly end: number;\n readonly start: number;\n}\n\nexport type CodeLineSelection =\n | { readonly kind: \"all\" }\n | { readonly kind: \"ranges\"; readonly ranges: readonly CodeLineRange[] };\n\nexport interface CodeLineNumbers {\n readonly lines: CodeLineSelection;\n readonly start: number;\n}\n\nexport interface CodeBlockMetadata {\n readonly commandLines?: CodeLineSelection;\n readonly fileName?: string;\n readonly highlightedLines?: CodeLineSelection;\n readonly lineNumbers?: CodeLineNumbers;\n readonly raw?: string;\n}\n\ntype MutableCodeBlockMetadata = { -readonly [K in keyof CodeBlockMetadata]: CodeBlockMetadata[K] };\n\nexport interface CodeBlockMetadataIssue {\n readonly field?: \"commandLines\" | \"fileName\" | \"highlightLines\" | \"lineNumbers\";\n readonly message: string;\n}\n\nexport class CodeBlockMetadataError extends MdxError {\n public readonly issues: readonly CodeBlockMetadataIssue[];\n public readonly metadata: CodeBlockMetadata;\n\n private constructor(\n issues: readonly CodeBlockMetadataIssue[],\n metadata: CodeBlockMetadata,\n options: ErrorOptions,\n context: Function,\n ) {\n super(\n \"CodeBlockMetadataError\",\n `Invalid code block metadata: ${issues.map((issue) => issue.message).join(\"; \")}`,\n options,\n context,\n );\n this.issues = Object.freeze([...issues]);\n this.metadata = Object.freeze(metadata);\n }\n\n public static invalidJson(this: void, raw: string, cause: unknown): CodeBlockMetadataError {\n return new CodeBlockMetadataError(\n [{ message: \"Code block metadata must be a valid JSON object\" }],\n { raw },\n { cause },\n CodeBlockMetadataError.invalidJson,\n );\n }\n\n public static invalidFields(\n this: void,\n issues: readonly CodeBlockMetadataIssue[],\n metadata: CodeBlockMetadata,\n ): CodeBlockMetadataError {\n return new CodeBlockMetadataError(issues, metadata, {}, CodeBlockMetadataError.invalidFields);\n }\n}\n\nconst allLines: CodeLineSelection = { kind: \"all\" };\n\nconst selectorPattern = /^\\s*\\d+(?:\\s*-\\s*\\d+)?(?:\\s*,\\s*\\d+(?:\\s*-\\s*\\d+)?)*\\s*$/u;\n\n/**\n * Parses JSON metadata for fenced code blocks without changing the authored value.\n * @throws {CodeBlockMetadataError} Invalid metadata, with issues and partial metadata.\n */\nexport function parseCodeBlockMetadata(raw?: string): CodeBlockMetadata {\n if (raw === undefined || raw.trim().length === 0) {\n return { raw };\n }\n\n let input: unknown;\n\n try {\n input = JSON.parse(raw);\n } catch (cause) {\n throw CodeBlockMetadataError.invalidJson(raw, cause);\n }\n\n if (!isPlainObject(input)) {\n throw CodeBlockMetadataError.invalidFields(\n [{ message: \"Code block metadata must be a JSON object\" }],\n { raw },\n );\n }\n\n const issues: CodeBlockMetadataIssue[] = [];\n\n const metadata: MutableCodeBlockMetadata = { raw };\n\n const fileName = \"fileName\" in input ? input.fileName : undefined;\n\n if (fileName !== undefined) {\n if (!isString(fileName) || fileName.trim().length === 0) {\n issues.push({ field: \"fileName\", message: '\"fileName\" must be a non-empty string' });\n } else {\n metadata.fileName = fileName.trim();\n }\n }\n\n const highlighted = parseSelectionField(\n \"highlightLines\" in input ? input.highlightLines : undefined,\n \"highlightLines\",\n issues,\n );\n\n if (highlighted !== undefined) {\n metadata.highlightedLines = highlighted;\n }\n\n const commands = parseSelectionField(\n \"commandLines\" in input ? input.commandLines : undefined,\n \"commandLines\",\n issues,\n );\n\n if (commands !== undefined) {\n metadata.commandLines = commands;\n }\n\n const lineNumbers = parseLineNumbers(\n \"lineNumbers\" in input ? input.lineNumbers : undefined,\n issues,\n );\n\n if (lineNumbers !== undefined) {\n metadata.lineNumbers = lineNumbers;\n }\n\n if (issues.length > 0) {\n throw CodeBlockMetadataError.invalidFields(issues, metadata);\n }\n\n return metadata;\n}\n\nexport function codeLineSelected(selection: CodeLineSelection, line: number): boolean {\n return (\n selection.kind === \"all\" ||\n selection.ranges.some((range) => range.start <= line && line <= range.end)\n );\n}\n\nfunction parseLineNumbers(\n // oxlint-disable-next-line anti-slop/no-unknown-parameters -- Validates a field from parsed code-block JSON before exposing typed metadata.\n value: unknown,\n issues: CodeBlockMetadataIssue[],\n): CodeLineNumbers | undefined {\n if (value === undefined || value === false) {\n return;\n }\n\n if (value === true) {\n return { lines: allLines, start: 1 };\n }\n\n if (!isPlainObject(value)) {\n issues.push({\n field: \"lineNumbers\",\n message: '\"lineNumbers\" must be a boolean or an object',\n });\n\n return;\n }\n\n const start = \"start\" in value ? (value.start ?? 1) : 1;\n const validStart = isNumber(start) && Number.isSafeInteger(start) && start >= 1;\n\n if (!validStart) {\n issues.push({\n field: \"lineNumbers\",\n message: '\"lineNumbers.start\" must be a positive safe integer',\n });\n }\n\n const lines = parseSelectionField(\n (\"lines\" in value ? value.lines : undefined) ?? true,\n \"lineNumbers\",\n issues,\n );\n\n if (!validStart || lines === undefined) {\n return;\n }\n\n return { lines, start };\n}\n\nfunction parseSelectionField(\n // oxlint-disable-next-line anti-slop/no-unknown-parameters -- Validates a field from parsed code-block JSON before exposing typed metadata.\n value: unknown,\n field: \"commandLines\" | \"highlightLines\" | \"lineNumbers\",\n issues: CodeBlockMetadataIssue[],\n): CodeLineSelection | undefined {\n if (value === undefined || value === false) {\n return;\n }\n\n if (value === true) {\n return allLines;\n }\n\n if (!isString(value)) {\n issues.push({ field, message: `\"${field}\" must be a boolean or line selector string` });\n\n return;\n }\n\n if (!selectorPattern.test(value)) {\n issues.push({ field, message: `\"${field}\" contains an invalid line selector` });\n\n return;\n }\n\n const ranges = value.split(\",\").map((part) => {\n const [startValue = \"\", endValue = startValue] = part.split(\"-\");\n\n return { start: Number(startValue.trim()), end: Number(endValue.trim()) };\n });\n\n ranges.sort((left, right) => left.start - right.start || left.end - right.end);\n let previous: CodeLineRange | undefined;\n\n for (const range of ranges) {\n if (\n !Number.isSafeInteger(range.start) ||\n !Number.isSafeInteger(range.end) ||\n range.start < 1 ||\n range.end < range.start\n ) {\n issues.push({ field, message: `\"${field}\" contains an invalid line range` });\n\n return;\n }\n\n if (previous !== undefined && range.start <= previous.end) {\n issues.push({ field, message: `\"${field}\" contains overlapping line ranges` });\n\n return;\n }\n\n previous = range;\n }\n\n return { kind: \"ranges\", ranges };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { HtmlRootNode } from "../html.mjs";
|
|
2
|
+
import { HtmlPlugin, HtmlPluginContext } from "../plugin.mjs";
|
|
3
|
+
//#region src/plugins/heading-id.d.ts
|
|
4
|
+
export interface HeadingIdPluginOptions {
|
|
5
|
+
readonly prefix?: string;
|
|
6
|
+
}
|
|
7
|
+
/** Adds unique slug IDs to rendered headings that have none. */
|
|
8
|
+
export declare class HeadingIdPlugin implements HtmlPlugin {
|
|
9
|
+
readonly name = "heading-id";
|
|
10
|
+
private readonly prefix;
|
|
11
|
+
constructor(options?: HeadingIdPluginOptions);
|
|
12
|
+
transform(context: HtmlPluginContext): HtmlRootNode;
|
|
13
|
+
}
|
|
14
|
+
//#endregion
|
|
15
|
+
//# sourceMappingURL=heading-id.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heading-id.d.mts","names":[],"sources":["../../src/plugins/heading-id.ts"],"mappings":";;;iBAQiB;WACN;;;qBAIE,2BAA2B;WACtB;mBACC;EAEjB,YAAmB,UAAS;EAIrB,UAAU,SAAS,oBAAoB"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { htmlText } from "../html.mjs";
|
|
2
|
+
import { selectHtml } from "../traversal.mjs";
|
|
3
|
+
import { isString } from "@temelj/value";
|
|
4
|
+
//#region src/plugins/heading-id.ts
|
|
5
|
+
/** Adds unique slug IDs to rendered headings that have none. */
|
|
6
|
+
var HeadingIdPlugin = class {
|
|
7
|
+
name = "heading-id";
|
|
8
|
+
prefix;
|
|
9
|
+
constructor(options = {}) {
|
|
10
|
+
this.prefix = options.prefix ?? "user-content-";
|
|
11
|
+
}
|
|
12
|
+
transform(context) {
|
|
13
|
+
const used = /* @__PURE__ */ new Set();
|
|
14
|
+
for (const { node } of selectHtml(context.root, "element")) {
|
|
15
|
+
const id = node.attributes.id;
|
|
16
|
+
if (isString(id)) used.add(id);
|
|
17
|
+
}
|
|
18
|
+
return context.rewrite({ element: ({ node }) => {
|
|
19
|
+
if (!/^h[1-6]$/u.test(node.tagName) || node.attributes.id !== void 0) return;
|
|
20
|
+
const id = uniqueSlug(this.prefix + slug(htmlText(node)), used);
|
|
21
|
+
return {
|
|
22
|
+
...node,
|
|
23
|
+
attributes: {
|
|
24
|
+
...node.attributes,
|
|
25
|
+
id
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
} });
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
function slug(value) {
|
|
32
|
+
const result = value.trim().toLowerCase().replace(/[^\p{Letter}\p{Number}\s_-]/gu, "").replace(/[\s_-]+/gu, "-").replace(/^-|-$/gu, "");
|
|
33
|
+
return result.length === 0 ? "section" : result;
|
|
34
|
+
}
|
|
35
|
+
function uniqueSlug(base, used) {
|
|
36
|
+
let value = base;
|
|
37
|
+
let index = 0;
|
|
38
|
+
while (used.has(value)) value = `${base}-${++index}`;
|
|
39
|
+
used.add(value);
|
|
40
|
+
return value;
|
|
41
|
+
}
|
|
42
|
+
//#endregion
|
|
43
|
+
export { HeadingIdPlugin };
|
|
44
|
+
|
|
45
|
+
//# sourceMappingURL=heading-id.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heading-id.mjs","names":[],"sources":["../../src/plugins/heading-id.ts"],"sourcesContent":["import { isString } from \"@temelj/value\";\n\nimport type { HtmlRootNode } from \"../html.ts\";\nimport type { HtmlPlugin, HtmlPluginContext } from \"../plugin.ts\";\n\nimport { htmlText } from \"../html.ts\";\nimport { selectHtml } from \"../traversal.ts\";\n\nexport interface HeadingIdPluginOptions {\n readonly prefix?: string;\n}\n\n/** Adds unique slug IDs to rendered headings that have none. */\nexport class HeadingIdPlugin implements HtmlPlugin {\n public readonly name = \"heading-id\";\n private readonly prefix: string;\n\n public constructor(options: HeadingIdPluginOptions = {}) {\n this.prefix = options.prefix ?? \"user-content-\";\n }\n\n public transform(context: HtmlPluginContext): HtmlRootNode {\n const used = new Set<string>();\n\n for (const { node } of selectHtml(context.root, \"element\")) {\n const id = node.attributes.id;\n\n if (isString(id)) {\n used.add(id);\n }\n }\n\n return context.rewrite({\n element: ({ node }) => {\n if (!/^h[1-6]$/u.test(node.tagName) || node.attributes.id !== undefined) {\n return;\n }\n\n const id = uniqueSlug(this.prefix + slug(htmlText(node)), used);\n\n return { ...node, attributes: { ...node.attributes, id } };\n },\n });\n }\n}\n\nfunction slug(value: string): string {\n const result = value\n .trim()\n .toLowerCase()\n .replace(/[^\\p{Letter}\\p{Number}\\s_-]/gu, \"\")\n .replace(/[\\s_-]+/gu, \"-\")\n .replace(/^-|-$/gu, \"\");\n\n return result.length === 0 ? \"section\" : result;\n}\n\nfunction uniqueSlug(base: string, used: Set<string>): string {\n let value = base;\n let index = 0;\n\n while (used.has(value)) {\n value = `${base}-${++index}`;\n }\n\n used.add(value);\n\n return value;\n}\n"],"mappings":";;;;;AAaA,IAAa,kBAAb,MAAmD;CACjD,OAAuB;CACvB;CAEA,YAAmB,UAAkC,CAAC,GAAG;EACvD,KAAK,SAAS,QAAQ,UAAU;CAClC;CAEA,UAAiB,SAA0C;EACzD,MAAM,uBAAO,IAAI,IAAY;EAE7B,KAAK,MAAM,EAAE,UAAU,WAAW,QAAQ,MAAM,SAAS,GAAG;GAC1D,MAAM,KAAK,KAAK,WAAW;GAE3B,IAAI,SAAS,EAAE,GACb,KAAK,IAAI,EAAE;EAEf;EAEA,OAAO,QAAQ,QAAQ,EACrB,UAAU,EAAE,WAAW;GACrB,IAAI,CAAC,YAAY,KAAK,KAAK,OAAO,KAAK,KAAK,WAAW,OAAO,KAAA,GAC5D;GAGF,MAAM,KAAK,WAAW,KAAK,SAAS,KAAK,SAAS,IAAI,CAAC,GAAG,IAAI;GAE9D,OAAO;IAAE,GAAG;IAAM,YAAY;KAAE,GAAG,KAAK;KAAY;IAAG;GAAE;EAC3D,EACF,CAAC;CACH;AACF;AAEA,SAAS,KAAK,OAAuB;CACnC,MAAM,SAAS,MACZ,KAAK,CAAC,CACN,YAAY,CAAC,CACb,QAAQ,iCAAiC,EAAE,CAAC,CAC5C,QAAQ,aAAa,GAAG,CAAC,CACzB,QAAQ,WAAW,EAAE;CAExB,OAAO,OAAO,WAAW,IAAI,YAAY;AAC3C;AAEA,SAAS,WAAW,MAAc,MAA2B;CAC3D,IAAI,QAAQ;CACZ,IAAI,QAAQ;CAEZ,OAAO,KAAK,IAAI,KAAK,GACnB,QAAQ,GAAG,KAAK,GAAG,EAAE;CAGvB,KAAK,IAAI,KAAK;CAEd,OAAO;AACT"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { HtmlRootNode } from "../html.mjs";
|
|
2
|
+
import { HtmlPlugin, HtmlPluginContext } from "../plugin.mjs";
|
|
3
|
+
//#region src/plugins/lower-heading.d.ts
|
|
4
|
+
export interface LowerHeadingPluginOptions {
|
|
5
|
+
/** Number of levels by which to lower each rendered heading. */
|
|
6
|
+
readonly offset?: number;
|
|
7
|
+
}
|
|
8
|
+
/** Lowers rendered HTML headings without changing the authored MDX heading depth. */
|
|
9
|
+
export declare class LowerHeadingPlugin implements HtmlPlugin {
|
|
10
|
+
readonly name = "lower-heading";
|
|
11
|
+
private readonly offset;
|
|
12
|
+
constructor(options?: LowerHeadingPluginOptions);
|
|
13
|
+
transform(context: HtmlPluginContext): HtmlRootNode;
|
|
14
|
+
}
|
|
15
|
+
//#endregion
|
|
16
|
+
//# sourceMappingURL=lower-heading.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lower-heading.d.mts","names":[],"sources":["../../src/plugins/lower-heading.ts"],"mappings":";;;iBAMiB;;WAEN;;;qBAIE,8BAA8B;WACzB;mBACC;EAEjB,YAAmB,UAAS;EAUrB,UAAU,SAAS,oBAAoB"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { ConfigurationError } from "../errors.mjs";
|
|
2
|
+
import { headingDepthForTag } from "../heading.mjs";
|
|
3
|
+
//#region src/plugins/lower-heading.ts
|
|
4
|
+
/** Lowers rendered HTML headings without changing the authored MDX heading depth. */
|
|
5
|
+
var LowerHeadingPlugin = class {
|
|
6
|
+
name = "lower-heading";
|
|
7
|
+
offset;
|
|
8
|
+
constructor(options = {}) {
|
|
9
|
+
const offset = options.offset ?? 1;
|
|
10
|
+
if (!Number.isSafeInteger(offset) || offset < 1) throw ConfigurationError.invalidPluginIntegerOption("lower-heading", "offset", offset, 1);
|
|
11
|
+
this.offset = offset;
|
|
12
|
+
}
|
|
13
|
+
transform(context) {
|
|
14
|
+
return context.rewrite({ element: ({ node }) => {
|
|
15
|
+
const depth = headingDepthForTag(node.tagName);
|
|
16
|
+
if (depth === void 0) return;
|
|
17
|
+
const lowered = Math.min(depth + this.offset, 6);
|
|
18
|
+
return lowered === depth ? void 0 : {
|
|
19
|
+
...node,
|
|
20
|
+
tagName: `h${lowered}`
|
|
21
|
+
};
|
|
22
|
+
} });
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
//#endregion
|
|
26
|
+
export { LowerHeadingPlugin };
|
|
27
|
+
|
|
28
|
+
//# sourceMappingURL=lower-heading.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lower-heading.mjs","names":[],"sources":["../../src/plugins/lower-heading.ts"],"sourcesContent":["import type { HtmlRootNode } from \"../html.ts\";\nimport type { HtmlPlugin, HtmlPluginContext } from \"../plugin.ts\";\n\nimport { ConfigurationError } from \"../errors.ts\";\nimport { headingDepthForTag } from \"../heading.ts\";\n\nexport interface LowerHeadingPluginOptions {\n /** Number of levels by which to lower each rendered heading. */\n readonly offset?: number;\n}\n\n/** Lowers rendered HTML headings without changing the authored MDX heading depth. */\nexport class LowerHeadingPlugin implements HtmlPlugin {\n public readonly name = \"lower-heading\";\n private readonly offset: number;\n\n public constructor(options: LowerHeadingPluginOptions = {}) {\n const offset = options.offset ?? 1;\n\n if (!Number.isSafeInteger(offset) || offset < 1) {\n throw ConfigurationError.invalidPluginIntegerOption(\"lower-heading\", \"offset\", offset, 1);\n }\n\n this.offset = offset;\n }\n\n public transform(context: HtmlPluginContext): HtmlRootNode {\n return context.rewrite({\n element: ({ node }) => {\n const depth = headingDepthForTag(node.tagName);\n\n if (depth === undefined) {\n return;\n }\n\n const lowered = Math.min(depth + this.offset, 6);\n\n return lowered === depth ? undefined : { ...node, tagName: `h${lowered}` };\n },\n });\n }\n}\n"],"mappings":";;;;AAYA,IAAa,qBAAb,MAAsD;CACpD,OAAuB;CACvB;CAEA,YAAmB,UAAqC,CAAC,GAAG;EAC1D,MAAM,SAAS,QAAQ,UAAU;EAEjC,IAAI,CAAC,OAAO,cAAc,MAAM,KAAK,SAAS,GAC5C,MAAM,mBAAmB,2BAA2B,iBAAiB,UAAU,QAAQ,CAAC;EAG1F,KAAK,SAAS;CAChB;CAEA,UAAiB,SAA0C;EACzD,OAAO,QAAQ,QAAQ,EACrB,UAAU,EAAE,WAAW;GACrB,MAAM,QAAQ,mBAAmB,KAAK,OAAO;GAE7C,IAAI,UAAU,KAAA,GACZ;GAGF,MAAM,UAAU,KAAK,IAAI,QAAQ,KAAK,QAAQ,CAAC;GAE/C,OAAO,YAAY,QAAQ,KAAA,IAAY;IAAE,GAAG;IAAM,SAAS,IAAI;GAAU;EAC3E,EACF,CAAC;CACH;AACF"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { HtmlMathNode, HtmlNode, HtmlRootNode } from "../html.mjs";
|
|
2
|
+
import { HtmlPlugin, HtmlPluginContext, PluginFailureMode } from "../plugin.mjs";
|
|
3
|
+
//#region src/plugins/math-render.d.ts
|
|
4
|
+
export interface MathRenderRequest {
|
|
5
|
+
readonly node: HtmlMathNode;
|
|
6
|
+
readonly signal?: AbortSignal;
|
|
7
|
+
}
|
|
8
|
+
export interface MathRenderer {
|
|
9
|
+
/** Returns the node that replaces the math fallback. */
|
|
10
|
+
render(request: MathRenderRequest): HtmlNode | Promise<HtmlNode>;
|
|
11
|
+
}
|
|
12
|
+
export interface MathRenderPluginOptions {
|
|
13
|
+
readonly mode?: PluginFailureMode;
|
|
14
|
+
readonly renderer: MathRenderer;
|
|
15
|
+
}
|
|
16
|
+
/** Renders math nodes through a caller-supplied renderer. */
|
|
17
|
+
export declare class MathRenderPlugin implements HtmlPlugin {
|
|
18
|
+
readonly name = "math-render";
|
|
19
|
+
private readonly mode;
|
|
20
|
+
private readonly renderer;
|
|
21
|
+
constructor(options: MathRenderPluginOptions);
|
|
22
|
+
transform(context: HtmlPluginContext): HtmlRootNode | Promise<HtmlRootNode>;
|
|
23
|
+
private renderFailure;
|
|
24
|
+
}
|
|
25
|
+
//#endregion
|
|
26
|
+
//# sourceMappingURL=math-render.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"math-render.d.mts","names":[],"sources":["../../src/plugins/math-render.ts"],"mappings":";;;iBAOiB;WACN,MAAM;WACN,SAAS;;iBAGH;;EAEf,OAAO,SAAS,oBAAoB,WAAW,QAAQ;;iBAGxC;WACN,OAAO;WACP,UAAU;;;qBAIR,4BAA4B;WACvB;mBACC;mBACA;EAEjB,YAAmB,SAAS;EAKrB,UAAU,SAAS,oBAAoB,eAAe,QAAQ;UAuB7D"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { replaceHtmlNodes } from "../plugin-internal.mjs";
|
|
2
|
+
import { isPromise } from "@temelj/value";
|
|
3
|
+
//#region src/plugins/math-render.ts
|
|
4
|
+
/** Renders math nodes through a caller-supplied renderer. */
|
|
5
|
+
var MathRenderPlugin = class {
|
|
6
|
+
name = "math-render";
|
|
7
|
+
mode;
|
|
8
|
+
renderer;
|
|
9
|
+
constructor(options) {
|
|
10
|
+
this.renderer = options.renderer;
|
|
11
|
+
this.mode = options.mode ?? "tolerant";
|
|
12
|
+
}
|
|
13
|
+
transform(context) {
|
|
14
|
+
return replaceHtmlNodes(context.root, (node) => {
|
|
15
|
+
if (node.kind !== "math") return;
|
|
16
|
+
const request = {
|
|
17
|
+
node,
|
|
18
|
+
signal: context.signal
|
|
19
|
+
};
|
|
20
|
+
try {
|
|
21
|
+
const result = this.renderer.render(request);
|
|
22
|
+
return isPromise(result) ? result.then((rendered) => ({
|
|
23
|
+
...rendered,
|
|
24
|
+
origin: node.origin
|
|
25
|
+
}), (cause) => this.renderFailure(cause, node, context)) : {
|
|
26
|
+
...result,
|
|
27
|
+
origin: node.origin
|
|
28
|
+
};
|
|
29
|
+
} catch (cause) {
|
|
30
|
+
return this.renderFailure(cause, node, context);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
renderFailure(cause, node, context) {
|
|
35
|
+
if (this.mode === "strict") throw cause;
|
|
36
|
+
context.diagnostics.add({
|
|
37
|
+
severity: "warning",
|
|
38
|
+
code: "mdx.plugin.math-render",
|
|
39
|
+
message: `Could not render ${node.style} math: ${cause instanceof Error ? cause.message : String(cause)}`,
|
|
40
|
+
span: node.origin === void 0 ? void 0 : {
|
|
41
|
+
file: context.file,
|
|
42
|
+
start: node.origin.start,
|
|
43
|
+
end: node.origin.end
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
//#endregion
|
|
49
|
+
export { MathRenderPlugin };
|
|
50
|
+
|
|
51
|
+
//# sourceMappingURL=math-render.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"math-render.mjs","names":[],"sources":["../../src/plugins/math-render.ts"],"sourcesContent":["import { isPromise } from \"@temelj/value\";\n\nimport type { HtmlMathNode, HtmlNode, HtmlRootNode } from \"../html.ts\";\nimport type { HtmlPlugin, HtmlPluginContext, PluginFailureMode } from \"../plugin.ts\";\n\nimport { replaceHtmlNodes } from \"../plugin-internal.ts\";\n\nexport interface MathRenderRequest {\n readonly node: HtmlMathNode;\n readonly signal?: AbortSignal;\n}\n\nexport interface MathRenderer {\n /** Returns the node that replaces the math fallback. */\n render(request: MathRenderRequest): HtmlNode | Promise<HtmlNode>;\n}\n\nexport interface MathRenderPluginOptions {\n readonly mode?: PluginFailureMode;\n readonly renderer: MathRenderer;\n}\n\n/** Renders math nodes through a caller-supplied renderer. */\nexport class MathRenderPlugin implements HtmlPlugin {\n public readonly name = \"math-render\";\n private readonly mode: PluginFailureMode;\n private readonly renderer: MathRenderer;\n\n public constructor(options: MathRenderPluginOptions) {\n this.renderer = options.renderer;\n this.mode = options.mode ?? \"tolerant\";\n }\n\n public transform(context: HtmlPluginContext): HtmlRootNode | Promise<HtmlRootNode> {\n return replaceHtmlNodes(context.root, (node) => {\n if (node.kind !== \"math\") {\n return;\n }\n\n const request: MathRenderRequest = { node, signal: context.signal };\n\n try {\n const result = this.renderer.render(request);\n\n return isPromise(result)\n ? result.then(\n (rendered) => ({ ...rendered, origin: node.origin }),\n (cause: unknown) => this.renderFailure(cause, node, context),\n )\n : { ...result, origin: node.origin };\n } catch (cause) {\n return this.renderFailure(cause, node, context);\n }\n });\n }\n\n private renderFailure(cause: unknown, node: HtmlMathNode, context: HtmlPluginContext): undefined {\n if (this.mode === \"strict\") {\n throw cause;\n }\n\n context.diagnostics.add({\n severity: \"warning\",\n code: \"mdx.plugin.math-render\",\n message: `Could not render ${node.style} math: ${cause instanceof Error ? cause.message : String(cause)}`,\n span:\n node.origin === undefined\n ? undefined\n : { file: context.file, start: node.origin.start, end: node.origin.end },\n });\n }\n}\n"],"mappings":";;;;AAuBA,IAAa,mBAAb,MAAoD;CAClD,OAAuB;CACvB;CACA;CAEA,YAAmB,SAAkC;EACnD,KAAK,WAAW,QAAQ;EACxB,KAAK,OAAO,QAAQ,QAAQ;CAC9B;CAEA,UAAiB,SAAkE;EACjF,OAAO,iBAAiB,QAAQ,OAAO,SAAS;GAC9C,IAAI,KAAK,SAAS,QAChB;GAGF,MAAM,UAA6B;IAAE;IAAM,QAAQ,QAAQ;GAAO;GAElE,IAAI;IACF,MAAM,SAAS,KAAK,SAAS,OAAO,OAAO;IAE3C,OAAO,UAAU,MAAM,IACnB,OAAO,MACJ,cAAc;KAAE,GAAG;KAAU,QAAQ,KAAK;IAAO,KACjD,UAAmB,KAAK,cAAc,OAAO,MAAM,OAAO,CAC7D,IACA;KAAE,GAAG;KAAQ,QAAQ,KAAK;IAAO;GACvC,SAAS,OAAO;IACd,OAAO,KAAK,cAAc,OAAO,MAAM,OAAO;GAChD;EACF,CAAC;CACH;CAEA,cAAsB,OAAgB,MAAoB,SAAuC;EAC/F,IAAI,KAAK,SAAS,UAChB,MAAM;EAGR,QAAQ,YAAY,IAAI;GACtB,UAAU;GACV,MAAM;GACN,SAAS,oBAAoB,KAAK,MAAM,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;GACtG,MACE,KAAK,WAAW,KAAA,IACZ,KAAA,IACA;IAAE,MAAM,QAAQ;IAAM,OAAO,KAAK,OAAO;IAAO,KAAK,KAAK,OAAO;GAAI;EAC7E,CAAC;CACH;AACF"}
|
package/dist/plugins/mod.d.mts
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
|
|
1
|
+
import { DocumentPlugin, DocumentPluginContext, HtmlPlugin, HtmlPluginContext, PluginFailureMode } from "../plugin.mjs";
|
|
2
|
+
import { CodeBlockMetadata, CodeBlockMetadataError, CodeBlockMetadataIssue, CodeLineNumbers, CodeLineRange, CodeLineSelection, codeLineSelected, parseCodeBlockMetadata } from "./code-block-metadata.mjs";
|
|
3
|
+
import { HeadingIdPlugin, HeadingIdPluginOptions } from "./heading-id.mjs";
|
|
4
|
+
import { LowerHeadingPlugin, LowerHeadingPluginOptions } from "./lower-heading.mjs";
|
|
5
|
+
import { MathRenderPlugin, MathRenderPluginOptions, MathRenderRequest, MathRenderer } from "./math-render.mjs";
|
|
6
|
+
import { RemoveEsmPlugin } from "./remove-esm.mjs";
|
|
7
|
+
import { AsynchronousSyntaxHighlighter, SynchronousSyntaxHighlighter, SyntaxHighlightPlugin, SyntaxHighlightPluginOptions, SyntaxHighlightRequest, SyntaxHighlighter } from "./syntax-highlight.mjs";
|
|
8
|
+
import { ShikiCodeOptions, ShikiDataAttribute, ShikiHighlighterOptions, createShikiHighlighter } from "./shiki.mjs";
|
|
9
|
+
export { AsynchronousSyntaxHighlighter, CodeBlockMetadata, CodeBlockMetadataError, CodeBlockMetadataIssue, CodeLineNumbers, CodeLineRange, CodeLineSelection, DocumentPlugin, DocumentPluginContext, HeadingIdPlugin, HeadingIdPluginOptions, HtmlPlugin, HtmlPluginContext, LowerHeadingPlugin, LowerHeadingPluginOptions, MathRenderPlugin, MathRenderPluginOptions, MathRenderRequest, MathRenderer, PluginFailureMode, RemoveEsmPlugin, ShikiCodeOptions, ShikiDataAttribute, ShikiHighlighterOptions, SynchronousSyntaxHighlighter, SyntaxHighlightPlugin, SyntaxHighlightPluginOptions, SyntaxHighlightRequest, SyntaxHighlighter, codeLineSelected, createShikiHighlighter, parseCodeBlockMetadata };
|
package/dist/plugins/mod.mjs
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
|
|
1
|
+
import { CodeBlockMetadataError, codeLineSelected, parseCodeBlockMetadata } from "./code-block-metadata.mjs";
|
|
2
|
+
import { HeadingIdPlugin } from "./heading-id.mjs";
|
|
3
|
+
import { LowerHeadingPlugin } from "./lower-heading.mjs";
|
|
4
|
+
import { MathRenderPlugin } from "./math-render.mjs";
|
|
5
|
+
import { RemoveEsmPlugin } from "./remove-esm.mjs";
|
|
6
|
+
import { createShikiHighlighter } from "./shiki.mjs";
|
|
7
|
+
import { SyntaxHighlightPlugin } from "./syntax-highlight.mjs";
|
|
8
|
+
export { CodeBlockMetadataError, HeadingIdPlugin, LowerHeadingPlugin, MathRenderPlugin, RemoveEsmPlugin, SyntaxHighlightPlugin, codeLineSelected, createShikiHighlighter, parseCodeBlockMetadata };
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { DocumentNode } from "../model.mjs";
|
|
2
|
+
import { DocumentPlugin, DocumentPluginContext } from "../plugin.mjs";
|
|
3
|
+
//#region src/plugins/remove-esm.d.ts
|
|
4
|
+
/** Removes authored imports and exports while retaining all renderable content. */
|
|
5
|
+
export declare class RemoveEsmPlugin implements DocumentPlugin {
|
|
6
|
+
readonly name = "remove-esm";
|
|
7
|
+
transform(context: DocumentPluginContext): DocumentNode;
|
|
8
|
+
}
|
|
9
|
+
//#endregion
|
|
10
|
+
//# sourceMappingURL=remove-esm.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remove-esm.d.mts","names":[],"sources":["../../src/plugins/remove-esm.ts"],"mappings":";;;;qBAIa,2BAA2B;WACtB;EAET,UAAU,SAAS,wBAAwB"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
//#region src/plugins/remove-esm.ts
|
|
2
|
+
/** Removes authored imports and exports while retaining all renderable content. */
|
|
3
|
+
var RemoveEsmPlugin = class {
|
|
4
|
+
name = "remove-esm";
|
|
5
|
+
transform(context) {
|
|
6
|
+
return context.rewrite({ esm: () => null });
|
|
7
|
+
}
|
|
8
|
+
};
|
|
9
|
+
//#endregion
|
|
10
|
+
export { RemoveEsmPlugin };
|
|
11
|
+
|
|
12
|
+
//# sourceMappingURL=remove-esm.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remove-esm.mjs","names":[],"sources":["../../src/plugins/remove-esm.ts"],"sourcesContent":["import type { DocumentNode } from \"../model.ts\";\nimport type { DocumentPlugin, DocumentPluginContext } from \"../plugin.ts\";\n\n/** Removes authored imports and exports while retaining all renderable content. */\nexport class RemoveEsmPlugin implements DocumentPlugin {\n public readonly name = \"remove-esm\";\n\n public transform(context: DocumentPluginContext): DocumentNode {\n return context.rewrite({ esm: () => null });\n }\n}\n"],"mappings":";;AAIA,IAAa,kBAAb,MAAuD;CACrD,OAAuB;CAEvB,UAAiB,SAA8C;EAC7D,OAAO,QAAQ,QAAQ,EAAE,WAAW,KAAK,CAAC;CAC5C;AACF"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { SyntaxHighlighter } from "./syntax-highlight.mjs";
|
|
2
|
+
import { CodeToHastOptions, HighlighterGeneric } from "shiki/types";
|
|
3
|
+
//#region src/plugins/shiki.d.ts
|
|
4
|
+
type ShikiHighlighter = Pick<HighlighterGeneric<string, string>, "codeToHast" | "getLoadedLanguages">;
|
|
5
|
+
type ShikiCodeToHastOptions<T> = T extends unknown ? Omit<T, "lang" | "meta" | "structure"> : never;
|
|
6
|
+
export type ShikiCodeOptions = ShikiCodeToHastOptions<CodeToHastOptions<string, string>>;
|
|
7
|
+
export type ShikiDataAttribute = "language" | "line-count" | "meta" | "source-code";
|
|
8
|
+
export type ShikiHighlighterOptions = ShikiCodeOptions & Readonly<{
|
|
9
|
+
commandLineClassName?: string;
|
|
10
|
+
fallbackLanguage?: string;
|
|
11
|
+
highlightedLineClassName?: string;
|
|
12
|
+
includeDataAttributes?: readonly ShikiDataAttribute[];
|
|
13
|
+
languageAliases?: Readonly<Record<string, string>>;
|
|
14
|
+
lineNumberClassName?: string;
|
|
15
|
+
lineNumberWidthProperty?: string;
|
|
16
|
+
}>;
|
|
17
|
+
/** Adapts a caller-owned, preloaded Shiki highlighter to Temelj's code highlighter. */
|
|
18
|
+
export declare function createShikiHighlighter(highlighter: ShikiHighlighter, options: ShikiHighlighterOptions): SyntaxHighlighter;
|
|
19
|
+
//#endregion
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=shiki.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shiki.d.mts","names":[],"sources":["../../src/plugins/shiki.ts"],"mappings":";;;KASK,mBAAmB,KACtB;KAIG,uBAAuB,KAAK,oBAAoB,KAAK;YAE9C,mBAAmB,uBAAuB;YAE1C;YAEA,0BAA0B,mBACpC;EACE;EACA;EACA;EACA,iCAAiC;EACjC,kBAAkB,SAAS;EAC3B;EACA;;;wBAMY,uBACd,aAAa,kBACb,SAAS,0BACR"}
|