B
    ž†\Ž  ã               @   sÒ   d Z ddlmZ ddlZddl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_importNzD('[^']*'|\"[^\"]*\"|//?|\(\)|==?|[/.*\[\]()@])|([^/\[\]()@=\s]+)|\s+c             C   s2   t | |ƒ}|d k	r*t|ƒtkr"|S |gS ndS d S )N© )ÚgetattrÚtypeÚlist)ÚnodeÚ	attr_nameÚchildr   r   ú7lib/python3.7/site-packages/Cython/Compiler/TreePath.pyÚiterchildren   s    
r   c             C   sH   y.y
| j }W n tk
r$   t | ƒS X |ƒ S W n tk
rB   d S X 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_name/   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_func2   s    
r   c                s   t | |ƒ\}‰ ‡ fdd„}|S )z
    not(...)
    c             3   s*   x$| D ]}t ˆ |gƒƒd kr|V  qW d S )N)r   )Úresultr   )r   r   r
   Úselect@   s    
zhandle_func_not.<locals>.select)r   )r   r   r   r!   r   )r   r
   Úhandle_func_not:   s    r"   c                s.   |d ‰ ˆ t krt ˆ  | |ƒS ‡ fdd„}|S )z)
    /NodeName/
    or
    func(...)
    r   c             3   sH   xB| D ]:}x4|j D ]*}x$t||ƒD ]}t|ƒˆ kr"|V  q"W qW qW d S )N)Úchild_attrsr   r   )r    r   r   r	   )r   r   r
   r!   O   s
    
zhandle_name.<locals>.select)Ú	functions)r   r   r!   r   )r   r
   Úhandle_nameF   s
    r%   c             C   s   dd„ }|S )z
    /*/
    c             s   s<   x6| D ].}x(|j D ]}xt||ƒD ]
}|V  q"W qW qW d S )N)r#   r   )r    r   r   r	   r   r   r
   r!   [   s    
zhandle_star.<locals>.selectr   )r   r   r!   r   r   r
   Úhandle_starW   s    r&   c             C   s   dd„ }|S )z
    /./
    c             S   s   | S )Nr   )r    r   r   r
   r!   f   s    zhandle_dot.<locals>.selectr   )r   r   r!   r   r   r
   Ú
handle_dotb   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   sF   x@| j D ]6}x0t| |ƒD ]"}|V  xˆ |ƒD ]
}|V  q,W qW qW d S )N)r#   r   )r   r   r	   Úc)Úiter_recursiver   r
   r*   p   s
    z*handle_descendants.<locals>.iter_recursiver   c             3   sR   xL| j D ]B}x<t| |ƒD ].}t|ƒˆkr.|V  xˆ |ƒD ]
}|V  q8W qW qW d S )N)r#   r   r   )r   r   r	   r)   )r*   Ú	node_namer   r
   r*   x   s    zExpected node name after '//'c             3   s*   x$| D ]}xˆ |ƒD ]
}|V  qW qW d S )Nr   )r    r   r	   )r*   r   r
   r!   ‚   s    
z"handle_descendants.<locals>.select)r   )r   r   r!   r   )r*   r+   r
   Úhandle_descendantsj   s    r,   c                sˆ   | ƒ }|d rt dƒ‚|d }d ‰y
| ƒ }W n tk
r@   Y nX |d dkrVt| ƒ‰t |¡‰ ˆd krv‡ fdd„}n‡ ‡fdd„}|S )Nr   zExpected attribute namer   ú=c          	   3   sD   x>| D ]6}yˆ |ƒ}W n t k
r,   wY nX |d k	r|V  qW d S )N)r   )r    r   Ú
attr_value)Úreadattrr   r
   r!   ™   s    
z handle_attribute.<locals>.selectc          	   3   sD   x>| D ]6}yˆ |ƒ}W n t k
r,   wY nX |ˆkr|V  qW d S )N)r   )r    r   r.   )r/   Úvaluer   r
   r!   ¢   s    
)r   r   Úparse_path_valueÚoperatorÚ
attrgetter)r   r   r   r!   r   )r/   r0   r
   Úhandle_attributeŠ   s     

	r4   c             C   sª   | ƒ }|d }|r^|d d… dks2|d d… dkr>|dd… S yt |ƒS  tk
rZ   Y qšX n<|d  ¡ rvt |d ƒS |d  ¡ }|dkrŽdS |dkršd	S td
| ƒ‚d S )Nr   r   ú'ú"r   ÚtrueTZfalseFz!Invalid attribute predicate: '%s')Úintr   ÚisdigitÚlower)r   r   r0   r   r   r   r
   r1   ­   s"     r1   c                sœ   | ƒ }g ‰ x€|d dkrŠˆ   t|d  | |ƒ¡ y
| ƒ }W n tk
rP   P Y nX |d dkrd| ƒ }|d s|d dkrtˆ t| |ƒƒS qW ‡ fdd„}|S )Nr   ú]ú/r   Úandc             3   sH   xB| D ]:}t |fƒ}xˆ D ]}||ƒ}qW t|ƒ}|d k	r|V  qW d S )N)Úiterr   )r    r   Ú	subresultr!   Úpredicate_result)Úselectorr   r
   r!   Ñ   s    


z handle_predicate.<locals>.select)ÚappendÚ
operationsr   Úlogical_andr   )r   r   r!   r   )rA   r
   r   Á   s    
r   c                s   ‡ ‡fdd„}|S )Nc             3   sd   x^| D ]V}t |fƒ}xˆ D ]}||ƒ}qW t|ƒ}t |fƒ}|d k	rxˆ|ƒD ]
}|V  qNW qW d S )N)r>   r   )r    r   r?   r!   r@   Zresult_node)Úlhs_selectsÚ
rhs_selectr   r
   r!   Ü   s    



zlogical_and.<locals>.selectr   )rE   rF   r!   r   )rE   rF   r
   rD   Û   s    
rD   )ú@Ú r(   r   z//ú[Únotc                sÄ   t dd„ t| ƒD ƒƒ‰ y
ˆ j}W n  tk
r@   ‡ fdd„}Y nX |ƒ }g }xry| t|d  ||ƒ¡ W n tk
r†   tdƒ‚Y nX y|ƒ }|d dkr¢|ƒ }W qN tk
rº   P Y qNX qNW |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 )N)r   r   )Ústreamr   r
   r   ÿ   s    z#_build_path_iterator.<locals>._nextr   zinvalid pathr<   )r>   Úpath_tokenizerr   r   rB   rC   r   r   )Úpathr   r   rA   r   )rN   r
   Ú_build_path_iteratorö   s(    

rQ   c             C   s,   t |ƒ}t| fƒ}x|D ]}||ƒ}qW |S )N)rQ   r>   )r   rP   Zselector_chainr    r!   r   r   r
   Úiterfind  s
    

rR   c             C   s   t t| |ƒƒS )N)r   rR   )r   rP   r   r   r
   Ú
find_first  s    rS   c             C   s   t t| |ƒƒS )N)r   rR   )r   rP   r   r   r
   Úfind_all  s    rT   )Ú__doc__Z
__future__r   Úrer2   ÚcompileÚfindallrO   r   r   r   r   r"   r%   r&   r'   r,   r4   r1   r   rD   rC   r$   rQ   rR   rS   rT   r   r   r   r
   Ú<module>   s:   
 #