| 1 | import MarkdownIt from "markdown-it"; |
| 2 | import { |
| 3 | createDarkmatterHighlighter, |
| 4 | THEME_NAME, |
| 5 | } from "../../scripts/shiki-setup.mjs"; |
| 6 | |
| 7 | export async function createMarkdownRenderer(): Promise<MarkdownIt> { |
| 8 | const highlighter = createDarkmatterHighlighter(); |
| 9 | |
| 10 | let md: MarkdownIt; |
| 11 | |
| 12 | md = new MarkdownIt({ |
| 13 | html: true, |
| 14 | linkify: true, |
| 15 | typographer: true, |
| 16 | highlight: (code, lang): string => { |
| 17 | const loaded = highlighter.getLoadedLanguages(); |
| 18 | const resolvedLang = |
| 19 | lang && loaded.includes(lang as never) ? lang : "text"; |
| 20 | try { |
| 21 | return highlighter.codeToHtml(code, { |
| 22 | lang: resolvedLang, |
| 23 | theme: THEME_NAME, |
| 24 | }); |
| 25 | } catch { |
| 26 | return `<pre><code>${md.utils.escapeHtml(code)}</code></pre>`; |
| 27 | } |
| 28 | }, |
| 29 | }); |
| 30 | |
| 31 | return md; |
| 32 | } |