a
    Qh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@gx<@gx<?)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 )zSplit 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 rt| |fS |dv r|dv rt| t| fS |dv r|dv rt| 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rt| 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rt| d dd	}|durt| 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 )zParse 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 rd|f}q"|r|d u rt|dd}t|d dd}	d ||	fvrd	||	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rt| 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$|rdS | j|fS )zParse 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rt|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rd S t|dkrt| }n"|d j}|dkr|d j}nd S |d |fv rd	|||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rt|dv r|d}|jdkrld S ||j |dkr|d}|jd	krd S ||j |r||df}	|	d u rd 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rt|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 rt	|\}}|rd
|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 rt||}|du rdS || n
|| |drV|sdS |d}	|	jd	krd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rdS |\}	|	jdkr|	jdkrd	}q|	jd
krd}q|	jdkrd}qd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	