a
    ¥Q•hb  ã                   @   s¼  d Z ddlZddlZddlmZmZ ddlmZmZ ddl	m
Z
 ddlmZ ddlmZmZ d	d
lmZ d	dej ejd ejd dœZd	dddddddœZd	d	ed  d	ed  dœZeeƒeg d¢ƒB ZeddƒZeddƒZeddƒZeeeeedœZddejd fdejfdejd d fd d d!d!d"d"d#d#d$œZd%d&d'd(d(d(d)œZeD ]Zd*ed+eƒfee< �qLeD ]Zded+eƒfee< �qjG d,d-„ d-eƒZ G d.d/„ d/ƒZ!G d0d1„ d1eƒZ"d2d3„ Z#d4d5„ Z$d6d7„ Z%d8d9„ Z&d:d;„ Z'd<d=„ Z(d>d?„ Z)d@dA„ Z*dBdC„ Z+dDdE„ Z,dFdG„ Z-dHdI„ Z.dJdK„ Z/dLdM„ Z0dNdO„ Z1dPdQ„ Z2dtdRdS„Z3dudTdU„Z4dVdW„ Z5dXdY„ Z6dZd[„ Z7d\d]„ Z8dvd`da„Z9dbdc„ Z:ddde„ Z;dfdg„ Z<dhdi„ Z=djdk„ Z>dldm„ Z?dndo„ Z@dpdq„ ZAdrds„ ZBdS )wzUtils for CSS properties.é    N)ÚABCÚabstractmethod)ÚunquoteÚurljoin)Úparse_coloré   )ÚLOGGER)Ú
iri_to_uriÚurl_is_absoluteé   )Ú	Dimensioné´   éÈ   )ZradZturnÚdegZgradgUUUUUUõ?g      0@g      X@g¹\.—ËåB@g�Çãñx<@g�Çãñx<î?)ÚpxÚptÚpcÚinÚcmÚmmÚqr   r   )ZdppxÚdpiZdpcm)ÚexÚemÚchÚremú%é2   éd   )ÚtopÚleftÚcenterÚbottomÚright)Úangler   r$   é   )ÚcornerZtop_left)r&   Z	top_right)r&   Zbottom_left)r&   Zbottom_right))Útor   )r'   r#   )r'   r"   )r'   r    )r'   r   r    )r'   r    r   )r'   r   r#   )r'   r#   r   )r'   r"   r    )r'   r    r"   )r'   r"   r#   )r'   r#   r"   )ÚstringÚ )ÚidentÚcurrentcolor)Úexternalzabout:invalid)Únumberr   )r(   ÚcolorÚurlÚintegerr-   r   ÚlengthÚ0c                   @   s   e Zd ZdZdS )ÚInvalidValuesz7Invalid or unsupported values for a known CSS property.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© r8   r8   úM/var/www/sistema_ama/venv/lib/python3.9/site-packages/weasyprint/css/utils.pyr3   Z   s   r3   c                   @   s   e Zd ZdZdZdZdS )ÚCenterKeywordFakeTokenr*   r!   N)r4   r5   r6   ÚtypeÚlower_valueÚunitr8   r8   r8   r9   r:   ^   s   r:   c                   @   s,   e Zd ZdZdd„ Zedd„ ƒZdd„ ZdS )	ÚPendingzCAbstract class representing property value with pending validation.c                 C   s   || _ || _d| _d S )NF)ÚtokensÚnameÚ_reported_error)Úselfr?   r@   r8   r8   r9   Ú__init__g   s    zPending.__init__c                 C   s   t ‚dS )z#Get validated value for wanted key.N)ÚNotImplementedError)rB   r?   Ú
wanted_keyr8   r8   r9   Úvalidatel   s    zPending.validatec                 C   s®   z|st dƒ‚|  ||¡W S  t y¨ } zv| jr4|‚| jd j}| jd j}d dd„ |D ƒ¡}|jrp|jd prd}t 	d| j
||||¡ d| _|‚W Y d	}~n
d	}~0 0 d	S )
z#Get validated value or raise error.zno valuer   ú c                 s   s   | ]}|  ¡ V  qd S ©N)Ú	serialize©Ú.0Útokenr8   r8   r9   Ú	<genexpr>~   ó    z Pending.solve.<locals>.<genexpr>zinvalid valuezIgnored `%s: %s` at %d:%d, %s.TN)r3   rF   rA   r?   Úsource_lineÚsource_columnÚjoinÚargsr   Úwarningr@   )rB   r?   rE   ÚexcrO   rP   ÚvalueÚmessager8   r8   r9   Úsolveq   s"    þzPending.solveN)r4   r5   r6   r7   rC   r   rF   rW   r8   r8   r8   r9   r>   d   s
   
