HEX
Server: Apache
System: Linux scp1.abinfocom.com 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025 x86_64
User: confeduphaar (1010)
PHP: 8.1.33
Disabled: exec,passthru,shell_exec,system
Upload Files
File: //lib/python3/dist-packages/twisted/web/__pycache__/microdom.cpython-38.pyc
U


W[e��@s�dZddlZddlmZmZddlmZmZmZm	Z	ddl
mZddlm
Z
mZdd�Zd	d
�Zdd�Zd
Zee�Ze��edZee�Ze��efdd�Zefdd�ZGdd�de�ZGdd�de�ZGdd�de�ZGdd�de�ZGdd�de�Z Gdd�de �Z!Gdd �d e �Z"Gd!d"�d"e �Z#d#d$�Z$e$�Z%Gd%d&�d&e �Z&Gd'd(�d(e�Z'd)d*�Z(d+d,�Z)Gd-d.�d.e
�Z*d/d0�Z+d1d2�Z,d3d4�Z-d5d6�Z.Gd7d8�d8�Z/dS)9a�
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.
�N)�BytesIO�StringIO)�ioType�	iteritems�range�unicode)�InsensitiveDict)�	XMLParser�
ParseErrorcCsLg}|j}|g}t|�dkrH|�d�}|j|kr8||�|j|dd�<q|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}.
    rN)�append�len�pop�nodeName�
childNodes�ZiNode�nameZmatchesZmatches_append�slice�c�r�6/usr/lib/python3/dist-packages/twisted/web/microdom.py�getElementsByTagName s

rcCsX|��}g}|j}|g}t|�dkrT|�d�}|j��|krD||�|j|dd�<q|S�Nr)�lowerrrr
rrrrrr�getElementsByTagNameNoCase<s
rcs*t��tkr�fdd�}n�fdd�}|S)Ncs"t|t�r|�d�}��|�dS�Nzutf-8)�
isinstancer�encode�write��s��streamrr�wLs

z_streamWriteWrapper.<locals>.wcs"t|t�r|�d�}��|�dSr)r�bytes�decoderrr rrr"Qs

)rr#)r!r"rr r�_streamWriteWrapperJsr%))�&z&amp;)�<z&lt;)�>z&gt;)�"z&quot;))�'z&apos;cCs|D]\}}|�||�}q|S)z1
    Perform the exact opposite of 'escape'.
    ��replace��text�charsr�hrrr�unescapecsr1cCs|D]\}}|�||�}q|S)z;
    Escape a few XML special chars with XML entities.
    r+r-rrr�escapemsr2c@seZdZdd�Zdd�ZdS)�MismatchedTagscCs2|||||||f\|_|_|_|_|_|_|_dS�N)�filename�expect�got�begLine�begCol�endLine�endCol)�selfr5r6r7r:r;r8r9rrr�__init__ys��zMismatchedTags.__init__cCs d|j|j|j|j|j|jfS)NzBexpected </%s>, got </%s> line: %s col: %s, began line: %s col: %s)r6r7r:r;r8r9�r<rrr�__str__~s
��zMismatchedTags.__str__N)�__name__�
__module__�__qualname__r=r?rrrrr3wsr3c@s�eZdZdZd"dd�Zdd�Zddddidfdd	�Zddddidfd
d�Zd#dd�Zd$dd�Z	d%dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zd d!�ZdS)&�NodeNcCs||_g|_dSr4)�
parentNoder)r<rDrrrr=�sz
Node.__init__cCsDt|j�t|j�krdSt|j|j�D]\}}|�|�s&dSq&dS)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)r<�other�a�brrrrF�s	
zNode.isEqualToNode�rcCs
t��dSr4��NotImplementedError)r<r!�indent�	addindent�newl�strip�
nsprefixes�	namespacerrr�writexml�sz
Node.writexmlc		Cs(t�}|�|||||||�|��}|Sr4)rrS�getvalue)	r<rMrNrOrPrQrRr�rvrrr�toxml�sz
Node.toxml� �
cCs|�|||||�Sr4)rS)r<r!rMrNrOrPrrr�writeprettyxml�szNode.writeprettyxmlcCs|�||||�Sr4)rV)r<rMrNrOrPrrr�toprettyxml�szNode.toprettyxmlcCs
t��dSr4rK�r<�deep�parentrrr�	cloneNode�szNode.cloneNodecCs|jr
dSdSdS)N�r�rr>rrr�
hasChildNodes�szNode.hasChildNodescCs(t|t�std��|j�|�||_dS)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)rrC�	TypeErrorrrrD�r<�childrrr�appendChild�s
zNode.appendChildcCs@t|t�rt|t�std��|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}
        rb)rrCrcr�indexrD�insert)r<�new�ref�irrr�insertBefore�szNode.insertBeforecCs2t|t�std��||jkr.|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}
        rbN)rrCrcr�removerDrdrrr�removeChild�s

