U
    
W[Q                     @   s   d Z ddlmZ ddlm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).
    )print_function)Protocol)unicode)prefixedMethodNames      z.-_:z;+#/%~c                  O   s   dS )zDo nothing.N )argskwr   r   1/usr/lib/python3/dist-packages/twisted/web/sux.pynop'   s    r   c                  G   s2   g }| D ]}| | qtdd |D }| S )Nc                 S   s   g | ]}|d fqS )r   r   .0xr   r   r   
<listcomp>/   s     zunionlist.<locals>.<listcomp>)extenddict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   g | ]}|  qS r   )r   )r   Zfndictr   r   r   r   6   s     zzipfndict.<locals>.<listcomp>c                    s   g | ]}|  qS r   )getr   r   keyr   r   r   7   s     )r   r   r   tuple)r	   r
   r   r   r   r   	zipfndict3   s
    r   c                    s   t  fddt D S )Nc                    s   g | ]}|t  | fqS r   getattrr   nameZclazzprefixr   r   r   <   s     z+prefixedMethodClassDict.<locals>.<listcomp>)r   r   r!   r   r!   r   prefixedMethodClassDict;   s    r#   c                    s    t  fddt jD S )Nc                    s   g | ]}|t  | fqS r   r   r   objr"   r   r   r   @   s     z)prefixedMethodObjDict.<locals>.<listcomp>)r   r   	__class__r$   r   r$   r   prefixedMethodObjDict?   s    r'   c                   @   s   e Zd Zdd Zdd ZdS )
ParseErrorc                 C   s   || _ || _|| _|| _d S Nfilenamelinecolmessage)selfr+   r,   r-   r.   r   r   r   __init__E   s    zParseError.__init__c                 C   s   d| j | j| j| jf S )Nz%s:%s:%s: %sr*   r/   r   r   r   __str__K   s    zParseError.__str__N)__name__
__module____qualname__r0   r2   r   r   r   r   r(   C   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	encodingsr1   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)r7   r8   r1   r   r   r   saveMarka   s    zXMLParser.saveMarkc                 C   s   t | jf|   |f  d S r)   )r(   r+   r;   )r/   r.   r   r   r   _parseErrorf   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                    s   g | ]}t  |qS r   )r'   )r   r"   r1   r   r   r   q   s   z.XMLParser._buildStateTable.<locals>.<listcomp>)Zbegin_Zdo_Zend_)r   r&   r   Z_XMLParser__stateTable)r/   
stateTabler   r1   r   _buildStateTablei   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)r9   lenAssertionError_prependr   )r/   dataencodingr   r   r   _decodeu   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_bodydatar1   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|  |
}|| \}}}||	 qW 5 || _
  | _| _	X || _d S )N)s   s   r   r   r?   beginzutf-8c                      s    fS r)   r   r   r8   r7   r   r   r;      s    z(XMLParser.dataReceived.<locals>.saveMark
r   )r>   state
startswithrB   r9   appendrE   decoder7   r8   r;   )r/   rC   r=   ZcurStateZ	_saveMarkr;   ZbeginFnZdoFnZendFnbyteZnewStater   rP   r   dataReceived   s>    

zXMLParser.dataReceivedc                 C   s   |   }|| j t   dS )z0
        End the last state we were in.
        N)r>   rR   END_HANDLER)r/   reasonr=   r   r   r   connectionLost   s    zXMLParser.connectionLostc                 C   s8   |  rd S |dkr4| jr$|| _dS | d|f  dS )N<rF   z$First char of document [%r] wasn't <tagstart)isspacebeExtremelyLenient_leadingBodyDatar<   r/   rV   r   r   r   do_begin   s    zXMLParser.do_beginc                 C   s
   d| _ d S N )
