@livemark/markdown 0.0.0-stage → 0.45.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/LICENSE.md +9 -0
- package/README.md +5 -2
- package/build/actions/markdown/compile.d.ts +27 -0
- package/build/actions/markdown/compile.js +48 -0
- package/build/actions/processor/create.d.ts +17 -0
- package/build/actions/processor/create.js +212 -0
- package/build/components/Abbr.d.ts +5 -0
- package/build/components/Abbr.js +7 -0
- package/build/components/AnsiCode.d.ts +4 -0
- package/build/components/AnsiCode.js +7 -0
- package/build/components/Audio.d.ts +4 -0
- package/build/components/Audio.js +9 -0
- package/build/components/Badge.d.ts +5 -0
- package/build/components/Badge.js +7 -0
- package/build/components/Button.d.ts +7 -0
- package/build/components/Button.js +11 -0
- package/build/components/Callout.d.ts +8 -0
- package/build/components/Callout.js +41 -0
- package/build/components/Card.d.ts +7 -0
- package/build/components/Card.js +16 -0
- package/build/components/Cards.d.ts +4 -0
- package/build/components/Cards.js +6 -0
- package/build/components/CodeBlock.d.ts +1 -0
- package/build/components/CodeBlock.js +50 -0
- package/build/components/CodeTabs.d.ts +6 -0
- package/build/components/CodeTabs.js +48 -0
- package/build/components/Column.d.ts +4 -0
- package/build/components/Column.js +6 -0
- package/build/components/Columns.d.ts +5 -0
- package/build/components/Columns.js +8 -0
- package/build/components/DefinitionList.d.ts +7 -0
- package/build/components/DefinitionList.js +14 -0
- package/build/components/Details.d.ts +5 -0
- package/build/components/Details.js +10 -0
- package/build/components/Filetree.d.ts +4 -0
- package/build/components/Filetree.js +22 -0
- package/build/components/FootnoteRef.d.ts +4 -0
- package/build/components/FootnoteRef.js +33 -0
- package/build/components/Heading.d.ts +8 -0
- package/build/components/Heading.js +18 -0
- package/build/components/Icon.d.ts +5 -0
- package/build/components/Icon.js +10 -0
- package/build/components/Markdown.d.ts +13 -0
- package/build/components/Markdown.js +75 -0
- package/build/components/Mermaid.d.ts +4 -0
- package/build/components/Mermaid.js +10 -0
- package/build/components/MermaidRenderer.d.ts +4 -0
- package/build/components/MermaidRenderer.js +44 -0
- package/build/components/PackageTabs.d.ts +9 -0
- package/build/components/PackageTabs.js +26 -0
- package/build/components/SortableTable.d.ts +5 -0
- package/build/components/SortableTable.js +63 -0
- package/build/components/Tab.d.ts +5 -0
- package/build/components/Tab.js +6 -0
- package/build/components/Tabs.d.ts +5 -0
- package/build/components/Tabs.js +46 -0
- package/build/components/Toc.d.ts +4 -0
- package/build/components/Toc.js +14 -0
- package/build/components/Video.d.ts +4 -0
- package/build/components/Video.js +13 -0
- package/build/components/ZoomImage.d.ts +4 -0
- package/build/components/ZoomImage.js +26 -0
- package/build/elements/badge.d.ts +7 -0
- package/build/elements/badge.js +36 -0
- package/build/elements/button.d.ts +8 -0
- package/build/elements/button.js +37 -0
- package/build/elements/card.d.ts +11 -0
- package/build/elements/card.js +25 -0
- package/build/elements/collapsible.d.ts +5 -0
- package/build/elements/collapsible.js +13 -0
- package/build/elements/hover-card.d.ts +5 -0
- package/build/elements/hover-card.js +14 -0
- package/build/elements/separator.d.ts +3 -0
- package/build/elements/separator.js +8 -0
- package/build/elements/table.d.ts +9 -0
- package/build/elements/table.js +28 -0
- package/build/elements/tooltip.d.ts +6 -0
- package/build/elements/tooltip.js +17 -0
- package/build/helpers/ansi.d.ts +3 -0
- package/build/helpers/ansi.js +208 -0
- package/build/helpers/article-link.d.ts +7 -0
- package/build/helpers/article-link.js +8 -0
- package/build/helpers/code-icon.d.ts +2 -0
- package/build/helpers/code-icon.js +57 -0
- package/build/helpers/content-warnings.d.ts +8 -0
- package/build/helpers/content-warnings.js +47 -0
- package/build/helpers/dynamic-icon-resolver.d.ts +5 -0
- package/build/helpers/dynamic-icon-resolver.js +11 -0
- package/build/helpers/dynamic-icon.d.ts +5 -0
- package/build/helpers/dynamic-icon.js +14 -0
- package/build/helpers/frontmatter.d.ts +5 -0
- package/build/helpers/frontmatter.js +16 -0
- package/build/helpers/icon-names.d.ts +11 -0
- package/build/helpers/icon-names.js +35 -0
- package/build/helpers/message-format.d.ts +2 -0
- package/build/helpers/message-format.js +7 -0
- package/build/helpers/node-text.d.ts +9 -0
- package/build/helpers/node-text.js +9 -0
- package/build/helpers/site-messages.d.ts +86 -0
- package/build/helpers/site-messages.js +7 -0
- package/build/helpers/toc-context.d.ts +5 -0
- package/build/helpers/toc-context.js +8 -0
- package/build/helpers/toc-outline.d.ts +3 -0
- package/build/helpers/toc-outline.js +16 -0
- package/build/helpers/youtube-id.d.ts +2 -0
- package/build/helpers/youtube-id.js +25 -0
- package/build/hooks/icons.d.ts +13 -0
- package/build/hooks/icons.js +12 -0
- package/build/hooks/messages.d.ts +95 -0
- package/build/hooks/messages.js +17 -0
- package/build/models/message.d.ts +177 -0
- package/build/models/message.js +88 -0
- package/build/models/plugins.d.ts +10 -0
- package/build/models/plugins.js +6 -0
- package/build/models/theme.d.ts +76 -0
- package/build/models/theme.js +71 -0
- package/build/models/toc.d.ts +5 -0
- package/build/models/toc.js +2 -0
- package/build/plugins/twoslash.d.ts +13 -0
- package/build/plugins/twoslash.js +146 -0
- package/package.json +63 -3
- package/source/actions/markdown/compile.ts +82 -0
- package/source/actions/processor/create.ts +235 -0
- package/source/components/Abbr.tsx +13 -0
- package/source/components/AnsiCode.tsx +17 -0
- package/source/components/Audio.tsx +18 -0
- package/source/components/Badge.tsx +9 -0
- package/source/components/Button.tsx +33 -0
- package/source/components/Callout.tsx +68 -0
- package/source/components/Card.tsx +48 -0
- package/source/components/Cards.tsx +8 -0
- package/source/components/CodeBlock.tsx +144 -0
- package/source/components/CodeTabs.tsx +81 -0
- package/source/components/Column.tsx +4 -0
- package/source/components/Columns.tsx +10 -0
- package/source/components/DefinitionList.tsx +18 -0
- package/source/components/Details.tsx +30 -0
- package/source/components/Filetree.tsx +63 -0
- package/source/components/FootnoteRef.tsx +52 -0
- package/source/components/Heading.tsx +20 -0
- package/source/components/Icon.tsx +10 -0
- package/source/components/Markdown.tsx +89 -0
- package/source/components/Mermaid.tsx +20 -0
- package/source/components/MermaidRenderer.tsx +48 -0
- package/source/components/PackageTabs.tsx +72 -0
- package/source/components/SortableTable.tsx +81 -0
- package/source/components/Tab.tsx +4 -0
- package/source/components/Tabs.tsx +75 -0
- package/source/components/Toc.tsx +30 -0
- package/source/components/Video.tsx +28 -0
- package/source/components/ZoomImage.tsx +25 -0
- package/source/elements/badge.tsx +53 -0
- package/source/elements/button.tsx +61 -0
- package/source/elements/card.tsx +102 -0
- package/source/elements/collapsible.tsx +15 -0
- package/source/elements/hover-card.tsx +47 -0
- package/source/elements/separator.tsx +22 -0
- package/source/elements/table.tsx +103 -0
- package/source/elements/tooltip.tsx +60 -0
- package/source/helpers/ansi.ts +210 -0
- package/source/helpers/article-link.ts +11 -0
- package/source/helpers/code-icon.ts +59 -0
- package/source/helpers/content-warnings.ts +56 -0
- package/source/helpers/dynamic-icon-resolver.tsx +9 -0
- package/source/helpers/dynamic-icon.tsx +19 -0
- package/source/helpers/frontmatter.ts +16 -0
- package/source/helpers/icon-names.ts +37 -0
- package/source/helpers/message-format.ts +5 -0
- package/source/helpers/node-text.ts +14 -0
- package/source/helpers/site-messages.ts +8 -0
- package/source/helpers/toc-context.ts +10 -0
- package/source/helpers/toc-outline.ts +23 -0
- package/source/helpers/youtube-id.ts +23 -0
- package/source/hooks/icons.ts +18 -0
- package/source/hooks/messages.ts +28 -0
- package/source/models/message.ts +96 -0
- package/source/models/plugins.ts +11 -0
- package/source/models/theme.ts +78 -0
- package/source/models/toc.ts +5 -0
- package/source/plugins/twoslash.ts +163 -0
- package/source/standalone.css +7 -0
- package/source/styles/general.css +214 -0
- package/source/styles/markdown.css +231 -0
- package/source/styles/shape.css +14 -0
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const Messages = z.strictObject({
|
|
3
|
+
"nav.docs": z.string().default("Docs"),
|
|
4
|
+
"nav.more": z.string().default("More"),
|
|
5
|
+
"nav.navigation": z.string().default("Navigation"),
|
|
6
|
+
"nav.chooseSection": z.string().default("Choose section"),
|
|
7
|
+
"nav.section": z.string().default("Section"),
|
|
8
|
+
"nav.toggleSubmenu": z.string().default("Toggle {title} submenu"),
|
|
9
|
+
"nav.previous": z.string().default("Previous"),
|
|
10
|
+
"nav.next": z.string().default("Next"),
|
|
11
|
+
"nav.backToTop": z.string().default("Back to top"),
|
|
12
|
+
"nav.close": z.string().default("Close"),
|
|
13
|
+
"nav.sections": z.string().default("Sections"),
|
|
14
|
+
"nav.articles": z.string().default("Articles"),
|
|
15
|
+
"nav.links": z.string().default("Links"),
|
|
16
|
+
"nav.releases": z.string().default("Releases"),
|
|
17
|
+
"nav.posts": z.string().default("Posts"),
|
|
18
|
+
"nav.tags": z.string().default("Tags"),
|
|
19
|
+
"nav.breadcrumbs": z.string().default("Breadcrumbs"),
|
|
20
|
+
"language.choose": z.string().default("Choose language"),
|
|
21
|
+
"language.untranslated": z.string().default("Not translated yet"),
|
|
22
|
+
"theme.change": z.string().default("Change theme"),
|
|
23
|
+
"theme.light": z.string().default("Light"),
|
|
24
|
+
"theme.dark": z.string().default("Dark"),
|
|
25
|
+
"theme.system": z.string().default("System"),
|
|
26
|
+
"shortcuts.title": z.string().default("Keyboard shortcuts"),
|
|
27
|
+
"shortcuts.search": z.string().default("Search"),
|
|
28
|
+
"shortcuts.theme": z.string().default("Toggle theme"),
|
|
29
|
+
"shortcuts.sidebar": z.string().default("Toggle sidebar"),
|
|
30
|
+
"shortcuts.scrollDown": z.string().default("Scroll down"),
|
|
31
|
+
"shortcuts.scrollUp": z.string().default("Scroll up"),
|
|
32
|
+
"shortcuts.top": z.string().default("Back to top"),
|
|
33
|
+
"shortcuts.bottom": z.string().default("Go to bottom"),
|
|
34
|
+
"shortcuts.next": z.string().default("Next page"),
|
|
35
|
+
"shortcuts.previous": z.string().default("Previous page"),
|
|
36
|
+
"search.label": z.string().default("Search"),
|
|
37
|
+
"search.description": z.string().default("Search documentation"),
|
|
38
|
+
"search.placeholder": z.string().default("Search docs..."),
|
|
39
|
+
"search.empty": z.string().default("No results found."),
|
|
40
|
+
"search.hint": z.string().default("Type to search across all contents."),
|
|
41
|
+
"search.close": z.string().default("Close search"),
|
|
42
|
+
"search.pages": z.string().default("Pages"),
|
|
43
|
+
"search.button": z.string().default("Search..."),
|
|
44
|
+
"search.navigate": z.string().default("navigate"),
|
|
45
|
+
"search.select": z.string().default("select"),
|
|
46
|
+
"search.dismiss": z.string().default("close"),
|
|
47
|
+
"toc.title": z.string().default("On this page"),
|
|
48
|
+
"toc.contents": z.string().default("Contents"),
|
|
49
|
+
"toc.actions": z.string().default("Actions"),
|
|
50
|
+
"toc.inline": z.string().default("Table of Contents"),
|
|
51
|
+
"page.updated": z.string().default("Updated {date}"),
|
|
52
|
+
"page.published": z.string().default("Published {date}"),
|
|
53
|
+
"page.edit": z.string().default("Edit on GitHub"),
|
|
54
|
+
"page.view": z.string().default("View on GitHub"),
|
|
55
|
+
"page.copyMarkdown": z.string().default("Copy Markdown"),
|
|
56
|
+
"page.openChatGpt": z.string().default("Open in ChatGPT"),
|
|
57
|
+
"page.openClaude": z.string().default("Open in Claude"),
|
|
58
|
+
"page.llmPrompt": z.string().default("Read {url}, I want to ask questions about it."),
|
|
59
|
+
"code.copy": z.string().default("Copy code"),
|
|
60
|
+
"code.copied": z.string().default("Copied!"),
|
|
61
|
+
"code.wrapOn": z.string().default("Enable wrap"),
|
|
62
|
+
"code.wrapOff": z.string().default("Disable wrap"),
|
|
63
|
+
"code.expand": z.string().default("Expand"),
|
|
64
|
+
"callout.note": z.string().default("Note"),
|
|
65
|
+
"callout.info": z.string().default("Info"),
|
|
66
|
+
"callout.tip": z.string().default("Tip"),
|
|
67
|
+
"callout.warning": z.string().default("Warning"),
|
|
68
|
+
"callout.danger": z.string().default("Danger"),
|
|
69
|
+
"blog.title": z.string().default("Blog"),
|
|
70
|
+
"blog.allPosts": z.string().default("All Posts"),
|
|
71
|
+
"blog.recentPosts": z.string().default("Recent Posts"),
|
|
72
|
+
"blog.rssFeed": z.string().default("RSS Feed"),
|
|
73
|
+
"blog.tagged": z.string().default("Posts tagged '{tag}'"),
|
|
74
|
+
"changelog.title": z.string().default("Changelog"),
|
|
75
|
+
"changelog.allReleases": z.string().default("All Releases"),
|
|
76
|
+
"changelog.recentReleases": z.string().default("Recent Releases"),
|
|
77
|
+
"error.notFound": z.string().default("The page you're looking for doesn't exist."),
|
|
78
|
+
"error.goBack": z.string().default("Go Back"),
|
|
79
|
+
"error.tryAgain": z.string().default("Try Again"),
|
|
80
|
+
"error.home": z.string().default("Home"),
|
|
81
|
+
"media.loadingDiagram": z.string().default("Loading diagram…"),
|
|
82
|
+
"media.youtube": z.string().default("YouTube video"),
|
|
83
|
+
"media.soundcloud": z.string().default("SoundCloud audio"),
|
|
84
|
+
"footnote.missing": z.string().default("Footnote not found"),
|
|
85
|
+
"footer.createdWith": z.string().default("Created with {heart} and {livemark}"),
|
|
86
|
+
});
|
|
87
|
+
export const MessageOverrides = z.partialRecord(Messages.keyof(), z.string());
|
|
88
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS9tb2RlbHMvbWVzc2FnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFBO0FBSXZCLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUMsWUFBWSxDQUFDO0lBQ3JDLFVBQVUsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztJQUN0QyxVQUFVLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7SUFDdEMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUM7SUFDbEQsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQztJQUN6RCxhQUFhLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7SUFDNUMsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQztJQUNqRSxjQUFjLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7SUFDOUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO0lBQ3RDLGVBQWUsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQztJQUNsRCxXQUFXLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7SUFDeEMsY0FBYyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO0lBQzlDLGNBQWMs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QUFDLENBQUE7QUFPRixNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHogfSBmcm9tIFwiem9kXCJcblxuLyoqIFVJIHN0cmluZ3M7IGVhY2ggZGVmYXVsdCBpcyB0aGUgRW5nbGlzaCB0ZXh0LCBzbyBgTWVzc2FnZXMucGFyc2Uoe30pYCBpcyBFbmdsaXNoLiAqL1xuZXhwb3J0IHR5cGUgTWVzc2FnZXMgPSB6LmluZmVyPHR5cGVvZiBNZXNzYWdlcz5cbmV4cG9ydCBjb25zdCBNZXNzYWdlcyA9IHouc3RyaWN0T2JqZWN0KHtcbiAgXCJuYXYuZG9jc1wiOiB6LnN0cmluZygpLmRlZmF1bHQoXCJEb2NzXCIpLFxuICBcIm5hdi5tb3JlXCI6IHouc3RyaW5nKCkuZGVmYXVsdChcIk1vcmVcIiksXG4gIFwibmF2Lm5hdmlnYXRpb25cIjogei5zdHJpbmcoKS5kZWZhdWx0KFwiTmF2aWdhdGlvblwiKSxcbiAgXCJuYXYuY2hvb3NlU2VjdGlvblwiOiB6LnN0cmluZygpLmRlZmF1bHQoXCJDaG9vc2Ugc2VjdGlvblwiKSxcbiAgXCJuYXYuc2VjdGlvblwiOiB6LnN0cmluZygpLmRlZmF1bHQoXCJTZWN0aW9uXCIpLFxuICBcIm5hdi50b2dnbGVTdWJtZW51XCI6IHouc3RyaW5nKCkuZGVmYXVsdChcIlRvZ2dsZSB7dGl0bGV9IHN1Ym1lbnVcIiksXG4gIFwibmF2LnByZXZpb3VzXCI6IHouc3RyaW5nKCkuZGVmYXVsdChcIlByZXZpb3VzXCIpLFxuICBcIm5hdi5uZXh0XCI6IHouc3RyaW5nKCkuZGVmYXVsdChcIk5leHRcIiksXG4gIFwibmF2LmJhY2tUb1RvcFwiOiB6LnN0cmluZygpLmRlZmF1bHQoXCJCYWNrIHRvIHRvcFwiKSxcbiAgXCJuYXYuY2xvc2VcIjogei5zdHJpbmcoKS5kZWZhdWx0KFwiQ2xvc2VcIiksXG4gIFwibmF2LnNlY3Rpb25zXCI6IHouc3RyaW5nKCkuZGVmYXVsdChcIlNlY3Rpb25zXCIpLFxuICBcIm5hdi5hcnRpY2xlc1wiOiB6LnN0cmluZygpLmRlZmF1bHQoXCJBcnRpY2xlc1wiKSxcbiAgXCJuYXYubGlua3NcIjogei5zdHJpbmcoKS5kZWZhdWx0KFwiTGlua3NcIiksXG4gIFwibmF2LnJlbGVhc2VzXCI6IHouc3RyaW5nKCkuZGVmYXVsdChcIlJlbGVhc2VzXCIpLFxuICBcIm5hdi5wb3N0c1wiOiB6LnN0cmluZygpLmRlZmF1bHQoXCJQb3N0c1wiKSxcbiAgXCJuYXYudGFnc1wiOiB6LnN0cmluZygpLmRlZmF1bHQoXCJUYWdzXCIpLFxuICBcIm5hdi5icmVhZGNydW1ic1wiOiB6LnN0cmluZygpLmRlZmF1bHQoXCJCcmVhZGNydW1ic1wiKSxcbiAgXCJsYW5ndWFnZS5jaG9vc2VcIjogei5zdHJpbmcoKS5kZWZhdWx0KFwiQ2hvb3NlIGxhbmd1YWdlXCIpLFxuICBcImxhbmd1YWdlLnVudHJhbnNsYXRlZFwiOiB6LnN0cmluZygpLmRlZmF1bHQoXCJOb3QgdHJhbnNsYXRlZCB5ZXRcIiksXG4gIFwidGhlbWUuY2hhbmdlXCI6IHouc3RyaW5nKCkuZGVmYXVsdChcIkNoYW5nZSB0aGVtZVwiKSxcbiAgXCJ0aGVtZS5saWdodFwiOiB6LnN0cmluZygpLmRlZmF1bHQoXCJMaWdodFwiKSxcbiAgXCJ0aGVtZS5kYXJrXCI6IHouc3RyaW5nKCkuZGVmYXVsdChcIkRhcmtcIiksXG4gIFwidGhlbWUuc3lzdGVtXCI6IHouc3RyaW5nKCkuZGVmYXVsdChcIlN5c3RlbVwiKSxcbiAgXCJzaG9ydGN1dHMudGl0bGVcIjogei5zdHJpbmcoKS5kZWZhdWx0KFwiS2V5Ym9hcmQgc2hvcnRjdXRzXCIpLFxuICBcInNob3J0Y3V0cy5zZWFyY2hcIjogei5zdHJpbmcoKS5kZWZhdWx0KFwiU2VhcmNoXCIpLFxuICBcInNob3J0Y3V0cy50aGVtZVwiOiB6LnN0cmluZygpLmRlZmF1bHQoXCJUb2dnbGUgdGhlbWVcIiksXG4gIFwic2hvcnRjdXRzLnNpZGViYXJcIjogei5zdHJpbmcoKS5kZWZhdWx0KFwiVG9nZ2xlIHNpZGViYXJcIiksXG4gIFwic2hvcnRjdXRzLnNjcm9sbERvd25cIjogei5zdHJpbmcoKS5kZWZhdWx0KFwiU2Nyb2xsIGRvd25cIiksXG4gIFwic2hvcnRjdXRzLnNjcm9sbFVwXCI6IHouc3RyaW5nKCkuZGVmYXVsdChcIlNjcm9sbCB1cFwiKSxcbiAgXCJzaG9ydGN1dHMudG9wXCI6IHouc3RyaW5nKCkuZGVmYXVsdChcIkJhY2sgdG8gdG9wXCIpLFxuICBcInNob3J0Y3V0cy5ib3R0b21cIjogei5zdHJpbmcoKS5kZWZhdWx0KFwiR28gdG8gYm90dG9tXCIpLFxuICBcInNob3J0Y3V0cy5uZXh0XCI6IHouc3RyaW5nKCkuZGVmYXVsdChcIk5leHQgcGFnZVwiKSxcbiAgXCJzaG9ydGN1dHMucHJldmlvdXNcIjogei5zdHJpbmcoKS5kZWZhdWx0KFwiUHJldmlvdXMgcGFnZVwiKSxcbiAgXCJzZWFyY2gubGFiZWxcIjogei5zdHJpbmcoKS5kZWZhdWx0KFwiU2VhcmNoXCIpLFxuICBcInNlYXJjaC5kZXNjcmlwdGlvblwiOiB6LnN0cmluZygpLmRlZmF1bHQoXCJTZWFyY2ggZG9jdW1lbnRhdGlvblwiKSxcbiAgXCJzZWFyY2gucGxhY2Vob2xkZXJcIjogei5zdHJpbmcoKS5kZWZhdWx0KFwiU2VhcmNoIGRvY3MuLi5cIiksXG4gIFwic2VhcmNoLmVtcHR5XCI6IHouc3RyaW5nKCkuZGVmYXVsdChcIk5vIHJlc3VsdHMgZm91bmQuXCIpLFxuICBcInNlYXJjaC5oaW50XCI6IHouc3RyaW5nKCkuZGVmYXVsdChcIlR5cGUgdG8gc2VhcmNoIGFjcm9zcyBhbGwgY29udGVudHMuXCIpLFxuICBcInNlYXJjaC5jbG9zZVwiOiB6LnN0cmluZygpLmRlZmF1bHQoXCJDbG9zZSBzZWFyY2hcIiksXG4gIFwic2VhcmNoLnBhZ2VzXCI6IHouc3RyaW5nKCkuZGVmYXVsdChcIlBhZ2VzXCIpLFxuICBcInNlYXJjaC5idXR0b25cIjogei5zdHJpbmcoKS5kZWZhdWx0KFwiU2VhcmNoLi4uXCIpLFxuICBcInNlYXJjaC5uYXZpZ2F0ZVwiOiB6LnN0cmluZygpLmRlZmF1bHQoXCJuYXZpZ2F0ZVwiKSxcbiAgXCJzZWFyY2guc2VsZWN0XCI6IHouc3RyaW5nKCkuZGVmYXVsdChcInNlbGVjdFwiKSxcbiAgXCJzZWFyY2guZGlzbWlzc1wiOiB6LnN0cmluZygpLmRlZmF1bHQoXCJjbG9zZVwiKSxcbiAgXCJ0b2MudGl0bGVcIjogei5zdHJpbmcoKS5kZWZhdWx0KFwiT24gdGhpcyBwYWdlXCIpLFxuICBcInRvYy5jb250ZW50c1wiOiB6LnN0cmluZygpLmRlZmF1bHQoXCJDb250ZW50c1wiKSxcbiAgXCJ0b2MuYWN0aW9uc1wiOiB6LnN0cmluZygpLmRlZmF1bHQoXCJBY3Rpb25zXCIpLFxuICBcInRvYy5pbmxpbmVcIjogei5zdHJpbmcoKS5kZWZhdWx0KFwiVGFibGUgb2YgQ29udGVudHNcIiksXG4gIFwicGFnZS51cGRhdGVkXCI6IHouc3RyaW5nKCkuZGVmYXVsdChcIlVwZGF0ZWQge2RhdGV9XCIpLFxuICBcInBhZ2UucHVibGlzaGVkXCI6IHouc3RyaW5nKCkuZGVmYXVsdChcIlB1Ymxpc2hlZCB7ZGF0ZX1cIiksXG4gIFwicGFnZS5lZGl0XCI6IHouc3RyaW5nKCkuZGVmYXVsdChcIkVkaXQgb24gR2l0SHViXCIpLFxuICBcInBhZ2Uudmlld1wiOiB6LnN0cmluZygpLmRlZmF1bHQoXCJWaWV3IG9uIEdpdEh1YlwiKSxcbiAgXCJwYWdlLmNvcHlNYXJrZG93blwiOiB6LnN0cmluZygpLmRlZmF1bHQoXCJDb3B5IE1hcmtkb3duXCIpLFxuICBcInBhZ2Uub3BlbkNoYXRHcHRcIjogei5zdHJpbmcoKS5kZWZhdWx0KFwiT3BlbiBpbiBDaGF0R1BUXCIpLFxuICBcInBhZ2Uub3BlbkNsYXVkZVwiOiB6LnN0cmluZygpLmRlZmF1bHQoXCJPcGVuIGluIENsYXVkZVwiKSxcbiAgXCJwYWdlLmxsbVByb21wdFwiOiB6LnN0cmluZygpLmRlZmF1bHQoXCJSZWFkIHt1cmx9LCBJIHdhbnQgdG8gYXNrIHF1ZXN0aW9ucyBhYm91dCBpdC5cIiksXG4gIFwiY29kZS5jb3B5XCI6IHouc3RyaW5nKCkuZGVmYXVsdChcIkNvcHkgY29kZVwiKSxcbiAgXCJjb2RlLmNvcGllZFwiOiB6LnN0cmluZygpLmRlZmF1bHQoXCJDb3BpZWQhXCIpLFxuICBcImNvZGUud3JhcE9uXCI6IHouc3RyaW5nKCkuZGVmYXVsdChcIkVuYWJsZSB3cmFwXCIpLFxuICBcImNvZGUud3JhcE9mZlwiOiB6LnN0cmluZygpLmRlZmF1bHQoXCJEaXNhYmxlIHdyYXBcIiksXG4gIFwiY29kZS5leHBhbmRcIjogei5zdHJpbmcoKS5kZWZhdWx0KFwiRXhwYW5kXCIpLFxuICBcImNhbGxvdXQubm90ZVwiOiB6LnN0cmluZygpLmRlZmF1bHQoXCJOb3RlXCIpLFxuICBcImNhbGxvdXQuaW5mb1wiOiB6LnN0cmluZygpLmRlZmF1bHQoXCJJbmZvXCIpLFxuICBcImNhbGxvdXQudGlwXCI6IHouc3RyaW5nKCkuZGVmYXVsdChcIlRpcFwiKSxcbiAgXCJjYWxsb3V0Lndhcm5pbmdcIjogei5zdHJpbmcoKS5kZWZhdWx0KFwiV2FybmluZ1wiKSxcbiAgXCJjYWxsb3V0LmRhbmdlclwiOiB6LnN0cmluZygpLmRlZmF1bHQoXCJEYW5nZXJcIiksXG4gIFwiYmxvZy50aXRsZVwiOiB6LnN0cmluZygpLmRlZmF1bHQoXCJCbG9nXCIpLFxuICBcImJsb2cuYWxsUG9zdHNcIjogei5zdHJpbmcoKS5kZWZhdWx0KFwiQWxsIFBvc3RzXCIpLFxuICBcImJsb2cucmVjZW50UG9zdHNcIjogei5zdHJpbmcoKS5kZWZhdWx0KFwiUmVjZW50IFBvc3RzXCIpLFxuICBcImJsb2cucnNzRmVlZFwiOiB6LnN0cmluZygpLmRlZmF1bHQoXCJSU1MgRmVlZFwiKSxcbiAgXCJibG9nLnRhZ2dlZFwiOiB6LnN0cmluZygpLmRlZmF1bHQoXCJQb3N0cyB0YWdnZWQgJ3t0YWd9J1wiKSxcbiAgXCJjaGFuZ2Vsb2cudGl0bGVcIjogei5zdHJpbmcoKS5kZWZhdWx0KFwiQ2hhbmdlbG9nXCIpLFxuICBcImNoYW5nZWxvZy5hbGxSZWxlYXNlc1wiOiB6LnN0cmluZygpLmRlZmF1bHQoXCJBbGwgUmVsZWFzZXNcIiksXG4gIFwiY2hhbmdlbG9nLnJlY2VudFJlbGVhc2VzXCI6IHouc3RyaW5nKCkuZGVmYXVsdChcIlJlY2VudCBSZWxlYXNlc1wiKSxcbiAgXCJlcnJvci5ub3RGb3VuZFwiOiB6LnN0cmluZygpLmRlZmF1bHQoXCJUaGUgcGFnZSB5b3UncmUgbG9va2luZyBmb3IgZG9lc24ndCBleGlzdC5cIiksXG4gIFwiZXJyb3IuZ29CYWNrXCI6IHouc3RyaW5nKCkuZGVmYXVsdChcIkdvIEJhY2tcIiksXG4gIFwiZXJyb3IudHJ5QWdhaW5cIjogei5zdHJpbmcoKS5kZWZhdWx0KFwiVHJ5IEFnYWluXCIpLFxuICBcImVycm9yLmhvbWVcIjogei5zdHJpbmcoKS5kZWZhdWx0KFwiSG9tZVwiKSxcbiAgXCJtZWRpYS5sb2FkaW5nRGlhZ3JhbVwiOiB6LnN0cmluZygpLmRlZmF1bHQoXCJMb2FkaW5nIGRpYWdyYW3igKZcIiksXG4gIFwibWVkaWEueW91dHViZVwiOiB6LnN0cmluZygpLmRlZmF1bHQoXCJZb3VUdWJlIHZpZGVvXCIpLFxuICBcIm1lZGlhLnNvdW5kY2xvdWRcIjogei5zdHJpbmcoKS5kZWZhdWx0KFwiU291bmRDbG91ZCBhdWRpb1wiKSxcbiAgXCJmb290bm90ZS5taXNzaW5nXCI6IHouc3RyaW5nKCkuZGVmYXVsdChcIkZvb3Rub3RlIG5vdCBmb3VuZFwiKSxcbiAgXCJmb290ZXIuY3JlYXRlZFdpdGhcIjogei5zdHJpbmcoKS5kZWZhdWx0KFwiQ3JlYXRlZCB3aXRoIHtoZWFydH0gYW5kIHtsaXZlbWFya31cIiksXG59KVxuXG4vKiogQSBrZXkgb2Yge0BsaW5rIE1lc3NhZ2VzfS4gKi9cbmV4cG9ydCB0eXBlIE1lc3NhZ2VLZXkgPSBrZXlvZiBNZXNzYWdlc1xuXG4vKiogUGVyLWtleSBvdmVycmlkZXMgYSBwcm9qZWN0IHNldHMgZm9yIG9uZSBsYW5ndWFnZTsgdW5rbm93biBrZXlzIGFyZSByZWplY3RlZC4gKi9cbmV4cG9ydCB0eXBlIE1lc3NhZ2VPdmVycmlkZXMgPSB6LmluZmVyPHR5cGVvZiBNZXNzYWdlT3ZlcnJpZGVzPlxuZXhwb3J0IGNvbnN0IE1lc3NhZ2VPdmVycmlkZXMgPSB6LnBhcnRpYWxSZWNvcmQoTWVzc2FnZXMua2V5b2YoKSwgei5zdHJpbmcoKSlcbiJdfQ==
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Pluggable } from "textlane";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
/** Plugins added to the Markdown pipeline: unified-style attachers or native textlane
|
|
4
|
+
* plugins. `md` runs on the Markdown tree before heading ids and components, `html` on
|
|
5
|
+
* the HTML tree before heading slugs and the table of contents. */
|
|
6
|
+
export type MarkdownPlugins = z.infer<typeof MarkdownPlugins>;
|
|
7
|
+
export declare const MarkdownPlugins: z.ZodObject<{
|
|
8
|
+
md: z.ZodOptional<z.ZodArray<z.ZodCustom<Pluggable, Pluggable>>>;
|
|
9
|
+
html: z.ZodOptional<z.ZodArray<z.ZodCustom<Pluggable, Pluggable>>>;
|
|
10
|
+
}, z.core.$strict>;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const MarkdownPlugins = z.strictObject({
|
|
3
|
+
md: z.array(z.custom()).optional(),
|
|
4
|
+
html: z.array(z.custom()).optional(),
|
|
5
|
+
});
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS9tb2RlbHMvcGx1Z2lucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFBO0FBTXZCLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxDQUFDLENBQUMsWUFBWSxDQUFDO0lBQzVDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQWEsQ0FBQyxDQUFDLFFBQVEsRUFBRTtJQUM3QyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFhLENBQUMsQ0FBQyxRQUFRLEVBQUU7Q0FDaEQsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBQbHVnZ2FibGUgfSBmcm9tIFwidGV4dGxhbmVcIlxuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIlxuXG4vKiogUGx1Z2lucyBhZGRlZCB0byB0aGUgTWFya2Rvd24gcGlwZWxpbmU6IHVuaWZpZWQtc3R5bGUgYXR0YWNoZXJzIG9yIG5hdGl2ZSB0ZXh0bGFuZVxuICogIHBsdWdpbnMuIGBtZGAgcnVucyBvbiB0aGUgTWFya2Rvd24gdHJlZSBiZWZvcmUgaGVhZGluZyBpZHMgYW5kIGNvbXBvbmVudHMsIGBodG1sYCBvblxuICogIHRoZSBIVE1MIHRyZWUgYmVmb3JlIGhlYWRpbmcgc2x1Z3MgYW5kIHRoZSB0YWJsZSBvZiBjb250ZW50cy4gKi9cbmV4cG9ydCB0eXBlIE1hcmtkb3duUGx1Z2lucyA9IHouaW5mZXI8dHlwZW9mIE1hcmtkb3duUGx1Z2lucz5cbmV4cG9ydCBjb25zdCBNYXJrZG93blBsdWdpbnMgPSB6LnN0cmljdE9iamVjdCh7XG4gIG1kOiB6LmFycmF5KHouY3VzdG9tPFBsdWdnYWJsZT4oKSkub3B0aW9uYWwoKSxcbiAgaHRtbDogei5hcnJheSh6LmN1c3RvbTxQbHVnZ2FibGU+KCkpLm9wdGlvbmFsKCksXG59KVxuIl19
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/** Light syntax highlighting theme (Shiki) */
|
|
3
|
+
/** A light Shiki theme name. */
|
|
4
|
+
export type CodeThemeLight = z.infer<typeof CodeThemeLight>;
|
|
5
|
+
export declare const CodeThemeLight: z.ZodEnum<{
|
|
6
|
+
"ayu-light": "ayu-light";
|
|
7
|
+
"catppuccin-latte": "catppuccin-latte";
|
|
8
|
+
"everforest-light": "everforest-light";
|
|
9
|
+
"github-light": "github-light";
|
|
10
|
+
"github-light-default": "github-light-default";
|
|
11
|
+
"github-light-high-contrast": "github-light-high-contrast";
|
|
12
|
+
"gruvbox-light-hard": "gruvbox-light-hard";
|
|
13
|
+
"gruvbox-light-medium": "gruvbox-light-medium";
|
|
14
|
+
"gruvbox-light-soft": "gruvbox-light-soft";
|
|
15
|
+
"horizon-bright": "horizon-bright";
|
|
16
|
+
"kanagawa-lotus": "kanagawa-lotus";
|
|
17
|
+
"light-plus": "light-plus";
|
|
18
|
+
"material-theme-lighter": "material-theme-lighter";
|
|
19
|
+
"min-light": "min-light";
|
|
20
|
+
"night-owl-light": "night-owl-light";
|
|
21
|
+
"one-light": "one-light";
|
|
22
|
+
"rose-pine-dawn": "rose-pine-dawn";
|
|
23
|
+
"slack-ochin": "slack-ochin";
|
|
24
|
+
"snazzy-light": "snazzy-light";
|
|
25
|
+
"solarized-light": "solarized-light";
|
|
26
|
+
"vitesse-light": "vitesse-light";
|
|
27
|
+
}>;
|
|
28
|
+
/** Dark syntax highlighting theme (Shiki) */
|
|
29
|
+
/** A dark Shiki theme name. */
|
|
30
|
+
export type CodeThemeDark = z.infer<typeof CodeThemeDark>;
|
|
31
|
+
export declare const CodeThemeDark: z.ZodEnum<{
|
|
32
|
+
andromeeda: "andromeeda";
|
|
33
|
+
"aurora-x": "aurora-x";
|
|
34
|
+
"ayu-dark": "ayu-dark";
|
|
35
|
+
"ayu-mirage": "ayu-mirage";
|
|
36
|
+
"catppuccin-frappe": "catppuccin-frappe";
|
|
37
|
+
"catppuccin-macchiato": "catppuccin-macchiato";
|
|
38
|
+
"catppuccin-mocha": "catppuccin-mocha";
|
|
39
|
+
"dark-plus": "dark-plus";
|
|
40
|
+
dracula: "dracula";
|
|
41
|
+
"dracula-soft": "dracula-soft";
|
|
42
|
+
"everforest-dark": "everforest-dark";
|
|
43
|
+
"github-dark": "github-dark";
|
|
44
|
+
"github-dark-default": "github-dark-default";
|
|
45
|
+
"github-dark-dimmed": "github-dark-dimmed";
|
|
46
|
+
"github-dark-high-contrast": "github-dark-high-contrast";
|
|
47
|
+
"gruvbox-dark-hard": "gruvbox-dark-hard";
|
|
48
|
+
"gruvbox-dark-medium": "gruvbox-dark-medium";
|
|
49
|
+
"gruvbox-dark-soft": "gruvbox-dark-soft";
|
|
50
|
+
horizon: "horizon";
|
|
51
|
+
houston: "houston";
|
|
52
|
+
"kanagawa-dragon": "kanagawa-dragon";
|
|
53
|
+
"kanagawa-wave": "kanagawa-wave";
|
|
54
|
+
laserwave: "laserwave";
|
|
55
|
+
"material-theme": "material-theme";
|
|
56
|
+
"material-theme-darker": "material-theme-darker";
|
|
57
|
+
"material-theme-ocean": "material-theme-ocean";
|
|
58
|
+
"material-theme-palenight": "material-theme-palenight";
|
|
59
|
+
"min-dark": "min-dark";
|
|
60
|
+
monokai: "monokai";
|
|
61
|
+
"night-owl": "night-owl";
|
|
62
|
+
nord: "nord";
|
|
63
|
+
"one-dark-pro": "one-dark-pro";
|
|
64
|
+
plastic: "plastic";
|
|
65
|
+
poimandres: "poimandres";
|
|
66
|
+
red: "red";
|
|
67
|
+
"rose-pine": "rose-pine";
|
|
68
|
+
"rose-pine-moon": "rose-pine-moon";
|
|
69
|
+
"slack-dark": "slack-dark";
|
|
70
|
+
"solarized-dark": "solarized-dark";
|
|
71
|
+
"synthwave-84": "synthwave-84";
|
|
72
|
+
"tokyo-night": "tokyo-night";
|
|
73
|
+
vesper: "vesper";
|
|
74
|
+
"vitesse-black": "vitesse-black";
|
|
75
|
+
"vitesse-dark": "vitesse-dark";
|
|
76
|
+
}>;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const CodeThemeLight = z.enum([
|
|
3
|
+
"ayu-light",
|
|
4
|
+
"catppuccin-latte",
|
|
5
|
+
"everforest-light",
|
|
6
|
+
"github-light",
|
|
7
|
+
"github-light-default",
|
|
8
|
+
"github-light-high-contrast",
|
|
9
|
+
"gruvbox-light-hard",
|
|
10
|
+
"gruvbox-light-medium",
|
|
11
|
+
"gruvbox-light-soft",
|
|
12
|
+
"horizon-bright",
|
|
13
|
+
"kanagawa-lotus",
|
|
14
|
+
"light-plus",
|
|
15
|
+
"material-theme-lighter",
|
|
16
|
+
"min-light",
|
|
17
|
+
"night-owl-light",
|
|
18
|
+
"one-light",
|
|
19
|
+
"rose-pine-dawn",
|
|
20
|
+
"slack-ochin",
|
|
21
|
+
"snazzy-light",
|
|
22
|
+
"solarized-light",
|
|
23
|
+
"vitesse-light",
|
|
24
|
+
]);
|
|
25
|
+
export const CodeThemeDark = z.enum([
|
|
26
|
+
"andromeeda",
|
|
27
|
+
"aurora-x",
|
|
28
|
+
"ayu-dark",
|
|
29
|
+
"ayu-mirage",
|
|
30
|
+
"catppuccin-frappe",
|
|
31
|
+
"catppuccin-macchiato",
|
|
32
|
+
"catppuccin-mocha",
|
|
33
|
+
"dark-plus",
|
|
34
|
+
"dracula",
|
|
35
|
+
"dracula-soft",
|
|
36
|
+
"everforest-dark",
|
|
37
|
+
"github-dark",
|
|
38
|
+
"github-dark-default",
|
|
39
|
+
"github-dark-dimmed",
|
|
40
|
+
"github-dark-high-contrast",
|
|
41
|
+
"gruvbox-dark-hard",
|
|
42
|
+
"gruvbox-dark-medium",
|
|
43
|
+
"gruvbox-dark-soft",
|
|
44
|
+
"horizon",
|
|
45
|
+
"houston",
|
|
46
|
+
"kanagawa-dragon",
|
|
47
|
+
"kanagawa-wave",
|
|
48
|
+
"laserwave",
|
|
49
|
+
"material-theme",
|
|
50
|
+
"material-theme-darker",
|
|
51
|
+
"material-theme-ocean",
|
|
52
|
+
"material-theme-palenight",
|
|
53
|
+
"min-dark",
|
|
54
|
+
"monokai",
|
|
55
|
+
"night-owl",
|
|
56
|
+
"nord",
|
|
57
|
+
"one-dark-pro",
|
|
58
|
+
"plastic",
|
|
59
|
+
"poimandres",
|
|
60
|
+
"red",
|
|
61
|
+
"rose-pine",
|
|
62
|
+
"rose-pine-moon",
|
|
63
|
+
"slack-dark",
|
|
64
|
+
"solarized-dark",
|
|
65
|
+
"synthwave-84",
|
|
66
|
+
"tokyo-night",
|
|
67
|
+
"vesper",
|
|
68
|
+
"vitesse-black",
|
|
69
|
+
"vitesse-dark",
|
|
70
|
+
]);
|
|
71
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhlbWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zb3VyY2UvbW9kZWxzL3RoZW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUE7QUFLdkIsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDbkMsV0FBVztJQUNYLGtCQUFrQjtJQUNsQixrQkFBa0I7SUFDbEIsY0FBYztJQUNkLHNCQUFzQjtJQUN0Qiw0QkFBNEI7SUFDNUIsb0JBQW9CO0lBQ3BCLHNCQUFzQjtJQUN0QixvQkFBb0I7SUFDcEIsZ0JBQWdCO0lBQ2hCLGdCQUFnQjtJQUNoQixZQUFZO0lBQ1osd0JBQXdCO0lBQ3hCLFdBQVc7SUFDWCxpQkFBaUI7SUFDakIsV0FBVztJQUNYLGdCQUFnQjtJQUNoQixhQUFhO0lBQ2IsY0FBYztJQUNkLGlCQUFpQjtJQUNqQixlQUFlO0NBQ2hCLENBQUMsQ0FBQTtBQUtGLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ2xDLFlBQVk7SUFDWixVQUFVO0lBQ1YsVUFBVTtJQUNWLFlBQVk7SUFDWixtQkFBbUI7SUFDbkIsc0JBQXNCO0lBQ3RCLGtCQUFrQjtJQUNsQixXQUFXO0lBQ1gsU0FBUztJQUNULGNBQWM7SUFDZCxpQkFBaUI7SUFDakIsYUFBYTtJQUNiLHFCQUFxQjtJQUNyQixvQkFBb0I7SUFDcEIsMkJBQTJCO0lBQzNCLG1CQUFtQjtJQUNuQixxQkFBcUI7SUFDckIsbUJBQW1CO0lBQ25CLFNBQVM7SUFDVCxTQUFTO0lBQ1QsaUJBQWlCO0lBQ2pCLGVBQWU7SUFDZixXQUFXO0lBQ1gsZ0JBQWdCO0lBQ2hCLHVCQUF1QjtJQUN2QixzQkFBc0I7SUFDdEIsMEJBQTBCO0lBQzFCLFVBQVU7SUFDVixTQUFTO0lBQ1QsV0FBVztJQUNYLE1BQU07SUFDTixjQUFjO0lBQ2QsU0FBUztJQUNULFlBQVk7SUFDWixLQUFLO0lBQ0wsV0FBVztJQUNYLGdCQUFnQjtJQUNoQixZQUFZO0lBQ1osZ0JBQWdCO0lBQ2hCLGNBQWM7SUFDZCxhQUFhO0lBQ2IsUUFBUTtJQUNSLGVBQWU7SUFDZixjQUFjO0NBQ2YsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIlxuXG4vKiogTGlnaHQgc3ludGF4IGhpZ2hsaWdodGluZyB0aGVtZSAoU2hpa2kpICovXG4vKiogQSBsaWdodCBTaGlraSB0aGVtZSBuYW1lLiAqL1xuZXhwb3J0IHR5cGUgQ29kZVRoZW1lTGlnaHQgPSB6LmluZmVyPHR5cGVvZiBDb2RlVGhlbWVMaWdodD5cbmV4cG9ydCBjb25zdCBDb2RlVGhlbWVMaWdodCA9IHouZW51bShbXG4gIFwiYXl1LWxpZ2h0XCIsXG4gIFwiY2F0cHB1Y2Npbi1sYXR0ZVwiLFxuICBcImV2ZXJmb3Jlc3QtbGlnaHRcIixcbiAgXCJnaXRodWItbGlnaHRcIixcbiAgXCJnaXRodWItbGlnaHQtZGVmYXVsdFwiLFxuICBcImdpdGh1Yi1saWdodC1oaWdoLWNvbnRyYXN0XCIsXG4gIFwiZ3J1dmJveC1saWdodC1oYXJkXCIsXG4gIFwiZ3J1dmJveC1saWdodC1tZWRpdW1cIixcbiAgXCJncnV2Ym94LWxpZ2h0LXNvZnRcIixcbiAgXCJob3Jpem9uLWJyaWdodFwiLFxuICBcImthbmFnYXdhLWxvdHVzXCIsXG4gIFwibGlnaHQtcGx1c1wiLFxuICBcIm1hdGVyaWFsLXRoZW1lLWxpZ2h0ZXJcIixcbiAgXCJtaW4tbGlnaHRcIixcbiAgXCJuaWdodC1vd2wtbGlnaHRcIixcbiAgXCJvbmUtbGlnaHRcIixcbiAgXCJyb3NlLXBpbmUtZGF3blwiLFxuICBcInNsYWNrLW9jaGluXCIsXG4gIFwic25henp5LWxpZ2h0XCIsXG4gIFwic29sYXJpemVkLWxpZ2h0XCIsXG4gIFwidml0ZXNzZS1saWdodFwiLFxuXSlcblxuLyoqIERhcmsgc3ludGF4IGhpZ2hsaWdodGluZyB0aGVtZSAoU2hpa2kpICovXG4vKiogQSBkYXJrIFNoaWtpIHRoZW1lIG5hbWUuICovXG5leHBvcnQgdHlwZSBDb2RlVGhlbWVEYXJrID0gei5pbmZlcjx0eXBlb2YgQ29kZVRoZW1lRGFyaz5cbmV4cG9ydCBjb25zdCBDb2RlVGhlbWVEYXJrID0gei5lbnVtKFtcbiAgXCJhbmRyb21lZWRhXCIsXG4gIFwiYXVyb3JhLXhcIixcbiAgXCJheXUtZGFya1wiLFxuICBcImF5dS1taXJhZ2VcIixcbiAgXCJjYXRwcHVjY2luLWZyYXBwZVwiLFxuICBcImNhdHBwdWNjaW4tbWFjY2hpYXRvXCIsXG4gIFwiY2F0cHB1Y2Npbi1tb2NoYVwiLFxuICBcImRhcmstcGx1c1wiLFxuICBcImRyYWN1bGFcIixcbiAgXCJkcmFjdWxhLXNvZnRcIixcbiAgXCJldmVyZm9yZXN0LWRhcmtcIixcbiAgXCJnaXRodWItZGFya1wiLFxuICBcImdpdGh1Yi1kYXJrLWRlZmF1bHRcIixcbiAgXCJnaXRodWItZGFyay1kaW1tZWRcIixcbiAgXCJnaXRodWItZGFyay1oaWdoLWNvbnRyYXN0XCIsXG4gIFwiZ3J1dmJveC1kYXJrLWhhcmRcIixcbiAgXCJncnV2Ym94LWRhcmstbWVkaXVtXCIsXG4gIFwiZ3J1dmJveC1kYXJrLXNvZnRcIixcbiAgXCJob3Jpem9uXCIsXG4gIFwiaG91c3RvblwiLFxuICBcImthbmFnYXdhLWRyYWdvblwiLFxuICBcImthbmFnYXdhLXdhdmVcIixcbiAgXCJsYXNlcndhdmVcIixcbiAgXCJtYXRlcmlhbC10aGVtZVwiLFxuICBcIm1hdGVyaWFsLXRoZW1lLWRhcmtlclwiLFxuICBcIm1hdGVyaWFsLXRoZW1lLW9jZWFuXCIsXG4gIFwibWF0ZXJpYWwtdGhlbWUtcGFsZW5pZ2h0XCIsXG4gIFwibWluLWRhcmtcIixcbiAgXCJtb25va2FpXCIsXG4gIFwibmlnaHQtb3dsXCIsXG4gIFwibm9yZFwiLFxuICBcIm9uZS1kYXJrLXByb1wiLFxuICBcInBsYXN0aWNcIixcbiAgXCJwb2ltYW5kcmVzXCIsXG4gIFwicmVkXCIsXG4gIFwicm9zZS1waW5lXCIsXG4gIFwicm9zZS1waW5lLW1vb25cIixcbiAgXCJzbGFjay1kYXJrXCIsXG4gIFwic29sYXJpemVkLWRhcmtcIixcbiAgXCJzeW50aHdhdmUtODRcIixcbiAgXCJ0b2t5by1uaWdodFwiLFxuICBcInZlc3BlclwiLFxuICBcInZpdGVzc2UtYmxhY2tcIixcbiAgXCJ2aXRlc3NlLWRhcmtcIixcbl0pXG4iXX0=
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9jLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc291cmNlL21vZGVscy90b2MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgVG9jSXRlbSB7XG4gIHVybDogc3RyaW5nXG4gIHRpdGxlOiBzdHJpbmdcbiAgZGVwdGg6IG51bWJlclxufVxuIl19
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Root } from "hast";
|
|
2
|
+
/** A fenced code block whose meta names `twoslash` */
|
|
3
|
+
export declare const TWOSLASH_FENCE: RegExp;
|
|
4
|
+
/** Re-highlight the code blocks whose meta names `twoslash` with Shiki's twoslash
|
|
5
|
+
* transformer: the one stage textlane cannot run natively, as it needs TypeScript. */
|
|
6
|
+
export declare function twoslashStage(options: {
|
|
7
|
+
themes: {
|
|
8
|
+
light: string;
|
|
9
|
+
dark: string;
|
|
10
|
+
};
|
|
11
|
+
}): (tree: Root) => Promise<void>;
|
|
12
|
+
/** Start TypeScript in the twoslash worker now, so it is ready once a block needs it */
|
|
13
|
+
export declare function warmTwoslash(): void;
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { Worker } from "node:worker_threads";
|
|
2
|
+
import { readNodeText } from "../helpers/node-text.js";
|
|
3
|
+
/** A fenced code block whose meta names `twoslash` */
|
|
4
|
+
export const TWOSLASH_FENCE = /^[ \t>]*(?:`{3,}|~{3,})[^\n]*\btwoslash\b/m;
|
|
5
|
+
const TWOSLASH = /(?:^|\s)twoslash(?:\s|$)/;
|
|
6
|
+
/** Re-highlight the code blocks whose meta names `twoslash` with Shiki's twoslash
|
|
7
|
+
* transformer: the one stage textlane cannot run natively, as it needs TypeScript. */
|
|
8
|
+
export function twoslashStage(options) {
|
|
9
|
+
return async (tree) => {
|
|
10
|
+
const blocks = [];
|
|
11
|
+
for (const node of walkElements(tree)) {
|
|
12
|
+
if (node.tagName !== "pre")
|
|
13
|
+
continue;
|
|
14
|
+
const meta = node.properties["data-meta"] ?? node.properties.dataMeta;
|
|
15
|
+
if (typeof meta !== "string" || !TWOSLASH.test(meta))
|
|
16
|
+
continue;
|
|
17
|
+
blocks.push({ node, meta, lang: readLanguage(node) });
|
|
18
|
+
}
|
|
19
|
+
const themes = options.themes;
|
|
20
|
+
await Promise.all(blocks.map(async (block) => {
|
|
21
|
+
const pre = await renderBlock({
|
|
22
|
+
...block,
|
|
23
|
+
code: readNodeText(block.node),
|
|
24
|
+
themes,
|
|
25
|
+
});
|
|
26
|
+
if (!pre)
|
|
27
|
+
return;
|
|
28
|
+
block.node.properties = structuredClone(pre.properties);
|
|
29
|
+
block.node.children = structuredClone(pre.children);
|
|
30
|
+
}));
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/** Start TypeScript in the twoslash worker now, so it is ready once a block needs it */
|
|
34
|
+
export function warmTwoslash() {
|
|
35
|
+
readWorker();
|
|
36
|
+
}
|
|
37
|
+
// Translated pages repeat the same blocks, which twoslash would check again
|
|
38
|
+
const rendered = new Map();
|
|
39
|
+
function renderBlock(request) {
|
|
40
|
+
const key = JSON.stringify([request.lang, request.meta, request.themes, request.code]);
|
|
41
|
+
let pre = rendered.get(key);
|
|
42
|
+
if (!pre) {
|
|
43
|
+
pre = callWorker(request);
|
|
44
|
+
rendered.set(key, pre);
|
|
45
|
+
}
|
|
46
|
+
return pre;
|
|
47
|
+
}
|
|
48
|
+
// TypeScript takes ~0.8 s to start on the thread twoslash runs on; a worker keeps it
|
|
49
|
+
// off the main thread, where textlane compiles every other article meanwhile
|
|
50
|
+
let worker;
|
|
51
|
+
function readWorker() {
|
|
52
|
+
if (worker)
|
|
53
|
+
return worker;
|
|
54
|
+
const thread = new Worker(WORKER_SOURCE, {
|
|
55
|
+
eval: true,
|
|
56
|
+
// an eval'd worker resolves bare specifiers from the cwd, so it imports the
|
|
57
|
+
// packages this module resolves rather than resolving them itself
|
|
58
|
+
workerData: {
|
|
59
|
+
shiki: import.meta.resolve("shiki"),
|
|
60
|
+
twoslash: import.meta.resolve("@shikijs/twoslash"),
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
const pending = new Map();
|
|
64
|
+
thread.on("message", (message) => {
|
|
65
|
+
const call = pending.get(message.id);
|
|
66
|
+
pending.delete(message.id);
|
|
67
|
+
if (pending.size === 0)
|
|
68
|
+
thread.unref();
|
|
69
|
+
if (message.error)
|
|
70
|
+
call?.reject(new Error(message.error));
|
|
71
|
+
else
|
|
72
|
+
call?.resolve(message.pre);
|
|
73
|
+
});
|
|
74
|
+
thread.on("error", error => {
|
|
75
|
+
for (const call of pending.values())
|
|
76
|
+
call.reject(error);
|
|
77
|
+
pending.clear();
|
|
78
|
+
worker = undefined;
|
|
79
|
+
});
|
|
80
|
+
// Only a worker with blocks in flight keeps the build alive; `on("message")` refs it
|
|
81
|
+
thread.unref();
|
|
82
|
+
worker = { thread, pending, next: 0 };
|
|
83
|
+
return worker;
|
|
84
|
+
}
|
|
85
|
+
function callWorker(request) {
|
|
86
|
+
const current = readWorker();
|
|
87
|
+
const id = current.next++;
|
|
88
|
+
return new Promise((resolve, reject) => {
|
|
89
|
+
current.pending.set(id, { resolve, reject });
|
|
90
|
+
current.thread.ref();
|
|
91
|
+
current.thread.postMessage({ id, ...request });
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
// The first twoslash call builds TypeScript's program over `lib.*.d.ts`; one throwaway
|
|
95
|
+
// block pays that while the main thread still has other articles to compile
|
|
96
|
+
const WORKER_SOURCE = `
|
|
97
|
+
const { parentPort, workerData } = require("node:worker_threads")
|
|
98
|
+
const ready = (async () => {
|
|
99
|
+
const { bundledLanguages, getSingletonHighlighter } = await import(workerData.shiki)
|
|
100
|
+
const { transformerTwoslash } = await import(workerData.twoslash)
|
|
101
|
+
const transformer = transformerTwoslash({ explicitTrigger: true })
|
|
102
|
+
const highlighter = await getSingletonHighlighter({ themes: [], langs: ["ts"] })
|
|
103
|
+
highlighter.codeToHast("const a = 1", {
|
|
104
|
+
lang: "ts",
|
|
105
|
+
theme: "none",
|
|
106
|
+
meta: { __raw: "twoslash" },
|
|
107
|
+
transformers: [transformer],
|
|
108
|
+
})
|
|
109
|
+
return { bundledLanguages, highlighter, transformer }
|
|
110
|
+
})()
|
|
111
|
+
parentPort.on("message", async request => {
|
|
112
|
+
try {
|
|
113
|
+
const { bundledLanguages, highlighter, transformer } = await ready
|
|
114
|
+
const lang = request.lang in bundledLanguages ? request.lang : "ts"
|
|
115
|
+
await highlighter.loadLanguage(lang)
|
|
116
|
+
await highlighter.loadTheme(request.themes.light, request.themes.dark)
|
|
117
|
+
const fragment = highlighter.codeToHast(request.code, {
|
|
118
|
+
lang,
|
|
119
|
+
themes: request.themes,
|
|
120
|
+
meta: { __raw: request.meta, "data-meta": request.meta },
|
|
121
|
+
transformers: [transformer],
|
|
122
|
+
})
|
|
123
|
+
const pre = fragment.children[0]
|
|
124
|
+
parentPort.postMessage({ id: request.id, pre: pre && pre.type === "element" ? pre : undefined })
|
|
125
|
+
} catch (error) {
|
|
126
|
+
parentPort.postMessage({ id: request.id, error: String((error && error.stack) || error) })
|
|
127
|
+
}
|
|
128
|
+
})
|
|
129
|
+
`;
|
|
130
|
+
// addLanguageClass put `language-<name>` on the block's `<code>`
|
|
131
|
+
function readLanguage(pre) {
|
|
132
|
+
const code = pre.children.find((child) => child.type === "element" && child.tagName === "code");
|
|
133
|
+
const classes = code?.properties.className;
|
|
134
|
+
const name = Array.isArray(classes)
|
|
135
|
+
? classes.find(item => typeof item === "string" && item.startsWith("language-"))
|
|
136
|
+
: undefined;
|
|
137
|
+
return typeof name === "string" ? name.slice("language-".length) : "ts";
|
|
138
|
+
}
|
|
139
|
+
function* walkElements(node) {
|
|
140
|
+
if (node.type === "element")
|
|
141
|
+
yield node;
|
|
142
|
+
if ("children" in node)
|
|
143
|
+
for (const child of node.children)
|
|
144
|
+
yield* walkElements(child);
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHdvc2xhc2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zb3VyY2UvcGx1Z2lucy90d29zbGFzaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFFNUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHlCQUF5QixDQUFBO0FBRXRELHNEQUFzRDtBQUN0RCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsNENBQTRDLENBQUE7QUFFMUUsTUFBTSxRQUFRLEdBQUcsMEJBQTBCLENBQUE7QUFFM0M7dUZBQ3VGO0FBQ3ZGLE1BQU0sVUFBVSxhQUFhLENBQUMsT0FBb0Q7SUFDaEYsT0FBTyxLQUFLLEVBQUUsSUFBVSxFQUFFLEVBQUU7UUFDMUIsTUFBTSxNQUFNLEdBQW9ELEVBQUUsQ0FBQTtRQUNsRSxLQUFLLE1BQU0sSUFBSSxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3RDLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxLQUFLO2dCQUFFLFNBQVE7WUFDcEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQTtZQUNyRSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO2dCQUFFLFNBQVE7WUFDOUQsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDdkQsQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUE7UUFDN0IsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUNmLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxFQUFF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O0lBQzFDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDaEYsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtJQUNiLE9BQU8sT0FBTyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBO0FBQ3pFLENBQUM7QUFFRCxRQUFRLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBd0I7SUFDN0MsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFNBQVM7UUFBRSxNQUFNLElBQUksQ0FBQTtJQUN2QyxJQUFJLFVBQVUsSUFBSSxJQUFJO1FBQUUsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsUUFBUTtZQUFFLEtBQUssQ0FBQyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUN2RixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV29ya2VyIH0gZnJvbSBcIm5vZGU6d29ya2VyX3RocmVhZHNcIlxuaW1wb3J0IHR5cGUgeyBFbGVtZW50LCBFbGVtZW50Q29udGVudCwgUm9vdCwgUm9vdENvbnRlbnQgfSBmcm9tIFwiaGFzdFwiXG5pbXBvcnQgeyByZWFkTm9kZVRleHQgfSBmcm9tIFwiLi4vaGVscGVycy9ub2RlLXRleHQudHNcIlxuXG4vKiogQSBmZW5jZWQgY29kZSBibG9jayB3aG9zZSBtZXRhIG5hbWVzIGB0d29zbGFzaGAgKi9cbmV4cG9ydCBjb25zdCBUV09TTEFTSF9GRU5DRSA9IC9eWyBcXHQ+XSooPzpgezMsfXx+ezMsfSlbXlxcbl0qXFxidHdvc2xhc2hcXGIvbVxuXG5jb25zdCBUV09TTEFTSCA9IC8oPzpefFxccyl0d29zbGFzaCg/Olxcc3wkKS9cblxuLyoqIFJlLWhpZ2hsaWdodCB0aGUgY29kZSBibG9ja3Mgd2hvc2UgbWV0YSBuYW1lcyBgdHdvc2xhc2hgIHdpdGggU2hpa2kncyB0d29zbGFzaFxuICogIHRyYW5zZm9ybWVyOiB0aGUgb25lIHN0YWdlIHRleHRsYW5lIGNhbm5vdCBydW4gbmF0aXZlbHksIGFzIGl0IG5lZWRzIFR5cGVTY3JpcHQuICovXG5leHBvcnQgZnVuY3Rpb24gdHdvc2xhc2hTdGFnZShvcHRpb25zOiB7IHRoZW1lczogeyBsaWdodDogc3RyaW5nOyBkYXJrOiBzdHJpbmcgfSB9KSB7XG4gIHJldHVybiBhc3luYyAodHJlZTogUm9vdCkgPT4ge1xuICAgIGNvbnN0IGJsb2NrczogeyBub2RlOiBFbGVtZW50OyBtZXRhOiBzdHJpbmc7IGxhbmc6IHN0cmluZyB9W10gPSBbXVxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiB3YWxrRWxlbWVudHModHJlZSkpIHtcbiAgICAgIGlmIChub2RlLnRhZ05hbWUgIT09IFwicHJlXCIpIGNvbnRpbnVlXG4gICAgICBjb25zdCBtZXRhID0gbm9kZS5wcm9wZXJ0aWVzW1wiZGF0YS1tZXRhXCJdID8/IG5vZGUucHJvcGVydGllcy5kYXRhTWV0YVxuICAgICAgaWYgKHR5cGVvZiBtZXRhICE9PSBcInN0cmluZ1wiIHx8ICFUV09TTEFTSC50ZXN0KG1ldGEpKSBjb250aW51ZVxuICAgICAgYmxvY2tzLnB1c2goeyBub2RlLCBtZXRhLCBsYW5nOiByZWFkTGFuZ3VhZ2Uobm9kZSkgfSlcbiAgICB9XG4gICAgY29uc3QgdGhlbWVzID0gb3B0aW9ucy50aGVtZXNcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGJsb2Nrcy5tYXAoYXN5bmMgYmxvY2sgPT4ge1xuICAgICAgICBjb25zdCBwcmUgPSBhd2FpdCByZW5kZXJCbG9jayh7XG4gICAgICAgICAgLi4uYmxvY2ssXG4gICAgICAgICAgY29kZTogcmVhZE5vZGVUZXh0KGJsb2NrLm5vZGUpLFxuICAgICAgICAgIHRoZW1lcyxcbiAgICAgICAgfSlcbiAgICAgICAgaWYgKCFwcmUpIHJldHVyblxuICAgICAgICBibG9jay5ub2RlLnByb3BlcnRpZXMgPSBzdHJ1Y3R1cmVkQ2xvbmUocHJlLnByb3BlcnRpZXMpXG4gICAgICAgIGJsb2NrLm5vZGUuY2hpbGRyZW4gPSBzdHJ1Y3R1cmVkQ2xvbmUocHJlLmNoaWxkcmVuKSBhcyBFbGVtZW50Q29udGVudFtdXG4gICAgICB9KSxcbiAgICApXG4gIH1cbn1cblxuLyoqIFN0YXJ0IFR5cGVTY3JpcHQgaW4gdGhlIHR3b3NsYXNoIHdvcmtlciBub3csIHNvIGl0IGlzIHJlYWR5IG9uY2UgYSBibG9jayBuZWVkcyBpdCAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdhcm1Ud29zbGFzaCgpIHtcbiAgcmVhZFdvcmtlcigpXG59XG5cbmludGVyZmFjZSBCbG9ja1JlcXVlc3Qge1xuICBjb2RlOiBzdHJpbmdcbiAgbGFuZzogc3RyaW5nXG4gIG1ldGE6IHN0cmluZ1xuICB0aGVtZXM6IHsgbGlnaHQ6IHN0cmluZzsgZGFyazogc3RyaW5nIH1cbn1cblxuLy8gVHJhbnNsYXRlZCBwYWdlcyByZXBlYXQgdGhlIHNhbWUgYmxvY2tzLCB3aGljaCB0d29zbGFzaCB3b3VsZCBjaGVjayBhZ2FpblxuY29uc3QgcmVuZGVyZWQgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTxFbGVtZW50IHwgdW5kZWZpbmVkPj4oKVxuXG5mdW5jdGlvbiByZW5kZXJCbG9jayhyZXF1ZXN0OiBCbG9ja1JlcXVlc3QpIHtcbiAgY29uc3Qga2V5ID0gSlNPTi5zdHJpbmdpZnkoW3JlcXVlc3QubGFuZywgcmVxdWVzdC5tZXRhLCByZXF1ZXN0LnRoZW1lcywgcmVxdWVzdC5jb2RlXSlcbiAgbGV0IHByZSA9IHJlbmRlcmVkLmdldChrZXkpXG4gIGlmICghcHJlKSB7XG4gICAgcHJlID0gY2FsbFdvcmtlcihyZXF1ZXN0KVxuICAgIHJlbmRlcmVkLnNldChrZXksIHByZSlcbiAgfVxuICByZXR1cm4gcHJlXG59XG5cbmludGVyZmFjZSBQZW5kaW5nIHtcbiAgcmVzb2x2ZTogKHByZTogRWxlbWVudCB8IHVuZGVmaW5lZCkgPT4gdm9pZFxuICByZWplY3Q6IChlcnJvcjogRXJyb3IpID0+IHZvaWRcbn1cblxuLy8gVHlwZVNjcmlwdCB0YWtlcyB+MC44IHMgdG8gc3RhcnQgb24gdGhlIHRocmVhZCB0d29zbGFzaCBydW5zIG9uOyBhIHdvcmtlciBrZWVwcyBpdFxuLy8gb2ZmIHRoZSBtYWluIHRocmVhZCwgd2hlcmUgdGV4dGxhbmUgY29tcGlsZXMgZXZlcnkgb3RoZXIgYXJ0aWNsZSBtZWFud2hpbGVcbmxldCB3b3JrZXI6IHsgdGhyZWFkOiBXb3JrZXI7IHBlbmRpbmc6IE1hcDxudW1iZXIsIFBlbmRpbmc+OyBuZXh0OiBudW1iZXIgfSB8IHVuZGVmaW5lZFxuXG5mdW5jdGlvbiByZWFkV29ya2VyKCkge1xuICBpZiAod29ya2VyKSByZXR1cm4gd29ya2VyXG4gIGNvbnN0IHRocmVhZCA9IG5ldyBXb3JrZXIoV09SS0VSX1NPVVJDRSwge1xuICAgIGV2YWw6IHRydWUsXG4gICAgLy8gYW4gZXZhbCdkIHdvcmtlciByZXNvbHZlcyBiYXJlIHNwZWNpZmllcnMgZnJvbSB0aGUgY3dkLCBzbyBpdCBpbXBvcnRzIHRoZVxuICAgIC8vIHBhY2thZ2VzIHRoaXMgbW9kdWxlIHJlc29sdmVzIHJhdGhlciB0aGFuIHJlc29sdmluZyB0aGVtIGl0c2VsZlxuICAgIHdvcmtlckRhdGE6IHtcbiAgICAgIHNoaWtpOiBpbXBvcnQubWV0YS5yZXNvbHZlKFwic2hpa2lcIiksXG4gICAgICB0d29zbGFzaDogaW1wb3J0Lm1ldGEucmVzb2x2ZShcIkBzaGlraWpzL3R3b3NsYXNoXCIpLFxuICAgIH0sXG4gIH0pXG4gIGNvbnN0IHBlbmRpbmcgPSBuZXcgTWFwPG51bWJlciwgUGVuZGluZz4oKVxuICB0aHJlYWQub24oXCJtZXNzYWdlXCIsIChtZXNzYWdlOiB7IGlkOiBudW1iZXI7IHByZT86IEVsZW1lbnQ7IGVycm9yPzogc3RyaW5nIH0pID0+IHtcbiAgICBjb25zdCBjYWxsID0gcGVuZGluZy5nZXQobWVzc2FnZS5pZClcbiAgICBwZW5kaW5nLmRlbGV0ZShtZXNzYWdlLmlkKVxuICAgIGlmIChwZW5kaW5nLnNpemUgPT09IDApIHRocmVhZC51bnJlZigpXG4gICAgaWYgKG1lc3NhZ2UuZXJyb3IpIGNhbGw/LnJlamVjdChuZXcgRXJyb3IobWVzc2FnZS5lcnJvcikpXG4gICAgZWxzZSBjYWxsPy5yZXNvbHZlKG1lc3NhZ2UucHJlKVxuICB9KVxuICB0aHJlYWQub24oXCJlcnJvclwiLCBlcnJvciA9PiB7XG4gICAgZm9yIChjb25zdCBjYWxsIG9mIHBlbmRpbmcudmFsdWVzKCkpIGNhbGwucmVqZWN0KGVycm9yKVxuICAgIHBlbmRpbmcuY2xlYXIoKVxuICAgIHdvcmtlciA9IHVuZGVmaW5lZFxuICB9KVxuICAvLyBPbmx5IGEgd29ya2VyIHdpdGggYmxvY2tzIGluIGZsaWdodCBrZWVwcyB0aGUgYnVpbGQgYWxpdmU7IGBvbihcIm1lc3NhZ2VcIilgIHJlZnMgaXRcbiAgdGhyZWFkLnVucmVmKClcbiAgd29ya2VyID0geyB0aHJlYWQsIHBlbmRpbmcsIG5leHQ6IDAgfVxuICByZXR1cm4gd29ya2VyXG59XG5cbmZ1bmN0aW9uIGNhbGxXb3JrZXIocmVxdWVzdDogQmxvY2tSZXF1ZXN0KSB7XG4gIGNvbnN0IGN1cnJlbnQgPSByZWFkV29ya2VyKClcbiAgY29uc3QgaWQgPSBjdXJyZW50Lm5leHQrK1xuICByZXR1cm4gbmV3IFByb21pc2U8RWxlbWVudCB8IHVuZGVmaW5lZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGN1cnJlbnQucGVuZGluZy5zZXQoaWQsIHsgcmVzb2x2ZSwgcmVqZWN0IH0pXG4gICAgY3VycmVudC50aHJlYWQucmVmKClcbiAgICBjdXJyZW50LnRocmVhZC5wb3N0TWVzc2FnZSh7IGlkLCAuLi5yZXF1ZXN0IH0pXG4gIH0pXG59XG5cbi8vIFRoZSBmaXJzdCB0d29zbGFzaCBjYWxsIGJ1aWxkcyBUeXBlU2NyaXB0J3MgcHJvZ3JhbSBvdmVyIGBsaWIuKi5kLnRzYDsgb25lIHRocm93YXdheVxuLy8gYmxvY2sgcGF5cyB0aGF0IHdoaWxlIHRoZSBtYWluIHRocmVhZCBzdGlsbCBoYXMgb3RoZXIgYXJ0aWNsZXMgdG8gY29tcGlsZVxuY29uc3QgV09SS0VSX1NPVVJDRSA9IGBcbmNvbnN0IHsgcGFyZW50UG9ydCwgd29ya2VyRGF0YSB9ID0gcmVxdWlyZShcIm5vZGU6d29ya2VyX3RocmVhZHNcIilcbmNvbnN0IHJlYWR5ID0gKGFzeW5jICgpID0+IHtcbiAgY29uc3QgeyBidW5kbGVkTGFuZ3VhZ2VzLCBnZXRTaW5nbGV0b25IaWdobGlnaHRlciB9ID0gYXdhaXQgaW1wb3J0KHdvcmtlckRhdGEuc2hpa2kpXG4gIGNvbnN0IHsgdHJhbnNmb3JtZXJUd29zbGFzaCB9ID0gYXdhaXQgaW1wb3J0KHdvcmtlckRhdGEudHdvc2xhc2gpXG4gIGNvbnN0IHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJUd29zbGFzaCh7IGV4cGxpY2l0VHJpZ2dlcjogdHJ1ZSB9KVxuICBjb25zdCBoaWdobGlnaHRlciA9IGF3YWl0IGdldFNpbmdsZXRvbkhpZ2hsaWdodGVyKHsgdGhlbWVzOiBbXSwgbGFuZ3M6IFtcInRzXCJdIH0pXG4gIGhpZ2hsaWdodGVyLmNvZGVUb0hhc3QoXCJjb25zdCBhID0gMVwiLCB7XG4gICAgbGFuZzogXCJ0c1wiLFxuICAgIHRoZW1lOiBcIm5vbmVcIixcbiAgICBtZXRhOiB7IF9fcmF3OiBcInR3b3NsYXNoXCIgfSxcbiAgICB0cmFuc2Zvcm1lcnM6IFt0cmFuc2Zvcm1lcl0sXG4gIH0pXG4gIHJldHVybiB7IGJ1bmRsZWRMYW5ndWFnZXMsIGhpZ2hsaWdodGVyLCB0cmFuc2Zvcm1lciB9XG59KSgpXG5wYXJlbnRQb3J0Lm9uKFwibWVzc2FnZVwiLCBhc3luYyByZXF1ZXN0ID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCB7IGJ1bmRsZWRMYW5ndWFnZXMsIGhpZ2hsaWdodGVyLCB0cmFuc2Zvcm1lciB9ID0gYXdhaXQgcmVhZHlcbiAgICBjb25zdCBsYW5nID0gcmVxdWVzdC5sYW5nIGluIGJ1bmRsZWRMYW5ndWFnZXMgPyByZXF1ZXN0LmxhbmcgOiBcInRzXCJcbiAgICBhd2FpdCBoaWdobGlnaHRlci5sb2FkTGFuZ3VhZ2UobGFuZylcbiAgICBhd2FpdCBoaWdobGlnaHRlci5sb2FkVGhlbWUocmVxdWVzdC50aGVtZXMubGlnaHQsIHJlcXVlc3QudGhlbWVzLmRhcmspXG4gICAgY29uc3QgZnJhZ21lbnQgPSBoaWdobGlnaHRlci5jb2RlVG9IYXN0KHJlcXVlc3QuY29kZSwge1xuICAgICAgbGFuZyxcbiAgICAgIHRoZW1lczogcmVxdWVzdC50aGVtZXMsXG4gICAgICBtZXRhOiB7IF9fcmF3OiByZXF1ZXN0Lm1ldGEsIFwiZGF0YS1tZXRhXCI6IHJlcXVlc3QubWV0YSB9LFxuICAgICAgdHJhbnNmb3JtZXJzOiBbdHJhbnNmb3JtZXJdLFxuICAgIH0pXG4gICAgY29uc3QgcHJlID0gZnJhZ21lbnQuY2hpbGRyZW5bMF1cbiAgICBwYXJlbnRQb3J0LnBvc3RNZXNzYWdlKHsgaWQ6IHJlcXVlc3QuaWQsIHByZTogcHJlICYmIHByZS50eXBlID09PSBcImVsZW1lbnRcIiA/IHByZSA6IHVuZGVmaW5lZCB9KVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHBhcmVudFBvcnQucG9zdE1lc3NhZ2UoeyBpZDogcmVxdWVzdC5pZCwgZXJyb3I6IFN0cmluZygoZXJyb3IgJiYgZXJyb3Iuc3RhY2spIHx8IGVycm9yKSB9KVxuICB9XG59KVxuYFxuXG4vLyBhZGRMYW5ndWFnZUNsYXNzIHB1dCBgbGFuZ3VhZ2UtPG5hbWU+YCBvbiB0aGUgYmxvY2sncyBgPGNvZGU+YFxuZnVuY3Rpb24gcmVhZExhbmd1YWdlKHByZTogRWxlbWVudCkge1xuICBjb25zdCBjb2RlID0gcHJlLmNoaWxkcmVuLmZpbmQoXG4gICAgKGNoaWxkKTogY2hpbGQgaXMgRWxlbWVudCA9PiBjaGlsZC50eXBlID09PSBcImVsZW1lbnRcIiAmJiBjaGlsZC50YWdOYW1lID09PSBcImNvZGVcIixcbiAgKVxuICBjb25zdCBjbGFzc2VzID0gY29kZT8ucHJvcGVydGllcy5jbGFzc05hbWVcbiAgY29uc3QgbmFtZSA9IEFycmF5LmlzQXJyYXkoY2xhc3NlcylcbiAgICA/IGNsYXNzZXMuZmluZChpdGVtID0+IHR5cGVvZiBpdGVtID09PSBcInN0cmluZ1wiICYmIGl0ZW0uc3RhcnRzV2l0aChcImxhbmd1YWdlLVwiKSlcbiAgICA6IHVuZGVmaW5lZFxuICByZXR1cm4gdHlwZW9mIG5hbWUgPT09IFwic3RyaW5nXCIgPyBuYW1lLnNsaWNlKFwibGFuZ3VhZ2UtXCIubGVuZ3RoKSA6IFwidHNcIlxufVxuXG5mdW5jdGlvbiogd2Fsa0VsZW1lbnRzKG5vZGU6IFJvb3QgfCBSb290Q29udGVudCk6IEdlbmVyYXRvcjxFbGVtZW50PiB7XG4gIGlmIChub2RlLnR5cGUgPT09IFwiZWxlbWVudFwiKSB5aWVsZCBub2RlXG4gIGlmIChcImNoaWxkcmVuXCIgaW4gbm9kZSkgZm9yIChjb25zdCBjaGlsZCBvZiBub2RlLmNoaWxkcmVuKSB5aWVsZCogd2Fsa0VsZW1lbnRzKGNoaWxkKVxufVxuIl19
|
package/package.json
CHANGED
|
@@ -1,6 +1,66 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@livemark/markdown",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "0.45.0",
|
|
4
|
+
"description": "Internal: the Markdown pipeline and components shared by livemark and @livemark/vite",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "Evgeny Karev",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/datisthq/livemark",
|
|
10
|
+
"directory": "markdown"
|
|
11
|
+
},
|
|
12
|
+
"files": [
|
|
13
|
+
"build",
|
|
14
|
+
"source",
|
|
15
|
+
"!source/**/*.unit.ts",
|
|
16
|
+
"!source/**/fixtures"
|
|
17
|
+
],
|
|
18
|
+
"type": "module",
|
|
19
|
+
"sideEffects": false,
|
|
20
|
+
"exports": {
|
|
21
|
+
"./standalone.css": "./source/standalone.css",
|
|
22
|
+
"./package.json": "./package.json",
|
|
23
|
+
"./components/*": "./source/components/*.tsx",
|
|
24
|
+
"./elements/*": "./source/elements/*.tsx",
|
|
25
|
+
"./hooks/*": "./source/hooks/*.ts",
|
|
26
|
+
"./styles/*": "./source/styles/*.css",
|
|
27
|
+
"./*.ts": {
|
|
28
|
+
"source": "./source/*.ts",
|
|
29
|
+
"types": "./source/*.ts",
|
|
30
|
+
"default": "./build/*.js"
|
|
31
|
+
},
|
|
32
|
+
"./*.tsx": "./source/*.tsx"
|
|
33
|
+
},
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"@base-ui/react": "1.9.0",
|
|
36
|
+
"@shikijs/twoslash": "^4.5.0",
|
|
37
|
+
"@tailwindcss/typography": "^0.5.20",
|
|
38
|
+
"@tanstack/react-router": "1.170.42",
|
|
39
|
+
"@types/hast": "3.0.4",
|
|
40
|
+
"@types/mdast": "^4.0.4",
|
|
41
|
+
"@types/react": "19.3.0",
|
|
42
|
+
"@types/react-dom": "19.3.0",
|
|
43
|
+
"class-variance-authority": "0.7.1",
|
|
44
|
+
"cn": "0.4.0",
|
|
45
|
+
"katex": "0.19.0",
|
|
46
|
+
"lucide-react": "0.577.0",
|
|
47
|
+
"mermaid": "^12.1.0",
|
|
48
|
+
"react-medium-image-zoom": "^5.4.9",
|
|
49
|
+
"shiki": "4.5.0",
|
|
50
|
+
"tailwindcss": "4.3.3",
|
|
51
|
+
"textlane": "0.3.0",
|
|
52
|
+
"tw-animate-css": "1.4.0",
|
|
53
|
+
"yaml": "^2.9.1",
|
|
54
|
+
"zod": "4.6.6"
|
|
55
|
+
},
|
|
56
|
+
"peerDependencies": {
|
|
57
|
+
"react": "^19.0.0",
|
|
58
|
+
"react-dom": "^19.0.0"
|
|
59
|
+
},
|
|
60
|
+
"engines": {
|
|
61
|
+
"node": "^24.11.0"
|
|
62
|
+
},
|
|
63
|
+
"scripts": {
|
|
64
|
+
"build": "tsgo --project tsconfig.build.json"
|
|
65
|
+
}
|
|
6
66
|
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { flattenToc } from "../../helpers/toc-outline.ts"
|
|
2
|
+
import type { MarkdownPlugins } from "../../models/plugins.ts"
|
|
3
|
+
import { TWOSLASH_FENCE } from "../../plugins/twoslash.ts"
|
|
4
|
+
import { createProcessor } from "../processor/create.ts"
|
|
5
|
+
|
|
6
|
+
/** How Markdown compiles: the code themes, plugins, raw HTML and image URLs. */
|
|
7
|
+
export interface MarkdownOptions {
|
|
8
|
+
codeThemeLight?: string
|
|
9
|
+
codeThemeDark?: string
|
|
10
|
+
plugins?: MarkdownPlugins
|
|
11
|
+
allowDangerousHtml?: boolean
|
|
12
|
+
root?: string
|
|
13
|
+
base?: string
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/** Internal: compile a Markdown or MDX body (no frontmatter) into code and its outline.
|
|
17
|
+
* `program` is an ES module, `function-body` the body `new Function` evaluates. */
|
|
18
|
+
export async function compileMarkdown(props: {
|
|
19
|
+
content: string
|
|
20
|
+
filePath: string
|
|
21
|
+
format: "md" | "mdx"
|
|
22
|
+
outputFormat: "program" | "function-body"
|
|
23
|
+
options: MarkdownOptions
|
|
24
|
+
}) {
|
|
25
|
+
if (props.format === "mdx" && props.options.allowDangerousHtml === false) {
|
|
26
|
+
throw new Error(
|
|
27
|
+
`${props.filePath}: MDX runs code, which allowDangerousHtml: false forbids`,
|
|
28
|
+
)
|
|
29
|
+
}
|
|
30
|
+
const twoslash = TWOSLASH_FENCE.test(props.content)
|
|
31
|
+
const processor = readProcessor(
|
|
32
|
+
props.options,
|
|
33
|
+
props.format,
|
|
34
|
+
props.outputFormat,
|
|
35
|
+
twoslash,
|
|
36
|
+
)
|
|
37
|
+
const file = await processor.process({ value: props.content, path: props.filePath })
|
|
38
|
+
return { code: String(file.value), toc: flattenToc(file.data.toc) }
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** A file's format: its frontmatter `format` when set, else `.mdx` is MDX. */
|
|
42
|
+
export function detectMarkdownFormat(props: { filePath: string; format?: unknown }) {
|
|
43
|
+
if (props.format === "md" || props.format === "mdx") return props.format
|
|
44
|
+
return props.filePath.endsWith(".mdx") ? "mdx" : "md"
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// A frozen processor runs any number of files, so each variant is built once per options
|
|
48
|
+
const processors = new WeakMap<
|
|
49
|
+
MarkdownOptions,
|
|
50
|
+
Map<string, ReturnType<typeof createProcessor>>
|
|
51
|
+
>()
|
|
52
|
+
|
|
53
|
+
function readProcessor(
|
|
54
|
+
options: MarkdownOptions,
|
|
55
|
+
format: "md" | "mdx",
|
|
56
|
+
outputFormat: "program" | "function-body",
|
|
57
|
+
twoslash: boolean,
|
|
58
|
+
) {
|
|
59
|
+
let variants = processors.get(options)
|
|
60
|
+
if (!variants) {
|
|
61
|
+
variants = new Map()
|
|
62
|
+
processors.set(options, variants)
|
|
63
|
+
}
|
|
64
|
+
const key = `${format}:${outputFormat}:${twoslash}`
|
|
65
|
+
let processor = variants.get(key)
|
|
66
|
+
if (!processor) {
|
|
67
|
+
processor = createProcessor({
|
|
68
|
+
format,
|
|
69
|
+
twoslash,
|
|
70
|
+
outputFormat,
|
|
71
|
+
allowDangerousHtml: options.allowDangerousHtml ?? true,
|
|
72
|
+
// Livemark's own defaults in models/config.ts
|
|
73
|
+
codeThemeLight: options.codeThemeLight ?? "catppuccin-latte",
|
|
74
|
+
codeThemeDark: options.codeThemeDark ?? "catppuccin-mocha",
|
|
75
|
+
plugins: options.plugins,
|
|
76
|
+
root: options.root,
|
|
77
|
+
base: options.base,
|
|
78
|
+
})
|
|
79
|
+
variants.set(key, processor)
|
|
80
|
+
}
|
|
81
|
+
return processor
|
|
82
|
+
}
|