
    ϪfQ                         d Z ddlmZ ddlmZ dZdZdZdZedz   Z	d Z
d	 Zd
 Zd Zd Z G d de      Z G d de      Zy)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                       y)zDo nothing.N )argskws     1/usr/lib/python3/dist-packages/twisted/web/sux.pynopr   $   s        c                      g }| D ]  }|j                  |        |D ci c]  }|d }}|j                         S c c}w )Nr   )extendkeys)r	   lxds       r   	unionlistr   (   sH    
A 	!AA668O 	s   
;c                      |j                  dt              i }t        d | D         D ]  t        fd| D              |<    |S )Ndefaultc              3   <   K   | ]  }|j                           y wN)r   ).0fndicts     r   	<genexpr>zzipfndict.<locals>.<genexpr>3   s     <V6;;=<s   c              3   B   K   | ]  }|j                          y wr   )get)r   r   r   keys     r   r   zzipfndict.<locals>.<genexpr>4   s     9qquuS'*9s   )r   r   r   tuple)r	   r
   r   r   r   s      @@r   	zipfndictr    0   sK    ffY$G
A<t<= :9D99#:Hr   c           	      \    t        | |      D ci c]  }|t        | ||z          c}S c c}w r   )r   getattr)clazzprefixnames      r   prefixedMethodClassDictr&   8   s;     (v6 	geVd]++  s   )c           	      p    t        | j                  |      D ci c]  }|t        | ||z          c}S c c}w r   )r   	__class__r"   )objr$   r%   s      r   prefixedMethodObjDictr*   ?   s?     (v> 	gc6D=))  s   3c                       e Zd Zd ZdefdZy)
ParseErrorc                 <    || _         || _        || _        || _        y r   filenamelinecolmessage)selfr/   r0   r1   r2   s        r   __init__zParseError.__init__G   s     	r   returnc                 l    | j                    d| j                   d| j                   d| j                   S )N:z: r.   r3   s    r   __str__zParseError.__str__M   s/    --$))AdhhZr$,,HHr   N)__name__
__module____qualname__r4   strr9   r   r   r   r,   r,   F   s    I Ir   r,   c                   ~   e Zd ZdZdZdZdZdZdZd Z	d Z
d Zd Zd Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d Z"d Z#d Z$d Z%d Z&d! Z'd" Z(d# Z)d$ Z*d% Z+d& Z,d' Z-d( Z.d) Z/d* Z0d+ Z1d, Z2d- Z3d. Z4d/ Z5d0 Z6d1 Z7d2 Z8d3 Z9d4 Z:e2Z;e3Z<d5 Z=d6 Z>d7 Z?d8 Z@d9 ZAd: ZBd; ZCy)<	XMLParserNz<xml />r   c                 .    d| _         d| _        g | _        y )Nr   r   )linenocolno	encodingsr8   s    r   connectionMadezXMLParser.connectionMade]   s    
r   c                 2    | j                   | j                  fS )z;Get the line number and column of the last character parsed)rA   rB   r8   s    r   saveMarkzXMLParser.saveMarkb   s     TZZ((r   c                 R    t        | j                  f| j                         z   |fz    r   )r,   r/   rF   )r3   r2   s     r   _parseErrorzXMLParser._parseErrorg   s&    DMM+dmmo=
JLLr   c                 ~     t         j                  dd      }|"t         fddD         x} j                  _        |S )z;Return a dictionary of begin, do, end state function tuples__stateTableNc              3   6   K   | ]  }t        |        y wr   )r*   )r   r$   r3   s     r   r   z-XMLParser._buildStateTable.<locals>.<genexpr>r   s        *$7s   )begin_do_end_)r"   r(   r    _XMLParser__stateTable)r3   
stateTables   ` r   _buildStateTablezXMLParser._buildStateTablej   sJ    
 T^^^TB
7@";8 J4 r   c                     d| j                   v sd| j                   v rt        |      dz  rJ d       | j                  r| j                  |z   }| j                   D ]  }t        ||      } |S )NUTF-16zUCS-2r   z!UTF-16 must come in pairs for now)rC   len_prependr=   )r3   dataencodings      r   _decodezXMLParser._decodey   si    t~~%DNN)B4y1}I&II$====4'D 	'HtX&D	'r   c                 |    | j                   ry| j                  dk(  r d| j                  vr| j                  d        yy)Nbodydatascriptsrcwaitforendscript)endtagtagNametagAttributesbegin_bodydatar8   s    r   maybeBodyDatazXMLParser.maybeBodyData   s=    ;; <<8#T5G5G(G %%r   c                    | j                         }| j                  sB|j                  d      r*|dd | _        | j                  j                  d       |dd  }d| _        | j                  r| j                  |      }n|j                  d      }| j                  | j                  c| j                  }| j                  }fd}|| _
        ||   \  }}}	 |D ]?  }	|	dk(  rd	z  dnd	z   ||	      }
|
 |
|k7  s& |        |
}||   \  }}} ||	       A 	 || _
        c| _        | _	        || _        y # || _
        c| _        | _	        w xY w)
N)s   s   r   r   rS   beginzutf-8c                       fS r   r   )rB   rA   s   r   rF   z(XMLParser.dataReceived.<locals>.saveMark   s    E?"r   
r   )rQ   state
startswithrU   rC   appendrX   decoderA   rB   rF   )r3   rV   rP   curState	_saveMarkrF   beginFndoFnendFnbytenewStaterB   rA   s              @@r   dataReceivedzXMLParser.dataReceived   sb   **,
zz9: $Qq	%%h/ABx DJ>><<%D;;w'DTZZ::MM		# !)(3u	4 "4<aKFEQJE:'H,@G'H+5h+?(GT5DM" &DM&,e#DK
 &DM&,e#DKs   !D; :D;  D; ;Ec                 Z    | j                         } || j                     t                   y)z0
        End the last state we were in.
        N)rQ   rg   END_HANDLER)r3   reasonrP   s      r   connectionLostzXMLParser.connectionLost   s(     **,
+
4::{+-r   c                     |j                         ry |dk7  r)| j                  r|| _        y| j                  d|d       y)N<rZ   zFirst char of document [z
] wasn't <tagstart)isspacebeExtremelyLenient_leadingBodyDatarH   r3   rp   s     r   do_beginzXMLParser.do_begin   sD    <<>3;&&(,%!7xzJKr   c                     d| _         y N )
commentbufr}   s     r   begin_commentzXMLParser.begin_comment   s	    r   c                     | xj                   |z  c_         | j                   j                  d      r| j                  | j                   d d        yy )Nz-->rZ   )r   endswith
gotCommentr}   s     r   
do_commentzXMLParser.do_comment   sA    4??##E*OODOOCR01 +r   c                 <    d| _         i | _        d| _        d| _        y Nr   r   )r_   r`   termtagr^   r}   s     r   begin_tagstartzXMLParser.begin_tagstart   s    r   c                 :   |j                         s|t        v r&| xj                  |z  c_        | j                  dk(  ryy |j                         r,| j                  r| j                  ryy| j                  d       y |dk(  rg| j                  r| j                  | j                         y| j                  | j                  i        | j                   xr dxs | j                         S |dk(  r| j                  ry	d
| _        y |dv rH| j                  r| j                  s/| j                  d       y | xj                  |z  c_        d
| _
        y y |dk(  r"| j                  dk(  ry| j                  d       y | j                  rd| _        y| j                  d|z         y )Nz!--comment	waitforgtattrszWhitespace before tag-name>rZ   /
afterslashr   !?zInvalid character in tag-name[!expectcdatazInvalid '[' in tag-namerx   unentityzInvalid tag character: %r)isalnum
identCharsr_   rz   r^   rH   	gotTagEndgotTagStartr{   rb   r   rZ   r}   s     r   do_tagstartzXMLParser.do_tagstart   sc   <<>TZ/LLD L||u$  %\\^||;; '  !=>S[{{t||,!  r2000@jXDDVDVDX S[||#T\||..$$%DE$ 	 /
 S[||s"$  !:;&& #!84?@r   c                 .    | xj                   |z  c_         y r   rZ   r}   s     r   begin_unentityzXMLParser.begin_unentity  s    r   c                 .    | xj                   |z  c_         y)NrZ   r   r}   s     r   do_unentityzXMLParser.do_unentity  s    r   c                 :    | j                  | j                         y r   gotTextrZ   r8   s    r   end_unentityzXMLParser.end_unentity  s    T]]#r   c                     || _         y r   )cdatabufr}   s     r   begin_expectcdatazXMLParser.begin_expectcdata  s	    r   c                    | xj                   |z  c_         | j                   }d}t        |      t        |      kD  r0|j                  |      ry | j                  ry| j	                  d       ||k(  rd| _         y| j	                  d       y )Nz[CDATA[r   zMal-formed CDATA headerr   cdata)r   rT   rh   r{   rH   )r3   rp   cdbcds       r   do_expectcdatazXMLParser.do_expectcdata!  sz    mmr7SX}}S!((
 #  !:;9DM23r   c                     | xj                   |z  c_         | j                   j                  d      r| j                   d d | _         yy )Nz]]>r   rZ   )r   r   r}   s     r   do_cdatazXMLParser.do_cdata5  s<    ==!!%( MM#2.DM )r   c                 H    | j                  | j                         d| _        y r   )gotCDatar   r8   s    r   	end_cdatazXMLParser.end_cdata;  s    dmm$r   c                    |j                         s|t        v r#| j                  dk(  ry| j                  d   dv ryy|j                         ry |dk(  rI| j	                  | j                  | j
                         | j                   xr dxs | j                         S |d	k(  ry
| j                  ry | j                  d|z         y )N!DOCTYPEdoctyper   r   r   attrnamer   rZ   r   r   zUnexpected character: %r)	r   r   r_   rz   r   r`   r{   rb   rH   r}   s     r   do_attrszXMLParser.do_attrs?  s    <<>TZ/||z) ||A$&"\\^S[T\\4+=+=>///?ZW4CUCUCWWS[$$ 3d:;r   c                     || _         y r   r   r}   s     r   begin_doctypezXMLParser.begin_doctypeT  	    r   c                 :    |dk(  ry| xj                   |z  c_         y Nr   rZ   r   r}   s     r   
do_doctypezXMLParser.do_doctypeW  s    3;r   c                 H    | j                  | j                         d | _        y r   )
gotDoctyper   r8   s    r   end_doctypezXMLParser.end_doctype\  s    %r   c                 `    |dk(  r)| j                   s| j                  sy| j                         S y r   )r^   r{   rb   r}   s     r   do_waitforgtzXMLParser.do_waitforgt`  s/    3;{{$"9"9!%%'' r   c                      || _         d| _        y Nr   )r   _attrname_termtagr}   s     r   begin_attrnamezXMLParser.begin_attrnamef  s    !"r   c                    |j                         s|t        v r| xj                  |z  c_        y |dk(  ry|j                         ry| j                  r|dv ry|t
        v s|j                         r| xj                  |z  c_        y |dk(  rd| _        y |dk(  rd	| _        | j                  | j                  | j                  <   | j                  | j                  | j                         | j                  r| j                  | j                         y
| j                         S y | j                  d| j                  d|       y )N=beforeattrvalbeforeeq"'attrvalr   r   r   TruerZ   zInvalid attribute name:  )r   r   r   rz   r{   lenientIdentCharsr   r   r`   r   r_   r   rb   rH   r}   s     r   do_attrnamezXMLParser.do_attrnamej  s   <<>TZ/MMT!MS["\\^$$u} ((DLLN%s{)*&s{%48LL""4==1  t/A/AB))NN4<<0%))++ 3DMM3DAdXNOr   c                 x   |dv ry|j                         ry | j                  r|t        v s|j                         ry|dk(  r`d| _        | j                  | j
                  | j                  <   | j                  | j                  | j
                         | j                         S |dk(  ry | j                  d|z         y )Nr   r   	messyattrr   r   \zEInvalid initial attribute value: %r; Attribute values must be quoted.)rz   r{   r   r   r   r`   r   r   r_   rb   rH   r}   s     r   do_beforeattrvalzXMLParser.do_beforeattrval  s    5=\\^$$((DLLN"s{%48LL""4==1  t/A/AB))++t| S	
r   r   c                     d| _         y r   )_beforeeq_termtagr}   s     r   begin_beforeeqzXMLParser.begin_beforeeq  s
    !"r   c                 &   |dk(  ry|j                         ry | j                  r|j                         s|t        v r+d| _        | j                  | j
                  | j                  <   y|dk(  rd| _        | j                  | j
                  | j                  <   | j                  | j                  | j
                         | j                  r| j                  | j                         y| j                         S |dk(  rd| _	        y | j                  d	       y )
Nr   r   r   r   r   rZ   r   r   zInvalid attribute)rz   r{   r   r   r   r`   r   r   r_   r   r   rb   rH   r}   s     r   do_beforeeqzXMLParser.do_beforeeq  s    3;"\\^$$||~!3%48LL""4==1!%48LL""4==1  t/A/AB))NN4<<0%))++)*&,-r   c                      || _         d| _        y r   	quotetyper   r}   s     r   begin_attrvalzXMLParser.begin_attrval  s    r   c                 N    || j                   k(  ry| xj                  |z  c_        y )Nr   r   r}   s     r   
do_attrvalzXMLParser.do_attrval  s    4>>!r   c                 f    | j                   | j                  | j                  <   dx| _        | _         y r   r   r`   r   r8   s    r   end_attrvalzXMLParser.end_attrval  s(    ,0LL4==)'))r   c                     || _         y r   )r   r}   s     r   begin_messyattrzXMLParser.begin_messyattr  r   r   c                    |j                         ry|dk(  rd}| j                  j                  d      rd}| j                  d d | _        | j                  | j                  | j                  <   | j                  | j                  | j                         |r| j                  | j                         y| j                         S | xj                  |z  c_        y )Nr   r   r   r   r   rZ   )	rz   r   r   r`   r   r   r_   r   rb   )r3   rp   endTags      r   do_messyattrzXMLParser.do_messyattr  s    <<>S[F||$$S)#||CR004Dt}}-T\\4+=+=>t||,!%%''LLD Lr   c                 d    | j                   r$| j                   | j                  | j                  <   y y r   r   r8   s    r   end_messyattrzXMLParser.end_messyattr  s&    <<04Dt}}- r   c                     d| _         y r   )_after_slash_closedr}   s     r   begin_afterslashzXMLParser.begin_afterslash  s
    #$ r   c                    | j                   r| j                  d       |dk7  r| j                  ry | j                  d       d| _         | j                  | j                  | j
                         | j                  | j                         y)Nz
