
    Yf              
      "   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	                     e
 e	d
ddd                              Z ej        eed           d Zd Zd ZdZ ee          Ze                                 edz   Z ee          Ze                                 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          Z5dS )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k    rJ|                    d          }|j        |k    r ||           |j        |dd<   t          |          dk    J|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         F/var/www/html/env/lib/python3.11/site-packages/twisted/web/microdom.pygetElementsByTagNamer   )   sy      G^NGE
e**q..IIaLL:N1Lbqb		 e**q..
 N    c                $   |                                 }g }|j        }| g}t          |          dk    r\|                    d          }|j                                         |k    r ||           |j        |d d<   t          |          dk    \|S Nr   )lowerr   r   r   r   r   r   s         r   getElementsByTagNameNoCaser$   D   s    ::<<DG^NGE
e**q..IIaLL:%%N1Lbqb		 e**q..
 Nr    c                N     t                     t          k    r fd}n fd}|S )Nc                    t          | t                    r|                     d          }                     |            d S Nzutf-8)
isinstancestrencodewritesstreams    r   wz_streamWriteWrapper.<locals>.wT   s9    !S!! &HHW%%LLOOOOOr    c                    t          | t                    r|                     d          }                     |            d S r'   )r(   bytesdecoder+   r,   s    r   r/   z_streamWriteWrapper.<locals>.w[   s9    !U## &HHW%%LLOOOOOr    )r   r1   )r.   r/   s   ` r   _streamWriteWrapperr3   Q   sR    f~~	 	 	 	 	 		 	 	 	 	
 Hr    ))&z&amp;)<z&lt;)>z&gt;)"z&quot;))'z&apos;c                B    |D ]\  }}|                      ||          } | S )z1
    Perform the exact opposite of 'escape'.
    replacetextcharsr-   hs       r   unescaper@   r   1      " "1||Aq!!Kr    c                B    |D ]\  }}|                      ||          } | 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dS )MismatchedTagsc                n    |||||||f\  | _         | _        | _        | _        | _        | _        | _        d S N)filenameexpectgotbegLinebegColendLineendCol)selfrH   rI   rJ   rM   rN   rK   rL   s           r   __init__zMismatchedTags.__init__   sB     vsGVWfE	
MKHLKLKKKr    returnr)   c                f    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__   sD     
 		
