From e5484eece3d8ab6ceea68be6013b573ca6675a74 Mon Sep 17 00:00:00 2001 From: Niko Date: Wed, 28 May 2025 17:08:07 +0200 Subject: [PATCH 1/2] Update keynoters. --- .../sections/keynoters/keynoter.astro | 12 +++---- .../sections/keynoters/keynoters.astro | 4 +-- src/components/ui/Markdown.astro | 3 +- src/content/config.ts | 1 + src/content/keynoters/brett.mdx | 2 +- src/content/keynoters/cultrepo.png | Bin 0 -> 26672 bytes src/content/keynoters/documentary.mdx | 3 +- src/content/keynoters/nerea.mdx | 2 +- src/content/keynoters/petr.mdx | 2 +- src/content/keynoters/savannah.mdx | 1 - src/content/keynoters/sebastian.mdx | 2 +- src/content/pages/sponsorship/sponsor.mdx | 1 + src/utils/markdown.ts | 30 ++++++++++++++++++ 13 files changed, 46 insertions(+), 17 deletions(-) create mode 100644 src/content/keynoters/cultrepo.png create mode 100644 src/utils/markdown.ts diff --git a/src/components/sections/keynoters/keynoter.astro b/src/components/sections/keynoters/keynoter.astro index 724f84f30..2586be20f 100644 --- a/src/components/sections/keynoters/keynoter.astro +++ b/src/components/sections/keynoters/keynoter.astro @@ -1,6 +1,5 @@ --- import type { ImageMetadata } from "astro"; -import { getCollection } from "astro:content"; import { Image } from "astro:assets"; import Person1 from "./placeholders/person-1.astro"; import Person2 from "./placeholders/person-2.astro"; @@ -10,7 +9,7 @@ import Person5 from "./placeholders/person-5.astro"; export interface Props { name: string; - slug: string; + url: string; tagline?: string | undefined; image?: ImageMetadata; placeholder?: boolean | undefined; @@ -20,7 +19,7 @@ export interface Props { const { name, - slug, + url, tagline, image, placeholder, @@ -31,9 +30,6 @@ const placeholders = [Person1, Person2, Person3, Person4, Person5]; const Placeholder = placeholders[Math.floor(Math.random() * placeholders.length)]; - -const entries = await getCollection("speakers"); -const isSpeaker = entries.some((entry) => entry.id === slug); ---
  • @@ -61,10 +57,10 @@ const isSpeaker = entries.some((entry) => entry.id === slug);

    More keynoters coming soon

    ) : ( <> - {isSpeaker ? ( + {url ? (

    {name} diff --git a/src/components/sections/keynoters/keynoters.astro b/src/components/sections/keynoters/keynoters.astro index 164b789f4..94f1eef78 100644 --- a/src/components/sections/keynoters/keynoters.astro +++ b/src/components/sections/keynoters/keynoters.astro @@ -19,7 +19,7 @@ const placeholders = Math.max(0, 5 - keynoters.length); .map((keynoter, _index) => ( ( diff --git a/src/content/config.ts b/src/content/config.ts index 46e052fb5..059836be6 100644 --- a/src/content/config.ts +++ b/src/content/config.ts @@ -30,6 +30,7 @@ const keynoters = defineCollection({ schema: ({ image }) => z.object({ name: z.string(), + url: z.string().optional(), tagline: z.string().optional(), image: image(), order: z.number(), diff --git a/src/content/keynoters/brett.mdx b/src/content/keynoters/brett.mdx index 8902ee0f3..9ecbdcbd0 100644 --- a/src/content/keynoters/brett.mdx +++ b/src/content/keynoters/brett.mdx @@ -1,7 +1,7 @@ --- name: Brett Cannon image: ./brett.jpg -slug: brett-cannon +url: /speaker/brett-cannon tagline: CPython Core Developer & the 5th most prolific PEP (co-)author order: 1 --- diff --git a/src/content/keynoters/cultrepo.png b/src/content/keynoters/cultrepo.png new file mode 100644 index 0000000000000000000000000000000000000000..0082d79fa4e81d2a62d4c5cdbdb39482df7a2a84 GIT binary patch literal 26672 zcmeFZbyU=C_cuCpmm(rCFocBC(nCwCNQj7(G}0X+F$mHQrC=b9h)9EkB3&X#ii9Ab z5=se3!`Z`qKX*LuZ>@9IdH*?Qt(RpmGuQWueeL}0y(dcNvN{zx6FCBbpwiS((L*2z zP`JOO#PH6T8}Uu}kIYTux+elb-Gcjz_uwowGXg>Q#$Mmh%TVi*jFqdipoO)orH!DU zvm1;?AY>K%+$^jdZM;yHHg@(day-kg>v>T2)^a@8#I=OA+|JwFwAb+Wu({%YS>MXv z(MsByM?s!k)=vf|aJKQXK>0a4xp>O>$?+V`D+9md-WKA4K_1q&GI}a%e-43Hay&P^ zyxe4jgnWH{1%1y6x_a0NiAYOJ3kiz~iHZuq2m#MqE?yRX0xq7MFatU2Xbu${Pb&|5 zH!piv7Zh$z3rkmTFF76_a@3zwD|vZ&*jxTJyNjow#nC(7xJLxx&_Wj0oc9`PBzXqE?&4x68ZCztgU3c?7f_9{=On5C$E2B5%8XjlZA_&9FL!XwT-QXx04r- z{8g8u$E;D-HlFr&E+_$%$p3J#Kj)Ga`o}W=8^?0{2Xo`t??}dQj0YdUna=%rCU_;I zp}cII-JC!cZTxcpsAgq`)Rh0DoQhyGM;2}_y4Z;oevr}0tT;w}GAKvpL5SWHrNKk2e z%^3Li6ahX0VNFSjK*Won5D3M#|MTYmp9mrdS9o~%b4>1Lk|SgL)Gj8Hh`G#S5%$Q?bd3bnn4xHEdaS)|fq zA$L4Vw3hNTizu2XPEE|FU)rWK!vkvM(BU|P>Hqxte@llEeSbvVOl!=^)rFygt-Wne zegT2j59taQwec}&mEJ!-GBPqoBGEoAjiDq~vpr99dHOgBNu4*ocRzXf_;K{^=CXR7 znUEX_Vk@+-uTSdMFKZS#f3cmNoeLi_WA+D}B%b7|_Xd8Sot@d)_~E`hQP+P3fvMNY z*Ps45QZ6DQLPtPAkUQIZmylGz_s7S=YPTun`BR7n8T~U4aPt$8P~T5ePFbau5%Atv zxVnmmFg3q*OB&0jz#7MG2xRTss89xp#7s?cBL@rFI|E`mfC4I0_4B`GN>mj@nvRb9=PB6LGgE>sYuXqfWacUdjFk5`TWq2V^uc5iEC>iqmE zFDbmH+VMBH%GU`IsJ_Lqs*Bng&1AG6fBqOQUj5pcgj+*}hE1MdE`*v#(Xf1ee!l-W z0%HxtjvFq%k&>oFavb&YdZEEtIXndKm-&IbT%O)WLQ==yzZb`FBk?EdZeR1qM_$5| z*y0l+{F5dTFC!2Z-ERZ7_5AS>It}e{Y_Mi187%^FaG`tzw-C1?XiqU1jnLry-}&{) z1saT*q^RhxNypvai+#hxCyie@UHAU{=9cH))+(m~{M5Y-+-2zM>RN@J8yXoId4G;< zYj3x*w9HzMy~=b?Ema}-?RxB_jOX`DENGvX@TNnhkx8vrzRe~&aK|fE%00_w)A4T1 zNujpAy@1lS_O>=l50A1>+jUDo9`}X8{Qh$p1!S}uqEb?fLk{B9NEv$AOH4vS0wXJ{ z%h)ZU8*gLp-o5*L_($JOu`ILV_VIC(moHydEWST1cN{K~^7yJzx)y9V_R2YzXRi;4 zDLKBmvA?^SJmJb2)OI0PZ+)+^v5{)?DWW0~5h5{C9~`V-FeDYQ9^0$H@gqn+E=S~h9gZg zYnYze+&p#HFw*4xIHOf!jBrJm$Agma@x)vo^={Rga}<2{W1fvmoegt#rt_s`BJ-3^ ziZR}E-8&54KK$u~emm(ovAjGh%eL{uH#Bv4c3`$`c4I$CepW{j!FCUcHee7i;-X;S zkH;e*zS%ynNxe@rSl9TX49IITw{w9A< z{iIcFa;r2RLP1v%5hr@?oXzTVYuU{{j?SK*kJ#gtt26CgTdOlRIMMCxMYUs*Nd?!6 z9oj+5VzV%a;QZ&$H9i)Zp1pPJ)~IekQc4OB{02*LT)leLV`trdQ9~qezXE-8FG$AK z{h)GE(J=KmV&(XaW(t+eYsF@IMn-2gHa0wdeiF%h*S@Tr8Lw|(@UGHvI42`R5q}(gZ3Ldyjpfn&hsA&jd=KTM}0FzJ2-_fZm~2fE1wksHv<Wr37(Q~dby zdNz_%$3&K?>DKPtiujv9i9%1ymGk&9Q|E^d!&o{gL6_JH$tOz9!z*oRN7w33NI@3y z3%D{PLK3CHYuA&S021oh4s&Z5!n3iSvpt>n`L0x0!8=@HSo6kPnwpv(Q%ywgB4|ux zpA-d7DBP?LW4+BVONiK0!3$Y?@#2Mbe~#v;Na~mAHjUfmr^HN@G{F)=o4-@8Xe;Efe#a?(^WFcZ=NTO~e}@Xj6q5n)f~yLX8T z3l58n@Wvd1i14!Jg$s#S@-AzF2JoThsqvFG*llv}T@m;XC(zSM;aKt*`P~XDsjk+0 z3BPU6-P~e$`Kerr2l0gm77=luR^by67{bEQF_(1|zl7!Fa0xzzT@m6I_*CVZZf$Gp zfTM%rNnRA`o2cVF??x*fD{*wlV1{?Zux5>C7b)8Rx=ngoLL+;7KK0@+WRp@kF@N6i zVLvruuW)_cYoyk@z$fN{pMN6|}XfNe3UiF?r*sJ32NN zxa-?IRT9>0K}W~O&wn3h(=K1`xv_7|kZy207bn$Q?8?5^S*lt$@EXwMr1P+0h2bkvCN%$dZpGEung=xsYAJNJPH8V`fL!Z+}$ zqb|tKI}3$`_?OQ)wG| ziyY2T{vdEWPDB_|4px7WG|i+w$kev`@#)t-i+YoL*FY^)*bn3s6%`o=Pqua=v<#gmjihH_cn1{ZJV2gIS2GG&a6FaL``N~QoMD&*u?(Da z|65mzqk5zfumn9ly$1Z}b6@atjido!V%b=S$C*KBwesd|So-d2#G+Zi^a*6ptfbpfLeVCG-E+lvR_aL@U0IYA)t5*_7 zf^Ms;Xg;w%KL9Ir0o%XckC_J1i;Bj_U*o>?Faw!+(b?Hq&&;d{r%D=R$w@C=1g+pc z(`Mg3r+5AODfMFfchfb#UDaVre{U+R z{UJ?mlnxfe55>nHXp23Sjm*3P7U=<8`H^-crGyo`Iy?KYz4_760{s7o>~MVTtJV$)ZxuRvS&S!bahb2X!|w2 zh}l-RGi1X&;YA5M&h=)(sLKtYj9W;YhKeeT`f>VgP4Fz`k0{LufUON4Nz z2i~oNy&4}vMJ)~|(&HAfNX1{*y~)9M3(a)!o>H4e=%$)4)~Ws_3^n#fsbT7L(aOXmDv^ zvcBFYjJnQ$;{qDQTQLKUsaGGg566tehc~`Z;Z9IT0Lt^l5utj4P(0$|SJBEUt`l$I zRIrDeu!n&v*BgtZbajEd259^M+tukpn*fUBf86qSLqXIVJomU(t(5=q6S#$yaD04E z@R=$&RR$*}ivC_tPR1(F%6=a%s5aVF5r452fzRtAA{lV>Vu-41Bc$pZO(+}E0REbNtm+k4XOT_#|Rk%K8gGNJ{fsJj8C^O&YqbaOy2(`dwY4AXO)KR z=f1Ix{YTg3%AQP21N{V!N@2`IgwNm>>+0(MBH@*nLHNm}L|iZVUC^bm=TK8P-kv2v z%)%|51`idjti0-HazqYZPzM+I83wTNw5|$GT{uN56~=0YQ^i3DHynAutpsjz0dBI~ zpduxLXsrSH$BT}J28<7(U(58XB;KjnxJ+RMj2q~N`=wUx4(b}ui;K0<__9r`o~C?;nbc(jBYynom615S(I*qiF@F z<<|%>p0KW{|N6~EQnJ9q{Y}skbTKi4U7zlp_~$u;_Eyzl#QsV%4G{8pRtYM$iSc;U zLN(qNa3zp*yl|+T&#hNpSZfN09jVUGN#W zCl~XpL|0xeZ6d`T?&D4$TE*F%XMPu_5K`F?sh|+(3(_TQHfBPmQd?C)8fi5AaL&s% zUV}8~ol<||mW7jCP0}$jMgLxYQYtMi4a8EIom@L7TewXnOU4Cpa5NuLSlkqq5Q8aa zGsDY&5~FGJZ_W`wJ$m%$h;x)faKf;&Q^Colf=4D4Gj^GO#>(%X1dkrVPkito7m3GO zT0K|x-;Bi?=cum1i$)v&%~-Ck#Xey!Fi`Y;sgdH5A;)7a!5Ni*&&E>npe?dbtOkj%!;?jl%V zAIj?Y|Ldt!u~_OwQq2=5PS~ph+mMRkwrZltt)2GrFV#B>@YE<>;$!eZeF$NaSI4`g z2#)=OnLS5GN8uX1H-@e`s$;rv)R_6#b}yCr(+0k~&-aJQxQCCQ1RixICzsb}?_qn~ z6Y?9Cu>ywwR2-cP5-*#Yl#e3skjRqit+I!m&bo|N9J)wJ#36`dzvN^9DAN2N#r0-r zd=oL-_l$6m+}vDy_3GHxyss`X|B$Do%jxokF!mAxe`6R3k%bA1X|1AEh-$SQrIWQ=%}4(<4?;|V zbPJKUZQV%sG;9Z)esCS0*H0PUR}chV&_ph ze0w)H9k}rA?QKvjWrm7^rnNb60km$ok>65o0B1V%q)OvPnwu-a$m86XfSq*!*MPa# zH#Tbgcqe=FW{ z{*&>B{M_2|+c`e54fD(3>c_{ox>naug)_q()|D!?d@o`qo@1FYhrpmeK9yRH(uM0A z8+TP@#nBR3Z@pxQ=XGklgZxv${s5ToS^6tmTiXlH&V@d)ilsZ7_NAChPi26>%Kw&4 z`|j>;m~4IUinbb#({Mf-iawxBP|x0|F%l3onA34rA{>dc+sQAkdGc zV{}oF^G(VXdiegshm`()y+uZ{)*1IjQUnGAT1o5&k&23S;~gT=pgq4u#*p5=zD(eQ zC$4X=qnkcJ^p2wspjZDHUjg2mgZh?Mso^DqVzWXdCoM5CaZY*p6||aixovkpcBOpG z<+T>@$YjuNp${QKu>p9|NLxFOMIp!p-RAnDs3=*TEl?k=hDwzWG=j5Ae)dX&pva*; zJ~o!}k)&&yPi)Tk!5tlH`7w*X4dwDooWe(}F#p+WMfWw6xb548iy`cSb>d`yMfwod zEWh2wZFOl}dbrr$y^jL@r^%WycCE`rS{PcEK78|g)NxegefbWtiV6-#LEqswECF88 zOFmp0ryt5&`j6l0tM1q<8MiQvKC(T>ECbaMupU??-lNy015*Pn;cGl4CJrQLNe; zlzTB2gmdlpjudG~@25|^i;Ih+BH@dzCvV)Z@tk#N7w%j<|K8=SfWQO5s&;}V?^2uu z{ct6qepw?`#{1odW7%9~^Pil2?;|yWa=7gt^S7GWv;nM$6NHy35XUw+vF%pEZ0{g@brX~|_^5>@XtuP5!dlHnTc3j(co?b>WtT`FLhB|d~VRJ{9` zhujHP*dUZ${r<$2_ys01QcO&&W4blQ2C)56T{Y{GGMh5L)#<(n|t~C zLO5+)VHK-kYx~UUQ;Cw9|NQAi-sV>>pKHUuoo}h*$w?3R6?Jxa6=J-!H=7f;(_CWS z0Ym#v23{j4CzpL4VGO{>*G_K%LI3O>?uNgFoR$}Wx>35K4y!mh?%ThACO8(=sG%?D zLB&Ct^O!`<;lXaw0c#Zlfti5q=VX8+0R~Kw_WWKQwD|7bg^^M#b@R9Awu1U|40S$+ ze>nj7-v+c59$2+w?c1w4Y;0`G9ESz3zws-L1%MUZBP6@^CA7?SQa=C1i(lV@AW`t3 zu~F&9(l>oTTY-og5JR7JJyTX*o?BFOS$^va0UsZqJA0<}U zz_t9wuP!}){P^os1lva}CxF(!evi3!0r(WCKtC}){`1FvYVD7r*I(!QvVScU6ko8n zpN~8Y04nj{cx!@Xk>;Q{Dd?q;5dp45PHwI$nmEJ3%Rl=5_+!BV$Ku5L{h7nVwFsW_ z+>EA==TA4tP-k+w`7DhC8YXZQPJfFA-spTR?wIrHm4TVx6w%0Q-{R#{tigNk*Gnz$ zwpfZxE(>s!-QIMWoT#qO2eEQ+aQF&vM?VDB5FV#2EiHxBOEScCf~NYKZ0wQ%WKB=1 zg}e$bq&{&xFIRI_K!oq$wHMz@mRjpQ;dl-^>ffD@&WHB@P6?Wq*{;*(3;B`>*poq_ z(dj1=&i&Y_PlNeaYycz0fyOu_&1vGz$bdEz02qn4*1mTF;8Hy2R{3PNw90A3@*rk2 zT+hIO8+T3SjrfbaX=Ct+-SGGE5YX?1;tCgBv{H<(eZAnbx{{)q-G6wEyF0ow=eh{p zDITOiinXh0N~(f;=j#kbMYtJ_+nY-dAk{?pi_D+n^y$-O)}6<$msv*vig&n|oCg&4 z_xEQpMV~!;ajANS`jOo2SL3&r>##lP)isQBKY!i_aHC_fYI12*eCjP+jRxQ*cEeTG zbDv*1Kk*4;U!1JJ!RkN9K3sh96#e#-JGve}6lULjz1}lPsm-sQ6j8;{v05ecj^}V& z!6ScD{p2zHDMdhX3IUP<5IYmu?2VIUUES5S`rysaz8-s9?%R87A9Ay^&-Xk<^B|GP z{*e*Br%#{ukB#ldDBLhH;Riw{0nFP4;DZfV+aep!+aYDQ)@;cm-H$MF00#I`L7JK; zYF7LB^LMUbV=wrwHF4A*M({rp<+*s^Xp^_MStNf_h?)>0!w~PS6^re;>^SS+KSxG& zWv}Y%bE>dVuzEP)``t_f@FMDlOHWUaba5wbtLXy8TBLp03%t(ai7QNtYF?pxDdW z3Ft$sH~07Id}pWn*Hm5{2EGaSJsa~YC3um+Vw7|G=l&!yV@S%4Ac!GZ7+F~EZ%zi^ zKock4bakDb@uhQ^ugMqP{IH#t99J*l9F(kI%qql}9Z-Wb2dE+BH|W?7X4f~FNKVl= zeoWgtKZ;)mX;oW6J|JzfdHPiR^Rg|8cR#juH}Y5>xmi8V+uW)wn6>U$J{0L1zK#D; zN0HVKXM~QBse~`BmS4b<{{rc(4KkG)7#cbaRv>M%eL73>1%I-V&}@6f_I17An4aGs z9v$B2RF$l`^@)&_0RT`T*0?UvB85l->NmgMogJlH!C`huAt88+j2Is7@rT@3FYfRE z8mdoDO-`yj)th&lcJQ zUsvu0|J!@NEQ4}#qTlbNm}p)-U`#VKd!a9Y%wxvaQN~lcS#qN5wwWLUpje9|l_H`z zo8c$B)K$k13iO@jsddYsOK;`4Z`mBA?P`3lt$E~em5)s$dJY6p4DL>L_hSJUfl?EBo=&}Dj}3fpTyTF& z=fO}j$x88qM%ATOBBe{$!)V`qJ3%z)7S-TPf8u29OD?x-!lkMf&%{bkF^#EFvBY?A zG-@P?jW-dkMMse{anyw5aP(>yH>lotw;4B)nx0GiYkW5K_VVVr=D9ChsX~6NvXgc; zc*+wZ)$hi;@EM%XEK)Rti4TVLeoD_L7}IXF71s+Tf42r$I4NZ+Zb5WCvOkpcN= zwxF%dIYzFBxhajWSPNGl7N*{?dhJr!7hO!qezpl;nW3@0=etla5cF3lD4?~aPKQ@o$b_R9I2*{_O^9Z%ylG*cI?Pf)W+ zVZfPdG#8G3oeDYi~YKHb1QC~B4C8# zSVE$qV#fkpgcYRwc+Z?UhHU*AX~OR^T0!RS?%vc^MGs-SUfuHfHr3+F#8S#L(h5Z> zl4o8C) zT^ok(@eN_whpb{_ZkxNlIKtO>ezdj*=JQ5kC%H)Yfi~q~mnk{$+_&u>`i@L-O2^Yqb76~Tw9 z^V{wR5&mLK-*#jiFHb6W&l_i1(dI`Jh0PuAZ}dc6FSlLQt=nWDvn(wuJ7(1ut90Q) z^c-)$w8vM{JE5TokQR`6N6?9*P}$-n=GR(wpC5BxnZt?Cwillo2A_vR4wYhP_qBX{ zB<|d~6aV<}85wf%zA~FGTBy|kLmP?ZNNqG%R941sYHIR}V(OEl4;1`BVNZ49p47hc z(>X?!7gl)ewGp+oGW@2s^yed}Tc?^MRNE8OOrO3v)Mb_NA_cSG0?BbzbvkZH<3l8* z26)&UuNL==uCL?inGxPA@8d?#)^i?)I!3#0TCf-%uz{q9nd7nhV}LmaB!PuNiRr2Y*~e-M$R6 zXb@JO;8e#}%mo)GCLVkLSe!yhNvWf&>o_u^i^DyumVxZ0<2AdNJ=mr-TR|C|Kl$MrO`>kfpX+-lv#Sx$_eRde`VCwA;9B;tEv=s>IyU_x2V;dl z8j|g=>0HbA_`#m|-YScL_E9-x8zB=$$1Ld*mXvfH*hAQ5Txx53I|}>J8dv3W`7-q@ z=P}z=?SvOEU$%fRTw>eJXDLPJAwXC@>hB<<2QHKnRE zi-T&Ixeb4a5HA=qR8lgDY0Pbovw#PNg0#)*;)0jVrF41I)x}pWfPCn`j=Q+qV#WA7 zlanRg-(=PKMu#}mE-;P1*gwDO9D^%rcnMLQ7p3SGe$;xeq2lA7zCJoUJiL|7&4~1L zwt#?uj3Eatc^6Ytk_OXsVT#^-MeZo=D=sbklR6-8@G zFgh1YFumuk@a!K!g;O@L{K~IicT!SL%F4-2&CQYCQzL*s#>Qjl`l`}WrSsgkWaO00Q|jNpf0tBMse_A!*t;$W_H{V`o|pk1l=59-=}D7|S)2W^_WpQ63v0Ra z-KCkuRsArzQH7D(k>JCAZ7QkCQU<%XRd1$OPcqOtkTKBu-vowNv7S%$m&5v`7506s z6R)Md8A`3K;6I#x7)0^>jFXCL5R&pFv-?JimWfdL-ma{n;`7sf$7Sf~==uUp1ZwXV zs0P2S&`Fkje*6(yK0GB7_oLs8uM7%9<;ci!;C_ZmFtqRpU4nz5;?WQdaop1Ilf%S7 zdo)Ckih>k3gf2gvDD3~!)7-k`g}`n3iYKs@K|$SG-=|NJAg>MP!Wpk#F?f4>XK^08 zPIYuHQOAjiiIvsWkg6)lw4fb(DQRh?yn)7v309**1|J_Etx;^FdG(bGMK|iPzyKgD z8v5C5Nx|b!iC;?yQQMno-M$#62}nyUX|Q-$#jy zSGL-5MDdeN5-9iI{z`XwAi~1VE&?0|&eNxfpzy8v&8@YJfq9j7j&p-AuAc3qdmjxd zb9!c`6p#{YJG)6f?saWQX13LO|8QIRqNJj(ZmhDsg=S-83s`9+!D&SpoH^v6s?Ko? zdlsEI0Tnf>>cY2sdU_1YtjVyfa?wzuWM7=e{f)2m(2Xs?Z+~Z_`Nh=&9UUFa_S$T= z^Vq8_PR&LzpEm+liJ){$7!-P+yMEu>z}qeD?K64lK}}E?a$Tk41^7+Z>CkAjimK`q z)QR{(Rt`6+FQKEw@3%6wprD}P8$S^!&4MV1kc5P!FCom$-5ne>@}R9LlCbdbXe?*g z<-F!B)fhJj{^i|5UoudTYQ|CU4m=dKAz$~G!_}_HkSAP?0>2N2$t8? z(Q%uld-buWu@TSp%_=dB1#b_W2E7xw88$Hwu?7XLfZ^U{3*Mt+XJ^lvp}kH8;%C#9 zYymhV-03l7dk&Pu-2sos0-)EdY>m$DZmJtW+ovH-{$+ZaLxwuxOm!J22N)r9Ad<%A z%M8f7TrK7C&jzy9X?{-Dv+3&UW@SHYfy$v$i)P~L+S+I=M;%z7{wgKwtJ3N*a)v+$)y%47LMB>q6c3E>%Qwg9p z@)p{7;M{$x^**~y!5-6suiQUFXCflTL?yq!eueUssEQZ;vDn>=+SI2{OKrLs%3r%$ zLgqw6Q7A_iphi<@Fhpk>R#;zz*Y&*G*aCH<1ipo0Hq`}>nQDD{|Q^o44rI0Xtq`+;Xv zkOu2MaPPMMj9WqW&e@cf7L^GaOEo{TG-OQXzs?~OeiaOqqM8~p zo9`vt7&yt}){h?<04}139YqpNcu1kqGj*F2#~-r`3&+QeK2RAhGEGQJqh@Ai?$eEY z3}IsAV*xM-5ClVbbp2^bi7+LLlupMd+_lf92Mby|)mA}0GN-gOM7UYDaDsWcU!-~Y zv4Ecw^YHNWiD(eX#&D$gPTW%OsD|>}aBvgjOXm-`wH}8-!Y&%CG{|oBZ z4>;T?8RC4*WhDZo7@|ER5hzpoww z=XroG_R@k6ZuQa4$>0AJTut-Nak?dnd!*>zJu3N~InE@fCzlGKRPGIZOiueB5(BBm z?Nw1Kinc%;KbdV52XyC;ALZ5;GruZVRV522_4!Pq>Yvr||+b6%*L$^szj3?w*q zP5j4(^Qx;K0w{*7{)Do-^-oqL)GQiMwRr#WV@O@tL&;-~?u89ps*awGO&g-GZ&>^l zT6z>h5OOLs&ueRq52I;&(BNC0;yE(DXhGIpWc)Kl^(Ri_aG(3 zv)v6+(C)h|{r-vz3k$rGlEa0bV85<_!=$RB(hHeVK0!h3-rgSlh39qfXca{~27~bb zQCLNPp(XFxvv80pHHc=t7DvS+6s}#pstVylh0A9djve2d#t;=k{F#5^>Tz(i?mu|Y ziX`~L&Z~$pS^1!F*b9i*Rdle53ZadyZ9io0V6&GhfADr+p~x%J*Vpfz3_k2ehTf}? zMnU1?ivTuIqhb(sLJ`3+B4Xk*K|$i+UDX6)-@m_f)nKsyf~qPJu3DzT`-g#QPZgw_ zAOmy~viZ6$E`oI{O%&0o*Bn8Mo&i%7CusJj14;Bn{yiQZ?en*9)7~EJI5LSl(07Ac zLt~qXX;^>uQ85a?0=Di2o6URr^j(}+w>ya;3)cg<3>s}q#B|4ge^(cl*P%eVSpiPL2nCZ!O)8l@y{ZbEu>4N(McZ( zGQ_h#*SA_`(kSf3gZlX@QjZoA67mOwYI?Be`9V${>@GQXe;b5!kZ-yt;XInNQwf!{ znuoiShtHvIe#4PZtB~p}p2=N&!UiIvxF`jmpNv{*veyS3YtKkXB%|+4=X8hkKGt2X zhYhx2kr&0q#m9A7jvYTf^UDr;T#C()IRh^E1Pb<*Y|F2gJ3hX|eL-70?;f+HgOAqf zu!x8&0RghUl$c!|48kuGK$^$$fik|ag7fa1*4Y~fjXWDA$l+fEbZ>Bc{N;$asZ9<( z7ZlYbnbF+#@bu&p5{g^gDe{}SCt1yj7>|H$hJu?K3SACe$eB`EcSiMVv7-d22Oo(n z0R7W~>^^M0X$YSS7!REG6PL5oe*ScVOy(?B2_nfnp|@Li(BaKyx4xZNB1LRwBJfsM zes5dc2;4aFx!OGx9c~IR?KmBR-gkXYceU9CcbEOMAaExxXQid4ve31*%S{GuA_EV$ zXU9cYM6Ek$$;rq-5*1Z|HD$3QP7HO*+Q62+govvFa1(0|XpNQEul>!*0mvEESV^^9dF$A#K#xMP`YXy9m)lbL624yF3a9#z!EbVYnu(d& z9#4+PHz z3u=)|P(OUqmr&J$I+8y%_;|9=jmuDh?lim{T~5?-?t^T$-mz~L6&1aJa&`krjf{=? z&Yq2d`k0z*SpyFb(Z8l7igbp2<1E(vnxY~CcRWLWhS9fyXkW_LsYrZj@O~d8;#wM{ z^>5txfXu$gofHLz>pjc~E<)$n*b^woC8tGb!MK}LHDYmtJRQOT@}`U@SD@_xhiMulC1 ziUR9W!)mKfIaMNU$KJYLR;v#-1~07**~o3@uLyb-Rp#LaN#%$aJ=PlM%l+7WRN#%Tfbk~4i9 z@CY5=1^0Q@XNmkf21CfJs3~Xq=FE}AAVU_a-V$1^*j?>ZKoh>nh_>`VJ;}Y--aiGzD|*X+hBW1#6ykjwo`F z-Ozt-zuIoTKX;tY2^eu4R;*UM5Gn@V7;F!+qp;@bZ@b?u*LOF$us!uqTj1f}X(j+- z(hr5uHCDW~V7WMMcR|NQ2NI8x8dl|*a-PlRvIeVm96e&ZuwYV@SWRD%%q6=_lc-0l zX+k&+QbdiE1P|pwQuX($$)Fi*Ms-#e#}esNjs1g0so4GcGk%0n+)tv}A!goyfSWL_ z^M3%m5c`(0Fl=^TNsl}W&<;2Cxt6}|YkJHX;G*N^s6W_=K`Zmj;o-U9NFL>yep(E} z<;p$O-`@mxb}U^x3q79MS^^MoJ#r2}K47a-Mi`9%f}r{S)1pth$3^JvB%S~rFOG}I zB#crJw_(5@{Ftai`w}KV?*s4%mv=BBf)jGGzH`+OLO)27S_ar`oKBx}bz*08`2$do z5_e}+AD*7(;kg2Eu`lJ5o^*u|NF{f@iR$KhxVm^5l7gC=k<1w`!N!92dgP}5)vNC6 zb6jW6M5FN;8OdpBX+V=e;a~%@QBdwTM&r*bk014ObZ}Vs^)Mp?MU^O}J?&9>A;Hi@ zGcdf7(b^@O62)Q{D#pbX2BFMI(c}YYYjRiDNoAPy_4C_0e+Y^>ADlsYCZ?TFHN*@t zcL9KSUQ~ny-EkhQao6&MLxG;TejI$Q~;Oxg3Vxx+6N!q$T%qX(>_1>{}bpAH-)agAwNxlN458_8U=07NxDOcX&%MwSVow0pbX zO8~Ro)Xk?B7qy_L>waqLC2(V8bDur)P{%)UHzFd&q%FClG*cep*8x=28q0j$sy>hg zN_tv0%+%G@fA}v^b%332Ik&^@rlJDTTm?jzt5!aciUejn2OJ3 zRh+I43=B+Z*Z7I&&Q+D?2f-%oC8Zm!8LX*gqe7!?_r(U-06*gC=}I z-1Dd!x~4{l%6?Gt)mDh-4ij%~;q>$pqmQ&6M#I_df>Y{QElU~=aDROXg?agf2oWw_ zIL`x-@d9}6F(jkFR)VMeJTo)1YX(<{uf#NaDicxTzj4Ml>~fAgO-3+I&%`REfFBnJ z5*Yb0X*xSQ+kRtV=&{+rbr23}Bu^ztPJVtA`pyDB0|h)LYvHZh%Y$K)#=-usr}}(iHmG%xL$x`)1phe3a3U7a=$I}Di=f#w5>1SmZi{2n zhEAfj$iQP@F_39DP?ZRK7Z+d?nS!Br$i`=1zL+nOnkyO-QM4pU>=7KSt+umysw1cv z=OrJ46nK7rp9v6J0y?@G>Z0aXO7$pc^Y3|{uB@u^1e3II4sRzM$Mt$M?MV>5%=yfE z3RA;HGf8`J-D8nX1QlZsEjZ%|so&op`*du!j4^YoIu9yfOyWXY?C_85mfhg$Y@)cN z=x|bSWAmWjF(NKSiVTGB$2gssRi#nu2~__tjEFfkDMCsB z9MZ4Pj1X!wumXUJ1|m^ExCFHe7@{_#@d zCw{K1>M=hCB?9*3R8(^}@K_Be1`ixhM8s2R&v3v88ju8H;kOJ$3$K^A<&?=TVg~gszAkwufM#Kj!ygq`*BWp!$c!429zGfm0n4R_Ih)n%L^_3kp(eW36&Um z3Y^}@Y7_i{-3tb1@z<$vhJ%&X4B&=bD3J7MN2qO4y(@#@Nc7RA%fXi&Xf%wCnSBYn zVV}^WkGo%xkcJ{Kx<7rW9};kAsH>9*7*%xSez@R#^TN*)IslY~k*+B!-o}l423TSr zbOVAIH4uQ4coatKzN!X2Iv$|?dOe5R`CSng-8pLeg(U-a|AYz{v7T%k-KFhpWPb!ug_HaQmz+}_`(;La7s$1NVtr5Kw}&0D!~0ZP%dmd8$U|GQF%>~ zN^kkZ`4UA(oK#Xa>fP}4JO^cNeF>cE)!B#!PF$c3Ael?Lx&!Bch8$3rma-AQ(1Mf! z(|Ce`p&x1?Vy6idGa&N7>Bke&DT8Xy62Pi$p4k{d>?_k8QQ6z1+ARcNii=SC2GMxa zlw?PCUER}(TeHa4iO1O_Vd;an7a?~GN`-M9gJA3huYgZl`cx~46yYvrrQ_YZENJ#R z>mlgs>Z;n49S$Y+OQer$+-Hb=37-T61_Hk|W{`mQ@R7>9Ob=>86u}=AtPT(Zl1|FzX}0H#*-%-Jtm1_FOa#VhWl#Rl!@2PP^hkaK$0pgi3Ey zHeoLSBcDk^*r0gq*f9vrFi5afkO>D#JRhAt*50nZ>Ul&nl#V4%5>4Ro+*>|{@+m~=fc#G;qUPcB6U|e-zB;5@e7#(%by;3uE?GA3Z zGzyj0!fptrF%ya-Bd}T!p+Z~xi_{KxfCa|sC>MWy>#~-30-51Q&`R*Uvho3hLHWQs zki!b9FP#J!o1BU&7n~h(O3EDhz#Sd%rn=0ij|GRO^*BikK*6;NWTpqd`s*=2lysf= zip`LY+T`EZhC2qy^j@BLioRofIZd_`ImHgB-#DEYR0Q3JB4;S*42P^|KDh5d?ML0V z4)*r$yL({W#h`_U3GKsQx88pd^d2O8035mhcSY8fO&&Xuv@L=15x5{Mdt?92aRIV3BgefE4p7D5T@8Y3lCML|qqnbnBQ7l=lO%ULnwxOz{$Q zaxyZHq3i|FzbJIHdhdBU%7vP1UQUy5pTf2IvOLL=SkGlpb4aYF%RCBCg&A=V3O~9u z*w@GIklzgW8ANu|*eN<;LbAw%&-GK#84iZJ!&BTioh$s{t+jhSZ2qzd|%vmF6*7XQ~sN%qqRH+1XxO#%rGN$8Uy@2-Q z7`Y-@+mBtsxa^d}jEYa3O{aLFyTE^&is{jyMVMN^tCD#(Tm;{J6gm4v#>LUVjl`mf z{Sf*0uDP-JD}Gg^A%zhu2>)%G7iDFM5IZG?hiQfrOZmy<6GhU^V$45KA%HTE=jY~7 zNu4do8Fug~%qfp##ypAcT4SOiM#JP0#d^12eZY#8|2!UhVilW)r6q?iVO&O@9c`@U z^wOA0TPh8EDI&oriSVN58?c1K}b1DmKcsn>(d|+VgTEWnT6hYHz>?-ZcFrtiLy-7D_cT!#;6Fuq+ z-nu@9w)06OmX#Kp_`af6cZ{bZ+%cQEz ztxTpbNPbc-I#9BwYy703TCuRS7Nhm?!YP3&mV)o6A6=|%csVj^qNPXjJc3M3CV`ev zEa)_e;6}}t&4IUpJx|!0q-VEfmxuR%lQe{Gr`?vD_%Qrq;~56wZo7!`N72TE@rS-@ z+VlLviw{Mt!hOO>W!WMn$w_JLK60ZtE-7(0og(Fu={g<{(DEW_4>K$4M=YWp8vfEI zUzuNjf{Apaw&n=BO+3ZgMR6&{IMLDuSBy+2yUMQI0v(#)x1Cpgp$zU66H`BSm4-fk zRRk}D&2Tq(ww~YYBJ){X7d@Tq^+1U)H|S{H=DeRI#YY|r4%6nBAZ%@sX8 z=#_`Y-|8rQeBKg2YAzum=&!^u?m)LlC8wW9KE_ZMBWPKb+Efo+IUnL&(*+pf0j6Ih zwJjy02r{q4RC^IyA2m10Qc+UgRL5BHqA>W7GkQ{j2xews8N`0+TzHjZSh7=P^yfyD za9;)xMhY(0Al5vYEziv@Zm4S9;N-Vbb8m{|Av=NtRlJZ}L8j1K8_7yaXbss=_#%y# z$o~x5D5D`Kord8+8kFMDG-d!O2HX zjs3%ulh7rMg%)7wOQm&b`t^PI7-f~AskPBl@)l*NfAb;KHmI6ygi~VRTPmOpT^X7j zu3WRk7o7j`V*q!Enn=SELq$-G&yaZ3xJByU22w{f_kaBO49VF9$`1O#Bk>A|T5!jG zDDIdHXEaEs*n*4Fv0minr=!jy2-<*j&Q0}|76yLPKR^4v?Trs$A|9=R!KByg3L?j& zE9THq%z(~G-ZDShKmaA7#h|5OsNfo0Ntx7%$P+O{U%`cj<~0;F@~y2Awpikk5r-c2 z1u!Bk&2Qe+Kr0i*%yL+^TH?(wE<#s434GU$Dj?kAxAxg53Gnthr^j4UxKYrt0bTWf zEVi~Mi$_NX*{oRDdFs)a2L;gJI7$cc>Ua&XlJ3!_*7nSBWVgh}-%4u5=a_EOGHf*0 zLEnL|AQ6MF=dodMZStSXjNszq(?k=;uIye!q!^ChIn5zz*Tb?%Dq`mi$;g51BO)T+ zfjX_=^n2Ic4SVD~*!dx}NE&&pK+>YdjrQ{bVb1H<(D=y$VfcO1YBwcVqbCG$0Ojeq z$i}3h)>~rNQ!$j3lp0bjAF+7rl{yU{Yaiark;EaU2J;KFs5>)PpPc~+~DCg9vpwI2~Q9TUWWbH0W zs2??~&fvgKClUWsv=C?_p<=$7>)-&jOqp?Zx4r67eI@1^RZ`CRd3CDA{^tp^mI3SQ ztCbBX{Sd5&Y?$IWB}3^Da#jc_3EmYVzdskKBCx|1`AR5}MmA6o`Xnec)Nt=Smn=yj zB^XU{1egIkjf`J^{oSC3)+iLanFm)Em)n?~#?2hFO?>(CM|>U&pI0lRLGd*{EN|Cpso0WGC;QSh@GZ%EA;S0+IHgLK@s#Eh zL=w8j_{+q^rk4#>d;VOhpu06czSFHythA9;`6~l&m*^fRm6I1oFj)6IbQGn!Jc{WbKgn=KBzxaA9 zRrX~Q@4p{=gPdk_I&&e61yB?z6FB^{HGDtBMQ!P1qxd;XyC_-}yq%0xL* z!P>f7AZ7dspSVbdo2La^=uHlkMDla%ULL+aR4Z{i8NU`t?RgloV_Xm}N@n|m5EO-clH8VZ)6B&yY_a~<{$ zSMCQsqLa(Ibw5QWhN8}}+o?PNKvBDvG+?T00lA=Ndl?*`L#2?kTVz_fKwW$C4`t7LU+?QjjT{g^DqL)5;%e358wa^95~}RoD*DX({{AeITd&J*(s8r)`+P}eWCZO_ zCX{9hmd=;Azr($PtVmHFmi)ja6&!#(Thg_@$EprYE-{?~#ss4aCo9Lqz?^7D(1?E+ z2)4kW3xGdUOO38AytFU(H!={X1tAxXcz?e&kQqES-j`cu?D_+A^(4J#CGEly9v9k; zR?>o&*4BpldQl|f-=B+AYrEDzNdB?AI}f9bdn~prhXyD$O7RBluZKn+eOrRGjlvXK z_Icw#{KyVQiW0kK+&Lj}6j>UetV`O0YqzV;1}Zao5@ z#`88alOv>ITlCngB*AoLz5-=DY*?g`*9vo8wIC1;{y5lFSjDl`R3jFw33EWCg@4z~;64RGNZXp4 z_+jncPdD+%7vZe37^=A=w}+(q?H(5bkV7efFbt{5o9DQ@MG4|rpilVP+2 z?s>~_=gmYQ;h3affpi;o0XQ8HJt+MImIz6UJ@5>$$5NOQ`2{F#quAY>`tz~Zy}i(* zrSIvuvB@Dgc$NPA`I!K~aB@0^xQN9JN&ccU++8R_Rx1heWViQ$MYA3mz%COY;6jK5+CB1@!;c1K;sEkI;vw6C zgdgUaoAO=X52bWki~8*;(XWpD1+&g;+qM^_>U8g>PLg5$v+8iAa?7px8;UO*Vqz*I z8DgEJCQ1)xCnkOaIzRcZ^PANdv-_3HR~W=XE0Bi7o+QNqBu!sW@A$K4o(fhDin~}j zIwI-E1XWQCsw%MC+H5uZ!kfFAwkNBq)+$)yY}oNpiw96wGT9WK?HnqO1sxr7B^n;@U8?l;62qQ^OWnC^*VFVBi`7JX&vc3RBeK_n zpe_~gGuMvy>Qs=%Bn-Yi`Ibccg$lYL>}~3sWYLIz_Ep?jA1FhQYu?$jb~sX=Gf>Ia zRikGRv**k?Pufl##c{2BA8x?INZbY0i8(mE_=DWT*lfUhR80tH6Q!if;MsLa_>BzY zsx!#b083op!4=Z{DujbJ%*rthdj9!>f_oniB>Q}a+y5^O&K!J?9q&%c_lbLXSwjX) z2l7L7=g!?gI<)9c=8|-WGVT#K)2P%%^anbyXrTm`hso6fze?i(zau4V_zW|g)>ZTG z+}T$93ch)6*akC6_ahbV0*HR?N#0n&+WdZC;8zGj9+1IEm%owhw11yqEiGpiCy(fh zjvxa^(vf8XP7s1hN=k~7^H*CDfbWbC(V*Q-!BfAG>?NqUiw1YiUWM>TZoBXr{Nbps z>a%Fh>@0O`#$p=?Wlm;rRFm$Og!VYDA;YyUzn%P*#fO+S%A1pQ$X6EIuauYbswRhB zV5Yd5!*L!LUUNr}ZI7m6J9JRB6zz`E(!_KgZnPS}etjO1eIv^Aa+NAXaP2f~{C%kW ze}}GzI7W^?aGC5$`Z_kFw$>gO`lfWM!(14bph^+sw4!cUH_;-$s60Tn1u7gTJWM+0NT)wJqo0-gXj<|>JTW$d z5}f~wTM?+b8o_k5J@ldK5&L26T=xTW4_`2tCHigVzvxL@=Vw!fb*~<8owIVI^OtK( zPnzdZR$%~t*~S~aTNK~WG?r;W52x{Taf|l6MRpDv+V&e-_)W~@WDn6dz4>96eq!#= zO5)sYUSm);Fk1ELmRMrc*R&HJINMZ%7>v+dlP zVt>|MM1o3Co6C?4uIS@#q0%1D`dHf-G!xO9V$PQy>@#A0s$8n1^?!Qwv& z05H#aUvt`oYr5o7aN1hd85*>DLUpWG8eyKspvcP4%R!D>r7d z_7VGqw<;^o6&9M^x^>GZU3&WU8;yoGWCP}_@FLJw0ZTfC?m?n|61C>3*&9KJ=&r)4o{YgiM zKCGfZ?-<~?{BwGG`t!;I`}%{b<Li!1ZR`t;c@jh*~dw$CJ1|G5W zEwcSjnwxcOY;205aD_TTbm78%`k;Lx1?J?6mn{X>6Bmo(-q6k1NDROI zS!Q^6xaF!1@9RBV_?;bTa9;7YTRegM)Mi7}wFYA>` zFJng`W`6@6M#pSD(&T%QF&EB-{xs4QK8^5ecy?u^Plee11ZjbAx4gtP3H}Ypgoe2h z#7bzWclWEFTtTVL+}l-UGYYe2l{&&4M#>G7BNSm-5QP2}OWbQ|bQe!w-`p4~kr6K- zvepTU{81cuU_&9CFC&P8E;t!8+XP8gFUxV@= ziUR51uXmYBO`Hp(z)I*Y9^0r8V=74E_rU4X1C9_eYL|pAMLaFwGNirs^CG`>~fAY)@g0>lJ)4wcyb3{5 +https://www.youtube.com/watch?v=oW8FHL4PiuI
    Hear from our sponsors at EuroPython 2023
    Explore the benefits of sponsoring EuroPython: diff --git a/src/utils/markdown.ts b/src/utils/markdown.ts new file mode 100644 index 000000000..1a3fe4e52 --- /dev/null +++ b/src/utils/markdown.ts @@ -0,0 +1,30 @@ +import { experimental_AstroContainer } from "astro/container"; +import YouTube from "@ui/YouTube.astro"; + +export async function replaceYouTubeLinks( + markdownContent: string +): Promise { + const youtubeRegex = + /(?:https?:\/\/)?(?:www\.)?(?:youtube\.com\/watch\?v=|youtu\.be\/)([^\s'"()[\]<>]+)/gi; + + const matches = [...markdownContent.matchAll(youtubeRegex)]; + if (matches.length === 0) return markdownContent; + + const container = await experimental_AstroContainer.create(); + let updatedContent = markdownContent; + + for (const match of matches) { + const fullUrl = match[0]; + const id = match[1]; + + if (!id) continue; + + const html = await container.renderToString(YouTube, { + props: { id, alt: "Embedded YouTube video" }, + }); + + updatedContent = updatedContent.replace(fullUrl, html); + } + + return updatedContent; +} From 630f5284cf5f8db881fefa23a9a996a4b1fc353a Mon Sep 17 00:00:00 2001 From: Niko Date: Fri, 30 May 2025 09:42:58 +0200 Subject: [PATCH 2/2] Remove experimental YouTube feature --- src/components/ui/Markdown.astro | 3 +-- src/utils/markdown.ts | 30 ------------------------------ 2 files changed, 1 insertion(+), 32 deletions(-) delete mode 100644 src/utils/markdown.ts diff --git a/src/components/ui/Markdown.astro b/src/components/ui/Markdown.astro index 044cf035f..ca465b4a9 100644 --- a/src/components/ui/Markdown.astro +++ b/src/components/ui/Markdown.astro @@ -1,13 +1,12 @@ --- import { marked } from 'marked'; -import { replaceYouTubeLinks } from "@utils/markdown"; interface Props { content: string; } const { content } = Astro.props; -const html = marked.parse(await replaceYouTubeLinks(content) ); +const html = marked.parse(content); ---
    diff --git a/src/utils/markdown.ts b/src/utils/markdown.ts deleted file mode 100644 index 1a3fe4e52..000000000 --- a/src/utils/markdown.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { experimental_AstroContainer } from "astro/container"; -import YouTube from "@ui/YouTube.astro"; - -export async function replaceYouTubeLinks( - markdownContent: string -): Promise { - const youtubeRegex = - /(?:https?:\/\/)?(?:www\.)?(?:youtube\.com\/watch\?v=|youtu\.be\/)([^\s'"()[\]<>]+)/gi; - - const matches = [...markdownContent.matchAll(youtubeRegex)]; - if (matches.length === 0) return markdownContent; - - const container = await experimental_AstroContainer.create(); - let updatedContent = markdownContent; - - for (const match of matches) { - const fullUrl = match[0]; - const id = match[1]; - - if (!id) continue; - - const html = await container.renderToString(YouTube, { - props: { id, alt: "Embedded YouTube video" }, - }); - - updatedContent = updatedContent.replace(fullUrl, html); - } - - return updatedContent; -}