o
    V=^                    @   s  d dl mZmZmZ d dlmZmZ d dlZddlm	Z	 ddlm
Z
 ddlmZ ddlmZ dd	lmZ dd
lmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z  d ddZ!d!ddZ"dd Z#G dd de$Z%ej&dd Z'dd Z(		d"ddZ)G dd de*Z+dS )#    )absolute_importdivisionunicode_literals)with_metaclassviewkeysN   )_inputstream)
_tokenizer)treebuilders)Marker)_utils)spaceCharactersasciiUpper2LowerspecialElementsheadingElementscdataElementsrcdataElements
tokenTypestagTokenTypes
namespaceshtmlIntegrationPointElements"mathmlTextIntegrationPointElementsadjustForeignAttributesadjustMathMLAttributesadjustSVGAttributesE_ReparseExceptionetreeTc                 K   s(   t |}t||d}|j| fi |S )a  Parse an HTML document as a string or file-like object into a tree

    :arg doc: the document to parse as a string or file-like object

    :arg treebuilder: the treebuilder to use when parsing

    :arg namespaceHTMLElements: whether or not to namespace HTML elements

    :returns: parsed tree

    Example:

    >>> from html5lib.html5parser import parse
    >>> parse('<html><body><p>This is a doc</p></body></html>')
    <Element u'{http://www.w3.org/1999/xhtml}html' at 0x7feac4909db0>

    namespaceHTMLElements)r
   getTreeBuilder
HTMLParserparse)doctreebuilderr   kwargstbp r(   6/usr/lib/python3/dist-packages/html5lib/html5parser.pyr"      s   
r"   divc                 K   s,   t |}t||d}|j| fd|i|S )a#  Parse an HTML fragment as a string or file-like object into a tree

    :arg doc: the fragment to parse as a string or file-like object

    :arg container: the container context to parse the fragment in

    :arg treebuilder: the treebuilder to use when parsing

    :arg namespaceHTMLElements: whether or not to namespace HTML elements

    :returns: parsed tree

    Example:

    >>> from html5lib.html5libparser import parseFragment
    >>> parseFragment('<b>this is a fragment</b>')
    <Element u'DOCUMENT_FRAGMENT' at 0x7feac484b090>

    r   	container)r
   r    r!   parseFragment)r#   r+   r$   r   r%   r&   r'   r(   r(   r)   r,   1   s   
r,   c                    s   G  fdddt }|S )Nc                       s   e Zd Z fddZdS )z-method_decorator_metaclass.<locals>.Decoratedc                    s>   |  D ]\}}t|tjr |}|||< qt| |||S N)items
isinstancetypesFunctionTypetype__new__)metaZ	classnamebasesZ	classDictZattributeNameZ	attributefunctionr(   r)   r3   L   s
   
z5method_decorator_metaclass.<locals>.Decorated.__new__N)__name__
__module____qualname__r3   r(   r6   r(   r)   	DecoratedK   s    r;   )r2   )r7   r;   r(   r6   r)   method_decorator_metaclassJ   s   r<   c                   @   s   e Zd ZdZd'ddZd(dd	Zd
d Ze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d!d" Zd#d$ Zd%d& ZdS )*r!   z]HTML parser

    Generates a tree structure from a stream of (possibly malformed) HTML.

    NFTc                    sH   | _ |du rtd}|| _g  _ fddt| D  _dS )a  
        :arg tree: a treebuilder class controlling the type of tree that will be
            returned. Built in treebuilders can be accessed through
            html5lib.treebuilders.getTreeBuilder(treeType)

        :arg strict: raise an exception when a parse error is encountered

        :arg namespaceHTMLElements: whether or not to namespace HTML elements

        :arg debug: whether or not to enable debug mode which logs things

        Example:

        >>> from html5lib.html5parser import HTMLParser
        >>> parser = HTMLParser()                     # generates parser with etree builder
        >>> parser = HTMLParser('lxml', strict=True)  # generates parser with lxml builder which is strict

        Nr   c                    s   i | ]\}}||  j qS r(   )tree).0nameclsselfr(   r)   
<dictcomp>y   s    z'HTMLParser.__init__.<locals>.<dictcomp>)strictr
   r    r=   errors	getPhasesr.   phases)rB   r=   rD   r   debugr(   rA   r)   __init__]   s   



zHTMLParser.__init__r*   c                 K   sf   || _ || _|| _tj|fd| i|| _|   z|   W d S  ty2   |   |   Y d S w )Nparser)	innerHTMLModer+   	scriptingr	   ZHTMLTokenizer	tokenizerresetmainLoopr   )rB   stream	innerHTMLr+   rL   r%   r(   r(   r)   _parse|   s   zHTMLParser._parsec                 C   s   | j   d| _g | _g | _d| _| jrO| j | _	| j	t
v r&| jj| j_n| j	tv r2| jj| j_n| j	dkr>| jj| j_n	 | jd | _| j  |   n	d| _	| jd | _d | _d | _d| _d S )NFz	no quirks	plaintext
beforeHtmlinitialT)r=   rN   firstStartTagrE   log
compatModerK   r+   lowerrQ   r   rM   rcdataStatestater   rawtextStateplaintextStaterG   phaseinsertHtmlElementresetInsertionModeZ	lastPhaseZbeforeRCDataPhase
framesetOKrA   r(   r(   r)   rN      s,   






zHTMLParser.resetc                 C   s   t | dsdS | jjjd jS )zName of the character encoding that was used to decode the input stream, or
        :obj:`None` if that is not determined yet

        rM   Nr   )hasattrrM   rP   charEncodingr?   rA   r(   r(   r)   documentEncoding   s   
zHTMLParser.documentEncodingc                 C   sF   |j dkr|jtd krd|jv o|jd tdv S |j|j ftv S )Nannotation-xmlmathmlencoding)z	text/htmlzapplication/xhtml+xml)r?   	namespacer   
attributes	translater   r   rB   elementr(   r(   r)   isHTMLIntegrationPoint   s   


z!HTMLParser.isHTMLIntegrationPointc                 C   s   |j |jftv S r-   )rh   r?   r   rk   r(   r(   r)   isMathMLTextIntegrationPoint      z'HTMLParser.isMathMLTextIntegrationPointc                 C   sR  t d }t d }t d }t d }t d }t d }t d }| jD ]}d }	|}
|
d ur|
}	| jjr5| jjd nd }|r<|jnd }|rC|jnd }|
d	 }||kr\| |
d
 |
di  d }
nt| jjdks|| jj	ks| 
|r||kr}|d tddgvs|||fv s|td kr|dkr||kr|d dks| |r||||fv r| j}n| jd }||kr||
}
n1||kr||
}
n'||kr||
}
n||kr||
}
n||kr||
}
n	||kr||
}
|
d us)||kr|	d r|	d s| dd|	d i qd}g }|r'|| j | j }|r"| j|vs"J |sd S d S )N
CharactersZSpaceCharactersStartTagEndTagCommentZDoctype
ParseErrorr2   datadatavarsr   r?   ZmglyphZ
malignmarkrf   re   svginForeignContentselfClosingselfClosingAcknowledgedz&non-void-element-with-trailing-solidusT)r   rM   r=   openElementsrh   r?   
parseErrorgetlendefaultNamespacern   	frozensetr   rm   r^   rG   processCharactersprocessSpaceCharactersprocessStartTagprocessEndTagprocessCommentprocessDoctypeappend
processEOF)rB   ZCharactersTokenZSpaceCharactersTokenZStartTagTokenZEndTagTokenZCommentTokenZDoctypeTokenZParseErrorTokentokenZ
prev_token	new_tokencurrentNodeZcurrentNodeNamespaceZcurrentNodeNamer2   r^   Z	reprocessrG   r(   r(   r)   rO      s   




	


)

zHTMLParser.mainLoopc                 O   s&   | j |ddg|R i | | j S )a  Parse a HTML document into a well-formed tree

        :arg stream: a file-like object or string containing the HTML to be parsed

            The optional encoding parameter must be a string that indicates
            the encoding.  If specified, that encoding will be used,
            regardless of any BOM or later declaration (such as in a meta
            element).

        :arg scripting: treat noscript elements as if JavaScript was turned on

        :returns: parsed tree

        Example:

        >>> from html5lib.html5parser import HTMLParser
        >>> parser = HTMLParser()
        >>> parser.parse('<html><body><p>This is a doc</p></body></html>')
        <Element u'{http://www.w3.org/1999/xhtml}html' at 0x7feac4909db0>

        FN)rR   r=   ZgetDocumentrB   rP   argsr%   r(   r(   r)   r"     s   
zHTMLParser.parsec                 O   s$   | j |dg|R i | | j S )aZ  Parse a HTML fragment into a well-formed tree fragment

        :arg container: name of the element we're setting the innerHTML
            property if set to None, default to 'div'

        :arg stream: a file-like object or string containing the HTML to be parsed

            The optional encoding parameter must be a string that indicates
            the encoding.  If specified, that encoding will be used,
            regardless of any BOM or later declaration (such as in a meta
            element)

        :arg scripting: treat noscript elements as if JavaScript was turned on

        :returns: parsed tree

        Example:

        >>> from html5lib.html5libparser import HTMLParser
        >>> parser = HTMLParser()
        >>> parser.parseFragment('<b>this is a fragment</b>')
        <Element u'DOCUMENT_FRAGMENT' at 0x7feac484b090>

        T)rR   r=   ZgetFragmentr   r(   r(   r)   r,     s   
zHTMLParser.parseFragmentXXX-undefined-errorc                 C   s@   |d u ri }| j | jj ||f | jrtt| | d S r-   )rE   r   rM   rP   ZpositionrD   rt   r   )rB   	errorcoderw   r(   r(   r)   r}   ;  s   zHTMLParser.parseErrorc                 C      t |t d S r-   )adjust_attributesr   rB   r   r(   r(   r)   r   C     z!HTMLParser.adjustMathMLAttributesc                 C   r   r-   )r   r   r   r(   r(   r)   r   F  r   zHTMLParser.adjustSVGAttributesc                 C   r   r-   )r   adjustForeignAttributesMapr   r(   r(   r)   r   I  r   z"HTMLParser.adjustForeignAttributesc                 C   s   | j   d S r-   )rJ   r^   r   r(   r(   r)   reparseTokenNormalL  s   zHTMLParser.reparseTokenNormalc                 C   s   d}ddddddddddd	d	d
dd}| j jd d d D ]B}|j}d }|| j jd kr5| js0J d}| j}|dv r>| js>J |sH|j| j jkrHq||v rU| j||  } n
|r^| jd	 } nq|| _d S )NFinSelectinCellinRowinTableBody	inCaptioninColumnGroupinTableinBody
inFrameset
beforeHead)selecttdthtrtbodytheadtfootcaptioncolgrouptableheadbodyframesethtmlru   r   T)r   r   r   r   )r=   r|   r?   rQ   rh   r   rG   r^   )rB   ZlastZnewModesnodeZnodeNameZ	new_phaser(   r(   r)   r`   P  sF   



zHTMLParser.resetInsertionModec                 C   sR   |dv sJ | j | |dkr| jj| j_n| jj| j_| j| _| jd | _d S )N)RAWTEXTRCDATAr   text)	r=   insertElementrM   r\   r[   rZ   r^   originalPhaserG   )rB   r   ZcontentTyper(   r(   r)   parseRCDataRawtext|  s   zHTMLParser.parseRCDataRawtext)NFTF)Fr*   F)r   N)r8   r9   r:   __doc__rI   rR   rN   propertyrd   rm   rn   rO   r"   r,   r}   r   r   r   r   r`   r   r(   r(   r(   r)   r!   V   s&    

"
	
C
,r!   c                    sH  dd }dd }G dd dt || |G dd d}G d	d
 d
}G dd d}G dd d}G dd d}G dd d}G  fddd G dd d}	G fddd}
G fdddG fddd}G fddd}G fdd d }G fd!d"d"}G fd#d$d$}G fd%d&d&}G d'd( d(}G fd)d*d*}G d+d, d,}G fd-d.d.}G fd/d0d0}G d1d2 d2}G d3d4 d4}i d5|d6|d7|d8|d9|d:|d; d<|	d=|
d>d?|d@|dA|dB|dC|dD|dE|||||||dFS )GNc                    s$   dd t  D  fdd}|S )z4Logger that records which phase processes each tokenc                 S   s   i | ]\}}||qS r(   r(   )r>   keyvaluer(   r(   r)   rC     s    z*getPhases.<locals>.log.<locals>.<dictcomp>c                    s    j drFt|dkrF|d }d|d  i}|d tv r$|d |d< | jj| jjjj | jj	j
j | j
j  j |f  | g|R i |S  | g|R i |S )NZprocessr   r2   r?   )r8   
startswithr   r   rJ   rW   r   rM   r[   r^   	__class__)rB   r   r%   r   infor7   Z
type_namesr(   r)   wrapped  s   
z'getPhases.<locals>.log.<locals>.wrapped)r   r.   )r7   r   r(   r   r)   rW     s   zgetPhases.<locals>.logc                 S   s   | rt |S tS r-   )r<   r2   )Zuse_metaclassZmetaclass_funcr(   r(   r)   getMetaclass  s   zgetPhases.<locals>.getMetaclassc                   @   s\   e Zd ZdZdZdd Zdd Zdd Zd	d
 Zdd Z	dd Z
