
    OgF                       d dl mZ d dlZd dlmZmZmZmZ d dlZd dl	Z	d dl
Z
d dlZd dlmZ d dlmZmZ ddlmZ ddlmZmZ  ej*                  d	      Zd
ZdZdZej4                  j7                  dd      Zde dgZg dZddgZeeeeeeiZ g dZ!dZ" G d de      Z#ddddZ$ G d d      Z%d-dZ&d.dZ'h d Z(h d!Z) e       Z*g d"Z+g d#Z, G d$ d%e-      Z. G d& d'e-      Z/ G d( d)      Z0d/d*Z1d0d+Z2d0d,Z3y)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                  "    e Zd ZU ded<   ded<   y)
CacheEntryr   	file_pathr   	font_faceN)__name__
__module____qualname____annotations__     ]/var/www/html/public_html/myphp/venv/lib/python3.12/site-packages/ezdxf/fonts/font_manager.pyr   r   :   s    Or   r   zDejaVu SerifzDejaVu SanszDejaVu Sans Mono)serif
sans-serif	monospacec                      e Zd ZddZddZddZddZd ZddZe	dd       Z
ddZdd	Zdd
Z	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 ddZddZddZdddZy)	FontCachec                "    t               | _        y N)dict_cacheselfs    r   __init__zFontCache.__init__G   s     .2Vr   c                <    | j                  |      | j                  v S r&   )keyr(   r*   	font_names     r   __contains__zFontCache.__contains__L   s    xx	"dkk11r   c                >    | j                   | j                  |         S r&   r(   r-   )r*   items     r   __getitem__zFontCache.__getitem__O   s    {{488D>**r   c                @    || j                   | j                  |      <   y r&   r2   )r*   r3   entrys      r   __setitem__zFontCache.__setitem__R   s    &+DHHTN#r   c                ,    t        | j                        S r&   )lenr(   r)   s    r   __len__zFontCache.__len__U   s    4;;r   c                8    | j                   j                          y r&   )r(   clearr)   s    r   r<   zFontCache.clearX   s    r   c                4    t        |       j                         S r&   )strlower)r/   s    r   r-   zFontCache.key[   s    9~##%%r   c                h    t        ||      | j                  | j                  |j                        <   y r&   )r   r(   r-   name)r*   	font_pathr   s      r   	add_entryzFontCache.add_entry_   s$    0:9i0PDHHY^^,-r   c                    	 | j                   | j                  |         S # t        $ r< | j                   j                  | j                  |            }||cY S t	        d      w xY w)Nz+no fonts available, not even fallback fonts)r(   r-   KeyErrorgetFontNotFoundError)r*   r/   fallbackr6   s       r   rF   zFontCache.getb   sc    	W;;txx	233 	WKKOODHHX$67E '(UVV	Ws     7A%A%c                   | j                   j                  | j                  |j                        d       }|r|j                  S | j                  |j                  |j                  |j                  |j                  |j                        S )N)familystyleweightwidthitalic)r(   rF   r-   filenamer   find_best_match_exrJ   rK   rL   rM   	is_italic)r*   r   r6   s      r   find_best_matchzFontCache.find_best_matchl   ss    );); <dC??"&&##//##//&& ' 
 	
r   c                   t         j                  ||      }t        || j                  j	                               }t        |      dk(  ry t        |      dk(  r|d   j                  S t        ||      }t        |      dk(  r|d   j                  S t        |      r|}t        |fd      }|d   j                  S )Nr   r   c                    t        | j                  j                  z
        | j                  j                  ut        | j                  j                  z
        fS r&   )absr   rL   rQ   rM   )erN   rL   rM   s    r   <lambda>z.FontCache.find_best_match_ex.<locals>.<lambda>   sJ    AKK&&/0%%V3AKK%%-. r   )r-   )	GENERIC_FONT_FAMILYrF   filter_familyr(   valuesr9   r   filter_stylesorted)	r*   rJ   rK   rL   rM   rN   entriesentries_results	      ```   r   rP   zFontCache.find_best_match_exx   s     %((8(:(:(<=w<1\Q1:'''w/x=AA;(((]G 
 ay"""r   c                   t               }	 t        j                  |      }	 |d   }|d   }|t        k(  re|D ]X  }	 |\  }}}}	}
t        |      }t        |j                  |||	|
      }t        ||      || j                  |j                        <   Z || _        y t	        d      # t        j                  $ r t	        d      w xY w# t
        $ r t	        d      w xY w# t        $ r t	        d      w xY w)Nzinvalid JSON file formatversion
font-faceszinvalid cache file format)rO   rJ   rK   rL   rM   zinvalid cache file version)r'   jsonloadsJSONDecodeErrorIOErrorrE   CURRENT_CACHE_VERSION
ValueErrorr   r   rA   r   r-   r(   )r*   scachecontentra   r6   r   rJ   rK   rL   rM   pathr   s                r   rd   zFontCache.loads   s   '+v	6jjmG	7i(Gl+G ++  I?>C;Ivufe I$!YY!!	 .8i-Hdhhtyy)*I   677/ ## 	6455	6
  	7566	7 " ?!"=>>?s!   B% 
C C%CCC4c                j   | j                   j                         D cg c]l  }t        |j                        |j                  j
                  |j                  j                  |j                  j                  |j                  j                  fn }}t        |d}t        j                  |d      S c c}w )N)ra   rb   r   )indent)r(   rZ   r>   r   r   rJ   rK   rL   rM   rg   rc   dumps)r*   r6   facesdatas       r   ro   zFontCache.dumps   s     ++-	
  EOO$&&%%&&%%	
 	
 1Fzz$q))	
s   A1B0c                   | j                   j                         D ]  }t        |j                          |s|j                  j                  j                         }|j                  }|dv rt        d|j                   d       k|dk(  rt        d|j                   d       t        d|j                   d       t        d|j                          t        d|j                          t        d	|j                   d
|j                          t        d|j                   d
|j                           t        dt        | j                          d       y )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(   rZ   printr   suffixr?   r   rO   rJ   rK   rL   
weight_strrM   	width_strr9   )r*   verboser6   	font_typeffs        r   print_available_fontsz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   NreturnNoner/   r>   r   bool)r3   r>   r   r   )r3   r>   r6   r   r   r   )r/   r>   r   r>   )rB   r   r   r   r   r   )r/   r>   rH   r>   r   r   )r   r   r   Optional[FontFace]r!   Regular     F)rJ   r>   rK   r>   rL   intrM   r   rN   Optional[bool]r   r   ri   r>   r   r   r   r>   F)r   r   r   r+   r0   r4   r7   r:   r<   staticmethodr-   rC   rF   rR   rP   rd   ro   r~   r   r   r   r$   r$   F   s    4
2+,  & &QW

 #!&## # 	#
 # # 
#B<*3r   r$   c                    t        |       j                         }|D cg c]8  }|j                  j                  j                         j	                  |      s7|: c}S c c}w r&   )r>   r?   r   rJ   
startswith)rJ   r]   r-   rV   s       r   rY   rY      sH    
f+


CM!!++"4"4":":"<"G"G"LAMMMs   8AAc                    t        |       j                         }|D cg c]+  }||j                  j                  j                         v s*|- c}S c c}w r&   )r>   r?   r   rK   )rK   r]   r-   rV   s       r   r[   r[      sB    
e*


CC!#):):)@)@)B"BACCCs   +A
A>   .otf.ttc.ttf>   rv   rt   rs   )ztxt.shxztxt.shpziso.shxziso.shp)zstandard.lffziso.lffzsimplex.lffc                      e Zd Zy)rG   Nr   r   r   r   r   r   rG   rG          r   rG   c                      e Zd Zy)UnsupportedFontNr   r   r   r   r   r      r   r   r   c                      e Zd ZddZdddZddZddZddZddZddZ	dddZ
dd	Zdd
ZddZddZ	 	 	 	 	 d 	 	 	 	 	 	 	 d!dZd"dZd#d$dZd%d&dZd'dZd(dZddZd)dZy)*FontManagerc                    t        j                         | _         t               | _        t	               | _        t	               | _        t	               | _        t	               | _        d| _	        d| _
        d| _        y 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+   zFontManager.__init__   s[     )&/k;?648FPTPV,CG6%#% $&!r   c                <    | j                   j                  |       y )N)r{   )r   r~   )r*   r{   s     r   r~   z!FontManager.print_available_fonts  s    ..w.?r   c                    || j                   v S r&   )r   r.   s     r   has_fontzFontManager.has_font  s    D,,,,r   c                d    t               | _        | j                  j                          d| _        y r   )r$   r   r   r<   r   r)   s    r   r<   zFontManager.clear  s&    $;$$&#% r   c                    | j                   }|r|S t        d   }t        D ]6  }	 | j                  j                  ||      }|j                  j
                  } n || _         |S # t        $ r Y Mw xY w)Nr   )r   DEFAULT_FONTSr   rF   r   rA   rG   )r*   fallback_namerA   cache_entrys       r   fallback_font_namezFontManager.fallback_font_name  s    00  %a(! 	D"..224G + 5 5 : :		 $1  % s   2A""	A.-A.c                l    | j                   }|r|S t        D ]  }|| j                  v s|| _         |c S  yr   )r   FALLBACK_SHAPE_FILESr   )r*   fallback_shape_filerA   s      r   fallback_shapefilezFontManager.fallback_shapefile  sF    "77&&( 	Dt''',0)	 r   c                l    | j                   }|r|S t        D ]  }|| j                  v s|| _        |c S  yr   )r   r   r   r   )r*   fallback_lffrA   s      r   r   zFontManager.fallback_lff&  sE    ))( 	Dt''',0)	 r   c                r   	 | j                   |   S # t        $ r Y nw xY w| j                         }	 t        | j                  j                  ||      j                  |      }nE# t        $ r}t        t        |            d }~wt        $ r}t        t        |            d }~ww xY w|| j                   |<   |S )N
fontNumber)r   rE   r   r	   r   rF   r   rf   rG   r>   r
   )r*   r/   font_numberr   fontrV   s         r   get_ttf_fontzFontManager.get_ttf_font1  s    	)))44 		//1	,  $$Y>HH&D  	,#CF++ 	,#CF++	,,0y)s/    	1A# #	B%,B  B%B  B%c                ^    | j                  t        |j                        j                        S r&   )r   r   rO   rA   r*   r   s     r   ttf_font_from_font_facez#FontManager.ttf_font_from_font_faceC  s$      i&8&8!9!>!>??r   c           	        	 | j                   |   S # t        $ r Y nw xY w| j                         }	 | j                  j	                  ||      j
                  }n# t        $ r t        d| d      w xY w	 t        j                  t        |            }nL# t        $ r t        d| d      t        j                  $ r}t        d| dt        |             d }~ww xY wt        j                  |      }|| j                   |<   |S )Nzshape font '' not foundzshape file 'zunsupported font'': )r   rE   r   r   rF   r   rG   r   readfiler>   rf   UnsupportedShapeFiler   
GlyphCache)r*   r/   r   r   filerV   glyph_caches          r   get_shapefile_glyph_cachez%FontManager.get_shapefile_glyph_cacheF  s   	77	BB 		//1	K((,,YFPPI 	K#l9+[$IJJ	K	N%%c)n5D 	K#l9+[$IJJ-- 	N!$5i[CF8"LMM	N**40:E,,Y7s/    	&A A15B *C>CCc                   	 | j                   |   S # t        $ r Y nw xY w| j                         }	 | j                  j	                  ||      j
                  }n# t        $ r t        d| d      w xY w	 t        j                  |      j                  d      }t        j                  |      }n# t        $ r t        d| d      w xY wt        j                  |      }|| j                   |<   |S )NzLibreCAD font 'r   utf8)encodingzLibreCAD font file ')r   rE   r   r   rF   r   rG   pathlibr   	read_textr   rd   rf   r   )r*   r/   r   r   ri   r   r   s          r   get_lff_glyph_cachez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nnT*3>%%i0s#    	&A A15:B0 0C	c                n    | j                   j                  || j                               }|j                  S r&   )r   rF   r   r   )r*   r/   r   s      r   get_font_facezFontManager.get_font_facem  s/    &&**9d6M6M6OP$$$r   c                    t        |||||f      }	 | j                  |   S # t        $ r Y nw xY w| j                  j	                  |||||      }|| j                  |<   |S r&   )hashr   rE   r   rP   )r*   rJ   rK   rL   rM   rN   r-   r   s           r   rR   zFontManager.find_best_matchq  sz     FE65&9:	$$S)) 		$$77E65&
	 "+#s   ! 	--c                    | j                   j                  |      }|+| j                  | j                               }|j                  S |j                  S )zuReturns the font file name of the font without parent directories
        e.g. "LiberationSans-Regular.ttf".
        )r   rR   r   r   rO   r   s     r   find_font_namezFontManager.find_font_name  sQ     $$44Y?	**4+B+B+DEI%%%%%%r   Nc                    ddl m} |rt        |      }n$t        j	                  | j
                  t              }|r|t        |j                        z   }| j                  |       y)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_DIRECTORIESrF   r   LINUX_FONT_DIRSsupport_dirsscan_all)r*   foldersr   r   dirss        r   buildzFontManager.build  sM     	+=D#''GD$w3344Ddr   c                    | j                   }|j                         D ]  \  }}||vr||v r||   }|||<    |r6| j                  |j                         D ci c]  \  }}||
 c}}d       y y c c}}w )NF)reverse)r   itemsadd_synonyms)	r*   synonymsr   
font_cacher/   synonymr   kvs	            r   r   zFontManager.add_synonyms  s    %%
"*.."2 	.Iw
**$$Y/K"-Jw	. 0@A1q!tA5Q As   A2
c                    |D ]?  }|j                  d      }|s	 | j                  t        |      j                                A y # t        $ r}t        t        |             Y d }~ed }~ww xY w)Nz'")stripscan_folderr   
expanduserPermissionErrorrw   r>   )r*   r   folderrV   s       r   r   zFontManager.scan_all  se     	F\\%(F  f!8!8!:;	 # c!fs   (A	A-A((A-c           
        |j                         sy |j                         D ]  }|j                         r| j                  |       %|j                  j                         }|t        v r)	 t        |      }| j                  j                  ||       p|t        v syt        |      }| j                  j                  ||        y # t        $ r.}t        j                  d| dt        |              Y d }~d }~ww xY w)Nzcannot open font 'r   )existsiterdiris_dirr   rx   r?   SUPPORTED_TTF_TYPESget_ttf_font_facer   rC   	Exceptionloggerwarningr>   SUPPORTED_SHAPE_FILESget_shape_file_font_face)r*   r   r   extr   rV   s         r   r   zFontManager.scan_folder  s    }}NN$ 	<D{{}  &++##%C))@ 1$ 7I $$..tY?--4T:	  **4;	< ! KNN%7vSQ#IJJKs   *C	C<$C77C<c                6    | j                   j                         S r&   )r   ro   r)   s    r   ro   zFontManager.dumps  s    %%''r   c                :    | j                   j                  |       y r&   )r   rd   )r*   ri   s     r   rd   zFontManager.loads  s    q!r   r   r   r   r   )r   )r/   r>   r   r   r   r	   )r   r   r   r	   )r/   r>   r   zshapefile.GlyphCache)r/   r>   r   zlff.GlyphCache)r/   r>   r   r   r   )rJ   r>   rK   r>   rN   r   r   r   )r   r   r   r>   )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<   r   r   r   r   r   r   r   r   rR   r   r   r   r   r   ro   rd   r   r   r   r   r      s    	 @-&
		$@(&% #!&   
&	&(
R	<&("r   r   c                    | dv rd} | S )N>   Bookr   r   )rK   s    r   normalize_styler     s    Lr   c                .   t        | d      }|d   j                  }d}d}|D ]z  }|j                  dk(  r*|j                  j	                  |j                               }n8|j                  dk(  r)|j                  j	                  |j                               }|sw|sz n 	 |d   }|j                  }|j                  }t        | j                  |t        |      ||      S # t        $ r* t        j                  d| j                   d	       d
}d}Y Uw xY w)zThe caller should catch ALL exception (see scan_folder function above) - strange
    things can happen when reading TTF files.
    r   r   rA   r   r   r   zOS/2z cannot load OS/2 table of font 'ru   r   r   rO   rJ   rK   rM   rL   )r	   namesnameIDstringdecodegetEncodingusWeightClassusWidthClassr   r   inforA   r   r   )	rB   ttfr  rJ   rK   record	os2_tablerL   rM   s	            r   r   r     s    q
)CKEFE ==A]]))&*<*<*>?F]]aMM((););)=>Ee'K	 ((&&e$   6y~~6FaHIs   !C! !0DDc                    | j                   j                         }d}|dk(  rd}|dk(  rd}t        | j                  | j                  j                         | j                   j                         |d      S )Nr   rt      rv      r   r  )rx   r?   r   rA   stem)rB   r   rM   s      r   r   r     sq    



 
 
"C
 E
f}
f}~~##%$$& r   )rJ   r>   r]   Iterable[CacheEntry]r   list[CacheEntry])rK   r>   r]   r  r   r  )rK   r>   r   r>   )rB   r   r   r   )4
__future__r   r   typingr   r   r   r   osr   rc   loggingr   fontTools.ttLibr	   r
   r   r   r   r   r   	getLoggerr   WINDOWSLINUXMACOSenvironrF   WIN_SYSTEM_ROOTWIN_FONT_DIRSr   MACOS_FONT_DIRSr   r   rg   r   rX   r$   rY   r[   r   r   NO_FONT_FACEr   FALLBACK_LFFr   rG   r   r   r   r   r   r   r   r   <module>r#     sD   #  ; ; 	     .  			7	#
 **..|< .v
 
 ]	?	?     # P3 P3fN
D / 0 zC 9		 		i 	\" \"~Dr   