o }5hC@sdZddlZddlZddlmZdgZedZedZedZ edZ ed Z ed Z ed Z ed Zed ZedejZed ZedZGdddejZdS)zA 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--\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#c@seZdZdZdZddddZddZd d Zd d Zd Z ddZ ddZ ddZ ddZ ddZd7ddZddZddZdd Zd!d"Zd#d$Zd%d&Zd'd(Zd)d*Zd+d,Zd-d.Zd/d0Zd1d2Zd3d4Zd5d6Zd S)8raEFind 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. )scriptstyleT)convert_charrefscCs||_|dS)zInitialize and reset this instance. If convert_charrefs is True (the default), all character references are automatically converted to the corresponding Unicode characters. N)rreset)selfrr "/usr/lib/python3.10/html/parser.py__init__Vs zHTMLParser.__init__cCs(d|_d|_t|_d|_tj|dS)z1Reset this instance. Loses all unprocessed data.z???N)rawdatalasttaginteresting_normal interesting cdata_elem _markupbase ParserBaserr r r r r_s zHTMLParser.resetcCs|j||_|ddS)zFeed data to the parser. Call this as often as you want, with as little or as much text as you want (may include '\n'). rN)rgoaheadr datar r r feedgs zHTMLParser.feedcCs|ddS)zHandle any buffered data.N)rrr r r closepszHTMLParser.closeNcCs|jS)z)Return full source of start tag: '<...>'.)_HTMLParser__starttag_textrr r r get_starttag_textvszHTMLParser.get_starttag_textcCs$||_td|jtj|_dS)Nz )lowerrrecompileIr)r elemr r r set_cdata_modezs zHTMLParser.set_cdata_modecCst|_d|_dSN)rrrrr r r clear_cdata_mode~s zHTMLParser.clear_cdata_modec Cs:|j}d}t|}||kr|jr;|js;|d|}|dkr:|dt||d}|dkr8td ||s8n|}n|j ||}|rI| }n|jrNn|}||kro|jrf|jsf| t |||n | ||||||}||kr{nj|j}|d|rt||r||} n>|d|r||} n3|d|r||} n(|d|r||} n|d |r||} n|d |kr| d|d } nn| dkr|sאn|d |d } | dkr|d|d } | dkr|d } n| d 7} |jr |js | t ||| n | ||| ||| }n|d |rlt||}|rO|d d} || |} |d| d sH| d } ||| }q d||dvrk| |||d |||d }ny|d|rt||}|r|d } || |} |d| d s| d } ||| }q t||}|r|r|||dkr|} | |kr|} |||d }n|d |kr| d|||d }nnJd||ks|r||kr|js|jr|js| t |||n | ||||||}||d|_dS)Nr<&"z[\s;] szHTMLParser.parse_picCsd|_||}|dkr|S|j}||||_g}t||d}|s(Jd|}|d|_}||krt ||}|sCnS|ddd\} } } | sRd} n-| dddkrd| ddksyn| dddkrw| ddkrnn| dd} | rt | } | | | f|}||ks:||| } | d vr| \} }d |jvr| |jd } t|j|jd }n|t|j}|||||S| d r||||S|||||jvr|||S) Nrrz#unexpected call to parse_starttag()r-rN'r.")r/> r[)rcheck_for_whole_start_tagrtagfind_tolerantr:rCrArrattrfind_tolerantrappendstripgetposcountr0r2r6endswithhandle_startendtaghandle_starttagCDATA_CONTENT_ELEMENTSr#)r rGendposrattrsr:rKtagmattrnamerest attrvaluerClinenooffsetr r r r;,sX   &(        zHTMLParser.parse_starttagcCs|j}t||}|rU|}|||d}|dkr|dS|dkr?|d|r-|dS|d|r5dS||kr;|S|dS|dkrEdS|dvrKdS||krQ|S|dStd ) Nrr/r[r-r.r z6abcdefghijklmnopqrstuvwxyz=/ABCDEFGHIJKLMNOPQRSTUVWXYZzwe should not get here!)rlocatestarttagend_tolerantr:rCr8AssertionError)r rGrrkrInextr r r r]_s.   z$HTMLParser.check_for_whole_start_tagcCs*|j}|||ddksJdt||d}|sdS|}t||}|sn|jdur9|||||St||d}|sV|||ddkrQ|dS| |S| d }| d|}| ||dS| d }|jdur||jkr|||||S| |||S) Nr-r)zunexpected call to parse_endtagrr.rNzr)r endendtagr4rC endtagfindr:rr6r^rRrArr1 handle_endtagr%)r rGrr:rS namematchtagnamer"r r r r<s8       zHTMLParser.parse_endtagcCs|||||dSr$)rfrwr rjrir r r res zHTMLParser.handle_startendtagcCdSr$r rzr r r rfzHTMLParser.handle_starttagcCr{r$r )r rjr r r rwr|zHTMLParser.handle_endtagcCr{r$r r rLr r r rBr|zHTMLParser.handle_charrefcCr{r$r r}r r r rEr|zHTMLParser.handle_entityrefcCr{r$r rr r r r6r|zHTMLParser.handle_datacCr{r$r rr r r rTr|zHTMLParser.handle_commentcCr{r$r )r declr r r rQr|zHTMLParser.handle_declcCr{r$r rr r r rXr|zHTMLParser.handle_picCr{r$r rr r r unknown_declr|zHTMLParser.unknown_decl)r)__name__ __module__ __qualname____doc__rgr rrrrrr#r%rr?rRr>r;r]r<rerfrwrBrEr6rTrQrXrr r r r r>s8  z   3"( )rrrhtmlr__all__r rrFrDr@r9rW commentcloser^r_VERBOSErrrurvrrr r r r s,