o
    ‹¨Êh+ ã                   @   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                    sJ   t |fi |¤Ž| _|| _d| _g | _| j| _d| _d | _t	t
| ƒ ¡  d S ©NF)r   ÚstreamÚparserÚ
escapeFlagÚlastFourCharsÚ	dataStateÚstateÚescapeÚcurrentTokenÚsuperr   Ú__init__)Úselfr   r   Úkwargs©Ú	__class__© úE/var/www/html/env/lib/python3.10/site-packages/html5lib/_tokenizer.pyr   "   s   zHTMLTokenizer.__init__c                 c   sf   � t g ƒ| _|  ¡ r1| jjrtd | jj d¡dœV  | jjs| jr+| j ¡ V  | js"|  ¡ s
dS 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 ¡ }||v r+|tur+| |¡ | j ¡ }||v r+|tustd |¡|ƒ}|tv rJt| }| j	 t
d dd|idœ¡ n†d|  krTd	ksYn |d
krjd}| j	 t
d dd|idœ¡ nfd|  krtdksžn d|  krdksžn d|  krŠdksžn d|  kr•dksžn |tg d¢ƒv r¬| j	 t
d dd|idœ¡ zt|ƒ}W n tyÏ   |d }td|d? B ƒtd|d@ B ƒ }Y nw |dkrå| j	 t
d ddœ¡ | 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ÿß  éÿÿ õ   ï¿½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þÿ r6   i   i Ü  iÿ  ú;z numeric-entity-without-semicolonr'   )r   r   r   Úcharr   ÚappendÚintÚjoinr   r*   r   Ú	frozensetÚchrÚ
ValueErrorÚunget)	r    ÚisHexÚallowedÚradixÚ	charStackÚcr3   r?   Úvr$   r$   r%   ÚconsumeNumberEntityA   s\   


þ
þ
þ	ý$þÿz!HTMLTokenizer.consumeNumberEntityFc           	      C   s´  d}| j  ¡ g}|d tv s!|d tddfv s!|d ur+||d kr+| j  |d ¡ �n|d dkr„d}| | j  ¡ ¡ |d dv rKd}| | j  ¡ ¡ |rS|d tv s[|si|d tv ri| j  |d ¡ |  |¡}nÈ| j	 t
d	 d
dœ¡ | j  | ¡ ¡ dd |¡ }n­|d tur¡t d |¡¡s“n| | j  ¡ ¡ |d tusŠzt d |d d… ¡¡}t|ƒ}W n ty¾   d }Y nw |d u�r|d dkrÕ| j	 t
d	 ddœ¡ |d dkrÿ|rÿ|| tv sï|| tv sï|| dkrÿ| j  | ¡ ¡ dd |¡ }n2t| }| j  | ¡ ¡ |d ||d … ¡7 }n| j	 t
d	 ddœ¡ | j  | ¡ ¡ dd |¡ }|�rC| jd d d  |7  < d S |tv �rKd}nd}| j	 t
| |dœ¡ d S )Nú&r   ú<ú#Féÿÿÿÿ)ÚxÚXTr&   zexpected-numeric-entityr'   r2   r>   znamed-entity-without-semicolonú=zexpected-named-entityr)   r   ÚSpaceCharactersÚ
Characters)r   r?   r   r   rF   r@   r   r   rM   r*   r   r,   rB   ÚentitiesTrieÚhas_keys_with_prefixÚlongest_prefixÚlenÚKeyErrorr
   r	   r   )	r    ÚallowedCharÚfromAttributeÚoutputrJ   ÚhexÚ
entityNameÚentityLengthÚ	tokenTyper$   r$   r%   ÚconsumeEntity‰   st   ÿÿý	ÿ
ÿÿ
zHTMLTokenizer.consumeEntityc                 C   s   | j |dd� dS )zIThis method replaces the need for "entityInAttributeValueState".
        T)r\   r]   N)rc   )r    r\   r$   r$   r%   ÚprocessEntityInAttributeÙ   s   z&HTMLTokenizer.processEntityInAttributec                 C   sˆ   | j }|d tv r8|d  t¡|d< |d td kr8|d r)| j td ddœ¡ |d r8| j td d	dœ¡ | 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-tagr'   ÚselfClosingzself-closing-flag-on-end-tagN)	r   r   Ú	translater   r   r*   r@   r   r   )r    Útokenr$   r$   r%   ÚemitCurrentTokenÞ   s   ÿÿzHTMLTokenizer.emitCurrentTokenc                 C   sÐ   | j  ¡ }|dkr| j| _d
S |dkr| j| _d
S |dkr5| j td ddœ¡ | j td ddœ¡ d
S |tu r;dS |t	v rS| j td	 || j  
t	d
¡ dœ¡ d
S | j  
d¡}| j td || dœ¡ d
S )NrN   rO   ú r&   úinvalid-codepointr'   rV   FrU   T©rN   rO   rk   )r   r?   ÚentityDataStater   ÚtagOpenStater*   r@   r   r   r   Ú
charsUntil©r    r)   Úcharsr$   r$   r%   r   ò   s6   
éëÿÿðÿ	ýÿzHTMLTokenizer.dataStatec                 C   ó   |   ¡  | j| _dS ©NT)rc   r   r   r.   r$   r$   r%   rn     ó   zHTMLTokenizer.entityDataStatec                 C   sÐ   | j  ¡ }|dkr| j| _dS |dkr| j| _dS |tkrdS |dkr;| j td ddœ¡ | j td d	dœ¡ dS |t	v rS| j td
 || j  
