B
    Sc                 @   sl   d Z ddlmZmZmZmZ ddlZddlZddlZdZ	G dd de
Zdd Zd	d
 Zdd Zdd ZdS )z*xmlWriter.py -- Simple XML authoring class    )byteordstrjointobytestostrNz  c               @   s   e Zd ZedddfddZdd Zdd	 Zd
d Zd*ddZdd Z	d+ddZ
dd Zd,ddZdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) ZdS )-	XMLWriterNutf_8
c             C   s
  |  dddddkr$td|dkr2tj}t|dsV|| _t|d| _d| _	nd | _|| _d	| _	y| j
d
 t| _W n& tk
r   | j
d t| _Y nX | || _|d kr| tj| _n| || _d| _g | _d| _|| _d| _| d |   d S )N- _utf8z!Only UTF-8 encoding is supported.writewbTF    r      z&<?xml version="1.0" encoding="UTF-8"?>)lowerreplace	Exceptionsysstdouthasattrfilenameopenfile_closeStreamr   r   totype	TypeErrorr   indentwhiteoslinesep
newlinestrindentlevelstack
needindentidlefuncidlecounter	_writerawnewline)selfZ
fileOrPathr   r$   encodingr     r*   7lib/python3.7/site-packages/fontTools/misc/xmlWriter.py__init__   s8    


zXMLWriter.__init__c             C   s   | S )Nr*   )r(   r*   r*   r+   	__enter__4   s    zXMLWriter.__enter__c             C   s   |    d S )N)close)r(   Zexception_typeZexception_value	tracebackr*   r*   r+   __exit__7   s    zXMLWriter.__exit__c             C   s   | j r| j  d S )N)r   r   r.   )r(   r*   r*   r+   r.   :   s    zXMLWriter.closeTc             C   s   | j t||d dS )zWrites text.)indentN)r&   escape)r(   stringr1   r*   r*   r+   r   >   s    zXMLWriter.writec             C   s   |  d| d  dS )zWrites text in a CDATA section.z	<![CDATA[z]]>N)r&   )r(   r3   r*   r*   r+   
writecdataB   s    zXMLWriter.writecdataFc             C   s   | j t||d dS )zWrites a bytes() sequence into the XML, escaping
		non-ASCII bytes.  When this is read in xmlReader,
		the original bytes can be recovered by encoding to
		'latin-1'.)stripN)r&   
escape8bit)r(   datar5   r*   r*   r+   	write8bitF   s    zXMLWriter.write8bitc             C   s   | j t|dd dS )z Writes text without indentation.F)r1   N)r&   r2   )r(   r3   r*   r*   r+   write_noindentM   s    zXMLWriter.write_noindentc             C   sN   |r$| j r$| j| j| j  d| _ | j|dd}|r>| }| j| dS )z Writes bytes, possibly indented.r   r   )r)   N)r#   r   r   r!   r   r   r5   )r(   r7   r1   r5   sr*   r*   r+   r&   Q   s    
zXMLWriter._writerawc             C   sB   | j | j d| _| j}|d s4| jd k	r4|   |d | _d S )Nr   d   )r   r   r    r#   r%   r$   )r(   r%   r*   r*   r+   r'   [   s    zXMLWriter.newlinec             C   s^   t |}|d}| d|d   x*|dd  D ]}|   | d|  q2W | d d S )Nr   z<!-- r   r   z     z -->)r2   splitr&   r'   )r(   r7   linesliner*   r*   r+   commentc   s    
zXMLWriter.commentc             O   s&   | j ||}d||f }| | d S )Nz<%s%s/>)stringifyattrsr&   )r(   _TAG_argskwargsattrdatar7   r*   r*   r+   	simpletagl   s    zXMLWriter.simpletagc             O   s:   | j ||}d||f }| | | j| |   d S )Nz<%s%s>)r@   r&   r"   appendr1   )r(   rA   rB   rC   rD   r7   r*   r*   r+   begintagq   s
    
zXMLWriter.begintagc             C   sB   | j r| j d |kstd| j d= |   d| }| | d S )Nznonmatching endtagz</%s>)r"   AssertionErrordedentr&   )r(   rA   r7   r*   r*   r+   endtagx   s
    zXMLWriter.endtagc       
      C   s   d}|d }d}xxt dt||D ]d}t||||  }d}d}x0t d||D ] }	|| ||	|	|   }d}qPW | | |   q"W d S )N         r   r
    )rangelenhexStrr&   r'   )
r(   r7   Z
linelengthZhexlinelengthZ	chunksizeiZhexliner>   Zwhitejr*   r*   r+   dumphex   s    
zXMLWriter.dumphexc             C   s   | j d | _ d S )Nr   )r!   )r(   r*   r*   r+   r1      s    zXMLWriter.indentc             C   s   | j dkst| j d | _ d S )Nr   r   )r!   rI   )r(   r*   r*   r+   rJ      s    zXMLWriter.dedentc             O   s   |r|rt t| }n"|r8t|dks.t |d }ndS d}x:|D ]2\}}t|ttfsdt|}|d|t|f  }qFW |S )Nr   r   r
   z %s="%s")rI   sorteditemsrQ   
isinstancebytesstr
escapeattr)r(   rB   rC   Z
attributesr7   attrvaluer*   r*   r+   r@      s    
zXMLWriter.stringifyattrs)T)F)TF)__name__
__module____qualname__INDENTr,   r-   r0   r.   r   r4   r8   r9   r&   r'   r?   rE   rG   rK   rU   r1   rJ   r@   r*   r*   r*   r+   r      s&   &



	r   c             C   s>   t | d} | dd} | dd} | dd} | dd	} | S )
Nr   &z&amp;<z&lt;>z&gt;z&#13;)r   r   )r7   r*   r*   r+   r2      s    
r2   c             C   s   t | } | dd} | S )N"z&quot;)r2   r   )r7   r*   r*   r+   r[      s    r[   c             C   s   dd }t t|| dS )zInput is Unicode string.c             S   s@   t | }d|  krdkr,n n| dkr,| S dt| d S d S )N       z<&>z&#;)ordrepr)cnr*   r*   r+   
escapechar   s     zescape8bit.<locals>.escapecharzlatin-1)r   mapdecode)r7   rn   r*   r*   r+   r6      s    r6   c             C   sD   t j}d}x4| D ],}t|}|||d? d@   ||d@   }qW |S )Nr
         )r3   Z	hexdigitsr   )r:   hrrl   rS   r*   r*   r+   rR      s    
$rR   )__doc__ZfontTools.misc.textToolsr   r   r   r   r   r   r3   ra   objectr   r2   r[   r6   rR   r*   r*   r*   r+   <module>   s    