r    NrQ   r)   )__name__
__module____qualname__rP   rT    r    r   rE   rE      s:        	F 	F 	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dS )NodeNc                "    || _         g | _        d S rG   )
parentNoder   )rO   r]   s     r   rP   zNode.__init__   s    $r    c                    t          | j                  t          |j                  k    rdS t          | j        |j                  D ]\  }}|                    |          s dS dS )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   sp     t3u'7#8#8885)9:: 	 	DAq??1%% uutr     r   c                    t                      rG   NotImplementedError)rO   r.   indent	addindentnewlstrip
nsprefixes	namespaces           r   writexmlzNode.writexml   s     "###r    c           	         t                      }|                     |||||||           |                                }|S rG   )r   rn   getvalue)	rO   rh   ri   rj   rk   rl   rm   r-   rvs	            r   toxmlz
Node.toxml   s=     JJaD%YOOOZZ\\	r     
c                4    |                      |||||          S rG   )rn   )rO   r.   rh   ri   rj   rk   s         r   writeprettyxmlzNode.writeprettyxml   s    }}VVYeDDDr    c                2    |                      ||||          S rG   )rr   )rO   rh   ri   rj   rk   s        r   toprettyxmlzNode.toprettyxml   s    zz&)T5999r    c                    t                      rG   rf   rO   deepparents      r   	cloneNodezNode.cloneNode   s    !###r    c                    | j         rdS dS )N   r   r   rS   s    r   hasChildNodeszNode.hasChildNodes   s    ? 	11r    c                    t          |t                    st          d          | j                            |           | |_        dS )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   sI     %&& 	64555u%%%r    c                    t          |t                    rt          |t                    st          d          | 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   so     #t$$ 	6JsD,A,A 	64555O!!#&&q#&&&
r    c                    t          |t                    st          d          || j        v r!| 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   sU     %&& 	64555DO##O""5)))#Er    c                   t          |t                    rt          |t                    st          d          |j        | urt	          d          || j        | j                            |          <   d|_        | |_        dS )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  s     (D)) 	6Hd1K1K 	64555d**CDDD;C--h778""r    c                    | j         d         S Nr   rS   s    r   	lastChildzNode.lastChild$  s    r""r    c                H    t          | j                  r| j        d         S d S r"   )r   r   rS   s    r   
firstChildzNode.firstChild'  s&    t 	&?1%%tr    rG   )rd   rs   rt   r   r   N)rV   rW   rX   r   rP   r`   rn   rr   rv   rx   r}   r   r   r   r   r   r   r   rY   r    r   r[   r[      s1       H     & 
$ 
$ 
$ 
$ 2BaBRT   E E E 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dS )DocumentNc                l    t                               |            |r|                     |           d S d S rG   )r[   rP   r   )rO   documentElements     r   rP   zDocument.__init__:  s@    d 	._-----	. 	.r    r   c                    t                      }| j        |_        |r| j                            d|           }n| j        }|                    |           |S Nr   )r   doctyper   r}   r   )rO   r{   r|   dnewEls        r   r}   zDocument.cloneNode?  sU    JJL	 	)(221d;;EE(E	er    z
None | strr   c                X    | j         |j         k    ot                              | |          S rG   )r   r[   r`   rO   ns     r   isEqualToDocumentzDocument.isEqualToDocumentK  s&    	)Jt/A/A$/J/JJr    c                    | j         d         S r"   r   rS   s    r   r   zDocument.documentElementP  s    q!!r    c                h    | j         rt          d          t                              | |           dS )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  s9     ? 	?=>>>u%%%%%r    rd   c           	         t          |          } |d|z              | j        r |d| j         d|            | j                            |||||||           d S )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
()))< 	2A04<00$0011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    Dzzr    c                     t          |          S rG   )Commentr   s     r   createCommentzDocument.createComment{  s    t}}r    c                Z    | j         j        rt          | |          S t          | |          S rG   )r   caseInsensitiver$   r   rO   r   s     r   r   zDocument.getElementsByTagName~  s0    / 	:-dD999#D$///r    c                    | j         d d          }|re|                    d          }|j         r|                    |j                    t          |d          r|                    d          |k    r|S |cd S d S )Nr   getAttributeid)r   r   extendhasattrr   )rO   r   r   nodes       r   getElementByIdzDocument.getElementById  s    _QQQ'
 	>>!$$D 3!!$/222t^,, 1B1B41H1HB1N1N  	 	 	 	 	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  s        . . . .
    GK K K &M" " X"& & &  
 
 
 
(# # #    0 0 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dS )
EntityReferenceNc                r    t                               | |           || _        d|z   dz   x| _        | _        d S )Nr4   ;)r[   rP   eref	nodeValuedata)rO   r   r]   s      r   rP   zEntityReference.__init__  s8    dJ'''	%(4Z#%55r    c                p    t          |t                    sdS | j        |j        k    o| j        |j        k    S r"   )r(   r   r   r   r   s     r   isEqualToEntityReferencez(EntityReference.isEqualToEntityReference  s6    !_-- 	1	QV#H$.AK*GHr    rd   r   c                J    t          |          } |d| j        z              d S )Nrd   r3   r   r   s	            r   rn   zEntityReference.writexml  s.      ''	"t~
r    c                ,    t          | j        |          S rG   )r   r   rz   s      r   r}   zEntityReference.cloneNode  s    ty&111r    rG   r   )rV   rW   rX   rP   r   r`   rn   r}   rY   r    r   r   r     s}        6 6 6 6
I I I
 -M
    2 2 2 2 2 2r    r   c                       e Zd ZddZd ZeZdS )CharacterDataNc                f    t                               | |           |x| _        x| _        | _        d S rG   )r[   rP   valuer   r   )rO   r   r]   s      r   rP   zCharacterData.__init__  s/    dJ'''266
6TYr    c                "    | j         |j         k    S rG   )r   r   s     r   isEqualToCharacterDataz$CharacterData.isEqualToCharacterData  s    zQW$$r    rG   )rV   rW   rX   rP   r   r`   rY   r    r   r   r     s8        7 7 7 7% % % +MMMr    r   c                  .    e Zd ZdZddddi dfdZddZdS )r   z
    A comment node.
    rd   r   c                P    t          |          }| j        }	 |d|	 d           d S )Nz<!--z-->)r3   r   )
rO   r.   rh   ri   rj   rk   rl   rm   r/   vals
             r   rn   zComment.writexml  s6      ''i	////r    Nc                ,    t          | j        |          S rG   )r   r   rz   s      r   r}   zComment.cloneNode  s    t~v...r    r   )rV   rW   rX   __doc__rn   r}   rY   r    r   r   r     sZ             / / / / / /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dS )r   Nr   c                L    t                               | ||           || _        d S rG   )r   rP   raw)rO   r   r]   r   s       r   rP   zText.__init__  s%    tT:666r    c                X    t                               | |          o| 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7QDH	<QQr    c                8    t          | j        || j                  S rG   )r   r   r   rz   s      r   r}   zText.cloneNode  s    DNFDH555r    rd   c                p   t          |          }| j        r1| j        }	t          |	t                    st	          | j                  }	nc| j        }
t          |
t                    st	          |
          }
|r'd                    |
                                          }
t          |
          }	 ||	           d S )Nrs   )r3   r   r   r(   r)   joinsplitrC   )rO   r.   rh   ri   rj   rk   rl   rm   r/   r   vs              r   rn   zText.writexml  s      ''8 
	.Cc3'' *$.))Aa%% FF (HHQWWYY''))C	#r    rQ   r)   c                6    dt          | j                  z  dz   S )NzText(%s))reprr   rS   s    r   __repr__zText.__repr__  s    4///#55r    r"   r   rU   )rV   rW   rX   rP   r`   r}   rn   r   rY   r    r   r   r     s           R R R6 6 6 6    06 6 6 6 6 6r    r   c                  *    e Zd ZddZddddi dfdZdS )CDATASectionr   Nc                ,    t          | j        |          S rG   )r   r   rz   s      r   r}   zCDATASection.cloneNode  s    DNF333r    rd   c                v    t          |          } |d            |d| j        z               |d           d S )Nz	<![CDATA[rd   z]]>r   r   s	            r   rn   zCDATASection.writexml  sF      ''	+	"t~
	%r    r   )rV   rW   rX   r}   rn   rY   r    r   r   r     sP        4 4 4 4      r    r   c               #  @   K   d} 	 dt          |           z   V  | dz   } )Nr   Tpr   )r)   )r   s    r   
_genprefixr     s4      	ACFFlEr    c                      e Zd ZdZdS )_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dS )r   r   r   Nc	                   t                               | |           |p| | _        || _        |s|                                }|i | _        n=|| _        | j                                        D ]\  }	}
t          |
          | j        |	<   |rt          | j        |          | _        |x| _	        x| _
        | _        || _        || _        || _        d S )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'''(?,?. 	&mmooG DOO(DO--// 1 11%-a[["" 	V-doUUUDO9@@@$-$,!"r    c                Z    | j         	|| _         d S | j                             |           d S rG   )rl   update)rO   pfxss     r   addPrefixeszElement.addPrefixes>  s1    ?""DOOOO""4(((((r    c                J    | j         s|                                }|| _        d S rG   )r   r#   r   )rO   r   s     r   endTagzElement.endTagD  s)      	,#))++J$r    c                    | j         rD| j        |j        k    o3| j                                        |j                                        k    S | j        |j        k    o| j        |j        k    S rG   )r   r   r   r#   r   s     r   isEqualToElementzElement.isEqualToElementI  sf     	Oq|3 ##%%)9)9););; 1</Rdmqz6QRr    c                    | j                                         |j                                         k    o:| j        |j        k    o*| j        |j        k    ot                              | |          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  sj     M!!U^%9%9%;%;; 0%/105#330 ""4//		
r    c                    t          | j        || j        | j        | j                  j                            | j                   |rfd| j        D             _        ng _        S )N)r]   rm   r   r   c                <    g | ]}|                     d           S )r   )r}   ).0r   clones     r   
<listcomp>z%Element.cloneNode.<locals>.<listcomp>g  s'    WWWe5 9 9WWWr    )r   r   rm   r   r   r   r  r   )rO   r{   r|   r  s      @r   r}   zElement.cloneNode]  s    Ln* 0
 
 
 	000 	"WWWWtWWWE!Er    c                P    | j         rt          | |          S t          | |          S rG   )r   r$   r   r   s     r   r   zElement.getElementsByTagNamel  s-     	:-dD999#D$///r    c                    dS r   rY   rS   s    r   hasAttributeszElement.hasAttributesq  s    qr    c                8    | j                             ||          S rG   )r   get)rO   r   defaults      r   r   zElement.getAttributet  s    ""4111r    c                    ||f}|| j         v r| j         |         S || j        k    r| j                             ||          S |S rG   )r   rm   r  )rO   nsr   r  nsks        r   getAttributeNSzElement.getAttributeNSw  sO    4j$/!!?3''?&&tW555r    c                H    t          |                     |          |           S rG   )r   r   r   s     r   getAttributeNodezElement.getAttributeNode  s     T&&t,,d333r    c                    || j         |<   d S rG   r   )rO   r   attrs      r   setAttributezElement.setAttribute  s     $r    c                ,    || j         v r