t	d¡ dœ¡ dS | j  
d¡}| j td || dœ¡ dS )NrN   rO   Frk   r&   rl   r'   rV   r7   rU   Trm   )r   r?   ÚcharacterReferenceInRcdatar   ÚrcdataLessThanSignStater   r*   r@   r   r   rp   rq   r$   r$   r%   ÚrcdataState  s6   
éëÿÿóÿ	ýÿzHTMLTokenizer.rcdataStatec                 C   rs   rt   )rc   rx   r   r.   r$   r$   r%   rv   1  ru   z(HTMLTokenizer.characterReferenceInRcdatac                 C   óŒ   | j  ¡ }|dkr| j| _d
S |dkr+| j td ddœ¡ | j td ddœ¡ d
S |tkr1dS | j  d	¡}| j td || dœ¡ d
S ©NrO   rk   r&   rl   r'   rV   r7   F)rO   rk   T)	r   r?   ÚrawtextLessThanSignStater   r*   r@   r   r   rp   rq   r$   r$   r%   ÚrawtextState6  ó&   
ôÿÿ	ùÿzHTMLTokenizer.rawtextStatec                 C   ry   rz   )	r   r?   ÚscriptDataLessThanSignStater   r*   r@   r   r   rp   rq   r$   r$   r%   ÚscriptDataStateH  r}   zHTMLTokenizer.scriptDataStatec                 C   st   | j  ¡ }|tkrdS |dkr'| j td ddœ¡ | j td ddœ¡ dS | j td || j  d¡ dœ¡ dS )	NFrk   r&   rl   r'   rV   r7   T)r   r?   r   r*   r@   r   rp   ©r    r)   r$   r$   r%   ÚplaintextStateZ  s   
ÿÿþÿzHTMLTokenizer.plaintextStatec                 C   s  | j  ¡ }|dkr| j| _dS |dkr| j| _dS |tv r.td |g dddœ| _| j| _dS |dkrN| j	 
td dd	œ¡ | j	 
td
 dd	œ¡ | j| _dS |dkri| j	 
td dd	œ¡ | j  |¡ | j| _dS | j	 
td dd	œ¡ | j	 
td
 dd	œ¡ | j  |¡ | j| _dS )Nú!ú/ÚStartTagF)r(   re   r)   rg   ÚselfClosingAcknowledgedú>r&   z'expected-tag-name-but-got-right-bracketr'   rV   z<>ú?z'expected-tag-name-but-got-question-markzexpected-tag-namerO   T)r   r?   ÚmarkupDeclarationOpenStater   ÚcloseTagOpenStater
   r   r   ÚtagNameStater*   r@   r   rF   ÚbogusCommentStater€   r$   r$   r%   ro   i  sH   
ãåýëÿòÿûÿzHTMLTokenizer.tagOpenStatec                 C   sÐ   | j  ¡ }|tv rtd |g ddœ| _| j| _dS |dkr.| j td ddœ¡ | j	| _dS |t
u rN| j td ddœ¡ | j td	 d
dœ¡ | j	| _dS | j td dd|idœ¡ | j  |¡ | j| _dS )Nrf   F©r(   re   r)   rg   r†   r&   z*expected-closing-tag-but-got-right-bracketr'   z expected-closing-tag-but-got-eofrV   ú</z!expected-closing-tag-but-got-charr)   r4   T)r   r?   r
   r   r   rŠ   r   r*   r@   r   r   rF   r‹   r€   r$   r$   r%   r‰   Œ  s6   
ÿðÿôÿûþzHTMLTokenizer.closeTagOpenStatec                 C   sº   | j  ¡ }|tv r| j| _d
S |dkr|  ¡  d
S |tu r.| j t	d ddœ¡ | j
| _d
S |dkr8| j| _d
S |dkrR| j t	d ddœ¡ | jd  d	7  < d
S | jd  |7  < d
S )Nr†   r&   zeof-in-tag-namer'   rƒ   rk   rl   re   r7   T)r   r?   r   ÚbeforeAttributeNameStater   rj   r   r*   r@   r   r   ÚselfClosingStartTagStater   r€   r$   r$   r%   rŠ   ¤  s0   
ðòÿö	øÿýzHTMLTokenizer.tagNameStatec                 C   óR   | j  ¡ }|dkrd| _| j| _dS | j td ddœ¡ | j  |¡ | j	| _dS ©Nrƒ   r2   rV   rO   r'   T)
r   r?   ÚtemporaryBufferÚrcdataEndTagOpenStater   r*   r@   r   rF   rx   r€   r$   r$   r%   rw   º  ó   
ýz%HTMLTokenizer.rcdataLessThanSignStatec                 C   óZ   | j  ¡ }|tv r|  j|7  _| j| _dS | j td ddœ¡ | j  	|¡ | j
| _dS ©NrV   r�   r'   T)r   r?   r
   r’   ÚrcdataEndTagNameStater   r*   r@   r   rF   rx   r€   r$   r$   r%   r“   Å  ó   
ýz#HTMLTokenizer.rcdataEndTagOpenStatec                 C   ó  | j o| j d  ¡ | j ¡ k}| j ¡ }|tv r+|r+td | jg ddœ| _ | j| _d
S |dkrB|rBtd | jg ddœ| _ | j	| _d
S |dkr]|r]td | jg ddœ| _ |  
¡  | j| _d
S |tv rj|  j|7  _d
S | j td d| j d	œ¡ | j |¡ | j| _d
S ©Nre   rf   FrŒ   rƒ   r†   rV   r�   r'   T)r   Úlowerr’   r   r?   r   r   rŽ   r   r�   rj   r   r
   r*   r@   rF   rx   ©r    Úappropriater)   r$   r$   r%   r—   Ð  óB   
