"""Normalisation de texte partagée par l'import (accents, casse).""" import re import unicodedata _MULTI_UNDERSCORE = re.compile(r"_+") def normalize(value: str) -> str: """Minuscule, sans accents, espaces réduits.""" lowered = unicodedata.normalize("NFKD", (value or "").strip().lower()) stripped = "".join(c for c in lowered if not unicodedata.combining(c)) return " ".join(stripped.split()) def slug_code(value: str) -> str: """Code stable (MAJUSCULES, séparateurs en `_`) — utilisé pour les créneaux types (`DayPart.code`).""" base = normalize(value).upper() chars = [c if c.isalnum() else "_" for c in base] return _MULTI_UNDERSCORE.sub("_", "".join(chars)).strip("_")