o 0iR@sdZddlZddlZddlmZdgZedZedZedZ edZ ed Z ed Z ed Z ed Zed ZedZedejZedejZedejZed 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 z--!?>z-?>z0([a-zA-Z][^\t\n\r\f />]*)(?:[\t\n\r\f ]|/(?!>))*a{ ( (?<=['"\t\n\r\f /])[^\t\n\r\f />][^\t\n\r\f /=>]* # attribute name ) ([\t\n\r\f ]*=[\t\n\r\f ]* # value indicator ('[^']*' # LITA-enclosed value |"[^"]*" # LIT-enclosed value |(?!['"])[^>\t\n\r\f ]* # bare value ) )? (?:[\t\n\r\f ]|/(?!>))* # possibly followed by a space a [a-zA-Z][^\t\n\r\f />]* # tag name [\t\n\r\f /]* # optional whitespace before attribute name (?:(?<=['"\t\n\r\f /])[^\t\n\r\f />][^\t\n\r\f /=>]* # attribute name (?:[\t\n\r\f ]*=[\t\n\r\f ]* # value indicator (?:'[^']*' # LITA-enclosed value |"[^"]*" # LIT-enclosed value |(?!['"])[^>\t\n\r\f ]* # bare value ) )? [\t\n\r\f /]* # possibly followed by a space )* >? 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@seZdZdZdZdZdddddZd d Zd d Zd dZ dZ ddZ ddddZ ddZ d>ddZddZddZd>ddZd?d d!Zd"d#Zd$d%Zd&d'Zd(d)Zd*d+Zd,d-Zd.d/Zd0d1Zd2d3Zd4d5Zd6d7Zd8d9Zd:d;Zd'.)_HTMLParser__starttag_textrr r r get_starttag_textszHTMLParser.get_starttag_text escapablecCst||_||_|jdkrtd|_dS|r*|js*td|jtjtjB|_dStd|jtjtjB|_dS)N plaintextz\Zz&|])z])) lowerrrrecompilerr IGNORECASEASCII)r elemr!r r r set_cdata_modes        zHTMLParser.set_cdata_modecCst|_d|_d|_dS)NT)rrrrrr r r clear_cdata_modes zHTMLParser.clear_cdata_modecCs ||_dS)aEnable or disable support of the CDATA sections. If enabled, "<[CDATA[" starts a CDATA section which ends with "]]>". If disabled, "<[CDATA[" starts a bogus comments which ends with ">". This method is not called by default. Its purpose is to be called in custom handle_starttag() and handle_endtag() methods, with value that depends on the adjusted current node. See https://html.spec.whatwg.org/multipage/parsing.html#markup-declaration-open-state for details. N)r)r flagr r r _set_support_cdatas zHTMLParser._set_support_cdatac Cs|j}d}t|}||krU|jr;|js;|d|}|dkr:|dt||d}|dkr8td ||s8n|}n|j ||}|rI| }n|jrNn|}||kro|jrf|j rf| t|||n | ||||||}||kr{n|j}|d|rt||r||} n@|d|r||} n5|d|r||} n*|d|r||} n|d |r||} n|d |ks|r| d|d } nn| dkr|sِn|t||rn|d|r|d |kr| dnt||rn|||d dn|d|r0|}d D]} || |d r"|t| 8}nq|||d |nW|d|rF|jrF|||ddnA|||ddkr_|||d dn(|d |rq|||d dn|d|r|||d dnt d|} ||| }n|d|rt!||}|r|"d d} |#| |$} |d| d s| d } ||| }q d||dvr| |||d |||d }nu|d|rQt%||}|r|"d } |&| |$} |d| d s | d } ||| }q t'||}|r;|r:|"||dkr:|$} | |kr2|} |||d }n|d |krP| d|||d }nn||ks|r||kr|jrq|j rq| t|||n | ||||||}||d|_dS)Nr<&"z [\t\n\r\f ;]zrr8r5r7rr1rzcommentabruptcloserCr?rJrS)r rWreportrrCrYr r r rFpszHTMLParser.parse_commentrcCsD|j}|d|d}|dkrdS|r|||d||dS)Nrr1r8r)rr;rJ)r rWrarposr r r r^szHTMLParser.parse_bogus_commentcCsH|j}t||d}|sdS|}|||d||}|S)Nr1r8)rpicloser>r?rNrSr rWrrCrYr r r rGszHTMLParser.parse_picCsd|_||}|dkr|S|j}||||_g}t||d}|}|d|_}||krt ||}|s=nS|ddd\} } } | sLd} n-| dddkr^| ddkssn| dddkrq| ddkrynn| dd} | rt | } | | | f|}||ks4||| } | dvr| \} }d |jvr| |jd } t|j|jd }n|t|j}|||||S| d r||||S|||||jvs|jr|d ks|d kr|j|d d|S||jvr|j|dd|S)Nrrr1r5'r8")r/> rgZnoscriptr"Fr T)rcheck_for_whole_start_tagrtagfind_tolerantrCrSrQr#rattrfind_tolerantrappendstripZgetposcountr:r<r@rKhandle_startendtaghandle_starttagCDATA_CONTENT_ELEMENTSrr)RCDATA_CONTENT_ELEMENTS)r rWendposrattrsrCrZtagmattrnamerestZ attrvaluerSlinenooffsetr r r rDsd  &(        zHTMLParser.parse_starttagcCs6|j}t||d}|}||ddkrdS|S)Nrrr8)r locatetagendrCrSrdr r r ris z$HTMLParser.check_for_whole_start_tagcCs|j}|d|ddkrdSt||s*||d|ddkr%|dS||St||d}|}||ddkr@dSt||d}|d }| || |S)Nrr1rr8r5r) rr;rIrCr^r{rSrjrQr# handle_endtagr*)r rWrrCrYrur r r rEs    zHTMLParser.parse_endtagcCs|||||dSN)rpr|r rurtr r r ros zHTMLParser.handle_startendtagcCdSr}r r~r r r rpzHTMLParser.handle_starttagcCrr}r )r rur r r r|rzHTMLParser.handle_endtagcCrr}r r r\r r r rRrzHTMLParser.handle_charrefcCrr}r rr r r rU rzHTMLParser.handle_entityrefcCrr}r rr r r r@ rzHTMLParser.handle_datacCrr}r rr r r rJrzHTMLParser.handle_commentcCrr}r )r Zdeclr r r rMrzHTMLParser.handle_declcCrr}r rr r r rNrzHTMLParser.handle_picCrr}r rr r r rLrzHTMLParser.unknown_decl)T)r)!__name__ __module__ __qualname____doc__rqrrr rrrrrr)r*r,rrHrFr^rGrDrirErorpr|rRrUr@rJrMrNrLr r r r rZs@    "   9  )rr$rZhtmlr__all__r%rrVrTrPrBrIrcr_r`rjVERBOSErkr{Zlocatestarttagend_tolerantZ endendtagZ endtagfindrrr r r r s6