Completed
Push — master ( d9f4e3...31f563 )
by cam
04:21
created

filtres_alertes.php ➔ balise_ALERTE_dist()   B

Complexity

Conditions 7
Paths 64

Size

Total Lines 18

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 7
nc 64
nop 1
dl 0
loc 18
rs 8.8333
c 0
b 0
f 0
1
<?php
2
3
/***************************************************************************\
4
 *  SPIP, Système de publication pour l'internet                           *
5
 *                                                                         *
6
 *  Copyright © avec tendresse depuis 2001                                 *
7
 *  Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James  *
8
 *                                                                         *
9
 *  Ce programme est un logiciel libre distribué sous licence GNU/GPL.     *
10
 *  Pour plus de détails voir le fichier COPYING.txt ou l'aide en ligne.   *
11
\***************************************************************************/
12
13
/**
14
 * Ce fichier regroupe la gestion des filtres et balises générant
15
 * le HTML des messages d'alerte.
16
 *
17
 * @package SPIP\Core\Compilateur\Filtres
18
 **/
19
20
if (!defined('_ECRIRE_INC_VERSION')) {
21
	return;
22
}
23
24
/**
25
 * Compile la balise `#ALERTE` produisant le HTML d'un message d'alerte complet.
26
 *
27
 * @note
28
 * Pour obtenir une alerte sans rôle, passer un param `role` vide.
29
 * En revanche, par commodité si on passe un param `class` vide on fait un fallback.
30
 *
31
 * @package SPIP\Core\Compilateur\Balises
32
 * @balise
33
 * @example
34
 *   ```
35
 *   #ALERTE{message[,titre][,classes][,role][,id]}
36
 *   [(#ALERTE{<:chaine_langue:>, <:chaine_langue:>, notice, status, mon_alerte})]
37
 *   ```
38
 *
39
 * @param Champ $p
40
 *     Pile au niveau de la balise
41
 * @return Champ
42
 *     Pile complétée par le code à générer
43
 */
44
function balise_ALERTE_dist($p) {
45
	$_texte = interprete_argument_balise(1, $p);
46
	$_titre = interprete_argument_balise(2, $p);
47
	$_class = interprete_argument_balise(3, $p);
48
	$_role  = interprete_argument_balise(4, $p);
49
	$_id    = interprete_argument_balise(5, $p);
50
	$_texte = ($_texte ? $_texte     : "''");
51
	$_titre = ($_titre ? ", $_titre" : ", ''");
52
	$_class = (($_class and $_class !== "''") ? ", $_class" : ", 'notice'"); // cf. @note
53
	$_role  = ($_role  ? ", $_role"  : ", 'alert'");
54
	$_id    = ($_id    ? ", $_id"    : '');
55
56
	$f = chercher_filtre('message_alerte');
57
	$p->code = "$f($_texte$_titre$_class$_role$_id)";
58
	$p->interdire_scripts = false;
59
60
	return $p;
61
}
62
63
/**
64
 * Compile la balise `#ALERTE_OUVRIR` produisant le HTML ouvrant d'un message d’alerte
65
 *
66
 * Doit être suivie du texte de l'alerte, puis de la balise `#ALERTE_FERMER`.
67
 *
68
 * @note
69
 * Pour obtenir une alerte sans rôle, passer un paramètre `role` vide.
70
 * Nb : en revanche, par commodité si on passe un param `class` vide on fait un fallback.
71
 *
72
 * @package SPIP\Core\Compilateur\Balises
73
 * @balise
74
 * @see balise_ALERTE_FERMER_dist() Pour clôturer une alerte
75
 * @example
76
 *   ```
77
 *   #ALERTE_OUVRIR{titre[,classes][,role][,id]}
78
 *   [(#ALERTE_OUVRIR{<:chaine_langue:>, notice, status, mon_alerte})]
79
 *   ```
80
 *
81
 * @param Champ $p
82
 *     Pile au niveau de la balise
83
 * @return Champ
84
 *     Pile complétée par le code à générer
85
 */
86
function balise_ALERTE_OUVRIR_dist($p) {
87
	$_titre = interprete_argument_balise(1, $p);
88
	$_class = interprete_argument_balise(2, $p);
89
	$_role  = interprete_argument_balise(3, $p);
90
	$_id    = interprete_argument_balise(4, $p);
91
	$_titre = ($_titre ? "$_titre"   : "''");
92
	$_class = (($_class and $_class !== "''") ? ", $_class" : ", 'notice'"); // cf. @note
93
	$_role  = ($_role  ? ", $_role"  : ", 'alert'");
94
	$_id    = ($_id    ? ", $_id"    : '');
95
96
	$f = chercher_filtre('message_alerte_ouvrir');
97
	$p->code = "$f($_titre$_class$_role$_id)";
98
	$p->interdire_scripts = false;
99
100
	return $p;
101
}
102
103
/**
104
 * Compile la balise `#ALERTE_FERMER` produisant le HTML clôturant un message d’alerte
105
 *
106
 * Doit être précédée du texte de l'alerte et de la balise `#ALERTE_OUVRIR`.
107
 *
108
 * @package SPIP\Core\Compilateur\Balises
109
 * @balise
110
 * @see balise_ALERTE_OUVRIR_dist() Pour ouvrir une alerte
111
 * @example
112
 *   ```
113
 *   #ALERTE_FERMER
114
 *   ```
115
 *
116
 * @param Champ $p
117
 *     Pile au niveau de la balise
118
 * @return Champ
119
 *     Pile complétée par le code à générer
120
 */