r>   c                 C   sR   g }g }| D ]2}|j dkr4|jdkr4| |¡ g }q| |¡ q| |¡ t|ƒS )z¦Split a list of tokens on commas, ie ``LiteralToken(',')``.

    Only "top-level" comma tokens are splitting points, not commas inside a
    function or blocks.

    Úliteralú,)r;   rU   ÚappendÚtuple)r?   ÚpartsZ	this_partrL   r8   r8   r9   Úsplit_on_comma‡   s    

r]   c                 C   s4   g }t | ƒD ]"}|s dS |D ]}| |¡ qq|S )zDSplit a list of tokens on optional commas, ie ``LiteralToken(',')``.N)r]   rZ   )r?   r\   Z
split_partÚpartr8   r8   r9   Úsplit_on_optional_commaš   s    r_   c                 C   s   t dd„ | D ƒƒS )z=Remove any top-level whitespace and comments in a token list.c                 s   s   | ]}|j d vr|V  qdS ))Ú
whitespaceÚcommentN)r;   rJ   r8   r8   r9   rM   ©   s   
ÿz$remove_whitespace.<locals>.<genexpr>)r[   )r?   r8   r8   r9   Úremove_whitespace§   s    ÿrb   c                 C   s4   t |ƒrt|ƒS | r"tt| |ƒƒS td|›�ƒ‚d S )Nz+Relative URI reference without a base URI: )r
   r	   r   r3   )Úbase_urlr/   r8   r8   r9   Úsafe_urljoin®   s    ÿrd   c                    s    t  ˆ ¡‡ fdd„ƒ}ˆ |_|S )z<Decorator for validators that accept a comma separated list.c                    sF   g }t | ƒD ]0}ˆ t|ƒg|¢R Ž }|d u r2 d S | |¡ qt|ƒS rH   )r]   rb   rZ   r[   )r?   rR   Úresultsr^   Úresult©Úfunctionr8   r9   Úwrapperº   s    z%comma_separated_list.<locals>.wrapper)Ú	functoolsÚwrapsZsingle_value)rh   ri   r8   rg   r9   Úcomma_separated_list¸   s    rl   c                 C   s   | j dkr| jS dS )z[If ``token`` is a keyword, return its lowercase name.

    Otherwise return ``None``.

    r*   N)r;   r<   ©rL   r8   r8   r9   Úget_keywordÇ   s    
rn   c                 C   s   | j dkr| jS dS )zQIf ``token`` is a keyword, return its name.

    Otherwise return ``None``.

    r*   N)r;   rU   rm   r8   r8   r9   Úget_custom_identÑ   s    
ro   c                 C   s(   t | ƒdkr$| d }|jdkr$|jS dS )zeIf ``values`` is a 1-element list of keywords, return its name.

    Otherwise return ``None``.

    r   r   r*   N)Úlenr;   r<   )r?   rL   r8   r8   r9   Úget_single_keywordÛ   s    
