diff --git a/tools/server/public/index.html.gz b/tools/server/public/index.html.gz index 5026edcebed37..c5eacef7fb508 100644 Binary files a/tools/server/public/index.html.gz and b/tools/server/public/index.html.gz differ diff --git a/tools/server/webui/package-lock.json b/tools/server/webui/package-lock.json index c300ecaa77562..6f2a49337a27f 100644 --- a/tools/server/webui/package-lock.json +++ b/tools/server/webui/package-lock.json @@ -9,6 +9,7 @@ "version": "1.0.0", "dependencies": { "highlight.js": "^11.11.1", + "katex": "^0.16.23", "mode-watcher": "^1.1.0", "pdfjs-dist": "^5.4.54", "rehype-highlight": "^7.0.2", @@ -3250,7 +3251,6 @@ "version": "8.3.0", "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true, "license": "MIT", "engines": { "node": ">= 12" @@ -4519,10 +4519,9 @@ } }, "node_modules/katex": { - "version": "0.16.22", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.22.tgz", - "integrity": "sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg==", - "dev": true, + "version": "0.16.23", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.23.tgz", + "integrity": "sha512-7VlC1hsEEolL9xNO05v9VjrvWZePkCVBJqj8ruICxYjZfHaHbaU53AlP+PODyFIXEnaEIEWi3wJy7FPZ95JAVg==", "funding": [ "https://opencollective.com/katex", "https://github.com/sponsors/katex" diff --git a/tools/server/webui/package.json b/tools/server/webui/package.json index 7bf21bf57cb61..07a7077146cb3 100644 --- a/tools/server/webui/package.json +++ b/tools/server/webui/package.json @@ -76,6 +76,7 @@ }, "dependencies": { "highlight.js": "^11.11.1", + "katex": "^0.16.23", "mode-watcher": "^1.1.0", "pdfjs-dist": "^5.4.54", "rehype-highlight": "^7.0.2", diff --git a/tools/server/webui/src/lib/components/app/misc/MarkdownContent.svelte b/tools/server/webui/src/lib/components/app/misc/MarkdownContent.svelte index 45b9c6debbbd5..76a3b2b0d7dca 100644 --- a/tools/server/webui/src/lib/components/app/misc/MarkdownContent.svelte +++ b/tools/server/webui/src/lib/components/app/misc/MarkdownContent.svelte @@ -70,6 +70,27 @@ return tempDiv.innerHTML; } + function preprocessLatexDelimiters(text: string): string { + // Handle escaped bracket delimiters \[...\] + text = text.replace(/\\\[([\s\S]*?)\\\]/g, (match, content) => `$$${content}$$`); + + // Handle standalone bracket delimiters [...] + text = text.replace( + /(^|\n)\s*\[\s*([\s\S]*?)\s*\](\s*(?:\n|$))/gm, + (match, prefix, content, suffix) => { + const mathSymbols = /[=+\-*/^_{}\\()αβγδεζηθικλμνξοπρστυφχψω∑∫∂∇±×÷≤≥≠≈∞]/; + + if (mathSymbols.test(content)) { + return `${prefix}$$${content}$$${suffix}`; + } + + return match; + } + ); + + return text; + } + function enhanceCodeBlocks(html: string): string { const tempDiv = document.createElement('div'); tempDiv.innerHTML = html; @@ -132,7 +153,10 @@ async function processMarkdown(text: string): Promise { try { - const result = await processor().process(text); + // Preprocess LaTeX-style bracket delimiters before markdown processing + const preprocessedText = preprocessLatexDelimiters(text); + + const result = await processor().process(preprocessedText); const html = String(result); const enhancedLinks = enhanceLinks(html);