
    Ϫf              
         d Z ddlmZ ddlZddlZddlmZmZ ddlm	Z	m
Z
 ddlmZ ddlmZ ddlmZmZ d	j%                   e
 e	d
ddd                  Z ej(                  eed       d Zd Zd ZdZ ee      Zej9                          edz   Z ee      Zej9                          efdZefdZ  G d de!      Z" G d d      Z# G d de#      Z$ G d de#      Z% G d de#      Z& G d  d!e&      Z' G d" d#e&      Z( G d$ d%e&      Z)d& Z* e*       Z+ G d' d(e&      Z, G d) d*e#      Z-d+ Z.d, Z/ G d- d.e      Z0d/ Z1d0 Z2d1 Z3d2 Z4 G d3 d4      Z5y)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                    g }|j                   }| g}t        |      dkD  rF|j                  d      }|j                  |k(  r ||       |j                  |dd t        |      dkD  rF|S )a3  
    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         6/usr/lib/python3/dist-packages/twisted/web/microdom.pygetElementsByTagNamer   )   sh      G^^NGE
e*q.IIaL::1LLbq		 e*q.
 N    c                   |j                         }g }|j                  }| g}t        |      dkD  rT|j                  d      }|j                  j                         |k(  r ||       |j
                  |d d t        |      dkD  rT|S 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                D     t               t        k(  r fd}|S  fd}|S )Nc                j    t        | t              r| j                  d      } j                  |        y Nzutf-8)
isinstancestrencodewritesstreams    r   wz_streamWriteWrapper.<locals>.wT   s&    !S!HHW%LLOr    c                j    t        | t              r| j                  d      } j                  |        y r'   )r(   bytesdecoder+   r,   s    r   r/   z_streamWriteWrapper.<locals>.w[   s&    !U#HHW%LLOr    )r   r1   )r.   r/   s   ` r   _streamWriteWrapperr3   Q   s'    f~	 H	
 Hr    ))&z&amp;)<z&lt;)>z&gt;)"z&quot;))'z&apos;c                >    |D ]  \  }}| j                  ||      }  | S )z1
    Perform the exact opposite of 'escape'.
    replacetextcharsr-   hs       r   unescaper@   r   ,      "1||Aq!"Kr    c                >    |D ]  \  }}| j                  ||      }  | S )z;
    Escape a few XML special chars with XML entities.
    r:   r<   s       r   escaperC   {   rA   r    c                      e Zd Zd ZddZy)MismatchedTagsc                l    |||||||f\  | _         | _        | _        | _        | _        | _        | _        y N)filenameexpectgotbegLinebegColendLineendCol)selfrH   rI   rJ   rM   rN   rK   rL   s           r   __init__zMismatchedTags.__init__   s>     vsGVWfE	
MKHLKLKr    c                    d| j                   d| j                  d| j                  d| j                  d| j                  d| j
                  S )Nzexpected </z	>, got </z> line: z col: z, began line: )rI   rJ   rM   rN   rK   rL   rO   s    r   __str__zMismatchedTags.__str__   s8    
 		
