11<script setup lang="ts">
2- import type { Highlighter } from ' shiki'
2+ import type { Highlighter , ThemeInput } from ' shiki'
33import { Icon } from ' @iconify/vue'
44import katex from ' katex'
5- import { disposeHighlighter , registerHighlight } from ' ../../../src/components/MarkdownCodeBlockNode/highlight'
5+ import { defaultLanguages , registerHighlight } from ' stream-markdown'
6+ import { getMarkdown } from ' ../../../packages/markdown-parser'
67import { languageMap } from ' ../../../src/utils'
7- import { getMarkdown } from ' ../../../src/utils/markdown/getMarkdown'
88import { streamContent } from ' ../const/markdown'
99// 每隔 10 毫秒输出一部分内容
1010const content = ref <string >(' ' )
@@ -25,7 +25,8 @@ useInterval(16, {
2525
2626const highlighter = ref <Highlighter | null >(null )
2727const selectedTheme = ref (' vitesse-dark' )
28- const md = getMarkdown ({
28+
29+ const md = getMarkdown (' hi' , {
2930 markdownItOptions: {
3031 highlight : (str : string , lang : string ) => {
3132 const _lang = lang .split (' :' )[0 ] || ' plaintext'
@@ -38,17 +39,26 @@ const md = getMarkdown({
3839 },
3940})
4041md .renderer .rules .math_inline = (tokens : any [], index : number ) => {
41- const rendered = katex .renderToString (tokens [index ].content , { throwOnError: false })
42+ const rendered = katex .renderToString (tokens [index ].content , { throwOnError: false , strict: ' ignore ' })
4243 if (rendered )
4344 return ` <span class="math-inline">${rendered }</span> `
4445 return ` <span class="math-inline">${tokens [index ].content }</span> `
4546}
4647md .renderer .rules .math_block = (tokens : any [], index : number ) => {
47- const rendered = katex .renderToString (tokens [index ].content , { throwOnError: false , displayMode: true })
48+ const rendered = katex .renderToString (tokens [index ].content , { throwOnError: false , displayMode: true , strict: ' ignore ' })
4849 if (rendered )
4950 return ` <div class="math-block my-4">${rendered }</div> `
5051 return ` <div class="math-block my-4">${tokens [index ].content }</div> `
5152}
53+ md .renderer .rules .fence = (tokens , idx ) => {
54+ const token = tokens [idx ]
55+ const langInfo = token .info ? token .info .trim () : ' '
56+ const lang = langInfo .split (' :' )[0 ] || ' plaintext'
57+ if (highlighter .value ) {
58+ return highlighter .value .codeToHtml (token .content , { lang: defaultLanguages .includes (lang ) ? lang : ' plaintext' , theme: selectedTheme .value })
59+ }
60+ return ` <pre><code class="language-${lang }">${token .content }</code></pre> `
61+ }
5262
5363const html = computed (() => md .render (content .value ))
5464// 主题切换
@@ -120,10 +130,12 @@ const themes = [
120130
121131if (typeof window !== ' undefined' ) {
122132 watch (() => selectedTheme .value , async (newThemes ) => {
123- disposeHighlighter ()
124- highlighter .value = await registerHighlight ({
125- themes: [newThemes ] as any ,
126- })
133+ if (! highlighter .value ) {
134+ highlighter .value = await registerHighlight ({
135+ themes: themes as ThemeInput [],
136+ })
137+ }
138+ highlighter .value ?.loadTheme (newThemes as ThemeInput )
127139 }, { immediate: true })
128140}
129141// 格式化主题名称显示
0 commit comments