From 97e9fd3f2eef350ebc9c28969eef91ec4669ea2c Mon Sep 17 00:00:00 2001 From: April Hall Date: Mon, 10 Feb 2025 11:23:04 -0500 Subject: [PATCH] feat: Markdown Support --- TODO.md | 2 +- bun.lockb | Bin 216472 -> 221492 bytes package.json | 3 +++ src/lib/components/message.svelte | 4 +++- src/lib/components/prose.svelte | 12 ++++++++++++ src/lib/functions/renderMarkdown.ts | 12 ++++++++++++ tailwind.config.ts | 2 ++ 7 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 src/lib/components/prose.svelte create mode 100644 src/lib/functions/renderMarkdown.ts diff --git a/TODO.md b/TODO.md index f72adf7..0713038 100644 --- a/TODO.md +++ b/TODO.md @@ -7,7 +7,7 @@ A more complex version of this list is available [here](https://trello.com/b/kJw - [ ] Documentation - [ ] Emoji picker - [ ] Images/Attatchments support -- [ ] Markdown Support +- [X] Markdown Support - [ ] Profile photos - [ ] Reactive channels list - [ ] Show characters before message gets cut off in textarea diff --git a/bun.lockb b/bun.lockb index e80204831d2a5a9dfd694fcff5120151c30ace1e..5c6b35a0d2b8888e9becdd5fc8bf02d0563e3a95 100755 GIT binary patch delta 33592 zcmeIbcR&?K_cwlb;VNrEtVk0OJH1|ta&dw~5JSNZg_rCAt?B&23`3)AXA7o>oD>AQ-yZlLT-k3&~ za9e|+mcd}HE3h)KCioZ7B>YO?MS+I}ZUELme4fBb!0Oz3vG)*VkErXw3c&L~N}7GfWPC!>g zIs#XMC;R|B#otENDBV)DhcH!@WXBdW1otbSy&pO{ksk3jVyX(=njd?lD=}$vHWO zL1+PW)TP=yU03i_tQknv2?UZcyad()B7Kmx0s>S(PIAUzs{bowK>TTuQF5~Hkd*A4 z+#`ZNsRr7(E4u`jr^ectBl5se+r9@<+L0MqDOu>m2ZFyLwATxK=D{1?LcMI`Zt<_n zt2{zja07VCrLhsOEFmXzG&*z}c#;JvL4*{}fBCVosKo-k7_v~{%X5N?r{ znK6_MmoPZpcU(%AVN+vX{A$Egb>D8ntKY(#H!C+G+jj_>>I|OZPXa0TWFKC=vp|v` z5f}@s1illHnwOc81k)N+lhHGFy&tbp(lA&c+hE8VnVv;;2^V=@^52q_^QWBBBN%bt}7<(R48eWHhWc7^#7Xc~NcwkLn8jwm| zgWRYV3xK3QG9xK_Y*ucj6+GE12T1lArskD%lm@6<%DKnR5Pfhw%3$z7T*sz7j~F1; z^rpZ(#FI;G2T~c!oAELVz*AY_(Y%Zi$dBsOPxUO{&=T3wU~mIh2j~j41v&#Cw&3!M zK#VTyZeShYJRn@mng*oWv=e+25nmqY1^NBv218xo8K66GlfcWyrZRUXWp0)AT`nhSOaJ;Fbz-1umy$hs9 zZv~PumI5iA6-at%g6{>SVWh7)Ex=QHKOUcGbwz+Ou;T*j_Z@|Q07>yYkP12gqypB6 zczrQi0G`sD;X`EalRXUvjA85Gh1EhkIF*q`E4Td3uIDZaEgD)+4R0gFx zF67$<9sp8>1}7(H`KII;`hcfl(nZJ*ClcS!V0BC48CC&OOIkpo63`7;ADEKkJ2Wjb z(XenZ*Q*A3MUoHA$jpYN$_su7M!WCGEW;VdDE_FLSHaP8bO`5u8OW>K2^~Sr8IqQe zo0~k?Fg$teC1w(qvxstdt=r++aur51YnWzY_}gfmF~9Ao+$om3PKv!DEpfo-#Ng`!wW~q2n|@ zg0qto24iq%C1i|EPsmLgmNPObJ0U085T{D^juxL8JlEV|$r)6#r{LR9=c%=^hw7}K z$tS}lK&pQ4S;Aw%Q>|Wr*DQ@SIx8V3#|k;|M`v^Woj`J(O>?+>91yLDv$mbfo6{Bo z^0CjsV`j2m08++(N$?-~Bj@wx>iYUnicz22yIbm^cW94P3rI%MQ3g*Q`*aZ>IAbw$ z&~+$}S1&gci&SQI?k>Tv1yc1fOQ$4e<{CalI;!1iAmu+z<*gV6q;l+*XuWT-re>yS z8DE5e6yF0n0Cx&30KyK|^#YTJ3`tJPH5g)+a`{Xk+3^4hBF_wBoc9D$epP{#Uqbfq z+_BiywqC|7))c51ELawiknCD7pSNIe!dRL)3@+d)Z=t?h@>#(xcos+vIR+%lXqK|TRNat}=B8Fasz|uNpHT_ob-&g9^afQ9 za!j4QgRry#QnG&^lX zWDP{rSkLhtAQi07+4`Jr5b;meaZCK&2)-`j(GIO*i7B}`z9Ul%r#5lV_1(<#-?s^q z8ui%)2*`vkTeu~Tfp-AEce6UKY8?y4saBur+jtk-0jZ&XY~}K=1oq#~%fs}Nkd`nw zxhr_`$tWPT50kZK=qEdPad&~#&VG>7h|*`Mt2?>=`#@A<@9nAy4gr7sdUD^Ou{92V z@!@B`*PP@#=d;{FlGmv?+3%|7zFpU|3y0Y^9Z}EU-nHVe7bziIFRk4hQ`b%kfAURw z4Y$-OU*=z9SwFSuvpBoUp8k7o?QHkc4a2Y}_BSWKzjJhpYErB5Yc3zjx@@1ZApcat zvqgOtoKf3(b(1T}YJpd@)J!e*GE1XWr+Q{%7h8j&x9V0e%D5h(&RXa>LOr!mYoi{@ zF9|&<2{kXL$G(kF4=u$*gxYJNfbs@IH!Wl>30*>{izcgMr-#zC(8@+lZA(OU7$#h; zH$t7X1Zzt|PfJ3P@V*XO?6i{5MLi_fuBcvb94+-#otl`9_0ccUs$27>YJL;5v_UOy zVpe{EtR1?^MlEb=lFVwXw^_2N`S^Q8Eymw(RVN>_T-RQW^NCh^V3KJCWn1;`%5b&V z$1HuKI{BLAdR5do-)LhWxLq6drdO17K`r(*E5YdJ4qDy`O-#~6HP+88eWB+2A-}5X zb-!q7qw3^uR-VF3dzGlQRP+7K(nz%!e+yNo0JBmN6GSJ(%PM8lN6il~ODojk0JHHP zVj|U>eo<1m8XIVqrl|S&`-xf{XjZCV)7(O#vXV_d_=^Z8Isrg}M>6%&`W>%ar z{ZNIW<71NgtFb1tv{KDCnT;0_6Qi#5i<0eKRp;<%rIRbKy{4*614l*4)P>4La4}jo zcN?3G_Sigxt2Y}*No~~F2(vN?d_alrPH>b`s}^;2q}kY@4s4;W42wb)@*~aC0<}2O ztek+dy0$)VqErsgqg^*)+%^OZ47TW1E_#S89G!vl8T?*Q?OWq-2BR zC8L(GZfrBN^sAcR%&c_rGqRqLmx<;JaEBk|>__4Tcb{ z8J>|QV=r(m$axfo5U)06d<|RxnMyG>;LX-DRyu;?d7&qjywW%{{6lah-J?`&h?z&P zkdgq79G&N~101;__nEK3bx>C}jgo^Ksn=UZ!;hU>nU$lBc)

FwA8930xReRQ7JH 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 import { type TypeMessage } from '$lib/types'; 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(); @@ -12,7 +14,7 @@

{user}

-
{@html escapeHTML(message)}
+ {@html renderMarkdown(escapeHTML(message))}
diff --git a/src/lib/components/prose.svelte b/src/lib/components/prose.svelte new file mode 100644 index 0000000..f85ba5d --- /dev/null +++ b/src/lib/components/prose.svelte @@ -0,0 +1,12 @@ + + +
{@render children()}
diff --git a/src/lib/functions/renderMarkdown.ts b/src/lib/functions/renderMarkdown.ts new file mode 100644 index 0000000..fec455d --- /dev/null +++ b/src/lib/functions/renderMarkdown.ts @@ -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); +} diff --git a/tailwind.config.ts b/tailwind.config.ts index 7c1b0d9..7cfa67e 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -1,5 +1,6 @@ import { fontFamily } from 'tailwindcss/defaultTheme'; import type { Config } from 'tailwindcss'; +import typography from '@tailwindcss/typography'; const config: Config = { darkMode: ['class'], @@ -59,6 +60,7 @@ const config: Config = { }, }, }, + plugins: [typography], }; export default config;