
    h              
         S r SSKJr  SSKrSSKrSSKJrJr  SSKJ	r	J
r
  SSKJr  SSKJr  SSKJrJr  S	R%                  \
" \	" S
SSS5      5      5      r\R(                  " \\SS9  S rS rS rSr\" \5      r\R9                  5         \S-   r\" \5      r\R9                  5         \4S jr\4S jr  " S S\!5      r" " S S5      r# " S S\#5      r$ " S S\#5      r% " S S\#5      r& " S  S!\&5      r' " S" S#\&5      r( " S$ S%\&5      r)S& r*\*" 5       r+ " S' S(\&5      r, " S) S*\#5      r-S+ r.S, r/ " S- S.\5      r0S/ r1S0 r2S1 r3S2 r4 " S3 S45      r5g)5a  
Micro Document Object Model: a partial DOM implementation with SUX.

This is an implementation of what we consider to be the useful subset of the
DOM.  The chief advantage of this library is that, not being burdened with
standards compliance, it can remain very stable between versions.  We can also
implement utility 'pythonic' ways to access and mutate the XML tree.

Since this has not subjected to a serious trial by fire, it is not recommended
to use this outside of Twisted applications.  However, it seems to work just
fine for the documentation generator, which parses a fairly representative
sample of XML.

Microdom mainly focuses on working with HTML and XHTML.

This module is now deprecated.
    )annotationsN)BytesIOStringIO)VersiongetVersionString)ioType)InsensitiveDict)
ParseError	XMLParserz)twisted.web.microdom was deprecated at {}Twisted   
      )
stacklevelc                    / nUR                   nU /n[        U5      S:  aI  UR                  S5      nUR                  U:X  a  U" U5        UR                  USS& [        U5      S:  a  MI  U$ )a  
Return a list of all child elements of C{iNode} with a name matching
C{name}.

Note that this implementation does not conform to the DOM Level 1 Core
specification because it may return C{iNode}.

@param iNode: An element at which to begin searching.  If C{iNode} has a
    name matching C{name}, it will be included in the result.

@param name: A C{str} giving the name of the elements to return.

@return: A C{list} of direct or indirect child elements of C{iNode} with
    the name C{name}.  This may include C{iNode}.
r   N)appendlenpopnodeName
childNodesiNodenamematchesmatches_appendslicecs         [/root/1688_scrapy/alibaba-scraper/venv/lib/python3.13/site-packages/twisted/web/microdom.pygetElementsByTagNamer   )   sh      G^^NGE
e*q.IIaL::1LLbq		 e*q.
 N    c                   UR                  5       n/ nUR                  nU /n[        U5      S:  aW  UR                  S5      nUR                  R                  5       U:X  a  U" U5        UR
                  US S& [        U5      S:  a  MW  U$ Nr   )lowerr   r   r   r   r   r   s         r   getElementsByTagNameNoCaser$   D   sz    ::<DG^^NGE
e*q.IIaL::%1LLbq		 e*q.
 Nr    c                J   ^  [        T 5      [        :X  a  U 4S jnU$ U 4S jnU$ )Nc                t   > [        U [        5      (       a  U R                  S5      n TR                  U 5        g Nzutf-8)
isinstancestrencodewritesstreams    r   w_streamWriteWrapper.<locals>.wT   s)    !S!!HHW%LLOr    c                t   > [        U [        5      (       a  U R                  S5      n TR                  U 5        g r'   )r(   bytesdecoder+   r,   s    r   r/   r0   [   s)    !U##HHW%LLOr    )r   r2   )r.   r/   s   ` r   _streamWriteWrapperr4   Q   s'    f~	 H	
 Hr    ))&z&amp;)<z&lt;)>z&gt;)"z&quot;))'z&apos;c                >    U H  u  p#U R                  X25      n M     U $ )z)
Perform the exact opposite of 'escape'.
replacetextcharsr-   hs       r   unescaperA   r   #     ||A! Kr    c                >    U H  u  p#U R                  X#5      n M     U $ )z3
Escape a few XML special chars with XML entities.
r;   r=   s       r   escaperD   {   rB   r    c                  $    \ rS rSrS rSS jrSrg)MismatchedTags   c                f    XX6XtU4u  U l         U l        U l        U l        U l        U l        U l        g N)filenameexpectgotbegLinebegColendLineendCol)selfrJ   rK   rL   rO   rP   rM   rN   s           r   __init__MismatchedTags.__init__   s8     sVfE	
MKHLKLKr    c                    SU R                   < SU R                  < SU R                  < SU R                  < SU R                  < SU R
                  < 3$ )Nzexpected </z	>, got </z> line: z col: z, began line: )rK   rL   rO   rP   rM   rN   rQ   s    r   __str__MismatchedTags.__str__   s8    
 		
r    )rN   rM   rP   rO   rK   rJ   rL   Nreturnr)   )__name__
__module____qualname____firstlineno__rR   rV   __static_attributes__ r    r   rF   rF      s    	F
r    rF   c                      \ rS rSrS rSS jrS rSSSS0 S4S jrSSSS0 S4S jrSS	 jr	SS
 jr
