o
    Ni                     @   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   s,   t | |}|d urt|tu r|S |gS dS )N )getattrtypelist)node	attr_namechildr   r   L/home/ubuntu/.local/lib/python3.10/site-packages/Cython/Compiler/TreePath.pyiterchildren   s   
r
   c                 C   s    zt | W S  ty   Y d S w 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 u 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 v rt   | |S  fdd}|S )z)
    /NodeName/
    or
    func(...)
    r   c                 3   s>    | D ]}|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      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   r*   )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   s6    | j D ]}t| |D ]}|V   |E d H  qqd S r   r+   r   r   r   iter_recursiver   r	   r1   i   s   
z*handle_descendants.<locals>.iter_recursiver   c                 3   sB    | j D ]}t| |D ]}t|kr|V   |E d H  qqd S r   r$   r/   r1   	node_namer   r	   r1   p   s   
zExpected node name after '//'c                 3   s    | D ]	} |E d H  qd S r   r   r   r0   r   r	   r!   y   s   z"handle_descendants.<locals>.select)r   r(   r   r2   r	   handle_descendantsc   s   r4   c                    sx   |  }|d rt d|d }d |  }|d dkr"|   t| t| d u r3 fdd}|S  fdd}|S )Nr   zExpected attribute namer   =c              	   3   s>    | D ]}z |}W n	 t y   Y qw |d ur|V  qd S r   )AttributeErrorr   r   
attr_value)readattrr   r	   r!      s   z handle_attribute.<locals>.selectc              	   3   sf    | D ]-}z |}W n	 t y   Y qw |kr|V  qt|tr0ttr0| kr0|V  qd S r   )r6   
isinstancebytesstrencoder7   r9   valuer   r	   r!      s   )r   peekparse_path_valueoperator
attrgetterr"   r   r>   r	   handle_attribute   s   
rD   c                 C   s  |  }|d }|r[|d d dks|d d dkr)|d |d ks#J |dd S |d d dks9|d d dkrL|d |d ksCJ |dd  d	S zt|W S  tyZ   Y nw |d  rgt|d S |d  }|d
krsdS |dkrydS td| d)Nr   r   '"r      zb'zb"zUTF-8trueTfalseFzInvalid attribute predicate: ')r=   intr   isdigitlower)r   r   r?   r   r   r   r	   rA      s,     
rA   c                    s   |  }g g}|g |d dvr_|d  t|d  | | z|  }W n	 ty+   Y n4w |d dkr5|  }|d sY|d dkrH| g  |  }n|d dkrYg g}  | |  }|d dvs|d sgtd fd	d
}|S )Nr   )])r   /r   andorzIncomplete predicatec                 3   sb    | D ]+}|f} D ]#}|D ]}t |}|D ]}||}qt|}|d u r' nq|V   nq
qd S r   )iterr   )r   r   	node_baseand_conditions	condition	subresultr!   predicate_resultor_conditionsr   r	   r!      s"   
z handle_predicate.<locals>.select)append
operationsr   r   )r   r   rT   r!   r   rX   r	   r      s2   


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   )rf   )rh   defaultr   r   r	   r@     s   z_LookAheadTokenizer.peekc                 C   s"   z| j  W S  ty   td w r   )rf   pop
IndexErrorr   )rh   r   r   r	   __call__	  s
   z_LookAheadTokenizer.__call__N)rk   )r   
__module____qualname__rj   r@   ro   r   r   r   r	   r`      s    
r`   c                 C   s|   t | }| }g }	 z|t|d  || W n ty#   tdw z| }|d dkr1| }W n
 ty<   Y |S w q
)Nr   r   zinvalid pathrO   )r`   rZ   r[   r   r   )ri   _nextr   selectorr   r   r	   _build_path_iterator  s&   rt   c                 C   s(   t |}t| f}|D ]}||}q|S r   )rt   rR   )r   ri   selector_chainr   r!   r   r   r	   iterfind$  s
   

rv   c                 C      t t| |S r   )r   rv   r   ri   r   r   r	   
find_first+     ry   c                 C   rw   r   )r   rv   rx   r   r   r	   find_all.  rz   r{   )__doc__rerB   compilefindallre   r
   r   r   r   r#   r)   r,   r-   r4   rD   rA   r   r[   r'   r`   rt   rv   ry   r{   r   r   r   r	   <module>   sD    		
&1
