diff --git a/frontend/index.html b/frontend/index.html
index e95b3bf..68d26d0 100644
--- a/frontend/index.html
+++ b/frontend/index.html
@@ -3,7 +3,7 @@
- AI Chat
+ Chat
diff --git a/frontend/package-lock.json b/frontend/package-lock.json
index b663d71..8fb912b 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -9,6 +9,7 @@
"version": "0.1.0",
"dependencies": {
"highlight.js": "^11.10.0",
+ "katex": "^0.16.40",
"marked": "^15.0.0",
"vue": "^3.4.0"
},
@@ -990,6 +991,15 @@
"dev": true,
"license": "Python-2.0"
},
+ "node_modules/commander": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmmirror.com/commander/-/commander-8.3.0.tgz",
+ "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
"node_modules/csstype": {
"version": "3.2.3",
"resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.2.3.tgz",
@@ -1111,6 +1121,22 @@
"js-yaml": "bin/js-yaml.js"
}
},
+ "node_modules/katex": {
+ "version": "0.16.40",
+ "resolved": "https://registry.npmmirror.com/katex/-/katex-0.16.40.tgz",
+ "integrity": "sha512-1DJcK/L05k1Y9Gf7wMcyuqFOL6BiY3vY0CFcAM/LPRN04NALxcl6u7lOWNsp3f/bCHWxigzQl6FbR95XJ4R84Q==",
+ "funding": [
+ "https://opencollective.com/katex",
+ "https://github.com/sponsors/katex"
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "commander": "^8.3.0"
+ },
+ "bin": {
+ "katex": "cli.js"
+ }
+ },
"node_modules/magic-string": {
"version": "0.30.21",
"resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.21.tgz",
diff --git a/frontend/package.json b/frontend/package.json
index 89c5142..176b2ef 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -10,6 +10,7 @@
},
"dependencies": {
"highlight.js": "^11.10.0",
+ "katex": "^0.16.40",
"marked": "^15.0.0",
"vue": "^3.4.0"
},
diff --git a/frontend/src/components/ChatView.vue b/frontend/src/components/ChatView.vue
index 9a0a3e5..c29038d 100644
--- a/frontend/src/components/ChatView.vue
+++ b/frontend/src/components/ChatView.vue
@@ -68,19 +68,7 @@
import { ref, computed, watch, nextTick } from 'vue'
import MessageBubble from './MessageBubble.vue'
import MessageInput from './MessageInput.vue'
-import { marked } from 'marked'
-import hljs from 'highlight.js'
-
-marked.setOptions({
- highlight(code, lang) {
- if (lang && hljs.getLanguage(lang)) {
- return hljs.highlight(code, { language: lang }).value
- }
- return hljs.highlightAuto(code).value
- },
- breaks: true,
- gfm: true,
-})
+import { renderMarkdown } from '../utils/markdown'
const props = defineProps({
conversation: { type: Object, default: null },
@@ -99,7 +87,7 @@ const inputRef = ref(null)
const renderedStreamContent = computed(() => {
if (!props.streamingContent) return ''
- return marked.parse(props.streamingContent)
+ return renderMarkdown(props.streamingContent)
})
function scrollToBottom(smooth = true) {
@@ -375,4 +363,13 @@ defineExpose({ scrollToBottom })
.streaming-content :deep(.placeholder) {
color: #94a3b8;
}
+
+.streaming-content :deep(.math-block),
+.message-content :deep(.math-block) {
+ display: block;
+ text-align: center;
+ padding: 12px 0;
+ margin: 8px 0;
+ overflow-x: auto;
+}
diff --git a/frontend/src/components/MessageBubble.vue b/frontend/src/components/MessageBubble.vue
index 41f461c..70d451d 100644
--- a/frontend/src/components/MessageBubble.vue
+++ b/frontend/src/components/MessageBubble.vue
@@ -38,8 +38,7 @@