
    h                         S r SSKrSSKr\R                  " S5      R                  rS rS rS rS r	S r
S	 rS
 rS rS rS rS rS r\\\\\\S.rS\
0r " S S5      rS rS rS rS rg)z
A simple XPath-like language for tree traversal.

This works by creating a filter chain of generator functions.  Each
function selects a part of the expression, e.g. a child node, a
specific descendant or a node that holds an attribute.
    NzH(b?'[^']*'|b?\"[^\"]*\"|//?|\(\)|==?|[/.*\[\]()@])|([^/\[\]()@=\s]+)|\s+c                 N    [        X5      nUb  [        U5      [        L a  U$ U/$ g)N )getattrtypelist)node	attr_namechilds      R/var/www/fran/franai/venv/lib/python3.13/site-packages/Cython/Compiler/TreePath.pyiterchildrenr      s-    D$E;$L7N    c                 :     [        U 5      $ ! [         a     g f = fN)nextStopIteration)its    r   _get_first_or_noner   #   s"    Bx s   
 
c                 R    U R                   R                  R                  S5      S   $ )N.)	__class____name__split)r   s    r   	type_namer   )   s"    >>""((-b11r   c                 d    US   nU " 5       nUS   S:w  a  [        SU-  5      e[        X5      nX#4$ )N   r   (z%Expected '(' after function name '%s')
ValueErrorhandle_predicate)r   tokenname	predicates       r   
parse_funcr#   ,   s@    8DFEQx3@4GHH -I?r   c                 0   ^ [        X5      u  nmU4S jnU$ )z

not(...)
c              3   R   >#    U  H  n[        T" U/5      5      b  M  Uv   M     g 7fr   )r   )resultr   r"   s     r   selecthandle_func_not.<locals>.select:   s'     D!)TF"34<
 s   '	')r#   )r   r    r!   r'   r"   s       @r   handle_func_notr)   4   s     !-OD) Mr   c                 P   ^ US   mT[         ;   a  [         T   " X5      $ U4S jnU$ )z
/NodeName/
or
func(...)
r   c              3      >#    U  H=  nUR                    H*  n[        X5       H  n[        U5      T:X  d  M  Uv   M     M,     M?     g 7fr   child_attrsr   r   )r&   r   r	   r
   r!   s       r   r'   handle_name.<locals>.selectI   sA     D!--	)$:E '4/# ; . s
   0AA)	functions)r   r    r'   r!   s      @r   handle_namer0   @   s1     8Dyt++$ Mr   c                     S nU$ )z