commentbufr`   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-->rF   )rd   endswith
gotCommentr`   r   r   r   
do_comment   s    zXMLParser.do_commentc                 C   s   d| _ i | _d| _d| _d S Nrc   r   )rK   rL   termtagrJ   r`   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 rdp| 	 S n|dkr| jrd	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>rF   /
afterslashr   !?zInvalid character in tag-name[!ZexpectcdatazInvalid '[' in tag-namer[   ZunentityzInvalid tag character: %r)isalnum
identCharsrK   r]   rJ   r<   	gotTagEndgotTagStartr^   rN   rk   rF   r`   r   r   r   do_tagstart   sD    

zXMLParser.do_tagstartc                 C   s   |  j |7  _ d S r)   rF   r`   r   r   r   begin_unentity  s    zXMLParser.begin_unentityc                 C   s   |  j |7  _ dS )NrF   r{   r`   r   r   r   do_unentity  s    zXMLParser.do_unentityc                 C   s   |  | j d S r)   gotTextrF   r1   r   r   r   end_unentity  s    zXMLParser.end_unentityc                 C   s
   || _ d S r)   )cdatabufr`   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[rn   zMal-formed CDATA headerrc   cdata)r   r@   rS   r^   r<   )r/   rV   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]]>rf   rF   )r   rg   r`   r   r   r   do_cdata1  s    zXMLParser.do_cdatac                 C   s   |  | j d| _d S rb   )gotCDatar   r1   r   r   r   	end_cdata7  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rd S | d|  d S )N!DOCTYPEdoctyper   rs   rn   attrnamerp   rF   rq   rr   zUnexpected character: %r)	rv   rw   rK   r]   ry   rL   r^   rN   r<   r`   r   r   r   do_attrs;  s     
zXMLParser.do_attrsc                 C   s
   || _ d S r)   r   r`   r   r   r   begin_doctypeP  s    zXMLParser.begin_doctypec                 C   s   |dkrdS |  j |7  _ d S Nrp   rF   r   r`   r   r   r   
do_doctypeS  s    zXMLParser.do_doctypec                 C   s   |  | j d | _d S r)   )
gotDoctyper   r1   r   r   r   end_doctypeX  s    zXMLParser.end_doctypec                 C   s$   |dkr | j s| jsdS |  S d S r   )rJ   r^   rN   r`   r   r   r   do_waitforgt\  s    zXMLParser.do_waitforgtc                 C   s   || _ d| _d S Nr   )r   _attrname_termtagr`   r   r   r   begin_attrnameb  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rd| _d S |dkrd	| _| j| j| j< | 	| j
| j | jr| | j
 d
S |  S d S | d| j|f  d S )N=beforeattrvalZbeforeeq"'attrvalrq   r   rp   TruerF   zInvalid attribute name: %r %r)rv   rw   r   r]   r^   lenientIdentCharsr   r   rL   ry   rK   rx   rN   r<   r`   r   r   r   do_attrnamef  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	messyattrrp   r   \zEInvalid initial attribute value: %r; Attribute values must be quoted.)r]   r^   r   rv   r   rL   r   ry   rK   rN   r<   r`   r   r   r   do_beforeattrval  s    zXMLParser.do_beforeattrvalrc   c                 C   s
   d| _ d S r   )_beforeeq_termtagr`   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rd| _| j| j| j< | | j| j | j	r| 
