
    ]Mh$                       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 	 d dlmZ n# e$ r dZY nw xY wd dlmZ d dlmZ d d	lmZ d
gZ ej        d          ZdddZded          dZ ed          d             Zd6dZd7dZ d8dZ!d9d#Z"d:d'Z#d;d+Z$d<d-Z%d=d/Z&d>d3Z' e ej(        d4                    d?d5            Z)dS )@    )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                8    t          j        | t                    S )N)
namespaces)r   XPath
NAMESPACES)paths    T/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/fontTools/subset/svg.pyxpathr   !   s     ;t
3333    treeetree.ElementreturnDict[str, etree.Element]c                F    d  t          d          |           D             S )Nc                *    i | ]}|j         d          |S )id)attrib).0els     r   
<dictcomp>z(group_elements_by_id.<locals>.<dictcomp>+   s     FFFBBIdORFFFr   z//svg:*[@id])r   )r   s    r   group_elements_by_idr*   '   s,     GF*?%*?*?*E*EFFFFr   
style_attrstrDict[str, str]c                @   i }|                      d          D ]}|                    d          dk    rD|                     d          \  }}|                                }|                                ||<   _|                                rt          d|           |S )N;:   z Invalid CSS declaration syntax: )splitr   strip
ValueError)r+   resultdeclarationproperty_namevalues        r   parse_css_declarationsr9   .   s     F!'',, O OS!!Q&&#.#4#4S#9#9 M5)//11M$)KKMMF=!!   	OMMMNNN	OMr   Iterator[str]c              #    K   t          d          }t          | g ||                     D ]}t          |          }||V  |j        }d|v r+i t	          |          t          |j        d                   }dD ]J}||v rD||         }|                    d          r'|                    d          r|dd         }|sJ |V  Kd 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&   dictr9   
startswithendswith)r   !find_svg_elements_with_referencesr(   ref_idattrsattrr8   s          r   iter_referenced_idsrI   <   s     
 ).	) )% TF==dCCDD ! !"2&&LLL	eQtE{{Q&<RYw=O&P&PQE) 	! 	!Du}}d##G,, !1D1D !"1R4[F!MMM LLL	!! !r   elementselement_idsSet[str]Nonec                    |}|r`t                      }|D ]/}|| vr|                    t          | |                              0||z  }|                    |           |}|^d S d S N)setupdaterI   )rJ   rK   	unvisited
referencedel_ids        r   closure_element_idsrU   Z   s    
 I
 	"uu
 	D 	DEH$$1(5/BBCCCCk!
:&&&	  	 	 	 	 	r   r(   retained_idsboolc                    | j                             d          v rdS t          fd| D                       rdS t          |           dk    sJ |                                 }||                    |            dS )Nr%   Tc                0    g | ]}t          |          S  )subset_elements)r'   erV   s     r   
<listcomp>z#subset_elements.<locals>.<listcomp>v   s#    999OA|,,999r   r   F)r&   getanylen	getparentremove)r(   rV   parents    ` r   r[   r[   l   s     
y}}Tl**t 9999b999:: tr77a<<<<\\^^Fb5r   r   glyph_index_mapDict[int, int]c                   t          |           }i }|                                D ]\  }}t                              |          }|s"t	          |                    d                    }|                    |          }|||k    rbd| }	n0d| }	t          d          }
|	|v r|	 dt          |
           }	|	|v |	||<   |	|j	        d<   |S )Nr1   glyph.r%   )
