o
    a                     @   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rtj}t|ds+|| _t|d| _d| _	n	d | _|| _d	| _	z| j
d
 t| _W n tyQ   | j
d t| _Y nw | || _|d u rd| 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*   :/usr/lib/python3/dist-packages/fontTools/misc/xmlWriter.py__init__   s:   



zXMLWriter.__init__c                 C   s   | S Nr*   r(   r*   r*   r+   	__enter__4   s   zXMLWriter.__enter__c                 C   s   |    d S r-   )close)r(   Zexception_typeZexception_value	tracebackr*   r*   r+   __exit__7   s   zXMLWriter.__exit__c                 C   s   | j r
| j  d S d S r-   )r   r   r0   r.   r*   r*   r+   r0   :   s   zXMLWriter.closeTc                 C      | j t||d dS )zWrites text.indentNr&   escape)r(   stringr5   r*   r*   r+   r   >      zXMLWriter.writec                 C   s   |  d| d  dS )zWrites text in a CDATA section.z	<![CDATA[z]]>N)r&   r(   r8   r*   r*   r+   
writecdataB   r9   zXMLWriter.writecdataFc                 C   r3   )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(   datar<   r*   r*   r+   	write8bitF   s   zXMLWriter.write8bitc                 C   s   | j t|dd dS )z Writes text without indentation.Fr4   Nr6   r:   r*   r*   r+   write_noindentM   r9   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   r<   )r(   r>   r5   r<   sr*   r*   r+   r&   Q   s   
zXMLWriter._writerawc                 C   sB   | j | j d| _| j}|d s| jd ur|   |d | _d S )Nr   d   )r   r   r    r#   r%   r$   )r(   r%   r*   r*   r+   r'   [   s   zXMLWriter.newlinec                 C   sZ   t |}|d}| d|d   |dd  D ]}|   | d|  q| d d S )Nr   z<!-- r   r   z     z -->)r7   splitr&   r'   )r(   r>   linesliner*   r*   r+   commentc   s   
zXMLWriter.commentc                 O   s*   | j |i |}d||f }| | d S )Nz<%s%s/>)stringifyattrsr&   r(   _TAG_argskwargsZattrdatar>   r*   r*   r+   	simpletagl   s   zXMLWriter.simpletagc                 O   s>   | j |i |}d||f }| | | j| |   d S )Nz<%s%s>)rG   r&   r"   appendr5   rH   r*   r*   r+   begintagq   s
   
zXMLWriter.begintagc                 C   sB   | j r
| j d |ksJ d| j d= |   d| }| | d S )Nznonmatching endtagz</%s>)r"   dedentr&   )r(   rI   r>   r*   r*   r+   endtagx   s
   zXMLWriter.endtagc           
      C   s   d}|d }d}t dt||D ]0}t||||  }d}d}t d||D ]}	|| ||	|	|   }d}q&| | |   qd S )N         r   r
    )rangelenhexStrr&   r'   )
r(   r>   Z
linelengthZhexlinelengthZ	chunksizeiZhexlinerE   Zwhitejr*   r*   r+   dumphex   s   

zXMLWriter.dumphexc                 C   s   | j d | _ d S )Nr   r!   r.   r*   r*   r+   r5      s   zXMLWriter.indentc                 C   s   | j dksJ | j d | _ d S )Nr   r   r\   r.   r*   r*   r+   rP      s   zXMLWriter.dedentc                 O   s|   |r|rJ t | }n|rt|dksJ |d }ndS d}|D ]\}}t|ttfs1t|}|d|t|f  }q"|S )Nr   r   r
   z %s="%s")sorteditemsrW   
isinstancebytesstr
escapeattr)r(   rJ   rK   Z
attributesr>   attrvaluer*   r*   r+   rG      s   
zXMLWriter.stringifyattrs)T)F)TF)__name__
__module____qualname__INDENTr,   r/   r2   r0   r   r;   r?   r@   r&   r'   rF   rL   rN   rQ   r[   r5   rP   rG   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   r>   r*   r*   r+   r7      s   
r7   c                 C   s   t | } | dd} | S )N"z&quot;)r7   r   rm   r*   r*   r+   rb      s   rb   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vr| S dt| d S )N       z<&>z&#;)ordrepr)cnr*   r*   r+   
escapechar   s    zescape8bit.<locals>.escapecharzlatin-1)r   mapdecode)r>   rv   r*   r*   r+   r=      s   r=   c                 C   s@   t j}d}| D ]}t|}|||d? d@   ||d@   }q|S )Nr
         )r8   Z	hexdigitsr   )rA   hrrt   rY   r*   r*   r+   rX      s   "rX   )__doc__ZfontTools.misc.textToolsr   r   r   r   r   r   r8   rh   objectr   r7   rb   r=   rX   r*   r*   r*   r+   <module>   s     
