
    T-hb                     P   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$                  z  ej$                  dz  ej$                  dz  dZd	dddddddZd	d	ed   z  d	ed   z  dZ ee       eg d      z  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z  fdej$                  fdej$                  dz  dz  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<    eD ]  Zd ed+e      fee<     G d, d-e      Z  G d. d/      Z! G d0 d1e      Z"d2 Z#d3 Z$d4 Z%d5 Z&d6 Z'd7 Z(d8 Z)d9 Z*d: Z+d; Z,d< Z-d= Z.d> Z/d? Z0d@ Z1dA Z2dRdBZ3dRdCZ4dD Z5dE Z6dF Z7dG Z8dSdHZ9dI Z:dJ Z;dK Z<dL Z=dM Z>dN Z?dO Z@dP ZAdQ ZBy)Tz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%   )r1   r)   )r1   r(   )r1   r&   )r1   r%   r&   )r1   r&   r%   )r1   r%   r)   )r1   r)   r%   )r1   r(   r&   )r1   r&   r(   )r1   r(   r)   )r1   r)   r(   )string )identcurrentcolor)externalzabout:invalid)numberr   )r2   colorurlintegerr7   r"   length0c                       e Zd ZdZy)InvalidValuesz7Invalid or unsupported values for a known CSS property.N)__name__
__module____qualname____doc__     Z/var/www/core.comfia.cic-ware.com/crm/lib/python3.12/site-packages/weasyprint/css/utils.pyr>   r>   Z   s    ArD   r>   c                       e Zd ZdZdZdZy)CenterKeywordFakeTokenr4   r'   N)r?   r@   rA   typelower_valueunitrC   rD   rE   rG   rG   ^   s    DKDrD   rG   c                   ,    e Zd ZdZd Zed        Zd Zy)PendingzCAbstract class representing property value with pending validation.c                 .    || _         || _        d| _        y )NF)tokensname_reported_error)selfrN   rO   s      rE   __init__zPending.__init__g   s    	$rD   c                     t         )z#Get validated value for wanted key.)NotImplementedError)rQ   rN   
wanted_keys      rE   validatezPending.validatel   s
     "!rD   c           	         	 |st        d      | j                  ||      S # t         $ r}| j                  r|| j                  d   j                  }| j                  d   j
                  }dj                  d |D              }|j                  xr |j                  d   xs d}t        j                  d| j                  ||||       d| _        |d}~ww xY w)	z#Get validated value or raise error.zno valuer    c              3   <   K   | ]  }|j                           y wN)	serialize.0tokens     rE   	<genexpr>z Pending.solve.<locals>.<genexpr>~   s     C5U__.C   zinvalid valuezIgnored `%s: %s` at %d:%d, %s.TN)r>   rV   rP   rN   source_linesource_columnjoinargsr	   warningrO   )rQ   rN   rU   excra   rb   valuemessages           rE   solvezPending.solveq   s    	 $J//==44 	##	++a.44K KKN88MHHCFCCExx/CHHQKCOGNN0		5+}gG $(D I	s   ! 	CB&CCN)r?   r@   rA   rB   rR   r   rV   ri   rC   rD   rE   rL   rL   d   s#    M%
 " "rD   rL   c                     g }g }| D ]E  }|j                   dk(  r#|j                  dk(  r|j                  |       g }5|j                  |       G |j                  |       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,)rH   rg   appendtuple)rN   parts	this_partr^   s       rE   split_on_commarq      sk     EI $::"u{{c'9LL#IU#$ 
LL<rD   c                 b    g }t        |       D ]  }|s y|D ]  }|j                  |          |S )zDSplit a list of tokens on optional commas, ie ``LiteralToken(',')``.N)rq   rm   )rN   ro   
split_partparts       rE   split_on_optional_commaru      sE    E$V, 
  	DLL	 LrD   c                 &    t        d | D              S )z=Remove any top-level whitespace and comments in a token list.c              3   <   K   | ]  }|j                   d vr|  yw))
