o
    bQ                     @   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rdS | d d S | jrd| _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   )zEncountered 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   