o
    Zh0h9                     @   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   J/var/www/html/rh/venv/lib/python3.10/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   sF  ddl m} | s
dS tt t| W  d   S 1 sw   Y  t| ddd } | drC|dus7J t| dd | d	 S | d
rX|dusNJ |t| dd  S | drm|duscJ |t| dd  S | dr|dusxJ |t| dd  d S | D ]\}}| |rt| dt	|  |   S qdS )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coefficientr   r   r   size   s0   
 




r3   c                 C   sL   d}t | tr|  } | drd}| 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*   )valueratior   r   r   alpha_value<   s   

r:   c                 C   sL   t d|}|r$|dd\}}|| d }g | ||||R S t)z(Pop first two size values from a string.z(.*?) (.*?)(?: |$)r   r
   N)r   matchgroupendpointr   )svgr   r/   r;   xyr   r   r   r>   G   s   r>   c                 C   s  |p|  }|r|dd \}}n| j|kr&| |\}}d||fv r%dS ndS |r.|| nd}|r6|| nd}	|dd }
|
d }|dkrMd	}d	}n/t|
dkrW|
d nd}|d
krct||	}nt||	}| }}	|dd  }|dd  }|j	dkr| 
|d|dd|\}}n6d}|dkr|||  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   preserveAspectRatioxMidYMidr   noner6   slice      markerrefXrefY0midr7   )get_viewboxtreeget_intrinsic_sizegetr+   r.   r7   r6   lowertagr>   )r?   noder/   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_yr   r   r   preserve_ratioR   sR   



rc   c                 C   sv   | r5|  dr5| dr5| dd } t| dkr5dD ]}| d | d   kr*|kr4n q| dd }  nqt| p9d	S )
u-   Parse a URL, possibly in a "url(…)" string.zurl()rF   r!   r
   )'"r   r   r   )
startswithr,   r.   r   )urlquoter   r   r   	parse_url   s    rj   c                 C   s   t | pdp	t dS )z4Safely parse a color string and return a RGBA tuple.r   blackr   r   r   r   r   color   s   rl   c              
      s2  t dt| }t }|D ]\}} fdd|dD }|dkr*t| | }q|dkrt|dkr@t|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rt|dkr|d |dv rtttt|dd| }|dv rtttt|dd| }q|
drt|dkr|d |dv rt|dd| }|dv rt|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   )r3   ).0r8   r/   normalized_diagonalr   r   
<listcomp>   s    
ztransform.<locals>.<listcomp>r   matrixrotate   r   r
   )r   fr   skew)skewXru   )c)skewYru   )b	translate)
translateXrz   )r   )
translateYrz   )rt   scale)scaleXr}   )a)scaleYr}   )d)r   findallr   r   r+   r.   r   r   r*   r   rg   appendr   pop)transform_stringr/   ro   transformationsrq   transformation_typetransformationvaluesr   rn   r   	transform   sr   





r   )NN)N)r   r   
contextlibr   mathr   r   r   r   urllib.parser   tinycss2.color4r	   rq   r   	Exceptionr   r   r3   r:   r>   rc   rj   rl   r   r   r   r   r   <module>   s     
	"
5