
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
6]0A  ã               @   s  d gZ ddlZddlZddlmZmZmZmZ ddlm	Z	m
Z
 ddlZddlmZmZ ddlmZmZmZmZ yddlmZ dZW n2 ek
r´ Z zdd	lmZ d
ZW Y ddZ[X nX G dd „ d eƒZG dd„ dejƒZG dd„ deƒZG dd„ dejƒZ G dd„ de ƒZ!dS )ÚHTML5TreeBuilderé    N)Ú
PERMISSIVEÚHTMLÚHTML_5ÚHTMLTreeBuilder)ÚNamespacedAttributeÚwhitespace_re)Ú
namespacesÚprefixes)ÚCommentÚDoctypeÚNavigableStringÚTag)Ú_baseF)ÚbaseTc               @   sB   e Zd ZdZdZeeeegZddd„Z	dd„ Z
dd	„ Zd
d„ ZdS )r   zUse html5lib to build a tree.Úhtml5libNc             c   s&   || _ |rtjdƒ |d d dfV  d S )NzjYou provided a value for exclude_encoding, but the html5lib tree builder doesn't support exclude_encoding.F)Úuser_specified_encodingÚwarningsÚwarn)ÚselfÚmarkupr   Zdocument_declared_encodingZexclude_encodings© r   ú/usr/lib/python3.6/_html5lib.pyÚprepare_markup0   s    
zHTML5TreeBuilder.prepare_markupc             C   s–   | j jd k	rtjdƒ tj| jd�}tƒ }t|t	ƒsNt
rD| j|d< n
| j|d< |j|f|Ž}t|t	ƒrnd |_n$|jjjd }t|t	ƒsŒ|j}||_d S )Nz‚You provided a value for parse_only, but the html5lib tree builder doesn't support parse_only. The entire document will be parsed.)ZtreeZoverride_encodingÚencodingr   )ÚsoupZ
parse_onlyr   r   r   Z
HTMLParserÚcreate_treebuilderÚdictÚ
isinstanceÚstrÚnew_html5libr   ÚparseÚoriginal_encodingZ	tokenizerÚstreamZcharEncodingÚname)r   r   ÚparserZextra_kwargsÚdocr"   r   r   r   Úfeed=   s    




zHTML5TreeBuilder.feedc             C   s   t || jƒ| _| jS )N)ÚTreeBuilderForHtml5libr   Zunderlying_builder)r   ÚnamespaceHTMLElementsr   r   r   r   X   s    z#HTML5TreeBuilder.create_treebuilderc             C   s   d| S )zSee `TreeBuilder`.z)<html><head></head><body>%s</body></html>r   )r   Zfragmentr   r   r   Útest_fragment_to_document]   s    z*HTML5TreeBuilder.test_fragment_to_document)NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚNAMEr   r   r   Zfeaturesr   r'   r   r*   r   r   r   r   r   )   s   
c                   sf   e Zd Zd‡ f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‡  ZS )r(   Nc                s8   |r|| _ nddlm} |ddƒ| _ tt| ƒj|ƒ d S )Nr   )ÚBeautifulSoupÚ zhtml.parser)r   Úbs4r0   Úsuperr(   Ú__init__)r   r)   r   r0   )Ú	__class__r   r   r4   d   s
    zTreeBuilderForHtml5lib.__init__c             C   s   | j jƒ  t| j | j d ƒS )N)r   ÚresetÚElement)r   r   r   r   ÚdocumentClassl   s    
z$TreeBuilderForHtml5lib.documentClassc             C   s6   |d }|d }|d }t j|||ƒ}| jj|ƒ d S )Nr$   ÚpublicIdÚsystemId)r   Zfor_name_and_idsr   Úobject_was_parsed)r   Útokenr$   r9   r:   Zdoctyper   r   r   ÚinsertDoctypep   s
    z$TreeBuilderForHtml5lib.insertDoctypec             C   s   | j j||ƒ}t|| j |ƒS )N)r   Únew_tagr7   )r   r$   Ú	namespaceÚtagr   r   r   ÚelementClassx   s    z#TreeBuilderForHtml5lib.elementClassc             C   s   t t|ƒ| jƒS )N)ÚTextNoder   r   )r   Údatar   r   r   ÚcommentClass|   s    z#TreeBuilderForHtml5lib.commentClassc             C   s0   ddl m} |ddƒ| _d| j_t| j| jd ƒS )Nr   )r0   r1   zhtml.parserz[document_fragment])r2   r0   r   r$   r7   )r   r0   r   r   r   ÚfragmentClass   s    z$TreeBuilderForHtml5lib.fragmentClassc             C   s   | j j|jƒ d S )N)r   ÚappendÚelement)r   Únoder   r   r   ÚappendChild…   s    z"TreeBuilderForHtml5lib.appendChildc             C   s   | j S )N)r   )r   r   r   r   ÚgetDocument‰   s    z"TreeBuilderForHtml5lib.getDocumentc             C   s   t jj| ƒjS )N)Útreebuilder_baseÚTreeBuilderÚgetFragmentrG   )r   r   r   r   rM   Œ   s    z"TreeBuilderForHtml5lib.getFragmentc                sB   ddl m‰  g ‰tjdƒ‰d‡ ‡‡‡fdd„	‰ˆ|dƒ djˆƒS )Nr   )r0   z8^(.*?)(?: PUBLIC "(.*?)"(?: "(.*?)")?| SYSTEM "(.*?)")?$c       	         sô  t | ˆ ƒr
