@lowlighter/markdown 2.0.0 → 3.0.1

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.
Files changed (94) hide show
  1. package/README.md +31 -33
  2. package/mod.d.ts +34 -0
  3. package/mod.js +22 -0
  4. package/package.json +117 -40
  5. package/plugins/anchors.d.ts +11 -0
  6. package/plugins/anchors.js +39 -0
  7. package/plugins/callouts.d.ts +14 -0
  8. package/plugins/callouts.js +31 -0
  9. package/plugins/directives.d.ts +24 -0
  10. package/plugins/directives.js +76 -0
  11. package/plugins/emojis.d.ts +11 -0
  12. package/plugins/emojis.js +15 -0
  13. package/plugins/frontmatter.d.ts +20 -0
  14. package/plugins/frontmatter.js +49 -0
  15. package/plugins/gfm.d.ts +18 -0
  16. package/plugins/gfm.js +43 -0
  17. package/plugins/{highlighting.ts → highlighting.d.ts} +2 -11
  18. package/plugins/highlighting.js +24 -0
  19. package/plugins/markers.d.ts +15 -0
  20. package/plugins/markers.js +30 -0
  21. package/plugins/math.d.ts +21 -0
  22. package/plugins/math.js +75 -0
  23. package/plugins/mermaid.d.ts +25 -0
  24. package/plugins/mermaid.js +32 -0
  25. package/plugins/mod.d.ts +15 -0
  26. package/plugins/mod.js +14 -0
  27. package/plugins/{ruby.ts → ruby.d.ts} +2 -11
  28. package/plugins/ruby.js +28 -0
  29. package/plugins/uncomments.d.ts +13 -0
  30. package/plugins/uncomments.js +28 -0
  31. package/plugins/wikilinks.d.ts +26 -0
  32. package/plugins/wikilinks.js +45 -0
  33. package/presets/default.d.ts +3 -0
  34. package/presets/default.js +9 -0
  35. package/presets/svg.d.ts +3 -0
  36. package/presets/svg.js +11 -0
  37. package/presets/text.d.ts +3 -0
  38. package/presets/text.js +11 -0
  39. package/presets/web.d.ts +3 -0
  40. package/presets/web.js +12 -0
  41. package/renderer.d.ts +62 -0
  42. package/renderer.js +70 -0
  43. package/types.d.ts +85 -0
  44. package/types.js +10 -0
  45. package/deno.jsonc +0 -124
  46. package/deno.lock +0 -2282
  47. package/mod.mjs +0 -1
  48. package/mod.ts +0 -2
  49. package/mod_test.ts +0 -1
  50. package/plugins/anchors.mjs +0 -1
  51. package/plugins/anchors.ts +0 -21
  52. package/plugins/anchors_test.ts +0 -8
  53. package/plugins/directives.mjs +0 -1
  54. package/plugins/directives.ts +0 -112
  55. package/plugins/directives_test.ts +0 -13
  56. package/plugins/emojis.mjs +0 -1
  57. package/plugins/emojis.ts +0 -20
  58. package/plugins/emojis_test.ts +0 -8
  59. package/plugins/frontmatter.mjs +0 -1
  60. package/plugins/frontmatter.ts +0 -43
  61. package/plugins/frontmatter_test.ts +0 -18
  62. package/plugins/gfm.mjs +0 -1
  63. package/plugins/gfm.ts +0 -14
  64. package/plugins/gfm_test.ts +0 -28
  65. package/plugins/highlighting.mjs +0 -1
  66. package/plugins/highlighting_test.ts +0 -8
  67. package/plugins/linebreaks.mjs +0 -1
  68. package/plugins/linebreaks.ts +0 -21
  69. package/plugins/linebreaks_test.ts +0 -8
  70. package/plugins/markers.mjs +0 -1
  71. package/plugins/markers.ts +0 -25
  72. package/plugins/markers_test.ts +0 -13
  73. package/plugins/math.mjs +0 -1
  74. package/plugins/math.ts +0 -25
  75. package/plugins/math_test.ts +0 -8
  76. package/plugins/mermaid.mjs +0 -1
  77. package/plugins/mermaid.ts +0 -41
  78. package/plugins/mermaid_test.ts +0 -8
  79. package/plugins/mod.mjs +0 -1
  80. package/plugins/mod.ts +0 -14
  81. package/plugins/ruby.mjs +0 -1
  82. package/plugins/ruby_test.ts +0 -8
  83. package/plugins/sanitize.mjs +0 -1
  84. package/plugins/sanitize.ts +0 -26
  85. package/plugins/sanitize_test.ts +0 -15
  86. package/plugins/uncomments.mjs +0 -1
  87. package/plugins/uncomments.ts +0 -20
  88. package/plugins/uncomments_test.ts +0 -8
  89. package/plugins/wikilinks.mjs +0 -1
  90. package/plugins/wikilinks.ts +0 -40
  91. package/plugins/wikilinks_test.ts +0 -14
  92. package/renderer.mjs +0 -1
  93. package/renderer.ts +0 -138
  94. package/renderer_test.ts +0 -19
