o
    nĎiQ$                     @  sL  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 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)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}hrefc                 C  s   t j| tdS )N)
namespaces)r   XPath
NAMESPACES)path r   P/home/jeff/fluffinator/venv/lib/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&   resultdeclarationproperty_namevaluer   r   r   parse_css_declarations-   s   r3   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(#') ]style)fillz	clip-pathzurl(#)   )r   r   href_local_targetr!   dictr3   
startswithendswith)r   !find_svg_elements_with_referencesr#   ref_idattrsattrr2   r   r   r   iter_referenced_ids;   s*   rB   elementselement_idsSet[str]Nonec                 C  sV   |}|r)t  }|D ]}|| vrq	|t| |  q	||8 }|| |}|sd S d S N)setupdaterB   )rC   rD   	unvisited
referencedel_idr   r   r   closure_element_idsY   s   
rM   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rN   r   r   
<listcomp>u       z#subset_elements.<locals>.<listcomp>r   F)r!   getanylen	getparentremove)r#   rN   parentr   rR   r   rP   k   s   
rP   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grouprU   r   nextr!   )r   r[   rC   id_maprL   r#   m	old_index	new_indexnew_idnr   r   r   remap_glyph_ids~   s(   


rk   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!   r<   rW   )r#   hrefr   r   r   r:      s
   

r:   re   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')]rm   )r   r:   r!   rn   )r   re   r#   old_idri   r   r   r   update_glyph_href_links   s   rq   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sortedrH   rd   StopIteration)rr   sorted_intsstartendvr   r   r   ranges   s   

r|   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)	huge_treeremove_blank_textresolve_entities)parserc                   r}   r   r   )r"   g)rev_orig_glyph_mapr   r   r      s    c                 S  s   h | ]}d | qS )r]   r   r~   r   r   r   r      rT   )pretty_printc                 3  s    | ]} | V  qd S rG   r   r~   )r[   r   r   	<genexpr>   s    z subset_glyphs.<locals>.<genexpr>)r   ImportErrororig_glyph_orderreverseOrigGlyphMapr[   docListrangestartGlyphID
endGlyphIDintersectionglyphs
fromstringdataencode	XMLParserr%   rM   rP   optionsretain_gidsrk   rq   tostring
pretty_svgdecoder|   appendr   
compressedrO   )selfsnew_docsdocr   r   rC   gidsrD   re   new_docnew_gidsry   rz   r   )r[   r   r   r   r      sL   







)r   r   r   r   )r&   r'   r   r(   )r   r   r   r4   )rC   r   rD   rE   r   rF   )r#   r   rN   rE   r   rO   )r   r   r[   r\   r   r(   )r#   r   r   rl   )r   r   re   r(   r   rF   )rr   rs   r   rt   )r   rO   )*
__future__r   re	functoolsr   	itertoolsr   r   typingr   r   r   r	   r
   r   r   lxmlr   r   	fontToolsr   fontTools.subset.utilr   fontTools.ttLib.tables.S_V_G_r   __all__compiler`   r   rn   r   r%   r3   rB   rM   rP   rk   r:   rq   r|   getTableClassr   r   r   r   r   <module>   s@    $








 


