B
    d                 @   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 k	r*t|tkr"|S |gS ndS d S )N )getattrtypelist)node	attr_namechildr   r   e/work/yifan.wang/ringdown/master-ringdown-env/lib/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_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*   x$| D ]}t  |gd kr|V  qW d S )N)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 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"   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   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"   a   s    
zhandle_star.<locals>.selectr   )r   r   r"   r   r   r   handle_star]   s    r'   c             C   s   dd }|S )z
    /./
    c             S   s   | S )Nr   )r!   r   r   r   r"   l   s    zhandle_dot.<locals>.selectr   )r   r   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   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+   v   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+   ~   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_descendantsp   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   sl   xf| D ]^}y |}W n t k
r,   wY nX |kr>|V  qt|trttr| kr|V  qW d S )N)r   
isinstancebytes_unicodeencode)r!   r   r/   )r0   valuer   r   r"      s    
)r   r   parse_path_valueoperator
attrgetter)r   r   r   r"   r   )r0   r5   r   handle_attribute   s     

	r9   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 qX n<|d  rvt |d S |d  }|dkrdS |dkrd	S td
| d S )Nr   r   '"r   trueTfalseFz!Invalid attribute predicate: '%s')intr   isdigitlower)r   r   r5   r   r   r   r   r6      s"     r6   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   )rG   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)rD   r   )r!   r   rE   r"   rF   Zresult_node)lhs_selects
rhs_selectr   r   r"      s    



zlogical_and.<locals>.selectr   )rK   rL   r"   r   )rK   rL   r   rJ      s    
rJ   )@ 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   ).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 pathrB   )rD   path_tokenizerr   r   rH   rI   r   r   )pathr   r   rG   r   )rU   r   _build_path_iterator  s(    

rX   c             C   s,   t |}t| f}x|D ]}||}qW |S )N)rX   rD   )r   rW   Zselector_chainr!   r"   r   r   r   iterfind  s
    

rY   c             C   s   t t| |S )N)r   rY   )r   rW   r   r   r   
find_first$  s    rZ   c             C   s   t t| |S )N)r   rY   )r   rW   r   r   r   find_all'  s    r[   ) __doc__
__future__r   rer7   sysversion_infostrr3   unicodecompilefindallrV   r   r   r   r    r#   r&   r'   r(   r-   r9   r6   r   rJ   rI   r%   rX   rY   rZ   r[   r   r   r   r   <module>   sB   
 (