B
    Jd#                 @  s  d dl mZ d dlZd dlmZ d dlmZmZ d dlm	Z	m
Z
mZmZmZmZmZ yd dlmZ W n ek
r|   dZY nX d dlmZ d dlmZ d d	lmZ d
gZedZdddZded  dZedddd ZdddddZdddddZ dddd d!Z!dd"d#d$d%d&Z"dd"d'd(d)d*Z#dd+dd,d-d.Z$dd/d0d1d2Z%ddd#d3d4d5Z&d6d7d8d9d:Z'ee(d;d'd<d=d
Z)dS )>    )annotationsN)	lru_cache)chaincount)DictIterableIteratorListOptionalSetTuple)etree)ttLib)_add_method)SVGDocumentsubset_glyphsz^glyph(\d+)$zhttp://www.w3.org/2000/svgzhttp://www.w3.org/1999/xlink)svgxlink{r   z}href)maxsizec             C  s   t j| tdS )N)
namespaces)r   ZXPath
NAMESPACES)path r   F/var/www/html/venv/lib/python3.7/site-packages/fontTools/subset/svg.pyxpath!   s    r   zetree.ElementzDict[str, etree.Element])treereturnc             C  s   dd t d| D S )Nc             S  s   i | ]}||j d  qS )id)attrib).0elr   r   r   
<dictcomp>+   s    z(group_elements_by_id.<locals>.<dictcomp>z//svg:*[@id])r   )r   r   r   r   group_elements_by_id'   s    r#   strzDict[str, str])
style_attrr   c             C  sd   i }xZ|  dD ]L}|ddkrF| d\}}| }| ||< q| rtd| qW |S )N;:   z Invalid CSS declaration syntax: )splitr   strip
ValueError)r%   resultZdeclarationZproperty_namevaluer   r   r   parse_css_declarations.   s    r.   zIterator[str]c             c  s   t d}xt| g|| D ]}t|}|d k	r4|V  |j}d|krT|t|jd }xJdD ]B}||krZ|| }|drZ|drZ|dd }|st|V  qZW qW d S )Nz.//svg:*[ starts-with(@xlink:href, '#') or starts-with(@fill, 'url(#') or starts-with(@clip-path, 'url(#') or contains(@style, ':url(#') ]style)fillz	clip-pathzurl(#)   )r   r   href_local_targetr   r.   
startswithendswithAssertionError)r   Z!find_svg_elements_with_referencesr!   Zref_idattrsattrr-   r   r   r   iter_referenced_ids<   s     
r:   zSet[str]None)elementselement_idsr   c             C  sX   |}xN|rRt  }x(|D ] }|| kr$q|t| |  qW ||8 }|| |}qW d S )N)setupdater:   )r<   r=   Z	unvisitedZ
referencedel_idr   r   r   closure_element_idsZ   s    

rA   bool)r!   retained_idsr   c               s\   | j d krdS t fdd| D r.dS t| dks>t|  }|d k	rX||  dS )Nr   Tc               s   g | ]}t | qS r   )subset_elements)r    e)rC   r   r   
<listcomp>v   s    z#subset_elements.<locals>.<listcomp>r   F)r   getanylenr7   Z	getparentremove)r!   rC   parentr   )rC   r   rD   l   s    
rD   zDict[int, int])r   glyph_index_mapr   c             C  s   t | }i }x| D ]\}}t|}|s.qt|d}||}|d k	rd||krXqd| }	n2d| }	td}
x|	|kr|	 dt|
 }	qxW |	||< |	|j	d< qW |S )Nr(   glyph.r   )
r#   itemsGID_REmatchintgrouprG   r   nextr   )r   rL   r<   id_mapr@   r!   mZ	old_indexZ	new_indexnew_idnr   r   r   remap_glyph_ids   s&    



rY   zOptional[str])r!   r   c             C  s:   t | jkr6| jt  }|dr6t|dkr6|dd  S d S )N#r(   )
XLINK_HREFr   r5   rI   )r!   hrefr   r   r   r4      s
    

r4   )r   rU   r   c             C  sN   xHt d| D ]8}t|}|d k	s&t||kr|| }d| |jt< qW d S )Nz,.//svg:*[starts-with(@xlink:href, '#glyph')]rZ   )r   r4   r7   r   r[   )r   rU   r!   Zold_idrW   r   r   r   update_glyph_href_links   s    r]   zIterable[int]zIterator[Tuple[int, int]])intsr   c             c  sv   t tt| }yt| }}W n tk
r4   d S X x0|D ](}|d |krR|}q<||fV  | }}q<W ||fV  d S )Nr(   )itersortedr>   rT   StopIteration)r^   Zsorted_intsstartendvr   r   r   ranges   s    

re   zSVG )r   c          	     sJ  t d krtd|j|j|j g }x| jD ]}fddt|j|jd D 	|j
}|sdq0t j|jdt jdddd}t|}fd	d|D }d
d |D }t|| t||sq0|jjst| }	t||	 t j||jjdd}
 fdd|D }x,t|D ] \}}|t|
|||j qW q0W || _t| jS )Nz.No module named 'lxml', required to subset SVGc               s   h | ]} | qS r   r   )r    i)glyph_orderr   r   	<setcomp>   s   z subset_glyphs.<locals>.<setcomp>r(   zutf-8T)Z	huge_treeZremove_blank_text)parserc               s   h | ]} | qS r   r   )r    g)rev_orig_glyph_mapr   r   rh      s    c             S  s   h | ]}d | qS )rM   r   )r    rf   r   r   r   rh      s    )Zpretty_printc             3  s   | ]} | V  qd S )Nr   )r    rf   )rL   r   r   	<genexpr>   s    z subset_glyphs.<locals>.<genexpr>)r   ImportErrorZorig_glyph_orderZreverseOrigGlyphMaprL   ZdocListrangeZstartGlyphIDZ
endGlyphIDintersectionglyphs
fromstringdataencodeZ	XMLParserr#   rA   rD   optionsZretain_gidsrY   r]   tostringZ
pretty_svgdecodere   appendr   
compressedrB   )selfsZnew_docsdocrp   r   r<   Zgidsr=   rU   Znew_docZnew_gidsrb   rc   r   )rL   rg   rk   r   r      s@    





 )*
__future__r   re	functoolsr   	itertoolsr   r   typingr   r   r   r	   r
   r   r   Zlxmlr   rm   Z	fontToolsr   ZfontTools.subset.utilr   ZfontTools.ttLib.tables.S_V_G_r   __all__compilerP   r   r[   r   r#   r.   r:   rA   rD   rY   r4   r]   re   ZgetTableClassr   r   r   r   r   <module>   s6   $

 
