import ReactMarkdown from 'react-markdown' import 'katex/dist/katex.min.css' import RemarkMath from 'remark-math' import RemarkBreaks from 'remark-breaks' import RehypeKatex from 'rehype-katex' import RemarkGfm from 'remark-gfm' import RehypeRaw from 'rehype-raw' import { flow } from 'lodash-es' import cn from '@/utils/classnames' import { customUrlTransform, preprocessLaTeX, preprocessThinkTag } from './markdown-utils' import { AudioBlock, CodeBlock, Img, Link, MarkdownButton, MarkdownForm, Paragraph, ScriptBlock, ThinkBlock, VideoBlock, } from '@/app/components/base/markdown-blocks' /** * @fileoverview Main Markdown rendering component. * This file was refactored to extract individual block renderers and utility functions * into separate modules for better organization and maintainability as of [Date of refactor]. * Further refactoring candidates (custom block components not fitting general categories) * are noted in their respective files if applicable. */ export function Markdown(props: { content: string; className?: string; customDisallowedElements?: string[] }) { const latexContent = flow([ preprocessThinkTag, preprocessLaTeX, ])(props.content) return (
{ return (tree: any) => { const iterate = (node: any) => { if (node.type === 'element' && node.properties?.ref) delete node.properties.ref if (node.type === 'element' && !/^[a-z][a-z0-9]*$/i.test(node.tagName)) { node.type = 'text' node.value = `<${node.tagName}` } if (node.children) node.children.forEach(iterate) } tree.children.forEach(iterate) } }, ]} urlTransform={customUrlTransform} disallowedElements={['iframe', 'head', 'html', 'meta', 'link', 'style', 'body', ...(props.customDisallowedElements || [])]} components={{ code: CodeBlock, img: Img, video: VideoBlock, audio: AudioBlock, a: Link, p: Paragraph, button: MarkdownButton, form: MarkdownForm, script: ScriptBlock as any, details: ThinkBlock, }} > {/* Markdown detect has problem. */} {latexContent}
) }