1
+ import React from 'react' ;
2
+ import { FC , PropsWithChildren , useRef } from 'react' ;
1
3
import MarkdownPreview from '@uiw/react-markdown-preview' ;
2
- import { getMetaId , isMeta , getURLParameters } from 'markdown-react-code-preview-loader' ;
4
+ import { getMetaId , getURLParameters , CodeBlockData } from 'markdown-react-code-preview-loader' ;
5
+
3
6
import { Root , Element , RootContent } from 'hast' ;
4
7
import { Loader } from 'uiw' ;
5
8
import CodeLayout from 'react-code-preview-layout' ;
6
9
import useMdData from '../../components/useMdData' ;
7
10
11
+ const Preview = CodeLayout . Preview ;
12
+ const Code = CodeLayout . Code ;
13
+ const Toolbar = CodeLayout . Toolbar ;
14
+
15
+ interface CodePreviewProps {
16
+ mdData ?: CodeBlockData ;
17
+ 'data-meta' ?: string ;
18
+ }
19
+
20
+ const CodePreview : FC < PropsWithChildren < CodePreviewProps > > = ( props ) => {
21
+ const $dom = useRef < HTMLDivElement > ( null ) ;
22
+ // @ts -ignore
23
+ const { mdData, node, 'data-meta' : meta , ...rest } = props ;
24
+ // @ts -ignore
25
+ const line = node ?. position ?. start . line ;
26
+ const metaId = getMetaId ( meta ) || String ( line ) ;
27
+ const Child = mdData ?. components [ `${ metaId } ` ] ;
28
+ if ( metaId && typeof Child === 'function' ) {
29
+ const code = mdData ?. data [ metaId ] . value || '' ;
30
+ const param = getURLParameters ( meta || '' ) ;
31
+ return (
32
+ < CodeLayout ref = { $dom } >
33
+ < Preview >
34
+ < Child />
35
+ </ Preview >
36
+ < Toolbar text = { code } > { param . title || 'Example' } </ Toolbar >
37
+ < Code >
38
+ < pre { ...rest } />
39
+ </ Code >
40
+ </ CodeLayout >
41
+ ) ;
42
+ }
43
+ return < code { ...rest } /> ;
44
+ } ;
45
+
8
46
export function ExamplePage ( ) {
9
47
const { mdData, loading } = useMdData ( ( path ) => import ( `./App${ path } .md` ) ) ;
10
48
return (
@@ -22,30 +60,7 @@ export function ExamplePage() {
22
60
}
23
61
} }
24
62
components = { {
25
- code : ( { inline, node, ...props } ) => {
26
- const { 'data-meta' : meta , ...rest } = props as any ;
27
- if ( inline || ! isMeta ( meta ) ) {
28
- return < code { ...props } /> ;
29
- }
30
- const line = node . position ?. start . line ;
31
- const metaId = getMetaId ( meta ) || String ( line ) ;
32
- const Child = mdData . components [ `${ metaId } ` ] ;
33
- if ( metaId && typeof Child === 'function' ) {
34
- const code = mdData . data [ metaId ] . value || '' ;
35
- const param = getURLParameters ( meta ) ;
36
- return (
37
- < CodeLayout
38
- disableCheckered
39
- toolbar = { param . title || 'Example Preview' }
40
- code = { < code { ...rest } /> }
41
- text = { code }
42
- >
43
- < Child />
44
- </ CodeLayout >
45
- ) ;
46
- }
47
- return < code { ...rest } /> ;
48
- } ,
63
+ code : ( props ) => < CodePreview { ...props } mdData = { mdData } /> ,
49
64
} }
50
65
/>
51
66
</ Loader >
0 commit comments