whitespacecommentN)rH   r\   s     rE   r_   z$remove_whitespace.<locals>.<genexpr>   s%      8::66 	8r`   )rn   )rN   s    rE   remove_whitespacerz      s     8!8 8 8rD   c                 x    t        |      rt        |      S | rt        t        | |            S t        d|      )Nz+Relative URI reference without a base URI: )r   r
   r   r>   )base_urlr9   s     rE   safe_urljoinr}      sB    s#	'(C0119#AC 	CrD   c                 P     t        j                          fd       } |_        |S )z<Decorator for validators that accept a comma separated list.c                     g }t        |       D ])  } t        |      g| }| y |j                  |       + t        |      S rZ   )rq   rz   rm   rn   )rN   rd   resultsrt   resultfunctions        rE   wrapperz%comma_separated_list.<locals>.wrapper   sQ    "6* 	#D/5==F~NN6"		#
 W~rD   )	functoolswrapssingle_value)r   r   s   ` rE   comma_separated_listr      s-    __X  $GNrD   c                 :    | j                   dk(  r| j                  S y)z[If ``token`` is a keyword, return its lowercase name.

    Otherwise return ``None``.

    r4   N)rH   rI   r^   s    rE   get_keywordr      s!     zzW    rD   c                 :    | j                   dk(  r| j                  S y)zQIf ``token`` is a keyword, return its name.

    Otherwise return ``None``.

    r4   N)rH   rg   r   s    rE   get_custom_identr      s     zzW{{ rD   c                 b    t        |       dk(  r!| d   }|j                  dk(  r|j                  S yy)zeIf ``values`` is a 1-element list of keywords, return its name.

    Otherwise return ``None``.

    r   r   r4   N)lenrH   rI   )rN   r^   s     rE   get_single_keywordr      s;     6{aq	:: $$$ ! rD   c                 B     t        j                          fd       }|S )z;Decorator for validators that only accept a single keyword.c                 0    t        |       } |      r|S y)z6Wrap a validator to call get_single_keyword on tokens.N)r   )rN   keywordr   s     rE   keyword_validatorz)single_keyword.<locals>.keyword_validator   s!     %V,GN rD   )r   r   )r   r   s   ` rE   single_keywordr      s&    __X 
 rD   c                 P     t        j                          fd       } |_        |S )z9Decorator for validators that only accept a single token.c                 :    t        |       dk(  r | d   g| S y)z*Validate a property whose token is single.r   r   N)r   )rN   rd   r   s     rE   single_token_validatorz,single_token.<locals>.single_token_validator   s*     v;!F1I--- rD   )r   r   __func__)r   r   s   ` rE   single_tokenr      s/    __X. . '/#!!rD   c                     | d   }t        |      dk(  rt        |d         }|>d|f| dd  fS t        j                  t	        t        t        |                  }||| dd  fS dt        j                  f| fS )Nr   r   r*   )	r   	get_angleDIRECTION_KEYWORDSgetrn   mapr   mathpi)	arguments	first_argr*   r   s       rE    parse_linear_gradient_parametersr      s    !I
9~)A,'U#Yqr]22#''c+y.I(JK9QR=((TWWy((rD   c                 x   t        |       dk(  r| d   t        g} nt        |       dk7  ry| \  }}t        |d      }t        |d      }|r|r||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 yy)	z:Common syntax of background-position and transform-origin.r   r   r   NT
percentage)r%   r'   r(   )r&   r'   r)   )r   rG   
get_lengthr   r   BACKGROUND_POSITION_PERCENTAGES)rN   token_1token_2length_1length_2	keyword_1	keyword_2s          rE   parse_2d_positionr   
  s   
6{a)34	V	GW'd3H'd3HH!!{F3IyI!<<8CCC	i#>>.y98CC
2
2
2
2/	:/	:< 	<
2
2
2
2/	:/	:< 	< 3 3rD   c                 p   t        |       }||\  }}d|d|fS t        |       dk(  r\t        | d         }t        | d         }t        | d   d	      }t        | 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	      }|t        | d         }	t        | d         }
n,t        | d   d	      }t        | d         }
t        | d         }	|H|
dk(  r|	dv r
dt        |	|fS |	dv r
|	|dt        fS y|	dv r|
dv r
|	||
t
        fS |	dv r|
dv r
|
t
        |	|fS yyyy)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)rN   r   pos_xpos_yr   r   r   r   r;   r   other_keywords              rE   parse_positionr   &  s    v&FuueU**
