o
    h:                     @   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   V/var/www/html/optinet_system/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              
      s  d\}}t | }t|dkrt|d t|d }}t||d}tdt | }|D ]\}	}
 fdd|
d	D }|	d
krJt| | }q-|	dkrt|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rt|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rt|dkr|d |	dv rt|dd| }|	dv rt|dd| }q-|	dr9t|dkr||d  |	dv r*t|dd| }|	dv r9t|dd| }q-t| | d| S )z3Get a matrix corresponding to the transform string.)r   r   r
   r   r   )r   fz(\w+) ?\( ?(.*?) ?\)c                    s   g | ]}t | qS r   )r3   ).0r8   r/   normalized_diagonalr   r   
<listcomp>   s    
ztransform.<locals>.<listcomp>r   matrixrotate   skew)skewXru   )c)skewYru   )b	translate)
translateXrz   )r   )
translateYrz   )rm   scale)scaleXr}   )a)scaleYr}   )d)r   r+   r.   r3   r   r   findallr   r   r*   r   rg   appendr   pop)transform_stringtransform_originr/   rp   origin_xorigin_ysize_stringsrr   transformationstransformation_typetransformationvaluesr   ro   r   	transform   sv   





r   )NN)N)r   r   
contextlibr   mathr   r   r   r   urllib.parser   tinycss2.color4r	   rr   r   	Exceptionr   r   r3   r:   r>   rc   rj   rl   r   r   r   r   r   <module>   s     
	"
5