diff --git a/src/app.scss b/src/app.scss index 91c52a5..fd2acf3 100644 --- a/src/app.scss +++ b/src/app.scss @@ -107,7 +107,6 @@ body, button, input, select, textarea { } } - @keyframes rotating { from { transform: rotate(0deg); @@ -861,6 +860,8 @@ aside.menu.main-menu .menu-expanse { max-width: calc(100% - 40px); } +@import "/node_modules/katex/dist/katex.min.css"; + .katex-html { display: none; } diff --git a/src/lib/Code.svelte b/src/lib/Code.svelte index 8000981..5d4abdf 100644 --- a/src/lib/Code.svelte +++ b/src/lib/Code.svelte @@ -27,8 +27,8 @@ type LanguageType } from 'svelte-highlight/languages/index' - import katex from 'katex' import 'katex/contrib/mhchem' + import renderMathInElement from 'katex/contrib/auto-render' export const type: 'code' = 'code' export const raw: string = '' @@ -36,17 +36,21 @@ export let lang: string | undefined export let text: string - let renderedMath: string | undefined + let renderedMath: string | undefined; + // if ( text.startsWith('\\[') ) { + // let dummy = document.createElement("div") + // dummy.textContent = text; + // renderMathInElement(dummy, { + // delimiters: [ + // {left: '\\(', right: '\\)', display: false}, + // {left: '\\[', right: '\\]', display: true} + // ], + // throwOnError : true, + // }) + // renderedMath = dummy.innerHTML; + // dummy.remove(); + // } - $: if (lang === 'rendermath') { - renderedMath = katex.renderToString(text, { - throwOnError: false, - displayMode: true - }) - } else { - renderedMath = undefined - } - // Map lang string to LanguageType let language: LanguageType @@ -131,7 +135,7 @@ {@html style} -{#if lang === 'rendermath'} +{#if renderedMath} {@html renderedMath} {:else}
diff --git a/src/lib/Codespan.svelte b/src/lib/Codespan.svelte index 2ccf5cd..e7bc5a1 100644 --- a/src/lib/Codespan.svelte +++ b/src/lib/Codespan.svelte @@ -1,14 +1,22 @@ diff --git a/src/lib/EditMessage.svelte b/src/lib/EditMessage.svelte index 512c827..8c667d0 100644 --- a/src/lib/EditMessage.svelte +++ b/src/lib/EditMessage.svelte @@ -14,8 +14,6 @@ import { getImage } from './ImageStore.svelte' import { getModelDetail } from './Models.svelte' - import 'katex/dist/katex.min.css' - export let message:Message export let chatId:number export let chat:Chat @@ -223,42 +221,55 @@ document.body.removeChild(a) } - const preprocessMath = (text: string): string => { - let codeBlockPlaceholderPrefix = '__prefix__c0d3b10ck__' - while (text.indexOf(codeBlockPlaceholderPrefix) > 0) { - codeBlockPlaceholderPrefix = codeBlockPlaceholderPrefix + '_' + const replaceLatexDelimiters = (text: string): string => { + let result = ''; + let i = 0; + + while (i < text.length) { + if (text.startsWith('\\(', i)) { + let endPos = text.indexOf('\\)', i + 2); + if (endPos === -1) { + console.error(`LaTeX: Delimiter mismatch at ${i}`) + result += text[i]; + i++; + } else { + result += '`\\(' + text.slice(i + 2, endPos) + '\\)`'; + i = endPos + 2; + } + } else if (text.startsWith('\\[', i)) { + let endPos = text.indexOf('\\]', i + 2); + if (endPos === -1) { + console.error(`LaTeX: Delimiter mismatch at ${i}`) + result += text[i]; + i++; + } else { + result += `\`\\[${text.slice(i + 2, endPos)}\\]\``; + i = endPos + 2; + } + } else { + if (text.startsWith('\\(', i)) { + result += '\\('; + i += 2; + } else if (text.startsWith('\\)', i)) { + result += '\\)'; + i += 2; + } else if (text.startsWith('\\[', i)) { + result += '\\['; + i += 2; + } else if (text.startsWith('\\]', i)) { + result += '\\]'; + i += 2; + } else { + result += text[i]; + i++; + } + } } - let index = 0 - const codeBlocks = [] - - const codeBlockRegex = /(```[\s\S]*?```|`[^`]*`)/g - - text = text.replace(codeBlockRegex, (match) => { - const placeholder = `${codeBlockPlaceholderPrefix}idx${index}__` - codeBlocks.push(match) - index++ - return placeholder - }) - - text = text - .replace(/(\\\[((?:\s|\S)*?)\\\])|(\$\$((?:\s|\S)*?)\$\$)/g, (match, p1, p2, p3, p4) => { - const math = p2 || p4 - return '\n```rendermath\n' + math.trim() + '\n```\n' - }) - .replace(/(\\\((?!\$)(.*?)\\\))|(? { - const math = p2 || p3 - return '`rendermath' + math.trim() + '`' - }) - - text = text.replace(new RegExp(`${codeBlockPlaceholderPrefix}idx(\\d+)__`, 'g'), (match, p1) => { - return codeBlocks[p1] - }) - - return text + return result } const renderMathMsg = () => { - displayMessage = preprocessMath(message.content); + displayMessage = replaceLatexDelimiters(message.content); }; @@ -300,7 +311,7 @@ {/if} {#key refreshCounter}