Skip to content

Commit 14ec50b

Browse files
committed
Support mermaid graphs
Signed-off-by: Nelo-T. Wallus <[email protected]> Signed-off-by: Nelo-T. Wallus <[email protected]>
1 parent 2df03a8 commit 14ec50b

File tree

5 files changed

+1599
-48
lines changed

5 files changed

+1599
-48
lines changed

.vitepress/components/Mermaid.vue

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<template>
2+
<div v-html="svg"></div>
3+
</template>
4+
5+
<script setup lang="ts">
6+
import { watchEffect, ref } from 'vue';
7+
import { useData } from 'vitepress'
8+
9+
import mermaid from 'mermaid'
10+
import type { MermaidConfig } from 'mermaid'
11+
12+
const {isDark} = useData()
13+
14+
const svg = ref<string>('')
15+
16+
const props = defineProps({
17+
graph: {
18+
type: String,
19+
required: true,
20+
},
21+
id: {
22+
type: String,
23+
required: true,
24+
},
25+
});
26+
27+
const render = async (id: string, code: string, config: MermaidConfig): Promise<string> => {
28+
mermaid.initialize(config)
29+
const {svg} = await mermaid.render(id, code)
30+
return svg
31+
}
32+
33+
watchEffect(async () => {
34+
const mermaidConfig: MermaidConfig = {
35+
securityLevel: 'loose',
36+
startOnLoad: false,
37+
theme: isDark.value ? 'dark' : 'default',
38+
};
39+
40+
svg.value = await render(props.id, props.graph, mermaidConfig);
41+
}, { immediate: true });
42+
</script>

.vitepress/config.mts

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,23 +8,42 @@ export default defineConfig({
88
// https://vitepress.dev/reference/default-theme-config
99
nav: [
1010
{ text: 'Home', link: '/' },
11-
// { text: 'Scenarios', link: '/scenarios' }
11+
{ text: 'Scenarios', link: '/scenarios' }
1212
],
1313

1414
outline: [2, 3, 4, 5],
1515

16-
sidebar: [
17-
{
18-
text: 'Examples',
19-
items: [
20-
{ text: 'Markdown Examples', link: '/markdown-examples' },
21-
{ text: 'Runtime API Examples', link: '/api-examples' }
22-
]
23-
}
24-
],
16+
sidebar: {
17+
'/scenarios': {
18+
test: 'Scenarios',
19+
items: [
20+
{ text: 'Provider to Consumer (P2C)', link: '/scenarios/provider-to-consumer' },
21+
],
22+
},
23+
},
2524

2625
socialLinks: [
2726
{ icon: 'github', link: 'https://github.com/platform-mesh' }
2827
]
29-
}
28+
},
29+
markdown: {
30+
config: md => {
31+
md.renderer.rules.fence = (tokens, index, options, env, slf) => {
32+
const token = tokens[index]
33+
if (token.info.trim() === 'mermaid') {
34+
const key = index
35+
return `
36+
<Suspense>
37+
<template #default>
38+
<Mermaid id="mermaid-${key}" graph="${token.content}"></Mermaid>
39+
</template>
40+
<template #fallback>
41+
Loading...
42+
</template>
43+
</Suspense>
44+
`
45+
}
46+
}
47+
}
48+
},
3049
})

.vitepress/theme/index.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import type { Theme } from 'vitepress'
2+
import DefaultTheme from 'vitepress/theme'
3+
4+
import Mermaid from '../components/Mermaid.vue'
5+
6+
export default {
7+
extends: DefaultTheme,
8+
enhanceApp({ app }) {
9+
app.component('Mermaid', Mermaid)
10+
}
11+
} satisfies Theme

0 commit comments

Comments
 (0)