U
    {h                     @   s   d 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eeeeeedZde
iZG dd d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.
    NzH(b?'[^']*'|b?\"[^\"]*\"|//?|\(\)|==?|[/.*\[\]()@])|([^/\[\]()@=\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   </tmp/pip-unpacked-wheel-fhl22ezh/Cython/Compiler/TreePath.pyiterchildren   s    
r
   c                 C   s&   z
t | W S  tk
r    Y d S X d S N)nextStopIteration)itr   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_func,   s    
r   c                    s   t | |\}  fdd}|S )z
    not(...)
    c                 3   s&   | D ]}t  |gd kr|V  qd S r   )r   resultr   r   r   r	   select:   s    zhandle_func_not.<locals>.select)r   r   r   r   r!   r   r    r	   handle_func_not4   s    r#   c                    s.   |d   t k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!   I   s
    
zhandle_name.<locals>.select)	functionsr   r   r!   r   r&   r	   handle_name@   s
    r)   c                 C   s   dd }|S )z
    /*/
    c                 s   s*   | D ] }|j D ]}t||E d H  qqd S r   r%   r
   )r   r   r   r   r   r	   r!   U   s    
zhandle_star.<locals>.selectr   r(   r   r   r	   handle_starQ   s    r+   c                 C   s   dd }|S )z
    /./
    c                 S   s   | S r   r   )r   r   r   r	   r!   _   s    zhandle_dot.<locals>.selectr   r(   r   r   r	   
handle_dot[   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   s4   | j D ](}t| |D ]}|V   |E d H  qqd S r   r*   r   r   r   iter_recursiver   r	   r0   i   s    
z*handle_descendants.<locals>.iter_recursiver   c                 3   s@   | j D ]4}t| |D ]$}t|kr*|V   |E d H  qqd S r   r$   r.   r0   Z	node_namer   r	   r0   p   s
    
zExpected node name after '//'c                 3   s   | D ]} |E d H  qd S r   r   r   r/   r   r	   r!   y   s    z"handle_descendants.<locals>.select)r   r(   r   r1   r	   handle_descendantsc   s    r2   c                    sv   |  }|d rt d|d }d |  }|d dkrD|   t| t| d krd fdd}n fdd}|S )Nr   zExpected attribute namer   =c              	   3   sB   | D ]8}z |}W n t k
r,   Y qY nX |d k	r|V  qd S r   )AttributeErrorr   r   
attr_value)readattrr   r	   r!      s    
z handle_attribute.<locals>.selectc              	   3   sj   | D ]`}z |}W n t k
r,   Y qY nX |kr>|V  qt|trttr| kr|V  qd S r   )r4   
isinstancebytesstrencoder5   r7   valuer   r	   r!      s    

)r   peekparse_path_valueoperator
attrgetterr"   r   r<   r	   handle_attribute   s    
	rB   c                 C   s
  |  }|d }|r|d d dks2|d d dkrR|d |d ksFt |dd S |d d dksr|d d dkr|d |d kst |dd d	S z
t|W S  tk
r   Y qX n<|d  rt|d S |d  }|d
krdS |dkrdS td| dd S )Nr   r   '"r      zb'zb"zUTF-8trueTfalseFzInvalid attribute predicate: ')AssertionErrorr;   intr   isdigitlower)r   r   r=   r   r   r   r	   r?      s*      
r?   c                    s   |  }g g}|g |d dkr|d  t|d  | | z
|  }W n tk
r\   Y qY nX |d dkrp|  }|d s|d dkr| g  |  }q|d dkrg g}  | |  }q|d std fd	d
}|S )Nr   )])r   /r   andorzIncomplete predicatec                 3   s`   | D ]V}|f} D ]F}|D ]2}t |}|D ]}||}q*t|}|d kr qq|V   qqqd S r   )iterr   )r   r   Z	node_baseand_conditions	conditionZ	subresultr!   Zpredicate_resultZor_conditionsr   r	   r!      s    
z handle_predicate.<locals>.select)append
operationsr   r   )r   r   rR   r!   r   rT   r	   r      s.    



r   )@ r-   r   z//[notc                   @   s&   e Zd Zdd Zd	ddZdd ZdS )
_LookAheadTokenizerc                 C   s"   dd t |D | _| j  d S )Nc                 S   s    g | ]\}}|s|r||fqS r   r   ).0specialtextr   r   r	   
<listcomp>   s    z0_LookAheadTokenizer.__init__.<locals>.<listcomp>)path_tokenizer_tokensreverse)selfpathr   r   r	   __init__   s    z_LookAheadTokenizer.__init__NNc                 C   s   | j r| j d S |S )Nr   )ra   )rc   defaultr   r   r	   r>     s    z_LookAheadTokenizer.peekc                 C   s,   z| j  W S  tk
r&   td Y nX d S r   )ra   pop
IndexErrorr   )rc   r   r   r	   __call__	  s    z_LookAheadTokenizer.__call__N)rf   )r   
__module____qualname__re   r>   rj   r   r   r   r	   r[      s   
r[   c                 C   s   t | }| }g }z|t|d  || W n tk
rJ   tdY nX z| }|d dkrf| }W q tk
r   Y qY qX q|S )Nr   zinvalid pathrN   )r[   rU   rV   r   r   )rd   _nextr   selectorr   r   r	   _build_path_iterator  s    
ro   c                 C   s(   t |}t| f}|D ]}||}q|S r   )ro   rQ   )r   rd   Zselector_chainr   r!   r   r   r	   iterfind$  s
    

rp   c                 C   s   t t| |S r   )r   rp   r   rd   r   r   r	   
find_first+  s    rr   c                 C   s   t t| |S r   )r   rp   rq   r   r   r	   find_all.  s    rs   )__doc__rer@   compilefindallr`   r
   r   r   r   r#   r)   r+   r,   r2   rB   r?   r   rV   r'   r[   ro   rp   rr   rs   r   r   r   r	   <module>   s@   	
&1
 