zNode.removeChildcCsPt|t�rt|t�std��|j|k	r.td��||j|j�|�<d|_||_dS)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}.
        rbz$oldChild is not a child of this nodeN)rrCrcrD�
ValueErrorrrg)r<ZnewChildZoldChildrrr�replaceChild�s
zNode.replaceChildcCs
|jdS�N���r`r>rrr�	lastChild
szNode.lastChildcCst|j�r|jdSdSr)rrr>rrr�
firstChilds

zNode.firstChild)N)rJrWrXr)rJrWrXr)rN)r@rArBrr=rFrSrVrYrZr^rarfrlrnrprsrtrrrrrC�s(
�

�



rCc@s�eZdZddd�Zddd�ZdZdd�ZeZd	d
�Ze	e�Z
dd�Zd
d
d
did
fdd�Zdd�Z
dd�Zdd�Zdd�Zdd�ZdS)�DocumentNcCst�|�|r|�|�dSr4)rCr=rf)r<�documentElementrrrr=&s
zDocument.__init__rcCs6t�}|j|_|r"|j�d|�}n|j}|�|�|S�Nr_)ru�doctypervr^rf)r<r\r]�dZnewElrrrr^,s
zDocument.cloneNodecCs|j|jkot�||�Sr4)rxrCrF�r<�nrrr�isEqualToDocument8szDocument.isEqualToDocumentcCs
|jdSrr`r>rrr�get_documentElement=szDocument.get_documentElementcCs|jrtd��t�||�dS)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.
        zOnly one element per document.N)rrorCrfrdrrrrfBs	zDocument.appendChildrJc		CsHt|�}|d|�|jr,|d�|j|��|j�|||||||�dS)Nz<?xml version="1.0"?>z<!DOCTYPE {}>{})r%rx�formatrvrS�	r<r!rMrNrOrPrQrRr"rrrrSPs�zDocument.writexmlcKst|f|�Sr4)�Element)r<r�kwrrr�
