a
    [Xh9                     @   s   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
 d
eZdd ZdddZdd Zdd ZdddZdd Zdd Zdd ZdS )z!Util functions for SVG rendering.    N)suppress)cosradianssintan)urlparseparse_color   )Matrixc                   @   s   e Zd ZdZdS )
PointErrorz,Exception raised when parsing a point fails.N)__name__
__module____qualname____doc__ r   r   Y/var/www/viveiro_mudafortebrasil/venv/lib/python3.9/site-packages/weasyprint/svg/utils.pyr      s   r   c                 C   sB   | pd dd} tdd| } tdd| } tdd	| } |  S )
z1Give a canonical version of a given value string. Eez(?<!e)-z -z[ 
	,]+ z(\.[0-9-]+)(?=\.)z\1 )replaceresubstripstringr   r   r   	normalize   s
    r   c                 C   sN  ddl m} | sdS tt t| W  d   S 1 s:0    Y  t| ddd } | dr|dusnJ t| dd | d	 S | d
r|dusJ |t| dd  S | dr|dusJ |t| dd  S | dr|du sJ |t| dd  d S | D ]4\}}| |rt| dt	|  |   S qdS )z:Compute size from string, resolving units and percentages.r
   )LENGTHS_TO_PIXELSr   Nr      %d   rememex)
Z	css.utilsr   r   
ValueErrorfloatr   splitendswithitemslen)r   	font_sizeZpercentage_referencer   unitZcoefficientr   r   r   size   s,    
&


"r0   c                 C   sL   d}t | tr4|  } | dr4d}| dd  } tdtdt| | S )z>Return opacity between 0 and 1 from str, number or percentage.r   r    r"   Nr!   r   )
isinstancestrr   r+   minmaxr)   )valueZratior   r   r   alpha_value<   s    

r6   c                 C   sP   t d|}|rH|dd\}}|| d }g | ||||R S tdS )z(Pop first two size values from a string.z(.*?) (.*?)(?: |$)r   r
   N)r   matchgroupendpointr   )svgr   r.   r7   xyr   r   r   r:   G   s    r:   c                 C   s  |p
|  }|r"|dd \}}n.| j|krL| |\}}d||fv rPdS ndS |r\|| nd}|rl|| nd}	|dd }
|
d }|dkrd	}d	}n^t|
dkr|
d nd}|d
krt||	}n
t||	}| }}	|dd  }|dd  }|j	dkr&| 
|d|dd|\}}ntd}|dkrF|||  d }n|dkr\|||  }d}|dkr||||	  d 7 }n|dkr||||	  7 }|r||d | 8 }||d |	 8 }||	||fS )z7Compute scale and translation needed to preserve ratio.r
   N)r   r   r   r   r   preserveAspectRatioZxMidYMidr   noner3   slice      markerrefXrefY0Zmidr4   )Zget_viewboxtreeZget_intrinsic_sizegetr*   r-   r4   r3   lowertagr:   )r;   noder.   widthheightviewboxZviewbox_widthZviewbox_heightZscale_xZscale_yZaspect_ratioZalignZ
x_positionZ
y_positionZmeet_or_sliceZscale_valueZtranslate_xZtranslate_yr   r   r   preserve_ratioR   sP    






rO   c                 C   sv   | rj|  drj| drj| dd } t| dkrjdD ]4}| d | d   krT|kr4n q4| dd }  qjq4t| prd	S )
u-   Parse a URL, possibly in a "url(…)" string.zurl()rA   r!   r
   )'"r   r   r   )
startswithr+   r-   r   )urlquoter   r   r   	parse_url   s     rV   c                 C   s   t | pdpt dS )z4Safely parse a color string and return a RGBA tuple.r   Zblackr   r   r   r   r   color   s    rW   c              
      sD  t dt| }t }|D ]"\}} fdd|dD }|dkrTt| | }q|dkrt|dkrt|d |d	 d
| }tttt|d t	tt|d t	tt|d  ttt|d | }t|dkr>t|d  |d	  d
| }q|
dr|t|dkr&|d |dv rPtttt|dd| }|dv r>tttt|dd| }q|
drt|dkr|d |dv rt|dd| }|dv r>t|dd| }q|
drt|dkr||d  |dv r"t|dd| }|dv rt|dd| }q|S )z3Get a matrix corresponding to the transform string.z(\w+) ?\( ?(.*?) ?\)c                    s   g | ]}t | qS r   )r0   ).0r5   r.   normalized_diagonalr   r   
<listcomp>   s   ztransform.<locals>.<listcomp>r   matrixrotate   r   r
   )r   fr   skew)ZskewXr`   )c)ZskewYr`   )b	translate)Z
translateXrc   )r   )Z
translateYrc   )r_   scale)ZscaleXrd   )a)ZscaleYrd   )d)r   findallr   r   r*   r-   r   r   r)   r   rS   appendr   pop)Ztransform_stringr.   rZ   Ztransformationsr\   Ztransformation_typeZtransformationvaluesr   rY   r   	transform   sj    








rk   )NN)N)r   r   
contextlibr   mathr   r   r   r   urllib.parser   Ztinycss2.color4r	   r\   r   	Exceptionr   r   r0   r6   r:   rO   rV   rW   rk   r   r   r   r   <module>   s   	
"
5