r    Nreturnr)   )__name__
__module____qualname__rP   rS    r    r   rE   rE      s    	F
r    rE   c                      e Zd Zd ZddZd Zddddi dfdZddddi dfdZddZdd	Z	dd
Z
d Zd Zd Zd Zd Zd Zd Zy)NodeNc                     || _         g | _        y rG   )
parentNoder   )rO   r]   s     r   rP   zNode.__init__   s    $r    c                    t        | j                        t        |j                        k7  ryt        | j                  |j                        D ]  \  }}|j                  |      r y y)a  
        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)rO   otherabs       r   r`   zNode.isEqualToNode   s[     t3u'7'7#88)9)9: 	DAq??1%	 r     r   c                    t               rG   NotImplementedError)rO   r.   indent	addindentnewlstrip
nsprefixes	namespaces           r   writexmlzNode.writexml   s     "##r    c           	     h    t               }| j                  |||||||       |j                         }|S rG   )r   rn   getvalue)	rO   rh   ri   rj   rk   rl   rm   r-   rvs	            r   toxmlz
Node.toxml   s3     JaD%YOZZ\	r    c                ,    | j                  |||||      S rG   )rn   )rO   r.   rh   ri   rj   rk   s         r   writeprettyxmlzNode.writeprettyxml   s    }}VVYeDDr    c                *    | j                  ||||      S rG   )rr   )rO   rh   ri   rj   rk   s        r   toprettyxmlzNode.toprettyxml   s    zz&)T599r    c                    t               rG   rf   rO   deepparents      r   	cloneNodezNode.cloneNode   s    !##r    c                    | j                   ryy)N   r   r   rR   s    r   hasChildNodeszNode.hasChildNodes   s    ??r    c                ~    t        |t              st        d      | j                  j	                  |       | |_        y)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(   r[   	TypeErrorr   r   r]   rO   childs     r   appendChildzNode.appendChild   s4     %&455u%r    c                    t        |t              rt        |t              st        d      | j                  j	                  |      }| |_        | j                  j                  ||       |S )a  
        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(   r[   r   r   indexr]   insert)rO   newrefis       r   insertBeforezNode.insertBefore   sW     #t$JsD,A455OO!!#&q#&
r    c                    t        |t              st        d      || j                  v r"| j                  j	                  |       d|_        |S )a7  
        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(   r[   r   r   remover]   r   s     r   removeChildzNode.removeChild   sE     %&455DOO#OO""5)#Er    c                    t        |t              rt        |t              st        d      |j                  | urt	        d      || j
                  | j
                  j                  |      <   d|_        | |_        y)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(   r[   r   r]   
ValueErrorr   r   )rO   newChildoldChilds      r   replaceChildzNode.replaceChild  sj     (D)Hd1K455d*CDD;C--h78""r    c                     | j                   d   S Nr~   rR   s    r   	lastChildzNode.lastChild$  s    r""r    c                L    t        | j                        r| j                  d   S y r"   )r   r   rR   s    r   
firstChildzNode.firstChild'  s     t??1%%r    rG   )rd    
r   r   N)rV   rW   rX   r   rP   r`   rn   rr   rt   rv   r{   r   r   r   r   r   r   r   rY   r    r   r[   r[      sr    H& 
$ 2BaBRTE:$ *$#.#r    r[   c                  ~    e Zd ZU ddZddZdZded<   d ZeZe	d        Z
d	 Zd
d
d
di d
fdZd Zd Zd Zd Zd Zy)DocumentNc                V    t         j                  |        |r| j                  |       y y rG   )r[   rP   r   )rO   documentElements     r   rP   zDocument.__init__:  s$    d_- r    r   c                    t               }| j                  |_        |r| j                  j                  d|       }n| j                  }|j	                  |       |S Nr}   )r   doctyper   r{   r   )rO   ry   rz   dnewEls        r   r{   zDocument.cloneNode?  sK    JLL	((221d;E((E	er    z
None | strr   c                d    | j                   |j                   k(  xr t        j                  | |      S rG   )r   r[   r`   rO   ns     r   isEqualToDocumentzDocument.isEqualToDocumentK  s'    		)Jt/A/A$/JJr    c                     | j                   d   S r"   r~   rR   s    r   r   zDocument.documentElementP  s    q!!r    c                ^    | j                   rt        d      t        j                  | |       y)a  
        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   r[   r   r   s     r   r   zDocument.appendChildT  s'     ??=>>u%r    rd   c           	         t        |      } |d|z          | j                  r |d| j                   d|        | j                  j                  |||||||       y )Nz<?xml version="1.0"?>z
<!DOCTYPE r6   )r3   r   r   rn   	rO   r.   rh   ri   rj   rk   rl   rm   r/   s	            r   rn   zDocument.writexmla  s_      '	
!D
()<<
4<<.$01%%FItUJ		
r    c                    t        |fi |S rG   )Element)rO   r   kws      r   createElementzDocument.createElementu  s    t"r""r    c                    t        |      S rG   )TextrO   r=   s     r   createTextNodezDocument.createTextNodex  s    Dzr    c                    t        |      S rG   )Commentr   s     r   createCommentzDocument.createComment{  s    t}r    c                ^    | j                   j                  rt        | |      S t        | |      S rG   )r   caseInsensitiver$   r   rO   r   s     r   r   zDocument.getElementsByTagName~  s+    //-dD99#D$//r    c                    | j                   d d  }|r^|j                  d      }|j                   r|j                  |j                          t        |d      r|j	                  d      |k(  r|S |r]y y )Nr   getAttributeid)r   r   extendhasattrr   )rO   r   r   nodes       r   getElementByIdzDocument.getElementById  s`    __Q'
>>!$D!!$//2t^,1B1B41HB1N r    rG   r   )rV   rW   rX   rP   r{   r   __annotations__r   r`   propertyr   r   rn   r   r   r   r   r   rY   r    r   r   r   9  sn    .
 GZK &M" "&  
(#0
r    r   c                  :    e Zd ZddZd ZeZddddi dfdZd	dZy)
EntityReferenceNc                f    t         j                  | |       || _        d|z   dz   x| _        | _        y )Nr4   ;)r[   rP   eref	nodeValuedata)rO   r   r]   s      r   rP   zEntityReference.__init__  s.    dJ'	%(4Z#%55r    c                    t        |t              sy| j                  |j                  k(  xr | j                  |j                  k(  S r"   )r(   r   r   r   r   s     r   isEqualToEntityReferencez(EntityReference.isEqualToEntityReference  s4    !_-		QVV#H$..AKK*GHr    rd   r   c                D    t        |      } |d| j                  z          y )Nrd   r3   r   r   s	            r   rn   zEntityReference.writexml  s      '	"t~~
r    c                .    t        | j                  |      S rG   )r   r   rx   s      r   r{   zEntityReference.cloneNode  s    tyy&11r    rG   r   )rV   rW   rX   rP   r   r`   rn   r{   rY   r    r   r   r     s2    6
I
 -M
 2r    r   c                      e Zd ZddZd ZeZy)CharacterDataNc                Z    t         j                  | |       |x| _        x| _        | _        y rG   )r[   rP   valuer   r   )rO   r   r]   s      r   rP   zCharacterData.__init__  s%    dJ'266
6TYr    c                4    | j                   |j                   k(  S rG   )r   r   s     r   isEqualToCharacterDataz$CharacterData.isEqualToCharacterData  s    zzQWW$$r    rG   )rV   rW   rX   rP   r   r`   rY   r    r   r   r     s    7% +Mr    r   c                  ,    e Zd ZdZddddi dfdZddZy)r   z
    A comment node.
    rd   r   c                J    t        |      }| j                  }	 |d|	 d       y )Nz<!--z-->)r3   r   )