þîþóþùüÿz#HTMLTokenizer.rcdataEndTagNameStatec                 C   r�   r‘   )
r   r?   r’   ÚrawtextEndTagOpenStater   r*   r@   r   rF   r|   r€   r$   r$   r%   r{   ì  r”   z&HTMLTokenizer.rawtextLessThanSignStatec                 C   r•   r–   )r   r?   r
   r’   ÚrawtextEndTagNameStater   r*   r@   r   rF   r|   r€   r$   r$   r%   rŸ   ÷  r˜   z$HTMLTokenizer.rawtextEndTagOpenStatec                 C   r™   rš   )r   r›   r’   r   r?   r   r   rŽ   r   r�   rj   r   r
   r*   r@   rF   r|   rœ   r$   r$   r%   r      rž   z$HTMLTokenizer.rawtextEndTagNameStatec                 C   s|   | j  ¡ }|dkrd| _| j| _dS |dkr'| j td ddœ¡ | j| _dS | j td ddœ¡ | j  	|¡ | j
| _dS )	Nrƒ   r2   r‚   rV   z<!r'   rO   T)r   r?   r’   ÚscriptDataEndTagOpenStater   r*   r@   r   ÚscriptDataEscapeStartStaterF   r   r€   r$   r$   r%   r~     s   
ùýz)HTMLTokenizer.scriptDataLessThanSignStatec                 C   r•   r–   )r   r?   r
   r’   ÚscriptDataEndTagNameStater   r*   r@   r   rF   r   r€   r$   r$   r%   r¡   ,  r˜   z'HTMLTokenizer.scriptDataEndTagOpenStatec                 C   r™   rš   )r   r›   r’   r   r?   r   r   rŽ   r   r�   rj   r   r
   r*   r@   rF   r   rœ   r$   r$   r%   r£   7  rž   z'HTMLTokenizer.scriptDataEndTagNameStatec                 C   óL   | j  ¡ }|dkr| j td ddœ¡ | j| _dS | j  |¡ | j| _dS ©Nú-rV   r'   T)	r   r?   r*   r@   r   ÚscriptDataEscapeStartDashStater   rF   r   r€   r$   r$   r%   r¢   S  ó   
þz(HTMLTokenizer.scriptDataEscapeStartStatec                 C   r¤   r¥   )	r   r?   r*   r@   r   ÚscriptDataEscapedDashDashStater   rF   r   r€   r$   r$   r%   r§   ]  r¨   z,HTMLTokenizer.scriptDataEscapeStartDashStatec                 C   s¾   | j  ¡ }|dkr| j td ddœ¡ | j| _d
S |dkr$| j| _d
S |dkr@| j td ddœ¡ | j td ddœ¡ d
S |tkrJ| j	| _d
S | j  
d	¡}| j td || dœ¡ d
S )Nr¦   rV   r'   rO   rk   r&   rl   r7   )rO   r¦   rk   T)r   r?   r*   r@   r   ÚscriptDataEscapedDashStater   Ú"scriptDataEscapedLessThanSignStater   r   rp   rq   r$   r$   r%   ÚscriptDataEscapedStateg  s0   
óõÿÿúýÿz$HTMLTokenizer.scriptDataEscapedStatec                 C   s¾   | j  ¡ }|dkr| j td ddœ¡ | j| _d	S |dkr$| j| _d	S |dkrD| j td ddœ¡ | j td ddœ¡ | j| _d	S |t	krN| j
| _d	S | j td |dœ¡ | j| _d	S )
Nr¦   rV   r'   rO   rk   r&   rl   r7   T)r   r?   r*   r@   r   r©   r   r«   r¬   r   r   r€   r$   r$   r%   rª   {  s.   
óõÿÿûþz(HTMLTokenizer.scriptDataEscapedDashStatec                 C   sà   | j  ¡ }|dkr| j td ddœ¡ d
S |dkr | j| _d
S |dkr5| j td ddœ¡ | j| _d
S |dkrU| j td ddœ¡ | j td d	dœ¡ | j| _d
S |t	kr_| j
| _d
S | j td |dœ¡ | j| _d
S )Nr¦   rV   r'   rO   r†   rk   r&   rl   r7   T)r   r?   r*   r@   r   r«   r   r   r¬   r   r   r€   r$   r$   r%   r©   �  s4   
ðòõÿÿûþz,HTMLTokenizer.scriptDataEscapedDashDashStatec                 C   s†   | j  ¡ }|dkrd| _| j| _dS |tv r,| j td d| dœ¡ || _| j	| _dS | j td ddœ¡ | j  
|¡ | j| _dS r‘   )r   r?   r’   Ú scriptDataEscapedEndTagOpenStater   r
   r*   r@   r   Ú scriptDataDoubleEscapeStartStaterF   r¬   r€   r$   r$   r%   r«   ¥  s   
	øýz0HTMLTokenizer.scriptDataEscapedLessThanSignStatec                 C   sR   | j  ¡ }|tv r|| _| j| _dS | j td ddœ¡ | j  	|¡ | j