package/README.md CHANGED
@@ -11,60 +11,58 @@
11
11
  ### Rendering markdown
12
12
 
13
13
  ```ts
14
- // Render markdown using the default renderer
15
- import { Renderer } from "./renderer.ts"
16
- await Renderer.render("# Hello, world!")
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
- // Render markdown using a custom renderer
19
- import { gfm, highlighting, markers, math, sanitize, wikilinks } from "./plugins/mod.ts"
20
- const renderer = new Renderer({ plugins: [gfm, highlighting, math, markers, wikilinks, sanitize] })
21
- await renderer.render("# Hello, world!")
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) // "<p>bar</p>" { title: "foo" }
22
28
  ```
23
29
 
24
- ### Creating a custom renderer with different plugins sources
30
+ ### Reusing a renderer and hooking custom rules
25
31
 
26
32
  ```ts
27
33
  import { Renderer } from "./renderer.ts"
28
- import frontmatter from "./plugins/frontmatter.ts"
29
-
30
- const renderer = await Renderer.with({
31
- plugins: [
32
- // You can specify an existing Plugin object...
33
- frontmatter,
34
- // ...or a a HTTPS import that points towards a compatible Plugin object!
35
- // Warning: this is not possible if you are using the JSR package version
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
- await renderer.render("# foo")
43
+ renderer.render("# Hello, world!")
41
44
  ```
42
45
 
43
46
  ## ✨ Features
44
47
 