Mal-formedr   zNo data allowed after '/'r   rZ   )r   rH   r{   r   r_   r`   r   r}   s     r   do_afterslashzXMLParser.do_afterslash  sr    ##\*3;&&  !<=#$ t'9'9:t||$ r   c                 R    | j                   r| j                   | _        | ` y d| _        y r   )r|   rZ   r}   s     r   ra   zXMLParser.begin_bodydata  s%       11DM%DMr   c                 F    |dk(  ry|dk(  ry| xj                   |z  c_         y )Nrx   ry   &	entityrefr   r}   s     r   do_bodydatazXMLParser.do_bodydata  s$    3;3;r   c                 H    | j                  | j                         d| _        y r   r   r8   s    r   end_bodydatazXMLParser.end_bodydata  s    T]]#r   c                 :    |dk(  ry| xj                   |z  c_         y )Nrx   waitscriptendtagr   r}   s     r   do_waitforendscriptzXMLParser.do_waitforendscript  s    3;%r   c                 .    d| _         d| _        d| _        y r   )temptagdatar_   r^   r}   s     r   begin_waitscriptendtagz XMLParser.begin_waitscriptendtag
  s    r   c                 p   | xj                   |z  c_         |dk(  rd| _        y | j                  s#| xj                  d| j                   z   z  c_        y|j                         s|t        v r| xj
                  |z  c_        dj                  | j
                        s#| xj                  d| j                   z   z  c_        y| j
                  dk(  r7| j                  | j                         | j                  | j
                         yy |j                         ry| xj                  d| j                   z   z  c_        y)Nr   Trx   r]   r[   r   r   )
