Ë
    o]j  ã                   ó°   — d Z ddlZddlmZ ddlmZmZmZ ddlm	Z	 ddl
mZ ddlmZ dd	lmZ  G d
„ de«      Zd„ Zdd„Zd„ Zd„ Zd„ Zdd„Zd„ Zd„ Zd„ Zy)z!Util functions for SVG rendering.é    N)Úsuppress)ÚcosÚsinÚtan)Úurlparse©Úparse_coloré   )ÚANGLE_TO_RADIANS)ÚMatrixc                   ó   — e Zd ZdZy)Ú
PointErrorz,Exception raised when parsing a point fails.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© ó    úK/var/www/zogu/zoguvenv/lib/python3.12/site-packages/weasyprint/svg/utils.pyr   r      s   „ Ú6r   r   c                 óØ   — | xs dj                  dd«      } t        j                  dd| «      } t        j                  dd| «      } t        j                  dd	| «      } | j                  «       S )
z1Give a canonical version of a given value string.Ú ÚEÚez(?<!e)([+-])z \1z[ 
	,]+ú z(\.[0-9-]+)(?=\.)z\1 )ÚreplaceÚreÚsubÚstrip©Ústrings    r   Ú	normalizer!      s[   € àŠl˜×#Ñ# C¨Ó-€FÜ�V‰V�N F¨FÓ3€FÜ�V‰V�M 3¨Ó/€FÜ�V‰VÐ(¨&°&Ó9€FØ�<‰<‹>Ðr   c                 óz  — ddl m} | syt        t        «      5  t	        | «      cddd«       S # 1 sw Y   nxY wt        | «      j                  dd«      d   } | j                  d«      r|€J ‚t	        | dd «      |z  d	z  S | j                  d
«      r|€J ‚|t	        | dd «      z  S | j                  d«      r|€J ‚|t	        | dd «      z  S | j                  d«      r|€J ‚|t	        | dd «      z  dz  S |j                  «       D ]3  \  }}| j                  |«      sŒt	        | dt        |«        «      |z  c S  y)z:Compute size from string, resolving units and percentages.r
   )ÚLENGTHS_TO_PIXELSr   Nr   é   ú%éÿÿÿÿéd   ÚreméýÿÿÿÚeméþÿÿÿÚex)
Ú	css.unitsr#   r   Ú
ValueErrorÚfloatr!   ÚsplitÚendswithÚitemsÚlen)r    Ú	font_sizeÚpercentage_referencer#   ÚunitÚcoefficients         r   Úsizer8      s[  € å-áØä	”*Ó	ñ Ü�V‹}÷÷ ò úô �vÓ×$Ñ$ S¨!Ó,¨QÑ/€FØ‡��sÔØ#Ð/Ð/Ð/Ü�V˜C˜R�[Ó!Ð$8Ñ8¸3Ñ>Ð>Ø	�‰˜Ô	ØÐ$Ð$Ð$Øœ5 ¨¨ Ó-Ñ-Ð-Ø	�‰˜Ô	ØÐ$Ð$Ð$Øœ5 ¨¨ Ó-Ñ-Ð-Ø	�‰˜Ô	àÐ$Ð$Ð$Øœ5 ¨¨ Ó-Ñ-°Ñ1Ð1à.×4Ñ4Ó6ò <ÑˆˆkØ�?‰?˜4Õ Ü˜ ¤# d£) Ð,Ó-°Ñ;Ò;ð<ð
 s   ™.®7c                 ó  — t        | «      j                  dd«      d   } t        t        t        d¬«      D ]7  }| j                  |«      sŒt        | dt	        |«        «      t        |   z  c S  t        | «      t        d   z  S )z8Compute an angle in radians from an SVG transform value.r   r$   r   T)ÚkeyÚreverseNÚdeg)r!   r0   Úsortedr   r3   r1   r/   )r    r6   s     r   Úangler>   =   s   € ä�vÓ×$Ñ$ S¨!Ó,¨QÑ/€FäÔ'¬S¸$Ô?ò GˆØ�?‰?˜4Õ Ü˜ ¤# d£) Ð,Ó-Ô0@ÀÑ0FÑFÒFðGô �‹=Ô+¨EÑ2Ñ2Ð2r   c           	      óÖ   — d}t        | t        «      r6| j                  «       } | j                  d«      rd}| dd j                  «       } t	        dt        dt        | «      |z  «      «      S )z>Return opacity between 0 and 1 from str, number or percentage.r$   r%   r'   Nr&   r   )Ú
