
    3vj \                        d Z ddlZddlmZmZ ddlmZmZmZm	Z	 ddl
mZmZmZmZ ddlmZ ddlmZ dd	lmZ d
dlmZ d
dlmZ d
dlmZ d
dlmZmZmZ  edd      Z edd      Z edd      Z eeee e dZ!dde	dz  fde	fde	dz  dz  fdddddddddZ" eddedd      Z# edde	dd      Z$ eddedd      Z% edde dd      Z& eddedd      Z' G d  d!e(      Z) G d" d#e(      Z* G d$ d%e(      Z+ G d& d'e      Z,d( Z-d) Z.d* Z/d+ Z0d, Z1d- Z2d. Z3d/ Z4d0 Z5d1 Z6d2 Z7d3 Z8dDd4Z9d5 Z:dEd6Z;dDd7Z<d8 Z=d9 Z>d: Z?d; Z@d< ZAd= ZBd> ZCd? ZDd@ ZEdA ZFdB ZGdFdCZHy)Gz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%2   d   )topleftcenterbottomright)angler   r       )cornertop_left)r"   	top_right)r"   bottom_left)r"   bottom_right))tor   )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   r   r   u   πu   ∞u   -∞NaNc                       e Zd ZdZy)InvalidValuesz7Invalid or unsupported values for a known CSS property.N__name__
__module____qualname____doc__     H/root/.hermes/venv/lib/python3.12/site-packages/weasyprint/css/tokens.pyr*   r*   4   s    Ar1   r*   c                       e Zd ZdZy)PercentageInMathz5Percentage in math function without reference length.Nr+   r0   r1   r2   r4   r4   8   s    ?r1   r4   c                       e Zd ZdZy)RelativeLengthInMathz>Relative length unit in math function without reference style.Nr+   r0   r1   r2   r6   r6   <   s    Hr1   r6   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)selfr:   r;   s      r2   __init__zPending.__init__C   s    	$r1   c                     t         )z#Get validated value for wanted key.)NotImplementedError)r=   r:   
wanted_keys      r2   validatezPending.validateH   s
     "!r1   c           	         	 |st        d      | j                  ||      S # t         $ r}| j                  r|| j                  d   j                  }| j                  d   j
                  }dj                  d |D              }|j                  r|j                  d   n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     r2   	<genexpr>z Pending.solve.<locals>.<genexpr>Z   s     C5U__.C   zinvalid valuezIgnored `%s: %s` at %d:%d, %s.TN)r*   rB   r<   r:   source_linesource_columnjoinargsr   warningr;   )r=   r:   rA   	exceptionrM   rN   valuemessages           r2   solvezPending.solveM   s    	 $J//==44 	##++a.44K KKN88MHHCFCCE+4>>innQ'GNN0		5+}gG $(D O	s   ! 	CB"CCN)r,   r-   r.   r/   r>   r   rB   rU   r0   r1   r2   r8   r8   @   s#    M%
 " "r1   r8   c                 @    t        |       dk(  rt        | d   d      S y )Nr   r   T
percentage)len
get_lengthr:   s    r2   parse_color_hintr\   c   s$    
6{a&)55 r1   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   currentcolorblackr   T)negativerX   )rY   r   rZ   r*   )r:   colorpositions      r2   parse_color_stoprc   h   s    
6{aF1I&N"w'--$;  
V	F1I&fQi$4H!5(?"
r1   c                 F   | st         t        | d         g}g }d}| dd  D ]s  }t        |      x}r|j                  |       d}$|r2|j                  t               |j                  t        |             d}X|j                  t        |             d}u |st         ||fS )Nr   Tr   F)r*   rc   r\   appendFIFTY_PERCENT)color_stops_hintscolor_stopscolor_hintsprevious_was_color_stopr:   hints         r2   parse_color_stops_and_hintsrl   x   s    #$5a$89:KK"#AB' 
+#F++4+t$&+#$}-/78&*#/78&*#
+ ###r1   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        f| fS )Nr   r   r    )rY   	get_angleDIRECTION_KEYWORDSgettuplemapget_keywordr   )	arguments	first_argr    results       r2    parse_linear_gradient_parametersrw      s    !I
9~)A,'U#Yqr]22#''c+y.I(JK9QR=((R=)##r1   c                    t        |       dk(  r| d   t        ddd      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   r   NTrW   )r   r   r   )r   r   r   )rY   r
   rZ   rr   rs   BACKGROUND_POSITION_PERCENTAGES)r:   token_1token_2length_1length_2	keyword_1	keyword_2s          r2   parse_2d_positionr      s   