6{aq	*	q	*	fQiD9fQiD9..!22 (Ix??..!22 (Ix??
6{aF1I$7!&),G'q	2Mq	d;F'q	2M!&),G(//!='6AA//"FE=@@ 0..!%66|CC..!%66$lGVCC 7 /  rD   c                    d }d }d }d }| d   d d d   }|r|j                         }t        |      }|dk(  rt        |d d d         }|y np|dv r||}nd|dv r|d|f}nY|r=|;t        |d      }t        |d   d      }	d ||	fvrd	||	ff}d
}|j                          |t        |      }|d	||ff}d}|y |r||fdv ry |xs |xs d
|xs d|xs d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stackr^   r   r   r   s
             rE    parse_radial_gradient_parametersr   W  sc   EHDJaL2E
		e$d?%eDbDk2H--%-E : :>Blg%D%e=%eBiDA(33%(';;D!*JIIK|%e,'%(';;D!)J|7 8 	zLL((y..AV]E=A!"	 rD   c                     t        |       dk(  r,t        | d         }|dk(  rt        d      d fS ||d fS t        t        |       dk(  r't        | d         }t        | d   dd      }||||fS t        )Nr   r   r5   blackr   T)negativer   )r   r   r   r>   )rN   r8   r   s      rE   parse_color_stopr     s    
6{aF1I&N"w'--$;  
V	F1I&fQi$4H!5(?"
rD   c                 h   | j                   dk7  ryt        t        | j                              }g }d}|rn|j	                  d      }|j                   dk(  xr |j
                  dk(  }|r|ry|rd}n0d}|j                   dk(  rt        |      }|y|j                  |       |rn|ry| 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.

    r   NFr   rk   rl   T)	rH   listrz   r   r   rg   parse_functionrm   
lower_name)function_tokencontentr   last_is_commar^   is_commaargument_functions          rE   r   r     s     j($^%=%=>?GIM
A::*Au{{c/AX M!MzzZ'$25$9!$,U#  $$i//rD   c                    t        |       }|y |\  }}|dk(  rt        |      dv r|d   j                  dk7  ry |d   j                  }t        |      dk(  rd}d}nh|d   j                  dk7  ry |d   j                  }|t        vry t        |      dk(  r
t        |   }n%|d   j                  }|dk(  r|d   j                  }ny |d |fv rd	|||ffS y y y )
Nattr)r   r   r+   r   r4   r   r2   r3   r   zattr())r   r   rH   rg   ATTR_FALLBACKS)	r^   allowed_typer   rO   rd   	attr_nametype_or_unitfallbackfallback_types	            rE   check_attr_functionr     s    e$HJD$v~#d)y07<<7"GMM	t9>#LHAw||w&7==L>14yA~),7 $Q H,#Aw}}H D,//y,ABB 0- 1~rD   c                    ddl m} t        |       }|y |\  }}g }|dk(  rt        |      dv s|dk(  rt        |      dv r|j	                  d      }|j
                  dk7  ry |j                  |j                         |dk(  r<|j	                  d      }|j
                  d	k7  ry |j                  |j                         |r- ||j	                  d      f      }	|	y |j                  |	       n|j                  d
       | dt        |      fS y y )Nr   )list_style_typecounterr   r   countersr   r+   r   r4   r2   decimal())	validation.propertiesr   r   r   r   rH   rm   rg   rn   )
