Skip to content

Commit 7f3daf0

Browse files
committed
basic markdown support
1 parent 191887b commit 7f3daf0

File tree

4 files changed

+71
-42
lines changed

4 files changed

+71
-42
lines changed

examples/server/deps.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ echo "download js bundle files"
99

1010
# Note for contributors: Always pin to a specific version "maj.min.patch" to avoid breaking the CI
1111

12-
curl -L https://cdn.tailwindcss.com/3.4.14 > $PUBLIC/deps_tailwindcss.js
12+
curl -L https://cdn.tailwindcss.com/3.4.14?plugins=forms,typography > $PUBLIC/deps_tailwindcss.js
1313
echo >> $PUBLIC/deps_tailwindcss.js # add newline
1414

1515
curl -L https://cdnjs.cloudflare.com/ajax/libs/daisyui/4.12.14/styled.min.css > $PUBLIC/deps_daisyui.min.css

examples/server/public/deps_tailwindcss.js

Lines changed: 36 additions & 34 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

examples/server/public/index.html

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,19 @@
55
<meta name="color-scheme" content="light dark">
66
<title>🦙 llama.cpp - chat</title>
77

8-
<!-- TODO: embed dependencies into cpp -->
8+
<!-- Note: dependencies can de updated using ./deps.sh script -->
99
<link href="./deps_daisyui.min.css" rel="stylesheet" type="text/css" />
1010
<script src="./deps_tailwindcss.js"></script>
11+
<script>
12+
tailwind.config = {};
13+
</script>
14+
<style type="text/tailwindcss">
15+
.markdown {
16+
h1, h2, h3, h4, h5, h6, ul, ol, li { all: revert; }
17+
pre { @apply whitespace-pre-wrap; }
18+
/* TODO: fix table */
19+
}
20+
</style>
1121
</head>
1222

1323
<body>
@@ -53,18 +63,18 @@
5363
'chat-end': msg.role === 'user',
5464
}">
5565
<div :class="{
56-
'chat-bubble': true,
66+
'chat-bubble markdown': true,
5767
'chat-bubble-primary': msg.role === 'user',
5868
}">
59-
<p v-for="line in msg.content.split('\n')">{{ line }}</p>
69+
<vue-markdown :source="msg.content" />
6070
</div>
6171
</div>
6272

6373
<!-- pending assistant message -->
6474
<div id="pending-msg" class="chat chat-start">
65-
<div v-if="pendingMsg" class="chat-bubble">
75+
<div v-if="pendingMsg" class="chat-bubble markdown">
6676
<span v-if="!pendingMsg.content" class="loading loading-dots loading-md"></span>
67-
<p v-else v-for="line in pendingMsg.content.split('\n')">{{ line }}</p>
77+
<vue-markdown v-else :source="pendingMsg.content" />
6878
</div>
6979
</div>
7080
</div>
@@ -84,13 +94,30 @@
8494
</div>
8595
</div>
8696

97+
<script src="./deps_markdown-it.js"></script>
8798
<script type="module">
88-
import { createApp } from './deps_vue.esm-browser.js';
99+
import { createApp, defineComponent, shallowRef, computed, h } from './deps_vue.esm-browser.js';
89100
import { llama } from './completion.js';
90101

91102
const BASE_URL = (new URL('.', document.baseURI).href).toString();
92103

104+
// markdown support
105+
const VueMarkdown = defineComponent(
106+
(props) => {
107+
const md = shallowRef(new markdownit(props.options ?? {}));
108+
for (const plugin of props.plugins ?? []) {
109+
md.value.use(plugin);
110+
}
111+
const content = computed(() => md.value.render(props.source));
112+
return () => h("div", { innerHTML: content.value });
113+
},
114+
{ props: ["source", "options", "plugins"] }
115+
);
116+
93117
createApp({
118+
components: {
119+
VueMarkdown,
120+
},
94121
data() {
95122
return {
96123
messages: [],

examples/server/server.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3125,7 +3125,7 @@ int main(int argc, char ** argv) {
31253125
svr->Get("/", handle_static_file(index_html, index_html_len, "text/html; charset=utf-8"));
31263126
svr->Get("/completion.js", handle_static_file(completion_js, completion_js_len, "text/javascript; charset=utf-8"));
31273127
svr->Get("/deps_daisyui.min.css", handle_static_file(deps_daisyui_min_css, deps_daisyui_min_css_len, "text/css; charset=utf-8"));
3128-
svr->Get("/deps_markdown-it.js", handle_static_file(deps_markdown_it_js, deps_daisyui_min_css_len, "text/javascript; charset=utf-8"));
3128+
svr->Get("/deps_markdown-it.js", handle_static_file(deps_markdown_it_js, deps_markdown_it_js_len, "text/javascript; charset=utf-8"));
31293129
svr->Get("/deps_tailwindcss.js", handle_static_file(deps_tailwindcss_js, deps_tailwindcss_js_len, "text/javascript; charset=utf-8"));
31303130
svr->Get("/deps_vue.esm-browser.js", handle_static_file(deps_vue_esm_browser_js, deps_vue_esm_browser_js_len, "text/javascript; charset=utf-8"));
31313131
}

0 commit comments

Comments
 (0)