
    hG                        S SK Jr  S SKrS SKJrJrJrJr  S SKrS SK	r	S SK
r
S SKrS SKJr  S SKJrJr  SSKJr  SSKJrJr  \R*                  " S	5      rS
rSrSr\R4                  R7                  SS5      rS\ S3/r/ SQrSS/r\\\\\\0r / SQr!Sr" " S S\5      r#SSSS.r$ " S S5      r%S-S jr&S.S jr'1 S kr(1 S!kr)\" 5       r*/ S"Qr+/ S#Qr, " S$ S%\-5      r. " S& S'\-5      r/ " S( S)5      r0S/S* jr1S0S+ jr2S0S, jr3g)1    )annotationsN)Iterable
NamedTupleOptionalSequence)Path)TTFont
TTLibError   )FontFace)	shapefilelffezdxfWindowsLinuxDarwin
SystemRootz
C:/Windowsz'~/AppData/Local/Microsoft/Windows/Fontsz/Fonts)z/usr/share/fontsz/usr/local/share/fontsz~/.fontsz~/.local/share/fontsz~/.local/share/texmf/fontsz/Library/Fonts/z/System/Library/Fonts/)zArialUni.ttfzArial Unicode.ttfz	Arial.ttfzDejaVuSansCondensed.ttfzDejaVuSans.ttfzLiberationSans-Regular.ttfzOpenSans-Regular.ttf   c                  *    \ rS rSr% S\S'   S\S'   Srg)
CacheEntry7   r   	file_pathr   	font_face N)__name__
__module____qualname____firstlineno____annotations____static_attributes__r       J/var/www/html/env/lib/python3.13/site-packages/ezdxf/fonts/font_manager.pyr   r   7   s    Or!   r   zDejaVu SerifzDejaVu SanszDejaVu Sans Mono)serif
sans-serif	monospacec                      \ rS rSrSS jrSS jrSS jrSS jrS rSS jr	\
SS j5       rSS	 jrSS
 jrSS jr     S           SS jjrSS jrSS jrSSS jjrSrg)	FontCacheC   c                "    [        5       U l        g N)dict_cacheselfs    r"   __init__FontCache.__init__D   s     .2Vr!   c                >    U R                  U5      U R                  ;   $ r*   )keyr,   r.   	font_names     r"   __contains__FontCache.__contains__I   s    xx	"dkk11r!   c                >    U R                   U R                  U5         $ r*   r,   r2   )r.   items     r"   __getitem__FontCache.__getitem__L   s    {{488D>**r!   c                >    X R                   U R                  U5      '   g r*   r8   )r.   r9   entrys      r"   __setitem__FontCache.__setitem__O   s    &+DHHTN#r!   c                ,    [        U R                  5      $ r*   )lenr,   r-   s    r"   __len__FontCache.__len__R   s    4;;r!   c                8    U R                   R                  5         g r*   )r,   clearr-   s    r"   rE   FontCache.clearU   s    r!   c                4    [        U 5      R                  5       $ r*   )strlower)r4   s    r"   r2   FontCache.keyX   s    9~##%%r!   c                f    [        X5      U R                  U R                  UR                  5      '   g r*   )r   r,   r2   name)r.   	font_pathr   s      r"   	add_entryFontCache.add_entry\   s"    0:90PDHHY^^,-r!   c                     U R                   U R                  U5         $ ! [         a=    U R                   R                  U R                  U5      5      nUb  Us $ [	        S5      ef = f)Nz+no fonts available, not even fallback fonts)r,   r2   KeyErrorgetFontNotFoundError)r.   r4   fallbackr=   s       r"   rR   FontCache.get_   sc    	W;;txx	233 	WKKOODHHX$67E '(UVV	Ws     9A'A'c                   U R                   R                  U R                  UR                  5      S 5      nU(       a  UR                  $ U R                  UR                  UR                  UR                  UR                  UR                  S9$ )N)familystyleweightwidthitalic)r,   rR   r2   filenamer   find_best_match_exrW   rX   rY   rZ   	is_italic)r.   r   r=   s      r"   find_best_matchFontCache.find_best_matchi   ss    );); <dC??"&&##//##//&& ' 
 	
