+
    	i[                        R t ^ RIt^ RIHtHt ^ RIHtHtHtH	t	 ^ RI
HtHtHtHt ^ RIHt ^RIHt ^RIHt ^RIHt ^R	IHt ^R
IHt ^RIHtHtHt ]! ^ R4      t]! ^2R4      t]! ^dR4      t R]R]R]R] R] /t!R<R=R>R]	^,          3R?R]	3R@R]	^,          ^,          3RARBRCRBRDRERFRERGRHRIRHRJRKRLRK/t"]! ^ ^ ]RR4      t#]! ^ ^ ]	RR4      t$]! ^ ^ ]RR4      t%]! ^ ^ ]) RR4      t&]! ^ ^ ]RR4      t' ! R R](4      t) ! R R](4      t* ! R R](4      t+ ! R R]4      t,R  t-R! t.R" t/R# t0R$ t1R% t2R& t3R' t4R( t5R) t6R* t7R+ t8RMR, lt9R- t:RNR. lt;RMR/ lt<R0 t=R1 t>R2 t?R3 t@R4 tAR5 tBR6 tCR7 tDR8 tER9 tFR: tGROR; ltHR# )PzCSS tokens parsers.N)ABCabstractmethod)einfnanpi)DimensionToken
IdentTokenNumberTokenPercentageToken)parse_color)LOGGER)get_url_tuple)	functions)
check_math)	Dimension)ANGLE_TO_RADIANSLENGTH_UNITSRESOLUTION_TO_DPPX%topleftcenterbottomrightangler   u   πu   ∞u   -∞NaNc                       ] tR t^4tRtRtR# )InvalidValuesz7Invalid or unsupported values for a known CSS property. N__name__
__module____qualname____firstlineno____doc____static_attributes__r       [/Users/agent/.openclaw/workspace/venv/lib/python3.14/site-packages/weasyprint/css/tokens.pyr   r   4   s    Ar'   r   c                       ] tR t^8tRtRtR# )PercentageInMathz5Percentage in math function without reference length.r   Nr    r   r'   r(   r*   r*   8   s    ?r'   r*   c                       ] tR t^<tRtRtR# )FontUnitInMathz<Font-relative unit in math function without reference style.r   Nr    r   r'   r(   r,   r,   <   s    Fr'   r,   c                   @   a  ] tR t^@t o RtR t]R 4       tR tRt	V t
R# )PendingzCAbstract class representing property value with pending validation.c                ,    Wn         W n        R V n        R# )FN)tokensname_reported_error)selfr0   r1   s   &&&r(   __init__Pending.__init__C   s    	$r'   c                    \         h)z#Get validated value for wanted key.)NotImplementedError)r3   r0   
wanted_keys   &&&r(   validatePending.validateH   s
     "!r'   c           	         V'       g   \        R4      hV P                  W4      #   \          d   pT P                  '       d   ThT P                  ^ ,          P                  pT P                  ^ ,          P
                  pRP                  R T 4       4      pTP                  '       d   TP                  ^ ,          MRp\        P                  ! RT P                  YdYW4       RT n        ThRp?ii ; i)z#Get validated value or raise error.zno value c              3   @   "   T F  qP                  4       x  K  	  R # 5iN)	serialize.0tokens   & r(   	<genexpr> Pending.solve.<locals>.<genexpr>Z   s     CF5__..Fs   zinvalid valuezIgnored `%s: %s` at %d:%d, %s.TN)r   r9   r2   r0   source_linesource_columnjoinargsr   warningr1   )r3   r0   r8   	exceptionrE   rF   valuemessages   &&&     r(   solvePending.solveM   s    	 $J//==44 	###++a.44K KKN88MHHCFCCE+4>>>innQ'GNN0		5}G $(D O	s    & & C/A7C*)AC**C/)r2   r1   r0   N)r!   r"   r#   r$   r%   r4   r   r9   rM   r&   __classdictcell__)__classdict__s   @r(   r.   r.   @   s+     M%
 " " r'   r.   c                 N    \        V 4      ^8X  d   \        V ^ ,          RR7      # R# )   T
percentageN)len
get_lengthr0   s   &r(   parse_color_hintrX   c   s$    
6{a&)55 r'   c                    \        V 4      ^8X  d6   \        V ^ ,          4      pVR8X  d   \        R4      R3# Ve   VR3#  \        h\        V 4      ^8X  d3   \        V ^ ,          4      p\        V ^,          RRR7      pVe   Ve   W3# \        h)rR   currentcolorblackNT)negativerT   )rU   r   rV   r   )r0   colorpositions   &  r(   parse_color_stopr_   h   s    
6{aF1I&N"w'--$;   
V	F1I&fQi$4H!5?"
r'   c                    V '       g   \         h\        V ^ ,          4      .p. pRpV R,           F  p\        V4      ;p'       d   VP                  V4       RpK+  V'       d4   VP                  \        4       VP                  \        V4      4       RpKf  VP                  \        V4      4       RpK  	  V'       g   \         hW3# )    TrR   NNF)r   r_   rX   appendFIFTY_PERCENT)color_stops_hintscolor_stopscolor_hintsprevious_was_color_stopr0   hints   &     r(   parse_color_stops_and_hintsrj   x   s    #$5a$89:KK"#B''#F++4+t$&+#$}-/78&*#/78&*# ( ###r'   c                    V ^ ,          p\        V4      ^8X  d%   \        V^ ,          4      pVe   RV3V R,          3# M:\        P                  \	        \        \        V4      4      4      pVe   W0R,          3# R\        3V 3# )ra   r   rb   )rU   	get_angleDIRECTION_KEYWORDSgettuplemapget_keywordr   )	arguments	first_argr   results   &   r(    parse_linear_gradient_parametersru      s    !I
9~)A,'U#Yr]22  $''c+y.I(JKR=((R=)##r'   c                   \        V 4      ^8X  d   V ^ ,          \        ^ ^ R4      .p M\        V 4      ^8w  d   R# V w  r\        VRR7      p\        VRR7      pV'       d   V'       d   W43# \        \        V 4      w  rVV'       d   VR9   d   V\
        V,          3# V'       d   VR9   d   \
        V,          V3# VR9   d"   VR9   d   \
        V,          \
        V,          3# VR9   d$   VR9   d   \
        V,          \
        V,          3# R# R# )z:Common syntax of background-position and transform-origin.r   NTrS   )r   r   r   )r   r   r   )rU   r	   rV   rp   rq   BACKGROUND_POSITION_PERCENTAGES)r0   token_1token_2length_1length_2	keyword_1	keyword_2s   &      r(   parse_2d_positionr~      s
   
6{a)Z1h78	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 3r'   c                $   \        V 4      pVe   Vw  r#RVRV3# \        V 4      ^8X  d   \        V ^ ,          4      p\        V ^,          4      p\        V ^,          RR7      p\        V ^,          RR7      pV'       d-   V'       d%   VR9   d   VR9   d   WFWW3# VR9   d   VR9   d   WWWF3# \        V 4      ^8X  d   \        V ^,          RR7      pVe&   \        V ^,          4      p	\        V ^ ,          4      p
M8\        V ^,          RR7      p\        V ^,          4      p
\        V ^ ,          4      p	Ve\   V
R8X  d#   V	R9   d
   R\        W3# V	R9   d
   WR\        3# R# V	R9   d   V
R9   d
   WV
\
        3# V	R9   d   V
R9   d
   V
\
        W3# R# R# R# R# )	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   TrS   r   )r   r   )r   r   )r~   rU   rq   rV   rd   ZERO_PERCENT)r0   rt   pos_xpos_yr|   r}   rz   r{   lengthkeywordother_keywords   &          r(   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 /  r'   c                 v   R pR pR pR pV ^ ,          R R R1,          pV'       d   VP                  4       p\        V4      pVR8X  d   \        VR R R1,          4      pVf   R # MVR9   d	   Vf   TpKU  VR9   d   Vf   RV3pKf  V'       dE   VfA   \        VRR7      p\        VR,          RR7      p	R W39  d   RW33pRpVP                  4        Vf   \        V4      pVe   RW33pRpVe   K  R # W3R9   d   R # T;'       g    T;'       g    RT;'       g    RT;'       g    R\        R	\        3V R
,          3# )Natcircleellipser   TrS   explicitr   r   rb   r   r   )zclosest-cornerfarthest-cornerzclosest-sidezfarthest-side)r   r   r   r   )poprq   r   rV   rd   )
rr   shaper^   size
size_shapestackrB   r   rz   r{   s
   &         r(    parse_radial_gradient_parametersr      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|LL((((y...AAV]E=A"	 r'   c                    . p. pV  FK  pVP                   R8X  d'   VP                  R8X  d   VP                  V4       . pK:  VP                  V4       KM  	  VP                  V4       \        V4      # )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,)typerK   rc   ro   )r0   parts	this_partrB   s   &   r(   split_on_commar     sf     EI::"u{{c'9LL#IU#  
LL<r'   c                Z    \         ;QJ d    . R V  4       F  NK  	  5# ! R V  4       4      # )z=Remove any top-level whitespace and comments in a token list.c              3   L   "   T F  pVP                   R9  g   K  Vx  K  	  R# 5i)
whitespaceN)r   comment)r   r@   s   & r(   rC   $remove_whitespace.<locals>.<genexpr>,  s%      8!%::66 	6s   $
$)ro   rW   s   &r(   remove_whitespacer   *  s4    5 8!85 85 8!8 8 8r'   c                @    V P                   R8X  d   V P                  # R# )zSIf ``token`` is a keyword, return its lowercase name.

Otherwise return ``None``.

identN)r   lower_valuerB   s   &r(   rq   rq   1  s!     zzW    r'   c                @    V P                   R8X  d   V P                  # R# )zIIf ``token`` is a keyword, return its name.

Otherwise return ``None``.

r   N)r   rK   r   s   &r(   get_custom_identr   ;  s     zzW{{ r'   c                v    \        V 4      ^8X  d)   V ^ ,          pVP                  R8X  d   VP                  # R# R# )z]If ``values`` is a 1-element list of keywords, return its name.

Otherwise return ``None``.

r   N)rU   r   r   )r0   rB   s   & r(   get_single_keywordr   E  s;     6{aq	:: $$$ ! r'   c                6   ^RI Hp \        V 4      '       d_    V! V 4      pVf   R# VP                  R8w  d   R# VP                  pV'       g
   V^ 8  d   ^ pV'       d   \        V4      p\        VR4      # V P                  R8X  d{   V'       dB   V P                  e2   V'       g   V P                  ^ 8  d   \        V P                  R4      # R# R# V'       g   V P                  ^ 8  d   \        V P                  R4      # R# R#   \        \        3 d     R# i ; i)zParse a <number> token.resolve_mathNnumber)
 r   r   r   rK   roundr   r*   r,   	int_value)rB   r\   integerr   resolvedrK   s   &&&   r(   
get_numberr   Q  s    %	*#E*H }}(NNE	 eUD))	x	*u!3$U__d;;  4 + )U[[$// * 
  !.1 		s   D DDc                   V P                   R8X  d   RV P                  3# V P                   R8X  d   V P                  R8X  d   \        P                  ! V R4      # V P                  R9   d   \        P
                  ! V 4      # V P                  R8X  d   \        P                  ! V 4      # V P                  R8X  d   \        P                  ! RV 4      # R# R# )zParse a <string> token.stringfunctionattrcontentN)countercounters)r   rK   r1   r   
check_attrcheck_countercheck_contentcheck_string_or_elementr   s   &r(   
get_stringr   p  s    zzX%++&&zzZ::''x88ZZ22**511ZZ9$**511ZZ8#44XuEE $  r'   c                T   ^RI Hp \        V 4      '       d7    V! V 4      ;'       g    T p V'       g   \        ^ V P                  4      V n        V P                  R8X  d2   V'       g   V P                  ^ 8  d   \        V P                  R4      # R# R#   \
        \        3 d     R# i ; i)zParse a <percentage> token.r   NrT   r   )	r   r   r   maxrK   r*   r,   r   r   )rB   r\   r   s   && r(   get_percentager     s    %	2 '005E
 !!U[[1zz\!x5;;!3Cc** 4D! !.1 		s   B B B'&B'c                   ^RI Hp \        V 4      '       dH    V! V 4      ;'       g    T p V'       g-   V P                  R9  d   \	        ^ V P
                  4      V n        V'       dA   V P                  R8X  d0   V'       g   V P
                  ^ 8  d   \        V P
                  R4      # V P                  R8X  dk   V P                  P                  4       \        9   dH   V'       g   V P
                  ^ 8  d/   \        V P
                  V P                  P                  4       4      # V P                  R8X  d    V P
                  ^ 8X  d   \        ^ R4      # R# R#   \         d    T'       d   T u # Ru # \         d    T u # i ; i)zParse a <length> token.r   r   NrT   r   	dimension)r   r   )r   r   r   r   r   rK   r*   r,   r   unitlowerr   )rB   r\   rT   r   s   &&& r(   rV   rV     s   %	2 '005E 

2H H!!U[[1ejjL0u{{a'U[[#..zz[ UZZ%5%5%7<%Gu{{a'U[[%***:*:*<==zzX%++"2D!! #3!   	1 '50D0 	L	s.   E E E>'E>+E>/E>8E>=E>c                `   ^RI Hp  V! V 4      ;'       g    T p T P                  R8X  d   T P
                  ^ 8X  d   ^ # T P                  R8X  dH   \        P                  ! T P                  P                  4       4      pTe   T P
                  T,          # R# R#   \        \        3 d     R# i ; i)z"Parse an <angle> token in radians.r   Nr   r   )
r   r   r*   r,   r   rK   r   rn   r   r   rB   r   factors   &  r(   rl   rl     s    U#,,u zzX%++"2	{	"!%%ejj&6&6&89;;''  
# n- s   B B B-,B-c                   ^RI Hp  V! V 4      ;'       g    T p T P                  R8X  dH   \
        P                  ! T P                  P                  4       4      pTe   T P                  T,          # R# R#   \        \        3 d     R# i ; i)z#Parse a <resolution> token in dppx.r   Nr   )
r   r   r*   r,   r   r   rn   r   r   rK   r   s   &  r(   get_resolutionr     s    U#,,u zz[ #''

(8(8(:;;;''  ! n- s   A4 A4 4B	B	c           	     V   ^RI HpHp \        W4      ;p'       d8   V^ ,          R8X  g   Q hV^,          ^ ,          R8X  d   RV^,          ^,          3# \        P
                  ! V 4      pVP                  RR7      pV'       g   R# VP                  P                  R4      pVP                  R9   d&   \        V4      w  r\        V	4      w  rRV! WWz4      3# VP                  R9   dC   \        V4      pVe   Vw  rrMR
pRpR\        R\        3pTp	\        V	4      w  rR	V! WWWz4      3# R# )zParse an <image> token.)LinearGradientRadialGradienturlexternalF)single_tokensNz
repeating-linear-gradientradial-gradientr   r   r   )r   zrepeating-linear-gradient)r   zrepeating-radial-gradientr   )imagesr   r   get_urlr   Functionsplit_commar1   
startswithru   rj   r   rd   )rB   base_urlr   r   
parsed_urlr   rr   	repeating	directionrf   rg   rt   r   r   r^   s   &&             r(   	get_imager     s@   7U--z-!}%%%a=z)*Q-***!!%(H$$5$9I((6I}}HH!A)!L	#>{#K  .I#< < 	<	J	J1)<17.E;E/D}e]BH#K#>{#K  .	#H H 	H 
Kr'   c                   V P                   R8X  d   \        V P                  V4      pMV P                   R8X  d~   V P                  R8X  d   \        P
                  ! V R4      # V P                  R8X  dC   \        V P                  4      R9   d)   \        V P                  ^ ,          P                  V4      pMR# R# Vf   \        RV: 24      hRV3# )zParse an <url> token.r   r   r   Nz+Relative URI reference without a base URI: rR      )	r   r   rK   r1   r   r   rU   rr   r   )rB   r   r   s   && r(   r   r     s    zzUEKK2	z	!::''u55ZZ5 S%9V%C   2 8 8(CC
{I#QRR3<r'   c                .    \        V 4      pVR9   d   V# R# )zParse a <quote> token.N)z
open-quotezclose-quotezno-open-quotezno-close-quote)rq   )rB   r   s   & r(   	get_quoter      s%    % G / / /r'   c                :   \         P                  ! V 4      pVP                  4       pVP                  R8X  d   \	        V4      R	9  d   R# MJVP                  R8X  d   \	        V4      R
9  d   R# M&VP                  R8X  d   \	        V4      R9  d   R# MR# . pVP                  ^ 4      p\        V4      pVf$   \        WQ4      pVf   R# VP                  V4       MVP                  V4       VP                  P                  R4      '       d   VP                  ^ 4      pVP                  R8w  d   R# VP                  VP                  4       VP                  R8X  d2   \        VP                  ^ 4      4      p	V	f   R# VP                  V	4       V'       d   \        VP                  ^ 4      4      p
MRp
VP                  V
4       M?V'       d%   \        VP                  ^ 4      4      pVR9  d   R# MRpVP                  V4       VP                   R2\        V4      3# )zParse a <target> token.ztarget-counterNztarget-countersztarget-textr   decimalr   z())r      )r      r   )r   beforeafterzfirst-letter)r   r   r   r1   rU   r   r   r   rc   r   r   rK   rq   ro   )rB   r   r   rr   valueslinkstring_linkr   r   r   counter_styler   s   &&          r(   
get_targetr   	  s   !!%(H$$&I}}((y>' (	+	+y>' (	-	'y>' ( 	F==DT"Kd%;ck"}} 011a :: ekk"==--	a 01F~MM&!'	a(89M%Mm$!)--"23GLL M  Gg}}oR %-00r'   c                V    V  Uu. uF  p\        W!4      NK  	  ppRV9  d   V# R# u upi )zParse <content-list> tokens.N)get_content_list_token)r0   r   rB   parsed_tokenss   &&  r(   get_content_listr   B  s9     KQQ&+E<&MQ=  ! Rs   &c                   \        V 4      ;pe   V# \        V 4      R8X  d   R# \        W4      ;pe   V# \        V 4      ;pe   RV3# \	        W4      ;pe   V# \
        P                  ! V 4      pVP                  4       pVP                  R8X  d   \        V4      ^8w  d   R# Vw  pVP                  R8X  d?   VP                  R8X  d   RpMGVP                  R8X  d   R	pM3VP                  R
8X  d   RpMR# VP                  R8X  d   VP                  pRRV33# VP                  R8X  d   \
        P                  ! RV 4      # R# )z'Parse one of the <content-list> tokens.Ncontentsquoteleaderr   dotted.solid_spacer<   r   zleader()element)z	content()text)r   rq   r   r   r   r   r   r   r1   rU   r   rK   r   )	rB   r   r   r   r   targetr   rr   args	   &&       r(   r   r   J  sH   
 U##0 5Z'$$ u''4
 5!!. U--:!!%(H$$&I }} y>Q88wyyH$g%g%XX!YYFXv.// 
)	#00EBB 
$r'   c                F   a  \         P                  ! S 4      V 3R l4       pV# )z;Decorator for validators that only accept a single keyword.c                >   < \        V 4      pS! V4      '       d   V# R# )z6Wrap a validator to call get_single_keyword on tokens.N)r   )r0   r   r   s   & r(   keyword_validator)single_keyword.<locals>.keyword_validator~  s$     %V,GN r'   )	functoolswraps)r   r  s   f r(   single_keywordr  |  s&    __X 
 r'   c                T   a  \         P                  ! S 4      V 3R l4       pS Vn        V# )z9Decorator for validators that only accept a single token.c                J   < \        V 4      ^8X  d   S! V ^ ,          .VO5!  # R# )z*Validate a property whose token is single.N)rU   )r0   rH   r   s   &*r(   single_token_validator,single_token.<locals>.single_token_validator  s*     v;!F1I--- r'   )r  r  __func__)r   r	  s   f r(   single_tokenr    s/    __X. . '/#!!r'   c                T   a  \         P                  ! S 4      V 3R l4       pS Vn        V# )z<Decorator for validators that accept a comma separated list.c                    < . p\        V 4       F.  pS! \        V4      .VO5!  pVf    R # VP                  V4       K0  	  \        V4      # r>   )r   r   rc   ro   )r0   rH   resultspartrt   r   s   &*   r(   wrapper%comma_separated_list.<locals>.wrapper  sL    "6*D/5==F~NN6"	 +
 W~r'   )r  r  single_value)r   r  s   f r(   comma_separated_listr    s-    __X  $GNr'   c           	     ^   \        V \        \        34      '       dX   V'       d   V! V P                  4      MV P                  p\        ^ ^ VR\	        V4      V P
                  P                  4       4      # \        V \        4      '       d?   V'       d   V! V P                  4      MV P                  p\        ^ ^ VR\	        V4      4      # \        V \        \        \        34      '       d   \        V \        4      '       d   V P                  pMT pV'       d	   V! V4      MTp\        V4      P                  4       '       d   \        V4      MRp\	        \        V4      P                  4       '       d   TMT4      pVf   \        ^ ^ W4V4      # VR8X  d   \        ^ ^ W4V4      # \        ^ ^ W4WR4      # R# )z/Transform a computed value result into a token.Nr   )
isinstancer   r   rK   strr   r   r   r
   intfloat
is_integerr   )itemr   r   rK   r   representations   &&&   r(   tokenizer    sC   $344(0$djjaE4UTYY__=NOO	D/	*	*(0$djjq!UD#e*==	D;U3	4	4dK((JJEE#+$)%L$;$;$=$=E%L4	%,*A*A*C*CYO<q!U~FFS["1a>JJ!!Q.OO 
5r'   )tor   )r   ra   )r  r   )r  r   )r  r   )r  r   r   )cornertop_left)r  r   r   )r  r   r   )r  	top_right)r  r   r   )r  r   r   )r  bottom_left)r  r   r   )r  r   r   )r  bottom_right)r  r   r   )TF)T)NN)Ir%   r  abcr   r   mathr   r   r   r   tinycss2.astr   r	   r
   r   tinycss2.color5r   loggerr   urlsr   r   r   r   
propertiesr   unitsr   r   r   r   rd   HUNDRED_PERCENTrw   rm   EPIPLUS_INFINITYMINUS_INFINITYNAN
ValueErrorr   r*   r,   r.   rX   r_   rj   ru   r~   r   r   r   r   rq   r   r   r   r   r   rV   rl   r   r   r   r   r   r   r   r  r  r  r  r   r'   r(   <module>r3     s
     #     Q Q '     ! ! E EC "c"C%	<
Lmo_#  <grAv&wmWb1fqj)11337799 " 1as#Ar4&Aq#tU3QC4v6!QT5)BJ B@z @GZ G c  F6
 $4
$<8.Db(V&8!	%0>F+""6("(H@,61r/Cd"Pr'   