U
    ¼Ê¦iI  ã                   @   sÊ   d Z ddlZddlZddlZddlmZ dgZe d¡Ze d¡Z	e d¡Z
e d¡Ze d	¡Ze d
¡Ze d¡Ze d¡Ze d¡Ze d¡Ze dej¡Ze d¡Ze d¡ZG dd„ dejƒZdS )zA parser for HTML and XHTML.é    N)ÚunescapeÚ
HTMLParserz[&<]z
&[a-zA-Z#]z%&([a-zA-Z][-.a-zA-Z0-9]*)[^a-zA-Z0-9]z)&#(?:[0-9]+|[xX][0-9a-fA-F]+)[^0-9a-fA-F]z	<[a-zA-Z]z
</[a-zA-Z]ú>z--\s*>z+([a-zA-Z][^\t\n\r\f />\x00]*)(?:\s|/(?!>))*z]((?<=[\'"\s/])[^\s/>][^\s/=>]*)(\s*=+\s*(\'[^\']*\'|"[^"]*"|(?![\'"])[^>\s]*))?(?:\s|/(?!>))*aF  
  <[a-zA-Z][^\t\n\r\f />\x00]*       # tag name
  (?:[\s/]*                          # optional whitespace before attribute name
    (?:(?<=['"\s/])[^\s/>][^\s/=>]*  # attribute name
      (?:\s*=+\s*                    # value indicator
        (?:'[^']*'                   # LITA-enclosed value
          |"[^"]*"                   # LIT-enclosed value
          |(?!['"])[^>\s]*           # bare value
         )
        \s*                          # possibly followed by a space
       )?(?:\s|/(?!>))*
     )*
   )?
  \s*                                # trailing whitespace
z#</\s*([a-zA-Z][-.a-zA-Z0-9:_]*)\s*>c                   @   sè   e Zd ZdZdZddœdd„Zdd„ Zd	d
„ Zdd„ ZdZ	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zd9d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/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ ZdS ):r   aE  Find tags and other markup and call handler functions.

    Usage:
        p = HTMLParser()
        p.feed(data)
        ...
        p.close()

    Start tags are handled by calling self.handle_starttag() or
    self.handle_startendtag(); end tags by self.handle_endtag().  The
    data between tags is passed from the parser to the derived class
    by calling self.handle_data() with the data as argument (the data
    may be split up in arbitrary chunks).  If convert_charrefs is
    True the character references are converted automatically to the
    corresponding Unicode character (and self.handle_data() is no
    longer split in chunks), otherwise they are passed by calling
    self.handle_entityref() or self.handle_charref() with the string
    containing respectively the named or numeric reference as the
    argument.
    )ZscriptZstyleT)Úconvert_charrefsc                C   s   || _ |  ¡  dS )zÆInitialize and reset this instance.

        If convert_charrefs is True (the default), all character references
        are automatically converted to the corresponding Unicode characters.
        N)r   Úreset)Úselfr   © r   ú!/usr/lib/python3.8/html/parser.pyÚ__init__X   s    zHTMLParser.__init__c                 C   s(   d| _ d| _t| _d| _tj | ¡ dS )z1Reset this instance.  Loses all unprocessed data.Ú z???N)ÚrawdataÚlasttagÚinteresting_normalÚinterestingÚ
cdata_elemÚ_markupbaseÚ
ParserBaser   ©r   r   r   r	   r   a   s
    zHTMLParser.resetc                 C   s   | j | | _ |  d¡ dS )z‘Feed data to the parser.

        Call this as often as you want, with as little or as much text
        as you want (may include '\n').
        r   N)r   Úgoahead©r   Údatar   r   r	   Úfeedi   s    zHTMLParser.feedc                 C   s   |   d¡ dS )zHandle any buffered data.é   N)r   r   r   r   r	   Úcloser   s    zHTMLParser.closeNc                 C   s   | j S )z)Return full source of start tag: '<...>'.)Ú_HTMLParser__starttag_textr   r   r   r	   Úget_starttag_textx   s    zHTMLParser.get_starttag_textc                 C   s$   |  ¡ | _t d| j tj¡| _d S )Nz</\s*%s\s*>)Úlowerr   ÚreÚcompileÚIr   )r   Úelemr   r   r	   Úset_cdata_mode|   s    
