
    ,g9                         d Z ddlZddlmZ ddlmZmZmZ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dZd Zd Zd Zy)z!Util functions for SVG rendering.    N)suppress)cosradianssintan)urlparseparse_color   )Matrixc                       e Zd ZdZy)
PointErrorz,Exception raised when parsing a point fails.N)__name__
__module____qualname____doc__     l/home/viktor/gitlab-persoonlijk/factuur-applicatie/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 -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                 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.utilsr#   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           	          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_valuer@   <   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   rB   xys         r   rE   rE   G   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}	|j                  dd      j	                         }
|
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xMidYMidr   noner<   slice      markerrefXrefY0midr=   )get_viewboxtreeget_intrinsic_sizegetr0   r3   r=   r<   lowertagrE   )rF   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_ratiork   R   s   +))+G(/%~	T	(+(>(>y(I%~M>22'4em#!G)7f~%QG881:>DDFL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()rN   r&   r   )'"r   r$   r   )
startswithr1   r3   r   )urlquotes     r   	parse_urlrs      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   colorrv      s    v|$<G(<<r   c                    t        j                  dt        |             }t               }|D ]  \  }}|j	                  d      D cg c]  }t        |||       }}|dk(  rt        | |z  }A|dk(  rt        |      dk(  rt        |d   |d         |z  }t        t        t        t        |d	                     t        t        t        |d	                     t        t        t        |d	                      t        t        t        |d	                           |z  }t        |      dk(  st        |d    |d          |z  }|j                  d
      rt        |      dk(  r|j                  d	       |dv r9t        t        t        t        |j                  d	                              |z  }|dv st        t        t        t        |j                  d	                              |z  }|j                  d      rgt        |      dk(  r|j                  d	       |dv rt        |j                  d	            |z  }|dv s$t        |j                  d	            |z  }D|j                  d      sWt        |      dk(  r|j                  |d	          |dv rt        |j                  d	            |z  }|dv st        |j                  d	            |z  } |S c c}w )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   r0   r8   r3   r   r   r/   r   rp   appendr   pop)	transform_stringr4   normalized_diagonaltransformationsrx   transformation_typetransformationr>   valuess	            r   	transformr      s    jj+;!<>OXF/> &:+^ (--c24 	#674 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6{aa "&77'%

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

1"678:<BC ++K86{aa "&AA&**Q-069"&AA&**Q-069 ++G46{afQi("&99&**Q-069"&99&**Q-069M&:P MO4s   K0)NN)N)r   r   
contextlibr   mathr   r   r   r   urllib.parser   tinycss2.color4r
   rx   r   	Exceptionr   r!   r8   r@   rE   rk   rs   rv   r   r   r   r   <module>r      sS    ' 	  ' ' ! ' 7 7D026j	=
/r   