Completed
Push — master ( ea4e2c...4c29fd )
by cam
04:50
created

filtres_alertes.php ➔ balise_ALERTE_MESSAGE_dist()   A

Complexity

Conditions 6
Paths 32

Size

Total Lines 18

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 6
nc 32
nop 1
dl 0
loc 18
rs 9.0444
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_MESSAGE` produisant le HTML d'un message d'alerte complet.
26
 *
27
 * @note
28
 * Produit par défaut une alerte avec la classe `notice` et le role `alert`,
29
 * sauf si on passe des chaînes vides en param.
30
 * Cela permet par exemple de retirer le rôle dans certains cas précis.
31
 *
32
 * @package SPIP\Core\Compilateur\Balises
33
 * @balise
34
 * @example
35
 *   ```
36
 *   #ALERTE_MESSAGE{message[,titre][,classes][,role][,id]}
37
 *   [(#ALERTE_MESSAGE{<:chaine_langue:>, <:chaine_langue:>, notice, status, mon_alerte})]
38
 *   ```
39
 *
40
 * @param Champ $p
41
 *     Pile au niveau de la balise
42
 * @return Champ
43
 *     Pile complétée par le code à générer
44
 */
45
function balise_ALERTE_MESSAGE_dist($p) {
46
	$_texte = interprete_argument_balise(1, $p);
47
	$_titre = interprete_argument_balise(2, $p);
48
	$_class = interprete_argument_balise(3, $p);
49
	$_role  = interprete_argument_balise(4, $p);
50
	$_id    = interprete_argument_balise(5, $p);
51
	$_texte = ($_texte ? $_texte     : "''");
52
	$_titre = ($_titre ? ", $_titre" : ', null');
53
	$_class = ($_class ? ", $_class" : ', null');
54
	$_role  = ($_role  ? ", $_role"  : ', null');
55
	$_id    = ($_id    ? ", $_id"    : ', null');
56
57
	$f = chercher_filtre('message_alerte');
58
	$p->code = "$f($_texte$_titre$_class$_role$_id)";
59
	$p->interdire_scripts = false;
60
61
	return $p;
62
}
63
64
/**
65
 * Compile la balise `#ALERTE_OUVRIR` produisant le HTML ouvrant d'un message d’alerte
66
 *
67
 * Doit être suivie du texte de l'alerte, puis de la balise `#ALERTE_FERMER`.
68
 *
69
 * @note
70
 * Produit par défaut une alerte avec la classe `notice` et le role `alert`,
71
 * sauf si on passe des chaînes vides en param.
72
 * Cela permet par exemple de ne pas mettre de rôle dans certains cas précis.
73
 *
74
 * @package SPIP\Core\Compilateur\Balises
75
 * @balise
76
 * @see balise_ALERTE_FERMER_dist() Pour clôturer une alerte
77
 * @example
78
 *   ```
79
 *   #ALERTE_OUVRIR{titre[,classes][,role][,id]}
80
 *   [(#ALERTE_OUVRIR{<:chaine_langue:>, notice, status, mon_alerte})]
81
 *   ```
82
 *
83
 * @param Champ $p
84
 *     Pile au niveau de la balise
85
 * @return Champ
86
 *     Pile complétée par le code à générer
87
 */
88
function balise_ALERTE_OUVRIR_dist($p) {
89
	$_titre = interprete_argument_balise(1, $p);
90
	$_class = interprete_argument_balise(2, $p);
91
	$_role  = interprete_argument_balise(3, $p);
92
	$_id    = interprete_argument_balise(4, $p);
93
	$_titre = ($_titre ? "$_titre"   : 'null');
94
	$_class = ($_class ? ", $_class" : ', null');
95
	$_role  = ($_role  ? ", $_role"  : ', null');
96
	$_id    = ($_id    ? ", $_id"    : ', null');
97
98
	$f = chercher_filtre('message_alerte_ouvrir');
99
	$p->code = "$f($_titre$_class$_role$_id)";
100
	$p->interdire_scripts = false;
101
102
	return $p;
103
}
104
105
/**
106
 * Compile la balise `#ALERTE_FERMER` produisant le HTML clôturant un message d’alerte
107
 *
108
 * Doit être précédée du texte de l'alerte et de la balise `#ALERTE_OUVRIR`.
109
 *
110
 * @package SPIP\Core\Compilateur\Balises
111
 * @balise
112
 * @see balise_ALERTE_OUVRIR_dist() Pour ouvrir une alerte
113
 * @example
114
 *   ```
115
 *   #ALERTE_FERMER
116
 *   ```
117
 *
118
 * @param Champ $p
119
 *     Pile au niveau de la balise
120
 * @return Champ
121
 *     Pile complétée par le code à générer
122
 */
123
function balise_ALERTE_FERMER_dist($p) {
124
	$f = chercher_filtre('message_alerte_fermer');
125
	$p->code = "$f()";
126
	$p->interdire_scripts = false;
127
128
	return $p;
129
}
130
131
/**
132
 * Générer un message d’alerte
133
 *
134
 * Peut-être surchargé par `filtre_message_alerte_dist` ou `filtre_message_alerte`
135
 *
136
 * @note
137
 * Produit par défaut une alerte avec la classe `notice` et le rôle `alert`,
138
 * sauf si on passe des chaînes vides en param (compat balises).
139
 * Cela permet par exemple de ne pas mettre de rôle dans certains cas précis.
140
 *
141
 * @filtre
142
 * @see balise_ALERTE_dist() qui utilise ce filtre
143
 * @see message_alerte_ouvrir()
144
 * @see message_alerte_fermer()
145
 * @param string $texte
146
 *     Contenu de l'alerte
147
 * @param string $titre
0 ignored issues
show
Documentation introduced by
Should the type for parameter $titre not be string|null?

This check looks for @param annotations where the type inferred by our type inference engine differs from the declared type.

It makes a suggestion as to what type it considers more descriptive.

Most often this is a case of a parameter that can be null in addition to its declared types.

Loading history...
148
 *     Titre de l'alerte : texte simple, <hn> ou autre.
149
 * @param string $class
0 ignored issues
show
Documentation introduced by
Should the type for parameter $class not be string|null?

This check looks for @param annotations where the type inferred by our type inference engine differs from the declared type.

It makes a suggestion as to what type it considers more descriptive.

Most often this is a case of a parameter that can be null in addition to its declared types.

Loading history...
150
 *     Classes CSS ajoutées au conteneur
151
 *     Doit contenir le type : `notice`, `error`, `success`, `info`
152
 *     Défaut = `notice` (sauf en cas de chaîne vide)
153
 * @param string $role
0 ignored issues
show
Documentation introduced by
Should the type for parameter $role not be string|null?

This check looks for @param annotations where the type inferred by our type inference engine differs from the declared type.

It makes a suggestion as to what type it considers more descriptive.

Most often this is a case of a parameter that can be null in addition to its declared types.

Loading history...
154
 *     Attribut role ajouté au conteneur : `alert` ou `status`, selon l'importance
155
 *     Défaut = `alert` (sauf en cas de chaîne vide)
156
 * @param string $id
0 ignored issues
show
Documentation introduced by
Should the type for parameter $id not be string|null?

This check looks for @param annotations where the type inferred by our type inference engine differs from the declared type.

It makes a suggestion as to what type it considers more descriptive.

Most often this is a case of a parameter that can be null in addition to its declared types.

Loading history...
157
 *     Identifiant HTML du conteneur
158
 * @return string
159
 *     HTML de l'alerte
160
 */
161
function message_alerte(string $texte, ?string $titre = null, ?string $class = null, ?string $role = null, ?string $id = null) : string {
162
163
	$message_alerte_ouvrir = chercher_filtre('message_alerte_ouvrir');
164
	$message_alerte_fermer = chercher_filtre('message_alerte_fermer');
165
	$message =
166
		$message_alerte_ouvrir($titre, $class, $role, $id) .
167
		$texte .
168
		$message_alerte_fermer();
169
170
	return $message;
171
}
172
173
/**
174
 * Ouvrir un message d’alerte
175
 *
176
 * Peut-être surchargé par `filtre_message_alerte_ouvrir_dist` ou `filtre_message_alerte_ouvrir`
177
 *
178
 * @note
179
 * Produit par défaut une alerte avec la classe `notice` et le role `alert`,
180
 * sauf si on passe des chaînes vides en param (compat balises).
181
 * Cela permet par exemple de ne pas mettre de rôle dans certains cas précis.
182
 *
183
 * @filtre
184
 * @see balise_ALERTE_OUVRIR_dist() qui utilise ce filtre
185
 * @param string $titre
0 ignored issues
show
Documentation introduced by
Should the type for parameter $titre not be string|null?

This check looks for @param annotations where the type inferred by our type inference engine differs from the declared type.

It makes a suggestion as to what type it considers more descriptive.

Most often this is a case of a parameter that can be null in addition to its declared types.

Loading history...
186
 *     Titre de l'alerte : texte simple, <hn> ou autre.
187
 * @param string $class
0 ignored issues
show
Documentation introduced by
Should the type for parameter $class not be string|null?

This check looks for @param annotations where the type inferred by our type inference engine differs from the declared type.

It makes a suggestion as to what type it considers more descriptive.

Most often this is a case of a parameter that can be null in addition to its declared types.

Loading history...
188
 *     Classes CSS ajoutées au conteneur
189
 *     Doit contenir le type : `notice`, `error`, `success`, `info`
190
 *     Défaut = `notice` (sauf en cas de chaîne vide)
191
 * @param string $role
0 ignored issues
show
Documentation introduced by
Should the type for parameter $role not be string|null?

This check looks for @param annotations where the type inferred by our type inference engine differs from the declared type.

It makes a suggestion as to what type it considers more descriptive.

Most often this is a case of a parameter that can be null in addition to its declared types.

Loading history...
192
 *     Attribut role ajouté au conteneur : `alert` ou `status`, selon l'importance
193
 *     Défaut = `alert` (sauf en cas de chaîne vide)
194
 * @param string $id
0 ignored issues
show
Documentation introduced by
Should the type for parameter $id not be string|null?

This check looks for @param annotations where the type inferred by our type inference engine differs from the declared type.

It makes a suggestion as to what type it considers more descriptive.

Most often this is a case of a parameter that can be null in addition to its declared types.

Loading history...
195
 *     Identifiant HTML du conteneur
196
 * @return string
197
 *     HTML d'ouverture de l'alerte
198
 */
199
function message_alerte_ouvrir(?string $titre = null, ?string $class = null, ?string $role = null, ?string $id = null) : string {
200
201
	$prive = test_espace_prive();
202
203
	// Valeurs par défaut
204
	$role = $role ?? 'alert'; // fallback uniquement si null
205
	$class = $class ?? 'notice'; // fallback uniquement si null
206
207
	// Type d'alerte : le chercher dans les classes, nettoyer celles-ci, puis le réinjecter
208
	$types = [
209
		'notice',
210
		'error',
211
		'success',
212
		'info',
213
	];
214
	$type  = array_intersect(explode(' ', $class), $types);
215
	$type  = reset($type);
216
	$class = trim(str_replace($types, '', $class) . " $type");
217
218
	// Classes
219
	$class_racine = 'msg-alert';
220
	$clearfix     = ($prive ? 'clearfix' : '');
221
	$class_alerte = "$class_racine $class";
222
	$class_texte  = "${class_racine}__text $clearfix";
223
	$class_titre  = "${class_racine}__heading";
224
225
	// Titre : markup
226
	$titre = trim($titre);
227
	if (strlen($titre)) {
228
		include_spip('inc/filtres');
229
		// Si besoin on encapsule le titre : un h3 dans le privé, un simple div sinon.
230
		$cherche_tag = ($prive ? '<h' : '<');
231
		$wrap_tag    = ($prive ? '<h3>' : '<div>');
232
		if (strpos($titre, $cherche_tag) !== 0) {
233
			$titre = wrap($titre, $wrap_tag);
234
		}
235
		// puis on ajoute la classe
236
		$titre = ajouter_class($titre, $class_titre);
237
	}
238
239
	// Attributs
240
	$attr_role = ($role ? "role=\"$role\"" : '');
241
	$attr_id   = ($id   ? "id=\"$id\"" : '');
242
	$attr_data = ($type ? "data-alert=\"$type\"" : '');
243
244
	$message =
245
		"<div class=\"$class_alerte\" $attr_role $attr_id $attr_data>"
246
			. $titre
247
			. "<div class=\"$class_texte\">";
248
249
	return $message;
250
}
251
252
/**
253
 * Fermer un message d’alerte
254
 *
255
 * Peut-être surchargé par `filtre_message_alerte_fermer_dist` ou `filtre_message_alerte_fermer`
256
 *
257
 * @filtre
258
 * @see balise_ALERTE_FERMER_dist() qui utilise ce filtre
259
 * @return string
260
 *     HTML de fin de l'alerte
261
 */
262
function message_alerte_fermer() : string {
263
	return '</div></div>';
264
}
265