createElement\szDocument.createElementcCst|�Sr4)�Text�r<r.rrr�createTextNode`szDocument.createTextNodecCst|�Sr4)�Commentr�rrr�
createCommentdszDocument.createCommentcCs|jjrt||�St||�Sr4)rv�caseInsensitiverr�r<rrrrrhs
zDocument.getElementsByTagNamecCsP|jdd�}|rL|�d�}|jr.|�|j�t|d�r|�d�|kr|SqdS)Nr�getAttribute�id)rr
�extend�hasattrr�)r<r�r�noderrr�getElementByIdns
zDocument.getElementById)N)rN)r@rArBr=r^rxr|rFr}�propertyrvrfrSr�r�r�rr�rrrrru$s"


�
ruc@sBeZdZddd�Zdd�ZeZddddidfdd	�Zd
d
d�ZdS)�EntityReferenceNcCs*t�||�||_d|d|_|_dS)Nr&�;)rCr=�eref�	nodeValue�data)r<r�rDrrrr={szEntityReference.__init__cCs&t|t�sdS|j|jko$|j|jkSr)rr�r�r�rzrrr�isEqualToEntityReference�s
z(EntityReference.isEqualToEntityReferencerJrc	Cst|�}|d|j�dS)NrJ�r%r�rrrrrS�szEntityReference.writexmlcCst|j|�Sr4)r�r�r[rrrr^�szEntityReference.cloneNode)N)rN)r@rArBr=r�rFrSr^rrrrr�ys
�
r�c@s"eZdZddd�Zdd�ZeZdS)�
CharacterDataNcCs"t�||�||_|_|_dSr4)rCr=�valuer�r�)r<r�rDrrrr=�szCharacterData.__init__cCs|j|jkSr4)r�rzrrr�isEqualToCharacterData�sz$CharacterData.isEqualToCharacterData)N)r@rArBr=r�rFrrrrr��s
r�c@s0eZdZdZddddidfdd�Zd	dd�ZdS)
r�z
    A comment node.
    rJrc
Cs t|�}|j}	|d�|	��dS)Nz	<!--{}-->)r%r�r~)
r<r!rMrNrOrPrQrRr"�valrrrrS�szComment.writexmlNcCst|j|�Sr4)r�r�r[rrrr^�szComment.cloneNode)rN)r@rArB�__doc__rSr^rrrrr��s�
r�c@sFeZdZddd�Zdd�Zddd�Zd	d	d	did	fd
d�Zdd
�ZdS)r�NrcCst�|||�||_dSr4)r�r=�raw)r<r�rDr�rrrr=�sz
Text.__init__cCst�||�o|j|jkS)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�rFr��r<rGrrrrF�s
�zText.isEqualToNodecCst|j||j�Sr4)r�r�r�r[rrrr^�szText.cloneNoderJcCspt|�}|jr.|j}	t|	ttf�sdt|j�}	n6|j}
t|
ttf�sJt|
�}
|r\d�|
���}
t|
�}	||	�dS)NrW)	r%r�r�r�strr�join�splitr2)r<r!rMrNrOrPrQrRr"r��vrrrrS�sz
Text.writexmlcCsdt|j�dS)NzText(%s�))�reprr�r>rrr�__repr__�sz
Text.__repr__)Nr)rN)r@rArBr=rFr^rSr�rrrrr��s


�
r�c@s,eZdZddd�Zddddidfdd�ZdS)	�CDATASectionrNcCst|j|�Sr4)r�r�r[rrrr^�szCDATASection.cloneNoderJc	Cs*t|�}|d�|d|j�|d�dS)Nz	<![CDATA[rJz]]>r�rrrrrS�szCDATASection.writexml)rN)r@rArBr^rSrrrrr��s

�r�ccs d}dt|�V|d}qdS)Nr�pr_)r�)rkrrr�
_genprefix�sr�c@seZdZdZdS)�_Attrz#Support class for getAttributeNode.N)r@rArBr�rrrrr��sr�c@s�eZdZdZdZdZd'dd�Zdd�Zdd	�Zd
d�Z	dd
�Z
d(dd�Zdd�Zdd�Z
d)dd�Zd*dd�Zdd�Zdd�Zdd�Zdd�Zd d d did fd!d"�Zd#d$�Zd%d&�ZdS)+r�rr_Nc	Cs�t�||�|p||_||_|s*|��}|dkr:i|_n(||_|j��D]\}	}
t|
�|j|	<qJ|rvt|j|d�|_||_	|_
|_||_||_
||_dS)N)�preserve)rCr=�preserveCaser�r�
attributes�itemsr1r�
endTagNamer�tagName�	_filename�_markposrR)r<r�r�rDr5Zmarkposr�r�rR�kr�rrrr=�s$�zElement.__init__cCs"|jdkr||_n|j�|�dSr4)rQ�update)r<Zpfxsrrr�addPrefixess
zElement.addPrefixescCs|js|��}||_dSr4)r�rr�)r<r�rrr�endTagszElement.endTagcCs>|jr&|j|jko$|j��|j��kS|j|jko<|j|jkSr4)r�r�rrrzrrr�isEqualToElement%s
�zElement.isEqualToElementcCs8|j��|j��ko6|j|jko6|j|jko6t�||�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}.
        )rrrRr�rCrFr�rrrrF,s
�
�
�zElement.isEqualToNodecsNt|j||j|j|jd���j�|j�|rD�fdd�|jD��_ng�_�S)N)rDrRr�r�csg|]}|�d���qS)r_)r^)�.0re�Zclonerr�
<listcomp>?sz%Element.cloneNode.<locals>.<listcomp>)r�r�rRr�r�r�r�rr[rr�rr^9s�zElement.cloneNodecCs|jrt||�St||�Sr4)r�rrr�rrrrEs
zElement.getElementsByTagNamecCsdSrwrr>rrr�
hasAttributesKszElement.hasAttributescCs|j�||�Sr4)r��get)r<r�defaultrrrr�OszElement.getAttributecCs8||f}||jkr|j|S||jkr4|j�||�S|Sr4)r�rRr�)r<�nsrr�Znskrrr�getAttributeNSSs


zElement.getAttributeNScCst|�|�|�Sr4)r�r�r�rrr�getAttributeNode\szElement.getAttributeNodecCs||j|<dSr4�r�)r<r�attrrrr�setAttribute`szElement.setAttributecCs||jkr|j|=dSr4r�r�rrr�removeAttributeds
zElement.removeAttributecCs
||jkSr4r�r�rrr�hasAttributeiszElement.hasAttributerJc
s�d}d}	d}
|js|j|_t|�}|jrP|j��}|��D]}
|
|kr:||
=q:ni}dg}|j|	krp||g|}|j��fdd�}|j}||jkr�|jdk	r�|j|kr�||j}�|d|j�|d|j}q��|j�|d	|j�|j}n
�|j�d
j	}t
|j���D]|\}}t
|t��rp|\}
}|
|k�r>||
}ntt�}|||
<|dk	�s\t�||d||�n|dk	�s~t�|||��q|�r�t|�D]\}
}|�r�|d||
��q�|�|�|}n|}|||��|j�rn|d�||}|jD]D}|j|	k�r$|j|
k�r$||||f��|�|||||||��q�|j|	k�rZ||||f��||d
|df��n,|j��|k�r�||d|df��n|d�dS)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.
        )
