
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
B;ˆW+ ã               @   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mZ ddl	mZmZmZ dd	l	mZmZ dd
l	mZ ddlmZ ddlmZ eeƒZG dd„ deƒZdS )é    )Úabsolute_importÚdivisionÚunicode_literals)Úunichr)Údequeé   )ÚspaceCharacters)Úentities)ÚasciiLettersÚasciiUpper2Lower)ÚdigitsÚ	hexDigitsÚEOF)Ú
tokenTypesÚtagTokenTypes)ÚreplacementCharacters)ÚHTMLInputStream)ÚTriec                   sd  e Zd ZdZd–‡ f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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*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Zd8d9„ Zd:d;„ Zd<d=„ Z d>d?„ Z!d@dA„ Z"dBdC„ Z#dDdE„ Z$dFdG„ Z%dHdI„ Z&dJdK„ Z'dLdM„ Z(dNdO„ Z)dPdQ„ Z*dRdS„ Z+dTdU„ Z,dVdW„ Z-dXdY„ Z.dZd[„ Z/d\d]„ Z0d^d_„ Z1d`da„ Z2dbdc„ Z3ddde„ Z4dfdg„ Z5dhdi„ Z6djdk„ Z7dldm„ Z8dndo„ Z9dpdq„ Z:drds„ Z;dtdu„ Z<dvdw„ Z=dxdy„ Z>dzd{„ Z?d|d}„ Z@d~d„ ZAd€d�„ ZBd‚dƒ„ ZCd„d…„ ZDd†d‡„ ZEdˆd‰„ ZFdŠd‹„ ZGdŒd�„ ZHdŽd�„ ZId�d‘„ ZJd’d“„ ZKd”d•„ ZL‡  ZMS )˜ÚHTMLTokenizera	   This class takes care of tokenizing HTML.

    * self.currentToken
      Holds the token that is currently being processed.

    * self.state
      Holds a reference to the method to be invoked... XXX

    * self.stream
      Points to HTMLInputStream object.
    Nc                sF   t |f|Ž| _|| _d| _g | _| j| _d| _d | _t	t
| ƒjƒ  d S )NF)r   ÚstreamÚparserZ
escapeFlagZlastFourCharsÚ	dataStateÚstateÚescapeÚcurrentTokenÚsuperr   Ú__init__)Úselfr   r   Úkwargs)Ú	__class__© ú /usr/lib/python3.6/_tokenizer.pyr   "   s    zHTMLTokenizer.__init__c             c   s\   t g ƒ| _xL| jƒ rVx&| jjr:td | jjjdƒdœV  qW x| jrR| jjƒ V  q>W qW dS )zä This is where the magic happens.

        We do our usually processing through the states and when we have a token
        to return we yield the token which pauses processing until the next token
        is requested.
        Ú
ParseErrorr   )ÚtypeÚdataN)r   Ú
tokenQueuer   r   Úerrorsr   ÚpopÚpopleft)r   r    r    r!   Ú__iter__1   s    


zHTMLTokenizer.__iter__c       	   %   C   s(  t }d}|rt}d}g }| jjƒ }x(||krJ|tk	rJ|j|ƒ | jjƒ }q$W tdj|ƒ|ƒ}|tkrŒt| }| j	jt
d dd|idœƒ �nld|  kožd	kn  s¬|d
krÐd}| j	jt
d dd|idœƒ �n(d|  koâdkn  �s�d|  koüdkn  �s�d|  k�odkn  �s�d|  k�o4dkn  �s�|tddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d
g#ƒk�r¬| j	jt
d dd|idœƒ yt|ƒ}W n> tk
�rö   |d6 }td|d? B ƒtd7|d8@ B ƒ }Y nX |d9k�r$| j	jt
d d:d;œƒ | jj|ƒ |S )<zøThis function returns either U+FFFD or the character based on the
        decimal or hexadecimal representation. It also discards ";" if present.
        If not present self.tokenQueue.append({"type": tokenTypes["ParseError"]}) is invoked.
        é
   é   Ú r"   z$illegal-codepoint-for-numeric-entityÚ	charAsInt)r#   r$   Údatavarsi Ø  iÿß  iÿÿ u   ï¿½r   é   é   é   é   éŸ   iÐý  iïý  é   iþÿ  iÿÿ  iþÿ iÿÿ iþÿ iÿÿ iþÿ iÿÿ iþÿ iÿÿ iþÿ iÿÿ iþÿ iÿÿ iþÿ iÿÿ iþÿ iÿÿ iþÿ	 iÿÿ	 iþÿ
 iÿÿ
 iþÿ iÿÿ iþÿ iÿÿ iþÿ iÿÿ iþÿ iÿÿ iþÿ iÿÿ iþÿ i   i Ü  iÿ  ú;z numeric-entity-without-semicolon)r#   r$   )r   r   r   Úcharr   ÚappendÚintÚjoinr   r%   r   Ú	frozensetÚchrÚ
ValueErrorÚunget)	r   ZisHexZallowedÚradixÚ	charStackÚcr-   r6   Úvr    r    r!   ÚconsumeNumberEntityA   s`    

&

z!HTMLTokenizer.consumeNumberEntityFc       	      C   sÈ  d}| j jƒ g}|d tksB|d tddfksB|d k	rV||d krV| j j|d ƒ �n"|d dk�rd}|j| j jƒ ƒ |d dkr˜d	}|j| j jƒ ƒ |r¨|d tksº| rÖ|d tkrÖ| j j|d ƒ | j|ƒ}n4| j	jt
d
 ddœƒ | j j|jƒ ƒ ddj|ƒ }�njx8|d tk	�rFtjdj|ƒƒ�s2P |j| j jƒ ƒ �qW y$tjdj|d d… ƒƒ}t|ƒ}W n tk
�r†   d }Y nX |d k	�rD|d dk�r¶| j	jt
d
 ddœƒ |d dk�r|�r|| tk�sô|| tk�sô|| dk�r| j j|jƒ ƒ ddj|ƒ }n.t| }| j j|jƒ ƒ |dj||d … ƒ7 }n4| j	jt
d
 ddœƒ | j j|jƒ ƒ ddj|ƒ }|�rš| jd d d  |7  < n*|tk�rªd}nd}| j	jt
| |dœƒ d S )Nú&r   ú<ú#Fr   ÚxÚXTr"   zexpected-numeric-entity)r#   r$   r,   r5   znamed-entity-without-semicolonú=zexpected-named-entityr$   ÚSpaceCharactersÚ
Characterséÿÿÿÿ)rF   rG   rK   rK   rK   rK   rK   rK   rK   rK   )r   r6   r   r   r=   r7   r   r   rB   r%   r   r'   r9   ÚentitiesTrieZhas_keys_with_prefixZlongest_prefixÚlenÚKeyErrorr
   r	   r   )	r   ÚallowedCharÚfromAttributeÚoutputr?   ÚhexZ
entityNameZentityLengthZ	tokenTyper    r    r!   ÚconsumeEntity‰   sf    





zHTMLTokenizer.consumeEntityc             C   s   | j |dd� dS )zIThis method replaces the need for "entityInAttributeValueState".
        T)rO   rP   N)rS   )r   rO   r    r    r!   ÚprocessEntityInAttributeÙ   s    z&HTMLTokenizer.processEntityInAttributec             C   sˆ   | j }|d tkrp|d jtƒ|d< |d td krp|d rR| jjtd ddœƒ |d rp| jjtd d	dœƒ | jj|ƒ | j| _d
S )z®This method is a generic handler for emitting the tags. It also sets
        the state to "data" because that's what's needed after a token has been
        emitted.
        r#   ÚnameÚEndTagr$   r"   zattributes-in-end-tag)r#   r$   ÚselfClosingzself-closing-flag-on-end-tagN)	r   r   Ú	translater   r   r%   r7   r   r   )r   Útokenr    r    r!   ÚemitCurrentTokenÞ   s    

zHTMLTokenizer.emitCurrentTokenc             C   sÈ   | j jƒ }|dkr| j| _n¨|dkr.| j| _n–|dkrd| jjtd ddœƒ | jjtd ddœƒ n`|tkrpdS |t	krž| jjtd	 || j j
t	d
ƒ dœƒ n&| j j
dƒ}| jjtd || dœƒ d
S )NrC   rD   ú r"   zinvalid-codepoint)r#   r$   rJ   FrI   T)rC   rD   r[   )r   r6   ÚentityDataStater   ÚtagOpenStater%   r7   r   r   r   Ú
charsUntil)r   r$   Úcharsr    r    r!   r   ò   s&    



