a
    ׶a"                     @  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	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.d/d0d1Z#ddd"d2d3d4Z$d5d6d7d8d9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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   d/Users/vegardjervell/Documents/master/model/venv/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_ids8   s"    r9   zSet[str]None)elementselement_idsr   c                 C  sP   |}|rLt  }|D ] }|| vr q|t| |  q||8 }|| |}qd S N)setupdater9   )r;   r<   Z	unvisitedZ
referencedel_idr   r   r   closure_element_idsV   s    
rA   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rC   r   r   
<listcomp>r   r"   z#subset_elements.<locals>.<listcomp>r   F)r   getanylenZ	getparentremove)r    rC   parentr   rF   r   rD   h   s    
rD   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grouprH   r   nextr   )r   rM   r;   id_mapr@   r    mZ	old_indexZ	new_indexnew_idnr   r   r   remap_glyph_ids{   s&    


rZ   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   r5   rJ   )r    hrefr   r   r   r4      s
    

r4   )r   rV   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   r4   r   r\   )r   rV   r    Zold_idrX   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>   rU   StopIteration)r_   Zsorted_intsstartendvr   r   r   ranges   s    

rf   zSVG )r   c                   s8  t d u rtd|j|j|j g }| jD ]\}}}fddt||d D |j}|s`q,t 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 ]\}}||||f 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>   r"   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   rj      r"   c                 S  s   h | ]}d | qS )rN   r   rg   r   r   r   rj      r"   )Zpretty_printc                 3  s   | ]} | V  qd S r=   r   rg   )rM   r   r   	<genexpr>   r"   z subset_glyphs.<locals>.<genexpr>)r   ModuleNotFoundErrorZorig_glyph_orderZreverseOrigGlyphMaprM   ZdocListrangeintersectionglyphs
fromstringencode	XMLParserr#   rA   rD   optionsZretain_gidsrZ   r^   tostringZ
pretty_svgdecoderf   appendrB   )selfsZnew_docsdocrc   rd   rr   r   r;   gidsr<   rV   Znew_docZnew_gidsr   )rM   ri   rm   r   r      s@    $



)(
__future__r   re	functoolsr   	itertoolsr   r   typingr   r   r   r	   r
   r   r   lxmlr   ro   Z	fontToolsr   ZfontTools.subset.utilr   __all__compilerQ   r   r\   r   r#   r.   r9   rA   rD   rZ   r4   r^   rf   ZgetTableClassr   r   r   r   r   <module>   s:   $


 