dd Zdd Zdd ZdS )zgetPhases.<locals>.PhasezNBase class for helper object that implements each phase of processing
        )rJ   r=   Z__startTagCacheZ__endTagCachec                 S   s   || _ || _i | _i | _d S r-   )rJ   r=   _Phase__startTagCache_Phase__endTagCache)rB   rJ   r=   r(   r(   r)   rI     s   
z!getPhases.<locals>.Phase.__init__c                 S   s   t r-   )NotImplementedErrorrA   r(   r(   r)   r        z#getPhases.<locals>.Phase.processEOFc                 S      | j || j jd  d S )Nru   r=   insertCommentr|   r   r(   r(   r)   r        z'getPhases.<locals>.Phase.processCommentc                 S      | j d d S )Nzunexpected-doctyperJ   r}   r   r(   r(   r)   r     ro   z'getPhases.<locals>.Phase.processDoctypec                 S      | j |d  d S Nrv   r=   
insertTextr   r(   r(   r)   r        z*getPhases.<locals>.Phase.processCharactersc                 S   r   r   r   r   r(   r(   r)   r     r   z/getPhases.<locals>.Phase.processSpaceCharactersc                 S      |d }|| j v r| j | }||S | j|  }| j |< t| j t| jd kr?| j tt| j  t| j t| jd ks(||S Nr?   g?)r   startTagHandlerr   popnextiterrB   r   r?   funcr(   r(   r)   r        

z(getPhases.<locals>.Phase.processStartTagc                 S   sf   | j js|d dkr| j d |d  D ]\}}|| jjd jvr,|| jjd j|< qd| j _d S )Nr?   r   znon-html-rootrv   r   F)rJ   rV   r}   r.   r=   r|   ri   rB   r   attrr   r(   r(   r)   startTagHtml  s   z%getPhases.<locals>.Phase.startTagHtmlc                 S   r   r   )r   endTagHandlerr   r   r   r   r   r(   r(   r)   r     r   z&getPhases.<locals>.Phase.processEndTagN)r8   r9   r:   r   	__slots__rI   r   r   r   r   r   r   r   r   r(   r(   r(   r)   Phase  s    
r   c                   @   sR   e Zd Ze 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 )zgetPhases.<locals>.InitialPhasec                 S      d S r-   r(   r   r(   r(   r)   r     r   z6getPhases.<locals>.InitialPhase.processSpaceCharactersc                 S      | j || j j d S r-   r=   r   Zdocumentr   r(   r(   r)   r        z.getPhases.<locals>.InitialPhase.processCommentc                 S   s   |d }|d }|d }|d }|dks |d us |d ur&|dkr&| j d |d u r,d}| j| |dkr;|t}|r]|d dks]|d	s]|d
v s]|drU|d u s]|rb| dkrbd| j _n|dsp|drt|d urtd| j _| j j	d | j _
d S )Nr?   publicIdsystemIdcorrectr   zabout:legacy-compatzunknown-doctype )7z*+//silmaril//dtd html pro v0r11 19970101//z4-//advasoft ltd//dtd html 3.0 aswedit + extensions//z*-//as//dtd html 3.0 aswedit + extensions//z-//ietf//dtd html 2.0 level 1//z-//ietf//dtd html 2.0 level 2//z&-//ietf//dtd html 2.0 strict level 1//z&-//ietf//dtd html 2.0 strict level 2//z-//ietf//dtd html 2.0 strict//z-//ietf//dtd html 2.0//z-//ietf//dtd html 2.1e//z-//ietf//dtd html 3.0//z-//ietf//dtd html 3.2 final//z-//ietf//dtd html 3.2//z-//ietf//dtd html 3//z-//ietf//dtd html level 0//z-//ietf//dtd html level 1//z-//ietf//dtd html level 2//z-//ietf//dtd html level 3//z"-//ietf//dtd html strict level 0//z"-//ietf//dtd html strict level 1//z"-//ietf//dtd html strict level 2//z"-//ietf//dtd html strict level 3//z-//ietf//dtd html strict//z-//ietf//dtd html//z(-//metrius//dtd metrius presentational//z5-//microsoft//dtd internet explorer 2.0 html strict//z.-//microsoft//dtd internet explorer 2.0 html//z0-//microsoft//dtd internet explorer 2.0 tables//z5-//microsoft//dtd internet explorer 3.0 html strict//z.-//microsoft//dtd internet explorer 3.0 html//z0-//microsoft//dtd internet explorer 3.0 tables//z#-//netscape comm. corp.//dtd html//z*-//netscape comm. corp.//dtd strict html//z*-//o'reilly and associates//dtd html 2.0//z3-//o'reilly and associates//dtd html extended 1.0//z;-//o'reilly and associates//dtd html extended relaxed 1.0//zN-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//zE-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//z$-//spyglass//dtd html 2.0 extended//z+-//sq//dtd html 2.0 hotmetal + extensions//z--//sun microsystems corp.//dtd hotjava html//z4-//sun microsystems corp.//dtd hotjava strict html//z-//w3c//dtd html 3 1995-03-24//z-//w3c//dtd html 3.2 draft//z-//w3c//dtd html 3.2 final//z-//w3c//dtd html 3.2//z-//w3c//dtd html 3.2s draft//z-//w3c//dtd html 4.0 frameset//z#-//w3c//dtd html 4.0 transitional//z(-//w3c//dtd html experimental 19960712//z&-//w3c//dtd html experimental 970421//z-//w3c//dtd w3 html//z-//w3o//dtd w3 html 3.0//z#-//webtechs//dtd mozilla html 2.0//z-//webtechs//dtd mozilla html//)z$-//w3o//dtd w3 html strict 3.0//en//z"-/w3c/dtd html 4.0 transitional/enr   )z -//w3c//dtd html 4.01 frameset//z$-//w3c//dtd html 4.01 transitional//z:http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtdquirks)z -//w3c//dtd xhtml 1.0 frameset//z$-//w3c//dtd xhtml 1.0 transitional//zlimited quirksrT   )rJ   r}   r=   ZinsertDoctyperj   r   r   rY   rX   rG   r^   )rB   r   r?   r   r   r   r(   r(   r)   r     sX   
9<?@
@
Az.getPhases.<locals>.InitialPhase.processDoctypec                 S   s   d| j _| j jd | j _d S )Nr   rT   )rJ   rX   rG   r^   rA   r(   r(   r)   anythingElseZ  s   z,getPhases.<locals>.InitialPhase.anythingElsec                 S      | j d |   |S )Nzexpected-doctype-but-got-charsrJ   r}   r   r   r(   r(   r)   r   ^     z1getPhases.<locals>.InitialPhase.processCharactersc                 S   "   | j dd|d i |   |S )Nz"expected-doctype-but-got-start-tagr?   r   r   r(   r(   r)   r   c  
   
z/getPhases.<locals>.InitialPhase.processStartTagc                 S   r   )Nz expected-doctype-but-got-end-tagr?   r   r   r(   r(   r)   r   i  r   z-getPhases.<locals>.InitialPhase.processEndTagc                 S      | j d |   dS )Nzexpected-doctype-but-got-eofTr   rA   r(   r(   r)   r   o  r   z*getPhases.<locals>.InitialPhase.processEOFN)r8   r9   r:   tupler   r   r   r   r   r   r   r   r   r(   r(   r(   r)   InitialPhase  s    _r   c                   @   sJ   e Zd Ze Zdd Zdd Zdd Zdd Zd	d
 Z	dd Z
dd ZdS )z"getPhases.<locals>.BeforeHtmlPhasec                 S   s&   | j tdd | jjd | j_d S )Nr   rq   r   )r=   Z
insertRootimpliedTagTokenrJ   rG   r^   rA   r(   r(   r)   r_   x  s   z4getPhases.<locals>.BeforeHtmlPhase.insertHtmlElementc                 S      |    dS NTr_   rA   r(   r(   r)   r   }     z-getPhases.<locals>.BeforeHtmlPhase.processEOFc                 S   r   r-   r   r   r(   r(   r)   r     r   z1getPhases.<locals>.BeforeHtmlPhase.processCommentc                 S   r   r-   r(   r   r(   r(   r)   r     r   z9getPhases.<locals>.BeforeHtmlPhase.processSpaceCharactersc                 S      |    |S r-   r   r   r(   r(   r)   r     r   z4getPhases.<locals>.BeforeHtmlPhase.processCharactersc                 S   s    |d dkr
d| j _|   |S )Nr?   r   T)rJ   rV   r_   r   r(   r(   r)   r     s   z2getPhases.<locals>.BeforeHtmlPhase.processStartTagc                 S   s2   |d dvr| j dd|d i d S |   |S )Nr?   r   r   r   brzunexpected-end-tag-before-html)rJ   r}   r_   r   r(   r(   r)   r     s   
z0getPhases.<locals>.BeforeHtmlPhase.processEndTagN)r8   r9   r:   r   r   r_   r   r   r   r   r   r   r(   r(   r(   r)   BeforeHtmlPhaset  s    r   c                   @   s   e Zd Ze 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edefde	fgZe
e_edefgZee_dS )z"getPhases.<locals>.BeforeHeadPhasec                 S   s   |  tdd dS )Nr   rq   TstartTagHeadr   rA   r(   r(   r)   r        z-getPhases.<locals>.BeforeHeadPhase.processEOFc                 S   r   r-   r(   r   r(   r(   r)   r     r   z9getPhases.<locals>.BeforeHeadPhase.processSpaceCharactersc                 S      |  tdd |S Nr   rq   r   r   r(   r(   r)   r     r   z4getPhases.<locals>.BeforeHeadPhase.processCharactersc                 S      | j jd |S Nr   rJ   rG   r   r   r(   r(   r)   r        z/getPhases.<locals>.BeforeHeadPhase.startTagHtmlc                 S   s0   | j | | j jd | j _| jjd | j_d S )Nru   inHead)r=   r   r|   headPointerrJ   rG   r^   r   r(   r(   r)   r     s   z/getPhases.<locals>.BeforeHeadPhase.startTagHeadc                 S   r   r   r   r   r(   r(   r)   startTagOther  r   z0getPhases.<locals>.BeforeHeadPhase.startTagOtherc                 S   r   r   r   r   r(   r(   r)   endTagImplyHead  r   z2getPhases.<locals>.BeforeHeadPhase.endTagImplyHeadc                 S      | j dd|d i d S )Nzend-tag-after-implied-rootr?   r   r   r(   r(   r)   endTagOther     
z.getPhases.<locals>.BeforeHeadPhase.endTagOtherr   r   r   N)r8   r9   r:   r   r   r   r   r   r   r   r  r  r  r   MethodDispatcherr   defaultr   r(   r(   r(   r)   BeforeHeadPhase  s&    
r  c                   @   s   e Zd Ze 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edefd efd!efd"efd#efd$e	fd%e
fd&efgZee_ed&efd'efgZee_d(S ))zgetPhases.<locals>.InHeadPhasec                 S   r   r   r   rA   r(   r(   r)   r     r   z)getPhases.<locals>.InHeadPhase.processEOFc                 S   r   r-   r  r   r(   r(   r)   r     r   z0getPhases.<locals>.InHeadPhase.processCharactersc                 S   r   r   r   r   r(   r(   r)   r     r  z+getPhases.<locals>.InHeadPhase.startTagHtmlc                 S   r   )Nz!two-heads-are-not-better-than-oner   r   r(   r(   r)   r     ro   z+getPhases.<locals>.InHeadPhase.startTagHeadc                 S   $   | j | | j j  d|d< d S NTr{   r=   r   r|   r   r   r(   r(   r)   startTagBaseLinkCommand     z6getPhases.<locals>.InHeadPhase.startTagBaseLinkCommandc                 S   s   | j | | j j  d|d< |d }| jjjjd dkr[d|v r.| jjj|d  d S d|v r]d|v r_|d 	 d	krat
|d d
}t
|}| }| jjj| d S d S d S d S d S )NTr{   rv   r   Z	tentativecharsetZcontentz
http-equivzcontent-typezutf-8)r=   r   r|   r   rJ   rM   rP   rc   ZchangeEncodingrY   r   ZEncodingBytesencodeZContentAttrParserr"   )rB   r   ri   rv   rJ   codecr(   r(   r)   startTagMeta  s$   
z+getPhases.<locals>.InHeadPhase.startTagMetac                 S      | j |d d S )Nr   rJ   r   r   r(   r(   r)   startTagTitle  r  z,getPhases.<locals>.InHeadPhase.startTagTitlec                 S   r  )Nr   r  r   r(   r(   r)   startTagNoFramesStyle     z4getPhases.<locals>.InHeadPhase.startTagNoFramesStylec                 S   s:   | j jr| j |d d S | j| | j jd | j _d S )Nr   inHeadNoscript)rJ   rL   r   r=   r   rG   r^   r   r(   r(   r)   startTagNoscript  s   z/getPhases.<locals>.InHeadPhase.startTagNoscriptc                 S   s<   | j | | jjj| jj_| jj| j_| jjd | j_d S )Nr   )	r=   r   rJ   rM   ZscriptDataStater[   r^   r   rG   r   r(   r(   r)   startTagScript   s   z-getPhases.<locals>.InHeadPhase.startTagScriptc                 S   r   r-   r  r   r(   r(   r)   r    r   z,getPhases.<locals>.InHeadPhase.startTagOtherc                 S   :   | j jj }|jdksJ d|j | j jd | j _d S )Nr   zExpected head got %s	afterHeadrJ   r=   r|   r   r?   rG   r^   rB   r   r   r(   r(   r)   
endTagHead
     z)getPhases.<locals>.InHeadPhase.endTagHeadc                 S   r   r-   r  r   r(   r(   r)   endTagHtmlBodyBr  r   z/getPhases.<locals>.InHeadPhase.endTagHtmlBodyBrc                 S   r  Nunexpected-end-tagr?   r   r   r(   r(   r)   r       z*getPhases.<locals>.InHeadPhase.endTagOtherc                 S      |  td d S )Nr   )r"  r   rA   r(   r(   r)   r     r  z+getPhases.<locals>.InHeadPhase.anythingElser   title)noframesstylenoscriptscript)basebasefontbgsoundcommandlinkr4   r   )r   r   r   N)r8   r9   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)   InHeadPhase  sF    
r3  c                   @   s   e Zd Ze 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ede	fde
fdefgZee_edefdefgZee_dS )z&getPhases.<locals>.InHeadNoscriptPhasec                 S   r   )Nzeof-in-head-noscriptTr   rA   r(   r(   r)   r   /  r   z1getPhases.<locals>.InHeadNoscriptPhase.processEOFc                 S   r   Nr  )rJ   rG   r   r   r(   r(   r)   r   4  r  z5getPhases.<locals>.InHeadNoscriptPhase.processCommentc                 S   r   )Nzchar-in-head-noscriptr   r   r(   r(   r)   r   7  r   z8getPhases.<locals>.InHeadNoscriptPhase.processCharactersc                 S   r   r4  rJ   rG   r   r   r(   r(   r)   r   <  r  z=getPhases.<locals>.InHeadNoscriptPhase.processSpaceCharactersc                 S   r   r   r   r   r(   r(   r)   r   ?  r  z3getPhases.<locals>.InHeadNoscriptPhase.startTagHtmlc                 S   r   r4  r   r   r(   r(   r)   r  B  r  z>getPhases.<locals>.InHeadNoscriptPhase.startTagBaseLinkCommandc                 S   r  Nunexpected-start-tagr?   r   r   r(   r(   r)   startTagHeadNoscriptE  r'  z;getPhases.<locals>.InHeadNoscriptPhase.startTagHeadNoscriptc                 S   r   Nzunexpected-inhead-noscript-tagr?   r   r   r(   r(   r)   r  H     z4getPhases.<locals>.InHeadNoscriptPhase.startTagOtherc                 S   r  )Nr,  zExpected noscript got %sr  r   r!  r(   r(   r)   endTagNoscriptM  r#  z5getPhases.<locals>.InHeadNoscriptPhase.endTagNoscriptc                 S   r   r9  r   r   r(   r(   r)   endTagBrR  r:  z/getPhases.<locals>.InHeadNoscriptPhase.endTagBrc                 S   r  r%  r   r   r(   r(   r)   r  W  r'  z2getPhases.<locals>.InHeadNoscriptPhase.endTagOtherc                 S   r(  )Nr,  )r;  r   rA   r(   r(   r)   r   Z  r  z3getPhases.<locals>.InHeadNoscriptPhase.anythingElser   )r/  r0  r2  r4   r*  r+  )r   r,  r,  r   N)r8   r9   r:   r   r   r   r   r   r   r   r  r8  r  r;  r<  r  r   r   r	  r   r
  r   r(   r(   r(   r)   InHeadNoscriptPhase,  s2    
r=  c                   @   s   e Zd Ze 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edefdefde	fde
fdefgZee_edefgZee_dS )z!getPhases.<locals>.AfterHeadPhasec                 S   r   r   r  rA   r(   r(   r)   r   n  r   z,getPhases.<locals>.AfterHeadPhase.processEOFc                 S   r   r-   r  r   r(   r(   r)   r   r  r   z3getPhases.<locals>.AfterHeadPhase.processCharactersc                 S   r   r   r   r   r(   r(   r)   r   v  r  z.getPhases.<locals>.AfterHeadPhase.startTagHtmlc                 S   s(   d| j _| j| | j jd | j _d S )NFr   )rJ   ra   r=   r   rG   r^   r   r(   r(   r)   startTagBodyy     z.getPhases.<locals>.AfterHeadPhase.startTagBodyc                 S   s    | j | | jjd | j_d S )Nr   )r=   r   rJ   rG   r^   r   r(   r(   r)   startTagFrameset~  s   z2getPhases.<locals>.AfterHeadPhase.startTagFramesetc                 S   st   | j dd|d i | jj| jj | j jd | | jjd d d D ]}|jdkr7| jj	|  d S q&d S )Nz#unexpected-start-tag-out-of-my-headr?   r  ru   r   )
rJ   r}   r=   r|   r   r  rG   r   r?   remover!  r(   r(   r)   startTagFromHead  s   

z2getPhases.<locals>.AfterHeadPhase.startTagFromHeadc                 S   r  r6  r   r   r(   r(   r)   r     r'  z.getPhases.<locals>.AfterHeadPhase.startTagHeadc                 S   r   r-   r  r   r(   r(   r)   r    r   z/getPhases.<locals>.AfterHeadPhase.startTagOtherc                 S   r   r-   r  r   r(   r(   r)   r$    r   z2getPhases.<locals>.AfterHeadPhase.endTagHtmlBodyBrc                 S   r  r%  r   r   r(   r(   r)   r    r'  z-getPhases.<locals>.AfterHeadPhase.endTagOtherc                 S   s.   | j tdd | jjd | j_d| j_d S )Nr   rq   r   T)r=   r   r   rJ   rG   r^   ra   rA   r(   r(   r)   r     s   z.getPhases.<locals>.AfterHeadPhase.anythingElser   r   r   )	r.  r/  r0  r2  r4   r*  r-  r+  r)  r   )r   r   r   N)r8   r9   r:   r   r   r   r   r   r>  r@  rB  r   r  r$  r  r   r   r	  r   r
  r   r(   r(   r(   r)   AfterHeadPhasek  s6    
	
rC  c                       s  e Zd ZdZ 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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[ Z0d\d] Z1d^d_ Z2d`da Z3dbdc Z4ddde Z5dfdg Z6e78g dhj9fdiefdjefdkefdlefe:efdmefdnefdoefdpefdqefdrefdsefdtefduefdvefdwefdxefdyefdzefd{efd|efd}e fd~e!fde"fde#fde$fde&fde'fde%fde(fde)fde*fZ;e+e;_<e78dje-fdhe.fde/fdne0fde,fde1fe:e2fde3fdue4fde5fg
Z=e6e=_<  Z>S )zgetPhases.<locals>.InBodyPhase)r   c                    s"   t  | j|i | | j| _d S r-   )superrI   processSpaceCharactersNonPrer   rB   r   r%   )InBodyPhaser   r(   r)   rI     s   z'getPhases.<locals>.InBodyPhase.__init__c                 S   s$   |j |j ko|j|jko|j|jkS r-   )r?   rh   ri   )rB   Znode1Znode2r(   r(   r)   isMatchingFormattingElement  s
   

z:getPhases.<locals>.InBodyPhase.isMatchingFormattingElementc                 S   s   | j | | j jd }g }| j jd d d D ]}|tu r n| ||r*|| qt|dks3J t|dkrB| j j|d  | j j| d S )Nru      )	r=   r   r|   activeFormattingElementsr   rH  r   r   rA  )rB   r   rl   ZmatchingElementsr   r(   r(   r)   addFormattingElement  s   
z3getPhases.<locals>.InBodyPhase.addFormattingElementc                 S   s@   t d}| jjd d d D ]}|j|vr| jd  d S qd S )N)dddtlir'   r   r   r   r   r   r   r   r   ru   z expected-closing-tag-but-got-eof)r   r=   r|   r?   rJ   r}   )rB   Zallowed_elementsr   r(   r(   r)   r     s   
z)getPhases.<locals>.InBodyPhase.processEOFc                 S   sj   |d }| j | _|dr$| jjd jdv r$| jjd  s$|dd  }|r3| j  | j| d S d S )Nrv   
ru   )prelistingtextarear   )	rE  r   r   r=   r|   r?   Z
hasContent#reconstructActiveFormattingElementsr   )rB   r   rv   r(   r(   r)   !processSpaceCharactersDropNewline  s   

z@getPhases.<locals>.InBodyPhase.processSpaceCharactersDropNewlinec                 S   s\   |d dkrd S | j   | j |d  | jjr*tdd |d D r,d| j_d S d S d S )Nrv    c                 S      g | ]}|t vqS r(   r   r>   charr(   r(   r)   
<listcomp>  s    zDgetPhases.<locals>.InBodyPhase.processCharacters.<locals>.<listcomp>F)r=   rS  r   rJ   ra   anyr   r(   r(   r)   r     s   
z0getPhases.<locals>.InBodyPhase.processCharactersc                 S   s   | j   | j |d  d S r   )r=   rS  r   r   r(   r(   r)   rE    s   
z;getPhases.<locals>.InBodyPhase.processSpaceCharactersNonPrec                 S   r   r4  r   r   r(   r(   r)   startTagProcessInHead  r  z4getPhases.<locals>.InBodyPhase.startTagProcessInHeadc                 S   s   | j dddi t| jjdks| jjd jdkr"| j js J d S d| j _|d  D ]\}}|| jjd j	vrB|| jjd j	|< q,d S )Nr7  r?   r   r   Frv   )
rJ   r}   r   r=   r|   r?   rQ   ra   r.   ri   r   r(   r(   r)   r>    s   z+getPhases.<locals>.InBodyPhase.startTagBodyc                 S   s   | j dddi t| jjdks| jjd jdkr"| j js J d S | j js(d S | jjd jr=| jjd j	| jjd  | jjd jdkrU| jj
  | jjd jdksF| j| | j jd | j _d S )	Nr7  r?   r   r   r   ru   r   r   )rJ   r}   r   r=   r|   r?   rQ   ra   parentremoveChildr   r   rG   r^   r   r(   r(   r)   r@    s   "z/getPhases.<locals>.InBodyPhase.startTagFramesetc                 S   s.   | j jdddr| td | j | d S Nr'   buttonvariant)r=   elementInScopeendTagPr   r   r   r(   r(   r)   startTagCloseP  s   z-getPhases.<locals>.InBodyPhase.startTagClosePc                 S   s>   | j jdddr| td | j | d| j_| j| _d S )Nr'   r`  ra  F)	r=   rc  rd  r   r   rJ   ra   rT  r   r   r(   r(   r)   startTagPreListing  s
   z1getPhases.<locals>.InBodyPhase.startTagPreListingc                 S   s\   | j jr| jdddi d S | j jdddr| td | j | | j jd | j _d S )Nr7  r?   formr'   r`  ra  ru   )	r=   formPointerrJ   r}   rc  rd  r   r   r|   r   r(   r(   r)   startTagForm  s   z+getPhases.<locals>.InBodyPhase.startTagFormc                 S   s   d| j _dgddgddgd}||d  }t| jjD ] }|j|v r/| j jt|jd  n|j	t
v r;|jdvr; nq| jjd	d
drN| j jtd	d | j| d S )NFrN  rM  rL  )rN  rM  rL  r?   rr   )addressr*   r'   r'   r`  ra  )rJ   ra   reversedr=   r|   r?   r^   r   r   	nameTupler   rc  r   )rB   r   ZstopNamesMapZ	stopNamesr   r(   r(   r)   startTagListItem&  s,   


z/getPhases.<locals>.InBodyPhase.startTagListItemc                 S   s>   | j jdddr| td | j | | jjj| jj_d S r_  )	r=   rc  rd  r   r   rJ   rM   r]   r[   r   r(   r(   r)   startTagPlaintext<  s   z0getPhases.<locals>.InBodyPhase.startTagPlaintextc                 S   sb   | j jdddr| td | j jd jtv r)| jdd|d i | j j	  | j 
| d S )Nr'   r`  ra  ru   r7  r?   )r=   rc  rd  r   r|   r?   r   rJ   r}   r   r   r   r(   r(   r)   startTagHeadingB  s   z.getPhases.<locals>.InBodyPhase.startTagHeadingc                 S   s~   | j d}|r3| jdddd | td || j jv r&| j j| || j jv r3| j j| | j 	  | 
| d S )Na$unexpected-start-tag-implies-end-tagZ	startNameZendName)r=   !elementInActiveFormattingElementsrJ   r}   endTagFormattingr   r|   rA  rJ  rS  rK  )rB   r   ZafeAElementr(   r(   r)   	startTagAJ  s   
z(getPhases.<locals>.InBodyPhase.startTagAc                 S   s   | j   | | d S r-   )r=   rS  rK  r   r(   r(   r)   startTagFormattingW  s   
z1getPhases.<locals>.InBodyPhase.startTagFormattingc                 S   sP   | j   | j dr!| jdddd | td | j   | | d S )Nnobrrq  rr  )r=   rS  rc  rJ   r}   r   r   rK  r   r(   r(   r)   startTagNobr[  s   

z+getPhases.<locals>.InBodyPhase.startTagNobrc                 S   sT   | j dr| jdddd | td |S | j   | j | d| j_d S )Nr`  rq  rr  F)	r=   rc  rJ   r}   r   r   rS  r   ra   r   r(   r(   r)   startTagButtone  s   
z-getPhases.<locals>.InBodyPhase.startTagButtonc                 S   s0   | j   | j | | j jt d| j_d S NF)r=   rS  r   rJ  r   r   rJ   ra   r   r(   r(   r)   startTagAppletMarqueeObjectp  s   
z:getPhases.<locals>.InBodyPhase.startTagAppletMarqueeObjectc                 S   sB   | j jdddr| td | j   d| j_| j|d d S )Nr'   r`  ra  Fr   )r=   rc  rd  r   rS  rJ   ra   r   r   r(   r(   r)   startTagXmpv  s
   
z*getPhases.<locals>.InBodyPhase.startTagXmpc                 S   sR   | j jdkr| jjdddr| td | j| d| j _| j jd | j _	d S )Nr   r'   r`  ra  Fr   )
rJ   rX   r=   rc  r   r   r   ra   rG   r^   r   r(   r(   r)   startTagTable}  s   z,getPhases.<locals>.InBodyPhase.startTagTablec                 S   s6   | j   | j | | j j  d|d< d| j_d S )NTr{   F)r=   rS  r   r|   r   rJ   ra   r   r(   r(   r)   startTagVoidFormatting  s
   
z5getPhases.<locals>.InBodyPhase.startTagVoidFormattingc                 S   sH   | j j}| | d|d v r |d d tdkr"|| j _d S d S d S )Nr2   rv   hidden)rJ   ra   r~  rj   r   )rB   r   ra   r(   r(   r)   startTagInput  s   
z,getPhases.<locals>.InBodyPhase.startTagInputc                 S   r  r  r  r   r(   r(   r)   startTagParamSource  r  z2getPhases.<locals>.InBodyPhase.startTagParamSourcec                 S   sJ   | j jdddr| td | j | | j j  d|d< d| j_d S )Nr'   r`  ra  Tr{   F)	r=   rc  rd  r   r   r|   r   rJ   ra   r   r(   r(   r)   
startTagHr  s   z)getPhases.<locals>.InBodyPhase.startTagHrc                 S   s6   | j dddd | tdd|d |d d d S )	Nzunexpected-start-tag-treated-asimageimgZoriginalNameZnewNamerq   rv   rz   ri   rz   )rJ   r}   r   r   r   r(   r(   r)   startTagImage  s   
z,getPhases.<locals>.InBodyPhase.startTagImagec                 S   s  | j dddi | jjrd S i }d|d v r|d d |d< | tdd|d | td	d | td
d d|d v rF|d d }nd}| td |d |d  }d|v r_|d= d|v rf|d= d|d< | tdd||d d | 	td
 | td	d | 	td d S )Nzdeprecated-tagr?   isindexactionrv   rg  rq   )ri   hrZlabelpromptz3This is a searchable index. Enter search keywords: rp   r2   rv   inputrz   r  )