| _dS r–   )r   r?   r
   r’   Ú scriptDataEscapedEndTagNameStater   r*   r@   r   rF   r¬   r€   r$   r$   r%   r­   ´  r”   z.HTMLTokenizer.scriptDataEscapedEndTagOpenStatec                 C   r™   rš   )r   r›   r’   r   r?   r   r   rŽ   r   r�   rj   r   r
   r*   r@   rF   r¬   rœ   r$   r$   r%   r¯   ¿  rž   z.HTMLTokenizer.scriptDataEscapedEndTagNameStatec                 C   óž   | j  ¡ }|ttdƒB v r+| j td |dœ¡ | j ¡ dkr%| j	| _
dS | j| _
dS |tv rC| j td |dœ¡ |  j|7  _dS | j  |¡ | j| _
dS ©N)rƒ   r†   rV   r'   ÚscriptT)r   r?   r   rC   r*   r@   r   r’   r›   ÚscriptDataDoubleEscapedStater   r¬   r
   rF   r€   r$   r$   r%   r®   Û  ó   
	ùúþz.HTMLTokenizer.scriptDataDoubleEscapeStartStatec                 C   sÚ   | j  ¡ }|dkr| j td ddœ¡ | j| _d
S |dkr/| j td ddœ¡ | j| _d
S |dkrK| j td ddœ¡ | j td ddœ¡ d
S |tkr`| j td d	dœ¡ | j	| _d
S | j td |dœ¡ d
S ©Nr¦   rV   r'   rO   rk   r&   rl   r7   úeof-in-script-in-scriptT)
r   r?   r*   r@   r   Ú scriptDataDoubleEscapedDashStater   Ú(scriptDataDoubleEscapedLessThanSignStater   r   r€   r$   r$   r%   r³   ë  s2   
òõÿÿúÿÿz*HTMLTokenizer.scriptDataDoubleEscapedStatec                 C   sê   | j  ¡ }|dkr| j td ddœ¡ | j| _d
S |dkr/| j td ddœ¡ | j| _d
S |dkrO| j td ddœ¡ | j td ddœ¡ | j| _d
S |t	krd| j td d	dœ¡ | j
| _d
S | j td |dœ¡ | j| _d
S rµ   )r   r?   r*   r@   r   Ú$scriptDataDoubleEscapedDashDashStater   r¸   r³   r   r   r€   r$   r$   r%   r·      s6   
ðóÿÿùÿþz.HTMLTokenizer.scriptDataDoubleEscapedDashStatec                 C   s  | j  ¡ }|dkr| j td ddœ¡ dS |dkr+| j td ddœ¡ | j| _dS |dkr@| j td ddœ¡ | j| _dS |dkr`| j td ddœ¡ | j td d	dœ¡ | j| _dS |t	kru| j td d
dœ¡ | j
| _dS | j td |dœ¡ | j| _dS )Nr¦   rV   r'   rO   r†   rk   r&   rl   r7   r¶   T)r   r?   r*   r@   r   r¸   r   r   r³   r   r   r€   r$   r$   r%   r¹     s<   
íðóÿÿùÿþz2HTMLTokenizer.scriptDataDoubleEscapedDashDashStatec                 C   sR   | j  ¡ }|dkr| j td ddœ¡ d| _| j| _dS | j  |¡ | j	| _dS )Nrƒ   rV   r'   r2   T)
r   r?   r*   r@   r   r’   ÚscriptDataDoubleEscapeEndStater   rF   r³   r€   r$   r$   r%   r¸   0  s   
þz6HTMLTokenizer.scriptDataDoubleEscapedLessThanSignStatec                 C   r°   r±   )r   r?   r   rC   r*   r@   r   r’   r›   r¬   r   r³   r
   rF   r€   r$   r$   r%   rº   ;  r´   z,HTMLTokenizer.scriptDataDoubleEscapeEndStatec                 C   s:  | j  ¡ }|tv r| j  td¡ dS |tv r&| jd  |dg¡ | j| _dS |dkr0|  	¡  dS |dkr:| j
| _dS |dv rY| j td dd	œ¡ | jd  |dg¡ | j| _dS |d
krx| j td dd	œ¡ | jd  ddg¡ | j| _dS |tu r�| j td dd	œ¡ | j| _dS | jd  |dg¡ | j| _dS )NTr)   r2   r†   rƒ   )ú'ú"rT   rO   r&   ú#invalid-character-in-attribute-namer'   rk   rl   r7   z#expected-attribute-name-but-got-eof)r   r?   r   rp   r
   r   r@   ÚattributeNameStater   rj   r�   r*   r   r   r   r€   r$   r$   r%   rŽ   K  sJ   