rq   c                    s   t  ˆ ¡‡ fdd„ƒ}|S )z;Decorator for validators that only accept a single keyword.c                    s   t | ƒ}ˆ |ƒr|S dS )z6Wrap a validator to call get_single_keyword on tokens.N)rq   )r?   Úkeywordrg   r8   r9   Úkeyword_validatoré   s    z)single_keyword.<locals>.keyword_validator)rj   rk   )rh   rs   r8   rg   r9   Úsingle_keywordç   s    rt   c                    s    t  ˆ ¡‡ fdd„ƒ}ˆ |_|S )z9Decorator for validators that only accept a single token.c                    s$   t | ƒdkr ˆ | d g|¢R Ž S dS )z*Validate a property whose token is single.r   r   N)rp   )r?   rR   rg   r8   r9   Úsingle_token_validatorô   s    z,single_token.<locals>.single_token_validator)rj   rk   Ú__func__)rh   ru   r8   rg   r9   Úsingle_tokenò   s    rw   c                 C   sx   | d }t |ƒdkr>t|d ƒ}|d urjd|f| dd … fS n,t ttt|ƒƒ¡}|d urj|| dd … fS dtjf| fS )Nr   r   r$   )	rp   Ú	get_angleÚDIRECTION_KEYWORDSÚgetr[   Úmaprn   ÚmathÚpi)Ú	argumentsZ	first_argr$   rf   r8   r8   r9   Ú parse_linear_gradient_parametersý   s    r   c                 C   sÜ   t | ƒdkr| d tg} nt | ƒdkr*dS | \}}t|dd�}t|dd�}|rZ|rZ||fS tt| ƒ\}}|r€|dv r€|t| fS |r˜|dv r˜t| |fS |dv r¸|dv r¸t| t| fS |dv rØ|dv rØt| t| fS dS )	z:Common syntax of background-position and transform-origin.r   r   r   NT©Ú
percentage)r   r!   r"   )r    r!   r#   )rp   r:   Ú
get_lengthr{   rn   ÚBACKGROUND_POSITION_PERCENTAGES)r?   Ztoken_1Ztoken_2Úlength_1Úlength_2Ú	keyword_1Ú	keyword_2r8   r8   r9   Úparse_2d_position
  s4    ÿÿÿÿrˆ   c                 C   s–  t | ƒ}|dur$|\}}d|d|fS t| ƒdkr¨t| d ƒ}t| d ƒ}t| d dd	�}t| d
 dd	�}|r¨|r¨|dv rŒ|dv rŒ||||fS |dv r¨|dv r¨||||fS t| ƒd
k�r’t| d dd	�}|durèt| d ƒ}	t| d ƒ}
n(t| d dd	�}t| d ƒ}
t| d ƒ}	|du�r’|
dk�rR|	dv �r:dt|	|fS |	dv �r’|	|dtfS n@|	dv �rr|
dv �rr|	||
tfS |	dv �r’|
dv �r’|
t|	|fS dS )zÄParse background-position and object-position.

    See https://drafts.csswg.org/css-backgrounds-3/#the-background-position
    https://drafts.csswg.org/css-images-3/#propdef-object-position

    Nr    r   é   r   r   r   Tr€   r%   )r    r#   )r   r"   r!   )rˆ   rp   rn   r‚   ÚFIFTY_PERCENTÚZERO_PERCENT)r?   rf   Zpos_xZpos_yr†   r‡   r„   r…   r1   rr   Zother_keywordr8   r8   r9   Úparse_position&  sP    ÿÿ




