Spaces:
Build error
Build error
Adrien Denat
commited on
Adrien syntax highlighting ssr (#32)
Browse files* only show copy to clipboard button on hover of code block
* only highlight code on client-side to support parsed markdown on SSR
src/lib/components/chat/ChatMessage.svelte
CHANGED
|
@@ -2,6 +2,7 @@
|
|
| 2 |
import { marked } from 'marked';
|
| 3 |
import type { Message } from '$lib/types/Message';
|
| 4 |
import { afterUpdate } from 'svelte';
|
|
|
|
| 5 |
|
| 6 |
import CopyToClipBoardBtn from '../CopyToClipBoardBtn.svelte';
|
| 7 |
|
|
@@ -14,7 +15,7 @@
|
|
| 14 |
// Add wrapper to code blocks
|
| 15 |
renderer.code = (code, lang) => {
|
| 16 |
return `
|
| 17 |
-
<div class="code-block">
|
| 18 |
<pre>
|
| 19 |
<code class="language-${lang}">${code}</code>
|
| 20 |
</pre>
|
|
@@ -48,7 +49,9 @@
|
|
| 48 |
renderer
|
| 49 |
};
|
| 50 |
|
| 51 |
-
$: marked(message.content, options, handleParsed);
|
|
|
|
|
|
|
| 52 |
|
| 53 |
afterUpdate(() => {
|
| 54 |
if (el) {
|
|
@@ -62,7 +65,8 @@
|
|
| 62 |
target: block,
|
| 63 |
props: {
|
| 64 |
value: (block as HTMLElement).innerText ?? '',
|
| 65 |
-
classNames:
|
|
|
|
| 66 |
}
|
| 67 |
});
|
| 68 |
block.classList.add('has-copy-btn');
|
|
@@ -79,7 +83,7 @@
|
|
| 79 |
class="mt-5 w-3 h-3 flex-none rounded-full shadow-lg"
|
| 80 |
/>
|
| 81 |
<div
|
| 82 |
-
class="
|
| 83 |
bind:this={el}
|
| 84 |
>
|
| 85 |
{@html html}
|
|
|
|
| 2 |
import { marked } from 'marked';
|
| 3 |
import type { Message } from '$lib/types/Message';
|
| 4 |
import { afterUpdate } from 'svelte';
|
| 5 |
+
import { browser } from '$app/environment';
|
| 6 |
|
| 7 |
import CopyToClipBoardBtn from '../CopyToClipBoardBtn.svelte';
|
| 8 |
|
|
|
|
| 15 |
// Add wrapper to code blocks
|
| 16 |
renderer.code = (code, lang) => {
|
| 17 |
return `
|
| 18 |
+
<div class="group code-block">
|
| 19 |
<pre>
|
| 20 |
<code class="language-${lang}">${code}</code>
|
| 21 |
</pre>
|
|
|
|
| 49 |
renderer
|
| 50 |
};
|
| 51 |
|
| 52 |
+
$: browser && marked(message.content, options, handleParsed);
|
| 53 |
+
|
| 54 |
+
html = marked(message.content, options);
|
| 55 |
|
| 56 |
afterUpdate(() => {
|
| 57 |
if (el) {
|
|
|
|
| 65 |
target: block,
|
| 66 |
props: {
|
| 67 |
value: (block as HTMLElement).innerText ?? '',
|
| 68 |
+
classNames:
|
| 69 |
+
'absolute top-2 right-2 invisible opacity-0 group-hover:visible group-hover:opacity-100'
|
| 70 |
}
|
| 71 |
});
|
| 72 |
block.classList.add('has-copy-btn');
|
|
|
|
| 83 |
class="mt-5 w-3 h-3 flex-none rounded-full shadow-lg"
|
| 84 |
/>
|
| 85 |
<div
|
| 86 |
+
class="relative rounded-2xl px-5 py-3.5 border border-gray-100 bg-gradient-to-br from-gray-50 dark:from-gray-800/40 dark:border-gray-800 prose text-gray-600 dark:text-gray-300"
|
| 87 |
bind:this={el}
|
| 88 |
>
|
| 89 |
{@html html}
|