Skip to content

Commit ca202e9

Browse files
committed
feat: MDXRenderer의 표 지원 추가
1 parent 51b5248 commit ca202e9

File tree

1 file changed

+13
-2
lines changed
  • packages/common/src/components

1 file changed

+13
-2
lines changed

packages/common/src/components/mdx.tsx

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,11 @@ import * as R from "remeda";
44

55
import { evaluate } from "@mdx-js/mdx";
66
import * as provider from "@mdx-js/react";
7-
import { CircularProgress } from "@mui/material";
7+
import { CircularProgress, Table, TableBody, TableCell, TableContainer, TableFooter, TableHead, TableRow } from "@mui/material";
88
import { ErrorBoundary } from "@suspensive/react";
99
import type { MDXComponents } from "mdx/types";
1010
import muiComponents from 'mui-mdx-components';
11+
import remarkGfm from 'remark-gfm';
1112

1213
import Hooks from "../hooks";
1314
import { ErrorFallback } from "./error_handler";
@@ -24,6 +25,13 @@ const CustomMDXComponents: MDXComponents = {
2425
'ul': (props) => <ul {...props} />,
2526
'ol': (props) => <ol {...props} />,
2627
'li': (props) => <li {...props} />,
28+
'table': (props) => <TableContainer><Table {...props} /></TableContainer>,
29+
'thead': (props) => <TableHead {...props} />,
30+
'tbody': (props) => <TableBody {...props} />,
31+
'tfoot': (props) => <TableFooter {...props} />, // MDX에서는 <tfoot>을 사용하지 않지만, 호환성을 위해 추가합니다.
32+
'tr': (props) => <TableRow {...props} />,
33+
'th': (props) => <TableCell {...props} />,
34+
'td': (props) => <TableCell {...props} />,
2735
}
2836

2937
const lineFormatterForMDX = (line: string) => {
@@ -35,6 +43,9 @@ const lineFormatterForMDX = (line: string) => {
3543
// 그러나 \n\n으로 변환할 경우, 다음 단계에서 <br />로 변환되므로, import문 다음에 공백이 있는 줄을 넣어서 <br />로 변환되지 않도록 합니다.
3644
if (trimmedLine.startsWith("import")) return `${trimmedLine}\n \n`;
3745

46+
// Table인 경우, 뒤에 공백을 추가하지 않습니다.
47+
if (trimmedLine.startsWith("|") && trimmedLine.endsWith("|")) return `${trimmedLine}\n`;
48+
3849
return `${trimmedLine} \n`;
3950
}
4051

@@ -55,7 +66,7 @@ export const MDXRenderer: React.FC<{ text: string; resetKey?: number }> = ({ tex
5566
// 원래 MDX는 각 줄의 마지막에 공백 2개가 있어야 줄바꿈이 되고, 또 연속 줄바꿈은 무시되지만,
5667
// 편의성을 위해 렌더러 단에서 공백 2개를 추가하고 연속 줄바꿈을 <br />로 변환합니다.
5768
const processedText = text.split("\n").map(lineFormatterForMDX).join("").replaceAll("\n\n", "\n<br />\n");
58-
const { default: RenderResult } = await evaluate(processedText, { ...runtime, ...provider, baseUrl });
69+
const { default: RenderResult } = await evaluate(processedText, { ...runtime, ...provider, baseUrl, remarkPlugins: [remarkGfm] });
5970
setRenderResult(<RenderResult components={muiComponents({ overrides: { ...CustomMDXComponents, ...(mdxComponents || {}) } })} />);
6071
} catch (error) {
6172
setRenderResult(<ErrorFallback error={error as Error} reset={setRandomResetKey} />);

0 commit comments

Comments
 (0)