rO   r.   rh   ri   rj   rk   rl   rm   r/   vals
             r   rn   zComment.writexml  s'      'ii	DS/r    Nc                .    t        | j                  |      S rG   )r   r   rx   s      r   r{   zComment.cloneNode  s    t~~v..r    r   )rV   rW   rX   __doc__rn   r{   rY   r    r   r   r     s%     /r    r   c                  >    e Zd Zd	dZd Zd
dZddddi dfdZddZy)r   Nr   c                @    t         j                  | ||       || _        y rG   )r   rP   raw)rO   r   r]   r   s       r   rP   zText.__init__  s    tT:6r    c                d    t         j                  | |      xr | j                  |j                  k(  S )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   r`   r   rO   ra   s     r   r`   zText.isEqualToNode  s)    
 **47QDHH		<QQr    c                D    t        | j                  || j                        S rG   )r   r   r   rx   s      r   r{   zText.cloneNode  s    DNNFDHH55r    rd   c                L   t        |      }| j                  r2| j                  }	t        |	t              sit	        | j                        }	nS| j                  }
t        |
t              st	        |
      }
|rdj                  |
j                               }
t        |
      }	 ||	       y )Nr   )r3   r   r   r(   r)   joinsplitrC   )rO   r.   rh   ri   rj   rk   rl   rm   r/   r   vs              r   rn   zText.writexml  sy      '88..Cc3'$..)Aa%FHHQWWY')C	#r    c                8    dt        | j                        z  dz   S )NzText(%s))reprr   rR   s    r   __repr__zText.__repr__  s    4//#55r    r"   r   rT   )rV   rW   rX   rP   r`   r{   rn   r   rY   r    r   r   r     s0    R6 06r    r   c                  (    e Zd ZddZddddi dfdZy)CDATASectionr   Nc                .    t        | j                  |      S rG   )r   r   rx   s      r   r{   zCDATASection.cloneNode  s    DNNF33r    rd   c                d    t        |      } |d        |d| j                  z           |d       y )Nz	<![CDATA[rd   z]]>r   r   s	            r   rn   zCDATASection.writexml  s-      '	+	"t~~
	%r    r   )rV   rW   rX   r{   rn   rY   r    r   r   r     s     4 r    r   c               #  <   K   d} 	 dt        |       z    | dz   } w)Nr   pr}   )r)   )r   s    r   
_genprefixr     s*     	A
CFlE s   c                      e Zd ZdZy)_Attrz#Support class for getAttributeNode.N)rV   rW   rX   r   rY   r    r   r   r     s    )r    r   c                      e Zd ZdZdZdZ	 	 	 	 	 	 	 ddZd Zd Zd Z	d Z
dd	Zd
 Zd ZddZddZd Zd Zd Zd Zddddi dfdZddZddZy)r   r   r}   Nc	                   t         j                  | |       |xs | | _        || _        |s|j	                         }|i | _        nA|| _        | j
                  j                         D ]  \  }	}
