| 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 SyntaxHighlighter from 'react-syntax-highlighter' | |
| import { atelierHeathLight } from 'react-syntax-highlighter/dist/esm/styles/hljs' | |
| export function Markdown(props: { content: string }) { | |
| return ( | |
| <div className="markdown-body"> | |
| <ReactMarkdown | |
| remarkPlugins={[RemarkMath, RemarkGfm, RemarkBreaks]} | |
| rehypePlugins={[ | |
| RehypeKatex, | |
| ]} | |
| components={{ | |
| code({ node, inline, className, children, ...props }) { | |
| const match = /language-(\w+)/.exec(className || '') | |
| return !inline && match | |
| ? ( | |
| <SyntaxHighlighter | |
| {...props} | |
| children={String(children).replace(/\n$/, '')} | |
| style={atelierHeathLight} | |
| language={match[1]} | |
| showLineNumbers | |
| PreTag="div" | |
| /> | |
| ) | |
| : ( | |
| <code {...props} className={className}> | |
| {children} | |
| </code> | |
| ) | |
| }, | |
| }} | |
| linkTarget={'_blank'} | |
| > | |
| {props.content} | |
| </ReactMarkdown> | |
| </div> | |
| ) | |
| } | |