| j         |= d S d S 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                                        }|                                D ]	}||v r||= 
ni }dg}| j        |	v r||g|z   }|j        fd}| j        }|| j        k    rj| j        c| j        |v r1|| j                 } |dz   | j        z              |dz   | j        z   }n9 | j                    |d| j                   | j        }n | j                   d	j	        }t          | j                                                  D ]l\  }}t          |t                    rB|\  }}||v r	||         }nt          t                     }|||<   |J  ||dz   |z   |           \|J  |||           m|rC|                                D ]\  }}|r |d
|z   |           |                    |           |}n|} | ||                     | j        r |d           ||z   }| j        D ]E}| j        |	v r| j        |
v r | |||f                     |                    |||||||           F| j        |	v r | |||f                      | |d|df                     dS | j                                        |vr | |d|df                     dS  |d           dS )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objectrD  appletmap)rF  r=  r>  r1  r5   c                >     d| dt          |          df          S )Nrs   z="r7   )rC   )_atr_valbexts     r   <lambda>z"Element.writexml.<locals>.<lambda>  s"    ttS$fTllC,P'Q'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   rN  s                            @r   rn   zElement.writexml  s   8

@ 2   	+"lDO''? 	/..00K oo'' ( ($$#B( K<=((6NU*E|QQQQ	
 _