èëíïÿôÿùÿþz&HTMLTokenizer.beforeAttributeNameStatec                 C   sÔ  | j  ¡ }d}d}|dkr| j| _n•|tv r-| jd d d  || j  td¡ 7  < d}nz|dkr4d}ns|tv r=| j| _nj|dkrF| j	| _na|d	kre| j
 td
 ddœ¡ | jd d d  d7  < d}nB|dv r„| j
 td
 ddœ¡ | jd d d  |7  < d}n#|tu r˜| j
 td
 ddœ¡ | j| _n| jd d d  |7  < d}|rè| jd d d  t¡| jd d d< | jd d d… D ]\}}| jd d d |krá| j
 td
 ddœ¡  nqÅ|rè|  ¡  dS )NTFrT   r)   rQ   r   r†   rƒ   rk   r&   rl   r'   r7   ©r»   r¼   rO   r½   zeof-in-attribute-namezduplicate-attribute)r   r?   ÚbeforeAttributeValueStater   r
   r   rp   r   ÚafterAttributeNameStater�   r*   r@   r   r   r   rh   r   rj   )r    r)   ÚleavingThisStateÚ	emitTokenre   Ú_r$   r$   r%   r¾   i  s`   

ÿ

ÿþÿ
ÿÿýz HTMLTokenizer.attributeNameStatec                 C   sN  | j  ¡ }|tv r| j  td¡ dS |dkr| j| _dS |dkr&|  ¡  dS |tv r:| jd  	|dg¡ | j
| _dS |dkrD| j| _dS |dkrc| j 	td d	d
œ¡ | jd  	ddg¡ | j
| _dS |dv r‚| j 	td dd
œ¡ | jd  	|dg¡ | j
| _dS |tu r—| j 	td dd
œ¡ | j| _dS | jd  	|dg¡ | j
| _dS )NTrT   r†   r)   r2   rƒ   rk   r&   rl   r'   r7   r¿   z&invalid-character-after-attribute-namezexpected-end-of-tag-but-got-eof)r   r?   r   rp   rÀ   r   rj   r
   r   r@   r¾   r�   r*   r   r   r   r€   r$   r$   r%   rÁ   Ÿ  sP   
æèêíïÿôÿùÿþz%HTMLTokenizer.afterAttributeNameStatec                 C   sn  | j  ¡ }|tv r| j  td¡ dS |dkr| j| _dS |dkr,| j| _| j  |¡ dS |dkr6| j| _dS |dkrK| j	 
td ddœ¡ |  ¡  dS |d	krm| j	 
td d
dœ¡ | jd d d  d7  < | j| _dS |dv r�| j	 
td ddœ¡ | jd d d  |7  < | j| _dS |tu r¤| j	 
td ddœ¡ | j| _dS | jd d d  |7  < | j| _dS )NTr¼   rN   r»   r†   r&   z.expected-attribute-value-but-got-right-bracketr'   rk   rl   r)   rQ   r   r7   )rT   rO   ú`z"equals-in-unquoted-attribute-valuez$expected-attribute-value-but-got-eof)r   r?   r   rp   ÚattributeValueDoubleQuotedStater   ÚattributeValueUnQuotedStaterF   ÚattributeValueSingleQuotedStater*   r@   r   rj   r   r   r   r€   r$   r$   r%   rÀ   ¿  sV   
äæéëÿïÿôÿùÿþz'HTMLTokenizer.beforeAttributeValueStatec                 C   óÄ   | j  ¡ }|dkr| j| _dS |dkr|  d¡ dS |dkr8| j td ddœ¡ | jd d d	  d
7  < dS |t	u rM| j td ddœ¡ | j
| _dS | jd d d	  || j  d¡ 7  < dS )Nr¼   rN   rk   r&   rl   r'   r)   rQ   r   r7   z#eof-in-attribute-value-double-quote)r¼   rN   rk   T©r   r?   ÚafterAttributeValueStater   rd   r*   r@   r   r   r   r   rp   r€   r$   r$   r%   rÆ   á  ó.   
ó
õÿùÿþ
ÿz-HTMLTokenizer.attributeValueDoubleQuotedStatec                 C   rÉ   )Nr»   rN   rk   r&   rl   r'   r)   rQ   r   r7   z#eof-in-attribute-value-single-quote)r»   rN   rk   TrÊ   r€   r$   r$   r%   rÈ   ô  rÌ   z-HTMLTokenizer.attributeValueSingleQuotedStatec                 C   s  | j  ¡ }|tv r| j| _dS |dkr|  d¡ dS |dkr$|  ¡  dS |dv rB| j t	d ddœ¡ | j
d d d	  |7  < dS |d
kr`| j t	d ddœ¡ | j
d d d	  d7  < dS |tu ru| j t	d ddœ¡ | j| _dS | j
d d d	  || j  tdƒtB ¡ 7  < dS )NrN   r†   )r¼   r»   rT   rO   rÅ   r&   z0unexpected-character-in-unquoted-attribute-valuer'   r)   rQ   r   rk   rl   r7   z eof-in-attribute-value-no-quotes)rN   r†   r¼   r»   rT   rO   rÅ   rk   T)r   r?   r   rŽ   r   rd   rj   r*   r@   r   r   r   r   rp   rC   r€   r$   r$   r%   rÇ     s@   
í
ïñÿõÿùÿþ

ÿz)HTMLTokenizer.attributeValueUnQuotedStatec                 C   sª   | j  ¡ }|tv r| j| _dS |dkr|  ¡  dS |dkr#| j| _dS |tu r>| j 	t
d ddœ¡ | j  |¡ | j| _dS | j 	t
d ddœ¡ | j  |¡ | j| _dS )Nr†   rƒ   r&   z$unexpected-EOF-after-attribute-valuer'   z*unexpected-character-after-attribute-valueT)r   r?   r   rŽ   r   rj   r�   r   r*   r@   r   rF   r   r€   r$   r$   r%   rË      s.   
òôöÿüÿz&HTMLTokenizer.afterAttributeValueStatec                 C   sŒ   | j  ¡ }|dkrd| jd< |  ¡  dS |tu r/| j td ddœ¡ | j  |¡ | j	| _
dS | j td ddœ¡ | j  |¡ | j| _
dS )Nr†   Trg   r&   z#unexpected-EOF-after-solidus-in-tagr'   z)unexpected-character-after-solidus-in-tag)r   r?   r   rj   r   r*   r@   r   rF   r   r   rŽ   r€   r$   r$   r%   r�   4  s$   

õþüÿz&HTMLTokenizer.selfClosingStartTagStatec                 C   sD   | j  d¡}| dd¡}| j td |dœ¡ | j  ¡  | j| _dS )Nr†   rk   r7   ÚCommentr'   T)	r   rp   Úreplacer*   r@   r   r?   r   r   r€   r$   r$   r%   r‹   F  s   ÿ
zHTMLTokenizer.bogusCommentStatec                 C   sn  | j  ¡ g}|d dkr)| | j  ¡ ¡ |d dkr(td ddœ| _| j| _dS nq|d dv r\d}dD ]}| | j  ¡ ¡ |d |vrGd	} nq3|r[td
 dd d ddœ| _| j| _dS n>|d dkrš| jd urš| jj	j
rš| jj	j
d j| jj	jkršd}dD ]}| | j  ¡ ¡ |d |kr‘d	} nq}|rš| j| _dS | j td ddœ¡ |r±| j  | ¡ ¡ |s§| j| _dS )NrQ   r¦   rÍ   r2   r'   T)ÚdÚD))ÚoÚO©rK   ÚC©ÚtÚT©ÚyÚY©ÚpÚP©ÚeÚEFÚDoctype)r(   re   ÚpublicIdÚsystemIdÚcorrectú[)rÔ   rÐ   ÚAr×   ræ   rå   r&   zexpected-dashes-or-doctype)r   r?   r@   r   r   ÚcommentStartStater   ÚdoctypeStater   ÚtreeÚopenElementsÚ	namespaceÚdefaultNamespaceÚcdataSectionStater*   rF   r,   r‹   )r    rJ   ÚmatchedÚexpectedr$   r$   r%   rˆ   U  s`   ýþýú
ÿþÿÿz(HTMLTokenizer.markupDeclarationOpenStatec                 C   sà   | j  ¡ }|dkr| j| _dS |dkr)| j td ddœ¡ | jd  d7  < dS |dkrE| j td d	dœ¡ | j | j¡ | j| _dS |t	u ra| j td d
dœ¡ | j | j¡ | j| _dS | jd  |7  < | j
| _dS )Nr¦   rk   r&   rl   r'   r)   r7   r†   úincorrect-commentúeof-in-commentT)r   r?   ÚcommentStartDashStater   r*   r@   r   r   r   r   ÚcommentStater€   r$   r$   r%   rç   ‚  s6   
ïÿóÿ	øÿþzHTMLTokenizer.commentStartStatec                 C   sä   | j  ¡ }|dkr| j| _dS |dkr)| j td ddœ¡ | jd  d7  < dS |dkrE| j td d	dœ¡ | j | j¡ | j| _dS |t	u ra| j td d
dœ¡ | j | j¡ | j| _dS | jd  d| 7  < | j
| _dS )Nr¦   rk   r&   rl   r'   r)   õ   -ï¿½r†   rð   rñ   T)r   r?   ÚcommentEndStater   r*   r@   r   r   r   r   ró   r€   r$   r$   r%   rò   ™  s6   
ïÿóÿ	øÿþz#HTMLTokenizer.commentStartDashStatec                 C   s¬   | j  ¡ }|dkr| j| _d
S |dkr)| j td ddœ¡ | jd  d7  < d
S |tu rE| j td ddœ¡ | j | j¡ | j	| _d
S | jd  || j  
d	¡ 7  < d
S )Nr¦   rk   r&   rl   r'   r)   r7   rñ   )r¦   rk   T)r   r?   ÚcommentEndDashStater   r*   r@   r   r   r   r   rp   r€   r$   r$   r%   ró   °  s*   
ôÿ	øÿþ
ÿzHTMLTokenizer.commentStatec                 C   s´   | j  ¡ }|dkr| j| _d	S |dkr-| j td ddœ¡ | jd  d7  < | j| _d	S |t	u rI| j td ddœ¡ | j | j¡ | j
| _d	S | jd  d| 7  < | j| _d	S )
Nr¦   rk   r&   rl   r'   r)   rô   zeof-in-comment-end-dashT)r   r?   rõ   r   r*   r@   r   r   ró   r   r   r€   r$   r$   r%   rö   Â  s*   
óÿ	øÿþz!HTMLTokenizer.commentEndDashStatec                 C   s6  | j  ¡ }|dkr| j | j¡ | j| _dS |dkr4| j td ddœ¡ | jd  d7  < | j| _dS |dkrI| j td d	dœ¡ | j	| _dS |d
krc| j td ddœ¡ | jd  |7  < dS |t
u r| j td ddœ¡ | j | j¡ | j| _dS | j td ddœ¡ | jd  d| 7  < | j| _dS )Nr†   rk   r&   rl   r'   r)   u   --ï¿½r‚   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   r?   r*   r@   r   r   r   r   ró   ÚcommentEndBangStater   r€   r$   r$   r%   rõ   Õ  sJ   
èÿíÿñÿõÿüÿzHTMLTokenizer.commentEndStatec                 C   sè   | j  ¡ }|dkr| j | j¡ | j| _dS |dkr)| jd  d7  < | j| _dS |dkrG| j td ddœ¡ | jd  d	7  < | j	| _dS |t
u rc| j td d
dœ¡ | j | j¡ | j| _dS | jd  d| 7  < | j	| _dS )Nr†   r¦   r)   z--!rk   r&   rl   r'   u   --!ï¿½zeof-in-comment-end-bang-stateT)r   r?   r*   r@   r   r   r   rö   r   ró   r   r€   r$   r$   r%   r÷   ô  s4   
ðóÿ	øÿþz!HTMLTokenizer.commentEndBangStatec                 C   sŽ   | j  ¡ }|tv r| j| _dS |tu r0| j td ddœ¡ d| j	d< | j | j	¡ | j
| _dS | j td ddœ¡ | j  |¡ | j| _dS )Nr&   ú!expected-doctype-name-but-got-eofr'   Frä   zneed-space-after-doctypeT)r   r?   r   ÚbeforeDoctypeNameStater   r   r*   r@   r   r   r   rF   r€   r$   r$   r%   rè     s$   
õÿ
üÿzHTMLTokenizer.doctypeStatec                 C   sæ   | j  ¡ }|tv r	 dS |dkr-| j td ddœ¡ d| jd< | j | j¡ | j| _dS |dkrG| j td ddœ¡ d	| jd
< | j	| _dS |t
u rh| j td ddœ¡ d| jd< | j | j¡ | j| _dS || jd
< | j	| _dS )Nr†   r&   z+expected-doctype-name-but-got-right-bracketr'   Frä   rk   rl   r7   re   rø   T)r   r?   r   r*   r@   r   r   r   r   ÚdoctypeNameStater   r€   r$   r$   r%   rù     s<   
ìÿ
òÿ