| j dS |  S |dkrd| _	d S | d	 d S )
Nr   r   r   r   rp   rF   rq   r   zInvalid attribute)r]   r^   rv   rw   r   rL   r   ry   rK   r   rx   rN   r<   r`   r   r   r   do_beforeeq  s*    zXMLParser.do_beforeeqc                 C   s   || _ d| _d S rb   Z	quotetyper   r`   r   r   r   begin_attrval  s    zXMLParser.begin_attrvalc                 C   s    || j krdS |  j|7  _d S )Nro   r   r`   r   r   r   
do_attrval  s    
zXMLParser.do_attrvalc                 C   s   | j | j| j< d | _| _ d S rb   r   rL   r   r1   r   r   r   end_attrval  s    zXMLParser.end_attrvalc                 C   s
   || _ d S r)   )r   r`   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 )Nro   rp   r   rq   r   rF   )	r]   r   rg   rL   r   ry   rK   rx   rN   )r/   rV   ZendTagr   r   r   do_messyattr  s    zXMLParser.do_messyattrc                 C   s   | j r| j | j| j< d S r)   r   r1   r   r   r   end_messyattr  s    zXMLParser.end_messyattrc                 C   s
   d| _ d S r   )_after_slash_closedr`   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-formedrp   zNo data allowed after '/'r   rF   )r   r<   r^   ry   rK   rL   rx   r`   r   r   r   do_afterslash  s    

zXMLParser.do_afterslashc                 C   s   | j r| j | _| ` nd| _d S rb   )r_   rF   r`   r   r   r   rM     s    zXMLParser.begin_bodydatac                 C   s*   |dkrdS |dkrdS |  j |7  _ d S )Nr[   r\   &Z	entityrefr{   r`   r   r   r   do_bodydata  s
    zXMLParser.do_bodydatac                 C   s   |  | j d| _d S rb   r~   r1   r   r   r   end_bodydata  s    zXMLParser.end_bodydatac                 C   s   |dkrdS |  j |7  _ d S )Nr[   waitscriptendtagr{   r`   r   r   r   do_waitforendscript  s    zXMLParser.do_waitforendscriptc                 C   s   d| _ d| _d| _d S rj   )temptagdatarK   rJ   r`   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$|	 rdS |  jd| j  7  _dS d S )Nrq   Tr[   rI   rG   rn   r   )
r   rJ   rF   rv   rw   rK   rS   r   rx   r]   r`   r   r   r   do_waitscriptendtag  s&    
zXMLParser.do_waitscriptendtagc                 C   s   d| _ d| _d S rb   )erefbuf	erefextrar`   r   r   r   begin_entityref0  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[   Zampr\   ZspacebodydatazBad entity reference;rF   )r]   r^   r   r   r<   r`   r   r   r   do_entityref4  s    zXMLParser.do_entityrefc                 C   s   |  | j d S r)   )gotEntityReferencer   r1   r   r   r   end_entityrefF  s    zXMLParser.end_entityrefc                 C   s   | j | _d | _ d S r)   )r   rF   r`   r   r   r   begin_spacebodydataK  s    zXMLParser.begin_spacebodydatac                 C   s   t d|| dS )zCEncountered an opening tag.

        Default behaviour is to print.rO   Nprint)r/   r    Z
attributesr   r   r   ry   S  s    zXMLParser.gotTagStartc                 C   s   t dt| dS )z8Encountered text

        Default behaviour is to print.ztext:Nr   repr)r/   rC   r   r   r   r   Y  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   _  s    zXMLParser.gotEntityReferencec                 C   s   dS )z=Encountered comment.

        Default behaviour is to ignore.Nr   )r/   rm   r   r   r   rh   e  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   k  s    zXMLParser.gotCDatac                 C   s   t dt| dS )zEncountered 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   q  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   rx   y  s    zXMLParser.gotTagEnd)Dr3   r4   r5   rR   r9   r+   r^   rB   r_   r:   r;   r<   r>   rE   rN   rW   rZ   ra   re   ri   rl   rz   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   rM   r   r   r   r   r   r   r   r   r   Zdo_spacebodydataZend_spacebodydatary   r   r   rh   r   r   rx   r   r   r   r   r6   O   s   	-

,(r6   N)__doc__Z
__future__r   Ztwisted.internet.protocolr   Ztwisted.python.compatr   Ztwisted.python.reflectr   ZBEGIN_HANDLERZ
DO_HANDLERrX   rw   r   r   r   r   r#   r'   	Exceptionr(   r6   r   r   r   r   <module>   s    