o
    h$                     @  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)
namespaces)r   XPath
NAMESPACES)path r   h/var/www/html/construction_image-detection-poc/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   r4   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"   dictr4   
startswithendswith)r   !find_svg_elements_with_referencesr$   ref_idattrsattrr3   r   r   r   iter_referenced_ids<   s*   rC   elementselement_idsSet[str]Nonec                 C  sV   |}|r)t  }|D ]}|| vrq	|t| |  q	||8 }|| |}|sd S d S N)setupdaterC   )rD   rE   	unvisited
referencedel_idr   r   r   closure_element_idsZ   s   
rN   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rO   r   r   
<listcomp>v       z#subset_elements.<locals>.<listcomp>r   F)r"   getanylen	getparentremove)r$   rO   parentr   rS   r   rQ   l   s   
rQ   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grouprV   r   nextr"   )r   r\   rD   id_maprM   r$   m	old_index	new_indexnew_idnr   r   r   remap_glyph_ids   s(   


rl   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=   rX   )r$   hrefr   r   r   r;      s
   

r;   rf   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')]rn   )r   r;   r"   ro   )r   rf   r$   old_idrj   r   r   r   update_glyph_href_links   s   rr   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sortedrI   re   StopIteration)rs   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      rU   )pretty_printc                 3  s    | ]} | V  qd S rH   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&   rN   rQ   optionsretain_gidsrl   rr   tostring
pretty_svgdecoder}   appendr   
compressedrP   )selfsnew_docsdocr   r   rD   gidsrE   rf   new_docnew_gidsrz   r{   r   )r\   r   r   r   r      sL   







)r   r   r   r    )r'   r(   r   r)   )r   r   r   r5   )rD   r    rE   rF   r   rG   )r$   r   rO   rF   r   rP   )r   r   r\   r]   r   r)   )r$   r   r   rm   )r   r   rf   r)   r   rG   )rs   rt   r   ru   )r   rP   )*
__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__compilera   r   ro   r   r&   r4   rC   rN   rQ   rl   r;   rr   r}   getTableClassr   r   r   r   r   <module>   s@    $








 