÷ÿ

þz$HTMLTokenizer.beforeDoctypeNameStatec                 C   s  | j  ¡ }|tv r| jd  t¡| jd< | j| _dS |dkr6| jd  t¡| jd< | j 	| j¡ | j
| _dS |dkrT| j 	td ddœ¡ | jd  d7  < | j| _dS |tu r€| j 	td ddœ¡ d	| jd
< | jd  t¡| jd< | j 	| j¡ | j
| _dS | jd  |7  < dS )Nre   r†   rk   r&   rl   r'   r7   zeof-in-doctype-nameFrä   T)r   r?   r   r   rh   r   ÚafterDoctypeNameStater   r*   r@   r   r   rú   r   r€   r$   r$   r%   rú   6  s8   
îòÿ
÷ÿ
ÿzHTMLTokenizer.doctypeNameStatec                 C   sH  | j  ¡ }|tv r	 dS |dkr| j | j¡ | j| _dS |tu rDd| jd< | j  	|¡ | j t
d ddœ¡ | j | j¡ | j| _dS |dv red}d	D ]}| j  ¡ }||vr[d} nqL|rd| j| _dS n |d
v r…d}dD ]}| j  ¡ }||vr|d} nqm|r…| j| _dS | j  	|¡ | j t
d dd|idœ¡ d| jd< | j| _dS )Nr†   Frä   r&   úeof-in-doctyper'   rÛ   T))ÚuÚU)ÚbÚB)ÚlÚL)ÚiÚIrÓ   ©ÚsÚS)rØ   r  rÕ   rÞ   )ÚmÚMz*expected-space-or-right-bracket-in-doctyper)   r4   )r   r?   r   r*   r@   r   r   r   r   rF   r   ÚafterDoctypePublicKeywordStateÚafterDoctypeSystemKeywordStateÚbogusDoctypeState)r    r)   rî   rï   r$   r$   r%   rû   O  s`   
.Ó+Ö
ÿ$Þ
þþ
þþ
z#HTMLTokenizer.afterDoctypeNameStatec                 C   ó®   | j  ¡ }|tv r| j| _dS |dv r*| j td ddœ¡ | j  |¡ | j| _dS |t	u rK| j td ddœ¡ d| j
d< | j | j
¡ | j| _dS | j  |¡ | j| _dS ©	N)r»   r¼   r&   úunexpected-char-in-doctyper'   rü   Frä   T)r   r?   r   Ú"beforeDoctypePublicIdentifierStater   r*   r@   r   rF   r   r   r   r€   r$   r$   r%   r
  ‚  ó,   