t        |
      | j
                  |	<    |rt        | j
                  |      | _        |x| _	        x| _
        | _        || _        || _        || _        y )N)preserve)r[   rP   preserveCaser   r#   
attributesitemsr@   r	   
endTagNamer   tagName	_filename_markposrm   )rO   r   r   r]   rH   markposr   r   rm   kr   s              r   rP   zElement.__init__  s     	dJ'(?,?.mmoG DO(DO--/ 11%-a["1 -dooUDO9@@@$-$,!"r    c                b    | j                   || _         y | j                   j                  |       y rG   )rl   update)rO   pfxss     r   addPrefixeszElement.addPrefixes>  s%    ??""DOOO""4(r    c                J    | j                   s|j                         }|| _        y rG   )r   r#   r   )rO   r   s     r   endTagzElement.endTagD  s       #))+J$r    c                "   | j                   rP| j                  |j                  k(  xr5 | j                  j                         |j                  j                         k(  S | j                  |j                  k(  xr | j                  |j                  k(  S rG   )r   r   r   r#   r   s     r   isEqualToElementzElement.isEqualToElementI  sn    OOq||3 ##%)9)9);; 1<</Rdmmqzz6QRr    c                   | j                   j                         |j                   j                         k(  xrL | j                  |j                  k(  xr1 | j                  |j                  k(  xr t        j                  | |      S )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#   rm   r   r[   r`   r   s     r   r`   zElement.isEqualToNodeP  sn     MM!U^^%9%9%;; 0%//105#3#330 ""4/		
r    c                >   t        | j                  || j                  | j                  | j                        }|j
                  j                  | j
                         |r1| j                  D cg c]  }|j                  d|       c}|_        |S g |_        |S c c}w )N)r]   rm   r   r   r}   )	r   r   rm   r   r   r   r  r   r{   )rO   ry   rz   cloner   s        r   r{   zElement.cloneNode]  s    LLnn** 00
 	0GKWe5 9WE   "E  Xs   .Bc                J    | j                   rt        | |      S t        | |      S rG   )r   r$   r   r   s     r   r   zElement.getElementsByTagNamel  s%    -dD99#D$//r    c                     yr   rY   rR   s    r   hasAttributeszElement.hasAttributesq  s    r    c                :    | j                   j                  ||      S rG   )r   get)rO   r   defaults      r   r   zElement.getAttributet  s    ""411r    c                    ||f}|| j                   v r| j                   |   S || j                  k(  r| j                   j                  ||      S |S rG   )r   rm   r  )rO   nsr   r  nsks        r   getAttributeNSzElement.getAttributeNSw  sN    4j$//!??3''??&&tW55r    c                8    t        | j                  |      |       S rG   )r   r   r   s     r   getAttributeNodezElement.getAttributeNode  s    T&&t,d33r    c                "    || j                   |<   y rG   r   )rO   r   attrs      r   setAttributezElement.setAttribute  s     $r    c                <    || j                   v r| j                   |= y y rG   r  r   s     r   removeAttributezElement.removeAttribute  s    4??"% #r    c                    || j                   v S rG   r  r   s     r   hasAttributezElement.hasAttribute  s    t&&r    rd   c           
        d}d}	d}
