o
    f                     @   s   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
djZdd Zdd	 Zd
d Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zeeeeeed Zd!eiZd"d# Zd$d% Zd&d' Zd(d) ZdS )*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                 C   s,   t | |}|d urt|tu r|S |gS dS )N )getattrtypelist)node	attr_namechildr   r   T/var/www/html/mig_web/myenv/lib/python3.10/site-packages/Cython/Compiler/TreePath.pyiterchildren   s   
r   c                 C   sD   zz| j }W | W S  ty   t |  Y W S w  ty!   Y d S w N)nextAttributeErrorStopIteration)it_nextr   r   r   _get_first_or_none*   s   r   c                 C   s   | j jdd S )N.)	__class____name__split)r   r   r   r   	type_name5   s   r   c                 C   s8   |d }|  }|d dkrt d| t| |}||fS )N   r   (z%Expected '(' after function name '%s')
ValueErrorhandle_predicate)r   tokenname	predicater   r   r   
parse_func8   s   
r!   c                    s   t | |\}  fdd}|S )z
    not(...)
    c                 3   s(    | D ]}t  |gd u r|V  qd S r   )r   )resultr   r    r   r   selectF   s   zhandle_func_not.<locals>.select)r!   r   r   r   r$   r   r#   r   handle_func_not@   s   r&   c                    s.   |d   t v rt   | |S  fdd}|S )z)
    /NodeName/
    or
    func(...)
    r   c                 3   s>    | D ]}|j D ]}t||D ]}t| kr|V  qqqd S r   child_attrsr   r   )r"   r   r	   r
   r   r   r   r$   U   s   
zhandle_name.<locals>.select)	functionsr   r   r$   r   r)   r   handle_nameL   s
   r,   c                 C      dd }|S )z
    /*/
    c                 s   s2    | D ]}|j D ]}t||D ]}|V  qqqd S r   r(   r   )r"   r   r   r
   r   r   r   r$   a   s   
zhandle_star.<locals>.selectr   r+   r   r   r   handle_star]   s   r/   c                 C   r-   )z
    /./
    c                 S   s   | S r   r   )r"   r   r   r   r$   l   s   zhandle_dot.<locals>.selectr   r+   r   r   r   
handle_doth   s   r0   c                    sX   |  }|d dkr fdd n|d s |d  fdd nt d fdd	}|S )
z
    //...
    r   *c                 3   s<    | j D ]}t| |D ]}|V   |D ]}|V  qqqd S r   r.   r   r   r
   citer_recursiver   r   r5   v   s   
z*handle_descendants.<locals>.iter_recursiver   c                 3   sH    | j D ]}t| |D ]}t|kr|V   |D ]}|V  qqqd S r   r'   r2   r5   	node_namer   r   r5   ~   s   
zExpected node name after '//'c                 3   s$    | D ]} |D ]}|V  q	qd S r   r   )r"   r   r
   r4   r   r   r$      s   z"handle_descendants.<locals>.select)r   r+   r   r6   r   handle_descendantsp   s   r8   c                    s   |  }|d rt d|d }d z|  }W n	 ty   Y nw |d dkr*t| t| d u r; fdd}|S  fdd}|S )Nr   zExpected attribute namer   =c              	   3   s>    | D ]}z |}W n	 t y   Y qw |d ur|V  qd S r   )r   r"   r   
attr_value)readattrr   r   r$      s   z handle_attribute.<locals>.selectc              	   3   sf    | D ]-}z |}W n	 t y   Y qw |kr|V  qt|tr0ttr0| kr0|V  qd S r   )r   
isinstancebytes_unicodeencoder:   r<   valuer   r   r$      s   )r   r   parse_path_valueoperator
attrgetterr%   r   rA   r   handle_attribute   s$   

rF   c                 C   s   |  }|d }|r.|d d dks|d d dkr|dd S zt |W S  ty-   Y nw |d  r:t |d S |d  }|dkrFdS |dkrLd	S td
| )Nr   r   '"r   trueTfalseFz!Invalid attribute predicate: '%s')intr   isdigitlower)r   r   rB   r   r   r   r   rC      s$    
rC   c                    s   |  }g  |d dkrG  t|d  | | z|  }W n	 ty%   Y n"w |d dkr/|  }|d sA|d dkrAt t| |S |d dks fdd}|S )Nr   ]/r   andc                 3   sB    | D ]}t |f} D ]}||}qt|}|d ur|V  qd S r   iterr   )r"   r   	subresultr$   predicate_resultselectorr   r   r$      s   

z handle_predicate.<locals>.select)append
operationsr   logical_andr   r+   r   rU   r   r      s    
r   c                    s    fdd}|S )Nc                 3   sZ    | D ]'}t |f} D ]}||}qt|}t |f}|d ur*|D ]}|V  q$qd S r   rQ   )r"   r   rS   r$   rT   result_nodelhs_selects
rhs_selectr   r   r$      s   


zlogical_and.<locals>.selectr   )r\   r]   r$   r   r[   r   rY      s   
rY   )@ r1   r   z//[notc                    s   t dd t| D  z j}W n ty    fdd}Y nw | }g }	 z|t|d  || W n ty?   tdw z| }|d dkrM| }W n
 tyX   Y |S w q&)	Nc                 S   s    g | ]\}}|s
|r||fqS r   r   ).0specialtextr   r   r   
<listcomp>  s    z(_build_path_iterator.<locals>.<listcomp>c                      s   t  S r   )r   r   streamr   r   r   
  s   z#_build_path_iterator.<locals>._nextr   r   zinvalid pathrO   )rR   path_tokenizerr   r   rW   rX   r   r   )pathr   r   rV   r   rf   r   _build_path_iterator  s4   
rj   c                 C   s(   t |}t| f}|D ]}||}q|S r   )rj   rR   )r   ri   selector_chainr"   r$   r   r   r   iterfind  s
   

rl   c                 C      t t| |S r   )r   rl   r   ri   r   r   r   
find_first$     ro   c                 C   rm   r   )r   rl   rn   r   r   r   find_all'  rp   rq   ) __doc__
__future__r   rerD   sysversion_infostrr?   unicodecompilefindallrh   r   r   r   r!   r&   r,   r/   r0   r8   rF   rC   r   rY   rX   r*   rj   rl   ro   rq   r   r   r   r   <module>   sN    	 (