rJ   r}   r=   rh  r   r   r   r   copyr   )rB   r   Z
form_attrsr  ri   r(   r(   r)   startTagIsIndex  s<   

z.getPhases.<locals>.InBodyPhase.startTagIsIndexc                 S   s0   | j | | jjj| jj_| j| _d| j_d S rz  )	r=   r   rJ   rM   rZ   r[   rT  r   ra   r   r(   r(   r)   startTagTextarea  s   z/getPhases.<locals>.InBodyPhase.startTagTextareac                 S   s   d| j _| | d S rz  )rJ   ra   startTagRawtextr   r(   r(   r)   startTagIFrame  s   z-getPhases.<locals>.InBodyPhase.startTagIFramec                 S   s$   | j jr| | d S | | d S r-   )rJ   rL   r  r  r   r(   r(   r)   r    s   z/getPhases.<locals>.InBodyPhase.startTagNoscriptc                 S   s   | j |d dS )z8iframe, noembed noframes, noscript(if scripting enabled)r   Nr  r   r(   r(   r)   r    r  z.getPhases.<locals>.InBodyPhase.startTagRawtextc                 S   s@   | j jd jdkr| jjtd | j   | jj | d S Nru   option)	r=   r|   r?   rJ   r^   r   r   rS  r   r   r(   r(   r)   startTagOpt  s   
z*getPhases.<locals>.InBodyPhase.startTagOptc                 S   s   | j   | j | d| j_| jj| jjd | jjd | jjd | jjd | jjd | jjd fv r=| jjd | j_d S | jjd	 | j_d S )
NFr   r   r   r   r   r   inSelectInTabler   )r=   rS  r   rJ   ra   r^   rG   r   r(   r(   r)   startTagSelect  s   





z-getPhases.<locals>.InBodyPhase.startTagSelectc                 S   sB   | j dr| j   | j jd jdkr| j  | j | d S )Nrubyru   )r=   rc  generateImpliedEndTagsr|   r?   rJ   r}   r   r   r(   r(   r)   startTagRpRt  s
   

z+getPhases.<locals>.InBodyPhase.startTagRpRtc                 S   ^   | j   | j| | j| td |d< | j | |d r-| j j  d|d< d S d S )Nrf   rh   rz   Tr{   )	r=   rS  rJ   r   r   r   r   r|   r   r   r(   r(   r)   startTagMath     
z+getPhases.<locals>.InBodyPhase.startTagMathc                 S   r  )Nrx   rh   rz   Tr{   )	r=   rS  rJ   r   r   r   r   r|   r   r   r(   r(   r)   startTagSvg  r  z*getPhases.<locals>.InBodyPhase.startTagSvgc                 S   s   | j dd|d i dS )a5   Elements that should be children of other elements that have a
            different insertion mode; here they are ignored
            "caption", "col", "colgroup", "frame", "frameset", "head",
            "option", "optgroup", "tbody", "td", "tfoot", "th", "thead",
            "tr", "noscript"
            zunexpected-start-tag-ignoredr?   Nr   r   r(   r(   r)   startTagMisplaced  s   z0getPhases.<locals>.InBodyPhase.startTagMisplacedc                 S   s   | j   | j | d S r-   )r=   rS  r   r   r(   r(   r)   r    s   
z,getPhases.<locals>.InBodyPhase.startTagOtherc                 S   s   | j jddds#| tdd | jdddi | tdd d S | j d | j jd j	dkr;| jdddi | j j
 }|j	dkrS| j j
 }|j	dksFd S d S )	Nr'   r`  ra  rq   r&  r?   rr   ru   )r=   rc  re  r   rJ   r}   rd  r  r|   r?   r   r!  r(   r(   r)   rd    s   