t | tƒr¨ˆj| ƒ}|r�|jdƒ}|jdkrx|jdƒpBd}|jdƒpZ|jdƒpZd}ˆjdd| |||f ƒ q¤ˆjdd| |f ƒ nˆjd	d| f ƒ �nHt | tƒrÌˆjd
d| | f ƒ �n$t | tƒrðˆjdd| | f ƒ �n | j�rdt	| j | j
f }n| j
}ˆjdd| |f ƒ | j�rÌg }x`t| jjƒ ƒD ]N\}}t |tƒ�rndt	|j |j
f }t |tƒ�r„dj|ƒ}|j||fƒ �qFW x2t|ƒD ]&\}}ˆjdd|d  ||f ƒ �q¢W |d7 }x| jD ]}ˆ||ƒ �qÜW d S )Né   é   r1   é   é   z|%s<!DOCTYPE %s "%s" "%s">ú z|%s<!DOCTYPE %s>z|%s<!DOCTYPE >z|%s<!-- %s -->z|%s"%s"z%s %sz|%s<%s>z
|%s%s="%s")r   r   ÚmatchÚgroupÚ	lastindexrF   r   r   r?   r
   r$   ÚattrsÚlistÚitemsr   ÚjoinÚsortedZchildren)	rG   ÚindentÚmr$   r9   r:   Ú
attributesÚvalueÚchild)r0   Ú
doctype_reÚrvÚserializeElementr   r   rb   ”   sD    








"z?TreeBuilderForHtml5lib.testSerializer.<locals>.serializeElementÚ
)r   )r2   r0   ÚreÚcompilerY   )r   rG   r   )r0   r`   ra   rb   r   ÚtestSerializer�   s    
)
z%TreeBuilderForHtml5lib.testSerializer)N)r+   r,   r-   r4   r8   r=   rA   rD   rE   rI   rJ   rM   rf   Ú__classcell__r   r   )r5   r   r(   b   s   r(   c               @   sL   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S )ÚAttrListc             C   s   || _ t| j jƒ| _d S )N)rG   r   rV   )r   rG   r   r   r   r4   Â   s    zAttrList.__init__c             C   s   t | jjƒ ƒjƒ S )N)rW   rV   rX   Ú__iter__)r   r   r   r   ri   Å   s    zAttrList.__iter__c             C   sP   t j}||d ks.| jj|krB||| jj krBt|tƒsBtj|ƒ}|| j|< d S )NÚ*)r   Zcdata_list_attributesrG   r$   r   rW   r   Úsplit)r   r$   r^   Z	list_attrr   r   r   Ú__setitem__Ç   s    

zAttrList.__setitem__c             C   s   t | jjƒ ƒS )N)rW   rV   rX   )r   r   r   r   rX   Ó   s    zAttrList.itemsc             C   s   t | jjƒ ƒS )N)rW   rV   Úkeys)r   r   r   r   rm   Õ   s    zAttrList.keysc             C   s
   t | jƒS )N)ÚlenrV   )r   r   r   r   Ú__len__×   s    zAttrList.__len__c             C   s
   | j | S )N)rV   )r   r$   r   r   r   Ú__getitem__Ù   s    zAttrList.__getitem__c             C   s   |t | jjƒ ƒkS )N)rW   rV   rm   )r   r$   r   r   r   Ú__contains__Û   s    zAttrList.__contains__N)r+   r,   r-   r4   ri   rl   rX   rm   ro   rp   rq   r   r   r   r   rh   Á   s   rh   c               @   sx   e Zd Zdd„ Zdd„ Zdd„ Zdd„ ZeeeƒZdd