Zimg�br�hr�base�meta�linkZparamZarea�input�colZbasefontZisindex�frame)�html�head�bodyZnoscriptZins�delZh1Zh2Zh3Zh4Zh5Zh6�script�ul�olZdl�prer�Z
blockquoteZaddressr��div�fieldset�table�trZform�objectr�Zapplet�map)r�r�r�r�r'cs�d|dt|�df�S)NrWz="r))r2)Z_atrZ_val�Zbextrr�<lambda>��z"Element.writexml.<locals>.<lambda>N�:�xmlnsrJzxmlns:r(z</z></� />)r�r�r�r%rQ�copy�keysr�rRr��sortedr�r�r�tuple�next�	genprefix�AssertionErrorrr�rrSr)r<r!rMrNrOrPrQrRZALLOWSINGLETONZ
BLOCKELEMENTSZFORMATNICELYr"Znewprefixesr�ZbeginZ	writeattrr��prefix�jr�r��keyZdownprefixesZ	newindentrerr�rrSms�










��zElement.writexmlcCsXdt|j�}|jr$|d|jf7}|jr:|d|jf7}|jrP|d|jf7}|dS)Nz
Element(%sz, attributes=%rz
, filename=%rz, markpos=%rr�)r�rr�r�r�)r<�reprrrr��szElement.__repr__cCs�d|j}|js|jr|d7}|jr2|t|j�7}|jrF|d|j7}|jsR|jrZ|d7}|j��D]}|d|7}qd|��r�|d|j7}n|d7}|S)Nr'z (z line %s column %sr�z %s=%rz
 >...</%s>r�)rr�r�r�r�r�ra)r<r��itemrrrr?�s