| j                   s| j                  | _        t        |      }| j                  r8| j                  j                         }|j                         D ]
  }||v s||=  ni }dg}| j                  |	v r||g|z   }|j                  fd}| j                  }|| j                  k7  r| j                  z| j                  |v r:|| j                     } |dz   | j                  z          |dz   | j                  z   }nD | j                          |d| j                         | j                  }n | j                         d	j                  }t        | j                  j                               D ]Y  \  }}t        |t              r7|\  }}||v r||   }nt        t               }|||<   |J  ||dz   |z   |       M|J  |||       [ |r;|j                         D ]  \  }}|s	 |d
|z   |        |j#                  |       |}n|} | ||             | j$                  r |d       ||z   }| j$                  D ]E  }| j                  |	v r| j                  |
v r | |||f             |j'                  |||||||       G | j                  |	v r | |||f              | |d|df             y| j                  j)                         |vr | |d|df             y |d       y)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objectrA  appletmap)rC  r:  r;  r.  r5   c                0     d| dt        |      df      S )Nr   z="r7   )rC   )_atr_valbexts     r   <lambda>z"Element.writexml.<locals>.<lambda>  s    tS$fTlC,P'Q r    N:xmlnsrd   zxmlns:r6   z</z></ />)r   r   r   r3   rl   copykeysr   rm   r   sortedr   r   r(   tuplenext	genprefixr  r   rn   r#   )rO   r.   rh   ri   rj   rk   rl   rm   ALLOWSINGLETONBLOCKELEMENTSFORMATNICELYr/   newprefixesr  begin	writeattrr   prefixjr  r   keydownprefixes	newindentr   rK  s                            @r   rn   zElement.writexml  s   8

@ 2   "llDO'??//..0K oo' ($#B( K<<=(6NU*E||Q	
 __
&4>>+E ~~+ $DNN3Vc\DLL01#c\DOO;
 T\\"'4>>2 !NN	 GG 5 5 78 	%ID#$&C#'^F!)_F&,KO&&3,,c2&$$	% )//1 5
Fh/45 z*&L%L	!E(??cF*I <<=0T\\\5Qay)*+Iy$|Y ||},!T6N#$az3'()\\!7a
C()*eHr    c                    dt        | j                        z  }| j                  r|d| j                  z  }| j                  r|d| j                  z  }| j                  r|d| j                  z  }|dz   S )Nz
Element(%sz, attributes=z, filename=z
, markpos=r   )r   r   r   r   r   )rO   reps     r   r   zElement.__repr__5  sv    T$--00??]4??"566C>>[ 233C==Z011CSyr    c                   d| j                   z   }| j                  s| j                  r|dz  }| j                  r|t        | j                        z  }| j                  r|d| j                  z  z  }| j                  s| j                  r|dz  }| j                  j                         D ]
  }|d|z  z  } | j                         r|d| j                   z  z  }|S |dz  }|S )Nr5   z (z line %s column %sr   z %s=%rz
 >...</%s>rO  )r   r   r   r   r   r   r   )rO   rb  items      r   rS   zElement.__str__?  s    DMM!>>T]]4KC>>4''C=='$--77C>>T]]3JCOO))+ 	#D8d?"C	#<$--//C 
 5LC