z&getPhases.<locals>.InBodyPhase.endTagPc                 S   s~   | j ds| j  d S | j jd jdkr5| j jdd  D ]}|jtdvr4| jdd|jd  nq| jjd | j_d S )Nr   ru      )rL  rM  rN  optgroupr  r'   rprtr   r   r   r   r   r   r   r   $expected-one-end-tag-but-got-anotherZgotNameZexpectedName	afterBody)	r=   rc  rJ   r}   r|   r?   r   rG   r^   r!  r(   r(   r)   
endTagBody)  s   


z)getPhases.<locals>.InBodyPhase.endTagBodyc                 S   s"   | j dr| td |S d S )Nr   )r=   rc  r  r   r   r(   r(   r)   
endTagHtml;  s   z)getPhases.<locals>.InBodyPhase.endTagHtmlc                 S   s   |d dkr
| j | _| j|d }|r| j  | jjd j|d kr/| jdd|d i |rM| jj	 }|j|d krO| jj	 }|j|d ks>d S d S d S )Nr?   rP  ru   end-tag-too-early)
rE  r   r=   rc  r  r|   r?   rJ   r}   r   )rB   r   ZinScoper   r(   r(   r)   endTagBlockA  s   
z*getPhases.<locals>.InBodyPhase.endTagBlockc                 S   sx   | j j}d | j _|d u s| j |s| jdddi d S | j   | j jd |kr3| jdddi | j j| d S )Nr&  r?   rg  ru   zend-tag-too-early-ignored)r=   rh  rc  rJ   r}   r  r|   rA  r!  r(   r(   r)   
endTagFormO  s   
z)getPhases.<locals>.InBodyPhase.endTagFormc                 S   s   |d dkr	d}nd }| j j|d |ds"| jdd|d i d S | j j|d d | j jd j|d krA| jdd|d i | j j }|j|d kr]| j j }|j|d ksNd S d S )	Nr?   rN  listra  r&  Zexcluderu   r  )r=   rc  rJ   r}   r  r|   r?   r   )rB   r   rb  r   r(   r(   r)   endTagListItem\  s   
z-getPhases.<locals>.InBodyPhase.endTagListItemc                 S   s   t D ]}| j|r| j   nq| jjd j|d kr(| jdd|d i t D ]!}| j|rK| jj }|jt vrH| jj }|jt vs= d S q*d S )Nru   r?   r  )	r   r=   rc  r  r|   r?   rJ   r}   r   )rB   r   itemr(   r(   r)   endTagHeadingm  s    


z,getPhases.<locals>.InBodyPhase.endTagHeadingc                 S   s  d}|dk r|d7 }| j |d }|r"|| j jv r)| j |js)| | dS || j jvrC| jdd|d i | j j	| dS | j |jsW| jdd|d i dS || j jd krj| jd	d|d i | j j
|}d}| j j|d D ]}|jtv r|} nq{|du r| j j }||kr| j j }||ks| j j	| dS | j j|d  }| j j
|}| }	}
d}| j j
|
}|d
k r(|d7 }|d8 }| j j| }
|
| j jvr| j j	|
 q|
