3 �PfL�@s�ddlmZmZmZyddlmZWn>ek rbyddlmZWnek r\eZYnXYnXddl Z ddl m Z ddl m Z ddlmZe jd �Zd d �Zee�ZdS) �)�absolute_import�division�unicode_literals)� OrderedDictN)� string_types�)�base�)�moduleFactoryFactoryz {([^}]*)}(.*)cs,|}|jd�j�G�fdd�dtj�}t�S)NZasdcs4eZdZdZ�fdd�Zdd�Zdd�Zdd �Zd S) z#getETreeBuilder..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 sLt|t�r2|\}}}}|d kr.tjt||�fS|}t|d�sD|j�}|jd krVtjfS|jdkr|tj |j |j d�|j d�fS|j�kr�tj |j fSt|jt �s�tt|j���tj|j�}|r�|j�\}}n d}|j}t�}xPt|jj��D]>\} } tj| �}|�r| ||jd �|jd �f<q�| |d| f<q�Wtj|||t|��pD|j fSdS) N�text�tail�tag� DOCUMENT_ROOT�DOCUMENT_FRAGMENTz ZpublicIdZsystemIdrr )r r )rr)� isinstance�tuplerZTEXT�getattr�hasattrZgetrootr ZDOCUMENTZDOCTYPEr �get�COMMENTr�AssertionError�type� tag_regexp�match�groupsr�listZattrib�items�groupZELEMENT�len) �self�nodeZelt�_�flagr� namespacer Zattrs�name�value)�ElementTreeCommentType��/usr/lib/python3.6/etree.py�getNodeDetails's8         z2getETreeBuilder..TreeWalker.getNodeDetailscSstt|t�r|\}}}}n|dgdf\}}}}|dkr8dS|jrJ|||dfSt|�rl|j|�|dd|dfSdSdS)Nr r r)r r )rrr r�append)rr �element�key�parentsr"r'r'r(� getFirstChildOs   z1getETreeBuilder..TreeWalker.getFirstChildcSs�t|t�r|\}}}}ndS|dkrLt|�rF|j|�|dd|dfSdSnN|jrf|dkrf|||dfS|t|d�dkr�|d|d|d|dfSdSdS)Nr rr r�����r/)rrrr*r )rr r+r,r-r"r'r'r(�getNextSibling`s   z2getETreeBuilder..TreeWalker.getNextSiblingcSs�t|t�r|\}}}}ndS|dkr:|s,|S|||dfSnD|j�}|sJ|St|d�j|�dksdt�|t|d�j|�|dfSdS)Nr rr/r/)rr�popr�countr�index)rr r+r,r-r"�parentr'r'r(� getParentNodets z1getETreeBuilder..TreeWalker.getParentNodeN)�__name__� __module__� __qualname__�__doc__r)r.r0r5r')r&r'r(� TreeWalkers   (r:)�Commentr rZNonRecursiveTreeWalker�locals)ZElementTreeImplementationZ ElementTreer:r')r&r(�getETreeBuilders nr=)Z __future__rrr� collectionsr� ImportErrorZ ordereddict�dict�reZpip._vendor.sixr�rZ_utilsr �compilerr=ZgetETreeModuler'r'r'r(�s    t