From 964dff001f75854dbe6a008e0852d6ee14159299 Mon Sep 17 00:00:00 2001 From: kiwiyou Date: Fri, 1 Mar 2024 07:00:21 +0900 Subject: [PATCH 1/3] fix: svg data uri regex --- src/handler/image.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/handler/image.ts b/src/handler/image.ts index 99cff655..5f9af845 100644 --- a/src/handler/image.ts +++ b/src/handler/image.ts @@ -174,7 +174,7 @@ export async function resolveImageData( try { decodedURI = - /data:(?[a-z/+]+)(;(charset=)?(?.*))?,(?.*)/g.exec( + /data:(?[a-z/+]+)(;(charset=)?(?[^,]*))?,(?.*)/g.exec( src ).groups as typeof decodedURI } catch (err) { From aad9cc64969dad7d14d76985e49dcb6cd266ab91 Mon Sep 17 00:00:00 2001 From: kiwiyou Date: Wed, 6 Mar 2024 06:13:55 +0900 Subject: [PATCH 2/3] fix: correct data url scheme --- src/handler/image.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/handler/image.ts b/src/handler/image.ts index 5f9af845..47260104 100644 --- a/src/handler/image.ts +++ b/src/handler/image.ts @@ -174,7 +174,7 @@ export async function resolveImageData( try { decodedURI = - /data:(?[a-z/+]+)(;(charset=)?(?[^,]*))?,(?.*)/g.exec( + /data:(?[a-z/+]+)(;[^;=]+=[^;=]+)*?(;(?[^;,]+))?,(?.*)/g.exec( src ).groups as typeof decodedURI } catch (err) { From ef7d8eaf265561923747b5f9c928453361e77f9b Mon Sep 17 00:00:00 2001 From: kiwiyou Date: Tue, 12 Mar 2024 06:29:38 +0900 Subject: [PATCH 3/3] chore: add tests for data urls --- ...harset-utf-8-with-comma-in-data-1-snap.png | Bin 0 -> 1322 bytes ...e-charset-utf-8-with-in-base-64-1-snap.png | Bin 0 -> 1362 bytes test/image.test.tsx | 22 ++++++++++++++++++ 3 files changed, 22 insertions(+) create mode 100644 test/__image_snapshots__/image-test-tsx-test-image-test-tsx-background-image-url-should-handle-charset-utf-8-with-comma-in-data-1-snap.png create mode 100644 test/__image_snapshots__/image-test-tsx-test-image-test-tsx-background-image-url-should-handle-charset-utf-8-with-in-base-64-1-snap.png diff --git a/test/__image_snapshots__/image-test-tsx-test-image-test-tsx-background-image-url-should-handle-charset-utf-8-with-comma-in-data-1-snap.png b/test/__image_snapshots__/image-test-tsx-test-image-test-tsx-background-image-url-should-handle-charset-utf-8-with-comma-in-data-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..96936cd61fce3bbb9cb7b591cbbb44e2730dfe7a GIT binary patch literal 1322 zcmZXUdsI?)9Ke}jL!5R&g2d6d2|m`$6J@T-IaRlfWay+=%=zDK}p%8t--N~BOLLjDzLb=#a#i&t-7u0 zZfUrr+t&dN0DYsIHGG5UAGHF<_7Dh~$4;|(;h#&@^ssh5XBv#i6qs7EVE{@J_o9Zs zW!}XLYu81TaPtlUdR6yfQ`{faHf`q>0IKet9(+enc$(D!WNUa@B|g5m9{*40 zy&I>}`b>|(&Qbuf^dE%}#_O6sON)1SLijG4KE@@y{Wl3S!6wttb~`O`0Q&Yz_*8X` zDzu0RhKv+5u%=1$Cg!0cuYKLg6Ipd}e*0biqwPvz$|L>vqO3^Wt5+Tli z$QaLBjv!lF(7V8wZSD>#f;|fJckjrC#;W~_Nzg7sAN^%YoyVMs=uej5jAbV$CIAY2 z`jz&lHw_;1^*$alrPw;hwg_Lgt!=HpAvDpIxZo5`??aF&gWmGlgUvBJKe5&+^d`c%xbFj}oq*hVquu!h$SmwkjRUJIS}P4+ z2*NZwMBiR|W(%-z&e+!9!5Oy&`n`5yElYpz$SI+|O3wb6vw#<2PTLz0+`k%0{wrkV zJt*B7AE~_knY0RKA7ms2ZseV?Dj{j+rSN|J~fSiS%JYHfPUS@I~;YU)+xn^+lPP zwwsrezl9Fq!?}z0!3B|(v{}>Y52~xma_ZCM^wii^HIjLSz9s5?I|aqmdF-Qk7AT;1 ze``lWW@Ou+p;_M@J%TOo#`(l?alTS$nJV!rF7I;jpG24`(vc}B(hA7udE*yzNhwM{!@T(1 n#Z^Em2W-z}D+&KUm~wU3T#PL_({U302V$Zl*Kiux-^>03`o&Ys literal 0 HcmV?d00001 diff --git a/test/__image_snapshots__/image-test-tsx-test-image-test-tsx-background-image-url-should-handle-charset-utf-8-with-in-base-64-1-snap.png b/test/__image_snapshots__/image-test-tsx-test-image-test-tsx-background-image-url-should-handle-charset-utf-8-with-in-base-64-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..e935094bdd9b36d58d1d94887e8a6805c66c134e GIT binary patch literal 1362 zcmaKs`!^E`0LND`tYIFrc^l?Y?jkOlSFLGV9*aHD3|s4Ar5K8&?ww&qMskoms>v0x zOo}Vzz0gG&>2XFXqldUsSHsmm&^e#)_j}Iwx9>0CtOJ2KO^^`?003wb@YvvuWc`#n zaKmHY6p{e|RYL-H4>{@Tr!r!&F-|`-QoH{C;ATQBz;E}h#%^0NXLGkk9uY$2veKSg zKN4Jh^hQN$%Rk2z`%@gHY5;=6M^3;0%(#GT_lH9OkvLTFK9$n2a>kpb$wyhayj+CKvOW?kDqc?2=J*2ncoJn>n$5-6eQ4Yte21LCJ_Nn97fExAXPG5Gz(bTXvP-sJqT1D)0=mKh7YfItQz z#{aH8^{o7#R-iP zbWx7Jag?QRZ`>qfel8qH6kyz^Z#JLZ=PXggr?XM!ktY#xTxUcW+^u(t;~8hk8m7<@ zPplg8FnY*i-|=@?^)X}H&{ImDi)3?{hITSm<1%Xa?Vkz;FA$AtYizt_bIx5d~)BRgu!hct4%XEsdJT&t#~P|1AQT? zP1Mk>9j+%-Uy6_7)77GWoZ0&FVSp(AjsZtPV_)}n%Li!(EuH*Naf|D)a~Z=%CKPqL z566VPrqyaEE{_eM+kR}RaRfpgl%eiz$AYkRyzp`A2f>neFazA|kxj)6)9>;XzhmG- zDG9X00{-nhtt*}wxKOqL`*{XE?O9tXqm< z^?P`^k|H;HOP=8d5j<(7w^sx(v1B<=SRLJp1fEFUBS`Crh zlrM%pwMTX9EGQgdZkQ?X)j$%y z@Ri;@H26+B{B0GHoXK2#TFv-!Frl>3V|uQpCp`bj@sSLNdFvM+!MR-}ki9k`^Zn;3 zYx;rd;MV$h(GH!kNvqadnlQQyQoXT6?%dPW0@-WOt5-DLYnP?&G$^?&V!?Iwn8kf% zzAwujMH9$;M)@}6<9_(1`;abA`~sqD(wEP0{K2+N%_>HEGhHchUZqBvZitLE^tn4k~xXjrjOJEaRe@YgvJ5lgVD6&+iM5HBWN1yvZFf=~VLy7=3HORB!k3 zS;6IyLwkguY*4RnIEH?xWTcR7385gv9ut~ompBJ{q2#aiY-Bv&ZV56I%DBh1I5uH2 zzoe0ZATq3j%<15+_4PTK#etY}zp3baD_z%jwr7>=AO<17 { expect(toImage(svg, 100)).toMatchImageSnapshot() }) + + it('should handle charset=utf-8 with comma in data', async () => { + const svg = await satori( + `} + />, + { width: 100, height: 100, fonts } + ) + + expect(toImage(svg, 100)).toMatchImageSnapshot() + }) + + it('should handle charset=utf-8 with in base64', async () => { + const svg = await satori( + , + { width: 100, height: 100, fonts } + ) + + expect(toImage(svg, 100)).toMatchImageSnapshot() + }) })