
    Ae                        d Z ddlmZ ddlZddlZddlZej                  d   dk\  reZne	Z ej                  d      j                  Zd Zd Zd Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd ZeeeeeedZdeiZd Zd Zd Zd Zy)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.
    )absolute_importN   zD('[^']*'|\"[^\"]*\"|//?|\(\)|==?|[/.*\[\]()@])|([^/\[\]()@=\s]+)|\s+c                 L    t        | |      }|t        |      t        u r|S |gS y)N )getattrtypelist)node	attr_namechilds      8lib/python3.12/site-packages/Cython/Compiler/TreePath.pyiterchildrenr      s/    D)$E;$L7N    c                 ~    	 	 | j                   } |       S # t        $ r t        |       cY S w xY w# t        $ r Y y w xY wN)nextAttributeErrorStopIteration)it_nexts     r   _get_first_or_noner   *   sK    	GGE 7N  	8O	  s     0 -0 -0 	<<c                 R    | j                   j                  j                  d      d   S )N.)	__class____name__split)r
   s    r   	type_namer   5   s"    >>""((-b11r   c                 f    |d   } |        }|d   dk7  rt        d|z        t        | |      }||fS )N   r   (z%Expected '(' after function name '%s')
ValueErrorhandle_predicate)r   tokenname	predicates       r   
parse_funcr'   8   sD    8DFEQx3@4GHH u-I?r   c                 0    t        | |      \  }fd}|S )z
    not(...)
    c              3   J   K   | D ]  }t         |g            |  y wr   )r   )resultr
   r&   s     r   selectzhandle_func_not.<locals>.selectF   s-      	D!)TF"34<
	s   ##)r'   )r   r$   r%   r+   r&   s       @r   handle_func_notr,   @   s!     !u-OD) Mr   c                 J    |d   t         v rt           | |      S fd}|S )z)
    /NodeName/
    or
    func(...)
    r    c              3      K   | D ]7  }|j                   D ]&  }t        ||      D ]  }t        |      k(  s|  ( 9 y wr   child_attrsr   r   )r*   r
   r   r   r%   s       r   r+   zhandle_name.<locals>.selectU   sS      	$D!-- $	)$	: $E '4/#$$	$s
   2AA)	functions)r   r$   r+   r%   s      @r   handle_namer2   L   s3     8DytU++$ Mr   c                     d }|S )z
    /*/
    c              3   f   K   | D ](  }|j                   D ]  }t        ||      D ]  }|   * y wr   r0   r   )r*   r
   r%   r   s       r   r+   zhandle_star.<locals>.selecta   sE      	 D((  )$5  EK  	 s   /1r   r   r$   r+   s      r   handle_starr7   ]   s     
 Mr   c                     d }|S )z
    /./
    c                     | S r   r   )r*   s    r   r+   zhandle_dot.<locals>.selectl   s    r   r   r6   s      r   
handle_dotr:   h   s    Mr   c                 v     |        }|d   dk(  rfdn|d   s|d   fdnt        d      fd}|S )z
    //...
    r   *c              3   |   K   | j                   D ](  }t        | |      D ]  }|  |      D ]  }|   * y wr   r5   )r
   r%   r   citer_recursives       r   r?   z*handle_descendants.<locals>.iter_recursivev   sP     ((  )$5  EK+E2     s   9<r    c              3      K   | j                   D ]6  }t        | |      D ]%  }t        |      k(  r|  |      D ]  }|  ' 8 y wr   r/   )r
   r%   r   r>   r?   	node_names       r   r?   z*handle_descendants.<locals>.iter_recursive~   s]     ((  )$5  E '94#+E2     s   AA
zExpected node name after '//'c              3   >   K   | D ]  } |      D ]  }|   y wr   r   )r*   r
   r   r?   s      r   r+   z"handle_descendants.<locals>.select   s/      	D'- 	s   )r"   )r   r$   r+   r?   rA   s      @@r   handle_descendantsrC   p   sM     FEQx3	  1X!H		  899
 Mr   c                      |        }|d   rt        d      |d   }d 	  |        }|d   dk(  rt        |       	 t        j                  |      fd}|S fd}|S # t        $ r Y 1w xY w)Nr   zExpected attribute namer    =c              3   Z   K   | D ]  }	  |      }||  y # t         $ r Y !w xY wwr   )r   )r*   r
   
attr_valuereadattrs      r   r+   z handle_attribute.<locals>.select   sE      %!)$J )$$% & s    +++	(+(+c              3      K   | D ]O  }	  |      }|k(  r| t        |t              s't        t              s8|j	                         k(  sL| Q y # t         $ r Y ^w xY wwr   )r   
isinstancebytes_unicodeencode)r*   r
   rG   rH   values      r   r+   z handle_attribute.<locals>.select   sn      
%!)$J &$$ U3
5(8S"elln4$$
% & s7   A(AA(A(A(A(	A%"A($A%%A()r"   parse_path_valuer   operator
attrgetter)r   r$   r%   r+   rH   rN   s       @@r   handle_attributerR      s    FEQx2338DE+ 8s?$T*E""4(H}	%, M	% M;  s   A# #	A/.A/c                     |        }|d   }|r!|d d dk(  s|d d dk(  r|dd S 	 t        |      S |d   j                         rt        |d         S |d   j                         }|dk(  ry|dk(  ry	t        d
|z        # t        $ r Y w xY w)Nr   r    '"r   trueTfalseFz!Invalid attribute predicate: '%s')intr"   isdigitlower)r   r$   rN   r%   s       r   rO   rO      s    FE!HE!9uRayC/2;	u: 
q			58}Qx~~6>W_
85@
AA  		s   
A> >	B
	B
c                     |        }g |d   dk7  rej                  t        |d      | |             	  |        }|d   dk(  r |        }	 |d   s|d   dk(  rt        t	        | |            S |d   dk7  refd}|S # t        $ r Y w xY w)Nr   ]/r    andc              3   v   K   | D ]/  }t        |f      }D ]
  } ||      } t        |      }|,| 1 y wr   iterr   )r*   r
   	subresultr+   predicate_resultselectors        r   r+   z handle_predicate.<locals>.select   sP      	DdWI" ."9-	.1)<+
	s   .99)append
operationsr   logical_andr#   )r   r$   r+   rd   s      @r   r#   r#      s    FEH
(c/E!H-dE:<	FE Qx3QxE!H-x)9$)FGG (c/ M#  		s   A? ?	B
Bc                       fd}|S )Nc              3      K   | D ]H  }t        |f      }D ]
  } ||      } t        |      }t        |f      }|8 |      D ]  }|  J y wr   r`   )r*   r
   rb   r+   rc   result_nodelhs_selects
rhs_selects         r   r+   zlogical_and.<locals>.select   so      	DdWI% ."9-	.1)<dWI+#-i#8 KJ	s
   :AAr   )rk   rl   r+   s   `` r   rg   rg      s    	 Mr   )@ r<   r   z//[notc                    t        t        |       D cg c]  \  }}|s|r||f c}}      	 j                  } |       }g }	 	 |j	                  t        |d      ||             	  |       }|d   dk(  r |       }:c c}}w # t        $ r fd}Y Zw xY w# t        $ r t        d      w xY w# t        $ r Y |S w xY w)Nc                      t               S r   )r   )streams   r   r   z#_build_path_iterator.<locals>._next
  s    <r   r   zinvalid pathr]   )ra   path_tokenizerr   r   re   rf   r   r"   )pathspecialtextr   r$   rd   rs   s         @r   _build_path_iteratorrx     s    *8*>)&$ TN ) *F 
 GEH
	-OOJuQx0>?	GEQx3 )
   	    	-^,,	-  	O	s4   B 
B !B )B2 BBB/2	B?>B?c                 R    t        |      }t        | f      }|D ]
  } ||      } |S r   )rx   ra   )r
   ru   selector_chainr*   r+   s        r   iterfindr{     s4    )$/N4']F    Mr   c                 ,    t        t        | |            S r   )r   r{   r
   ru   s     r   
find_firstr~   $  s    htT233r   c                 ,    t        t        | |            S r   )r	   r{   r}   s     r   find_allr   '  s    t$%%r   ) __doc__
__future__r   rerP   sysversion_infostrrL   unicodecompilefindallrt   r   r   r   r'   r,   r2   r7   r:   rC   rR   rO   r#   rg   rf   r1   rx   r{   r~   r   r   r   r   <module>r      s    ' 	  
A!HH	 g 		2
"	@%PB(4 





 
O	84&r   