o
    ¯b”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   ó   dS )zDo nothing.N© )ÚargsÚkwr   r   ú1/usr/lib/python3/dist-packages/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   Ú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                    ó   i | ]
}|t ˆ ˆ| ƒ“qS r   ©Úgetattr©r   Úname©ÚclazzÚprefixr   r   r   9   ó    ÿÿz+prefixedMethodClassDict.<locals>.<dictcomp>r   r$   r   r$   r   ÚprefixedMethodClassDict8   s   þr(   c                    s   ‡ ‡fdd„t ˆ jˆƒD ƒS )Nc                    r   r   r    r"   ©Úobjr&   r   r   r   @   r'   z)prefixedMethodObjDict.<locals>.<dictcomp>)r   Ú	__class__r)   r   r)   r   ÚprefixedMethodObjDict?   s   
þr,   c                   @   s"   e Zd Zdd„ Zdefdd„ZdS )Ú
ParseErrorc                 C   s   || _ || _|| _|| _d S r   ©ÚfilenameÚlineÚcolÚmessage)Úselfr/   r0   r1   r2   r   r   r   Ú__init__G   ó   
zParseError.__init__Úreturnc                 C   s"   | j › d| j› d| j› d| j› �S )Nú:z: r.   ©r3   r   r   r   Ú__str__M   s   "zParseError.__str__N)Ú__name__Ú
__module__Ú__qualname__r4   Ústrr9   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Ú	encodingsr8   r   r   r   ÚconnectionMade^   ó   
zXMLParser.connectionMadec                 C   s   | j | jfS )z;Get the line number and column of the last character parsed)r?   r@   r8   r   r   r   ÚsaveMarkc   s   zXMLParser.saveMarkc                 C   s   t | jf|  ¡  |f Ž ‚r   )r-   r/   rD   )r3   r2   r   r   r   Ú_parseErrorh   s   zXMLParser._parseErrorc                    s8   t ˆ jddƒ}|du rt‡ fdd„dD ƒŽ  }ˆ j_|S )z;Return a dictionary of begin, do, end state function tuplesÚ__stateTableNc                 3   s   � | ]}t ˆ |ƒV  qd S r   )r,   )r   r&   r8   r   r   r   s   s
   € ÿ
ÿz-XMLParser._buildStateTable.<locals>.<genexpr>)Úbegin_Údo_Úend_)r!   r+   r   Ú_XMLParser__stateTable)r3   Ú
stateTabler   r8   r   Ú_buildStateTablek   s   
þÿzXMLParser._buildStateTablec                 C   sR   d| j v s
d| j v rt|ƒd@ rJ dƒ‚| jr| j| }| j D ]}t||ƒ}q|S )NúUTF-16zUCS-2r   z!UTF-16 must come in pairs for now)rA   ÚlenÚ_prependr=   )r3   ÚdataÚencodingr   r   r   Ú_decodez   s   

zXMLParser._decodec                 C   s0   | j rdS | jdkrd| jvr|  d ¡ dS dS )NÚbodydataÚscriptÚsrcÚwaitforendscript)ÚendtagÚtagNameÚtagAttributesÚbegin_bodydatar8   r   r   r   ÚmaybeBodyDataƒ   s   

zXMLParser.maybeBodyDatac              	      s6  |   ¡ }| js"| d¡r|dd… | _| j d¡ |dd … }d| _| jr+|  |¡}n| d¡}| j| j	‰‰ | j}| j
}‡ ‡fdd„}|| _
|| \}}}z<|D ]-}	|	d	kr^ˆd
7 ‰d‰ nˆ d
7 ‰ ||	ƒ}
|
d ur~|
|kr~|ƒ  |
}|| \}}}||	ƒ qQW || _
ˆˆ | _| _	n|| _
ˆˆ | _| _	w || _d S )N)s   ÿþs   þÿr   r   rM   Úbeginzutf-8c                      s   ˆˆ fS r   r   r   ©r@   r?   r   r   rD   ª   s   z(XMLParser.dataReceived.<locals>.saveMarkÚ
r   )rL   ÚstateÚ
startswithrO   rA   ÚappendrR   Údecoder?   r@   rD   )r3   rP   rK   ÚcurStateÚ	_saveMarkrD   ÚbeginFnÚdoFnÚendFnÚbyteÚnewStater   r]   r   ÚdataReceived—   sF   

