diff --git a/src/lib/components/chat/Messages/CodeBlock.svelte b/src/lib/components/chat/Messages/CodeBlock.svelte index 10465eee27..e196aa0f3d 100644 --- a/src/lib/components/chat/Messages/CodeBlock.svelte +++ b/src/lib/components/chat/Messages/CodeBlock.svelte @@ -6,7 +6,12 @@ import PyodideWorker from '$lib/workers/pyodide.worker?worker'; import { executeCode } from '$lib/apis/utils'; - import { copyToClipboard, renderMermaidDiagram, renderVegaVisualization } from '$lib/utils'; + import { + copyToClipboard, + initMermaid, + renderMermaidDiagram, + renderVegaVisualization + } from '$lib/utils'; import 'highlight.js/styles/github-dark.min.css'; @@ -323,11 +328,19 @@ }; }; + let mermaid = null; + const renderMermaid = async (code) => { + if (!mermaid) { + mermaid = await initMermaid(); + } + return await renderMermaidDiagram(mermaid, code); + }; + const render = async () => { onUpdate(token); if (lang === 'mermaid' && (token?.raw ?? '').slice(-4).includes('```')) { try { - mermaidHtml = await renderMermaidDiagram(code); + mermaidHtml = await renderMermaid(code); } catch (error) { console.error('Failed to render mermaid diagram:', error); const errorMsg = error instanceof Error ? error.message : String(error); diff --git a/src/lib/utils/index.ts b/src/lib/utils/index.ts index f4818f340a..5edec79bb8 100644 --- a/src/lib/utils/index.ts +++ b/src/lib/utils/index.ts @@ -1593,13 +1593,17 @@ export const decodeString = (str: string) => { } }; -export const renderMermaidDiagram = async (code: string) => { +export const initMermaid = async () => { const { default: mermaid } = await import('mermaid'); mermaid.initialize({ startOnLoad: false, // Should be false when using render API theme: document.documentElement.classList.contains('dark') ? 'dark' : 'default', securityLevel: 'loose' }); + return mermaid; +}; + +export const renderMermaidDiagram = async (mermaid, code: string) => { const parseResult = await mermaid.parse(code, { suppressErrors: false }); if (parseResult) { const { svg } = await mermaid.render(`mermaid-${uuidv4()}`, code);