@@ -180,6 +180,75 @@ export default function Demo() {
180
180
<!--rehype:ignore:start-->Ignored content<!--rehype:ignore:end-->
181
181
```
182
182
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
+
183
252
### Options Props
184
253
185
254
``` typescript
0 commit comments