o
    a"                     @  sF  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y=   dZY nw 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Zd@ddZdAd d!ZdBd&d'Z dCd+d,Z!dDd0d1Z"dEd3d4Z#dFd6d7Z$dGd;d<Z%ee&d=dHd>d	Z'dS )I    )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)Z
namespaces)r   ZXPath
NAMESPACES)path r   6/usr/lib/python3/dist-packages/fontTools/subset/svg.pyxpath    s   r   treeetree.ElementreturnDict[str, etree.Element]c                 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#   
style_attrstrDict[str, str]c                 C  s`   i }|  dD ]&}|ddkr"| 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/   Iterator[str]c                 c  s    t d}t| g|| D ]C}t|}|d ur|V  |j}d|v r,i |t|jd }dD ]!}||v rO|| }|drO|drO|dd }|sLJ |V  q.qd S )Nz.//svg:*[ starts-with(@xlink:href, '#') or starts-with(@fill, 'url(#') or starts-with(@clip-path, 'url(#') or contains(@style, ':url(#') ]Zstyle)fillz	clip-pathzurl(#)   )r   r   href_local_targetr   r/   
startswithendswith)r   Z!find_svg_elements_with_referencesr!   Zref_idZattrsattrr.   r   r   r   iter_referenced_ids8   s*   r9   elementselement_idsSet[str]Nonec                 C  sV   |}|r)t  }|D ]}|| vrq	|t| |  q	||8 }|| |}|sd S d S N)setupdater9   )r:   r;   Z	unvisitedZ
referencedel_idr   r   r   closure_element_idsV   s   
rB   r!   retained_idsboolc                   s\   | j d v r
dS t fdd| D rdS t| dksJ |  }|d ur,||  dS )Nr   Tc                   s   g | ]}t | qS r   )subset_elements)r    erC   r   r   
<listcomp>r       z#subset_elements.<locals>.<listcomp>r   F)r   getanylenZ	getparentremove)r!   rC   parentr   rG   r   rE   h   s   
rE   r   glyph_index_mapDict[int, int]c                 C  s   t | }i }| D ]J\}}t|}|sq
t|d}||}|d ur1||kr+q
d| }	nd| }	td}
|	|v rK|	 dt|
 }	|	|v s>|	||< |	|j	d< q
|S )Nr)   glyph.r   )
r#   itemsGID_REmatchintgrouprJ   r   nextr   )r   rO   r:   id_maprA   r!   mZ	old_indexZ	new_indexnew_idnr   r   r   remap_glyph_ids{   s(   


r]   Optional[str]c                 C  s:   t | jv r| jt  }|drt|dkr|dd  S d S )N#r)   )
XLINK_HREFr   r6   rL   )r!   Zhrefr   r   r   r5      s
   

r5   rY   c                 C  sJ   t d| D ]}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   rY   r!   Zold_idr[   r   r   r   update_glyph_href_links   s   ra   intsIterable[int]Iterator[Tuple[int, int]]c                 c  st    t tt| }zt| }}W n
 ty   Y d S w |D ]}|d |kr)|}q||fV  | }}q||fV  d S )Nr)   )itersortedr?   rX   StopIteration)rb   Zsorted_intsstartendvr   r   r   ranges   s   

rk   zSVG c                   s6  t d u rtd|j|j|j g }| jD ]|\}}}fddt||d D |j}|s0qt j	|
dt jdddd}t|}fd	d|D }	d
d |	D }
t||
 t||
s^q|jjslt| }t|| t j||jjdd} fdd|	D }t|D ]\}}||||f qq|| _t| jS )Nz.No module named 'lxml', required to subset SVGc                      h | ]} | qS r   r   r    i)glyph_orderr   r   	<setcomp>       z subset_glyphs.<locals>.<setcomp>r)   zutf-8T)Z	huge_treeZremove_blank_text)parserc                   rl   r   r   )r    g)rev_orig_glyph_mapr   r   rp      rq   c                 S  s   h | ]}d | qS )rQ   r   rm   r   r   r   rp      rI   )Zpretty_printc                 3  s    | ]} | V  qd S r>   r   rm   )rO   r   r   	<genexpr>   s    z subset_glyphs.<locals>.<genexpr>)r   ModuleNotFoundErrorZorig_glyph_orderZreverseOrigGlyphMaprO   ZdocListrangeintersectionglyphsZ
fromstringencodeZ	XMLParserr#   rB   rE   optionsZretain_gidsr]   ra   ZtostringZ
pretty_svgdecoderk   appendrD   )selfsZnew_docsdocrh   ri   ry   r   r:   Zgidsr;   rY   Znew_docZnew_gidsr   )rO   ro   rt   r   r      sB   $




)r   r   r   r   )r$   r%   r   r&   )r   r   r   r0   )r:   r   r;   r<   r   r=   )r!   r   rC   r<   r   rD   )r   r   rO   rP   r   r&   )r!   r   r   r^   )r   r   rY   r&   r   r=   )rb   rc   r   rd   )r   rD   )(Z
__future__r   re	functoolsr   	itertoolsr   r   typingr   r   r   r	   r
   r   r   Zlxmlr   rv   Z	fontToolsr   ZfontTools.subset.utilr   __all__compilerT   r   r`   r   r#   r/   r9   rB   rE   r]   r5   ra   rk   ZgetTableClassr   r   r   r   r   <module>   s>    $








 