/*/
c              3   n   #    U  H)  nUR                    H  n[        X5       S h  vN   M     M+     g  N7fr   r-   r   )r&   r   r!   s      r   r'   handle_star.<locals>.selectU   s0     D(('333 ) 3s   #535r   r   r    r'   s      r   handle_starr6   Q   s    4 Mr   c                     S nU$ )z
/./
c                     U $ r   r   )r&   s    r   r'   handle_dot.<locals>.select_   s    r   r   r5   s      r   
handle_dotr:   [   s    Mr   c                    ^^ U " 5       nUS   S:X  a  U4S jmO"US   (       d  US   mUU4S jmO[        S5      eU4S jnU$ )z
//...
r   *c              3      >#    U R                    H)  n[        X5       H  nUv   T" U5       S h  vN   M     M+     g  N7fr   r3   )r   r!   r
   iter_recursives      r   r>   *handle_descendants.<locals>.iter_recursivei   s=     (()$5EK-e444 6 ) 5s   -A >A r   c              3      >#    U R                    H8  n[        X5       H&  n[        U5      T:X  a  Uv   T" U5       S h  vN   M(     M:     g  N7fr   r,   )r   r!   r
   r>   	node_names      r   r>   r?   p   sJ     (()$5E '94#-e444 6 ) 5s   <AA AzExpected node name after '//'c              3   D   >#    U  H  nT" U5       S h  vN   M     g  N	7fr   r   )r&   r   r>   s     r   r'   "handle_descendants.<locals>.selecty   s!     D%d+++ +s    
 )r   )r   r    r'   r>   rA   s      @@r   handle_descendantsrD   c   sM     FEQx3	5
 1X!H		5 899, Mr   c                    ^^ U " 5       nUS   (       a  [        S5      eUS   nS mU R                  5       nUS   S:X  a  U " 5         [        U 5      m[        R                  " U5      mTc  U4S jnU$ UU4S jnU$ )Nr   zExpected attribute namer   =c              3   f   >#    U  H  n T" U5      nUc  M  Uv   M     g ! [          a     M'  f = f7fr   )AttributeError)r&   r   
attr_valuereadattrs      r   r'    handle_attribute.<locals>.select   s?     !)$J )$$  & s    1 1	1
.1.1c              3      >#    U  H`  n T" U5      nUT:X  a  Uv   M  [        U[        5      (       d  M/  [        T[        5      (       d  MF  UTR	                  5       :X  d  M\  Uv   Mb     g ! [          a     Mr  f = f7fr   )rH   
isinstancebytesstrencode)r&   r   rI   rJ   values      r   r'   rK      sn     !)$J &$$ U33
5#8N8N"elln4$$  & s8   A<A+A<A<A<"	A<+
A95A<8A99A<)r   peekparse_path_valueoperator
attrgetter)r   r    r!   r'   rJ   rQ   s       @@r   handle_attributerV      s}    FEQx2338DEIIKEQx3 &""4(H}	%, M	% Mr   c                    U " 5       nUS   nU(       ae  US S S:X  d	  US S S:X  a  US   US   :X  d   eUSS $ US S S:X  d	  US S S:X  a"  US   US   :X  d   eUSS R                  S	5      $  [        U5      $ US   R                  5       (       a  [        US   5      $ US   R	                  5       nUS
:X  a  gUS:X  a  g[        SU S35      e! [         a     Nf = f)Nr   r   '"r      zb'zb"zUTF-8trueTfalseFzInvalid attribute predicate: ')rP   intr   isdigitlower)r   r    rQ   r!   s       r   rS   rS      s   FE!HE!9uRayC/9a(((2;!9bq	T 19a(((2;%%g..	u: 
q				58}Qx~~6>W_
5eWA>
??  		s   .
C 
CCc                   ^ U " 5       n/ /nU/mUS   S;  a  US   R                  [        US      " X5      5         U " 5       nUS   S:X  a  U " 5       nUS   (       dF  US   S:X  a  UR                  / 5        U " 5       nO$US   S:X  a  / /nTR                  U5        U " 5       nUS   S;  a  M  US   (       d  [        S5      eU4S	 jnU$ ! [         a     M*  f = f)
Nr   )])r   /r   andorzIncomplete predicatec              3      >#    U  HJ  nU4nT H>  nU H0  n[        U5      nU H  nU" U5      nM     [        U5      nUb  M/    M7     Uv     MH     ML     g 7fr   )iterr   )	r&   r   	node_baseand_conditions	condition	subresultr'   predicate_resultor_conditionss	           r   r'    handle_predicate.<locals>.select   sf     DI"/!/I $YI"+$*9$5	 #,'9)'D$'/ "0 J #0 s   ;AA)append
operationsr   r   )r   r    ri   r'   rm   s       @r   r   r      s    FETN#$M
(*
$r!!:eAh#7#DF	FE Qx3QxQx5 %%b)qT!"$$$^4# (*
$& "/00" MG  		s   C 
CC)@ r<   r   z//[notc                   *    \ rS rSrS rSS jrS rSrg)_LookAheadTokenizer   c                     [        U5       VVs/ s H  u  p#U(       d	  U(       d  M  X#4PM     snnU l        U R                  R                  5         g s  snnf r   )path_tokenizer_tokensreverse)selfpathspecialtexts       r   __init___LookAheadTokenizer.__init__   sJ     $2$#7
#7$ WO#7

 	
s
   AAc                 F    U R                   (       a  U R                   S   $ U$ )Nr   rz   )r|   defaults     r   rR   _LookAheadTokenizer.peek  s    #'<<t||B<W<r   c                 b     U R                   R                  5       $ ! [         a    [        S ef = fr   )rz   pop
IndexErrorr   )r|   s    r   __call___LookAheadTokenizer.__call__	  s1    	*<<##%% 	*T)	*s    .r   N))NN)r   
__module____qualname____firstlineno__r   rR   r   __static_attributes__r   r   r   rv   rv      s    =*r   rv   c                     [        U 5      nU" 5       n/ n  UR                  [        US      " X5      5         U" 5       nUS   S:X  a  U" 5       nM<  ! [         a    [	        S5      ef = f! [         a     U$ f = f)Nr   zinvalid pathrc   )rv   ro   rp   r   r   )r}   _nextr    selectors       r   _build_path_iteratorr     s    %EGEH
	-OOJuQx0>?	GEQx3   	-^,,	-  	O	s   !A A+ A(+
A98A9c                 V    [        U5      n[        U 45      nU H  nU" U5      nM     U$ r   )r   rg   )r   r}   selector_chainr&   r'   s        r   iterfindr   $  s/    )$/N4']F  !Mr   c                 *    [        [        X5      5      $ r   )r   r   r   r}   s     r   
find_firstr   +  s    ht233r   c                 *    [        [        X5      5      $ r   )r   r   r   s     r   find_allr   .  s    $%%r   )__doc__rerT   compilefindallry   r   r   r   r#   r)   r0   r6   r:   rD   rV   rS   r   rp   r/   rv   r   r   r   r   r   r   r   <module>r      s    
 	 g 	2
":#L@2-b 





 
O	
* *&(4&r   