"""Petits utilitaires partages (slug, noms de fichiers surs).""" from __future__ import annotations import re import unicodedata _SLUG_STRIP = re.compile(r"[^a-z0-9]+") _FS_UNSAFE = re.compile(r'[<>:"/\\|?*\x00-\x1f]') def slugify(text: str) -> str: """Slug ascii minuscule, utilise pour les identifiants de dossiers internes.""" norm = unicodedata.normalize("NFKD", text) norm = norm.encode("ascii", "ignore").decode("ascii").lower() return _SLUG_STRIP.sub("-", norm).strip("-") or "livre" def safe_filename(name: str) -> str: """Nettoie un nom de fichier en conservant les accents (sortie utilisateur).""" name = _FS_UNSAFE.sub("", name).strip() name = re.sub(r"\s+", " ", name) return name or "sans-titre"