121
function balise_ALERTE_FERMER_dist($p) {
122
	$f = chercher_filtre('message_alerte_fermer');
123
	$p->code = "$f()";
124
	$p->interdire_scripts = false;
125
126
	return $p;
127
}
128
129
/**
130
 * Générer un message d’alerte
131
 *
132
 * Peut-être surchargé par `filtre_message_alerte_dist` ou `filtre_message_alerte`
133
 *
134
 * @filtre
135
 * @see balise_ALERTE_dist() qui utilise ce filtre
136
 * @see message_alerte_ouvrir()
137
 * @see message_alerte_fermer()
138
 * @param string $texte
139
 *     Contenu de l'alerte
140
 * @param string $titre
141
 *     Titre de l'alerte : texte simple, <hn> ou autre.
142
 * @param string $class
143
 *     Classes CSS ajoutées au conteneur
144
 *     Doit contenir le type : `notice`, `error`, `success`, `info`
145
 * @param string $role
146
 *     Attribut rôle ajouté au conteneur : `alert` ou `status`, selon l'importance
147
 * @param string $id
148
 *     Identifiant HTML du conteneur
149
 * @return string
150
 *     HTML de l'alerte
151
 */
152
function message_alerte(string $texte, string $titre = '', string $class = '', string $role = '', string $id = '') : string {
153
154
	$message_alerte_ouvrir = chercher_filtre('message_alerte_ouvrir');
155
	$message_alerte_fermer = chercher_filtre('message_alerte_fermer');
156
	$message =
157
		$message_alerte_ouvrir($titre, $class, $role, $id) .
158
		$texte .
159
		$message_alerte_fermer();
160
161
	return $message;
162
}
163
164
/**
165
 * Ouvrir un message d’alerte
166
 *
167
 * Peut-être surchargé par `filtre_message_alerte_ouvrir_dist` ou `filtre_message_alerte_ouvrir`
168
 *
169
 * @filtre
170
 * @see balise_ALERTE_OUVRIR_dist() qui utilise ce filtre
171
 * @param string $titre
172
 *     Titre de l'alerte : texte simple, <hn> ou autre.
173
 * @param string $class
174
 *     Classes CSS ajoutées au conteneur
175
 *     Doit contenir le type : `notice`, `error`, `success`, `info`
176
 *     Défaut = `notice`
177
 * @param string $role
178
 *     Attribut role ajouté au conteneur : `alert` ou `status`, selon l'importance
179
 *     Défaut = `alert`
180
 * @param string $id
181
 *     Identifiant HTML du conteneur
182
 * @return string
183
 *     HTML d'ouverture de l'alerte
184
 */
185
function message_alerte_ouvrir(string $titre = '', string $class = '', string $role = '', string $id = '') : string {
186
187
	$prive = test_espace_prive();
188
189
	// Type d'alerte : le chercher dans les classes, nettoyer celles-ci, puis le réinjecter
190
	$types = [
191
		'notice',
192
		'error',
193
		'success',
194
		'info',
195
	];
196
	$type  = array_intersect(explode(' ', $class), $types);
197
	$type  = reset($type) ?: '';
198
	$class = trim(str_replace($types, '', $class) . " $type");
199
200
	// Classes
201
	$class_racine = 'msg-alert';
202
	$clearfix     = ($prive ? 'clearfix' : '');
203
	$class_alerte = "$class_racine $class";
204
	$class_texte  = "${class_racine}__text $clearfix";
205
	$class_titre  = "${class_racine}__heading";
206
207
	// Titre : markup
208
	$titre = trim($titre);
209
	if (strlen($titre)) {
210
		include_spip('inc/filtres');
211
		// Si besoin on encapsule le titre : un h3 dans le privé, un simple div sinon.
212
		$cherche_tag = ($prive ? '<h' : '<');
213
		$wrap_tag    = ($prive ? '<h3>' : '<div>');
214
		if (strpos($titre, $cherche_tag) !== 0) {
215
			$titre = wrap($titre, $wrap_tag);
216
		}
217
		// puis on ajoute la classe
218
		$titre = ajouter_class($titre, $class_titre);
219
	}
220
221
	// Attributs
222
	$attr_role = ($role ? "role=\"$role\"" : '');
223
	$attr_id   = ($id ? "id=\"$id\"" : '');
224
	$attr_data = ($type ? "data-alert=\"$type\"" : '');
225
226
	$message =
227
		"<div class=\"$class_alerte\" $attr_role $attr_id $attr_data>"
228
			. $titre
229
			. "<div class=\"$class_texte\">";
230
231
	return $message;
232
}
233
234
/**
235
 * Fermer un message d’alerte
236
 *
237
 * Peut-être surchargé par `filtre_message_alerte_fermer_dist` ou `filtre_message_alerte_fermer`
238
 *
239
 * @filtre
240
 * @see balise_ALERTE_FERMER_dist() qui utilise ce filtre
241
 * @return string
242
 *     HTML de fin de l'alerte
243
 */
244
function message_alerte_fermer() : string {
245
	return '</div></div>';
246
}
247