3
PO¦[Ž  ã               @   sÒ   d Z ddlmZ ddlZddlZej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f S d S )N)ÚgetattrÚtypeÚlist)ÚnodeÚ	attr_nameÚchild© r	   úh/home/psgendb/BIRCHDEV/lib-linux-x86_64/python/lib64/python3.6/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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 )Nr   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j|ƒ‰ ˆ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 jƒ rvt |d ƒS |d jƒ }|dkrŽdS |dkršdS td	| ƒ‚d S )Nr   r   ú'ú"ÚtrueTÚfalseFz!Invalid attribute predicate: '%s'r   )Úintr   ÚisdigitÚlower)r   r   r0   r   r	   r	   r
   r1   ­   s"     r1   c                sž   | ƒ }g ‰ x‚|d dkrŒˆ j t|d  | |ƒƒ y
| ƒ }W n tk
rP   P Y nX |d dkrd| ƒ }|d  r|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	   )rB   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!   rA   Zresult_node)Úlhs_selectsÚ
rhs_selectr	   r
   r!   Ü   s    



zlogical_and.<locals>.selectr	   )rF   rG   r!   r	   )rF   rG   r
   rE   Û   s    
rE   )ú@Ú 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|j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	   )Ú.0Ú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   rC   rD   r   r   )Úpathr   r   rB   r	   )rP   r
   Ú_build_path_iteratorö   s(    

rS   c             C   s,   t |ƒ}t| fƒ}x|D ]}||ƒ}qW |S )N)rS   r?   )r   rR   Zselector_chainr    r!   r	   r	   r
   Úiterfind  s
    

rT   c             C   s   t t| |ƒƒS )N)r   rT   )r   rR   r	   r	   r
   Ú
find_first  s    rU   c             C   s   t t| |ƒƒS )N)r   rT   )r   rR   r	   r	   r
   Úfind_all  s    rV   )Ú__doc__Ú
__future__r   Úrer2   ÚcompileÚfindallrQ   r   r   r   r   r"   r%   r&   r'   r,   r4   r1   r   rE   rD   r$   rS   rT   rU   rV   r	   r	   r	   r
   Ú<module>   s:   
 #