1+ import React from "react" ;
2+
13import { fromMarkdown } from "mdast-util-from-markdown" ;
24import { CodeBlock } from "react-code-block" ;
35
46export function Markdown ( { content } : { content : string } ) {
57 const tree = fromMarkdown ( content ) ;
68
9+ function renderChildren ( node : any ) : React . ReactNode | null {
10+ if ( ! node . children ) {
11+ return null ;
12+ }
13+ return node . children . map ( ( child : any , i : number ) => (
14+ < React . Fragment key = { i } > { renderNode ( child ) } </ React . Fragment >
15+ ) ) ;
16+ }
17+
718 function renderNode ( node : any ) : React . ReactNode {
819 switch ( node . type ) {
920 case "text" :
1021 return node . value ;
1122
23+ // Handles paragraph text.
1224 case "paragraph" :
13- return < p > { node . children . map ( renderNode ) } </ p > ;
25+ return < p > { renderChildren ( node ) } </ p > ;
1426
1527 // Handles headings #, ## and ###.
1628 case "heading" :
1729 switch ( node . depth ) {
1830 case 1 :
1931 return (
20- < h1 className = "text-3xl font-bold" >
21- { node . children . map ( renderNode ) }
22- </ h1 >
32+ < h1 className = "text-3xl font-bold" > { renderChildren ( node ) } </ h1 >
2333 ) ;
2434 case 2 :
2535 return (
26- < h2 className = "text-2xl font-semibold" >
27- { node . children . map ( renderNode ) }
28- </ h2 >
36+ < h2 className = "text-2xl font-semibold" > { renderChildren ( node ) } </ h2 >
2937 ) ;
3038 case 3 :
3139 return (
32- < h3 className = "text-xl font-medium" >
33- { node . children . map ( renderNode ) }
34- </ h3 >
40+ < h3 className = "text-xl font-medium" > { renderChildren ( node ) } </ h3 >
3541 ) ;
3642 default :
37- return (
38- < div className = "text-gray-700" >
39- { node . children . map ( renderNode ) }
40- </ div >
41- ) ;
43+ return < div className = "text-gray-700" > { renderChildren ( node ) } </ div > ;
4244 }
4345
4446 // Handles links in markdown [text](url).
4547 case "link" :
46- return < a href = { node . url } > { node . children . map ( renderNode ) } </ a > ;
48+ return < a href = { node . url } > { renderChildren ( node ) } </ a > ;
4749
4850 // Handles lists.
4951 case "list" : {
@@ -55,14 +57,15 @@ export function Markdown({ content }: { content: string }) {
5557 node . ordered && node . start ? { start : node . start } : { } ;
5658 return (
5759 < ListTag className = { cls } { ...startProps } >
58- { node . children . map ( renderNode ) }
60+ { renderChildren ( node ) }
5961 </ ListTag >
6062 ) ;
6163 }
6264 case "listItem" : {
63- return < li > { node . children . map ( renderNode ) } </ li > ;
65+ return < li > { renderChildren ( node ) } </ li > ;
6466 }
6567
68+ // Handles code blocks.
6669 case "code" :
6770 return (
6871 < div >
@@ -75,12 +78,11 @@ export function Markdown({ content }: { content: string }) {
7578 </ CodeBlock >
7679 </ div >
7780 ) ;
78-
7981 case "inlineCode" :
8082 return < p > { node . value } </ p > ;
8183
8284 default :
83- return node . children ?. map ( renderNode ) ;
85+ return renderChildren ( node ) ;
8486 }
8587 }
8688
0 commit comments