r!   c                  ^^^ [         R                  X5      n[        XR                  R	                  5       5      n[        U5      S:X  a  g [        U5      S:X  a  US   R                  $ [        X&5      n[        U5      S:X  a  US   R                  $ [        U5      (       a  Un[        UUUU4S jS9nUS   R                  $ )Nr   r   c                   > [        U R                  R                  T-
  5      U R                  R                  TL[        U R                  R                  T-
  5      4$ r*   )absr   rY   r^   rZ   )er[   rY   rZ   s    r"   <lambda>.FontCache.find_best_match_ex.<locals>.<lambda>   sH    AKK&&/0%%V3AKK%%-.r!   )r2   )	GENERIC_FONT_FAMILYrR   filter_familyr,   valuesrA   r   filter_stylesorted)	r.   rW   rX   rY   rZ   r[   entriesentries_results	      ```   r"   r]   FontCache.find_best_match_exu   s     %((8(:(:(<=w<1\Q1:'''/x=AA;(((]]G 
 ay"""r!   c           	        [        5       n [        R                  " U5      n US   nUS   nU[        :X  aY  U HR  n Uu  pgpn
[        U5      n[        UR                  UUU	U
S9n[        X5      X R                  UR                  5      '   MT     O[	        S5      eX l        g ! [        R                   a    [	        S5      ef = f! [
         a    [	        S5      ef = f! [         a    [	        S5      ef = f)Nzinvalid JSON file formatversion
font-faceszinvalid cache file format)r\   rW   rX   rY   rZ   zinvalid cache file version)r+   jsonloadsJSONDecodeErrorIOErrorrQ   CURRENT_CACHE_VERSION
ValueErrorr   r   rL   r   r2   r,   )r.   scachecontentrq   r=   r   rW   rX   rY   rZ   pathr   s                r"   rt   FontCache.loads   s   '+v	6jjmG	7i(Gl+G ++ ?>C;Iue I$!YY!!	 .8-Hhhtyy)* ! 6771 ## 	6455	6
  	7566	7 " ?!"=>>?s!   B" 
C C" CCC4c                l   U R                   R                  5        Vs/ s Hm  n[        UR                  5      UR                  R
                  UR                  R                  UR                  R                  UR                  R                  4PMo     nn[        US.n[        R                  " USS9$ s  snf )N)rq   rr   r   )indent)r,   ri   rH   r   r   rW   rX   rY   rZ   rw   rs   dumps)r.   r=   facesdatas       r"   r   FontCache.dumps   s     ++-	
 . EOO$&&%%&&%% . 	 	
 1Fzz$q))	
s   A4B1c                   U R                   R                  5        GH(  n[        UR                   5        U(       d  M#  UR                  R                  R                  5       nUR                  nUS;   a  [        SUR                   S35        Mt  US:X  a  [        SUR                   S35        M  [        SUR                   S35        [        SUR                   35        [        SUR                   35        [        S	UR                   S
UR                   35        [        SUR                   S
UR                   35        GM+     [        S[        U R                   5       S35        g )N).shx.shpz  Shape font file: ''.lffz  LibreCAD font file: 'z   TrueType/OpenType font file: 'z
  family: z	  style: z
  weight: z, z	  width: z
found z fonts)r,   ri   printr   suffixrI   r   r\   rW   rX   rY   
weight_strrZ   	width_strrA   )r.   verboser=   	font_typeffs        r"   print_available_fontsFontCache.print_available_fonts   s   [['')EU__%'..446IB,,,R[[M;<f$/}A>?8QGH
299+./	"((,-
299+R?@	"((2bll^<= *  	T[[)*&12r!   )r,   NreturnNoner4   rH   r   bool)r9   rH   r   r   )r9   rH   r=   r   r   r   )r4   rH   r   rH   )rM   r   r   r   r   r   )r4   rH   rT   rH   r   r   )r   r   r   Optional[FontFace]r$   Regular     F)rW   rH   rX   rH   rY   intrZ   r   r[   Optional[bool]r   r   ry   rH   r   r   r   rH   F)r   r   r   r   r/   r5   r:   r>   rB   rE   staticmethodr2   rN   rR   r_   r]   rt   r   r   r    r   r!   r"   r'   r'   C   s    4
2+,  & &QW

 #!&## # 	#
 # # 
#B<*3 3r!   r'   c                    [        U 5      R                  5       nU Vs/ s H>  o3R                  R                  R                  5       R	                  U5      (       d  M<  UPM@     sn$ s  snf r*   )rH   rI   r   rW   
startswith)rW   rl   r2   rd   s       r"   rh   rh      sJ    
f+


CMw!++"4"4":":"<"G"G"LAwMMMs   ;A&A&c                    [        U 5      R                  5       nU Vs/ s H.  o2UR                  R                  R                  5       ;   d  M,  UPM0     sn$ s  snf r*   )rH   rI   r   rX   )rX   rl   r2   rd   s       r"   rj   rj      sD    
e*


CCw!):):)@)@)B"BAwCCCs   +AA>   .otf.ttc.ttf>   r   r   r   )ztxt.shxztxt.shpziso.shxziso.shp)zstandard.lffziso.lffzsimplex.lffc                      \ rS rSrSrg)rS      r   Nr   r   r   r   r    r   r!   r"   rS   rS          r!   rS   c                      \ rS rSrSrg)UnsupportedFont   r   Nr   r   r!   r"   r   r      r   r!   r   c                     \ rS rSrSS jrSSS jjrSS jrSS jrSS jrSS jr	SS jr
SSS	 jjrSS
 jrSS jrS S jrS!S jr     S"       S#S jjrS$S jrS%S&S jjrS'S(S jjrS)S jrS*S jrSS jrS+S jrSrg),FontManager   c                    [         R                  " 5       U l         [        5       U l        [	        5       U l        [	        5       U l        [	        5       U l        [	        5       U l        SU l	        SU l
        SU l        g N )platformsystemr'   _font_cacher+   _match_cache_loaded_ttf_fonts_loaded_shape_file_glyph_caches_loaded_lff_glyph_caches_fallback_font_name_fallback_shape_file_fallback_lffr-   s    r"   r/   FontManager.__init__   s[     )&/k;?648FPTPV,CG6%#% $&!r!   c                6    U R                   R                  US9  g )N)r   )r   r   )r.   r   s     r"   r   !FontManager.print_available_fonts   s    ..w.?r!   c                    XR                   ;   $ r*   )r   r3   s     r"   has_fontFontManager.has_font  s    ,,,,r!   c                d    [        5       U l        U R                  R                  5         SU l        g r   )r'   r   r   rE   r   r-   s    r"   rE   FontManager.clear  s&    $;$$&#% r!   c                    U R                   nU(       a  U$ [        S   n[         H5  n U R                  R                  X!5      nUR                  R
                  n  O   Xl         U$ ! [         a     MN  f = f)Nr   )r   DEFAULT_FONTSr   rR   r   rL   rS   )r.   fallback_namerL   cache_entrys       r"   fallback_font_nameFontManager.fallback_font_name	  s{    00  %a(!D"..224G + 5 5 : :	 " $1  % s   1A&&
A43A4c                z    U R                   nU(       a  U$ [         H  nX R                  ;   d  M  X l         Us  $    gr   )r   FALLBACK_SHAPE_FILESr   )r.   fallback_shape_filerL   s      r"   fallback_shapefileFontManager.fallback_shapefile  s=    "77&&(D''',0) ) r!   c                z    U R                   nU(       a  U$ [         H  nX R                  ;   d  M  X l        Us  $    gr   )r   r   r   r   )r.   fallback_lffrL   s      r"   r   FontManager.fallback_lff#  s<    ))(D''',0) ) r!   c                n    U R                   U   $ ! [         a     Of = fU R                  5       n [        U R                  R                  X5      R                  US9nOG! [         a  n[        [        U5      5      eS nAf[         a  n[        [        U5      5      eS nAff = fX@R                   U'   U$ )N
fontNumber)r   rQ   r   r	   r   rR   r   rv   rS   rH   r
   )r.   r4   font_numberr   fontrd   s         r"   get_ttf_fontFontManager.get_ttf_font.  s    	)))44 		//1	,  $$Y>HH&D  	,#CF++ 	,#CF++	,,0y)s/    
-A   
B$*A>>B$BB$c                ^    U R                  [        UR                  5      R                  5      $ r*   )r   r   r\   rL   r.   r   s     r"   ttf_font_from_font_face#FontManager.ttf_font_from_font_face@  s$      i&8&8!9!>!>??r!   c           	     R    U R                   U   $ ! [         a     Of = fU R                  5       n U R                  R	                  X5      R
                  nO! [         a    [        SU S35      ef = f [        R                  " [        U5      5      nON! [         a    [        SU S35      e[        R                   a  n[        SU S[        U5       35      eS nAff = f [        R                  " U5      nO! [         a    [        SU S35      ef = fX`R                   U'   U$ )Nzshape font '' not foundzshape file 'zunsupported font '': #can't create glyph-cache for font ''.)r   rQ   r   r   rR   r   rS   r   readfilerH   rv   UnsupportedShapeFiler   
GlyphCache	Exception)r.   r4   r   r   filerd   glyph_caches          r"   get_shapefile_glyph_cache%FontManager.get_shapefile_glyph_cacheC  s<   	77	BB 		//1	K((,,YFPPI 	K#l9+[$IJJ	K	O%%c)n5D 	K#l9+[$IJJ-- 	O!$6ykSVH"MNN	O	W#..t4K 	W!$G	{RT"UVV	W:E,,Y7s;    
%A A26B ,C!CC!%C< <Dc                $    U R                   U   $ ! [         a     Of = fU R                  5       n U R                  R	                  X5      R
                  nO! [         a    [        SU S35      ef = f [        R                  " U5      R                  SS9n[        R                  " U5      nO! [         a    [        SU S35      ef = f [        R                  " U5      nO! [         a    [        SU S35      ef = fX`R                   U'   U$ )NzLibreCAD font 'r   utf8)encodingzLibreCAD font file 'r   r   )r   rQ   r   r   rR   r   rS   pathlibr   	read_textr   rt   rv   r   r   r   )r.   r4   r   r   ry   r   r   s          r"   get_lff_glyph_cacheFontManager.get_lff_glyph_cacheZ  s%   	00;; 		))+	N((,,YFPPI 	N#oi[$LMM	N	SY'1161BA99Q<D 	S#&:9+[$QRR	S	W...K 	W!$G	{RT"UVV	W 4?%%i0s/    
%A A269B0 0C
C% %C?c                l    U R                   R                  XR                  5       5      nUR                  $ r*   )r   rR   r   r   )r.   r4   r   s      r"   get_font_faceFontManager.get_font_faceq  s-    &&**96M6M6OP$$$r!   c                    [        XX4U45      n U R                  U   $ ! [         a     Of = fU R                  R	                  XX4U5      nXpR                  U'   U$ r*   )hashr   rQ   r   r]   )r.   rW   rX   rY   rZ   r[   r2   r   s           r"   r_   FontManager.find_best_matchu  sp     F6&9:	$$S)) 		$$776&
	 "+#s    
,,c                    U R                   R                  U5      nUc+  U R                  U R                  5       5      nUR                  $ UR                  $ )zeReturns the font file name of the font without parent directories
e.g. "LiberationSans-Regular.ttf".
)r   r_   r   r   r\   r   s     r"   find_font_nameFontManager.find_font_name  sQ     $$44Y?	**4+B+B+DEI%%%%%%r!   Nc                    SSK Jn  U(       a  [        U5      nO$[        R	                  U R
                  [        5      nU(       a  U[        UR                  5      -   nU R                  U5        g)a  Adds all supported font types located in the given `folders` to the font
manager. If no directories are specified, the known font folders for Windows,
Linux and macOS are searched by default, except `support_dirs` is ``False``.
Searches recursively all subdirectories.

The folders stored in the config SUPPORT_DIRS option are scanned recursively for
.shx, .shp and .lff fonts, the basic stroke fonts included in CAD applications.

r   )optionsN)	ezdxf._optionsr   listFONT_DIRECTORIESrR   r   LINUX_FONT_DIRSsupport_dirsscan_all)r.   foldersr  r   dirss        r"   buildFontManager.build  sM     	+=D#''GD$w3344Ddr!   c                    U R                   nUR                  5        H  u  pEXC;  a  M  XS;   a  M  X4   nXcU'   M     U(       a4  U R                  UR                  5        VVs0 s H  u  pxX_M	     snnSS9  g g s  snnf )NF)reverse)r   itemsadd_synonyms)	r.   synonymsr
  
font_cacher4   synonymr   kvs	            r"   r  FontManager.add_synonyms  s    %%
"*.."2I*$$/K"-w #3 0@A0@qt0@A5Q As   !A8
c                    U HF  nUR                  S5      nU(       d  M   U R                  [        U5      R                  5       5        MH     g ! [         a  n[        [        U5      5         S nAMo  S nAff = f)Nz'")stripscan_folderr   
expanduserPermissionErrorr   rH   )r.   r  folderrd   s       r"   r  FontManager.scan_all  s`    F\\%(F  f!8!8!:;  # c!fs   (A
A7A22A7c           
     $   UR                  5       (       d  g UR                  5        H  nUR                  5       (       a  U R                  U5        M+  UR                  R                  5       nU[        ;   a)   [        U5      nU R                  R                  X$5        Mx  U[        ;   d  M  [        U5      nU R                  R                  X$5        M     g ! [         a/  n[        R                  SU S[        U5       35         S nAM  S nAff = f)Nzcannot open font 'r   )existsiterdiris_dirr  r   rI   SUPPORTED_TTF_TYPESget_ttf_font_facer   rN   r   loggerwarningrH   SUPPORTED_SHAPE_FILESget_shape_file_font_face)r.   r  r   extr   rd   s         r"   r  FontManager.scan_folder  s    }}NN$D{{}}  &++##%C))@ 1$ 7I $$..t?--4T:	  **4; % ! KNN%7vSQ#IJJKs   7C
D $D

Dc                6    U R                   R                  5       $ r*   )r   r   r-   s    r"   r   FontManager.dumps  s    %%''r!   c                :    U R                   R                  U5        g r*   )r   rt   )r.   ry   s     r"   rt   FontManager.loads  s    q!r!   )	r   r   r   r   r   r   r   r   r   r   r   r   r   )r   )r4   rH   r   r   r   r	   )r   r   r   r	   )r4   rH   r   zshapefile.GlyphCache)r4   rH   r   zlff.GlyphCache)r4   rH   r   r   r   )rW   rH   rX   rH   r[   r   r   r   )r   r   r   rH   )NT)r  zOptional[Sequence[str]]r   r   )T)r  zdict[str, str]r   r   )r  zIterable[str]r   r   )r  r   r   )r   r   r   r   r/   r   r   rE   r   r   r   r   r   r   r   r   r_   r   r  r  r  r  r   rt   r    r   r!   r"   r   r      s    	 @-&
		$@..% #!&   
