B
    Jd~                 @   s   d Z ddlmZmZmZmZmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZmZ ddlmZ dd	lZdd	lZeeZd
ZeeZdZeeZG dd de
j
ZG dd deZeG dd deZd	S )aP  Compiles/decompiles SVG table.

https://docs.microsoft.com/en-us/typography/opentype/spec/svg

The XML format is:

.. code-block:: xml

	<SVG>
		<svgDoc endGlyphID="1" startGlyphID="1">
			<![CDATA[ <complete SVG doc> ]]
		</svgDoc>
	...
		<svgDoc endGlyphID="n" startGlyphID="m">
			<![CDATA[ <complete SVG doc> ]]
		</svgDoc>
	</SVG>
    )	bytesjoinsafeEvalstrjointobytestostr)sstruct   )DefaultTable)Sequence)	dataclassastuple)BytesIONzj
	>   # big endian
	version:                  H
	offsetToSVGDocIndex:      L
	reserved:                 L
z
	>   # big endian
	startGlyphID:             H
	endGlyphID:               H
	svgDocOffset:             L
	svgDocLength:             L
c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
table_S_V_G_c          
   C   sR  g | _ tt|d t |  | jdkr4td| j | j }}t	d|||d  d | _
|d7 }| j
dkrN||d  }g }x0t| j
D ]"}tt|t \}}|| qW x|D ]}	|	j| }
|
|	j }||
| }d}|dr&dd l}t|}|jd d|d}| }W d Q R X ~d	}t|d
}| j t||	j|	j| qW d S )Nr   z9Unknown SVG table version '%s'. Decompiling as version 0.z>H   Fs   r)fileobjTutf_8)docListr   unpackSVG_format_0SVG_format_0SizeversionlogwarningoffsetToSVGDocIndexstruct
numEntriesrangeZunpack2doc_index_entry_format_0DocumentIndexEntryappendsvgDocOffsetsvgDocLength
startswithgzipr   GzipFilereadr   SVGDocumentstartGlyphID
endGlyphID)selfdatattFontposZsubTableStartZdata2entriesiZdocIndexEntryentrystartenddoc
compressedr$   bytesIOZ	gunzipper r6   O/var/www/html/venv/lib/python3.7/site-packages/fontTools/ttLib/tables/S_V_G_.py	decompile8   s:    






ztable_S_V_G_.decompilec          
   C   s  d}t }g }g }t| j}td|}|| t|t|  }i }	t| dd}
xt| jD ]\}}t	|t
tfrt| }|| j|< t|jdd}|
s|jr|dsdd l}t }|jd d|dd	}|| W d Q R X | }t|t|k r|}~~t|}||	kr|	| }n|}||7 }||	|< || td
|j|j||}|| q^W || t|}d}td|||}||g}t|}|S )Nr   z>Hr4   Fr   )encodings   w)r   mtimez>HHLLz>HLL)r   lenr   r   packr    doc_index_entry_format_0Sizegetattr	enumerate
isinstancelisttupler'   r   r+   r4   r#   r$   r   r%   writegetvaluer(   r)   extendr   )r*   r,   r   r   r   Z	entryListr   ZdatumZ	curOffsetZseenDocsZallCompressedr/   r3   ZdocBytesr$   r5   ZgzipperZgzippedZ	docLengthZ	docOffsetr0   Z
svgDocDatareservedheaderr+   r6   r6   r7   compile]   sP    






ztable_S_V_G_.compilec             C   s   xt | jD ]~\}}t|ttfr4t| }|| j|< |j|jd}|jrPd|d< |j	d| |
  ||j |
  |d |
  qW d S )N)r(   r)   r   r4   svgDoc)rJ   )r@   r   rA   rB   rC   r'   r(   r)   r4   ZbegintagnewlineZ
writecdatar+   Zendtag)r*   writerr,   r/   r3   attrsr6   r6   r7   toXML   s    

ztable_S_V_G_.toXMLc       	      C   s~   |dkrlt | dsg | _t|}| }t|d }t|d }tt|dd}| jt	|||| nt
d|| d S )NrJ   r   r(   r)   r4   0zUnknown %s %s)hasattrr   r   stripintboolr   getr    r'   r   r   )	r*   namerM   contentr,   r3   ZstartGIDZendGIDr4   r6   r6   r7   fromXML   s    
ztable_S_V_G_.fromXMLN)__name__
__module____qualname__r8   rI   rN   rW   r6   r6   r6   r7   r   6   s   %/r   c               @   s   e Zd Zdd Zdd ZdS )r   c             C   s   d | _ d | _d | _d | _d S )N)r(   r)   r!   r"   )r*   r6   r6   r7   __init__   s    zDocumentIndexEntry.__init__c             C   s   d| j | j| j| jf S )NzDstartGlyphID: %s, endGlyphID: %s, svgDocOffset: %s, svgDocLength: %s)r(   r)   r!   r"   )r*   r6   r6   r7   __repr__   s    zDocumentIndexEntry.__repr__N)rX   rY   rZ   r[   r\   r6   r6   r6   r7   r      s   r   c               @   sB   e Zd ZU eed< eed< eed< dZeed< dd Zdd	 Z	d
S )r'   r+   r(   r)   Fr4   c             C   s   t | d d | S )N   )r   )r*   indexr6   r6   r7   __getitem__   s    zSVGDocument.__getitem__c             C   s   dS )Nr]   r6   )r*   r6   r6   r7   __len__   s    zSVGDocument.__len__N)
rX   rY   rZ   str__annotations__rR   r4   rS   r_   r`   r6   r6   r6   r7   r'      s   
r'   ) __doc__ZfontTools.misc.textToolsr   r   r   r   r   ZfontTools.miscr    r	   collections.abcr
   dataclassesr   r   ior   r   logging	getLoggerrX   r   r   calcsizer   r   r>   r   objectr   r'   r6   r6   r6   r7   <module>   s"   


s