45
- - Render markdown to HTML using the [unified ecosystem](https://unifiedjs.com).
46
- - Straightforward API for both basic markdown and extended markdown rendering
47
- - Support out-of-the-box dozen of plugins to add extended markdown features
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
- - etc.
63
- - Plugins can be imported:
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 rely on the awesome [unified ecosystem](https://unifiedjs.com).
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,34 @@
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
+ };
8
+ /**
9
+ * Render markdown content into an HTML string.
10
+ *
11
+ * Raw HTML is escaped unless the `html` option is enabled, which makes the default output safe against HTML injection.
12
+ *
13
+ * ```ts
14
+ * import { markdown } from "./mod.ts"
15
+ * markdown("# Hello, world!")
16
+ * markdown("$\\pi$ is ==irrational==", { math: true, markers: true })
17
+ * ```
18
+ */ export declare function markdown(content: string, options?: MarkdownOptions & {
19
+ metadata?: false;
20
+ }): string;
21
+ /**
22
+ * Render markdown content into an HTML string with parsed metadata.
23
+ *
24
+ * ```ts
25
+ * import { markdown } from "./mod.ts"
26
+ * const { value, metadata } = markdown("---\ntitle: foo\n---\nbar", { frontmatter: true, metadata: true })
27
+ * console.log(metadata.frontmatter) // { title: "foo" }
28
+ * ```
29
+ */ export declare function markdown(content: string, options: MarkdownOptions & {
30
+ metadata: true;
31
+ }): {
32
+ value: string;
33
+ metadata: Record<PropertyKey, unknown>;
34
+ };
package/mod.js ADDED
@@ -0,0 +1,22 @@
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, ...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
+ });
21
+ }
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9saWJzL2xpYnMvQGxpYnMvbWFya2Rvd24vbW9kLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCB7IFJlbmRlcmVyLCB0eXBlIFJlbmRlcmVyT3B0aW9ucyB9IGZyb20gXCIuL3JlbmRlcmVyLmpzXCJcbmV4cG9ydCB7IFJlbmRlcmVyIH1cbmV4cG9ydCB0eXBlICogZnJvbSBcIi4vcmVuZGVyZXIuanNcIlxuZXhwb3J0IHR5cGUgKiBmcm9tIFwiLi90eXBlcy5qc1wiXG5cbi8qKiBDYWNoZWQgcmVuZGVyZXIgaW5zdGFuY2VzLiAqL1xuY29uc3QgY2FjaGUgPSBuZXcgTWFwPHN0cmluZywgUmVuZGVyZXI+KClcblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayBtYXJrZG93bn0uICovXG5leHBvcnQgdHlwZSBNYXJrZG93bk9wdGlvbnMgPSBSZW5kZXJlck9wdGlvbnMgJiB7XG4gIC8qKiBSZXR1cm4gcGFyc2VkIG1ldGFkYXRhIChlLmcuIGZyb250bWF0dGVyKSBhbG9uZyB3aXRoIHRoZSByZW5kZXJlZCB2YWx1ZS4gKi9cbiAgbWV0YWRhdGE/OiBib29sZWFuXG59XG5cbi8qKlxuICogUmVuZGVyIG1hcmtkb3duIGNvbnRlbnQgaW50byBhbiBIVE1MIHN0cmluZy5cbiAqXG4gKiBSYXcgSFRNTCBpcyBlc2NhcGVkIHVubGVzcyB0aGUgYGh0bWxgIG9wdGlvbiBpcyBlbmFibGVkLCB3aGljaCBtYWtlcyB0aGUgZGVmYXVsdCBvdXRwdXQgc2FmZSBhZ2FpbnN0IEhUTUwgaW5qZWN0aW9uLlxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBtYXJrZG93biB9IGZyb20gXCIuL21vZC50c1wiXG4gKiBtYXJrZG93bihcIiMgSGVsbG8sIHdvcmxkIVwiKVxuICogbWFya2Rvd24oXCIkXFxcXHBpJCBpcyA9PWlycmF0aW9uYWw9PVwiLCB7IG1hdGg6IHRydWUsIG1hcmtlcnM6IHRydWUgfSlcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFya2Rvd24oY29udGVudDogc3RyaW5nLCBvcHRpb25zPzogTWFya2Rvd25PcHRpb25zICYgeyBtZXRhZGF0YT86IGZhbHNlIH0pOiBzdHJpbmdcbi8qKlxuICogUmVuZGVyIG1hcmtkb3duIGNvbnRlbnQgaW50byBhbiBIVE1MIHN0cmluZyB3aXRoIHBhcnNlZCBtZXRhZGF0YS5cbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgbWFya2Rvd24gfSBmcm9tIFwiLi9tb2QudHNcIlxuICogY29uc3QgeyB2YWx1ZSwgbWV0YWRhdGEgfSA9IG1hcmtkb3duKFwiLS0tXFxudGl0bGU6IGZvb1xcbi0tLVxcbmJhclwiLCB7IGZyb250bWF0dGVyOiB0cnVlLCBtZXRhZGF0YTogdHJ1ZSB9KVxuICogY29uc29sZS5sb2cobWV0YWRhdGEuZnJvbnRtYXR0ZXIpIC8vIHsgdGl0bGU6IFwiZm9vXCIgfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXJrZG93bihjb250ZW50OiBzdHJpbmcsIG9wdGlvbnM6IE1hcmtkb3duT3B0aW9ucyAmIHsgbWV0YWRhdGE6IHRydWUgfSk6IHsgdmFsdWU6IHN0cmluZzsgbWV0YWRhdGE6IFJlY29yZDxQcm9wZXJ0eUtleSwgdW5rbm93bj4gfVxuLyoqXG4gKiBSZW5kZXIgbWFya2Rvd24gY29udGVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcmtkb3duKGNvbnRlbnQ6IHN0cmluZywgb3B0aW9ucyA9IHt9IGFzIE1hcmtkb3duT3B0aW9ucyk6IHN0cmluZyB8IHsgdmFsdWU6IHN0cmluZzsgbWV0YWRhdGE6IFJlY29yZDxQcm9wZXJ0eUtleSwgdW5rbm93bj4gfSB7XG4gIGNvbnN0IHsgbWV0YWRhdGEgPSBmYWxzZSwgLi4ucmVzdCB9ID0gb3B0aW9uc1xuICBsZXQgcmVuZGVyZXIgPSBuZXcgUmVuZGVyZXIocmVzdClcbiAgaWYgKE9iamVjdC52YWx1ZXMocmVzdCkuZXZlcnkoKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiKSkge1xuICAgIGNvbnN0IGtleSA9IEpTT04uc3RyaW5naWZ5KHJlc3QsIE9iamVjdC5rZXlzKHJlc3QpLnNvcnQoKSlcbiAgICBpZiAoIWNhY2hlLmhhcyhrZXkpKSB7XG4gICAgICBpZiAoY2FjaGUuc2l6ZSA+IDY0KVxuICAgICAgICBjYWNoZS5jbGVhcigpXG4gICAgICBjYWNoZS5zZXQoa2V5LCByZW5kZXJlcilcbiAgICB9XG4gICAgcmVuZGVyZXIgPSBjYWNoZS5nZXQoa2V5KSFcbiAgfVxuICByZXR1cm4gcmVuZGVyZXIucmVuZGVyKGNvbnRlbnQsIHsgbWV0YWRhdGE6IG1ldGFkYXRhIGFzIHRydWUgfSlcbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVO0FBQ1YsU0FBUyxRQUFRLFFBQThCLGdCQUFlO0FBQzlELFNBQVMsUUFBUSxHQUFFO0FBSW5CLCtCQUErQixHQUMvQixNQUFNLFFBQVEsSUFBSTtBQThCbEI7O0NBRUMsR0FDRCxPQUFPLFNBQVMsU0FBUyxPQUFlLEVBQUUsVUFBVSxDQUFDLENBQW9CO0VBQ3ZFLE1BQU0sRUFBRSxXQUFXLEtBQUssRUFBRSxHQUFHLE1BQU0sR0FBRztFQUN0QyxJQUFJLFdBQVcsSUFBSSxTQUFTO0VBQzVCLElBQUksT0FBTyxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxRQUFVLE9BQU8sVUFBVSxZQUFZO0lBQ3BFLE1BQU0sTUFBTSxLQUFLLFNBQVMsQ0FBQyxNQUFNLE9BQU8sSUFBSSxDQUFDLE1BQU0sSUFBSTtJQUN2RCxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsTUFBTTtNQUNuQixJQUFJLE1BQU0sSUFBSSxHQUFHLElBQ2YsTUFBTSxLQUFLO01BQ2IsTUFBTSxHQUFHLENBQUMsS0FBSztJQUNqQjtJQUNBLFdBQVcsTUFBTSxHQUFHLENBQUM7RUFDdkI7RUFDQSxPQUFPLFNBQVMsTUFBTSxDQUFDLFNBQVM7SUFBRSxVQUFVO0VBQWlCO0FBQy9EIn0=
package/package.json CHANGED
@@ -1,45 +1,122 @@
1
1
  {
2
2
  "name": "@lowlighter/markdown",
3
- "version": "2.0.0",
3
+ "version": "3.0.1",
4
4
  "type": "module",
5
- "scripts": {},
6
- "dependencies": {},
7
- "devDependencies": {},
8
- "description": "Markdown renderer with optional plugins based on the unified ecosystem.",
9
- "keywords": [
10
- "markdown",
11
- "plugins",
12
- "gfm",
13
- "github-flavored-markdown",
14
- "unified",
15
- "remark",
16
- "rehype"
17
- ],
18
- "license": "MIT",
19
- "author": "lowlighter (Simon Lecoq)",
20
- "homepage": "https://github.com/lowlighter/libs",
21
- "repository": {
22
- "type": "git",
23
- "url": "git+https://github.com/lowlighter/libs.git"
24
- },
25
- "funding": "https://github.com/sponsors/lowlighter",
5
+ "main": "./mod.js",
6
+ "types": "./mod.d.ts",
26
7
  "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"
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"
44
121
  }
45
- }
122
+ }
@@ -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,11 @@
1
+ import type { MarkdownIt } from "../types.js";
2
+ /**
3
+ * Add support for emojis.
4
+ *
5
+ * ```md
6
+ * :bento:
7
+ * ```
8
+ * ```html
9
+ * <p>🍱</p>
10
+ * ```
11
+ */ export default function emojis(engine: MarkdownIt): void;
@@ -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;