feat: Markdown Support

This commit is contained in:
April Hall 2025-02-10 11:23:04 -05:00
parent bfddcc1844
commit 97e9fd3f2e
No known key found for this signature in database
GPG Key ID: A49AC35CB186266C
7 changed files with 33 additions and 2 deletions

View File

@ -7,7 +7,7 @@ A more complex version of this list is available [here](https://trello.com/b/kJw
- [ ] Documentation - [ ] Documentation
- [ ] Emoji picker - [ ] Emoji picker
- [ ] Images/Attatchments support - [ ] Images/Attatchments support
- [ ] Markdown Support - [X] Markdown Support
- [ ] Profile photos - [ ] Profile photos
- [ ] Reactive channels list - [ ] Reactive channels list
- [ ] Show characters before message gets cut off in textarea - [ ] Show characters before message gets cut off in textarea

BIN
bun.lockb

Binary file not shown.

View File

@ -19,6 +19,8 @@
"@eslint/js": "^9.18.0", "@eslint/js": "^9.18.0",
"@sveltejs/kit": "^2.16.0", "@sveltejs/kit": "^2.16.0",
"@sveltejs/vite-plugin-svelte": "^5.0.0", "@sveltejs/vite-plugin-svelte": "^5.0.0",
"@tailwindcss/typography": "^0.5.16",
"@types/markdown-it": "^14.1.2",
"autoprefixer": "^10.4.20", "autoprefixer": "^10.4.20",
"bits-ui": "^0.22.0", "bits-ui": "^0.22.0",
"clsx": "^2.1.1", "clsx": "^2.1.1",
@ -26,6 +28,7 @@
"eslint-config-prettier": "^10.0.1", "eslint-config-prettier": "^10.0.1",
"eslint-plugin-svelte": "^2.46.1", "eslint-plugin-svelte": "^2.46.1",
"globals": "^15.14.0", "globals": "^15.14.0",
"markdown-it": "^14.1.0",
"prettier": "^3.4.2", "prettier": "^3.4.2",
"prettier-plugin-svelte": "^3.3.3", "prettier-plugin-svelte": "^3.3.3",
"prettier-plugin-tailwindcss": "^0.6.11", "prettier-plugin-tailwindcss": "^0.6.11",

View File

@ -1,6 +1,8 @@
<script lang="ts"> <script lang="ts">
import { type TypeMessage } from '$lib/types'; import { type TypeMessage } from '$lib/types';
import escapeHTML from '$lib/functions/escapeHTML'; import escapeHTML from '$lib/functions/escapeHTML';
import Prose from '$lib/components/prose.svelte';
import renderMarkdown from '$lib/functions/renderMarkdown';
const { message, imageSrc, user }: TypeMessage = $props(); const { message, imageSrc, user }: TypeMessage = $props();
</script> </script>
@ -12,7 +14,7 @@
</div> </div>
<div class="w-full"> <div class="w-full">
<p class="inline-size-full break-words font-bold">{user}</p> <p class="inline-size-full break-words font-bold">{user}</p>
<pre class="inline-size-full text-wrap break-words font-sans">{@html escapeHTML(message)}</pre> <Prose class="inline-size-full text-wrap break-words font-sans">{@html renderMarkdown(escapeHTML(message))}</Prose>
</div> </div>
</div> </div>

View File

@ -0,0 +1,12 @@
<script lang="ts">
import type { Snippet } from 'svelte';
interface Props {
children: Snippet;
class: string;
}
const { children, class: className = '' }: Props = $props();
</script>
<div class={className + ' prose prose-stone dark:prose-invert prose-blue'}>{@render children()}</div>

View File

@ -0,0 +1,12 @@
import markdownit from 'markdown-it';
export default function renderMarkdown(input: string): string {
const md = markdownit({
html: false,
linkify: true,
typographer: true,
breaks: true,
}).disable(['image', 'table']);
return md.render(input);
}

View File

@ -1,5 +1,6 @@
import { fontFamily } from 'tailwindcss/defaultTheme'; import { fontFamily } from 'tailwindcss/defaultTheme';
import type { Config } from 'tailwindcss'; import type { Config } from 'tailwindcss';
import typography from '@tailwindcss/typography';
const config: Config = { const config: Config = {
darkMode: ['class'], darkMode: ['class'],
@ -59,6 +60,7 @@ const config: Config = {
}, },
}, },
}, },
plugins: [typography],
}; };
export default config; export default config;