diff --git a/services/web/frontend/js/features/chat/components/message-content.tsx b/services/web/frontend/js/features/chat/components/message-content.tsx index 58a5610abe..c76eaaf511 100644 --- a/services/web/frontend/js/features/chat/components/message-content.tsx +++ b/services/web/frontend/js/features/chat/components/message-content.tsx @@ -1,9 +1,9 @@ import { useRef, useEffect, type FC } from 'react' // @ts-ignore import Linkify from 'react-linkify' -import { loadMathJax } from '../../../../../modules/source-editor/frontend/js/utils/mathjax' import useIsMounted from '../../../shared/hooks/use-is-mounted' import { configureMathJax } from '../../mathjax/configure' +import { loadMathJax } from '../../mathjax/load-mathjax' const MessageContent: FC<{ content: string }> = ({ content }) => { const root = useRef(null) diff --git a/services/web/frontend/js/features/mathjax/load-mathjax.ts b/services/web/frontend/js/features/mathjax/load-mathjax.ts new file mode 100644 index 0000000000..81162f6683 --- /dev/null +++ b/services/web/frontend/js/features/mathjax/load-mathjax.ts @@ -0,0 +1,55 @@ +import getMeta from '../../utils/meta' + +let mathJaxPromise: Promise + +export const loadMathJax = async () => { + if (!mathJaxPromise) { + mathJaxPromise = new Promise((resolve, reject) => { + // https://docs.mathjax.org/en/v3.2-latest/upgrading/v2.html + window.MathJax = { + // https://docs.mathjax.org/en/latest/options/input/tex.html#the-configuration-block + tex: { + inlineMath: [ + ['\\(', '\\)'], + ['$', '$'], + ], + displayMath: [ + ['\\[', '\\]'], + ['$$', '$$'], + ], + packages: { + '[-]': [ + 'html', // avoid creating HTML elements/attributes + 'require', // prevent loading disabled packages + ], + }, + processEscapes: true, + processEnvironments: true, + }, + loader: { + load: [ + 'ui/safe', // https://docs.mathjax.org/en/latest/options/safe.html + ], + }, + options: { + enableMenu: false, // https://docs.mathjax.org/en/latest/options/menu.html + }, + startup: { + typeset: false, + }, + } + + const script = document.createElement('script') + script.src = getMeta('ol-mathJax3Path') + script.addEventListener('load', async () => { + await window.MathJax.startup.promise + document.head.appendChild(window.MathJax.svgStylesheet()) + resolve(window.MathJax) + }) + script.addEventListener('error', reject) + document.head.append(script) + }) + } + + return mathJaxPromise +}