zHTMLTokenizer.dataStatec             C   s   | j ƒ  | j| _dS )NT)rS   r   r   )r   r    r    r!   r\     s    zHTMLTokenizer.entityDataStatec             C   sÈ   | j jƒ }|dkr| j| _n¨|dkr.| j| _n–|tkr:dS |dkrp| jjtd ddœƒ | jjtd d	dœƒ nT|t	krž| jjtd
 || j j
t	dƒ dœƒ n&| j j
dƒ}| jjtd || dœƒ dS )NrC   rD   Fr[   r"   zinvalid-codepoint)r#   r$   rJ   u   ï¿½rI   T)rC   rD   r[   )r   r6   ÚcharacterReferenceInRcdatar   ÚrcdataLessThanSignStater   r%   r7   r   r   r^   )r   r$   r_   r    r    r!   ÚrcdataState  s&    



zHTMLTokenizer.rcdataStatec             C   s   | j ƒ  | j| _dS )NT)rS   rb   r   )r   r    r    r!   r`   1  s    z(HTMLTokenizer.characterReferenceInRcdatac             C   sˆ   | j jƒ }|dkr| j| _nh|dkrR| jjtd ddœƒ | jjtd ddœƒ n2|tkr^dS | j jd
ƒ}| jjtd || dœƒ d	S )NrD   r[   r"   zinvalid-codepoint)r#   r$   rJ   u   ï¿½FT)rD   r[   )	r   r6   ÚrawtextLessThanSignStater   r%   r7   r   r   r^   )r   r$   r_   r    r    r!   ÚrawtextState6  s    


zHTMLTokenizer.rawtextStatec             C   sˆ   | j jƒ }|dkr| j| _nh|dkrR| jjtd ddœƒ | jjtd ddœƒ n2|tkr^dS | j jd
ƒ}| jjtd || dœƒ d	S )NrD   r[   r"   zinvalid-codepoint)r#   r$   rJ   u   ï¿½FT)rD   r[   )	r   r6   ÚscriptDataLessThanSignStater   r%   r7   r   r   r^   )r   r$   r_   r    r    r!   ÚscriptDataStateH  s    


zHTMLTokenizer.scriptDataStatec             C   sr   | j jƒ }|tkrdS |dkrL| jjtd ddœƒ | jjtd ddœƒ n"| jjtd || j jdƒ dœƒ dS )	NFr[   r"   zinvalid-codepoint)r#   r$   rJ   u   ï¿½T)r   r6   r   r%   r7   r   r^   )r   r$   r    r    r!   ÚplaintextStateZ  s    

zHTMLTokenizer.plaintextStatec             C   s  | j jƒ }|dkr| j| _nì|dkr.| j| _nÚ|tkrVtd |g dddœ| _| j| _n²|dkr”| j	j
td dd	œƒ | j	j
td
 dd	œƒ | j| _nt|dkrÈ| j	j
td dd	œƒ | j j|ƒ | j| _n@| j	j
td dd	œƒ | j	j
td
 dd	œƒ | j j|ƒ | j| _dS )Nú!ú/ZStartTagF)r#   rU   r$   rW   ZselfClosingAcknowledgedú>r"   z'expected-tag-name-but-got-right-bracket)r#   r$   rJ   z<>ú?z'expected-tag-name-but-got-question-markzexpected-tag-namerD   T)r   r6   ÚmarkupDeclarationOpenStater   ÚcloseTagOpenStater
   r   r   ÚtagNameStater%   r7   r   r=   ÚbogusCommentState)r   r$   r    r    r!   r]   i  s6    









zHTMLTokenizer.tagOpenStatec             C   sÊ   | j jƒ }|tkr0td |g ddœ| _| j| _n–|dkrX| jjtd ddœƒ | j	| _nn|t
kr–| jjtd ddœƒ | jjtd	 d
dœƒ | j	| _n0| jjtd dd|idœƒ | j j|ƒ | j| _dS )NrV   F)r#   rU   r$   rW   rj   r"   z*expected-closing-tag-but-got-right-bracket)r#   r$   z expected-closing-tag-but-got-eofrJ   z</z!expected-closing-tag-but-got-charr$   )r#   r$   r.   T)r   r6   r
   r   r   rn   r   r%   r7   r   r   r=   ro   )r   r$   r    r    r!   rm   Œ  s(    





zHTMLTokenizer.closeTagOpenStatec             C   s°   | j jƒ }|tkr| j| _n�|dkr.| jƒ  n~|tkrV| jjt	d ddœƒ | j
| _nV|dkrh| j| _nD|dkrš| jjt	d ddœƒ | jd  d	7  < n| jd  |7  < d
S )Nrj   r"   zeof-in-tag-name)r#   r$   ri   r[   zinvalid-codepointrU   u   ï¿½T)r   r6   r   ÚbeforeAttributeNameStater   rZ   r   r%   r7   r   r   ÚselfClosingStartTagStater   )r   r$   r    r    r!   rn   ¤  s"    






zHTMLTokenizer.tagNameStatec             C   sP   | j jƒ }|dkr"d| _| j| _n*| jjtd ddœƒ | j j|ƒ | j	| _dS )Nri   r,   rJ   rD   )r#   r$   T)
r   r6   ÚtemporaryBufferÚrcdataEndTagOpenStater   r%   r7   r   r=   rb   )r   r$   r    r    r!   ra   º  s    

z%HTMLTokenizer.rcdataLessThanSignStatec             C   sX   | j jƒ }|tkr*|  j|7  _| j| _n*| jjtd ddœƒ | j j	|ƒ | j
| _dS )NrJ   z</)r#   r$   T)r   r6   r
   rr   ÚrcdataEndTagNameStater   r%   r7   r   r=   rb   )r   r$   r    r    r!   rs   Å  s    

z#HTMLTokenizer.rcdataEndTagOpenStatec             C   s   | j o| j d jƒ | jjƒ k}| jjƒ }|tkrT|rTtd | jg ddœ| _ | j| _n¨|dkr€|r€td | jg ddœ| _ | j	| _n||dkr´|r´td | jg ddœ| _ | j
ƒ  | j| _nH|tkrÌ|  j|7  _n0| jjtd d| j d	œƒ | jj|ƒ | j| _d
S )NrU   rV   F)r#   rU   r$   rW   ri   rj   rJ   z</)r#   r$   T)r   Úlowerrr   r   r6   r   r   rp   r   rq   rZ   r   r
   r%   r7   r=   rb   )r   Úappropriater$   r    r    r!   rt   Ð  s2    



z#HTMLTokenizer.rcdataEndTagNameStatec             C   sP   | j jƒ }|dkr"d| _| j| _n*| jjtd ddœƒ | j j|ƒ | j	| _dS )Nri   r,   rJ   rD   )r#   r$   T)
r   r6   rr   ÚrawtextEndTagOpenStater   r%   r7   r   r=   rd   )r   r$   r    r    r!   rc   ì  s    

z&HTMLTokenizer.rawtextLessThanSignStatec             C   sX   | j jƒ }|tkr*|  j|7  _| j| _n*| jjtd ddœƒ | j j	|ƒ | j
| _dS )NrJ   z</)r#   r$   T)r   r6   r
   rr   ÚrawtextEndTagNameStater   r%   r7   r   r=   rd   )r   r$   r    r    r!   rw   ÷  s    

z$HTMLTokenizer.rawtextEndTagOpenStatec             C   s   | j o| j d jƒ | jjƒ k}| jjƒ }|tkrT|rTtd | jg ddœ| _ | j| _n¨|dkr€|r€td | jg ddœ| _ | j	| _n||dkr´|r´td | jg ddœ| _ | j
ƒ  | j| _nH|tkrÌ|  j|7  _n0| jjtd d| j d	œƒ | jj|ƒ | j| _d
S )NrU   rV   F)r#   rU   r$   rW   ri   rj   rJ   z</)r#   r$   T)r   ru   rr   r   r6   r   r   rp   r   rq   rZ   r   r
   r%   r7   r=   rd   )r   rv   r$   r    r    r!   rx     s2    



z$HTMLTokenizer.rawtextEndTagNameStatec             C   sx   | j jƒ }|dkr"d| _| j| _nR|dkrJ| jjtd ddœƒ | j| _n*| jjtd ddœƒ | j j	|ƒ | j
| _dS )	Nri   r,   rh   rJ   z<!)r#   r$   rD   T)r   r6   rr   ÚscriptDataEndTagOpenStater   r%   r7   r   ÚscriptDataEscapeStartStater=   rf   )r   r$   r    r    r!   re     s    


z)HTMLTokenizer.scriptDataLessThanSignStatec             C   sX   | j jƒ }|tkr*|  j|7  _| j| _n*| jjtd ddœƒ | j j	|ƒ | j
| _dS )NrJ   z</)r#   r$   T)r   r6   r
   rr   ÚscriptDataEndTagNameStater   r%   r7   r   r=   rf   )r   r$   r    r    r!   ry   ,  s    

z'HTMLTokenizer.scriptDataEndTagOpenStatec             C   s   | j o| j d jƒ | jjƒ k}| jjƒ }|tkrT|rTtd | jg ddœ| _ | j| _n¨|dkr€|r€td | jg ddœ| _ | j	| _n||dkr´|r´td | jg ddœ| _ | j
ƒ  | j| _nH|tkrÌ|  j|7  _n0| jjtd d| j d	œƒ | jj|ƒ | j| _d
S )NrU   rV   F)r#   rU   r$   rW   ri   rj   rJ   z</)r#   r$   T)r   ru   rr   r   r6   r   r   rp   r   rq   rZ   r   r
   r%   r7   r=   rf   )r   rv   r$   r    r    r!   r{   7  s2    



z'HTMLTokenizer.scriptDataEndTagNameStatec             C   sJ   | j jƒ }|dkr2| jjtd ddœƒ | j| _n| j j|ƒ | j| _dS )Nú-rJ   )r#   r$   T)	r   r6   r%   r7   r   ÚscriptDataEscapeStartDashStater   r=   rf   )r   r$   r    r    r!   rz   S  s    

z(HTMLTokenizer.scriptDataEscapeStartStatec             C   sJ   | j jƒ }|dkr2| jjtd ddœƒ | j| _n| j j|ƒ | j| _dS )Nr|   rJ   )r#   r$   T)	r   r6   r%   r7   r   ÚscriptDataEscapedDashDashStater   r=   rf   )r   r$   r    r    r!   r}   ]  s    

z,HTMLTokenizer.scriptDataEscapeStartDashStatec             C   s¶   | j jƒ }|dkr2| jjtd ddœƒ | j| _n€|dkrD| j| _nn|dkrz| jjtd ddœƒ | jjtd ddœƒ n8|tkrŒ| j	| _n&| j j
d
ƒ}| jjtd || dœƒ d	S )Nr|   rJ   )r#   r$   rD   r[   r"   zinvalid-codepointu   ï¿½T)rD   r|   r[   )r   r6   r%   r7   r   ÚscriptDataEscapedDashStater   Ú"scriptDataEscapedLessThanSignStater   r   r^   )r   r$   r_   r    r    r!   ÚscriptDataEscapedStateg  s"    




z$HTMLTokenizer.scriptDataEscapedStatec             C   s¶   | j jƒ }|dkr2| jjtd ddœƒ | j| _n€|dkrD| j| _nn|dkr‚| jjtd ddœƒ | jjtd ddœƒ | j| _n0|t	kr”| j
| _n| jjtd |dœƒ | j| _d	S )
Nr|   rJ   )r#   r$   rD   r[   r"   zinvalid-codepointu   ï¿½T)r   r6   r%   r7   r   r~   r   r€   r�   r   r   )r   r$   r    r    r!   r   {  s"    






z(HTMLTokenizer.scriptDataEscapedDashStatec             C   sÖ   | j jƒ }|dkr*| jjtd ddœƒ n¨|dkr<| j| _n–|dkrd| jjtd ddœƒ | j| _nn|dkr¢| jjtd ddœƒ | jjtd d	dœƒ | j| _n0|t	kr´| j
| _n| jjtd |dœƒ | j| _d
S )Nr|   rJ   )r#   r$   rD   rj   r[   r"   zinvalid-codepointu   ï¿½T)r   r6   r%   r7   r   r€   r   rf   r�   r   r   )r   r$   r    r    r!   r~   �  s&    






z,HTMLTokenizer.scriptDataEscapedDashDashStatec             C   s‚   | j jƒ }|dkr"d| _| j| _n\|tkrT| jjtd d| dœƒ || _| j	| _n*| jjtd ddœƒ | j j
|ƒ | j| _dS )Nri   r,   rJ   rD   )r#   r$   T)r   r6   rr   Ú scriptDataEscapedEndTagOpenStater   r
   r%   r7   r   Ú scriptDataDoubleEscapeStartStater=   r�   )r   r$   r    r    r!   r€   ¥  s    


z0HTMLTokenizer.scriptDataEscapedLessThanSignStatec             C   sP   | j jƒ }|tkr"|| _| j| _n*| jjtd ddœƒ | j j	|ƒ | j
| _dS )NrJ   z</)r#   r$   T)r   r6   r
   rr   Ú scriptDataEscapedEndTagNameStater   r%   r7   r   r=   r�   )r   r$   r    r    r!   r‚   ´  s    

z.HTMLTokenizer.scriptDataEscapedEndTagOpenStatec             C   s   | j o| j d jƒ | jjƒ k}| jjƒ }|tkrT|rTtd | jg ddœ| _ | j| _n¨|dkr€|r€td | jg ddœ| _ | j	| _n||dkr´|r´td | jg ddœ| _ | j
ƒ  | j| _nH|tkrÌ|  j|7  _n0| jjtd d| j d	œƒ | jj|ƒ | j| _d
S )NrU   rV   F)r#   rU   r$   rW   ri   rj   rJ   z</)r#   r$   T)r   ru   rr   r   r6   r   r   rp   r   rq   rZ   r   r
   r%   r7   r=   r�   )r   rv   r$   r    r    r!   r„   ¿  s2    



z.HTMLTokenizer.scriptDataEscapedEndTagNameStatec             C   s˜   | j jƒ }|ttdƒB krR| jjtd |dœƒ | jjƒ dkrH| j	| _
q”| j| _
nB|tkr€| jjtd |dœƒ |  j|7  _n| j j|ƒ | j| _
dS )Nri   rj   rJ   )r#   r$   ÚscriptT)ri   rj   )r   r6   r   r:   r%   r7   r   rr   ru   ÚscriptDataDoubleEscapedStater   r�   r
   r=   )r   r$   r    r    r!   rƒ   Û  s    


z.HTMLTokenizer.scriptDataDoubleEscapeStartStatec             C   sÒ   | j jƒ }|dkr2| jjtd ddœƒ | j| _nœ|dkrZ| jjtd ddœƒ | j| _nt|dkr�| jjtd ddœƒ | jjtd ddœƒ n>|tkr¸| jjtd d	dœƒ | j	| _n| jjtd |dœƒ d
S )Nr|   rJ   )r#   r$   rD   r[   r"   zinvalid-codepointu   ï¿½zeof-in-script-in-scriptT)
r   r6   r%   r7   r   Ú scriptDataDoubleEscapedDashStater   Ú(scriptDataDoubleEscapedLessThanSignStater   r   )r   r$   r    r    r!   r†   ë  s$    





z*HTMLTokenizer.scriptDataDoubleEscapedStatec             C   sâ   | j jƒ }|dkr2| jjtd ddœƒ | j| _n¬|dkrZ| jjtd ddœƒ | j| _n„|dkr˜| jjtd ddœƒ | jjtd ddœƒ | j| _nF|t	krÀ| jjtd d	dœƒ | j
| _n| jjtd |dœƒ | j| _d
S )Nr|   rJ   )r#   r$   rD   r[   r"   zinvalid-codepointu   ï¿½zeof-in-script-in-scriptT)r   r6   r%   r7   r   Ú$scriptDataDoubleEscapedDashDashStater   rˆ   r†   r   r   )r   r$   r    r    r!   r‡      s(    







z.HTMLTokenizer.scriptDataDoubleEscapedDashStatec             C   s  | j jƒ }|dkr*| jjtd ddœƒ nÔ|dkrR| jjtd ddœƒ | j| _n¬|dkrz| jjtd ddœƒ | j| _n„|dkr¸| jjtd ddœƒ | jjtd d	dœƒ | j| _nF|t	krà| jjtd d
dœƒ | j
| _n| jjtd |dœƒ | j| _dS )Nr|   rJ   )r#   r$   rD   rj   r[   r"   zinvalid-codepointu   ï¿½zeof-in-script-in-scriptT)r   r6   r%   r7   r   rˆ   r   rf   r†   r   r   )r   r$   r    r    r!   r‰     s,    







z2HTMLTokenizer.scriptDataDoubleEscapedDashDashStatec             C   sP   | j jƒ }|dkr8| jjtd ddœƒ d| _| j| _n| j j|ƒ | j	| _dS )Nri   rJ   )r#   r$   r,   T)
r   r6   r%   r7   r   rr   ÚscriptDataDoubleEscapeEndStater   r=   r†   )r   r$   r    r    r!   rˆ   0  s    

z6HTMLTokenizer.scriptDataDoubleEscapedLessThanSignStatec             C   s˜   | j jƒ }|ttdƒB krR| jjtd |dœƒ | jjƒ dkrH| j	| _
q”| j| _
nB|tkr€| jjtd |dœƒ |  j|7  _n| j j|ƒ | j| _
dS )Nri   rj   rJ   )r#   r$   r…   T)ri   rj   )r   r6   r   r:   r%   r7   r   rr   ru   r�   r   r†   r
   r=   )r   r$   r    r    r!   rŠ   ;  s    


z,HTMLTokenizer.scriptDataDoubleEscapeEndStatec             C   s0  | j jƒ }|tkr$| j jtdƒ �n|tkrJ| jd j|dgƒ | j| _nâ|dkr\| j	ƒ  nÐ|dkrn| j
| _n¾|dkrª| jjtd
 ddœƒ | jd j|dgƒ | j| _n‚|dkræ| jjtd
 ddœƒ | jd jddgƒ | j| _nF|tk�r| jjtd
 ddœƒ | j| _n| jd j|dgƒ | j| _dS )NTr$   r,   rj   ri   ú'ú"rH   rD   r"   z#invalid-character-in-attribute-name)r#   r$   r[   zinvalid-codepointu   ï¿½z#expected-attribute-name-but-got-eof)r‹   rŒ   rH   rD   )r   r6   r   r^   r
   r   r7   ÚattributeNameStater   rZ   rq   r%   r   r   r   )r   r$   r    r    r!   rp   K  s6    










z&HTMLTokenizer.beforeAttributeNameStatec             C   sæ  | j jƒ }d}d}|dkr&| j| _�n0|tkr^| jd d d  || j jtdƒ 7  < d}� nø|dkrld}nê|tkr~| j| _nØ|dkr�| j	| _nÆ|d	krÎ| j
jtd
 ddœƒ | jd d d  d7  < d}nˆ|dk�r| j
jtd
 ddœƒ | jd d d  |7  < d}nH|tk�r8| j
jtd
 ddœƒ | j| _n| jd d d  |7  < d}|�râ| jd d d jtƒ| jd d d< xP| jd d d… D ]:\}}| jd d d |k�r–| j
jtd
 ddœƒ P �q–W |�râ| jƒ  dS )NTFrH   r$   r   r   rj   ri   r[   r"   zinvalid-codepoint)r#   r$   u   ï¿½r‹   rŒ   rD   z#invalid-character-in-attribute-namezeof-in-attribute-namezduplicate-attributerK   rK   )r‹   rŒ   rD   rK   rK   rK   rK   rK   rK   )r   r6   ÚbeforeAttributeValueStater   r
   r   r^   r   ÚafterAttributeNameStaterq   r%   r7   r   r   r   rX   r   rZ   )r   r$   ZleavingThisStateZ	emitTokenrU   Ú_r    r    r!   r�   i  sR    








&
z HTMLTokenizer.attributeNameStatec             C   sF  | j jƒ }|tkr$| j jtdƒ �n|dkr8| j| _�n
|dkrJ| jƒ  nø|tkrp| jd j	|dgƒ | j
| _nÒ|dkr‚| j| _nÀ|dkr¾| jj	td d	d
œƒ | jd j	ddgƒ | j
| _n„|dk� rü| jj	td dd
œƒ | jd j	|dgƒ | j
| _nF|tk�r&| jj	td dd
œƒ | j| _n| jd j	|dgƒ | j
| _dS )NTrH   rj   r$   r,   ri   r[   r"   zinvalid-codepoint)r#   r$   u   ï¿½r‹   rŒ   rD   z&invalid-character-after-attribute-namezexpected-end-of-tag-but-got-eof)r‹   rŒ   rD   )r   r6   r   r^   rŽ   r   rZ   r
   r   r7   r�   rq   r%   r   r   r   )r   r$   r    r    r!   r�   Ÿ  s:    











z%HTMLTokenizer.afterAttributeNameStatec             C   sj  | j jƒ }|tkr$| j jtdƒ �nB|dkr8| j| _�n.|dkrX| j| _| j j|ƒ �n|dkrl| j| _� nú|dkr”| j	j
td ddœƒ | jƒ  nÒ|d	krÖ| j	j
td d
dœƒ | jd d d  d7  < | j| _n�|dk�r| j	j
td ddœƒ | jd d d  |7  < | j| _nL|tk�rD| j	j
td ddœƒ | j| _n"| jd d d  |7  < | j| _dS )NTrŒ   rC   r‹   rj   r"   z.expected-attribute-value-but-got-right-bracket)r#   r$   r[   zinvalid-codepointr$   r   u   ï¿½rH   rD   ú`z"equals-in-unquoted-attribute-valuez$expected-attribute-value-but-got-eofrK   )rH   rD   r‘   rK   rK   )r   r6   r   r^   ÚattributeValueDoubleQuotedStater   ÚattributeValueUnQuotedStater=   ÚattributeValueSingleQuotedStater%   r7   r   rZ   r   r   r   )r   r$   r    r    r!   rŽ   ¿  s>    