r   r^   rZ   r   r   r_   rh   r   r   rz   r}   s     r   do_waitscriptendtagzXMLParser.do_waitscriptendtag  s     	D  3;DKMMS4#3#333M%\\^tz1LLD L&&t||4t'7'7!77))T]]+t||," *
 \\^% MMS4#3#333M%r   c                      d| _         d| _        y r   )erefbuf	erefextrar}   s     r   begin_entityrefzXMLParser.begin_entityref6  s    r   c                 >   |j                         s|dk(  rm| j                  rO| j                  r | j                  dk7  r| j                  | _        d| _        |dk(  ry| xj                  |z  c_        y| j	                  d       y |dk7  r| xj                  |z  c_        y y)Nrx   ampry   spacebodydatazBad entity reference;rZ   )rz   r{   r  r  rH   r}   s     r   do_entityrefzXMLParser.do_entityref:  s    <<>TS[&&<<DLLE$9%)\\DN$3;%NNd*N*34S[LLD Lr   c                 :    | j                  | j                         y r   )gotEntityReferencer  r8   s    r   end_entityrefzXMLParser.end_entityrefL  s    -r   c                 4    | j                   | _        d | _         y r   )r  rZ   r}   s     r   begin_spacebodydatazXMLParser.begin_spacebodydataQ  s    r   c                     t        d||       y)zCEncountered an opening tag.

        Default behaviour is to print.rd   Nprint)r3   r%   
