summaryrefslogtreecommitdiffhomepage
path: root/packages/app/src/context/marked.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'packages/app/src/context/marked.tsx')
-rw-r--r--packages/app/src/context/marked.tsx40
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
+}