z'HTMLTokenizer.beforeAttributeValueStatec             C   s¼   | j jƒ }|dkr| j| _nœ|dkr0| jdƒ nˆ|dkrj| jjtd ddœƒ | jd d d  d	7  < nN|t	kr’| jjtd d
dœƒ | j
| _n&| jd d d  || j jdƒ 7  < dS )NrŒ   rC   r[   r"   zinvalid-codepoint)r#   r$   r$   r   u   ï¿½z#eof-in-attribute-value-double-quoteTrK   rK   )rŒ   rC   r[   )r   r6   ÚafterAttributeValueStater   rT   r%   r7   r   r   r   r   r^   )r   r$   r    r    r!   r’   á  s     




z-HTMLTokenizer.attributeValueDoubleQuotedStatec             C   s¼   | j jƒ }|dkr| j| _nœ|dkr0| jdƒ nˆ|dkrj| jjtd ddœƒ | jd d d  d	7  < nN|t	kr’| jjtd d
dœƒ | j
| _n&| jd d d  || j jdƒ 7  < dS )Nr‹   rC   r[   r"   zinvalid-codepoint)r#   r$   r$   r   u   ï¿½z#eof-in-attribute-value-single-quoteTrK   rK   )r‹   rC   r[   )r   r6   r•   r   rT   r%   r7   r   r   r   r   r^   )r   r$   r    r    r!   r”   ô  s     




z-HTMLTokenizer.attributeValueSingleQuotedStatec             C   s  | j jƒ }|tkr| j| _� nð|dkr2| jdƒ nÜ|dkrD| jƒ  nÊ|dkr~| jjt	d d	d
œƒ | j
d d d  |7  < n�|dkr¸| jjt	d dd
œƒ | j
d d d  d7  < nV|tkrà| jjt	d dd
œƒ | j| _n.| j
d d d  || j jtdƒtB ƒ 7  < dS )NrC   rj   rŒ   r‹   rH   rD   r‘   r"   z0unexpected-character-in-unquoted-attribute-value)r#   r$   r$   r   r[   zinvalid-codepointu   ï¿½z eof-in-attribute-value-no-quotesT)rŒ   r‹   rH   rD   r‘   rK   rK   rK   )rC   rj   rŒ   r‹   rH   rD   r‘   r[   )r   r6   r   rp   r   rT   rZ   r%   r7   r   r   r   r   r^   r:   )r   r$   r    r    r!   r“     s,    