€óÿ
zXMLParser.dataReceivedc                 C   s   |   ¡ }|| j t ƒ  dS )z0
        End the last state we were in.
        N)rL   r_   ÚEND_HANDLER)r3   ÚreasonrK   r   r   r   ÚconnectionLostÅ   s   zXMLParser.connectionLostc                 C   s:   |  ¡ rd S |dkr| jr|| _dS |  d|›d�¡ dS )Nú<rS   zFirst char of document [z
] wasn't <Útagstart)ÚisspaceÚbeExtremelyLenientÚ_leadingBodyDatarE   ©r3   rh   r   r   r   Údo_beginÎ   s   zXMLParser.do_beginc                 C   ó
   d| _ d S ©NÚ )Ú
commentbufrs   r   r   r   Úbegin_commentØ   ó   
zXMLParser.begin_commentc                 C   s6   |  j |7  _ | j  d¡r|  | j d d… ¡ dS d S )Nz-->éýÿÿÿrS   )rx   ÚendswithÚ
gotCommentrs   r   r   r   Ú
do_commentÛ   s
   þzXMLParser.do_commentc                 C   s   d| _ i | _d| _d| _d S ©Nrw   r   )rX   rY   ÚtermtagrW   rs   r   r   r   Úbegin_tagstartá   r5   zXMLParser.begin_tagstartc                 C   s:  |  ¡ s|tv r|  j|7  _| jdkrdS d S | ¡ r-| jr&| jr$dS dS |  d¡ d S |dkrM| jr<|  | j¡ dS |  | ji ¡ | j rIdpL|  	¡ S |dkr[| jrVd	S d
| _d S |dv rz| jrn| jsl|  d¡ d S d S |  j|7  _d
| _
d S |dkrŒ| jdkr…dS |  d¡ d S | jr”d| _dS |  d| ¡ d S )Nz!--ÚcommentÚ	waitforgtÚattrszWhitespace before tag-nameú>rS   ú/Ú
afterslashr   ú!?zInvalid character in tag-nameú[ú!ÚexpectcdatazInvalid '[' in tag-namern   ÚunentityzInvalid tag character: %r)ÚisalnumÚ
identCharsrX   rp   rW   rE   Ú	gotTagEndÚgotTagStartrq   r[   r€   rS   rs   r   r   r   Údo_tagstartç   sJ   
ÿÿ
ÿ

zXMLParser.do_tagstartc                 C   s   |  j |7  _ d S r   ©rS   rs   r   r   r   Úbegin_unentity  s   zXMLParser.begin_unentityc                 C   s   |  j |7  _ dS )NrS   r’   rs   r   r   r   Údo_unentity  s   zXMLParser.do_unentityc                 C   ó   |   | j¡ d S r   ©ÚgotTextrS   r8   r   r   r   Úend_unentity  ó   zXMLParser.end_unentityc                 C   ó
   || _ d S r   )Úcdatabufrs   r   r   r   Úbegin_expectcdata  rz   zXMLParser.begin_expectcdatac                 C   sj   |  j |7  _ | j }d}t|ƒt|ƒkr%| |¡rd S | jr dS |  d¡ ||kr.d| _ dS |  d¡ d S )Nz[CDATA[rƒ   zMal-formed CDATA headerrw   Úcdata)r›   rN   r`   rq   rE   )r3   rh   ÚcdbÚ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]]>r{   rS   )r›   r|   rs   r   r   r   Údo_cdata6  s
   þzXMLParser.do_cdatac                 C   ó   |   | j¡ d| _d S rv   )ÚgotCDatar›   r8   r   r   r   Ú	end_cdata<  ó   
zXMLParser.end_cdatac                 C   s”   |  ¡ s|tv r| jdkrdS | jd dv rdS dS | ¡ r d S |dkr6|  | j| j¡ | j r2dp5|  ¡ S |d	kr<d
S | jrAd S |  d| ¡ d S )Nú!DOCTYPEÚdoctyper   rˆ   rƒ   Úattrnamer…   rS   r†   r‡   zUnexpected character: %r)	r�   rŽ   rX   rp   r�   rY   rq   r[   rE   rs   r   r   r   Údo_attrs@  s    
zXMLParser.do_attrsc                 C   rš   r   ©r§   rs   r   r   r   Úbegin_doctypeU  rz   zXMLParser.begin_doctypec                 C   ó   |dkrdS |  j |7  _ d S ©Nr…   rS   rª   rs   r   r   r   Ú
do_doctypeX  ó   zXMLParser.do_doctypec                 C   s   |   | j¡ d | _d S r   )Ú
gotDoctyper§   r8   r   r   r   Úend_doctype]  r¥   zXMLParser.end_doctypec                 C   s$   |dkr| j s
| jsdS |  ¡ S d S r­   )rW   rq   r[   rs   r   r   r   Údo_waitforgta  s
   ýzXMLParser.do_waitforgtc                 C   ó   || _ d| _d S ©Nr   )r¨   Ú_attrname_termtagrs   r   r   r   Úbegin_attrnameg  ó   
zXMLParser.begin_attrnamec                 C   sê   |  ¡ s|tv r|  j|7  _d S |dkrdS | ¡ rdS | jrg|dv r&dS |tv s.|  ¡ r7|  j|7  _d S |dkr@d| _d S |dkred	| _| j| j| j< |  	| j
| j¡ | jra|  | j
¡ d
S |  ¡ S d S |  d| j›d|›�¡ d S )Nú=ÚbeforeattrvalÚbeforeeqú"'Úattrvalr†   r   r…   ÚTruerS   zInvalid attribute name: ú )r�   rŽ   r¨   rp   rq   ÚlenientIdentCharsrµ   r¼   rY   r�   rX   r�   r[   rE   rs   r   r   r   Údo_attrnamek  s4   zXMLParser.do_attrnamec                 C   s„   |dv rdS |  ¡ rd S | jr9|tv s| ¡ rdS |dkr3d| _| j| j| j< |  | j| j¡ |  	¡ S |dkr9d S |  
d| ¡ d S )Nr»   r¼   Ú	messyattrr…   r½   ú\zEInvalid initial attribute value: %r; Attribute values must be quoted.)rp   rq   r¿   r�   r¼   rY   r¨   r�   rX   r[   rE   rs   r   r   r   Údo_beforeattrval‰  s&   ÿÿzXMLParser.do_beforeattrvalrw   c                 C   ru   r´   )Ú_beforeeq_termtagrs   r   r   r   Úbegin_beforeeq¢  rz   zXMLParser.begin_beforeeqc                 C   s°   |dkrdS |  ¡ rd S | jrQ| ¡ s|tv r#d| _| j| j| j< dS |dkrHd| _| j| j| j< |  | j| j¡ | j	rD|  
| j¡ dS |  ¡ S |dkrQd| _	d S |  d	¡ d S )
Nr¸   r¹   r½   r¨   r…   rS   r†   r   zInvalid attribute)rp   rq   r�   rŽ   r¼   rY   r¨   r�   rX   rÄ   r�   r[   rE   rs   r   r   r   Údo_beforeeq¥  s*   zXMLParser.do_beforeeqc                 C   r³   rv   ©Ú	quotetyper¼   rs   r   r   r   Úbegin_attrval¼  r·   zXMLParser.begin_attrvalc                 C   s    || j krdS |  j|7  _d S )Nr„   rÇ   rs   r   r   r   Ú
do_attrvalÀ  s   
zXMLParser.do_attrvalc                 C   s   | j | j| j< d | _| _ d S rv   ©r¼   rY   r¨   r8   r   r   r   Úend_attrvalÅ  s   zXMLParser.end_attrvalc                 C   rš   r   )r¼   rs   r   r   r   Úbegin_messyattrÉ  rz   zXMLParser.begin_messyattrc                 C   s„   |  ¡ rdS |dkr9d}| j d¡rd}| jd d… | _| j| j| j< |  | j| j¡ |r5|  | j¡ dS |  ¡ S |  j|7  _d S )Nr„   r…   r   r†   r   éÿÿÿÿrS   )	rp   r¼   r|   rY   r¨   r�   rX   r�   r[   )r3   rh   ÚendTagr   r   r   Údo_messyattrÌ  s   zXMLParser.do_messyattrc                 C   s   | j r| j | j| j< d S d S r   rË   r8   r   r   r   Úend_messyattrÝ  s   ÿzXMLParser.end_messyattrc                 C   ru   r´   )Ú_after_slash_closedrs   r   r   r   Úbegin_afterslashá  rz   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-formedr…   zNo data allowed after '/'r   rS   )rÒ   rE   rq   r�   rX   rY   r�   rs   r   r   r   Údo_afterslashä  s   

zXMLParser.do_afterslashc                 C   s    | j r| j | _| ` d S d| _d S rv   )rr   rS   rs   r   r   r   rZ   ô  s   
zXMLParser.begin_bodydatac                 C   s*   |dkrdS |dkrdS |  j |7  _ d S )Nrn   ro   ú&Ú	entityrefr’   rs   r   r   r   Údo_bodydataû  s
   zXMLParser.do_bodydatac                 C   r¢   rv   r–   r8   r   r   r   Úend_bodydata  r¥   zXMLParser.end_bodydatac                 C   r¬   )Nrn   Úwaitscriptendtagr’   rs   r   r   r   Údo_waitforendscript  r¯   zXMLParser.do_waitforendscriptc                 C   s   d| _ d| _d| _d S r   )ÚtemptagdatarX   rW   rs   r   r   r   Úbegin_waitscriptendtag  rC   z XMLParser.begin_waitscriptendtagc                 C   sÎ   |  j |7  _ |dkrd| _d S | js|  jd| j  7  _dS | ¡ s'|tv rU|  j|7  _d | j¡s@|  jd| j  7  _dS | jdkrS|  | j¡ |  | j¡ dS d S | 	¡ r[dS |  jd| j  7  _dS )Nr†   Trn   rV   rT   rƒ   rÙ   )
