U
    2ÜŸj“Q  ã                   @   s€   d Z ddlmZ ddlmZ dZdZdZdZed Z	dd	„ Z
d
d„ Zdd„ Zdd„ Zdd„ ZG dd„ deƒZG dd„ deƒZdS )aÒ  
*S*mall, *U*ncomplicated *X*ML.

This is a very simple implementation of XML/HTML as a network
protocol.  It is not at all clever.  Its main features are that it
does not:

  - support namespaces
  - mung mnemonic entity references
  - validate
  - perform *any* external actions (such as fetching URLs or writing files)
    under *any* circumstances
  - has lots and lots of horrible hacks for supporting broken HTML (as an
    option, they're not on by default).
é    )ÚProtocol©ÚprefixedMethodNamesé   é   z.-_:z;+#/%~c                  O   s   dS )zDo nothing.N© )ÚargsÚkwr   r   ú3/tmp/pip-unpacked-wheel-4b529toj/twisted/web/sux.pyÚnop$   s    r   c                  G   s.   g }| D ]}|  |¡ qdd„ |D ƒ}| ¡ S )Nc                 S   s   i | ]
}|d “qS )r   r   ©Ú.0Úxr   r   r
   Ú
<dictcomp>,   s      zunionlist.<locals>.<dictcomp>)ÚextendÚkeys)r   Úlr   Údr   r   r
   Ú	unionlist(   s
    r   c                     sH   |  dt¡‰ i }tdd„ | D ƒŽ D ] ‰t‡ ‡fdd„| D ƒƒ|ˆ< q"|S )NÚdefaultc                 s   s   | ]}|  ¡ V  qd S ©N)r   )r   Zfndictr   r   r
   Ú	<genexpr>3   s     zzipfndict.<locals>.<genexpr>c                 3   s   | ]}|  ˆˆ ¡V  qd S r   )Úgetr   ©r   Úkeyr   r
   r   4   s     )r   r   r   Útuple)r   r	   r   r   r   r
   Ú	zipfndict0   s
    r   c                    s   ‡ ‡fdd„t ˆ ˆƒD ƒS )Nc                    s   i | ]}|t ˆ ˆ| ƒ“qS r   ©Úgetattr©r   Úname©ZclazzÚprefixr   r
   r   9   s   ÿ z+prefixedMethodClassDict.<locals>.<dictcomp>r   r!   r   r!   r
   ÚprefixedMethodClassDict8   s    þr#   c                    s   ‡ ‡fdd„t ˆ jˆƒD ƒS )Nc                    s   i | ]}|t ˆ ˆ| ƒ“qS r   r   r   ©Úobjr"   r   r
   r   @   s   ÿ z)prefixedMethodObjDict.<locals>.<dictcomp>)r   Ú	__class__r$   r   r$   r
   ÚprefixedMethodObjDict?   s    
þr'   c                   @   s"   e Zd Zdd„ Zedœdd„ZdS )Ú
ParseErrorc                 C   s   || _ || _|| _|| _d S r   ©ÚfilenameÚlineÚcolÚmessage)Úselfr*   r+   r,   r-   r   r   r
   Ú__init__G   s    zParseError.__init__)Úreturnc                 C   s"   | j › d| j› d| j› d| j› �S )Nú:z: r)   ©r.   r   r   r
   Ú__str__M   s    zParseError.__str__N)Ú__name__Ú