r^   r   r   r   rO   rd   r   r4   r2   counter_styles
             rE   check_counter_functionr     s
   6e$HJD$I	c$i61J3t9#6:: %:XXa[F{{h&V\\*+TXXa[N;M$]+Y'&U9-..) $7rD   c                     t        |       }|y |\  }}|dk(  r\t        |      dk(  ryt        |      dk(  r>|j                  d      }|j                  dk(  r|j                  dv rd|j                  fS y y y y )Nr   r   	content()textr   r4   )r   beforeafterfirst-lettermarkerr   )r   r   r   rH   rI   )r^   r   rO   rd   r4   s        rE   check_content_functionr     s    e$HJD$yt9>(Y!^HHQKEzzW$):): ?I *I#U%6%677*I$  rD   c                 <   t        |      }|y |\  }}|| k(  rt        |      dv rv|j                  d      }|j                  dk7  ry |j                  }|r<|j                  d      }|j                  dk7  s|j
                  dvry |j
                  }nd}|  d||ffS y y )Nr   r   r4   )firststartlastzfirst-exceptr   r   )r   r   r   rH   rg   rI   )string_or_elementr^   r   rO   rd   custom_identr4   s          rE    check_string_or_element_functionr      s    e$HJD$  SY&%8xx{'#))HHQKEzzW$(9(9 B> )>%%EE$%R(<*?@@ &9 rD   c                     t        |       x}r^|\  }}|dk(  r?|r=|j                  d      }|j                  dk(  xr |j                  j	                  d      S |D ]  }t        |      s y y y )Nvarr   r4   z--T)r   r   rH   rg   
startswithcheck_var_function)r^   r   rO   rd   r4   args         rE   r   r     su    !%((x(
d5=THHQKE ::(IU[[-C-CD-II 	C!#&	 )rD   c                 0   | j                   dk(  rd| j                  fS | j                   dk(  rj| j                  dk(  rt        | d      S | j                  dv rt	        |       S | j                  dk(  rt        |       S | j                  dk(  rt        d|       S yy)zParse a <string> token.r2   r   r   )r   r   r   N)rH   rg   rO   r   r   r   r   r   s    rE   
get_stringr   $  s    zzX%++&&zzZ::&uh77ZZ22)%00ZZ9$)%00ZZ8#3HeDD $  rD   c                 n   |r6| j                   dk(  r'|s| j                  dk\  rt        | j                  d      S | j                   dk(  rC| j                  t        v r1|s| j                  dk\  r t        | j                  | j                        S | j                   dk(  r| j                  dk(  rt        dd      S yy)zParse a <length> token.r   r   r"   	dimensionr7   N)rH   rg   r   rJ   LENGTH_UNITS)r^   r   r   s      rE   r   r   3  s    ejjL0u{{a'U[[#..zz[ UZZ<%?u{{a'U[[%**55zzX%++"2D!! #3rD   c                     | j                   dk(  r1t        j                  | j                        }|| j                  |z  S yy)z"Parse an <angle> token in radians.r  N)rH   ANGLE_TO_RADIANSr   rJ   rg   r^   factors     rE   r   r   ?  sA    zz[ !%%ejj1;;''  !rD   c                     | j                   dk(  r1t        j                  | j                        }|| j                  |z  S yy)z#Parse a <resolution> token in ddpx.r  N)rH   RESOLUTION_TO_DPPXr   rJ   rg   r  s     rE   get_resolutionr	  G  sA    zz[ #''

3;;''  !rD   c           	         ddl m}m} t        | |      }|r|d   dk(  sJ |d   d   dk(  r
d|d   d   fS | j                  dk7  ryt        t        | j                              }| j                  }|d	v r6t        |      \  }}|r%d
 ||D 	cg c]  }	t        |	       c}	|d|v       fS y|dv rSt        |      }
|
|
\  }}}}nd}d}dt        dt        f}|}|r'd ||D 	cg c]  }	t        |	       c}	|||d|v       fS yyc c}	w c c}	w )zParse an <image> token.r   )LinearGradientRadialGradientr   r9   r   r6   r   N)linear-gradientzrepeating-linear-gradientr  	repeating)radial-gradientzrepeating-radial-gradientr   r   r&   r%   r  )imagesr  r  get_urlrH   rq   rz   r   r   r   r   r   r   )r^   r|   r  r  
parsed_urlr   rO   	directioncolor_stopsstopr   r   r   r   s                 rE   	get_imager  O  sa   7)J!}%%%a=z)*Q-***zzZ0ABID??!A)!L	;$n4?@D!$'@;$.'0 0 0  
A	A1)<17.E4;E/D}e]BH#K$n4?@D!$'@tX{d':'< < <  
B A As   D
 D
