Valider a0b933f5 rédigé par tcharlss's avatar tcharlss Validation de marcimat
Parcourir les fichiers

Introduction d'une balise `#ALERTE` dédiée aux messages d'alerte de l’espace privé (#4727).

En remplacement des `<div class="notice">` et cie, ainsi que des `#BOITE_OUVRIR{'', notice}` et cie quand elles sont utilisées à mauvais escient, on ajoute une balise `#ALERTE` dédiée aux messages d’alertes.
Ces messages ont l’attribut `role="alert"` ou `status` selon l'importance du message.
Il y a toujours 4 types d’alertes possibles : `notice`, `error`, `success` et `info`.

On peut les utiliser de 2 façons :

* Pour les cas simples, quand il n'y a qu'une phrase et éventuellement un titre : `#ALERTE{message[,titre][,classes][,role][,id]}`
* Quand le texte est plus long, ça ne passe pas toujours au compilo : on peut alors utiliser des `#ALERTE_OUVRIR` et `#ALERTE_FERMER` sur le même principe que `#BOITE_OUVRIR` et `#BOITE_FERMER`, les 1ers paramètres étant identiques, la transition est facile.
parent d355f610
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+239 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
<?php

/***************************************************************************\
 *  SPIP, Système de publication pour l'internet                           *
 *                                                                         *
 *  Copyright © avec tendresse depuis 2001                                 *
 *  Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James  *
 *                                                                         *
 *  Ce programme est un logiciel libre distribué sous licence GNU/GPL.     *
 *  Pour plus de détails voir le fichier COPYING.txt ou l'aide en ligne.   *
\***************************************************************************/

/**
 * Ce fichier regroupe la gestion des filtres et balises générant
 * le HTML des messages d'alerte.
 *
 * @package SPIP\Core\Compilateur\Filtres
 **/

if (!defined('_ECRIRE_INC_VERSION')) {
	return;
}

/**
 * Compile la balise `#ALERTE` produisant le HTML d'un message d'alerte complet.
 *
 * @package SPIP\Core\Compilateur\Balises
 * @balise
 * @example
 *   ```
 *   #ALERTE{message[,titre][,classes][,role][,id]}
 *   [(#ALERTE{<:chaine_langue:>, <:chaine_langue:>, notice, status, mon_alerte})]
 *   ```
 *
 * @param Champ $p
 *     Pile au niveau de la balise
 * @return Champ
 *     Pile complétée par le code à générer
 */
function balise_ALERTE_dist($p) {
	$_texte = interprete_argument_balise(1, $p);
	$_titre = interprete_argument_balise(2, $p);
	$_class = interprete_argument_balise(3, $p);
	$_role  = interprete_argument_balise(4, $p);
	$_id    = interprete_argument_balise(5, $p);
	$_titre = ($_titre ? ", $_titre" : "''");
	$_class = ($_class ? ", $_class" : ", ''");
	$_role  = ($_role ? ", $_role" : ", ''");
	$_id    = ($_id ? ", $_id" : ", ''");

	$f = chercher_filtre('message_alerte');
	$p->code = "$f($_texte$_titre$_class$_role$_id)";
	$p->interdire_scripts = false;

	return $p;
}

/**
 * Compile la balise `#ALERTE_OUVRIR` produisant le HTML ouvrant d'un message d’alerte
 *
 * Doit être suivie du texte de l'alerte, puis de la balise `#ALERTE_FERMER`.
 *
 * @package SPIP\Core\Compilateur\Balises
 * @balise
 * @see balise_ALERTE_FERMER_dist() Pour clôturer une alerte
 * @example
 *   ```
 *   #ALERTE_OUVRIR{titre[,classes][,role][,id]}
 *   [(#ALERTE_OUVRIR{<:chaine_langue:>, notice, status, mon_alerte})]
 *   ```
 *
 * @param Champ $p
 *     Pile au niveau de la balise
 * @return Champ
 *     Pile complétée par le code à générer
 */
function balise_ALERTE_OUVRIR_dist($p) {
	$_titre = interprete_argument_balise(1, $p);
	$_class = interprete_argument_balise(2, $p);
	$_role  = interprete_argument_balise(3, $p);
	$_id    = interprete_argument_balise(4, $p);
	$_titre = ($_titre ? "$_titre" : "''");
	$_class = ($_class ? ", $_class" : ", ''");
	$_role  = ($_role ? ", $_role" : ", ''");
	$_id    = ($_id ? ", $_id" : ", ''");

	$f = chercher_filtre('message_alerte_ouvrir');
	$p->code = "$f($_titre$_class$_role$_id)";
	$p->interdire_scripts = false;

	return $p;
}

/**
 * Compile la balise `#ALERTE_FERMER` produisant le HTML clôturant un message d’alerte
 *
 * Doit être précédée du texte de l'alerte et de la balise `#ALERTE_OUVRIR`.
 *
 * @package SPIP\Core\Compilateur\Balises
 * @balise
 * @see balise_ALERTE_OUVRIR_dist() Pour ouvrir une alerte
 * @example
 *   ```
 *   #ALERTE_FERMER
 *   ```
 *
 * @param Champ $p
 *     Pile au niveau de la balise
 * @return Champ
 *     Pile complétée par le code à générer
 */
function balise_ALERTE_FERMER_dist($p) {
	$f = chercher_filtre('message_alerte_fermer');
	$p->code = "$f()";
	$p->interdire_scripts = false;

	return $p;
}

/**
 * Générer un message d’alerte
 *
 * Peut-être surchargé par `filtre_message_alerte_dist` ou `filtre_message_alerte`
 *
 * @filtre
 * @see balise_ALERTE_dist() qui utilise ce filtre
 * @see message_alerte_ouvrir()
 * @see message_alerte_fermer()
 * @param string $texte
 *     Contenu de l'alerte
 * @param string $titre
 *     Titre de l'alerte : texte simple, <hn> ou autre.
 * @param string $class
 *     Classes CSS ajoutées au conteneur
 *     Doit contenir le type : `notice`, `error`, `success`, `info`
 * @param string $role
 *     Attribut rôle ajouté au conteneur : `alert` ou `status`, selon l'importance
 * @param string $id
 *     Identifiant HTML du conteneur
 * @return string
 *     HTML de l'alerte
 */
function message_alerte(string $texte, string $titre = '', string $class = '', string $role = '', string $id = '') : string {

	$message_alerte_ouvrir = chercher_filtre('message_alerte_ouvrir');
	$message_alerte_fermer = chercher_filtre('message_alerte_fermer');
	$message =
		$message_alerte_ouvrir($titre, $class, $role, $id) .
		$texte .
		$message_alerte_fermer();

	return $message;
}

/**
 * Ouvrir un message d’alerte
 *
 * Peut-être surchargé par `filtre_message_alerte_ouvrir_dist` ou `filtre_message_alerte_ouvrir`
 *
 * @filtre
 * @see balise_ALERTE_OUVRIR_dist() qui utilise ce filtre
 * @param string $titre
 *     Titre de l'alerte : texte simple, <hn> ou autre.
 * @param string $class
 *     Classes CSS ajoutées au conteneur
 *     Doit contenir le type : `notice`, `error`, `success`, `info`
 *     Défaut = `notice`
 * @param string $role
 *     Attribut role ajouté au conteneur : `alert` ou `status`, selon l'importance
 *     Défaut = `alert`
 * @param string $id
 *     Identifiant HTML du conteneur
 * @return string
 *     HTML d'ouverture de l'alerte
 */
function message_alerte_ouvrir(string $titre = '', string $class = '', string $role = '', string $id = '') : string {

	$prive = test_espace_prive();

	// Type d'alerte : le chercher dans les classes, nettoyer celles-ci, puis le réinjecter
	$types = [
		'notice',
		'error',
		'success',
		'info',
	];
	$type  = array_shift(array_intersect(explode(' ', $class), $types));
	$type  = $type ?: 'notice';
	$class = trim(str_replace($types, '', $class) . " $type");

	// Role
	$role = $role ?: 'alert';

	// Classes
	$class_racine = 'msg-alert';
	$clearfix     = ($prive ? 'clearfix' : '');
	$class_alerte = "$class_racine $class";
	$class_texte  = "${class_racine}__text $clearfix";
	$class_titre  = "${class_racine}__heading";

	// Titre : markup
	$titre = trim($titre);
	if (strlen($titre)) {
		include_spip('inc/filtres');
		// Si besoin on encapsule le titre : un h3 dans le privé, un simple div sinon.
		$cherche_tag = ($prive ? '<h' : '<');
		$wrap_tag    = ($prive ? '<h3>' : '<div>');
		if (strpos($titre, $cherche_tag) !== 0) {
			$titre = wrap($titre, $wrap_tag);
		}
		// puis on ajoute la classe
		$titre = ajouter_class($titre, $class_titre);
	}

	// Autres attributs
	$attr_id = ($id ? "id=\"$id\"" : '');
	$attr_data = ($type ? "data-$role=\"$type\"" : '');

	$message =
		"<div class=\"$class_alerte\" role=\"$role\" $attr_id $attr_data>" .
			$titre .
			"<div class=\"$class_texte\">";

	return $message;
}

/**
 * Fermer un message d’alerte
 *
 * Peut-être surchargé par `filtre_message_alerte_fermer_dist` ou `filtre_message_alerte_fermer`
 *
 * @filtre
 * @see balise_ALERTE_FERMER_dist() qui utilise ce filtre
 * @return string
 *     HTML de fin de l'alerte
 */
function message_alerte_fermer() : string {
	return '</div></div>';
}
+1 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -20,6 +20,7 @@ if (!defined('_ECRIRE_INC_VERSION')) {
}

include_spip('inc/filtres_boites');
include_spip('inc/filtres_alertes');
include_spip('inc/boutons');
include_spip('inc/pipelines_ecrire');

+1 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -28,6 +28,7 @@ include_spip('inc/actions');
include_spip('inc/puce_statut');
include_spip('inc/filtres_ecrire');
include_spip('inc/filtres_boites');
include_spip('inc/filtres_alertes');

// https://code.spip.net/@debut_cadre
function debut_cadre($style, $icone = "", $fonction = "", $titre = "", $id = "", $class = "", $padding = true) {