isinstanceÚstrr   r1   ÚminÚmaxr/   )ÚvalueÚratios     r   Úalpha_valuerF   G   s^   € à€EÜ�%œÔØ—‘“ˆØ�>‰>˜#ÔØˆEØ˜#˜2�J×$Ñ$Ó&ˆEÜˆq”#�aœ˜u›¨Ñ-Ó.Ó/Ð/r   c                 ó¾   — t        j                  d|«      }|r@|j                  dd«      \  }}||j                  «       d }g | j	                  |||«      ¢|‘­S t
        ‚)z(Pop first two size values from a string.z(.*?) (.*?)(?: |$)r$   r
   N)r   ÚmatchÚgroupÚendÚpointr   )Úsvgr    r4   rH   ÚxÚys         r   rK   rK   R   s_   € ä�H‰HÐ)¨6Ó2€EÙØ�{‰{˜1˜aÓ ‰ˆˆ1Ø˜Ÿ	™	›˜Ð%ˆØ4�—‘˜1˜a Ó+Ð4¨VÑ4Ð4äÐr   c                 ó.  — |xs |j                  «       }|r	|dd \  }}n+| j                  |k(  r| j                  |«      \  }}d||fv ryy|r||z  nd}|r||z  nd}	|r!|j                  dd«      j	                  «       }
nd}
|
d   }|d	k(  rd
}d
}n]t        |
«      dkD  r|
d   nd}|dk(  rt        ||	«      }nt        ||	«      }|x}}	|dd j                  «       }|dd j                  «       }|j                  dk(  r6| j                  |j                  d«      |j                  dd«      |«      \  }}nFd}|dk(  r|||z  z
  dz  }n|dk(  r|||z  z
  }d}|dk(  r||||	z  z
  dz  z  }n|dk(  r||||	z  z
  z  }|r||d   |z  z  }||d   |	z  z  }||	||fS )z7Compute scale and translation needed to preserve ratio.r
   N)r$   r$   r   r   r$   ÚpreserveAspectRatioÚxMidYMid)Únoner   rR   rB   Úsliceé   é   ÚmarkerÚrefXÚrefYÚ0ÚmidrC   )Úget_viewboxÚtreeÚget_intrinsic_sizeÚgetr0   r3   rC   rB   ÚlowerÚtagrK   )rL   Únoder4   ÚwidthÚheightÚviewboxÚviewbox_widthÚviewbox_heightÚscale_xÚscale_yÚaspect_ratioÚalignÚ
x_positionÚ
y_positionÚmeet_or_sliceÚscale_valueÚtranslate_xÚtranslate_ys                     r   Úpreserve_ratiorq   ]   s
  € àÒ+˜×)Ñ)Ó+€GÙØ(/°°¨Ñ%ˆ‘~Ø	�‰�TÒ	Ø(+×(>Ñ(>¸yÓ(IÑ%ˆ�~Ø�M >Ð2Ñ2Øàá'4ˆe�mÒ#¸!€GÙ)7ˆf�~Ò%¸Q€GáØ—x‘xÐ 5°zÓB×HÑHÓJ‰à ˆØ˜‰O€EØ�‚Øˆ
Ø‰
ä+.¨|Ó+<¸qÒ+@˜ QšÀdˆØ˜GÒ#Ü˜g wÓ/‰Kä˜g wÓ/ˆKØ'Ð'ˆ�'Ø˜1˜Q�Z×%Ñ%Ó'ˆ
Ø˜1˜2�Y—_‘_Ó&ˆ
à‡x�x�8ÒØ#&§9¡9Ø�H‰H�VÓ˜dŸh™h v¨sÓ3°Yó$@Ñ ˆ‘[ð ˆØ˜ÒØ  =°7Ñ#:Ñ:¸aÑ?‰KØ˜5Ò Ø -°'Ñ"9Ñ9ˆKàˆØ˜ÒØ˜F ^°gÑ%=Ñ=ÀÑBÑB‰KØ˜5Ò Ø˜6 N°WÑ$<Ñ<Ñ<ˆKáØ�w˜q‘z GÑ+Ñ+ˆØ�w˜q‘z GÑ+Ñ+ˆà�G˜[¨+Ð5Ð5r   c                 óÒ   — | rW| j                  d«      rF| j                  d«      r5| dd } t        | «      dk\  r"dD ]  }| d   | d   cxk(  r|k(  sŒn Œ| dd }  n t        | xs d	«      S )
u-   Parse a URL, possibly in a "url(â€¦)" string.zurl(ú)rT   r&   r
   )ú'ú"r   r$   r   )Ú
startswithr1   r3   r   )ÚurlÚquotes     r   Ú	parse_urlry   •   st   € á
ˆs�~‰~˜fÔ%¨#¯,©,°sÔ*;Ø�!�BˆiˆÜˆs‹8�qŠ=Ø#ò �Ø�q‘6˜S ™WÔ-¨Ö-Ø˜a ˜)�CÙðô �C’I˜2ÓÐr   c                 ó:   — t        | xs d«      xs t        d«      S )z4Safely parse a color string and return a RGBA tuple.r   Úblackr   r   s    r   Úcolorr|   ¡   s   € ä�v’| Ó$Ò<¬°GÓ(<Ð<r   c           
      ó¢  — d\  }}t        |«      j                  «       }t        |«      dk(  rt        |d   «      t        |d   «      }}t	        ||¬«      }t        j                  dt        | «      «      }|D �]°  \  }	}
