
    Bh9                         S r SSKrSSKJr  SSKJrJrJrJr  SSK	J
r
  SSKJr  SSKJr   " S	 S
\5      rS rSS jrS rS rSS jrS rS rS rg)z!Util functions for SVG rendering.    N)suppress)cosradianssintan)urlparseparse_color   )Matrixc                       \ rS rSrSrSrg)
PointError   z,Exception raised when parsing a point fails. N)__name__
__module____qualname____firstlineno____doc____static_attributes__r       F/var/www/html/env/lib/python3.13/site-packages/weasyprint/svg/utils.pyr   r      s    6r   r   c                     U =(       d    SR                  SS5      n [        R                  " SSU 5      n [        R                  " SSU 5      n [        R                  " SS	U 5      n U R                  5       $ )
z1Give a canonical version of a given value string. Eez(?<!e)-z -z[ 
	,]+ z(\.[0-9-]+)(?=\.)z\1 )replaceresubstripstrings    r   	normalizer$      s[    l##C-FVVItV,FVVM3/FVV(&&9F<<>r   c                    SSK Jn  U (       d  g[        [        5         [	        U 5      sSSS5        $ ! , (       d  f       O= f[        U 5      R                  SS5      S   n U R                  S5      (       a  Uc   e[	        U SS 5      U-  S	-  $ U R                  S
5      (       a  Uc   eU[	        U SS 5      -  $ U R                  S5      (       a  Uc   eU[	        U SS 5      -  $ U R                  S5      (       a  Uc   eU[	        U SS 5      -  S-  $ UR                  5        H8  u  pEU R                  U5      (       d  M  [	        U S[        U5      *  5      U-  s  $    g)z:Compute size from string, resolving units and percentages.r   )LENGTHS_TO_PIXELSr   Nr      %d   rememex)
	css.utilsr&   r   
ValueErrorfloatr$   splitendswithitemslen)r#   	font_sizepercentage_referencer&   unitcoefficients         r   sizer;      sZ   -	*	V} 
		 v$$S!,Q/Fs#///VCR[!$883>>			$$$5---			$$$5---			$$$5--11.446??4  #d),-;; 7
 s	   3
Ac           	          Sn[        U [        5      (       a;  U R                  5       n U R                  S5      (       a  SnU SS R                  5       n [	        S[        S[        U 5      U-  5      5      $ )z>Return opacity between 0 and 1 from str, number or percentage.r'   r(   r*   Nr)   r   )
isinstancestrr!   r4   minmaxr2   )valueratios     r   alpha_valuerC   <   sd    E%>>#E#2J$$&Eq#au-.//r   c                     [         R                  " SU5      nU(       a=  UR                  SS5      u  pEXR                  5       S n/ U R	                  XEU5      QUP7$ [
        e)z(Pop first two size values from a string.z(.*?) (.*?)(?: |$)r'   r   N)r   matchgroupendpointr   )svgr#   r7   rE   xys         r   rH   rH   G   sY    HH)62E{{1a 		%41+4V44r   c                 T   U=(       d    UR                  5       nU(       a  USS u  pgO-U R                  U:X  a  U R                  U5      u  pgSXg4;   a  gOgU(       a  X6-  OSnU(       a  XG-  OSn	UR                  SS5      R	                  5       n
U
S   nUS:X  a  S	nS	nO\[        U
5      S:  a  U
S   OSnUS
:X  a  [        X5      nO[        X5      nU=pUSS R                  5       nUSS R                  5       nUR                  S:X  a6  U R                  UR                  S5      UR                  SS5      U5      u  nnOFSnUS:X  a  X6U-  -
  S-  nOUS:X  a  X6U-  -
  nSnUS:X  a  UXGU	-  -
  S-  -  nOUS:X  a
  UXGU	-  -
  -  nU(       a  UUS   U-  -  nUUS   U	-  -  nXUU4$ )z7Compute scale and translation needed to preserve ratio.r   N)r'   r'   r   r   r'   preserveAspectRatioxMidYMidr   noner?   slice      markerrefXrefY0midr@   )get_viewboxtreeget_intrinsic_sizegetr3   r6   r@   r?   lowertagrH   )rI   noder7   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_ratiorn   R   s   +))+G(/%~	T	(+(>(>y(I%M22 3 '4e#!G)7f%QG881:>DDFLOE

+.|+<q+@QdG#g/Kg/K''1QZ%%'
12Y__&
xx8#&99HHVdhhvs3Y$@ [  7#::a?K5 '"99KFg%==BBK5 6W$<<<KwqzG++wqzG++[+55r   c                    U (       ag  U R                  S5      (       aQ  U R                  S5      (       a;  U SS n [        U 5      S:  a'  S H!  nU S   U S   s=:X  a  U:X  d  M  O  M  U SS n   O   [        U =(       d    S	5      $ )
u-   Parse a URL, possibly in a "url(…)" string.zurl()rQ   r)   r   )'"r   r'   r   )
startswithr4   r6   r   )urlquotes     r   	parse_urlrv      sx    
s~~f%%#,,s*;*;!Bis8q=#q6SW---a)C $ CI2r   c                 N    [        U =(       d    S5      =(       d    [        S5      $ )z4Safely parse a color string and return a RGBA tuple.r   blackr	   r"   s    r   colorry      s    v|$<G(<<r   c                    [         R                  " S[        U 5      5      n[        5       nU GH  u  pVUR	                  S5       Vs/ s H  n[        XqU5      PM     nnUS:X  a  [        U6 U-  nMD  US:X  a  [        U5      S:X  a  [        US   US   S9U-  n[        [        [        [        US	   5      5      5      [        [        [        US	   5      5      5      [        [        [        US	   5      5      5      * [        [        [        US	   5      5      5      5      U-  n[        U5      S:X  a  [        US   * US   * S9U-  nGM  GM   UR                  S
5      (       a  [        U5      S:X  a  UR                  S	5        US;   a6  [        [        [        [        UR                  S	5      5      5      5      S9U-  nUS;   a9  [        [        [        [        UR                  S	5      5      5      5      S9U-  nGM  GM  UR                  S5      (       ah  [        U5      S:X  a  UR                  S	5        US;   a  [        UR                  S	5      S9U-  nUS;   a  [        UR                  S	5      S9U-  nGMO  GMR  UR                  S5      (       d  GMk  [        U5      S:X  a  UR                  US	   5        US;   a  [        UR                  S	5      S9U-  nUS;   d  GM  [        UR                  S	5      S9U-  nGM     U$ s  snf )z3Get a matrix corresponding to the transform string.z(\w+) ?\( ?(.*?) ?\)r   matrixrotate   r'   r   )r   fr   skew)skewXr   )c)skewYr   )b	translate)
translateXr   )r   )
translateYr   )r~   scale)scaleXr   )a)scaleYr   )d)r   findallr$   r   r3   r;   r6   r   r   r2   r   rs   appendr   pop)	transform_stringr7   normalized_diagonaltransformationsr{   transformation_typetransformationrA   valuess	            r   	transformr      s    jj+;!<>OXF/>+ (--c242 #672 	 4 (*V_v-F H,6{a&)vay9FBGE&),-.GE&),-.WU6!9-.//GE&),-.	0 39	9F
 6{a6!9*
;fD   ++F336{aa "&77'%

1"678:<BC"&77'%

1"678:<BC 8 !++K886{aa "&AA&**Q-069"&AA&**Q-069 B ++G446{afQi("&99&**Q-069"&99&**Q-069M 0?P MO4s   L)NN)N)r   r   
contextlibr   mathr   r   r   r   urllib.parser   tinycss2.color4r
   r{   r   	Exceptionr   r$   r;   rC   rH   rn   rv   ry   r   r   r   r   <module>r      sS    ' 	  ' ' ! ' 7 7D026j	=
/r   