|krn>|	|kr| j j
|
d }|
 }|| j j| j j
|
< || j j| j j
|
< |}
|	jr|	j|	 |
|	 |
}	|d
k s|	jr2|	j|	 |jtdv rH| j  \}}||	| n||	 | }|| || | j j	| | j j|| | j j	| | j j| j j
|d | |dk sdS dS )z)The much-feared adoption agency algorithmr      r   r?   Nzadoption-agency-1.2zadoption-agency-4.4ru   zadoption-agency-1.3rI  r   r   r   r   r   )r=   rs  r|   rc  r?   r  rJ   r}   rJ  rA  indexrl  r   r   Z	cloneNoder]  r^  ZappendChildr   ZgetTableMisnestedNodePositioninsertBeforeZreparentChildreninsert)rB   r   ZouterLoopCounterZformattingElementZafeIndexZfurthestBlockrl   ZcommonAncestorZbookmarkZlastNoder   ZinnerLoopCounterr  Zcloner]  r  r(   r(   r)   rt  |  s   






"


 z/getPhases.<locals>.InBodyPhase.endTagFormattingc                 S   s   | j |d r| j   | j jd j|d kr#| jdd|d i | j |d rL| j j }|j|d krE| j j }|j|d ks8| j   d S d S )Nr?   ru   r  )	r=   rc  r  r|   r?   rJ   r}   r   clearActiveFormattingElements)rB   r   rl   r(   r(   r)   endTagAppletMarqueeObject  s   
z8getPhases.<locals>.InBodyPhase.endTagAppletMarqueeObjectc                 S   s@   | j dddd | j  | jtdd | jj  d S )Nzunexpected-end-tag-treated-asr   z
br elementr  rq   )rJ   r}   r=   rS  r   r   r|   r   r   r(   r(   r)   r<  +  s   
z'getPhases.<locals>.InBodyPhase.endTagBrc                 S   s   | j jd d d D ]O}|j|d krE| j j|d d | j jd j|d kr1| jdd|d i | j j |krB	 | j j |ks9 d S |jtv rX| jdd|d i  d S q	d S )Nru   r?   r  r&  )	r=   r|   r?   r  rJ   r}   r   rl  r   r!  r(   r(   r)   r  2  s   
z*getPhases.<locals>.InBodyPhase.endTagOtherr   )	r.  r/  r0  r1  r2  r4   r-  r+  r)  r   r   )rj  articleaside
blockquotecenterdetailsdirr*   dlfieldset
figcaptionfigurefooterheaderhgroupmainmenunavolr'   sectionsummaryul)rP  rQ  rg  )rN  rL  rM  rS   rp  )bbigcodeemfontissmallstrikestrongtturw  r`  )ZappletZmarqueeobjectZxmpr   )Zarear   embedr  keygenZwbr)ZparamsourceZtrackr  r  r  r  rR  Ziframer,  )Znoembedr*  r   )r  r  )r  r  Zmathrx   )r   colr   framer   r   r   r   r   r   r   )rj  r  r  r  r`  r  r  Zdialogr  r*   r  r  r  r  r  r  r  rQ  r  r  r  r  rP  r  r  r  r'   )rL  rM  rN  )rp  r  r  r  r  r  r  rw  r  r  r  r  r  r  r   )?r8   r9   r:   r   rI   rH  rK  r   rT  r   rE  r\  r>  r@  re  rf  ri  rm  rn  ro  ru  rv  rx  ry  r{  r|  r}  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rd  r  r  r  r  r  r  rt  r  r<  r  r   r	  r   r   r   r
  r   __classcell__r(   )rG  r   r   r)   rG    s*   
	
	 $ !"#$%&'()-rG  c                   @   s`   e Zd Ze Zdd Zdd Zdd Zdd Zd	d
 Z	e