c                 h    | j                  d      rddt        | dd        ffS ddt        ||       ffS )N#r9   internalr   r6   )r   r   r}   )r2   r|   s     rE   _get_url_tupler  q  sB    
GF12J$7899
L6$BCDDrD   c                 8   | j                   dk(  rt        | j                  |      S | j                   dk(  rf| j                  dk(  rt	        | d      S | j                  dk(  r;t        | j                        dv r#t        | j                  d   j                  |      S yyy)zParse an <url> token.r9   r   r   r   r   N)rH   r  rg   rO   r   r   r   )r^   r|   s     rE   r  r  x  s    zzUekk844	z	!::&ue44ZZ5 S%9V%C "%//!"4":":HEE &D  
"rD   c                 &    t        |       }|dv r|S y)zParse a <quote> token.)z
open-quotezclose-quotezno-open-quotezno-close-quoteN)r   )r^   r   s     rE   	get_quoter    s%    % G / / /rD   c                 L   t        |       }|y|\  }}t        |      }|sy|dk(  rt        |      dvr(y|dk(  rt        |      dvry|dk(  rt        |      dvryyg }|j                  d      }t	        |      }|!t        ||      }|y|j                  |       n|j                  |       |j                  d      r|sy|j                  d      }	|	j                  d	k7  ry|j                  |	j                         |dk(  r.t	        |j                  d            }
|
y|j                  |
       |rt        |j                  d            }nd
}|j                  |       n4|rt        |j                  d            }|dvryd}|j                  |       | dt        |      fS )zParse a <target> token.Nztarget-counterr   ztarget-counters)r+   r   ztarget-textr   r   r4   r   )r   r   r   r   r   r   )r   ru   r   r   r   r  rm   r   rH   rg   r   rn   )r^   r|   r   rO   rd   valueslinkstring_linkr9   r4   r2   r   r   s                rE   
get_targetr"    s   e$HJD$"4(Dt9F"	"	"t9F"		t9F"F88A;DT"KdH%;ck"'(:: ekk"$$,F~MM&!'4M%Mm$!$((1+.GLLGgfBKv''rD   c                 L    | D cg c]  }t        ||       }}d|vr|S yc c}w )zParse <content-list> tokens.N)get_content_list_token)rN   r|   r^   parsed_tokenss       rE   get_content_listr&    sC     >DE49uh/EM E=  !Es   !c                    t        |       }||S t        |       dk(  ryt        | |      }||S t        |       }|d|fS t	        | |      }||S t        |       }|y|\  }}|dk(  rzt        |      dk7  ry|\  }	|	j                  dk(  r7|	j                  dk(  rd	}n@|	j                  d
k(  rd}n.|	j                  dk(  rd}ny|	j                  dk(  r|	j                  }dd|ffS |dk(  rt        d|       S y)z'Parse one of the <content-list> tokens.Ncontentsr   quoteleaderr   r4   dotted.solid_spacerX   r2   zleader()element)
r   r   r  r  r"  r   r   rH   rg   r   )
r^   r|   r2   r9   r)  targetr   rO   rd   r   s
             rE   r$  r$    s7   
 F 5Z'$ %
"C

 eE x(Fe$HJD$ xt9>88wyyH$g%g%XX!YYFXv.// 
	/	5AA 
rD   rZ   )TF)CrB   r   r   abcr   r   urllib.parser   r   tinycss2.color4r   r3   r	   urlsr
   r   
propertiesr   r   r  LENGTHS_TO_PIXELSr  setr  r   r   HUNDRED_PERCENTr   r   r   rJ   
ValueErrorr>   rG   rL   rq   ru   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"  r&  r$  rC   rD   rE   <module>r;     sz      # ) '  . !
 K77S=GGcM	  




	   &&!$''  $%,E(FF C "c"C%#   tww{+(dggkAo.11337799 & &(	  <D$iT&:;N4< ;D#YsD%9:N4;BJ B  c  F&
8C!	%"
)<8.Db(V 0@C>/@8A.
E	"((<DE
F?(D5BrD   