r*   itemsGID_REmatchintgroupr^   r   nextr&   )r   rd   rJ   id_maprT   r(   m	old_index	new_indexnew_idns              r   remap_glyph_idsru      s    
 $C((HF^^%% ! !	rLL 	

OO	#''	22	 I%%(Y((FF
 ![[FaAH$$"..T!WW.. H$$ u 	$Mr   Optional[str]c                    t           | j        v rD| j        t                    }|                    d          rt          |          dk    r
|dd          S d S )N#r1   )
XLINK_HREFr&   rC   r`   )r(   hrefs     r   rA   rA      sO    RYy$??3 	CIIMM8O4r   ro   c                     t          d          |           D ]3}t          |          }|J ||v r||         }d| |j        t          <   4d S )Nz,.//svg:*[starts-with(@xlink:href, '#glyph')]rx   )r   rA   r&   ry   )r   ro   r(   old_idrs   s        r   update_glyph_href_linksr}      sn    CeBCCCHH 1 1"2&&!!!VF^F$0LLBIj!1 1r   intsIterable[int]Iterator[Tuple[int, int]]c              #     K   t          t          t          |                               }	 t          |          x}}n# t          $ r Y d S w xY w|D ]}|dz
  |k    r|}||fV  |x}}||fV  d S )Nr1   )itersortedrP   rn   StopIteration)r~   sorted_intsstartendvs        r   rangesr      s      vc$ii(())K;'''     q5C<<CC#,OECC#,s   ? 
AAzSVG c           
        t           t          d          |j        |j        |j        g }| j        D ]}fdt          |j        |j        dz             D             	                    |j
                  }|sGt          j        |j                            d          t          j        ddd                    }t          |          }fd	|D             }d
 |D             }t!          ||           t#          ||          s|j        j        s t)          |          }	t+          ||	           t          j        ||j        j                                      d          }
fd|D             }t3          |          D ]/\  }}|                    t7          |
|||j                             0|| _        t;          | j                  S )Nz.No module named 'lxml', required to subset SVGc                     h | ]
}|         S rZ   rZ   )r'   iglyph_orders     r   	<setcomp>z subset_glyphs.<locals>.<setcomp>   s*     
 
 
 KN
 
 
r   r1   zutf-8TF)	huge_treeremove_blank_textresolve_entities)parserc                     h | ]
}|         S rZ   rZ   )r'   grev_orig_glyph_maps     r   r   z subset_glyphs.<locals>.<setcomp>   s    666!"1%666r   c                    h | ]}d | S )rg   rZ   )r'   r   s     r   r   z subset_glyphs.<locals>.<setcomp>   s    111q{q{{111r   )pretty_printc              3  (   K   | ]}|         V  d S rO   rZ   )r'   r   rd   s     r   	<genexpr>z subset_glyphs.<locals>.<genexpr>   s(      551OA&555555r   )r   ImportErrororig_glyph_orderreverseOrigGlyphMaprd   docListrangestartGlyphID
endGlyphIDintersectionglyphs
fromstringdataencode	XMLParserr*   rU   r[   optionsretain_gidsru   r}   tostring
pretty_svgdecoder   appendr   
compressedrW   )selfsnew_docsdocr   r   rJ   gidsrK   ro   new_docnew_gidsr   r   rd   r   r   s                 @@@r   r   r      s"   }JKKK /K)*)>&'&7O"$H| +N +N
 
 
 
$)#*:CNQ<N$O$O
 
 

,qx
 
  	  	 HOOG$$?
  #' "'  	
 
 
& (,,6666v66611D111Hk222sK00 	y$ 	1$S/::F#C000.193GHHHOOPWXX5555555 ** 	N 	NJE3OOKS^LLMMMM	N DLr   )r   r    r!   r"   )r+   r,   r!   r-   )r   r    r!   r:   )rJ   r"   rK   rL   r!   rM   )r(   r    rV   rL   r!   rW   )r   r    rd   re   r!   r-   )r(   r    r!   rv   )r   r    ro   r-   r!   rM   )r~   r   r!   r   )r!   rW   )*
__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__compilerj   r   ry   r   r*   r9   rI   rU   r[   ru   rA   r}   r   getTableClassr   rZ   r   r   <module>r      se   " " " " " " 				       " " " " " " " " G G G G G G G G G G G G G G G G G G    EEE
       - - - - - - 5 5 5 5 5 5 
 
O	$	$ (+ 
 .*W%---
 44 4 4
G G G G   ! ! ! !<   $   &   @   1 1 1 1      U (()); ; ; *); ; ;s   3 ==