a
    (ñ»jÙ8  ã                   @   sò   d dl mZmZmZ d dlmZ ddlmZmZm	Z	 dZ
eeƒdfeee	d dfhB ƒdfeee	d d	fe	d d
fhB ƒdfee	d dfe	d dfgƒdfee	d dfe	d dfgƒdfdœZG dd„ deƒZG dd„ deƒZG dd„ deƒZdS )é    )Úabsolute_importÚdivisionÚunicode_literals)Ú	text_typeé   )ÚscopingElementsÚtableInsertModeElementsÚ
namespacesNFÚhtmlÚbuttonZolZulÚtableÚoptgroupÚoptionT)Nr   Úlistr   Úselectc                   @   sb   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zddd„Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zd
S )ÚNodezRepresents an item in the treec                 C   s(   || _ d| _d| _i | _g | _g | _dS )zRCreates a Node

        :arg name: The tag name associated with the node

        N)ÚnameÚparentÚvalueÚ
attributesÚ
childNodesÚ_flags)Úselfr   © r   ú@E:\soccer\ml_env\Lib\site-packages\html5lib/treebuilders/base.pyÚ__init__   s    zNode.__init__c                 C   s:   d  dd„ | j ¡ D ƒ¡}|r,d| j|f S d| j S d S )Nú c                 S   s   g | ]\}}d ||f ‘qS )z%s="%s"r   )Ú.0r   r   r   r   r   Ú
<listcomp>.   s   ÿz Node.__str__.<locals>.<listcomp>z<%s %s>ú<%s>)Újoinr   Úitemsr   )r   ZattributesStrr   r   r   Ú__str__-   s    
þzNode.__str__c                 C   s
   d| j  S )Nr   )r   ©r   r   r   r   Ú__repr__6   s    zNode.__repr__c                 C   s   t ‚dS )z[Insert node as a child of the current node

        :arg node: the node to insert

        N©ÚNotImplementedError©r   Únoder   r   r   ÚappendChild9   s    zNode.appendChildNc                 C   s   t ‚dS )aB  Insert data as text in the current node, positioned before the
        start of node insertBefore or to the end of the node's text.

        :arg data: the data to insert

        :arg insertBefore: True if you want to insert the text before the node
            and False if you want to insert it after the node

        Nr%   )r   ÚdataÚinsertBeforer   r   r   Ú
insertTextA   s    
zNode.insertTextc                 C   s   t ‚dS )a  Insert node as a child of the current node, before refNode in the
        list of child nodes. Raises ValueError if refNode is not a child of
        the current node

        :arg node: the node to insert

        :arg refNode: the child node to insert the node before

        Nr%   )r   r(   ZrefNoder   r   r   r+   M   s    
zNode.insertBeforec                 C   s   t ‚dS )zhRemove node from the children of the current node

        :arg node: the child node to remove

        Nr%   r'   r   r   r   ÚremoveChildY   s    zNode.removeChildc                 C   s    | j D ]}| |¡ qg | _ dS )zôMove all the children of the current node to newParent.
        This is needed so that trees that don't store text as nodes move the
        text in the correct way

        :arg newParent: the node to move all this node's children to

        N)r   r)   )r   Z	newParentÚchildr   r   r   ÚreparentChildrena   s    	
zNode.reparentChildrenc                 C   s   t ‚dS )zŠReturn a shallow copy of the current node i.e. a node with the same
        name and attributes but with no parent or child nodes
        Nr%   r#   r   r   r   Ú	cloneNoden   s    zNode.cloneNodec                 C   s   t ‚dS )zFReturn true if the node has children or text, false otherwise
        Nr%   r#   r   r   r   Ú
hasContentt   s    zNode.hasContent)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r"   r$   r)   r,   r+   r-   r/   r0   r1   r   r   r   r   r      s   	
r   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚActiveFormattingElementsc                 C   sf   d}|t krV| d d d… D ]:}|t kr* qV|  ||¡r>|d7 }|dkr|  |¡  qVqt | |¡ d S )Nr   éÿÿÿÿé   é   )ÚMarkerÚ
nodesEqualÚremover   Úappend)r   r(   Z
equalCountÚelementr   r   r   r=   {   s    
zActiveFormattingElements.appendc                 C   s$   |j |j ksdS |j|jks dS dS )NFT)Ú	nameTupler   )r   Znode1Znode2r   r   r   r;   ˆ   s
    z#ActiveFormattingElements.nodesEqualN)r2   r3   r4   r=   r;   r   r   r   r   r6   z   s   r6   c                   @   sÖ   e Zd ZdZdZdZdZdZdZdd„ Z	dd„ Z
