From fe4f9949c63a31eb7e294d4ca88c647c8ebfb5f0 Mon Sep 17 00:00:00 2001 From: Andrea Bogazzi Date: Sun, 11 Aug 2024 15:30:23 +0200 Subject: [PATCH] fix(): Parse use directive attribute issues (#10053) --- CHANGELOG.md | 1 + src/parser/parseStyleString.ts | 1 + src/parser/parseUseDirectives.test.ts | 36 ++++++++ src/parser/parseUseDirectives.ts | 122 ++++++++++++------------- test/visual/assets/use-and-style.svg | 14 ++- test/visual/assets/use-svg-style-2.svg | 15 +++ test/visual/golden/svg_stroke_1.png | Bin 777 -> 362 bytes test/visual/golden/use-and-style.png | Bin 0 -> 26671 bytes test/visual/golden/use-svg-style-2.png | Bin 0 -> 7408 bytes test/visual/svg_import.js | 4 +- 10 files changed, 127 insertions(+), 66 deletions(-) create mode 100644 test/visual/assets/use-svg-style-2.svg create mode 100644 test/visual/golden/use-and-style.png create mode 100644 test/visual/golden/use-svg-style-2.png diff --git a/CHANGELOG.md b/CHANGELOG.md index 7c616467c3d..250322e6251 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## [next] +- fix(): Parse use directive attribute issues [#10053](https://github.com/fabricjs/fabric.js/pull/10053) - fix(parseUseDirectives): Fix style tag processing in use tag when reference also has a style [#10050](https://github.com/fabricjs/fabric.js/pull/10050) - fix(): Fix path Arc parsing regression issue [#10048](https://github.com/fabricjs/fabric.js/pull/10048) - chore(TS): Update TS to latest [#10044](https://github.com/fabricjs/fabric.js/pull/10044) diff --git a/src/parser/parseStyleString.ts b/src/parser/parseStyleString.ts index 0a14f8c87fe..c63ded55dcb 100644 --- a/src/parser/parseStyleString.ts +++ b/src/parser/parseStyleString.ts @@ -12,6 +12,7 @@ export function parseStyleString( .replace(/;\s*$/, '') .split(';') .forEach((chunk) => { + if (!chunk) return; const [attr, value] = chunk.split(':'); oStyle[attr.trim().toLowerCase()] = value.trim(); }); diff --git a/src/parser/parseUseDirectives.test.ts b/src/parser/parseUseDirectives.test.ts index 495baf53dfb..2d0c6aa25e0 100644 --- a/src/parser/parseUseDirectives.test.ts +++ b/src/parser/parseUseDirectives.test.ts @@ -74,4 +74,40 @@ describe('parseUseDirectives', () => { expect(style1).toContain('fill:#ff0000'); } }); + it('correctly merge styles tags considering attributes', async () => { + const str = ` + + + `; + + const parser = new (getFabricWindow().DOMParser)(); + const doc = parser.parseFromString(str.trim(), 'text/xml'); + parseUseDirectives(doc); + + const elements = Array.from(doc.documentElement.getElementsByTagName('*')); + expect(elements[0]).not.toBeNull(); + expect(elements[1]).not.toBeNull(); + if (elements[1] !== null) { + const style1 = elements[1].getAttribute('style'); + expect(style1).toContain('fill:red'); + } + }); + it('Will not override existing attributes', async () => { + const str = ` + + + `; + + const parser = new (getFabricWindow().DOMParser)(); + const doc = parser.parseFromString(str.trim(), 'text/xml'); + parseUseDirectives(doc); + + const elements = Array.from(doc.documentElement.getElementsByTagName('*')); + expect(elements[0]).not.toBeNull(); + expect(elements[1]).not.toBeNull(); + if (elements[1] !== null) { + const style1 = elements[1].getAttribute('fill'); + expect(style1).toBe('yellow'); + } + }); }); diff --git a/src/parser/parseUseDirectives.ts b/src/parser/parseUseDirectives.ts index 520ca1e7b7c..b5e3196e160 100644 --- a/src/parser/parseUseDirectives.ts +++ b/src/parser/parseUseDirectives.ts @@ -5,91 +5,87 @@ import { parseStyleString } from './parseStyleString'; export function parseUseDirectives(doc: Document) { const nodelist = getMultipleNodes(doc, ['use', 'svg:use']); - let i = 0; - while (nodelist.length && i < nodelist.length) { - const el = nodelist[i], - xlinkAttribute = el.getAttribute('xlink:href') || el.getAttribute('href'); + const skipAttributes = ['x', 'y', 'xlink:href', 'href', 'transform']; - if (xlinkAttribute === null) { - return; + for (const useElement of nodelist) { + const useAttributes: NamedNodeMap = useElement.attributes; + + const useAttrMap: Record = {}; + for (const attr of useAttributes) { + attr.value && (useAttrMap[attr.name] = attr.value); } - const xlink = xlinkAttribute.slice(1); - const x = el.getAttribute('x') || 0; - const y = el.getAttribute('y') || 0; - const el2Orig = doc.getElementById(xlink); - if (el2Orig === null) { + const xlink = (useAttrMap['xlink:href'] || useAttrMap.href || '').slice(1); + + if (xlink === '') { + return; + } + const referencedElement = doc.getElementById(xlink); + if (referencedElement === null) { // if we can't find the target of the xlink, consider this use tag bad, similar to no xlink return; } - let el2 = el2Orig.cloneNode(true) as Element; - let currentTrans = - (el2.getAttribute('transform') || '') + - ' translate(' + - x + - ', ' + - y + - ')'; - const oldLength = nodelist.length; - const namespace = svgNS; + let clonedOriginal = referencedElement.cloneNode(true) as Element; - applyViewboxTransform(el2); - if (/^svg$/i.test(el2.nodeName)) { - const el3 = el2.ownerDocument.createElementNS(namespace, 'g'); - for ( - let j = 0, attrs = el2.attributes, len = attrs.length; - j < len; - j++ - ) { - const attr: Attr | null = attrs.item(j); - attr && el3.setAttributeNS(namespace, attr.nodeName, attr.nodeValue!); - } - // el2.firstChild != null - while (el2.firstChild) { - el3.appendChild(el2.firstChild); - } - el2 = el3; + const originalAttributes: NamedNodeMap = clonedOriginal.attributes; + + const originalAttrMap: Record = {}; + for (const attr of originalAttributes) { + attr.value && (originalAttrMap[attr.name] = attr.value); + } + + // Transform attribute needs to be merged in a particular way + const { x = 0, y = 0, transform = '' } = useAttrMap; + const currentTrans = `${transform} ${ + originalAttrMap.transform || '' + } translate(${x}, ${y})`; + + applyViewboxTransform(clonedOriginal); + + if (/^svg$/i.test(clonedOriginal.nodeName)) { + // if is an SVG, create a group and apply all the attributes on top of it + const el3 = clonedOriginal.ownerDocument.createElementNS(svgNS, 'g'); + Object.entries(originalAttrMap).forEach(([name, value]) => + el3.setAttributeNS(svgNS, name, value) + ); + el3.append(...clonedOriginal.childNodes); + clonedOriginal = el3; } - for (let j = 0, attrs = el.attributes, len = attrs.length; j < len; j++) { - const attr = attrs.item(j); + for (const attr of useAttributes) { if (!attr) { continue; } - const { nodeName, nodeValue } = attr; - if ( - nodeName === 'x' || - nodeName === 'y' || - nodeName === 'xlink:href' || - nodeName === 'href' - ) { + const { name, value } = attr; + if (skipAttributes.includes(name)) { continue; } - if (nodeName === 'transform') { - currentTrans = nodeValue + ' ' + currentTrans; - } else if (nodeName === 'style' && el2.getAttribute('style') !== null) { - // when both sides have styles, merge the two styles, with the ref being priority (not use) + if (name === 'style') { + // when use has a style, merge the two styles, with the ref being priority (not use) + // priority is by feature. an attribute for fill on the original element + // will overwrite the fill in style or attribute for tha use const styleRecord: Record = {}; - parseStyleString(nodeValue!, styleRecord); - parseStyleString(el2.getAttribute('style')!, styleRecord); + parseStyleString(value!, styleRecord); + // cleanup styleRecord from attributes of original + Object.entries(originalAttrMap).forEach(([name, value]) => { + styleRecord[name] = value; + }); + // now we can put in the style of the original that will overwrite the original attributes + parseStyleString(originalAttrMap.style || '', styleRecord); const mergedStyles = Object.entries(styleRecord) .map((entry) => entry.join(':')) .join(';'); - el2.setAttribute(nodeName, mergedStyles); + clonedOriginal.setAttribute(name, mergedStyles); } else { - el2.setAttribute(nodeName, nodeValue!); + // set the attribute from use element only if the original does not have it already + !originalAttrMap[name] && clonedOriginal.setAttribute(name, value!); } } - el2.setAttribute('transform', currentTrans); - el2.setAttribute('instantiated_by_use', '1'); - el2.removeAttribute('id'); - const parentNode = el.parentNode; - parentNode!.replaceChild(el2, el); - // some browsers do not shorten nodelist after replaceChild (IE8) - if (nodelist.length === oldLength) { - i++; - } + clonedOriginal.setAttribute('transform', currentTrans); + clonedOriginal.setAttribute('instantiated_by_use', '1'); + clonedOriginal.removeAttribute('id'); + useElement.parentNode!.replaceChild(clonedOriginal, useElement); } } diff --git a/test/visual/assets/use-and-style.svg b/test/visual/assets/use-and-style.svg index 461aa9aaf02..2ff3a97d86a 100644 --- a/test/visual/assets/use-and-style.svg +++ b/test/visual/assets/use-and-style.svg @@ -1,4 +1,4 @@ - + - + + + + + + + + + diff --git a/test/visual/assets/use-svg-style-2.svg b/test/visual/assets/use-svg-style-2.svg new file mode 100644 index 00000000000..c1332a85aac --- /dev/null +++ b/test/visual/assets/use-svg-style-2.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/test/visual/golden/svg_stroke_1.png b/test/visual/golden/svg_stroke_1.png index a97f124469dfd6c045c659b39e22934ba5da49ab..0cff129fd31b2f7eba2beebe3811eb642170d162 100644 GIT binary patch literal 362 zcmeAS@N?(olHy`uVBq!ia0vp^4}mz8gAGXTf6*)nq}Y|gW!U_%O^81Fv@$n zIEGZrd3$GXE|a4G+XdrA3hgaZ9+;ibIJz`|X`ypD%fh9$y)F;t@@L-Xb{F^gl=(hC z?KaS;h^y{_|MT85T`QF3KK|&?@h5H!3<;~}bDp2;d%)>k^1>>$KeKML>%6uTTP1Ms z**8X@79d~=tv@p-YIj5FpPp8&mi?2Z8$)aRSQq;UgtdOSbc+?D2ud1E{wj9i_0z9n zySW?dH(EbfB@mU*Sp3GQ+@pl?&&skhJ7inc;?6kev&$f~Ido}qy-3~5+7g-1n0PJv zz-~b&4q+#b%`Z3))hud=xkEnJoM)V@sxWurNJK;1);iu0z9=tx TbccfN8<0LvS3j3^P6|3_ literal 777 zcmeAS@N?(olHy`uVBq!ia0vp^kAOIegAGV7?d&?wz`%6D)5S5QBJS;-(}mKE0!IS0 zi*8T6&FRr@yTar}Emy-;W`U>u)BgN;%Ff7AH|N0detiQ5AdBKCQgnT z(MS0i0uB$NIsW{86S|-4=zVYyGzsEp~EtjOelK z)3{<{!}?PZKqF7H$kjUC4^NE=%Z#4cAaMFy&U{6MBa&13G=(cfl70r<7Ca&NVgEAP zx@e!4GSHJ2jqdZ^zl2H_-hMV;RpH3yES_p%M#X(6w?&@^21cZ5+uqIwf%_@9*CL16 zdn$&R|BL5SBxTe;yjYk&|3d$5v;R7bit|E~Z_MW4_~^UsZq>8~f%B^j-}th${7}1{ zXY1|Ik$zR;n;Mf-&E(we^U$4KA@b;^Hji_{#D;WV-0}LKk?Xf)^enDV<-jD);OXk; Jvd$@?2>>-qK`{UT diff --git a/test/visual/golden/use-and-style.png b/test/visual/golden/use-and-style.png new file mode 100644 index 0000000000000000000000000000000000000000..6de5d0639099db044e3565b9922def9bab89f01c GIT binary patch literal 26671 zcma&MWk8fc+cpfl#L`_$EuGRO-6h>1AV_y3AOcIP#G;gRcL_-6A}tNljWn_n((tYK z{XFmY{(N_TTsu4G%$zaT%sIy#?{&0P@UX$yC@3g+YO0EQ$R`{H1wanMK>k9X(qlkA zFkZhf2M=?GIkPVK~Bs@*u2q zLhsKAR8eLqA+bBe0P2)R3}RS;$pdzX6}(BDUHO`RDc8A1xVes6q;eaZeqyPt8M%23 zc;jaJb9{XK$L}A%#~ZpMNKTG_eDPTmJpXy_oCRqoXtYFI?3;b6MbfeYOT^uejPPsBhqvnMn+5{|TB3jS)}1~JFtw^eL8an4^kDG_ zzrY!K2_cr(q7ik3b@&a^GA=idVl{bCv~J@k$wlmF!g{sVzs0CX)IZX5mqq5gg+ti; z(AKIVvs`-KJX0;!f*6FG1HDiD=GE-HzGf+VeI4ou)Wh;FY`8k!^x`asNuc2SM|IK$ zTcFV#Vz)lzDFfRMvnshJ2_}^jOO7`1b8aFq`}U`N(J@SnSNr;;_4?=;!?eYwazJnE zlC~wYl=rbOP{h6JX@pR}_2>#!Wa;6>wuY2@c97m0!x8RvrK|IO(8s}zYdO`aykg>g z@-6d09XtoOL43}S9}h%qhsrUJS8oowG{fLM~8Q0fk`wgaZkyFz%KI z|0Fp4^GO6;K55yVgo;m=JPfzKtTBctk~GqXC?o;F3b&6`{*EZ+M`Vfu_rxd|Scooh z3~cI4RY^ieU$>sEG=cyfvM4IiexrDEc*J$|26lM;`}rvMj0 zV|T8?59268(;8BKLSB*Mq)Edfe|4#b@l5OqSIexq{cxGG*KCuNl=HL>F&-F|C^1%0 z%rWB*MRI=cFR|R-$-SduB#woOmLKZ$9}9y(Vc;-8=pfft!2dF;3H# zrrSDqF+!y3V)r3k|xAhC~P*U1%D03A3f+LX040;B|;|FeB?mR zK-)ssf+@x{V9bk_10c_fs*6~@Y)IiQNrL^*g#^5)b2Ux4TL5xFUjd@&r>!gt7T?FS;dwwHjwE}-EQdwlZ(BwWsCf9 z=^o=7>BP8|;nIsev)RuqUoRTMVMLyutzWjLLS+Q3Nd)|=KVfCgu4{xOFs_7rz+0(# zMO|eW&$$oh>k@V2mwEU@PkA3d&rrEGO{HBZP5t;t8?ec${?p<|1I_k?qXAoFh!K%H zT8`{xYYfXOf&P52X>Q+;1)r771-o%5rsI#W55Ma|QI2WQb92#;O62u3tmE+kS9yOj zK3=v{$Is(EF>;gnGGxBp-SH87(!0y4&$m7JHB?1L!}__M$a~vTrV>QKL<$ZhFA-%- zd!`t2X=8h0@I9COF$6r56z(+SBO}+U`%Q7{&2RaDnhYLi1to*CSDl=pakV zj%0h{=6n4Mx9ycVK079o;T=~2i;8tt)=%!Eq;XjLKYnUl_1S&2`tD9$V+)&-*f@)V zt&u*OP#lTkr(1Co4$M3|hcGFV%Vn%%;JGnY6Dj|WPGp#AQVM+O2S#9{^FWvrNvx<2LYnakMiXr;}Q`&J8{uT7!?WU6OZ@|k~{P88zk+w6w z)xp(ayd}O-yjuJ1KnUtyl{I&9s)GeSbTY#CvuMwEP4Zf+a5d_=Z+)Au9|Xb}1_1d9 z)_or+rK*N7#$4?Kh`OMd2mBi-QqjNr0}OeUae2e7-%=_F_i5%TKC_+At`&6N8-D)$ zD{~={GPQ}vzW2i|C6^e-#dvjz!>NMNTz#&kO5PyRejr*ZbI>-6g=CxrM#3e+xc>;;xBmWE6VMnc_tw^EGSXLC10_I;Ht|gq`eQE%-NbJ|j{p(w4ATrG`xZvF?q*vHkGmdT3gf76_ znrslJ@!|!^%#;(ot;m8*rzG($O*EBDGTlj~%%iVxb(^v2V0S!vZ%i@%fpT_X>vNZR z;ZW@lRj+G0`-$2&YaH?_aIVc5t~I8^jB zu+gn1Ct#W(Wp%c|A1S#{_g7BWnwzlA>)KHpKjkfykpGudUI%8(Q2)JWt}>H2l&~W~ zWsovJl@d2nW8^QM{ga%6+H=Vz?>vHJ-27yX7anLJ5)kH{oF>~xV^!G-pAQ{K*$_$D1#7Udtw^8Dcn*%EPdZu($IWO96lbHobrZ{eTSDp>TvOKcbraXFW8eguv4YJqV<~|j zNspdFnc~i0ZQ5R|$%@-fcrHl6qbr#ymHMnsbygKVKtHJ(m7TDI2Y#M>9k-(ybfpI> z^)1SaOSp<<|EA98z-!7T(!K4A9L&X!vdK3MeN@CUV}?$qX;#{QwLWLAJY*rrWb3W) zSsa3N)ddU08(E36m7Zk{{1i0g3t-0{pS3ZNlHuWmmSN_}P3bsN zDiUS7E!&k6F3=s0^0M}%dWl$Ype_jDiyWN}H#~z7)$CU|IC#`=bd9QUIIp|yIEt?h}1 ziJx?C!PoJo&(6sOBp?*@8S5FvOn*Yqk^qG)*`eAyzXXJo2RG@$YG>QoXYTsc7)*Zw2} zYxbC)@=q;E&L;*PzMP5yRMI*L=a;Hvc|kDoBHuht&~S@#KF`b5x9K-ZnYtd4B_X^Qm!0_4Bptg!2ASW|LneQ^6~slM~@i?HA?)eC?%h=b-@UNGQ$WV zU8QZlk#YuomlRy1UKp;F>MyC;&eX%^mzBC6z|02jV!%RZX+=-#0#j+uGka)tvS&Zj#)NN_Sp^wmWj1MXIe?)92EmM=ogFG728Gb;1{A}PD z8|qACz@r*p9Hk z;cvyV87}gND<+&8pS2L9U%aA_cYa(EAo*u-?JQ445h}^R(Njd)rSF=_)F-CSq|DI7 zTv9p}*CmBT{K!X;M-&&Gpp0(&jD(v?gB~B=m#zVw6i3u8SxgL+Y|7PB6#A}!v~!G) zsrQF;MW?9bN#pDeaa9qX9Pq!MN;_@nLtW7EWdS`7x;XQ5Q3bg=;HI8KHh&ne_G4T& zy~RPt=5cD&D+N|JD+%Durv~MpaxGjs&pmI>i?$`x<53N0vsXlC&PO9@q{} zp$Luit>n8935Y67q@q;Xk4D^UhURVRyxNO*G{nD9a1TcBu8rCw9LD5I^^s=pghu^rkDV4T7$0JO+PElDLcbTkH0)5jcGw{|Hj*0>i##9%1rfcv zk%;t-yaUY?e}FU?wKT9DoDUCW1uMwuM0oPbN6*+3j6rI$>fWE64p={3O3X8Ci!?;Y z;cMmBg*)?hye?w5xZ$a{Nj?`L82QVu&K8lozM0_SRQBKyJ;>iv*Lqa7Jb{fA4f#gKK`;)tKl>>z1{*oL`9d1JkR z@8+3V->hAjoVE^=Mxob_*1FWg=Uk>32y#ft~yI4iA9#GZ3ja+-X>)$rI! zIa<%No&fDdSk1HVM0e}tT8z>UD?UTjZiIjsedPks@|RSF4{k*ZmNOe&BHN;&9CP7^ ztnbkB8)obq6LF(=XAvWp9yDqqR70Zcc|7f@GD*EUrDMb-vqMjzHdb+{a$SGk z6d`c$+`9d$G87%^tj$R#pQAQ7*$MC!e_0QCcoO@q2yFAD@jiJuYcGVr6evvD>?sCy z66PqBiR$6j2GEH9vg9N%ApPAw}z!Qw@J-(Qxn)ahxWT z=Y8^HAG0^ZCux*i4~oE*_dX@#yud+=$QSL~nMi7`74WzVHILU=aTEg`5?ZPzKsLV5 zlv6lK3bExzyeLTbvOci;&*?HkGQ95$>!un6aj;fX9X7!n>Ta#D&yaQu* zHx(6;Kl64n?7Fv~Lf_6S449S>6(&5w$T% zMnh{1(GL930uk0bI=Kk{+WlzBAo^*xV-QBK{kc~p+xw3<3RCi`#k`_%PvNw+Po?Tx zwoMz&7>{lmDwdsORLx&ba5t7gYYE@op5H(Y!x1Rf^?T?tUoM@Q1NMd{r5E_IZ+c&- z?$u>~W0U>`B4G5DP--r+gS?{c%#PPyk4b(bN{_4Z7NWhH7`HZ#aoc~uJ#FGCKq+1* z@S28C&-I&;@QaHXs?z1h&tIZ_2+(DUL2n3uC?sFV5!yl;?oJ*4&`!+M4=Q?BNHM{d zU&-FmTXDSGcJoe+DEo%HuJkNi^x}(A*!_uFk)eLmQ+I7;w-REJwx#5%={L+hYq2$Y zzUGE{kZJf!V~99%hR~dvj~)5?$r0BCC~D3wTQ#y1@F?%DCrbL)<{QMh$>cHxkG%y( zGJQt1MJycuqA?5byM|oP&mmVGd>A~q9&jEl`Gdhc4Cc|OS}F?85u>>0R!ZN#a2p_y zcL?%2`W}BAaKpygsd9%>Hlh@AM`F9B+%%K+GS+l_6ip>P62U6(qo`#5w5@W@1xG9O z;C&<%y7lSbcx`llk>)($$OrOIlnwd&!WJQIG?UAfWhA_*L;YDY{&4Q=?em0;wIp+< z+oqW)wZ(58x5yX&+p(VQBFoS>58b)ejQRaxQ?1IhI#9Mwr}!N=njAkTmMK6h#|My4 zPqiXZ9riGTy`YV8^@&;GPXc36{$Jb4u`b%J2J%gCmPTPNEDjPuQ^S-N7#DjQ1@?;Z z#D}jF#&MTADPLp4aZBg^BI@X^3E_qNyieRJ-=0N_RoBF*To4Knbwx~0WlfKPp48;4 z+0PM^3h7ak{__2dkvLgKqae$O{yu3TBSsoPQ@%*U6D@d|=I2OXA44Qfq-*IM;{WXv z3;3#0l8kUPA0n^+O^VN;@A0KB0W zJy#)lV0NH-Say$c>>`an66X?peHQYKa<$gyR*8vFAk4JK+)A8}2-oAg7w8(mj*^PX zr7N1Nal06|5Zs+Hc6H?c@Pi*1Kz{k1^rId~5~%Tl5jmcHm?Td9m@VUS{9YnF<&bVuZPxTt~HMcmj(1Z7Y*1nc!y$ZAdQb7ep%s#&Zh1CF{N0?fwt_O_=>3)zjsCgI+PF0IZy8kR1p_>|b;#a-u_MS8A6p^{*KlgE06A(up@u z3wni;c@EqjcmIXQJfM4e_n$q1JOeqs?CrK(p4K!64uanNe{q!;SzgNV#L+)!5g$-* z0<7W!2N%apW+#IQk--vm?|#*M^d?*tV9otION)<|GWxLlO=XBKJMPx&&>=p9r_Ps` z5@Ym9XmIA)NcLuaA~7IYnfn|sI4JOuPbKCtmigH|d)x$e9Ls}F^wp;2gR;tIM~=*o zseG9@40-aJbQO|M!&+Q~(Q;*U)yi+R*m7j5_(9CTMv_N9FzB65Wz@=tWznkN@%7g4 zHTTZ%t>b6zt%V4^d*|L-wZ5A60wI>2rkGqJ6La?rE9Gaom)nKB{c65X&*9EPN=UnmRBFPhNpR`iQsmM6Zd-=(@wflT?GhA1H$0vc5@YL@Ly#(X zWjr9&V`}nyU}5oJo;Z&Y)@sO|k}bnXSgz4J^Q3uuf*cb3pCOYA$uk4e3nd}`IY_xc zt@D^ES;v0C4zlpdU#{~1G*+L~`lG`9`FBFWPn5Tc$|RgAajOCU;~heE;1&_pRDI?i zfse0avnn8;@@{v8nS@1g(EYz|V#JChw#s!oWG0xxMw_7Dt)l^{Kv$c}KT94naN@lj zJCAw(H_SgnhS8$IT-6sG@_vMoFL4NTkf;i@=Bn$j7a#7kFL2?Vpid&2rng@M zMWxQE(KQi2h=%VGY)4+G6hSvIMNp9YfI7fgr^)%l8jH{b{Q%ar!qFss5(c0LY?aND z@+kt4TwM^qM_{vm+ou6>ot4NR#KP9`n`SRWx>Xs~k>SCbl~9&yjd~7uO#1apF{#jf zlArYUKx>vd_>RYCXmE1;>!>|~cV}4J1PxFf3~nX2$73(flpf;aY=2sev2ztiz~iLv zgS7}D3V9*p*tWr$E|kzkGSpW?8spxYg-~5*ptjjFL9vkBjs)}YC}S^i2B{;?5djwz z1<}<8Qwi&5&lHQ=OVsB-Ca8q!;C94U#IQ*GVt*+n#$<4Q@AWB6Mo8hY4h%w}NBQU~ zrrmMQoAr(w?azIF>=3;_8k}gugZXOZ`gJni>jiyM?6LDftkC@{(r^6 zKSO{Gh0+wqh&=+#2Yxz}gmdcaelw$u5utqnI@?wp5yZ!DRVeQl=>0p1WXCE4Q+Axo z3{gTcx;#x1@h3km&}VEv?qhdEo@*bN41Zi`KZTB|8pG1e5y=TD9iT06sD`W|MHWxd z6nUD_`z0n4ojLSU9H+*9gB13qAHcuc!PfDq$r!)+wP1meI}06?LYCq~x>XfcKKgIs zqX+UX%|ZYI)Pp8du0vJUpAy1J{GAQ)`#DP!^enr|sMjAf7{4yzRLX7*(7(d)-wI}E;%pDAU2vtwgz-ik`^x<* z%WjR(gFU&NZ=o|$i&ZpuD-qe-JopUYp=!u49`+yhzZ^H{w#MnR!(w#L`?7gvlSaHY zj!@H6pNk%`E|=wRQiSN8PEB!Wo)Y;gVTk%A)yuFjV1uI)4dn|A;+;V;SQ#+n)gmtkN&~| zWXQOUnLk#zW%wyq2O^85D}{WPmG*>y$jfCl z+z0Z{&c1Vk9^ad}oJ=tY;P0GJV)V+$Nrs|P;&ntXWwV)~PNH?-$9
gN{#?+6oy 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ℑFfso!Jdu=-3L*V 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 literal 0 HcmV?d00001 diff --git a/test/visual/golden/use-svg-style-2.png b/test/visual/golden/use-svg-style-2.png new file mode 100644 index 0000000000000000000000000000000000000000..8490f048e8465010f68bb7bb7e85130caebe8645 GIT binary patch literal 7408 zcmZ8`cRZVK_kSd@_ugW}rbe}PgVKn-soK=uYIKNDYD>+c6t(v(iV|B}Egy>7L1~Q| zt<@0yMW242*YEqh^2eR~2LQNA5t`~|VR_&4A7(HQ<`2VyNnP2@)aZiwyVcZ4 zlWA?@ID(DVj4^Pg@zasqwcVGT!DAh884_2|xUsNR-vxcD=eCgEfeJ<6H1mCW$9s%U zbj*XN8vaI_k5NC&NV4Z(yWCf=wsrc!syeqrW@0BJ{5$=Q+K|gXpYP7w9*H+tNw6di zIyL_HlC{9U>V0nEyBMTAZ%EQjAqNyd6=8NuZ?*y;AaN9oa$t{n>vsIPoPq7sOGEjx z6M4z-xpX!DGa^%zAFv#7jp+GjVinLR_b3)#x03t){zN(FRzH{{5>0Esv3V;TdW1G7)4&Xh?Cq2aR`7>3HQ>6ek^7F_-W@j< zvzP2A54CinCQ5fgu(=}N!46maV>Eq#1~qKr?m0h*(4S&eBKO_cc*4DtP0GdGn*6j2 ztd}-|?xK;kE%4RbtAC5r5RBBMAw|Zb-_NqNHsr0hOn$VUZc0t|EMztv)BUQK@FXE~tR8%LDaw^A~(z12?n z8bos_Y;dXlVd8#!iH`&5XZEmi7h}n$>@C@}cs&=x<3pt# zK`c1_yo=*-bLj9Qx2`@>ZOjF|)(!!sFC6#uiK~n}el$9)o*V1};URx>k~CSvkDHX=^2gpkMh5^ zAln%~(b`)^DZg$;D$heeU%m7>eHw$w5>66y@YE&Y$)pwR(drB>46(0YPCM^`KDQF5^80zc+RFSuf$>Q6lOTtIBc2Qe zfvKcp3A;3Xb$?oxrBS4+d;C z7}(l072MN{!#(==RXFzVD6VX{HmEY5>^^`@qdCMg3$uD5=u02Eupnqu7LjDg?K0 zI#J-Z`#%oA;odphwa&=_-N!4qA?-Pi6}(%d)K7Y>m?}e+Cn_IQ(%I zLvVXa=Hv_TH2PiGWdU3T;?&T?=f4-Q^u@2}b6+8&2i~J~5LksD?sSj&|HSn~{{=&+ z>KH|BtrK>>?m@7vh1Nnc4}SDtB?tE%NR1gixiyt>|Jc>9%{FtGyVC(rhJFUgOv7F) zA3JgGsmPTbdv=;Oe`PouM*zXr6H}YPHCnD#WmZ*m>o(wJsJMZd?=-uq6Pa=~P+ve)y^X+8u za$myHKh;5+=>a3%gK&?SiZv47Dfz00Cf=p1f%H~>fe%8BDt<9N8`$gxkc4G+zL%ty zBfM%1IzvQ1O&ZU)A;JA<2y%e69fOP378by)$oOFijhAdem>pz$BtVwGL_`l^LmCa^7Y8=-(!vUiBmw zelLF*w?f;4Jk^Q1J!(z!aqv#c#y2Bia~xda!jGld;+qoss2_sFlgYl{bTfdYI3{rq zY9GW_&g09~7Fhd5Yau+~gZ@y4!{X(eYO{$iI6T>g+ffY7!vS3Ijfchdys5WezIc$b!q&EUqVt7i@jp*JS}ncXtKt_?#xsWM z;*^6V+6l8Vwz06b9NkV-MB;YWG_6|{j$VXZ2R4HI-m(Wa*ze49E&H6jsF1R@5b|5> z<6WCt$a?gFfZi{(a^8)a(kw=S%-I@)T=&5I9_zyW$6%-xtb=|CjY06Hjy?VvC@>r- z@mPS_s`|>YlT`h~vE}QNI|`rmg{RRy4AW?%m_iDs?#KP7nH-+kBLmX<7J`g9-;Tjf zmXUqQh|LBh6JZT1pzdY&*`;SZmif5)R=9Y|W~)};KgwC53Y`x(y!s(!?P86v;Xj~7 z1c~nWhZ#`&leoFy=xtSx@;+|*cD5ZA8G5BX(6NH$RepmPGJo%!yfr^Wt_O%+f9zRV z3d7$|Z0o!3CzqZ*5Xtqe^`Yz44~Ec6(i({Id0e2NTG1}%ZpX3=S3ld3rpJ;t&6;$* zjA;F}@%?(l)@I64F_k@1QwJEoBVyFf70Y_vXmngc9{|AsKCVi%E#_kmH}#fN3rl#c zU=OhKXl(>wT<>QAszB-cwqeA_^@WOZX<#JQ<|6^dB2A7!>ZasBR(-ew;%=syNx!%N0OkpY*sGpYG=YX$BYF!2|dKCKv zGwO4q5C&(Q?hdS-Vd#@pg>aW#_tmhJ&_yXa%hvH#g_LE@8pzT>8W`Zy@@8Cf@&c>U zdgMUk%J}>=4!xR2m(ZBBe$U{fYWXUh-%Yp@K{`zv>hy-)yKqGZizp8V_TJ7Lr01e9 zk5-eL7=a4iCw_Fp-#jX<#R=~(G!4!Ec*uS9$&ffpsh|rp^Q(j2*_vkEs7!ir8@{TG zk&BnO11Yp_Kq@evIY$y^dm;8ldgMtyF%xL-pjbHMmTc36X_|TXrm|v66+OZkFCu(d z*KJJH2YoqJY8$}%V^sgp32J;ww~j691--jd$W>Uc68y6s_m zgakQY&i$++zRXROq`L;H772_EVB?%+J2OoXP>A}eFy><*#$<^u_^grW%zh~0fEP(~ zXHYxHIRXo*(CR(@LBtE}b-&e|SzE*RBGh<|ZFn~Cd+^vVc4-8EL82B)-3n%+eF|HhR_$e;)~>R8*${#lS%c_2smebtb8F*-NhFB-MN*R#9MQgs*rE&sGO#g}~* z>7EF!$+|~JDifzJ;ig#C#TCIz!IVAf(%om-MKjM&=himf#5?h}>Z!_EDy~VWIY+fM z{iARspYL#uiy-X*-TW-i7T2p!vYC~cL*o$?dAG$}Gw=NP2H!#ecvIm-hD0|PQ+_?A zz5kSScA!knht`F68OyozzS}OgR#G*X?9F&c*2r_nEhrJ@T7Nvoh+_zr$$2!k!PQ! z{Q3O1ltNy=Vr)>CD=(46rtb3F(v_hsyDx+2Pe?Z9MilX#=k7S-!9wNkHYp>l5lty= zc-XTa&z=B#XHGfX{GZHRbrYfK&Rx*^DXi4umfCgd_$jk6QE_zhj1O`l?4L6eu(wZx z{vk5|nS@CkZvexuhPkroU~(u=xc?SU7L>0m@hA~|PA1XTL2gvca& z?7V$pr!VHvs;TqABuL!?FRerlu=Y^ZEke@lmQIG4oP$@x5!UoA z_TX|BV?jN{G&HjV6j<;0N45o3=V{kqqf%D^+F!gd3WbsbGX<5UAzh+GW5C-#`zy+C z+7Z^aHomOD^igR9Ftgr?qWx9s(EEC9LTw}EDEsXn#bUm(4+K)vBhPw+)$8;zZO|Y8 zd@);p=6O;qmJU$krv>mlX(E1TPf|AU`d(FOp679~XF33TWw&Y`^JEV+lW`+g8AUW% zzdpAm){sMA0}-9j*)FYZvCD0x(WT#x{r~05{}nU;b2k|u?3yEH@C8DuS7`Na&!~{7 zyJDn+*b3A|+(jkxl1$hB^OI( zb;#e-J7rST1;vKocv0Q=fb|C8!&h5>vuC4D^xJRR&QDT!R{ux9Y~uPzRO5AX=R-nY zZU1+aeV$WnM=NEOdBIV?M7SgHhGy?D$vw|Efni*(e`V8A3^k4mr1a?(zGCjL)R5A{ z#EPm)UBBlu&&*{c`4{Dk)_A689e<24gy$2`GUTl1ue6#W1+%G@Cy+N&m=3w0XVRiT zL@~WM@Xo|+#gTyAT_pH5L(*^;4bcufV4&z>7nE)Q}tS$&N2__`xNR3=hXe^Zib`@2~FW*nKP-eZ)|fd$msG|h{*kulPULJN-7fvj=LF}&eF1HT?1jpX7Gg8rl%52FiOJ@- zX{1kX%$Ilt3;(u1!LF01^$JDajy8yr{9|`=!;=}JKNBOOuKmw_$Qz|Vt%sQ{IjnP? zzlVj?Wor_OJ{+^njZ&(flcj;huTj2b6nAo;#L>UtL4pxctd|De{~GcQ_eBr7@T0Pv zk-Z&>L)I`2(~a0YarI4Islg(#HHr9Q&!+#(TX_C&(qyL}eJ|POTan=MQFI|f+CKfM zij34yYb~T#^ryf$uY`G?$N{TE+!ZZ$H|~b|-Cu*YRxsci;ao$A_}*~SEHmImoH!BT zI0S^l`lt@VH6LepJ=Lrs$gO}RbF9o}l~w26YtnL6FO!;C*n}M5dBTmz)1fIe#u7-x zjd`qOb~o>JfG~g%6uSlg%x-uRGn2--Yq)Q7A{bWZIXHzjLhxemVqcF3HjP~cW(fw% zZo{=y@Nu#yM=4~>ACx=>hHxt>Zr&P((-wn!S3pD2J_5xOpcJM->%4eJynpFSNKrkw z^i~h#_>6tyxP%c<1K}|{6fl`hnb00$jVylIlFnyGoRZ><$%E8D?wwdxN^AW=dmem-7 z_MO|_NOVFZ>c$1!$|Sl6e3ttH;DFa=CT?T%zn|pwJU`^oV<)^e5%D#O7jnF69c{~% zVvjC-@!I6XH<@bWc#S$*Lx>-ia?dmnSXHCfn4*=PuAySyP3*-{9OED^m4V`78daz@ zt7LvKd{>A7Ejr2q6vZ0iWuT1gXhfEvfJIn45RmQO*k!)V;H*OUZ2vDd1` zyp3~V*oNzfuvIw36A{(6NLonqeh(W=J`xaQqB7Y}BZ>^3w=-813-r1K^iVu(5d}C| zTC!;Hn>#>o{P8Svh#`vHowKOip_L2z1Bk|`VF87zH}m(OJJ9C59Q4_;w}}aK@gxdA zk@8sdvJmDy#IrKG{bw1HUUpCZWV6^W2ZJu)#1G3B{Y(kKqoWp?RI=1C1!f`C*n~em z!`;83L#XBALc=+H4GZBl|I*c`=PARi$_kwYkP4-MV^{VJ=_VFu7;7$YP9bTNa*Aj;z_ z#LebZ!I=`OgjjJ=2#RTC@T20W`tn*SzdwLT9|lJh|7wa_@z{R%2f?^uZ$xG*(qsFr z^3=E3p7Som{-%k*Z-pU2*B-_T#; znnAb~Ug)^+LsT&RJaCi{`A+*?cT(=TGx1bwoL9n)@b}k5uK+K& z*=njkFlN$mv3Ie_QkQImkl=_X>+pHUy7dzy}Hy9Gn{y8H_nUD zck$cTiEvEcp~Glm<#o)vBjgDAHl&4L5fTnwN^V)%=d&hPtP@fi|*9h~GIU)I^ z5r6HreZ@RqX?ymnbEVvCBQl=AIY$CvwM;x{)F_>^k8E#%aV`9)Ov$BCJX# zkl6X`OsO7CI7FP#Mlq?#zE;ABW~&D8F*!7TB+>0p)?d#sP^un6^CJ9fkdkw3iEpcO zhntt`2nxO`L^51BV>AdXT4B1-Wpr2pf)_xHu z5OT?(akfvPR>lAK-hHN8z_P^>@%(<#o3jXS255g3+nhJL=z|R}-Crv7`j-kBVzyS` zPoZJP%~>jqnxT)0DgI^VE+X&gYC%?S@Y3|6yKp|C>67tmMVVYDGuwWmR)mzmhY7)z z49!OZ3c3$08)jOeD|H~l6>yKqD(j7gW#|Oq zm)E|OA<_8<_w2(YU$0!07?>6M+nao?vY=qH!INczHTGrqZQQkHzq0dLWqo>^>(Pn~ z`>A*JLmg5x=j;JIde1dq&dC|?ug2w%+)<9J6n-_`U z=taqOiUr)XJOrF=Aj5ISJsG#))-WBifulF@Bqc~WQK=Pb*1S5sP@n9o6L0D?t$Vt* zz09~d`}YTNeo1=F4UDH>TeR-=p2#vT)kQ17Jl*3S?ap*!dfhJS)zUu zA&Z*z`|qofA=6vQ?`F`**9XNZ9Y#oZLm=O0 zG8>K70s{i6QuGRYP*x65FFd7$Q7~P>(=3y(!zFaL$a?qQ9*dtpkHOBiXq{^DU)_UW z{ZNFD3$m@e?GkjceO1kCjz4Nb+u0TGULunQX%r+hgnwyaIs@_rh%Ja%hZOJMxKbwL zV=4J6=dj=7$0Ir?TSp_ZY0y`qg2DSQqEERL?8&A}C7}}XfzD;;B1Q`K`~qk6XR^;r z3eFIwZ+=ooHiBDG5_U<`MHyX5A#AgJ@6aasg0&@0VjU(_Ko$VJJOBxi z010Kh@V(0uFSmrY_7o<3_YnR^T%A>8U(}yuaLP~5S<(N29RopoC7%e?fl(QCU|W$v zY3yx>uw12%10Mf0y4P&}7Ed%ezQQ56Jh}9oMqKK<%tA^&EB$~gJIWqgA_rH-GiJbm zr`pBm6-8yDyM!PFEl0KlG637@8V^0k#A~>CYO9MtC&*y9@vj57M|B3!pDu^o02&b6 zAyy8hOuLA2yfHzX@tS2@aLHG~A6#6WkZh@7fJOt00Y!%KO zT)s4t9FKFSf=IpiMQ;vwM@w&b5!|Jp?nHNc^8~xcae1amuyjP+EKB7a7gr zpN^RQ5zHB@fmq){zkxC(lz23D>08wgUGdsy;u$P3@M;2!waH2UDHLFoz=(oJzPWk5 zktbUWOnFrKPO3R4TthfN^_(uQQnH0@1#S){LYYvJB0*d{`_=DJK|9KTH`*@lFwY7_ z;mS||QhGPGkyE3AL4gLy+?k6GCugB#V1I{39_sE0X4_W@kppzrX~salLl2Kq4X_U} zUre~6x>OnOxJiB#n~}a1soDsskk^qRKV_G0pCL%>yQOJQv!dNggVQt=aeQ>oGIcaK z5K}?~5L^HiV3K%vONNtHT;?VLD#PYC_~!Imt13c&Amb%uA5!|;P7qvBUMak%?LrHK ePK3cOAlif4j7?jiLWI9C0SGMv%{mQ-sQ(A