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);