o
    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< 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lhrlh%2   d   )topleftcenterbottomright)angler   r+      )cornertop_left)r-   	top_right)r-   bottom_left)r-   bottom_right))tor&   )r2   r*   )r2   r)   )r2   r'   )r2   r&   r'   )r2   r'   r&   )r2   r&   r*   )r2   r*   r&   )r2   r)   r'   )r2   r'   r)   )r2   r)   r*   )r2   r*   r)   )string )identcurrentcolor)externalzabout:invalid)numberr   )r3   colorurlintegerr8   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__ rC   rC   V/var/www/html/optinet_system/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 )CenterKeywordFakeTokenr5   r(   N)r?   r@   rA   typelower_valueunitrC   rC   rC   rD   rE   ^   s    rE   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)selfrJ   rK   rC   rC   rD   __init__g   s   
zPending.__init__c                 C   s   t )z#Get validated value for wanted key.)NotImplementedError)rM   rJ   
wanted_keyrC   rC   rD   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tokenrC   rC   rD   	<genexpr>~   s    z Pending.solve.<locals>.<genexpr>zinvalid valuezIgnored `%s: %s` at %d:%d, %s.TN)r>   rQ   rL   rJ   source_linesource_columnjoinargsr   warningrK   )rM   rJ   rP   excrY   rZ   valuemessagerC   rC   rD   solveq   s&   zPending.solveN)r?   r@   rA   rB   rN   r   rQ   ra   rC   rC   rC   rD   rI   d   s    
rI   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,)rF   r_   appendtuple)rJ   parts	this_partrW   rC   rC   rD   split_on_comma   s   

rh   c                 C   s4   g }t | D ]}|s dS |D ]}|| qq|S )zDSplit a list of tokens on optional commas, ie ``LiteralToken(',')``.N)rh   rd   )rJ   rf   
split_partpartrC   rC   rD   split_on_optional_comma   s   rk   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)rF   rU   rC   rC   rD   rX      s    
z$remove_whitespace.<locals>.<genexpr>)re   )rJ   rC   rC   rD   remove_whitespace   s   rn   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_urlr:   rC   rC   rD   safe_urljoin   s   rp   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 rS   )rh   rn   rd   re   )rJ   r\   resultsrj   resultfunctionrC   rD   wrapper   s   z%comma_separated_list.<locals>.wrapper)	functoolswrapssingle_value)ru   rv   rC   rt   rD   comma_separated_list   s   rz   c                 C      | j dkr| jS dS )z[If ``token`` is a keyword, return its lowercase name.

    Otherwise return ``None``.

    r5   N)rF   rG   rW   rC   rC   rD   get_keyword      
r}   c                 C   r{   )zQIf ``token`` is a keyword, return its name.

    Otherwise return ``None``.

    r5   N)rF   r_   r|   rC   rC   rD   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   r5   N)lenrF   rG   )rJ   rW   rC   rC   rD   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   )rJ   keywordrt   rC   rD   keyword_validator   s   z)single_keyword.<locals>.keyword_validator)rw   rx   )ru   r   rC   rt   rD   single_keyword   s   r   c                    rq   )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   )rJ   r\   rt   rC   rD   single_token_validator   s   z,single_token.<locals>.single_token_validator)rw   rx   __func__)ru   r   rC   rt   rD   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getre   mapr}   mathpi)	arguments	first_argr+   rs   rC   rC   rD    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   rE   
get_lengthr   r}   BACKGROUND_POSITION_PERCENTAGES)rJ   token_1token_2length_1length_2	keyword_1	keyword_2rC   rC   rD   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)rJ   rs   pos_xpos_yr   r   r   r   r<   r   other_keywordrC   rC   rD   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stackrW   r   r   r   rC   rC   rD    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   r6   blackr   T)negativer   )r   r   r   r>   )rJ   r9   r   rC   rC   rD   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.

    ru   NFr   rb   rc   T)	rF   listrn   r   r   r_   parse_functionrd   
lower_name)function_tokencontentr   last_is_commarW   is_commaargument_functionrC   rC   rD   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   r5   r   r3   r4   r   zattr())r   r   rF   r_   ATTR_FALLBACKS)	rW   allowed_typeru   rK   r\   	attr_nametype_or_unitfallbackfallback_typerC   rC   rD   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   r5   r3   decimal())	validation.propertiesr   r   r   r   rF   rd   r_   re   )
rW   r   r   ru   rK   r\   r   r5   r3   counter_stylerC   rC   rD   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   r5   )r   beforeafterfirst-lettermarkerr   )r   r   r   rF   rG   )rW   ru   rK   r\   r5   rC   rC   rD   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   r5   )firststartlastzfirst-exceptr   r   )r   r   r   rF   r_   rG   )string_or_elementrW   ru   rK   r\   custom_identr5   rC   rC   rD    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   r5   z--T)r   r   rF   r_   
startswithcheck_var_function)rW   ru   rK   r\   r5   argrC   rC   rD   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.r3   ru   r   )r   r   r   N)rF   r_   rK   r   r   r   r   r|   rC   rC   rD   
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#   	dimensionr8   N)rF   r_   r   rH   LENGTH_UNITS)rW   r   r   rC   rC   rD   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)rF   ANGLE_TO_RADIANSr   rH   r_   rW   factorrC   rC   rD   r   ?     

r   c                 C   r   )z#Parse a <resolution> token in ddpx.r   N)rF   RESOLUTION_TO_DPPXr   rH   r_   r   rC   rC   rD   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   r:   r   r7   ru   N)linear-gradientzrepeating-linear-gradientr   c                 S      g | ]}t |qS rC   r   rV   stoprC   rC   rD   
<listcomp>`      zget_image.<locals>.<listcomp>	repeating)radial-gradientzrepeating-radial-gradientr   r   r'   r&   r   c                 S   r   rC   r   r   rC   rC   rD   r   m  r   )imagesr   r   get_urlrF   rh   rn   r   r   r   r   r   )rW   ro   r   r   
parsed_urlr   rK   	directioncolor_stopsrs   r   r   r   rC   rC   rD   	get_imageO  sB   

	r   c                 C   s4   |  drddt| dd  ffS ddt|| ffS )N#r:   internalr   r7   )r   r   rp   )r3   ro   rC   rC   rD   _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.r:   ru   r   r   r   N)rF   r   r_   rK   r   r   r   )rW   ro   rC   rC   rD   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}   )rW   r   rC   rC   rD   	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   r5   r   )r   r   r   r   r   r   )r   rk   r   r   r   r   rd   r   rF   r_   r}   re   )rW   ro   ru   rK   r\   valueslinkstring_linkr:   r5   r3   r   r   rC   rC   rD   
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 rC   )get_content_list_tokenrU   ro   rC   rD   r     s    
z$get_content_list.<locals>.<listcomp>NrC   )rJ   ro   parsed_tokensrC   r  rD   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   r5   dotted.solid_spacerR   r3   zleader()element)
r   r}   r   r   r  r   r   rF   r_   r   )
rW   ro   r3   r:   r	  targetru   rK   r\   r   rC   rC   rD   r    sH   







r  rS   )TF)CrB   rw   r   abcr   r   urllib.parser   r   tinycss2.color4r   r4   r   urlsr	   r
   
propertiesr   r   r   LENGTHS_TO_PIXELSr   setr   r   r   HUNDRED_PERCENTr   r   r   rH   
ValueErrorr>   rE   rI   rh   rk   rn   rp   rz   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  rC   rC   rC   rD   <module>   s    





#


1+
 
 
"	B	