g Zee_e
defgZe	e_dS )zgetPhases.<locals>.TextPhasec                 S   r   r   r   r   r(   r(   r)   r     r   z.getPhases.<locals>.TextPhase.processCharactersc                 S   s8   | j dd| jjd ji | jj  | j j| j _dS )Nz&expected-named-closing-tag-but-got-eofr?   ru   T)rJ   r}   r=   r|   r?   r   r   r^   rA   r(   r(   r)   r     s   z'getPhases.<locals>.TextPhase.processEOFc                 S   s   J d|d  )NFz4Tried to process start tag %s in RCDATA/RAWTEXT moder?   r(   r   r(   r(   r)   r    ro   z*getPhases.<locals>.TextPhase.startTagOtherc                 S   s*   | j j }|jdksJ | jj| j_d S )Nr-  )r=   r|   r   r?   rJ   r   r^   r!  r(   r(   r)   endTagScript  s   z)getPhases.<locals>.TextPhase.endTagScriptc                 S   s   | j j  | jj| j_d S r-   )r=   r|   r   rJ   r   r^   r   r(   r(   r)   r       z(getPhases.<locals>.TextPhase.endTagOtherr-  N)r8   r9   r:   r   r   r   r   r  r  r  r   r	  r   r
  r   r(   r(   r(   r)   	TextPhase  s    

r  c                       s  e Zd Ze 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ed% jfd&e
fd'efd(efd)efd*efd+efd,efd-efd.efg
Zee_ed+efd/efgZee_d0S )1zgetPhases.<locals>.InTablePhasec                 S   s8   | j jd jdvr| j j  | j jd jdvs	d S d S )Nru   )r   r   )r=   r|   r?   r   rA   r(   r(   r)   clearStackToTableContext  s   z8getPhases.<locals>.InTablePhase.clearStackToTableContextc                 S   2   | j jd jdkr| jd d S | jjsJ d S )Nru   r   zeof-in-tabler=   r|   r?   rJ   r}   rQ   rA   r(   r(   r)   r        z*getPhases.<locals>.InTablePhase.processEOFc                 S   4   | j j}| j jd | j _|| j j_| j j| d S NinTableText)rJ   r^   rG   r   r   rB   r   r   r(   r(   r)   r        
z6getPhases.<locals>.InTablePhase.processSpaceCharactersc                 S   r  r  )rJ   r^   rG   r   r   r  r(   r(   r)   r     r  z1getPhases.<locals>.InTablePhase.processCharactersc                 S   s&   d| j _| jjd | d| j _d S )NTr   F)r=   insertFromTablerJ   rG   r   r   r(   r(   r)   r     s   z*getPhases.<locals>.InTablePhase.insertTextc                 S   s6   |    | jjt | j| | jjd | j_d S )Nr   )	r  r=   rJ  r   r   r   rJ   rG   r^   r   r(   r(   r)   startTagCaption  s   z/getPhases.<locals>.InTablePhase.startTagCaptionc                 S   (   |    | j| | jjd | j_d S )Nr   r  r=   r   rJ   rG   r^   r   r(   r(   r)   startTagColgroup  r?  z0getPhases.<locals>.InTablePhase.startTagColgroupc                 S   r   )Nr   rq   )r  r   r   r(   r(   r)   startTagCol  r   z+getPhases.<locals>.InTablePhase.startTagColc                 S   r  Nr   r  r   r(   r(   r)   startTagRowGroup  r?  z0getPhases.<locals>.InTablePhase.startTagRowGroupc                 S   r   )Nr   rq   )r  r   r   r(   r(   r)   startTagImplyTbody  r   z2getPhases.<locals>.InTablePhase.startTagImplyTbodyc                 S   s6   | j dddd | j jtd | j js|S d S )Nrq  r   rr  )rJ   r}   r^   r   r   rQ   r   r(   r(   r)   r}    s   z-getPhases.<locals>.InTablePhase.startTagTablec                 S   r   r4  r   r   r(   r(   r)   startTagStyleScript  r  z3getPhases.<locals>.InTablePhase.startTagStyleScriptc                 S   sX   d|d v r%|d d  tdkr%| jd | j| | jj  d S | | d S )Nr2   rv   r  z unexpected-hidden-input-in-table)	rj   r   rJ   r}   r=   r   r|   r   r  r   r(   r(   r)   r    s   z-getPhases.<locals>.InTablePhase.startTagInputc                 S   sH   | j d | jjd u r"| j| | jjd | j_| jj  d S d S )Nzunexpected-form-in-tableru   )rJ   r}   r=   rh  r   r|   r   r   r(   r(   r)   ri    s   z,getPhases.<locals>.InTablePhase.startTagFormc                 S   <   | j dd|d i d| j_| j jd | d| j_d S )Nz)unexpected-start-tag-implies-table-voodoor?   Tr   F)rJ   r}   r=   r  rG   r   r   r(   r(   r)   r       z-getPhases.<locals>.InTablePhase.startTagOtherc                 S   s   | j jdddrJ| j   | j jd jdkr%| jdd| j jd jd | j jd jdkr=| j j  | j jd jdks.| j j  | j  d S | jj	sPJ | j  d S )Nr   ra  ru   zend-tag-too-early-namedr  )
r=   rc  r  r|   r?   rJ   r}   r   r`   rQ   r   r(   r(   r)   endTagTable  s   
z+getPhases.<locals>.InTablePhase.endTagTablec                 S   r  r%  r   r   r(   r(   r)   endTagIgnore  r'  z,getPhases.<locals>.InTablePhase.endTagIgnorec                 S   r  )Nz'unexpected-end-tag-implies-table-voodoor?   Tr   F)rJ   r}   r=   r  rG   r   r   r(   r(   r)   r    r  z+getPhases.<locals>.InTablePhase.endTagOtherr   r   r   r  r   r   r   )r   r   r   r   )r+  r-  r  rg  )r   r   r  r   r   r   r   r   r   r   r   N)r8   r9   r:   r   r   r  r   r   r   r   r  r  r  r  r  r}  r  r  ri  r  r  r  r  r   r	  r   r   r
  r   r(   r   r(   r)   InTablePhase  sP    	

r  c                       sZ   e Zd ZdZ 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  ZS )z#getPhases.<locals>.InTableTextPhase)r   characterTokensc                    s&   t  | j|i | d | _g | _d S r-   )rD  rI   r   r  rF  )InTableTextPhaser   r(   r)   rI   6  s   
z,getPhases.<locals>.InTableTextPhase.__init__c                 S   sd   d dd | jD }tdd |D r%td |d}| jjd | n|r-| j| g | _d S )Nr   c                 S   s   g | ]}|d  qS )rv   r(   r>   r  r(   r(   r)   rZ  <      zGgetPhases.<locals>.InTableTextPhase.flushCharacters.<locals>.<listcomp>c                 S   rV  r(   rW  r  r(   r(   r)   rZ  =  r   rp   r  r   )joinr  r[  r   rJ   rG   r   r=   )rB   rv   r   r(   r(   r)   flushCharacters;  s   
z3getPhases.<locals>.InTableTextPhase.flushCharactersc                 S      |    | j| j_|S r-   r  r   rJ   r^   r   r(   r(   r)   r   D     
z2getPhases.<locals>.InTableTextPhase.processCommentc                 S   s   |    | j| j_dS r   r  rA   r(   r(   r)   r   I  r  z.getPhases.<locals>.InTableTextPhase.processEOFc                 S   s    |d dkrd S | j | d S Nrv   rU  r  r   r   r(   r(   r)   r   N  s   z5getPhases.<locals>.InTableTextPhase.processCharactersc                 S      | j | d S r-   r  r   r(   r(   r)   r   S  s   z:getPhases.<locals>.InTableTextPhase.processSpaceCharactersc                 S   r  r-   r  r   r(   r(   r)   r   X  r  z3getPhases.<locals>.InTableTextPhase.processStartTagc                 S   r  r-   r  r   r(   r(   r)   r   ]  r  z1getPhases.<locals>.InTableTextPhase.processEndTag)r8   r9   r:   r   rI   r  r   r   r   r   r   r   r  r(   )r  r  r)   r  3  s    	r  c                          e Zd Ze 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ed jfdefgZe	e_ede
fdefdefgZee_dS )z!getPhases.<locals>.InCaptionPhasec                 S      | j jddd S )Nr   r   ra  r=   rc  rA   r(   r(   r)   ignoreEndTagCaptionf  r  z5getPhases.<locals>.InCaptionPhase.ignoreEndTagCaptionc                 S      | j jd   d S r   rJ   rG   r   rA   r(   r(   r)   r   i  r   z,getPhases.<locals>.InCaptionPhase.processEOFc                 S   r   r   rJ   rG   r   r   r(   r(   r)   r   l  r  z3getPhases.<locals>.InCaptionPhase.processCharactersc                 S   0   | j   |  }| j jtd |s|S d S Nr   rJ   r}   r  r^   r   r   rB   r   ignoreEndTagr(   r(   r)   startTagTableElemento  s   
z6getPhases.<locals>.InCaptionPhase.startTagTableElementc                 S   r   r   r   r   r(   r(   r)   r  w  r  z/getPhases.<locals>.InCaptionPhase.startTagOtherc                 S   s   |   sN| j  | jjd jdkr!| jdd| jjd jd | jjd jdkr9| jj  | jjd jdks*| jj  | j  | jj	d | j_
d S | jjsTJ | j  d S )Nru   r   r  r  r   )r  r=   r  r|   r?   rJ   r}   r   r  rG   r^   rQ   r   r(   r(   r)   endTagCaptionz  s    

z/getPhases.<locals>.InCaptionPhase.endTagCaptionc                 S   r  r  r  r  r(   r(   r)   r    s   
z-getPhases.<locals>.InCaptionPhase.endTagTablec                 S   r  r%  r   r   r(   r(   r)   r    r'  z.getPhases.<locals>.InCaptionPhase.endTagIgnorec                 S   r   r   rJ   rG   r   r   r(   r(   r)   r    r  z-getPhases.<locals>.InCaptionPhase.endTagOtherr   	r   r  r   r   r   r   r   r   r   r   r   )
r   r  r   r   r   r   r   r   r   r   N)r8   r9   r:   r   r   r  r   r   r  r  r  r  r  r  r   r	  r   r   r
  r   r(   r  r(   r)   InCaptionPhaseb  s4    
r  c                       s   e Zd Ze 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ed jfdefgZe	e_ede
fdefgZee_dS )z%getPhases.<locals>.InColumnGroupPhasec                 S   s   | j jd jdkS )Nru   r   )r=   r|   r?   rA   r(   r(   r)   ignoreEndTagColgroup  r  z:getPhases.<locals>.InColumnGroupPhase.ignoreEndTagColgroupc                 S   sD   | j jd jdkr| jjsJ d S |  }| td |s dS d S )Nru   r   r   T)r=   r|   r?   rJ   rQ   r  endTagColgroupr   )rB   r  r(   r(   r)   r     s   z0getPhases.<locals>.InColumnGroupPhase.processEOFc                 S   "   |   }| td |s|S d S Nr   r  r  r   r  r(   r(   r)   r     
   z7getPhases.<locals>.InColumnGroupPhase.processCharactersc                 S   r  r  r  r   r(   r(   r)   r    r  z1getPhases.<locals>.InColumnGroupPhase.startTagColc                 S   r  r  r  r  r(   r(   r)   r    r  z3getPhases.<locals>.InColumnGroupPhase.startTagOtherc                 S   sB   |   r| jjs
J | j  d S | jj  | jjd | j_d S Nr   )	r  rJ   rQ   r}   r=   r|   r   rG   r^   r   r(   r(   r)   r    s
   z4getPhases.<locals>.InColumnGroupPhase.endTagColgroupc                 S   s   | j dddi d S )Nz
no-end-tagr?   r  r   r   r(   r(   r)   	endTagCol  r   z/getPhases.<locals>.InColumnGroupPhase.endTagColc                 S   r  r  r  r  r(   r(   r)   r    r  z1getPhases.<locals>.InColumnGroupPhase.endTagOtherr   r  r   N)r8   r9   r:   r   r   r  r   r   r  r  r  r!  r  r   r	  r   r   r
  r   r(   r  r(   r)   InColumnGroupPhase  s(    
	
r"  c                       s   e Zd Ze 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ed jfde	fde
fdefgZee_edefdefdefgZee_d S )!z#getPhases.<locals>.InTableBodyPhasec                 S   sV   | j jd jdvr| j j  | j jd jdvs	| j jd jdkr'| jjs)J d S d S )Nru   )r   r   r   r   r   )r=   r|   r?   r   rJ   rQ   rA   r(   r(   r)   clearStackToTableBodyContext  s   z@getPhases.<locals>.InTableBodyPhase.clearStackToTableBodyContextc                 S   r  r   r  rA   r(   r(   r)   r     r   z.getPhases.<locals>.InTableBodyPhase.processEOFc                 S   r   r   r5  r   r(   r(   r)   r     r  z:getPhases.<locals>.InTableBodyPhase.processSpaceCharactersc                 S   r   r   r  r   r(   r(   r)   r     r  z5getPhases.<locals>.InTableBodyPhase.processCharactersc                 S   r  )Nr   )r#  r=   r   rJ   rG   r^   r   r(   r(   r)   
startTagTr   r?  z.getPhases.<locals>.InTableBodyPhase.startTagTrc                 S   s*   | j dd|d i | tdd |S )Nzunexpected-cell-in-table-bodyr?   r   rq   )rJ   r}   r$  r   r   r(   r(   r)   startTagTableCell  
   
z5getPhases.<locals>.InTableBodyPhase.startTagTableCellc                 S   n   | j jddds| j jddds| j jdddr*|   | t| j jd j |S | jjs0J | j	  d S Nr   r   ra  r   r   ru   
r=   rc  r#  endTagTableRowGroupr   r|   r?   rJ   rQ   r}   r   r(   r(   r)   startTagTableOther  s   z6getPhases.<locals>.InTableBodyPhase.startTagTableOtherc                 S   r   r   r   r   r(   r(   r)   r    r  z1getPhases.<locals>.InTableBodyPhase.startTagOtherc                 S   sV   | j j|d ddr|   | j j  | jjd | j_d S | jdd|d i d S )Nr?   r   ra  r    unexpected-end-tag-in-table-body)	r=   rc  r#  r|   r   rJ   rG   r^   r}   r   r(   r(   r)   r*    s   
z7getPhases.<locals>.InTableBodyPhase.endTagTableRowGroupc                 S   r'  r(  r)  r   r(   r(   r)   r  %  s   z/getPhases.<locals>.InTableBodyPhase.endTagTablec                 S   r  )Nr,  r?   r   r   r(   r(   r)   r  2  r  z0getPhases.<locals>.InTableBodyPhase.endTagIgnorec                 S   r   r   r  r   r(   r(   r)   r  6  r  z/getPhases.<locals>.InTableBodyPhase.endTagOtherr   r   r   r   )r   r  r   r   r   r   r  r   )r   r   r  r   r   r   r   r   N)r8   r9   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)   InTableBodyPhase  s>    
	
r.  c                       s   e Zd Ze 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ed jfde
fdefgZee_edefdefd efd!efgZee_d"S )#zgetPhases.<locals>.InRowPhasec                 S   sT   | j jd jdvr(| jdd| j jd ji | j j  | j jd jdvs	d S d S )Nru   )r   r   z'unexpected-implied-end-tag-in-table-rowr?   )r=   r|   r?   rJ   r}   r   rA   r(   r(   r)   clearStackToTableRowContextO  s   z9getPhases.<locals>.InRowPhase.clearStackToTableRowContextc                 S   r
  )Nr   r   ra  r  rA   r(   r(   r)   ignoreEndTagTrU  r  z,getPhases.<locals>.InRowPhase.ignoreEndTagTrc                 S   r  r   r  rA   r(   r(   r)   r   Y  r   z(getPhases.<locals>.InRowPhase.processEOFc                 S   r   r   r5  r   r(   r(   r)   r   \  r  z4getPhases.<locals>.InRowPhase.processSpaceCharactersc                 S   r   r   r  r   r(   r(   r)   r   _  r  z/getPhases.<locals>.InRowPhase.processCharactersc                 S   s6   |    | j| | jjd | j_| jjt d S )Nr   )	r/  r=   r   rJ   rG   r^   rJ  r   r   r   r(   r(   r)   r%  b  s   z/getPhases.<locals>.InRowPhase.startTagTableCellc                 S   r  Nr   r0  endTagTrr   r  r(   r(   r)   r+  h  s
   z0getPhases.<locals>.InRowPhase.startTagTableOtherc                 S   r   r   r   r   r(   r(   r)   r  o  r  z+getPhases.<locals>.InRowPhase.startTagOtherc                 S   sJ   |   s|   | jj  | jjd | j_d S | jjsJ | j	  d S r  )
r0  r/  r=   r|   r   rJ   rG   r^   rQ   r}   r   r(   r(   r)   r3  r  s   z&getPhases.<locals>.InRowPhase.endTagTrc                 S   r  r1  r2  r  r(   r(   r)   r  |  s
   z)getPhases.<locals>.InRowPhase.endTagTablec                 S   s4   | j j|d ddr| td |S | j  d S )Nr?   r   ra  r   )r=   rc  r3  r   rJ   r}   r   r(   r(   r)   r*    s   z1getPhases.<locals>.InRowPhase.endTagTableRowGroupc                 S   r  )Nzunexpected-end-tag-in-table-rowr?   r   r   r(   r(   r)   r    r  z*getPhases.<locals>.InRowPhase.endTagIgnorec                 S   r   r   r  r   r(   r(   r)   r    r  z)getPhases.<locals>.InRowPhase.endTagOtherr   r-  )r   r  r   r   r   r   r   r   r   r  )r   r   r  r   r   r   r   N)r8   r9   r:   r   r   r/  r0  r   r   r   r%  r+  r  r3  r  r*  r  r  r   r	  r   r   r
  r   r(   r  r(   r)   
InRowPhaseJ  s@    

r4  c                       r	  )zgetPhases.<locals>.InCellPhasec                 S   sH   | j jdddr| td d S | j jdddr"| td d S d S Nr   r   ra  r   )r=   rc  endTagTableCellr   rA   r(   r(   r)   	closeCell  s
   z(getPhases.<locals>.InCellPhase.closeCellc                 S   r  r   r  rA   r(   r(   r)   r     r   z)getPhases.<locals>.InCellPhase.processEOFc                 S   r   r   r  r   r(   r(   r)   r     r  z0getPhases.<locals>.InCellPhase.processCharactersc                 S   sF   | j jddds| j jdddr|   |S | jjsJ | j  d S r5  )r=   rc  r7  rJ   rQ   r}   r   r(   r(   r)   r+    s   z1getPhases.<locals>.InCellPhase.startTagTableOtherc                 S   r   r   r   r   r(   r(   r)   r    r  z,getPhases.<locals>.InCellPhase.startTagOtherc                 S   s   | j j|d ddrN| j |d  | j jd j|d kr9| jdd|d i 	 | j j }|j|d kr7nq)n| j j  | j   | jj	d | j_
d S | jdd|d i d S )	Nr?   r   ra  ru   zunexpected-cell-end-tagTr   r&  )r=   rc  r  r|   r?   rJ   r}   r   r  rG   r^   r!  r(   r(   r)   r6    s    

z.getPhases.<locals>.InCellPhase.endTagTableCellc                 S   r  r%  r   r   r(   r(   r)   r    r'  z+getPhases.<locals>.InCellPhase.endTagIgnorec                 S   s.   | j j|d ddr|   |S | j  d S )Nr?   r   ra  )r=   rc  r7  rJ   r}   r   r(   r(   r)   endTagImply  s   z*getPhases.<locals>.InCellPhase.endTagImplyc                 S   r   r   r  r   r(   r(   r)   r    r  z*getPhases.<locals>.InCellPhase.endTagOtherr   r  r-  )r   r   r  r   r   r  N)r8   r9   r:   r   r   r7  r   r   r+  r  r6  r  r8  r  r   r	  r   r   r
  r   r(   r  r(   r)   InCellPhase  s0    

r9  c                	       s   e Zd Ze 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ed jfdefdefde	fde
fdefgZee_edefdefdefgZee_dS ) z getPhases.<locals>.InSelectPhasec                 S   r  )Nru   r   zeof-in-selectr  rA   r(   r(   r)   r     r  z+getPhases.<locals>.InSelectPhase.processEOFc                 S   s$   |d dkrd S | j |d  d S r  r   r   r(   r(   r)   r     s   z2getPhases.<locals>.InSelectPhase.processCharactersc                 S   s.   | j jd jdkr| j j  | j | d S r  r=   r|   r?   r   r   r   r(   r(   r)   startTagOption  s   z/getPhases.<locals>.InSelectPhase.startTagOptionc                 S   sL   | j jd jdkr| j j  | j jd jdkr| j j  | j | d S )Nru   r  r  r:  r   r(   r(   r)   startTagOptgroup	  s
   z1getPhases.<locals>.InSelectPhase.startTagOptgroupc                 S   s   | j d | td d S )Nzunexpected-select-in-selectr   )rJ   r}   endTagSelectr   r   r(   r(   r)   r  	  s   z/getPhases.<locals>.InSelectPhase.startTagSelectc                 S   s>   | j d | jjdddr| td |S | j jsJ d S )Nzunexpected-input-in-selectr   ra  )rJ   r}   r=   rc  r=  r   rQ   r   r(   r(   r)   r  	  s
   z.getPhases.<locals>.InSelectPhase.startTagInputc                 S   r   r4  r   r   r(   r(   r)   r  	  r  z/getPhases.<locals>.InSelectPhase.startTagScriptc                 S   r  )Nzunexpected-start-tag-in-selectr?   r   r   r(   r(   r)   r  	  r  z.getPhases.<locals>.InSelectPhase.startTagOtherc                 S   s8   | j jd jdkr| j j  d S | jdddi d S )Nru   r  unexpected-end-tag-in-selectr?   r=   r|   r?   r   rJ   r}   r   r(   r(   r)   endTagOption	  s
   z-getPhases.<locals>.InSelectPhase.endTagOptionc                 S   sh   | j jd jdkr| j jd jdkr| j j  | j jd jdkr)| j j  d S | jdddi d S )Nru   r  r  r>  r?   r?  r   r(   r(   r)   endTagOptgroup%	  s   z/getPhases.<locals>.InSelectPhase.endTagOptgroupc                 S   sd   | j jdddr%| j j }|jdkr| j j }|jdks| j  d S | jjs+J | j  d S )Nr   ra  )	r=   rc  r|   r   r?   rJ   r`   rQ   r}   r!  r(   r(   r)   r=  2	  s   

z-getPhases.<locals>.InSelectPhase.endTagSelectc                 S   r  )Nr>  r?   r   r   r(   r(   r)   r  =	  r  z,getPhases.<locals>.InSelectPhase.endTagOtherr   r  r  r   )r  r  rR  r-  N)r8   r9   r:   r   r   r   r   r;  r<  r  r  r  r  r@  rB  r=  r  r   r	  r   r   r
  r   r(   r  r(   r)   InSelectPhase  s:    
rC  c                   @   sn   e Zd Ze Zdd Zdd Zdd Zdd Zd	d
 Z	dd Z
edefgZee_ede	fgZe
e_dS )z'getPhases.<locals>.InSelectInTablePhasec                 S   r  Nr   r  rA   r(   r(   r)   r   U	  r   z2getPhases.<locals>.InSelectInTablePhase.processEOFc                 S   r   rD  r  r   r(   r(   r)   r   X	  r  z9getPhases.<locals>.InSelectInTablePhase.processCharactersc                 S   s(   | j dd|d i | td |S )Nz5unexpected-table-element-start-tag-in-select-in-tabler?   r   )rJ   r}   r  r   r   r(   r(   r)   r}  [	  s   z5getPhases.<locals>.InSelectInTablePhase.startTagTablec                 S   r   rD  r   r   r(   r(   r)   r  `	  r  z5getPhases.<locals>.InSelectInTablePhase.startTagOtherc                 S   s@   | j dd|d i | jj|d ddr| td |S d S )Nz3unexpected-table-element-end-tag-in-select-in-tabler?   r   ra  r   )rJ   r}   r=   rc  r  r   r   r(   r(   r)   r  c	  s
   z3getPhases.<locals>.InSelectInTablePhase.endTagTablec                 S   r   rD  r  r   r(   r(   r)   r  i	  r  z3getPhases.<locals>.InSelectInTablePhase.endTagOther)r   r   r   r   r   r   r   r   N)r8   r9   r:   r   r   r   r   r}  r  r  r  r   r	  r   r
  r   r(   r(   r(   r)   InSelectInTablePhaseR	  s(    
rE  c                       sB   e Zd Ze Zeg dZdd Z fddZdd Z	dd	 Z
d
S )z(getPhases.<locals>.InForeignContentPhase),r  r  r  r   r   r  r  rL  r*   r  rM  r  r  Zh1Zh2Zh3Zh4Zh5Zh6r   r  r  r  rN  rQ  r  r4   rw  r  r'   rP  r  r  r  spanr  r  subsupr   r  r  r  varc                 S   s  i 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dddd d!d"i d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdG}|dH |v r||dH  |dH< d S d S )INZaltglyphZaltGlyphZaltglyphdefZaltGlyphDefZaltglyphitemZaltGlyphItemZanimatecolorZanimateColorZanimatemotionZanimateMotionZanimatetransformZanimateTransformZclippathZclipPathZfeblendZfeBlendZfecolormatrixZfeColorMatrixZfecomponenttransferZfeComponentTransferZfecompositeZfeCompositeZfeconvolvematrixZfeConvolveMatrixZfediffuselightingZfeDiffuseLightingZfedisplacementmapZfeDisplacementMapZfedistantlightZfeDistantLightZfefloodZfeFloodZfefuncaZfeFuncAZfefuncbZfeFuncBZfefuncgZfeFuncGZfefuncrZfeFuncRZfegaussianblurZfeGaussianBlurZfeimageZfeImageZfemergeZfeMergeZfemergenodeZfeMergeNodeZfemorphologyZfeMorphologyZfeoffsetZfeOffsetZfepointlightZfePointLightZfespecularlightingZfeSpecularLightingZfespotlightZfeSpotLightZfetileZfeTileZfeturbulenceZfeTurbulenceZforeignobjectZforeignObjectZglyphrefZglyphRefZlineargradientZlinearGradientZradialGradientZtextPath)ZradialgradientZtextpathr?   r(   )rB   r   replacementsr(   r(   r)   adjustSVGTagNames	  s   	
 !"%z:getPhases.<locals>.InForeignContentPhase.adjustSVGTagNamesc                    sL   |d dkrd|d< n| j jrtdd |d D rd| j _ | | d S )Nrv   rU  u   �c                 s   s    | ]}|t vV  qd S r-   rW  rX  r(   r(   r)   	<genexpr>	  s    zMgetPhases.<locals>.InForeignContentPhase.processCharacters.<locals>.<genexpr>F)rJ   ra   r[  r   r   r  r(   r)   r   	  s   
z:getPhases.<locals>.InForeignContentPhase.processCharactersc                 S   sf  | j jd }|d | jv s|d dkrpt|d  h d@ rp| jdd|d i | j jd j| j jkrn| j	| j jd sn| j
| j jd sn| j j  | j jd j| j jkrn| j	| j jd sn| j
| j jd rI|S |jtd kr~| j| n|jtd kr| | | j| | j| |j|d	< | j | |d
 r| j j  d|d< d S d S )Nru   r?   r  rv   >   facecolorsizez*unexpected-html-element-in-foreign-contentrf   rx   rh   rz   Tr{   )r=   r|   breakoutElementssetkeysrJ   r}   rh   r   rm   rn   r   r   r   rK  r   r   r   )rB   r   r   r(   r(   r)   r   	  sJ   



z8getPhases.<locals>.InForeignContentPhase.processStartTagc                 S   s   t | jjd }| jjd }|jt|d kr#| jdd|d i 	 |jt|d kr`| jj| jj	d krE| jj
  | jjj| j_| jj |kr[| jjsSJ | jj |ksMd }	 |S |d8 }| jj| }|j| jjkrrq#| jj|}	 |S )Nr   ru   r?   r&  Tr  )r   r=   r|   r?   rj   r   rJ   r}   r^   rG   r  r   r   rh   r   r   )rB   r   Z	nodeIndexr   r   r(   r(   r)   r   	  s,   	z6getPhases.<locals>.InForeignContentPhase.processEndTagN)r8   r9   r:   r   r   r   rP  rK  r   r   r   r(   r  r(   r)   InForeignContentPhasex	  s    	)rS  c                   @   sv   e Zd Ze Zdd Zdd Zdd Zdd Zd	d
 Z	dd Z