ÿ
ÿrŒ   c           
      C   s`  d }d }d }d }| d d d d… }|�r|  ¡ }t|ƒ}|dkrdt|d d d… ƒ}|d u r^d S �qq"|dv rz|d u rz|}q"|dv r”|d u r”d|f}q"|rà|d u ràt|dd�}t|d dd�}	d ||	fvràd	||	ff}d
}|  ¡  |d u �rt|ƒ}|d u�rd	||ff}d}|d u r"d S q"||fdv �r,d S |�p:|�p:d
|�pBd|�pRdtdtf| dd … fS )Nr   éÿÿÿÿÚat©ÚcircleÚellipse)zclosest-cornerúfarthest-cornerzclosest-sidezfarthest-siderr   Tr€   Úexplicitr‘   r�   )r�   r�   ©rr   r’   r    r   r   )Úpoprn   rŒ   r‚   rŠ   )
r~   ÚshapeÚpositionÚsizeZ
size_shapeÚstackrL   rr   r„   r…   r8   r8   r9   Ú parse_radial_gradient_parametersW  sP    ÿ



ürš   c                 C   sˆ   t | ƒdkr>t| d ƒ}|dkr,tdƒd fS |d ur€|d fS nBt | ƒdkr€t| d ƒ}t| d ddd�}|d ur€|d ur€||fS t‚d S )Nr   r   r+   Úblackr   T)Únegativer�   )rp   r   r‚   r3   )r?   r.   r—   r8   r8   r9   Úparse_color_stop‚  s    
r�   c                 C   sœ   | j dkrdS tt| jƒƒ}g }d}|rŠ| d¡}|j dkoD|jdk}|rR|rRdS |r\d}q$d}|j dkr~t|ƒ}|du r~dS | |¡ q$|r’dS | j|fS )z§Parse functional notation.

    Return ``(name, args)`` if the given token is a function with comma- or
    space-separated arguments. Return ``None`` otherwise.

    rh   NFr   rX   rY   T)	r;   Úlistrb   r~   r•   rU   Úparse_functionrZ   Ú
lower_name)Zfunction_tokenÚcontentr~   Zlast_is_commarL   Zis_commaZargument_functionr8   r8   r9   rŸ   ’  s*    


rŸ   c           	      C   sà   t | ƒ}|d u rd S |\}}|dkrÜt|ƒdv rÜ|d jdkrBd S |d j}t|ƒdkrbd}d}n`|d jdkrtd S |d j}|tvrŠd S t|ƒdkr t| }n"|d j}|dkr¾|d j}nd S |d |fv rÜd	|||ffS d S )
NÚattr)r   r   r%   r   r*   r   r(   r)   r   zattr())rŸ   rp   r;   rU   ÚATTR_FALLBACKS)	rL   Úallowed_typerh   r@   rR   Ú	attr_nameZtype_or_unitÚfallbackZfallback_typer8   r8   r9   Úcheck_attr_function²  s0    



r§   c           
      C   sð   ddl m} t| ƒ}|d u r d S |\}}g }|dkr@t|ƒdv sT|dkrìt|ƒdv rì| d¡}|jdkrld S | |j¡ |dkr¤| d¡}|jd	kr˜d S | |j¡ |rÐ|| d¡fƒ}	|	d u rÄd S | |	¡ n
| d
¡ |› d�t|ƒfS d S )Nr   )Úlist_style_typeÚcounter©r   r   Úcounters©r   r%   r   r*   r(   Údecimalú())	Zvalidation.propertiesr¨   rŸ   rp   r•   r;   rZ   rU   r[   )
rL   r¤   r¨   rh   r@   rR   r~   r*   r(   Úcounter_styler8   r8   r9   Úcheck_counter_functionÑ  s6    ÿ
ÿ




r°   c                 C   sl   t | ƒ}|d u rd S |\}}|dkrht|ƒdkr4dS t|ƒdkrh| d¡}|jdkrh|jdv rhd|jfS d S )Nr¡   r   ©ú	content()Útextr   r*   )r³   ÚbeforeÚafterúfirst-letterÚmarkerr²   )rŸ   rp   r•   r;   r<   )rL   rh   r@   rR   r*   r8   r8   r9   Úcheck_content_functionñ  s    
r¸   c                 C   s–   t |ƒ}|d u rd S |\}}|| kr’t|ƒdv r’| d¡}|jdkrHd S |j}|r|| d¡}|jdksp|jdvrtd S |j}nd}| › d�||ffS d S )Nrª   r   r*   )ÚfirstÚstartÚlastzfirst-exceptr¹   r®   )rŸ   rp   r•   r;   rU   r<   )Zstring_or_elementrL   rh   r@   rR   Zcustom_identr*   r8   r8   r9   Ú check_string_or_element_function   s     


