from pathlib import Path from fontTools.ttLib import TTFont import logging from typing import Dict logger = logging.getLogger(__name__) class FontManager: FONT_MAPPING = { 'Gotham Black': 'Gotham-Black.otf', 'Montserrat': 'Montserrat-Black.ttf', 'Montserrat Bold': 'Montserrat-Bold.ttf', 'Montserrat Extra': 'Montserrat-ExtraBold.ttf', 'Urbanist Italic': 'Urbanist-Italic.ttf', 'Urbanist': 'Urbanist-Variable.ttf' } def __init__(self): self.font_dir = Path(__file__).parent.parent / "fonts" self.font_dir.mkdir(exist_ok=True) self.fonts_cache: Dict[str, str] = {} self.default_font = "Montserrat-Black.ttf" self._load_fonts() def _load_fonts(self): """Charge et valide toutes les polices disponibles""" for font_path in self.font_dir.glob("*.[ot]tf"): try: font = TTFont(font_path) font_name = font['name'].getName(4, 3, 1, 1033) if font_name: self.fonts_cache[font_path.name.lower()] = str(font_path) font.close() except Exception as e: logger.warning(f"Impossible de charger la police {font_path}: {e}") def get_font_path(self, font_name: str) -> str: """Retourne le chemin de la police demandée ou de la police par défaut""" if not font_name: return str(self.font_dir / self.default_font) # Chercher d'abord dans le mapping des noms mapped_name = self.FONT_MAPPING.get(font_name) if mapped_name: font_path = self.fonts_cache.get(mapped_name.lower()) if font_path: return font_path # Si pas trouvé, essayer avec le nom direct font_name = font_name.lower().replace(" ", "-") font_path = self.fonts_cache.get(f"{font_name}.ttf") or self.fonts_cache.get(f"{font_name}.otf") if not font_path: logger.warning(f"Police {font_name} non trouvée, utilisation de la police par défaut") return str(self.font_dir / self.default_font) return font_path