Ajoute 4 mécanismes moteur manquants pour le thème sécurité incendie : étiquette, carte, image SVG inline, bouton avec pièce jointe
Contenu et mécanisme uniquement, aucun style ajouté (voir consigne du 24/09/2026) : deux nouveaux kinds de contenu (badge/carte, rendu en div brutes sans CSS), un mode SVG inline pour l'image (svg_markup, nettoyé par un nouveau sanitizer allow-list avant chaque rendu) et un fichier téléchargeable joignable à un bouton (upload/download routes, stockage sous db.support_dir). Le futur système de templates portera l'habillage visuel de ces éléments. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
e7c6ed7159
commit
a34bcf4159
@@ -64,6 +64,17 @@ def _render_text(el: dict[str, Any], _children_by_parent: dict[int | None, list[
|
||||
|
||||
def _render_image(el: dict[str, Any], _children_by_parent: dict[int | None, list[dict[str, Any]]]) -> str:
|
||||
a = el["attributes"]
|
||||
svg_markup = str(a.get("svg_markup", "")).strip()
|
||||
if svg_markup:
|
||||
# Contenu vectoriel dessiné/collé par le créateur plutôt qu'un
|
||||
# fichier hébergé — prioritaire sur `src` (voir
|
||||
# element_kind_labels.element_default_attributes). Nettoyé à
|
||||
# CHAQUE rendu (jamais seulement à l'écriture) par sanitize_svg_markup,
|
||||
# même défense en profondeur que html.escape sur les autres kinds.
|
||||
from .sanitize_svg_markup import sanitize_svg_markup
|
||||
|
||||
sanitized = sanitize_svg_markup(svg_markup)
|
||||
return f'<div class="docImage" data-element-id="{el["id"]}" data-kind="image">{sanitized}</div>'
|
||||
src = html_lib.escape(str(a.get("src", "")))
|
||||
alt = html_lib.escape(str(a.get("alt", "")))
|
||||
if not src:
|
||||
@@ -93,9 +104,37 @@ def _render_button(el: dict[str, Any], _children_by_parent: dict[int | None, lis
|
||||
label = html_lib.escape(str(a.get("label", "Bouton")))
|
||||
target = html_lib.escape(str(a.get("target", "")))
|
||||
target_attr = f' data-target="{target}"' if target else ""
|
||||
# `data-attachment-filename` sert UNIQUEMENT de marqueur mécanique : un
|
||||
# fichier a bien été joint (voir routes/document/
|
||||
# document_element_upload_attachment.py). L'URL de téléchargement
|
||||
# elle-même n'est jamais construite ici (ce renderer ne connaît pas le
|
||||
# slug du support) — static/document/js/document-editor.js l'assemble
|
||||
# à partir de `data-element-id` + FORGE_DOCUMENT.slug, même principe
|
||||
# que le reste des appels AJAX de l'éditeur.
|
||||
attachment_filename = html_lib.escape(str(a.get("attachment_filename", "")))
|
||||
attachment_attr = f' data-attachment-filename="{attachment_filename}"' if attachment_filename else ""
|
||||
return (
|
||||
f'<button type="button" class="docButton" data-element-id="{el["id"]}" data-kind="bouton"{target_attr}>'
|
||||
f"{label}</button>"
|
||||
f'<button type="button" class="docButton" data-element-id="{el["id"]}" '
|
||||
f'data-kind="bouton"{target_attr}{attachment_attr}>{label}</button>'
|
||||
)
|
||||
|
||||
|
||||
def _render_badge(el: dict[str, Any], _children_by_parent: dict[int | None, list[dict[str, Any]]]) -> str:
|
||||
content = html_lib.escape(str(el["attributes"].get("content", "")))
|
||||
return f'<div class="docBadge" data-element-id="{el["id"]}" data-kind="badge">{content}</div>'
|
||||
|
||||
|
||||
def _render_carte(el: dict[str, Any], _children_by_parent: dict[int | None, list[dict[str, Any]]]) -> str:
|
||||
a = el["attributes"]
|
||||
label = html_lib.escape(str(a.get("label", "")))
|
||||
title = html_lib.escape(str(a.get("title", "")))
|
||||
description = html_lib.escape(str(a.get("description", "")))
|
||||
return (
|
||||
f'<div class="docCard" data-element-id="{el["id"]}" data-kind="carte">'
|
||||
f'<div class="docCardLabel">{label}</div>'
|
||||
f'<div class="docCardTitle">{title}</div>'
|
||||
f'<div class="docCardDescription">{description}</div>'
|
||||
f"</div>"
|
||||
)
|
||||
|
||||
|
||||
@@ -514,6 +553,8 @@ _RENDERERS = {
|
||||
"bouton": _render_button,
|
||||
"liste_puces": _render_list,
|
||||
"liste_numerotee": _render_list,
|
||||
"badge": _render_badge,
|
||||
"carte": _render_carte,
|
||||
"quiz": _render_quiz,
|
||||
"association": _render_association,
|
||||
"memory": _render_memory,
|
||||
|
||||
Reference in New Issue
Block a user