|
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 RehypePrsim from "rehype-prism-plus"; |
|
import { useRef } from "react"; |
|
import { copyToClipboard } from "../utils"; |
|
|
|
export function PreCode(props: { children: any }) { |
|
const ref = useRef<HTMLPreElement>(null); |
|
|
|
return ( |
|
<pre ref={ref}> |
|
<span |
|
className="copy-code-button" |
|
onClick={() => { |
|
if (ref.current) { |
|
const code = ref.current.innerText; |
|
copyToClipboard(code); |
|
} |
|
}} |
|
></span> |
|
{props.children} |
|
</pre> |
|
); |
|
} |
|
|
|
export function Markdown(props: { content: string }) { |
|
return ( |
|
<ReactMarkdown |
|
remarkPlugins={[RemarkMath, RemarkGfm, RemarkBreaks]} |
|
rehypePlugins={[RehypeKatex, [RehypePrsim, { ignoreMissing: true }]]} |
|
components={{ |
|
pre: PreCode, |
|
}} |
|
> |
|
{props.content} |
|
</ReactMarkdown> |
|
); |
|
} |
|
|