r¼   c                 C   s\   t | ƒ }rX|\}}|dkr@|r@| d¡}|jdko>|j d¡S |D ]}t|ƒrD dS qDd S )NÚvarr   r*   z--T)rŸ   r•   r;   rU   Ú
startswithÚcheck_var_function)rL   rh   r@   rR   r*   Úargr8   r8   r9   r¿     s    
r¿   c                 C   sn   | j dkrd| jfS | j dkrj| jdkr2t| dƒS | jdv rDt| ƒS | jdkrVt| ƒS | jdkrjtd| ƒS dS )zParse a <string> token.r(   rh   r¢   )r©   r«   r¡   N)r;   rU   r@   r§   r°   r¸   r¼   rm   r8   r8   r9   Ú
get_string$  s    







rÁ   TFc                 C   sz   |r(| j dkr(|s| jdkr(t| jdƒS | j dkrX| jtv rX|sJ| jdkrXt| j| jƒS | j dkrv| jdkrvtddƒS dS )zParse a <length> token.r�   r   r   Ú	dimensionr-   N)r;   rU   r   r=   ÚLENGTH_UNITS)rL   rœ   r�   r8   r8   r9   r‚   3  s    r‚   c                 C   s,   | j dkr(t | j¡}|dur(| j| S dS )z"Parse an <angle> token in radians.rÂ   N)r;   ÚANGLE_TO_RADIANSrz   r=   rU   ©rL   Úfactorr8   r8   r9   rx   ?  s    
rx   c                 C   s,   | j dkr(t | j¡}|dur(| j| S dS )z#Parse a <resolution> token in ddpx.rÂ   N)r;   ÚRESOLUTION_TO_DPPXrz   r=   rU   rÅ   r8   r8   r9   Úget_resolutionG  s    
rÈ   c                 C   s  ddl m}m} t| |ƒ}|rN|d dks.J ‚|d d dkrNd|d d fS | jdkr\dS tt| jƒƒ}| j}|d	v r¨t	|ƒ\}}|r¦d
|dd„ |D ƒ|d|v ƒfS nh|dv �rt
|ƒ}	|	durÐ|	\}
}}}nd}
d}dtdtf}|}|�rd|dd„ |D ƒ|
||d|v ƒfS dS )zParse an <image> token.r   )ÚLinearGradientÚRadialGradientr   r/   r   r,   rh   N)úlinear-gradientzrepeating-linear-gradientrË   c                 S   s   g | ]}t |ƒ‘qS r8   ©r�   ©rK   Ústopr8   r8   r9   Ú
<listcomp>`  rN   zget_image.<locals>.<listcomp>Z	repeating)úradial-gradientzrepeating-radial-gradientr‘   r”   r    r   rÐ   c                 S   s   g | ]}t |ƒ‘qS r8   rÌ   rÍ   r8   r8   r9   rÏ   m  rN   )ÚimagesrÉ   rÊ   Úget_urlr;   r]   rb   r~   r    r   rš   rŠ   )rL   rc   rÉ   rÊ   Ú
parsed_urlr~   r@   Ú	directionZcolor_stopsrf   r–   r˜   r—   r8   r8   r9   Ú	get_imageO  s<    

þ
þrÕ   c                 C   s8   |   d¡r"ddt| dd … ƒffS ddt|| ƒffS d S )Nú#r/   Úinternalr   r,   )r¾   r   rd   )r(   rc   r8   r8   r9   Ú_get_url_tupleq  s    
rØ   c                 C   sb   | j dkrt| j|ƒS | j dkr^| jdkr4t| dƒS | jdkr^t| jƒdv r^t| jd j|ƒS dS )zParse an <url> token.r/   rh   r¢   rª   r   N)r;   rØ   rU   r@   r§   rp   r~   )rL   rc   r8   r8   r9   rÒ   x  s    



rÒ   c                 C   s   t | ƒ}|dv r|S dS )zParse a <quote> token.)z
open-quotezclose-quotezno-open-quotezno-close-quoteN)rn   )rL   rr   r8   r8   r9   Ú	get_quote…  s    rÙ   c                 C   sš  t | ƒ}|du rdS |\}}t|ƒ}|s,dS |dkrFt|ƒdvr~dS n8|dkr`t|ƒdvr~dS n|dkrzt|ƒdvr~dS ndS g }| d¡}t|ƒ}|du r¾t||ƒ}|du r²dS | |¡ n
| |¡ | d¡�rV|sÜdS | d¡}	|	jd	krôdS | |	j	¡ |dk�r0t| d¡ƒ}
|
du �r&dS | |
¡ |�rFt
| d¡ƒ}nd
}| |¡ n2|�rzt
| d¡ƒ}|dv�r~dS nd}| |¡ |› d�t|ƒfS )zParse a <target> token.Nztarget-counterr¬   ztarget-counters)r%   r‰   ztarget-textrª   r   r*   r­   )r¡   r´   rµ   r¶   r¡   r®   )rŸ   r_   rp   r•   rÁ   rÒ   rZ   r¾   r;   rU   rn   r[   )rL   rc   rh   r@   rR   ÚvaluesÚlinkZstring_linkr/   r*   r(   r¯   r¡   r8   r8   r9   Ú
get_targetŽ  sb    









rÜ   c                    s"   ‡ fdd„| D ƒ}d|vr|S dS )zParse <content-list> tokens.c                    s   g | ]}t |ˆ ƒ‘qS r8   )Úget_content_list_tokenrJ   ©rc   r8   r9   rÏ   Ó  s   z$get_content_list.<locals>.<listcomp>Nr8   )r?   rc   Zparsed_tokensr8   rÞ   r9   Úget_content_listÐ  s
    
ÿrß   c           
      C   s  t | ƒ}|dur|S t| ƒdkr$dS t| |ƒ}|dur:|S t| ƒ}|durRd|fS t| |ƒ}|durh|S t| ƒ}|du r|dS |\}}|dk�r t|ƒdkrždS |\}	|	jdkrä|	jdkr¾d	}qô|	jd
