src/utils/markdown.ts 744 B raw
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
}