&&4>+E ~++ $DN3Vc\DL0111#c\DO;

 T\"""	'4>222 !N		 DG 5 5 7 788 	% 	%ID#$&& %C##'^FF!)__F&,KO	&3,,c2222	$$$$$ 	&)//11 5 5
F 5Ih/444z***&LL%L	!!E((? 	AcFFF*I  <=00T\\5Q5QAaay)**+++Iy$|Y    |},,!!T6N##$$$Aaaz3'(()))))\!!77Aaa
C())*****AeHHHHHr    rQ   r)   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  s}    T$-000? 	764?666C> 	43333C= 	211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                                        D ]
}|d|z  z  }|                                 r|d| j         z  z  }n|dz  }|S )Nr5   z (z line %s column %sr   z %s=%rz
 >...</%s>rR  )r   r   r   r   r   r   r   )rO   re  items      r   rT   zElement.__str__?  s    DM!> 	T] 	4KC> 	(4'''C= 	8'$-77C> 	T] 	3JCO))++ 	# 	#D8d?"CC 	<$-//CC5LC
r    )NNNNr   r   Nr   rG   rU   )rV   rW   rX   r   r   rl   rP   r  r  r  r`   r}   r   r  r   r  r  r  r  r!  rn   r   rT   rY   r    r   r   r     sx       LOJ
 # # # #>) ) )% % %
S S S
 
 
   0 0 0
  2 2 2 2   4 4 4% % %& & &' ' ' g g g gR        r    r   c                b    i }|                                  D ]\  }}t          |          ||<   |S rG   )r   r@   r   ddr   r   s       r   _unescapeDictrk  R  s8    	B		  11Ir    c                H    i }|                                  D ]
\  }}|||<   |S rG   )r   ri  s       r   _reverseDictrm  Y  s2    	B		  11Ir    c                      e Zd Zd                                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d S )!MicroDOMParserz#area link br img hr input base metar   dtrj  li)theadtfoottbodycolgroupr,  rF  tdthr2  r1  option)r   rp  rj  rq  rt  rr  rs  ru  r,  rF  rv  rw  r1  titlerx  r   r   c                    g | _         dd d}t          |          }|d |fg| _        g | _        d | _        || _        || _        |p| | _        || _        || _	        d S )NrQ  )rQ  rd   )
elementstackrm  nsstack	documents
_mddoctypebeExtremelyLenientr   r   soonCloserslaterClosers)rO   r  r   r   r  r  r   drs           r   rP   zMicroDOMParser.__init__x  sw     4((!__D""4.(?,?&(r    c                    t          t          | j                            D ]8}| j        |          }|j        dk    s|                    dd          dk    r dS 9dS )Nr@  z	xml:spacerd   r   r   r   )ranger   r{  r   r   )rO   edxels      r   shouldPreserveSpacez"MicroDOMParser.shouldPreserveSpace  sj    T.//00 	 	C"C4(BzU""book2&F&F*&T&Tqq 'Uqr    c                .    | j         r| j         d         S d S r   )r{  rS   s    r   
_getparentzMicroDOMParser._getparent  s      	$R((4r    z\s*/[/*]\s*c                   | j         rt          |j                  dk    sd S |                                }t	          |t
                    rd}|j        }| j                            |          }|r+|	                                }|t          |          d          }	 t          d|z            j        d         }n# t          t          f$ r Y d S w xY wt          |j                  dk    rd S |                                }t	          |t          t          f          rNg |_        |r'|j                            t          |                     |j                            |           d S d S d S )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  st    & 	c"-.@.@A.E.EFMMOOa 	( FwHL&&x00E 3#CKKMM2h 677B1E/   1<  A%%A!lG455 ( " 7M((f666$$Q'''''3	( 	(*( (s   B; ;CCc                    || _         d S rG   )r~  )rO   r   s     r   
gotDoctypezMicroDOMParser.gotDoctype  s    !r    c                d   |                                  }| j        rt          |t                    r|j        }|}| j        r(|                                }|                                }|| j                            |g           v r.| 	                    |j                   |                                  }t          |          }| j        d         d         }i }g }|                                D ]i\  }	}
|	                    d          rO|	                    dd          }t          |          dk    r|
||d         <   n|
|d<   |                    |	           j|D ]}	||	= |r)|                                }|                    |           g }|                                D ]_\  }	}
|	                    dd          }t          |          dk    r1|\  }}|dk    r&||v r"|
|||         |f<   |                    |	           `|D ]}	||	= t          |||| j        |                                 | j        | j        |                    d          	          }t-          |          }|                    |           |rW| j        d         d                                         }|                    |           | j                            |||f           | j                            |           |r|                    |           | j        r%|j        | j        v r| 	                    |           d S d S d S )
Nr   r   rQ  rP  r      rd   xml)r   r   rm   )r  r  r(   r   r   r   r#   r  r  	gotTagEndrk  r|  r   
startswithr   r   r   rS  r  rH   saveMarkr   rm  r  r{  r   r  )rO   r   r   r|   
parentNamemyName
namespaces	newspaceskeysToDeleter   r   
spacenamesksplitpfxtvr  	revspacesrscopys                     r   gotTagStartzMicroDOMParser.gotTagStart  sh    """ 	+z&''B'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:$5$567Jz#23 ''*** 	 	A1MMMOO 0* nnR((	
 	
 	
 !++	