__module__Ú__qualname__r/   Ústrr3   r   r   r   r
   r(   F   s   r(   c                   @   sì  e Zd ZdZdZd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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<Z%d<Z&d=d>„ Z'd?d@„ Z(dAdB„ Z)dCdD„ Z*dEdF„ Z+dGdH„ Z,dIdJ„ Z-dKdL„ Z.dMdN„ Z/dOdP„ Z0dQdR„ Z1dSdT„ Z2dUdV„ Z3dWdX„ Z4dYdZ„ Z5d[d\„ Z6d]d^„ Z7d_d`„ Z8dadb„ Z9dcdd„ Z:e2Z;e3Z<dedf„ Z=dgdh„ Z>didj„ Z?dkdl„ Z@dmdn„ ZAdodp„ ZBdqdr„ ZCdS )sÚ	XMLParserNz<xml />r   c                 C   s   d| _ d| _g | _d S )Nr   r   )ÚlinenoÚcolnoÚ	encodingsr2   r   r   r
   ÚconnectionMade]   s    zXMLParser.connectionMadec                 C   s   | j | jfS )z;Get the line number and column of the last character parsed)r9   r:   r2   r   r   r
   ÚsaveMarkb   s    zXMLParser.saveMarkc                 C   s   t | jf|  ¡  |f Ž ‚d S r   )r(   r*   r=   )r.   r-   r   r   r
   Ú_parseErrorg   s    zXMLParser._parseErrorc                    s8   t ˆ jddƒ}|dkr4t‡ fdd„dD ƒŽ  }ˆ j_|S )z;Return a dictionary of begin, do, end state function tuplesZ__stateTableNc                 3   s   | ]}t ˆ |ƒV  qd S r   )r'   )r   r"   r2   r   r
   r   r   s   ÿz-XMLParser._buildStateTable.<locals>.<genexpr>)Úbegin_Zdo_Úend_)r   r&   r   Z_XMLParser__stateTable)r.   Ú
stateTabler   r2   r
   Ú_buildStateTablej   s    
þÿzXMLParser._buildStateTablec                 C   sR   d| j ksd| j kr(t|ƒd@ r(tdƒ‚| jr8| j| }| j D ]}t||ƒ}q>|S )NúUTF-16zUCS-2r   z!UTF-16 must come in pairs for now)r;   ÚlenÚAssertionErrorÚ_prependr7   )r.   ÚdataÚencodingr   r   r
   Ú_decodey   s    

zXMLParser._decodec                 C   s0   | j r
dS | jdkr,d| jkr,|  d ¡ dS dS )NÚbodydataÚscriptÚsrcÚwaitforendscript)ÚendtagÚtagNameÚtagAttributesÚbegin_bodydatar2   r   r   r
   ÚmaybeBodyData‚   s    

zXMLParser.maybeBodyDatac              	      s"  |   ¡ }| jsD| d¡r>|dd… | _| j d¡ |dd … }d| _| jrV|  |¡}n
| d¡}| j| j	 ‰‰ | j}| j
}‡ ‡fdd„}|| _
|| \}}}zd|D ]Z}	|	d	kr¼ˆd
7 ‰d‰ nˆ d
7 ‰ ||	ƒ}
|
d k	r¢|
|kr¢|ƒ  |
}|| \}}}||	ƒ q¢W 5 || _
ˆˆ  | _| _	X || _d S )N)s   ÿþs   þÿr   r   rC   Úbeginzutf-8c                      s   ˆˆ fS r   r   r   ©r:   r9   r   r
   r=   ©   s    z(XMLParser.dataReceived.<locals>.saveMarkÚ
r   )rB   ÚstateÚ
startswithrF   r;   ÚappendrI   Údecoder9   r:   r=   )r.   rG   rA   ZcurStateZ	_saveMarkr=   ZbeginFnZdoFnZendFnÚbyteZnewStater   rT   r
   ÚdataReceived–   s>    

zXMLParser.dataReceivedc                 C   s   |   ¡ }|| j t ƒ  dS )z0
        End the last state we were in.
        N)rB   rV   ÚEND_HANDLER)r.   ÚreasonrA   r   r   r
   ÚconnectionLostÄ   s    zXMLParser.connectionLostc                 C   s:   |  ¡ rd S |dkr6| jr$|| _dS |  d|›d�¡ dS )Nú<rJ   zFirst char of document [z
] wasn't <Útagstart)ÚisspaceÚbeExtremelyLenientÚ_leadingBodyDatar>   ©r.   rZ   r   r   r
   Údo_beginÍ   s    zXMLParser.do_beginc                 C   s
   d| _ d S ©NÚ )Ú
commentbufrd   r   r   r
   Úbegin_comment×   s    zXMLParser.begin_commentc                 C   s6   |  j |7  _ | j  d¡r2|  | j d d… ¡ dS d S )Nz-->éýÿÿÿrJ   )rh   ÚendswithÚ
gotCommentrd   r   r   r
   Ú