rÛ   rW   rS   r�   rŽ   rX   r`   r—   r�   rp   rs   r   r   r   Údo_waitscriptendtag  s(   

ýzXMLParser.do_waitscriptendtagc                 C   s   d| _ d| _d S rv   )ÚerefbufÚ	erefextrars   r   r   r   Úbegin_entityref7  r·   zXMLParser.begin_entityrefc                 C   s~   |  ¡ s|dkr0| jr)| jr| jdkr| j| _d| _|dkr dS |  j|7  _dS |  d¡ d S |dkr=|  j|7  _d S dS )Nrn   Úampro   ÚspacebodydatazBad entity referenceú;rS   )rp   rq   rÞ   rß   rE   rs   r   r   r   Údo_entityref;  s   zXMLParser.do_entityrefc                 C   r•   r   )ÚgotEntityReferencerÞ   r8   r   r   r   Úend_entityrefM  r™   zXMLParser.end_entityrefc                 C   s   | j | _d | _ d S r   )rß   rS   rs   r   r   r   Úbegin_spacebodydataR  s   
zXMLParser.begin_spacebodydatac                 C   s   t d||ƒ dS )zCEncountered an opening tag.

        Default behaviour is to print.r\   N©Úprint)r3   r#   Ú
attributesr   r   r   r�   [  ó   zXMLParser.gotTagStartc                 C   ó   t dt|ƒƒ dS )z8Encountered text

        Default behaviour is to print.ztext:N©ré   Úrepr)r3   rP   r   r   r   r—   a  s   zXMLParser.gotTextc                 C   s   t d| ƒ dS )zMEncountered mnemonic entity reference

        Default behaviour is to print.zentityRef: &%s;Nrè   )r3   Ú	entityRefr   r   r   rå   g  rë   zXMLParser.gotEntityReferencec                 C   r   )z=Encountered comment.

        Default behaviour is to ignore.Nr   )r3   r‚   r   r   r   r}   m  s   zXMLParser.gotCommentc                 C   s   |   |¡ dS )zJEncountered CDATA

        Default behaviour is to call the gotText methodN)r—   )r3   r�   r   r   r   r£   s  ó   zXMLParser.gotCDatac                 C   rì   )z—Encountered DOCTYPE

        This is really grotty: it basically just gives you everything between
        '<!DOCTYPE' and '>' as an argument.
        r¦   Nrí   )r3   r§   r   r   r   r°   y  s   zXMLParser.gotDoctypec                 C   s   t d|ƒ dS )z?Encountered closing tag

        Default behaviour is to print.ÚendNrè   )r3   r#   r   r   r   r�   �  rð   zXMLParser.gotTagEnd)Dr:   r;   r<   r_   rA   r/   rq   rO   rr   rB   rD   rE   rL   rR   r[   rj   rm   rt   ry   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Ñ   rÓ   rÔ   rZ   r×   rØ   rÚ   rÜ   rÝ   rà   rä   ræ   rç   Údo_spacebodydataÚend_spacebodydatar�   r—   rå   r}   r£   r°   r�   r   r   r   r   r>   Q   s„    	.	
.'r>   N)Ú__doc__Útwisted.internet.protocolr   Útwisted.python.reflectr   ÚBEGIN_HANDLERÚ
DO_HANDLERrk   rŽ   r¿   r   r   r   r(   r,   Ú	Exceptionr-   r>   r   r   r   r   Ú<module>   s   