U
    \>e                     @  s   d Z ddlmZ ddlmZ ddlmZmZmZmZm	Z	 ddl
Z
ddlmZmZmZ ddgZe
d	e
jZd
ddddZd
dddZd
d
dddZd
d
dddZdddddddZd$ddd
ddd Zdd
d!d"dZdd
d!d#dZdS )%a  
Python-Markdown provides two serializers which render [`ElementTree.Element`][xml.etree.ElementTree.Element]
objects to a string of HTML. Both functions wrap the same underlying code with only a few minor
differences as outlined below:

1. Empty (self-closing) tags are rendered as `<tag>` for HTML and as `<tag />` for XHTML.
2. Boolean attributes are rendered as `attrname` for HTML and as `attrname="attrname"` for XHTML.
    )annotations)ProcessingInstruction)CommentElementTreeElementQName
HTML_EMPTYN)CallableLiteralNoReturnto_html_stringto_xhtml_stringz)&(?!(?:\#[0-9]+|\#x[0-9a-f]+|[0-9a-z]+);)strr   )textreturnc                 C  s   t d| t| jd S )Nzcannot serialize {!r} (type {}))	TypeErrorformattype__name__r    r   8/tmp/pip-unpacked-wheel-wj0og6ym/markdown/serializers.py_raise_serialization_error:   s    r   )r   c              	   C  sh   zBd| krt d| } d| kr*| dd} d| kr>| dd} | W S  ttfk
rb   t|  Y nX d S )N&&amp;<&lt;>&gt;RE_AMPsubreplacer   AttributeErrorr   r   r   r   r   _escape_cdata@   s    r$   c              	   C  s   zjd| krt d| } d| kr*| dd} d| kr>| dd} d| krR| dd} d	| krf| d	d
} | W S  ttfk
r   t|  Y nX d S )Nr   r   r   r   r   r   "&quot;
z&#10;r   r   r   r   r   _escape_attribR   s    r(   c              	   C  s|   zVd| krt d| } d| kr*| dd} d| kr>| dd} d| krR| dd} | W S  ttfk
rv   t|  Y nX d S )	Nr   r   r   r   r   r   r%   r&   r   r   r   r   r   _escape_attrib_htmle   s    r)   zCallable[[str], None]r   zLiteral[('html', 'xhtml')]None)writeelemr   r   c           
      C  s  |j }|j}|tkr(| dt|  n|tkrD| dt|  n|d krv|r\| t| |D ]}t| || q`nrd }t|tr|jd d dkr|jdd  dd\}}nt	d| d|  |
 }|rHt|}|D ]f\}}	t|tr|j}t|	tr|	j}	nt|	}	||	kr6|dkr6| d	|	  q| d
||	 q|r^| dt|  |dkr| tkr| d nh| d |r| dkr| | n| t| |D ]}t| || q| tkr| d| d  |jr| t|j d S )Nz	<!--%s-->z<?%s?>   {}z QName objects must define a tag.r   htmlz %sz {}="{}"z xmlns="%s"xhtmlz />r   )scriptstylez</)tagr   r   r$   r   _serialize_html
isinstancer   split
ValueErroritemssortedr)   r   r(   lowerr   tail)
r+   r,   r   r4   r   eZnamespace_urir9   kvr   r   r   r5   v   sX    



r5   r0   )rootr   r   c                 C  s,   | d k	st g }|j}t|| | d|S )N )AssertionErrorappendr5   join)r@   r   datar+   r   r   r   _write_html   s
    rF   )elementr   c                 C  s   t t|  ddS )z: Serialize element and its children to a string of HTML5. r0   r   rF   r   getrootrG   r   r   r   r      s    c                 C  s   t t|  ddS )z: Serialize element and its children to a string of XHTML. r1   rH   rI   rK   r   r   r   r      s    )r0   )__doc__
__future__r   xml.etree.ElementTreer   r   r   r   r   r   retypingr	   r
   r   __all__compileIr    r   r$   r(   r)   r5   rF   r   r   r   r   r   r   <module>%   s   	9