y!!! 	:\"%a(--//FMM)$$$LR 8999  $$$ 	#r"""" 	!rzT5E'E'ENN4     	! 	!'E'Er    c                    |                                  } |||          }|r|                    |           d S | j        r| j                            |           d S d S rG   )r  r   r  r}  r   )rO   factoryr   r|   tes        r   _gotStandalonezMicroDOMParser._gotStandalone  su    ""WT6"" 	&r"""""$ 	&N!!"%%%%%	& 	&r    c                    |                                 s|                                 r|                     t          |           d S d S rG   )rk   r  r  r   rO   r   s     r   gotTextzMicroDOMParser.gotText  sK    ::<< 	,43355 	,d+++++	, 	,r    c                <    |                      t          |           d S rG   )r  r   r  s     r   
gotCommentzMicroDOMParser.gotComment  s    GT*****r    c                <    |                      t          |           d S rG   )r  r   )rO   	entityRefs     r   gotEntityReferencez!MicroDOMParser.gotEntityReference  s    OY77777r    c                <    |                      t          |           d S rG   )r  r   )rO   cdatas     r   gotCDatazMicroDOMParser.gotCData  s    L%00000r    c                   | j         s2| j        rd S t          | j        d|f|                                 z   dz    | j                                         }| j        d         d         }| j        d         d         |u r| j                                        }nd }| j        r.|j        	                                }|	                                }n	|j        }|}|
                    dd          }t          |          dk    rb|\  }}	|                    |d           }
