a
    [Xh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<?)ZpxptZpcincmmmqr   r   )ZdppxZ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__ r5   r5   Y/var/www/viveiro_mudafortebrasil/venv/lib/python3.9/site-packages/weasyprint/css/utils.pyr0   Z   s   r0   c                   @   s   e Zd ZdZdZdZdS )CenterKeywordFakeTokenr'   r   N)r1   r2   r3   typelower_valueunitr5   r5   r5   r6   r7   ^   s   r7   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=   r5   r5   r6   __init__g   s    zPending.__init__c                 C   s   t dS )z#Get validated value for wanted key.N)NotImplementedError)r?   r<   
wanted_keyr5   r5   r6   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tokenr5   r5   r6   	<genexpr>~       z Pending.solve.<locals>.<genexpr>zinvalid valuezIgnored `%s: %s` at %d:%d, %s.TN)r0   rC   r>   r<   source_linesource_columnjoinargsr   warningr=   )r?   r<   rB   excrL   rM   valuemessager5   r5   r6   solveq   s"    zPending.solveN)r1   r2   r3   r4   r@   r   rC   rT   r5   r5   r5   r6   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,)r8   rR   appendtuple)r<   partsZ	this_partrI   r5   r5   r6   split_on_comma   s    

rZ   c                 C   s4   g }t | D ]"}|s dS |D ]}|| qq|S )zDSplit a list of tokens on optional commas, ie ``LiteralToken(',')``.N)rZ   rW   )r<   rY   Z
split_partpartr5   r5   r6   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)r8   rG   r5   r5   r6   rJ      s   
z$remove_whitespace.<locals>.<genexpr>)rX   )r<   r5   r5   r6   remove_whitespace   s    r_   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   r0   )base_urlr,   r5   r5   r6   safe_urljoin   s    ra   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 rE   )rZ   r_   rW   rX   )r<   rO   resultsr[   resultfunctionr5   r6   wrapper   s    z%comma_separated_list.<locals>.wrapper)	functoolswrapsZsingle_value)re   rf   r5   rd   r6   comma_separated_list   s    ri   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)r8   r9   rI   r5   r5   r6   get_keyword   s    
rk   c                 C   s   | j dkr| jS dS )zQIf ``token`` is a keyword, return its name.

    Otherwise return ``None``.

    r'   N)r8   rR   rj   r5   r5   r6   get_custom_ident   s    
rl   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)lenr8   r9   )r<   rI   r5   r5   r6   get_single_keyword   s    
rn   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)rn   )r<   keywordrd   r5   r6   keyword_validator   s    z)single_keyword.<locals>.keyword_validator)rg   rh   )re   rp   r5   rd   r6   single_keyword   s    rq   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)rm   )r<   rO   rd   r5   r6   single_token_validator   s    z,single_token.<locals>.single_token_validator)rg   rh   __func__)re   rr   r5   rd   r6   single_token   s    rt   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!   )	rm   	get_angleDIRECTION_KEYWORDSgetrX   maprk   mathpi)	argumentsZ	first_argr!   rc   r5   r5   r6    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    )rm   r7   
get_lengthrx   rk   BACKGROUND_POSITION_PERCENTAGES)r<   Ztoken_1Ztoken_2length_1length_2	keyword_1	keyword_2r5   r5   r6   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   rm   rk   r   FIFTY_PERCENTZERO_PERCENT)r<   rc   Zpos_xZpos_yr   r   r   r   r.   ro   Zother_keywordr5   r5   r6   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-sidero   Tr}   explicitr   r   )r   r   ro   r   r   r   r   )poprk   r   r   r   )
r{   shapepositionsizeZ
size_shapestackrI   ro   r   r   r5   r5   r6    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(   Zblackr   T)negativer~   )rm   r   r   r0   )r<   r+   r   r5   r5   r6   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.

    re   NFr   rU   rV   T)	r8   listr_   r{   r   rR   parse_functionrW   
lower_name)Zfunction_tokencontentr{   Zlast_is_commarI   Zis_commaZargument_functionr5   r5   r6   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   rm   r8   rR   ATTR_FALLBACKS)	rI   allowed_typere   r=   rO   	attr_nameZtype_or_unitfallbackZfallback_typer5   r5   r6   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   rm   r   r8   rW   rR   rX   )
rI   r   r   re   r=   rO   r{   r'   r%   counter_styler5   r5   r6   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   rm   r   r8   r9   )rI   re   r=   rO   r'   r5   r5   r6   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   rm   r   r8   rR   r9   )Zstring_or_elementrI   re   r=   rO   Zcustom_identr'   r5   r5   r6    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   r8   rR   
startswithcheck_var_function)rI   re   r=   rO   r'   argr5   r5   r6   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%   re   r   )r   r   r   N)r8   rR   r=   r   r   r   r   rj   r5   r5   r6   
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)r8   rR   r   r:   LENGTH_UNITS)rI   r   r~   r5   r5   r6   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)r8   ANGLE_TO_RADIANSrw   r:   rR   rI   Zfactorr5   r5   r6   ru   ?  s    
ru   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)r8   RESOLUTION_TO_DPPXrw   r:   rR   r   r5   r5   r6   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)   re   N)linear-gradientzrepeating-linear-gradientr   c                 S   s   g | ]}t |qS r5   r   rH   stopr5   r5   r6   
<listcomp>`  rK   zget_image.<locals>.<listcomp>Z	repeating)radial-gradientzrepeating-radial-gradientr   r   r   r   r   c                 S   s   g | ]}t |qS r5   r   r   r5   r5   r6   r   m  rK   )Zimagesr   r   get_urlr8   rZ   r_   r{   r   r|   r   r   )rI   r`   r   r   
parsed_urlr{   r=   	directionZcolor_stopsrc   r   r   r   r5   r5   r6   	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,   Zinternalr   r)   )r   r   ra   )r%   r`   r5   r5   r6   _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,   re   r   r   r   N)r8   r   rR   r=   r   rm   r{   )rI   r`   r5   r5   r6   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)rk   )rI   ro   r5   r5   r6   	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\   rm   r   r   r   rW   r   r8   rR   rk   rX   )rI   r`   re   r=   rO   valueslinkZstring_linkr,   r'   r%   r   r   r5   r5   r6   
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 r5   )get_content_list_tokenrG   r`   r5   r6   r     s   z$get_content_list.<locals>.<listcomp>Nr5   )r<   r`   Zparsed_tokensr5   r   r6   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   quoteZleaderr   r'   Zdotted.Zsolid_spacerD   r%   zleader()element)
r   rk   r   r   r   r   rm   r8   rR   r   )
rI   r`   r%   r,   r   targetre   r=   rO   r   r5   r5   r6   r     sF    








r   )N)N)TF)Cr4   rg   ry   abcr   r   urllib.parser   r   Ztinycss2.color4r   r&   r   urlsr	   r
   Z
propertiesr   rz   r   ZLENGTHS_TO_PIXELSr   setr   r   r   ZHUNDRED_PERCENTr   rv   r   r:   
ValueErrorr0   r7   r;   rZ   r\   r_   ra   ri   rk   rl   rn   rq   rt   r|   r   r   r   r   r   r   r   r   r   r   r   r   ru   r   r   r   r   r   r   r   r   r5   r5   r5   r6   <module>   s   





#


1+ 

 
"	B	