diff options
Diffstat (limited to 'packages/app/src/context/marked.tsx')
| -rw-r--r-- | packages/app/src/context/marked.tsx | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/packages/app/src/context/marked.tsx b/packages/app/src/context/marked.tsx new file mode 100644 index 000000000..33fea8db6 --- /dev/null +++ b/packages/app/src/context/marked.tsx @@ -0,0 +1,40 @@ +import { createContext, useContext, type ParentProps } from "solid-js" +import { useShiki } from "@/context" +import { marked } from "marked" +import markedShiki from "marked-shiki" +import type { BundledLanguage } from "shiki" + +function init(highlighter: ReturnType<typeof useShiki>) { + return marked.use( + markedShiki({ + async highlight(code, lang) { + if (!highlighter.getLoadedLanguages().includes(lang)) { + await highlighter.loadLanguage(lang as BundledLanguage) + } + return highlighter.codeToHtml(code, { + lang: lang || "text", + theme: "opencode", + tabindex: false, + }) + }, + }), + ) +} + +type MarkedContext = ReturnType<typeof init> + +const ctx = createContext<MarkedContext>() + +export function MarkedProvider(props: ParentProps) { + const highlighter = useShiki() + const value = init(highlighter) + return <ctx.Provider value={value}>{props.children}</ctx.Provider> +} + +export function useMarked() { + const value = useContext(ctx) + if (!value) { + throw new Error("useMarked must be used within a MarkedProvider") + } + return value +} |
