U
    Dvf$                     @  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-qlge9rch/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rVt|t|jd }dD ]B}||krZ|| }|drZ|drZ|dd }|st|V  qZq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   dictr.   
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    
rC   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rE   r   r   
<listcomp>v   s     z#subset_elements.<locals>.<listcomp>r   F)r   getanylenr8   Z	getparentremove)r!   rE   parentr   rH   r   rF   l   s    
rF   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grouprJ   r   nextr   )r   rO   r=   id_maprB   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   r6   rL   )r!   hrefr   r   r   r4      s
    

r4   )r   rX   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   r8   r   r^   )r   rX   r!   Zold_idrZ   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@   rW   StopIteration)ra   Zsorted_intsstartendvr   r   r   ranges   s    

rh   zSVG )r   c              	     sB  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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-8TF)Z	huge_treeZremove_blank_textresolve_entities)parserc                   s   h | ]} | qS r   r   )r    g)rev_orig_glyph_mapr   r   rl      s     c                 S  s   h | ]}d | qS )rP   r   ri   r   r   r   rl      s     )Zpretty_printc                 3  s   | ]} | V  qd S r?   r   ri   )rO   r   r   	<genexpr>   s     z subset_glyphs.<locals>.<genexpr>)r   ImportErrorZorig_glyph_orderZreverseOrigGlyphMaprO   ZdocListrangeZstartGlyphIDZ
endGlyphIDintersectionglyphs
fromstringdataencode	XMLParserr#   rC   rF   optionsZretain_gidsr\   r`   tostringZ
pretty_svgdecoderh   appendr   
compressedrD   )selfsZnew_docsdocru   r   r=   Zgidsr>   rX   Znew_docZnew_gidsre   rf   r   )rO   rk   rp   r   r      sJ    





)*
__future__r   re	functoolsr   	itertoolsr   r   typingr   r   r   r	   r
   r   r   lxmlr   rr   Z	fontToolsr   ZfontTools.subset.utilr   ZfontTools.ttLib.tables.S_V_G_r   __all__compilerS   r   r^   r   r#   r.   r;   rC   rF   r\   r4   r`   rh   ZgetTableClassr   r   r   r   r   <module>   s<   $


 
