3
T]                 @   sj   d dl mZmZmZ d dlmZ d dlZd dlmZ ddl	m
Z
 ddlmZ ejd	Zd
d ZeeZdS )    )absolute_importdivisionunicode_literals)OrderedDictN)string_types   )base   )moduleFactoryFactoryz{([^}]*)}(.*)c                s,   | }|j dj G  fdddtj}t S )Nasdc                   s4   e Zd ZdZ fddZdd Zdd Zdd	 Zd
S )z#getETreeBuilder.<locals>.TreeWalkera  Given the particular ElementTree representation, this implementation,
        to avoid using recursion, returns "nodes" as tuples with the following
        content:

        1. The current element

        2. The index of the element relative to its parent

        3. A stack of ancestor elements

        4. A flag "text", "tail" or None to indicate if the current node is a
           text node; either the text or tail of the current element (1)
        c                sL  t |tr2|\}}}}|dkr.tjt||fS |}t|dsD|j }|jdkrVtjfS |jdkr|tj	|j
|jd|jdfS |j krtj|j
fS t |jtstt|jtj|j}|r|j \}}n
d }|j}t }xPt|jj D ]>\}	}
tj|	}|r|
||jd	|jd
f< q|
|d |	f< qW tj|||t|pD|j
fS d S )NtexttailtagDOCUMENT_ROOTDOCUMENT_FRAGMENTz
<!DOCTYPE>publicIdsystemIdr   r	   )r   r   )r   r   )
isinstancetupler   ZTEXTgetattrhasattrgetrootr   ZDOCUMENTZDOCTYPEr   getCOMMENTr   AssertionErrortype
tag_regexpmatchgroupsr   listattribitemsgroupZELEMENTlen)selfnodeelt_flagr   	namespacer   attrsnamevalue)ElementTreeCommentType G/tmp/pip-install-_1y4nff5/pip/pip/_vendor/html5lib/treewalkers/etree.pygetNodeDetails    s8    





z2getETreeBuilder.<locals>.TreeWalker.getNodeDetailsc             S   st   t |tr|\}}}}n|d g d f\}}}}|dkr8d S |jrJ|||dfS t|rl|j| |d d|d fS d S d S )Nr   r   r   )r   r   )r   r   r   r#   append)r$   r%   elementkeyparentsr(   r.   r.   r/   getFirstChildH   s    

z1getETreeBuilder.<locals>.TreeWalker.getFirstChildc             S   s   t |tr|\}}}}nd S |dkrLt|rF|j| |d d|d fS d S nN|jrf|dkrf|||dfS |t|d d k r|d |d  |d |d fS d S d S )Nr   r   r   r   r6   )r   r   r#   r1   r   )r$   r%   r2   r3   r4   r(   r.   r.   r/   getNextSiblingY   s    

z2getETreeBuilder.<locals>.TreeWalker.getNextSiblingc             S   s   t |tr|\}}}}nd S |dkr:|s,|S |||d fS nD|j }|sJ|S t|d j|dksdt|t|d j||d fS d S )Nr   r   r6   r6   )r   r   popr   countr   index)r$   r%   r2   r3   r4   r(   parentr.   r.   r/   getParentNodem   s    
z1getETreeBuilder.<locals>.TreeWalker.getParentNodeN)__name__
__module____qualname____doc__r0   r5   r7   r<   r.   )r-   r.   r/   
TreeWalker   s
   (rA   )Commentr   r   ZNonRecursiveTreeWalkerlocals)ElementTreeImplementationElementTreerA   r.   )r-   r/   getETreeBuilder   s    nrF   )
__future__r   r   r   collectionsr   repip._vendor.sixr    r   _utilsr
   compiler   rF   getETreeModuler.   r.   r.   r/   <module>   s   
t