krÎd}qô|	jdkrÞd}qôdS n|	jdkrô|	j}dd|ffS |dk�rt	d| ƒS dS )z'Parse one of the <content-list> tokens.NÚcontentsr±   ÚquoteÚleaderr   r*   ZdottedÚ.ZsolidÚ_ÚspacerG   r(   zleader()Úelement)
rÁ   rn   rÒ   rÙ   rÜ   rŸ   rp   r;   rU   r¼   )
rL   rc   r(   r/   rá   Útargetrh   r@   rR   rÀ   r8   r8   r9   rÝ   Ù  sF    








rÝ   )N)N)TF)Cr7   rj   r|   Úabcr   r   Úurllib.parser   r   Ztinycss2.color4r   r)   r   Úurlsr	   r
   Ú
propertiesr   r}   rÄ   ZLENGTHS_TO_PIXELSrÇ   ÚsetrÃ   r‹   rŠ   ZHUNDRED_PERCENTrƒ   ry   r£   r=   Ú
ValueErrorr3   r:   r>   r]   r_   rb   rd   rl   rn   ro   rq   rt   rw   r   rˆ   rŒ   rš   r�   rŸ   r§   r°   r¸   r¼   r¿   rÁ   r‚   rx   rÈ   rÕ   rØ   rÒ   rÙ   rÜ   rß   rÝ   r8   r8   r8   r9   Ú<module>   s¼   ü
ù

ý


ûòú#


1+ 

 
"	B	