zHTMLParser.set_cdata_modec                 C   s   t | _d | _d S ©N)r   r   r   r   r   r   r	   Úclear_cdata_mode€   s    zHTMLParser.clear_cdata_modec                 C   s@  | j }d}t|ƒ}||k �rÐ| jrv| jsv| d|¡}|dk r | dt||d ƒ¡}|dkrpt d¡ 	||¡sp�qÐ|}n*| j
 	||¡}|r’| ¡ }n| jrœ�qÐ|}||k rÞ| jrÌ| jsÌ|  t|||… ƒ¡ n|  |||… ¡ |  ||¡}||krö�qÐ|j}|d|ƒ�r2t ||¡�r"|  |¡}	nŒ|d|ƒ�r:|  |¡}	nt|d|ƒ�rR|  |¡}	n\|d|ƒ�rj|  |¡}	nD|d	|ƒ�r‚|  |¡}	n,|d
 |k �s–|�rÐ|  d¡ |d
 }	n�qÐ|	dk �r$|�sÂ�qÐt ||¡�rÔ�nL|d|ƒ�r"|d |k�rú|  d¡ n&t ||¡�r
n|  ||d d … ¡ nþ|d|ƒ�rz|}dD ]*}
| |
|d ¡�r6|t|
ƒ8 } �qb�q6|  ||d |… ¡ n¦|d|ƒ�rž|  ||d d … ¡ n‚|||d …  ¡ dk�rÐ|  ||d d … ¡ nP|d	|ƒ�rô|  ||d d … ¡ n,|d|ƒ�r|  ||d d … ¡ ntdƒ‚|}	|  ||	¡}q|d|ƒ�rØt ||¡}|�rš|  ¡ dd… }|  !|¡ | "¡ }	|d|	d
 ƒ�sŠ|	d
 }	|  ||	¡}qn<d||d … k�rÐ|  |||d … ¡ |  ||d ¡}�qÐq|d|ƒ�rÂt# ||¡}|�r8|  d
¡}|  $|¡ | "¡ }	|d|	d
 ƒ�s*|	d
 }	|  ||	¡}qt% ||¡}|�r’|�rÐ|  ¡ ||d … k�rÐ| "¡ }	|	|k�r||}	|  ||d
 ¡}�qÐn.|d
 |k �rÐ|  d¡ |  ||d
 ¡}n�qÐqdstdƒ‚q|�r.||k �r.| j�s.| j�r| j�s|  t|||… ƒ¡ n|  |||… ¡ |  ||¡}||d … | _ d S )Nr   ú<ú&é"   z[\s;]ú</ú<!--ú<?ú<!r   é   )z--!z--ú-é   z	<![CDATA[é   é	   ú	<!doctypeúwe should not get here!z&#éÿÿÿÿú;zinteresting.search() lied)&r   Úlenr   r   ÚfindÚrfindÚmaxr   r   Úsearchr   ÚstartÚhandle_datar   Z	updateposÚ
startswithÚstarttagopenÚmatchÚparse_starttagÚparse_endtagÚparse_commentÚparse_piÚparse_html_declarationÚ
endtagopenÚhandle_commentÚendswithÚunknown_declr   Úhandle_declÚ	handle_piÚAssertionErrorÚcharrefÚgroupÚhandle_charrefÚendÚ	entityrefÚhandle_entityrefÚ
incomplete)r   rM   r   ÚiÚnÚjZampposr=   r;   ÚkÚsuffixÚnamer   r   r	   r   ‡   sä    
ÿ
 








zHTMLParser.goaheadc                 C   s¾   | j }|||d … dks"tdƒ‚|||d … dkr@|  |¡S |||d … dkr^|  |¡S |||d …  ¡ d	kr°| d
|d ¡}|dkr’dS |  ||d |… ¡ |d S |  |¡S d S )Nr+   r*   z+unexpected call to parse_html_declaration()r-   r(   r.   z<![r/   r0   r   r2   r   )r   rI   r@   Zparse_marked_sectionr   r5   rG   Úparse_bogus_comment)r   rQ   r   Úgtposr   r   r	   rB     s    