6{a)Z1h78	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 3r1   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   TrW   r!   )r   r   )r   r   r   )r   rY   rs   rZ   rf   ZERO_PERCENT)r:   rv   pos_xpos_yr~   r   r|   r}   lengthkeywordother_keywords              r2   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 /  r1   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   TrW   explicitr   r   )r   r   r   r   r   r   r   )poprs   r   rZ   rf   )
rt   shaperb   size
size_shapestackrJ   r   r|   r}   s
             r2    parse_radial_gradient_parametersr      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!"	 r1   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,)typerS   re   rq   )r:   parts	this_partrJ   s       r2   split_on_commar     sk     EI $::"u{{c'9LL#IU#$ 
LL<r1   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)r   rH   s     r2   rK   z$remove_whitespace.<locals>.<genexpr>,  s%      8::66 	8rL   )rq   r[   s    r2   remove_whitespacer   *  s     8!8 8 8r1   c                 :    | j                   dk(  r| j                  S y)z[If ``token`` is a keyword, return its lowercase name.

    Otherwise return ``None``.

    identN)r   lower_valuerJ   s    r2   rs   rs   1  s!     zzW    r1   c                 :    | j                   dk(  r| j                  S y)zQIf ``token`` is a keyword, return its name.

    Otherwise return ``None``.

    r   N)r   rS   r   s    r2   get_custom_identr   ;  s     zzW{{ r1   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   r   N)rY   r   r   )r:   rJ   s     r2   get_single_keywordr   E  s;     6{aq	:: $$$ ! r1   c                    ddl m} t        |       rJ	  ||       }|y|j                  dk7  ry|j                  }|s|dk  rd}|rt        |      }t        |d      S | j                  dk(  r_|r5| j                  (|s| j                  dk\  rt        | j                  d      S yy|s| j                  dk\  rt        | j                  d      S yy# t        t        f$ r Y yw xY w)zParse a <number> token.r   resolve_mathNnumberr   )
 r   r   r   rS   roundr   r4   r6   	int_value)rJ   r`   integerr   resolvedrS   s         r2   
get_numberr   Q  s    %	*#E*H }}(NNE	 eUD))	x	*u!3$U__d;;  4 + )U[[$// * 
  !"67 		s   C CCc                    | j                   dk(  rd| j                  fS | j                   dk(  r| j                  dk(  rt        j                  | d      S | j                  dv rt        j
                  |       S | j                  dk(  rt        j                  |       S | j                  dk(  rt        j                  d|       S yy)zParse a <string> token.stringfunctionattr)countercounterscontentN)r   rS   r;   r   
check_attrcheck_countercheck_contentcheck_string_or_elementr   s    r2   
get_stringr   p  s    zzX%++&&zzZ::''x88ZZ22**511ZZ9$**511ZZ8#44XuEE $  r1   c                    ddl m} t        |       r+	  ||       xs | } |st        d| j                        | _        	 | j                  dk(  r(|s| j                  dk\  rt        | j                  d      S yy# t
        t        f$ r Y yw xY w)zParse a <percentage> token.r   r   r   NrX   r   )	r   r   r   maxrS   r4   r6   r   r   )rJ   r`   r   s      r2   get_percentager     s    %	2 '05E
 !!U[[1zz\!x5;;!3Cc** 4D! !"67 		s   A5 5BBc                    ddl m} t        |       r9	  ||       xs | } |s*| j                  dvrt	        d| j
                        | _        	 |r6| j                  dk(  r'|s| j
                  dk\  rt        | j
                  d      S | j                  dk(  r_| j                  j                         t        v r?|s| j
                  dk\  r.t        | j
                  | j                  j                               S | j                  d	k(  r| j
                  dk(  rt        dd      S yy# t        $ r |r| cY S dcY S t        $ r | cY S w xY w)
zParse a <length> token.r   r   )r   r   r   NrX   r   	dimensionr   )r   r   r   r   r   rS   r4   r6   r   unitlowerr   )rJ   r`   rX   r   s       r2   rZ   rZ     s   %	2 '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   D D=,D=0
D=<D=c                 .   ddl m} 	  ||       xs | } | j                  dk(  r| j
                  dk(  ry| j                  dk(  r?t        j                  | j                  j                               }|| j
                  |z  S yy# t        t        f$ r Y yw xY w)z"Parse an <angle> token in radians.r   r   Nr   r   r   )
r   r   r4   r6   r   rS   r   rp   r   r   rJ   r   factors      r2   rn   rn     s    U#,u zzX%++"2	{	"!%%ejj&6&6&89;;''  
# 23 s   B BBc                     ddl m} 	  ||       xs | } | j                  dk(  r?t        j                  | j                  j                               }|| j                  |z  S yy# t        t        f$ r Y yw xY w)z#Parse a <resolution> token in dppx.r   r   Nr   )
r   r   r4   r6   r   r   rp   r   r   rS   r   s      r2   get_resolutionr     s}    U#,u zz[ #''

(8(8(:;;;''  ! 23 s   A# #A54A5c           	         ddl m}m} t        | |      x}r|d   dk(  sJ |d   d   dk(  r
d|d   d   fS t	        j
                  |       }|j                  d      }|sy	|j                  j                  d
      }|j                  dv r)t        |      \  }}	t        |	      \  }	}
d ||	|||
      fS |j                  dv rFt        |      }||\  }}}}	nd}d}dt        dt        f}|}	t        |	      \  }	}
d ||	|||||
      fS y	)zParse an <image> token.r   )LinearGradientRadialGradientr   urlr   externalF)single_tokensNz
repeating-)linear-gradientzrepeating-linear-gradientr   )radial-gradientzrepeating-radial-gradientr   r   r   r   r   )imagesr   r   get_urlr   Functionsplit_commar;   
startswithrw   rl   r   rf   )rJ   base_urlr   r   
parsed_urlr   rt   	repeating	directionrh   ri   rv   r   r   rb   s                  r2   	get_imager     sT   7UH--z-!}%%%a=z)*Q-***!!%(H$$5$9I((6I}}HH!A)!L	;#>{#K [ .I{#< < 	<	J	J1)<17.E4;E/D}e]BH#K#>{#K [ .h	;#H H 	H 
Kr1   c                 v   | j                   dk(  rt        | j                  |      }n| j                   dk(  rp| j                  dk(  rt	        j
                  | d      S | j                  dk(  r;t        | j                        dv r$t        | j                  d   j                  |      }nyy|t        d|      d|fS )zParse an <url> token.r   r   r   r   r   r   Nz+Relative URI reference without a base URI: )	r   r   rS   r;   r   r   rY   rt   r*   )rJ   r   r   s      r2   r   r     s    zzUEKK2	z	!::''u55ZZ5 S%9V%C   2 8 8(CC
{I#QRR3<r1   c                 &    t        |       }|dv r|S y)zParse a <quote> token.)z
open-quotezclose-quotezno-open-quotezno-close-quoteN)rs   )rJ   r   s     r2   	get_quoter      s%    % G / / /r1   c                    t        j                  |       }|j                         }|j                  dk(  rt	        |      dvr<y|j                  dk(  rt	        |      dvry|j                  dk(  rt	        |      dvryyg }|j                  d      }t        |      }|!t        ||      }|y|j                  |       n|j                  |       |j                  j                  d      r|j                  d      }|j                  d	k7  ry|j                  |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                  |       |j                   dt        |      fS )zParse a <target> token.ztarget-counter)r   r!   Nztarget-counters)r!   r   ztarget-textr   r   r   decimal)r   beforeafterzfirst-letterr   z())r   r   r   r;   rY   r   r   r   re   r   r   rS   rs   rq   )rJ   r   r   rt   valueslinkstring_linkr   r   r   counter_styler   s               r2   
get_targetr   	  s   !!%(H$$&I}}((y>'	+	+y>'	-	'y>'F==DT"KdH%;ck"}} 01a :: ekk"==--	a 01F~MM&!'	a(89M%Mm$!)--"23GLLGg}}oR %-00r1   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)r:   r   rJ   parsed_tokenss       r2   get_content_listr   B  s:     KQQ+E8<QMQ=  ! Rs   !c                 H   t        |       x}|S t        |       dk(  ryt        | |      x}|S t        |       x}d|fS t	        | |      x}|S t        j                  |       }|j                         }|j                  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 |j                  dk(  rt        j                  d|       S y)z'Parse one of the <content-list> tokens.Ncontents)z	content()textquoteleaderr   r   dotted.solid_spacerD   r   zleader()element)r   rs   r   r   r   r   r   r   r;   rY   r   rS   r   )	rJ   r   r   r   r   targetr   rt   args	            r2   r   r   J  sI   
 U##0 5Z'$ uh''4
 5!!. UH--:!!%(H$$&I }} y>Q88wyyH$g%g%XX!YYFXv.// 
)	#00EBB 
$r1   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   )r:   r   r   s     r2   keyword_validatorz)single_keyword.<locals>.keyword_validator~  s!     %V,GN r1   )	functoolswraps)r   r  s   ` r2   single_keywordr  |  s&    __X 
 r1   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)rY   )r:   rP   r   s     r2   single_token_validatorz,single_token.<locals>.single_token_validator  s*     v;!F1I--- r1   )r  r  __func__)r   r  s   ` r2   single_tokenr	    s/    __X. . '/#!!r1   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 rF   )r   r   re   rq   )r:   rP   resultspartrv   r   s        r2   wrapperz%comma_separated_list.<locals>.wrapper  sQ    "6* 	#D/5==F~NN6"		#
 W~r1   )r  r  single_value)r   r  s   ` r2   comma_separated_listr    s-    __X  $GNr1   c           	         t        | t        t        f      rQ|r || j                        n| j                  }t        dd|dt	        |      | j
                  j                               S t        | t              r8|r || j                        n| j                  }t        dd|dt	        |            S t        | t        t        t        f      rt        | t              r| j                  }n| }|r ||      n|}t        |      j                         rt        |      nd}t	        t        |      j                         r|n|      }|t        dd|||      S |dk(  rt        dd|||      S t        dd||||      S y)z/Transform a computed value result into a token.r   Nr   )
isinstancer	   r   rS   strr   r   r   r   intfloat
is_integerr   )itemr   r   rS   r   representations         r2   tokenizer    s9   $34(0$djjaE4UTYY__=NOO	D/	*(0$djjq!UD#e*==	D;U3	4dK(JJEE#+$)%L$;$;$=E%L4	%,*A*A*CYO<q!UI~FFS["1a	>JJ!!Qy.$OO 
5r1   )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   rf   HUNDRED_PERCENTry   ro   EPIPLUS_INFINITYMINUS_INFINITYNAN
ValueErrorr*   r4   r6   r8   r\   rc   rl   rw   r   r   r   r   r   rs   r   r   r   r   r   rZ   rn   r   r   r   r   r   r   r   r  r	  r  r  r0   r1   r2   <module>r)     s     #     Q Q '     ! ! E EC "c"C%#   rAv&mb1fqj)11337799 " 1as#Ar4&Aq#tU3QC4v6!QT5)BJ B@z @I: I c  F6
 $4
$<8.Db(V&8!	%0>F+""6("(H@,61r/Cd"Pr1   