attributess      r   r   zXMLParser.gotTagStartZ  s     	gtZ(r   c                 .    t        dt        |             y)z8Encountered text

        Default behaviour is to print.ztext:Nr  repr)r3   rV   s     r   r   zXMLParser.gotText`  s     	gtDz"r   c                      t        d|z         y)zMEncountered mnemonic entity reference

        Default behaviour is to print.zentityRef: &%s;Nr  )r3   	entityRefs     r   r  zXMLParser.gotEntityReferencef  s     	)+,r   c                      y)z=Encountered comment.

        Default behaviour is to ignore.Nr   )r3   r   s     r   r   zXMLParser.gotCommentl  s     	r   c                 &    | j                  |       y)zJEncountered CDATA

        Default behaviour is to call the gotText methodN)r   )r3   r   s     r   r   zXMLParser.gotCDatar  s     	Ur   c                 .    t        dt        |             y)zEncountered DOCTYPE

        This is really grotty: it basically just gives you everything between
        '<!DOCTYPE' and '>' as an argument.
        r   Nr  )r3   r   s     r   r   zXMLParser.gotDoctypex  s     	j$w-(r   c                     t        d|       y)z?Encountered closing tag

        Default behaviour is to print.endNr  )r3   r%   s     r   r   zXMLParser.gotTagEnd  s     	eTr   )Dr:   r;   r<   rg   rC   r/   r{   rU   r|   rD   rF   rH   rQ   rX   rb   rr   rv   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   r   r   ra   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   sW   EIHH
 
)
M(,\.,A\$4(<*
(#P<
, HG#..
*!"=% 

%&N$.
 #$)#-)r   r?   N)__doc__twisted.internet.protocolr   twisted.python.reflectr   BEGIN_HANDLER
DO_HANDLERrt   r   r   r   r   r    r&   r*   	Exceptionr,   r?   r   r   r   <module>r%     sh   " / 6 

) I Is sr   