z!HTMLParser.parse_html_declarationr   c                 C   s`   | j }|||d … dks"tdƒ‚| d|d ¡}|dkr>dS |rX|  ||d |… ¡ |d S )Nr+   )r*   r'   z"unexpected call to parse_comment()r   r2   r   )r   rI   r5   rD   )r   rQ   Zreportr   Úposr   r   r	   rW   (  s    zHTMLParser.parse_bogus_commentc                 C   sd   | j }|||d … dks"tdƒ‚t ||d ¡}|s:dS | ¡ }|  ||d |… ¡ | ¡ }|S )Nr+   r)   zunexpected call to parse_pi()r2   )r   rI   Úpicloser8   r9   rH   rM   )r   rQ   r   r=   rS   r   r   r	   rA   4  s    zHTMLParser.parse_pic                 C   sì  d | _ |  |¡}|dk r|S | j}|||… | _ g }t ||d ¡}|sPtdƒ‚| ¡ }| d¡ ¡  | _	}||k �r.t
 ||¡}|sŠ�q.| ddd¡\}	}
}|
s¨d }n\|d d… d  krÌ|dd … ksøn |d d… d  krô|dd … k�rn n|dd… }|�rt|ƒ}| |	 ¡ |f¡ | ¡ }ql|||…  ¡ }|d	k�r¬|  ¡ \}}d
| j k�rˆ|| j  d
¡ }t| j ƒ| j  d
¡ }n|t| j ƒ }|  |||… ¡ |S | d¡�rÆ|  ||¡ n"|  ||¡ || jk�rè|  |¡ |S )Nr   r   z#unexpected call to parse_starttag()r+   r.   ú'r2   ú")r   ú/>Ú
r]   )r   Úcheck_for_whole_start_tagr   Útagfind_tolerantr=   rI   rM   rK   r   r   Úattrfind_tolerantr   ÚappendÚstripZgetposÚcountr4   r6   r:   rE   Úhandle_startendtagÚhandle_starttagÚCDATA_CONTENT_ELEMENTSr!   )r   rQ   Úendposr   Úattrsr=   rT   ÚtagÚmÚattrnameÚrestZ	attrvaluerM   ÚlinenoÚoffsetr   r   r	   r>   @  s\    

&
 ÿ
ÿ


ÿ
zHTMLParser.parse_starttagc                 C   s¶   | j }t ||¡}|rª| ¡ }|||d … }|dkr>|d S |dkr~| d|¡rZ|d S | d|¡rjdS ||krv|S |d S |dkrŠdS |dkr–dS ||kr¢|S |d S td	ƒ‚d S )
Nr   r   ú/r]   r+   r2   r   z6abcdefghijklmnopqrstuvwxyz=/ABCDEFGHIJKLMNOPQRSTUVWXYZr1   )r   Úlocatestarttagend_tolerantr=   rM   r;   rI   )r   rQ   r   rk   rS   Únextr   r   r	   r_   s  s.    z$HTMLParser.check_for_whole_start_tagc                 C   s.  | j }|||d … dks"tdƒ‚t ||d ¡}|s:dS | ¡ }t ||¡}|sÜ| jd k	rr|  |||… ¡ |S t	 ||d ¡}|s¬|||d … dkr¢|d S |  
|¡S | d¡ ¡ }| d| ¡ ¡}|  |¡ |d S | d¡ ¡ }| jd k	�r|| jk�r|  |||… ¡ |S |  |¡ |  ¡  |S )	Nr+   r'   zunexpected call to parse_endtagr   r2   r.   z</>r   )r   rI   Ú	endendtagr8   rM   Ú
endtagfindr=   r   r:   r`   rW   rK   r   r5   Úhandle_endtagr#   )r   rQ   r   r=   rX   Z	namematchZtagnamer    r   r   r	   r?   •  s8    



zHTMLParser.parse_endtagc                 C   s   |   ||¡ |  |¡ d S r"   )rf   ru   ©r   rj   ri   r   r   r	   re   ½  s    zHTMLParser.handle_startendtagc                 C   s   d S r"   r   rv   r   r   r	   rf   Â  s    zHTMLParser.handle_starttagc                 C   s   d S r"   r   )r   rj   r   r   r	   ru   Æ  s    zHTMLParser.handle_endtagc                 C   s   d S r"   r   ©r   rV   r   r   r	   rL   Ê  s    zHTMLParser.handle_charrefc                 C   s   d S r"   r   rw   r   r   r	   rO   Î  s    zHTMLParser.handle_entityrefc                 C   s   d S r"   r   r   r   r   r	   r:   Ò  s    zHTMLParser.handle_datac                 C   s   d S r"   r   r   r   r   r	   rD   Ö  s    zHTMLParser.handle_commentc                 C   s   d S r"   r   )r   Zdeclr   r   r	   rG   Ú  s    zHTMLParser.handle_declc                 C   s   d S r"   r   r   r   r   r	   rH   Þ  s    zHTMLParser.handle_pic                 C   s   d S r"   r   r   r   r   r	   rF   á  s    zHTMLParser.unknown_declc                 C   s   t jdtdd� t|ƒS )NzZThe unescape method is deprecated and will be removed in 3.5, use html.unescape() instead.r+   )Ú
stacklevel)ÚwarningsÚwarnÚDeprecationWarningr   )r   Úsr   r   r	   r   å  s
     þzHTMLParser.unescape)r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__rg   r
   r   r   r   r   r   r!   r#   r   rB   rW   rA   r>   r_   r?   re   rf   ru   rL   rO   r:   rD   rG   rH   rF   r   r   r   r   r	   r   @   s:   		 
3"()r€   r   ry   r   Zhtmlr   Ú__all__r   r   rP   rN   rJ   r<   rC   rZ   Zcommentcloser`   ra   ÚVERBOSErq   rs   rt   r   r   r   r   r   r	   Ú<module>   s.   









ÿò