òÿ
÷ÿ
þz,HTMLTokenizer.afterDoctypePublicKeywordStatec                 C   s  | j  ¡ }|tv r	 dS |dkrd| jd< | j| _dS |dkr*d| jd< | j| _dS |dkrK| j t	d ddœ¡ d	| jd
< | j | j¡ | j
| _dS |tu rl| j t	d ddœ¡ d	| jd
< | j | j¡ | j
| _dS | j t	d ddœ¡ d	| jd
< | j| _dS )Nr¼   r2   râ   r»   r†   r&   úunexpected-end-of-doctyper'   Frä   rü   r  T)r   r?   r   r   Ú(doctypePublicIdentifierDoubleQuotedStater   Ú(doctypePublicIdentifierSingleQuotedStater*   r@   r   r   r   r  r€   r$   r$   r%   r  –  óD   
é
ì
ïÿ
õÿ
üÿ
z0HTMLTokenizer.beforeDoctypePublicIdentifierStatec                 C   óì   | j  ¡ }|dkr| j| _dS |dkr)| j td ddœ¡ | jd  d7  < dS |dkrJ| j td d	dœ¡ d
| jd< | j | j¡ | j| _dS |t	u rk| j td ddœ¡ d
| jd< | j | j¡ | j| _dS | jd  |7  < dS )Nr¼   rk   r&   rl   r'   râ   r7   r†   r  Frä   rü   T©
r   r?   Ú!afterDoctypePublicIdentifierStater   r*   r@   r   r   r   r   r€   r$   r$   r%   r  ³  ó8   
îÿòÿ
	øÿ