&	&(
R	<&("r!   r   c                    U S;   a  Sn U $ )N>   Bookr   r   )rX   s    r"   normalize_styler,    s    Lr!   c                B   [        U SS9nUS   R                  nSnSnU H  nUR                  S:X  a*  UR                  R	                  UR                  5       5      nO9UR                  S:X  a)  UR                  R	                  UR                  5       5      nU(       d  M  U(       d  M    O    US   nUR                  nUR                  n[        U R                  U[        U5      UUS9$ ! [         a*    [        R                  SU R                   S	35        S
nSn NSf = f)z{The caller should catch ALL exception (see scan_folder function above) - strange
things can happen when reading TTF files.
r   r   rL   r   r   r   zOS/2z cannot load OS/2 table of font 'r   r   r   r\   rW   rX   rZ   rY   )r	   namesnameIDstringdecodegetEncodingusWeightClassusWidthClassr   r   inforL   r   r,  )	rM   ttfr/  rW   rX   record	os2_tablerY   rZ   s	            r"   r  r    s    q
)CKEFE==A]]))&*<*<*>?F]]aMM((););)=>E6ee 'K	 ((&&e$   6y~~6FaHIs   -C* *1DDc                    U R                   R                  5       nSnUS:X  a  SnUS:X  a  Sn[        U R                  U R                  R                  5       U R                   R                  5       USS9$ )Nr   r      r      r   r.  )r   rI   r   rL   stem)rM   r$  rZ   s      r"   r#  r#     sq    



 
 
"C
 E
f}
f}~~##%$$& r!   )rW   rH   rl   Iterable[CacheEntry]r   list[CacheEntry])rX   rH   rl   r>  r   r?  )rX   rH   r   rH   )rM   r   r   r   )4
__future__r   r   typingr   r   r   r   osr   rs   loggingr   fontTools.ttLibr	   r
   r   r   r   r   r   	getLoggerr   WINDOWSLINUXMACOSenvironrR   WIN_SYSTEM_ROOTWIN_FONT_DIRSr  MACOS_FONT_DIRSr  r   rw   r   rg   r'   rh   rj   r  r"  NO_FONT_FACEr   FALLBACK_LFFr   rS   r   r   r,  r  r#  r   r!   r"   <module>rO     s>   #  ; ; 	     .  			7	#
 **..|< .v
 %&>?]	?	?     # P3 P3fN
D / 0 zC 9		 		i 	c" c"LDr!   