Skip to content

Commit 24171ce

Browse files
committed
website: add mermaid example. (#238)
1 parent d72e3d9 commit 24171ce

File tree

2 files changed

+70
-0
lines changed

2 files changed

+70
-0
lines changed

core/README.md

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,75 @@ export default function Demo() {
180180
<!--rehype:ignore:start-->Ignored content<!--rehype:ignore:end-->
181181
```
182182

183+
## Support Custom Mermaid Preview
184+
185+
```jsx mdx:preview?background=#fff
186+
import React, { useState, useRef, useId, useEffect, Fragment, useCallback } from "react";
187+
import MarkdownPreview from '@uiw/react-markdown-preview';
188+
import { getCodeString } from 'rehype-rewrite';
189+
import mermaid from "mermaid";
190+
191+
const randomid = () => parseInt(String(Math.random() * 1e15), 10).toString(36);
192+
const Code = ({ inline, children = [], className, ...props }) => {
193+
const demoid = useRef(`dome${randomid()}`);
194+
const [container, setContainer] = useState(null);
195+
const isMermaid = className && /^language-mermaid/.test(className.toLocaleLowerCase());
196+
const code = props.node && props.node.children ? getCodeString(props.node.children) : children[0] || '';
197+
198+
const reRender = async () => {
199+
if (container && isMermaid) {
200+
try {
201+
const str = await mermaid.render(demoid.current, code);
202+
container.innerHTML = str.svg;
203+
} catch (error) {
204+
container.innerHTML = error;
205+
}
206+
}
207+
}
208+
209+
useEffect(() => {
210+
reRender()
211+
}, [container, isMermaid, code, demoid]);
212+
213+
const refElement = useCallback((node) => {
214+
if (node !== null) {
215+
setContainer(node);
216+
}
217+
}, []);
218+
219+
if (isMermaid) {
220+
return (
221+
<Fragment>
222+
<code id={demoid.current} style={{ display: "none" }} />
223+
<code ref={refElement} data-name="mermaid" />
224+
</Fragment>
225+
);
226+
}
227+
return <code>{children}</code>;
228+
};
229+
230+
const source = `
231+
\`\`\`mermaid
232+
graph TD;
233+
A-->B;
234+
A-->C;
235+
B-->D;
236+
C-->D;
237+
\`\`\`
238+
`;
239+
240+
export default function Demo() {
241+
return (
242+
<MarkdownPreview
243+
source={source}
244+
components={{
245+
code: Code
246+
}}
247+
/>
248+
);
249+
}
250+
```
251+
183252
### Options Props
184253

185254
```typescript

website/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
"dependencies": {
1010
"@uiw/react-markdown-preview-example": "^1.5.5",
1111
"@uiw/react-shields": "^1.1.3",
12+
"mermaid": "^10.4.0",
1213
"react": "~18.2.0",
1314
"react-dom": "~18.2.0",
1415
"react-router-dom": "^6.8.1"

0 commit comments

Comments
 (0)