"""Point d'entrée UNIQUE de revalidation des attributs d'un élément par kind — utilisé à la fois à l'ÉCRITURE (routes/document/ document_element_update.py) ET à la LECTURE (routes/document/ document_edit.py, routes/document/document_render.py). Sans ce second usage en lecture, des attributs stockés dans un schéma devenu obsolète (ex. le mini-jeu Scénario, passé d'une liste plate à un arbre de décision) atteindraient le panneau Propriétés côté client TELS QUELS, qui suppose la forme ACTUELLE — bug réel constaté le 21/09/2026 : un élément Scénario créé avant la refonte en arbre faisait planter silencieusement le panneau Propriétés (`scenario.nodes` inexistant sur l'ancienne forme), sans qu'aucun message n'indique pourquoi.""" from typing import Any from .association_config import sanitize_association_config from .memory_config import sanitize_memory_config from .mots_config import sanitize_mots_config from .quiz_config import sanitize_quiz_config from .scenario_config import sanitize_scenario_config _SANITIZERS = { "quiz": sanitize_quiz_config, "association": sanitize_association_config, "memory": sanitize_memory_config, "mots": sanitize_mots_config, "scenario": sanitize_scenario_config, } def sanitize_element_attributes(kind: str, attributes: Any) -> Any: """Revalide `attributes` selon `kind`, UNIQUEMENT pour les kinds à structure garantie (les 5 mini-jeux ci-dessus, voir `_SANITIZERS`) — les autres kinds (texte/forme/image/bouton/rangée) sont de simples valeurs scalaires sans structure à garantir, renvoyés TELS QUELS (jamais sanitizés : ce ne sont pas leur responsabilité ici).""" sanitizer = _SANITIZERS.get(kind) return sanitizer(attributes) if sanitizer else attributes