feat: support Latex (#5001)

Co-authored-by: crazywoola <100913391+crazywoola@users.noreply.github.com>
This commit is contained in:
Nam Vu 2024-06-18 09:43:47 +07:00 committed by GitHub
parent c7641be093
commit 3828d4cd22
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -39,6 +39,11 @@ const getCorrectCapitalizationLanguageName = (language: string) => {
return language.charAt(0).toUpperCase() + language.substring(1) return language.charAt(0).toUpperCase() + language.substring(1)
} }
const preprocessLaTeX = (content: string) =>
content.replace(/\\\[(.*?)\\\]/gs, (_, equation) => `$$${equation}$$`)
.replace(/\\\((.*?)\\\)/gs, (_, equation) => `$${equation}$`)
export function PreCode(props: { children: any }) { export function PreCode(props: { children: any }) {
const ref = useRef<HTMLPreElement>(null) const ref = useRef<HTMLPreElement>(null)
@ -82,12 +87,13 @@ const useLazyLoad = (ref: RefObject<Element>): boolean => {
export function Markdown(props: { content: string; className?: string }) { export function Markdown(props: { content: string; className?: string }) {
const [isSVG, setIsSVG] = useState(false) const [isSVG, setIsSVG] = useState(false)
const latexContent = preprocessLaTeX(props.content)
return ( return (
<div className={cn(props.className, 'markdown-body')}> <div className={cn(props.className, 'markdown-body')}>
<ReactMarkdown <ReactMarkdown
remarkPlugins={[[RemarkMath, { singleDollarTextMath: false }], RemarkGfm, RemarkBreaks]} remarkPlugins={[[RemarkMath, { singleDollarTextMath: false }], RemarkGfm, RemarkBreaks]}
rehypePlugins={[ rehypePlugins={[
RehypeKatex, RehypeKatex as any,
]} ]}
components={{ components={{
code({ inline, className, children, ...props }) { code({ inline, className, children, ...props }) {
@ -179,7 +185,7 @@ export function Markdown(props: { content: string; className?: string }) {
linkTarget='_blank' linkTarget='_blank'
> >
{/* Markdown detect has problem. */} {/* Markdown detect has problem. */}
{props.content} {latexContent}
</ReactMarkdown> </ReactMarkdown>
</div> </div>
) )