r    )NNNNr}   r   Nr   rG   rT   )rV   rW   rX   r   r   rl   rP   r  r  r  r`   r{   r   r  r   r  r  r  r  r  rn   r   rS   rY   r    r   r   r     s    LOJ
 #>)%
S
0
24%&' gRr    r   c                V    i }| j                         D ]  \  }}t        |      ||<    |S rG   )r   r@   r   ddr   r   s       r   _unescapeDictrh  R  s2    	B	 11Ir    c                D    i }| j                         D ]
  \  }}|||<    |S rG   )r   rf  s       r   _reverseDictrj  Y  s.    	B	 11Ir    c                      e Zd Zdj                         Zddgddgddgdgg dg dg ddgdgd	gd
gdgdgddgdgdZdddeefdZd Zd Z e	j                  d      Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy )!MicroDOMParserz#area link br img hr input base metar   dtrg  li)theadtfoottbodycolgroupr)  rC  tdthr/  r.  option)r   rm  rg  rn  rq  ro  rp  rr  r)  rC  rs  rt  r.  titleru  r   r}   c                    g | _         dd d}t        |      }|d |fg| _        g | _        d | _        || _        || _        |xs | | _        || _        || _	        y )NrN  )rN  rd   )
elementstackrj  nsstack	documents
_mddoctypebeExtremelyLenientr   r   soonCloserslaterClosers)rO   r|  r   r   r}  r~  r   drs           r   rP   zMicroDOMParser.__init__x  sl     4(!_D""4.(?,?&(r    c                    t        t        | j                              D ]8  }| j                  |    }|j                  dk(  s|j	                  dd      dk(  s8 y y)Nr=  z	xml:spacerd   r   r}   r   )ranger   rx  r   r   )rO   edxels      r   shouldPreserveSpacez"MicroDOMParser.shouldPreserveSpace  sY    T../0 	C""C4(BzzU"book2&F*&T	 r    c                :    | j                   r| j                   d   S y r   )rx  rR   s    r   
_getparentzMicroDOMParser._getparent  s    $$R((r    z\s*/[/*]\s*c                   | j                   rt        |j                        dk(  sy |j                         }t	        |t
              rd}|j                  }| j                  j                  |      }|r|j                         }|t        |      d  }	 t        d|z        j                  d   }t        |j                        dk7  ry |j                         }t	        |t        t        f      rIg |_        |r$|j                  j                  t        |             |j                  j                  |       y y y # t        t        f$ r Y y w xY w)Nr}   rd   z	<a>%s</a>r   )r|  r   r   r   r(   r   r   COMMENTmatchgroupparseStringr
   rE   r   r   r   )rO   r  r   r\  oldvaluer  es          r   _fixScriptElementz 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 "MM((f6$$Q'	 6+   / s   D5 5EEc                    || _         y rG   )r{  )rO   r   s     r   
gotDoctypezMicroDOMParser.gotDoctype  s	    !r    c                   | j                         }| j                  rt        |t              r|j                  }|}| j
                  r |j                         }|j                         }|| j                  j                  |g       v r+| j                  |j                         | j                         }t        |      }| j                  d   d   }i }g }|j                         D ]V  \  }	}
|	j                  d      s|	j                  dd      }t        |      dk(  r	|
||d   <   n|
|d<   |j!                  |	       X |D ]  }	||	=  |r!|j#                         }|j%                  |       g }|j                         D ]Q  \  }	}
|	j                  dd      }t        |      dk(  s'|\  }}|dk7  s2||v s7|
|||   |f<   |j!                  |	       S |D ]  }	||	=  t        |||| j&                  | j)                         | j
                  | j*                  |j                  d      	      }t-        |      }|j/                  |       |rO| j                  d   d   j#                         }|j%                  |       | j                  j!                  |||f       | j0                  j!                  |       |r|j3                  |       | j                  r+|j                  | j4                  v r| j                  |       y y y )
Nr   r   rN  rM  r}      rd   xml)r   r   rm   )r  r|  r(   r   r   r   r#   r~  r  	gotTagEndrh  ry  r   
startswithr   r   r   rP  r  rH   saveMarkr   rj  r  rx  r   r}  )rO   r   r   rz   
parentNamemyName
namespaces	newspaceskeysToDeleter   r   
spacenamesksplitpfxtvr  	revspacesrscopys                     r   gotTagStartzMicroDOMParser.gotTagStart  s    """z&''BJF##'--/
**..z2>>v~~.*":.
\\"%a(
	$$& 	'DAq||G$WWS!_
z?a'/0Ijm,$%IbM##A&	'  	A1	#*Ji($$& 	+DAqWWS!_F6{a R%<C:$567Jz#23 ''*	+  	A1	MMMMO 00** nnR(	
 !+	
y!\\"%a(--/FMM)$LLR 89  $r"""rzzT5E5E'ENN4  (F"r    c                    | j                         } |||      }|r|j                  |       y | j                  r| j                  j	                  |       y y rG   )r  r   r|  rz  r   )rO   factoryr   rz   tes        r   _gotStandalonezMicroDOMParser._gotStandalone  sK    "T6"r"$$NN!!"% %r    c                r    |j                         s| j                         r| j                  t        |       y y rG   )rk   r  r  r   rO   r   s     r   gotTextzMicroDOMParser.gotText  s+    ::<4335d+ 6r    c                0    | j                  t        |       y rG   )r  r   r  s     r   
gotCommentzMicroDOMParser.gotComment  s    GT*r    c                0    | j                  t        |       y rG   )r  r   )rO   	entityRefs     r   gotEntityReferencez!MicroDOMParser.gotEntityReference  s    OY7r    c                0    | j                  t        |       y rG   )r  r   )rO   cdatas     r   gotCDatazMicroDOMParser.gotCData  s    L%0r    c                F   | j                   s6| j                  ry t        | j                  d|f| j	                         z   dz    | j                   j                         }| j                  d   d   }| j                  d   d   |u r| j                  j                         }nd }| j                  r+|j                  j                         }|j                         }n|j                  }|}|j                  dd      }t        |      dk(  rq|\  }}	|j                  |d       }
|
X|j                  |
k7  rI| j                  s=t        | j                  |j                  |f| j	                         z   |j                  z    ||k(  s@| j                  r| j                   r'| j                   d   }t        t        | j                               D ]F  }| j                   |dz       j                  |k(  s$| j                   |dz       j!                  |        n: | j                   j#                  |       || j                  j#                  |       y | j                   |dz    d = | j                   sY| j$                  j#                  |       y t        | j                  |j                  |f| j	                         z   |j                  z    |j!                  |       | j                   s| j$                  j#                  |       | j                  r"|j                  dk(  r| j'                  |       y y y )	NNOTHING)r   r   r   r  r}   rM  r   r9  )rx  r|  rE   rH   r  r   ry  r   r   r#   r   r   r  rm   r   r  r  r   rz  r  )rO   r   r  pfxdixnstupletncnamensplitr  newnamer  lastElidxs                r   r  z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"$++!.  e&&$$!..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                L   t        j                  | |       | j                  r| j                  r)| j                  j                  | j                  d          y t        | j                  | j                  d   df| j                         z   | j                  d   j                  z    y )Nr   r   END_OF_FILE)
r   connectionLostrx  r|  rz  r   rE   rH   r  r   )rO   reasons     r   r  zMicroDOMParser.connectionLostT  s      v.&&%%d&7&7&:;$(9(9"(=}M--/*++B/889 	 r    N)rV   rW   rX   r   r}  r~  rP   r  r  recompiler  r  r  r  r  r  r  r  r  r  r  rY   r    r   rl  rl  `  s    
 8==?K4[TlTlf,,,Lwfff&!*L( !)* bjj(G(B"=!~&,+81>'@r    rl  c                :   t        | d      st        | d      } t        |i |}t        | dd      |_        |j                  d       t        | d      r |j                  | j                                n8| j                  d      }|r%|j                  |       | j                  d      }|r%|j                  d       |j                  st        |j                  ddd	      |j                  rt        |j                        d
k(  r>|j                  d   }t        |t              s\t        d      }|j!                  |       |}n=t        d      }|j                  D ]  }|j!                  |        n|j                  d   }t#        |      }|j$                  |_        |S )z%
    Parse HTML or XML readable.
    readrbr   z<xmlfile />Nrp   i   r   zNo top-level Nodes in documentr}   r-  )r   openrl  getattrrH   makeConnectiondataReceivedrp   r  r  rz  r
   r|  r   r(   r   r   r   r{  r   )	readableargskwargsmdprr   r  r   docs	            r   parser  c  sd    8V$$'
$
)&
)C8V];CLtx$**,-MM$Qd#A  t==q!-MNN
s}}"a Aa)V_q!A %e$% MM!
1+C..CKJr    c                    t        | t              r't        t        | j	                  d            g|i |S t        t        |       g|i |S )NzUTF-16)r(   r)   r  r   r*   )str  r   s      r   r  r    sH    "cWRYYx01?D?B??*t*r**r    c                    t        | dd      S z'
    Parse an XML readable object.
    r   r}   r   r   )r  )r  s    r   parseXMLr    s     11==r    c                    t        | dd      S r  )r  )r  s    r   parseXMLStringr    s     r11==r    c                  8    e Zd ZdZd	dZd Zd Zd Zd