|
E|j        |
k    r:| j        s3t          | j        |j        |f|                                 z   |j        z    ||k    s| j        r| j         r| j         d         }t          t          | j                             D ]B}| j         |dz             j        |k    r&| j         |dz                                 |            n9C| j                             |           || j                            |           d S | j         |dz    d = | j         s| j                            |           d S n3t          | j        |j        |f|                                 z   |j        z    |                    |           | j         s| j                            |           | j        r"|j        dk    r|                     |           d S d S d S )	NNOTHING)r   r   r   r  r   rP  r   r<  )r{  r  rE   rH   r  r   r|  r   r   r#   r   r   r  rm   r   r  r  r   r}  r  )rO   r   r  pfxdixnstupletncnamensplitr  newnamer  lastElidxs                r   r  zMicroDOMParser.gotTagEnd  s      	&  =)T2T]]__DvM  ""$$b!!$<A"$$l&&((GGG 	!!##BJJLLEEBEC##v;;!!LCC&&B~<2%%2 ,!%
D A"&--//!2"$+!.  e& $ !.q1F$S):%;%;<< 	 	,sQwZ8@EII -aj9@@FFF!E J
 )00444". L//888)C!G*,,7, --f555$}bj$7$--//IBKW  			$  	&N!!"%%%" 	'rzX'='=""2&&&&&	' 	''='=r    c                "   t          j        | |           | j        rr| j        r'| j                            | j        d                    d S t          | j        | j        d         df|                                 z   | j        d         j	        z    d S )Nr   r   END_OF_FILE)
