La normalisation des matières (NFKC + espaces + ponctuation + minuscules) est désormais dans pronote_sync/utils/text.py pour permettre son partage entre sources/theoretical/file.py et sync/diff.py (M8) sans couplage de couche. L'import depuis file.py est préservé par ré-export explicite. Co-authored-by: opencode/coder <coder@agents.invalid>
33 lines
1.2 KiB
Python
33 lines
1.2 KiB
Python
"""Utilitaires de normalisation et de traitement du texte.
|
|
|
|
Ce module centralise les transformations de texte partagées par plusieurs
|
|
couches du pipeline ``pronote-sync`` (sources, synchronisation) afin que les
|
|
modules de logique de domaine ne dépendent pas d'adaptateurs concrets.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import re
|
|
import unicodedata
|
|
|
|
__all__ = ["normalize_subject"]
|
|
|
|
|
|
def normalize_subject(subject: str) -> str:
|
|
"""Normalise une matière pour le matching déterministe.
|
|
|
|
Applique la normalisation Unicode NFKC, unifie les espaces (y compris
|
|
tabulations et espaces insécables), supprime la ponctuation et met la
|
|
chaîne en minuscules. Deux représentations visuellement identiques d'une
|
|
même matière produisent ainsi la même forme normalisée.
|
|
|
|
:param subject: La matière brute.
|
|
:return: La forme normalisée (NFKC, espaces unifiés, sans ponctuation, minuscule).
|
|
:rtype: str
|
|
"""
|
|
normalized = unicodedata.normalize("NFKC", subject)
|
|
normalized = re.sub(r"\s+", " ", normalized).strip()
|
|
normalized = re.sub(r"[^\w\s]", "", normalized)
|
|
normalized = re.sub(r"\s+", " ", normalized).strip()
|
|
return normalized.lower()
|