U
    Vc                     @   s   d Z ddlmZ ddlZdZedZdZz&ddlm	Z
 ddlmZ d	ZejZW nJ ek
r   dd
lmZ ddlmZmZmZ e e_Zee_ee_Y nX dd Zdd ZdddZdd Zdd ZdddZdd ZdS )z-
Small wrapper for different etree packages.
    )compatNreStructuredTextwsgidavF)_elementpath)_etreeT)ElementTree)Element
SubElementtostringc                 C   s
   t | tS )N)
isinstance_ElementType)obj r   !/opt/wsgidav/wsgidav/xml_tools.pyis_etree_element2   s    r   c                 C   sB   zt | W S  tk
r<   td td|   Y nX dS )z&Convert XML string into etree.Element.zyError parsing XML string. If lxml is not available, and unicode is involved, then installing lxml _may_ solve this issue.zXML source: {}N)etreeZXML	Exception_loggererrorformat)textr   r   r   string_to_xml6   s    
r   c                 C   sJ   t rtj| dd|d}n tj| dd}|ds8d| }|dsFt|S )zsWrapper for etree.tostring, that takes care of unsupported pretty_print
    option and prepends an encoding header.zUTF-8T)encodingZxml_declarationpretty_print)r   s   <?xml s(   <?xml version="1.0" encoding="utf-8" ?>
)use_lxmlr   r
   
startswithAssertionError)elementr   xmlr   r   r   xml_to_bytesM   s       
r   c                   C   s    t rtjdddidS tdS )GWrapper for etree.Element, that takes care of unsupported nsmap option.z{DAV:}multistatusDDAV:nsmapr   r   r   r   r   r   r   make_multistatus_el]   s    r&   c                   C   s    t rtjdddidS tdS )r    z
{DAV:}propr!   r"   r#   r%   r   r   r   r   make_prop_eld   s    r'   c                 C   s    t rtj| ||dS t| |S )zJWrapper for etree.SubElement, that takes care of unsupported nsmap option.r#   )r   r   r	   )parenttagr$   r   r   r   make_sub_elementk   s    r*   c                 C   sR   t | dkr| jpdS t }| D ]}|t|ddd  q"| }|  |S )zSerialize etree.Element.

    Note: element may contain more than one child or only text (i.e. no child
          at all). Therefore the resulting string may raise an exception, when
          passed back to etree.XML().
    r    F)r   
)lenr   r   StringIOwriter   getvalueclose)r   streamZ	childnodesr   r   r   element_content_as_stringr   s    
r4   )F)N)__doc__r   r   logging__docformat__	getLoggerr   r   Zlxmlr   Z_dummy_elementpathZdefusedxml.lxmlr   r   Z_Elementr   ImportErrorZ
defusedxmlr   Zxml.etree.ElementTreer   r	   r
   r   r   r   r&   r'   r*   r4   r   r   r   r   <module>   s.   