z)HTMLTokenizer.attributeValueUnQuotedStatec             C   s¢   | j jƒ }|tkr| j| _n‚|dkr.| jƒ  np|dkr@| j| _n^|tkrt| jj	t
d ddœƒ | j j|ƒ | j| _n*| jj	t
d ddœƒ | j j|ƒ | j| _dS )Nrj   ri   r"   z$unexpected-EOF-after-attribute-value)r#   r$   z*unexpected-character-after-attribute-valueT)r   r6   r   rp   r   rZ   rq   r   r%   r7   r   r=   r   )r   r$   r    r    r!   r•      s"    






z&HTMLTokenizer.afterAttributeValueStatec             C   sˆ   | j jƒ }|dkr&d| jd< | jƒ  n^|tkrZ| jjtd ddœƒ | j j|ƒ | j	| _
n*| jjtd ddœƒ | j j|ƒ | j| _
dS )Nrj   TrW   r"   z#unexpected-EOF-after-solidus-in-tag)r#   r$   z)unexpected-character-after-solidus-in-tag)r   r6   r   rZ   r   r%   r7   r   r=   r   r   rp   )r   r$   r    r    r!   rq   4  s    





z&HTMLTokenizer.selfClosingStartTagStatec             C   sD   | j jdƒ}|jddƒ}| jjtd |dœƒ | j jƒ  | j| _dS )Nrj   r[   u   ï¿½ÚComment)r#   r$   T)	r   r^   Úreplacer%   r7   r   r6   r   r   )r   r$   r    r    r!   ro   F  s    
zHTMLTokenizer.bogusCommentStatec             C   sˆ  | j jƒ g}|d dkrT|j| j jƒ ƒ |d dkrPtd ddœ| _| j| _dS � nô|d dkr¼d}x.d&D ]&}|j| j jƒ ƒ |d' |krjd}P qjW |rºtd dd d ddœ| _| j| _dS nŒ|d( dk�rH| jd k	�rH| jj	j
�rH| jj	j
d) j| jj	jk�rHd}x2d*D ]*}|j| j jƒ ƒ |d+ |k�rd}P �qW |�rH| j| _dS | jjtd ddœƒ x|�rz| j j|jƒ ƒ �q`W | j| _dS ),Nr   r|   r–   r,   )r#   r$   TÚdÚDÚoÚOr@   ÚCÚtÚTÚyÚYÚpÚPÚeÚEFZDoctype)r#   rU   ÚpublicIdÚsystemIdÚcorrectú[ÚAr"   zexpected-dashes-or-doctyperK   rK   rK   )r˜   r™   ©rš   r›   ©r@   rœ   ©r�   rž   ©rŸ   r    ©r¡   r¢   ©r£   r¤   )rª   r«   r¬   r­   r®   r¯   rK   rK   rK   )rœ   r™   r©   rž   r©   r¨   rK   )r   r6   r7   r   r   ÚcommentStartStater   ÚdoctypeStater   ZtreeZopenElementsÚ	namespaceZdefaultNamespaceÚcdataSectionStater%   r=   r'   ro   )r   r?   ÚmatchedÚexpectedr    r    r!   rl   U  sR    


z(HTMLTokenizer.markupDeclarationOpenStatec             C   sØ   | j jƒ }|dkr| j| _n¸|dkrN| jjtd ddœƒ | jd  d7  < n†|dkr„| jjtd d	dœƒ | jj| jƒ | j| _nP|t	krº| jjtd d
dœƒ | jj| jƒ | j| _n| jd  |7  < | j
| _dS )Nr|   r[   r"   zinvalid-codepoint)r#   r$   r$   u   ï¿½rj   zincorrect-commentzeof-in-commentT)r   r6   ÚcommentStartDashStater   r%   r7   r   r   r   r   ÚcommentState)r   r$   r    r    r!   r°   ‚  s(    






zHTMLTokenizer.commentStartStatec             C   sÜ   | j jƒ }|dkr| j| _n¼|dkrN| jjtd ddœƒ | jd  d7  < nŠ|dkr„| jjtd d	dœƒ | jj| jƒ | j| _nT|t	krº| jjtd d
dœƒ | jj| jƒ | j| _n| jd  d| 7  < | j
| _dS )Nr|   r[   r"   zinvalid-codepoint)r#   r$   r$   u   -ï¿½rj   zincorrect-commentzeof-in-commentT)r   r6   ÚcommentEndStater   r%   r7   r   r   r   r   r·   )r   r$   r    r    r!   r¶   ™  s(    






z#HTMLTokenizer.commentStartDashStatec             C   s¦   | j jƒ }|dkr| j| _n†|dkrN| jjtd ddœƒ | jd  d7  < nT|tkr„| jjtd ddœƒ | jj| jƒ | j	| _n| jd  || j j
d
ƒ 7  < d	S )Nr|   r[   r"   zinvalid-codepoint)r#   r$   r$   u   ï¿½zeof-in-commentT)r|   r[   )r   r6   ÚcommentEndDashStater   r%   r7   r   r   r   r   r^   )r   r$   r    r    r!   r·   °  s    




zHTMLTokenizer.commentStatec             C   s®   | j jƒ }|dkr| j| _nŽ|dkrV| jjtd ddœƒ | jd  d7  < | j| _nT|t	krŒ| jjtd ddœƒ | jj| jƒ | j
| _n| jd  d| 7  < | j| _d	S )
Nr|   r[   r"   zinvalid-codepoint)r#   r$   r$   u   -ï¿½zeof-in-comment-end-dashT)r   r6   r¸   r   r%   r7   r   r   r·   r   r   )r   r$   r    r    r!   r¹   Â  s     





z!HTMLTokenizer.commentEndDashStatec             C   s,  | j jƒ }|dkr*| jj| jƒ | j| _nþ|dkrd| jjtd ddœƒ | jd  d7  < | j| _nÄ|dkrŒ| jjtd d	dœƒ | j	| _nœ|d
kr¾| jjtd ddœƒ | jd  |7  < nj|t
krô| jjtd ddœƒ | jj| jƒ | j| _n4| jjtd ddœƒ | jd  d| 7  < | j| _dS )Nrj   r[   r"   zinvalid-codepoint)r#   r$   r$   u   --ï¿½rh   z,unexpected-bang-after-double-dash-in-commentr|   z,unexpected-dash-after-double-dash-in-commentzeof-in-comment-double-dashzunexpected-char-in-commentz--T)r   r6   r%   r7   r   r   r   r   r·   ÚcommentEndBangStater   )r   r$   r    r    r!   r¸   Õ  s6    









zHTMLTokenizer.commentEndStatec             C   sà   | j jƒ }|dkr*| jj| jƒ | j| _n²|dkrN| jd  d7  < | j| _nŽ|dkrˆ| jjtd ddœƒ | jd  d	7  < | j	| _nT|t
kr¾| jjtd d
dœƒ | jj| jƒ | j| _n| jd  d| 7  < | j	| _dS )Nrj   r|   r$   z--!r[   r"   zinvalid-codepoint)r#   r$   u   --!ï¿½zeof-in-comment-end-bang-stateT)r   r6   r%   r7   r   r   r   r¹   r   r·   r   )r   r$   r    r    r!   rº   ô  s(    






z!HTMLTokenizer.commentEndBangStatec             C   sŠ   | j jƒ }|tkr| j| _nj|tkr\| jjtd ddœƒ d| j	d< | jj| j	ƒ | j
| _n*| jjtd ddœƒ | j j|ƒ | j| _dS )Nr"   z!expected-doctype-name-but-got-eof)r#   r$   Fr§   zneed-space-after-doctypeT)r   r6   r   ÚbeforeDoctypeNameStater   r   r%   r7   r   r   r   r=   )r   r$   r    r    r!   r±     s    





zHTMLTokenizer.doctypeStatec             C   sÜ   | j jƒ }|tkrnÄ|dkrT| jjtd ddœƒ d| jd< | jj| jƒ | j| _n„|dkr†| jjtd ddœƒ d	| jd
< | j	| _nR|t
krÆ| jjtd ddœƒ d| jd< | jj| jƒ | j| _n|| jd
< | j	| _dS )Nrj   r"   z+expected-doctype-name-but-got-right-bracket)r#   r$   Fr§   r[   zinvalid-codepointu   ï¿½rU   z!expected-doctype-name-but-got-eofT)r   r6   r   r%   r7   r   r   r   r   ÚdoctypeNameStater   )r   r$   r    r    r!   r»     s.    










z$HTMLTokenizer.beforeDoctypeNameStatec             C   s  | j jƒ }|tkr2| jd jtƒ| jd< | j| _nØ|dkrh| jd jtƒ| jd< | jj	| jƒ | j
| _n¢|dkr¢| jj	td ddœƒ | jd  d7  < | j| _nh|tkrø| jj	td ddœƒ d	| jd
< | jd jtƒ| jd< | jj	| jƒ | j
| _n| jd  |7  < dS )NrU   rj   r[   r"   zinvalid-codepoint)r#   r$   u   ï¿½zeof-in-doctype-nameFr§   T)r   r6   r   r   rX   r   ÚafterDoctypeNameStater   r%   r7   r   r   r¼   r   )r   r$   r    r    r!   r¼   6  s,    







zHTMLTokenizer.doctypeNameStatec             C   sR  | j jƒ }|tkr�n8|dkr8| jj| jƒ | j| _�n|tkr†d| jd< | j j	|ƒ | jjt
d ddœƒ | jj| jƒ | j| _� nÈ|d!krÊd	}x$d'D ]}| j jƒ }||kr˜d}P q˜W |rÈ| j| _d	S nJ|d(k�rd	}x(d.D ] }| j jƒ }||k� rÞd}P � qÞW |�r| j| _d	S | j j	|ƒ | jjt
d dd|id œƒ d| jd< | j| _d	S )/Nrj   Fr§   r"   zeof-in-doctype)r#   r$   r¡   r¢   TÚuÚUÚbÚBÚlÚLÚiÚIr@   rœ   ÚsÚSrŸ   r    r�   rž   r£   r¤   ÚmÚMz*expected-space-or-right-bracket-in-doctyper$   )r#   r$   r.   )r¡   r¢   ©r¾   r¿   ©rÀ   rÁ   ©rÂ   rÃ   ©rÄ   rÅ   ©r@   rœ   )rÊ   rË   rÌ   rÍ   rÎ   )rÆ   rÇ   ©rŸ   r    ©rÆ   rÇ   ©r�   rž   ©r£   r¤   ©rÈ   rÉ   )rÏ   rÐ   rÑ   rÒ   rÓ   )r   r6   r   r%   r7   r   r   r   r   r=   r   ÚafterDoctypePublicKeywordStateÚafterDoctypeSystemKeywordStateÚbogusDoctypeState)r   r$   r´   rµ   r    r    r!   r½   O  sT    







z#HTMLTokenizer.afterDoctypeNameStatec             C   s¨   | j jƒ }|tkr| j| _nˆ|d
krP| jjtd ddœƒ | j j|ƒ | j| _nT|t	kr�| jjtd ddœƒ d| j
d< | jj| j
ƒ | j| _n| j j|ƒ | j| _d	S )Nr‹   rŒ   r"   zunexpected-char-in-doctype)r#   r$   zeof-in-doctypeFr§   T)r‹   rŒ   )r   r6   r   Ú"beforeDoctypePublicIdentifierStater   r%   r7   r   r=   r   r   r   )r   r$   r    r    r!   rÔ   ‚  s"    






z,HTMLTokenizer.afterDoctypePublicKeywordStatec             C   sø   | j jƒ }|tkrnà|dkr0d| jd< | j| _nÄ|dkrLd| jd< | j| _n¨|dkrŒ| jjt	d ddœƒ d	| jd
< | jj| jƒ | j
| _nh|tkrÌ| jjt	d ddœƒ d	| jd
< | jj| jƒ | j
| _n(| jjt	d ddœƒ d	| jd
< | j| _dS )NrŒ   r,   r¥   r‹   rj   r"   zunexpected-end-of-doctype)r#   r$   Fr§   zeof-in-doctypezunexpected-char-in-doctypeT)r   r6   r   r   Ú(doctypePublicIdentifierDoubleQuotedStater   Ú(doctypePublicIdentifierSingleQuotedStater%   r7   r   r   r   rÖ   )r   r$   r    r    r!   r×   –  s4    












z0HTMLTokenizer.beforeDoctypePublicIdentifierStatec             C   sä   | j jƒ }|dkr| j| _nÄ|dkrN| jjtd ddœƒ | jd  d7  < n’|dkrŽ| jjtd d	dœƒ d
| jd< | jj| jƒ | j| _nR|t	krÎ| jjtd ddœƒ d
| jd< | jj| jƒ | j| _n| jd  |7  < dS )NrŒ   r[   r"   zinvalid-codepoint)r#   r$   r¥   u   ï¿½rj   zunexpected-end-of-doctypeFr§   zeof-in-doctypeT)
r   r6   Ú!afterDoctypePublicIdentifierStater   r%   r7   r   r   r   r   )r   r$   r    r    r!   rØ   ³  s*    








z6HTMLTokenizer.doctypePublicIdentifierDoubleQuotedStatec             C   sä   | j jƒ }|dkr| j| _nÄ|dkrN| jjtd ddœƒ | jd  d7  < n’|dkrŽ| jjtd d	dœƒ d
| jd< | jj| jƒ | j| _nR|t	krÎ| jjtd ddœƒ d
| jd< | jj| jƒ | j| _n| jd  |7  < dS )Nr‹   r[   r"   zinvalid-codepoint)r#   r$   r¥   u   ï¿½rj   zunexpected-end-of-doctypeFr§   zeof-in-doctypeT)
r   r6   rÚ   r   r%   r7   r   r   r   r   )r   r$   r    r    r!   rÙ   Ë  s*    








z6HTMLTokenizer.doctypePublicIdentifierSingleQuotedStatec             C   s  | j jƒ }|tkr| j| _nì|dkr<| jj| jƒ | j| _nÌ|dkrn| jjt	d ddœƒ d| jd< | j
| _nš|dkr | jjt	d ddœƒ d| jd< | j| _nh|tkrà| jjt	d d	dœƒ d
| jd< | jj| jƒ | j| _n(| jjt	d ddœƒ d
| jd< | j| _dS )Nrj   rŒ   r"   zunexpected-char-in-doctype)r#   r$   r,   r¦   r‹   zeof-in-doctypeFr§   T)r   r6   r   Ú-betweenDoctypePublicAndSystemIdentifiersStater   r%   r7   r   r   r   Ú(doctypeSystemIdentifierDoubleQuotedStateÚ(doctypeSystemIdentifierSingleQuotedStater   rÖ   )r   r$   r    r    r!   rÚ   ã  s6    













z/HTMLTokenizer.afterDoctypePublicIdentifierStatec             C   sØ   | j jƒ }|tkrnÀ|dkr4| jj| jƒ | j| _n |dkrPd| jd< | j| _n„|dkrld| jd< | j	| _nh|t
kr¬| jjtd ddœƒ d	| jd
< | jj| jƒ | j| _n(| jjtd ddœƒ d	| jd
< | j| _dS )Nrj   rŒ   r,   r¦   r‹   r"   zeof-in-doctype)r#   r$   Fr§   zunexpected-char-in-doctypeT)r   r6   r   r%   r7   r   r   r   rÜ   rÝ   r   r   rÖ   )r   r$   r    r    r!   rÛ     s.    










z;HTMLTokenizer.betweenDoctypePublicAndSystemIdentifiersStatec             C   s¨   | j jƒ }|tkr| j| _nˆ|d
krP| jjtd ddœƒ | j j|ƒ | j| _nT|t	kr�| jjtd ddœƒ d| j
d< | jj| j
ƒ | j| _n| j j|ƒ | j| _d	S )Nr‹   rŒ   r"   zunexpected-char-in-doctype)r#   r$   zeof-in-doctypeFr§   T)r‹   rŒ   )r   r6   r   Ú"beforeDoctypeSystemIdentifierStater   r%   r7   r   r=   r   r   r   )r   r$   r    r    r!   rÕ     s"    






z,HTMLTokenizer.afterDoctypeSystemKeywordStatec             C   sø   | j jƒ }|tkrnà|dkr0d| jd< | j| _nÄ|dkrLd| jd< | j| _n¨|dkrŒ| jjt	d ddœƒ d	| jd
< | jj| jƒ | j
| _nh|tkrÌ| jjt	d ddœƒ d	| jd
< | jj| jƒ | j
| _n(| jjt	d ddœƒ d	| jd
< | j| _dS )NrŒ   r,   r¦   r‹   rj   r"   zunexpected-char-in-doctype)r#   r$   Fr§   zeof-in-doctypeT)r   r6   r   r   rÜ   r   rÝ   r%   r7   r   r   r   rÖ   )r   r$   r    r    r!   rÞ   /  s4    












z0HTMLTokenizer.beforeDoctypeSystemIdentifierStatec             C   sä   | j jƒ }|dkr| j| _nÄ|dkrN| jjtd ddœƒ | jd  d7  < n’|dkrŽ| jjtd d	dœƒ d
| jd< | jj| jƒ | j| _nR|t	krÎ| jjtd ddœƒ d
| jd< | jj| jƒ | j| _n| jd  |7  < dS )NrŒ   r[   r"   zinvalid-codepoint)r#   r$   r¦   u   ï¿½rj   zunexpected-end-of-doctypeFr§   zeof-in-doctypeT)
r   r6   Ú!afterDoctypeSystemIdentifierStater   r%   r7   r   r   r   r   )r   r$   r    r    r!   rÜ   L  s*    








z6HTMLTokenizer.doctypeSystemIdentifierDoubleQuotedStatec             C   sä   | j jƒ }|dkr| j| _nÄ|dkrN| jjtd ddœƒ | jd  d7  < n’|dkrŽ| jjtd d	dœƒ d
| jd< | jj| jƒ | j| _nR|t	krÎ| jjtd ddœƒ d
| jd< | jj| jƒ | j| _n| jd  |7  < dS )Nr‹   r[   r"   zinvalid-codepoint)r#   r$   r¦   u   ï¿½rj   zunexpected-end-of-doctypeFr§   zeof-in-doctypeT)
r   r6   rß   r   r%   r7   r   r   r   r   )r   r$   r    r    r!   rÝ   d  s*    








z6HTMLTokenizer.doctypeSystemIdentifierSingleQuotedStatec             C   s–   | j jƒ }|tkrn~|dkr4| jj| jƒ | j| _n^|tkrt| jjt	d ddœƒ d| jd< | jj| jƒ | j| _n| jjt	d ddœƒ | j
| _dS )	Nrj   r"   zeof-in-doctype)r#   r$   Fr§   zunexpected-char-in-doctypeT)r   r6   r   r%   r7   r   r   r   r   r   rÖ   )r   r$   r    r    r!   rß   |  s     





z/HTMLTokenizer.afterDoctypeSystemIdentifierStatec             C   sZ   | j jƒ }|dkr*| jj| jƒ | j| _n,|tkrV| j j|ƒ | jj| jƒ | j| _n dS )Nrj   T)	r   r6   r%   r7   r   r   r   r   r=   )r   r$   r    r    r!   rÖ   �  s    


zHTMLTokenizer.bogusDoctypeStatec             C   sü   g }x€|j | jjdƒƒ |j | jjdƒƒ | jjƒ }|tkr@P q|dksLt‚|d dd … dkrx|d d d… |d< P q|j |ƒ qW dj|ƒ}|jdƒ}|dkrÖx&t|ƒD ]}| j	j t
d	 d
dœƒ q¬W |jddƒ}|rð| j	j t
d |dœƒ | j| _dS )Nú]rj   r   é   z]]r,   r[   r   r"   zinvalid-codepoint)r#   r$   u   ï¿½rJ   TrK   éþÿÿÿrK   râ   rK   )r7   r   r^   r6   r   ÚAssertionErrorr9   ÚcountÚranger%   r   r—   r   r   )r   r$   r6   Z	nullCountr�   r    r    r!   r³   �  s0    



zHTMLTokenizer.cdataSectionState)N)NF)NÚ__name__Ú
__module__Ú__qualname__Ú__doc__r   r)   rB   rS   rT   rZ   r   r\   rb   r`   rd   rf   rg   r]   rm   rn   ra   rs   rt   rc   rw   rx   re   ry   r{   rz   r}   r�   r   r~   r€   r‚   r„   rƒ   r†   r‡   r‰   rˆ   rŠ   rp   r�   r�   rŽ   r’   r”   r“   r•   rq   ro   rl   r°   r¶   r·   r¹   r¸   rº   r±   r»   r¼   r½   rÔ   r×   rØ   rÙ   rÚ   rÛ   rÕ   rÞ   rÜ   rÝ   rß   rÖ   r³   Ú__classcell__r    r    )r   r!   r      s”   H
P#

6 "-3r   N)Z
__future__r   r   r   Zsixr   r;   Úcollectionsr   Z	constantsr   r	   r
   r   r   r   r   r   r   r   Z_inputstreamr   Z_trier   rL   Úobjectr   r    r    r    r!   Ú<module>   s   