U
    c                     @   s   d dl mZmZmZ d dlmZ d dlmZ d dlm	Z	 ddl
mZ ddlmZ dd	lmZ d
d ZG dd deZG dd deZG dd deZG dd deZG dd dejZdS )    )absolute_importdivisionunicode_literals)	text_type)OrderedDict)etree   )
tag_regexp   )base)	_ihatexmlc                 C   s*   | d krd S t | tr| S | ddS d S )Nasciistrict)
isinstancer   decode)s r   C/tmp/pip-unpacked-wheel-salzpkyu/html5lib/treewalkers/etree_lxml.py
ensure_str   s
    
r   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
Rootc                 C   s   || _ g | _z:|jjrD| jt| t|jjt|jjt|jj	 W n t
k
rZ   Y nX z| }W n t
k
r   |}Y nX | d k	r| }q|d k	r| j| | }qd | _d | _d S N)ZelementtreechildrenZdocinfoZinternalDTDappendDoctyper   	root_name	public_idZ
system_urlAttributeErrorgetrootZgetpreviousgetnexttexttail)selfetnoder   r   r   __init__   s,    







zRoot.__init__c                 C   s
   | j | S r   )r   r!   keyr   r   r   __getitem__3   s    zRoot.__getitem__c                 C   s   d S r   r   r!   r   r   r   r   6   s    zRoot.getnextc                 C   s   dS Nr
   r   r(   r   r   r   __len__9   s    zRoot.__len__N)__name__
__module____qualname__r$   r'   r   r*   r   r   r   r   r      s   r   c                   @   s   e Zd Zdd Zdd ZdS )r   c                 C   s(   || _ || _|| _|| _d | _d | _d S r   )	root_nodenamer   	system_idr   r    )r!   r.   r/   r   r0   r   r   r   r$   >   s    zDoctype.__init__c                 C   s   | j jd S r)   )r.   r   r(   r   r   r   r   G   s    zDoctype.getnextNr+   r,   r-   r$   r   r   r   r   r   r   =   s   	r   c                   @   s   e Zd Zdd Zdd ZdS )FragmentRootc                    s$    fdd|D  _ d   _ _d S )Nc                    s   g | ]}t  |qS r   )FragmentWrapper).0childr(   r   r   
<listcomp>M   s     z)FragmentRoot.__init__.<locals>.<listcomp>)r   r   r    )r!   r   r   r(   r   r$   L   s    zFragmentRoot.__init__c                 C   s   d S r   r   r(   r   r   r   r   P   s    zFragmentRoot.getnextNr1   r   r   r   r   r2   K   s   r2   c                   @   sT   e Z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S )r3   c                 C   sT   || _ || _t| jdr(t| jj| _nd | _t| jdrJt| jj| _nd | _d S )Nr   r    )r.   objhasattrr   r   r    )r!   Zfragment_rootr7   r   r   r   r$   U   s    zFragmentWrapper.__init__c                 C   s   t | j|S r   )getattrr7   )r!   r/   r   r   r   __getattr__a   s    zFragmentWrapper.__getattr__c                 C   s6   | j j}|| }|t|d k r.||d  S d S d S r)   )r.   r   indexlen)r!   Zsiblingsidxr   r   r   r   d   s
    
zFragmentWrapper.getnextc                 C   s
   | j | S r   )r7   r%   r   r   r   r'   l   s    zFragmentWrapper.__getitem__c                 C   s
   t | jS r   )boolr7   r(   r   r   r   __bool__o   s    zFragmentWrapper.__bool__c                 C   s   d S r   r   r(   r   r   r   	getparentr   s    zFragmentWrapper.getparentc                 C   s
   t | jS r   strr7   r(   r   r   r   __str__u   s    zFragmentWrapper.__str__c                 C   s
   t | jS r   rA   r(   r   r   r   __unicode__x   s    zFragmentWrapper.__unicode__c                 C   s
   t | jS r   )r<   r7   r(   r   r   r   r*   {   s    zFragmentWrapper.__len__N)r+   r,   r-   r$   r:   r   r'   r?   r@   rC   rD   r*   r   r   r   r   r3   T   s   r3   c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )
TreeWalkerc                 C   sJ   t |trt|| _t|}nt | _t|}tj| | t	
 | _d S r   )r   listsetfragmentChildrenr2   r   r   NonRecursiveTreeWalkerr$   r   InfosetFilterfilter)r!   treer   r   r   r$      s    


zTreeWalker.__init__c           	      C   s  t |tr:|\}}|dks&td| tjtt||fS t |trLtjfS t |t	rjtj
|j|j|jfS t |trt|dstjt|jfS |jtjkrtjt|jfS |jtjkrtjt|jdd fS tt|j}| r| \}}nd }t|j}t }t|j D ]P\}}t|}t|}t|}|rV|||d|df< n||d |f< qtj || j!"||t#|dkp|jfS d S )Nr   r    %Text nodes are text or tail, found %stagr
   r   r   )$r   tupleAssertionErrorr   ZTEXTr   r9   r   ZDOCUMENTr   ZDOCTYPEr/   r   r0   r3   r8   r7   rO   r   CommentCOMMENTr   EntityZENTITYr	   matchgroupsr   rF   attribitemsgroupZELEMENTrK   fromXmlNamer<   )	r!   r#   r&   rV   	namespacerO   attrsr/   valuer   r   r   getNodeDetails   s>    




 zTreeWalker.getNodeDetailsc                 C   sB   t |trtdt|s(|js(td|jr6|dfS |d S d S )NzText nodes have no childrenzNode has no childrenr   r   )r   rQ   rR   r<   r   )r!   r#   r   r   r   getFirstChild   s
    zTreeWalker.getFirstChildc                 C   sb   t |trL|\}}|dks&td| |dkrDt|r>|d S d S n| S |jrZ|dfS | S )NrM   rN   r   r   r    )r   rQ   rR   r<   r   r    r!   r#   r&   r   r   r   getNextSibling   s    
zTreeWalker.getNextSiblingc                 C   sJ   t |tr4|\}}|dks&td| |dkrB|S n|| jkrBd S | S )NrM   rN   r   )r   rQ   rR   rH   r@   ra   r   r   r   getParentNode   s    

zTreeWalker.getParentNodeN)r+   r,   r-   r$   r_   r`   rb   rc   r   r   r   r   rE      s
   )	rE   N)
__future__r   r   r   sixr   collectionsr   lxmlr   Ztreebuilders.etreer	    r   r   r   objectr   r   r2   r3   rI   rE   r   r   r   r   <module>   s   	&	+