zElement.__str__)NNNNr_rN)rN)N)N)r@rArBr�r�rQr=r�r�r�rFr^rr�r�r�r�r�r�r�rSr�r?rrrrr��s:�



	�
{r�cCs&i}|��D]\}}t|�||<q|Sr4)r�r1�ry�ddr�r�rrr�
_unescapeDictsr�cCs"i}|��D]\}}|||<q|Sr4)r�r�rrr�_reverseDicts
r�c@s�eZdZd��Zddgddgddgdgdddgdddgdddgd	gd
gdgdgd
gdgddgdgd�Zdddeefdd�Zdd�Zdd�Ze	�
d�Zdd�Zdd�Z
dd �Zd!d"�Zd#d$�Zd%d&�Zd'd(�Zd)d*�Zd+d,�Zd-d.�Zd/S)0�MicroDOMParserz#area link br img hr input base metar��dtr��li�thead�tfoot�tbody�colgroupr�r��td�thr�r��option)r�r�r�r�r�r�r�r�r�r�r�r�r��titler�rr_cCsZg|_ddd�}t|�}|d|fg|_g|_d|_||_||_|pF||_||_||_	dS)Nr�)r�rJ)
�elementstackr��nsstack�	documents�
_mddoctype�beExtremelyLenientr�r��soonClosers�laterClosers)r<rr�r�rrryZdrrrrr=0s
zMicroDOMParser.__init__cCsDtt|j��D]0}|j|}|jdks8|�dd�dkrdSqdS)Nr�z	xml:spacerJr�r_r)rrr�r�r�)r<Zedx�elrrr�shouldPreserveSpace@s
z"MicroDOMParser.shouldPreserveSpacecCs|jr|jdSdSdSrq)r�r>rrr�
_getparentHs
zMicroDOMParser._getparentz\s*/[/*]\s*c	Cs�|jrt|j�dksdS|��}t|t�r�d}|j}|j�|�}|r\|�	�}|t|�d�}zt
d|�jd}Wnttfk
r�YdSXt|j�dkr�dS|��}t|t
tf�r�g|_|r�|j�t|��|j�|�dS)Nr_rJz	<a>%s</a>r)rrrrtrr�r��COMMENT�match�group�parseStringr
r3r�r�r)r<rrr�Zoldvaluer�errr�_fixScriptElementPs,
z MicroDOMParser._fixScriptElementcCs
||_dSr4)r�)r<rxrrr�
gotDoctyperszMicroDOMParser.gotDoctypecCs|��}|jr^t|t�r^|j}|}|jr8|��}|��}||j�|g�kr^|�	|j�|��}t
|�}|jdd}i}g}|��D]J\}	}
|	�
d�r�|	�dd�}t|�dkr�|
||d<n|
|d<|�|	�q�|D]
}	||	=q�|r�|��}|�|�g}|��D]Z\}	}
|	�dd�}t|�dk�r|\}
}|
dk�r|
|k�r|
|||
|f<|�|	��q|D]}	||	=�qbt||||j|��|j|j|�d�d	�}t|�}|�|�|�r�|jdd��}|�|�|j�|||f�|j�|�|�r�|�|�|j�r|j|jk�r|�	|�dS)
Nrrrr�r�r_�rJZxml)r�r�rR)rrrr�r�r�rrr��	gotTagEndr�r�r��
startswithr�rrr�r�r5�saveMarkr�r�r�r�rfr)r<rr�r]Z
parentNameZmyNameZ
namespacesZ	newspacesZkeysToDeleter�r�Z
spacenamesZksplit�pfxZtvrZ	revspacesZrscopyrrr�gotTagStartvsl


�


zMicroDOMParser.gotTagStartcCs8|��}|||�}|r"|�|�n|jr4|j�|�dSr4)rrfrr�r)r<�factoryr�r]Zterrr�_gotStandalone�s
zMicroDOMParser._gotStandalonecCs |��s|��r|�t|�dSr4)rPrrr��r<r�rrr�gotText�szMicroDOMParser.gotTextcCs|�t|�dSr4)rr�rrrr�
gotComment�szMicroDOMParser.gotCommentcCs|�t|�dSr4)rr�)r<Z	entityRefrrr�gotEntityReference�sz!MicroDOMParser.gotEntityReferencecCs|�t|�dSr4)rr�)r<Zcdatarrr�gotCData�szMicroDOMParser.gotCDatac
Cs|js,|jrdSt|jd|f|��d��|j��}|jdd}|jdd|krb|j��}nd}|jr�|j�	�}|�	�}n
|j}|}|�
dd�}t|�dkr�|\}}	|�|d�}
|
dk	r�|j
|
kr�|js�t|j|j|f|��|j��||k�s�|j�r�|j�r�|jd}tt|j��D]:}|j|dj|k�r |j|d�|��q��q |j�|�|dk	�r~|j�|�dS|j|dd�=|j�s�|j�|�dSn t|j|j|f|��|j��|�|�|j�s�|j�|�|j�r
|jdk�r
|�|�dS)	NZNOTHING)rrrrr
r_r�rr�)r�rr3r5rr
r�r�r�rr�rr�rRr�rr�rr�r)
r<rrZpfxdixZnstupleZtnZcnameZnsplitrZnewnamer�ZlastEl�idxrrrr�sp��



��



��
zMicroDOMParser.gotTagEndcCsZt�||�|jrV|jr,|j�|jd�n*t|j|jddf|��|jdj	��dS)NrrrZEND_OF_FILE)
r	�connectionLostr�rr�rr3r5rr�)r<�reasonrrrrs��
�zMicroDOMParser.connectionLostN)r@rArBr�rrr=rr�re�compilerrrrrrrrrrrrrrrr�sD��

";	:r�c	Ost|d�st|d�}t||�}t|dd�|_|�d�t|d�rP|�|���n$|�d�}|rt|�|�|�d�}qZ|�	d�|j
s�t|jddd	��|jr�t
|j
�d
kr�|j
d}t|t�s�td�}|�|�|}q�td�}|j
D]}|�|�q�n
|j
d}t|�}|j|_|S)z%
    Parse HTML or XML readable.
    �read�rbrz<xmlfile />NrTirzNo top-level Nodes in documentr_r�)r��openr��getattrr5ZmakeConnectionZdataReceivedrTrrr�r
rrrr�rfrur�rx)	�readable�args�kwargsZmdp�rryrre�docrrr�parses8












r(cOs8t|t�r$tt|�d��f|�|�Stt|�f|�|�S)NzUTF-16)rrr(rr)�str$r�rrrr	:s
r	cCst|ddd�S�z'
    Parse an XML readable object.
    rr_�r�r�)r()r#rrr�parseXMLBsr,cCst|ddd�Sr*)r	)r)rrr�parseXMLStringJsr-c@sDeZdZdZddd�Zdd�Zdd�Zd	d
�Zddd
�Zdd�Z	dS)�lmxz
    Easy creation of XML.
    r�cCs t|ttf�rt|�}||_dSr4)rr�rr�r�)r<r�rrrr=Wszlmx.__init__cs"�ddkrtd����fdd�S)Nr�_zno private attrscs�j�f|�Sr4)�add)r��rr<rrr�`r�z!lmx.__getattr__.<locals>.<lambda>)�AttributeErrorr�rr1r�__getattr__]szlmx.__getattr__cCs|j�||�dSr4)r�r�)r<r�r�rrr�__setitem__cszlmx.__setitem__cCs|j�|�Sr4)r�r�)r<r�rrr�__getitem__gszlmx.__getitem__rcCst||d�}|j�|�|S)N)r�)r�r�rf)r<Ztxtr�Znnrrrr.kszlmx.textcKsXt|ddd�}|j�|�t|�}|��D](\}}|ddkrJ|dd�}|||<q*|S)Nrr+r/r_)r�r�rfr.r�)r<r�r�ZnewNodeZxfr�r�rrrr0qs
zlmx.addN)r�)r)
r@rArBr�r=r3r4r5r.r0rrrrr.Rs

r.)0r�r�iorrZtwisted.python.compatrrrrZtwisted.python.utilrZtwisted.web.suxr	r
rrr%ZHTML_ESCAPE_CHARS�listZREV_HTML_ESCAPE_CHARS�reverseZXML_ESCAPE_CHARSZREV_XML_ESCAPE_CHARSr1r2�	Exceptionr3r�rCrur�r�r�r�r�r�r�r�r�r�r�r�r(r	r,r-r.rrrr�<module>sP

 U
+|(