1- import React , { useEffect , useMemo , useRef , useState } from 'react' ;
1+ import React , {
2+ useCallback ,
3+ useEffect ,
4+ useMemo ,
5+ useRef ,
6+ useState ,
7+ } from 'react' ;
28import { CheckOutlined , CopyOutlined } from '@ant-design/icons' ;
39import { useMemoizedFn } from '@utils/hooks/useMemoizedFn' ;
410import cls from 'classnames' ;
5- import render_math_in_element from 'katex/contrib/auto-render' ;
611
712import { sanitize } from './sanitize' ;
813import {
@@ -13,7 +18,6 @@ import {
1318 renderMermaid ,
1419} from './utils' ;
1520
16- import 'katex/dist/katex.min.css' ;
1721import './markdown.less' ;
1822
1923function escapeRegExp ( string : string ) : string {
@@ -59,6 +63,8 @@ const defaultLatexDelimiters = [
5963 { left : '\\[' , right : '\\]' , display : true } ,
6064] ;
6165
66+ let katexLoaded = false ;
67+
6268export const Markdown : React . FC < MarkdownProps > = ( {
6369 value : message ,
6470 headerLinks : header_links ,
@@ -89,6 +95,19 @@ export const Markdown: React.FC<MarkdownProps> = ({
8995 } ) ;
9096 } , [ header_links , latex_delimiters , line_breaks ] ) ;
9197
98+ const hasMathSyntax = useCallback (
99+ ( text : string ) => {
100+ if ( ! latex_delimiters || latex_delimiters . length === 0 ) {
101+ return false ;
102+ }
103+ return latex_delimiters . some (
104+ ( delimiter ) =>
105+ text . includes ( delimiter . left ) && text . includes ( delimiter . right )
106+ ) ;
107+ } ,
108+ [ latex_delimiters ]
109+ ) ;
110+
92111 const process_message = useMemoizedFn ( ( value : string ) => {
93112 let parsedValue = value ;
94113
@@ -128,12 +147,28 @@ export const Markdown: React.FC<MarkdownProps> = ({
128147 await renderMermaid ( el , themeMode ) ;
129148 }
130149
131- if ( el && latex_delimiters && latex_delimiters . length > 0 && value ) {
132- const containsDelimiter = latex_delimiters . some (
133- ( delimiter ) =>
134- value . includes ( delimiter . left ) && value . includes ( delimiter . right )
135- ) ;
136- if ( containsDelimiter ) {
150+ if (
151+ el &&
152+ latex_delimiters &&
153+ latex_delimiters . length > 0 &&
154+ value &&
155+ hasMathSyntax ( value )
156+ ) {
157+ if ( ! katexLoaded ) {
158+ await Promise . all ( [
159+ import ( 'katex/dist/katex.min.css' ) ,
160+ import ( 'katex/contrib/auto-render' ) ,
161+ ] ) . then ( ( [ , { default : render_math_in_element } ] ) => {
162+ katexLoaded = true ;
163+ render_math_in_element ( el , {
164+ delimiters : latex_delimiters ,
165+ throwOnError : false ,
166+ } ) ;
167+ } ) ;
168+ } else {
169+ const { default : render_math_in_element } = await import (
170+ 'katex/contrib/auto-render'
171+ ) ;
137172 render_math_in_element ( el , {
138173 delimiters : latex_delimiters ,
139174 throwOnError : false ,
0 commit comments