o
    %e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< qeD ]Zded+efee< qG 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Z3dtdTdUZ4dVdW Z5dXdY Z6dZd[ Z7d\d] Z8dud`daZ9dbdc Z:ddde Z;dfdg Z<dhdi Z=djdk Z>dldm Z?dndo Z@dpdq ZAdrds ZBdS )vzUtils for CSS properties.    N)ABCabstractmethod)unquoteurljoin)parse_color   )LOGGER)
iri_to_uriurl_is_absolute   )	Dimension      )radturndeggradgUUUUUU?g      0@g      X@g\.B@gx<@gx<?)pxptpcincmmmqr   r   )dppxdpidpcm)exemchrem%2   d   )topleftcenterbottomright)angler   r)      )cornertop_left)r+   	top_right)r+   bottom_left)r+   bottom_right))tor$   )r0   r(   )r0   r'   )r0   r%   )r0   r$   r%   )r0   r%   r$   )r0   r$   r(   )r0   r(   r$   )r0   r'   r%   )r0   r%   r'   )r0   r'   r(   )r0   r(   r'   )string )identcurrentcolor)externalzabout:invalid)numberr   )r1   colorurlintegerr6   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__ rA   rA   G/var/www/html/venv/lib/python3.10/site-packages/weasyprint/css/utils.pyr<   Z   s    r<   c                   @   s   e Zd ZdZdZdZdS )CenterKeywordFakeTokenr3   r&   N)r=   r>   r?   typelower_valueunitrA   rA   rA   rB   rC   ^   s    rC   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)selfrH   rI   rA   rA   rB   __init__g   s   
zPending.__init__c                 C   s   t )z#Get validated value for wanted key.)NotImplementedError)rK   rH   
wanted_keyrA   rA   rB   validatel   s   zPending.validatec                 C   s   z|st d| ||W S  t yN } z5| jr|| jd j}| jd j}ddd |D }|jr8|jd p9d}t	d| j
|||| d| _|d	}~ww )
z#Get validated value or raise error.zno valuer    c                 s   s    | ]}|  V  qd S N)	serialize.0tokenrA   rA   rB   	<genexpr>~   s    z Pending.solve.<locals>.<genexpr>zinvalid valuezIgnored `%s: %s` at %d:%d, %s.TN)r<   rO   rJ   rH   source_linesource_columnjoinargsr   warningrI   )rK   rH   rN   excrW   rX   valuemessagerA   rA   rB   solveq   s&   zPending.solveN)r=   r>   r?   r@   rL   r   rO   r_   rA   rA   rA   rB   rG   d   s    
rG   c                 C   sR   g }g }| D ]}|j dkr|jdkr|| 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,)rD   r]   appendtuple)rH   parts	this_partrU   rA   rA   rB   split_on_comma   s   

rf   c                 C   s4   g }t | D ]}|s dS |D ]}|| qq|S )zDSplit a list of tokens on optional commas, ie ``LiteralToken(',')``.N)rf   rb   )rH   rd   
split_partpartrA   rA   rB   split_on_optional_comma   s   ri   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)rD   rS   rA   rA   rB   rV      s    
z$remove_whitespace.<locals>.<genexpr>)rc   )rH   rA   rA   rB   remove_whitespace   s   rl   c                 C   s0   t |rt|S | rtt| |S td|)Nz+Relative URI reference without a base URI: )r
   r	   r   r<   )base_urlr8   rA   rA   rB   safe_urljoin   s   rn   c                        t   fdd} |_|S )z<Decorator for validators that accept a comma separated list.c                    sF   g }t | D ]} t|g|R  }|d u r d S || qt|S rQ   )rf   rl   rb   rc   )rH   rZ   resultsrh   resultfunctionrA   rB   wrapper   s   z%comma_separated_list.<locals>.wrapper)	functoolswrapssingle_value)rs   rt   rA   rr   rB   comma_separated_list   s   rx   c                 C      | j dkr| jS dS )z[If ``token`` is a keyword, return its lowercase name.

    Otherwise return ``None``.

    r3   N)rD   rE   rU   rA   rA   rB   get_keyword      
r{   c                 C   ry   )zQIf ``token`` is a keyword, return its name.

    Otherwise return ``None``.

    r3   N)rD   r]   rz   rA   rA   rB   get_custom_ident   r|   r}   c                 C   s,   t | dkr| d }|jdkr|jS dS dS )zeIf ``values`` is a 1-element list of keywords, return its name.

    Otherwise return ``None``.

    r   r   r3   N)lenrD   rE   )rH   rU   rA   rA   rB   get_single_keyword   s   
r   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)r   )rH   keywordrr   rA   rB   keyword_validator   s   z)single_keyword.<locals>.keyword_validator)ru   rv   )rs   r   rA   rr   rB   single_keyword   s   r   c                    ro   )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)r~   )rH   rZ   rr   rA   rB   single_token_validator   s   z,single_token.<locals>.single_token_validator)ru   rv   __func__)rs   r   rA   rr   rB   single_token   s   r   c                 C   sx   | d }t |dkrt|d }|d urd|f| dd  fS ntttt|}|d ur5|| dd  fS dtjf| fS )Nr   r   r)   )	r~   	get_angleDIRECTION_KEYWORDSgetrc   mapr{   mathpi)	arguments	first_argr)   rq   rA   rA   rB    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}|r-|r-||fS tt| \}}|r@|dv r@|t| fS |rL|dv rLt| |fS |dv r\|dv r\t| t| fS |dv rl|dv rnt| t| fS dS dS )	z:Common syntax of background-position and transform-origin.r   r   r   NT
percentage)r$   r&   r'   )r%   r&   r(   )r~   rC   
get_lengthr   r{   BACKGROUND_POSITION_PERCENTAGES)rH   token_1token_2length_1length_2	keyword_1	keyword_2rA   rA   rB   parse_2d_position
  s4   r   c                 C   s  t | }|dur|\}}d|d|fS t| dkrTt| d }t| d }t| d dd	}t| d
 dd	}|rT|rT|dv rF|dv rF||||fS |dv rT|dv rT||||fS t| d
krt| d dd	}|durst| d }	t| d }
nt| d dd	}t| d }
t| d }	|dur|
dkr|	dv rdt|	|fS |	dv r|	|dtfS dS |	dv r|
dv r|	||
tfS |	dv r|
dv r|
t|	|fS dS dS d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   r~   r{   r   FIFTY_PERCENTZERO_PERCENT)rH   rq   pos_xpos_yr   r   r   r   r:   r   other_keywordrA   rA   rB   parse_position&  sR   
	r   c           
      C   sN  d }d }d }d }| d d d d }|r|  }t|}|dkr/t|d d d }|d u r.d S nZ|dv r:|d u r:|}nM|dv rG|d u rGd|f}n@|rm|d u rmt|dd}t|d dd}	d ||	fvrmd	||	ff}d
}|   |d u rt|}|d urd	||ff}d}|d u rd S |s||fdv rd S |p|pd
|pd|pdtdtf| dd  fS )Nr   atcircleellipse)zclosest-cornerfarthest-cornerzclosest-sidezfarthest-sider   Tr   explicitr   r   )r   r   r   r   r%   r$   r   )popr{   r   r   r   )
r   shapepositionsize
size_shapestackrU   r   r   r   rA   rA   rB    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 tt | dkrAt| d }t| d ddd}|d urA|d urA||fS t)Nr   r   currentColorblackr   T)negativer   )r~   r   r   r<   )rH   r7   r   rA   rA   rB   parse_color_stop  s   r   c                 C   s   | j dkrdS tt| j}g }d}|rF|d}|j dko"|jdk}|r)|r)dS |r.d}nd}|j dkr?t|}|du r?dS || |s|rJd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.

    rs   NFr   r`   ra   T)	rD   listrl   r   r   r]   parse_functionrb   
