import "katex/dist/katex.min.css"; import { FC, memo } from "react"; import ReactMarkdown, { Options } from "react-markdown"; import rehypeKatex from "rehype-katex"; import remarkGfm from "remark-gfm"; import remarkMath from "remark-math"; import { CodeBlock } from "./codeblock"; const MemoizedReactMarkdown: FC = memo( ReactMarkdown, (prevProps, nextProps) => prevProps.children === nextProps.children && prevProps.className === nextProps.className, ); const preprocessLaTeX = (content: string) => { // Replace block-level LaTeX delimiters \[ \] with $$ $$ const blockProcessedContent = content.replace( /\\\[([\s\S]*?)\\\]/g, (_, equation) => `$$${equation}$$`, ); // Replace inline LaTeX delimiters \( \) with $ $ const inlineProcessedContent = blockProcessedContent.replace( /\\\[([\s\S]*?)\\\]/g, (_, equation) => `$${equation}$`, ); return inlineProcessedContent; }; const preprocessMedia = (content: string) => { // Remove `sandbox:` from the beginning of the URL // to fix OpenAI's models issue appending `sandbox:` to the relative URL return content.replace(/(sandbox|attachment|snt):/g, ""); }; const preprocessContent = (content: string) => { return preprocessMedia(preprocessLaTeX(content)); }; export default function Markdown({ content }: { content: string }) { const processedContent = preprocessContent(content); return ( {children}

; }, code({ node, inline, className, children, ...props }) { if (children.length) { if (children[0] == "▍") { return ( ); } children[0] = (children[0] as string).replace("`▍`", "▍"); } const match = /language-(\w+)/.exec(className || ""); if (inline) { return ( {children} ); } return ( ); }, }} > {processedContent}
); }