do_commentÚ   s    zXMLParser.do_commentc                 C   s   d| _ i | _d| _d| _d S ©Nrg   r   )rO   rP   ÚtermtagrN   rd   r   r   r
   Úbegin_tagstartà   s    zXMLParser.begin_tagstartc                 C   s4  |  ¡ s|tkr0|  j|7  _| jdkr,dS �n | ¡ rX| jrL| jrHdS dS |  d¡ nØ|dkrš| jrv|  | j¡ dS |  | ji ¡ | j r�dp–|  	¡ S n–|dkr´| jr¬d	S d
| _n||dkrê| jrÔ| jsè|  d¡ n|  j|7  _d
| _
nF|dk�r| jdk�rdS |  d¡ n | j�r"d| _dS |  d| ¡ d S )Nz!--ÚcommentÚ	waitforgtÚattrszWhitespace before tag-nameú>rJ   ú/Ú
afterslashr   ú!?zInvalid character in tag-nameú[ú!ZexpectcdatazInvalid '[' in tag-namer_   ZunentityzInvalid tag character: %r)ÚisalnumÚ
identCharsrO   ra   rN   r>   Ú	gotTagEndÚgotTagStartrb   rR   ro   rJ   rd   r   r   r
   Údo_tagstartæ   sF    
ÿ
zXMLParser.do_tagstartc                 C   s   |  j |7  _ d S r   ©rJ   rd   r   r   r
   Úbegin_unentity  s    zXMLParser.begin_unentityc                 C   s   |  j |7  _ dS )NrJ   r   rd   r   r   r
   Údo_unentity  s    zXMLParser.do_unentityc                 C   s   |   | j¡ d S r   ©ÚgotTextrJ   r2   r   r   r
   Úend_unentity  s    zXMLParser.end_unentityc                 C   s
   || _ d S r   )Úcdatabufrd   r   r   r
   Úbegin_expectcdata  s    zXMLParser.begin_expectcdatac                 C   sj   |  j |7  _ | j }d}t|ƒt|ƒkrJ| |¡r6d S | jr@dS |  d¡ ||kr\d| _ dS |  d¡ d S )Nz[CDATA[rr   zMal-formed CDATA headerrg   Úcdata)r…   rD   rW   rb   r>   )r.   rZ   ZcdbZcdr   r   r
   Údo_expectcdata!  s    

zXMLParser.do_expectcdatac                 C   s2   |  j |7  _ | j  d¡r.| j d d… | _ dS d S )Nz]]>rj   rJ   )r…   rk   rd   r   r   r
   Údo_cdata5  s    zXMLParser.do_cdatac                 C   s   |   | j¡ d| _d S rf   )ÚgotCDatar…   r2   r   r   r
   Ú	end_cdata;  s    zXMLParser.end_cdatac                 C   s”   |  ¡ s|tkr4| jdkrdS | jd dkr0dS dS | ¡ r@d S |dkrl|  | j| j¡ | j rddpj|  ¡ S |d	krxd
S | jr‚d S |  d| ¡ d S )Nú!DOCTYPEÚdoctyper   rw   rr   Úattrnamert   rJ   ru   rv   zUnexpected character: %r)	rz   r{   rO   ra   r}   rP   rb   rR   r>   rd   r   r   r
   Údo_attrs?  s     
zXMLParser.do_attrsc                 C   s
   || _ d S r   ©r�   rd   r   r   r
   Úbegin_doctypeT  s    zXMLParser.begin_doctypec                 C   s   |dkrdS |  j |7  _ d S ©Nrt   rJ   r�   rd   r   r   r
   Ú