lower_name)function_tokencontentr   last_is_commarU   is_commaargument_functionrA   rA   rB   r     s,   




r   c           	      C   s   t | }|d u r
d S |\}}|dkrnt|dv rp|d jdkr!d S |d j}t|dkr1d}d}n0|d jdkr:d S |d j}|tvrEd S t|dkrPt| }n|d j}|dkr_|d j}nd S |d |fv rrd	|||ffS d S d S d S )
Nattr)r   r   r*   r   r3   r   r1   r2   r   zattr())r   r~   rD   r]   ATTR_FALLBACKS)	rU   allowed_typers   rI   rZ   	attr_nametype_or_unitfallbackfallback_typerA   rA   rB   check_attr_function  s4   



r   c           
      C   s   ddl m} t| }|d u rd S |\}}g }|dkr t|dv s*|dkrvt|dv rx|d}|jdkr6d S ||j |dkrR|d}|jd	krLd S ||j |rh||df}	|	d u rbd S ||	 n|d
 | dt|fS d S d S )Nr   )list_style_typecounterr   r   countersr   r*   r   r3   r1   decimal())	validation.propertiesr   r   r~   r   rD   rb   r]   rc   )
rU   r   r   rs   rI   rZ   r   r3   r1   counter_stylerA   rA   rB   check_counter_function  s2   




r   c                 C   sx   t | }|d u r
d S |\}}|dkr4t|dkrdS t|dkr6|d}|jdkr8|jdv r:d|jfS d S d S d S d S )Nr   r   	content()textr   r3   )r   beforeafterfirst-lettermarkerr   )r   r~   r   rD   rE   )rU   rs   rI   rZ   r3   rA   rA   rB   check_content_function  s   

r   c                 C   s   t |}|d u r
d S |\}}|| krIt|dv rK|d}|jdkr$d S |j}|r>|d}|jdks8|jdvr:d S |j}nd}|  d||ffS d S d S )Nr   r   r3   )firststartlastzfirst-exceptr   r   )r   r~   r   rD   r]   rE   )string_or_elementrU   rs   rI   rZ   custom_identr3   rA   rA   rB    check_string_or_element_function   s"   