d+dd„Zd	d
„ Zdd„ Zdd„ Zdd„ Zdd„ Zd,dd„Zdd„ Zdd„ Zdd„ ZeeeƒZdd„ Zdd„ Zd-dd „Zd!d"„ Zd.d#d$„Zd%d&„ Zd'd(„ Zd)d*„ ZdS )/ÚTreeBuildera  Base treebuilder implementation

    * documentClass - the class to use for the bottommost node of a document
    * elementClass - the class to use for HTML Elements
    * commentClass - the class to use for comments
    * doctypeClass - the class to use for doctypes

    Nc                 C   s   |rd| _ nd| _ |  ¡  dS )zmCreate a TreeBuilder

        :arg namespaceHTMLElements: whether or not to namespace HTML elements

        zhttp://www.w3.org/1999/xhtmlN)ÚdefaultNamespaceÚreset)r   ZnamespaceHTMLElementsr   r   r   r   ¬   s    zTreeBuilder.__init__c                 C   s.   g | _ tƒ | _d | _d | _d| _|  ¡ | _d S )NF)ÚopenElementsr6   ÚactiveFormattingElementsZheadPointerZformPointerÚinsertFromTableÚdocumentClassÚdocumentr#   r   r   r   rB   ¸   s    zTreeBuilder.resetc                 C   s”   t |dƒ}|s2t|tƒr$td |f}t|tƒs2J ‚t| \}}t| jƒD ]>}|r^||kr^ dS |sr|j|krr dS ||j|v A rH dS qHds�J ‚d S )Nr?   r
   TF)	ÚhasattrÚ
isinstancer   r	   ÚtupleÚlistElementsMapÚreversedrC   r?   )r   ÚtargetÚvariantZ	exactNodeZlistElementsÚinvertr(   r   r   r   ÚelementInScopeÄ   s    

zTreeBuilder.elementInScopec                 C   sÀ   | j s
d S t| j ƒd }| j | }|tks4|| jv r8d S |tkrl|| jvrl|dkrXd}ql|d8 }| j | }q8|d7 }| j | }| ¡ }|  d|j|j|jdœ¡}|| j |< || j d krlq¼qld S )Nr8   r   r7   ZStartTag)Útyper   Ú	namespacer*   )	rD   Úlenr:   rC   r0   ÚinsertElementr   rR   r   )r   ÚiÚentryÚcloner>   r   r   r   Ú#reconstructActiveFormattingElementsÚ   s.    

ý
z/TreeBuilder.reconstructActiveFormattingElementsc                 C   s(   | j  ¡ }| j r$|tkr$| j  ¡ }q
d S ©N)rD   Úpopr:   )r   rV   r   r   r   ÚclearActiveFormattingElements  s    
z)TreeBuilder.clearActiveFormattingElementsc                 C   s:   | j ddd… D ]$}|tkr" q6q|j|kr|  S qdS )zšCheck if an element exists between the end of the active
        formatting elements and the last marker. If it does, return it, else
        return falseNr7   F)rD   r:   r   )r   r   Úitemr   r   r   Ú!elementInActiveFormattingElements  s    

z-TreeBuilder.elementInActiveFormattingElementsc                 C   s&   |   |¡}| j |¡ | j |¡ d S rY   )ÚcreateElementrC   r=   rG   r)   )r   Útokenr>   r   r   r   Ú
insertRoot  s    
zTreeBuilder.insertRootc                 C   s6   |d }|d }|d }|   |||¡}| j |¡ d S )Nr   ÚpublicIdÚsystemId)ÚdoctypeClassrG   r)   )r   r_   r   ra   rb   Údoctyper   r   r   ÚinsertDoctype   s
    zTreeBuilder.insertDoctypec                 C   s*   |d u r| j d }| |  |d ¡¡ d S )Nr7   r*   )rC   r)   ÚcommentClass)r   r_   r   r   r   r   ÚinsertComment(  s    
zTreeBuilder.insertCommentc                 C   s0   |d }|  d| j¡}|  ||¡}|d |_|S )z.Create an element but don't insert it anywherer   rR   r*   )ÚgetrA   ÚelementClassr   ©r   r_   r   rR   r>   r   r   r   r^   -  s
    