do_doctypeW  s    zXMLParser.do_doctypec                 C   s   |   | j¡ d | _d S r   )Ú
gotDoctyper�   r2   r   r   r
   Úend_doctype\  s    zXMLParser.end_doctypec                 C   s$   |dkr | j s| jsdS |  ¡ S d S r’   )rN   rb   rR   rd   r   r   r
   Údo_waitforgt`  s    zXMLParser.do_waitforgtc                 C   s   || _ d| _d S ©Nr   )rŽ   Ú_attrname_termtagrd   r   r   r
   Úbegin_attrnamef  s    zXMLParser.begin_attrnamec                 C   sê   |  ¡ s|tkr"|  j|7  _d S |dkr.dS | ¡ r:dS | jrÎ|dkrLdS |tks\|  ¡ rn|  j|7  _d S |dkr€d| _d S |dkrÊd	| _| j| j| j< |  	| j
| j¡ | jrÂ|  | j
¡ d
S |  ¡ S d S |  d| j›d|›�¡ d S )Nú=ÚbeforeattrvalZbeforeeqú"'Úattrvalru   r   rt   ÚTruerJ   zInvalid attribute name: ú )rz   r{   rŽ   ra   rb   ÚlenientIdentCharsr˜   r�   rP   r}   rO   r|   rR   r>   rd   r   r   r
   Údo_attrnamej  s4    zXMLParser.do_attrnamec                 C   s„   |dkrdS |  ¡ rd S | jrr|tks.| ¡ r2dS |dkrfd| _| j| j| j< |  | j| j¡ |  	¡ S |dkrrd S |  
d| ¡ d S )Nrœ   r�   Z	messyattrrt   rž   ú\zEInvalid initial attribute value: %r; Attribute values must be quoted.)ra   rb   r    rz   r�   rP   rŽ   r}   rO   rR   r>   rd   r   r   r
   Údo_beforeattrvalˆ  s&    ÿÿzXMLParser.do_beforeattrvalrg   c                 C   s
   d| _ d S r—   )Ú_beforeeq_termtagrd   r   r   r
   Úbegin_beforeeq¡  s    zXMLParser.begin_beforeeqc                 C   s°   |dkrdS |  ¡ rd S | jr¢| ¡ s.|tkrFd| _| j| j| j< dS |dkr�d| _| j| j| j< |  | j| j¡ | j	rˆ|  
| j¡ dS |  ¡ S |dkr¢d| _	d S |  d	¡ d S )
Nrš   r›   rž   rŽ   rt   rJ   ru   r   zInvalid attribute)ra   rb   rz   r{   r�   rP   rŽ   r}   rO   r¤   r|   rR   r>   rd   r   r   r
   Údo_beforeeq¤  s*    zXMLParser.do_beforeeqc                 C   s   || _ d| _d S rf   ©Z	quotetyper�   rd   r   r   r
   Úbegin_attrval»  s    zXMLParser.begin_attrvalc                 C   s    || j krdS |  j|7  _d S )Nrs   r§   rd   r   r   r
   Ú
do_attrval¿  s    
zXMLParser.do_attrvalc                 C   s   | j | j| j< d | _| _ d S rf   ©r�   rP   rŽ   r2   r   r   r
   Úend_attrvalÄ  s    zXMLParser.end_attrvalc                 C   s
   || _ d S r   )r�   rd   r   r   r
   Úbegin_messyattrÈ  s    zXMLParser.begin_messyattrc                 C   s„   |  ¡ rdS |dkrrd}| j d¡r8d}| jd d… | _| j| j| j< |  | j| j¡ |rj|  | j¡ dS |  ¡ S |  j|7  _d S )Nrs   rt   r   ru   r   éÿÿÿÿrJ   )	ra   r�   rk   rP   rŽ   r}   rO   r|   rR   )r.   rZ   ÚendTagr   r   r
   Údo_messyattrË  s    zXMLParser.do_messyattrc                 C   s   | j r| j | j| j< d S r   rª   r2   r   r   r
   Úend_messyattrÜ  s    zXMLParser.end_messyattrc                 C   s
   d| _ d S r—   )Ú_after_slash_closedrd   r   r   r
   Úbegin_afterslashà  s    zXMLParser.begin_afterslashc                 C   sR   | j r|  d¡ |dkr,| jr"d S |  d¡ d| _ |  | j| j¡ |  | j¡ dS )Nz
Mal-formedrt   zNo data allowed after '/'r   rJ   )r±   r>   rb   r}   rO   rP   r|   rd   r   r   r
   Údo_afterslashã  s    

zXMLParser.do_afterslashc                 C   s   | j r| j | _| ` nd| _d S rf   )rc   rJ   rd   r   r   r
   rQ   ó  s    zXMLParser.begin_bodydatac                 C   s*   |dkrdS |dkrdS |  j |7  _ d S )Nr_   r`   ú&Ú	entityrefr   rd   r   r   r
   Údo_bodydataú  s
    zXMLParser.do_bodydatac                 C   s   |   | j¡ d| _d S rf   r‚   r2   r   r   r
   Úend_bodydata  s    zXMLParser.end_bodydatac                 C   s   |dkrdS |  j |7  _ d S )Nr_   Úwaitscriptendtagr   rd   r   r   r
   Údo_waitforendscript  s    zXMLParser.do_waitforendscriptc                 C   s   d| _ d| _d| _d S rn   )ÚtemptagdatarO   rN   rd   r   r   r
   Úbegin_waitscriptendtag
  s    z XMLParser.begin_waitscriptendtagc                 C   sÎ   |  j |7  _ |dkrd| _n¬| js<|  jd| j  7  _dS | ¡ sL|tkr¦|  j|7  _d | j¡s~|  jd| j  7  _dS | jdkrÊ|  | j¡ |  | j¡ dS n$| 	¡ r²dS |  jd| j  7  _dS d S )Nru   Tr_   rM   rK   rr   r¸   )
rº   rN   rJ   rz   r{   rO   rW   rƒ   r|   ra   rd   r   r   r
   Údo_waitscriptendtag  s&    
zXMLParser.do_waitscriptendtagc                 C   s   d| _ d| _d S rf   )ÚerefbufÚ	erefextrard   r   r   r
   Úbegin_entityref6  s    zXMLParser.begin_entityrefc                 C   s~   |  ¡ s|dkr^| jrR| jr.| jdkr.| j| _d| _|dkr@dS |  j|7  _dS |  d¡ n|dkrv|  j|7  _ndS d S )Nr_   Úampr`   ZspacebodydatazBad entity referenceú;rJ   )ra   rb   r½   r¾   r>   rd   r   r   r
   Údo_entityref:  s    zXMLParser.do_entityrefc                 C   s   |   | j¡ d S r   )ÚgotEntityReferencer½   r2   r   r   r
   Úend_entityrefL  s    zXMLParser.end_entityrefc                 C   s   | j | _d | _ d S r   )r¾   rJ   rd   r   r   r
   Úbegin_spacebodydataQ  s    zXMLParser.begin_spacebodydatac                 C   s   t d||ƒ dS )zCEncountered an opening tag.

        Default behaviour is to print.rS   N©Úprint)r.   r    Ú