ÿz6HTMLTokenizer.doctypePublicIdentifierDoubleQuotedStatec                 C   r  )Nr»   rk   r&   rl   r'   râ   r7   r†   r  Frä   rü   Tr  r€   r$   r$   r%   r  Ë  r  z6HTMLTokenizer.doctypePublicIdentifierSingleQuotedStatec                 C   s  | j  ¡ }|tv r| j| _dS |dkr | j | j¡ | j| _dS |dkr:| j t	d ddœ¡ d| jd< | j
| _dS |dkrT| j t	d ddœ¡ d| jd< | j| _dS |tu ru| j t	d d	dœ¡ d
| jd< | j | j¡ | j| _dS | j t	d ddœ¡ d
| jd< | j| _dS )Nr†   r¼   r&   r  r'   r2   rã   r»   rü   Frä   T)r   r?   r   Ú-betweenDoctypePublicAndSystemIdentifiersStater   r*   r@   r   r   r   Ú(doctypeSystemIdentifierDoubleQuotedStateÚ(doctypeSystemIdentifierSingleQuotedStater   r  r€   r$   r$   r%   r  ã  sH   
èëÿ
ðÿ
õÿ
üÿ
z/HTMLTokenizer.afterDoctypePublicIdentifierStatec                 C   sä   | j  ¡ }|tv r	 dS |dkr| j | j¡ | j| _dS |dkr,d| jd< | j| _dS |dkr;d| jd< | j	| _dS |t
kr\| j td ddœ¡ d	| jd
< | j | j¡ | j| _dS | j td ddœ¡ d	| jd
< | j| _dS )Nr†   r¼   r2   rã   r»   r&   rü   r'   Frä   r  T)r   r?   r   r*   r@   r   r   r   r  r  r   r   r  r€   r$   r$   r%   r    s<   
ìï
ò
õÿ
üÿ
z;HTMLTokenizer.betweenDoctypePublicAndSystemIdentifiersStatec                 C   r  r  )r   r?   r   Ú"beforeDoctypeSystemIdentifierStater   r*   r@   r   rF   r   r   r   r€   r$   r$   r%   r    r  z,HTMLTokenizer.afterDoctypeSystemKeywordStatec                 C   s  | j  ¡ }|tv r	 dS |dkrd| jd< | j| _dS |dkr*d| jd< | j| _dS |dkrK| j t	d ddœ¡ d	| jd
< | j | j¡ | j
| _dS |tu rl| j t	d ddœ¡ d	| jd
< | j | j¡ | j
| _dS | j t	d ddœ¡ d	| jd
< | j| _dS )Nr¼   r2   rã   r»   r†   r&   r  r'   Frä   rü   T)r   r?   r   r   r  r   r  r*   r@   r   r   r   r  r€   r$   r$   r%   r  /  r  z0HTMLTokenizer.beforeDoctypeSystemIdentifierStatec                 C   r  )Nr¼   rk   r&   rl   r'   rã   r7   r†   r  Frä   rü   T©
r   r?   Ú!afterDoctypeSystemIdentifierStater   r*   r@   r   r   r   r   r€   r$   r$   r%   r  L  r  z6HTMLTokenizer.doctypeSystemIdentifierDoubleQuotedStatec                 C   r  )Nr»   rk   r&   rl   r'   rã   r7   r†   r  Frä   rü   Tr  r€   r$   r$   r%   r  d  r  z6HTMLTokenizer.doctypeSystemIdentifierSingleQuotedStatec                 C   sž   | j  ¡ }|tv r	 dS |dkr| j | j¡ | j| _dS |tu r>| j t	d ddœ¡ d| jd< | j | j¡ | j| _dS | j t	d ddœ¡ | j
| _dS )	Nr†   r&   rü   r'   Frä   r  T)r   r?   r   r*   r@   r   r   r   r   r   r  r€   r$   r$   r%   r  |  s*   
óöÿ
ýÿz/HTMLTokenizer.afterDoctypeSystemIdentifierStatec                 C   s`   | j  ¡ }|dkr| j | j¡ | j| _dS |tu r-| j  |¡ | j | j¡ | j| _dS 	 dS )Nr†   T)	r   r?   r*   r@   r   r   r   r   rF   r€   r$   r$   r%   r  �  s   
ùÿzHTMLTokenizer.bogusDoctypeStatec                 C   sò   g }	 |  | j d¡¡ |  | j d¡¡ | j ¡ }|tkrn!|dks%J ‚|d dd … dkr:|d d d… |d< n|  |¡ qd |¡}| d¡}|d	krft|ƒD ]}| j  t	d
 ddœ¡ qR| 
dd¡}|rs| j  t	d |dœ¡ | j| _dS )NTú]r†   rQ   éþÿÿÿz]]r2   rk   r   r&   rl   r'   r7   rV   )r@   r   rp   r?   r   rB   ÚcountÚranger*   r   rÎ   r   r   )r    r)   r?   Ú	nullCountrÄ   r$   r$   r%   rí   �  s6   

ô


ÿÿzHTMLTokenizer.cdataSectionState)Nr   )NÚ__name__Ú
__module__Ú__qualname__Ú__doc__r   r/   rM   rc   rd   rj   r   rn   rx   rv   r|   r   r�   ro   r‰   rŠ   rw   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õ   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)Ú
__future__r   r   r   Úsixr   rD   Úcollectionsr   Ú	constantsr   r	   r
   r   r   r   r   r   r   r   Ú_inputstreamr   Ú_trier   rW   Úobjectr   r$   r$   r$   r%   Ú<module>   s    