o
    l^Uf$                     @  sR  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 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dAddZ dBd!d"Z!dCd'd(Z"dDd,d-Z#dEd1d2Z$dFd4d5Z%dGd7d8Z&dHd<d=Z'ee(d>dId?d
Z)dS )J    )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)Z
namespaces)r   ZXPath
NAMESPACES)path r   4lib/python3.10/site-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   r0   Iterator[str]c                 c  s    t d}t| g|| D ]E}t|}|d ur|V  |j}d|v r.i t|t|jd }dD ]!}||v rQ|| }|drQ|drQ|dd }|sNJ |V  q0q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    dictr0   
startswithendswith)r   Z!find_svg_elements_with_referencesr"   Zref_idattrsattrr/   r   r   r   iter_referenced_ids<   s*   r<   elementselement_idsSet[str]Nonec                 C  sV   |}|r)t  }|D ]}|| vrq	|t| |  q	||8 }|| |}|sd S d S N)setupdater<   )r=   r>   Z	unvisitedZ
referencedel_idr   r   r   closure_element_idsZ   s   
rE   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rF   r   r   
<listcomp>v       z#subset_elements.<locals>.<listcomp>r   F)r    getanylenZ	getparentremove)r"   rF   parentr   rJ   r   rH   l   s   
rH   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grouprM   r   nextr    )r   rR   r=   id_maprD   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    r8   rO   )r"   Zhrefr   r   r   r6      s
   

r6   r\   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')]rb   )r   r6   r    rc   )r   r\   r"   Zold_idr^   r   r   r   update_glyph_href_links   s   rd   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sortedrB   r[   StopIteration)re   Zsorted_intsstartendvr   r   r   ranges   s   

rn   zSVG 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d	}t|}fd
d|D }dd |D }t|| t||s_q|jjsmt| }	t||	 t j||jjdd}
 fdd|D }t|D ]\}}|t|
|||j qq|| _t| jS )Nz.No module named 'lxml', required to subset SVGc                      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_textZresolve_entities)parserc                   ro   r   r   )r!   g)rev_orig_glyph_mapr   r   rs      s    c                 S  s   h | ]}d | qS )rT   r   rp   r   r   r   rs      rL   )Zpretty_printc                 3  s    | ]} | V  qd S rA   r   rp   )rR   r   r   	<genexpr>   s    z subset_glyphs.<locals>.<genexpr>)r   ImportErrorZorig_glyph_orderZreverseOrigGlyphMaprR   ZdocListrangeZstartGlyphIDZ
endGlyphIDintersectionglyphsZ
fromstringdataencodeZ	XMLParserr$   rE   rH   optionsZretain_gidsr`   rd   ZtostringZ
pretty_svgdecodern   appendr   
compressedrG   )selfsZnew_docsdocr{   r   r=   Zgidsr>   r\   Znew_docZnew_gidsrk   rl   r   )rR   rr   rv   r   r      sL   







)r   r   r   r   )r%   r&   r   r'   )r   r   r   r1   )r=   r   r>   r?   r   r@   )r"   r   rF   r?   r   rG   )r   r   rR   rS   r   r'   )r"   r   r   ra   )r   r   r\   r'   r   r@   )re   rf   r   rg   )r   rG   )*Z
__future__r   re	functoolsr   	itertoolsr   r   typingr   r   r   r	   r
   r   r   Zlxmlr   rx   Z	fontToolsr   ZfontTools.subset.utilr   ZfontTools.ttLib.tables.S_V_G_r   __all__compilerW   r   rc   r   r$   r0   r<   rE   rH   r`   r6   rd   rn   ZgetTableClassr   r   r   r   r   <module>   s@    $








 


