Fix KaTeX AGAIN

This commit is contained in:
2025-06-15 15:19:50 +09:00
parent 6376f8f0e5
commit 98d5b468e1
3 changed files with 85 additions and 46 deletions

View File

@@ -31,6 +31,11 @@ code {
display: block; display: block;
} }
.katex-display {
margin: 2em 0;
max-width: 1000px;
}
.menu-list { .menu-list {
line-height: 1.6 !important; line-height: 1.6 !important;
} }

View File

@@ -4,16 +4,18 @@
import renderMathInElement from 'katex/contrib/auto-render' import renderMathInElement from 'katex/contrib/auto-render'
let renderedMath: string | undefined let renderedMath: string | undefined
if ( raw.startsWith('`\\(') || raw.startsWith('`\\[') ) { if ( raw.startsWith('`\\(') || raw.startsWith('`\\[') || raw.startsWith('`$') || raw.startsWith('`$$') ) {
let dummy = document.createElement("div") let dummy = document.createElement("div")
dummy.textContent = raw.replace(/`/g, '') dummy.textContent = raw.replace(/`/g, '')
renderMathInElement(dummy, { renderMathInElement(dummy, {
delimiters: [ delimiters: [
{left: '\\(', right: '\\)', display: false}, {left: '\\(', right: '\\)', display: false},
{left: '\\[', right: '\\]', display: true} {left: '\\[', right: '\\]', display: true},
{left: '$', right: '$', display: false},
{left: '$$', right: '$$', display: true}
], ],
throwOnError : false, throwOnError : false
output: "mathml" // output: "mathml"
}) })
renderedMath = dummy.innerHTML; renderedMath = dummy.innerHTML;
dummy.remove(); dummy.remove();

View File

@@ -13,6 +13,7 @@
import PromptConfirm from './PromptConfirm.svelte' import PromptConfirm from './PromptConfirm.svelte'
import { getImage } from './ImageStore.svelte' import { getImage } from './ImageStore.svelte'
import { getModelDetail } from './Models.svelte' import { getModelDetail } from './Models.svelte'
import renderMathInElement from "https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/contrib/auto-render.mjs";
export let message:Message export let message:Message
export let chatId:number export let chatId:number
@@ -235,32 +236,62 @@
document.body.removeChild(a) document.body.removeChild(a)
} }
const replaceLatexDelimiters = (text: string): string => { const replaceLatexDelimiters = (text: string): string => {
let result = ''; let result = '';
let i = 0; let i = 0;
while (i < text.length) { while (i < text.length) {
if (text.startsWith('\\(', i)) { // Check for display math: $$ ... $$
let endPos = text.indexOf('\\)', i + 2); if (text.startsWith('$$', i)) {
const endPos = text.indexOf('$$', i + 2);
if (endPos === -1) { if (endPos === -1) {
console.error(`LaTeX: Delimiter mismatch at ${i}`) console.error(`LaTeX: Delimiter mismatch (missing $$) at position ${i}`);
result += text[i];
i++;
} else {
// Wrap in backticks for KaTeX
result += `\`\\[${text.slice(i + 2, endPos)}\\]\``;
i = endPos + 2;
}
}
// Check for inline math: $ ... $
else if (text.startsWith('$', i)) {
const endPos = text.indexOf('$', i + 1);
if (endPos === -1) {
console.error(`LaTeX: Delimiter mismatch (missing $) at position ${i}`);
result += text[i];
i++;
} else {
result += `\`$${text.slice(i + 1, endPos)}$\``;
i = endPos + 1;
}
}
// Check for inline math: \(...\)
else if (text.startsWith('\\(', i)) {
const endPos = text.indexOf('\\)', i + 2);
if (endPos === -1) {
console.error(`LaTeX: Delimiter mismatch (missing \\)) at position ${i}`);
result += text[i]; result += text[i];
i++; i++;
} else { } else {
result += '`\\(' + text.slice(i + 2, endPos) + '\\)`'; result += '`\\(' + text.slice(i + 2, endPos) + '\\)`';
i = endPos + 2; i = endPos + 2;
} }
} else if (text.startsWith('\\[', i)) { }
let endPos = text.indexOf('\\]', i + 2); // Check for display math: \[...\]
else if (text.startsWith('\\[', i)) {
const endPos = text.indexOf('\\]', i + 2);
if (endPos === -1) { if (endPos === -1) {
console.error(`LaTeX: Delimiter mismatch at ${i}`) console.error(`LaTeX: Delimiter mismatch (missing \\]) at position ${i}`);
result += text[i]; result += text[i];
i++; i++;
} else { } else {
result += `\`\\[${text.slice(i + 2, endPos)}\\]\``; result += `\`\\[${text.slice(i + 2, endPos)}\\]\``;
i = endPos + 2; i = endPos + 2;
} }
} else { }
// Otherwise, just copy the current character (also handling backslash escapes)
else {
if (text.startsWith('\\(', i)) { if (text.startsWith('\\(', i)) {
result += '\\('; result += '\\(';
i += 2; i += 2;
@@ -279,8 +310,9 @@
} }
} }
} }
return result return result;
} };
const renderMathMsg = () => { const renderMathMsg = () => {
displayMessage = replaceLatexDelimiters(message.content); displayMessage = replaceLatexDelimiters(message.content);