o
    nĎi                  
   @  s   d Z ddlmZ ddlmZmZm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dlZddlZdZedZdZeeedd	d
eddeddde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    )annotations)BinaryIOCallableTextIO)byteordstrjointobytestostrNz  zfontTools.ttx?	   )             i   i   )i  i  c                   @  s   e Zd Zedddfd5ddZdd Zdd Zd6ddZd7ddZdd Z	d8ddZ
dd  Zd9d!d"Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 ZdS ):	XMLWriterNutf_8

fileOrPath*str | os.PathLike[str] | BinaryIO | TextIOindentwhitestridlefuncCallable[[], None] | Noneencoding
newlinestrstr | bytesreturnNonec                 C  s$  |  dddddkrtd|dkrtj}|  t|ds9t|ttj	fs,t
d|| _t|d| _d	| _n	d | _|| _d
| _z| jd t| _W n t
y_   | jd t| _Y nw | || _|d u rr| tj| _n| || _d| _g | _d| _|| _d| _| d |   d S )N- _utf8z!Only UTF-8 encoding is supported.writez]fileOrPath must be a file path (str or PathLike) if it isn't an object with a `write` method.wbTF    r      z&<?xml version="1.0" encoding="UTF-8"?>)lowerreplace	Exceptionsysstdouthasattr
isinstancer   osPathLike	TypeErrorfilenameopenfile_closeStreamr"   r   totyper	   r   linesepr   indentlevelstack
needindentr   idlecounter	_writerawnewline)selfr   r   r   r   r    r=   T/home/jeff/fluffinator/venv/lib/python3.10/site-packages/fontTools/misc/xmlWriter.py__init__   sD   



zXMLWriter.__init__c                 C  s   | S Nr=   r<   r=   r=   r>   	__enter__O   s   zXMLWriter.__enter__c                 C  s   |    d S r@   )close)r<   exception_typeexception_value	tracebackr=   r=   r>   __exit__R   s   zXMLWriter.__exit__c                 C  s.   | j rt| jttjfrJ | j  d S d S r@   )r3   r,   r2   r   r-   r.   rC   rA   r=   r=   r>   rC   U   s   zXMLWriter.closeTc                 C     | j t||d dS )zWrites text.indentNr:   escape)r<   stringrJ   r=   r=   r>   r"   Z      zXMLWriter.writec                 C  s   |  d| d  dS )zWrites text in a CDATA section.z	<![CDATA[z]]>N)r:   r<   rM   r=   r=   r>   
writecdata^   rN   zXMLWriter.writecdataFc                 C  rH   )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<   datarQ   r=   r=   r>   	write8bitb   s   zXMLWriter.write8bitc                 C  s   | j t|dd dS )z Writes text without indentation.FrI   NrK   rO   r=   r=   r>   write_noindenti   rN   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)r8   r2   r"   r6   r   r4   rQ   )r<   rS   rJ   rQ   sr=   r=   r>   r:   m   s   
zXMLWriter._writerawc                 C  sB   | j | j d| _| j}|d s| jd ur|   |d | _d S )Nr%   d   )r2   r"   r   r8   r9   r   )r<   r9   r=   r=   r>   r;   w   s   zXMLWriter.newlinec                 C  sZ   t |}|d}| d|d   |dd  D ]}|   | d|  q| d d S )Nr   z<!-- r   r%   z     z -->)rL   splitr:   r;   )r<   rS   linesliner=   r=   r>   comment   s   
zXMLWriter.commentc                 O  s*   | j |i |}d||f }| | d S )Nz<%s%s/>)stringifyattrsr:   r<   _TAG_argskwargsattrdatarS   r=   r=   r>   	simpletag   s   zXMLWriter.simpletagc                 O  s>   | j |i |}d||f }| | | j| |   d S )Nz<%s%s>)r\   r:   r7   appendrJ   r]   r=   r=   r>   begintag   s
   
zXMLWriter.begintagc                 C  sB   | j r
| j d |ksJ d| j d= |   d| }| | d S )Nznonmatching endtagz</%s>)r7   dedentr:   )r<   r^   rS   r=   r=   r>   endtag   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<   rS   
linelengthhexlinelength	chunksizeihexlinerZ   whitejr=   r=   r>   dumphex   s   

zXMLWriter.dumphexc                 C  s   | j d | _ d S )Nr%   r6   rA   r=   r=   r>   rJ      s   zXMLWriter.indentc                 C  s   | j dksJ | j d | _ d S )Nr   r%   rw   rA   r=   r=   r>   rf      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itemsrm   r,   bytesr   
escapeattr)r<   r_   r`   
attributesrS   attrvaluer=   r=   r>   r\      s   
zXMLWriter.stringifyattrs)r   r   r   r   r   r   r   r   r   r   r   r   )r   r   )T)F)TF)__name__
__module____qualname__INDENTr?   rB   rG   rC   r"   rP   rT   rU   r:   r;   r[   rb   rd   rg   rv   rJ   rf   r\   r=   r=   r=   r>   r      s.    2




	r   c                 C  s   t | d} | dd} | dd} | dd} | dd	} | t}|| krGd
}t| }t| |kr@t| d| dd d }td|t |S )zQEscape characters not allowed in `XML 1.0 <https://www.w3.org/TR/xml/#NT-Char>`_.r   &z&amp;<z&lt;>z&gt;z&#13;
   Nr%   re   z...zEIllegal XML character(s) found; replacing offending string %r with %r)	r	   r'   	translateILLEGAL_XML_CHARSreprrm   TTX_LOGwarningREPLACEMENT)rS   newDatamaxLenpreviewr=   r=   r>   rL      s"   

rL   c                 C  s   t | } | dd} | S )N"z&quot;)rL   r'   )rS   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vr| S dt| d S )Nr      z<&>z&#;)ordr   )cnr=   r=   r>   
escapechar   s    zescape8bit.<locals>.escapecharzlatin-1)r   mapdecode)rS   r   r=   r=   r>   rR      s   rR   c                 C  s@   t j}d}| D ]}t|}|||d? d@   ||d@   }q|S )Nr         )rM   	hexdigitsr   )rV   hrr   rr   r=   r=   r>   rn      s   "rn   ) __doc__
__future__r   typingr   r   r   fontTools.misc.textToolsr   r   r   r	   r)   r-   rM   logging	itertoolsr   	getLoggerr   r   dictfromkeyschainrl   r   objectr   rL   r{   rR   rn   r=   r=   r=   r>   <module>   s8    
 &