SS jrS rS rS rS rS rS rS rSrg)Node   Nc                    Xl         / U l        g rI   )
parentNoder   )rQ   rd   s     r   rR   Node.__init__   s    $r    c                    [        U R                  5      [        UR                  5      :w  a  g[        U R                  UR                  5       H  u  p#UR                  U5      (       a  M    g   g)z
Compare this node to C{other}.  If the nodes have the same number of
children and corresponding children are equal to each other, return
C{True}, otherwise return C{False}.

@type other: L{Node}
@rtype: C{bool}
FT)r   r   zipisEqualToNode)rQ   otherabs       r   rh   Node.isEqualToNode   sW     t3u'7'7#88)9)9:DA??1%% ; r     r   c                    [        5       erI   NotImplementedError)rQ   r.   indent	addindentnewlstrip
nsprefixes	namespaces           r   writexmlNode.writexml   s     "##r    c           	     b    [        5       nU R                  XqX#XEU5        UR                  5       nU$ rI   )r   rw   getvalue)	rQ   rq   rr   rs   rt   ru   rv   r-   rvs	            r   toxml
Node.toxml   s-     Ja%YOZZ\	r    c                (    U R                  XX4U5      $ rI   )rw   )rQ   r.   rq   rr   rs   rt   s         r   writeprettyxmlNode.writeprettyxml   s    }}VYeDDr    c                &    U R                  XX45      $ rI   )r|   )rQ   rq   rr   rs   rt   s        r   toprettyxmlNode.toprettyxml   s    zz&T99r    c                    [        5       erI   ro   rQ   deepparents      r   	cloneNodeNode.cloneNode   s    !##r    c                (    U R                   (       a  gg)N   r   r   rU   s    r   hasChildNodesNode.hasChildNodes   s    ??r    c                    [        U[        5      (       d  [        S5      eU R                  R	                  U5        Xl        g)z
Make the given L{Node} the last child of this node.

@param child: The L{Node} which will become a child of this node.

@raise TypeError: If C{child} is not a C{Node} instance.
expected Node instanceN)r(   ra   	TypeErrorr   r   rd   rQ   childs     r   appendChildNode.appendChild   s5     %&&455u%r    c                    [        U[        5      (       a  [        U[        5      (       d  [        S5      eU R                  R	                  U5      nXl        U R                  R                  X15        U$ )aT  
Make the given L{Node} C{new} a child of this node which comes before
the L{Node} C{ref}.

@param new: A L{Node} which will become a child of this node.

@param ref: A L{Node} which is already a child of this node which
    C{new} will be inserted before.

@raise TypeError: If C{new} or C{ref} is not a C{Node} instance.

@return: C{new}
r   )r(   ra   r   r   indexrd   insert)rQ   newrefis       r   insertBeforeNode.insertBefore   sY     #t$$JsD,A,A455OO!!#&q&
r    c                    [        U[        5      (       d  [        S5      eXR                  ;   a"  U R                  R	                  U5        SUl        U$ )a  
Remove the given L{Node} from this node's children.

@param child: A L{Node} which is a child of this node which will no
    longer be a child of this node after this method is called.

@raise TypeError: If C{child} is not a C{Node} instance.

@return: C{child}
r   N)r(   ra   r   r   removerd   r   s     r   removeChildNode.removeChild   sF     %&&455OO#OO""5)#Er    c                
   [        U[        5      (       a  [        U[        5      (       d  [        S5      eUR                  U La  [	        S5      eXR
                  U R
                  R                  U5      '   SUl        Xl        g)a  
Replace a L{Node} which is already a child of this node with a
different node.

@param newChild: A L{Node} which will be made a child of this node.

@param oldChild: A L{Node} which is a child of this node which will
    give up its position to C{newChild}.

@raise TypeError: If C{newChild} or C{oldChild} is not a C{Node}
    instance.

@raise ValueError: If C{oldChild} is not a child of this C{Node}.
r   z$oldChild is not a child of this nodeN)r(   ra   r   rd   
ValueErrorr   r   )rQ   newChildoldChilds      r   replaceChildNode.replaceChild  sl     (D))Hd1K1K455d*CDD;C--h78""r    c                     U R                   S   $ Nr   rU   s    r   	lastChildNode.lastChild$  s    r""r    c                V    [        U R                  5      (       a  U R                  S   $ g r"   )r   r   rU   s    r   
firstChildNode.firstChild'  s#    t??1%%r    )r   rd   rI   )rm    
r   r   N)rZ   r[   r\   r]   r   rR   rh   rw   r|   r   r   r   r   r   r   r   r   r   r   r^   r_   r    r   ra   ra      sr    H& 
$ 2BaBRTE:$ *$#.#r    ra   c                      \ rS rSr% SS jrSS jrSrS\S'   S r\r	\
S	 5       rS
 rSSSS0 S4S jrS rS rS rS rS rSrg)Documenti9  Nc                `    [         R                  U 5        U(       a  U R                  U5        g g rI   )ra   rR   r   )rQ   documentElements     r   rR   Document.__init__:  s$    d_- r    r   c                    [        5       nU R                  Ul        U(       a  U R                  R                  SU 5      nOU R                  nUR	                  U5        U$ Nr   )r   doctyper   r   r   )rQ   r   r   dnewEls        r   r   Document.cloneNode?  sK    JLL	((221d;E((E	er    z
None | strr   c                l    U R                   UR                   :H  =(       a    [        R                  X5      $ rI   )r   ra   rh   rQ   ns     r   isEqualToDocumentDocument.isEqualToDocumentK  s%    		)Jt/A/A$/JJr    c                     U R                   S   $ r"   r   rU   s    r   r   Document.documentElementP  s    q!!r    c                f    U R                   (       a  [        S5      e[        R                  X5        g)z
Make the given L{Node} the I{document element} of this L{Document}.

@param child: The L{Node} to make into this L{Document}'s document
    element.

@raise ValueError: If this document already has a document element.
zOnly one element per document.N)r   r   ra   r   r   s     r   r   Document.appendChildT  s%     ??=>>%r    rm   c           	         [        U5      nU" SU-   5        U R                  (       a  U" SU R                   SU 35        U R                  R                  XX4XVU5        g )Nz<?xml version="1.0"?>z
<!DOCTYPE r7   )r4   r   r   rw   	rQ   r.   rq   rr   rs   rt   ru   rv   r/   s	            r   rw   Document.writexmla  sY      '	
!D
()<<
4<<.$01%%IU		
r    c                    [        U40 UD6$ rI   )Element)rQ   r   kws      r   createElementDocument.createElementu  s    t"r""r    c                    [        U5      $ rI   )TextrQ   r>   s     r   createTextNodeDocument.createTextNodex  s    Dzr    c                    [        U5      $ rI   )Commentr   s     r   createCommentDocument.createComment{  s    t}r    c                d    U R                   R                  (       a  [        X5      $ [        X5      $ rI   )r   caseInsensitiver$   r   rQ   r   s     r   r   Document.getElementsByTagName~  s'    //-d99#D//r    c                   U R                   S S  nU(       ao  UR                  S5      nUR                   (       a  UR                  UR                   5        [        US5      (       a  UR	                  S5      U:X  a  U$ U(       a  Mn  g g )Nr   getAttributeid)r   r   extendhasattrr   )rQ   r   r   nodes       r   getElementByIdDocument.getElementById  se    __Q'
>>!$D!!$//2t^,,1B1B41HB1N jr    r_   rI   r   )rZ   r[   r\   r]   rR   r   r   __annotations__r   rh   propertyr   r   rw   r   r   r   r   r   r^   r_   r    r   r   r   9  sn    .
 GZK &M" "&  
(#0
r    r   c                  H    \ rS rSrS
S jrS r\rSSSS0 S4S jrSS jrS	r	g)EntityReferencei  Nc                b    [         R                  X5        Xl        SU-   S-   =U l        U l        g )Nr5   ;)ra   rR   eref	nodeValuedata)rQ   r   rd   s      r   rR   EntityReference.__init__  s*    d'	%(4Z#%55r    c                    [        U[        5      (       d  gU R                  UR                  :H  =(       a    U R                  UR                  :H  $ r"   )r(   r   r   r   r   s     r   isEqualToEntityReference(EntityReference.isEqualToEntityReference  s7    !_--		QVV#H$..AKK*GHr    rm   r   c                D    [        U5      nU" SU R                  -   5        g )Nrm   r4   r   r   s	            r   rw   EntityReference.writexml  s      '	"t~~
r    c                .    [        U R                  U5      $ rI   )r   r   r   s      r   r   EntityReference.cloneNode  s    tyy&11r    )r   r   r   rI   r   )
rZ   r[   r\   r]   rR   r   rh   rw   r   r^   r_   r    r   r   r     s2    6
I
 -M
 2r    r   c                  (    \ rS rSrSS jrS r\rSrg)CharacterDatai  Nc                X    [         R                  X5        U=U l        =U l        U l        g rI   )ra   rR   valuer   r   )rQ   r   rd   s      r   rR   CharacterData.__init__  s#    d'266
6TYr    c                4    U R                   UR                   :H  $ rI   )r   r   s     r   isEqualToCharacterData$CharacterData.isEqualToCharacterData  s    zzQWW$$r    )r   r   r   rI   )rZ   r[   r\   r]   rR   r   rh   r^   r_   r    r   r   r     s    7% +Mr    r   c                  8    \ rS rSrSrSSSS0 S4S jrS	S jrSrg)
r   i  z
A comment node.
rm   r   c                J    [        U5      nU R                  n	U" SU	 S35        g )Nz<!--z-->)r4   r   )
rQ   r.   rq   rr   rs   rt   ru   rv   r/   vals
             r   rw   Comment.writexml  s'      'ii	DS/r    Nc                .    [        U R                  U5      $ rI   )r   r   r   s      r   r   Comment.cloneNode  s    t~~v..r    r_   r   )rZ   r[   r\   r]   __doc__rw   r   r^   r_   r    r   r   r     s%     /r    r   c                  N    \ rS rSrSS jrS rSS jrSSSS0 S4S jrSS	 jrS
r	g)r   i  Nr   c                <    [         R                  XU5        X0l        g rI   )r   rR   raw)rQ   r   rd   r  s       r   rR   Text.__init__  s    t:6r    c                l    [         R                  X5      =(       a    U R                  UR                  :H  $ )z
Compare this text to C{text}.  If the underlying values and the C{raw}
flag are the same, return C{True}, otherwise return C{False}.
)r   rh   r  rQ   ri   s     r   rh   Text.isEqualToNode  s'    
 **47QDHH		<QQr    c                B    [        U R                  X R                  5      $ rI   )r   r   r  r   s      r   r   Text.cloneNode  s    DNNFHH55r    rm   c                t   [        U5      nU R                  (       a7  U R                  n	[        U	[        5      (       d  [	        U R                  5      n	O]U R                  n
[        U
[        5      (       d  [	        U
5      n
U(       a  SR                  U
R                  5       5      n
[        U
5      n	U" U	5        g )Nr   )r4   r  r   r(   r)   joinsplitrD   )rQ   r.   rq   rr   rs   rt   ru   rv   r/   r   vs              r   rw   Text.writexml  s      '88..Cc3''$..)Aa%%FHHQWWY')C	#r    c                8    S[        U R                  5      -  S-   $ )NzText(%s))reprr   rU   s    r   __repr__Text.__repr__  s    4//#55r    r  r"   r   rX   )
rZ   r[   r\   r]   rR   rh   r   rw   r  r^   r_   r    r   r   r     s0    R6 06r    r   c                  4    \ rS rSrSS jrSSSS0 S4S jrSrg)	CDATASectioni  r   Nc                .    [        U R                  U5      $ rI   )r  r   r   s      r   r   CDATASection.cloneNode  s    DNNF33r    rm   c                d    [        U5      nU" S5        U" SU R                  -   5        U" S5        g )Nz	<![CDATA[rm   z]]>r   r   s	            r   rw   CDATASection.writexml  s-      '	+	"t~~
	%r    r_   r   )rZ   r[   r\   r]   r   rw   r^   r_   r    r   r  r    s     4 r    r  c               #  >   #    Sn  S[        U 5      -   v   U S-   n M  7f)Nr   pr   )r)   )r   s    r   
_genprefixr!    s)     	A
CFlE s   c                      \ rS rSrSrSrg)_Attri  z#Support class for getAttributeNode.r_   N)rZ   r[   r\   r]   r  r^   r_   r    r   r#  r#    s    )r    r#  c                      \ rS rSrSrSrSr       SS jrS rS r	S r
S	 rSS
 jrS rS rSS jrSS jrS rS rS rS rSSSS0 S4S jrSS jrSS jrSrg)r   i  r   r   Nc	                   [         R                  X5        U=(       d    U(       + U l        X`l        U(       d  UR	                  5       nUc  0 U l        OAX l        U R
                  R                  5        H  u  p[        U
5      U R
                  U	'   M     U(       a  [        U R
                  US9U l        U=U l	        =U l
        U l        X@l        XPl        Xl        g )N)preserve)ra   rR   preserveCaser   r#   
attributesitemsrA   r	   
endTagNamer   tagName	_filename_markposrv   )rQ   r+  r(  rd   rJ   markposr   r'  rv   kr  s              r   rR   Element.__init__  s     	d'(?,?.mmoG DO(O--/%-a[" 0 -dooUDO9@@@$-$,!"r    c                b    U R                   c  Xl         g U R                   R                  U5        g rI   )ru   update)rQ   pfxss     r   addPrefixesElement.addPrefixes>  s#    ??""OOO""4(r    c                R    U R                   (       d  UR                  5       nXl        g rI   )r'  r#   r*  )rQ   r*  s     r   endTagElement.endTagD  s      #))+J$r    c                @   U R                   (       aU  U R                  UR                  :H  =(       a5    U R                  R                  5       UR                  R                  5       :H  $ U R                  UR                  :H  =(       a    U R                  UR                  :H  $ rI   )r   r(  r   r#   r   s     r   isEqualToElementElement.isEqualToElementI  sn    OOq||3 ##%)9)9);; 1<</Rdmmqzz6QRr    c                $   U R                   R                  5       UR                   R                  5       :H  =(       aU    U R                  UR                  :H  =(       a5    U R                  UR                  :H  =(       a    [        R                  X5      $ )z
Compare this element to C{other}.  If the C{nodeName}, C{namespace},
C{attributes}, and C{childNodes} are all the same, return C{True},
otherwise return C{False}.
)r   r#   rv   r(  ra   rh   r
  s     r   rh   Element.isEqualToNodeP  sl     MM!U^^%9%9%;; 0%//105#3#330 ""4/		
r    c                F   [        U R                  UU R                  U R                  U R                  S9nUR
                  R                  U R
                  5        U(       a3  U R                   Vs/ s H  oDR                  SU5      PM     snUl        U$ / Ul        U$ s  snf )N)rd   rv   r'  r   r   )	r   r+  rv   r'  r   r(  r2  r   r   )rQ   r   r   cloner   s        r   r   Element.cloneNode]  s    LLnn** 00
 	0GKWe5 9WE   "E  Xs   0Bc                P    U R                   (       a  [        X5      $ [        X5      $ rI   )r   r$   r   r   s     r   r   Element.getElementsByTagNamel  s!    -d99#D//r    c                    gr   r_   rU   s    r   hasAttributesElement.hasAttributesq  s    r    c                8    U R                   R                  X5      $ rI   )r(  get)rQ   r   defaults      r   r   Element.getAttributet  s    ""411r    c                    X4nX@R                   ;   a  U R                   U   $ XR                  :X  a  U R                   R                  X#5      $ U$ rI   )r(  rv   rG  )rQ   nsr   rH  nsks        r   getAttributeNSElement.getAttributeNSw  sF    j//!??3''??&&t55r    c                8    [        U R                  U5      U 5      $ rI   )r#  r   r   s     r   getAttributeNodeElement.getAttributeNode  s    T&&t,d33r    c                     X R                   U'   g rI   r(  )rQ   r   attrs      r   setAttributeElement.setAttribute  s     $r    c                >    XR                   ;   a  U R                   U	 g g rI   rS  r   s     r   removeAttributeElement.removeAttribute  s    ??"% #r    c                    XR                   ;   $ rI   rS  r   s     r   hasAttributeElement.hasAttribute  s    &&r    rm   c           
     b  ^ SnSn	Sn
U R                   (       d  U R                  U l        [        U5      nU R                  (       a;  U R                  R                  5       nUR                  5        H  nX;   d  M
  X	 M     O0 nS/nU R                  U	;   a  XB/U-   nUR                  mU4S jnU R                  nXpR                  :w  a  U R                  b{  U R                  U;   a9  X`R                     nT" US-   U R                  -   5        US-   U R                  -   nODT" U R                  5        U" SU R                  5        U R                  nOT" U R                  5        S	R                  n[        U R                  R                  5       5       Ha  u  nn[        U[        5      (       a8  Uu  nnX;   a  Xm   nO[        [         5      nUX'   Uc   eU" US-   U-   U5        MS  Uc   eU" UU5        Mc     U(       aC  UR                  5        H  u  nnU(       d  M  U" S
U-   U5        M     UR#                  U5        UnOUnU" U" U5      5        U R$                  (       a  U" S5        X#-   nU R$                   HI  nU R                  U	;   a   U R                  U
;   a  U" U" UU45      5        UR'                  UUX4UUU5        MK     U R                  U	;   a  U" U" XB45      5        U" U" SUS45      5        gU R                  R)                  5       U;  a  U" U" SUS45      5        gU" S5        g)a  
Serialize this L{Element} to the given stream.

@param stream: A file-like object to which this L{Element} will be
    written.

@param nsprefixes: A C{dict} mapping namespace URIs as C{str} to
    prefixes as C{str}.  This defines the prefixes which are already in
    scope in the document at the point at which this L{Element} exists.
    This is essentially an implementation detail for namespace support.
    Applications should not try to use it.

@param namespace: The namespace URI as a C{str} which is the default at
    the point in the document at which this L{Element} exists.  This is
    essentially an implementation detail for namespace support.
    Applications should not try to use it.
)imgbrhrbasemetalinkparamareainputcolbasefontisindexframe)htmlheadbodynoscriptinsdelh1h2h3h4h5h6scriptuloldlprer`  
blockquoteaddressr   divfieldsettabletrformobjectr  appletmap)r  rx  ry  rl  r6   c                0   > T" SU S[        U5      S45      $ )Nr   z="r8   )rD   )_atr_valbexts     r   <lambda>"Element.writexml.<locals>.<lambda>  s    tS$fTlC,P'Qr    N:xmlnsrm   zxmlns:r7   z</z></ />)r'  r+  r*  r4   ru   copykeysr   rv   r  sortedr(  r)  r(   tuplenext	genprefixr2  r   rw   r#   )rQ   r.   rq   rr   rs   rt   ru   rv   ALLOWSINGLETONBLOCKELEMENTSFORMATNICELYr/   newprefixesrK  begin	writeattrr*  prefixjrT  r   keydownprefixes	newindentr   r  s                            @r   rw   Element.writexml  s   8

@ 2   "llDO'??//..0K oo'$# ( K<<=(NU*E||Q	
 __
&4>>+E ~~+ $NN3Vc\DLL01#c\DOO;
 T\\"'4>>2 !NN	 GG 5 5 78ID#$&&C#'^F!)_F&,KO&&3,,c2&$$ 9 )//1
F6h/4 2 z*&L%L	!E(??cF*I<<=0T\\\5Qay)*+Iy|Y ) ||},!TN#$az3'()\\!7a
C()*eHr    c                   S[        U R                  5      -  nU R                  (       a  USU R                  < 3-  nU R                  (       a  USU R                  < 3-  nU R                  (       a  USU R                  < 3-  nUS-   $ )Nz
Element(%sz, attributes=z, filename=z
, markpos=r  )r  r   r(  r,  r-  )rQ   reps     r   r  Element.__repr__5  sv    T$--00??]4??"566C>>[ 233C==Z011CSyr    c                   SU R                   -   nU R                  (       d  U R                  (       a  US-  nU R                  (       a  U[        U R                  5      -  nU R                  (       a  USU R                  -  -  nU R                  (       d  U R                  (       a  US-  nU R                  R                  5        H  nUSU-  -  nM     U R                  5       (       a  USU R                   -  -  nU$ US-  nU$ )Nr6   z (z line %s column %sr  z %s=%rz
 >...</%s>r  )r   r,  r-  r  r(  r)  r   )rQ   r  items      r   rV   Element.__str__?  s    DMM!>>T]]4KC>>4''C=='$--77C>>T]]3JCOO))+D8d?"C ,<$--//C 
 5LC
r    )
r,  r-  r(  r   r*  rv   r   ru   r'  r+  )NNNNr   r   Nr   rI   rX   )rZ   r[   r\   r]   r'  r   ru   rR   r4  r7  r:  rh   r   r   rD  r   rM  rP  rU  rX  r[  rw   r  rV   r^   r_   r    r   r   r     s    LOJ
 #>)%
S
0
24%&' gRr    r   c                V    0 nU R                  5        H  u  p#[        U5      X'   M     U$ rI   )r)  rA   r   ddr/  r  s       r   _unescapeDictr  R  s)    	B	 Ir    c                D    0 nU R                  5        H	  u  p#X!U'   M     U$ rI   )r)  r  s       r   _reverseDictr  Y  s%    	B	1 Ir    c                     \ rS rSrSR	                  5       rSS/SS/SS/S// SQ/ SQ/ SQS/S	/S
/S/S/S/SS/S/S.rSSS\\4S jrS rS r	\
R                  " S5      rS rS rS rS rS rS rS rS rS rS  rS!rg")#MicroDOMParseri`  z#area link br img hr input base metar   dtr  li)theadtfoottbodycolgrouprg  r  tdthrm  rl  option)r   r  r  r  r  r  r  r  rg  r  r  r  rl  titler  r   r   c                    / U l         SS S.n[        U5      nUS U4/U l        / U l        S U l        Xl        X l        U=(       d    U(       + U l        X@l        XPl	        g )Nr  )r  rm   )
elementstackr  nsstack	documents
_mddoctypebeExtremelyLenientr   r'  soonCloserslaterClosers)rQ   r  r   r'  r  r  r   drs           r   rR   MicroDOMParser.__init__x  sd     4(!_D""4.(?,?&(r    c                    [        [        U R                  5      5       H;  nU R                  U*    nUR                  S:X  d  UR	                  SS5      S:X  d  M;    g   g)Nr{  z	xml:spacerm   r&  r   r   )ranger   r  r+  r   )rQ   edxels      r   shouldPreserveSpace"MicroDOMParser.shouldPreserveSpace  sT    T../0C""C4(BzzU"book2&F*&T 1 r    c                D    U R                   (       a  U R                   S   $ g r   )r  rU   s    r   
_getparentMicroDOMParser._getparent  s    $$R((r    z\s*/[/*]\s*c                   U R                   (       a  [        UR                  5      S:X  d  g UR                  5       n[	        U[
        5      (       a  SnUR                  nU R                  R                  U5      nU(       a  UR                  5       nU[        U5      S  n [        SU-  5      R                  S   n[        UR                  5      S:w  a  g UR                  5       n[	        U[        [        45      (       aN  / Ul        U(       a$  UR                  R                  [        U5      5        UR                  R                  U5        g g g ! [        [        4 a     g f = f)Nr   rm   z	<a>%s</a>r   )r  r   r   r   r(   r   r   COMMENTmatchgroupparseStringr
   rF   r  r   r   )rQ   r  r   r  oldvaluer  es          r   _fixScriptElement MicroDOMParser._fixScriptElement  s!    &&c"--.@A.EMMOa FwwHLL&&x0E#CKM2h 67BB1E 1<< A%A!lG455 "MM((f6$$Q'	 6+   / s    E E#"E#c                    Xl         g rI   )r  )rQ   r   s     r   
gotDoctypeMicroDOMParser.gotDoctype  s    !r    c                L   U R                  5       nU R                  (       a  [        U[        5      (       a  UR                  nUnU R
                  (       a   UR                  5       nUR                  5       nXPR                  R                  U/ 5      ;   a+  U R                  UR                  5        U R                  5       n[        U5      nU R                  S   S   n0 n/ nUR                  5        H[  u  pU	R                  S5      (       d  M  U	R                  SS5      n[        U5      S:X  a  XUS   '   OXS'   UR!                  U	5        M]     U H  n	X)	 M     U(       a!  UR#                  5       nUR%                  U5        / nUR                  5        HT  u  pU	R                  SS5      n[        U5      S:X  d  M(  Uu  pUS:w  d  M4  X;   d  M;  XXm   U4'   UR!                  U	5        MV     U H  n	X)	 M     [        UUUU R&                  U R)                  5       U R
                  U R*                  UR                  S5      S	9n[-        U5      nUR/                  U5        U(       aN  U R                  S   S   R#                  5       nUR%                  U5        U R                  R!                  XoU45        U R0                  R!                  U5        U(       a  UR3                  U5        U R                  (       a-  UR                  U R4                  ;   a  U R                  U5        g g g )
Nr   r   r  r  r      rm   xml)r   r'  rv   )r  r  r(   r   r+  r   r#   r  rG  	gotTagEndr  r  r)  
startswithr  r   r   r  r2  rJ   saveMarkr'  r  r4  r  r   r  )rQ   r   r(  r   
parentNamemyName
namespaces	newspaceskeysToDeleter/  r  
spacenamesksplitpfxtvr  	revspacesrscopys                     r   gotTagStartMicroDOMParser.gotTagStart  s    """z&''B'BJF##'--/
**..z2>>v~~.*":.
\\"%a(
	$$&DA||G$$WWS!_
z?a'/0jm,$%bM##A& ' A #*Ji($$&DAWWS!_F6{a %<C$567z23 ''* ' A MMMMO 00** nnR(	
 !+	
y!\\"%a(--/FMM)$LL 89  $r"""rzzT5E5E'ENN4  (F"r    c                    U R                  5       nU" X#5      nU(       a  UR                  U5        g U R                  (       a  U R                  R	                  U5        g g rI   )r  r   r  r  r   )rQ   factoryr   r   tes        r   _gotStandaloneMicroDOMParser._gotStandalone  sI    "T"r"$$NN!!"% %r    c                    UR                  5       (       d  U R                  5       (       a  U R                  [        U5        g g rI   )rt   r  r  r   rQ   r   s     r   gotTextMicroDOMParser.gotText  s0    ::<<43355d+ 6r    c                0    U R                  [        U5        g rI   )r  r   r  s     r   
gotCommentMicroDOMParser.gotComment  s    GT*r    c                0    U R                  [        U5        g rI   )r  r   )rQ   	entityRefs     r   gotEntityReference!MicroDOMParser.gotEntityReference  s    OY7r    c                0    U R                  [        U5        g rI   )r  r  )rQ   cdatas     r   gotCDataMicroDOMParser.gotCData  s    L%0r    c                   U R                   (       d;  U R                  (       a  g [        U R                  SU4U R	                  5       -   S-   6 eU R                   R                  5       nU R                  S   S   nU R                  S   S   UL a  U R                  R                  5       nOS nU R                  (       a+  UR                  R                  5       nUR                  5       nOUR                  nUnUR                  SS5      n[        U5      S:X  aw  Uu  pUR                  US 5      n
U
b^  UR                  U
:w  aN  U R                  (       d=  [        U R                  UR                  U4U R	                  5       -   UR                  -   6 eXV:X  GdT  U R                  (       Ga  U R                   (       a  U R                   S   n[        [        U R                   5      5       HH  nU R                   US-   *    R                  U:X  d  M&  U R                   US-   *    R!                  U5          O<   U R                   R#                  U5        Ub  U R                  R#                  U5        g U R                   US-   * S 2	 U R                   (       d  U R$                  R#                  U5        g O=[        U R                  UR                  U4U R	                  5       -   UR                  -   6 eUR!                  U5        U R                   (       d  U R$                  R#                  U5        U R                  (       a#  UR                  S:X  a  U R'                  U5        g g g )	NNOTHING)r   r   r   r  r   r  r   rw  )r  r  rF   rJ   r  r   r  r   r+  r#   r  r   rG  rv   r-  r  r7  r   r  r  )rQ   r   r  pfxdixnstupletncnamensplitr  newnamerK  lastElidxs                r   r  MicroDOMParser.gotTagEnd  s      && ==)T2T]]_DvM  ""$b!!$<<A"$ll&&(GG!!#BJJLEBEC#v;!!LCC&B~<<2%22,!%

D A"&--/!2"$++!.  &&&$$!..q1F$S):):%;<,,sQwZ8@@EI --aj9@@F!  = ))004". LL//8))C!G*,7,,--f5$}}bjj$7$--/IBKKW  			$  NN!!"%""rzzX'=""2& (>"r    c                `   [         R                  " X5        U R                  (       a  U R                  (       a)  U R                  R                  U R                  S   5        g [        U R                  U R                  S   S4U R                  5       -   U R                  S   R                  -   6 eg )Nr   r   END_OF_FILE)
r   connectionLostr  r  r  r   rF   rJ   r  r-  )rQ   reasons     r   r  MicroDOMParser.connectionLostT  s      .&&%%d&7&7&:;$(9(9"(=}M--/*++B/889 	 r    )	r  r  r   r  r  r  r  r'  r  N)rZ   r[   r\   r]   r  r  r  rR   r  r  recompiler  r  r  r  r  r  r  r  r  r  r  r^   r_   r    r   r  r  `  s    
 8==?K4[TlTlf,,,Lwfff&!*L( !)* jj(G(B"=!~&,+81>'@r    r  c                   [        U S5      (       d  [        U S5      n [        U0 UD6n[        U SS5      Ul        UR                  S5        [        U S5      (       a   UR                  U R                  5       5        OCU R                  S5      nU(       a+  UR                  U5        U R                  S5      nU(       a  M+  UR                  S5        UR                  (       d  [        UR                  SSS	5      eUR                  (       a  [        UR                  5      S
:X  aC  UR                  S   n[        U[        5      (       d  [        S5      nUR!                  U5        UnO?[        S5      nUR                   H  nUR!                  U5        M     OUR                  S   n[#        U5      nUR$                  Ul        U$ )z
Parse HTML or XML readable.
readrbr   z<xmlfile />Nrz   i   r   zNo top-level Nodes in documentr   rk  )r   openr  getattrrJ   makeConnectiondataReceivedrz   r  r  r  r
   r  r   r(   r   r   r   r  r   )	readableargskwargsmdprr   r  r   docs	            r   parser  c  sk    8V$$$'
$
)&
)C8V];CLtx$$**,-MM$Qd#A a t==q!-MNN
s}}"a Aa))V_q!Ae$ ' MM!
1+C..CKJr    c                    [        U [        5      (       a'  [        [        U R	                  S5      5      /UQ70 UD6$ [        [        U 5      /UQ70 UD6$ )NzUTF-16)r(   r)   r  r   r*   )str  r   s      r   r  r    sK    "cWRYYx01?D?B??*t*r**r    c                    [        U SSS9$ z
Parse an XML readable object.
r   r   r   r'  )r  )r  s    r   parseXMLr$    s     11==r    c                    [        U SSS9$ r"  )r  )r   s    r   parseXMLStringr&    s     r11==r    c                  D    \ rS rSrSrSS jrS rS rS rSS jr	S r
S	rg
)lmxi  z
Easy creation of XML.
c                P    [        U[        5      (       a  [        U5      nXl        g rI   )r(   r)   r   r   )rQ   r   s     r   rR   lmx.__init__  s    dC  4=D	r    c                <   ^ ^ TS   S:X  a  [        S5      eUU 4S j$ )Nr   _zno private attrsc                 *   > TR                   " T40 U D6$ rI   )add)r   r   rQ   s    r   r  !lmx.__getattr__.<locals>.<lambda>  s    DHHT0R0r    )AttributeErrorr   s   ``r   __getattr__lmx.__getattr__  s     7c> !34400r    c                :    U R                   R                  X5        g rI   )r   rU  )rQ   r  r   s      r   __setitem__lmx.__setitem__  s    		s(r    c                8    U R                   R                  U5      $ rI   )r   r   )rQ   r  s     r   __getitem__lmx.__getitem__  s    yy%%c**r    c                N    [        XS9nU R                  R                  U5        U $ )Nr  )r   r   r   )rQ   txtr  nns       r   r>   lmx.text  s#    #		b!r    c                    [        USSS9nU R                  R                  U5        [        U5      nUR	                  5        H  u  pVUS   S:X  a  USS  nXdU'   M     U$ )Nr   r#  r,  r   )r   r   r   r(  r)  )rQ   r+  r   newNodexfr/  r  s          r   r.  lmx.add  sa    '11E		g&\HHJDAts{abEqE  	r    )r   N)r~  )r   )rZ   r[   r\   r]   r  rR   r1  r4  r7  r>   r.  r^   r_   r    r   r(  r(    s%    
1
)+
r    r(  )6r  
__future__r   r  warningsior   r   incrementalr   r   twisted.python.compatr   twisted.python.utilr	   twisted.web.suxr
   r   formatwarningStringwarnDeprecationWarningr   r$   r4   HTML_ESCAPE_CHARSlistREV_HTML_ESCAPE_CHARSreverseXML_ESCAPE_CHARSREV_XML_ESCAPE_CHARSrA   rD   	ExceptionrF   ra   r   r   r   r   r   r  r!  r  r#  r   r  r  r  r  r  r$  r&  r(  r_   r    r   <module>rS     s  " # 
    1 ) / 1;BBWYB23 	m/A >6
&  ./     $'99 ,-      /  ) 
Y 
6K KtQt Qh2d 2<+D +/m /.(6= (6V= ( L	*M *ud up	@Y @F$N+>>" "r    