
    Bhb                     ^   S r SSKrSSKrSSKJrJr  SSKJrJr  SSK	J
r
  SSKJr  SSKJrJr  S	S
KJr  S	S\R$                  -  \R$                  S-  \R$                  S-  S.rS	SSSSSSS.rS	S	\S   -  S	\S   -  S.r\" \5      \" / SQ5      -  r\" SS5      r\" SS5      r\" SS5      r\\\\\S.rSS\R$                  S-  4S\R$                  4S\R$                  S-  S-  4S S S!S!S"S"S#S#S$.rS%S&S'S(S(S(S).r\ H  rS*\" S+\5      4\\'   M     \ H  rS\" S+\5      4\\'   M      " S, S-\5      r  " S. S/5      r! " S0 S1\5      r"S2 r#S3 r$S4 r%S5 r&S6 r'S7 r(S8 r)S9 r*S: r+S; r,S< r-S= r.S> r/S? r0S@ r1SA r2SRSB jr3SRSC jr4SD r5SE r6SF r7SG r8SSSH jr9SI r:SJ r;SK r<SL r=SM r>SN r?SO r@SP rASQ rBg)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                       \ rS rSrSrSrg)InvalidValuesZ   z7Invalid or unsupported values for a known CSS property. N)__name__
__module____qualname____firstlineno____doc____static_attributes__r@       F/var/www/html/env/lib/python3.13/site-packages/weasyprint/css/utils.pyr>   r>   Z   s    ArG   r>   c                        \ rS rSrSrSrSrSrg)CenterKeywordFakeToken^   r4   r'   Nr@   )rA   rB   rC   rD   typelower_valueunitrF   r@   rG   rH   rJ   rJ   ^   s    DKDrG   rJ   c                   4    \ rS rSrSrS r\S 5       rS rSr	g)Pendingr$   zCAbstract class representing property value with pending validation.c                 *    Xl         X l        SU l        g )NF)tokensname_reported_error)selfrR   rS   s      rH   __init__Pending.__init__g   s    	$rG   c                     [         e)z#Get validated value for wanted key.)NotImplementedError)rU   rR   
wanted_keys      rH   validatePending.validatel   s
     "!rG   c           	          U(       d  [        S5      eU R                  X5      $ ! [          a  nU R                  (       a  UeU R                  S   R                  nU R                  S   R
                  nSR                  S U 5       5      nUR                  =(       a    UR                  S   =(       d    Sn[        R                  " SU R                  XdXW5        SU l        UeSnAff = f)	z#Get validated value or raise error.zno valuer    c              3   @   #    U  H  oR                  5       v   M     g 7fN)	serialize.0tokens     rH   	<genexpr> Pending.solve.<locals>.<genexpr>~   s     CF5__..Fs   zinvalid valuezIgnored `%s: %s` at %d:%d, %s.TN)r>   r[   rT   rR   source_linesource_columnjoinargsr	   warningrS   )rU   rR   rZ   excrg   rh   valuemessages           rH   solvePending.solveq   s    	 $J//==44 	##	++a.44K KKN88MHHCFCCExx/CHHQKCOGNN0		5}G $(D I	s   "% 
C(B4C##C()rT   rS   rR   N)
rA   rB   rC   rD   rE   rV   r   r[   ro   rF   r@   rG   rH   rP   rP   d   s#    M%
 " "rG   rP   c                     / n/ nU  HI  nUR                   S:X  a%  UR                  S:X  a  UR                  U5        / nM8  UR                  U5        MK     UR                  U5        [        U5      $ )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,)rL   rm   appendtuple)rR   parts	this_partrd   s       rH   split_on_commarx      sf     EI::"u{{c'9LL#IU#  
LL<rG   c                 t    / n[        U 5       H&  nU(       d    gU H  nUR                  U5        M     M(     U$ )zDSplit a list of tokens on optional commas, ie ``LiteralToken(',')``.N)rx   rt   )rR   rv   
split_partparts       rH   split_on_optional_commar|      s;    E$V,
 DLL  - LrG   c                 &    [        S U  5       5      $ )z=Remove any top-level whitespace and comments in a token list.c              3   J   #    U  H  nUR                   S ;  d  M  Uv   M     g7f))
whitespacecommentN)rL   rb   s     rH   re   $remove_whitespace.<locals>.<genexpr>   s%      8!%::66 	6s   #	#)ru   )rR   s    rH   remove_whitespacer      s     8!8 8 8rG   c                     [        U5      (       a  [        U5      $ U (       a  [        [        X5      5      $ [        SU< 35      e)Nz+Relative URI reference without a base URI: )r   r
   r   r>   )base_urlr9   s     rH   safe_urljoinr      sC    s#	'(0119#AC 	CrG   c                 T   ^  [         R                  " T 5      U 4S j5       nT Ul        U$ )z<Decorator for validators that accept a comma separated list.c                    > / n[        U 5       H+  nT" [        U5      /UQ76 nUc    g UR                  U5        M-     [        U5      $ r`   )rx   r   rt   ru   )rR   rj   resultsr{   resultfunctions        rH   wrapper%comma_separated_list.<locals>.wrapper   sL    "6*D/5==F~NN6"	 +
 W~rG   )	functoolswrapssingle_value)r   r   s   ` rH   comma_separated_listr      s-    __X  $GNrG   c                 <    U R                   S:X  a  U R                  $ g)zSIf ``token`` is a keyword, return its lowercase name.

Otherwise return ``None``.

r4   N)rL   rM   rd   s    rH   get_keywordr      s!     zzW    rG   c                 <    U R                   S:X  a  U R                  $ g)zIIf ``token`` is a keyword, return its name.

Otherwise return ``None``.

r4   N)rL   rm   r   s    rH   get_custom_identr      s     zzW{{ rG   c                 f    [        U 5      S:X  a"  U S   nUR                  S:X  a  UR                  $ gg)z]If ``values`` is a 1-element list of keywords, return its name.

Otherwise return ``None``.

r   r   r4   N)lenrL   rM   )rR   rd   s     rH   get_single_keywordr      s;     6{aq	:: $$$ ! rG   c                 F   ^  [         R                  " T 5      U 4S j5       nU$ )z;Decorator for validators that only accept a single keyword.c                 :   > [        U 5      nT" U5      (       a  U$ g)z6Wrap a validator to call get_single_keyword on tokens.N)r   )rR   keywordr   s     rH   keyword_validator)single_keyword.<locals>.keyword_validator   s$     %V,GN rG   )r   r   )r   r   s   ` rH   single_keywordr      s&    __X 
 rG   c                 T   ^  [         R                  " T 5      U 4S j5       nT Ul        U$ )z9Decorator for validators that only accept a single token.c                 <   > [        U 5      S:X  a  T" U S   /UQ76 $ g)z*Validate a property whose token is single.r   r   N)r   )rR   rj   r   s     rH   single_token_validator,single_token.<locals>.single_token_validator   s*     v;!F1I--- rG   )r   r   __func__)r   r   s   ` rH   single_tokenr      s/    __X. . '/#!!rG   c                     U S   n[        U5      S:X  a  [        US   5      nUb	  SU4U SS  4$ O5[        R                  [	        [        [        U5      5      5      nUb  X0SS  4$ S[        R                  4U 4$ )Nr   r   r*   )	r   	get_angleDIRECTION_KEYWORDSgetru   mapr   mathpi)	arguments	first_argr*   r   s       rH    parse_linear_gradient_parametersr      s    !I
9~)A,'U#Yqr]22  $''c+y.I(JKQR=((TWWy((rG   c                    [        U 5      S:X  a  U S   [        /n O[        U 5      S:w  a  gU u  p[        USS9n[        USS9nU(       a
  U(       a  X44$ [        [        U 5      u  pVU(       a  US;   a  U[
        U   4$ U(       a  US;   a  [
        U   U4$ US;   a  US;   a  [
        U   [
        U   4$ US;   a  US;   a  [
        U   [
        U   4$ gg)	z:Common syntax of background-position and transform-origin.r   r   r   NT
percentage)r%   r'   r(   )r&   r'   r)   )r   rJ   
get_lengthr   r   BACKGROUND_POSITION_PERCENTAGES)rR   token_1token_2length_1length_2	keyword_1	keyword_2s          rH   parse_2d_positionr   
  s   
6{a)34	V	G'd3H'd3HH!!{F3II!<<8CCC	i#>>.y98CC
2
2
2
2/	:/	:< 	<
2
2
2
2/	:/	:< 	< 3 3rG   c                    [        U 5      nUb
  Uu  p#SUSU4$ [        U 5      S:X  ad  [        U S   5      n[        U S   5      n[        U S   SS	9n[        U S
   SS	9nU(       a'  U(       a   US;   a
  US;   a  XFXW4$ US;   a
  US;   a  XWXF4$ [        U 5      S
:X  a  [        U S   SS	9nUb  [        U S   5      n	[        U S   5      n
O)[        U S   SS	9n[        U S   5      n
[        U S   5      n	UbQ  U
S:X  a  U	S;   a	  S[        X4$ U	S;   a	  XS[        4$ gU	S;   a  U
S;   a	  XU
[
        4$ U	S;   a  U
S;   a	  U
[
        X4$ gggg)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)rR   r   pos_xpos_yr   r   r   r   r;   r   other_keywords              rH   parse_positionr   &  s    v&FueU**
6{aq	*	q	*	fQiD9fQiD9..!22 I??..!22 I??
6{aF1I$7!&),G'q	2Mq	d;F'q	2M!&),G(//!='AA//"E=@@ 0..!%66|CC..!%66$lGCC 7 /  rG   c                 "   S nS nS nS nU S   S S S2   nU(       a  UR                  5       n[        U5      nUS:X  a  [        US S S2   5      nUc  g O~US;   a  Uc  UnOiUS;   a  Uc  SU4nO[U(       a8  Uc5  [        USS9n[        US   SS9n	S X4;  a  S	X44nS
nUR                  5         Uc  [        U5      nUb  S	X44nSnUc  g U(       a  M  X4S;   a  g U=(       d    U=(       d    S
U=(       d    SU=(       d    S[        S[        4U SS  4$ )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stackrd   r   r   r   s
             rH    parse_radial_gradient_parametersr   W  s]   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 	LL((y..AV]E=A!"	 rG   c                     [        U 5      S:X  a/  [        U S   5      nUS:X  a  [        S5      S 4$ Ub  US 4$  [        e[        U 5      S:X  a%  [        U S   5      n[        U S   SSS9nUb  Ub  X4$ [        e)Nr   r   r5   blackr   T)negativer   )r   r   r   r>   )rR   r8   r   s      rH   parse_color_stopr     s    
6{aF1I&N"w'--$;   
V	F1I&fQi$4H!5?"
rG   c                    U R                   S:w  a  g[        [        U R                  5      5      n/ nSnU(       a  UR	                  S5      nUR                   S:H  =(       a    UR
                  S:H  nU(       a  U(       a  gU(       a  SnO2SnUR                   S:X  a  [        U5      nUc  gUR                  U5        U(       a  M  U(       a  gU R                  U4$ )zParse functional notation.

Return ``(name, args)`` if the given token is a function with comma- or
space-separated arguments. Return ``None`` otherwise.

r   NFr   rr   rs   T)	rL   listr   r   r   rm   parse_functionrt   
lower_name)function_tokencontentr   last_is_commard   is_commaargument_functions          rH   r   r     s     j($^%=%=>?GIM
A::*Au{{c/AX M!MzzZ'$25$9!$,U# ' $$i//rG   c                    [        U 5      nUc  g Uu  p4US:X  a  [        U5      S;   a  US   R                  S:w  a  g US   R                  n[        U5      S:X  a  SnSnOmUS   R                  S:w  a  g US   R                  nU[        ;  a  g [        U5      S:X  a
  [        U   nO&US   R                  nUS:X  a  US   R                  nOg US U4;   a  S	XVU44$ g g g )
Nattr)r   r   r+   r   r4   r   r2   r3   r   zattr())r   r   rL   rm   ATTR_FALLBACKS)	rd   allowed_typer   rS   rj   	attr_nametype_or_unitfallbackfallback_types	            rH   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~rG   c                 <   SSK Jn  [        U 5      nUc  g Uu  pE/ nUS:X  a  [        U5      S;   d  US:X  a  [        U5      S;   a  UR	                  S5      nUR
                  S:w  a  g UR                  UR                  5        US:X  a=  UR	                  S5      nUR
                  S	:w  a  g UR                  UR                  5        U(       a.  U" UR	                  S5      45      n	U	c  g UR                  U	5        OUR                  S
5        U S3[        U5      4$ g g )Nr   )list_style_typecounterr   r   countersr   r+   r   r4   r2   decimal())	validation.propertiesr   r   r   r   rL   rt   rm   ru   )
rd   r   r   r   rS   rj   r   r4   r2   counter_styles
             rH   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rG   c                     [        U 5      nUc  g Uu  p#US:X  aa  [        U5      S:X  a  g[        U5      S:X  aA  UR                  S5      nUR                  S:X  a  UR                  S;   a  SUR                  4$ g g g g )Nr   r   	content()textr   r4   )r   beforeafterfirst-lettermarkerr   )r   r   r   rL   rM   )rd   r   rS   rj   r4   s        rH   check_content_functionr     s    e$HJDyt9>(Y!^HHQKEzzW$):): ?I *I#U%6%677*I$  rG   c                 P   [        U5      nUc  g Uu  p4X0:X  a  [        U5      S;   a~  UR                  S5      nUR                  S:w  a  g UR                  nU(       a?  UR                  S5      nUR                  S:w  d  UR
                  S;  a  g UR
                  nOSnU  S3XV44$ g g )Nr   r   r4   )firststartlastzfirst-exceptr   r   )r   r   r   rL   rm   rM   )string_or_elementrd   r   rS   rj   custom_identr4   s          rH    check_string_or_element_functionr     s    e$HJD SY&%8xx{'#))HHQKEzzW$(9(9 B> )>%%EE$%R(<*?@@ &9 rG   c                    [        U 5      =n(       ao  Uu  p#US:X  aI  U(       aB  UR                  S5      nUR                  S:H  =(       a    UR                  R	                  S5      $ U H  n[        U5      (       d  M    g   g g )Nvarr   r4   z--T)r   r   rL   rm   
startswithcheck_var_function)rd   r   rS   rj   r4   args         rH   r  r    sq    !%((x(
5=THHQKE ::(IU[[-C-CD-IIC!#&&  )rG   c                 >   U R                   S:X  a  SU R                  4$ U R                   S:X  ao  U R                  S:X  a  [        U S5      $ U R                  S;   a  [	        U 5      $ U R                  S:X  a  [        U 5      $ U R                  S:X  a  [        SU 5      $ gg)zParse a <string> token.r2   r   r   )r   r   r   N)rL   rm   rS   r   r   r   r  r   s    rH   
get_stringr
  $  s    zzX%++&&zzZ::&uh77ZZ22)%00ZZ9$)%00ZZ8#3HeDD $  rG   c                    U(       a=  U R                   S:X  a-  U(       d  U R                  S:  a  [        U R                  S5      $ U R                   S:X  aK  U R                  [        ;   a7  U(       d  U R                  S:  a   [        U R                  U R                  5      $ U R                   S:X  a  U R                  S:X  a  [        SS5      $ gg)zParse a <length> token.r   r   r"   	dimensionr7   N)rL   rm   r   rN   LENGTH_UNITS)rd   r   r   s      rH   r   r   3  s    ejjL0u{{a'U[[#..zz[ UZZ<%?u{{a'U[[%**55zzX%++"2D!! #3rG   c                     U R                   S:X  a2  [        R                  U R                  5      nUb  U R                  U-  $ gg)z"Parse an <angle> token in radians.r  N)rL   ANGLE_TO_RADIANSr   rN   rm   rd   factors     rH   r   r   ?  sA    zz[ !%%ejj1;;''  !rG   c                     U R                   S:X  a2  [        R                  U R                  5      nUb  U R                  U-  $ gg)z#Parse a <resolution> token in ddpx.r  N)rL   RESOLUTION_TO_DPPXr   rN   rm   r  s     rH   get_resolutionr  G  sA    zz[ #''

3;;''  !rG   c           	      L   SSK JnJn  [        X5      nU(       a!  US   S:X  d   eUS   S   S:X  a
  SUS   S   4$ U R                  S:w  a  g[        [        U R                  5      5      nU R                  nUS	;   a>  [        U5      u  pxU(       a)  S
U" U V	s/ s H  n	[        U	5      PM     sn	USU;   5      4$ gUS;   aZ  [        U5      n
U
b  U
u  ppOSnSnS[        S[        4nUnU(       a*  SU" U V	s/ s H  n	[        U	5      PM     sn	XUSU;   5      4$ ggs  sn	f s  sn	f )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_urlrL   rx   r   r   r   r   r   r   r   )rd   r   r  r  
parsed_urlr   rS   	directioncolor_stopsstopr   r   r   r   s                 rH   	get_imager!  O  sa   7)J!}%%%a=z)*Q-***zzZ0ABID??!A)!L	$n4?@KD!$'K@;$.'0 0 0  
A	A1)<17.E;E/D}e]BH#K$n4?@KD!$'K@X{d':'< < <  
B A As   D
7D!
c                 p    U R                  S5      (       a  SS[        U SS  5      44$ SS[        X5      44$ )N#r9   internalr   r6   )r  r   r   )r2   r   s     rH   _get_url_tupler%  q  sC    
GF12J$7899
L$BCDDrG   c                 D   U R                   S:X  a  [        U R                  U5      $ U R                   S:X  aj  U R                  S:X  a  [	        U S5      $ U R                  S:X  a=  [        U R                  5      S;   a#  [        U R                  S   R                  U5      $ ggg)zParse an <url> token.r9   r   r   r   r   N)rL   r%  rm   rS   r   r   r   )rd   r   s     rH   r  r  x  s    zzUekk844	z	!::&ue44ZZ5 S%9V%C "%//!"4":":HEE &D  
"rG   c                 *    [        U 5      nUS;   a  U$ g)zParse a <quote> token.)z
open-quotezclose-quotezno-open-quotezno-close-quoteN)r   )rd   r   s     rH   	get_quoter(    s%    % G / / /rG   c                    [        U 5      nUc  gUu  p4[        U5      nU(       d  gUS:X  a  [        U5      S;  a  gO/US:X  a  [        U5      S;  a  gOUS:X  a  [        U5      S;  a  gOg/ nUR                  S5      n[	        U5      nUc!  [        Xa5      nUc  gUR                  U5        OUR                  U5        UR                  S5      (       a  U(       d  gUR                  S5      n	U	R                  S	:w  a  gUR                  U	R                  5        US:X  a/  [	        UR                  S5      5      n
U
c  gUR                  U
5        U(       a  [        UR                  S5      5      nOS
nUR                  U5        O<U(       a"  [        UR                  S5      5      nUS;  a  gOSnUR                  U5        U S3[        U5      4$ )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   r|   r   r   r
  r  rt   r  rL   rm   r   ru   )rd   r   r   rS   rj   valueslinkstring_linkr9   r4   r2   r   r   s                rH   
get_targetr-    s   e$HJD"4(Dt9F" #	"	"t9F" #		t9F" # 	F88A;DT"Kd%;ck"'((:: ekk"$$,F~MM&!'4M%Mm$!$((1+.GLL M  GgfBKv''rG   c                 T    U  Vs/ s H  n[        X!5      PM     nnSU;  a  U$ gs  snf )zParse <content-list> tokens.N)get_content_list_token)rR   r   rd   parsed_tokenss       rH   get_content_listr1    sB     >DE=CEu/V  E=  !Es   %c                    [        U 5      nUb  U$ [        U 5      S:X  a  g[        X5      nUb  U$ [        U 5      nUb  SU4$ [	        X5      nUb  U$ [        U 5      nUc  gUu  pxUS:X  a  [        U5      S:w  a  gUu  n	U	R                  S:X  a:  U	R                  S:X  a  S	nOCU	R                  S
:X  a  SnO0U	R                  S:X  a  SnOgU	R                  S:X  a  U	R                  nSSU44$ US:X  a  [        SU 5      $ g)z'Parse one of the <content-list> tokens.Ncontentsr   quoteleaderr   r4   dotted.solid_spacer^   r2   zleader()element)
r
  r   r  r(  r-  r   r   rL   rm   r  )
rd   r   r2   r9   r4  targetr   rS   rj   r  s
             rH   r/  r/    s1   
 F 5Z'$ %
"C

 eE (Fe$HJD xt9>88wyyH$g%g%XX!YYFXv.// 
	/	5AA 
rG   r`   )TF)CrE   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   rN   
ValueErrorr>   rJ   rP   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  r(  r-  r1  r/  r@   rG   rH   <module>rF     sp      # ) '  . !
 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rG   