U
    6c#                     @  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 z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   8/tmp/pip-unpacked-wheel-n2hbwplv/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  s`   i }|  dD ]L}|ddkrD| d\}}| }| ||< q| rtd| q|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}t| g|| D ]}t|}|d k	r2|V  |j}d|krR|t|jd }dD ]B}||krV|| }|drV|drV|dd }|st|V  qVq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  sP   |}|rLt  }|D ] }|| kr q|t| |  q||8 }|| |}qd S N)setupdater:   )r<   r=   Z	unvisitedZ
referencedel_idr   r   r   closure_element_idsZ   s    
rB   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rD   r   r   
<listcomp>v   s     z#subset_elements.<locals>.<listcomp>r   F)r   getanylenr7   Z	getparentremove)r!   rD   parentr   rG   r   rE   l   s    
rE   zDict[int, int])r   glyph_index_mapr   c                 C  s   t | }i }| D ]\}}t|}|s,qt|d}||}|d k	rb||krVqd| }	n.d| }	td}
|	|kr|	 dt|
 }	qt|	||< |	|j	d< q|S )Nr(   glyph.r   )
r#   itemsGID_REmatchintgrouprI   r   nextr   )r   rN   r<   id_maprA   r!   mZ	old_indexZ	new_indexnew_idnr   r   r   remap_glyph_ids   s&    


r[   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   rK   )r!   hrefr   r   r   r4      s
    

r4   )r   rW   r   c                 C  sJ   t d| D ]8}t|}|d k	s$t||kr|| }d| |jt< qd S )Nz,.//svg:*[starts-with(@xlink:href, '#glyph')]r\   )r   r4   r7   r   r]   )r   rW   r!   Zold_idrY   r   r   r   update_glyph_href_links   s    r_   zIterable[int]zIterator[Tuple[int, int]])intsr   c                 c  st   t tt| }zt| }}W n tk
r6   Y d S X |D ](}|d |krR|}q<||fV  | }}q<||fV  d S )Nr(   )itersortedr?   rV   StopIteration)r`   Zsorted_intsstartendvr   r   r   ranges   s    

rg   zSVG )r   c              	     s@  t d krtd|j|j|j g }| jD ] }fddt|j|jd D 	|j
}|s`q,t j|jdt jdddd}t|}fd	d|D }d
d |D }t|| t||sq,|jjst| }	t||	 t j||jjdd}
 fdd|D }t|D ] \}}|t|
|||j qq,|| _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   rk      s     c                 S  s   h | ]}d | qS )rO   r   rh   r   r   r   rk      s     )Zpretty_printc                 3  s   | ]} | V  qd S r>   r   rh   )rN   r   r   	<genexpr>   s     z subset_glyphs.<locals>.<genexpr>)r   ImportErrorZorig_glyph_orderZreverseOrigGlyphMaprN   ZdocListrangeZstartGlyphIDZ
endGlyphIDintersectionglyphs
fromstringdataencode	XMLParserr#   rB   rE   optionsZretain_gidsr[   r_   tostringZ
pretty_svgdecoderg   appendr   
compressedrC   )selfsZnew_docsdocrs   r   r<   Zgidsr=   rW   Znew_docZnew_gidsrd   re   r   )rN   rj   rn   r   r      sH    





)*
__future__r   re	functoolsr   	itertoolsr   r   typingr   r   r   r	   r
   r   r   lxmlr   rp   Z	fontToolsr   ZfontTools.subset.utilr   ZfontTools.ttLib.tables.S_V_G_r   __all__compilerR   r   r]   r   r#   r.   r:   rB   rE   r[   r4   r_   rg   ZgetTableClassr   r   r   r   r   <module>   s<   $


 