d„Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ ZeeƒZd	S )r7   c             C   s&   t jj| |jƒ || _|| _|| _d S )N)rK   ÚNoder4   r$   rG   r   r?   )r   rG   r   r?   r   r   r   r4   à   s    zElement.__init__c             C   s(  d  }}t |tƒr| }}n:t |tƒr,|}n*|jjtkrJ|j }}| |_n|j}| |_t |tƒ rv|jd k	rv|jjƒ  |rÄ| jjrÄ| jjd jtkrÄ| jjd }| j	j
|| ƒ}|j|ƒ || j	_n`t |tƒrÚ| j	j
|ƒ}| jjrð| jjdƒ}n | jjd k	�r
| j	jƒ }n| j}| j	j|| j|d� d S )NrN   F)ÚparentÚmost_recent_elementéÿÿÿÿru   )r   r   r   rG   r5   r   rs   ÚextractÚcontentsr   Ú
new_stringÚreplace_withZ_most_recent_elementÚ_last_descendantÚnext_elementr;   )r   rH   Zstring_childr_   Zold_elementZnew_elementrt   r   r   r   rI   æ   s8    







zElement.appendChildc             C   s   t | jtƒri S t| jƒS )N)r   rG   r   rh   )r   r   r   r   ÚgetAttributes  s    zElement.getAttributesc             C   sœ   |d k	r˜t |ƒdkr˜g }x8t|jƒ ƒD ](\}}t|tƒr&t|Ž }||= |||< q&W | jjj| j	|ƒ x"t|jƒ ƒD ]\}}|| j
|< qrW | jjj| j
ƒ d S )Nr   )rn   rW   rX   r   Útupler   r   ZbuilderZ$_replace_cdata_list_attribute_valuesr$   rG   Zset_up_substitutions)r   r]   Zconverted_attributesr$   r^   Únew_namer   r   r   ÚsetAttributes!  s    

zElement.setAttributesNc             C   s4   t | jj|ƒ| jƒ}|r&| j||ƒ n
| j|ƒ d S )N)rB   r   rx   ÚinsertBeforerI   )r   rC   r€   Útextr   r   r   Ú
insertText9  s    zElement.insertTextc             C   s€   | j j|j ƒ}|j jtkrf| j jrf| j j|d  jtkrf| j j|d  }| jj||j  ƒ}|j|ƒ n| j j||j ƒ | |_	d S )NrN   )
rG   Úindexr5   r   rw   r   rx   ry   Úinsertrs   )r   rH   ZrefNoderƒ   Zold_nodeZnew_strr   r   r   r€   @  s    zElement.insertBeforec             C   s   |j jƒ  d S )N)rG   rv   )r   rH   r   r   r   ÚremoveChildL  s    zElement.removeChildc             C   sì   | j }|j }|j}|jddƒ}t|jƒdkr>|jd }|j}n
d}|j}|j}t|ƒdkr¼|d }	|rn||	_n||	_||	_|r†|	|_n|	|_|r–|	|_|d jddƒ}
||
_|r¶|
|_d|
_x|D ]}||_|jj	|ƒ qÂW g |_||_dS )z1Move all of this tag's children into another tag.Fr   rN   NTru   ru   )
rG   Znext_siblingrz   rn   rw   r{   Zprevious_elementZprevious_siblingrs   rF   )r   Z
new_parentrG   Znew_parent_elementZfinal_next_elementZnew_parents_last_descendantZnew_parents_last_childZ(new_parents_last_descendant_next_elementZ	to_appendZfirst_childZlast_childs_last_descendantr_   r   r   r   ÚreparentChildrenO  s>    

zElement.reparentChildrenc             C   sF   | j j| jj| jƒ}t|| j | jƒ}x| jD ]\}}||j|< q,W |S )N)r   r>   rG   r$   r?   r7   r]   )r   r@   rH   Úkeyr^   r   r   r   Ú	cloneNode‘  s
    zElement.cloneNodec             C   s   | j jS )N)rG   rw   )r   r   r   r   Ú
hasContent˜  s    zElement.hasContentc             C   s(   | j d krtd | jfS | j | jfS d S )NZhtml)r?   r	   r$   )r   r   r   r   ÚgetNameTuple›  s    
zElement.getNameTuple)N)r+   r,   r-   r4   rI   r|   r   Úpropertyr]   r‚   r€   r…   r†   rˆ   r‰   rŠ   Z	nameTupler   r   r   r   r7   ß   s   6

Br7   c               @   s   e Zd Zdd„ Zdd„ ZdS )rB   c             C   s   t jj| d ƒ || _|| _d S )N)rK   rr   r4   rG   r   )r   rG   r   r   r   r   r4   ¤  s    zTextNode.__init__c             C   s   t ‚d S )N)ÚNotImplementedError)r   r   r   r   rˆ   ©  s    zTextNode.cloneNodeN)r+   r,   r-   r4   rˆ   r   r   r   r   rB   £  s   rB   )"Ú__all__r   rd   Zbs4.builderr   r   r   r   Zbs4.elementr   r   r   Zhtml5lib.constantsr	   r
   r   r   r   r   Zhtml5lib.treebuildersr   rK   r    ÚImportErrorÚer   r   rL   r(   Úobjectrh   rr   r7   rB   r   r   r   r   Ú<module>   s&   9_ E