@lowlighter/markdown 2.0.0 → 4.0.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 +31 -33
- package/mod.d.ts +36 -0
- package/mod.js +23 -0
- package/package.json +119 -38
- package/plugins/anchors.d.ts +11 -0
- package/plugins/anchors.js +39 -0
- package/plugins/callouts.d.ts +14 -0
- package/plugins/callouts.js +31 -0
- package/plugins/directives.d.ts +24 -0
- package/plugins/directives.js +76 -0
- package/plugins/emojis.d.ts +11 -0
- package/plugins/emojis.js +15 -0
- package/plugins/frontmatter.d.ts +20 -0
- package/plugins/frontmatter.js +49 -0
- package/plugins/gfm.d.ts +18 -0
- package/plugins/gfm.js +43 -0
- package/plugins/{highlighting.ts → highlighting.d.ts} +2 -11
- package/plugins/highlighting.js +24 -0
- package/plugins/markers.d.ts +15 -0
- package/plugins/markers.js +30 -0
- package/plugins/math.d.ts +21 -0
- package/plugins/math.js +75 -0
- package/plugins/mermaid.d.ts +25 -0
- package/plugins/mermaid.js +32 -0
- package/plugins/mod.d.ts +15 -0
- package/plugins/mod.js +14 -0
- package/plugins/{ruby.ts → ruby.d.ts} +2 -11
- package/plugins/ruby.js +28 -0
- package/plugins/uncomments.d.ts +13 -0
- package/plugins/uncomments.js +28 -0
- package/plugins/wikilinks.d.ts +26 -0
- package/plugins/wikilinks.js +45 -0
- package/presets/default.d.ts +3 -0
- package/presets/default.js +9 -0
- package/presets/svg.d.ts +3 -0
- package/presets/svg.js +11 -0
- package/presets/text.d.ts +3 -0
- package/presets/text.js +11 -0
- package/presets/web.d.ts +3 -0
- package/presets/web.js +12 -0
- package/renderer.d.ts +64 -0
- package/renderer.js +70 -0
- package/types.d.ts +88 -0
- package/types.js +10 -0
- package/deno.jsonc +0 -124
- package/deno.lock +0 -2282
- package/mod.mjs +0 -1
- package/mod.ts +0 -2
- package/mod_test.ts +0 -1
- package/plugins/anchors.mjs +0 -1
- package/plugins/anchors.ts +0 -21
- package/plugins/anchors_test.ts +0 -8
- package/plugins/directives.mjs +0 -1
- package/plugins/directives.ts +0 -112
- package/plugins/directives_test.ts +0 -13
- package/plugins/emojis.mjs +0 -1
- package/plugins/emojis.ts +0 -20
- package/plugins/emojis_test.ts +0 -8
- package/plugins/frontmatter.mjs +0 -1
- package/plugins/frontmatter.ts +0 -43
- package/plugins/frontmatter_test.ts +0 -18
- package/plugins/gfm.mjs +0 -1
- package/plugins/gfm.ts +0 -14
- package/plugins/gfm_test.ts +0 -28
- package/plugins/highlighting.mjs +0 -1
- package/plugins/highlighting_test.ts +0 -8
- package/plugins/linebreaks.mjs +0 -1
- package/plugins/linebreaks.ts +0 -21
- package/plugins/linebreaks_test.ts +0 -8
- package/plugins/markers.mjs +0 -1
- package/plugins/markers.ts +0 -25
- package/plugins/markers_test.ts +0 -13
- package/plugins/math.mjs +0 -1
- package/plugins/math.ts +0 -25
- package/plugins/math_test.ts +0 -8
- package/plugins/mermaid.mjs +0 -1
- package/plugins/mermaid.ts +0 -41
- package/plugins/mermaid_test.ts +0 -8
- package/plugins/mod.mjs +0 -1
- package/plugins/mod.ts +0 -14
- package/plugins/ruby.mjs +0 -1
- package/plugins/ruby_test.ts +0 -8
- package/plugins/sanitize.mjs +0 -1
- package/plugins/sanitize.ts +0 -26
- package/plugins/sanitize_test.ts +0 -15
- package/plugins/uncomments.mjs +0 -1
- package/plugins/uncomments.ts +0 -20
- package/plugins/uncomments_test.ts +0 -8
- package/plugins/wikilinks.mjs +0 -1
- package/plugins/wikilinks.ts +0 -40
- package/plugins/wikilinks_test.ts +0 -14
- package/renderer.mjs +0 -1
- package/renderer.ts +0 -138
- package/renderer_test.ts +0 -19
package/README.md
CHANGED
|
@@ -11,60 +11,58 @@
|
|
|
11
11
|
### Rendering markdown
|
|
12
12
|
|
|
13
13
|
```ts
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
import { markdown } from "./mod.ts"
|
|
15
|
+
|
|
16
|
+
// Render markdown (GitHub Flavored Markdown is enabled by default)
|
|
17
|
+
markdown("# Hello, world!")
|
|
18
|
+
|
|
19
|
+
// Toggle additional features through options
|
|
20
|
+
markdown("$\\pi$ is ==irrational==", { math: true, markers: true })
|
|
17
21
|
|
|
18
|
-
//
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
+
// Raw HTML is escaped by default, opt-in with the `html` option
|
|
23
|
+
markdown("<b>trusted</b>", { html: true })
|
|
24
|
+
|
|
25
|
+
// Retrieve frontmatter metadata
|
|
26
|
+
const { value, metadata } = markdown("---\ntitle: foo\n---\nbar", { frontmatter: true, metadata: true })
|
|
27
|
+
console.log(value, metadata.frontmatter) // "bar" { title: "foo" }
|
|
22
28
|
```
|
|
23
29
|
|
|
24
|
-
###
|
|
30
|
+
### Reusing a renderer and hooking custom rules
|
|
25
31
|
|
|
26
32
|
```ts
|
|
27
33
|
import { Renderer } from "./renderer.ts"
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
// https://github.com/denoland/deno/pull/22623
|
|
37
|
-
"https://esm.sh/jsr/@libs/markdown/plugins/gfm",
|
|
38
|
-
],
|
|
34
|
+
|
|
35
|
+
const renderer = new Renderer({
|
|
36
|
+
highlighting: true,
|
|
37
|
+
wikilinks: { resolve: (link) => `/wiki/${link}` },
|
|
38
|
+
// Hook the underlying markdown-it instance for custom rules and renderers
|
|
39
|
+
hooks(engine) {
|
|
40
|
+
engine.renderer.rules.code_inline = (tokens, index) => `<kbd>${engine.utils.escapeHtml(tokens[index].content)}</kbd>`
|
|
41
|
+
},
|
|
39
42
|
})
|
|
40
|
-
|
|
43
|
+
renderer.render("# Hello, world!")
|
|
41
44
|
```
|
|
42
45
|
|
|
43
46
|
## ✨ Features
|
|
44
47
|
|
|
45
|
-
-
|
|
46
|
-
-
|
|
47
|
-
-
|
|
48
|
+
- Single `markdown(text, options)` function where every feature is a simple toggle.
|
|
49
|
+
- Renders [GitHub Flavored Markdown](https://github.github.com/gfm) by default (tables, strikethrough, autolinks, footnotes and tasklists).
|
|
50
|
+
- Raw HTML is escaped by default, making the output safe against HTML injection (opt-in with the `html` option).
|
|
51
|
+
- Optional features:
|
|
48
52
|
- [Headings anchors](https://jsr.io/@libs/markdown/doc/plugins/anchors/~/default)
|
|
53
|
+
- [Obsidian-style callouts](https://jsr.io/@libs/markdown/doc/plugins/callouts/~/default)
|
|
49
54
|
- [Custom directives](https://jsr.io/@libs/markdown/doc/plugins/directives/~/default)
|
|
50
55
|
- [Emoji rendering](https://jsr.io/@libs/markdown/doc/plugins/emojis/~/default)
|
|
51
56
|
- [Frontmatter parsing](https://jsr.io/@libs/markdown/doc/plugins/frontmatter/~/default)
|
|
52
|
-
- [GitHub Flavored Markdown](https://jsr.io/@libs/markdown/doc/plugins/gfm/~/default)
|
|
53
57
|
- [Code highlighting](https://jsr.io/@libs/markdown/doc/plugins/highlighting/~/default)
|
|
54
|
-
- [Linebreaks](https://jsr.io/@libs/markdown/doc/plugins/linebreaks/~/default)
|
|
55
58
|
- [Markers](https://jsr.io/@libs/markdown/doc/plugins/markers/~/default)
|
|
56
59
|
- [Math rendering](https://jsr.io/@libs/markdown/doc/plugins/math/~/default)
|
|
57
60
|
- [Mermaid diagrams](https://jsr.io/@libs/markdown/doc/plugins/mermaid/~/default)
|
|
58
61
|
- [Ruby annotations](https://jsr.io/@libs/markdown/doc/plugins/ruby/~/default)
|
|
59
|
-
- [HTML sanitization](https://jsr.io/@libs/markdown/doc/plugins/sanitize/~/default)
|
|
60
62
|
- [Comment removal](https://jsr.io/@libs/markdown/doc/plugins/uncomments/~/default)
|
|
61
63
|
- [Wiki links](https://jsr.io/@libs/markdown/doc/plugins/wikilinks/~/default)
|
|
62
|
-
|
|
63
|
-
-
|
|
64
|
-
- From already existing Plugin objects
|
|
65
|
-
- From local sources
|
|
66
|
-
- From remote HTTPS sources
|
|
67
|
-
- The last option is particularly useful for user-provided customizations in a dynamic environment.
|
|
64
|
+
- Math and mermaid are rendered as plain markup intended for client-side processing (KaTeX, MathJax, mermaid), so no heavyweight server-side dependency is required.
|
|
65
|
+
- Escape hatch to the underlying [markdown-it](https://github.com/markdown-it/markdown-it) instance through the `hooks` option for custom syntax and rendering rules.
|
|
68
66
|
|
|
69
67
|
## 📜 Licenses and credits
|
|
70
68
|
|
|
@@ -73,4 +71,4 @@ Copyright (c) Simon Lecoq <@lowlighter>. (MIT License)
|
|
|
73
71
|
https://github.com/lowlighter/libs/blob/main/LICENSE
|
|
74
72
|
```
|
|
75
73
|
|
|
76
|
-
This library
|
|
74
|
+
This library relies on the awesome [markdown-it](https://github.com/markdown-it/markdown-it) library.
|
package/mod.d.ts
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Renderer, type RendererOptions } from "./renderer.js";
|
|
2
|
+
export { Renderer };
|
|
3
|
+
export type * from "./renderer.js";
|
|
4
|
+
export type * from "./types.js";
|
|
5
|
+
/** Options for {@link markdown}. */ export type MarkdownOptions = RendererOptions & {
|
|
6
|
+
/** Return parsed metadata (e.g. frontmatter) along with the rendered value. */ metadata?: boolean;
|
|
7
|
+
/** Inline content that renders to a single lone paragraph (defaults to `true`). */ inline?: boolean;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Render markdown content into an HTML string.
|
|
11
|
+
*
|
|
12
|
+
* Raw HTML is escaped unless the `html` option is enabled, which makes the default output safe against HTML injection.
|
|
13
|
+
*
|
|
14
|
+
* ```ts
|
|
15
|
+
* import { markdown } from "./mod.ts"
|
|
16
|
+
* markdown("# Hello, world!")
|
|
17
|
+
* markdown("$\\pi$ is ==irrational==", { math: true, markers: true })
|
|
18
|
+
* ```
|
|
19
|
+
*/ export declare function markdown(content: string, options?: MarkdownOptions & {
|
|
20
|
+
metadata?: false;
|
|
21
|
+
inline?: boolean;
|
|
22
|
+
}): string;
|
|
23
|
+
/**
|
|
24
|
+
* Render markdown content into an HTML string with parsed metadata.
|
|
25
|
+
*
|
|
26
|
+
* ```ts
|
|
27
|
+
* import { markdown } from "./mod.ts"
|
|
28
|
+
* const { value, metadata } = markdown("---\ntitle: foo\n---\nbar", { frontmatter: true, metadata: true })
|
|
29
|
+
* console.log(metadata.frontmatter) // { title: "foo" }
|
|
30
|
+
* ```
|
|
31
|
+
*/ export declare function markdown(content: string, options: MarkdownOptions & {
|
|
32
|
+
metadata: true;
|
|
33
|
+
}): {
|
|
34
|
+
value: string;
|
|
35
|
+
metadata: Record<PropertyKey, unknown>;
|
|
36
|
+
};
|
package/mod.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// Imports
|
|
2
|
+
import { Renderer } from "./renderer.js";
|
|
3
|
+
export { Renderer };
|
|
4
|
+
/** Cached renderer instances. */ const cache = new Map();
|
|
5
|
+
/**
|
|
6
|
+
* Render markdown content.
|
|
7
|
+
*/ export function markdown(content, options = {}) {
|
|
8
|
+
const { metadata = false, inline = true, ...rest } = options;
|
|
9
|
+
let renderer = new Renderer(rest);
|
|
10
|
+
if (Object.values(rest).every((value)=>typeof value === "boolean")) {
|
|
11
|
+
const key = JSON.stringify(rest, Object.keys(rest).sort());
|
|
12
|
+
if (!cache.has(key)) {
|
|
13
|
+
if (cache.size > 64) cache.clear();
|
|
14
|
+
cache.set(key, renderer);
|
|
15
|
+
}
|
|
16
|
+
renderer = cache.get(key);
|
|
17
|
+
}
|
|
18
|
+
return renderer.render(content, {
|
|
19
|
+
metadata: metadata,
|
|
20
|
+
inline
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9saWJzL2xpYnMvQGxpYnMvbWFya2Rvd24vbW9kLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCB7IFJlbmRlcmVyLCB0eXBlIFJlbmRlcmVyT3B0aW9ucyB9IGZyb20gXCIuL3JlbmRlcmVyLmpzXCJcbmV4cG9ydCB7IFJlbmRlcmVyIH1cbmV4cG9ydCB0eXBlICogZnJvbSBcIi4vcmVuZGVyZXIuanNcIlxuZXhwb3J0IHR5cGUgKiBmcm9tIFwiLi90eXBlcy5qc1wiXG5cbi8qKiBDYWNoZWQgcmVuZGVyZXIgaW5zdGFuY2VzLiAqL1xuY29uc3QgY2FjaGUgPSBuZXcgTWFwPHN0cmluZywgUmVuZGVyZXI+KClcblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayBtYXJrZG93bn0uICovXG5leHBvcnQgdHlwZSBNYXJrZG93bk9wdGlvbnMgPSBSZW5kZXJlck9wdGlvbnMgJiB7XG4gIC8qKiBSZXR1cm4gcGFyc2VkIG1ldGFkYXRhIChlLmcuIGZyb250bWF0dGVyKSBhbG9uZyB3aXRoIHRoZSByZW5kZXJlZCB2YWx1ZS4gKi9cbiAgbWV0YWRhdGE/OiBib29sZWFuXG4gIC8qKiBJbmxpbmUgY29udGVudCB0aGF0IHJlbmRlcnMgdG8gYSBzaW5nbGUgbG9uZSBwYXJhZ3JhcGggKGRlZmF1bHRzIHRvIGB0cnVlYCkuICovXG4gIGlubGluZT86IGJvb2xlYW5cbn1cblxuLyoqXG4gKiBSZW5kZXIgbWFya2Rvd24gY29udGVudCBpbnRvIGFuIEhUTUwgc3RyaW5nLlxuICpcbiAqIFJhdyBIVE1MIGlzIGVzY2FwZWQgdW5sZXNzIHRoZSBgaHRtbGAgb3B0aW9uIGlzIGVuYWJsZWQsIHdoaWNoIG1ha2VzIHRoZSBkZWZhdWx0IG91dHB1dCBzYWZlIGFnYWluc3QgSFRNTCBpbmplY3Rpb24uXG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB7IG1hcmtkb3duIH0gZnJvbSBcIi4vbW9kLnRzXCJcbiAqIG1hcmtkb3duKFwiIyBIZWxsbywgd29ybGQhXCIpXG4gKiBtYXJrZG93bihcIiRcXFxccGkkIGlzID09aXJyYXRpb25hbD09XCIsIHsgbWF0aDogdHJ1ZSwgbWFya2VyczogdHJ1ZSB9KVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXJrZG93bihjb250ZW50OiBzdHJpbmcsIG9wdGlvbnM/OiBNYXJrZG93bk9wdGlvbnMgJiB7IG1ldGFkYXRhPzogZmFsc2U7IGlubGluZT86IGJvb2xlYW4gfSk6IHN0cmluZ1xuLyoqXG4gKiBSZW5kZXIgbWFya2Rvd24gY29udGVudCBpbnRvIGFuIEhUTUwgc3RyaW5nIHdpdGggcGFyc2VkIG1ldGFkYXRhLlxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBtYXJrZG93biB9IGZyb20gXCIuL21vZC50c1wiXG4gKiBjb25zdCB7IHZhbHVlLCBtZXRhZGF0YSB9ID0gbWFya2Rvd24oXCItLS1cXG50aXRsZTogZm9vXFxuLS0tXFxuYmFyXCIsIHsgZnJvbnRtYXR0ZXI6IHRydWUsIG1ldGFkYXRhOiB0cnVlIH0pXG4gKiBjb25zb2xlLmxvZyhtZXRhZGF0YS5mcm9udG1hdHRlcikgLy8geyB0aXRsZTogXCJmb29cIiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcmtkb3duKGNvbnRlbnQ6IHN0cmluZywgb3B0aW9uczogTWFya2Rvd25PcHRpb25zICYgeyBtZXRhZGF0YTogdHJ1ZSB9KTogeyB2YWx1ZTogc3RyaW5nOyBtZXRhZGF0YTogUmVjb3JkPFByb3BlcnR5S2V5LCB1bmtub3duPiB9XG4vKipcbiAqIFJlbmRlciBtYXJrZG93biBjb250ZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFya2Rvd24oY29udGVudDogc3RyaW5nLCBvcHRpb25zID0ge30gYXMgTWFya2Rvd25PcHRpb25zKTogc3RyaW5nIHwgeyB2YWx1ZTogc3RyaW5nOyBtZXRhZGF0YTogUmVjb3JkPFByb3BlcnR5S2V5LCB1bmtub3duPiB9IHtcbiAgY29uc3QgeyBtZXRhZGF0YSA9IGZhbHNlLCBpbmxpbmUgPSB0cnVlLCAuLi5yZXN0IH0gPSBvcHRpb25zXG4gIGxldCByZW5kZXJlciA9IG5ldyBSZW5kZXJlcihyZXN0KVxuICBpZiAoT2JqZWN0LnZhbHVlcyhyZXN0KS5ldmVyeSgodmFsdWUpID0+IHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIpKSB7XG4gICAgY29uc3Qga2V5ID0gSlNPTi5zdHJpbmdpZnkocmVzdCwgT2JqZWN0LmtleXMocmVzdCkuc29ydCgpKVxuICAgIGlmICghY2FjaGUuaGFzKGtleSkpIHtcbiAgICAgIGlmIChjYWNoZS5zaXplID4gNjQpXG4gICAgICAgIGNhY2hlLmNsZWFyKClcbiAgICAgIGNhY2hlLnNldChrZXksIHJlbmRlcmVyKVxuICAgIH1cbiAgICByZW5kZXJlciA9IGNhY2hlLmdldChrZXkpIVxuICB9XG4gIHJldHVybiByZW5kZXJlci5yZW5kZXIoY29udGVudCwgeyBtZXRhZGF0YTogbWV0YWRhdGEgYXMgdHJ1ZSwgaW5saW5lIH0pXG59XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsVUFBVTtBQUNWLFNBQVMsUUFBUSxRQUE4QixnQkFBZTtBQUM5RCxTQUFTLFFBQVEsR0FBRTtBQUluQiwrQkFBK0IsR0FDL0IsTUFBTSxRQUFRLElBQUk7QUFnQ2xCOztDQUVDLEdBQ0QsT0FBTyxTQUFTLFNBQVMsT0FBZSxFQUFFLFVBQVUsQ0FBQyxDQUFvQjtFQUN2RSxNQUFNLEVBQUUsV0FBVyxLQUFLLEVBQUUsU0FBUyxJQUFJLEVBQUUsR0FBRyxNQUFNLEdBQUc7RUFDckQsSUFBSSxXQUFXLElBQUksU0FBUztFQUM1QixJQUFJLE9BQU8sTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsUUFBVSxPQUFPLFVBQVUsWUFBWTtJQUNwRSxNQUFNLE1BQU0sS0FBSyxTQUFTLENBQUMsTUFBTSxPQUFPLElBQUksQ0FBQyxNQUFNLElBQUk7SUFDdkQsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLE1BQU07TUFDbkIsSUFBSSxNQUFNLElBQUksR0FBRyxJQUNmLE1BQU0sS0FBSztNQUNiLE1BQU0sR0FBRyxDQUFDLEtBQUs7SUFDakI7SUFDQSxXQUFXLE1BQU0sR0FBRyxDQUFDO0VBQ3ZCO0VBQ0EsT0FBTyxTQUFTLE1BQU0sQ0FBQyxTQUFTO0lBQUUsVUFBVTtJQUFrQjtFQUFPO0FBQ3ZFIn0=
|
package/package.json
CHANGED
|
@@ -1,45 +1,126 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lowlighter/markdown",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "4.0.0",
|
|
4
4
|
"type": "module",
|
|
5
|
-
"
|
|
6
|
-
"
|
|
7
|
-
"
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
"
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
5
|
+
"main": "./mod.js",
|
|
6
|
+
"types": "./mod.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./mod.d.ts",
|
|
10
|
+
"import": "./mod.js",
|
|
11
|
+
"default": "./mod.js"
|
|
12
|
+
},
|
|
13
|
+
"./renderer": {
|
|
14
|
+
"types": "./renderer.d.ts",
|
|
15
|
+
"import": "./renderer.js",
|
|
16
|
+
"default": "./renderer.js"
|
|
17
|
+
},
|
|
18
|
+
"./types": {
|
|
19
|
+
"types": "./types.d.ts",
|
|
20
|
+
"import": "./types.js",
|
|
21
|
+
"default": "./types.js"
|
|
22
|
+
},
|
|
23
|
+
"./plugins": {
|
|
24
|
+
"types": "./plugins/mod.d.ts",
|
|
25
|
+
"import": "./plugins/mod.js",
|
|
26
|
+
"default": "./plugins/mod.js"
|
|
27
|
+
},
|
|
28
|
+
"./plugins/anchors": {
|
|
29
|
+
"types": "./plugins/anchors.d.ts",
|
|
30
|
+
"import": "./plugins/anchors.js",
|
|
31
|
+
"default": "./plugins/anchors.js"
|
|
32
|
+
},
|
|
33
|
+
"./plugins/callouts": {
|
|
34
|
+
"types": "./plugins/callouts.d.ts",
|
|
35
|
+
"import": "./plugins/callouts.js",
|
|
36
|
+
"default": "./plugins/callouts.js"
|
|
37
|
+
},
|
|
38
|
+
"./plugins/directives": {
|
|
39
|
+
"types": "./plugins/directives.d.ts",
|
|
40
|
+
"import": "./plugins/directives.js",
|
|
41
|
+
"default": "./plugins/directives.js"
|
|
42
|
+
},
|
|
43
|
+
"./plugins/emojis": {
|
|
44
|
+
"types": "./plugins/emojis.d.ts",
|
|
45
|
+
"import": "./plugins/emojis.js",
|
|
46
|
+
"default": "./plugins/emojis.js"
|
|
47
|
+
},
|
|
48
|
+
"./plugins/frontmatter": {
|
|
49
|
+
"types": "./plugins/frontmatter.d.ts",
|
|
50
|
+
"import": "./plugins/frontmatter.js",
|
|
51
|
+
"default": "./plugins/frontmatter.js"
|
|
52
|
+
},
|
|
53
|
+
"./plugins/gfm": {
|
|
54
|
+
"types": "./plugins/gfm.d.ts",
|
|
55
|
+
"import": "./plugins/gfm.js",
|
|
56
|
+
"default": "./plugins/gfm.js"
|
|
57
|
+
},
|
|
58
|
+
"./plugins/highlighting": {
|
|
59
|
+
"types": "./plugins/highlighting.d.ts",
|
|
60
|
+
"import": "./plugins/highlighting.js",
|
|
61
|
+
"default": "./plugins/highlighting.js"
|
|
62
|
+
},
|
|
63
|
+
"./plugins/markers": {
|
|
64
|
+
"types": "./plugins/markers.d.ts",
|
|
65
|
+
"import": "./plugins/markers.js",
|
|
66
|
+
"default": "./plugins/markers.js"
|
|
67
|
+
},
|
|
68
|
+
"./plugins/math": {
|
|
69
|
+
"types": "./plugins/math.d.ts",
|
|
70
|
+
"import": "./plugins/math.js",
|
|
71
|
+
"default": "./plugins/math.js"
|
|
72
|
+
},
|
|
73
|
+
"./plugins/mermaid": {
|
|
74
|
+
"types": "./plugins/mermaid.d.ts",
|
|
75
|
+
"import": "./plugins/mermaid.js",
|
|
76
|
+
"default": "./plugins/mermaid.js"
|
|
77
|
+
},
|
|
78
|
+
"./plugins/ruby": {
|
|
79
|
+
"types": "./plugins/ruby.d.ts",
|
|
80
|
+
"import": "./plugins/ruby.js",
|
|
81
|
+
"default": "./plugins/ruby.js"
|
|
82
|
+
},
|
|
83
|
+
"./plugins/uncomments": {
|
|
84
|
+
"types": "./plugins/uncomments.d.ts",
|
|
85
|
+
"import": "./plugins/uncomments.js",
|
|
86
|
+
"default": "./plugins/uncomments.js"
|
|
87
|
+
},
|
|
88
|
+
"./plugins/wikilinks": {
|
|
89
|
+
"types": "./plugins/wikilinks.d.ts",
|
|
90
|
+
"import": "./plugins/wikilinks.js",
|
|
91
|
+
"default": "./plugins/wikilinks.js"
|
|
92
|
+
},
|
|
93
|
+
"./presets/default": {
|
|
94
|
+
"types": "./presets/default.d.ts",
|
|
95
|
+
"import": "./presets/default.js",
|
|
96
|
+
"default": "./presets/default.js"
|
|
97
|
+
},
|
|
98
|
+
"./presets/svg": {
|
|
99
|
+
"types": "./presets/svg.d.ts",
|
|
100
|
+
"import": "./presets/svg.js",
|
|
101
|
+
"default": "./presets/svg.js"
|
|
102
|
+
},
|
|
103
|
+
"./presets/text": {
|
|
104
|
+
"types": "./presets/text.d.ts",
|
|
105
|
+
"import": "./presets/text.js",
|
|
106
|
+
"default": "./presets/text.js"
|
|
107
|
+
},
|
|
108
|
+
"./presets/web": {
|
|
109
|
+
"types": "./presets/web.d.ts",
|
|
110
|
+
"import": "./presets/web.js",
|
|
111
|
+
"default": "./presets/web.js"
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
"dependencies": {
|
|
115
|
+
"highlight.js": "^11.11.1",
|
|
116
|
+
"markdown-it": "^14.1.0",
|
|
117
|
+
"markdown-it-emoji": "^3.0.0",
|
|
118
|
+
"markdown-it-footnote": "^4.0.0",
|
|
119
|
+
"@std/text": "npm:@jsr/std__text@^1.0.17",
|
|
120
|
+
"@std/yaml": "npm:@jsr/std__yaml@^1.0.12"
|
|
121
|
+
},
|
|
21
122
|
"repository": {
|
|
22
123
|
"type": "git",
|
|
23
124
|
"url": "git+https://github.com/lowlighter/libs.git"
|
|
24
|
-
},
|
|
25
|
-
"funding": "https://github.com/sponsors/lowlighter",
|
|
26
|
-
"exports": {
|
|
27
|
-
".": "./mod.mjs",
|
|
28
|
-
"./renderer": "./renderer.mjs",
|
|
29
|
-
"./plugins": "./plugins/mod.mjs",
|
|
30
|
-
"./plugins/anchors": "./plugins/anchors.mjs",
|
|
31
|
-
"./plugins/directives": "./plugins/directives.mjs",
|
|
32
|
-
"./plugins/emojis": "./plugins/emojis.mjs",
|
|
33
|
-
"./plugins/frontmatter": "./plugins/frontmatter.mjs",
|
|
34
|
-
"./plugins/gfm": "./plugins/gfm.mjs",
|
|
35
|
-
"./plugins/highlighting": "./plugins/highlighting.mjs",
|
|
36
|
-
"./plugins/linebreaks": "./plugins/linebreaks.mjs",
|
|
37
|
-
"./plugins/markers": "./plugins/markers.mjs",
|
|
38
|
-
"./plugins/math": "./plugins/math.mjs",
|
|
39
|
-
"./plugins/mermaid": "./plugins/mermaid.mjs",
|
|
40
|
-
"./plugins/ruby": "./plugins/ruby.mjs",
|
|
41
|
-
"./plugins/sanitize": "./plugins/sanitize.mjs",
|
|
42
|
-
"./plugins/uncomments": "./plugins/uncomments.mjs",
|
|
43
|
-
"./plugins/wikilinks": "./plugins/wikilinks.mjs"
|
|
44
125
|
}
|
|
45
|
-
}
|
|
126
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { MarkdownIt } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Add anchors to headings and autolink them.
|
|
4
|
+
*
|
|
5
|
+
* ```md
|
|
6
|
+
* # foo
|
|
7
|
+
* ```
|
|
8
|
+
* ```html
|
|
9
|
+
* <h1 id="foo"><a href="#foo">foo</a></h1>
|
|
10
|
+
* ```
|
|
11
|
+
*/ export default function anchors(engine: MarkdownIt): void;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// Imports
|
|
2
|
+
import { slugify } from "@std/text/unstable-slugify";
|
|
3
|
+
/**
|
|
4
|
+
* Add anchors to headings and autolink them.
|
|
5
|
+
*
|
|
6
|
+
* ```md
|
|
7
|
+
* # foo
|
|
8
|
+
* ```
|
|
9
|
+
* ```html
|
|
10
|
+
* <h1 id="foo"><a href="#foo">foo</a></h1>
|
|
11
|
+
* ```
|
|
12
|
+
*/ export default function anchors(engine) {
|
|
13
|
+
engine.core.ruler.push("anchors", (state)=>{
|
|
14
|
+
const slugs = new Map();
|
|
15
|
+
for(let i = 0; i < state.tokens.length; i++){
|
|
16
|
+
const token = state.tokens[i];
|
|
17
|
+
const inline = state.tokens[i + 1];
|
|
18
|
+
if (token.type !== "heading_open" || inline?.type !== "inline") continue;
|
|
19
|
+
const text = (inline.children ?? []).filter(({ type })=>[
|
|
20
|
+
"text",
|
|
21
|
+
"code_inline"
|
|
22
|
+
].includes(type)).map(({ content })=>content).join("");
|
|
23
|
+
let slug = slugify(text);
|
|
24
|
+
const count = slugs.get(slug) ?? 0;
|
|
25
|
+
slugs.set(slug, count + 1);
|
|
26
|
+
if (count) slug = `${slug}-${count}`;
|
|
27
|
+
token.attrSet("id", slug);
|
|
28
|
+
const open = new state.Token("link_open", "a", 1);
|
|
29
|
+
open.attrSet("href", `#${slug}`);
|
|
30
|
+
const close = new state.Token("link_close", "a", -1);
|
|
31
|
+
inline.children = [
|
|
32
|
+
open,
|
|
33
|
+
...inline.children ?? [],
|
|
34
|
+
close
|
|
35
|
+
];
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9saWJzL2xpYnMvQGxpYnMvbWFya2Rvd24vcGx1Z2lucy9hbmNob3JzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCB0eXBlIHsgTWFya2Rvd25JdCB9IGZyb20gXCIuLi90eXBlcy5qc1wiXG5pbXBvcnQgeyBzbHVnaWZ5IH0gZnJvbSBcIkBzdGQvdGV4dC91bnN0YWJsZS1zbHVnaWZ5XCJcblxuLyoqXG4gKiBBZGQgYW5jaG9ycyB0byBoZWFkaW5ncyBhbmQgYXV0b2xpbmsgdGhlbS5cbiAqXG4gKiBgYGBtZFxuICogIyBmb29cbiAqIGBgYFxuICogYGBgaHRtbFxuICogPGgxIGlkPVwiZm9vXCI+PGEgaHJlZj1cIiNmb29cIj5mb288L2E+PC9oMT5cbiAqIGBgYFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhbmNob3JzKGVuZ2luZTogTWFya2Rvd25JdCk6IHZvaWQge1xuICBlbmdpbmUuY29yZS5ydWxlci5wdXNoKFwiYW5jaG9yc1wiLCAoc3RhdGUpID0+IHtcbiAgICBjb25zdCBzbHVncyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KClcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0YXRlLnRva2Vucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdG9rZW4gPSBzdGF0ZS50b2tlbnNbaV1cbiAgICAgIGNvbnN0IGlubGluZSA9IHN0YXRlLnRva2Vuc1tpICsgMV1cbiAgICAgIGlmICgodG9rZW4udHlwZSAhPT0gXCJoZWFkaW5nX29wZW5cIikgfHwgKGlubGluZT8udHlwZSAhPT0gXCJpbmxpbmVcIikpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICBjb25zdCB0ZXh0ID0gKGlubGluZS5jaGlsZHJlbiA/PyBbXSkuZmlsdGVyKCh7IHR5cGUgfSkgPT4gW1widGV4dFwiLCBcImNvZGVfaW5saW5lXCJdLmluY2x1ZGVzKHR5cGUpKS5tYXAoKHsgY29udGVudCB9KSA9PiBjb250ZW50KS5qb2luKFwiXCIpXG4gICAgICBsZXQgc2x1ZyA9IHNsdWdpZnkodGV4dClcbiAgICAgIGNvbnN0IGNvdW50ID0gc2x1Z3MuZ2V0KHNsdWcpID8/IDBcbiAgICAgIHNsdWdzLnNldChzbHVnLCBjb3VudCArIDEpXG4gICAgICBpZiAoY291bnQpXG4gICAgICAgIHNsdWcgPSBgJHtzbHVnfS0ke2NvdW50fWBcbiAgICAgIHRva2VuLmF0dHJTZXQoXCJpZFwiLCBzbHVnKVxuICAgICAgY29uc3Qgb3BlbiA9IG5ldyBzdGF0ZS5Ub2tlbihcImxpbmtfb3BlblwiLCBcImFcIiwgMSlcbiAgICAgIG9wZW4uYXR0clNldChcImhyZWZcIiwgYCMke3NsdWd9YClcbiAgICAgIGNvbnN0IGNsb3NlID0gbmV3IHN0YXRlLlRva2VuKFwibGlua19jbG9zZVwiLCBcImFcIiwgLTEpXG4gICAgICBpbmxpbmUuY2hpbGRyZW4gPSBbb3BlbiwgLi4uaW5saW5lLmNoaWxkcmVuID8/IFtdLCBjbG9zZV1cbiAgICB9XG4gIH0pXG59XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsVUFBVTtBQUVWLFNBQVMsT0FBTyxRQUFRLDZCQUE0QjtBQUVwRDs7Ozs7Ozs7O0NBU0MsR0FDRCxlQUFlLFNBQVMsUUFBUSxNQUFrQjtFQUNoRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUNqQyxNQUFNLFFBQVEsSUFBSTtJQUNsQixJQUFLLElBQUksSUFBSSxHQUFHLElBQUksTUFBTSxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUs7TUFDNUMsTUFBTSxRQUFRLE1BQU0sTUFBTSxDQUFDLEVBQUU7TUFDN0IsTUFBTSxTQUFTLE1BQU0sTUFBTSxDQUFDLElBQUksRUFBRTtNQUNsQyxJQUFJLEFBQUMsTUFBTSxJQUFJLEtBQUssa0JBQW9CLFFBQVEsU0FBUyxVQUN2RDtNQUNGLE1BQU0sT0FBTyxDQUFDLE9BQU8sUUFBUSxJQUFJLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxHQUFLO1VBQUM7VUFBUTtTQUFjLENBQUMsUUFBUSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsR0FBSyxTQUFTLElBQUksQ0FBQztNQUNySSxJQUFJLE9BQU8sUUFBUTtNQUNuQixNQUFNLFFBQVEsTUFBTSxHQUFHLENBQUMsU0FBUztNQUNqQyxNQUFNLEdBQUcsQ0FBQyxNQUFNLFFBQVE7TUFDeEIsSUFBSSxPQUNGLE9BQU8sR0FBRyxLQUFLLENBQUMsRUFBRSxPQUFPO01BQzNCLE1BQU0sT0FBTyxDQUFDLE1BQU07TUFDcEIsTUFBTSxPQUFPLElBQUksTUFBTSxLQUFLLENBQUMsYUFBYSxLQUFLO01BQy9DLEtBQUssT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsTUFBTTtNQUMvQixNQUFNLFFBQVEsSUFBSSxNQUFNLEtBQUssQ0FBQyxjQUFjLEtBQUssQ0FBQztNQUNsRCxPQUFPLFFBQVEsR0FBRztRQUFDO1dBQVMsT0FBTyxRQUFRLElBQUksRUFBRTtRQUFFO09BQU07SUFDM0Q7RUFDRjtBQUNGIn0=
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { MarkdownIt } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Add support for {@link https://help.obsidian.md/callouts | Obsidian-style callouts}.
|
|
4
|
+
*
|
|
5
|
+
* ```md
|
|
6
|
+
* > [!note]
|
|
7
|
+
* > foo
|
|
8
|
+
* ```
|
|
9
|
+
* ```html
|
|
10
|
+
* <blockquote class="callout" data-callout="note">
|
|
11
|
+
* <p>foo</p>
|
|
12
|
+
* </blockquote>
|
|
13
|
+
* ```
|
|
14
|
+
*/ export default function callouts(engine: MarkdownIt): void;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// Imports
|
|
2
|
+
/**
|
|
3
|
+
* Add support for {@link https://help.obsidian.md/callouts | Obsidian-style callouts}.
|
|
4
|
+
*
|
|
5
|
+
* ```md
|
|
6
|
+
* > [!note]
|
|
7
|
+
* > foo
|
|
8
|
+
* ```
|
|
9
|
+
* ```html
|
|
10
|
+
* <blockquote class="callout" data-callout="note">
|
|
11
|
+
* <p>foo</p>
|
|
12
|
+
* </blockquote>
|
|
13
|
+
* ```
|
|
14
|
+
*/ export default function callouts(engine) {
|
|
15
|
+
engine.core.ruler.push("callouts", (state)=>{
|
|
16
|
+
const tokens = state.tokens;
|
|
17
|
+
for(let i = 0; i + 2 < tokens.length; i++){
|
|
18
|
+
if (tokens[i].type !== "blockquote_open" || tokens[i + 1].type !== "paragraph_open" || tokens[i + 2].type !== "inline") continue;
|
|
19
|
+
const inline = tokens[i + 2];
|
|
20
|
+
const text = inline.children?.[0];
|
|
21
|
+
if (!text || text.type !== "text") continue;
|
|
22
|
+
const match = text.content.match(/^\[!(\w+)\][ \t]*/);
|
|
23
|
+
if (!match) continue;
|
|
24
|
+
tokens[i].attrJoin("class", "callout");
|
|
25
|
+
tokens[i].attrSet("data-callout", match[1].toLowerCase());
|
|
26
|
+
text.content = text.content.slice(match[0].length);
|
|
27
|
+
if (!text.content) inline.children.splice(0, inline.children[1]?.type === "softbreak" ? 2 : 1);
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9saWJzL2xpYnMvQGxpYnMvbWFya2Rvd24vcGx1Z2lucy9jYWxsb3V0cy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgdHlwZSB7IE1hcmtkb3duSXQgfSBmcm9tIFwiLi4vdHlwZXMuanNcIlxuXG4vKipcbiAqIEFkZCBzdXBwb3J0IGZvciB7QGxpbmsgaHR0cHM6Ly9oZWxwLm9ic2lkaWFuLm1kL2NhbGxvdXRzIHwgT2JzaWRpYW4tc3R5bGUgY2FsbG91dHN9LlxuICpcbiAqIGBgYG1kXG4gKiA+IFshbm90ZV1cbiAqID4gZm9vXG4gKiBgYGBcbiAqIGBgYGh0bWxcbiAqIDxibG9ja3F1b3RlIGNsYXNzPVwiY2FsbG91dFwiIGRhdGEtY2FsbG91dD1cIm5vdGVcIj5cbiAqICAgPHA+Zm9vPC9wPlxuICogPC9ibG9ja3F1b3RlPlxuICogYGBgXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNhbGxvdXRzKGVuZ2luZTogTWFya2Rvd25JdCk6IHZvaWQge1xuICBlbmdpbmUuY29yZS5ydWxlci5wdXNoKFwiY2FsbG91dHNcIiwgKHN0YXRlKSA9PiB7XG4gICAgY29uc3QgdG9rZW5zID0gc3RhdGUudG9rZW5zXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgKyAyIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoKHRva2Vuc1tpXS50eXBlICE9PSBcImJsb2NrcXVvdGVfb3BlblwiKSB8fCAodG9rZW5zW2kgKyAxXS50eXBlICE9PSBcInBhcmFncmFwaF9vcGVuXCIpIHx8ICh0b2tlbnNbaSArIDJdLnR5cGUgIT09IFwiaW5saW5lXCIpKVxuICAgICAgICBjb250aW51ZVxuICAgICAgY29uc3QgaW5saW5lID0gdG9rZW5zW2kgKyAyXVxuICAgICAgY29uc3QgdGV4dCA9IGlubGluZS5jaGlsZHJlbj8uWzBdXG4gICAgICBpZiAoKCF0ZXh0KSB8fCAodGV4dC50eXBlICE9PSBcInRleHRcIikpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICBjb25zdCBtYXRjaCA9IHRleHQuY29udGVudC5tYXRjaCgvXlxcWyEoXFx3KylcXF1bIFxcdF0qLylcbiAgICAgIGlmICghbWF0Y2gpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB0b2tlbnNbaV0uYXR0ckpvaW4oXCJjbGFzc1wiLCBcImNhbGxvdXRcIilcbiAgICAgIHRva2Vuc1tpXS5hdHRyU2V0KFwiZGF0YS1jYWxsb3V0XCIsIG1hdGNoWzFdLnRvTG93ZXJDYXNlKCkpXG4gICAgICB0ZXh0LmNvbnRlbnQgPSB0ZXh0LmNvbnRlbnQuc2xpY2UobWF0Y2hbMF0ubGVuZ3RoKVxuICAgICAgaWYgKCF0ZXh0LmNvbnRlbnQpXG4gICAgICAgIGlubGluZS5jaGlsZHJlbiEuc3BsaWNlKDAsIGlubGluZS5jaGlsZHJlbiFbMV0/LnR5cGUgPT09IFwic29mdGJyZWFrXCIgPyAyIDogMSlcbiAgICB9XG4gIH0pXG59XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsVUFBVTtBQUdWOzs7Ozs7Ozs7Ozs7Q0FZQyxHQUNELGVBQWUsU0FBUyxTQUFTLE1BQWtCO0VBQ2pELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQ2xDLE1BQU0sU0FBUyxNQUFNLE1BQU07SUFDM0IsSUFBSyxJQUFJLElBQUksR0FBRyxJQUFJLElBQUksT0FBTyxNQUFNLEVBQUUsSUFBSztNQUMxQyxJQUFJLEFBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEtBQUsscUJBQXVCLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEtBQUssb0JBQXNCLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEtBQUssVUFDakg7TUFDRixNQUFNLFNBQVMsTUFBTSxDQUFDLElBQUksRUFBRTtNQUM1QixNQUFNLE9BQU8sT0FBTyxRQUFRLEVBQUUsQ0FBQyxFQUFFO01BQ2pDLElBQUksQUFBQyxDQUFDLFFBQVUsS0FBSyxJQUFJLEtBQUssUUFDNUI7TUFDRixNQUFNLFFBQVEsS0FBSyxPQUFPLENBQUMsS0FBSyxDQUFDO01BQ2pDLElBQUksQ0FBQyxPQUNIO01BQ0YsTUFBTSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsU0FBUztNQUM1QixNQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsS0FBSyxDQUFDLEVBQUUsQ0FBQyxXQUFXO01BQ3RELEtBQUssT0FBTyxHQUFHLEtBQUssT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLE1BQU07TUFDakQsSUFBSSxDQUFDLEtBQUssT0FBTyxFQUNmLE9BQU8sUUFBUSxDQUFFLE1BQU0sQ0FBQyxHQUFHLE9BQU8sUUFBUSxBQUFDLENBQUMsRUFBRSxFQUFFLFNBQVMsY0FBYyxJQUFJO0lBQy9FO0VBQ0Y7QUFDRiJ9
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { MarkdownIt } from "../types.js";
|
|
2
|
+
/** Directives options. */ export type DirectivesOptions = {
|
|
3
|
+
/** Indicate how to render a directive (defaults to a `<div>` with the directive name as class). */ render?: (name: string, attributes: Record<string, string>) => {
|
|
4
|
+
tag: string;
|
|
5
|
+
attributes?: Record<string, string>;
|
|
6
|
+
};
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Add support for custom container directives.
|
|
10
|
+
*
|
|
11
|
+
* Directives may be assigned attributes using the `{#id .class key=value}` syntax.
|
|
12
|
+
* Use the `render` option to customize the rendered tag and attributes.
|
|
13
|
+
*
|
|
14
|
+
* ```md
|
|
15
|
+
* :::foo{bar=qux}
|
|
16
|
+
* baz
|
|
17
|
+
* :::
|
|
18
|
+
* ```
|
|
19
|
+
* ```html
|
|
20
|
+
* <div class="foo" bar="qux">
|
|
21
|
+
* <p>baz</p>
|
|
22
|
+
* </div>
|
|
23
|
+
* ```
|
|
24
|
+
*/ export default function directives(engine: MarkdownIt, {}: DirectivesOptions = {} as never): void;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
// Imports
|
|
2
|
+
/**
|
|
3
|
+
* Add support for custom container directives.
|
|
4
|
+
*
|
|
5
|
+
* Directives may be assigned attributes using the `{#id .class key=value}` syntax.
|
|
6
|
+
* Use the `render` option to customize the rendered tag and attributes.
|
|
7
|
+
*
|
|
8
|
+
* ```md
|
|
9
|
+
* :::foo{bar=qux}
|
|
10
|
+
* baz
|
|
11
|
+
* :::
|
|
12
|
+
* ```
|
|
13
|
+
* ```html
|
|
14
|
+
* <div class="foo" bar="qux">
|
|
15
|
+
* <p>baz</p>
|
|
16
|
+
* </div>
|
|
17
|
+
* ```
|
|
18
|
+
*/ export default function directives(engine, { render = (name, attributes)=>({
|
|
19
|
+
tag: "div",
|
|
20
|
+
attributes: {
|
|
21
|
+
...attributes,
|
|
22
|
+
class: [
|
|
23
|
+
name,
|
|
24
|
+
attributes.class
|
|
25
|
+
].filter(Boolean).join(" ")
|
|
26
|
+
}
|
|
27
|
+
}) } = {}) {
|
|
28
|
+
engine.block.ruler.before("fence", "directives", (state, startLine, endLine, silent)=>{
|
|
29
|
+
const line = state.src.slice(state.bMarks[startLine] + state.tShift[startLine], state.eMarks[startLine]);
|
|
30
|
+
const match = /^:::([\w-]+)(?:\{(.*?)\})?\s*$/.exec(line);
|
|
31
|
+
if (!match) return false;
|
|
32
|
+
if (silent) return true;
|
|
33
|
+
let close = -1;
|
|
34
|
+
for(let next = startLine + 1; next < endLine; next++){
|
|
35
|
+
if (state.src.slice(state.bMarks[next] + state.tShift[next], state.eMarks[next]).trim() === ":::") {
|
|
36
|
+
close = next;
|
|
37
|
+
break;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
if (close < 0) return false;
|
|
41
|
+
const { tag, attributes = {} } = render(match[1], parseAttributes(match[2]));
|
|
42
|
+
const open = state.push("directive_open", tag, 1);
|
|
43
|
+
open.block = true;
|
|
44
|
+
for (const [attribute, value] of Object.entries(attributes))open.attrSet(attribute, value);
|
|
45
|
+
const max = state.lineMax;
|
|
46
|
+
state.lineMax = close;
|
|
47
|
+
state.md.block.tokenize(state, startLine + 1, close);
|
|
48
|
+
state.lineMax = max;
|
|
49
|
+
state.push("directive_close", tag, -1).block = true;
|
|
50
|
+
state.line = close + 1;
|
|
51
|
+
return true;
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
/** Parse directive attributes (`{#id .class key=value}`). */ function parseAttributes(text = "") {
|
|
55
|
+
const attributes = {};
|
|
56
|
+
for (const attribute of text.match(/[.#][\w-]+|[\w-]+="[^"]*"|[\w-]+=\S+/g) ?? []){
|
|
57
|
+
switch(true){
|
|
58
|
+
case attribute.startsWith("."):
|
|
59
|
+
attributes.class = [
|
|
60
|
+
attributes.class,
|
|
61
|
+
attribute.slice(1)
|
|
62
|
+
].filter(Boolean).join(" ");
|
|
63
|
+
break;
|
|
64
|
+
case attribute.startsWith("#"):
|
|
65
|
+
attributes.id = attribute.slice(1);
|
|
66
|
+
break;
|
|
67
|
+
default:
|
|
68
|
+
{
|
|
69
|
+
const [key, ...value] = attribute.split("=");
|
|
70
|
+
attributes[key] = value.join("=").replace(/^"([\s\S]*)"$/, "$1");
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return attributes;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9saWJzL2xpYnMvQGxpYnMvbWFya2Rvd24vcGx1Z2lucy9kaXJlY3RpdmVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCB0eXBlIHsgTWFya2Rvd25JdCB9IGZyb20gXCIuLi90eXBlcy5qc1wiXG5cbi8qKiBEaXJlY3RpdmVzIG9wdGlvbnMuICovXG5leHBvcnQgdHlwZSBEaXJlY3RpdmVzT3B0aW9ucyA9IHtcbiAgLyoqIEluZGljYXRlIGhvdyB0byByZW5kZXIgYSBkaXJlY3RpdmUgKGRlZmF1bHRzIHRvIGEgYDxkaXY+YCB3aXRoIHRoZSBkaXJlY3RpdmUgbmFtZSBhcyBjbGFzcykuICovXG4gIHJlbmRlcj86IChuYW1lOiBzdHJpbmcsIGF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pID0+IHsgdGFnOiBzdHJpbmc7IGF0dHJpYnV0ZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IH1cbn1cblxuLyoqXG4gKiBBZGQgc3VwcG9ydCBmb3IgY3VzdG9tIGNvbnRhaW5lciBkaXJlY3RpdmVzLlxuICpcbiAqIERpcmVjdGl2ZXMgbWF5IGJlIGFzc2lnbmVkIGF0dHJpYnV0ZXMgdXNpbmcgdGhlIGB7I2lkIC5jbGFzcyBrZXk9dmFsdWV9YCBzeW50YXguXG4gKiBVc2UgdGhlIGByZW5kZXJgIG9wdGlvbiB0byBjdXN0b21pemUgdGhlIHJlbmRlcmVkIHRhZyBhbmQgYXR0cmlidXRlcy5cbiAqXG4gKiBgYGBtZFxuICogOjo6Zm9ve2Jhcj1xdXh9XG4gKiBiYXpcbiAqIDo6OlxuICogYGBgXG4gKiBgYGBodG1sXG4gKiA8ZGl2IGNsYXNzPVwiZm9vXCIgYmFyPVwicXV4XCI+XG4gKiAgIDxwPmJhejwvcD5cbiAqIDwvZGl2PlxuICogYGBgXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRpcmVjdGl2ZXMoZW5naW5lOiBNYXJrZG93bkl0LCB7IHJlbmRlciA9IChuYW1lLCBhdHRyaWJ1dGVzKSA9PiAoeyB0YWc6IFwiZGl2XCIsIGF0dHJpYnV0ZXM6IHsgLi4uYXR0cmlidXRlcywgY2xhc3M6IFtuYW1lLCBhdHRyaWJ1dGVzLmNsYXNzXS5maWx0ZXIoQm9vbGVhbikuam9pbihcIiBcIikgfSB9KSB9OiBEaXJlY3RpdmVzT3B0aW9ucyA9IHt9KTogdm9pZCB7XG4gIGVuZ2luZS5ibG9jay5ydWxlci5iZWZvcmUoXCJmZW5jZVwiLCBcImRpcmVjdGl2ZXNcIiwgKHN0YXRlLCBzdGFydExpbmUsIGVuZExpbmUsIHNpbGVudCkgPT4ge1xuICAgIGNvbnN0IGxpbmUgPSBzdGF0ZS5zcmMuc2xpY2Uoc3RhdGUuYk1hcmtzW3N0YXJ0TGluZV0gKyBzdGF0ZS50U2hpZnRbc3RhcnRMaW5lXSwgc3RhdGUuZU1hcmtzW3N0YXJ0TGluZV0pXG4gICAgY29uc3QgbWF0Y2ggPSAvXjo6OihbXFx3LV0rKSg/OlxceyguKj8pXFx9KT9cXHMqJC8uZXhlYyhsaW5lKVxuICAgIGlmICghbWF0Y2gpXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICBpZiAoc2lsZW50KVxuICAgICAgcmV0dXJuIHRydWVcbiAgICBsZXQgY2xvc2UgPSAtMVxuICAgIGZvciAobGV0IG5leHQgPSBzdGFydExpbmUgKyAxOyBuZXh0IDwgZW5kTGluZTsgbmV4dCsrKSB7XG4gICAgICBpZiAoc3RhdGUuc3JjLnNsaWNlKHN0YXRlLmJNYXJrc1tuZXh0XSArIHN0YXRlLnRTaGlmdFtuZXh0XSwgc3RhdGUuZU1hcmtzW25leHRdKS50cmltKCkgPT09IFwiOjo6XCIpIHtcbiAgICAgICAgY2xvc2UgPSBuZXh0XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjbG9zZSA8IDApXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICBjb25zdCB7IHRhZywgYXR0cmlidXRlcyA9IHt9IH0gPSByZW5kZXIobWF0Y2hbMV0sIHBhcnNlQXR0cmlidXRlcyhtYXRjaFsyXSkpXG4gICAgY29uc3Qgb3BlbiA9IHN0YXRlLnB1c2goXCJkaXJlY3RpdmVfb3BlblwiLCB0YWcsIDEpXG4gICAgb3Blbi5ibG9jayA9IHRydWVcbiAgICBmb3IgKGNvbnN0IFthdHRyaWJ1dGUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhdHRyaWJ1dGVzKSlcbiAgICAgIG9wZW4uYXR0clNldChhdHRyaWJ1dGUsIHZhbHVlKVxuICAgIGNvbnN0IG1heCA9IHN0YXRlLmxpbmVNYXhcbiAgICBzdGF0ZS5saW5lTWF4ID0gY2xvc2VcbiAgICBzdGF0ZS5tZC5ibG9jay50b2tlbml6ZShzdGF0ZSwgc3RhcnRMaW5lICsgMSwgY2xvc2UpXG4gICAgc3RhdGUubGluZU1heCA9IG1heFxuICAgIHN0YXRlLnB1c2goXCJkaXJlY3RpdmVfY2xvc2VcIiwgdGFnLCAtMSkuYmxvY2sgPSB0cnVlXG4gICAgc3RhdGUubGluZSA9IGNsb3NlICsgMVxuICAgIHJldHVybiB0cnVlXG4gIH0pXG59XG5cbi8qKiBQYXJzZSBkaXJlY3RpdmUgYXR0cmlidXRlcyAoYHsjaWQgLmNsYXNzIGtleT12YWx1ZX1gKS4gKi9cbmZ1bmN0aW9uIHBhcnNlQXR0cmlidXRlcyh0ZXh0ID0gXCJcIik6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBhdHRyaWJ1dGVzID0ge30gYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICBmb3IgKGNvbnN0IGF0dHJpYnV0ZSBvZiB0ZXh0Lm1hdGNoKC9bLiNdW1xcdy1dK3xbXFx3LV0rPVwiW15cIl0qXCJ8W1xcdy1dKz1cXFMrL2cpID8/IFtdKSB7XG4gICAgc3dpdGNoICh0cnVlKSB7XG4gICAgICBjYXNlIGF0dHJpYnV0ZS5zdGFydHNXaXRoKFwiLlwiKTpcbiAgICAgICAgYXR0cmlidXRlcy5jbGFzcyA9IFthdHRyaWJ1dGVzLmNsYXNzLCBhdHRyaWJ1dGUuc2xpY2UoMSldLmZpbHRlcihCb29sZWFuKS5qb2luKFwiIFwiKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBhdHRyaWJ1dGUuc3RhcnRzV2l0aChcIiNcIik6XG4gICAgICAgIGF0dHJpYnV0ZXMuaWQgPSBhdHRyaWJ1dGUuc2xpY2UoMSlcbiAgICAgICAgYnJlYWtcbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgY29uc3QgW2tleSwgLi4udmFsdWVdID0gYXR0cmlidXRlLnNwbGl0KFwiPVwiKVxuICAgICAgICBhdHRyaWJ1dGVzW2tleV0gPSB2YWx1ZS5qb2luKFwiPVwiKS5yZXBsYWNlKC9eXCIoW1xcc1xcU10qKVwiJC8sIFwiJDFcIilcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGF0dHJpYnV0ZXNcbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVO0FBU1Y7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FnQkMsR0FDRCxlQUFlLFNBQVMsV0FBVyxNQUFrQixFQUFFLEVBQUUsU0FBUyxDQUFDLE1BQU0sYUFBZSxDQUFDO0lBQUUsS0FBSztJQUFPLFlBQVk7TUFBRSxHQUFHLFVBQVU7TUFBRSxPQUFPO1FBQUM7UUFBTSxXQUFXLEtBQUs7T0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLElBQUksQ0FBQztJQUFLO0VBQUUsQ0FBQyxDQUFDLEVBQXFCLEdBQUcsQ0FBQyxDQUFDO0VBQzFOLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxjQUFjLENBQUMsT0FBTyxXQUFXLFNBQVM7SUFDM0UsTUFBTSxPQUFPLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLE1BQU0sQ0FBQyxVQUFVLEdBQUcsTUFBTSxNQUFNLENBQUMsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDLFVBQVU7SUFDdkcsTUFBTSxRQUFRLGlDQUFpQyxJQUFJLENBQUM7SUFDcEQsSUFBSSxDQUFDLE9BQ0gsT0FBTztJQUNULElBQUksUUFDRixPQUFPO0lBQ1QsSUFBSSxRQUFRLENBQUM7SUFDYixJQUFLLElBQUksT0FBTyxZQUFZLEdBQUcsT0FBTyxTQUFTLE9BQVE7TUFDckQsSUFBSSxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxNQUFNLENBQUMsS0FBSyxHQUFHLE1BQU0sTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxPQUFPLE9BQU87UUFDakcsUUFBUTtRQUNSO01BQ0Y7SUFDRjtJQUNBLElBQUksUUFBUSxHQUNWLE9BQU87SUFDVCxNQUFNLEVBQUUsR0FBRyxFQUFFLGFBQWEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxPQUFPLEtBQUssQ0FBQyxFQUFFLEVBQUUsZ0JBQWdCLEtBQUssQ0FBQyxFQUFFO0lBQzFFLE1BQU0sT0FBTyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsS0FBSztJQUMvQyxLQUFLLEtBQUssR0FBRztJQUNiLEtBQUssTUFBTSxDQUFDLFdBQVcsTUFBTSxJQUFJLE9BQU8sT0FBTyxDQUFDLFlBQzlDLEtBQUssT0FBTyxDQUFDLFdBQVc7SUFDMUIsTUFBTSxNQUFNLE1BQU0sT0FBTztJQUN6QixNQUFNLE9BQU8sR0FBRztJQUNoQixNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sWUFBWSxHQUFHO0lBQzlDLE1BQU0sT0FBTyxHQUFHO0lBQ2hCLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixLQUFLLENBQUMsR0FBRyxLQUFLLEdBQUc7SUFDL0MsTUFBTSxJQUFJLEdBQUcsUUFBUTtJQUNyQixPQUFPO0VBQ1Q7QUFDRjtBQUVBLDJEQUEyRCxHQUMzRCxTQUFTLGdCQUFnQixPQUFPLEVBQUU7RUFDaEMsTUFBTSxhQUFhLENBQUM7RUFDcEIsS0FBSyxNQUFNLGFBQWEsS0FBSyxLQUFLLENBQUMsNENBQTRDLEVBQUUsQ0FBRTtJQUNqRixPQUFRO01BQ04sS0FBSyxVQUFVLFVBQVUsQ0FBQztRQUN4QixXQUFXLEtBQUssR0FBRztVQUFDLFdBQVcsS0FBSztVQUFFLFVBQVUsS0FBSyxDQUFDO1NBQUcsQ0FBQyxNQUFNLENBQUMsU0FBUyxJQUFJLENBQUM7UUFDL0U7TUFDRixLQUFLLFVBQVUsVUFBVSxDQUFDO1FBQ3hCLFdBQVcsRUFBRSxHQUFHLFVBQVUsS0FBSyxDQUFDO1FBQ2hDO01BQ0Y7UUFBUztVQUNQLE1BQU0sQ0FBQyxLQUFLLEdBQUcsTUFBTSxHQUFHLFVBQVUsS0FBSyxDQUFDO1VBQ3hDLFVBQVUsQ0FBQyxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxPQUFPLENBQUMsaUJBQWlCO1FBQzdEO0lBQ0Y7RUFDRjtFQUNBLE9BQU87QUFDVCJ9
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// Imports
|
|
2
|
+
import { full } from "markdown-it-emoji";
|
|
3
|
+
/**
|
|
4
|
+
* Add support for emojis.
|
|
5
|
+
*
|
|
6
|
+
* ```md
|
|
7
|
+
* :bento:
|
|
8
|
+
* ```
|
|
9
|
+
* ```html
|
|
10
|
+
* <p>🍱</p>
|
|
11
|
+
* ```
|
|
12
|
+
*/ export default function emojis(engine) {
|
|
13
|
+
engine.use(full);
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9saWJzL2xpYnMvQGxpYnMvbWFya2Rvd24vcGx1Z2lucy9lbW9qaXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xuaW1wb3J0IHR5cGUgeyBNYXJrZG93bkl0IH0gZnJvbSBcIi4uL3R5cGVzLmpzXCJcbmltcG9ydCB7IGZ1bGwgfSBmcm9tIFwibWFya2Rvd24taXQtZW1vamlcIlxuXG4vKipcbiAqIEFkZCBzdXBwb3J0IGZvciBlbW9qaXMuXG4gKlxuICogYGBgbWRcbiAqIDpiZW50bzpcbiAqIGBgYFxuICogYGBgaHRtbFxuICogPHA+8J+NsTwvcD5cbiAqIGBgYFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBlbW9qaXMoZW5naW5lOiBNYXJrZG93bkl0KTogdm9pZCB7XG4gIGVuZ2luZS51c2UoZnVsbClcbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVO0FBRVYsU0FBUyxJQUFJLFFBQVEsb0JBQW1CO0FBRXhDOzs7Ozs7Ozs7Q0FTQyxHQUNELGVBQWUsU0FBUyxPQUFPLE1BQWtCO0VBQy9DLE9BQU8sR0FBRyxDQUFDO0FBQ2IifQ==
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { MarkdownIt } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Support for frontmatter.
|
|
4
|
+
*
|
|
5
|
+
* Passing `metadata: true` to the markdown rendering method is required to retrieve the frontmatter.
|
|
6
|
+
* The frontmatter is automatically parsed as YAML.
|
|
7
|
+
*
|
|
8
|
+
* ```md
|
|
9
|
+
* ---
|
|
10
|
+
* title: foo
|
|
11
|
+
* ---
|
|
12
|
+
* ```
|
|
13
|
+
* ```ts
|
|
14
|
+
* import { Renderer } from "../renderer.ts"
|
|
15
|
+
*
|
|
16
|
+
* const markdown = new Renderer({ frontmatter: true })
|
|
17
|
+
* const { metadata } = markdown.render("---\ntitle: foo\n---\nbar", { metadata: true })
|
|
18
|
+
* console.log(metadata.frontmatter) // { title: "foo" }
|
|
19
|
+
* ```
|
|
20
|
+
*/ export default function frontmatter(engine: MarkdownIt): void;
|