dd ZedefgZe	e_ede
fgZee_dS )z!getPhases.<locals>.AfterBodyPhasec                 S   r   r-   r(   rA   r(   r(   r)   r   	     z,getPhases.<locals>.AfterBodyPhase.processEOFc                 S   r   )Nr   r   r   r(   r(   r)   r   	  r   z0getPhases.<locals>.AfterBodyPhase.processCommentc                 S       | j d | j jd | j _|S )Nzunexpected-char-after-bodyr   rJ   r}   rG   r^   r   r(   r(   r)   r   	     z3getPhases.<locals>.AfterBodyPhase.processCharactersc                 S   r   r   r   r   r(   r(   r)   r   	  r  z.getPhases.<locals>.AfterBodyPhase.startTagHtmlc                 S   *   | j dd|d i | j jd | j _|S )Nzunexpected-start-tag-after-bodyr?   r   rV  r   r(   r(   r)   r  	  r&  z/getPhases.<locals>.AfterBodyPhase.startTagOtherc                 S   s,   | j jr| j d d S | j jd | j _d S )Nz'unexpected-end-tag-after-body-innerhtmlafterAfterBody)rJ   rQ   r}   rG   r^   )rB   r?   r(   r(   r)   r  
  s   z,getPhases.<locals>.AfterBodyPhase.endTagHtmlc                 S   rX  )Nzunexpected-end-tag-after-bodyr?   r   rV  r   r(   r(   r)   r  

  r&  z-getPhases.<locals>.AfterBodyPhase.endTagOtherr   N)r8   r9   r:   r   r   r   r   r   r   r  r  r  r   r	  r   r
  r   r(   r(   r(   r)   AfterBodyPhase	  s    
rZ  c                       s   e Zd Ze 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ed jfdefdefde	fgZe
e_edefgZee_dS )z"getPhases.<locals>.InFramesetPhasec                 S   r  )Nru   r   zeof-in-framesetr  rA   r(   r(   r)   r   
  r  z-getPhases.<locals>.InFramesetPhase.processEOFc                 S   r   )Nzunexpected-char-in-framesetr   r   r(   r(   r)   r   "
  ro   z4getPhases.<locals>.InFramesetPhase.processCharactersc                 S   r  r-   )r=   r   r   r(   r(   r)   r@  %
  ro   z3getPhases.<locals>.InFramesetPhase.startTagFramesetc                 S   s   | j | | j j  d S r-   r  r   r(   r(   r)   startTagFrame(
  r  z0getPhases.<locals>.InFramesetPhase.startTagFramec                 S   r   r   r   r   r(   r(   r)   startTagNoframes,
  r  z3getPhases.<locals>.InFramesetPhase.startTagNoframesc                 S   r  )Nz unexpected-start-tag-in-framesetr?   r   r   r(   r(   r)   r  /
  r  z0getPhases.<locals>.InFramesetPhase.startTagOtherc                 S   sb   | j jd jdkr| jd n| j j  | jjs-| j jd jdkr/| jjd | j_d S d S d S )Nru   r   z)unexpected-frameset-in-frameset-innerhtmlr   afterFrameset)	r=   r|   r?   rJ   r}   r   rQ   rG   r^   r   r(   r(   r)   endTagFrameset3
  s   z1getPhases.<locals>.InFramesetPhase.endTagFramesetc                 S   r  )Nzunexpected-end-tag-in-framesetr?   r   r   r(   r(   r)   r  ?
  r  z.getPhases.<locals>.InFramesetPhase.endTagOtherr   r   r  r*  N)r8   r9   r:   r   r   r   r   r@  r[  r\  r  r^  r  r   r	  r   r   r
  r   r(   r  r(   r)   InFramesetPhase
  s*    
r_  c                       sv   e Zd Ze Zdd Zdd Zdd Zdd Zd	d
 Z	dd Z
ed jfdefgZee_ede	fgZe
e_dS )z%getPhases.<locals>.AfterFramesetPhasec                 S   r   r-   r(   rA   r(   r(   r)   r   T
  rT  z0getPhases.<locals>.AfterFramesetPhase.processEOFc                 S   r   )Nzunexpected-char-after-framesetr   r   r(   r(   r)   r   X
  ro   z7getPhases.<locals>.AfterFramesetPhase.processCharactersc                 S   r   r4  r   r   r(   r(   r)   r\  [
  r  z6getPhases.<locals>.AfterFramesetPhase.startTagNoframesc                 S   r  )Nz#unexpected-start-tag-after-framesetr?   r   r   r(   r(   r)   r  ^
  r  z3getPhases.<locals>.AfterFramesetPhase.startTagOtherc                 S   s   | j jd | j _d S )NafterAfterFrameset)rJ   rG   r^   r   r(   r(   r)   r  b
  r   z0getPhases.<locals>.AfterFramesetPhase.endTagHtmlc                 S   r  )Nz!unexpected-end-tag-after-framesetr?   r   r   r(   r(   r)   r  e
  r  z1getPhases.<locals>.AfterFramesetPhase.endTagOtherr   r*  N)r8   r9   r:   r   r   r   r   r\  r  r  r  r   r	  r   r   r
  r   r(   r  r(   r)   AfterFramesetPhaseP
  s"    
ra  c                   @   s`   e Zd Ze Zdd Zdd Zdd Zdd Zd	d
 Z	dd Z
dd Zede	fgZe
e_dS )z&getPhases.<locals>.AfterAfterBodyPhasec                 S   r   r-   r(   rA   r(   r(   r)   r   w
  r   z1getPhases.<locals>.AfterAfterBodyPhase.processEOFc                 S   r   r-   r   r   r(   r(   r)   r   z
  r   z5getPhases.<locals>.AfterAfterBodyPhase.processCommentc                 S   r   r   r5  r   r(   r(   r)   r   }
  r  z=getPhases.<locals>.AfterAfterBodyPhase.processSpaceCharactersc                 S   rU  )Nexpected-eof-but-got-charr   rV  r   r(   r(   r)   r   
  rW  z8getPhases.<locals>.AfterAfterBodyPhase.processCharactersc                 S   r   r   r   r   r(   r(   r)   r   
  r  z3getPhases.<locals>.AfterAfterBodyPhase.startTagHtmlc                 S   rX  )Nexpected-eof-but-got-start-tagr?   r   rV  r   r(   r(   r)   r  
  r&  z4getPhases.<locals>.AfterAfterBodyPhase.startTagOtherc                 S   rX  )Nexpected-eof-but-got-end-tagr?   r   rV  r   r(   r(   r)   r   
  r&  z4getPhases.<locals>.AfterAfterBodyPhase.processEndTagr   N)r8   r9   r:   r   r   r   r   r   r   r   r  r   r   r	  r   r
  r(   r(   r(   r)   AfterAfterBodyPhaset
  s    
re  c                   @   sn   e Zd Ze 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ede	fde
fgZee_dS )z*getPhases.<locals>.AfterAfterFramesetPhasec                 S   r   r-   r(   rA   r(   r(   r)   r   
  r   z5getPhases.<locals>.AfterAfterFramesetPhase.processEOFc                 S   r   r-   r   r   r(   r(   r)   r   
  r   z9getPhases.<locals>.AfterAfterFramesetPhase.processCommentc                 S   r   r   r5  r   r(   r(   r)   r   
  r  zAgetPhases.<locals>.AfterAfterFramesetPhase.processSpaceCharactersc                 S   r   )Nrb  r   r   r(   r(   r)   r   
  ro   z<getPhases.<locals>.AfterAfterFramesetPhase.processCharactersc                 S   r   r   r   r   r(   r(   r)   r   
  r  z7getPhases.<locals>.AfterAfterFramesetPhase.startTagHtmlc                 S   r   r4  r   r   r(   r(   r)   startTagNoFrames
  r  z;getPhases.<locals>.AfterAfterFramesetPhase.startTagNoFramesc                 S   r  )Nrc  r?   r   r   r(   r(   r)   r  
  r  z8getPhases.<locals>.AfterAfterFramesetPhase.startTagOtherc                 S   r  )Nrd  r?   r   r   r(   r(   r)   r   
  r  z8getPhases.<locals>.AfterAfterFramesetPhase.processEndTagr   r*  N)r8   r9   r:   r   r   r   r   r   r   r   rf  r  r   r   r	  r   r
  r(   r(   r(   r)   AfterAfterFramesetPhase
  s    
rg  rU   rT   r   r  r  r  r   r   r   r  r   r   r   r   r   r   r  )ry   r  r   r]  rY  r`  )r   )rH   rW   r   r   r   r  r3  r=  rC  r  r  r  r"  r.  r4  r9  rC  rE  rS  rZ  r_  ra  re  rg  r(   )rG  r  r   r)   rF     s   H %-f?B     Y! /F@bYLc&r.8$%%	
rF   c                    sJ   t | d t  @ }|r#t| d  fdd| d  D | d< d S d S )Nrv   c                 3   s$    | ]\}}  |||fV  qd S r-   )r~   )r>   kvrJ  r(   r)   rL  
  s    z$adjust_attributes.<locals>.<genexpr>)r   r2   r.   )r   rJ  Zneeds_adjustmentr(   rj  r)   r   
  s   
r   rr   Fc                 C   s   |d u ri }t | | ||dS )N)r2   r?   rv   rz   )r   )r?   r2   ri   rz   r(   r(   r)   r   
  s
   
r   c                   @   s   e Zd ZdZdS )rt   zError in parsed documentN)r8   r9   r:   r   r(   r(   r(   r)   rt   
  s    rt   )r   T)r*   r   T)rr   NF),Z
__future__r   r   r   Zsixr   r   r0   r   r   r	   r
   Ztreebuilders.baser   r   Z	constantsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r"   r,   r<   r  r!   ZmemoizerF   r   r   	Exceptionrt   r(   r(   r(   r)   <module>   sP    H

  8
                  _
