import type { Components } from 'react-markdown'
import ReactMarkdown from 'react-markdown'
import remarkGfm from 'remark-gfm'
import remarkMath from 'remark-math'
import rehypeKatex from 'rehype-katex'
import { cn } from '@/lib/utils'
import { Scrollbar } from '../basic/scrollbar'
export interface MarkdownBodyProps {
children: string
className?: string
}
const markdownComponents: Components = {
p: ({ children }) => (
{children}
),
h1: ({ children }) => (
{children}
),
h2: ({ children }) => (
{children}
),
h3: ({ children }) => (
{children}
),
h4: ({ children }) => (
{children}
),
h5: ({ children }) => (
{children}
),
h6: ({ children }) => (
{children}
),
blockquote: ({ children }) => (
{children}
),
ul: ({ className, children }) => (
li]:mt-2',
String(className ?? '').includes('contains-task-list') ? 'list-none' : 'list-disc'
)}
>
{children}
),
ol: ({ children }) => (
{children}
),
li: ({ className, children }) => (
input]:mt-0.5 [&>input]:shrink-0'
)}
>
{children}
),
pre: ({ children }) => (
{children}
),
code: ({ className, children, ...props }) => {
const isBlock = typeof className === 'string' && className.startsWith('language-')
if (!isBlock) {
return (
{children}
)
}
return (
{children}
)
},
table: ({ children }) => (
),
thead: ({ children }) => (
{children}
),
tbody: ({ children }) => (
{children}
),
tr: ({ children }) => {children}
,
th: ({ children }) => (
{children} |
),
td: ({ children }) => {children} | ,
a: ({ href, children }) => (
{children}
),
hr: () =>
,
strong: ({ children }) => {children},
em: ({ children }) => {children},
}
export function MarkdownBody({ children, className }: MarkdownBodyProps) {
return (
{children}
)
}
MarkdownBody.displayName = 'MarkdownBody'