a
    w=ic#                     @  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yz   dZY n0 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   e/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/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>+       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 ur2|V  |j}d|v rVi |t|jd }dD ]B}||v rZ|| }|drZ|drZ|dd }|sJ |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   r/   
startswithendswith)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 ] }|| v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 v rdS t fdd| D r.dS t| dks>J |  }|d urX||  dS )Nr   Tc                   s   g | ]}t | qS r   )subset_elements)r    erD   r   r   
<listcomp>v   r#   z#subset_elements.<locals>.<listcomp>r   F)r   getanylenZ	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 urb||krVqd| }	n.d| }	td}
|	|v 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v r6| jt  }|dr6t|dkr6|dd  S d S )N#r)   )
XLINK_HREFr   r6   rK   )r!   hrefr   r   r   r5      s
    

r5   )r   rW   r   c                 C  sJ   t d| D ]8}t|}|d us$J ||v r|| }d| |jt< qd S )Nz,.//svg:*[starts-with(@xlink:href, '#glyph')]r\   )r   r5   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  sr   t tt| }zt| }}W n ty4   Y d S 0 |D ](}|d |krP|}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 u 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      r#   c                 S  s   h | ]}d | qS )rO   r   rh   r   r   r   rk      r#   )Zpretty_printc                 3  s   | ]} | V  qd S r>   r   rh   )rN   r   r   	<genexpr>   r#   z subset_glyphs.<locals>.<genexpr>)r   ImportErrorZorig_glyph_orderZreverseOrigGlyphMaprN   ZdocListrangeZstartGlyphIDZ
endGlyphIDintersectionglyphsZ
fromstringdataencodeZ	XMLParserr$   rB   rE   optionsZretain_gidsr[   r_   ZtostringZ
pretty_svgdecoderg   appendr   
compressedrC   )selfsZnew_docsdocrs   r   r<   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   Z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[   r5   r_   rg   ZgetTableClassr   r   r   r   r   <module>   s<   $


 
