Re, @s ddlmZmZmZy eZWnek r:YnXddlmZddl m Z ddl m Z ddl m Z m Z ddl mZmZmZddl mZmZdd l mZdd lmZdd lmZee ZGd d d eZdS))absolute_importdivisionunicode_literals)deque)spaceCharacters)entities) asciiLettersasciiUpper2Lower)digits hexDigitsEOF) tokenTypes tagTokenTypes)replacementCharacters)HTMLInputStream)Triec seZdZdZddddddfddZddZdd Zdd d d Zd dZddZ ddZ ddZ ddZ ddZ ddZddZddZdd Zd!d"Zd#d$Zd%d&Zd'd(Zd)d*Zd+d,Zd-d.Zd/d0Zd1d2Zd3d4Zd5d6Zd7d8Zd9d:Zd;d<Zd=d>Z d?d@Z!dAdBZ"dCdDZ#dEdFZ$dGdHZ%dIdJZ&dKdLZ'dMdNZ(dOdPZ)dQdRZ*dSdTZ+dUdVZ,dWdXZ-dYdZZ.d[d\Z/d]d^Z0d_d`Z1dadbZ2dcddZ3dedfZ4dgdhZ5didjZ6dkdlZ7dmdnZ8dodpZ9dqdrZ:dsdtZ;dudvZ<dwdxZ=dydzZ>d{d|Z?d}d~Z@ddZAddZBddZCddZDddZEddZFddZGddZHddZIddZJddZKddZLS) HTMLTokenizera  This class takes care of tokenizing HTML. * self.currentToken Holds the token that is currently being processed. * self.state Holds a reference to the method to be invoked... XXX * self.stream Points to HTMLInputStream object. NTcszt|||||_||_||_||_d|_g|_|j|_d|_ d|_ t t |j dS)NF)rstreamparserlowercaseElementNamelowercaseAttrName escapeFlag lastFourChars dataStatestateescape currentTokensuperr__init__)selfrencoding parseMeta useChardetrrr) __class__9/tmp/pip-ztkk0jow-build/pip/_vendor/html5lib/tokenizer.pyr%s        zHTMLTokenizer.__init__ccs}tg|_xg|jrxx6|jjrVitdd6|jjjdd6Vq!Wx|jrt|jjVqZWqWdS)z This is where the magic happens. We do our usually processing through the states and when we have a token to return we yield the token which pauses processing until the next token is requested. ParseErrortyperdataN)r tokenQueuerrerrorsrpoppopleft)r r%r%r&__iter__9s * zHTMLTokenizer.__iter__c %Cst}d}|r!t}d}ng}|jj}x8||krp|tk rp|j||jj}q9Wtdj||}|tkrt|}|j jit dd6dd6i|d6d 6nd |kod kns|d kr3d }|j jit dd6dd6i|d6d 6nsd|koJdknsd|kofdknsd|kodknsd|kodkns|t ddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d g#krQ|j jit dd6dd6i|d6d 6nyt |}WnBt k r|d8}t d |d?Bt d9|d:@B}YnX|d;kr|j jit dd6d<d6|jj|n|S)=zThis function returns either U+FFFD or the character based on the decimal or hexadecimal representation. It also discards ";" if present. If not present self.tokenQueue.append({"type": tokenTypes["ParseError"]}) is invoked. r'r(z$illegal-codepoint-for-numeric-entityr) charAsIntdatavarsiiiu�rii iiiiiiiiiiiiiiiiiii i i i i i i i i i iiiiiiii;z numeric-entity-without-semicolon)r r rcharr appendintjoinrr*r frozensetchr ValueErrorunget) r isHexallowedradix charStackcr2r;vr%r%r&consumeNumberEntityIs`              +  z!HTMLTokenizer.consumeNumberEntityFc Csd}|jjg}|dtks]|dtddfks]|dk rt||dkrt|jj|dn|ddkrpd}|j|jj|ddkrd }|j|jjn|r|dtks| r"|dtkr"|jj|d|j|}qD|j jit d d 6d d 6|jj|j ddj |}nxF|dtk rt jdj |sPn|j|jjqsWy2t jdj |dd}t|}Wntk rd}YnX|dk r|ddkrG|j jit d d 6dd 6n|ddkr|r||tks||tks||dkr|jj|j ddj |}qDt|}|jj|j |dj ||d7}nK|j jit d d 6dd 6|jj|j ddj |}|rf|jd dd|7 entitiesTriehas_keys_with_prefixlongest_prefixlenKeyErrorr rr) r allowedChar fromAttributeoutputrFhex entityName entityLength tokenTyper%r%r& consumeEntitysf) "        zHTMLTokenizer.consumeEntitycCs|jd|dddS)zIThis method replaces the need for "entityInAttributeValueState". rXrYTN)r_)r rXr%r%r&processEntityInAttributesz&HTMLTokenizer.processEntityInAttributecCs|j}|dtkr|jr<|djt|dr'z'expected-tag-name-but-got-right-bracketrQz<>?z'expected-tag-name-but-got-question-markzexpected-tag-namerKT)rr;markupDeclarationOpenStatercloseTagOpenStater rr tagNameStater*r<rrBbogusCommentState)r r)r%r%r&rirs6      "   " zHTMLTokenizer.tagOpenStatecCs?|jj}|tkrSitdd6|d6gd6dd6|_|j|_n|dkr|jjitdd6d d6|j |_n|t kr|jjitdd6d d6|jjitd d6d d6|j |_nL|jjitdd6d d6i|d6d6|jj ||j |_dS)Nrbr(rar)Frcrxr'z*expected-closing-tag-but-got-right-bracketz expected-closing-tag-but-got-eofrQz|jjitdd6dd6|jj||j |_dS)Nrur1rQr(rKr)T) rr;temporaryBufferrcdataEndTagOpenStaterr*r<rrBrn)r r)r%r%r&rms  " z%HTMLTokenizer.rcdataLessThanSignStatecCs{|jj}|tkr9|j|7_|j|_n>|jjitdd6dd6|jj ||j |_dS)NrQr(z|jjitdd6dd6|jj||j |_dS)Nrur1rQr(rKr)T) rr;rrawtextEndTagOpenStaterr*r<rrBrp)r r)r%r%r&ros  " z&HTMLTokenizer.rawtextLessThanSignStatecCs{|jj}|tkr9|j|7_|j|_n>|jjitdd6dd6|jj ||j |_dS)NrQr(z|jjitdd6dd6|jj ||j |_d S) Nrur1rtrQr(z|jjitdd6dd6|jj ||j |_dS)NrQr(z|jjitdd6dd6|jj ||j |_dS)Nrur1rQr(rKr)T) rr;r scriptDataEscapedEndTagOpenStaterr r*r<r scriptDataDoubleEscapeStartStaterBr)r r)r%r%r&rs   & " z0HTMLTokenizer.scriptDataEscapedLessThanSignStatecCsu|jj}|tkr3||_|j|_n>|jjitdd6dd6|jj ||j |_dS)NrQr(z               z'HTMLTokenizer.beforeAttributeValueStatecCs|jj}|dkr*|j|_n|dkrF|jdn|dkr|jjitdd6dd6|jdd dd 7|jj it dd6dd6|jj ||j|_dS) Nrxrur'r(z$unexpected-EOF-after-attribute-valuer)z*unexpected-character-after-attribute-valueT) rr;rr~rrfrr r*r<rrBr)r r)r%r%r&r*s"        z&HTMLTokenizer.afterAttributeValueStatecCs|jj}|dkr5d|jd<|jn|tkr|jjitdd6dd6|jj||j |_ n>|jjitdd6dd6|jj||j |_ dS) NrxTrcr'r(z#unexpected-EOF-after-solidus-in-tagr)z)unexpected-character-after-solidus-in-tag) rr;rrfr r*r<rrBrrr~)r r)r%r%r&r>s       z&HTMLTokenizer.selfClosingStartTagStatecCsc|jjd}|jdd}|jjitdd6|d6|jj|j|_dS)Nrxrgu�Commentr(r)T) rrjreplacer*r<rr;rr)r r)r%r%r&r}Ps   zHTMLTokenizer.bogusCommentStatecCs0|jjg}|d dkrv|j|jj|d!dkritdd6dd6|_|j|_dSne|d"d#krd}x>d*D]6}|j|jj|d+|krd}PqqW|ritdd6dd6dd6dd6dd6|_|j|_dSn|d,dkr|jdk r|jj j r|jj j d-j |jj j krd}xPd d ddddgD]6}|j|jj|d.|krd}PqqW|r|j |_dSn|jjitdd6dd6x |r|jj|jqW|j|_dS)/Nrrrr(r1r)TdDoOrGCtTyYpPeEFDoctyperapublicIdsystemIdcorrect[Ar'zexpected-dashes-or-doctyperRrRrR)rrrrrGrrrrrrrrr)rrrrrrrRrRrRrR)rr;r<rrcommentStartStater doctypeStatertree openElements namespacedefaultNamespacecdataSectionStater*rBr,r})r rFmatchedexpectedr%r%r&rz_sR    %    z(HTMLTokenizer.markupDeclarationOpenStatecCs-|jj}|dkr*|j|_n|dkrl|jjitdd6dd6|jdd7|jjitdd6dd6|jj ||j|_dS) Nr'r(z!expected-doctype-name-but-got-eofr)Frzneed-space-after-doctypeT) rr;rbeforeDoctypeNameStaterr r*r<rrrrB)r r)r%r%r&rs      zHTMLTokenizer.doctypeStatecCs?|jj}|tkrn|dkr{|jjitdd6dd6d|jd<|jj|j|j|_n|dkr|jjitdd6d d6d |jd <|j |_nv|t kr"|jjitdd6d d6d|jd<|jj|j|j|_n||jd <|j |_d S)Nrxr'r(z+expected-doctype-name-but-got-right-bracketr)Frrgzinvalid-codepointu�raz!expected-doctype-name-but-got-eofT) rr;rr*r<rrrrdoctypeNameStater )r r)r%r%r&r&s.            z$HTMLTokenizer.beforeDoctypeNameStatecCso|jj}|tkrG|jdjt|jd<|j|_n$|dkr|jdjt|jd<|jj |j|j |_n|dkr|jj it dd6dd6|jdd7<|j |_n|t krZ|jj it dd6d d6d |jd <|jdjt|jd<|jj |j|j |_n|jd|7|tkr{|jj||jj|j|j|_ndS)NrxT) rr;r*r<rrrr rB)r r)r%r%r&rs  zHTMLTokenizer.bogusDoctypeStatecCsfg}x|j|jjd|j|jjd|jj}|tkrZPq |dkslt|ddddkr|ddd|dcountranger*rrrr)r r)r; nullCountrr%r%r&rs0   zHTMLTokenizer.cdataSectionState)M__name__ __module__ __qualname____doc__rr.rIr_r`rfrrhrnrlrprrrsrir{r|rmrrrorrrqrrrrrrrrrrrrrrrrr~rrrrrrrrr}rzrrrrrrrrrrrrrrrrrrrrrrrr%r%)r$r&rs    HP          #                  7 "       -          3            rN) __future__rrrunichrr@ NameError collectionsr constantsrrr r r r r rrr inputstreamrtrierrSobjectrr%r%r%r&s