r   connectionLostr{  r  r}  r   rE   rH   r  r   )rO   reasons     r   r  zMicroDOMParser.connectionLostT  s     v... 
	& 	%%d&7&:;;;;;$(9"(=}M--//*+B/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   ro  ro  `  s       
 8==??K4[TlTlf,,,,,,,,,Lwfff&!* L( !) ) ) )*     bj((G( ( (B" " "=! =! =!~& & &, , ,+ + +8 8 81 1 1>' >' >'@    r    ro  c                   t          | d          st          | d          } t          |i |}t          | dd          |_        |                    d           t          | d          r(|                    |                                            nC|                     d          }|r,|                    |           |                     d          }|,|	                    d           |j
        st          |j        ddd	          |j        rt          |j
                  d
k    rI|j
        d         }t          |t                    s&t          d          }|                    |           |}n<t          d          }|j
        D ]}|                    |           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   r0  )r   openro  getattrrH   makeConnectiondataReceivedrp   r  r  r}  r
   r  r   r(   r   r   r   r~  r   )	readableargskwargsmdprr   r  r   docs	            r   parser  c  s    8V$$ ($''
$
)&
)
)C8V];;CLtx$$ $**,,----MM$ 	$Qd##A  	$ t= Oq!-MNNN
 s}""a Aa)) V__q!!!A % %e$$$$% M!
1++C.CKJr    c                    t          | t                    r0t          t          |                     d                    g|R i |S t          t          |           g|R i |S )NzUTF-16)r(   r)   r  r   r*   )str  r   s      r   r  r    sk    "c @WRYYx001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                  :    e Zd ZdZddZd Zd Zd ZddZd	 Z	d
S )lmxz
    Easy creation of XML.
    rC  c                \    t          |t                    rt          |          }|| _        d S rG   )r(   r)   r   r   )rO   r   s     r   rP   zlmx.__init__  s*    dC   	!4==D			r    c                H     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   rO  z!lmx.__getattr__.<locals>.<lambda>  s    HDHT00R00 r    )AttributeErrorr   s   ``r   __getattr__zlmx.__getattr__  s2    7c>> !3444000000r    c                <    | j                             ||           d S rG   )r   r  )rO   ra  r   s      r   __setitem__zlmx.__setitem__  s     	sC(((((r    c                6    | j                             |          S rG   )r   r   )rO   ra  s     r   __getitem__zlmx.__getitem__  s    y%%c***r    r   c                \    t          ||          }| j                            |           | S )N)r   )r   r   r   )rO   txtr   nns       r   r=   zlmx.text  s/    #3	b!!!r    c                    t          |dd          }| j                            |           t          |          }|                                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  s|    '11EEE	g&&&\\HHJJ 	 	DAqts{{abbEBqEE	r    N)rC  )r   )
rV   rW   rX   r   rP   r  r  r  r=   r  rY   r    r   r  r    s            
1 1 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   rX  r   r   rk  rm  ro  r  r  r  r  r  rY   r    r   <module>r      sI   " # " " " " " 
			                  1 1 1 1 1 1 1 1 ) ( ( ( ( ( / / / / / / 1 1 1 1 1 1 1 1;BBWWYB2233  m/A > > > >  6
 
 
  &  .//       $'99 t,--        /     )    
 
 
 
 
Y 
 
 
6K K K K K K K KtQ Q Q Q Qt Q Q Qh2 2 2 2 2d 2 2 2<+ + + + +D + + +/ / / / /m / / /.(6 (6 (6 (6 (6= (6 (6 (6V    =   (   JLL	* * * * *M * * *u u u u ud u u up	    @ @ @ @ @Y @ @ @F$ $ $N+ + +> > >> > >" " " " " " " " " "r    