r   c                 C   s`   t |  }r,|\}}|dkr |r |d}|jdko|jdS |D ]}t|r+ dS q"d S d S )Nvarr   r3   z--T)r   r   rD   r]   
startswithcheck_var_function)rU   rs   rI   rZ   r3   argrA   rA   rB   r     s   
r   c                 C   sr   | j dkr
d| jfS | j dkr5| jdkrt| dS | jdv r"t| S | jdkr+t| S | jdkr7td| S dS dS )zParse a <string> token.r1   rs   r   )r   r   r   N)rD   r]   rI   r   r   r   r   rz   rA   rA   rB   
get_string$  s   








r   TFc                 C   s~   |r| j dkr|s| jdkrt| jdS | j dkr,| jtv r,|s%| jdkr,t| j| jS | j dkr;| jdkr=tddS dS dS )zParse a <length> token.r   r   r!   	dimensionr6   N)rD   r]   r   rF   LENGTH_UNITS)rU   r   r   rA   rA   rB   r   3  s   
r   c                 C   0   | j dkrt| j}|dur| j| S dS dS )z"Parse an <angle> token in radians.r   N)rD   ANGLE_TO_RADIANSr   rF   r]   rU   factorrA   rA   rB   r   ?     

r   c                 C   r   )z#Parse a <resolution> token in ddpx.r   N)rD   RESOLUTION_TO_DPPXr   rF   r]   r   rA   rA   rB   get_resolutionG  r   r   c                 C   s  ddl m}m} t| |}|r'|d dksJ |d d dkr'd|d d fS | jdkr.dS tt| j}| j}|d	v rUt	|\}}|rSd
|dd |D |d|v fS dS |dv rt
|}	|	durh|	\}
}}}nd}
d}dtdtf}|}|rd|dd |D |
||d|v fS dS dS )zParse an <image> token.r   )LinearGradientRadialGradientr   r8   r   r5   rs   N)linear-gradientzrepeating-linear-gradientr   c                 S      g | ]}t |qS rA   r   rT   stoprA   rA   rB   
<listcomp>`      zget_image.<locals>.<listcomp>	repeating)radial-gradientzrepeating-radial-gradientr   r   r%   r$   r   c                 S   r   rA   r   r   rA   rA   rB   r   m  r   )imagesr   r   get_urlrD   rf   rl   r   r   r   r   r   )rU   rm   r   r   
parsed_urlr   rI   	directioncolor_stopsrq   r   r   r   rA   rA   rB   	get_imageO  sB   

	r   c                 C   s4   |  drddt| dd  ffS ddt|| ffS )N#r8   internalr   r5   )r   r   rn   )r1   rm   rA   rA   rB   _get_url_tupleq  s   
r   c                 C   sj   | j dkrt| j|S | j dkr/| jdkrt| dS | jdkr1t| jdv r3t| jd j|S dS dS dS )zParse an <url> token.r8   rs   r   r   r   N)rD   r   r]   rI   r   r~   r   )rU   rm   rA   rA   rB   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)r{   )rU   r   rA   rA   rB   	get_quote  s   r   c                 C   s  t | }|du r
dS |\}}t|}|sdS |dkr#t|dvr"dS n|dkr0t|dvr/dS n|dkr=t|dvr<dS ndS g }|d}t|}|du r_t||}|du rYdS || n|| |dr|smdS |d}	|	jd	krydS ||	j	 |dkrt|d}
|
du rdS ||
 |rt
|d}nd
}|| n|rt
|d}|dvrdS nd}|| | dt|fS )zParse a <target> token.Nztarget-counterr   ztarget-counters)r*   r   ztarget-textr   r   r3   r   )r   r   r   r   r   r   )r   ri   r~   r   r   r   rb   r   rD   r]   r{   rc   )rU   rm   rs   rI   rZ   valueslinkstring_linkr8   r3   r1   r   r   rA   rA   rB   
get_target  sj   







r  c                    s"    fdd| D }d|vr|S dS )zParse <content-list> tokens.c                    s   g | ]}t | qS rA   )get_content_list_tokenrS   rm   rA   rB   r     s    
z$get_content_list.<locals>.<listcomp>NrA   )rH   rm   parsed_tokensrA   r  rB   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r)d|fS t| |}|dur4|S t| }|du r>dS |\}}|dkr~t|dkrNdS |\}	|	jdkrp|	jdkr^d	}n|	jd
krfd}n|	jdkrnd}n
dS |	jdkrx|	j}dd|ffS |dkrt	d| S dS )z'Parse one of the <content-list> tokens.Ncontentsr   quoteleaderr   r3   dotted.solid_spacerP   r1   zleader()element)
r   r{   r   r   r  r   r~   rD   r]   r   )
rU   rm   r1   r8   r  targetrs   rI   rZ   r   rA   rA   rB   r    sH   







r  rQ   )TF)Cr@   ru   r   abcr   r   urllib.parser   r   tinycss2.color3r   r2   r   urlsr	   r
   
propertiesr   r   r   LENGTHS_TO_PIXELSr   setr   r   r   HUNDRED_PERCENTr   r   r   rF   
ValueErrorr<   rC   rG   rf   ri   rl   rn   rx   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  rA   rA   rA   rB   <module>   s    





#


1+
 
 
"	B	