a
    4¹DfÙ  ã                   @   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   s2   t | |ƒ}|d ur*t|ƒtu r"|S |gS ndS d S )N© )ÚgetattrÚtypeÚlist)ÚnodeÚ	attr_nameÚchildr   r   úe/nfs/NAS7/SABIOD/METHODE/ermites/ermites_venv/lib/python3.9/site-packages/Cython/Compiler/TreePath.pyÚiterchildren   s    
r   c                 C   sN   z4z
| j }W n ty(   t | ƒ Y W S 0 |ƒ W S W n tyH   Y d S 0 d S ©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 ]2}|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   s   dd„ }|S )z
    /*/
    c                 s   s0   | 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   s   dd„ }|S )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    r/   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   r4   v   s
    
z*handle_descendants.<locals>.iter_recursiver   c                 3   sF   | j D ]:}t| |ƒD ]*}t|ƒˆkr*|V  ˆ |ƒD ]
}|V  q2qqd S r   r'   r1   ©r4   Z	node_namer   r   r4   ~   s    
zExpected node name after '//'c                 3   s"   | D ]}ˆ |ƒD ]
}|V  qqd S r   r   )r"   r   r
   r3   r   r   r$   ˆ   s    z"handle_descendants.<locals>.select)r   r+   r   r5   r   Úhandle_descendantsp   s    r6   c                    s†   | ƒ }|d rt dƒ‚|d }d ‰z
| ƒ }W n ty>   Y n0 |d dkrTt| ƒ‰t |¡‰ ˆd u rt‡ fdd„}n‡ ‡fdd„}|S )Nr   zExpected attribute namer   ú=c              	   3   s@   | D ]6}zˆ |ƒ}W n t y*   Y qY n0 |d ur|V  qd S r   )r   ©r"   r   Ú
attr_value)Úreadattrr   r   r$   Ÿ   s    
z handle_attribute.<locals>.selectc              	   3   sh   | D ]^}zˆ |ƒ}W n t y*   Y qY n0 |ˆkr<|V  qt|tƒrtˆtƒr|ˆ ¡ kr|V  qd S r   )r   Ú
isinstanceÚbytesÚ_unicodeÚencoder8   ©r:   Úvaluer   r   r$   ¨   s    

ÿ)r   r   Úparse_path_valueÚoperatorÚ
attrgetterr%   r   r?   r   Úhandle_attribute   s     

	rD   c                 C   sª   | ƒ }|d }|r^|d d… dks2|d d… dkr>|dd… S z
t |ƒW S  tyZ   Y qš0 n<|d  ¡ rvt |d ƒS |d  ¡ }|dkrŽdS |dkršd	S td
| ƒ‚d S )Nr   r   ú'ú"r   ÚtrueTÚfalseFz!Invalid attribute predicate: '%s')Úintr   ÚisdigitÚlower)r   r   r@   r   r   r   r   rA   ¸   s"     
rA   c                    s˜   | ƒ }g ‰ |d dkrˆˆ   t|d  | |ƒ¡ z
| ƒ }W n tyN   Y qˆY n0 |d dkrb| ƒ }|d s
|d dkr
tˆ t| |ƒƒS q
‡ fdd„}|S )Nr   ú]ú/r   Úandc                 3   s@   | D ]6}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   rS   r   r   Ì   s    

r   c                    s   ‡ ‡fdd„}|S )Nc                 3   sX   | D ]N}t |fƒ}ˆ D ]}||ƒ}qt|ƒ}t |fƒ}|d urˆ|ƒD ]
}|V  qFqd S r   rO   )r"   r   rQ   r$   rR   Zresult_node©Úlhs_selectsÚ
rhs_selectr   r   r$   ç   s    


zlogical_and.<locals>.selectr   )rY   rZ   r$   r   rX   r   rW   æ   s    
rW   )ú@Ú r0   r   z//ú[Únotc                    s¼   t dd„ t| ƒD ƒƒ‰ z
ˆ j}W n ty>   ‡ fdd„}Y n0 |ƒ }g }z| t|d  ||ƒ¡ W n ty€   tdƒ‚Y n0 z|ƒ }|d dkrœ|ƒ }W qJ ty´   Y q¸Y qJ0 qJ|S )Nc                 S   s    g | ]\}}|s|r||f‘qS r   r   )Ú.0Z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   zinvalid pathrM   )rP   Úpath_tokenizerr   r   rU   rV   r   r   )Úpathr   r   rT   r   rb   r   Ú_build_path_iterator  s(    ÿ

rf   c                 C   s(   t |ƒ}t| fƒ}|D ]}||ƒ}q|S r   )rf   rP   )r   re   Zselector_chainr"   r$   r   r   r   Úiterfind  s
    

rg   c                 C   s   t t| |ƒƒS r   )r   rg   ©r   re   r   r   r   Ú
find_first$  s    ri   c                 C   s   t t| |ƒƒS r   )r   rg   rh   r   r   r   Úfind_all'  s    rj   ) Ú__doc__Ú
__future__r   ÚrerB   ÚsysÚversion_infoÚstrr=   ÚunicodeÚcompileÚfindallrd   r   r   r   r!   r&   r,   r.   r/   r6   rD   rA   r   rW   rV   r*   rf   rg   ri   rj   r   r   r   r   Ú<module>   sH   ÿ (ú
ÿ