attributesr   r   r
   r}   Z  s    zXMLParser.gotTagStartc                 C   s   t dt|ƒƒ dS )z8Encountered text

        Default behaviour is to print.ztext:N©rÇ   Úrepr)r.   rG   r   r   r
   rƒ   `  s    zXMLParser.gotTextc                 C   s   t d| ƒ dS )zMEncountered mnemonic entity reference

        Default behaviour is to print.zentityRef: &%s;NrÆ   )r.   Z	entityRefr   r   r
   rÃ   f  s    zXMLParser.gotEntityReferencec                 C   s   dS )z=Encountered comment.

        Default behaviour is to ignore.Nr   )r.   rq   r   r   r
   rl   l  s    zXMLParser.gotCommentc                 C   s   |   |¡ dS )zJEncountered CDATA

        Default behaviour is to call the gotText methodN)rƒ   )r.   r‡   r   r   r
   rŠ   r  s    zXMLParser.gotCDatac                 C   s   t dt|ƒƒ dS )z—Encountered DOCTYPE

        This is really grotty: it basically just gives you everything between
        '<!DOCTYPE' and '>' as an argument.
        rŒ   NrÉ   )r.   r�   r   r   r
   r”   x  s    zXMLParser.gotDoctypec                 C   s   t d|ƒ dS )z?Encountered closing tag

        Default behaviour is to print.ÚendNrÆ   )r.   r    r   r   r
   r|   €  s    zXMLParser.gotTagEnd)Dr4   r5   r6   rV   r;   r*   rb   rF   rc   r<   r=   r>   rB   rI   rR   r[   r^   re   ri   rm   rp   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²   r³   rQ   r¶   r·   r¹   r»   r¼   r¿   rÂ   rÄ   rÅ   Zdo_spacebodydataZend_spacebodydatar}   rƒ   rÃ   rl   rŠ   r”   r|   r   r   r   r
   r8   Q   s‚   	.	
.'r8   N)Ú__doc__Ztwisted.internet.protocolr   Ztwisted.python.reflectr   ZBEGIN_HANDLERZ
DO_HANDLERr\   r{   r    r   r   r   r#   r'   Ú	Exceptionr(   r8   r   r   r   r
   Ú<module>   s   