dZd Z	y)lmxz
    Easy creation of XML.
    c                H    t        |t              rt        |      }|| _        y rG   )r(   r)   r   r   )rO   r   s     r   rP   zlmx.__init__  s    dC 4=D	r    c                8     d   dk(  rt        d       fdS )Nr   _zno private attrsc                 *     j                   fi | S rG   )add)r   r   rO   s    r   rL  z!lmx.__getattr__.<locals>.<lambda>  s    HDHHT0R0 r    )AttributeErrorr   s   ``r   __getattr__zlmx.__getattr__  s     7c> !34400r    c                <    | j                   j                  ||       y rG   )r   r  )rO   r^  r   s      r   __setitem__zlmx.__setitem__  s    		sC(r    c                8    | j                   j                  |      S rG   )r   r   )rO   r^  s     r   __getitem__zlmx.__getitem__  s    yy%%c**r    c                V    t        ||      }| j                  j                  |       | S )N)r   )r   r   r   )rO   txtr   nns       r   r=   zlmx.text  s%    #3		b!r    c                    t        |dd      }| j                  j                  |       t        |      }|j	                         D ]  \  }}|d   dk(  r|dd  }|||<    |S )Nr   r  r  r}   )r   r   r   r  r   )rO   r   r   newNodexfr   r   s          r   r  zlmx.add  sj    '11E		g&\HHJ 	DAqts{abEBqE	 	r    N)r@  )r   )
rV   rW   rX   r   rP   r  r  r  r=   r  rY   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$   r3   HTML_ESCAPE_CHARSlistREV_HTML_ESCAPE_CHARSreverseXML_ESCAPE_CHARSREV_XML_ESCAPE_CHARSr@   rC   	ExceptionrE   r[   r   r   r   r   r   r   r   rU  r   r   rh  rj  rl  r  r  r  r  r  rY   r    r   <module>r     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    