|
j                  d«      D �cg c]  }|sŒ|‘Œ	 }}|	dk(  r&|D �cg c]  }t        |||«      ‘Œ }}t	        |Ž |z  }ŒS|	d	k(  r–t        |«      d
k(  r0t        |d   ||«      }t        |d   ||«      }t	        ||¬«      |z  }t        |d   «      }t        |«      t        |«      }}t	        ||| |«      |z  }t        |«      d
k(  sŒÛt	          ¬«      |z  }Œî|	j                  d«      r‹t        |«      dk(  r|j                  d«       |	dv r0t	        t        t        |j                  d«      «      «      ¬«      |z  }|	dv s�ŒXt	        t        t        |j                  d«      «      «      ¬«      |z  }�ŒŠ|	j                  d«      r�|D �cg c]  }t        |||«      ‘Œ }}t        |«      dk(  r|j                  d«       |	dv rt	        |j                  d«      ¬«      |z  }|	dv s�Œüt	        |j                  d«      ¬«      |z  }�Œ|	j                  d«      s�Œ/|D �cg c]  }t        |||«      ‘Œ }}t        |«      dk(  r|j                  |d   «       |	dv rt	        |j                  d«      ¬«      |z  }|	dv s�Œ“t	        |j                  d«      ¬«      |z  }�Œ³ t	        | | ¬«      |z  S c c}w c c}w c c}w c c}w )z3Get a matrix corresponding to the transform string.)r   r   r
   r   r$   )r   Úfz(\w+) ?\( ?(.*?) ?\)r   ÚmatrixÚrotateé   ÚskewrY   )ÚskewXr‚   )Úc)ÚskewYr‚   )ÚbÚ	translate)Ú
translateXr‡   )r   )Ú
translateYr‡   )r~   Úscale)ÚscaleXrŠ   )Úa)ÚscaleYrŠ   )Úd)r!   r0   r3   r8   r   r   Úfindallr>   r   r   rv   Úappendr   Úpop)Útransform_stringÚtransform_originr4   Únormalized_diagonalÚorigin_xÚorigin_yÚsize_stringsr   ÚtransformationsÚtransformation_typeÚtransformationrD   ÚvaluesÚrotate_xÚrotate_yÚrotationÚcos_rÚsin_rs                     r   Ú	transformr¡   ¦   s+  € ð Ñ€HˆhÜÐ-Ó.×4Ñ4Ó6€LÜ
ˆ<Ó˜AÒÜ! ,¨q¡/Ó2´D¸Àa¹Ó4I�(ˆÜ�h (Ô+€Fä—j‘jÐ!8¼)ÐDTÓ:UÓV€OØ/>ó %:Ñ+Ð˜^Ø%3×%9Ñ%9¸#Ó%>ÖH˜EÂ%’%ÐHˆÐHØ (Ò*ØOUÖVÀe”d˜5 )Ð-@ÕAÐVˆFÐVÜ˜V�_ vÑ-‰FØ  HÒ,Ü�6‹{˜aÒÜ  q¡	¨9Ð6IÓJ�Ü  q¡	¨9Ð6IÓJ�Ü (¨hÔ7¸&Ñ@�Ü˜V A™YÓ'ˆHÜ˜x›=¬#¨h«-�5ˆEÜ˜E 5¨5¨&°%Ó8¸6ÑAˆFÜ�6‹{˜aÓÜ 8 )°¨yÔ9¸FÑB‘Ø ×+Ñ+¨FÔ3Ü�6‹{˜aÒØ—‘˜cÔ"Ø"Ð&7Ñ7Ü¤#¤e¨F¯J©J°q«MÓ&:Ó";Ô<¸vÑE�Ø"Ð&7Ó7Ü¤#¤e¨F¯J©J°q«MÓ&:Ó";Ô<¸vÑE’Ø ×+Ñ+¨KÔ8ØOUÖVÀe”d˜5 )Ð-@ÕAÐVˆFÐVÜ�6‹{˜aÒØ—‘˜aÔ Ø"Ð&AÑAÜ &§*¡*¨Q£-Ô0°6Ñ9�Ø"Ð&AÓAÜ &§*¡*¨Q£-Ô0°6Ñ9’Ø ×+Ñ+¨GÖ4ØOUÖVÀe”d˜5 )Ð-@ÕAÐVˆFÐVÜ�6‹{˜aÒØ—‘˜f Q™iÔ(Ø"Ð&9Ñ9Ü &§*¡*¨Q£-Ô0°6Ñ9�Ø"Ð&9Ó9Ü &§*¡*¨Q£-Ô0°6Ñ9’ðK%:ôN �X�I ( Ô+¨fÑ4Ð4ùòM IùâVùò( Wùò Ws   ÂL=ÂL=Â(MÈMÊ*M)NN)N)r   r   Ú
contextlibr   Úmathr   r   r   Úurllib.parser   Útinycss2.color5r	   r-   r   r   r   Ú	Exceptionr   r!   r8   r>   rF   rK   rq   ry   r|   r¡   r   r   r   ú<module>r§      s[   ðÙ 'ã 	Ý ß Ñ Ý !å 'å (Ý ô7�ô 7òóòD3ò0òó56òp	ò=ó
25r   