zTreeBuilder.createElementc                 C   s   | j S rY   )Ú_insertFromTabler#   r   r   r   Ú_getInsertFromTable5  s    zTreeBuilder._getInsertFromTablec                 C   s    || _ |r| j| _n| j| _dS )zsSwitch the function used to insert an element from the
        normal one to the misnested table one and back againN)rk   ÚinsertElementTablerT   ÚinsertElementNormal)r   r   r   r   r   Ú_setInsertFromTable8  s    
zTreeBuilder._setInsertFromTablec                 C   sb   |d }t |tƒsJ d| ƒ‚| d| j¡}|  ||¡}|d |_| jd  |¡ | j |¡ |S )Nr   zElement %s not unicoderR   r*   r7   )	rI   r   rh   rA   ri   r   rC   r)   r=   rj   r   r   r   rn   C  s    
zTreeBuilder.insertElementNormalc                 C   s`   |   |¡}| jd jtvr$|  |¡S |  ¡ \}}|du rD| |¡ n| ||¡ | j |¡ |S )z-Create an element and insert it into the treer7   N)	r^   rC   r   r   rn   ÚgetTableMisnestedNodePositionr)   r+   r=   )r   r_   r>   r   r+   r   r   r   rm   M  s    

zTreeBuilder.insertElementTablec                 C   sV   |du r| j d }| jr.| jr:| j d jtvr:| |¡ n|  ¡ \}}| ||¡ dS )zInsert text data.Nr7   )rC   rE   r   r   r,   rp   )r   r*   r   r+   r   r   r   r,   ]  s    

ÿÿzTreeBuilder.insertTextc                 C   st   d}d}d}| j ddd… D ]}|jdkr|} q4q|rb|jrJ|j}|}ql| j | j  |¡d  }n
| j d }||fS )zsGet the foster parent element, and sibling to insert before
        (or None) when inserting a misnested table nodeNr7   r   r8   r   )rC   r   r   Úindex)r   Z	lastTableZfosterParentr+   Úelmr   r   r   rp   l  s     
ÿ
z)TreeBuilder.getTableMisnestedNodePositionc                 C   s8   | j d j}|tdƒv r4||kr4| j  ¡  |  |¡ d S )Nr7   )ÚddÚdtZlir   r   ÚpÚrpÚrt)rC   r   Ú	frozensetrZ   ÚgenerateImpliedEndTags)r   Úexcluder   r   r   r   ry   †  s    ÿ
z"TreeBuilder.generateImpliedEndTagsc                 C   s   | j S )zReturn the final tree)rG   r#   r   r   r   ÚgetDocument�  s    zTreeBuilder.getDocumentc                 C   s   |   ¡ }| jd  |¡ |S )zReturn the final fragmentr   )ÚfragmentClassrC   r/   )r   Úfragmentr   r   r   ÚgetFragment”  s    zTreeBuilder.getFragmentc                 C   s   t ‚dS )z‰Serialize the subtree of node in the format required by unit tests

        :arg node: the node from which to start serializing

        Nr%   r'   r   r   r   ÚtestSerializer›  s    zTreeBuilder.testSerializer)N)N)N)N)r2   r3   r4   r5   rF   ri   rf   rc   r|   r   rB   rP   rX   r[   r]   r`   re   rg   r^   rl   ro   ÚpropertyrE   rn   rm   r,   rp   ry   r{   r~   r   r   r   r   r   r@   ’   s6   
.
	




r@   )Ú
__future__r   r   r   Úsixr   Ú	constantsr   r   r	   r:   rx   rK   Úobjectr   r   r6   r@   r   r   r   r   Ú<module>   s0   

ÿÿ
ÿÿ
ÿÿùc