Skip to content

Commit 9b7b1f6

Browse files
committed
Helper function for rendering
1 parent 7821508 commit 9b7b1f6

File tree

1 file changed

+22
-20
lines changed

1 file changed

+22
-20
lines changed

src/lib/markdown.tsx

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,51 @@
1+
import React from "react";
2+
13
import { fromMarkdown } from "mdast-util-from-markdown";
24
import { CodeBlock } from "react-code-block";
35

46
export 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

Comments
 (0)