Spaces:
Running
on
Zero
Running
on
Zero
import os | |
import random | |
from typing import Optional | |
class Font: | |
def __init__(self, fonts_dir: str, max_size: int = 66): | |
""" | |
Initialize the Font class with a directory containing font files. | |
Args: | |
fonts_dir (str): Path to the directory containing font files. | |
max_size (int): Maximum font size to use for fitting text. | |
""" | |
self.fonts_dir = fonts_dir | |
self.font_name = None # Default font | |
self.set_random_font() | |
self.max_size = max_size | |
def set_font(self, font_name: str = "Tahoma") -> None: | |
""" | |
Set the font name to be used. | |
Args: | |
font_name (str): Name of the font to set (default is "Tahoma"). | |
""" | |
if self._find_font(font_name): | |
self.font_name = font_name | |
else: | |
raise ValueError(f"Font '{font_name}' not found in '{self.fonts_dir}'.") | |
def set_random_font(self) -> None: | |
""" | |
Set a random font from the fonts directory. The chosen font must have both | |
basic and bold styles available. | |
""" | |
available_fonts = self._find_available_fonts() | |
if not available_fonts: | |
raise ValueError("No fonts with both basic and bold styles found.") | |
self.font_name = random.choice(available_fonts) | |
def basic(self) -> Optional[str]: | |
""" | |
Get the path of the basic font style based on the current font name. | |
Returns: | |
Optional[str]: The full path to the basic font style or None if not found. | |
""" | |
return self._find_font(f'{self.font_name}') | |
def bold(self) -> Optional[str]: | |
""" | |
Get the path of the bold font style based on the current font name. | |
Returns: | |
Optional[str]: The full path to the bold font style or None if not found. | |
""" | |
return self._find_font(f'{self.font_name}Bd') | |
def italic(self) -> Optional[str]: | |
""" | |
Get the path of the italic font style based on the current font name. | |
Returns: | |
Optional[str]: The full path to the italic font style or None if not found. | |
""" | |
return self._find_font(f'{self.font_name}It') | |
def italic_bold(self) -> Optional[str]: | |
""" | |
Get the path of the italic bold font style based on the current font name. | |
Returns: | |
Optional[str]: The full path to the italic bold | |
font style or None if not found. | |
""" | |
return self._find_font(f'{self.font_name}BdIt') | |
def _find_font(self, font_name: str) -> Optional[str]: | |
""" | |
Find a font file in the fonts directory by font name. | |
Args: | |
font_name (str): The font name to find. | |
Returns: | |
Optional[str]: The full path to the font file if found, None otherwise. | |
""" | |
if not font_name.endswith(".ttf"): | |
font_name = f'{font_name}.ttf' | |
for filename in os.listdir(self.fonts_dir): | |
if font_name == filename: | |
file_path = os.path.join(self.fonts_dir, filename) | |
return file_path | |
return None | |
def _find_available_fonts(self) -> list: | |
""" | |
Find all available fonts in the fonts directory | |
that have both basic and bold styles. | |
Returns: | |
list: A list of font names (without file extension) | |
that have both basic and bold styles. | |
""" | |
fonts = set() | |
for filename in os.listdir(self.fonts_dir): | |
if filename.endswith(".ttf"): | |
font_name = filename[:-4] # Remove the .ttf extension | |
if font_name.endswith("Bd"): | |
basic_font = font_name[:-2] | |
if os.path.exists(os.path.join(self.fonts_dir, f"{basic_font}.ttf")): | |
fonts.add(basic_font) | |
else: | |
bold_font = f"{font_name}Bd" | |
if os.path.exists(os.path.join(self.fonts_dir, f"{bold_font}.ttf")): | |
fonts.add(font_name) | |
return list(fonts) |