
    3vj                         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__     G/root/.hermes/venv/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VVNFF3FVVM3/FVV(&&9F<<>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#///VCR[!$883>>		$$$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#2J$$&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_    HH)62E{{1a 1		%41a+4V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'4em#!G)7f~%QGxx 5zBHHJ OE

+.|+<q+@QdG#gw/Kgw/K'''1QZ%%'
12Y__&
xx8#&99HHVdhhvs3Y$@ [  =7#::a?K5 -'"99KF^g%==BBK5 6NW$<<<KwqzG++wqzG++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*;!Bis8q=# q6SW--a)C CI2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(  rt        |      d
k(  r0t        |d   ||      }t        |d   ||      }t	        ||      |z  }t        |d         }t        |      t        |      }}t	        ||| |      |z  }t        |      d
k(  st	                |z  }|	j                  d      rt        |      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+    Hh-.446L
<A!,q/2Da4I(h(+Fjj!8)DT:UVO/> %:+^%3%9%9#%>HE%%HH(*OUVed5)-@AVFVV_v-F H,6{aq	96IJq	96IJ(h7&@VAY'Hx=#h-5EE55&%86AF6{a8)y9FB ++F36{ac""&77#eFJJqM&:";<vE"&77#eFJJqM&:";<vE ++K8OUVed5)-@AVFV6{aa "&AA&**Q-069"&AA&**Q-069 ++G4OUVed5)-@AVFV6{afQi("&99&**Q-069"&99&**Q-069K%:N XI(+f44M 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6p	=
25r   