@@ -60,21 +60,49 @@ export function Mermaid(props: { code: string }) {
6060 ) ;
6161}
6262
63+ export function HTMLPreview ( props : { code : string } ) {
64+ const ref = useRef < HTMLDivElement > ( null ) ;
65+
66+ return (
67+ < div
68+ className = "no-dark html"
69+ style = { {
70+ cursor : "pointer" ,
71+ overflow : "auto" ,
72+ } }
73+ ref = { ref }
74+ onClick = { ( ) => console . log ( "click" ) }
75+ >
76+ < iframe
77+ frameBorder = { 0 }
78+ sandbox = "allow-scripts"
79+ style = { { width : "100%" , height : 400 } }
80+ srcdoc = { props . code }
81+ > </ iframe >
82+ </ div >
83+ ) ;
84+ }
85+
6386export function PreCode ( props : { children : any } ) {
6487 const ref = useRef < HTMLPreElement > ( null ) ;
6588 const refText = ref . current ?. innerText ;
6689 const [ mermaidCode , setMermaidCode ] = useState ( "" ) ;
90+ const [ htmlCode , setHtmlCode ] = useState ( "" ) ;
6791
68- const renderMermaid = useDebouncedCallback ( ( ) => {
92+ const renderArtifacts = useDebouncedCallback ( ( ) => {
6993 if ( ! ref . current ) return ;
7094 const mermaidDom = ref . current . querySelector ( "code.language-mermaid" ) ;
7195 if ( mermaidDom ) {
7296 setMermaidCode ( ( mermaidDom as HTMLElement ) . innerText ) ;
7397 }
98+ const htmlDom = ref . current . querySelector ( "code.language-html" ) ;
99+ if ( htmlDom ) {
100+ setHtmlCode ( ( htmlDom as HTMLElement ) . innerText ) ;
101+ }
74102 } , 600 ) ;
75103
76104 useEffect ( ( ) => {
77- setTimeout ( renderMermaid , 1 ) ;
105+ setTimeout ( renderArtifacts , 1 ) ;
78106 // eslint-disable-next-line react-hooks/exhaustive-deps
79107 } , [ refText ] ) ;
80108
@@ -83,6 +111,7 @@ export function PreCode(props: { children: any }) {
83111 { mermaidCode . length > 0 && (
84112 < Mermaid code = { mermaidCode } key = { mermaidCode } />
85113 ) }
114+ { htmlCode . length > 0 && < HTMLPreview code = { htmlCode } key = { htmlCode } /> }
86115 < pre ref = { ref } >
87116 < span
88117 className = "copy-code-button"
0 commit comments