Completed
Push — master ( 647eb8...49aeea )
by cam
01:18 queued 13s
created
ecrire/inc/drapeau_edition.php 1 patch
Indentation   +109 added lines, -109 removed lines patch added patch discarded remove patch
@@ -30,7 +30,7 @@  discard block
 block discarded – undo
30 30
  * @package SPIP\Core\Drapeaux\Edition
31 31
  **/
32 32
 if (!defined('_ECRIRE_INC_VERSION')) {
33
-	return;
33
+    return;
34 34
 }
35 35
 
36 36
 
@@ -45,46 +45,46 @@  discard block
 block discarded – undo
45 45
  *     `[ type d'objet ][id_objet][id_auteur][nom de l'auteur] = time()`
46 46
  **/
47 47
 function lire_tableau_edition() {
48
-	$edition = @unserialize($GLOBALS['meta']['drapeau_edition']);
49
-	if (!$edition) {
50
-		return [];
51
-	}
52
-	$changed = false;
48
+    $edition = @unserialize($GLOBALS['meta']['drapeau_edition']);
49
+    if (!$edition) {
50
+        return [];
51
+    }
52
+    $changed = false;
53 53
 
54
-	$bon_pour_le_service = time() - 3600;
55
-	// parcourir le tableau et virer les vieux
56
-	foreach ($edition as $objet => $data) {
57
-		if (!is_array($data)) {
58
-			unset($edition[$objet]);
59
-		} // vieille version
60
-		else {
61
-			foreach ($data as $id => $tab) {
62
-				if (!is_array($tab)) {
63
-					unset($edition[$objet][$tab]);
64
-				} // vieille version
65
-				else {
66
-					foreach ($tab as $n => $duo) {
67
-						if (current($duo) < $bon_pour_le_service) {
68
-							unset($edition[$objet][$id][$n]);
69
-							$changed = true;
70
-						}
71
-					}
72
-				}
73
-				if (!$edition[$objet][$id]) {
74
-					unset($edition[$objet][$id]);
75
-				}
76
-			}
77
-		}
78
-		if (!$edition[$objet]) {
79
-			unset($edition[$objet]);
80
-		}
81
-	}
54
+    $bon_pour_le_service = time() - 3600;
55
+    // parcourir le tableau et virer les vieux
56
+    foreach ($edition as $objet => $data) {
57
+        if (!is_array($data)) {
58
+            unset($edition[$objet]);
59
+        } // vieille version
60
+        else {
61
+            foreach ($data as $id => $tab) {
62
+                if (!is_array($tab)) {
63
+                    unset($edition[$objet][$tab]);
64
+                } // vieille version
65
+                else {
66
+                    foreach ($tab as $n => $duo) {
67
+                        if (current($duo) < $bon_pour_le_service) {
68
+                            unset($edition[$objet][$id][$n]);
69
+                            $changed = true;
70
+                        }
71
+                    }
72
+                }
73
+                if (!$edition[$objet][$id]) {
74
+                    unset($edition[$objet][$id]);
75
+                }
76
+            }
77
+        }
78
+        if (!$edition[$objet]) {
79
+            unset($edition[$objet]);
80
+        }
81
+    }
82 82
 
83
-	if ($changed) {
84
-		ecrire_tableau_edition($edition);
85
-	}
83
+    if ($changed) {
84
+        ecrire_tableau_edition($edition);
85
+    }
86 86
 
87
-	return $edition;
87
+    return $edition;
88 88
 }
89 89
 
90 90
 /**
@@ -97,7 +97,7 @@  discard block
 block discarded – undo
97 97
  *     `[ type d'objet ][id_objet][id_auteur][nom de l'auteur] = time()`
98 98
  **/
99 99
 function ecrire_tableau_edition($edition) {
100
-	ecrire_meta('drapeau_edition', serialize($edition));
100
+    ecrire_meta('drapeau_edition', serialize($edition));
101 101
 }
102 102
 
103 103
 /**
@@ -117,22 +117,22 @@  discard block
 block discarded – undo
117 117
  *     Type d'objet édité
118 118
  */
119 119
 function signale_edition($id, $auteur, $type = 'article') {
120
-	include_spip('base/objets');
121
-	include_spip('inc/filtres');
122
-	if (objet_info($type, 'editable') !== 'oui') {
123
-		return;
124
-	}
120
+    include_spip('base/objets');
121
+    include_spip('inc/filtres');
122
+    if (objet_info($type, 'editable') !== 'oui') {
123
+        return;
124
+    }
125 125
 
126
-	$edition = lire_tableau_edition();
126
+    $edition = lire_tableau_edition();
127 127
 	
128
-	$nom = $auteur['nom'] ?? $GLOBALS['ip'];
129
-	$id_a = $auteur['id_auteur'] ?? $GLOBALS['ip'];
128
+    $nom = $auteur['nom'] ?? $GLOBALS['ip'];
129
+    $id_a = $auteur['id_auteur'] ?? $GLOBALS['ip'];
130 130
 
131
-	if (!isset($edition[$type][$id]) or !is_array($edition[$type][$id])) {
132
-		$edition[$type][$id] = [];
133
-	}
134
-	$edition[$type][$id][$id_a][$nom] = time();
135
-	ecrire_tableau_edition($edition);
131
+    if (!isset($edition[$type][$id]) or !is_array($edition[$type][$id])) {
132
+        $edition[$type][$id] = [];
133
+    }
134
+    $edition[$type][$id][$id_a][$nom] = time();
135
+    ecrire_tableau_edition($edition);
136 136
 }
137 137
 
138 138
 /**
@@ -149,9 +149,9 @@  discard block
 block discarded – undo
149 149
  */
150 150
 function qui_edite($id, $type = 'article') {
151 151
 
152
-	$edition = lire_tableau_edition();
152
+    $edition = lire_tableau_edition();
153 153
 
154
-	return empty($edition[$type][$id]) ? [] : $edition[$type][$id];
154
+    return empty($edition[$type][$id]) ? [] : $edition[$type][$id];
155 155
 }
156 156
 
157 157
 /**
@@ -165,23 +165,23 @@  discard block
 block discarded – undo
165 165
  *     Liste de tableaux `['nom_auteur_modif' => x|y|z, 'date_diff' => n]`
166 166
  */
167 167
 function mention_qui_edite($id, $type = 'article'): array {
168
-	$modif = qui_edite($id, $type);
169
-	unset($modif[$GLOBALS['visiteur_session']['id_auteur']]);
168
+    $modif = qui_edite($id, $type);
169
+    unset($modif[$GLOBALS['visiteur_session']['id_auteur']]);
170 170
 
171
-	if ($modif) {
172
-		$quand = 0;
173
-		foreach ($modif as $duo) {
174
-			$auteurs[] = typo(key($duo));
175
-			$quand = max($quand, current($duo));
176
-		}
171
+    if ($modif) {
172
+        $quand = 0;
173
+        foreach ($modif as $duo) {
174
+            $auteurs[] = typo(key($duo));
175
+            $quand = max($quand, current($duo));
176
+        }
177 177
 
178
-		// format lie a la chaine de langue 'avis_article_modifie'
179
-		return [
180
-			'nom_auteur_modif' => join(' | ', $auteurs),
181
-			'date_diff' => ceil((time() - $quand) / 60)
182
-		];
183
-	}
184
-	return [];
178
+        // format lie a la chaine de langue 'avis_article_modifie'
179
+        return [
180
+            'nom_auteur_modif' => join(' | ', $auteurs),
181
+            'date_diff' => ceil((time() - $quand) / 60)
182
+        ];
183
+    }
184
+    return [];
185 185
 }
186 186
 
187 187
 /**
@@ -195,25 +195,25 @@  discard block
 block discarded – undo
195 195
  *     Liste de tableaux `['objet' => x, 'id_objet' => n]`
196 196
  */
197 197
 function liste_drapeau_edition($id_auteur) {
198
-	$edition = lire_tableau_edition();
199
-	$objets_ouverts = [];
198
+    $edition = lire_tableau_edition();
199
+    $objets_ouverts = [];
200 200
 
201
-	foreach ($edition as $objet => $data) {
202
-		foreach ($data as $id => $auteurs) {
203
-			if (
204
-				isset($auteurs[$id_auteur])
205
-				and is_array($auteurs[$id_auteur]) // precaution
206
-				and (array_pop($auteurs[$id_auteur]) > time() - 3600)
207
-			) {
208
-				$objets_ouverts[] = [
209
-					'objet' => $objet,
210
-					'id_objet' => $id,
211
-				];
212
-			}
213
-		}
214
-	}
201
+    foreach ($edition as $objet => $data) {
202
+        foreach ($data as $id => $auteurs) {
203
+            if (
204
+                isset($auteurs[$id_auteur])
205
+                and is_array($auteurs[$id_auteur]) // precaution
206
+                and (array_pop($auteurs[$id_auteur]) > time() - 3600)
207
+            ) {
208
+                $objets_ouverts[] = [
209
+                    'objet' => $objet,
210
+                    'id_objet' => $id,
211
+                ];
212
+            }
213
+        }
214
+    }
215 215
 
216
-	return $objets_ouverts;
216
+    return $objets_ouverts;
217 217
 }
218 218
 
219 219
 /**
@@ -226,15 +226,15 @@  discard block
 block discarded – undo
226 226
  * @return void
227 227
  */
228 228
 function debloquer_tous($id_auteur) {
229
-	$edition = lire_tableau_edition();
230
-	foreach ($edition as $objet => $data) {
231
-		foreach ($data as $id => $auteurs) {
232
-			if (isset($auteurs[$id_auteur])) {
233
-				unset($edition[$objet][$id][$id_auteur]);
234
-				ecrire_tableau_edition($edition);
235
-			}
236
-		}
237
-	}
229
+    $edition = lire_tableau_edition();
230
+    foreach ($edition as $objet => $data) {
231
+        foreach ($data as $id => $auteurs) {
232
+            if (isset($auteurs[$id_auteur])) {
233
+                unset($edition[$objet][$id][$id_auteur]);
234
+                ecrire_tableau_edition($edition);
235
+            }
236
+        }
237
+    }
238 238
 }
239 239
 
240 240
 /**
@@ -252,19 +252,19 @@  discard block
 block discarded – undo
252 252
  * @return void
253 253
  */
254 254
 function debloquer_edition($id_auteur, $id_objet, $type = 'article') {
255
-	$edition = lire_tableau_edition();
255
+    $edition = lire_tableau_edition();
256 256
 
257
-	foreach ($edition as $objet => $data) {
258
-		if ($objet == $type) {
259
-			foreach ($data as $id => $auteurs) {
260
-				if (
261
-					$id == $id_objet
262
-					and isset($auteurs[$id_auteur])
263
-				) {
264
-					unset($edition[$objet][$id][$id_auteur]);
265
-					ecrire_tableau_edition($edition);
266
-				}
267
-			}
268
-		}
269
-	}
257
+    foreach ($edition as $objet => $data) {
258
+        if ($objet == $type) {
259
+            foreach ($data as $id => $auteurs) {
260
+                if (
261
+                    $id == $id_objet
262
+                    and isset($auteurs[$id_auteur])
263
+                ) {
264
+                    unset($edition[$objet][$id][$id_auteur]);
265
+                    ecrire_tableau_edition($edition);
266
+                }
267
+            }
268
+        }
269
+    }
270 270
 }
Please login to merge, or discard this patch.
prive/formulaires/editer_liens.php 2 patches
Indentation   +352 added lines, -352 removed lines patch added patch discarded remove patch
@@ -16,7 +16,7 @@  discard block
 block discarded – undo
16 16
  * @package SPIP\Core\Formulaires
17 17
  **/
18 18
 if (!defined('_ECRIRE_INC_VERSION')) {
19
-	return;
19
+    return;
20 20
 }
21 21
 
22 22
 
@@ -36,25 +36,25 @@  discard block
 block discarded – undo
36 36
  *   ($table_source,$objet,$id_objet,$objet_lien)
37 37
  */
38 38
 function determine_source_lien_objet($a, $b, $c) {
39
-	$table_source = $objet_lien = $objet = $id_objet = null;
40
-	// auteurs, article, 23 :
41
-	// associer des auteurs à l'article 23, sur la table pivot spip_auteurs_liens
42
-	if (is_numeric($c) and !is_numeric($b)) {
43
-		$table_source = table_objet($a);
44
-		$objet_lien = objet_type($a);
45
-		$objet = objet_type($b);
46
-		$id_objet = $c;
47
-	}
48
-	// article, 23, auteurs
49
-	// associer des auteurs à l'article 23, sur la table pivot spip_articles_liens
50
-	if (is_numeric($b) and !is_numeric($c)) {
51
-		$table_source = table_objet($c);
52
-		$objet_lien = objet_type($a);
53
-		$objet = objet_type($a);
54
-		$id_objet = $b;
55
-	}
56
-
57
-	return [$table_source, $objet, $id_objet, $objet_lien];
39
+    $table_source = $objet_lien = $objet = $id_objet = null;
40
+    // auteurs, article, 23 :
41
+    // associer des auteurs à l'article 23, sur la table pivot spip_auteurs_liens
42
+    if (is_numeric($c) and !is_numeric($b)) {
43
+        $table_source = table_objet($a);
44
+        $objet_lien = objet_type($a);
45
+        $objet = objet_type($b);
46
+        $id_objet = $c;
47
+    }
48
+    // article, 23, auteurs
49
+    // associer des auteurs à l'article 23, sur la table pivot spip_articles_liens
50
+    if (is_numeric($b) and !is_numeric($c)) {
51
+        $table_source = table_objet($c);
52
+        $objet_lien = objet_type($a);
53
+        $objet = objet_type($a);
54
+        $id_objet = $b;
55
+    }
56
+
57
+    return [$table_source, $objet, $id_objet, $objet_lien];
58 58
 }
59 59
 
60 60
 /**
@@ -80,93 +80,93 @@  discard block
 block discarded – undo
80 80
  */
81 81
 function formulaires_editer_liens_charger_dist($a, $b, $c, $options = []) {
82 82
 
83
-	// compat avec ancienne signature ou le 4eme argument est $editable
84
-	if (!is_array($options)) {
85
-		$options = ['editable' => $options];
86
-	} elseif (!isset($options['editable'])) {
87
-		$options['editable'] = true;
88
-	}
89
-
90
-	$editable = $options['editable'];
91
-
92
-	[$table_source, $objet, $id_objet, $objet_lien] = determine_source_lien_objet($a, $b, $c);
93
-	if (!$table_source or !$objet or !$objet_lien or !$id_objet) {
94
-		return false;
95
-	}
96
-
97
-	$objet_source = objet_type($table_source);
98
-	$table_sql_source = table_objet_sql($objet_source);
99
-
100
-	// verifier existence de la table xxx_liens
101
-	include_spip('action/editer_liens');
102
-	if (!objet_associable($objet_lien)) {
103
-		return false;
104
-	}
105
-
106
-	// L'éditabilité :) est définie par un test permanent (par exemple "associermots") ET le 4ème argument
107
-	include_spip('inc/autoriser');
108
-	$editable = ($editable and autoriser('associer' . $table_source, $objet, $id_objet)
109
-		and autoriser('modifier', $objet, $id_objet));
110
-
111
-	if (
112
-		!$editable and !count(objet_trouver_liens(
113
-			[$objet_lien => '*'],
114
-			[($objet_lien == $objet_source ? $objet : $objet_source) => $id_objet]
115
-		))
116
-	) {
117
-		return false;
118
-	}
119
-
120
-	// squelettes de vue et de d'association
121
-	// ils sont différents si des rôles sont définis.
122
-	$skel_vue = $table_source . '_lies';
123
-	$skel_ajout = $table_source . '_associer';
124
-
125
-	// description des roles
126
-	include_spip('inc/roles');
127
-	if ($roles = roles_presents($objet_source, $objet)) {
128
-		// on demande de nouveaux squelettes en conséquence
129
-		$skel_vue = $table_source . '_roles_lies';
130
-		$skel_ajout = $table_source . '_roles_associer';
131
-	}
132
-
133
-	$oups = '';
134
-	if ($editable) {
135
-		$oups = _request('_oups') ?? '';
136
-		if ($oups) {
137
-			if (json_decode(base64_decode($oups, true))) {
138
-				// on est bon, rien a faire
139
-			} else {
140
-				$oups = '';
141
-			}
142
-		}
143
-	}
144
-	$valeurs = [
145
-		'id' => "$table_source-$objet-$id_objet-$objet_lien", // identifiant unique pour les id du form
146
-		'_vue_liee' => $skel_vue,
147
-		'_vue_ajout' => $skel_ajout,
148
-		'_objet_lien' => $objet_lien,
149
-		'id_lien_ajoute' => _request('id_lien_ajoute'),
150
-		'objet' => $objet,
151
-		'id_objet' => $id_objet,
152
-		'objet_source' => $objet_source,
153
-		'table_source' => $table_source,
154
-		'recherche' => '',
155
-		'visible' => 0,
156
-		'ajouter_lien' => '',
157
-		'supprimer_lien' => '',
158
-		'qualifier_lien' => '',
159
-		'ordonner_lien' => '',
160
-		'desordonner_liens' => '',
161
-		'_roles' => $roles, # description des roles
162
-		'_oups' => entites_html($oups),
163
-		'editable' => $editable,
164
-	];
165
-
166
-	// les options non definies dans $valeurs sont passees telles quelles au formulaire html
167
-	$valeurs = array_merge($options, $valeurs);
168
-
169
-	return $valeurs;
83
+    // compat avec ancienne signature ou le 4eme argument est $editable
84
+    if (!is_array($options)) {
85
+        $options = ['editable' => $options];
86
+    } elseif (!isset($options['editable'])) {
87
+        $options['editable'] = true;
88
+    }
89
+
90
+    $editable = $options['editable'];
91
+
92
+    [$table_source, $objet, $id_objet, $objet_lien] = determine_source_lien_objet($a, $b, $c);
93
+    if (!$table_source or !$objet or !$objet_lien or !$id_objet) {
94
+        return false;
95
+    }
96
+
97
+    $objet_source = objet_type($table_source);
98
+    $table_sql_source = table_objet_sql($objet_source);
99
+
100
+    // verifier existence de la table xxx_liens
101
+    include_spip('action/editer_liens');
102
+    if (!objet_associable($objet_lien)) {
103
+        return false;
104
+    }
105
+
106
+    // L'éditabilité :) est définie par un test permanent (par exemple "associermots") ET le 4ème argument
107
+    include_spip('inc/autoriser');
108
+    $editable = ($editable and autoriser('associer' . $table_source, $objet, $id_objet)
109
+        and autoriser('modifier', $objet, $id_objet));
110
+
111
+    if (
112
+        !$editable and !count(objet_trouver_liens(
113
+            [$objet_lien => '*'],
114
+            [($objet_lien == $objet_source ? $objet : $objet_source) => $id_objet]
115
+        ))
116
+    ) {
117
+        return false;
118
+    }
119
+
120
+    // squelettes de vue et de d'association
121
+    // ils sont différents si des rôles sont définis.
122
+    $skel_vue = $table_source . '_lies';
123
+    $skel_ajout = $table_source . '_associer';
124
+
125
+    // description des roles
126
+    include_spip('inc/roles');
127
+    if ($roles = roles_presents($objet_source, $objet)) {
128
+        // on demande de nouveaux squelettes en conséquence
129
+        $skel_vue = $table_source . '_roles_lies';
130
+        $skel_ajout = $table_source . '_roles_associer';
131
+    }
132
+
133
+    $oups = '';
134
+    if ($editable) {
135
+        $oups = _request('_oups') ?? '';
136
+        if ($oups) {
137
+            if (json_decode(base64_decode($oups, true))) {
138
+                // on est bon, rien a faire
139
+            } else {
140
+                $oups = '';
141
+            }
142
+        }
143
+    }
144
+    $valeurs = [
145
+        'id' => "$table_source-$objet-$id_objet-$objet_lien", // identifiant unique pour les id du form
146
+        '_vue_liee' => $skel_vue,
147
+        '_vue_ajout' => $skel_ajout,
148
+        '_objet_lien' => $objet_lien,
149
+        'id_lien_ajoute' => _request('id_lien_ajoute'),
150
+        'objet' => $objet,
151
+        'id_objet' => $id_objet,
152
+        'objet_source' => $objet_source,
153
+        'table_source' => $table_source,
154
+        'recherche' => '',
155
+        'visible' => 0,
156
+        'ajouter_lien' => '',
157
+        'supprimer_lien' => '',
158
+        'qualifier_lien' => '',
159
+        'ordonner_lien' => '',
160
+        'desordonner_liens' => '',
161
+        '_roles' => $roles, # description des roles
162
+        '_oups' => entites_html($oups),
163
+        'editable' => $editable,
164
+    ];
165
+
166
+    // les options non definies dans $valeurs sont passees telles quelles au formulaire html
167
+    $valeurs = array_merge($options, $valeurs);
168
+
169
+    return $valeurs;
170 170
 }
171 171
 
172 172
 /**
@@ -210,165 +210,165 @@  discard block
 block discarded – undo
210 210
  * @return array
211 211
  */
212 212
 function formulaires_editer_liens_traiter_dist($a, $b, $c, $options = []) {
213
-	// compat avec ancienne signature ou le 4eme argument est $editable
214
-	if (!is_array($options)) {
215
-		$options = ['editable' => $options];
216
-	} elseif (!isset($options['editable'])) {
217
-		$options['editable'] = true;
218
-	}
219
-
220
-	$editable = $options['editable'];
221
-
222
-	$res = ['editable' => $editable ? true : false];
223
-	[$table_source, $objet, $id_objet, $objet_lien] = determine_source_lien_objet($a, $b, $c);
224
-	if (!$table_source or !$objet or !$objet_lien) {
225
-		return $res;
226
-	}
227
-
228
-
229
-	if (_request('tout_voir')) {
230
-		set_request('recherche', '');
231
-	}
232
-
233
-	include_spip('inc/autoriser');
234
-	if (autoriser('modifier', $objet, $id_objet)) {
235
-		// annuler les suppressions du coup d'avant !
236
-		if (
237
-			_request('annuler_oups')
238
-			and $oups = _request('_oups')
239
-			and $oups = base64_decode($oups, true)
240
-			and $oups = json_decode($oups, true)
241
-		) {
242
-			if ($oups_objets = charger_fonction("editer_liens_oups_{$table_source}_{$objet}_{$objet_lien}", 'action', true)) {
243
-				$oups_objets($oups);
244
-			} else {
245
-				$objet_source = objet_type($table_source);
246
-				include_spip('action/editer_liens');
247
-				foreach ($oups as $oup) {
248
-					if ($objet_lien == $objet_source) {
249
-						objet_associer([$objet_source => $oup[$objet_source]], [$objet => $oup[$objet]], $oup);
250
-					} else {
251
-						objet_associer([$objet => $oup[$objet]], [$objet_source => $oup[$objet_source]], $oup);
252
-					}
253
-				}
254
-			}
255
-			# oups ne persiste que pour la derniere action, si suppression
256
-			set_request('_oups');
257
-		}
258
-
259
-		$supprimer = _request('supprimer_lien');
260
-		$ajouter = _request('ajouter_lien');
261
-		$ordonner = _request('ordonner_lien');
262
-
263
-		if (_request('desordonner_liens')) {
264
-			include_spip('action/editer_liens');
265
-			objet_qualifier_liens([$objet_lien => '*'], [$objet => $id_objet], ['rang_lien' => 0]);
266
-		}
267
-
268
-		// il est possible de preciser dans une seule variable un remplacement :
269
-		// remplacer_lien[old][new]
270
-		if ($remplacer = _request('remplacer_lien')) {
271
-			foreach ($remplacer as $k => $v) {
272
-				if ($old = lien_verifier_action($k, '')) {
273
-					foreach (is_array($v) ? $v : [$v] as $kn => $vn) {
274
-						if ($new = lien_verifier_action($kn, $vn)) {
275
-							$supprimer[$old] = 'x';
276
-							$ajouter[$new] = '+';
277
-						}
278
-					}
279
-				}
280
-			}
281
-		}
282
-
283
-		if ($supprimer) {
284
-			if (
285
-				$supprimer_objets = charger_fonction(
286
-					"editer_liens_supprimer_{$table_source}_{$objet}_{$objet_lien}",
287
-					'action',
288
-					true
289
-				)
290
-			) {
291
-				$oups = $supprimer_objets($supprimer);
292
-			} else {
293
-				include_spip('action/editer_liens');
294
-				$oups = [];
295
-
296
-				foreach ($supprimer as $k => $v) {
297
-					if ($lien = lien_verifier_action($k, $v)) {
298
-						$lien = explode('-', $lien);
299
-						[$objet_source, $ids, $objet_lie, $idl, $role] = array_pad($lien, 5, null);
300
-						// appliquer une condition sur le rôle si défini ('*' pour tous les roles)
301
-						$cond = (!is_null($role) ? ['role' => $role] : []);
302
-						if ($objet_lien == $objet_source) {
303
-							$oups = array_merge(
304
-								$oups,
305
-								objet_trouver_liens([$objet_source => $ids], [$objet_lie => $idl], $cond)
306
-							);
307
-							objet_dissocier([$objet_source => $ids], [$objet_lie => $idl], $cond);
308
-						} else {
309
-							$oups = array_merge(
310
-								$oups,
311
-								objet_trouver_liens([$objet_lie => $idl], [$objet_source => $ids], $cond)
312
-							);
313
-							objet_dissocier([$objet_lie => $idl], [$objet_source => $ids], $cond);
314
-						}
315
-					}
316
-				}
317
-			}
318
-			set_request('_oups', $oups ? base64_encode(json_encode($oups)) : null);
319
-		}
320
-
321
-		if ($ajouter) {
322
-			if (
323
-				$ajouter_objets = charger_fonction("editer_liens_ajouter_{$table_source}_{$objet}_{$objet_lien}", 'action', true)
324
-			) {
325
-				$ajout_ok = $ajouter_objets($ajouter);
326
-			} else {
327
-				$ajout_ok = false;
328
-				include_spip('action/editer_liens');
329
-				foreach ($ajouter as $k => $v) {
330
-					if ($lien = lien_verifier_action($k, $v)) {
331
-						$ajout_ok = true;
332
-						[$objet1, $ids, $objet2, $idl] = explode('-', $lien);
333
-						$qualifs = lien_retrouver_qualif($objet_lien, $lien);
334
-						if ($objet_lien == $objet1) {
335
-							lien_ajouter_liaisons($objet1, $ids, $objet2, $idl, $qualifs);
336
-						} else {
337
-							lien_ajouter_liaisons($objet2, $idl, $objet1, $ids, $qualifs);
338
-						}
339
-						set_request('id_lien_ajoute', $ids);
340
-					}
341
-				}
342
-			}
343
-			# oups ne persiste que pour la derniere action, si suppression
344
-			# une suppression suivie d'un ajout dans le meme hit est un remplacement
345
-			# non annulable !
346
-			if ($ajout_ok) {
347
-				set_request('_oups');
348
-			}
349
-		}
350
-
351
-		if ($ordonner) {
352
-			include_spip('action/editer_liens');
353
-			foreach ($ordonner as $k => $rang_lien) {
354
-				if ($lien = lien_verifier_action($k, '')) {
355
-					[$objet1, $ids, $objet2, $idl] = explode('-', $lien);
356
-					$qualif = ['rang_lien' => $rang_lien];
357
-
358
-					if ($objet_lien == $objet1) {
359
-						objet_qualifier_liens([$objet1 => $ids], [$objet2 => $idl], $qualif);
360
-					} else {
361
-						objet_qualifier_liens([$objet2 => $idl], [$objet1 => $ids], $qualif);
362
-					}
363
-					set_request('id_lien_ajoute', $ids);
364
-					set_request('_oups');
365
-				}
366
-			}
367
-		}
368
-	}
369
-
370
-
371
-	return $res;
213
+    // compat avec ancienne signature ou le 4eme argument est $editable
214
+    if (!is_array($options)) {
215
+        $options = ['editable' => $options];
216
+    } elseif (!isset($options['editable'])) {
217
+        $options['editable'] = true;
218
+    }
219
+
220
+    $editable = $options['editable'];
221
+
222
+    $res = ['editable' => $editable ? true : false];
223
+    [$table_source, $objet, $id_objet, $objet_lien] = determine_source_lien_objet($a, $b, $c);
224
+    if (!$table_source or !$objet or !$objet_lien) {
225
+        return $res;
226
+    }
227
+
228
+
229
+    if (_request('tout_voir')) {
230
+        set_request('recherche', '');
231
+    }
232
+
233
+    include_spip('inc/autoriser');
234
+    if (autoriser('modifier', $objet, $id_objet)) {
235
+        // annuler les suppressions du coup d'avant !
236
+        if (
237
+            _request('annuler_oups')
238
+            and $oups = _request('_oups')
239
+            and $oups = base64_decode($oups, true)
240
+            and $oups = json_decode($oups, true)
241
+        ) {
242
+            if ($oups_objets = charger_fonction("editer_liens_oups_{$table_source}_{$objet}_{$objet_lien}", 'action', true)) {
243
+                $oups_objets($oups);
244
+            } else {
245
+                $objet_source = objet_type($table_source);
246
+                include_spip('action/editer_liens');
247
+                foreach ($oups as $oup) {
248
+                    if ($objet_lien == $objet_source) {
249
+                        objet_associer([$objet_source => $oup[$objet_source]], [$objet => $oup[$objet]], $oup);
250
+                    } else {
251
+                        objet_associer([$objet => $oup[$objet]], [$objet_source => $oup[$objet_source]], $oup);
252
+                    }
253
+                }
254
+            }
255
+            # oups ne persiste que pour la derniere action, si suppression
256
+            set_request('_oups');
257
+        }
258
+
259
+        $supprimer = _request('supprimer_lien');
260
+        $ajouter = _request('ajouter_lien');
261
+        $ordonner = _request('ordonner_lien');
262
+
263
+        if (_request('desordonner_liens')) {
264
+            include_spip('action/editer_liens');
265
+            objet_qualifier_liens([$objet_lien => '*'], [$objet => $id_objet], ['rang_lien' => 0]);
266
+        }
267
+
268
+        // il est possible de preciser dans une seule variable un remplacement :
269
+        // remplacer_lien[old][new]
270
+        if ($remplacer = _request('remplacer_lien')) {
271
+            foreach ($remplacer as $k => $v) {
272
+                if ($old = lien_verifier_action($k, '')) {
273
+                    foreach (is_array($v) ? $v : [$v] as $kn => $vn) {
274
+                        if ($new = lien_verifier_action($kn, $vn)) {
275
+                            $supprimer[$old] = 'x';
276
+                            $ajouter[$new] = '+';
277
+                        }
278
+                    }
279
+                }
280
+            }
281
+        }
282
+
283
+        if ($supprimer) {
284
+            if (
285
+                $supprimer_objets = charger_fonction(
286
+                    "editer_liens_supprimer_{$table_source}_{$objet}_{$objet_lien}",
287
+                    'action',
288
+                    true
289
+                )
290
+            ) {
291
+                $oups = $supprimer_objets($supprimer);
292
+            } else {
293
+                include_spip('action/editer_liens');
294
+                $oups = [];
295
+
296
+                foreach ($supprimer as $k => $v) {
297
+                    if ($lien = lien_verifier_action($k, $v)) {
298
+                        $lien = explode('-', $lien);
299
+                        [$objet_source, $ids, $objet_lie, $idl, $role] = array_pad($lien, 5, null);
300
+                        // appliquer une condition sur le rôle si défini ('*' pour tous les roles)
301
+                        $cond = (!is_null($role) ? ['role' => $role] : []);
302
+                        if ($objet_lien == $objet_source) {
303
+                            $oups = array_merge(
304
+                                $oups,
305
+                                objet_trouver_liens([$objet_source => $ids], [$objet_lie => $idl], $cond)
306
+                            );
307
+                            objet_dissocier([$objet_source => $ids], [$objet_lie => $idl], $cond);
308
+                        } else {
309
+                            $oups = array_merge(
310
+                                $oups,
311
+                                objet_trouver_liens([$objet_lie => $idl], [$objet_source => $ids], $cond)
312
+                            );
313
+                            objet_dissocier([$objet_lie => $idl], [$objet_source => $ids], $cond);
314
+                        }
315
+                    }
316
+                }
317
+            }
318
+            set_request('_oups', $oups ? base64_encode(json_encode($oups)) : null);
319
+        }
320
+
321
+        if ($ajouter) {
322
+            if (
323
+                $ajouter_objets = charger_fonction("editer_liens_ajouter_{$table_source}_{$objet}_{$objet_lien}", 'action', true)
324
+            ) {
325
+                $ajout_ok = $ajouter_objets($ajouter);
326
+            } else {
327
+                $ajout_ok = false;
328
+                include_spip('action/editer_liens');
329
+                foreach ($ajouter as $k => $v) {
330
+                    if ($lien = lien_verifier_action($k, $v)) {
331
+                        $ajout_ok = true;
332
+                        [$objet1, $ids, $objet2, $idl] = explode('-', $lien);
333
+                        $qualifs = lien_retrouver_qualif($objet_lien, $lien);
334
+                        if ($objet_lien == $objet1) {
335
+                            lien_ajouter_liaisons($objet1, $ids, $objet2, $idl, $qualifs);
336
+                        } else {
337
+                            lien_ajouter_liaisons($objet2, $idl, $objet1, $ids, $qualifs);
338
+                        }
339
+                        set_request('id_lien_ajoute', $ids);
340
+                    }
341
+                }
342
+            }
343
+            # oups ne persiste que pour la derniere action, si suppression
344
+            # une suppression suivie d'un ajout dans le meme hit est un remplacement
345
+            # non annulable !
346
+            if ($ajout_ok) {
347
+                set_request('_oups');
348
+            }
349
+        }
350
+
351
+        if ($ordonner) {
352
+            include_spip('action/editer_liens');
353
+            foreach ($ordonner as $k => $rang_lien) {
354
+                if ($lien = lien_verifier_action($k, '')) {
355
+                    [$objet1, $ids, $objet2, $idl] = explode('-', $lien);
356
+                    $qualif = ['rang_lien' => $rang_lien];
357
+
358
+                    if ($objet_lien == $objet1) {
359
+                        objet_qualifier_liens([$objet1 => $ids], [$objet2 => $idl], $qualif);
360
+                    } else {
361
+                        objet_qualifier_liens([$objet2 => $idl], [$objet1 => $ids], $qualif);
362
+                    }
363
+                    set_request('id_lien_ajoute', $ids);
364
+                    set_request('_oups');
365
+                }
366
+            }
367
+        }
368
+    }
369
+
370
+
371
+    return $res;
372 372
 }
373 373
 
374 374
 
@@ -391,24 +391,24 @@  discard block
 block discarded – undo
391 391
  * @return string Action demandée si trouvée, sinon ''
392 392
  */
393 393
 function lien_verifier_action($k, $v) {
394
-	$action = '';
395
-	if (preg_match(',^\w+-[\w*]+-[\w*]+-[\w*]+(-[\w*])?,', $k)) {
396
-		$action = $k;
397
-	}
398
-	if (preg_match(',^\w+-[\w*]+-[\w*]+-[\w*]+(-[\w*])?,', $v)) {
399
-		if (is_numeric($k)) {
400
-			$action = $v;
401
-		}
402
-		if (_request($k)) {
403
-			$action = $v;
404
-		}
405
-	}
406
-	// ajout un role null fictif (plus pratique) si pas défini
407
-	if ($action and count(explode('-', $action)) == 4) {
408
-		$action .= '-';
409
-	}
410
-
411
-	return $action;
394
+    $action = '';
395
+    if (preg_match(',^\w+-[\w*]+-[\w*]+-[\w*]+(-[\w*])?,', $k)) {
396
+        $action = $k;
397
+    }
398
+    if (preg_match(',^\w+-[\w*]+-[\w*]+-[\w*]+(-[\w*])?,', $v)) {
399
+        if (is_numeric($k)) {
400
+            $action = $v;
401
+        }
402
+        if (_request($k)) {
403
+            $action = $v;
404
+        }
405
+    }
406
+    // ajout un role null fictif (plus pratique) si pas défini
407
+    if ($action and count(explode('-', $action)) == 4) {
408
+        $action .= '-';
409
+    }
410
+
411
+    return $action;
412 412
 }
413 413
 
414 414
 
@@ -424,66 +424,66 @@  discard block
 block discarded – undo
424 424
  *   Liste des qualifs pour chaque lien. Tableau vide s'il n'y en a pas.
425 425
  **/
426 426
 function lien_retrouver_qualif($objet_lien, $lien) {
427
-	// un role est défini dans la liaison
428
-	$defs = explode('-', $lien);
429
-	[$objet1, , $objet2, , $role] = array_pad($defs, 5, null);
430
-	if ($objet_lien == $objet1) {
431
-		$colonne_role = roles_colonne($objet1, $objet2);
432
-	} else {
433
-		$colonne_role = roles_colonne($objet2, $objet1);
434
-	}
435
-
436
-	// cas ou le role est defini en 5e argument de l'action sur le lien (suppression, ajout rapide sans autre attribut)
437
-	if ($role) {
438
-		return [
439
-			// un seul lien avec ce role
440
-			[$colonne_role => $role]
441
-		];
442
-	}
443
-
444
-	// retrouver les rôles postés pour cette liaison, s'il y en a.
445
-	$qualifier_lien = _request('qualifier_lien');
446
-	if (!$qualifier_lien or !is_array($qualifier_lien)) {
447
-		return [];
448
-	}
449
-
450
-	// pas avec l'action complete (incluant le role)
451
-	$qualif = [];
452
-	if (
453
-		(!isset($qualifier_lien[$lien]) or !$qualif = $qualifier_lien[$lien])
454
-		and count($defs) == 5
455
-	) {
456
-		// on tente avec l'action sans le role
457
-		array_pop($defs);
458
-		$lien = implode('-', $defs);
459
-		if (!isset($qualifier_lien[$lien]) or !$qualif = $qualifier_lien[$lien]) {
460
-			$qualif = [];
461
-		}
462
-	}
463
-
464
-	// $qualif de la forme array(role=>array(...),valeur=>array(...),....)
465
-	// on le reforme en array(array(role=>..,valeur=>..,..),array(role=>..,valeur=>..,..),...)
466
-	$qualifs = [];
467
-	while (is_countable($qualif) ? count($qualif) : 0) {
468
-		$q = [];
469
-		foreach ($qualif as $att => $values) {
470
-			if (is_array($values)) {
471
-				$q[$att] = array_shift($qualif[$att]);
472
-				if (!(is_countable($qualif[$att]) ? count($qualif[$att]) : 0)) {
473
-					unset($qualif[$att]);
474
-				}
475
-			} else {
476
-				$q[$att] = $values;
477
-				unset($qualif[$att]);
478
-			}
479
-		}
480
-		// pas de rôle vide
481
-		if (!$colonne_role or !isset($q[$colonne_role]) or $q[$colonne_role]) {
482
-			$qualifs[] = $q;
483
-		}
484
-	}
485
-
486
-	return $qualifs;
427
+    // un role est défini dans la liaison
428
+    $defs = explode('-', $lien);
429
+    [$objet1, , $objet2, , $role] = array_pad($defs, 5, null);
430
+    if ($objet_lien == $objet1) {
431
+        $colonne_role = roles_colonne($objet1, $objet2);
432
+    } else {
433
+        $colonne_role = roles_colonne($objet2, $objet1);
434
+    }
435
+
436
+    // cas ou le role est defini en 5e argument de l'action sur le lien (suppression, ajout rapide sans autre attribut)
437
+    if ($role) {
438
+        return [
439
+            // un seul lien avec ce role
440
+            [$colonne_role => $role]
441
+        ];
442
+    }
443
+
444
+    // retrouver les rôles postés pour cette liaison, s'il y en a.
445
+    $qualifier_lien = _request('qualifier_lien');
446
+    if (!$qualifier_lien or !is_array($qualifier_lien)) {
447
+        return [];
448
+    }
449
+
450
+    // pas avec l'action complete (incluant le role)
451
+    $qualif = [];
452
+    if (
453
+        (!isset($qualifier_lien[$lien]) or !$qualif = $qualifier_lien[$lien])
454
+        and count($defs) == 5
455
+    ) {
456
+        // on tente avec l'action sans le role
457
+        array_pop($defs);
458
+        $lien = implode('-', $defs);
459
+        if (!isset($qualifier_lien[$lien]) or !$qualif = $qualifier_lien[$lien]) {
460
+            $qualif = [];
461
+        }
462
+    }
463
+
464
+    // $qualif de la forme array(role=>array(...),valeur=>array(...),....)
465
+    // on le reforme en array(array(role=>..,valeur=>..,..),array(role=>..,valeur=>..,..),...)
466
+    $qualifs = [];
467
+    while (is_countable($qualif) ? count($qualif) : 0) {
468
+        $q = [];
469
+        foreach ($qualif as $att => $values) {
470
+            if (is_array($values)) {
471
+                $q[$att] = array_shift($qualif[$att]);
472
+                if (!(is_countable($qualif[$att]) ? count($qualif[$att]) : 0)) {
473
+                    unset($qualif[$att]);
474
+                }
475
+            } else {
476
+                $q[$att] = $values;
477
+                unset($qualif[$att]);
478
+            }
479
+        }
480
+        // pas de rôle vide
481
+        if (!$colonne_role or !isset($q[$colonne_role]) or $q[$colonne_role]) {
482
+            $qualifs[] = $q;
483
+        }
484
+    }
485
+
486
+    return $qualifs;
487 487
 }
488 488
 
489 489
 /**
@@ -502,12 +502,12 @@  discard block
 block discarded – undo
502 502
  **/
503 503
 function lien_ajouter_liaisons($objet_source, $ids, $objet_lien, $idl, $qualifs) {
504 504
 
505
-	// retrouver la colonne de roles s'il y en a a lier
506
-	if (is_array($qualifs) and count($qualifs)) {
507
-		foreach ($qualifs as $qualif) {
508
-			objet_associer([$objet_source => $ids], [$objet_lien => $idl], $qualif);
509
-		}
510
-	} else {
511
-		objet_associer([$objet_source => $ids], [$objet_lien => $idl]);
512
-	}
505
+    // retrouver la colonne de roles s'il y en a a lier
506
+    if (is_array($qualifs) and count($qualifs)) {
507
+        foreach ($qualifs as $qualif) {
508
+            objet_associer([$objet_source => $ids], [$objet_lien => $idl], $qualif);
509
+        }
510
+    } else {
511
+        objet_associer([$objet_source => $ids], [$objet_lien => $idl]);
512
+    }
513 513
 }
Please login to merge, or discard this patch.
Spacing   +6 added lines, -6 removed lines patch added patch discarded remove patch
@@ -105,7 +105,7 @@  discard block
 block discarded – undo
105 105
 
106 106
 	// L'éditabilité :) est définie par un test permanent (par exemple "associermots") ET le 4ème argument
107 107
 	include_spip('inc/autoriser');
108
-	$editable = ($editable and autoriser('associer' . $table_source, $objet, $id_objet)
108
+	$editable = ($editable and autoriser('associer'.$table_source, $objet, $id_objet)
109 109
 		and autoriser('modifier', $objet, $id_objet));
110 110
 
111 111
 	if (
@@ -119,15 +119,15 @@  discard block
 block discarded – undo
119 119
 
120 120
 	// squelettes de vue et de d'association
121 121
 	// ils sont différents si des rôles sont définis.
122
-	$skel_vue = $table_source . '_lies';
123
-	$skel_ajout = $table_source . '_associer';
122
+	$skel_vue = $table_source.'_lies';
123
+	$skel_ajout = $table_source.'_associer';
124 124
 
125 125
 	// description des roles
126 126
 	include_spip('inc/roles');
127 127
 	if ($roles = roles_presents($objet_source, $objet)) {
128 128
 		// on demande de nouveaux squelettes en conséquence
129
-		$skel_vue = $table_source . '_roles_lies';
130
-		$skel_ajout = $table_source . '_roles_associer';
129
+		$skel_vue = $table_source.'_roles_lies';
130
+		$skel_ajout = $table_source.'_roles_associer';
131 131
 	}
132 132
 
133 133
 	$oups = '';
@@ -426,7 +426,7 @@  discard block
 block discarded – undo
426 426
 function lien_retrouver_qualif($objet_lien, $lien) {
427 427
 	// un role est défini dans la liaison
428 428
 	$defs = explode('-', $lien);
429
-	[$objet1, , $objet2, , $role] = array_pad($defs, 5, null);
429
+	[$objet1,, $objet2,, $role] = array_pad($defs, 5, null);
430 430
 	if ($objet_lien == $objet1) {
431 431
 		$colonne_role = roles_colonne($objet1, $objet2);
432 432
 	} else {
Please login to merge, or discard this patch.
ecrire/inc/filtres.php 3 patches
Braces   +10 added lines, -20 removed lines patch added patch discarded remove patch
@@ -648,8 +648,7 @@  discard block
 block discarded – undo
648 648
 			if (!$srcSize) {
649 649
 				$poids_img[$src] = filesize($src);
650 650
 			}
651
-		}
652
-		elseif (strpos($src, '<svg') !== false) {
651
+		} elseif (strpos($src, '<svg') !== false) {
653 652
 			include_spip('inc/svg');
654 653
 			if ($attrs = svg_lire_attributs($src)) {
655 654
 				[$width, $height, $viewbox] = svg_getimagesize_from_attr($attrs);
@@ -3507,8 +3506,7 @@  discard block
 block discarded – undo
3507 3506
 	) {
3508 3507
 		if ($variante_svg_size = substr($variante_svg_generique, 0, -6) . $m[1] . '.svg' and file_exists($variante_svg_size)) {
3509 3508
 			$img_file = $variante_svg_size;
3510
-		}
3511
-		else {
3509
+		} else {
3512 3510
 			$img_file = $variante_svg_generique;
3513 3511
 		}
3514 3512
 	}
@@ -3540,8 +3538,7 @@  discard block
 block discarded – undo
3540 3538
 	}
3541 3539
 	if (!isset($options['chemin_image']) or $options['chemin_image'] == true) {
3542 3540
 		$img_file = chemin_image($img);
3543
-	}
3544
-	else {
3541
+	} else {
3545 3542
 		if (!isset($options['variante_svg_si_possible']) or $options['variante_svg_si_possible'] == true) {
3546 3543
 			$img_file = http_img_variante_svg_si_possible($img_file);
3547 3544
 		}
@@ -3571,11 +3568,9 @@  discard block
 block discarded – undo
3571 3568
 	}
3572 3569
 	if ($alt === false) {
3573 3570
 		$alt = '';
3574
-	}
3575
-	elseif ($alt or $alt === '') {
3571
+	} elseif ($alt or $alt === '') {
3576 3572
 		$alt = " alt='" . attribut_html($alt) . "'";
3577
-	}
3578
-	else {
3573
+	} else {
3579 3574
 		$alt = " alt='" . attribut_html($title) . "'";
3580 3575
 	}
3581 3576
 	return "<img src='" . attribut_html($img_file) . "'$alt"
@@ -3702,13 +3697,11 @@  discard block
 block discarded – undo
3702 3697
 		if (!is_null($class)) {
3703 3698
 			if (strlen($class)) {
3704 3699
 				$img = inserer_attribut($img, 'class', $class);
3705
-			}
3706
-			else {
3700
+			} else {
3707 3701
 				$img = vider_attribut($img, 'class');
3708 3702
 			}
3709 3703
 		}
3710
-	}
3711
-	else {
3704
+	} else {
3712 3705
 		$img = http_img_pack(
3713 3706
 			$img,
3714 3707
 			$alt,
@@ -3806,8 +3799,7 @@  discard block
 block discarded – undo
3806 3799
 	if (!is_null($class)) {
3807 3800
 		if (strlen($class)) {
3808 3801
 			$balise_svg = inserer_attribut($balise_svg, 'class', $class);
3809
-		}
3810
-		else {
3802
+		} else {
3811 3803
 			$balise_svg = vider_attribut($balise_svg, 'class');
3812 3804
 		}
3813 3805
 	}
@@ -3819,8 +3811,7 @@  discard block
 block discarded – undo
3819 3811
 		$balise_svg = inserer_attribut($balise_svg, 'aria-labelledby', $id);
3820 3812
 		$title = "<title id=\"$id\">" . entites_html($alt) . "</title>\n";
3821 3813
 		$balise_svg .= $title;
3822
-	}
3823
-	else {
3814
+	} else {
3824 3815
 		$balise_svg = inserer_attribut($balise_svg, 'aria-hidden', 'true');
3825 3816
 	}
3826 3817
 
@@ -5231,8 +5222,7 @@  discard block
 block discarded – undo
5231 5222
 	// reduit la variabilite du nom et donc le nombre de css concatenees possibles in fine
5232 5223
 	if (isset($options['hash_on_content']) and $options['hash_on_content']) {
5233 5224
 		$hash = md5($contexte_implicite['host'] . '::' . $cache);
5234
-	}
5235
-	else {
5225
+	} else {
5236 5226
 		unset($contexte_implicite['notes']); // pas pertinent pour signaler un changeemnt de contenu pour des css/js
5237 5227
 		ksort($contexte);
5238 5228
 		$hash = md5($fond . json_encode($contexte_implicite, JSON_THROW_ON_ERROR) . json_encode($contexte, JSON_THROW_ON_ERROR) . $connect);
Please login to merge, or discard this patch.
Indentation   +2478 added lines, -2478 removed lines patch added patch discarded remove patch
@@ -16,7 +16,7 @@  discard block
 block discarded – undo
16 16
  * @package SPIP\Core\Filtres
17 17
  **/
18 18
 if (!defined('_ECRIRE_INC_VERSION')) {
19
-	return;
19
+    return;
20 20
 }
21 21
 
22 22
 include_spip('inc/charsets');
@@ -42,8 +42,8 @@  discard block
 block discarded – undo
42 42
  * @return string Fonction PHP correspondante du filtre
43 43
  */
44 44
 function charger_filtre($fonc, $default = 'filtre_identite_dist') {
45
-	include_fichiers_fonctions(); // inclure les fichiers fonctions
46
-	return chercher_filtre($fonc, $default);
45
+    include_fichiers_fonctions(); // inclure les fichiers fonctions
46
+    return chercher_filtre($fonc, $default);
47 47
 }
48 48
 
49 49
 /**
@@ -53,7 +53,7 @@  discard block
 block discarded – undo
53 53
  * @return string Texte
54 54
  **/
55 55
 function filtre_identite_dist($texte) {
56
- return $texte;
56
+    return $texte;
57 57
 }
58 58
 
59 59
 /**
@@ -77,33 +77,33 @@  discard block
 block discarded – undo
77 77
  *     Fonction PHP correspondante du filtre demandé
78 78
  */
79 79
 function chercher_filtre($fonc, $default = null) {
80
-	if (!$fonc) {
81
-		return $default;
82
-	}
83
-	// Cas des types mime, sans confondre avec les appels de fonction de classe
84
-	// Foo::Bar
85
-	// qui peuvent etre avec un namespace : space\Foo::Bar
86
-	if (preg_match(',^[\w]+/,', $fonc)) {
87
-		$nom = preg_replace(',\W,', '_', $fonc);
88
-		$f = chercher_filtre($nom);
89
-		// cas du sous-type MIME sans filtre associe, passer au type:
90
-		// si filtre_text_plain pas defini, passe a filtre_text
91
-		if (!$f and $nom !== $fonc) {
92
-			$f = chercher_filtre(preg_replace(',\W.*$,', '', $fonc));
93
-		}
94
-
95
-		return $f;
96
-	}
97
-
98
-	include_fichiers_fonctions();
99
-	foreach (['filtre_' . $fonc, 'filtre_' . $fonc . '_dist', $fonc] as $f) {
100
-		trouver_filtre_matrice($f); // charge des fichiers spécifiques éventuels
101
-		if (is_callable($f)) {
102
-			return $f;
103
-		}
104
-	}
105
-
106
-	return $default;
80
+    if (!$fonc) {
81
+        return $default;
82
+    }
83
+    // Cas des types mime, sans confondre avec les appels de fonction de classe
84
+    // Foo::Bar
85
+    // qui peuvent etre avec un namespace : space\Foo::Bar
86
+    if (preg_match(',^[\w]+/,', $fonc)) {
87
+        $nom = preg_replace(',\W,', '_', $fonc);
88
+        $f = chercher_filtre($nom);
89
+        // cas du sous-type MIME sans filtre associe, passer au type:
90
+        // si filtre_text_plain pas defini, passe a filtre_text
91
+        if (!$f and $nom !== $fonc) {
92
+            $f = chercher_filtre(preg_replace(',\W.*$,', '', $fonc));
93
+        }
94
+
95
+        return $f;
96
+    }
97
+
98
+    include_fichiers_fonctions();
99
+    foreach (['filtre_' . $fonc, 'filtre_' . $fonc . '_dist', $fonc] as $f) {
100
+        trouver_filtre_matrice($f); // charge des fichiers spécifiques éventuels
101
+        if (is_callable($f)) {
102
+            return $f;
103
+        }
104
+    }
105
+
106
+    return $default;
107 107
 }
108 108
 
109 109
 /**
@@ -147,8 +147,8 @@  discard block
 block discarded – undo
147 147
  *     Chaîne vide sinon.
148 148
  **/
149 149
 function appliquer_filtre($arg, $filtre) {
150
-	$args = func_get_args();
151
-	return appliquer_filtre_sinon($arg, $filtre, $args, '');
150
+    $args = func_get_args();
151
+    return appliquer_filtre_sinon($arg, $filtre, $args, '');
152 152
 }
153 153
 
154 154
 /**
@@ -173,8 +173,8 @@  discard block
 block discarded – undo
173 173
  *     Texte d'origine sinon
174 174
  **/
175 175
 function appliquer_si_filtre($arg, $filtre) {
176
-	$args = func_get_args();
177
-	return appliquer_filtre_sinon($arg, $filtre, $args, $arg);
176
+    $args = func_get_args();
177
+    return appliquer_filtre_sinon($arg, $filtre, $args, $arg);
178 178
 }
179 179
 
180 180
 /**
@@ -190,12 +190,12 @@  discard block
 block discarded – undo
190 190
  *     Version de SPIP
191 191
  **/
192 192
 function spip_version() {
193
-	$version = $GLOBALS['spip_version_affichee'];
194
-	if ($vcs_version = version_vcs_courante(_DIR_RACINE)) {
195
-		$version .= " $vcs_version";
196
-	}
193
+    $version = $GLOBALS['spip_version_affichee'];
194
+    if ($vcs_version = version_vcs_courante(_DIR_RACINE)) {
195
+        $version .= " $vcs_version";
196
+    }
197 197
 
198
-	return $version;
198
+    return $version;
199 199
 }
200 200
 
201 201
 /**
@@ -207,11 +207,11 @@  discard block
 block discarded – undo
207 207
  * @return string
208 208
  */
209 209
 function header_silencieux($version): string {
210
-	if (isset($GLOBALS['spip_header_silencieux']) && (bool) $GLOBALS['spip_header_silencieux']) {
211
-		$version = '';
212
-	}
210
+    if (isset($GLOBALS['spip_header_silencieux']) && (bool) $GLOBALS['spip_header_silencieux']) {
211
+        $version = '';
212
+    }
213 213
 
214
-	return (string) $version;
214
+    return (string) $version;
215 215
 }
216 216
 
217 217
 /**
@@ -224,19 +224,19 @@  discard block
 block discarded – undo
224 224
  *    - string|null si $raw = false
225 225
  */
226 226
 function version_vcs_courante($dir, $raw = false) {
227
-	$desc = decrire_version_git($dir);
228
-	if ($desc === null) {
229
-		$desc = decrire_version_svn($dir);
230
-	}
231
-	if ($desc === null or $raw) {
232
-		return $desc;
233
-	}
234
-	// affichage "GIT [master: abcdef]"
235
-	$commit = $desc['commit_short'] ?? $desc['commit'];
236
-	if ($desc['branch']) {
237
-		$commit = $desc['branch'] . ': ' . $commit;
238
-	}
239
-	return "{$desc['vcs']} [$commit]";
227
+    $desc = decrire_version_git($dir);
228
+    if ($desc === null) {
229
+        $desc = decrire_version_svn($dir);
230
+    }
231
+    if ($desc === null or $raw) {
232
+        return $desc;
233
+    }
234
+    // affichage "GIT [master: abcdef]"
235
+    $commit = $desc['commit_short'] ?? $desc['commit'];
236
+    if ($desc['branch']) {
237
+        $commit = $desc['branch'] . ': ' . $commit;
238
+    }
239
+    return "{$desc['vcs']} [$commit]";
240 240
 }
241 241
 
242 242
 /**
@@ -248,24 +248,24 @@  discard block
 block discarded – undo
248 248
  *      array ['branch' => xx, 'commit' => yy] sinon.
249 249
  **/
250 250
 function decrire_version_git($dir) {
251
-	if (!$dir) {
252
-		$dir = '.';
253
-	}
251
+    if (!$dir) {
252
+        $dir = '.';
253
+    }
254 254
 
255
-	// version installee par GIT
256
-	if (lire_fichier($dir . '/.git/HEAD', $c)) {
257
-		$currentHead = trim(substr($c, 4));
258
-		if (lire_fichier($dir . '/.git/' . $currentHead, $hash)) {
259
-			return [
260
-				'vcs' => 'GIT',
261
-				'branch' => basename($currentHead),
262
-				'commit' => trim($hash),
263
-				'commit_short' => substr(trim($hash), 0, 8),
264
-			];
265
-		}
266
-	}
255
+    // version installee par GIT
256
+    if (lire_fichier($dir . '/.git/HEAD', $c)) {
257
+        $currentHead = trim(substr($c, 4));
258
+        if (lire_fichier($dir . '/.git/' . $currentHead, $hash)) {
259
+            return [
260
+                'vcs' => 'GIT',
261
+                'branch' => basename($currentHead),
262
+                'commit' => trim($hash),
263
+                'commit_short' => substr(trim($hash), 0, 8),
264
+            ];
265
+        }
266
+    }
267 267
 
268
-	return null;
268
+    return null;
269 269
 }
270 270
 
271 271
 
@@ -278,25 +278,25 @@  discard block
 block discarded – undo
278 278
  *      array ['commit' => yy, 'date' => xx, 'author' => xx] sinon.
279 279
  **/
280 280
 function decrire_version_svn($dir) {
281
-	if (!$dir) {
282
-		$dir = '.';
283
-	}
284
-	// version installee par SVN
285
-	if (file_exists($dir . '/.svn/wc.db') && class_exists(\SQLite3::class)) {
286
-		$db = new SQLite3($dir . '/.svn/wc.db');
287
-		$result = $db->query('SELECT changed_revision FROM nodes WHERE local_relpath = "" LIMIT 1');
288
-		if ($result) {
289
-			$row = $result->fetchArray();
290
-			if ($row['changed_revision'] != '') {
291
-				return [
292
-					'vcs' => 'SVN',
293
-					'branch' => '',
294
-					'commit' => $row['changed_revision'],
295
-				];
296
-			}
297
-		}
298
-	}
299
-	return null;
281
+    if (!$dir) {
282
+        $dir = '.';
283
+    }
284
+    // version installee par SVN
285
+    if (file_exists($dir . '/.svn/wc.db') && class_exists(\SQLite3::class)) {
286
+        $db = new SQLite3($dir . '/.svn/wc.db');
287
+        $result = $db->query('SELECT changed_revision FROM nodes WHERE local_relpath = "" LIMIT 1');
288
+        if ($result) {
289
+            $row = $result->fetchArray();
290
+            if ($row['changed_revision'] != '') {
291
+                return [
292
+                    'vcs' => 'SVN',
293
+                    'branch' => '',
294
+                    'commit' => $row['changed_revision'],
295
+                ];
296
+            }
297
+        }
298
+    }
299
+    return null;
300 300
 }
301 301
 
302 302
 // La matrice est necessaire pour ne filtrer _que_ des fonctions definies dans filtres_images
@@ -343,18 +343,18 @@  discard block
 block discarded – undo
343 343
  *     Code HTML retourné par le filtre
344 344
  **/
345 345
 function filtrer($filtre) {
346
-	$tous = func_get_args();
347
-	if (trouver_filtre_matrice($filtre) and substr($filtre, 0, 6) == 'image_') {
348
-		return image_filtrer($tous);
349
-	} elseif ($f = chercher_filtre($filtre)) {
350
-		array_shift($tous);
351
-		return $f(...$tous);
352
-	} else {
353
-		// le filtre n'existe pas, on provoque une erreur
354
-		$msg = ['zbug_erreur_filtre', ['filtre' => texte_script($filtre)]];
355
-		erreur_squelette($msg);
356
-		return '';
357
-	}
346
+    $tous = func_get_args();
347
+    if (trouver_filtre_matrice($filtre) and substr($filtre, 0, 6) == 'image_') {
348
+        return image_filtrer($tous);
349
+    } elseif ($f = chercher_filtre($filtre)) {
350
+        array_shift($tous);
351
+        return $f(...$tous);
352
+    } else {
353
+        // le filtre n'existe pas, on provoque une erreur
354
+        $msg = ['zbug_erreur_filtre', ['filtre' => texte_script($filtre)]];
355
+        erreur_squelette($msg);
356
+        return '';
357
+    }
358 358
 }
359 359
 
360 360
 /**
@@ -371,11 +371,11 @@  discard block
 block discarded – undo
371 371
  * @return bool true si on trouve le filtre dans la matrice, false sinon.
372 372
  */
373 373
 function trouver_filtre_matrice($filtre) {
374
-	if (isset($GLOBALS['spip_matrice'][$filtre]) and is_string($f = $GLOBALS['spip_matrice'][$filtre])) {
375
-		find_in_path($f, '', true);
376
-		$GLOBALS['spip_matrice'][$filtre] = true;
377
-	}
378
-	return !empty($GLOBALS['spip_matrice'][$filtre]);
374
+    if (isset($GLOBALS['spip_matrice'][$filtre]) and is_string($f = $GLOBALS['spip_matrice'][$filtre])) {
375
+        find_in_path($f, '', true);
376
+        $GLOBALS['spip_matrice'][$filtre] = true;
377
+    }
378
+    return !empty($GLOBALS['spip_matrice'][$filtre]);
379 379
 }
380 380
 
381 381
 
@@ -403,8 +403,8 @@  discard block
 block discarded – undo
403 403
  * @return mixed
404 404
  */
405 405
 function filtre_set(&$Pile, $val, $key, $continue = null) {
406
-	$Pile['vars'][$key] = $val;
407
-	return $continue ? $val : '';
406
+    $Pile['vars'][$key] = $val;
407
+    return $continue ? $val : '';
408 408
 }
409 409
 
410 410
 /**
@@ -430,8 +430,8 @@  discard block
 block discarded – undo
430 430
  * @return string|mixed Retourne `$val` si `$continue` présent, sinon ''.
431 431
  */
432 432
 function filtre_setenv(&$Pile, $val, $key, $continue = null) {
433
-	$Pile[0][$key] = $val;
434
-	return $continue ? $val : '';
433
+    $Pile[0][$key] = $val;
434
+    return $continue ? $val : '';
435 435
 }
436 436
 
437 437
 /**
@@ -440,8 +440,8 @@  discard block
 block discarded – undo
440 440
  * @return string
441 441
  */
442 442
 function filtre_sanitize_env(&$Pile, $keys) {
443
-	$Pile[0] = spip_sanitize_from_request($Pile[0], $keys);
444
-	return '';
443
+    $Pile[0] = spip_sanitize_from_request($Pile[0], $keys);
444
+    return '';
445 445
 }
446 446
 
447 447
 
@@ -464,18 +464,18 @@  discard block
 block discarded – undo
464 464
  * @return mixed Retourne la valeur (sans la modifier).
465 465
  */
466 466
 function filtre_debug($val, $key = null) {
467
-	$debug = (
468
-		is_null($key) ? '' : (var_export($key, true) . ' = ')
469
-		) . var_export($val, true);
467
+    $debug = (
468
+        is_null($key) ? '' : (var_export($key, true) . ' = ')
469
+        ) . var_export($val, true);
470 470
 
471
-	include_spip('inc/autoriser');
472
-	if (autoriser('webmestre')) {
473
-		echo "<div class='spip_debug'>\n", $debug, "</div>\n";
474
-	}
471
+    include_spip('inc/autoriser');
472
+    if (autoriser('webmestre')) {
473
+        echo "<div class='spip_debug'>\n", $debug, "</div>\n";
474
+    }
475 475
 
476
-	spip_log($debug, 'debug');
476
+    spip_log($debug, 'debug');
477 477
 
478
-	return $val;
478
+    return $val;
479 479
 }
480 480
 
481 481
 
@@ -505,84 +505,84 @@  discard block
 block discarded – undo
505 505
  *     Texte qui a reçu les filtres
506 506
  **/
507 507
 function image_filtrer($args) {
508
-	$filtre = array_shift($args); # enlever $filtre
509
-	$texte = array_shift($args);
510
-	if ($texte === null || !strlen($texte)) {
511
-		return '';
512
-	}
513
-	find_in_path('filtres_images_mini.php', 'inc/', true);
514
-	statut_effacer_images_temporaires(true); // activer la suppression des images temporaires car le compilo finit la chaine par un image_graver
515
-	// Cas du nom de fichier local
516
-	$is_file = trim($texte);
517
-	if (
518
-		strpos(substr($is_file, strlen(_DIR_RACINE)), '..') !== false
519
-		  or strpbrk($is_file, "<>\n\r\t") !== false
520
-		  or strpos($is_file, '/') === 0
521
-	) {
522
-		$is_file = false;
523
-	}
524
-	if ($is_file) {
525
-		$is_local_file = function ($path) {
526
-			if (strpos($path, '?') !== false) {
527
-				$path = supprimer_timestamp($path);
528
-				// remove ?24px added by find_in_theme on .svg files
529
-				$path = preg_replace(',\?[[:digit:]]+(px)$,', '', $path);
530
-			}
531
-			return file_exists($path);
532
-		};
533
-		if ($is_local_file($is_file) or tester_url_absolue($is_file)) {
534
-			$res = $filtre("<img src='$is_file' />", ...$args);
535
-			statut_effacer_images_temporaires(false); // desactiver pour les appels hors compilo
536
-			return $res;
537
-		}
538
-	}
539
-
540
-	// Cas general : trier toutes les images, avec eventuellement leur <span>
541
-	if (
542
-		preg_match_all(
543
-			',(<([a-z]+) [^<>]*spip_documents[^<>]*>)?\s*(<img\s.*>),UimsS',
544
-			$texte,
545
-			$tags,
546
-			PREG_SET_ORDER
547
-		)
548
-	) {
549
-		foreach ($tags as $tag) {
550
-			$class = extraire_attribut($tag[3], 'class');
551
-			if (
552
-				!$class or
553
-				(strpos($class, 'filtre_inactif') === false
554
-					// compat historique a virer en 3.2
555
-					and strpos($class, 'no_image_filtrer') === false)
556
-			) {
557
-				if ($reduit = $filtre($tag[3], ...$args)) {
558
-					// En cas de span spip_documents, modifier le style=...width:
559
-					if ($tag[1]) {
560
-						$w = extraire_attribut($reduit, 'width');
561
-						if (!$w and preg_match(',width:\s*(\d+)px,S', extraire_attribut($reduit, 'style'), $regs)) {
562
-							$w = $regs[1];
563
-						}
564
-						if ($w and ($style = extraire_attribut($tag[1], 'style'))) {
565
-							$style = preg_replace(',width:\s*\d+px,S', "width:{$w}px", $style);
566
-							$replace = inserer_attribut($tag[1], 'style', $style);
567
-							$texte = str_replace($tag[1], $replace, $texte);
568
-						}
569
-					}
570
-					// traiter aussi un eventuel mouseover
571
-					if ($mouseover = extraire_attribut($reduit, 'onmouseover')) {
572
-						if (preg_match(",this[.]src=['\"]([^'\"]+)['\"],ims", $mouseover, $match)) {
573
-							$srcover = $match[1];
574
-							$srcover_filter = $filtre("<img src='" . $match[1] . "' />", ...$args);
575
-							$srcover_filter = extraire_attribut($srcover_filter, 'src');
576
-							$reduit = str_replace($srcover, $srcover_filter, $reduit);
577
-						}
578
-					}
579
-					$texte = str_replace($tag[3], $reduit, $texte);
580
-				}
581
-			}
582
-		}
583
-	}
584
-	statut_effacer_images_temporaires(false); // desactiver pour les appels hors compilo
585
-	return $texte;
508
+    $filtre = array_shift($args); # enlever $filtre
509
+    $texte = array_shift($args);
510
+    if ($texte === null || !strlen($texte)) {
511
+        return '';
512
+    }
513
+    find_in_path('filtres_images_mini.php', 'inc/', true);
514
+    statut_effacer_images_temporaires(true); // activer la suppression des images temporaires car le compilo finit la chaine par un image_graver
515
+    // Cas du nom de fichier local
516
+    $is_file = trim($texte);
517
+    if (
518
+        strpos(substr($is_file, strlen(_DIR_RACINE)), '..') !== false
519
+          or strpbrk($is_file, "<>\n\r\t") !== false
520
+          or strpos($is_file, '/') === 0
521
+    ) {
522
+        $is_file = false;
523
+    }
524
+    if ($is_file) {
525
+        $is_local_file = function ($path) {
526
+            if (strpos($path, '?') !== false) {
527
+                $path = supprimer_timestamp($path);
528
+                // remove ?24px added by find_in_theme on .svg files
529
+                $path = preg_replace(',\?[[:digit:]]+(px)$,', '', $path);
530
+            }
531
+            return file_exists($path);
532
+        };
533
+        if ($is_local_file($is_file) or tester_url_absolue($is_file)) {
534
+            $res = $filtre("<img src='$is_file' />", ...$args);
535
+            statut_effacer_images_temporaires(false); // desactiver pour les appels hors compilo
536
+            return $res;
537
+        }
538
+    }
539
+
540
+    // Cas general : trier toutes les images, avec eventuellement leur <span>
541
+    if (
542
+        preg_match_all(
543
+            ',(<([a-z]+) [^<>]*spip_documents[^<>]*>)?\s*(<img\s.*>),UimsS',
544
+            $texte,
545
+            $tags,
546
+            PREG_SET_ORDER
547
+        )
548
+    ) {
549
+        foreach ($tags as $tag) {
550
+            $class = extraire_attribut($tag[3], 'class');
551
+            if (
552
+                !$class or
553
+                (strpos($class, 'filtre_inactif') === false
554
+                    // compat historique a virer en 3.2
555
+                    and strpos($class, 'no_image_filtrer') === false)
556
+            ) {
557
+                if ($reduit = $filtre($tag[3], ...$args)) {
558
+                    // En cas de span spip_documents, modifier le style=...width:
559
+                    if ($tag[1]) {
560
+                        $w = extraire_attribut($reduit, 'width');
561
+                        if (!$w and preg_match(',width:\s*(\d+)px,S', extraire_attribut($reduit, 'style'), $regs)) {
562
+                            $w = $regs[1];
563
+                        }
564
+                        if ($w and ($style = extraire_attribut($tag[1], 'style'))) {
565
+                            $style = preg_replace(',width:\s*\d+px,S', "width:{$w}px", $style);
566
+                            $replace = inserer_attribut($tag[1], 'style', $style);
567
+                            $texte = str_replace($tag[1], $replace, $texte);
568
+                        }
569
+                    }
570
+                    // traiter aussi un eventuel mouseover
571
+                    if ($mouseover = extraire_attribut($reduit, 'onmouseover')) {
572
+                        if (preg_match(",this[.]src=['\"]([^'\"]+)['\"],ims", $mouseover, $match)) {
573
+                            $srcover = $match[1];
574
+                            $srcover_filter = $filtre("<img src='" . $match[1] . "' />", ...$args);
575
+                            $srcover_filter = extraire_attribut($srcover_filter, 'src');
576
+                            $reduit = str_replace($srcover, $srcover_filter, $reduit);
577
+                        }
578
+                    }
579
+                    $texte = str_replace($tag[3], $reduit, $texte);
580
+                }
581
+            }
582
+        }
583
+    }
584
+    statut_effacer_images_temporaires(false); // desactiver pour les appels hors compilo
585
+    return $texte;
586 586
 }
587 587
 
588 588
 /**
@@ -599,91 +599,91 @@  discard block
 block discarded – undo
599 599
  **/
600 600
 function infos_image($img, $force_refresh = false) {
601 601
 
602
-	static $largeur_img = [], $hauteur_img = [], $poids_img = [];
603
-	$srcWidth = 0;
604
-	$srcHeight = 0;
605
-	$srcSize = null;
606
-
607
-	$src = extraire_attribut($img, 'src');
608
-
609
-	if (!$src) {
610
-		$src = $img;
611
-	} else {
612
-		$srcWidth = extraire_attribut($img, 'width');
613
-		$srcHeight = extraire_attribut($img, 'height');
614
-	}
615
-
616
-	// ne jamais operer directement sur une image distante pour des raisons de perfo
617
-	// la copie locale a toutes les chances d'etre la ou de resservir
618
-	if (tester_url_absolue($src)) {
619
-		include_spip('inc/distant');
620
-		$fichier = copie_locale($src);
621
-		$src = $fichier ? _DIR_RACINE . $fichier : $src;
622
-	}
623
-	if (($p = strpos($src, '?')) !== false) {
624
-		$src = substr($src, 0, $p);
625
-	}
626
-
627
-	$imagesize = false;
628
-	if (isset($largeur_img[$src]) and !$force_refresh) {
629
-		$srcWidth = $largeur_img[$src];
630
-	}
631
-	if (isset($hauteur_img[$src]) and !$force_refresh) {
632
-		$srcHeight = $hauteur_img[$src];
633
-	}
634
-	if (isset($poids_img[$src]) and !$force_refresh) {
635
-		$srcSize = $poids_img[$src];
636
-	}
637
-	if (!$srcWidth or !$srcHeight or is_null($srcSize)) {
638
-		if (
639
-			file_exists($src)
640
-			and $imagesize = spip_getimagesize($src)
641
-		) {
642
-			if (!$srcWidth) {
643
-				$largeur_img[$src] = $srcWidth = $imagesize[0];
644
-			}
645
-			if (!$srcHeight) {
646
-				$hauteur_img[$src] = $srcHeight = $imagesize[1];
647
-			}
648
-			if (!$srcSize) {
649
-				$poids_img[$src] = filesize($src);
650
-			}
651
-		}
652
-		elseif (strpos($src, '<svg') !== false) {
653
-			include_spip('inc/svg');
654
-			if ($attrs = svg_lire_attributs($src)) {
655
-				[$width, $height, $viewbox] = svg_getimagesize_from_attr($attrs);
656
-				if (!$srcWidth) {
657
-					$largeur_img[$src] = $srcWidth = $width;
658
-				}
659
-				if (!$srcHeight) {
660
-					$hauteur_img[$src] = $srcHeight = $height;
661
-				}
662
-				if (!$srcSize) {
663
-					$poids_img[$src] = $srcSize = strlen($src);
664
-				}
665
-			}
666
-		}
667
-		// $src peut etre une reference a une image temporaire dont a n'a que le log .src
668
-		// on s'y refere, l'image sera reconstruite en temps utile si necessaire
669
-		elseif (
670
-			@file_exists($f = "$src.src")
671
-			and lire_fichier($f, $valeurs)
672
-			and $valeurs = unserialize($valeurs)
673
-		) {
674
-			if (!$srcWidth) {
675
-				$largeur_img[$src] = $srcWidth = $valeurs['largeur_dest'];
676
-			}
677
-			if (!$srcHeight) {
678
-				$hauteur_img[$src] = $srcHeight = $valeurs['hauteur_dest'];
679
-			}
680
-			if (!$srcSize) {
681
-				$poids_img[$src] = $srcSize = 0;
682
-			}
683
-		}
684
-	}
685
-
686
-	return ['hauteur' => $srcHeight, 'largeur' => $srcWidth, 'poids' => $srcSize];
602
+    static $largeur_img = [], $hauteur_img = [], $poids_img = [];
603
+    $srcWidth = 0;
604
+    $srcHeight = 0;
605
+    $srcSize = null;
606
+
607
+    $src = extraire_attribut($img, 'src');
608
+
609
+    if (!$src) {
610
+        $src = $img;
611
+    } else {
612
+        $srcWidth = extraire_attribut($img, 'width');
613
+        $srcHeight = extraire_attribut($img, 'height');
614
+    }
615
+
616
+    // ne jamais operer directement sur une image distante pour des raisons de perfo
617
+    // la copie locale a toutes les chances d'etre la ou de resservir
618
+    if (tester_url_absolue($src)) {
619
+        include_spip('inc/distant');
620
+        $fichier = copie_locale($src);
621
+        $src = $fichier ? _DIR_RACINE . $fichier : $src;
622
+    }
623
+    if (($p = strpos($src, '?')) !== false) {
624
+        $src = substr($src, 0, $p);
625
+    }
626
+
627
+    $imagesize = false;
628
+    if (isset($largeur_img[$src]) and !$force_refresh) {
629
+        $srcWidth = $largeur_img[$src];
630
+    }
631
+    if (isset($hauteur_img[$src]) and !$force_refresh) {
632
+        $srcHeight = $hauteur_img[$src];
633
+    }
634
+    if (isset($poids_img[$src]) and !$force_refresh) {
635
+        $srcSize = $poids_img[$src];
636
+    }
637
+    if (!$srcWidth or !$srcHeight or is_null($srcSize)) {
638
+        if (
639
+            file_exists($src)
640
+            and $imagesize = spip_getimagesize($src)
641
+        ) {
642
+            if (!$srcWidth) {
643
+                $largeur_img[$src] = $srcWidth = $imagesize[0];
644
+            }
645
+            if (!$srcHeight) {
646
+                $hauteur_img[$src] = $srcHeight = $imagesize[1];
647
+            }
648
+            if (!$srcSize) {
649
+                $poids_img[$src] = filesize($src);
650
+            }
651
+        }
652
+        elseif (strpos($src, '<svg') !== false) {
653
+            include_spip('inc/svg');
654
+            if ($attrs = svg_lire_attributs($src)) {
655
+                [$width, $height, $viewbox] = svg_getimagesize_from_attr($attrs);
656
+                if (!$srcWidth) {
657
+                    $largeur_img[$src] = $srcWidth = $width;
658
+                }
659
+                if (!$srcHeight) {
660
+                    $hauteur_img[$src] = $srcHeight = $height;
661
+                }
662
+                if (!$srcSize) {
663
+                    $poids_img[$src] = $srcSize = strlen($src);
664
+                }
665
+            }
666
+        }
667
+        // $src peut etre une reference a une image temporaire dont a n'a que le log .src
668
+        // on s'y refere, l'image sera reconstruite en temps utile si necessaire
669
+        elseif (
670
+            @file_exists($f = "$src.src")
671
+            and lire_fichier($f, $valeurs)
672
+            and $valeurs = unserialize($valeurs)
673
+        ) {
674
+            if (!$srcWidth) {
675
+                $largeur_img[$src] = $srcWidth = $valeurs['largeur_dest'];
676
+            }
677
+            if (!$srcHeight) {
678
+                $hauteur_img[$src] = $srcHeight = $valeurs['hauteur_dest'];
679
+            }
680
+            if (!$srcSize) {
681
+                $poids_img[$src] = $srcSize = 0;
682
+            }
683
+        }
684
+    }
685
+
686
+    return ['hauteur' => $srcHeight, 'largeur' => $srcWidth, 'poids' => $srcSize];
687 687
 }
688 688
 
689 689
 /**
@@ -699,13 +699,13 @@  discard block
 block discarded – undo
699 699
  *     poids
700 700
  **/
701 701
 function poids_image($img, $force_refresh = false) {
702
-	$infos = infos_image($img, $force_refresh);
703
-	return $infos['poids'];
702
+    $infos = infos_image($img, $force_refresh);
703
+    return $infos['poids'];
704 704
 }
705 705
 
706 706
 function taille_image($img, $force_refresh = false) {
707
-	$infos = infos_image($img, $force_refresh);
708
-	return [$infos['hauteur'], $infos['largeur']];
707
+    $infos = infos_image($img, $force_refresh);
708
+    return [$infos['hauteur'], $infos['largeur']];
709 709
 }
710 710
 
711 711
 /**
@@ -722,12 +722,12 @@  discard block
 block discarded – undo
722 722
  *     Largeur en pixels, NULL ou 0 si aucune image.
723 723
  **/
724 724
 function largeur($img) {
725
-	if (!$img) {
726
-		return;
727
-	}
728
-	[$h, $l] = taille_image($img);
725
+    if (!$img) {
726
+        return;
727
+    }
728
+    [$h, $l] = taille_image($img);
729 729
 
730
-	return $l;
730
+    return $l;
731 731
 }
732 732
 
733 733
 /**
@@ -744,12 +744,12 @@  discard block
 block discarded – undo
744 744
  *     Hauteur en pixels, NULL ou 0 si aucune image.
745 745
  **/
746 746
 function hauteur($img) {
747
-	if (!$img) {
748
-		return;
749
-	}
750
-	[$h, $l] = taille_image($img);
747
+    if (!$img) {
748
+        return;
749
+    }
750
+    [$h, $l] = taille_image($img);
751 751
 
752
-	return $h;
752
+    return $h;
753 753
 }
754 754
 
755 755
 
@@ -769,11 +769,11 @@  discard block
 block discarded – undo
769 769
  * @return string
770 770
  **/
771 771
 function corriger_entites_html($texte) {
772
-	if (strpos($texte, '&amp;') === false) {
773
-		return $texte;
774
-	}
772
+    if (strpos($texte, '&amp;') === false) {
773
+        return $texte;
774
+    }
775 775
 
776
-	return preg_replace(',&amp;(#[0-9][0-9][0-9]+;|amp;),iS', '&\1', $texte);
776
+    return preg_replace(',&amp;(#[0-9][0-9][0-9]+;|amp;),iS', '&\1', $texte);
777 777
 }
778 778
 
779 779
 /**
@@ -788,11 +788,11 @@  discard block
 block discarded – undo
788 788
  * @return string
789 789
  **/
790 790
 function corriger_toutes_entites_html($texte) {
791
-	if (strpos($texte, '&amp;') === false) {
792
-		return $texte;
793
-	}
791
+    if (strpos($texte, '&amp;') === false) {
792
+        return $texte;
793
+    }
794 794
 
795
-	return preg_replace(',&amp;(#?[a-z0-9]+;),iS', '&\1', $texte);
795
+    return preg_replace(',&amp;(#?[a-z0-9]+;),iS', '&\1', $texte);
796 796
 }
797 797
 
798 798
 /**
@@ -802,7 +802,7 @@  discard block
 block discarded – undo
802 802
  * @return string
803 803
  **/
804 804
 function proteger_amp($texte) {
805
-	return str_replace('&', '&amp;', $texte);
805
+    return str_replace('&', '&amp;', $texte);
806 806
 }
807 807
 
808 808
 
@@ -833,21 +833,21 @@  discard block
 block discarded – undo
833 833
  * @return mixed|string
834 834
  */
835 835
 function entites_html($texte, $tout = false, $quote = true) {
836
-	if (
837
-		!is_string($texte) or !$texte
838
-		or strpbrk($texte, "&\"'<>") == false
839
-	) {
840
-		return $texte;
841
-	}
842
-	include_spip('inc/texte');
843
-	$flags = ($quote ? ENT_QUOTES : ENT_NOQUOTES);
844
-	$flags |= ENT_HTML401;
845
-	$texte = spip_htmlspecialchars(echappe_retour(echappe_html($texte, '', true), '', 'proteger_amp'), $flags);
846
-	if ($tout) {
847
-		return corriger_toutes_entites_html($texte);
848
-	} else {
849
-		return corriger_entites_html($texte);
850
-	}
836
+    if (
837
+        !is_string($texte) or !$texte
838
+        or strpbrk($texte, "&\"'<>") == false
839
+    ) {
840
+        return $texte;
841
+    }
842
+    include_spip('inc/texte');
843
+    $flags = ($quote ? ENT_QUOTES : ENT_NOQUOTES);
844
+    $flags |= ENT_HTML401;
845
+    $texte = spip_htmlspecialchars(echappe_retour(echappe_html($texte, '', true), '', 'proteger_amp'), $flags);
846
+    if ($tout) {
847
+        return corriger_toutes_entites_html($texte);
848
+    } else {
849
+        return corriger_entites_html($texte);
850
+    }
851 851
 }
852 852
 
853 853
 /**
@@ -866,38 +866,38 @@  discard block
 block discarded – undo
866 866
  *     Texte converti
867 867
  **/
868 868
 function filtrer_entites(?string $texte): string {
869
-	$texte ??= '';
870
-	if (strpos($texte, '&') === false) {
871
-		return $texte;
872
-	}
873
-	// filtrer
874
-	$texte = html2unicode($texte);
875
-	// remettre le tout dans le charset cible
876
-	$texte = unicode2charset($texte);
877
-	// cas particulier des " et ' qu'il faut filtrer aussi
878
-	// (on le faisait deja avec un &quot;)
879
-	if (strpos($texte, '&#') !== false) {
880
-		$texte = str_replace(['&#039;', '&#39;', '&#034;', '&#34;'], ["'", "'", '"', '"'], $texte);
881
-	}
869
+    $texte ??= '';
870
+    if (strpos($texte, '&') === false) {
871
+        return $texte;
872
+    }
873
+    // filtrer
874
+    $texte = html2unicode($texte);
875
+    // remettre le tout dans le charset cible
876
+    $texte = unicode2charset($texte);
877
+    // cas particulier des " et ' qu'il faut filtrer aussi
878
+    // (on le faisait deja avec un &quot;)
879
+    if (strpos($texte, '&#') !== false) {
880
+        $texte = str_replace(['&#039;', '&#39;', '&#034;', '&#34;'], ["'", "'", '"', '"'], $texte);
881
+    }
882 882
 
883
-	return $texte;
883
+    return $texte;
884 884
 }
885 885
 
886 886
 
887 887
 if (!function_exists('filtre_filtrer_entites_dist')) {
888
-	/**
889
-	 * Version sécurisée de filtrer_entites
890
-	 *
891
-	 * @uses interdire_scripts()
892
-	 * @uses filtrer_entites()
893
-	 *
894
-	 * @param string $t
895
-	 * @return string
896
-	 */
897
-	function filtre_filtrer_entites_dist($t) {
898
-		include_spip('inc/texte');
899
-		return interdire_scripts(filtrer_entites($t));
900
-	}
888
+    /**
889
+     * Version sécurisée de filtrer_entites
890
+     *
891
+     * @uses interdire_scripts()
892
+     * @uses filtrer_entites()
893
+     *
894
+     * @param string $t
895
+     * @return string
896
+     */
897
+    function filtre_filtrer_entites_dist($t) {
898
+        include_spip('inc/texte');
899
+        return interdire_scripts(filtrer_entites($t));
900
+    }
901 901
 }
902 902
 
903 903
 
@@ -912,18 +912,18 @@  discard block
 block discarded – undo
912 912
  * @return string|array
913 913
  **/
914 914
 function supprimer_caracteres_illegaux($texte) {
915
-	static $from = "\x0\x1\x2\x3\x4\x5\x6\x7\x8\xB\xC\xE\xF\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F";
916
-	static $to = null;
915
+    static $from = "\x0\x1\x2\x3\x4\x5\x6\x7\x8\xB\xC\xE\xF\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F";
916
+    static $to = null;
917 917
 
918
-	if (is_array($texte)) {
919
-		return array_map('supprimer_caracteres_illegaux', $texte);
920
-	}
918
+    if (is_array($texte)) {
919
+        return array_map('supprimer_caracteres_illegaux', $texte);
920
+    }
921 921
 
922
-	if (!$to) {
923
-		$to = str_repeat('-', strlen($from));
924
-	}
922
+    if (!$to) {
923
+        $to = str_repeat('-', strlen($from));
924
+    }
925 925
 
926
-	return strtr($texte, $from, $to);
926
+    return strtr($texte, $from, $to);
927 927
 }
928 928
 
929 929
 /**
@@ -935,10 +935,10 @@  discard block
 block discarded – undo
935 935
  * @return string|array
936 936
  **/
937 937
 function corriger_caracteres($texte) {
938
-	$texte = corriger_caracteres_windows($texte);
939
-	$texte = supprimer_caracteres_illegaux($texte);
938
+    $texte = corriger_caracteres_windows($texte);
939
+    $texte = supprimer_caracteres_illegaux($texte);
940 940
 
941
-	return $texte;
941
+    return $texte;
942 942
 }
943 943
 
944 944
 /**
@@ -955,44 +955,44 @@  discard block
 block discarded – undo
955 955
  *     Texte encodé pour XML
956 956
  */
957 957
 function texte_backend(string $texte): string {
958
-	if ($texte === '') {
959
-		return '';
960
-	}
958
+    if ($texte === '') {
959
+        return '';
960
+    }
961 961
 
962
-	static $apostrophe = ['&#8217;', "'"]; # n'allouer qu'une fois
962
+    static $apostrophe = ['&#8217;', "'"]; # n'allouer qu'une fois
963 963
 
964
-	// si on a des liens ou des images, les passer en absolu
965
-	$texte = liens_absolus($texte);
964
+    // si on a des liens ou des images, les passer en absolu
965
+    $texte = liens_absolus($texte);
966 966
 
967
-	// echapper les tags &gt; &lt;
968
-	$texte = preg_replace(',&(gt|lt);,S', '&amp;\1;', $texte);
967
+    // echapper les tags &gt; &lt;
968
+    $texte = preg_replace(',&(gt|lt);,S', '&amp;\1;', $texte);
969 969
 
970
-	// importer les &eacute;
971
-	$texte = filtrer_entites($texte);
970
+    // importer les &eacute;
971
+    $texte = filtrer_entites($texte);
972 972
 
973
-	// " -> &quot; et tout ce genre de choses
974
-	$u = $GLOBALS['meta']['pcre_u'];
975
-	$texte = str_replace('&nbsp;', ' ', $texte);
976
-	$texte = preg_replace('/\s{2,}/S' . $u, ' ', $texte);
977
-	// ne pas echapper les sinqle quotes car certains outils de syndication gerent mal
978
-	$texte = entites_html($texte, false, false);
979
-	// mais bien echapper les double quotes !
980
-	$texte = str_replace('"', '&#034;', $texte);
973
+    // " -> &quot; et tout ce genre de choses
974
+    $u = $GLOBALS['meta']['pcre_u'];
975
+    $texte = str_replace('&nbsp;', ' ', $texte);
976
+    $texte = preg_replace('/\s{2,}/S' . $u, ' ', $texte);
977
+    // ne pas echapper les sinqle quotes car certains outils de syndication gerent mal
978
+    $texte = entites_html($texte, false, false);
979
+    // mais bien echapper les double quotes !
980
+    $texte = str_replace('"', '&#034;', $texte);
981 981
 
982
-	// verifier le charset
983
-	$texte = charset2unicode($texte);
982
+    // verifier le charset
983
+    $texte = charset2unicode($texte);
984 984
 
985
-	// Caracteres problematiques en iso-latin 1
986
-	if (isset($GLOBALS['meta']['charset']) and $GLOBALS['meta']['charset'] == 'iso-8859-1') {
987
-		$texte = str_replace(chr(156), '&#156;', $texte);
988
-		$texte = str_replace(chr(140), '&#140;', $texte);
989
-		$texte = str_replace(chr(159), '&#159;', $texte);
990
-	}
985
+    // Caracteres problematiques en iso-latin 1
986
+    if (isset($GLOBALS['meta']['charset']) and $GLOBALS['meta']['charset'] == 'iso-8859-1') {
987
+        $texte = str_replace(chr(156), '&#156;', $texte);
988
+        $texte = str_replace(chr(140), '&#140;', $texte);
989
+        $texte = str_replace(chr(159), '&#159;', $texte);
990
+    }
991 991
 
992
-	// l'apostrophe curly pose probleme a certains lecteure de RSS
993
-	// et le caractere apostrophe alourdit les squelettes avec PHP
994
-	// ==> on les remplace par l'entite HTML
995
-	return str_replace($apostrophe, "'", $texte);
992
+    // l'apostrophe curly pose probleme a certains lecteure de RSS
993
+    // et le caractere apostrophe alourdit les squelettes avec PHP
994
+    // ==> on les remplace par l'entite HTML
995
+    return str_replace($apostrophe, "'", $texte);
996 996
 }
997 997
 
998 998
 /**
@@ -1009,7 +1009,7 @@  discard block
 block discarded – undo
1009 1009
  *     Texte encodé et quote pour XML
1010 1010
  */
1011 1011
 function texte_backendq(string $texte): string {
1012
-	return addslashes(texte_backend($texte));
1012
+    return addslashes(texte_backend($texte));
1013 1013
 }
1014 1014
 
1015 1015
 
@@ -1032,11 +1032,11 @@  discard block
 block discarded – undo
1032 1032
  *     Numéro de titre, sinon chaîne vide
1033 1033
  **/
1034 1034
 function supprimer_numero($texte) {
1035
-	return preg_replace(
1036
-		',^[[:space:]]*([0-9]+)([.)]|' . chr(194) . '?' . chr(176) . ')[[:space:]]+,S',
1037
-		'',
1038
-		$texte
1039
-	);
1035
+    return preg_replace(
1036
+        ',^[[:space:]]*([0-9]+)([.)]|' . chr(194) . '?' . chr(176) . ')[[:space:]]+,S',
1037
+        '',
1038
+        $texte
1039
+    );
1040 1040
 }
1041 1041
 
1042 1042
 /**
@@ -1059,18 +1059,18 @@  discard block
 block discarded – undo
1059 1059
  *     Numéro de titre, sinon chaîne vide
1060 1060
  **/
1061 1061
 function recuperer_numero($texte) {
1062
-	if (
1063
-		$texte and
1064
-		preg_match(
1065
-			',^[[:space:]]*([0-9]+)([.)]|' . chr(194) . '?' . chr(176) . ')[[:space:]]+,S',
1066
-			$texte,
1067
-			$regs
1068
-		)
1069
-	) {
1070
-		return strval($regs[1]);
1071
-	} else {
1072
-		return '';
1073
-	}
1062
+    if (
1063
+        $texte and
1064
+        preg_match(
1065
+            ',^[[:space:]]*([0-9]+)([.)]|' . chr(194) . '?' . chr(176) . ')[[:space:]]+,S',
1066
+            $texte,
1067
+            $regs
1068
+        )
1069
+    ) {
1070
+        return strval($regs[1]);
1071
+    } else {
1072
+        return '';
1073
+    }
1074 1074
 }
1075 1075
 
1076 1076
 /**
@@ -1097,16 +1097,16 @@  discard block
 block discarded – undo
1097 1097
  *     Texte ou tableau de textes converti
1098 1098
  **/
1099 1099
 function supprimer_tags($texte, $rempl = '') {
1100
-	if ($texte === null) {
1101
-		return '';
1102
-	}
1103
-	$texte = preg_replace(',<(!--|\w|/|!\[endif|!\[if)[^>]*>,US', $rempl, $texte);
1104
-	// ne pas oublier un < final non ferme car coupe
1105
-	$texte = preg_replace(',<(!--|\w|/).*$,US', $rempl, $texte);
1106
-	// mais qui peut aussi etre un simple signe plus petit que
1107
-	$texte = str_replace('<', '&lt;', $texte);
1100
+    if ($texte === null) {
1101
+        return '';
1102
+    }
1103
+    $texte = preg_replace(',<(!--|\w|/|!\[endif|!\[if)[^>]*>,US', $rempl, $texte);
1104
+    // ne pas oublier un < final non ferme car coupe
1105
+    $texte = preg_replace(',<(!--|\w|/).*$,US', $rempl, $texte);
1106
+    // mais qui peut aussi etre un simple signe plus petit que
1107
+    $texte = str_replace('<', '&lt;', $texte);
1108 1108
 
1109
-	return $texte;
1109
+    return $texte;
1110 1110
 }
1111 1111
 
1112 1112
 /**
@@ -1129,9 +1129,9 @@  discard block
 block discarded – undo
1129 1129
  *     Texte converti
1130 1130
  **/
1131 1131
 function echapper_tags($texte, $rempl = '') {
1132
-	$texte = preg_replace('/<([^>]*)>/', "&lt;\\1&gt;", $texte);
1132
+    $texte = preg_replace('/<([^>]*)>/', "&lt;\\1&gt;", $texte);
1133 1133
 
1134
-	return $texte;
1134
+    return $texte;
1135 1135
 }
1136 1136
 
1137 1137
 /**
@@ -1152,18 +1152,18 @@  discard block
 block discarded – undo
1152 1152
  *     Texte converti
1153 1153
  **/
1154 1154
 function textebrut($texte) {
1155
-	$u = $GLOBALS['meta']['pcre_u'];
1156
-	$texte = preg_replace('/\s+/S' . $u, ' ', $texte);
1157
-	$texte = preg_replace('/<(p|br)( [^>]*)?' . '>/iS', "\n\n", $texte);
1158
-	$texte = preg_replace("/^\n+/", '', $texte);
1159
-	$texte = preg_replace("/\n+$/", '', $texte);
1160
-	$texte = preg_replace("/\n +/", "\n", $texte);
1161
-	$texte = supprimer_tags($texte);
1162
-	$texte = preg_replace('/(&nbsp;| )+/S', ' ', $texte);
1163
-	// nettoyer l'apostrophe curly qui pose probleme a certains rss-readers, lecteurs de mail...
1164
-	$texte = str_replace('&#8217;', "'", $texte);
1155
+    $u = $GLOBALS['meta']['pcre_u'];
1156
+    $texte = preg_replace('/\s+/S' . $u, ' ', $texte);
1157
+    $texte = preg_replace('/<(p|br)( [^>]*)?' . '>/iS', "\n\n", $texte);
1158
+    $texte = preg_replace("/^\n+/", '', $texte);
1159
+    $texte = preg_replace("/\n+$/", '', $texte);
1160
+    $texte = preg_replace("/\n +/", "\n", $texte);
1161
+    $texte = supprimer_tags($texte);
1162
+    $texte = preg_replace('/(&nbsp;| )+/S', ' ', $texte);
1163
+    // nettoyer l'apostrophe curly qui pose probleme a certains rss-readers, lecteurs de mail...
1164
+    $texte = str_replace('&#8217;', "'", $texte);
1165 1165
 
1166
-	return $texte;
1166
+    return $texte;
1167 1167
 }
1168 1168
 
1169 1169
 
@@ -1179,23 +1179,23 @@  discard block
 block discarded – undo
1179 1179
  *     Texte avec liens ouvrants
1180 1180
  **/
1181 1181
 function liens_ouvrants($texte) {
1182
-	if (
1183
-		preg_match_all(
1184
-			",(<a\s+[^>]*https?://[^>]*class=[\"']spip_(out|url)\b[^>]+>),imsS",
1185
-			$texte,
1186
-			$liens,
1187
-			PREG_PATTERN_ORDER
1188
-		)
1189
-	) {
1190
-		foreach ($liens[0] as $a) {
1191
-			$rel = 'noopener noreferrer ' . extraire_attribut($a, 'rel');
1192
-			$ablank = inserer_attribut($a, 'rel', $rel);
1193
-			$ablank = inserer_attribut($ablank, 'target', '_blank');
1194
-			$texte = str_replace($a, $ablank, $texte);
1195
-		}
1196
-	}
1197
-
1198
-	return $texte;
1182
+    if (
1183
+        preg_match_all(
1184
+            ",(<a\s+[^>]*https?://[^>]*class=[\"']spip_(out|url)\b[^>]+>),imsS",
1185
+            $texte,
1186
+            $liens,
1187
+            PREG_PATTERN_ORDER
1188
+        )
1189
+    ) {
1190
+        foreach ($liens[0] as $a) {
1191
+            $rel = 'noopener noreferrer ' . extraire_attribut($a, 'rel');
1192
+            $ablank = inserer_attribut($a, 'rel', $rel);
1193
+            $ablank = inserer_attribut($ablank, 'target', '_blank');
1194
+            $texte = str_replace($a, $ablank, $texte);
1195
+        }
1196
+    }
1197
+
1198
+    return $texte;
1199 1199
 }
1200 1200
 
1201 1201
 /**
@@ -1205,22 +1205,22 @@  discard block
 block discarded – undo
1205 1205
  * @return string
1206 1206
  */
1207 1207
 function liens_nofollow($texte) {
1208
-	if (stripos($texte, '<a') === false) {
1209
-		return $texte;
1210
-	}
1208
+    if (stripos($texte, '<a') === false) {
1209
+        return $texte;
1210
+    }
1211 1211
 
1212
-	if (preg_match_all(",<a\b[^>]*>,UimsS", $texte, $regs, PREG_PATTERN_ORDER)) {
1213
-		foreach ($regs[0] as $a) {
1214
-			$rel = extraire_attribut($a, 'rel') ?? '';
1215
-			if (strpos($rel, 'nofollow') === false) {
1216
-				$rel = 'nofollow' . ($rel ? " $rel" : '');
1217
-				$anofollow = inserer_attribut($a, 'rel', $rel);
1218
-				$texte = str_replace($a, $anofollow, $texte);
1219
-			}
1220
-		}
1221
-	}
1212
+    if (preg_match_all(",<a\b[^>]*>,UimsS", $texte, $regs, PREG_PATTERN_ORDER)) {
1213
+        foreach ($regs[0] as $a) {
1214
+            $rel = extraire_attribut($a, 'rel') ?? '';
1215
+            if (strpos($rel, 'nofollow') === false) {
1216
+                $rel = 'nofollow' . ($rel ? " $rel" : '');
1217
+                $anofollow = inserer_attribut($a, 'rel', $rel);
1218
+                $texte = str_replace($a, $anofollow, $texte);
1219
+            }
1220
+        }
1221
+    }
1222 1222
 
1223
-	return $texte;
1223
+    return $texte;
1224 1224
 }
1225 1225
 
1226 1226
 /**
@@ -1239,12 +1239,12 @@  discard block
 block discarded – undo
1239 1239
  *     Texte sans paraghaphes
1240 1240
  **/
1241 1241
 function PtoBR($texte) {
1242
-	$u = $GLOBALS['meta']['pcre_u'];
1243
-	$texte = preg_replace('@</p>@iS', "\n", $texte);
1244
-	$texte = preg_replace("@<p\b.*>@UiS", '<br />', $texte);
1245
-	$texte = preg_replace('@^\s*<br />@S' . $u, '', $texte);
1242
+    $u = $GLOBALS['meta']['pcre_u'];
1243
+    $texte = preg_replace('@</p>@iS', "\n", $texte);
1244
+    $texte = preg_replace("@<p\b.*>@UiS", '<br />', $texte);
1245
+    $texte = preg_replace('@^\s*<br />@S' . $u, '', $texte);
1246 1246
 
1247
-	return $texte;
1247
+    return $texte;
1248 1248
 }
1249 1249
 
1250 1250
 
@@ -1269,14 +1269,14 @@  discard block
 block discarded – undo
1269 1269
  * @return string Texte encadré du style CSS
1270 1270
  */
1271 1271
 function lignes_longues($texte) {
1272
-	if (!strlen(trim($texte))) {
1273
-		return $texte;
1274
-	}
1275
-	include_spip('inc/texte');
1276
-	$tag = preg_match(',</?(' . _BALISES_BLOCS . ')[>[:space:]],iS', $texte) ?
1277
-		'div' : 'span';
1272
+    if (!strlen(trim($texte))) {
1273
+        return $texte;
1274
+    }
1275
+    include_spip('inc/texte');
1276
+    $tag = preg_match(',</?(' . _BALISES_BLOCS . ')[>[:space:]],iS', $texte) ?
1277
+        'div' : 'span';
1278 1278
 
1279
-	return "<$tag style='word-wrap:break-word;'>$texte</$tag>";
1279
+    return "<$tag style='word-wrap:break-word;'>$texte</$tag>";
1280 1280
 }
1281 1281
 
1282 1282
 /**
@@ -1295,30 +1295,30 @@  discard block
 block discarded – undo
1295 1295
  * @return string Texte en majuscule
1296 1296
  */
1297 1297
 function majuscules($texte) {
1298
-	if (!strlen($texte)) {
1299
-		return '';
1300
-	}
1298
+    if (!strlen($texte)) {
1299
+        return '';
1300
+    }
1301 1301
 
1302
-	// Cas du turc
1303
-	if ($GLOBALS['spip_lang'] == 'tr') {
1304
-		# remplacer hors des tags et des entites
1305
-		if (preg_match_all(',<[^<>]+>|&[^;]+;,S', $texte, $regs, PREG_SET_ORDER)) {
1306
-			foreach ($regs as $n => $match) {
1307
-				$texte = str_replace($match[0], "@@SPIP_TURC$n@@", $texte);
1308
-			}
1309
-		}
1302
+    // Cas du turc
1303
+    if ($GLOBALS['spip_lang'] == 'tr') {
1304
+        # remplacer hors des tags et des entites
1305
+        if (preg_match_all(',<[^<>]+>|&[^;]+;,S', $texte, $regs, PREG_SET_ORDER)) {
1306
+            foreach ($regs as $n => $match) {
1307
+                $texte = str_replace($match[0], "@@SPIP_TURC$n@@", $texte);
1308
+            }
1309
+        }
1310 1310
 
1311
-		$texte = str_replace('i', '&#304;', $texte);
1311
+        $texte = str_replace('i', '&#304;', $texte);
1312 1312
 
1313
-		if ($regs) {
1314
-			foreach ($regs as $n => $match) {
1315
-				$texte = str_replace("@@SPIP_TURC$n@@", $match[0], $texte);
1316
-			}
1317
-		}
1318
-	}
1313
+        if ($regs) {
1314
+            foreach ($regs as $n => $match) {
1315
+                $texte = str_replace("@@SPIP_TURC$n@@", $match[0], $texte);
1316
+            }
1317
+        }
1318
+    }
1319 1319
 
1320
-	// Cas general
1321
-	return "<span style='text-transform: uppercase;'>$texte</span>";
1320
+    // Cas general
1321
+    return "<span style='text-transform: uppercase;'>$texte</span>";
1322 1322
 }
1323 1323
 
1324 1324
 /**
@@ -1336,29 +1336,29 @@  discard block
 block discarded – undo
1336 1336
  * @return string
1337 1337
  **/
1338 1338
 function taille_en_octets($taille) {
1339
-	if (!defined('_KILOBYTE')) {
1340
-		/**
1341
-		 * Définit le nombre d'octets dans un Kilobyte
1342
-		 *
1343
-		 * @var int
1344
-		 **/
1345
-		define('_KILOBYTE', 1024);
1346
-	}
1339
+    if (!defined('_KILOBYTE')) {
1340
+        /**
1341
+         * Définit le nombre d'octets dans un Kilobyte
1342
+         *
1343
+         * @var int
1344
+         **/
1345
+        define('_KILOBYTE', 1024);
1346
+    }
1347 1347
 
1348
-	if ($taille < 1) {
1349
-		return '';
1350
-	}
1351
-	if ($taille < _KILOBYTE) {
1352
-		$taille = _T('taille_octets', ['taille' => $taille]);
1353
-	} elseif ($taille < _KILOBYTE * _KILOBYTE) {
1354
-		$taille = _T('taille_ko', ['taille' => round($taille / _KILOBYTE, 1)]);
1355
-	} elseif ($taille < _KILOBYTE * _KILOBYTE * _KILOBYTE) {
1356
-		$taille = _T('taille_mo', ['taille' => round($taille / _KILOBYTE / _KILOBYTE, 1)]);
1357
-	} else {
1358
-		$taille = _T('taille_go', ['taille' => round($taille / _KILOBYTE / _KILOBYTE / _KILOBYTE, 2)]);
1359
-	}
1348
+    if ($taille < 1) {
1349
+        return '';
1350
+    }
1351
+    if ($taille < _KILOBYTE) {
1352
+        $taille = _T('taille_octets', ['taille' => $taille]);
1353
+    } elseif ($taille < _KILOBYTE * _KILOBYTE) {
1354
+        $taille = _T('taille_ko', ['taille' => round($taille / _KILOBYTE, 1)]);
1355
+    } elseif ($taille < _KILOBYTE * _KILOBYTE * _KILOBYTE) {
1356
+        $taille = _T('taille_mo', ['taille' => round($taille / _KILOBYTE / _KILOBYTE, 1)]);
1357
+    } else {
1358
+        $taille = _T('taille_go', ['taille' => round($taille / _KILOBYTE / _KILOBYTE / _KILOBYTE, 2)]);
1359
+    }
1360 1360
 
1361
-	return $taille;
1361
+    return $taille;
1362 1362
 }
1363 1363
 
1364 1364
 
@@ -1380,21 +1380,21 @@  discard block
 block discarded – undo
1380 1380
  *     Texte prêt pour être utilisé en attribut HTML
1381 1381
  **/
1382 1382
 function attribut_html(?string $texte, $textebrut = true): string {
1383
-	if ($texte === null) {
1384
-		return '';
1385
-	}
1386
-	$u = $GLOBALS['meta']['pcre_u'];
1387
-	if ($textebrut) {
1388
-		$texte = preg_replace([",\n,", ',\s(?=\s),msS' . $u], [' ', ''], textebrut($texte));
1389
-	}
1390
-	$texte = texte_backend($texte);
1391
-	$texte = str_replace(["'", '"'], ['&#039;', '&#034;'], $texte);
1383
+    if ($texte === null) {
1384
+        return '';
1385
+    }
1386
+    $u = $GLOBALS['meta']['pcre_u'];
1387
+    if ($textebrut) {
1388
+        $texte = preg_replace([",\n,", ',\s(?=\s),msS' . $u], [' ', ''], textebrut($texte));
1389
+    }
1390
+    $texte = texte_backend($texte);
1391
+    $texte = str_replace(["'", '"'], ['&#039;', '&#034;'], $texte);
1392 1392
 
1393
-	return preg_replace(
1394
-		['/&(amp;|#38;)/', '/&(?![A-Za-z]{0,4}\w{2,3};|#[0-9]{2,5};)/'],
1395
-		['&', '&#38;'],
1396
-		$texte
1397
-	);
1393
+    return preg_replace(
1394
+        ['/&(amp;|#38;)/', '/&(?![A-Za-z]{0,4}\w{2,3};|#[0-9]{2,5};)/'],
1395
+        ['&', '&#38;'],
1396
+        $texte
1397
+    );
1398 1398
 }
1399 1399
 
1400 1400
 
@@ -1414,15 +1414,15 @@  discard block
 block discarded – undo
1414 1414
  *     URL ou chaîne vide
1415 1415
  **/
1416 1416
 function vider_url(?string $url, $entites = true): string {
1417
-	if ($url === null) {
1418
-		return '';
1419
-	}
1420
-	# un message pour abs_url
1421
-	$GLOBALS['mode_abs_url'] = 'url';
1422
-	$url = trim($url);
1423
-	$r = ',^(?:' . _PROTOCOLES_STD . '):?/?/?$,iS';
1417
+    if ($url === null) {
1418
+        return '';
1419
+    }
1420
+    # un message pour abs_url
1421
+    $GLOBALS['mode_abs_url'] = 'url';
1422
+    $url = trim($url);
1423
+    $r = ',^(?:' . _PROTOCOLES_STD . '):?/?/?$,iS';
1424 1424
 
1425
-	return preg_match($r, $url) ? '' : ($entites ? entites_html($url) : $url);
1425
+    return preg_match($r, $url) ? '' : ($entites ? entites_html($url) : $url);
1426 1426
 }
1427 1427
 
1428 1428
 
@@ -1437,10 +1437,10 @@  discard block
 block discarded – undo
1437 1437
  * @return string Adresse email maquillée
1438 1438
  **/
1439 1439
 function antispam($texte) {
1440
-	include_spip('inc/acces');
1441
-	$masque = creer_pass_aleatoire(3);
1440
+    include_spip('inc/acces');
1441
+    $masque = creer_pass_aleatoire(3);
1442 1442
 
1443
-	return preg_replace('/@/', " $masque ", $texte);
1443
+    return preg_replace('/@/', " $masque ", $texte);
1444 1444
 }
1445 1445
 
1446 1446
 /**
@@ -1472,8 +1472,8 @@  discard block
 block discarded – undo
1472 1472
  *     True si on a le droit d'accès, false sinon.
1473 1473
  **/
1474 1474
 function filtre_securiser_acces_dist($id_auteur, $cle, $dir, $op = '', $args = '') {
1475
-	include_spip('inc/acces');
1476
-	return securiser_acces_low_sec($id_auteur, $cle, $op ? "$dir $op $args" : $dir);
1475
+    include_spip('inc/acces');
1476
+    return securiser_acces_low_sec($id_auteur, $cle, $op ? "$dir $op $args" : $dir);
1477 1477
 }
1478 1478
 
1479 1479
 /**
@@ -1498,13 +1498,13 @@  discard block
 block discarded – undo
1498 1498
  *     Retourne $texte, sinon $sinon.
1499 1499
  **/
1500 1500
 function sinon($texte, $sinon = '') {
1501
-	if ($texte) {
1502
-		return $texte;
1503
-	} elseif (is_scalar($texte) and strlen($texte)) {
1504
-		return $texte;
1505
-	} else {
1506
-		return $sinon;
1507
-	}
1501
+    if ($texte) {
1502
+        return $texte;
1503
+    } elseif (is_scalar($texte) and strlen($texte)) {
1504
+        return $texte;
1505
+    } else {
1506
+        return $sinon;
1507
+    }
1508 1508
 }
1509 1509
 
1510 1510
 /**
@@ -1528,7 +1528,7 @@  discard block
 block discarded – undo
1528 1528
  * @return mixed
1529 1529
  **/
1530 1530
 function choixsivide($a, $vide, $pasvide) {
1531
-	return $a ? $pasvide : $vide;
1531
+    return $a ? $pasvide : $vide;
1532 1532
 }
1533 1533
 
1534 1534
 /**
@@ -1552,7 +1552,7 @@  discard block
 block discarded – undo
1552 1552
  * @return mixed
1553 1553
  **/
1554 1554
 function choixsiegal($a1, $a2, $v, $f) {
1555
-	return ($a1 == $a2) ? $v : $f;
1555
+    return ($a1 == $a2) ? $v : $f;
1556 1556
 }
1557 1557
 
1558 1558
 //
@@ -1571,13 +1571,13 @@  discard block
 block discarded – undo
1571 1571
  * @return string
1572 1572
  **/
1573 1573
 function filtrer_ical($texte) {
1574
-	#include_spip('inc/charsets');
1575
-	$texte = html2unicode($texte);
1576
-	$texte = unicode2charset(charset2unicode($texte, $GLOBALS['meta']['charset']), 'utf-8');
1577
-	$texte = preg_replace("/\n/", ' ', $texte);
1578
-	$texte = preg_replace('/,/', '\,', $texte);
1574
+    #include_spip('inc/charsets');
1575
+    $texte = html2unicode($texte);
1576
+    $texte = unicode2charset(charset2unicode($texte, $GLOBALS['meta']['charset']), 'utf-8');
1577
+    $texte = preg_replace("/\n/", ' ', $texte);
1578
+    $texte = preg_replace('/,/', '\,', $texte);
1579 1579
 
1580
-	return $texte;
1580
+    return $texte;
1581 1581
 }
1582 1582
 
1583 1583
 
@@ -1602,54 +1602,54 @@  discard block
 block discarded – undo
1602 1602
  * @return string
1603 1603
  **/
1604 1604
 function post_autobr($texte, $delim = "\n_ ") {
1605
-	if (!function_exists('echappe_html')) {
1606
-		include_spip('inc/texte_mini');
1607
-	}
1608
-	$texte = str_replace("\r\n", "\r", $texte);
1609
-	$texte = str_replace("\r", "\n", $texte);
1610
-
1611
-	if (preg_match(",\n+$,", $texte, $fin)) {
1612
-		$texte = substr($texte, 0, -strlen($fin = $fin[0]));
1613
-	} else {
1614
-		$fin = '';
1615
-	}
1616
-
1617
-	$texte = echappe_html($texte, '', true);
1618
-
1619
-	// echapper les modeles
1620
-	if (strpos($texte, '<') !== false) {
1621
-		include_spip('inc/lien');
1622
-		if (defined('_PREG_MODELE')) {
1623
-			$preg_modeles = '@' . _PREG_MODELE . '@imsS';
1624
-			$texte = echappe_html($texte, '', true, $preg_modeles);
1625
-		}
1626
-	}
1627
-
1628
-	$debut = '';
1629
-	$suite = $texte;
1630
-	while ($t = strpos('-' . $suite, "\n", 1)) {
1631
-		$debut .= substr($suite, 0, $t - 1);
1632
-		$suite = substr($suite, $t);
1633
-		$car = substr($suite, 0, 1);
1634
-		if (
1635
-			($car <> '-') and ($car <> '_') and ($car <> "\n") and ($car <> '|') and ($car <> '}')
1636
-			and !preg_match(',^\s*(\n|</?(quote|div|dl|dt|dd)|$),S', ($suite))
1637
-			and !preg_match(',</?(quote|div|dl|dt|dd)> *$,iS', $debut)
1638
-		) {
1639
-			$debut .= $delim;
1640
-		} else {
1641
-			$debut .= "\n";
1642
-		}
1643
-		if (preg_match(",^\n+,", $suite, $regs)) {
1644
-			$debut .= $regs[0];
1645
-			$suite = substr($suite, strlen($regs[0]));
1646
-		}
1647
-	}
1648
-	$texte = $debut . $suite;
1649
-
1650
-	$texte = echappe_retour($texte);
1651
-
1652
-	return $texte . $fin;
1605
+    if (!function_exists('echappe_html')) {
1606
+        include_spip('inc/texte_mini');
1607
+    }
1608
+    $texte = str_replace("\r\n", "\r", $texte);
1609
+    $texte = str_replace("\r", "\n", $texte);
1610
+
1611
+    if (preg_match(",\n+$,", $texte, $fin)) {
1612
+        $texte = substr($texte, 0, -strlen($fin = $fin[0]));
1613
+    } else {
1614
+        $fin = '';
1615
+    }
1616
+
1617
+    $texte = echappe_html($texte, '', true);
1618
+
1619
+    // echapper les modeles
1620
+    if (strpos($texte, '<') !== false) {
1621
+        include_spip('inc/lien');
1622
+        if (defined('_PREG_MODELE')) {
1623
+            $preg_modeles = '@' . _PREG_MODELE . '@imsS';
1624
+            $texte = echappe_html($texte, '', true, $preg_modeles);
1625
+        }
1626
+    }
1627
+
1628
+    $debut = '';
1629
+    $suite = $texte;
1630
+    while ($t = strpos('-' . $suite, "\n", 1)) {
1631
+        $debut .= substr($suite, 0, $t - 1);
1632
+        $suite = substr($suite, $t);
1633
+        $car = substr($suite, 0, 1);
1634
+        if (
1635
+            ($car <> '-') and ($car <> '_') and ($car <> "\n") and ($car <> '|') and ($car <> '}')
1636
+            and !preg_match(',^\s*(\n|</?(quote|div|dl|dt|dd)|$),S', ($suite))
1637
+            and !preg_match(',</?(quote|div|dl|dt|dd)> *$,iS', $debut)
1638
+        ) {
1639
+            $debut .= $delim;
1640
+        } else {
1641
+            $debut .= "\n";
1642
+        }
1643
+        if (preg_match(",^\n+,", $suite, $regs)) {
1644
+            $debut .= $regs[0];
1645
+            $suite = substr($suite, strlen($regs[0]));
1646
+        }
1647
+    }
1648
+    $texte = $debut . $suite;
1649
+
1650
+    $texte = echappe_retour($texte);
1651
+
1652
+    return $texte . $fin;
1653 1653
 }
1654 1654
 
1655 1655
 
@@ -1690,47 +1690,47 @@  discard block
 block discarded – undo
1690 1690
  * @return string
1691 1691
  **/
1692 1692
 function extraire_idiome($letexte, $lang = null, $options = []) {
1693
-	static $traduire = false;
1694
-	if (
1695
-		$letexte
1696
-		and preg_match_all(_EXTRAIRE_IDIOME, $letexte, $regs, PREG_SET_ORDER)
1697
-	) {
1698
-		if (!$traduire) {
1699
-			$traduire = charger_fonction('traduire', 'inc');
1700
-			include_spip('inc/lang');
1701
-		}
1702
-		if (!$lang) {
1703
-			$lang = $GLOBALS['spip_lang'];
1704
-		}
1705
-		// Compatibilité avec le prototype de fonction précédente qui utilisait un boolean
1706
-		if (is_bool($options)) {
1707
-			$options = ['echappe_span' => $options];
1708
-		}
1709
-		if (!isset($options['echappe_span'])) {
1710
-			$options = array_merge($options, ['echappe_span' => false]);
1711
-		}
1712
-
1713
-		foreach ($regs as $reg) {
1714
-			$cle = ($reg[1] ? $reg[1] . ':' : '') . $reg[2];
1715
-			$desc = $traduire($cle, $lang, true);
1716
-			$l = $desc->langue;
1717
-			// si pas de traduction, on laissera l'écriture de l'idiome entier dans le texte.
1718
-			if (strlen($desc->texte ?? '')) {
1719
-				$trad = code_echappement($desc->texte, 'idiome', false);
1720
-				if ($l !== $lang) {
1721
-					$trad = str_replace("'", '"', inserer_attribut($trad, 'lang', $l));
1722
-				}
1723
-				if (lang_dir($l) !== lang_dir($lang)) {
1724
-					$trad = str_replace("'", '"', inserer_attribut($trad, 'dir', lang_dir($l)));
1725
-				}
1726
-				if (!$options['echappe_span']) {
1727
-					$trad = echappe_retour($trad, 'idiome');
1728
-				}
1729
-				$letexte = str_replace($reg[0], $trad, $letexte);
1730
-			}
1731
-		}
1732
-	}
1733
-	return $letexte;
1693
+    static $traduire = false;
1694
+    if (
1695
+        $letexte
1696
+        and preg_match_all(_EXTRAIRE_IDIOME, $letexte, $regs, PREG_SET_ORDER)
1697
+    ) {
1698
+        if (!$traduire) {
1699
+            $traduire = charger_fonction('traduire', 'inc');
1700
+            include_spip('inc/lang');
1701
+        }
1702
+        if (!$lang) {
1703
+            $lang = $GLOBALS['spip_lang'];
1704
+        }
1705
+        // Compatibilité avec le prototype de fonction précédente qui utilisait un boolean
1706
+        if (is_bool($options)) {
1707
+            $options = ['echappe_span' => $options];
1708
+        }
1709
+        if (!isset($options['echappe_span'])) {
1710
+            $options = array_merge($options, ['echappe_span' => false]);
1711
+        }
1712
+
1713
+        foreach ($regs as $reg) {
1714
+            $cle = ($reg[1] ? $reg[1] . ':' : '') . $reg[2];
1715
+            $desc = $traduire($cle, $lang, true);
1716
+            $l = $desc->langue;
1717
+            // si pas de traduction, on laissera l'écriture de l'idiome entier dans le texte.
1718
+            if (strlen($desc->texte ?? '')) {
1719
+                $trad = code_echappement($desc->texte, 'idiome', false);
1720
+                if ($l !== $lang) {
1721
+                    $trad = str_replace("'", '"', inserer_attribut($trad, 'lang', $l));
1722
+                }
1723
+                if (lang_dir($l) !== lang_dir($lang)) {
1724
+                    $trad = str_replace("'", '"', inserer_attribut($trad, 'dir', lang_dir($l)));
1725
+                }
1726
+                if (!$options['echappe_span']) {
1727
+                    $trad = echappe_retour($trad, 'idiome');
1728
+                }
1729
+                $letexte = str_replace($reg[0], $trad, $letexte);
1730
+            }
1731
+        }
1732
+    }
1733
+    return $letexte;
1734 1734
 }
1735 1735
 
1736 1736
 /**
@@ -1782,68 +1782,68 @@  discard block
 block discarded – undo
1782 1782
  **/
1783 1783
 function extraire_multi($letexte, $lang = null, $options = []) {
1784 1784
 
1785
-	if (
1786
-		$letexte
1787
-		and preg_match_all(_EXTRAIRE_MULTI, $letexte, $regs, PREG_SET_ORDER)
1788
-	) {
1789
-		if (!$lang) {
1790
-			$lang = $GLOBALS['spip_lang'];
1791
-		}
1792
-
1793
-		// Compatibilité avec le prototype de fonction précédente qui utilisait un boolean
1794
-		if (is_bool($options)) {
1795
-			$options = ['echappe_span' => $options, 'lang_defaut' => _LANGUE_PAR_DEFAUT];
1796
-		}
1797
-		if (!isset($options['echappe_span'])) {
1798
-			$options = array_merge($options, ['echappe_span' => false]);
1799
-		}
1800
-		if (!isset($options['lang_defaut'])) {
1801
-			$options = array_merge($options, ['lang_defaut' => _LANGUE_PAR_DEFAUT]);
1802
-		}
1803
-
1804
-		include_spip('inc/lang');
1805
-		foreach ($regs as $reg) {
1806
-			// chercher la version de la langue courante
1807
-			$trads = extraire_trads($reg[1]);
1808
-			if ($l = approcher_langue($trads, $lang)) {
1809
-				$trad = $trads[$l];
1810
-			} else {
1811
-				if ($options['lang_defaut'] == 'aucune') {
1812
-					$trad = '';
1813
-				} else {
1814
-					// langue absente, prendre le fr ou une langue précisée (meme comportement que inc/traduire.php)
1815
-					// ou la premiere dispo
1816
-					// mais typographier le texte selon les regles de celle-ci
1817
-					// Attention aux blocs multi sur plusieurs lignes
1818
-					if (!$l = approcher_langue($trads, $options['lang_defaut'])) {
1819
-						$l = key($trads);
1820
-					}
1821
-					$trad = $trads[$l];
1822
-					$typographie = charger_fonction(lang_typo($l), 'typographie');
1823
-					$trad = $typographie($trad);
1824
-					// Tester si on echappe en span ou en div
1825
-					// il ne faut pas echapper en div si propre produit un seul paragraphe
1826
-					include_spip('inc/texte');
1827
-					$trad_propre = preg_replace(',(^<p[^>]*>|</p>$),Uims', '', propre($trad));
1828
-					$mode = preg_match(',</?(' . _BALISES_BLOCS . ')[>[:space:]],iS', $trad_propre) ? 'div' : 'span';
1829
-					if ($mode === 'div') {
1830
-						$trad = rtrim($trad) . "\n\n";
1831
-					}
1832
-					$trad = code_echappement($trad, 'multi', false, $mode);
1833
-					$trad = str_replace("'", '"', inserer_attribut($trad, 'lang', $l));
1834
-					if (lang_dir($l) !== lang_dir($lang)) {
1835
-						$trad = str_replace("'", '"', inserer_attribut($trad, 'dir', lang_dir($l)));
1836
-					}
1837
-					if (!$options['echappe_span']) {
1838
-						$trad = echappe_retour($trad, 'multi');
1839
-					}
1840
-				}
1841
-			}
1842
-			$letexte = str_replace($reg[0], $trad, $letexte);
1843
-		}
1844
-	}
1845
-
1846
-	return $letexte;
1785
+    if (
1786
+        $letexte
1787
+        and preg_match_all(_EXTRAIRE_MULTI, $letexte, $regs, PREG_SET_ORDER)
1788
+    ) {
1789
+        if (!$lang) {
1790
+            $lang = $GLOBALS['spip_lang'];
1791
+        }
1792
+
1793
+        // Compatibilité avec le prototype de fonction précédente qui utilisait un boolean
1794
+        if (is_bool($options)) {
1795
+            $options = ['echappe_span' => $options, 'lang_defaut' => _LANGUE_PAR_DEFAUT];
1796
+        }
1797
+        if (!isset($options['echappe_span'])) {
1798
+            $options = array_merge($options, ['echappe_span' => false]);
1799
+        }
1800
+        if (!isset($options['lang_defaut'])) {
1801
+            $options = array_merge($options, ['lang_defaut' => _LANGUE_PAR_DEFAUT]);
1802
+        }
1803
+
1804
+        include_spip('inc/lang');
1805
+        foreach ($regs as $reg) {
1806
+            // chercher la version de la langue courante
1807
+            $trads = extraire_trads($reg[1]);
1808
+            if ($l = approcher_langue($trads, $lang)) {
1809
+                $trad = $trads[$l];
1810
+            } else {
1811
+                if ($options['lang_defaut'] == 'aucune') {
1812
+                    $trad = '';
1813
+                } else {
1814
+                    // langue absente, prendre le fr ou une langue précisée (meme comportement que inc/traduire.php)
1815
+                    // ou la premiere dispo
1816
+                    // mais typographier le texte selon les regles de celle-ci
1817
+                    // Attention aux blocs multi sur plusieurs lignes
1818
+                    if (!$l = approcher_langue($trads, $options['lang_defaut'])) {
1819
+                        $l = key($trads);
1820
+                    }
1821
+                    $trad = $trads[$l];
1822
+                    $typographie = charger_fonction(lang_typo($l), 'typographie');
1823
+                    $trad = $typographie($trad);
1824
+                    // Tester si on echappe en span ou en div
1825
+                    // il ne faut pas echapper en div si propre produit un seul paragraphe
1826
+                    include_spip('inc/texte');
1827
+                    $trad_propre = preg_replace(',(^<p[^>]*>|</p>$),Uims', '', propre($trad));
1828
+                    $mode = preg_match(',</?(' . _BALISES_BLOCS . ')[>[:space:]],iS', $trad_propre) ? 'div' : 'span';
1829
+                    if ($mode === 'div') {
1830
+                        $trad = rtrim($trad) . "\n\n";
1831
+                    }
1832
+                    $trad = code_echappement($trad, 'multi', false, $mode);
1833
+                    $trad = str_replace("'", '"', inserer_attribut($trad, 'lang', $l));
1834
+                    if (lang_dir($l) !== lang_dir($lang)) {
1835
+                        $trad = str_replace("'", '"', inserer_attribut($trad, 'dir', lang_dir($l)));
1836
+                    }
1837
+                    if (!$options['echappe_span']) {
1838
+                        $trad = echappe_retour($trad, 'multi');
1839
+                    }
1840
+                }
1841
+            }
1842
+            $letexte = str_replace($reg[0], $trad, $letexte);
1843
+        }
1844
+    }
1845
+
1846
+    return $letexte;
1847 1847
 }
1848 1848
 
1849 1849
 /**
@@ -1859,21 +1859,21 @@  discard block
 block discarded – undo
1859 1859
  *     Peut retourner un code de langue vide, lorsqu'un texte par défaut est indiqué.
1860 1860
  **/
1861 1861
 function extraire_trads($bloc) {
1862
-	$trads = [];
1863
-	$lang = '';
1862
+    $trads = [];
1863
+    $lang = '';
1864 1864
 // ce reg fait planter l'analyse multi s'il y a de l'{italique} dans le champ
1865 1865
 //	while (preg_match("/^(.*?)[{\[]([a-z_]+)[}\]]/siS", $bloc, $regs)) {
1866
-	while (preg_match('/^(.*?)[\[]([a-z_]+)[\]]/siS', $bloc, $regs)) {
1867
-		$texte = trim($regs[1]);
1868
-		if ($texte or $lang) {
1869
-			$trads[$lang] = $texte;
1870
-		}
1871
-		$bloc = substr($bloc, strlen($regs[0]));
1872
-		$lang = $regs[2];
1873
-	}
1874
-	$trads[$lang] = $bloc;
1866
+    while (preg_match('/^(.*?)[\[]([a-z_]+)[\]]/siS', $bloc, $regs)) {
1867
+        $texte = trim($regs[1]);
1868
+        if ($texte or $lang) {
1869
+            $trads[$lang] = $texte;
1870
+        }
1871
+        $bloc = substr($bloc, strlen($regs[0]));
1872
+        $lang = $regs[2];
1873
+    }
1874
+    $trads[$lang] = $bloc;
1875 1875
 
1876
-	return $trads;
1876
+    return $trads;
1877 1877
 }
1878 1878
 
1879 1879
 
@@ -1884,7 +1884,7 @@  discard block
 block discarded – undo
1884 1884
  * @return string L'initiale en majuscule
1885 1885
  */
1886 1886
 function filtre_initiale($nom) {
1887
-	return spip_substr(trim(strtoupper(extraire_multi($nom))), 0, 1);
1887
+    return spip_substr(trim(strtoupper(extraire_multi($nom))), 0, 1);
1888 1888
 }
1889 1889
 
1890 1890
 
@@ -1929,33 +1929,33 @@  discard block
 block discarded – undo
1929 1929
  *      - null (interne) : si on empile
1930 1930
  **/
1931 1931
 function unique($donnee, $famille = '', $cpt = false) {
1932
-	static $mem = [];
1933
-	// permettre de vider la pile et de la restaurer
1934
-	// pour le calcul de introduction...
1935
-	if ($famille == '_spip_raz_') {
1936
-		$tmp = $mem;
1937
-		$mem = [];
1938
-
1939
-		return $tmp;
1940
-	} elseif ($famille == '_spip_set_') {
1941
-		$mem = $donnee;
1942
-
1943
-		return;
1944
-	}
1945
-	// eviter une notice
1946
-	if (!isset($mem[$famille])) {
1947
-		$mem[$famille] = [];
1948
-	}
1949
-	if ($cpt) {
1950
-		return is_countable($mem[$famille]) ? count($mem[$famille]) : 0;
1951
-	}
1952
-	// eviter une notice
1953
-	if (!isset($mem[$famille][$donnee])) {
1954
-		$mem[$famille][$donnee] = 0;
1955
-	}
1956
-	if (!($mem[$famille][$donnee]++)) {
1957
-		return $donnee;
1958
-	}
1932
+    static $mem = [];
1933
+    // permettre de vider la pile et de la restaurer
1934
+    // pour le calcul de introduction...
1935
+    if ($famille == '_spip_raz_') {
1936
+        $tmp = $mem;
1937
+        $mem = [];
1938
+
1939
+        return $tmp;
1940
+    } elseif ($famille == '_spip_set_') {
1941
+        $mem = $donnee;
1942
+
1943
+        return;
1944
+    }
1945
+    // eviter une notice
1946
+    if (!isset($mem[$famille])) {
1947
+        $mem[$famille] = [];
1948
+    }
1949
+    if ($cpt) {
1950
+        return is_countable($mem[$famille]) ? count($mem[$famille]) : 0;
1951
+    }
1952
+    // eviter une notice
1953
+    if (!isset($mem[$famille][$donnee])) {
1954
+        $mem[$famille][$donnee] = 0;
1955
+    }
1956
+    if (!($mem[$famille][$donnee]++)) {
1957
+        return $donnee;
1958
+    }
1959 1959
 }
1960 1960
 
1961 1961
 
@@ -1985,20 +1985,20 @@  discard block
 block discarded – undo
1985 1985
  *     Une des valeurs en fonction du compteur.
1986 1986
  **/
1987 1987
 function alterner($i, ...$args) {
1988
-	// recuperer les arguments (attention fonctions un peu space)
1989
-	$num = count($args);
1988
+    // recuperer les arguments (attention fonctions un peu space)
1989
+    $num = count($args);
1990 1990
 
1991
-	if ($num === 1 && is_array($args[0])) {
1992
-		// un tableau de valeur dont les cles sont numerotees de 0 a num
1993
-		$args = array_values($args[0]);
1994
-		$num = count($args);
1995
-	}
1991
+    if ($num === 1 && is_array($args[0])) {
1992
+        // un tableau de valeur dont les cles sont numerotees de 0 a num
1993
+        $args = array_values($args[0]);
1994
+        $num = count($args);
1995
+    }
1996 1996
 
1997
-	// un index compris entre 0 et num exclus
1998
-	$i = ((intval($i) - 1) % $num); // dans ]-$num;$num[
1999
-	$i = ($i + $num) % $num; // dans [0;$num[
2000
-	// renvoyer le i-ieme argument, modulo le nombre d'arguments
2001
-	return $args[$i];
1997
+    // un index compris entre 0 et num exclus
1998
+    $i = ((intval($i) - 1) % $num); // dans ]-$num;$num[
1999
+    $i = ($i + $num) % $num; // dans [0;$num[
2000
+    // renvoyer le i-ieme argument, modulo le nombre d'arguments
2001
+    return $args[$i];
2002 2002
 }
2003 2003
 
2004 2004
 
@@ -2024,51 +2024,51 @@  discard block
 block discarded – undo
2024 2024
  *     - null lorsque l’attribut n’existe pas.
2025 2025
  **/
2026 2026
 function extraire_attribut($balise, $attribut, $complet = false) {
2027
-	if (is_array($balise)) {
2028
-		array_walk(
2029
-			$balise,
2030
-			function (&$a, $key, $t) {
2031
-				$a = extraire_attribut($a, $t);
2032
-			},
2033
-			$attribut
2034
-		);
2035
-
2036
-		return $balise;
2037
-	}
2038
-	if (
2039
-		$balise
2040
-		&& preg_match(
2041
-			',(^.*?<(?:(?>\s*)(?>[\w:.-]+)(?>(?:=(?:"[^"]*"|\'[^\']*\'|[^\'"]\S*))?))*?)(\s+'
2042
-			. $attribut
2043
-			. '(?:=\s*("[^"]*"|\'[^\']*\'|[^\'"]\S*))?)()((?:[\s/][^>]*)?>.*),isS',
2044
-			$balise,
2045
-			$r
2046
-		)
2047
-	) {
2048
-		if (isset($r[3][0]) and ($r[3][0] == '"' || $r[3][0] == "'")) {
2049
-			$r[4] = substr($r[3], 1, -1);
2050
-			$r[3] = $r[3][0];
2051
-		} elseif ($r[3] !== '') {
2052
-			$r[4] = $r[3];
2053
-			$r[3] = '';
2054
-		} else {
2055
-			$r[4] = trim($r[2]);
2056
-		}
2057
-		$att = $r[4];
2058
-		if (strpos($att, '&#') !== false) {
2059
-			$att = str_replace(['&#039;', '&#39;', '&#034;', '&#34;'], ["'", "'", '"', '"'], $att);
2060
-		}
2061
-		$att = filtrer_entites($att);
2062
-	} else {
2063
-		$att = null;
2064
-		$r = [];
2065
-	}
2066
-
2067
-	if ($complet) {
2068
-		return [$att, $r];
2069
-	} else {
2070
-		return $att;
2071
-	}
2027
+    if (is_array($balise)) {
2028
+        array_walk(
2029
+            $balise,
2030
+            function (&$a, $key, $t) {
2031
+                $a = extraire_attribut($a, $t);
2032
+            },
2033
+            $attribut
2034
+        );
2035
+
2036
+        return $balise;
2037
+    }
2038
+    if (
2039
+        $balise
2040
+        && preg_match(
2041
+            ',(^.*?<(?:(?>\s*)(?>[\w:.-]+)(?>(?:=(?:"[^"]*"|\'[^\']*\'|[^\'"]\S*))?))*?)(\s+'
2042
+            . $attribut
2043
+            . '(?:=\s*("[^"]*"|\'[^\']*\'|[^\'"]\S*))?)()((?:[\s/][^>]*)?>.*),isS',
2044
+            $balise,
2045
+            $r
2046
+        )
2047
+    ) {
2048
+        if (isset($r[3][0]) and ($r[3][0] == '"' || $r[3][0] == "'")) {
2049
+            $r[4] = substr($r[3], 1, -1);
2050
+            $r[3] = $r[3][0];
2051
+        } elseif ($r[3] !== '') {
2052
+            $r[4] = $r[3];
2053
+            $r[3] = '';
2054
+        } else {
2055
+            $r[4] = trim($r[2]);
2056
+        }
2057
+        $att = $r[4];
2058
+        if (strpos($att, '&#') !== false) {
2059
+            $att = str_replace(['&#039;', '&#39;', '&#034;', '&#34;'], ["'", "'", '"', '"'], $att);
2060
+        }
2061
+        $att = filtrer_entites($att);
2062
+    } else {
2063
+        $att = null;
2064
+        $r = [];
2065
+    }
2066
+
2067
+    if ($complet) {
2068
+        return [$att, $r];
2069
+    } else {
2070
+        return $att;
2071
+    }
2072 2072
 }
2073 2073
 
2074 2074
 /**
@@ -2101,41 +2101,41 @@  discard block
 block discarded – undo
2101 2101
  **/
2102 2102
 function inserer_attribut(?string $balise, string $attribut, string $val, bool $proteger = true, bool $vider = false): string {
2103 2103
 
2104
-	if ($balise === null or $balise === '') {
2105
-		return '';
2106
-	}
2104
+    if ($balise === null or $balise === '') {
2105
+        return '';
2106
+    }
2107 2107
 
2108
-	// preparer l'attribut
2109
-	// supprimer les &nbsp; etc mais pas les balises html
2110
-	// qui ont un sens dans un attribut value d'un input
2111
-	if ($proteger) {
2112
-		$val = attribut_html($val, false);
2113
-	}
2108
+    // preparer l'attribut
2109
+    // supprimer les &nbsp; etc mais pas les balises html
2110
+    // qui ont un sens dans un attribut value d'un input
2111
+    if ($proteger) {
2112
+        $val = attribut_html($val, false);
2113
+    }
2114 2114
 
2115
-	// echapper les ' pour eviter tout bug
2116
-	$val = str_replace("'", '&#039;', $val);
2117
-	if ($vider and strlen($val) === 0) {
2118
-		$insert = '';
2119
-	} else {
2120
-		$insert = " $attribut='$val'";
2121
-	}
2115
+    // echapper les ' pour eviter tout bug
2116
+    $val = str_replace("'", '&#039;', $val);
2117
+    if ($vider and strlen($val) === 0) {
2118
+        $insert = '';
2119
+    } else {
2120
+        $insert = " $attribut='$val'";
2121
+    }
2122 2122
 
2123
-	[$old, $r] = extraire_attribut($balise, $attribut, true);
2123
+    [$old, $r] = extraire_attribut($balise, $attribut, true);
2124 2124
 
2125
-	if ($old !== null) {
2126
-		// Remplacer l'ancien attribut du meme nom
2127
-		$balise = $r[1] . $insert . $r[5];
2128
-	} else {
2129
-		// preferer une balise " />" (comme <img />)
2130
-		if (preg_match(',/>,', $balise)) {
2131
-			$balise = preg_replace(',\s?/>,S', $insert . ' />', $balise, 1);
2132
-		} // sinon une balise <a ...> ... </a>
2133
-		else {
2134
-			$balise = preg_replace(',\s?>,S', $insert . '>', $balise, 1);
2135
-		}
2136
-	}
2125
+    if ($old !== null) {
2126
+        // Remplacer l'ancien attribut du meme nom
2127
+        $balise = $r[1] . $insert . $r[5];
2128
+    } else {
2129
+        // preferer une balise " />" (comme <img />)
2130
+        if (preg_match(',/>,', $balise)) {
2131
+            $balise = preg_replace(',\s?/>,S', $insert . ' />', $balise, 1);
2132
+        } // sinon une balise <a ...> ... </a>
2133
+        else {
2134
+            $balise = preg_replace(',\s?>,S', $insert . '>', $balise, 1);
2135
+        }
2136
+    }
2137 2137
 
2138
-	return $balise;
2138
+    return $balise;
2139 2139
 }
2140 2140
 
2141 2141
 /**
@@ -2153,7 +2153,7 @@  discard block
 block discarded – undo
2153 2153
  * @return string Code HTML sans l'attribut
2154 2154
  **/
2155 2155
 function vider_attribut(?string $balise, string $attribut): string {
2156
-	return inserer_attribut($balise, $attribut, '', false, true);
2156
+    return inserer_attribut($balise, $attribut, '', false, true);
2157 2157
 }
2158 2158
 
2159 2159
 /**
@@ -2165,53 +2165,53 @@  discard block
 block discarded – undo
2165 2165
  * @return string
2166 2166
  */
2167 2167
 function modifier_class($balise, $class, $operation = 'ajouter') {
2168
-	if (is_string($class)) {
2169
-		$class = explode(' ', trim($class));
2170
-	}
2171
-	$class = array_filter($class);
2172
-	$class = array_unique($class);
2173
-	if (!$class) {
2174
-		return $balise;
2175
-	}
2176
-
2177
-	// si la ou les classes ont des caracteres invalides on ne fait rien
2178
-	if (preg_match(',[^\w-],', implode('', $class))) {
2179
-		return $balise;
2180
-	}
2181
-
2182
-	$class_courante = extraire_attribut($balise, 'class');
2183
-	$class_new = $class_courante;
2184
-	foreach ($class as $c) {
2185
-		$is_class_presente = false;
2186
-		if (
2187
-			$class_courante
2188
-			and strpos($class_courante, (string) $c) !== false
2189
-			and preg_match('/(^|\s)' . preg_quote($c) . '($|\s)/', $class_courante)
2190
-		) {
2191
-			$is_class_presente = true;
2192
-		}
2193
-		if (
2194
-			in_array($operation, ['ajouter', 'commuter'])
2195
-			and !$is_class_presente
2196
-		) {
2197
-			$class_new = ltrim(rtrim($class_new ?? '') . ' ' . $c);
2198
-		} elseif (
2199
-			in_array($operation, ['supprimer', 'commuter'])
2200
-			and $is_class_presente
2201
-		) {
2202
-			$class_new = trim(preg_replace('/(^|\s)' . preg_quote($c) . '($|\s)/', "\\1", $class_new));
2203
-		}
2204
-	}
2205
-
2206
-	if ($class_new !== $class_courante) {
2207
-		if (strlen($class_new)) {
2208
-			$balise = inserer_attribut($balise, 'class', $class_new);
2209
-		} elseif ($class_courante) {
2210
-			$balise = vider_attribut($balise, 'class');
2211
-		}
2212
-	}
2213
-
2214
-	return $balise;
2168
+    if (is_string($class)) {
2169
+        $class = explode(' ', trim($class));
2170
+    }
2171
+    $class = array_filter($class);
2172
+    $class = array_unique($class);
2173
+    if (!$class) {
2174
+        return $balise;
2175
+    }
2176
+
2177
+    // si la ou les classes ont des caracteres invalides on ne fait rien
2178
+    if (preg_match(',[^\w-],', implode('', $class))) {
2179
+        return $balise;
2180
+    }
2181
+
2182
+    $class_courante = extraire_attribut($balise, 'class');
2183
+    $class_new = $class_courante;
2184
+    foreach ($class as $c) {
2185
+        $is_class_presente = false;
2186
+        if (
2187
+            $class_courante
2188
+            and strpos($class_courante, (string) $c) !== false
2189
+            and preg_match('/(^|\s)' . preg_quote($c) . '($|\s)/', $class_courante)
2190
+        ) {
2191
+            $is_class_presente = true;
2192
+        }
2193
+        if (
2194
+            in_array($operation, ['ajouter', 'commuter'])
2195
+            and !$is_class_presente
2196
+        ) {
2197
+            $class_new = ltrim(rtrim($class_new ?? '') . ' ' . $c);
2198
+        } elseif (
2199
+            in_array($operation, ['supprimer', 'commuter'])
2200
+            and $is_class_presente
2201
+        ) {
2202
+            $class_new = trim(preg_replace('/(^|\s)' . preg_quote($c) . '($|\s)/', "\\1", $class_new));
2203
+        }
2204
+    }
2205
+
2206
+    if ($class_new !== $class_courante) {
2207
+        if (strlen($class_new)) {
2208
+            $balise = inserer_attribut($balise, 'class', $class_new);
2209
+        } elseif ($class_courante) {
2210
+            $balise = vider_attribut($balise, 'class');
2211
+        }
2212
+    }
2213
+
2214
+    return $balise;
2215 2215
 }
2216 2216
 
2217 2217
 /**
@@ -2221,7 +2221,7 @@  discard block
 block discarded – undo
2221 2221
  * @return string
2222 2222
  */
2223 2223
 function ajouter_class($balise, $class) {
2224
-	return modifier_class($balise, $class, 'ajouter');
2224
+    return modifier_class($balise, $class, 'ajouter');
2225 2225
 }
2226 2226
 
2227 2227
 /**
@@ -2231,7 +2231,7 @@  discard block
 block discarded – undo
2231 2231
  * @return string
2232 2232
  */
2233 2233
 function supprimer_class($balise, $class) {
2234
-	return modifier_class($balise, $class, 'supprimer');
2234
+    return modifier_class($balise, $class, 'supprimer');
2235 2235
 }
2236 2236
 
2237 2237
 /**
@@ -2242,7 +2242,7 @@  discard block
 block discarded – undo
2242 2242
  * @return string
2243 2243
  */
2244 2244
 function commuter_class($balise, $class) {
2245
-	return modifier_class($balise, $class, 'commuter');
2245
+    return modifier_class($balise, $class, 'commuter');
2246 2246
 }
2247 2247
 
2248 2248
 /**
@@ -2253,19 +2253,19 @@  discard block
 block discarded – undo
2253 2253
  * @return string
2254 2254
  */
2255 2255
 function tester_config($id, $mode = '') {
2256
-	include_spip('action/inscrire_auteur');
2256
+    include_spip('action/inscrire_auteur');
2257 2257
 
2258
-	return tester_statut_inscription($mode, $id);
2258
+    return tester_statut_inscription($mode, $id);
2259 2259
 }
2260 2260
 
2261 2261
 //
2262 2262
 // Quelques fonctions de calcul arithmetique
2263 2263
 //
2264 2264
 function floatstr($a) {
2265
- return str_replace(',', '.', (string)floatval($a));
2265
+    return str_replace(',', '.', (string)floatval($a));
2266 2266
 }
2267 2267
 function strize($f, $a, $b) {
2268
- return floatstr($f(floatstr($a), floatstr($b)));
2268
+    return floatstr($f(floatstr($a), floatstr($b)));
2269 2269
 }
2270 2270
 
2271 2271
 /**
@@ -2284,7 +2284,7 @@  discard block
 block discarded – undo
2284 2284
  * @return int $a+$b
2285 2285
  **/
2286 2286
 function plus($a, $b) {
2287
-	return $a + $b;
2287
+    return $a + $b;
2288 2288
 }
2289 2289
 function strplus($a, $b) {
2290 2290
 return strize('plus', $a, $b);
@@ -2305,7 +2305,7 @@  discard block
 block discarded – undo
2305 2305
  * @return int $a-$b
2306 2306
  **/
2307 2307
 function moins($a, $b) {
2308
-	return $a - $b;
2308
+    return $a - $b;
2309 2309
 }
2310 2310
 function strmoins($a, $b) {
2311 2311
 return strize('moins', $a, $b);
@@ -2328,7 +2328,7 @@  discard block
 block discarded – undo
2328 2328
  * @return int $a*$b
2329 2329
  **/
2330 2330
 function mult($a, $b) {
2331
-	return $a * $b;
2331
+    return $a * $b;
2332 2332
 }
2333 2333
 function strmult($a, $b) {
2334 2334
 return strize('mult', $a, $b);
@@ -2351,7 +2351,7 @@  discard block
 block discarded – undo
2351 2351
  * @return int $a/$b (ou 0 si $b est nul)
2352 2352
  **/
2353 2353
 function div($a, $b) {
2354
-	return $b ? $a / $b : 0;
2354
+    return $b ? $a / $b : 0;
2355 2355
 }
2356 2356
 function strdiv($a, $b) {
2357 2357
 return strize('div', $a, $b);
@@ -2375,7 +2375,7 @@  discard block
 block discarded – undo
2375 2375
  * @return int ($nb % $mod) + $add
2376 2376
  **/
2377 2377
 function modulo($nb, $mod, $add = 0) {
2378
-	return ($mod ? $nb % $mod : 0) + $add;
2378
+    return ($mod ? $nb % $mod : 0) + $add;
2379 2379
 }
2380 2380
 
2381 2381
 
@@ -2390,26 +2390,26 @@  discard block
 block discarded – undo
2390 2390
  *      - true sinon
2391 2391
  **/
2392 2392
 function nom_acceptable($nom) {
2393
-	$remp2 = [];
2394
-	$remp1 = [];
2395
-	if (!is_string($nom)) {
2396
-		return false;
2397
-	}
2398
-	if (!defined('_TAGS_NOM_AUTEUR')) {
2399
-		define('_TAGS_NOM_AUTEUR', '');
2400
-	}
2401
-	$tags_acceptes = array_unique(explode(',', 'multi,' . _TAGS_NOM_AUTEUR));
2402
-	foreach ($tags_acceptes as $tag) {
2403
-		if (strlen($tag)) {
2404
-			$remp1[] = '<' . trim($tag) . '>';
2405
-			$remp1[] = '</' . trim($tag) . '>';
2406
-			$remp2[] = '\x60' . trim($tag) . '\x61';
2407
-			$remp2[] = '\x60/' . trim($tag) . '\x61';
2408
-		}
2409
-	}
2410
-	$v_nom = str_replace($remp2, $remp1, supprimer_tags(str_replace($remp1, $remp2, $nom)));
2411
-
2412
-	return str_replace('&lt;', '<', $v_nom) == $nom;
2393
+    $remp2 = [];
2394
+    $remp1 = [];
2395
+    if (!is_string($nom)) {
2396
+        return false;
2397
+    }
2398
+    if (!defined('_TAGS_NOM_AUTEUR')) {
2399
+        define('_TAGS_NOM_AUTEUR', '');
2400
+    }
2401
+    $tags_acceptes = array_unique(explode(',', 'multi,' . _TAGS_NOM_AUTEUR));
2402
+    foreach ($tags_acceptes as $tag) {
2403
+        if (strlen($tag)) {
2404
+            $remp1[] = '<' . trim($tag) . '>';
2405
+            $remp1[] = '</' . trim($tag) . '>';
2406
+            $remp2[] = '\x60' . trim($tag) . '\x61';
2407
+            $remp2[] = '\x60/' . trim($tag) . '\x61';
2408
+        }
2409
+    }
2410
+    $v_nom = str_replace($remp2, $remp1, supprimer_tags(str_replace($remp1, $remp2, $nom)));
2411
+
2412
+    return str_replace('&lt;', '<', $v_nom) == $nom;
2413 2413
 }
2414 2414
 
2415 2415
 
@@ -2425,14 +2425,14 @@  discard block
 block discarded – undo
2425 2425
  *      - renvoie un tableau si l'entree est un tableau
2426 2426
  **/
2427 2427
 function email_valide($adresses) {
2428
-	if (is_array($adresses)) {
2429
-		$adresses = array_map('email_valide', $adresses);
2430
-		$adresses = array_filter($adresses);
2431
-		return $adresses;
2432
-	}
2428
+    if (is_array($adresses)) {
2429
+        $adresses = array_map('email_valide', $adresses);
2430
+        $adresses = array_filter($adresses);
2431
+        return $adresses;
2432
+    }
2433 2433
 
2434
-	$email_valide = charger_fonction('email_valide', 'inc');
2435
-	return $email_valide($adresses);
2434
+    $email_valide = charger_fonction('email_valide', 'inc');
2435
+    return $email_valide($adresses);
2436 2436
 }
2437 2437
 
2438 2438
 /**
@@ -2446,29 +2446,29 @@  discard block
 block discarded – undo
2446 2446
  * @return string Texte
2447 2447
  **/
2448 2448
 function afficher_enclosures($tags) {
2449
-	$s = [];
2450
-	foreach (extraire_balises($tags, 'a') as $tag) {
2451
-		if (
2452
-			extraire_attribut($tag, 'rel') == 'enclosure'
2453
-			and $t = extraire_attribut($tag, 'href')
2454
-		) {
2455
-			$s[] = preg_replace(
2456
-				',>[^<]+</a>,S',
2457
-				'>'
2458
-				. http_img_pack(
2459
-					'attachment-16.png',
2460
-					$t,
2461
-					'',
2462
-					$t,
2463
-					['utiliser_suffixe_size' => true]
2464
-				)
2465
-				. '</a>',
2466
-				$tag
2467
-			);
2468
-		}
2469
-	}
2470
-
2471
-	return join('&nbsp;', $s);
2449
+    $s = [];
2450
+    foreach (extraire_balises($tags, 'a') as $tag) {
2451
+        if (
2452
+            extraire_attribut($tag, 'rel') == 'enclosure'
2453
+            and $t = extraire_attribut($tag, 'href')
2454
+        ) {
2455
+            $s[] = preg_replace(
2456
+                ',>[^<]+</a>,S',
2457
+                '>'
2458
+                . http_img_pack(
2459
+                    'attachment-16.png',
2460
+                    $t,
2461
+                    '',
2462
+                    $t,
2463
+                    ['utiliser_suffixe_size' => true]
2464
+                )
2465
+                . '</a>',
2466
+                $tag
2467
+            );
2468
+        }
2469
+    }
2470
+
2471
+    return join('&nbsp;', $s);
2472 2472
 }
2473 2473
 
2474 2474
 /**
@@ -2483,15 +2483,15 @@  discard block
 block discarded – undo
2483 2483
  * @return string Liens trouvés
2484 2484
  **/
2485 2485
 function afficher_tags($tags, $rels = 'tag,directory') {
2486
-	$s = [];
2487
-	foreach (extraire_balises($tags, 'a') as $tag) {
2488
-		$rel = extraire_attribut($tag, 'rel');
2489
-		if (strstr(",$rels,", (string) ",$rel,")) {
2490
-			$s[] = $tag;
2491
-		}
2492
-	}
2486
+    $s = [];
2487
+    foreach (extraire_balises($tags, 'a') as $tag) {
2488
+        $rel = extraire_attribut($tag, 'rel');
2489
+        if (strstr(",$rels,", (string) ",$rel,")) {
2490
+            $s[] = $tag;
2491
+        }
2492
+    }
2493 2493
 
2494
-	return join(', ', $s);
2494
+    return join(', ', $s);
2495 2495
 }
2496 2496
 
2497 2497
 
@@ -2513,21 +2513,21 @@  discard block
 block discarded – undo
2513 2513
  * @return string Tag HTML `<a>` avec microformat.
2514 2514
  **/
2515 2515
 function enclosure2microformat($e) {
2516
-	if (!$url = filtrer_entites(extraire_attribut($e, 'url') ?? '')) {
2517
-		$url = filtrer_entites(extraire_attribut($e, 'href') ?? '');
2518
-	}
2519
-	$type = extraire_attribut($e, 'type');
2520
-	if (!$length = extraire_attribut($e, 'length')) {
2521
-		# <media:content : longeur dans fileSize. On tente.
2522
-		$length = extraire_attribut($e, 'fileSize');
2523
-	}
2524
-	$fichier = basename($url);
2516
+    if (!$url = filtrer_entites(extraire_attribut($e, 'url') ?? '')) {
2517
+        $url = filtrer_entites(extraire_attribut($e, 'href') ?? '');
2518
+    }
2519
+    $type = extraire_attribut($e, 'type');
2520
+    if (!$length = extraire_attribut($e, 'length')) {
2521
+        # <media:content : longeur dans fileSize. On tente.
2522
+        $length = extraire_attribut($e, 'fileSize');
2523
+    }
2524
+    $fichier = basename($url);
2525 2525
 
2526
-	return '<a rel="enclosure"'
2527
-	. ($url ? ' href="' . spip_htmlspecialchars($url) . '"' : '')
2528
-	. ($type ? ' type="' . spip_htmlspecialchars($type) . '"' : '')
2529
-	. ($length ? ' title="' . spip_htmlspecialchars($length) . '"' : '')
2530
-	. '>' . $fichier . '</a>';
2526
+    return '<a rel="enclosure"'
2527
+    . ($url ? ' href="' . spip_htmlspecialchars($url) . '"' : '')
2528
+    . ($type ? ' type="' . spip_htmlspecialchars($type) . '"' : '')
2529
+    . ($length ? ' title="' . spip_htmlspecialchars($length) . '"' : '')
2530
+    . '>' . $fichier . '</a>';
2531 2531
 }
2532 2532
 
2533 2533
 /**
@@ -2545,24 +2545,24 @@  discard block
 block discarded – undo
2545 2545
  * @return string Tags RSS `<enclosure>`.
2546 2546
  **/
2547 2547
 function microformat2enclosure($tags) {
2548
-	$enclosures = [];
2549
-	foreach (extraire_balises($tags, 'a') as $e) {
2550
-		if (extraire_attribut($e, 'rel') == 'enclosure') {
2551
-			$url = filtrer_entites(extraire_attribut($e, 'href'));
2552
-			$type = extraire_attribut($e, 'type');
2553
-			if (!$length = intval(extraire_attribut($e, 'title'))) {
2554
-				$length = intval(extraire_attribut($e, 'length'));
2555
-			} # vieux data
2556
-			$fichier = basename($url);
2557
-			$enclosures[] = '<enclosure'
2558
-				. ($url ? ' url="' . spip_htmlspecialchars($url) . '"' : '')
2559
-				. ($type ? ' type="' . spip_htmlspecialchars($type) . '"' : '')
2560
-				. ($length ? ' length="' . $length . '"' : '')
2561
-				. ' />';
2562
-		}
2563
-	}
2548
+    $enclosures = [];
2549
+    foreach (extraire_balises($tags, 'a') as $e) {
2550
+        if (extraire_attribut($e, 'rel') == 'enclosure') {
2551
+            $url = filtrer_entites(extraire_attribut($e, 'href'));
2552
+            $type = extraire_attribut($e, 'type');
2553
+            if (!$length = intval(extraire_attribut($e, 'title'))) {
2554
+                $length = intval(extraire_attribut($e, 'length'));
2555
+            } # vieux data
2556
+            $fichier = basename($url);
2557
+            $enclosures[] = '<enclosure'
2558
+                . ($url ? ' url="' . spip_htmlspecialchars($url) . '"' : '')
2559
+                . ($type ? ' type="' . spip_htmlspecialchars($type) . '"' : '')
2560
+                . ($length ? ' length="' . $length . '"' : '')
2561
+                . ' />';
2562
+        }
2563
+    }
2564 2564
 
2565
-	return join("\n", $enclosures);
2565
+    return join("\n", $enclosures);
2566 2566
 }
2567 2567
 
2568 2568
 
@@ -2578,16 +2578,16 @@  discard block
 block discarded – undo
2578 2578
  * @return string Tags RSS Atom `<dc:subject>`.
2579 2579
  **/
2580 2580
 function tags2dcsubject($tags) {
2581
-	$subjects = '';
2582
-	foreach (extraire_balises($tags, 'a') as $e) {
2583
-		if (extraire_attribut($e, 'rel') == 'tag') {
2584
-			$subjects .= '<dc:subject>'
2585
-				. texte_backend(textebrut($e))
2586
-				. '</dc:subject>' . "\n";
2587
-		}
2588
-	}
2581
+    $subjects = '';
2582
+    foreach (extraire_balises($tags, 'a') as $e) {
2583
+        if (extraire_attribut($e, 'rel') == 'tag') {
2584
+            $subjects .= '<dc:subject>'
2585
+                . texte_backend(textebrut($e))
2586
+                . '</dc:subject>' . "\n";
2587
+        }
2588
+    }
2589 2589
 
2590
-	return $subjects;
2590
+    return $subjects;
2591 2591
 }
2592 2592
 
2593 2593
 /**
@@ -2616,27 +2616,27 @@  discard block
 block discarded – undo
2616 2616
  *     - Tableau de résultats, si tableau en entrée.
2617 2617
  **/
2618 2618
 function extraire_balise($texte, $tag = 'a') {
2619
-	if (is_array($texte)) {
2620
-		array_walk(
2621
-			$texte,
2622
-			function (&$a, $key, $t) {
2623
-				$a = extraire_balise($a, $t);
2624
-			},
2625
-			$tag
2626
-		);
2627
-
2628
-		return $texte;
2629
-	}
2630
-
2631
-	if (
2632
-		preg_match(
2633
-			",<$tag\b[^>]*(/>|>.*</$tag\b[^>]*>|>),UimsS",
2634
-			$texte,
2635
-			$regs
2636
-		)
2637
-	) {
2638
-		return $regs[0];
2639
-	}
2619
+    if (is_array($texte)) {
2620
+        array_walk(
2621
+            $texte,
2622
+            function (&$a, $key, $t) {
2623
+                $a = extraire_balise($a, $t);
2624
+            },
2625
+            $tag
2626
+        );
2627
+
2628
+        return $texte;
2629
+    }
2630
+
2631
+    if (
2632
+        preg_match(
2633
+            ",<$tag\b[^>]*(/>|>.*</$tag\b[^>]*>|>),UimsS",
2634
+            $texte,
2635
+            $regs
2636
+        )
2637
+    ) {
2638
+        return $regs[0];
2639
+    }
2640 2640
 }
2641 2641
 
2642 2642
 /**
@@ -2664,30 +2664,30 @@  discard block
 block discarded – undo
2664 2664
  *     - Tableau de résultats, si tableau en entrée.
2665 2665
  **/
2666 2666
 function extraire_balises($texte, $tag = 'a') {
2667
-	if (is_array($texte)) {
2668
-		array_walk(
2669
-			$texte,
2670
-			function (&$a, $key, $t) {
2671
-				$a = extraire_balises($a, $t);
2672
-			},
2673
-			$tag
2674
-		);
2675
-
2676
-		return $texte;
2677
-	}
2678
-
2679
-	if (
2680
-		preg_match_all(
2681
-			",<{$tag}\b[^>]*(/>|>.*</{$tag}\b[^>]*>|>),UimsS",
2682
-			$texte,
2683
-			$regs,
2684
-			PREG_PATTERN_ORDER
2685
-		)
2686
-	) {
2687
-		return $regs[0];
2688
-	} else {
2689
-		return [];
2690
-	}
2667
+    if (is_array($texte)) {
2668
+        array_walk(
2669
+            $texte,
2670
+            function (&$a, $key, $t) {
2671
+                $a = extraire_balises($a, $t);
2672
+            },
2673
+            $tag
2674
+        );
2675
+
2676
+        return $texte;
2677
+    }
2678
+
2679
+    if (
2680
+        preg_match_all(
2681
+            ",<{$tag}\b[^>]*(/>|>.*</{$tag}\b[^>]*>|>),UimsS",
2682
+            $texte,
2683
+            $regs,
2684
+            PREG_PATTERN_ORDER
2685
+        )
2686
+    ) {
2687
+        return $regs[0];
2688
+    } else {
2689
+        return [];
2690
+    }
2691 2691
 }
2692 2692
 
2693 2693
 /**
@@ -2716,11 +2716,11 @@  discard block
 block discarded – undo
2716 2716
  *     - `$def` si on n'a pas transmis de tableau
2717 2717
  **/
2718 2718
 function in_any($val, $vals, $def = '') {
2719
-	if (!is_array($vals) and $vals and $v = unserialize($vals)) {
2720
-		$vals = $v;
2721
-	}
2719
+    if (!is_array($vals) and $vals and $v = unserialize($vals)) {
2720
+        $vals = $v;
2721
+    }
2722 2722
 
2723
-	return (!is_array($vals) ? $def : (in_array($val, $vals) ? ' ' : ''));
2723
+    return (!is_array($vals) ? $def : (in_array($val, $vals) ? ' ' : ''));
2724 2724
 }
2725 2725
 
2726 2726
 
@@ -2741,12 +2741,12 @@  discard block
 block discarded – undo
2741 2741
  *     Résultat du calcul
2742 2742
  **/
2743 2743
 function valeur_numerique($expr) {
2744
-	$a = 0;
2745
-	if (preg_match(',^[0-9]+(\s*[+*-]\s*[0-9]+)*$,S', trim($expr))) {
2746
-		eval("\$a = $expr;");
2747
-	}
2744
+    $a = 0;
2745
+    if (preg_match(',^[0-9]+(\s*[+*-]\s*[0-9]+)*$,S', trim($expr))) {
2746
+        eval("\$a = $expr;");
2747
+    }
2748 2748
 
2749
-	return intval($a);
2749
+    return intval($a);
2750 2750
 }
2751 2751
 
2752 2752
 /**
@@ -2765,7 +2765,7 @@  discard block
 block discarded – undo
2765 2765
  *      Retourne `$a*$b/$c`
2766 2766
  **/
2767 2767
 function regledetrois($a, $b, $c) {
2768
-	return round($a * $b / $c);
2768
+    return round($a * $b / $c);
2769 2769
 }
2770 2770
 
2771 2771
 
@@ -2788,79 +2788,79 @@  discard block
 block discarded – undo
2788 2788
  * @return string Suite de champs input hidden
2789 2789
  **/
2790 2790
 function form_hidden(?string $action = ''): string {
2791
-	$action ??= '';
2792
-
2793
-	$contexte = [];
2794
-	include_spip('inc/urls');
2795
-	if (
2796
-		$p = urls_decoder_url($action, '')
2797
-		and reset($p)
2798
-	) {
2799
-		$fond = array_shift($p);
2800
-		if ($fond != '404') {
2801
-			$contexte = array_shift($p);
2802
-			$contexte['page'] = $fond;
2803
-			$action = preg_replace('/([?]' . preg_quote($fond) . '[^&=]*[0-9]+)(&|$)/', '?&', $action);
2804
-		}
2805
-	}
2806
-	// defaire ce qu'a injecte urls_decoder_url : a revoir en modifiant la signature de urls_decoder_url
2807
-	if (defined('_DEFINIR_CONTEXTE_TYPE') and _DEFINIR_CONTEXTE_TYPE) {
2808
-		unset($contexte['type']);
2809
-	}
2810
-	if (!defined('_DEFINIR_CONTEXTE_TYPE_PAGE') or _DEFINIR_CONTEXTE_TYPE_PAGE) {
2811
-		unset($contexte['type-page']);
2812
-	}
2813
-
2814
-	// on va remplir un tableau de valeurs en prenant bien soin de ne pas
2815
-	// ecraser les elements de la forme mots[]=1&mots[]=2
2816
-	$values = [];
2817
-
2818
-	// d'abord avec celles de l'url
2819
-	if (false !== ($p = strpos($action, '?'))) {
2820
-		foreach (preg_split('/&(amp;)?/S', substr($action, $p + 1)) as $c) {
2821
-			$c = explode('=', $c, 2);
2822
-			$var = array_shift($c);
2823
-			$val = array_shift($c) ?? '';
2824
-			if ($var) {
2825
-				$val = rawurldecode($val);
2826
-				$var = rawurldecode($var); // decoder les [] eventuels
2827
-				if (preg_match(',\[\]$,S', $var)) {
2828
-					$values[] = [$var, $val];
2829
-				} else {
2830
-					if (!isset($values[$var])) {
2831
-						$values[$var] = [$var, $val];
2832
-					}
2833
-				}
2834
-			}
2835
-		}
2836
-	}
2837
-
2838
-	// ensuite avec celles du contexte, sans doublonner !
2839
-	foreach ($contexte as $var => $val) {
2840
-		if (preg_match(',\[\]$,S', $var)) {
2841
-			$values[] = [$var, $val];
2842
-		} else {
2843
-			if (!isset($values[$var])) {
2844
-				$values[$var] = [$var, $val];
2845
-			}
2846
-		}
2847
-	}
2848
-
2849
-	// puis on rassemble le tout
2850
-	$hidden = [];
2851
-	foreach ($values as $value) {
2852
-		[$var, $val] = $value;
2853
-		$hidden[] = '<input name="'
2854
-			. entites_html($var)
2855
-			. '"'
2856
-			. (is_null($val)
2857
-				? ''
2858
-				: ' value="' . entites_html($val) . '"'
2859
-			)
2860
-			. ' type="hidden"' . "\n/>";
2861
-	}
2862
-
2863
-	return join('', $hidden);
2791
+    $action ??= '';
2792
+
2793
+    $contexte = [];
2794
+    include_spip('inc/urls');
2795
+    if (
2796
+        $p = urls_decoder_url($action, '')
2797
+        and reset($p)
2798
+    ) {
2799
+        $fond = array_shift($p);
2800
+        if ($fond != '404') {
2801
+            $contexte = array_shift($p);
2802
+            $contexte['page'] = $fond;
2803
+            $action = preg_replace('/([?]' . preg_quote($fond) . '[^&=]*[0-9]+)(&|$)/', '?&', $action);
2804
+        }
2805
+    }
2806
+    // defaire ce qu'a injecte urls_decoder_url : a revoir en modifiant la signature de urls_decoder_url
2807
+    if (defined('_DEFINIR_CONTEXTE_TYPE') and _DEFINIR_CONTEXTE_TYPE) {
2808
+        unset($contexte['type']);
2809
+    }
2810
+    if (!defined('_DEFINIR_CONTEXTE_TYPE_PAGE') or _DEFINIR_CONTEXTE_TYPE_PAGE) {
2811
+        unset($contexte['type-page']);
2812
+    }
2813
+
2814
+    // on va remplir un tableau de valeurs en prenant bien soin de ne pas
2815
+    // ecraser les elements de la forme mots[]=1&mots[]=2
2816
+    $values = [];
2817
+
2818
+    // d'abord avec celles de l'url
2819
+    if (false !== ($p = strpos($action, '?'))) {
2820
+        foreach (preg_split('/&(amp;)?/S', substr($action, $p + 1)) as $c) {
2821
+            $c = explode('=', $c, 2);
2822
+            $var = array_shift($c);
2823
+            $val = array_shift($c) ?? '';
2824
+            if ($var) {
2825
+                $val = rawurldecode($val);
2826
+                $var = rawurldecode($var); // decoder les [] eventuels
2827
+                if (preg_match(',\[\]$,S', $var)) {
2828
+                    $values[] = [$var, $val];
2829
+                } else {
2830
+                    if (!isset($values[$var])) {
2831
+                        $values[$var] = [$var, $val];
2832
+                    }
2833
+                }
2834
+            }
2835
+        }
2836
+    }
2837
+
2838
+    // ensuite avec celles du contexte, sans doublonner !
2839
+    foreach ($contexte as $var => $val) {
2840
+        if (preg_match(',\[\]$,S', $var)) {
2841
+            $values[] = [$var, $val];
2842
+        } else {
2843
+            if (!isset($values[$var])) {
2844
+                $values[$var] = [$var, $val];
2845
+            }
2846
+        }
2847
+    }
2848
+
2849
+    // puis on rassemble le tout
2850
+    $hidden = [];
2851
+    foreach ($values as $value) {
2852
+        [$var, $val] = $value;
2853
+        $hidden[] = '<input name="'
2854
+            . entites_html($var)
2855
+            . '"'
2856
+            . (is_null($val)
2857
+                ? ''
2858
+                : ' value="' . entites_html($val) . '"'
2859
+            )
2860
+            . ' type="hidden"' . "\n/>";
2861
+    }
2862
+
2863
+    return join('', $hidden);
2864 2864
 }
2865 2865
 
2866 2866
 
@@ -2882,7 +2882,7 @@  discard block
 block discarded – undo
2882 2882
  *    - la première valeur du tableau sinon.
2883 2883
  **/
2884 2884
 function filtre_reset($array) {
2885
-	return !is_array($array) ? null : reset($array);
2885
+    return !is_array($array) ? null : reset($array);
2886 2886
 }
2887 2887
 
2888 2888
 /**
@@ -2903,7 +2903,7 @@  discard block
 block discarded – undo
2903 2903
  *    - la dernière valeur du tableau sinon.
2904 2904
  **/
2905 2905
 function filtre_end($array) {
2906
-	return !is_array($array) ? null : end($array);
2906
+    return !is_array($array) ? null : end($array);
2907 2907
 }
2908 2908
 
2909 2909
 /**
@@ -2923,11 +2923,11 @@  discard block
 block discarded – undo
2923 2923
  *
2924 2924
  **/
2925 2925
 function filtre_push($array, $val) {
2926
-	if (!is_array($array) or !array_push($array, $val)) {
2927
-		return '';
2928
-	}
2926
+    if (!is_array($array) or !array_push($array, $val)) {
2927
+        return '';
2928
+    }
2929 2929
 
2930
-	return $array;
2930
+    return $array;
2931 2931
 }
2932 2932
 
2933 2933
 /**
@@ -2946,7 +2946,7 @@  discard block
 block discarded – undo
2946 2946
  *     - `true` si la valeur existe dans le tableau, `false` sinon.
2947 2947
  **/
2948 2948
 function filtre_find($array, $val) {
2949
-	return (is_array($array) and in_array($val, $array));
2949
+    return (is_array($array) and in_array($val, $array));
2950 2950
 }
2951 2951
 
2952 2952
 
@@ -2963,13 +2963,13 @@  discard block
 block discarded – undo
2963 2963
  *     Contenu avec urls en absolus
2964 2964
  **/
2965 2965
 function urls_absolues_css($contenu, $source) {
2966
-	$path = suivre_lien(url_absolue($source), './');
2966
+    $path = suivre_lien(url_absolue($source), './');
2967 2967
 
2968
-	return preg_replace_callback(
2969
-		",url\s*\(\s*['\"]?([^'\"/#\s][^:]*)['\"]?\s*\),Uims",
2970
-		fn($x) => "url('" . suivre_lien($path, $x[1]) . "')",
2971
-		$contenu
2972
-	);
2968
+    return preg_replace_callback(
2969
+        ",url\s*\(\s*['\"]?([^'\"/#\s][^:]*)['\"]?\s*\),Uims",
2970
+        fn($x) => "url('" . suivre_lien($path, $x[1]) . "')",
2971
+        $contenu
2972
+    );
2973 2973
 }
2974 2974
 
2975 2975
 
@@ -2998,119 +2998,119 @@  discard block
 block discarded – undo
2998 2998
  *     Chemin du fichier CSS inversé
2999 2999
  **/
3000 3000
 function direction_css($css, $voulue = '') {
3001
-	if (!preg_match(',(_rtl)?\.css$,i', $css, $r)) {
3002
-		return $css;
3003
-	}
3004
-	include_spip('inc/lang');
3005
-	// si on a precise le sens voulu en argument, le prendre en compte
3006
-	if ($voulue = strtolower($voulue)) {
3007
-		if ($voulue != 'rtl' and $voulue != 'ltr') {
3008
-			$voulue = lang_dir($voulue);
3009
-		}
3010
-	} else {
3011
-		$voulue = lang_dir();
3012
-	}
3013
-
3014
-	$r = count($r) > 1;
3015
-	$right = $r ? 'left' : 'right'; // 'right' de la css lue en entree
3016
-	$dir = $r ? 'rtl' : 'ltr';
3017
-	$ndir = $r ? 'ltr' : 'rtl';
3018
-
3019
-	if ($voulue == $dir) {
3020
-		return $css;
3021
-	}
3022
-
3023
-	if (
3024
-		// url absolue
3025
-		preg_match(',^https?:,i', $css)
3026
-		// ou qui contient un ?
3027
-		or (($p = strpos($css, '?')) !== false)
3028
-	) {
3029
-		$distant = true;
3030
-		$cssf = parse_url($css);
3031
-		$cssf = $cssf['path'] . ($cssf['query'] ? '?' . $cssf['query'] : '');
3032
-		$cssf = preg_replace(',[?:&=],', '_', $cssf);
3033
-	} else {
3034
-		$distant = false;
3035
-		$cssf = $css;
3036
-		// 1. regarder d'abord si un fichier avec la bonne direction n'est pas aussi
3037
-		//propose (rien a faire dans ce cas)
3038
-		$f = preg_replace(',(_rtl)?\.css$,i', '_' . $ndir . '.css', $css);
3039
-		if (@file_exists($f)) {
3040
-			return $f;
3041
-		}
3042
-	}
3043
-
3044
-	// 2.
3045
-	$dir_var = sous_repertoire(_DIR_VAR, 'cache-css');
3046
-	$f = $dir_var
3047
-		. preg_replace(',.*/(.*?)(_rtl)?\.css,', '\1', $cssf)
3048
-		. '.' . substr(md5($cssf), 0, 4) . '_' . $ndir . '.css';
3049
-
3050
-	// la css peut etre distante (url absolue !)
3051
-	if ($distant) {
3052
-		include_spip('inc/distant');
3053
-		$res = recuperer_url($css);
3054
-		if (!$res or !$contenu = $res['page']) {
3055
-			return $css;
3056
-		}
3057
-	} else {
3058
-		if (
3059
-			(@filemtime($f) > @filemtime($css))
3060
-			and (_VAR_MODE != 'recalcul')
3061
-		) {
3062
-			return $f;
3063
-		}
3064
-		if (!lire_fichier($css, $contenu)) {
3065
-			return $css;
3066
-		}
3067
-	}
3068
-
3069
-
3070
-	// Inverser la direction gauche-droite en utilisant CSSTidy qui gere aussi les shorthands
3071
-	include_spip('lib/csstidy/class.csstidy');
3072
-	$parser = new csstidy();
3073
-	$parser->set_cfg('optimise_shorthands', 0);
3074
-	$parser->set_cfg('reverse_left_and_right', true);
3075
-	$parser->parse($contenu);
3076
-
3077
-	$contenu = $parser->print->plain();
3078
-
3079
-
3080
-	// reperer les @import auxquels il faut propager le direction_css
3081
-	preg_match_all(",\@import\s*url\s*\(\s*['\"]?([^'\"/][^:]*)['\"]?\s*\),Uims", $contenu, $regs);
3082
-	$src = [];
3083
-	$src_direction_css = [];
3084
-	$src_faux_abs = [];
3085
-	$d = dirname($css);
3086
-	foreach ($regs[1] as $k => $import_css) {
3087
-		$css_direction = direction_css("$d/$import_css", $voulue);
3088
-		// si la css_direction est dans le meme path que la css d'origine, on tronque le path, elle sera passee en absolue
3089
-		if (substr($css_direction, 0, strlen($d) + 1) == "$d/") {
3090
-			$css_direction = substr($css_direction, strlen($d) + 1);
3091
-		} // si la css_direction commence par $dir_var on la fait passer pour une absolue
3092
-		elseif (substr($css_direction, 0, strlen($dir_var)) == $dir_var) {
3093
-			$css_direction = substr($css_direction, strlen($dir_var));
3094
-			$src_faux_abs['/@@@@@@/' . $css_direction] = $css_direction;
3095
-			$css_direction = '/@@@@@@/' . $css_direction;
3096
-		}
3097
-		$src[] = $regs[0][$k];
3098
-		$src_direction_css[] = str_replace($import_css, $css_direction, $regs[0][$k]);
3099
-	}
3100
-	$contenu = str_replace($src, $src_direction_css, $contenu);
3101
-
3102
-	$contenu = urls_absolues_css($contenu, $css);
3103
-
3104
-	// virer les fausses url absolues que l'on a mis dans les import
3105
-	if (count($src_faux_abs)) {
3106
-		$contenu = str_replace(array_keys($src_faux_abs), $src_faux_abs, $contenu);
3107
-	}
3108
-
3109
-	if (!ecrire_fichier($f, $contenu)) {
3110
-		return $css;
3111
-	}
3112
-
3113
-	return $f;
3001
+    if (!preg_match(',(_rtl)?\.css$,i', $css, $r)) {
3002
+        return $css;
3003
+    }
3004
+    include_spip('inc/lang');
3005
+    // si on a precise le sens voulu en argument, le prendre en compte
3006
+    if ($voulue = strtolower($voulue)) {
3007
+        if ($voulue != 'rtl' and $voulue != 'ltr') {
3008
+            $voulue = lang_dir($voulue);
3009
+        }
3010
+    } else {
3011
+        $voulue = lang_dir();
3012
+    }
3013
+
3014
+    $r = count($r) > 1;
3015
+    $right = $r ? 'left' : 'right'; // 'right' de la css lue en entree
3016
+    $dir = $r ? 'rtl' : 'ltr';
3017
+    $ndir = $r ? 'ltr' : 'rtl';
3018
+
3019
+    if ($voulue == $dir) {
3020
+        return $css;
3021
+    }
3022
+
3023
+    if (
3024
+        // url absolue
3025
+        preg_match(',^https?:,i', $css)
3026
+        // ou qui contient un ?
3027
+        or (($p = strpos($css, '?')) !== false)
3028
+    ) {
3029
+        $distant = true;
3030
+        $cssf = parse_url($css);
3031
+        $cssf = $cssf['path'] . ($cssf['query'] ? '?' . $cssf['query'] : '');
3032
+        $cssf = preg_replace(',[?:&=],', '_', $cssf);
3033
+    } else {
3034
+        $distant = false;
3035
+        $cssf = $css;
3036
+        // 1. regarder d'abord si un fichier avec la bonne direction n'est pas aussi
3037
+        //propose (rien a faire dans ce cas)
3038
+        $f = preg_replace(',(_rtl)?\.css$,i', '_' . $ndir . '.css', $css);
3039
+        if (@file_exists($f)) {
3040
+            return $f;
3041
+        }
3042
+    }
3043
+
3044
+    // 2.
3045
+    $dir_var = sous_repertoire(_DIR_VAR, 'cache-css');
3046
+    $f = $dir_var
3047
+        . preg_replace(',.*/(.*?)(_rtl)?\.css,', '\1', $cssf)
3048
+        . '.' . substr(md5($cssf), 0, 4) . '_' . $ndir . '.css';
3049
+
3050
+    // la css peut etre distante (url absolue !)
3051
+    if ($distant) {
3052
+        include_spip('inc/distant');
3053
+        $res = recuperer_url($css);
3054
+        if (!$res or !$contenu = $res['page']) {
3055
+            return $css;
3056
+        }
3057
+    } else {
3058
+        if (
3059
+            (@filemtime($f) > @filemtime($css))
3060
+            and (_VAR_MODE != 'recalcul')
3061
+        ) {
3062
+            return $f;
3063
+        }
3064
+        if (!lire_fichier($css, $contenu)) {
3065
+            return $css;
3066
+        }
3067
+    }
3068
+
3069
+
3070
+    // Inverser la direction gauche-droite en utilisant CSSTidy qui gere aussi les shorthands
3071
+    include_spip('lib/csstidy/class.csstidy');
3072
+    $parser = new csstidy();
3073
+    $parser->set_cfg('optimise_shorthands', 0);
3074
+    $parser->set_cfg('reverse_left_and_right', true);
3075
+    $parser->parse($contenu);
3076
+
3077
+    $contenu = $parser->print->plain();
3078
+
3079
+
3080
+    // reperer les @import auxquels il faut propager le direction_css
3081
+    preg_match_all(",\@import\s*url\s*\(\s*['\"]?([^'\"/][^:]*)['\"]?\s*\),Uims", $contenu, $regs);
3082
+    $src = [];
3083
+    $src_direction_css = [];
3084
+    $src_faux_abs = [];
3085
+    $d = dirname($css);
3086
+    foreach ($regs[1] as $k => $import_css) {
3087
+        $css_direction = direction_css("$d/$import_css", $voulue);
3088
+        // si la css_direction est dans le meme path que la css d'origine, on tronque le path, elle sera passee en absolue
3089
+        if (substr($css_direction, 0, strlen($d) + 1) == "$d/") {
3090
+            $css_direction = substr($css_direction, strlen($d) + 1);
3091
+        } // si la css_direction commence par $dir_var on la fait passer pour une absolue
3092
+        elseif (substr($css_direction, 0, strlen($dir_var)) == $dir_var) {
3093
+            $css_direction = substr($css_direction, strlen($dir_var));
3094
+            $src_faux_abs['/@@@@@@/' . $css_direction] = $css_direction;
3095
+            $css_direction = '/@@@@@@/' . $css_direction;
3096
+        }
3097
+        $src[] = $regs[0][$k];
3098
+        $src_direction_css[] = str_replace($import_css, $css_direction, $regs[0][$k]);
3099
+    }
3100
+    $contenu = str_replace($src, $src_direction_css, $contenu);
3101
+
3102
+    $contenu = urls_absolues_css($contenu, $css);
3103
+
3104
+    // virer les fausses url absolues que l'on a mis dans les import
3105
+    if (count($src_faux_abs)) {
3106
+        $contenu = str_replace(array_keys($src_faux_abs), $src_faux_abs, $contenu);
3107
+    }
3108
+
3109
+    if (!ecrire_fichier($f, $contenu)) {
3110
+        return $css;
3111
+    }
3112
+
3113
+    return $f;
3114 3114
 }
3115 3115
 
3116 3116
 
@@ -3133,46 +3133,46 @@  discard block
 block discarded – undo
3133 3133
  *     - Chemin ou URL du fichier CSS source sinon.
3134 3134
  **/
3135 3135
 function url_absolue_css($css) {
3136
-	if (!preg_match(',\.css$,i', $css, $r)) {
3137
-		return $css;
3138
-	}
3136
+    if (!preg_match(',\.css$,i', $css, $r)) {
3137
+        return $css;
3138
+    }
3139 3139
 
3140
-	$url_absolue_css = url_absolue($css);
3140
+    $url_absolue_css = url_absolue($css);
3141 3141
 
3142
-	$f = basename($css, '.css');
3143
-	$f = sous_repertoire(_DIR_VAR, 'cache-css')
3144
-		. preg_replace(',(.*?)(_rtl|_ltr)?$,', "\\1-urlabs-" . substr(md5("$css-urlabs"), 0, 4) . "\\2", $f)
3145
-		. '.css';
3142
+    $f = basename($css, '.css');
3143
+    $f = sous_repertoire(_DIR_VAR, 'cache-css')
3144
+        . preg_replace(',(.*?)(_rtl|_ltr)?$,', "\\1-urlabs-" . substr(md5("$css-urlabs"), 0, 4) . "\\2", $f)
3145
+        . '.css';
3146 3146
 
3147
-	if ((@filemtime($f) > @filemtime($css)) and (_VAR_MODE != 'recalcul')) {
3148
-		return $f;
3149
-	}
3147
+    if ((@filemtime($f) > @filemtime($css)) and (_VAR_MODE != 'recalcul')) {
3148
+        return $f;
3149
+    }
3150 3150
 
3151
-	if ($url_absolue_css == $css) {
3152
-		if (
3153
-			strncmp($GLOBALS['meta']['adresse_site'], $css, $l = strlen($GLOBALS['meta']['adresse_site'])) != 0
3154
-			or !lire_fichier(_DIR_RACINE . substr($css, $l), $contenu)
3155
-		) {
3156
-			include_spip('inc/distant');
3157
-			$contenu = recuperer_url($css);
3158
-			$contenu = $contenu['page'] ?? '';
3159
-			if (!$contenu) {
3160
-				return $css;
3161
-			}
3162
-		}
3163
-	} elseif (!lire_fichier($css, $contenu)) {
3164
-		return $css;
3165
-	}
3151
+    if ($url_absolue_css == $css) {
3152
+        if (
3153
+            strncmp($GLOBALS['meta']['adresse_site'], $css, $l = strlen($GLOBALS['meta']['adresse_site'])) != 0
3154
+            or !lire_fichier(_DIR_RACINE . substr($css, $l), $contenu)
3155
+        ) {
3156
+            include_spip('inc/distant');
3157
+            $contenu = recuperer_url($css);
3158
+            $contenu = $contenu['page'] ?? '';
3159
+            if (!$contenu) {
3160
+                return $css;
3161
+            }
3162
+        }
3163
+    } elseif (!lire_fichier($css, $contenu)) {
3164
+        return $css;
3165
+    }
3166 3166
 
3167
-	// passer les url relatives a la css d'origine en url absolues
3168
-	$contenu = urls_absolues_css($contenu, $css);
3167
+    // passer les url relatives a la css d'origine en url absolues
3168
+    $contenu = urls_absolues_css($contenu, $css);
3169 3169
 
3170
-	// ecrire la css
3171
-	if (!ecrire_fichier($f, $contenu)) {
3172
-		return $css;
3173
-	}
3170
+    // ecrire la css
3171
+    if (!ecrire_fichier($f, $contenu)) {
3172
+        return $css;
3173
+    }
3174 3174
 
3175
-	return $f;
3175
+    return $f;
3176 3176
 }
3177 3177
 
3178 3178
 
@@ -3206,24 +3206,24 @@  discard block
 block discarded – undo
3206 3206
  *     Valeur trouvée ou valeur par défaut.
3207 3207
  **/
3208 3208
 function table_valeur($table, $cle, $defaut = '', $conserver_null = false) {
3209
-	foreach (explode('/', $cle) as $k) {
3210
-		$table = (is_string($table) ? @unserialize($table) : $table);
3209
+    foreach (explode('/', $cle) as $k) {
3210
+        $table = (is_string($table) ? @unserialize($table) : $table);
3211 3211
 
3212
-		if (is_object($table)) {
3213
-			$table = (($k !== '') and isset($table->$k)) ? $table->$k : $defaut;
3214
-		} elseif (is_array($table)) {
3215
-			if ($conserver_null) {
3216
-				$table = array_key_exists($k, $table) ? $table[$k] : $defaut;
3217
-			} else {
3218
-				$table = ($table[$k] ?? $defaut);
3219
-			}
3220
-		} else {
3221
-			$table = $defaut;
3222
-			break;
3223
-		}
3224
-	}
3212
+        if (is_object($table)) {
3213
+            $table = (($k !== '') and isset($table->$k)) ? $table->$k : $defaut;
3214
+        } elseif (is_array($table)) {
3215
+            if ($conserver_null) {
3216
+                $table = array_key_exists($k, $table) ? $table[$k] : $defaut;
3217
+            } else {
3218
+                $table = ($table[$k] ?? $defaut);
3219
+            }
3220
+        } else {
3221
+            $table = $defaut;
3222
+            break;
3223
+        }
3224
+    }
3225 3225
 
3226
-	return $table;
3226
+    return $table;
3227 3227
 }
3228 3228
 
3229 3229
 /**
@@ -3256,22 +3256,22 @@  discard block
 block discarded – undo
3256 3256
  *     - string : expression trouvée.
3257 3257
  **/
3258 3258
 function filtre_match_dist(?string $texte, $expression, $modif = 'UuimsS', $capte = 0) {
3259
-	if (intval($modif) and $capte == 0) {
3260
-		$capte = $modif;
3261
-		$modif = 'UuimsS';
3262
-	}
3263
-	$expression = str_replace('\/', '/', $expression);
3264
-	$expression = str_replace('/', '\/', $expression);
3259
+    if (intval($modif) and $capte == 0) {
3260
+        $capte = $modif;
3261
+        $modif = 'UuimsS';
3262
+    }
3263
+    $expression = str_replace('\/', '/', $expression);
3264
+    $expression = str_replace('/', '\/', $expression);
3265 3265
 
3266
-	if (preg_match('/' . $expression . '/' . $modif, $texte ?? '', $r)) {
3267
-		if (isset($r[$capte])) {
3268
-			return $r[$capte];
3269
-		} else {
3270
-			return true;
3271
-		}
3272
-	}
3266
+    if (preg_match('/' . $expression . '/' . $modif, $texte ?? '', $r)) {
3267
+        if (isset($r[$capte])) {
3268
+            return $r[$capte];
3269
+        } else {
3270
+            return true;
3271
+        }
3272
+    }
3273 3273
 
3274
-	return false;
3274
+    return false;
3275 3275
 }
3276 3276
 
3277 3277
 
@@ -3298,10 +3298,10 @@  discard block
 block discarded – undo
3298 3298
  *     Texte
3299 3299
  **/
3300 3300
 function replace($texte, $expression, $replace = '', $modif = 'UimsS') {
3301
-	$expression = str_replace('\/', '/', $expression);
3302
-	$expression = str_replace('/', '\/', $expression);
3301
+    $expression = str_replace('\/', '/', $expression);
3302
+    $expression = str_replace('/', '\/', $expression);
3303 3303
 
3304
-	return preg_replace('/' . $expression . '/' . $modif, $replace, $texte);
3304
+    return preg_replace('/' . $expression . '/' . $modif, $replace, $texte);
3305 3305
 }
3306 3306
 
3307 3307
 
@@ -3319,25 +3319,25 @@  discard block
 block discarded – undo
3319 3319
  **/
3320 3320
 function traiter_doublons_documents(&$doublons, $letexte) {
3321 3321
 
3322
-	// Verifier dans le texte & les notes (pas beau, helas)
3323
-	$t = $letexte . $GLOBALS['les_notes'];
3322
+    // Verifier dans le texte & les notes (pas beau, helas)
3323
+    $t = $letexte . $GLOBALS['les_notes'];
3324 3324
 
3325
-	if (
3326
-		strstr($t, 'spip_document_') // evite le preg_match_all si inutile
3327
-		and preg_match_all(
3328
-			',<[^>]+\sclass=["\']spip_document_([0-9]+)[\s"\'],imsS',
3329
-			$t,
3330
-			$matches,
3331
-			PREG_PATTERN_ORDER
3332
-		)
3333
-	) {
3334
-		if (!isset($doublons['documents'])) {
3335
-			$doublons['documents'] = '';
3336
-		}
3337
-		$doublons['documents'] .= ',' . join(',', $matches[1]);
3338
-	}
3325
+    if (
3326
+        strstr($t, 'spip_document_') // evite le preg_match_all si inutile
3327
+        and preg_match_all(
3328
+            ',<[^>]+\sclass=["\']spip_document_([0-9]+)[\s"\'],imsS',
3329
+            $t,
3330
+            $matches,
3331
+            PREG_PATTERN_ORDER
3332
+        )
3333
+    ) {
3334
+        if (!isset($doublons['documents'])) {
3335
+            $doublons['documents'] = '';
3336
+        }
3337
+        $doublons['documents'] .= ',' . join(',', $matches[1]);
3338
+    }
3339 3339
 
3340
-	return $letexte;
3340
+    return $letexte;
3341 3341
 }
3342 3342
 
3343 3343
 /**
@@ -3351,7 +3351,7 @@  discard block
 block discarded – undo
3351 3351
  * @return string Chaîne vide
3352 3352
  **/
3353 3353
 function vide($texte) {
3354
-	return '';
3354
+    return '';
3355 3355
 }
3356 3356
 
3357 3357
 //
@@ -3380,23 +3380,23 @@  discard block
 block discarded – undo
3380 3380
  *      Code HTML résultant
3381 3381
  **/
3382 3382
 function env_to_params($env, $ignore_params = []) {
3383
-	$ignore_params = array_merge(
3384
-		['id', 'lang', 'id_document', 'date', 'date_redac', 'align', 'fond', '', 'recurs', 'emb', 'dir_racine'],
3385
-		$ignore_params
3386
-	);
3387
-	if (!is_array($env)) {
3388
-		$env = unserialize($env);
3389
-	}
3390
-	$texte = '';
3391
-	if ($env) {
3392
-		foreach ($env as $i => $j) {
3393
-			if (is_string($j) and !in_array($i, $ignore_params)) {
3394
-				$texte .= "<param name='" . attribut_html($i) . "'\n\tvalue='" . attribut_html($j) . "' />";
3395
-			}
3396
-		}
3397
-	}
3398
-
3399
-	return $texte;
3383
+    $ignore_params = array_merge(
3384
+        ['id', 'lang', 'id_document', 'date', 'date_redac', 'align', 'fond', '', 'recurs', 'emb', 'dir_racine'],
3385
+        $ignore_params
3386
+    );
3387
+    if (!is_array($env)) {
3388
+        $env = unserialize($env);
3389
+    }
3390
+    $texte = '';
3391
+    if ($env) {
3392
+        foreach ($env as $i => $j) {
3393
+            if (is_string($j) and !in_array($i, $ignore_params)) {
3394
+                $texte .= "<param name='" . attribut_html($i) . "'\n\tvalue='" . attribut_html($j) . "' />";
3395
+            }
3396
+        }
3397
+    }
3398
+
3399
+    return $texte;
3400 3400
 }
3401 3401
 
3402 3402
 /**
@@ -3419,23 +3419,23 @@  discard block
 block discarded – undo
3419 3419
  *      Code HTML résultant
3420 3420
  **/
3421 3421
 function env_to_attributs($env, $ignore_params = []) {
3422
-	$ignore_params = array_merge(
3423
-		['id', 'lang', 'id_document', 'date', 'date_redac', 'align', 'fond', '', 'recurs', 'emb', 'dir_racine'],
3424
-		$ignore_params
3425
-	);
3426
-	if (!is_array($env)) {
3427
-		$env = unserialize($env);
3428
-	}
3429
-	$texte = '';
3430
-	if ($env) {
3431
-		foreach ($env as $i => $j) {
3432
-			if (is_string($j) and !in_array($i, $ignore_params)) {
3433
-				$texte .= attribut_html($i) . "='" . attribut_html($j) . "' ";
3434
-			}
3435
-		}
3436
-	}
3422
+    $ignore_params = array_merge(
3423
+        ['id', 'lang', 'id_document', 'date', 'date_redac', 'align', 'fond', '', 'recurs', 'emb', 'dir_racine'],
3424
+        $ignore_params
3425
+    );
3426
+    if (!is_array($env)) {
3427
+        $env = unserialize($env);
3428
+    }
3429
+    $texte = '';
3430
+    if ($env) {
3431
+        foreach ($env as $i => $j) {
3432
+            if (is_string($j) and !in_array($i, $ignore_params)) {
3433
+                $texte .= attribut_html($i) . "='" . attribut_html($j) . "' ";
3434
+            }
3435
+        }
3436
+    }
3437 3437
 
3438
-	return $texte;
3438
+    return $texte;
3439 3439
 }
3440 3440
 
3441 3441
 
@@ -3453,7 +3453,7 @@  discard block
 block discarded – undo
3453 3453
  * @return string Chaînes concaténés
3454 3454
  **/
3455 3455
 function concat(...$args): string {
3456
-	return join('', $args);
3456
+    return join('', $args);
3457 3457
 }
3458 3458
 
3459 3459
 
@@ -3473,23 +3473,23 @@  discard block
 block discarded – undo
3473 3473
  *     Contenu du ou des fichiers, concaténé
3474 3474
  **/
3475 3475
 function charge_scripts($files, $script = true) {
3476
-	$flux = '';
3477
-	foreach (is_array($files) ? $files : explode('|', $files) as $file) {
3478
-		if (!is_string($file)) {
3479
-			continue;
3480
-		}
3481
-		if ($script) {
3482
-			$file = preg_match(',^\w+$,', $file) ? "javascript/$file.js" : '';
3483
-		}
3484
-		if ($file) {
3485
-			$path = find_in_path($file);
3486
-			if ($path) {
3487
-				$flux .= spip_file_get_contents($path);
3488
-			}
3489
-		}
3490
-	}
3491
-
3492
-	return $flux;
3476
+    $flux = '';
3477
+    foreach (is_array($files) ? $files : explode('|', $files) as $file) {
3478
+        if (!is_string($file)) {
3479
+            continue;
3480
+        }
3481
+        if ($script) {
3482
+            $file = preg_match(',^\w+$,', $file) ? "javascript/$file.js" : '';
3483
+        }
3484
+        if ($file) {
3485
+            $path = find_in_path($file);
3486
+            if ($path) {
3487
+                $flux .= spip_file_get_contents($path);
3488
+            }
3489
+        }
3490
+    }
3491
+
3492
+    return $flux;
3493 3493
 }
3494 3494
 
3495 3495
 /**
@@ -3500,22 +3500,22 @@  discard block
 block discarded – undo
3500 3500
  * @return string
3501 3501
  */
3502 3502
 function http_img_variante_svg_si_possible($img_file) {
3503
-	// on peut fournir une icone generique -xx.svg qui fera le job dans toutes les tailles, et qui est prioritaire sur le png
3504
-	// si il y a un .svg a la bonne taille (-16.svg) a cote, on l'utilise en remplacement du -16.png
3505
-	if (
3506
-		preg_match(',-(\d+)[.](png|gif|svg)$,', $img_file, $m)
3507
-		and $variante_svg_generique = substr($img_file, 0, -strlen($m[0])) . '-xx.svg'
3508
-		and file_exists($variante_svg_generique)
3509
-	) {
3510
-		if ($variante_svg_size = substr($variante_svg_generique, 0, -6) . $m[1] . '.svg' and file_exists($variante_svg_size)) {
3511
-			$img_file = $variante_svg_size;
3512
-		}
3513
-		else {
3514
-			$img_file = $variante_svg_generique;
3515
-		}
3516
-	}
3503
+    // on peut fournir une icone generique -xx.svg qui fera le job dans toutes les tailles, et qui est prioritaire sur le png
3504
+    // si il y a un .svg a la bonne taille (-16.svg) a cote, on l'utilise en remplacement du -16.png
3505
+    if (
3506
+        preg_match(',-(\d+)[.](png|gif|svg)$,', $img_file, $m)
3507
+        and $variante_svg_generique = substr($img_file, 0, -strlen($m[0])) . '-xx.svg'
3508
+        and file_exists($variante_svg_generique)
3509
+    ) {
3510
+        if ($variante_svg_size = substr($variante_svg_generique, 0, -6) . $m[1] . '.svg' and file_exists($variante_svg_size)) {
3511
+            $img_file = $variante_svg_size;
3512
+        }
3513
+        else {
3514
+            $img_file = $variante_svg_generique;
3515
+        }
3516
+    }
3517 3517
 
3518
-	return $img_file;
3518
+    return $img_file;
3519 3519
 }
3520 3520
 
3521 3521
 /**
@@ -3536,54 +3536,54 @@  discard block
 block discarded – undo
3536 3536
  */
3537 3537
 function http_img_pack($img, $alt, $atts = '', $title = '', $options = []) {
3538 3538
 
3539
-	$img_file = $img;
3540
-	if ($p = strpos($img_file, '?')) {
3541
-		$img_file = substr($img_file, 0, $p);
3542
-	}
3543
-	if (!isset($options['chemin_image']) or $options['chemin_image'] == true) {
3544
-		$img_file = chemin_image($img);
3545
-	}
3546
-	else {
3547
-		if (!isset($options['variante_svg_si_possible']) or $options['variante_svg_si_possible'] == true) {
3548
-			$img_file = http_img_variante_svg_si_possible($img_file);
3549
-		}
3550
-	}
3551
-	if (stripos($atts, 'width') === false) {
3552
-		// utiliser directement l'info de taille presente dans le nom
3553
-		if (
3554
-			(!isset($options['utiliser_suffixe_size'])
3555
-				or $options['utiliser_suffixe_size'] == true
3556
-			  or strpos($img_file, '-xx.svg') !== false)
3557
-			and (preg_match(',-([0-9]+)[.](png|gif|svg)$,', $img, $regs)
3558
-					 or preg_match(',\?([0-9]+)px$,', $img, $regs))
3559
-		) {
3560
-			$largeur = $hauteur = intval($regs[1]);
3561
-		} else {
3562
-			$taille = taille_image($img_file);
3563
-			[$hauteur, $largeur] = $taille;
3564
-			if (!$hauteur or !$largeur) {
3565
-				return '';
3566
-			}
3567
-		}
3568
-		$atts .= " width='" . $largeur . "' height='" . $hauteur . "'";
3569
-	}
3570
-
3571
-	if (file_exists($img_file)) {
3572
-		$img_file = timestamp($img_file);
3573
-	}
3574
-	if ($alt === false) {
3575
-		$alt = '';
3576
-	}
3577
-	elseif ($alt or $alt === '') {
3578
-		$alt = " alt='" . attribut_html($alt) . "'";
3579
-	}
3580
-	else {
3581
-		$alt = " alt='" . attribut_html($title) . "'";
3582
-	}
3583
-	return "<img src='" . attribut_html($img_file) . "'$alt"
3584
-	. ($title ? ' title="' . attribut_html($title) . '"' : '')
3585
-	. ' ' . ltrim($atts)
3586
-	. ' />';
3539
+    $img_file = $img;
3540
+    if ($p = strpos($img_file, '?')) {
3541
+        $img_file = substr($img_file, 0, $p);
3542
+    }
3543
+    if (!isset($options['chemin_image']) or $options['chemin_image'] == true) {
3544
+        $img_file = chemin_image($img);
3545
+    }
3546
+    else {
3547
+        if (!isset($options['variante_svg_si_possible']) or $options['variante_svg_si_possible'] == true) {
3548
+            $img_file = http_img_variante_svg_si_possible($img_file);
3549
+        }
3550
+    }
3551
+    if (stripos($atts, 'width') === false) {
3552
+        // utiliser directement l'info de taille presente dans le nom
3553
+        if (
3554
+            (!isset($options['utiliser_suffixe_size'])
3555
+                or $options['utiliser_suffixe_size'] == true
3556
+              or strpos($img_file, '-xx.svg') !== false)
3557
+            and (preg_match(',-([0-9]+)[.](png|gif|svg)$,', $img, $regs)
3558
+                     or preg_match(',\?([0-9]+)px$,', $img, $regs))
3559
+        ) {
3560
+            $largeur = $hauteur = intval($regs[1]);
3561
+        } else {
3562
+            $taille = taille_image($img_file);
3563
+            [$hauteur, $largeur] = $taille;
3564
+            if (!$hauteur or !$largeur) {
3565
+                return '';
3566
+            }
3567
+        }
3568
+        $atts .= " width='" . $largeur . "' height='" . $hauteur . "'";
3569
+    }
3570
+
3571
+    if (file_exists($img_file)) {
3572
+        $img_file = timestamp($img_file);
3573
+    }
3574
+    if ($alt === false) {
3575
+        $alt = '';
3576
+    }
3577
+    elseif ($alt or $alt === '') {
3578
+        $alt = " alt='" . attribut_html($alt) . "'";
3579
+    }
3580
+    else {
3581
+        $alt = " alt='" . attribut_html($title) . "'";
3582
+    }
3583
+    return "<img src='" . attribut_html($img_file) . "'$alt"
3584
+    . ($title ? ' title="' . attribut_html($title) . '"' : '')
3585
+    . ' ' . ltrim($atts)
3586
+    . ' />';
3587 3587
 }
3588 3588
 
3589 3589
 /**
@@ -3595,70 +3595,70 @@  discard block
 block discarded – undo
3595 3595
  * @return string
3596 3596
  */
3597 3597
 function http_style_background($img, $att = '', $size = null) {
3598
-	if ($size and is_numeric($size)) {
3599
-		$size = trim($size) . 'px';
3600
-	}
3601
-	return " style='background" .
3602
-		($att ? '' : '-image') . ': url("' . chemin_image($img) . '")' . ($att ? (' ' . $att) : '') . ';'
3603
-		. ($size ? "background-size:{$size};" : '')
3604
-		. "'";
3598
+    if ($size and is_numeric($size)) {
3599
+        $size = trim($size) . 'px';
3600
+    }
3601
+    return " style='background" .
3602
+        ($att ? '' : '-image') . ': url("' . chemin_image($img) . '")' . ($att ? (' ' . $att) : '') . ';'
3603
+        . ($size ? "background-size:{$size};" : '')
3604
+        . "'";
3605 3605
 }
3606 3606
 
3607 3607
 
3608 3608
 function helper_filtre_balise_img_svg_arguments($alt_or_size, $class_or_size, $size) {
3609
-	$args = [$alt_or_size, $class_or_size, $size];
3610
-	while (is_null(end($args)) and count($args)) {
3611
-		array_pop($args);
3612
-	}
3613
-	if (!count($args)) {
3614
-		return [null, null, null];
3615
-	}
3616
-	if (count($args) < 3) {
3617
-		$maybe_size = array_pop($args);
3618
-		// @2x
3619
-		// @1.5x
3620
-		// 512
3621
-		// 512x*
3622
-		// 512x300
3623
-		if (
3624
-			!strlen($maybe_size)
3625
-			or !preg_match(',^(@\d+(\.\d+)?x|\d+(x\*)?|\d+x\d+)$,', trim($maybe_size))
3626
-		) {
3627
-			$args[] = $maybe_size;
3628
-			$maybe_size = null;
3629
-		}
3630
-		while (count($args) < 2) {
3631
-			$args[] = null; // default alt or class
3632
-		}
3633
-		$args[] = $maybe_size;
3634
-	}
3635
-	return $args;
3609
+    $args = [$alt_or_size, $class_or_size, $size];
3610
+    while (is_null(end($args)) and count($args)) {
3611
+        array_pop($args);
3612
+    }
3613
+    if (!count($args)) {
3614
+        return [null, null, null];
3615
+    }
3616
+    if (count($args) < 3) {
3617
+        $maybe_size = array_pop($args);
3618
+        // @2x
3619
+        // @1.5x
3620
+        // 512
3621
+        // 512x*
3622
+        // 512x300
3623
+        if (
3624
+            !strlen($maybe_size)
3625
+            or !preg_match(',^(@\d+(\.\d+)?x|\d+(x\*)?|\d+x\d+)$,', trim($maybe_size))
3626
+        ) {
3627
+            $args[] = $maybe_size;
3628
+            $maybe_size = null;
3629
+        }
3630
+        while (count($args) < 2) {
3631
+            $args[] = null; // default alt or class
3632
+        }
3633
+        $args[] = $maybe_size;
3634
+    }
3635
+    return $args;
3636 3636
 }
3637 3637
 
3638 3638
 function helper_filtre_balise_img_svg_size($img, $size) {
3639
-	// si size est de la forme '@2x' c'est un coeff multiplicateur sur la densite
3640
-	if (strpos($size, '@') === 0 and substr($size, -1) === 'x') {
3641
-		$coef = floatval(substr($size, 1, -1));
3642
-		[$h, $w] = taille_image($img);
3643
-		$height = intval(round($h / $coef));
3644
-		$width = intval(round($w / $coef));
3645
-	}
3646
-	// sinon c'est une valeur seule si image caree ou largeurxhauteur
3647
-	else {
3648
-		$size = explode('x', $size, 2);
3649
-		$size = array_map('trim', $size);
3650
-		$height = $width = intval(array_shift($size));
3651
-
3652
-		if (count($size) and reset($size)) {
3653
-			$height = array_shift($size);
3654
-			if ($height === '*') {
3655
-				[$h, $w] = taille_image($img);
3656
-				$height = intval(round($h * $width / $w));
3657
-			}
3658
-		}
3659
-	}
3660
-
3661
-	return [$width, $height];
3639
+    // si size est de la forme '@2x' c'est un coeff multiplicateur sur la densite
3640
+    if (strpos($size, '@') === 0 and substr($size, -1) === 'x') {
3641
+        $coef = floatval(substr($size, 1, -1));
3642
+        [$h, $w] = taille_image($img);
3643
+        $height = intval(round($h / $coef));
3644
+        $width = intval(round($w / $coef));
3645
+    }
3646
+    // sinon c'est une valeur seule si image caree ou largeurxhauteur
3647
+    else {
3648
+        $size = explode('x', $size, 2);
3649
+        $size = array_map('trim', $size);
3650
+        $height = $width = intval(array_shift($size));
3651
+
3652
+        if (count($size) and reset($size)) {
3653
+            $height = array_shift($size);
3654
+            if ($height === '*') {
3655
+                [$h, $w] = taille_image($img);
3656
+                $height = intval(round($h * $width / $w));
3657
+            }
3658
+        }
3659
+    }
3660
+
3661
+    return [$width, $height];
3662 3662
 }
3663 3663
 
3664 3664
 /**
@@ -3694,43 +3694,43 @@  discard block
 block discarded – undo
3694 3694
  */
3695 3695
 function filtre_balise_img_dist($img, $alt = '', $class = null, $size = null) {
3696 3696
 
3697
-	[$alt, $class, $size] = helper_filtre_balise_img_svg_arguments($alt, $class, $size);
3698
-
3699
-	$img = trim((string) $img);
3700
-	if (strpos($img, '<img') === 0) {
3701
-		if (!is_null($alt)) {
3702
-			$img = inserer_attribut($img, 'alt', $alt);
3703
-		}
3704
-		if (!is_null($class)) {
3705
-			if (strlen($class)) {
3706
-				$img = inserer_attribut($img, 'class', $class);
3707
-			}
3708
-			else {
3709
-				$img = vider_attribut($img, 'class');
3710
-			}
3711
-		}
3712
-	}
3713
-	else {
3714
-		$img = http_img_pack(
3715
-			$img,
3716
-			$alt,
3717
-			$class ? " class='" . attribut_html($class) . "'" : '',
3718
-			'',
3719
-			['chemin_image' => false, 'utiliser_suffixe_size' => false]
3720
-		);
3721
-		if (is_null($alt)) {
3722
-			$img = vider_attribut($img, 'alt');
3723
-		}
3724
-	}
3725
-
3726
-	if ($img and !is_null($size) and strlen($size = trim($size))) {
3727
-		[$width, $height] = helper_filtre_balise_img_svg_size($img, $size);
3728
-
3729
-		$img = inserer_attribut($img, 'width', $width);
3730
-		$img = inserer_attribut($img, 'height', $height);
3731
-	}
3732
-
3733
-	return $img;
3697
+    [$alt, $class, $size] = helper_filtre_balise_img_svg_arguments($alt, $class, $size);
3698
+
3699
+    $img = trim((string) $img);
3700
+    if (strpos($img, '<img') === 0) {
3701
+        if (!is_null($alt)) {
3702
+            $img = inserer_attribut($img, 'alt', $alt);
3703
+        }
3704
+        if (!is_null($class)) {
3705
+            if (strlen($class)) {
3706
+                $img = inserer_attribut($img, 'class', $class);
3707
+            }
3708
+            else {
3709
+                $img = vider_attribut($img, 'class');
3710
+            }
3711
+        }
3712
+    }
3713
+    else {
3714
+        $img = http_img_pack(
3715
+            $img,
3716
+            $alt,
3717
+            $class ? " class='" . attribut_html($class) . "'" : '',
3718
+            '',
3719
+            ['chemin_image' => false, 'utiliser_suffixe_size' => false]
3720
+        );
3721
+        if (is_null($alt)) {
3722
+            $img = vider_attribut($img, 'alt');
3723
+        }
3724
+    }
3725
+
3726
+    if ($img and !is_null($size) and strlen($size = trim($size))) {
3727
+        [$width, $height] = helper_filtre_balise_img_svg_size($img, $size);
3728
+
3729
+        $img = inserer_attribut($img, 'width', $width);
3730
+        $img = inserer_attribut($img, 'height', $height);
3731
+    }
3732
+
3733
+    return $img;
3734 3734
 }
3735 3735
 
3736 3736
 
@@ -3764,80 +3764,80 @@  discard block
 block discarded – undo
3764 3764
  */
3765 3765
 function filtre_balise_svg_dist($img, $alt = '', $class = null, $size = null) {
3766 3766
 
3767
-	$svg = null;
3768
-	$img = trim($img);
3769
-	$img_file = $img;
3770
-	if (strpos($img, '<svg') === false) {
3771
-		if ($p = strpos($img_file, '?')) {
3772
-			$img_file = substr($img_file, 0, $p);
3773
-		}
3774
-
3775
-		// ne jamais operer directement sur une image distante pour des raisons de perfo
3776
-		// la copie locale a toutes les chances d'etre la ou de resservir
3777
-		if (tester_url_absolue($img_file)) {
3778
-			include_spip('inc/distant');
3779
-			$fichier = copie_locale($img_file);
3780
-			$img_file = ($fichier ? _DIR_RACINE . $fichier : $img_file);
3781
-		}
3782
-
3783
-		if (
3784
-			!$img_file
3785
-			or !file_exists($img_file)
3786
-			or !$svg = file_get_contents($img_file)
3787
-		) {
3788
-			return '';
3789
-		}
3790
-	}
3791
-
3792
-	if (!preg_match(",<svg\b[^>]*>,UimsS", $svg, $match)) {
3793
-		return '';
3794
-	}
3795
-
3796
-	[$alt, $class, $size] = helper_filtre_balise_img_svg_arguments($alt, $class, $size);
3797
-
3798
-	$balise_svg = $match[0];
3799
-	$balise_svg_source = $balise_svg;
3800
-
3801
-	// entete XML à supprimer
3802
-	$svg = preg_replace(',^\s*<\?xml[^>]*\?' . '>,', '', $svg);
3803
-
3804
-	// IE est toujours mon ami
3805
-	$balise_svg = inserer_attribut($balise_svg, 'focusable', 'false');
3806
-
3807
-	// regler la classe
3808
-	if (!is_null($class)) {
3809
-		if (strlen($class)) {
3810
-			$balise_svg = inserer_attribut($balise_svg, 'class', $class);
3811
-		}
3812
-		else {
3813
-			$balise_svg = vider_attribut($balise_svg, 'class');
3814
-		}
3815
-	}
3816
-
3817
-	// regler le alt
3818
-	if ($alt) {
3819
-		$balise_svg = inserer_attribut($balise_svg, 'role', 'img');
3820
-		$id = 'img-svg-title-' . substr(md5("$img_file:$svg:$alt"), 0, 4);
3821
-		$balise_svg = inserer_attribut($balise_svg, 'aria-labelledby', $id);
3822
-		$title = "<title id=\"$id\">" . entites_html($alt) . "</title>\n";
3823
-		$balise_svg .= $title;
3824
-	}
3825
-	else {
3826
-		$balise_svg = inserer_attribut($balise_svg, 'aria-hidden', 'true');
3827
-	}
3828
-
3829
-	$svg = str_replace($balise_svg_source, $balise_svg, $svg);
3830
-
3831
-	if (!is_null($size) and strlen($size = trim($size))) {
3832
-		[$width, $height] = helper_filtre_balise_img_svg_size($svg, $size);
3833
-
3834
-		if (!function_exists('svg_redimensionner')) {
3835
-			include_spip('inc/svg');
3836
-		}
3837
-		$svg = svg_redimensionner($svg, $width, $height);
3838
-	}
3839
-
3840
-	return $svg;
3767
+    $svg = null;
3768
+    $img = trim($img);
3769
+    $img_file = $img;
3770
+    if (strpos($img, '<svg') === false) {
3771
+        if ($p = strpos($img_file, '?')) {
3772
+            $img_file = substr($img_file, 0, $p);
3773
+        }
3774
+
3775
+        // ne jamais operer directement sur une image distante pour des raisons de perfo
3776
+        // la copie locale a toutes les chances d'etre la ou de resservir
3777
+        if (tester_url_absolue($img_file)) {
3778
+            include_spip('inc/distant');
3779
+            $fichier = copie_locale($img_file);
3780
+            $img_file = ($fichier ? _DIR_RACINE . $fichier : $img_file);
3781
+        }
3782
+
3783
+        if (
3784
+            !$img_file
3785
+            or !file_exists($img_file)
3786
+            or !$svg = file_get_contents($img_file)
3787
+        ) {
3788
+            return '';
3789
+        }
3790
+    }
3791
+
3792
+    if (!preg_match(",<svg\b[^>]*>,UimsS", $svg, $match)) {
3793
+        return '';
3794
+    }
3795
+
3796
+    [$alt, $class, $size] = helper_filtre_balise_img_svg_arguments($alt, $class, $size);
3797
+
3798
+    $balise_svg = $match[0];
3799
+    $balise_svg_source = $balise_svg;
3800
+
3801
+    // entete XML à supprimer
3802
+    $svg = preg_replace(',^\s*<\?xml[^>]*\?' . '>,', '', $svg);
3803
+
3804
+    // IE est toujours mon ami
3805
+    $balise_svg = inserer_attribut($balise_svg, 'focusable', 'false');
3806
+
3807
+    // regler la classe
3808
+    if (!is_null($class)) {
3809
+        if (strlen($class)) {
3810
+            $balise_svg = inserer_attribut($balise_svg, 'class', $class);
3811
+        }
3812
+        else {
3813
+            $balise_svg = vider_attribut($balise_svg, 'class');
3814
+        }
3815
+    }
3816
+
3817
+    // regler le alt
3818
+    if ($alt) {
3819
+        $balise_svg = inserer_attribut($balise_svg, 'role', 'img');
3820
+        $id = 'img-svg-title-' . substr(md5("$img_file:$svg:$alt"), 0, 4);
3821
+        $balise_svg = inserer_attribut($balise_svg, 'aria-labelledby', $id);
3822
+        $title = "<title id=\"$id\">" . entites_html($alt) . "</title>\n";
3823
+        $balise_svg .= $title;
3824
+    }
3825
+    else {
3826
+        $balise_svg = inserer_attribut($balise_svg, 'aria-hidden', 'true');
3827
+    }
3828
+
3829
+    $svg = str_replace($balise_svg_source, $balise_svg, $svg);
3830
+
3831
+    if (!is_null($size) and strlen($size = trim($size))) {
3832
+        [$width, $height] = helper_filtre_balise_img_svg_size($svg, $size);
3833
+
3834
+        if (!function_exists('svg_redimensionner')) {
3835
+            include_spip('inc/svg');
3836
+        }
3837
+        $svg = svg_redimensionner($svg, $width, $height);
3838
+    }
3839
+
3840
+    return $svg;
3841 3841
 }
3842 3842
 
3843 3843
 
@@ -3863,18 +3863,18 @@  discard block
 block discarded – undo
3863 3863
  *     Code HTML résultant
3864 3864
  **/
3865 3865
 function filtre_foreach_dist($tableau, $modele = 'foreach') {
3866
-	$texte = '';
3867
-	if (is_array($tableau)) {
3868
-		foreach ($tableau as $k => $v) {
3869
-			$res = recuperer_fond(
3870
-				'modeles/' . $modele,
3871
-				array_merge(['cle' => $k], (is_array($v) ? $v : ['valeur' => $v]))
3872
-			);
3873
-			$texte .= $res;
3874
-		}
3875
-	}
3866
+    $texte = '';
3867
+    if (is_array($tableau)) {
3868
+        foreach ($tableau as $k => $v) {
3869
+            $res = recuperer_fond(
3870
+                'modeles/' . $modele,
3871
+                array_merge(['cle' => $k], (is_array($v) ? $v : ['valeur' => $v]))
3872
+            );
3873
+            $texte .= $res;
3874
+        }
3875
+    }
3876 3876
 
3877
-	return $texte;
3877
+    return $texte;
3878 3878
 }
3879 3879
 
3880 3880
 
@@ -3899,37 +3899,37 @@  discard block
 block discarded – undo
3899 3899
  *         - tout : retourne toutes les informations du plugin actif
3900 3900
  **/
3901 3901
 function filtre_info_plugin_dist($plugin, $type_info, $reload = false) {
3902
-	include_spip('inc/plugin');
3903
-	$plugin = strtoupper($plugin);
3904
-	$plugins_actifs = liste_plugin_actifs();
3905
-
3906
-	if (!$plugin) {
3907
-		return serialize(array_keys($plugins_actifs));
3908
-	} elseif (empty($plugins_actifs[$plugin]) and !$reload) {
3909
-		return '';
3910
-	} elseif (($type_info == 'est_actif') and !$reload) {
3911
-		return $plugins_actifs[$plugin] ? 1 : 0;
3912
-	} elseif (isset($plugins_actifs[$plugin][$type_info]) and !$reload) {
3913
-		return $plugins_actifs[$plugin][$type_info];
3914
-	} else {
3915
-		$get_infos = charger_fonction('get_infos', 'plugins');
3916
-		// On prend en compte les extensions
3917
-		if (!is_dir($plugins_actifs[$plugin]['dir_type'])) {
3918
-			$dir_plugins = constant($plugins_actifs[$plugin]['dir_type']);
3919
-		} else {
3920
-			$dir_plugins = $plugins_actifs[$plugin]['dir_type'];
3921
-		}
3922
-		if (!$infos = $get_infos($plugins_actifs[$plugin]['dir'], $reload, $dir_plugins)) {
3923
-			return '';
3924
-		}
3925
-		if ($type_info == 'tout') {
3926
-			return $infos;
3927
-		} elseif ($type_info == 'est_actif') {
3928
-			return $infos ? 1 : 0;
3929
-		} else {
3930
-			return strval($infos[$type_info]);
3931
-		}
3932
-	}
3902
+    include_spip('inc/plugin');
3903
+    $plugin = strtoupper($plugin);
3904
+    $plugins_actifs = liste_plugin_actifs();
3905
+
3906
+    if (!$plugin) {
3907
+        return serialize(array_keys($plugins_actifs));
3908
+    } elseif (empty($plugins_actifs[$plugin]) and !$reload) {
3909
+        return '';
3910
+    } elseif (($type_info == 'est_actif') and !$reload) {
3911
+        return $plugins_actifs[$plugin] ? 1 : 0;
3912
+    } elseif (isset($plugins_actifs[$plugin][$type_info]) and !$reload) {
3913
+        return $plugins_actifs[$plugin][$type_info];
3914
+    } else {
3915
+        $get_infos = charger_fonction('get_infos', 'plugins');
3916
+        // On prend en compte les extensions
3917
+        if (!is_dir($plugins_actifs[$plugin]['dir_type'])) {
3918
+            $dir_plugins = constant($plugins_actifs[$plugin]['dir_type']);
3919
+        } else {
3920
+            $dir_plugins = $plugins_actifs[$plugin]['dir_type'];
3921
+        }
3922
+        if (!$infos = $get_infos($plugins_actifs[$plugin]['dir'], $reload, $dir_plugins)) {
3923
+            return '';
3924
+        }
3925
+        if ($type_info == 'tout') {
3926
+            return $infos;
3927
+        } elseif ($type_info == 'est_actif') {
3928
+            return $infos ? 1 : 0;
3929
+        } else {
3930
+            return strval($infos[$type_info]);
3931
+        }
3932
+    }
3933 3933
 }
3934 3934
 
3935 3935
 
@@ -3956,9 +3956,9 @@  discard block
 block discarded – undo
3956 3956
  *     Code HTML de l'image de puce de statut à insérer (et du menu de changement si présent)
3957 3957
  */
3958 3958
 function puce_changement_statut($id_objet, $statut, $id_rubrique, $type, $ajax = false) {
3959
-	$puce_statut = charger_fonction('puce_statut', 'inc');
3959
+    $puce_statut = charger_fonction('puce_statut', 'inc');
3960 3960
 
3961
-	return $puce_statut($id_objet, $statut, $id_rubrique, $type, $ajax);
3961
+    return $puce_statut($id_objet, $statut, $id_rubrique, $type, $ajax);
3962 3962
 }
3963 3963
 
3964 3964
 
@@ -3988,19 +3988,19 @@  discard block
 block discarded – undo
3988 3988
  *     Code HTML de l'image de puce de statut à insérer (et du menu de changement si présent)
3989 3989
  */
3990 3990
 function filtre_puce_statut_dist($statut, $objet, $id_objet = 0, $id_parent = 0) {
3991
-	static $puce_statut = null;
3992
-	if (!$puce_statut) {
3993
-		$puce_statut = charger_fonction('puce_statut', 'inc');
3994
-	}
3991
+    static $puce_statut = null;
3992
+    if (!$puce_statut) {
3993
+        $puce_statut = charger_fonction('puce_statut', 'inc');
3994
+    }
3995 3995
 
3996
-	return $puce_statut(
3997
-		$id_objet,
3998
-		$statut,
3999
-		$id_parent,
4000
-		$objet,
4001
-		false,
4002
-		objet_info($objet, 'editable') ? _ACTIVER_PUCE_RAPIDE : false
4003
-	);
3996
+    return $puce_statut(
3997
+        $id_objet,
3998
+        $statut,
3999
+        $id_parent,
4000
+        $objet,
4001
+        false,
4002
+        objet_info($objet, 'editable') ? _ACTIVER_PUCE_RAPIDE : false
4003
+    );
4004 4004
 }
4005 4005
 
4006 4006
 
@@ -4027,98 +4027,98 @@  discard block
 block discarded – undo
4027 4027
  *   hash du contexte
4028 4028
  */
4029 4029
 function encoder_contexte_ajax($c, $form = '', $emboite = null, $ajaxid = '') {
4030
-	$env = null;
4031
-	if (
4032
-		is_string($c)
4033
-		and @unserialize($c) !== false
4034
-	) {
4035
-		$c = unserialize($c);
4036
-	}
4037
-
4038
-	// supprimer les parametres debut_x
4039
-	// pour que la pagination ajax ne soit pas plantee
4040
-	// si on charge la page &debut_x=1 : car alors en cliquant sur l'item 0,
4041
-	// le debut_x=0 n'existe pas, et on resterait sur 1
4042
-	if (is_array($c)) {
4043
-		foreach ($c as $k => $v) {
4044
-			if (strpos($k, 'debut_') === 0) {
4045
-				unset($c[$k]);
4046
-			}
4047
-		}
4048
-	}
4049
-
4050
-	if (!function_exists('calculer_cle_action')) {
4051
-		include_spip('inc/securiser_action');
4052
-	}
4053
-
4054
-	$c = serialize($c);
4055
-	$cle = calculer_cle_action($form . $c);
4056
-	$c = "$cle:$c";
4057
-
4058
-	// on ne stocke pas les contextes dans des fichiers en cache
4059
-	// par defaut, sauf si cette configuration a été forcée
4060
-	// OU que la longueur de l’argument géneré est plus long
4061
-	// que ce qui est toléré.
4062
-	$cache_contextes_ajax = (defined('_CACHE_CONTEXTES_AJAX') and _CACHE_CONTEXTES_AJAX);
4063
-	if (!$cache_contextes_ajax) {
4064
-		$env = $c;
4065
-		if (function_exists('gzdeflate') && function_exists('gzinflate')) {
4066
-			$env = gzdeflate($env);
4067
-		}
4068
-		$env = _xor($env);
4069
-		$env = base64_encode($env);
4070
-		$len = strlen($env);
4071
-		// Si l’url est trop longue pour le navigateur
4072
-		$max_len = _CACHE_CONTEXTES_AJAX_SUR_LONGUEUR;
4073
-		if ($len > $max_len) {
4074
-			$cache_contextes_ajax = true;
4075
-			spip_log(
4076
-				'Contextes AJAX forces en fichiers !'
4077
-				. ' Cela arrive lorsque la valeur du contexte'
4078
-				. " depasse la longueur maximale autorisee ($max_len). Ici : $len.",
4079
-				_LOG_AVERTISSEMENT
4080
-			);
4081
-		}
4082
-		// Sinon si Suhosin est actif et a une la valeur maximale des variables en GET...
4083
-		elseif (
4084
-			$max_len = @ini_get('suhosin.get.max_value_length')
4085
-			and $max_len < $len
4086
-		) {
4087
-			$cache_contextes_ajax = true;
4088
-			spip_log('Contextes AJAX forces en fichiers !'
4089
-				. ' Cela arrive lorsque la valeur du contexte'
4090
-				. ' depasse la longueur maximale autorisee par Suhosin'
4091
-				. " ($max_len) dans 'suhosin.get.max_value_length'. Ici : $len."
4092
-				. ' Vous devriez modifier les parametres de Suhosin'
4093
-				. ' pour accepter au moins 1024 caracteres.', _LOG_AVERTISSEMENT);
4094
-		}
4095
-	}
4096
-
4097
-	if ($cache_contextes_ajax) {
4098
-		$dir = sous_repertoire(_DIR_CACHE, 'contextes');
4099
-		// stocker les contextes sur disque et ne passer qu'un hash dans l'url
4100
-		$md5 = md5($c);
4101
-		ecrire_fichier("$dir/c$md5", $c);
4102
-		$env = $md5;
4103
-	}
4104
-
4105
-	if ($emboite === null) {
4106
-		return $env;
4107
-	}
4108
-	if (!trim($emboite)) {
4109
-		return '';
4110
-	}
4111
-	// toujours encoder l'url source dans le bloc ajax
4112
-	$r = self();
4113
-	$r = ' data-origin="' . $r . '"';
4114
-	$class = 'ajaxbloc';
4115
-	if ($ajaxid and is_string($ajaxid)) {
4116
-		// ajaxid est normalement conforme a un nom de classe css
4117
-		// on ne verifie pas la conformite, mais on passe entites_html par dessus par precaution
4118
-		$class .= ' ajax-id-' . entites_html($ajaxid);
4119
-	}
4120
-
4121
-	return "<div class='$class' " . "data-ajax-env='$env'$r>\n$emboite</div><!--ajaxbloc-->\n";
4030
+    $env = null;
4031
+    if (
4032
+        is_string($c)
4033
+        and @unserialize($c) !== false
4034
+    ) {
4035
+        $c = unserialize($c);
4036
+    }
4037
+
4038
+    // supprimer les parametres debut_x
4039
+    // pour que la pagination ajax ne soit pas plantee
4040
+    // si on charge la page &debut_x=1 : car alors en cliquant sur l'item 0,
4041
+    // le debut_x=0 n'existe pas, et on resterait sur 1
4042
+    if (is_array($c)) {
4043
+        foreach ($c as $k => $v) {
4044
+            if (strpos($k, 'debut_') === 0) {
4045
+                unset($c[$k]);
4046
+            }
4047
+        }
4048
+    }
4049
+
4050
+    if (!function_exists('calculer_cle_action')) {
4051
+        include_spip('inc/securiser_action');
4052
+    }
4053
+
4054
+    $c = serialize($c);
4055
+    $cle = calculer_cle_action($form . $c);
4056
+    $c = "$cle:$c";
4057
+
4058
+    // on ne stocke pas les contextes dans des fichiers en cache
4059
+    // par defaut, sauf si cette configuration a été forcée
4060
+    // OU que la longueur de l’argument géneré est plus long
4061
+    // que ce qui est toléré.
4062
+    $cache_contextes_ajax = (defined('_CACHE_CONTEXTES_AJAX') and _CACHE_CONTEXTES_AJAX);
4063
+    if (!$cache_contextes_ajax) {
4064
+        $env = $c;
4065
+        if (function_exists('gzdeflate') && function_exists('gzinflate')) {
4066
+            $env = gzdeflate($env);
4067
+        }
4068
+        $env = _xor($env);
4069
+        $env = base64_encode($env);
4070
+        $len = strlen($env);
4071
+        // Si l’url est trop longue pour le navigateur
4072
+        $max_len = _CACHE_CONTEXTES_AJAX_SUR_LONGUEUR;
4073
+        if ($len > $max_len) {
4074
+            $cache_contextes_ajax = true;
4075
+            spip_log(
4076
+                'Contextes AJAX forces en fichiers !'
4077
+                . ' Cela arrive lorsque la valeur du contexte'
4078
+                . " depasse la longueur maximale autorisee ($max_len). Ici : $len.",
4079
+                _LOG_AVERTISSEMENT
4080
+            );
4081
+        }
4082
+        // Sinon si Suhosin est actif et a une la valeur maximale des variables en GET...
4083
+        elseif (
4084
+            $max_len = @ini_get('suhosin.get.max_value_length')
4085
+            and $max_len < $len
4086
+        ) {
4087
+            $cache_contextes_ajax = true;
4088
+            spip_log('Contextes AJAX forces en fichiers !'
4089
+                . ' Cela arrive lorsque la valeur du contexte'
4090
+                . ' depasse la longueur maximale autorisee par Suhosin'
4091
+                . " ($max_len) dans 'suhosin.get.max_value_length'. Ici : $len."
4092
+                . ' Vous devriez modifier les parametres de Suhosin'
4093
+                . ' pour accepter au moins 1024 caracteres.', _LOG_AVERTISSEMENT);
4094
+        }
4095
+    }
4096
+
4097
+    if ($cache_contextes_ajax) {
4098
+        $dir = sous_repertoire(_DIR_CACHE, 'contextes');
4099
+        // stocker les contextes sur disque et ne passer qu'un hash dans l'url
4100
+        $md5 = md5($c);
4101
+        ecrire_fichier("$dir/c$md5", $c);
4102
+        $env = $md5;
4103
+    }
4104
+
4105
+    if ($emboite === null) {
4106
+        return $env;
4107
+    }
4108
+    if (!trim($emboite)) {
4109
+        return '';
4110
+    }
4111
+    // toujours encoder l'url source dans le bloc ajax
4112
+    $r = self();
4113
+    $r = ' data-origin="' . $r . '"';
4114
+    $class = 'ajaxbloc';
4115
+    if ($ajaxid and is_string($ajaxid)) {
4116
+        // ajaxid est normalement conforme a un nom de classe css
4117
+        // on ne verifie pas la conformite, mais on passe entites_html par dessus par precaution
4118
+        $class .= ' ajax-id-' . entites_html($ajaxid);
4119
+    }
4120
+
4121
+    return "<div class='$class' " . "data-ajax-env='$env'$r>\n$emboite</div><!--ajaxbloc-->\n";
4122 4122
 }
4123 4123
 
4124 4124
 /**
@@ -4138,37 +4138,37 @@  discard block
 block discarded – undo
4138 4138
  *   - false : erreur de décodage
4139 4139
  */
4140 4140
 function decoder_contexte_ajax($c, $form = '') {
4141
-	if (!function_exists('calculer_cle_action')) {
4142
-		include_spip('inc/securiser_action');
4143
-	}
4144
-	if (
4145
-		((defined('_CACHE_CONTEXTES_AJAX') and _CACHE_CONTEXTES_AJAX) or strlen($c) == 32)
4146
-		and $dir = sous_repertoire(_DIR_CACHE, 'contextes')
4147
-		and lire_fichier("$dir/c$c", $contexte)
4148
-	) {
4149
-		$c = $contexte;
4150
-	} else {
4151
-		$c = @base64_decode($c);
4152
-		$c = _xor($c);
4153
-		if (function_exists('gzdeflate') && function_exists('gzinflate')) {
4154
-			$c = @gzinflate($c);
4155
-		}
4156
-	}
4157
-
4158
-	// extraire la signature en debut de contexte
4159
-	// et la verifier avant de deserializer
4160
-	// format : signature:donneesserializees
4161
-	if ($p = strpos($c, ':')) {
4162
-		$cle = substr($c, 0, $p);
4163
-		$c = substr($c, $p + 1);
4164
-
4165
-		if ($cle == calculer_cle_action($form . $c)) {
4166
-			$env = @unserialize($c);
4167
-			return $env;
4168
-		}
4169
-	}
4170
-
4171
-	return false;
4141
+    if (!function_exists('calculer_cle_action')) {
4142
+        include_spip('inc/securiser_action');
4143
+    }
4144
+    if (
4145
+        ((defined('_CACHE_CONTEXTES_AJAX') and _CACHE_CONTEXTES_AJAX) or strlen($c) == 32)
4146
+        and $dir = sous_repertoire(_DIR_CACHE, 'contextes')
4147
+        and lire_fichier("$dir/c$c", $contexte)
4148
+    ) {
4149
+        $c = $contexte;
4150
+    } else {
4151
+        $c = @base64_decode($c);
4152
+        $c = _xor($c);
4153
+        if (function_exists('gzdeflate') && function_exists('gzinflate')) {
4154
+            $c = @gzinflate($c);
4155
+        }
4156
+    }
4157
+
4158
+    // extraire la signature en debut de contexte
4159
+    // et la verifier avant de deserializer
4160
+    // format : signature:donneesserializees
4161
+    if ($p = strpos($c, ':')) {
4162
+        $cle = substr($c, 0, $p);
4163
+        $c = substr($c, $p + 1);
4164
+
4165
+        if ($cle == calculer_cle_action($form . $c)) {
4166
+            $env = @unserialize($c);
4167
+            return $env;
4168
+        }
4169
+    }
4170
+
4171
+    return false;
4172 4172
 }
4173 4173
 
4174 4174
 
@@ -4186,20 +4186,20 @@  discard block
 block discarded – undo
4186 4186
  *    Message décrypté ou encrypté
4187 4187
  **/
4188 4188
 function _xor($message, $key = null) {
4189
-	if (is_null($key)) {
4190
-		if (!function_exists('calculer_cle_action')) {
4191
-			include_spip('inc/securiser_action');
4192
-		}
4193
-		$key = pack('H*', calculer_cle_action('_xor'));
4194
-	}
4189
+    if (is_null($key)) {
4190
+        if (!function_exists('calculer_cle_action')) {
4191
+            include_spip('inc/securiser_action');
4192
+        }
4193
+        $key = pack('H*', calculer_cle_action('_xor'));
4194
+    }
4195 4195
 
4196
-	$keylen = strlen($key);
4197
-	$messagelen = strlen($message);
4198
-	for ($i = 0; $i < $messagelen; $i++) {
4199
-		$message[$i] = ~($message[$i] ^ $key[$i % $keylen]);
4200
-	}
4196
+    $keylen = strlen($key);
4197
+    $messagelen = strlen($message);
4198
+    for ($i = 0; $i < $messagelen; $i++) {
4199
+        $message[$i] = ~($message[$i] ^ $key[$i % $keylen]);
4200
+    }
4201 4201
 
4202
-	return $message;
4202
+    return $message;
4203 4203
 }
4204 4204
 
4205 4205
 /**
@@ -4213,7 +4213,7 @@  discard block
 block discarded – undo
4213 4213
  * @return string
4214 4214
  */
4215 4215
 function url_reponse_forum($texte) {
4216
- return $texte;
4216
+    return $texte;
4217 4217
 }
4218 4218
 
4219 4219
 /**
@@ -4227,7 +4227,7 @@  discard block
 block discarded – undo
4227 4227
  * @return string
4228 4228
  */
4229 4229
 function url_rss_forum($texte) {
4230
- return $texte;
4230
+    return $texte;
4231 4231
 }
4232 4232
 
4233 4233
 
@@ -4266,37 +4266,37 @@  discard block
 block discarded – undo
4266 4266
  *   Code HTML
4267 4267
  */
4268 4268
 function lien_ou_expose($url, $libelle = null, $on = false, $class = '', $title = '', $rel = '', $evt = '') {
4269
-	if ($on) {
4270
-		$bal = 'strong';
4271
-		$class = '';
4272
-		$att = '';
4273
-		// si $on passe la balise et optionnelement une ou ++classe
4274
-		// a.active span.selected.active etc....
4275
-		if (is_string($on) and (strncmp($on, 'a', 1) == 0 or strncmp($on, 'span', 4) == 0 or strncmp($on, 'strong', 6) == 0)) {
4276
-			$on = explode('.', $on);
4277
-			// on verifie que c'est exactement une des 3 balises a, span ou strong
4278
-			if (in_array(reset($on), ['a', 'span', 'strong'])) {
4279
-				$bal = array_shift($on);
4280
-				$class = implode(' ', $on);
4281
-				if ($bal == 'a') {
4282
-					$att = 'href="#" ';
4283
-				}
4284
-			}
4285
-		}
4286
-		$att .= 'class="' . ($class ? attribut_html($class) . ' ' : '') . (defined('_LIEN_OU_EXPOSE_CLASS_ON') ? _LIEN_OU_EXPOSE_CLASS_ON : 'on') . '"';
4287
-	} else {
4288
-		$bal = 'a';
4289
-		$att = "href='$url'"
4290
-			. ($title ? " title='" . attribut_html($title) . "'" : '')
4291
-			. ($class ? " class='" . attribut_html($class) . "'" : '')
4292
-			. ($rel ? " rel='" . attribut_html($rel) . "'" : '')
4293
-			. $evt;
4294
-	}
4295
-	if ($libelle === null) {
4296
-		$libelle = $url;
4297
-	}
4298
-
4299
-	return "<$bal $att>$libelle</$bal>";
4269
+    if ($on) {
4270
+        $bal = 'strong';
4271
+        $class = '';
4272
+        $att = '';
4273
+        // si $on passe la balise et optionnelement une ou ++classe
4274
+        // a.active span.selected.active etc....
4275
+        if (is_string($on) and (strncmp($on, 'a', 1) == 0 or strncmp($on, 'span', 4) == 0 or strncmp($on, 'strong', 6) == 0)) {
4276
+            $on = explode('.', $on);
4277
+            // on verifie que c'est exactement une des 3 balises a, span ou strong
4278
+            if (in_array(reset($on), ['a', 'span', 'strong'])) {
4279
+                $bal = array_shift($on);
4280
+                $class = implode(' ', $on);
4281
+                if ($bal == 'a') {
4282
+                    $att = 'href="#" ';
4283
+                }
4284
+            }
4285
+        }
4286
+        $att .= 'class="' . ($class ? attribut_html($class) . ' ' : '') . (defined('_LIEN_OU_EXPOSE_CLASS_ON') ? _LIEN_OU_EXPOSE_CLASS_ON : 'on') . '"';
4287
+    } else {
4288
+        $bal = 'a';
4289
+        $att = "href='$url'"
4290
+            . ($title ? " title='" . attribut_html($title) . "'" : '')
4291
+            . ($class ? " class='" . attribut_html($class) . "'" : '')
4292
+            . ($rel ? " rel='" . attribut_html($rel) . "'" : '')
4293
+            . $evt;
4294
+    }
4295
+    if ($libelle === null) {
4296
+        $libelle = $url;
4297
+    }
4298
+
4299
+    return "<$bal $att>$libelle</$bal>";
4300 4300
 }
4301 4301
 
4302 4302
 
@@ -4313,39 +4313,39 @@  discard block
 block discarded – undo
4313 4313
  * @return string : la chaine de langue finale en utilisant la fonction _T()
4314 4314
  */
4315 4315
 function singulier_ou_pluriel($nb, $chaine_un, $chaine_plusieurs, $var = 'nb', $vars = []) {
4316
-	static $local_singulier_ou_pluriel = [];
4317
-
4318
-	// si nb=0 ou pas de $vars valide on retourne une chaine vide, a traiter par un |sinon
4319
-	if (!is_numeric($nb) or $nb == 0) {
4320
-		return '';
4321
-	}
4322
-	if (!is_array($vars)) {
4323
-		return '';
4324
-	}
4325
-
4326
-	$langue = $GLOBALS['spip_lang'];
4327
-	if (!isset($local_singulier_ou_pluriel[$langue])) {
4328
-		$local_singulier_ou_pluriel[$langue] = false;
4329
-		if (
4330
-			$f = charger_fonction("singulier_ou_pluriel_{$langue}", 'inc', true)
4331
-			or $f = charger_fonction('singulier_ou_pluriel', 'inc', true)
4332
-		) {
4333
-			$local_singulier_ou_pluriel[$langue] = $f;
4334
-		}
4335
-	}
4336
-
4337
-	// si on a une surcharge on l'utilise
4338
-	if ($local_singulier_ou_pluriel[$langue]) {
4339
-		return ($local_singulier_ou_pluriel[$langue])($nb, $chaine_un, $chaine_plusieurs, $var, $vars);
4340
-	}
4341
-
4342
-	// sinon traitement par defaut
4343
-	$vars[$var] = $nb;
4344
-	if ($nb >= 2) {
4345
-		return _T($chaine_plusieurs, $vars);
4346
-	} else {
4347
-		return _T($chaine_un, $vars);
4348
-	}
4316
+    static $local_singulier_ou_pluriel = [];
4317
+
4318
+    // si nb=0 ou pas de $vars valide on retourne une chaine vide, a traiter par un |sinon
4319
+    if (!is_numeric($nb) or $nb == 0) {
4320
+        return '';
4321
+    }
4322
+    if (!is_array($vars)) {
4323
+        return '';
4324
+    }
4325
+
4326
+    $langue = $GLOBALS['spip_lang'];
4327
+    if (!isset($local_singulier_ou_pluriel[$langue])) {
4328
+        $local_singulier_ou_pluriel[$langue] = false;
4329
+        if (
4330
+            $f = charger_fonction("singulier_ou_pluriel_{$langue}", 'inc', true)
4331
+            or $f = charger_fonction('singulier_ou_pluriel', 'inc', true)
4332
+        ) {
4333
+            $local_singulier_ou_pluriel[$langue] = $f;
4334
+        }
4335
+    }
4336
+
4337
+    // si on a une surcharge on l'utilise
4338
+    if ($local_singulier_ou_pluriel[$langue]) {
4339
+        return ($local_singulier_ou_pluriel[$langue])($nb, $chaine_un, $chaine_plusieurs, $var, $vars);
4340
+    }
4341
+
4342
+    // sinon traitement par defaut
4343
+    $vars[$var] = $nb;
4344
+    if ($nb >= 2) {
4345
+        return _T($chaine_plusieurs, $vars);
4346
+    } else {
4347
+        return _T($chaine_un, $vars);
4348
+    }
4349 4349
 }
4350 4350
 
4351 4351
 
@@ -4373,73 +4373,73 @@  discard block
 block discarded – undo
4373 4373
  */
4374 4374
 function prepare_icone_base($type, $lien, $texte, $fond, $fonction = '', $class = '', $javascript = '') {
4375 4375
 
4376
-	$class_lien = $class_bouton = $class;
4377
-
4378
-	// Normaliser la fonction et compléter la classe en fonction
4379
-	if (in_array($fonction, ['del', 'supprimer.gif'])) {
4380
-		$class_lien .= ' danger';
4381
-		$class_bouton .= ' btn_danger';
4382
-	} elseif ($fonction == 'rien.gif') {
4383
-		$fonction = '';
4384
-	} elseif ($fonction == 'delsafe') {
4385
-		$fonction = 'del';
4386
-	}
4387
-
4388
-	$fond_origine = $fond;
4389
-	// Remappage des icone : article-24.png+new => article-new-24.png
4390
-	if ($icone_renommer = charger_fonction('icone_renommer', 'inc', true)) {
4391
-		[$fond, $fonction] = $icone_renommer($fond, $fonction);
4392
-	}
4393
-
4394
-	// Ajouter le type d'objet dans la classe
4395
-	$objet_type = substr(basename($fond), 0, -4);
4396
-	$class_lien .= " $objet_type";
4397
-	$class_bouton .= " $objet_type";
4398
-
4399
-	// Texte
4400
-	$alt = attribut_html($texte);
4401
-	$title = " title=\"$alt\""; // est-ce pertinent de doubler le alt par un title ?
4402
-
4403
-	// Liens : préparer les classes ajax
4404
-	$ajax = '';
4405
-	if ($type === 'lien') {
4406
-		if (strpos($class_lien, 'ajax') !== false) {
4407
-			$ajax = 'ajax';
4408
-			if (strpos($class_lien, 'preload') !== false) {
4409
-				$ajax .= ' preload';
4410
-			}
4411
-			if (strpos($class_lien, 'nocache') !== false) {
4412
-				$ajax .= ' nocache';
4413
-			}
4414
-			$ajax = " class='$ajax'";
4415
-		}
4416
-	}
4417
-
4418
-	// Repérer la taille et l'ajouter dans la classe
4419
-	$size = 24;
4420
-	if (
4421
-		preg_match('/-([0-9]{1,3})[.](gif|png|svg)$/i', $fond, $match)
4422
-		or preg_match('/-([0-9]{1,3})([.](gif|png|svg))?$/i', $fond_origine, $match)
4423
-	) {
4424
-		$size = $match[1];
4425
-	}
4426
-	$class_lien .= " s$size";
4427
-	$class_bouton .= " s$size";
4428
-
4429
-	// Icône
4430
-	$icone = http_img_pack($fond, $alt, "width='$size' height='$size'");
4431
-	$icone = '<span class="icone-image' . ($fonction ? " icone-fonction icone-fonction-$fonction" : '') . "\">$icone</span>";
4432
-
4433
-	// Markup final
4434
-	if ($type == 'lien') {
4435
-		return "<span class='icone $class_lien'>"
4436
-		. "<a href='$lien'$title$ajax$javascript>"
4437
-		. $icone
4438
-		. "<b>$texte</b>"
4439
-		. "</a></span>\n";
4440
-	} else {
4441
-		return bouton_action("$icone $texte", $lien, $class_bouton, $javascript, $alt);
4442
-	}
4376
+    $class_lien = $class_bouton = $class;
4377
+
4378
+    // Normaliser la fonction et compléter la classe en fonction
4379
+    if (in_array($fonction, ['del', 'supprimer.gif'])) {
4380
+        $class_lien .= ' danger';
4381
+        $class_bouton .= ' btn_danger';
4382
+    } elseif ($fonction == 'rien.gif') {
4383
+        $fonction = '';
4384
+    } elseif ($fonction == 'delsafe') {
4385
+        $fonction = 'del';
4386
+    }
4387
+
4388
+    $fond_origine = $fond;
4389
+    // Remappage des icone : article-24.png+new => article-new-24.png
4390
+    if ($icone_renommer = charger_fonction('icone_renommer', 'inc', true)) {
4391
+        [$fond, $fonction] = $icone_renommer($fond, $fonction);
4392
+    }
4393
+
4394
+    // Ajouter le type d'objet dans la classe
4395
+    $objet_type = substr(basename($fond), 0, -4);
4396
+    $class_lien .= " $objet_type";
4397
+    $class_bouton .= " $objet_type";
4398
+
4399
+    // Texte
4400
+    $alt = attribut_html($texte);
4401
+    $title = " title=\"$alt\""; // est-ce pertinent de doubler le alt par un title ?
4402
+
4403
+    // Liens : préparer les classes ajax
4404
+    $ajax = '';
4405
+    if ($type === 'lien') {
4406
+        if (strpos($class_lien, 'ajax') !== false) {
4407
+            $ajax = 'ajax';
4408
+            if (strpos($class_lien, 'preload') !== false) {
4409
+                $ajax .= ' preload';
4410
+            }
4411
+            if (strpos($class_lien, 'nocache') !== false) {
4412
+                $ajax .= ' nocache';
4413
+            }
4414
+            $ajax = " class='$ajax'";
4415
+        }
4416
+    }
4417
+
4418
+    // Repérer la taille et l'ajouter dans la classe
4419
+    $size = 24;
4420
+    if (
4421
+        preg_match('/-([0-9]{1,3})[.](gif|png|svg)$/i', $fond, $match)
4422
+        or preg_match('/-([0-9]{1,3})([.](gif|png|svg))?$/i', $fond_origine, $match)
4423
+    ) {
4424
+        $size = $match[1];
4425
+    }
4426
+    $class_lien .= " s$size";
4427
+    $class_bouton .= " s$size";
4428
+
4429
+    // Icône
4430
+    $icone = http_img_pack($fond, $alt, "width='$size' height='$size'");
4431
+    $icone = '<span class="icone-image' . ($fonction ? " icone-fonction icone-fonction-$fonction" : '') . "\">$icone</span>";
4432
+
4433
+    // Markup final
4434
+    if ($type == 'lien') {
4435
+        return "<span class='icone $class_lien'>"
4436
+        . "<a href='$lien'$title$ajax$javascript>"
4437
+        . $icone
4438
+        . "<b>$texte</b>"
4439
+        . "</a></span>\n";
4440
+    } else {
4441
+        return bouton_action("$icone $texte", $lien, $class_bouton, $javascript, $alt);
4442
+    }
4443 4443
 }
4444 4444
 
4445 4445
 /**
@@ -4463,7 +4463,7 @@  discard block
 block discarded – undo
4463 4463
  *     Code HTML du lien
4464 4464
  **/
4465 4465
 function icone_base($lien, $texte, $fond, $fonction = '', $class = '', $javascript = '') {
4466
-	return prepare_icone_base('lien', $lien, $texte, $fond, $fonction, $class, $javascript);
4466
+    return prepare_icone_base('lien', $lien, $texte, $fond, $fonction, $class, $javascript);
4467 4467
 }
4468 4468
 
4469 4469
 /**
@@ -4498,7 +4498,7 @@  discard block
 block discarded – undo
4498 4498
  *     Code HTML du lien
4499 4499
  **/
4500 4500
 function filtre_icone_verticale_dist($lien, $texte, $fond, $fonction = '', $class = '', $javascript = '') {
4501
-	return icone_base($lien, $texte, $fond, $fonction, "verticale $class", $javascript);
4501
+    return icone_base($lien, $texte, $fond, $fonction, "verticale $class", $javascript);
4502 4502
 }
4503 4503
 
4504 4504
 /**
@@ -4543,7 +4543,7 @@  discard block
 block discarded – undo
4543 4543
  *     Code HTML du lien
4544 4544
  **/
4545 4545
 function filtre_icone_horizontale_dist($lien, $texte, $fond, $fonction = '', $class = '', $javascript = '') {
4546
-	return icone_base($lien, $texte, $fond, $fonction, "horizontale $class", $javascript);
4546
+    return icone_base($lien, $texte, $fond, $fonction, "horizontale $class", $javascript);
4547 4547
 }
4548 4548
 
4549 4549
 /**
@@ -4574,7 +4574,7 @@  discard block
 block discarded – undo
4574 4574
  *     Code HTML du lien
4575 4575
  **/
4576 4576
 function filtre_bouton_action_horizontal_dist($lien, $texte, $fond, $fonction = '', $class = '', $confirm = '') {
4577
-	return prepare_icone_base('bouton', $lien, $texte, $fond, $fonction, $class, $confirm);
4577
+    return prepare_icone_base('bouton', $lien, $texte, $fond, $fonction, $class, $confirm);
4578 4578
 }
4579 4579
 
4580 4580
 /**
@@ -4605,7 +4605,7 @@  discard block
 block discarded – undo
4605 4605
  *     Code HTML du lien
4606 4606
  */
4607 4607
 function filtre_icone_dist($lien, $texte, $fond, $align = '', $fonction = '', $class = '', $javascript = '') {
4608
-	return icone_base($lien, $texte, $fond, $fonction, "verticale $align $class", $javascript);
4608
+    return icone_base($lien, $texte, $fond, $fonction, "verticale $align $class", $javascript);
4609 4609
 }
4610 4610
 
4611 4611
 
@@ -4627,7 +4627,7 @@  discard block
 block discarded – undo
4627 4627
  * @return array Liste des éléments
4628 4628
  */
4629 4629
 function filtre_explode_dist($a, $b) {
4630
-	return explode($b, (string) $a);
4630
+    return explode($b, (string) $a);
4631 4631
 }
4632 4632
 
4633 4633
 /**
@@ -4648,7 +4648,7 @@  discard block
 block discarded – undo
4648 4648
  * @return string Texte
4649 4649
  */
4650 4650
 function filtre_implode_dist($a, $b) {
4651
-	return is_array($a) ? implode($b, $a) : $a;
4651
+    return is_array($a) ? implode($b, $a) : $a;
4652 4652
 }
4653 4653
 
4654 4654
 /**
@@ -4657,22 +4657,22 @@  discard block
 block discarded – undo
4657 4657
  * @return string Code CSS
4658 4658
  */
4659 4659
 function bando_images_background() {
4660
-	include_spip('inc/bandeau');
4661
-	// recuperer tous les boutons et leurs images
4662
-	$boutons = definir_barre_boutons(definir_barre_contexte(), true, false);
4660
+    include_spip('inc/bandeau');
4661
+    // recuperer tous les boutons et leurs images
4662
+    $boutons = definir_barre_boutons(definir_barre_contexte(), true, false);
4663 4663
 
4664
-	$res = '';
4665
-	foreach ($boutons as $page => $detail) {
4666
-		$selecteur = (in_array($page, ['outils_rapides', 'outils_collaboratifs']) ? '' : '.navigation_avec_icones ');
4667
-		foreach ($detail->sousmenu as $souspage => $sousdetail) {
4668
-			if ($sousdetail->icone and strlen(trim($sousdetail->icone))) {
4669
-				$img = http_img_variante_svg_si_possible($sousdetail->icone);
4670
-				$res .= "\n$selecteur.bando2_$souspage {background-image:url($img);}";
4671
-			}
4672
-		}
4673
-	}
4664
+    $res = '';
4665
+    foreach ($boutons as $page => $detail) {
4666
+        $selecteur = (in_array($page, ['outils_rapides', 'outils_collaboratifs']) ? '' : '.navigation_avec_icones ');
4667
+        foreach ($detail->sousmenu as $souspage => $sousdetail) {
4668
+            if ($sousdetail->icone and strlen(trim($sousdetail->icone))) {
4669
+                $img = http_img_variante_svg_si_possible($sousdetail->icone);
4670
+                $res .= "\n$selecteur.bando2_$souspage {background-image:url($img);}";
4671
+            }
4672
+        }
4673
+    }
4674 4674
 
4675
-	return $res;
4675
+    return $res;
4676 4676
 }
4677 4677
 
4678 4678
 /**
@@ -4697,27 +4697,27 @@  discard block
 block discarded – undo
4697 4697
  */
4698 4698
 function bouton_action($libelle, $url, $class = '', $confirm = '', $title = '', $callback = '') {
4699 4699
 
4700
-	// Classes : dispatcher `ajax` sur le formulaire
4701
-	$class_form = '';
4702
-	if (strpos($class, 'ajax') !== false) {
4703
-		$class_form = 'ajax';
4704
-		$class = str_replace('ajax', '', $class);
4705
-	}
4706
-	$class_btn = 'submit ' . trim($class);
4700
+    // Classes : dispatcher `ajax` sur le formulaire
4701
+    $class_form = '';
4702
+    if (strpos($class, 'ajax') !== false) {
4703
+        $class_form = 'ajax';
4704
+        $class = str_replace('ajax', '', $class);
4705
+    }
4706
+    $class_btn = 'submit ' . trim($class);
4707 4707
 
4708
-	if ($confirm) {
4709
-		$confirm = 'confirm("' . attribut_html($confirm) . '")';
4710
-		if ($callback) {
4711
-			$callback = "$confirm?($callback):false";
4712
-		} else {
4713
-			$callback = $confirm;
4714
-		}
4715
-	}
4716
-	$onclick = $callback ? " onclick='return " . addcslashes($callback, "'") . "'" : '';
4717
-	$title = $title ? " title='$title'" : '';
4708
+    if ($confirm) {
4709
+        $confirm = 'confirm("' . attribut_html($confirm) . '")';
4710
+        if ($callback) {
4711
+            $callback = "$confirm?($callback):false";
4712
+        } else {
4713
+            $callback = $confirm;
4714
+        }
4715
+    }
4716
+    $onclick = $callback ? " onclick='return " . addcslashes($callback, "'") . "'" : '';
4717
+    $title = $title ? " title='$title'" : '';
4718 4718
 
4719
-	return "<form class='bouton_action_post $class_form' method='post' action='$url'><div>" . form_hidden($url)
4720
-	. "<button type='submit' class='$class_btn'$title$onclick>$libelle</button></div></form>";
4719
+    return "<form class='bouton_action_post $class_form' method='post' action='$url'><div>" . form_hidden($url)
4720
+    . "<button type='submit' class='$class_btn'$title$onclick>$libelle</button></div></form>";
4721 4721
 }
4722 4722
 
4723 4723
 /**
@@ -4740,101 +4740,101 @@  discard block
 block discarded – undo
4740 4740
  * @return string
4741 4741
  */
4742 4742
 function generer_objet_info($id_objet, string $type_objet, string $info, string $etoile = '', array $params = []): string {
4743
-	static $trouver_table = null;
4744
-	static $objets;
4745
-
4746
-	// On verifie qu'on a tout ce qu'il faut
4747
-	$id_objet = intval($id_objet);
4748
-	if (!($id_objet and $type_objet and $info)) {
4749
-		return '';
4750
-	}
4751
-
4752
-	// si on a deja note que l'objet n'existe pas, ne pas aller plus loin
4753
-	if (isset($objets[$type_objet]) and $objets[$type_objet] === false) {
4754
-		return '';
4755
-	}
4756
-
4757
-	// Si on demande l'url, on retourne direct la fonction
4758
-	if ($info == 'url') {
4759
-		return generer_objet_url($id_objet, $type_objet, ...$params);
4760
-	}
4761
-
4762
-	// Sinon on va tout chercher dans la table et on garde en memoire
4763
-	$demande_titre = ($info === 'titre');
4764
-	$demande_introduction = ($info === 'introduction');
4765
-
4766
-	// On ne fait la requete que si on a pas deja l'objet ou si on demande le titre mais qu'on ne l'a pas encore
4767
-	if (
4768
-		!isset($objets[$type_objet][$id_objet])
4769
-		or
4770
-		($demande_titre and !isset($objets[$type_objet][$id_objet]['titre']))
4771
-	) {
4772
-		if (!$trouver_table) {
4773
-			$trouver_table = charger_fonction('trouver_table', 'base');
4774
-		}
4775
-		$desc = $trouver_table(table_objet_sql($type_objet));
4776
-		if (!$desc) {
4777
-			return $objets[$type_objet] = false;
4778
-		}
4779
-
4780
-		// Si on demande le titre, on le gere en interne
4781
-		$champ_titre = '';
4782
-		if ($demande_titre) {
4783
-			// si pas de titre declare mais champ titre, il sera peuple par le select *
4784
-			$champ_titre = (!empty($desc['titre'])) ? ', ' . $desc['titre'] : '';
4785
-		}
4786
-		include_spip('base/abstract_sql');
4787
-		include_spip('base/connect_sql');
4788
-		$objets[$type_objet][$id_objet] = sql_fetsel(
4789
-			'*' . $champ_titre,
4790
-			$desc['table_sql'],
4791
-			id_table_objet($type_objet) . ' = ' . intval($id_objet)
4792
-		);
4793
-
4794
-		// Toujours noter la longueur d'introduction, même si pas demandé cette fois-ci
4795
-		$objets[$type_objet]['introduction_longueur'] = $desc['introduction_longueur'] ?? null;
4796
-	}
4797
-
4798
-	// Pour les fonction generer_xxx, si on demande l'introduction,
4799
-	// ajouter la longueur au début des params supplémentaires
4800
-	if ($demande_introduction) {
4801
-		$introduction_longueur = $objets[$type_objet]['introduction_longueur'];
4802
-		array_unshift($params, $introduction_longueur);
4803
-	}
4804
-
4805
-	// Si la fonction generer_TYPE_TRUC existe, on l'utilise pour formater $info_generee
4806
-	if (
4807
-		$generer = charger_fonction("generer_{$type_objet}_{$info}", '', true)
4808
-		// @deprecated 4.1 generer_TRUC_TYPE
4809
-		or $generer = charger_fonction("generer_{$info}_{$type_objet}", '', true)
4810
-	) {
4811
-		$info_generee = $generer($id_objet, $objets[$type_objet][$id_objet], ...$params);
4812
-	}
4813
-	// Si la fonction generer_objet_TRUC existe, on l'utilise pour formater $info_generee
4814
-	elseif (
4815
-		$generer = charger_fonction("generer_objet_{$info}", '', true)
4816
-		// @deprecated 4.1 generer_TRUC_entite
4817
-		or $generer = charger_fonction("generer_{$info}_entite", '', true)
4818
-	) {
4819
-		$info_generee = $generer($id_objet, $type_objet, $objets[$type_objet][$id_objet], ...$params);
4820
-	} // Sinon on prend directement le champ SQL tel quel
4821
-	else {
4822
-		$info_generee = ($objets[$type_objet][$id_objet][$info] ?? '');
4823
-	}
4824
-
4825
-	// On va ensuite appliquer les traitements automatiques si besoin
4826
-	if (!$etoile) {
4827
-		// FIXME: on fournit un ENV minimum avec id et type et connect=''
4828
-		// mais ce fonctionnement est a ameliorer !
4829
-		$info_generee = appliquer_traitement_champ(
4830
-			$info_generee,
4831
-			$info,
4832
-			table_objet($type_objet),
4833
-			['id_objet' => $id_objet, 'objet' => $type_objet, '']
4834
-		);
4835
-	}
4836
-
4837
-	return $info_generee;
4743
+    static $trouver_table = null;
4744
+    static $objets;
4745
+
4746
+    // On verifie qu'on a tout ce qu'il faut
4747
+    $id_objet = intval($id_objet);
4748
+    if (!($id_objet and $type_objet and $info)) {
4749
+        return '';
4750
+    }
4751
+
4752
+    // si on a deja note que l'objet n'existe pas, ne pas aller plus loin
4753
+    if (isset($objets[$type_objet]) and $objets[$type_objet] === false) {
4754
+        return '';
4755
+    }
4756
+
4757
+    // Si on demande l'url, on retourne direct la fonction
4758
+    if ($info == 'url') {
4759
+        return generer_objet_url($id_objet, $type_objet, ...$params);
4760
+    }
4761
+
4762
+    // Sinon on va tout chercher dans la table et on garde en memoire
4763
+    $demande_titre = ($info === 'titre');
4764
+    $demande_introduction = ($info === 'introduction');
4765
+
4766
+    // On ne fait la requete que si on a pas deja l'objet ou si on demande le titre mais qu'on ne l'a pas encore
4767
+    if (
4768
+        !isset($objets[$type_objet][$id_objet])
4769
+        or
4770
+        ($demande_titre and !isset($objets[$type_objet][$id_objet]['titre']))
4771
+    ) {
4772
+        if (!$trouver_table) {
4773
+            $trouver_table = charger_fonction('trouver_table', 'base');
4774
+        }
4775
+        $desc = $trouver_table(table_objet_sql($type_objet));
4776
+        if (!$desc) {
4777
+            return $objets[$type_objet] = false;
4778
+        }
4779
+
4780
+        // Si on demande le titre, on le gere en interne
4781
+        $champ_titre = '';
4782
+        if ($demande_titre) {
4783
+            // si pas de titre declare mais champ titre, il sera peuple par le select *
4784
+            $champ_titre = (!empty($desc['titre'])) ? ', ' . $desc['titre'] : '';
4785
+        }
4786
+        include_spip('base/abstract_sql');
4787
+        include_spip('base/connect_sql');
4788
+        $objets[$type_objet][$id_objet] = sql_fetsel(
4789
+            '*' . $champ_titre,
4790
+            $desc['table_sql'],
4791
+            id_table_objet($type_objet) . ' = ' . intval($id_objet)
4792
+        );
4793
+
4794
+        // Toujours noter la longueur d'introduction, même si pas demandé cette fois-ci
4795
+        $objets[$type_objet]['introduction_longueur'] = $desc['introduction_longueur'] ?? null;
4796
+    }
4797
+
4798
+    // Pour les fonction generer_xxx, si on demande l'introduction,
4799
+    // ajouter la longueur au début des params supplémentaires
4800
+    if ($demande_introduction) {
4801
+        $introduction_longueur = $objets[$type_objet]['introduction_longueur'];
4802
+        array_unshift($params, $introduction_longueur);
4803
+    }
4804
+
4805
+    // Si la fonction generer_TYPE_TRUC existe, on l'utilise pour formater $info_generee
4806
+    if (
4807
+        $generer = charger_fonction("generer_{$type_objet}_{$info}", '', true)
4808
+        // @deprecated 4.1 generer_TRUC_TYPE
4809
+        or $generer = charger_fonction("generer_{$info}_{$type_objet}", '', true)
4810
+    ) {
4811
+        $info_generee = $generer($id_objet, $objets[$type_objet][$id_objet], ...$params);
4812
+    }
4813
+    // Si la fonction generer_objet_TRUC existe, on l'utilise pour formater $info_generee
4814
+    elseif (
4815
+        $generer = charger_fonction("generer_objet_{$info}", '', true)
4816
+        // @deprecated 4.1 generer_TRUC_entite
4817
+        or $generer = charger_fonction("generer_{$info}_entite", '', true)
4818
+    ) {
4819
+        $info_generee = $generer($id_objet, $type_objet, $objets[$type_objet][$id_objet], ...$params);
4820
+    } // Sinon on prend directement le champ SQL tel quel
4821
+    else {
4822
+        $info_generee = ($objets[$type_objet][$id_objet][$info] ?? '');
4823
+    }
4824
+
4825
+    // On va ensuite appliquer les traitements automatiques si besoin
4826
+    if (!$etoile) {
4827
+        // FIXME: on fournit un ENV minimum avec id et type et connect=''
4828
+        // mais ce fonctionnement est a ameliorer !
4829
+        $info_generee = appliquer_traitement_champ(
4830
+            $info_generee,
4831
+            $info,
4832
+            table_objet($type_objet),
4833
+            ['id_objet' => $id_objet, 'objet' => $type_objet, '']
4834
+        );
4835
+    }
4836
+
4837
+    return $info_generee;
4838 4838
 }
4839 4839
 
4840 4840
 /**
@@ -4842,7 +4842,7 @@  discard block
 block discarded – undo
4842 4842
  * @see generer_objet_info
4843 4843
  */
4844 4844
 function generer_info_entite($id_objet, $type_objet, $info, $etoile = '', $params = []) {
4845
-	return generer_objet_info(intval($id_objet), $type_objet, $info, $etoile, $params);
4845
+    return generer_objet_info(intval($id_objet), $type_objet, $info, $etoile, $params);
4846 4846
 }
4847 4847
 
4848 4848
 /**
@@ -4875,36 +4875,36 @@  discard block
 block discarded – undo
4875 4875
  */
4876 4876
 function generer_objet_introduction(int $id_objet, string $type_objet, array $ligne_sql, ?int $introduction_longueur = null, $longueur_ou_suite = null, ?string $suite = null, string $connect = ''): string {
4877 4877
 
4878
-	$descriptif = $ligne_sql['descriptif'] ?? '';
4879
-	$texte = $ligne_sql['texte'] ?? '';
4880
-	// En absence de descriptif, on se rabat sur chapo + texte
4881
-	if (isset($ligne_sql['chapo'])) {
4882
-		$chapo = $ligne_sql['chapo'];
4883
-		$texte = strlen($descriptif) ?
4884
-			'' :
4885
-			"$chapo \n\n $texte";
4886
-	}
4878
+    $descriptif = $ligne_sql['descriptif'] ?? '';
4879
+    $texte = $ligne_sql['texte'] ?? '';
4880
+    // En absence de descriptif, on se rabat sur chapo + texte
4881
+    if (isset($ligne_sql['chapo'])) {
4882
+        $chapo = $ligne_sql['chapo'];
4883
+        $texte = strlen($descriptif) ?
4884
+            '' :
4885
+            "$chapo \n\n $texte";
4886
+    }
4887 4887
 
4888
-	// Longueur en paramètre, sinon celle renseignée dans la description de l'objet, sinon valeur en dur
4889
-	if (!intval($longueur_ou_suite)) {
4890
-		$longueur = intval($introduction_longueur ?: 600);
4891
-	} else {
4892
-		$longueur = intval($longueur_ou_suite);
4893
-	}
4888
+    // Longueur en paramètre, sinon celle renseignée dans la description de l'objet, sinon valeur en dur
4889
+    if (!intval($longueur_ou_suite)) {
4890
+        $longueur = intval($introduction_longueur ?: 600);
4891
+    } else {
4892
+        $longueur = intval($longueur_ou_suite);
4893
+    }
4894 4894
 
4895
-	// On peut optionnellement passer la suite en 1er paramètre de la balise
4896
-	// Ex : #INTRODUCTION{...}
4897
-	if (
4898
-		is_null($suite)
4899
-		and !intval($longueur_ou_suite)
4900
-	) {
4901
-		$suite = $longueur_ou_suite;
4902
-	}
4895
+    // On peut optionnellement passer la suite en 1er paramètre de la balise
4896
+    // Ex : #INTRODUCTION{...}
4897
+    if (
4898
+        is_null($suite)
4899
+        and !intval($longueur_ou_suite)
4900
+    ) {
4901
+        $suite = $longueur_ou_suite;
4902
+    }
4903 4903
 
4904
-	$f = chercher_filtre('introduction');
4905
-	$introduction = $f($descriptif, $texte, $longueur, $connect, $suite);
4904
+    $f = chercher_filtre('introduction');
4905
+    $introduction = $f($descriptif, $texte, $longueur, $connect, $suite);
4906 4906
 
4907
-	return $introduction;
4907
+    return $introduction;
4908 4908
 }
4909 4909
 
4910 4910
 /**
@@ -4912,7 +4912,7 @@  discard block
 block discarded – undo
4912 4912
  * @see generer_objet_introduction
4913 4913
  */
4914 4914
 function generer_introduction_entite($id_objet, $type_objet, $ligne_sql, $introduction_longueur = null, $longueur_ou_suite = null, $suite = null, string $connect = '') {
4915
-	return generer_objet_introduction(intval($id_objet), $type_objet, $ligne_sql, $introduction_longueur, $longueur_ou_suite, $suite, $connect);
4915
+    return generer_objet_introduction(intval($id_objet), $type_objet, $ligne_sql, $introduction_longueur, $longueur_ou_suite, $suite, $connect);
4916 4916
 }
4917 4917
 
4918 4918
 /**
@@ -4926,49 +4926,49 @@  discard block
 block discarded – undo
4926 4926
  * @return string
4927 4927
  */
4928 4928
 function appliquer_traitement_champ($texte, $champ, $table_objet = '', $env = [], string $connect = '') {
4929
-	if (!$champ) {
4930
-		return $texte;
4931
-	}
4929
+    if (!$champ) {
4930
+        return $texte;
4931
+    }
4932 4932
 
4933
-	// On charge les définitions des traitements (inc/texte et fichiers de fonctions)
4934
-	// car il ne faut pas partir du principe que c'est déjà chargé (form ajax, etc)
4935
-	include_fichiers_fonctions();
4933
+    // On charge les définitions des traitements (inc/texte et fichiers de fonctions)
4934
+    // car il ne faut pas partir du principe que c'est déjà chargé (form ajax, etc)
4935
+    include_fichiers_fonctions();
4936 4936
 
4937
-	$champ = strtoupper($champ);
4938
-	$traitements = $GLOBALS['table_des_traitements'][$champ] ?? false;
4939
-	if (!$traitements or !is_array($traitements)) {
4940
-		return $texte;
4941
-	}
4937
+    $champ = strtoupper($champ);
4938
+    $traitements = $GLOBALS['table_des_traitements'][$champ] ?? false;
4939
+    if (!$traitements or !is_array($traitements)) {
4940
+        return $texte;
4941
+    }
4942 4942
 
4943
-	$traitement = '';
4944
-	if ($table_objet and (!isset($traitements[0]) or count($traitements) > 1)) {
4945
-		// necessaire pour prendre en charge les vieux appels avec un table_objet_sql en 3e arg
4946
-		$table_objet = table_objet($table_objet);
4947
-		if (isset($traitements[$table_objet])) {
4948
-			$traitement = $traitements[$table_objet];
4949
-		}
4950
-	}
4951
-	if (!$traitement and isset($traitements[0])) {
4952
-		$traitement = $traitements[0];
4953
-	}
4954
-	// (sinon prendre le premier de la liste par defaut ?)
4943
+    $traitement = '';
4944
+    if ($table_objet and (!isset($traitements[0]) or count($traitements) > 1)) {
4945
+        // necessaire pour prendre en charge les vieux appels avec un table_objet_sql en 3e arg
4946
+        $table_objet = table_objet($table_objet);
4947
+        if (isset($traitements[$table_objet])) {
4948
+            $traitement = $traitements[$table_objet];
4949
+        }
4950
+    }
4951
+    if (!$traitement and isset($traitements[0])) {
4952
+        $traitement = $traitements[0];
4953
+    }
4954
+    // (sinon prendre le premier de la liste par defaut ?)
4955 4955
 
4956
-	if (!$traitement) {
4957
-		return $texte;
4958
-	}
4956
+    if (!$traitement) {
4957
+        return $texte;
4958
+    }
4959 4959
 
4960
-	$traitement = str_replace('%s', "'" . texte_script($texte) . "'", $traitement);
4960
+    $traitement = str_replace('%s', "'" . texte_script($texte) . "'", $traitement);
4961 4961
 
4962
-	// signaler qu'on est dans l'espace prive pour les filtres qui se servent de ce flag
4963
-	if (test_espace_prive()) {
4964
-		$env['espace_prive'] = 1;
4965
-	}
4962
+    // signaler qu'on est dans l'espace prive pour les filtres qui se servent de ce flag
4963
+    if (test_espace_prive()) {
4964
+        $env['espace_prive'] = 1;
4965
+    }
4966 4966
 
4967
-	// Fournir $connect et $Pile[0] au traitement si besoin
4968
-	$Pile = [0 => $env];
4969
-	eval("\$texte = $traitement;");
4967
+    // Fournir $connect et $Pile[0] au traitement si besoin
4968
+    $Pile = [0 => $env];
4969
+    eval("\$texte = $traitement;");
4970 4970
 
4971
-	return $texte;
4971
+    return $texte;
4972 4972
 }
4973 4973
 
4974 4974
 
@@ -4982,21 +4982,21 @@  discard block
 block discarded – undo
4982 4982
  * @return string
4983 4983
  */
4984 4984
 function generer_objet_lien(int $id_objet, string $objet, int $longueur = 80, string $connect = ''): string {
4985
-	include_spip('inc/liens');
4986
-	$titre = traiter_raccourci_titre($id_objet, $objet, $connect);
4987
-	// lorsque l'objet n'est plus declare (plugin desactive par exemple)
4988
-	// le raccourcis n'est plus valide
4989
-	$titre = typo($titre['titre'] ?? '');
4990
-	// on essaye avec generer_info_entite ?
4991
-	if (!strlen($titre) and !$connect) {
4992
-		$titre = generer_objet_info($id_objet, $objet, 'titre');
4993
-	}
4994
-	if (!strlen($titre)) {
4995
-		$titre = _T('info_sans_titre');
4996
-	}
4997
-	$url = generer_objet_url($id_objet, $objet, '', '', null, '', $connect);
4985
+    include_spip('inc/liens');
4986
+    $titre = traiter_raccourci_titre($id_objet, $objet, $connect);
4987
+    // lorsque l'objet n'est plus declare (plugin desactive par exemple)
4988
+    // le raccourcis n'est plus valide
4989
+    $titre = typo($titre['titre'] ?? '');
4990
+    // on essaye avec generer_info_entite ?
4991
+    if (!strlen($titre) and !$connect) {
4992
+        $titre = generer_objet_info($id_objet, $objet, 'titre');
4993
+    }
4994
+    if (!strlen($titre)) {
4995
+        $titre = _T('info_sans_titre');
4996
+    }
4997
+    $url = generer_objet_url($id_objet, $objet, '', '', null, '', $connect);
4998 4998
 
4999
-	return "<a href='$url' class='$objet'>" . couper($titre, $longueur) . '</a>';
4999
+    return "<a href='$url' class='$objet'>" . couper($titre, $longueur) . '</a>';
5000 5000
 }
5001 5001
 
5002 5002
 /**
@@ -5004,7 +5004,7 @@  discard block
 block discarded – undo
5004 5004
  * @see generer_objet_lien
5005 5005
  */
5006 5006
 function generer_lien_entite($id_objet, $objet, $longueur = 80, $connect = null) {
5007
-	return generer_objet_lien(intval($id_objet), $objet, $longueur, $connect ?? '');
5007
+    return generer_objet_lien(intval($id_objet), $objet, $longueur, $connect ?? '');
5008 5008
 }
5009 5009
 
5010 5010
 /**
@@ -5020,15 +5020,15 @@  discard block
 block discarded – undo
5020 5020
  * @return string
5021 5021
  */
5022 5022
 function wrap($texte, $wrap) {
5023
-	$balises = extraire_balises($wrap);
5024
-	if (preg_match_all(",<([a-z]\w*)\b[^>]*>,UimsS", $wrap, $regs, PREG_PATTERN_ORDER)) {
5025
-		$texte = $wrap . $texte;
5026
-		$regs = array_reverse($regs[1]);
5027
-		$wrap = '</' . implode('></', $regs) . '>';
5028
-		$texte = $texte . $wrap;
5029
-	}
5023
+    $balises = extraire_balises($wrap);
5024
+    if (preg_match_all(",<([a-z]\w*)\b[^>]*>,UimsS", $wrap, $regs, PREG_PATTERN_ORDER)) {
5025
+        $texte = $wrap . $texte;
5026
+        $regs = array_reverse($regs[1]);
5027
+        $wrap = '</' . implode('></', $regs) . '>';
5028
+        $texte = $texte . $wrap;
5029
+    }
5030 5030
 
5031
-	return $texte;
5031
+    return $texte;
5032 5032
 }
5033 5033
 
5034 5034
 
@@ -5048,44 +5048,44 @@  discard block
 block discarded – undo
5048 5048
  * @return array|mixed|string
5049 5049
  */
5050 5050
 function filtre_print_dist($u, $join = '<br />', $indent = 0) {
5051
-	if (is_string($u)) {
5052
-		$u = typo($u);
5051
+    if (is_string($u)) {
5052
+        $u = typo($u);
5053 5053
 
5054
-		return $u;
5055
-	}
5054
+        return $u;
5055
+    }
5056 5056
 
5057
-	// caster $u en array si besoin
5058
-	if (is_object($u)) {
5059
-		$u = (array)$u;
5060
-	}
5057
+    // caster $u en array si besoin
5058
+    if (is_object($u)) {
5059
+        $u = (array)$u;
5060
+    }
5061 5061
 
5062
-	if (is_array($u)) {
5063
-		$out = '';
5064
-		// toutes les cles sont numeriques ?
5065
-		// et aucun enfant n'est un tableau
5066
-		// liste simple separee par des virgules
5067
-		$numeric_keys = array_map('is_numeric', array_keys($u));
5068
-		$array_values = array_map('is_array', $u);
5069
-		$object_values = array_map('is_object', $u);
5070
-		if (
5071
-			array_sum($numeric_keys) == count($numeric_keys)
5072
-			and !array_sum($array_values)
5073
-			and !array_sum($object_values)
5074
-		) {
5075
-			return join(', ', array_map('filtre_print_dist', $u));
5076
-		}
5062
+    if (is_array($u)) {
5063
+        $out = '';
5064
+        // toutes les cles sont numeriques ?
5065
+        // et aucun enfant n'est un tableau
5066
+        // liste simple separee par des virgules
5067
+        $numeric_keys = array_map('is_numeric', array_keys($u));
5068
+        $array_values = array_map('is_array', $u);
5069
+        $object_values = array_map('is_object', $u);
5070
+        if (
5071
+            array_sum($numeric_keys) == count($numeric_keys)
5072
+            and !array_sum($array_values)
5073
+            and !array_sum($object_values)
5074
+        ) {
5075
+            return join(', ', array_map('filtre_print_dist', $u));
5076
+        }
5077 5077
 
5078
-		// sinon on passe a la ligne et on indente
5079
-		$i_str = str_pad('', $indent, ' ');
5080
-		foreach ($u as $k => $v) {
5081
-			$out .= $join . $i_str . "$k: " . filtre_print_dist($v, $join, $indent + 2);
5082
-		}
5078
+        // sinon on passe a la ligne et on indente
5079
+        $i_str = str_pad('', $indent, ' ');
5080
+        foreach ($u as $k => $v) {
5081
+            $out .= $join . $i_str . "$k: " . filtre_print_dist($v, $join, $indent + 2);
5082
+        }
5083 5083
 
5084
-		return $out;
5085
-	}
5084
+        return $out;
5085
+    }
5086 5086
 
5087
-	// on sait pas quoi faire...
5088
-	return $u;
5087
+    // on sait pas quoi faire...
5088
+    return $u;
5089 5089
 }
5090 5090
 
5091 5091
 
@@ -5098,10 +5098,10 @@  discard block
 block discarded – undo
5098 5098
  * @return string|array
5099 5099
  */
5100 5100
 function objet_info($objet, $info) {
5101
-	$table = table_objet_sql($objet);
5102
-	$infos = lister_tables_objets_sql($table);
5101
+    $table = table_objet_sql($objet);
5102
+    $infos = lister_tables_objets_sql($table);
5103 5103
 
5104
-	return ($infos[$info] ?? '');
5104
+    return ($infos[$info] ?? '');
5105 5105
 }
5106 5106
 
5107 5107
 /**
@@ -5116,11 +5116,11 @@  discard block
 block discarded – undo
5116 5116
  *     Texte traduit du comptage, tel que '3 articles'
5117 5117
  */
5118 5118
 function objet_afficher_nb($nb, $objet) {
5119
-	if (!$nb) {
5120
-		return _T(objet_info($objet, 'info_aucun_objet'));
5121
-	} else {
5122
-		return _T(objet_info($objet, $nb == 1 ? 'info_1_objet' : 'info_nb_objets'), ['nb' => $nb]);
5123
-	}
5119
+    if (!$nb) {
5120
+        return _T(objet_info($objet, 'info_aucun_objet'));
5121
+    } else {
5122
+        return _T(objet_info($objet, $nb == 1 ? 'info_1_objet' : 'info_nb_objets'), ['nb' => $nb]);
5123
+    }
5124 5124
 }
5125 5125
 
5126 5126
 /**
@@ -5132,11 +5132,11 @@  discard block
 block discarded – undo
5132 5132
  * @return string
5133 5133
  */
5134 5134
 function objet_icone($objet, $taille = 24, $class = '') {
5135
-	$icone = objet_info($objet, 'icone_objet') . '-' . $taille . '.png';
5136
-	$icone = chemin_image($icone);
5137
-	$balise_img = charger_filtre('balise_img');
5135
+    $icone = objet_info($objet, 'icone_objet') . '-' . $taille . '.png';
5136
+    $icone = chemin_image($icone);
5137
+    $balise_img = charger_filtre('balise_img');
5138 5138
 
5139
-	return $icone ? $balise_img($icone, _T(objet_info($objet, 'texte_objet')), $class, $taille) : '';
5139
+    return $icone ? $balise_img($icone, _T(objet_info($objet, 'texte_objet')), $class, $taille) : '';
5140 5140
 }
5141 5141
 
5142 5142
 /**
@@ -5157,12 +5157,12 @@  discard block
 block discarded – undo
5157 5157
  * @return string
5158 5158
  */
5159 5159
 function objet_T($objet, $chaine, $args = [], $options = []) {
5160
-	$chaine = explode(':', $chaine);
5161
-	if ($t = _T($objet . ':' . end($chaine), $args, array_merge($options, ['force' => false]))) {
5162
-		return $t;
5163
-	}
5164
-	$chaine = implode(':', $chaine);
5165
-	return _T($chaine, $args, $options);
5160
+    $chaine = explode(':', $chaine);
5161
+    if ($t = _T($objet . ':' . end($chaine), $args, array_merge($options, ['force' => false]))) {
5162
+        return $t;
5163
+    }
5164
+    $chaine = implode(':', $chaine);
5165
+    return _T($chaine, $args, $options);
5166 5166
 }
5167 5167
 
5168 5168
 /**
@@ -5176,18 +5176,18 @@  discard block
 block discarded – undo
5176 5176
  * @return string      Code HTML
5177 5177
  */
5178 5178
 function insert_head_css_conditionnel($flux) {
5179
-	if (
5180
-		strpos($flux, '<!-- insert_head_css -->') === false
5181
-		and $p = strpos($flux, '<!-- insert_head -->')
5182
-	) {
5183
-		// plutot avant le premier js externe (jquery) pour etre non bloquant
5184
-		if ($p1 = stripos($flux, '<script src=') and $p1 < $p) {
5185
-			$p = $p1;
5186
-		}
5187
-		$flux = substr_replace($flux, pipeline('insert_head_css', '<!-- insert_head_css -->'), $p, 0);
5188
-	}
5179
+    if (
5180
+        strpos($flux, '<!-- insert_head_css -->') === false
5181
+        and $p = strpos($flux, '<!-- insert_head -->')
5182
+    ) {
5183
+        // plutot avant le premier js externe (jquery) pour etre non bloquant
5184
+        if ($p1 = stripos($flux, '<script src=') and $p1 < $p) {
5185
+            $p = $p1;
5186
+        }
5187
+        $flux = substr_replace($flux, pipeline('insert_head_css', '<!-- insert_head_css -->'), $p, 0);
5188
+    }
5189 5189
 
5190
-	return $flux;
5190
+    return $flux;
5191 5191
 }
5192 5192
 
5193 5193
 /**
@@ -5210,75 +5210,75 @@  discard block
 block discarded – undo
5210 5210
  * @return string
5211 5211
  */
5212 5212
 function produire_fond_statique($fond, $contexte = [], $options = [], string $connect = '') {
5213
-	if (isset($contexte['format'])) {
5214
-		$extension = $contexte['format'];
5215
-		unset($contexte['format']);
5216
-	} else {
5217
-		$extension = 'html';
5218
-		if (preg_match(',[.](css|js|json|xml|svg)$,', $fond, $m)) {
5219
-			$extension = $m[1];
5220
-		}
5221
-	}
5222
-	// recuperer le contenu produit par le squelette
5223
-	$options['raw'] = true;
5224
-	$cache = recuperer_fond($fond, $contexte, $options, $connect);
5225
-
5226
-	// calculer le nom de la css
5227
-	$dir_var = sous_repertoire(_DIR_VAR, 'cache-' . $extension);
5228
-	$nom_safe = preg_replace(',\W,', '_', str_replace('.', '_', $fond));
5229
-	$contexte_implicite = calculer_contexte_implicite();
5230
-
5231
-	// par defaut on hash selon les contextes qui sont a priori moins variables
5232
-	// mais on peut hasher selon le contenu a la demande, si plusieurs contextes produisent un meme contenu
5233
-	// reduit la variabilite du nom et donc le nombre de css concatenees possibles in fine
5234
-	if (isset($options['hash_on_content']) and $options['hash_on_content']) {
5235
-		$hash = md5($contexte_implicite['host'] . '::' . $cache);
5236
-	}
5237
-	else {
5238
-		unset($contexte_implicite['notes']); // pas pertinent pour signaler un changeemnt de contenu pour des css/js
5239
-		ksort($contexte);
5240
-		$hash = md5($fond . json_encode($contexte_implicite, JSON_THROW_ON_ERROR) . json_encode($contexte, JSON_THROW_ON_ERROR) . $connect);
5241
-	}
5242
-	$filename = $dir_var . $extension . "dyn-$nom_safe-" . substr($hash, 0, 8) . ".$extension";
5243
-
5244
-	// mettre a jour le fichier si il n'existe pas
5245
-	// ou trop ancien
5246
-	// le dernier fichier produit est toujours suffixe par .last
5247
-	// et recopie sur le fichier cible uniquement si il change
5248
-	if (
5249
-		!file_exists($filename)
5250
-		or !file_exists($filename . '.last')
5251
-		or (isset($cache['lastmodified']) and $cache['lastmodified'] and filemtime($filename . '.last') < $cache['lastmodified'])
5252
-		or (defined('_VAR_MODE') and _VAR_MODE == 'recalcul')
5253
-	) {
5254
-		$contenu = $cache['texte'];
5255
-		// passer les urls en absolu si c'est une css
5256
-		if ($extension == 'css') {
5257
-			$contenu = urls_absolues_css(
5258
-				$contenu,
5259
-				test_espace_prive() ? generer_url_ecrire('accueil') : generer_url_public($fond)
5260
-			);
5261
-		}
5262
-
5263
-		$comment = '';
5264
-		// ne pas insérer de commentaire sur certains formats
5265
-		if (!in_array($extension, ['json', 'xml', 'svg'])) {
5266
-			$comment = "/* #PRODUIRE{fond=$fond";
5267
-			foreach ($contexte as $k => $v) {
5268
-				if (is_array($v)) {
5269
-					$v = var_export($v, true);
5270
-				}
5271
-				$comment .= ",$k=$v";
5272
-			}
5273
-			// pas de date dans le commentaire car sinon ca invalide le md5 et force la maj
5274
-			// mais on peut mettre un md5 du contenu, ce qui donne un aperu rapide si la feuille a change ou non
5275
-			$comment .= "}\n   md5:" . md5($contenu) . " */\n";
5276
-		}
5277
-		// et ecrire le fichier si il change
5278
-		ecrire_fichier_calcule_si_modifie($filename, $comment . $contenu, false, true);
5279
-	}
5280
-
5281
-	return timestamp($filename);
5213
+    if (isset($contexte['format'])) {
5214
+        $extension = $contexte['format'];
5215
+        unset($contexte['format']);
5216
+    } else {
5217
+        $extension = 'html';
5218
+        if (preg_match(',[.](css|js|json|xml|svg)$,', $fond, $m)) {
5219
+            $extension = $m[1];
5220
+        }
5221
+    }
5222
+    // recuperer le contenu produit par le squelette
5223
+    $options['raw'] = true;
5224
+    $cache = recuperer_fond($fond, $contexte, $options, $connect);
5225
+
5226
+    // calculer le nom de la css
5227
+    $dir_var = sous_repertoire(_DIR_VAR, 'cache-' . $extension);
5228
+    $nom_safe = preg_replace(',\W,', '_', str_replace('.', '_', $fond));
5229
+    $contexte_implicite = calculer_contexte_implicite();
5230
+
5231
+    // par defaut on hash selon les contextes qui sont a priori moins variables
5232
+    // mais on peut hasher selon le contenu a la demande, si plusieurs contextes produisent un meme contenu
5233
+    // reduit la variabilite du nom et donc le nombre de css concatenees possibles in fine
5234
+    if (isset($options['hash_on_content']) and $options['hash_on_content']) {
5235
+        $hash = md5($contexte_implicite['host'] . '::' . $cache);
5236
+    }
5237
+    else {
5238
+        unset($contexte_implicite['notes']); // pas pertinent pour signaler un changeemnt de contenu pour des css/js
5239
+        ksort($contexte);
5240
+        $hash = md5($fond . json_encode($contexte_implicite, JSON_THROW_ON_ERROR) . json_encode($contexte, JSON_THROW_ON_ERROR) . $connect);
5241
+    }
5242
+    $filename = $dir_var . $extension . "dyn-$nom_safe-" . substr($hash, 0, 8) . ".$extension";
5243
+
5244
+    // mettre a jour le fichier si il n'existe pas
5245
+    // ou trop ancien
5246
+    // le dernier fichier produit est toujours suffixe par .last
5247
+    // et recopie sur le fichier cible uniquement si il change
5248
+    if (
5249
+        !file_exists($filename)
5250
+        or !file_exists($filename . '.last')
5251
+        or (isset($cache['lastmodified']) and $cache['lastmodified'] and filemtime($filename . '.last') < $cache['lastmodified'])
5252
+        or (defined('_VAR_MODE') and _VAR_MODE == 'recalcul')
5253
+    ) {
5254
+        $contenu = $cache['texte'];
5255
+        // passer les urls en absolu si c'est une css
5256
+        if ($extension == 'css') {
5257
+            $contenu = urls_absolues_css(
5258
+                $contenu,
5259
+                test_espace_prive() ? generer_url_ecrire('accueil') : generer_url_public($fond)
5260
+            );
5261
+        }
5262
+
5263
+        $comment = '';
5264
+        // ne pas insérer de commentaire sur certains formats
5265
+        if (!in_array($extension, ['json', 'xml', 'svg'])) {
5266
+            $comment = "/* #PRODUIRE{fond=$fond";
5267
+            foreach ($contexte as $k => $v) {
5268
+                if (is_array($v)) {
5269
+                    $v = var_export($v, true);
5270
+                }
5271
+                $comment .= ",$k=$v";
5272
+            }
5273
+            // pas de date dans le commentaire car sinon ca invalide le md5 et force la maj
5274
+            // mais on peut mettre un md5 du contenu, ce qui donne un aperu rapide si la feuille a change ou non
5275
+            $comment .= "}\n   md5:" . md5($contenu) . " */\n";
5276
+        }
5277
+        // et ecrire le fichier si il change
5278
+        ecrire_fichier_calcule_si_modifie($filename, $comment . $contenu, false, true);
5279
+    }
5280
+
5281
+    return timestamp($filename);
5282 5282
 }
5283 5283
 
5284 5284
 /**
@@ -5291,15 +5291,15 @@  discard block
 block discarded – undo
5291 5291
  *    $fichier auquel on a ajouté le timestamp
5292 5292
  */
5293 5293
 function timestamp($fichier) {
5294
-	if (
5295
-		!$fichier
5296
-		or !file_exists($fichier)
5297
-		or !$m = filemtime($fichier)
5298
-	) {
5299
-		return $fichier;
5300
-	}
5294
+    if (
5295
+        !$fichier
5296
+        or !file_exists($fichier)
5297
+        or !$m = filemtime($fichier)
5298
+    ) {
5299
+        return $fichier;
5300
+    }
5301 5301
 
5302
-	return "$fichier?$m";
5302
+    return "$fichier?$m";
5303 5303
 }
5304 5304
 
5305 5305
 /**
@@ -5309,11 +5309,11 @@  discard block
 block discarded – undo
5309 5309
  * @return string
5310 5310
  */
5311 5311
 function supprimer_timestamp($url) {
5312
-	if (strpos($url, '?') === false) {
5313
-		return $url;
5314
-	}
5312
+    if (strpos($url, '?') === false) {
5313
+        return $url;
5314
+    }
5315 5315
 
5316
-	return preg_replace(',\?[[:digit:]]+$,', '', $url);
5316
+    return preg_replace(',\?[[:digit:]]+$,', '', $url);
5317 5317
 }
5318 5318
 
5319 5319
 /**
@@ -5328,15 +5328,15 @@  discard block
 block discarded – undo
5328 5328
  * @return string
5329 5329
  */
5330 5330
 function filtre_nettoyer_titre_email_dist($titre) {
5331
-	include_spip('inc/envoyer_mail');
5331
+    include_spip('inc/envoyer_mail');
5332 5332
 
5333
-	$titre = nettoyer_titre_email($titre);
5334
-	// on est dans un squelette : securiser le retour
5335
-	if (strpos($titre, '<') !== false) {
5336
-		$titre = interdire_scripts($titre);
5337
-	}
5333
+    $titre = nettoyer_titre_email($titre);
5334
+    // on est dans un squelette : securiser le retour
5335
+    if (strpos($titre, '<') !== false) {
5336
+        $titre = interdire_scripts($titre);
5337
+    }
5338 5338
 
5339
-	return $titre;
5339
+    return $titre;
5340 5340
 }
5341 5341
 
5342 5342
 /**
@@ -5358,27 +5358,27 @@  discard block
 block discarded – undo
5358 5358
  * @return string
5359 5359
  */
5360 5360
 function filtre_chercher_rubrique_dist(
5361
-	$titre,
5362
-	$id_objet,
5363
-	$id_parent,
5364
-	$objet,
5365
-	$id_secteur,
5366
-	$restreint,
5367
-	$actionable = false,
5368
-	$retour_sans_cadre = false
5361
+    $titre,
5362
+    $id_objet,
5363
+    $id_parent,
5364
+    $objet,
5365
+    $id_secteur,
5366
+    $restreint,
5367
+    $actionable = false,
5368
+    $retour_sans_cadre = false
5369 5369
 ) {
5370
-	include_spip('inc/filtres_ecrire');
5370
+    include_spip('inc/filtres_ecrire');
5371 5371
 
5372
-	return chercher_rubrique(
5373
-		$titre,
5374
-		$id_objet,
5375
-		$id_parent,
5376
-		$objet,
5377
-		$id_secteur,
5378
-		$restreint,
5379
-		$actionable,
5380
-		$retour_sans_cadre
5381
-	);
5372
+    return chercher_rubrique(
5373
+        $titre,
5374
+        $id_objet,
5375
+        $id_parent,
5376
+        $objet,
5377
+        $id_secteur,
5378
+        $restreint,
5379
+        $actionable,
5380
+        $retour_sans_cadre
5381
+    );
5382 5382
 }
5383 5383
 
5384 5384
 /**
@@ -5407,56 +5407,56 @@  discard block
 block discarded – undo
5407 5407
  *     Chaîne vide si l'accès est autorisé
5408 5408
  */
5409 5409
 function sinon_interdire_acces($ok = false, $url = '', $statut = 0, $message = null) {
5410
-	if ($ok) {
5411
-		return '';
5412
-	}
5413
-
5414
-	// Vider tous les tampons
5415
-	$level = @ob_get_level();
5416
-	while ($level--) {
5417
-		@ob_end_clean();
5418
-	}
5419
-
5420
-	include_spip('inc/headers');
5421
-
5422
-	// S'il y a une URL, on redirige (si pas de statut, la fonction mettra 302 par défaut)
5423
-	if ($url) {
5424
-		redirige_par_entete($url, '', $statut);
5425
-	}
5426
-
5427
-	// ecriture simplifiee avec message en 3eme argument (= statut 403)
5428
-	if (!is_numeric($statut) and is_null($message)) {
5429
-		$message = $statut;
5430
-		$statut = 0;
5431
-	}
5432
-	if (!$message) {
5433
-		$message = '';
5434
-	}
5435
-	$statut = intval($statut);
5436
-
5437
-	// Si on est dans l'espace privé, on génère du 403 Forbidden par defaut ou du 404
5438
-	if (test_espace_prive()) {
5439
-		if (!$statut or !in_array($statut, [404, 403])) {
5440
-			$statut = 403;
5441
-		}
5442
-		http_response_code(403);
5443
-		$echec = charger_fonction('403', 'exec');
5444
-		$echec($message);
5445
-	} else {
5446
-		// Sinon dans l'espace public on redirige vers une 404 par défaut, car elle toujours présente normalement
5447
-		if (!$statut) {
5448
-			$statut = 404;
5449
-		}
5450
-		// Dans tous les cas on modifie l'entité avec ce qui est demandé
5451
-		http_response_code($statut);
5452
-		// Si le statut est une erreur et qu'il n'y a pas de redirection on va chercher le squelette du même nom
5453
-		if ($statut >= 400) {
5454
-			echo recuperer_fond("$statut", ['erreur' => $message]);
5455
-		}
5456
-	}
5457
-
5458
-
5459
-	exit;
5410
+    if ($ok) {
5411
+        return '';
5412
+    }
5413
+
5414
+    // Vider tous les tampons
5415
+    $level = @ob_get_level();
5416
+    while ($level--) {
5417
+        @ob_end_clean();
5418
+    }
5419
+
5420
+    include_spip('inc/headers');
5421
+
5422
+    // S'il y a une URL, on redirige (si pas de statut, la fonction mettra 302 par défaut)
5423
+    if ($url) {
5424
+        redirige_par_entete($url, '', $statut);
5425
+    }
5426
+
5427
+    // ecriture simplifiee avec message en 3eme argument (= statut 403)
5428
+    if (!is_numeric($statut) and is_null($message)) {
5429
+        $message = $statut;
5430
+        $statut = 0;
5431
+    }
5432
+    if (!$message) {
5433
+        $message = '';
5434
+    }
5435
+    $statut = intval($statut);
5436
+
5437
+    // Si on est dans l'espace privé, on génère du 403 Forbidden par defaut ou du 404
5438
+    if (test_espace_prive()) {
5439
+        if (!$statut or !in_array($statut, [404, 403])) {
5440
+            $statut = 403;
5441
+        }
5442
+        http_response_code(403);
5443
+        $echec = charger_fonction('403', 'exec');
5444
+        $echec($message);
5445
+    } else {
5446
+        // Sinon dans l'espace public on redirige vers une 404 par défaut, car elle toujours présente normalement
5447
+        if (!$statut) {
5448
+            $statut = 404;
5449
+        }
5450
+        // Dans tous les cas on modifie l'entité avec ce qui est demandé
5451
+        http_response_code($statut);
5452
+        // Si le statut est une erreur et qu'il n'y a pas de redirection on va chercher le squelette du même nom
5453
+        if ($statut >= 400) {
5454
+            echo recuperer_fond("$statut", ['erreur' => $message]);
5455
+        }
5456
+    }
5457
+
5458
+
5459
+    exit;
5460 5460
 }
5461 5461
 
5462 5462
 /**
@@ -5467,11 +5467,11 @@  discard block
 block discarded – undo
5467 5467
  * @return string
5468 5468
  */
5469 5469
 function filtre_compacte_dist($source, $format = null) {
5470
-	if (function_exists('minifier')) {
5471
-		return minifier($source, $format);
5472
-	}
5470
+    if (function_exists('minifier')) {
5471
+        return minifier($source, $format);
5472
+    }
5473 5473
 
5474
-	return $source;
5474
+    return $source;
5475 5475
 }
5476 5476
 
5477 5477
 
@@ -5483,32 +5483,32 @@  discard block
 block discarded – undo
5483 5483
  * @return string
5484 5484
  */
5485 5485
 function spip_affiche_mot_de_passe_masque(?string $passe, bool $afficher_partiellement = false, ?int $portion_pourcent = null): string {
5486
-	$passe ??= '';
5487
-	$l = strlen($passe);
5488
-
5489
-	if ($l <= 8 or !$afficher_partiellement) {
5490
-		if (!$l) {
5491
-			return ''; // montrer qu'il y a pas de mot de passe si il y en a pas
5492
-		}
5493
-		return str_pad('', $afficher_partiellement ? $l : 16, '*');
5494
-	}
5495
-
5496
-	if (is_null($portion_pourcent)) {
5497
-		if (!defined('_SPIP_AFFICHE_MOT_DE_PASSE_MASQUE_PERCENT')) {
5498
-			define('_SPIP_AFFICHE_MOT_DE_PASSE_MASQUE_PERCENT', 20); // 20%
5499
-		}
5500
-		$portion_pourcent = _SPIP_AFFICHE_MOT_DE_PASSE_MASQUE_PERCENT;
5501
-	}
5502
-	if ($portion_pourcent >= 100) {
5503
-		return $passe;
5504
-	}
5505
-	$e = intval(ceil($l * $portion_pourcent / 100 / 2));
5506
-	$e = max($e, 0);
5507
-	$mid = str_pad('', $l - 2 * $e, '*');
5508
-	if ($e > 0 and strlen($mid) > 8) {
5509
-		$mid = '***...***';
5510
-	}
5511
-	return substr($passe, 0, $e) . $mid . ($e > 0 ? substr($passe, -$e) : '');
5486
+    $passe ??= '';
5487
+    $l = strlen($passe);
5488
+
5489
+    if ($l <= 8 or !$afficher_partiellement) {
5490
+        if (!$l) {
5491
+            return ''; // montrer qu'il y a pas de mot de passe si il y en a pas
5492
+        }
5493
+        return str_pad('', $afficher_partiellement ? $l : 16, '*');
5494
+    }
5495
+
5496
+    if (is_null($portion_pourcent)) {
5497
+        if (!defined('_SPIP_AFFICHE_MOT_DE_PASSE_MASQUE_PERCENT')) {
5498
+            define('_SPIP_AFFICHE_MOT_DE_PASSE_MASQUE_PERCENT', 20); // 20%
5499
+        }
5500
+        $portion_pourcent = _SPIP_AFFICHE_MOT_DE_PASSE_MASQUE_PERCENT;
5501
+    }
5502
+    if ($portion_pourcent >= 100) {
5503
+        return $passe;
5504
+    }
5505
+    $e = intval(ceil($l * $portion_pourcent / 100 / 2));
5506
+    $e = max($e, 0);
5507
+    $mid = str_pad('', $l - 2 * $e, '*');
5508
+    if ($e > 0 and strlen($mid) > 8) {
5509
+        $mid = '***...***';
5510
+    }
5511
+    return substr($passe, 0, $e) . $mid . ($e > 0 ? substr($passe, -$e) : '');
5512 5512
 }
5513 5513
 
5514 5514
 
@@ -5529,64 +5529,64 @@  discard block
 block discarded – undo
5529 5529
  */
5530 5530
 function identifiant_slug($texte, $type = '', $options = []) {
5531 5531
 
5532
-	$original = $texte;
5533
-	$separateur = ($options['separateur'] ?? '_');
5534
-	$longueur_maxi = ($options['longueur_maxi'] ?? 60);
5535
-	$longueur_mini = ($options['longueur_mini'] ?? 0);
5532
+    $original = $texte;
5533
+    $separateur = ($options['separateur'] ?? '_');
5534
+    $longueur_maxi = ($options['longueur_maxi'] ?? 60);
5535
+    $longueur_mini = ($options['longueur_mini'] ?? 0);
5536 5536
 
5537
-	if (!function_exists('translitteration')) {
5538
-		include_spip('inc/charsets');
5539
-	}
5537
+    if (!function_exists('translitteration')) {
5538
+        include_spip('inc/charsets');
5539
+    }
5540 5540
 
5541
-	// pas de balise html
5542
-	if (strpos($texte, '<') !== false) {
5543
-		$texte = strip_tags($texte);
5544
-	}
5545
-	if (strpos($texte, '&') !== false) {
5546
-		$texte = unicode2charset($texte);
5547
-	}
5548
-	// On enlève les espaces indésirables
5549
-	$texte = trim($texte);
5541
+    // pas de balise html
5542
+    if (strpos($texte, '<') !== false) {
5543
+        $texte = strip_tags($texte);
5544
+    }
5545
+    if (strpos($texte, '&') !== false) {
5546
+        $texte = unicode2charset($texte);
5547
+    }
5548
+    // On enlève les espaces indésirables
5549
+    $texte = trim($texte);
5550 5550
 
5551
-	// On enlève les accents et cie
5552
-	$texte = translitteration($texte);
5551
+    // On enlève les accents et cie
5552
+    $texte = translitteration($texte);
5553 5553
 
5554
-	// On remplace tout ce qui n'est pas un mot par un séparateur
5555
-	$texte = preg_replace(',[\W_]+,ms', $separateur, $texte);
5554
+    // On remplace tout ce qui n'est pas un mot par un séparateur
5555
+    $texte = preg_replace(',[\W_]+,ms', $separateur, $texte);
5556 5556
 
5557
-	// nettoyer les doubles occurences du separateur si besoin
5558
-	while (strpos($texte, (string) "$separateur$separateur") !== false) {
5559
-		$texte = str_replace("$separateur$separateur", $separateur, $texte);
5560
-	}
5557
+    // nettoyer les doubles occurences du separateur si besoin
5558
+    while (strpos($texte, (string) "$separateur$separateur") !== false) {
5559
+        $texte = str_replace("$separateur$separateur", $separateur, $texte);
5560
+    }
5561 5561
 
5562
-	// pas de separateur au debut ni a la fin
5563
-	$texte = trim($texte, $separateur);
5562
+    // pas de separateur au debut ni a la fin
5563
+    $texte = trim($texte, $separateur);
5564 5564
 
5565
-	// en minuscules
5566
-	$texte = strtolower($texte);
5565
+    // en minuscules
5566
+    $texte = strtolower($texte);
5567 5567
 
5568
-	switch ($type) {
5569
-		case 'class':
5570
-		case 'id':
5571
-		case 'anchor':
5572
-			if (preg_match(',^\d,', $texte)) {
5573
-				$texte = substr($type, 0, 1) . $texte;
5574
-			}
5575
-	}
5568
+    switch ($type) {
5569
+        case 'class':
5570
+        case 'id':
5571
+        case 'anchor':
5572
+            if (preg_match(',^\d,', $texte)) {
5573
+                $texte = substr($type, 0, 1) . $texte;
5574
+            }
5575
+    }
5576 5576
 
5577
-	if (strlen($texte) > $longueur_maxi) {
5578
-		$texte = substr($texte, 0, $longueur_maxi);
5579
-	}
5577
+    if (strlen($texte) > $longueur_maxi) {
5578
+        $texte = substr($texte, 0, $longueur_maxi);
5579
+    }
5580 5580
 
5581
-	if (strlen($texte) < $longueur_mini and $longueur_mini < $longueur_maxi) {
5582
-		if (preg_match(',^\d,', $texte)) {
5583
-			$texte = ($type ? substr($type, 0, 1) : 's') . $texte;
5584
-		}
5585
-		$texte .= $separateur . md5($original);
5586
-		$texte = substr($texte, 0, $longueur_mini);
5587
-	}
5581
+    if (strlen($texte) < $longueur_mini and $longueur_mini < $longueur_maxi) {
5582
+        if (preg_match(',^\d,', $texte)) {
5583
+            $texte = ($type ? substr($type, 0, 1) : 's') . $texte;
5584
+        }
5585
+        $texte .= $separateur . md5($original);
5586
+        $texte = substr($texte, 0, $longueur_mini);
5587
+    }
5588 5588
 
5589
-	return $texte;
5589
+    return $texte;
5590 5590
 }
5591 5591
 
5592 5592
 
@@ -5607,11 +5607,11 @@  discard block
 block discarded – undo
5607 5607
  * @exemple `<:info_maximum|label_nettoyer:>`
5608 5608
  */
5609 5609
 function label_nettoyer(string $text, bool $ucfirst = true): string {
5610
-	$label = preg_replace('#([\s:]|\&nbsp;)+$#u', '', $text);
5611
-	if ($ucfirst) {
5612
-		$label = spip_ucfirst($label);
5613
-	}
5614
-	return $label;
5610
+    $label = preg_replace('#([\s:]|\&nbsp;)+$#u', '', $text);
5611
+    if ($ucfirst) {
5612
+        $label = spip_ucfirst($label);
5613
+    }
5614
+    return $label;
5615 5615
 }
5616 5616
 
5617 5617
 /**
@@ -5624,8 +5624,8 @@  discard block
 block discarded – undo
5624 5624
  * @exemple `<:info_maximum|label_ponctuer:>`
5625 5625
  */
5626 5626
 function label_ponctuer(string $text, bool $ucfirst = true): string {
5627
-	$label = label_nettoyer($text, $ucfirst);
5628
-	return _T('label_ponctuer', ['label' => $label]);
5627
+    $label = label_nettoyer($text, $ucfirst);
5628
+    return _T('label_ponctuer', ['label' => $label]);
5629 5629
 }
5630 5630
 
5631 5631
 
@@ -5638,19 +5638,19 @@  discard block
 block discarded – undo
5638 5638
  * @return array
5639 5639
  */
5640 5640
 function helper_filtre_objet_lister_enfants_ou_parents($objet, $id_objet, $fonction) {
5641
-	if (!in_array($fonction, ['objet_lister_parents', 'objet_lister_enfants', 'objet_lister_parents_par_type', 'objet_lister_enfants_par_type'])) {
5642
-		return [];
5643
-	}
5641
+    if (!in_array($fonction, ['objet_lister_parents', 'objet_lister_enfants', 'objet_lister_parents_par_type', 'objet_lister_enfants_par_type'])) {
5642
+        return [];
5643
+    }
5644 5644
 
5645
-	// compatibilite signature inversee
5646
-	if (is_numeric($objet) and !is_numeric($id_objet)) {
5647
-		[$objet, $id_objet] = [$id_objet, $objet];
5648
-	}
5645
+    // compatibilite signature inversee
5646
+    if (is_numeric($objet) and !is_numeric($id_objet)) {
5647
+        [$objet, $id_objet] = [$id_objet, $objet];
5648
+    }
5649 5649
 
5650
-	if (!function_exists($fonction)) {
5651
-		include_spip('base/objets');
5652
-	}
5653
-	return $fonction($objet, $id_objet);
5650
+    if (!function_exists($fonction)) {
5651
+        include_spip('base/objets');
5652
+    }
5653
+    return $fonction($objet, $id_objet);
5654 5654
 }
5655 5655
 
5656 5656
 
@@ -5665,7 +5665,7 @@  discard block
 block discarded – undo
5665 5665
  * @return array
5666 5666
  */
5667 5667
 function filtre_objet_lister_parents_dist($objet, $id_objet) {
5668
-	return helper_filtre_objet_lister_enfants_ou_parents($objet, $id_objet, 'objet_lister_parents');
5668
+    return helper_filtre_objet_lister_enfants_ou_parents($objet, $id_objet, 'objet_lister_parents');
5669 5669
 }
5670 5670
 
5671 5671
 /**
@@ -5679,7 +5679,7 @@  discard block
 block discarded – undo
5679 5679
  * @return array
5680 5680
  */
5681 5681
 function filtre_objet_lister_parents_par_type_dist($objet, $id_objet) {
5682
-	return helper_filtre_objet_lister_enfants_ou_parents($objet, $id_objet, 'objet_lister_parents_par_type');
5682
+    return helper_filtre_objet_lister_enfants_ou_parents($objet, $id_objet, 'objet_lister_parents_par_type');
5683 5683
 }
5684 5684
 
5685 5685
 /**
@@ -5693,7 +5693,7 @@  discard block
 block discarded – undo
5693 5693
  * @return array
5694 5694
  */
5695 5695
 function filtre_objet_lister_enfants_dist($objet, $id_objet) {
5696
-	return helper_filtre_objet_lister_enfants_ou_parents($objet, $id_objet, 'objet_lister_enfants');
5696
+    return helper_filtre_objet_lister_enfants_ou_parents($objet, $id_objet, 'objet_lister_enfants');
5697 5697
 }
5698 5698
 
5699 5699
 /**
@@ -5707,5 +5707,5 @@  discard block
 block discarded – undo
5707 5707
  * @return array
5708 5708
  */
5709 5709
 function filtre_objet_lister_enfants_par_type_dist($objet, $id_objet) {
5710
-	return helper_filtre_objet_lister_enfants_ou_parents($objet, $id_objet, 'objet_lister_enfants_par_type');
5710
+    return helper_filtre_objet_lister_enfants_ou_parents($objet, $id_objet, 'objet_lister_enfants_par_type');
5711 5711
 }
Please login to merge, or discard this patch.
Spacing   +129 added lines, -130 removed lines patch added patch discarded remove patch
@@ -96,7 +96,7 @@  discard block
 block discarded – undo
96 96
 	}
97 97
 
98 98
 	include_fichiers_fonctions();
99
-	foreach (['filtre_' . $fonc, 'filtre_' . $fonc . '_dist', $fonc] as $f) {
99
+	foreach (['filtre_'.$fonc, 'filtre_'.$fonc.'_dist', $fonc] as $f) {
100 100
 		trouver_filtre_matrice($f); // charge des fichiers spécifiques éventuels
101 101
 		if (is_callable($f)) {
102 102
 			return $f;
@@ -234,7 +234,7 @@  discard block
 block discarded – undo
234 234
 	// affichage "GIT [master: abcdef]"
235 235
 	$commit = $desc['commit_short'] ?? $desc['commit'];
236 236
 	if ($desc['branch']) {
237
-		$commit = $desc['branch'] . ': ' . $commit;
237
+		$commit = $desc['branch'].': '.$commit;
238 238
 	}
239 239
 	return "{$desc['vcs']} [$commit]";
240 240
 }
@@ -253,9 +253,9 @@  discard block
 block discarded – undo
253 253
 	}
254 254
 
255 255
 	// version installee par GIT
256
-	if (lire_fichier($dir . '/.git/HEAD', $c)) {
256
+	if (lire_fichier($dir.'/.git/HEAD', $c)) {
257 257
 		$currentHead = trim(substr($c, 4));
258
-		if (lire_fichier($dir . '/.git/' . $currentHead, $hash)) {
258
+		if (lire_fichier($dir.'/.git/'.$currentHead, $hash)) {
259 259
 			return [
260 260
 				'vcs' => 'GIT',
261 261
 				'branch' => basename($currentHead),
@@ -282,8 +282,8 @@  discard block
 block discarded – undo
282 282
 		$dir = '.';
283 283
 	}
284 284
 	// version installee par SVN
285
-	if (file_exists($dir . '/.svn/wc.db') && class_exists(\SQLite3::class)) {
286
-		$db = new SQLite3($dir . '/.svn/wc.db');
285
+	if (file_exists($dir.'/.svn/wc.db') && class_exists(\SQLite3::class)) {
286
+		$db = new SQLite3($dir.'/.svn/wc.db');
287 287
 		$result = $db->query('SELECT changed_revision FROM nodes WHERE local_relpath = "" LIMIT 1');
288 288
 		if ($result) {
289 289
 			$row = $result->fetchArray();
@@ -301,12 +301,12 @@  discard block
 block discarded – undo
301 301
 
302 302
 // La matrice est necessaire pour ne filtrer _que_ des fonctions definies dans filtres_images
303 303
 // et laisser passer les fonctions personnelles baptisees image_...
304
-$GLOBALS['spip_matrice']['image_graver'] = true;//'inc/filtres_images_mini.php';
305
-$GLOBALS['spip_matrice']['image_select'] = true;//'inc/filtres_images_mini.php';
306
-$GLOBALS['spip_matrice']['image_reduire'] = true;//'inc/filtres_images_mini.php';
307
-$GLOBALS['spip_matrice']['image_reduire_par'] = true;//'inc/filtres_images_mini.php';
308
-$GLOBALS['spip_matrice']['image_passe_partout'] = true;//'inc/filtres_images_mini.php';
309
-$GLOBALS['spip_matrice']['image_recadre_avec_fallback'] = true;//'inc/filtres_images_mini.php';
304
+$GLOBALS['spip_matrice']['image_graver'] = true; //'inc/filtres_images_mini.php';
305
+$GLOBALS['spip_matrice']['image_select'] = true; //'inc/filtres_images_mini.php';
306
+$GLOBALS['spip_matrice']['image_reduire'] = true; //'inc/filtres_images_mini.php';
307
+$GLOBALS['spip_matrice']['image_reduire_par'] = true; //'inc/filtres_images_mini.php';
308
+$GLOBALS['spip_matrice']['image_passe_partout'] = true; //'inc/filtres_images_mini.php';
309
+$GLOBALS['spip_matrice']['image_recadre_avec_fallback'] = true; //'inc/filtres_images_mini.php';
310 310
 
311 311
 $GLOBALS['spip_matrice']['couleur_html_to_hex'] = 'inc/filtres_images_mini.php';
312 312
 $GLOBALS['spip_matrice']['couleur_hex_to_hsl'] = 'inc/filtres_images_mini.php';
@@ -465,8 +465,8 @@  discard block
 block discarded – undo
465 465
  */
466 466
 function filtre_debug($val, $key = null) {
467 467
 	$debug = (
468
-		is_null($key) ? '' : (var_export($key, true) . ' = ')
469
-		) . var_export($val, true);
468
+		is_null($key) ? '' : (var_export($key, true).' = ')
469
+		).var_export($val, true);
470 470
 
471 471
 	include_spip('inc/autoriser');
472 472
 	if (autoriser('webmestre')) {
@@ -522,7 +522,7 @@  discard block
 block discarded – undo
522 522
 		$is_file = false;
523 523
 	}
524 524
 	if ($is_file) {
525
-		$is_local_file = function ($path) {
525
+		$is_local_file = function($path) {
526 526
 			if (strpos($path, '?') !== false) {
527 527
 				$path = supprimer_timestamp($path);
528 528
 				// remove ?24px added by find_in_theme on .svg files
@@ -571,7 +571,7 @@  discard block
 block discarded – undo
571 571
 					if ($mouseover = extraire_attribut($reduit, 'onmouseover')) {
572 572
 						if (preg_match(",this[.]src=['\"]([^'\"]+)['\"],ims", $mouseover, $match)) {
573 573
 							$srcover = $match[1];
574
-							$srcover_filter = $filtre("<img src='" . $match[1] . "' />", ...$args);
574
+							$srcover_filter = $filtre("<img src='".$match[1]."' />", ...$args);
575 575
 							$srcover_filter = extraire_attribut($srcover_filter, 'src');
576 576
 							$reduit = str_replace($srcover, $srcover_filter, $reduit);
577 577
 						}
@@ -973,7 +973,7 @@  discard block
 block discarded – undo
973 973
 	// " -> &quot; et tout ce genre de choses
974 974
 	$u = $GLOBALS['meta']['pcre_u'];
975 975
 	$texte = str_replace('&nbsp;', ' ', $texte);
976
-	$texte = preg_replace('/\s{2,}/S' . $u, ' ', $texte);
976
+	$texte = preg_replace('/\s{2,}/S'.$u, ' ', $texte);
977 977
 	// ne pas echapper les sinqle quotes car certains outils de syndication gerent mal
978 978
 	$texte = entites_html($texte, false, false);
979 979
 	// mais bien echapper les double quotes !
@@ -1033,7 +1033,7 @@  discard block
 block discarded – undo
1033 1033
  **/
1034 1034
 function supprimer_numero($texte) {
1035 1035
 	return preg_replace(
1036
-		',^[[:space:]]*([0-9]+)([.)]|' . chr(194) . '?' . chr(176) . ')[[:space:]]+,S',
1036
+		',^[[:space:]]*([0-9]+)([.)]|'.chr(194).'?'.chr(176).')[[:space:]]+,S',
1037 1037
 		'',
1038 1038
 		$texte
1039 1039
 	);
@@ -1062,7 +1062,7 @@  discard block
 block discarded – undo
1062 1062
 	if (
1063 1063
 		$texte and
1064 1064
 		preg_match(
1065
-			',^[[:space:]]*([0-9]+)([.)]|' . chr(194) . '?' . chr(176) . ')[[:space:]]+,S',
1065
+			',^[[:space:]]*([0-9]+)([.)]|'.chr(194).'?'.chr(176).')[[:space:]]+,S',
1066 1066
 			$texte,
1067 1067
 			$regs
1068 1068
 		)
@@ -1153,8 +1153,8 @@  discard block
 block discarded – undo
1153 1153
  **/
1154 1154
 function textebrut($texte) {
1155 1155
 	$u = $GLOBALS['meta']['pcre_u'];
1156
-	$texte = preg_replace('/\s+/S' . $u, ' ', $texte);
1157
-	$texte = preg_replace('/<(p|br)( [^>]*)?' . '>/iS', "\n\n", $texte);
1156
+	$texte = preg_replace('/\s+/S'.$u, ' ', $texte);
1157
+	$texte = preg_replace('/<(p|br)( [^>]*)?'.'>/iS', "\n\n", $texte);
1158 1158
 	$texte = preg_replace("/^\n+/", '', $texte);
1159 1159
 	$texte = preg_replace("/\n+$/", '', $texte);
1160 1160
 	$texte = preg_replace("/\n +/", "\n", $texte);
@@ -1188,7 +1188,7 @@  discard block
 block discarded – undo
1188 1188
 		)
1189 1189
 	) {
1190 1190
 		foreach ($liens[0] as $a) {
1191
-			$rel = 'noopener noreferrer ' . extraire_attribut($a, 'rel');
1191
+			$rel = 'noopener noreferrer '.extraire_attribut($a, 'rel');
1192 1192
 			$ablank = inserer_attribut($a, 'rel', $rel);
1193 1193
 			$ablank = inserer_attribut($ablank, 'target', '_blank');
1194 1194
 			$texte = str_replace($a, $ablank, $texte);
@@ -1213,7 +1213,7 @@  discard block
 block discarded – undo
1213 1213
 		foreach ($regs[0] as $a) {
1214 1214
 			$rel = extraire_attribut($a, 'rel') ?? '';
1215 1215
 			if (strpos($rel, 'nofollow') === false) {
1216
-				$rel = 'nofollow' . ($rel ? " $rel" : '');
1216
+				$rel = 'nofollow'.($rel ? " $rel" : '');
1217 1217
 				$anofollow = inserer_attribut($a, 'rel', $rel);
1218 1218
 				$texte = str_replace($a, $anofollow, $texte);
1219 1219
 			}
@@ -1242,7 +1242,7 @@  discard block
 block discarded – undo
1242 1242
 	$u = $GLOBALS['meta']['pcre_u'];
1243 1243
 	$texte = preg_replace('@</p>@iS', "\n", $texte);
1244 1244
 	$texte = preg_replace("@<p\b.*>@UiS", '<br />', $texte);
1245
-	$texte = preg_replace('@^\s*<br />@S' . $u, '', $texte);
1245
+	$texte = preg_replace('@^\s*<br />@S'.$u, '', $texte);
1246 1246
 
1247 1247
 	return $texte;
1248 1248
 }
@@ -1273,7 +1273,7 @@  discard block
 block discarded – undo
1273 1273
 		return $texte;
1274 1274
 	}
1275 1275
 	include_spip('inc/texte');
1276
-	$tag = preg_match(',</?(' . _BALISES_BLOCS . ')[>[:space:]],iS', $texte) ?
1276
+	$tag = preg_match(',</?('._BALISES_BLOCS.')[>[:space:]],iS', $texte) ?
1277 1277
 		'div' : 'span';
1278 1278
 
1279 1279
 	return "<$tag style='word-wrap:break-word;'>$texte</$tag>";
@@ -1385,7 +1385,7 @@  discard block
 block discarded – undo
1385 1385
 	}
1386 1386
 	$u = $GLOBALS['meta']['pcre_u'];
1387 1387
 	if ($textebrut) {
1388
-		$texte = preg_replace([",\n,", ',\s(?=\s),msS' . $u], [' ', ''], textebrut($texte));
1388
+		$texte = preg_replace([",\n,", ',\s(?=\s),msS'.$u], [' ', ''], textebrut($texte));
1389 1389
 	}
1390 1390
 	$texte = texte_backend($texte);
1391 1391
 	$texte = str_replace(["'", '"'], ['&#039;', '&#034;'], $texte);
@@ -1420,7 +1420,7 @@  discard block
 block discarded – undo
1420 1420
 	# un message pour abs_url
1421 1421
 	$GLOBALS['mode_abs_url'] = 'url';
1422 1422
 	$url = trim($url);
1423
-	$r = ',^(?:' . _PROTOCOLES_STD . '):?/?/?$,iS';
1423
+	$r = ',^(?:'._PROTOCOLES_STD.'):?/?/?$,iS';
1424 1424
 
1425 1425
 	return preg_match($r, $url) ? '' : ($entites ? entites_html($url) : $url);
1426 1426
 }
@@ -1620,14 +1620,14 @@  discard block
 block discarded – undo
1620 1620
 	if (strpos($texte, '<') !== false) {
1621 1621
 		include_spip('inc/lien');
1622 1622
 		if (defined('_PREG_MODELE')) {
1623
-			$preg_modeles = '@' . _PREG_MODELE . '@imsS';
1623
+			$preg_modeles = '@'._PREG_MODELE.'@imsS';
1624 1624
 			$texte = echappe_html($texte, '', true, $preg_modeles);
1625 1625
 		}
1626 1626
 	}
1627 1627
 
1628 1628
 	$debut = '';
1629 1629
 	$suite = $texte;
1630
-	while ($t = strpos('-' . $suite, "\n", 1)) {
1630
+	while ($t = strpos('-'.$suite, "\n", 1)) {
1631 1631
 		$debut .= substr($suite, 0, $t - 1);
1632 1632
 		$suite = substr($suite, $t);
1633 1633
 		$car = substr($suite, 0, 1);
@@ -1645,11 +1645,11 @@  discard block
 block discarded – undo
1645 1645
 			$suite = substr($suite, strlen($regs[0]));
1646 1646
 		}
1647 1647
 	}
1648
-	$texte = $debut . $suite;
1648
+	$texte = $debut.$suite;
1649 1649
 
1650 1650
 	$texte = echappe_retour($texte);
1651 1651
 
1652
-	return $texte . $fin;
1652
+	return $texte.$fin;
1653 1653
 }
1654 1654
 
1655 1655
 
@@ -1711,7 +1711,7 @@  discard block
 block discarded – undo
1711 1711
 		}
1712 1712
 
1713 1713
 		foreach ($regs as $reg) {
1714
-			$cle = ($reg[1] ? $reg[1] . ':' : '') . $reg[2];
1714
+			$cle = ($reg[1] ? $reg[1].':' : '').$reg[2];
1715 1715
 			$desc = $traduire($cle, $lang, true);
1716 1716
 			$l = $desc->langue;
1717 1717
 			// si pas de traduction, on laissera l'écriture de l'idiome entier dans le texte.
@@ -1825,9 +1825,9 @@  discard block
 block discarded – undo
1825 1825
 					// il ne faut pas echapper en div si propre produit un seul paragraphe
1826 1826
 					include_spip('inc/texte');
1827 1827
 					$trad_propre = preg_replace(',(^<p[^>]*>|</p>$),Uims', '', propre($trad));
1828
-					$mode = preg_match(',</?(' . _BALISES_BLOCS . ')[>[:space:]],iS', $trad_propre) ? 'div' : 'span';
1828
+					$mode = preg_match(',</?('._BALISES_BLOCS.')[>[:space:]],iS', $trad_propre) ? 'div' : 'span';
1829 1829
 					if ($mode === 'div') {
1830
-						$trad = rtrim($trad) . "\n\n";
1830
+						$trad = rtrim($trad)."\n\n";
1831 1831
 					}
1832 1832
 					$trad = code_echappement($trad, 'multi', false, $mode);
1833 1833
 					$trad = str_replace("'", '"', inserer_attribut($trad, 'lang', $l));
@@ -2027,7 +2027,7 @@  discard block
 block discarded – undo
2027 2027
 	if (is_array($balise)) {
2028 2028
 		array_walk(
2029 2029
 			$balise,
2030
-			function (&$a, $key, $t) {
2030
+			function(&$a, $key, $t) {
2031 2031
 				$a = extraire_attribut($a, $t);
2032 2032
 			},
2033 2033
 			$attribut
@@ -2124,14 +2124,14 @@  discard block
 block discarded – undo
2124 2124
 
2125 2125
 	if ($old !== null) {
2126 2126
 		// Remplacer l'ancien attribut du meme nom
2127
-		$balise = $r[1] . $insert . $r[5];
2127
+		$balise = $r[1].$insert.$r[5];
2128 2128
 	} else {
2129 2129
 		// preferer une balise " />" (comme <img />)
2130 2130
 		if (preg_match(',/>,', $balise)) {
2131
-			$balise = preg_replace(',\s?/>,S', $insert . ' />', $balise, 1);
2131
+			$balise = preg_replace(',\s?/>,S', $insert.' />', $balise, 1);
2132 2132
 		} // sinon une balise <a ...> ... </a>
2133 2133
 		else {
2134
-			$balise = preg_replace(',\s?>,S', $insert . '>', $balise, 1);
2134
+			$balise = preg_replace(',\s?>,S', $insert.'>', $balise, 1);
2135 2135
 		}
2136 2136
 	}
2137 2137
 
@@ -2186,7 +2186,7 @@  discard block
 block discarded – undo
2186 2186
 		if (
2187 2187
 			$class_courante
2188 2188
 			and strpos($class_courante, (string) $c) !== false
2189
-			and preg_match('/(^|\s)' . preg_quote($c) . '($|\s)/', $class_courante)
2189
+			and preg_match('/(^|\s)'.preg_quote($c).'($|\s)/', $class_courante)
2190 2190
 		) {
2191 2191
 			$is_class_presente = true;
2192 2192
 		}
@@ -2194,12 +2194,12 @@  discard block
 block discarded – undo
2194 2194
 			in_array($operation, ['ajouter', 'commuter'])
2195 2195
 			and !$is_class_presente
2196 2196
 		) {
2197
-			$class_new = ltrim(rtrim($class_new ?? '') . ' ' . $c);
2197
+			$class_new = ltrim(rtrim($class_new ?? '').' '.$c);
2198 2198
 		} elseif (
2199 2199
 			in_array($operation, ['supprimer', 'commuter'])
2200 2200
 			and $is_class_presente
2201 2201
 		) {
2202
-			$class_new = trim(preg_replace('/(^|\s)' . preg_quote($c) . '($|\s)/', "\\1", $class_new));
2202
+			$class_new = trim(preg_replace('/(^|\s)'.preg_quote($c).'($|\s)/', "\\1", $class_new));
2203 2203
 		}
2204 2204
 	}
2205 2205
 
@@ -2262,7 +2262,7 @@  discard block
 block discarded – undo
2262 2262
 // Quelques fonctions de calcul arithmetique
2263 2263
 //
2264 2264
 function floatstr($a) {
2265
- return str_replace(',', '.', (string)floatval($a));
2265
+ return str_replace(',', '.', (string) floatval($a));
2266 2266
 }
2267 2267
 function strize($f, $a, $b) {
2268 2268
  return floatstr($f(floatstr($a), floatstr($b)));
@@ -2398,13 +2398,13 @@  discard block
 block discarded – undo
2398 2398
 	if (!defined('_TAGS_NOM_AUTEUR')) {
2399 2399
 		define('_TAGS_NOM_AUTEUR', '');
2400 2400
 	}
2401
-	$tags_acceptes = array_unique(explode(',', 'multi,' . _TAGS_NOM_AUTEUR));
2401
+	$tags_acceptes = array_unique(explode(',', 'multi,'._TAGS_NOM_AUTEUR));
2402 2402
 	foreach ($tags_acceptes as $tag) {
2403 2403
 		if (strlen($tag)) {
2404
-			$remp1[] = '<' . trim($tag) . '>';
2405
-			$remp1[] = '</' . trim($tag) . '>';
2406
-			$remp2[] = '\x60' . trim($tag) . '\x61';
2407
-			$remp2[] = '\x60/' . trim($tag) . '\x61';
2404
+			$remp1[] = '<'.trim($tag).'>';
2405
+			$remp1[] = '</'.trim($tag).'>';
2406
+			$remp2[] = '\x60'.trim($tag).'\x61';
2407
+			$remp2[] = '\x60/'.trim($tag).'\x61';
2408 2408
 		}
2409 2409
 	}
2410 2410
 	$v_nom = str_replace($remp2, $remp1, supprimer_tags(str_replace($remp1, $remp2, $nom)));
@@ -2524,10 +2524,10 @@  discard block
 block discarded – undo
2524 2524
 	$fichier = basename($url);
2525 2525
 
2526 2526
 	return '<a rel="enclosure"'
2527
-	. ($url ? ' href="' . spip_htmlspecialchars($url) . '"' : '')
2528
-	. ($type ? ' type="' . spip_htmlspecialchars($type) . '"' : '')
2529
-	. ($length ? ' title="' . spip_htmlspecialchars($length) . '"' : '')
2530
-	. '>' . $fichier . '</a>';
2527
+	. ($url ? ' href="'.spip_htmlspecialchars($url).'"' : '')
2528
+	. ($type ? ' type="'.spip_htmlspecialchars($type).'"' : '')
2529
+	. ($length ? ' title="'.spip_htmlspecialchars($length).'"' : '')
2530
+	. '>'.$fichier.'</a>';
2531 2531
 }
2532 2532
 
2533 2533
 /**
@@ -2555,9 +2555,9 @@  discard block
 block discarded – undo
2555 2555
 			} # vieux data
2556 2556
 			$fichier = basename($url);
2557 2557
 			$enclosures[] = '<enclosure'
2558
-				. ($url ? ' url="' . spip_htmlspecialchars($url) . '"' : '')
2559
-				. ($type ? ' type="' . spip_htmlspecialchars($type) . '"' : '')
2560
-				. ($length ? ' length="' . $length . '"' : '')
2558
+				. ($url ? ' url="'.spip_htmlspecialchars($url).'"' : '')
2559
+				. ($type ? ' type="'.spip_htmlspecialchars($type).'"' : '')
2560
+				. ($length ? ' length="'.$length.'"' : '')
2561 2561
 				. ' />';
2562 2562
 		}
2563 2563
 	}
@@ -2583,7 +2583,7 @@  discard block
 block discarded – undo
2583 2583
 		if (extraire_attribut($e, 'rel') == 'tag') {
2584 2584
 			$subjects .= '<dc:subject>'
2585 2585
 				. texte_backend(textebrut($e))
2586
-				. '</dc:subject>' . "\n";
2586
+				. '</dc:subject>'."\n";
2587 2587
 		}
2588 2588
 	}
2589 2589
 
@@ -2619,7 +2619,7 @@  discard block
 block discarded – undo
2619 2619
 	if (is_array($texte)) {
2620 2620
 		array_walk(
2621 2621
 			$texte,
2622
-			function (&$a, $key, $t) {
2622
+			function(&$a, $key, $t) {
2623 2623
 				$a = extraire_balise($a, $t);
2624 2624
 			},
2625 2625
 			$tag
@@ -2667,7 +2667,7 @@  discard block
 block discarded – undo
2667 2667
 	if (is_array($texte)) {
2668 2668
 		array_walk(
2669 2669
 			$texte,
2670
-			function (&$a, $key, $t) {
2670
+			function(&$a, $key, $t) {
2671 2671
 				$a = extraire_balises($a, $t);
2672 2672
 			},
2673 2673
 			$tag
@@ -2800,7 +2800,7 @@  discard block
 block discarded – undo
2800 2800
 		if ($fond != '404') {
2801 2801
 			$contexte = array_shift($p);
2802 2802
 			$contexte['page'] = $fond;
2803
-			$action = preg_replace('/([?]' . preg_quote($fond) . '[^&=]*[0-9]+)(&|$)/', '?&', $action);
2803
+			$action = preg_replace('/([?]'.preg_quote($fond).'[^&=]*[0-9]+)(&|$)/', '?&', $action);
2804 2804
 		}
2805 2805
 	}
2806 2806
 	// defaire ce qu'a injecte urls_decoder_url : a revoir en modifiant la signature de urls_decoder_url
@@ -2855,9 +2855,9 @@  discard block
 block discarded – undo
2855 2855
 			. '"'
2856 2856
 			. (is_null($val)
2857 2857
 				? ''
2858
-				: ' value="' . entites_html($val) . '"'
2858
+				: ' value="'.entites_html($val).'"'
2859 2859
 			)
2860
-			. ' type="hidden"' . "\n/>";
2860
+			. ' type="hidden"'."\n/>";
2861 2861
 	}
2862 2862
 
2863 2863
 	return join('', $hidden);
@@ -2967,7 +2967,7 @@  discard block
 block discarded – undo
2967 2967
 
2968 2968
 	return preg_replace_callback(
2969 2969
 		",url\s*\(\s*['\"]?([^'\"/#\s][^:]*)['\"]?\s*\),Uims",
2970
-		fn($x) => "url('" . suivre_lien($path, $x[1]) . "')",
2970
+		fn($x) => "url('".suivre_lien($path, $x[1])."')",
2971 2971
 		$contenu
2972 2972
 	);
2973 2973
 }
@@ -3028,14 +3028,14 @@  discard block
 block discarded – undo
3028 3028
 	) {
3029 3029
 		$distant = true;
3030 3030
 		$cssf = parse_url($css);
3031
-		$cssf = $cssf['path'] . ($cssf['query'] ? '?' . $cssf['query'] : '');
3031
+		$cssf = $cssf['path'].($cssf['query'] ? '?'.$cssf['query'] : '');
3032 3032
 		$cssf = preg_replace(',[?:&=],', '_', $cssf);
3033 3033
 	} else {
3034 3034
 		$distant = false;
3035 3035
 		$cssf = $css;
3036 3036
 		// 1. regarder d'abord si un fichier avec la bonne direction n'est pas aussi
3037 3037
 		//propose (rien a faire dans ce cas)
3038
-		$f = preg_replace(',(_rtl)?\.css$,i', '_' . $ndir . '.css', $css);
3038
+		$f = preg_replace(',(_rtl)?\.css$,i', '_'.$ndir.'.css', $css);
3039 3039
 		if (@file_exists($f)) {
3040 3040
 			return $f;
3041 3041
 		}
@@ -3045,7 +3045,7 @@  discard block
 block discarded – undo
3045 3045
 	$dir_var = sous_repertoire(_DIR_VAR, 'cache-css');
3046 3046
 	$f = $dir_var
3047 3047
 		. preg_replace(',.*/(.*?)(_rtl)?\.css,', '\1', $cssf)
3048
-		. '.' . substr(md5($cssf), 0, 4) . '_' . $ndir . '.css';
3048
+		. '.'.substr(md5($cssf), 0, 4).'_'.$ndir.'.css';
3049 3049
 
3050 3050
 	// la css peut etre distante (url absolue !)
3051 3051
 	if ($distant) {
@@ -3091,8 +3091,8 @@  discard block
 block discarded – undo
3091 3091
 		} // si la css_direction commence par $dir_var on la fait passer pour une absolue
3092 3092
 		elseif (substr($css_direction, 0, strlen($dir_var)) == $dir_var) {
3093 3093
 			$css_direction = substr($css_direction, strlen($dir_var));
3094
-			$src_faux_abs['/@@@@@@/' . $css_direction] = $css_direction;
3095
-			$css_direction = '/@@@@@@/' . $css_direction;
3094
+			$src_faux_abs['/@@@@@@/'.$css_direction] = $css_direction;
3095
+			$css_direction = '/@@@@@@/'.$css_direction;
3096 3096
 		}
3097 3097
 		$src[] = $regs[0][$k];
3098 3098
 		$src_direction_css[] = str_replace($import_css, $css_direction, $regs[0][$k]);
@@ -3141,7 +3141,7 @@  discard block
 block discarded – undo
3141 3141
 
3142 3142
 	$f = basename($css, '.css');
3143 3143
 	$f = sous_repertoire(_DIR_VAR, 'cache-css')
3144
-		. preg_replace(',(.*?)(_rtl|_ltr)?$,', "\\1-urlabs-" . substr(md5("$css-urlabs"), 0, 4) . "\\2", $f)
3144
+		. preg_replace(',(.*?)(_rtl|_ltr)?$,', "\\1-urlabs-".substr(md5("$css-urlabs"), 0, 4)."\\2", $f)
3145 3145
 		. '.css';
3146 3146
 
3147 3147
 	if ((@filemtime($f) > @filemtime($css)) and (_VAR_MODE != 'recalcul')) {
@@ -3151,7 +3151,7 @@  discard block
 block discarded – undo
3151 3151
 	if ($url_absolue_css == $css) {
3152 3152
 		if (
3153 3153
 			strncmp($GLOBALS['meta']['adresse_site'], $css, $l = strlen($GLOBALS['meta']['adresse_site'])) != 0
3154
-			or !lire_fichier(_DIR_RACINE . substr($css, $l), $contenu)
3154
+			or !lire_fichier(_DIR_RACINE.substr($css, $l), $contenu)
3155 3155
 		) {
3156 3156
 			include_spip('inc/distant');
3157 3157
 			$contenu = recuperer_url($css);
@@ -3263,7 +3263,7 @@  discard block
 block discarded – undo
3263 3263
 	$expression = str_replace('\/', '/', $expression);
3264 3264
 	$expression = str_replace('/', '\/', $expression);
3265 3265
 
3266
-	if (preg_match('/' . $expression . '/' . $modif, $texte ?? '', $r)) {
3266
+	if (preg_match('/'.$expression.'/'.$modif, $texte ?? '', $r)) {
3267 3267
 		if (isset($r[$capte])) {
3268 3268
 			return $r[$capte];
3269 3269
 		} else {
@@ -3301,7 +3301,7 @@  discard block
 block discarded – undo
3301 3301
 	$expression = str_replace('\/', '/', $expression);
3302 3302
 	$expression = str_replace('/', '\/', $expression);
3303 3303
 
3304
-	return preg_replace('/' . $expression . '/' . $modif, $replace, $texte);
3304
+	return preg_replace('/'.$expression.'/'.$modif, $replace, $texte);
3305 3305
 }
3306 3306
 
3307 3307
 
@@ -3320,7 +3320,7 @@  discard block
 block discarded – undo
3320 3320
 function traiter_doublons_documents(&$doublons, $letexte) {
3321 3321
 
3322 3322
 	// Verifier dans le texte & les notes (pas beau, helas)
3323
-	$t = $letexte . $GLOBALS['les_notes'];
3323
+	$t = $letexte.$GLOBALS['les_notes'];
3324 3324
 
3325 3325
 	if (
3326 3326
 		strstr($t, 'spip_document_') // evite le preg_match_all si inutile
@@ -3334,7 +3334,7 @@  discard block
 block discarded – undo
3334 3334
 		if (!isset($doublons['documents'])) {
3335 3335
 			$doublons['documents'] = '';
3336 3336
 		}
3337
-		$doublons['documents'] .= ',' . join(',', $matches[1]);
3337
+		$doublons['documents'] .= ','.join(',', $matches[1]);
3338 3338
 	}
3339 3339
 
3340 3340
 	return $letexte;
@@ -3391,7 +3391,7 @@  discard block
 block discarded – undo
3391 3391
 	if ($env) {
3392 3392
 		foreach ($env as $i => $j) {
3393 3393
 			if (is_string($j) and !in_array($i, $ignore_params)) {
3394
-				$texte .= "<param name='" . attribut_html($i) . "'\n\tvalue='" . attribut_html($j) . "' />";
3394
+				$texte .= "<param name='".attribut_html($i)."'\n\tvalue='".attribut_html($j)."' />";
3395 3395
 			}
3396 3396
 		}
3397 3397
 	}
@@ -3430,7 +3430,7 @@  discard block
 block discarded – undo
3430 3430
 	if ($env) {
3431 3431
 		foreach ($env as $i => $j) {
3432 3432
 			if (is_string($j) and !in_array($i, $ignore_params)) {
3433
-				$texte .= attribut_html($i) . "='" . attribut_html($j) . "' ";
3433
+				$texte .= attribut_html($i)."='".attribut_html($j)."' ";
3434 3434
 			}
3435 3435
 		}
3436 3436
 	}
@@ -3504,10 +3504,10 @@  discard block
 block discarded – undo
3504 3504
 	// si il y a un .svg a la bonne taille (-16.svg) a cote, on l'utilise en remplacement du -16.png
3505 3505
 	if (
3506 3506
 		preg_match(',-(\d+)[.](png|gif|svg)$,', $img_file, $m)
3507
-		and $variante_svg_generique = substr($img_file, 0, -strlen($m[0])) . '-xx.svg'
3507
+		and $variante_svg_generique = substr($img_file, 0, -strlen($m[0])).'-xx.svg'
3508 3508
 		and file_exists($variante_svg_generique)
3509 3509
 	) {
3510
-		if ($variante_svg_size = substr($variante_svg_generique, 0, -6) . $m[1] . '.svg' and file_exists($variante_svg_size)) {
3510
+		if ($variante_svg_size = substr($variante_svg_generique, 0, -6).$m[1].'.svg' and file_exists($variante_svg_size)) {
3511 3511
 			$img_file = $variante_svg_size;
3512 3512
 		}
3513 3513
 		else {
@@ -3565,7 +3565,7 @@  discard block
 block discarded – undo
3565 3565
 				return '';
3566 3566
 			}
3567 3567
 		}
3568
-		$atts .= " width='" . $largeur . "' height='" . $hauteur . "'";
3568
+		$atts .= " width='".$largeur."' height='".$hauteur."'";
3569 3569
 	}
3570 3570
 
3571 3571
 	if (file_exists($img_file)) {
@@ -3575,14 +3575,14 @@  discard block
 block discarded – undo
3575 3575
 		$alt = '';
3576 3576
 	}
3577 3577
 	elseif ($alt or $alt === '') {
3578
-		$alt = " alt='" . attribut_html($alt) . "'";
3578
+		$alt = " alt='".attribut_html($alt)."'";
3579 3579
 	}
3580 3580
 	else {
3581
-		$alt = " alt='" . attribut_html($title) . "'";
3581
+		$alt = " alt='".attribut_html($title)."'";
3582 3582
 	}
3583
-	return "<img src='" . attribut_html($img_file) . "'$alt"
3584
-	. ($title ? ' title="' . attribut_html($title) . '"' : '')
3585
-	. ' ' . ltrim($atts)
3583
+	return "<img src='".attribut_html($img_file)."'$alt"
3584
+	. ($title ? ' title="'.attribut_html($title).'"' : '')
3585
+	. ' '.ltrim($atts)
3586 3586
 	. ' />';
3587 3587
 }
3588 3588
 
@@ -3596,10 +3596,10 @@  discard block
 block discarded – undo
3596 3596
  */
3597 3597
 function http_style_background($img, $att = '', $size = null) {
3598 3598
 	if ($size and is_numeric($size)) {
3599
-		$size = trim($size) . 'px';
3599
+		$size = trim($size).'px';
3600 3600
 	}
3601
-	return " style='background" .
3602
-		($att ? '' : '-image') . ': url("' . chemin_image($img) . '")' . ($att ? (' ' . $att) : '') . ';'
3601
+	return " style='background".
3602
+		($att ? '' : '-image').': url("'.chemin_image($img).'")'.($att ? (' '.$att) : '').';'
3603 3603
 		. ($size ? "background-size:{$size};" : '')
3604 3604
 		. "'";
3605 3605
 }
@@ -3714,7 +3714,7 @@  discard block
 block discarded – undo
3714 3714
 		$img = http_img_pack(
3715 3715
 			$img,
3716 3716
 			$alt,
3717
-			$class ? " class='" . attribut_html($class) . "'" : '',
3717
+			$class ? " class='".attribut_html($class)."'" : '',
3718 3718
 			'',
3719 3719
 			['chemin_image' => false, 'utiliser_suffixe_size' => false]
3720 3720
 		);
@@ -3799,7 +3799,7 @@  discard block
 block discarded – undo
3799 3799
 	$balise_svg_source = $balise_svg;
3800 3800
 
3801 3801
 	// entete XML à supprimer
3802
-	$svg = preg_replace(',^\s*<\?xml[^>]*\?' . '>,', '', $svg);
3802
+	$svg = preg_replace(',^\s*<\?xml[^>]*\?'.'>,', '', $svg);
3803 3803
 
3804 3804
 	// IE est toujours mon ami
3805 3805
 	$balise_svg = inserer_attribut($balise_svg, 'focusable', 'false');
@@ -3817,9 +3817,9 @@  discard block
 block discarded – undo
3817 3817
 	// regler le alt
3818 3818
 	if ($alt) {
3819 3819
 		$balise_svg = inserer_attribut($balise_svg, 'role', 'img');
3820
-		$id = 'img-svg-title-' . substr(md5("$img_file:$svg:$alt"), 0, 4);
3820
+		$id = 'img-svg-title-'.substr(md5("$img_file:$svg:$alt"), 0, 4);
3821 3821
 		$balise_svg = inserer_attribut($balise_svg, 'aria-labelledby', $id);
3822
-		$title = "<title id=\"$id\">" . entites_html($alt) . "</title>\n";
3822
+		$title = "<title id=\"$id\">".entites_html($alt)."</title>\n";
3823 3823
 		$balise_svg .= $title;
3824 3824
 	}
3825 3825
 	else {
@@ -3867,7 +3867,7 @@  discard block
 block discarded – undo
3867 3867
 	if (is_array($tableau)) {
3868 3868
 		foreach ($tableau as $k => $v) {
3869 3869
 			$res = recuperer_fond(
3870
-				'modeles/' . $modele,
3870
+				'modeles/'.$modele,
3871 3871
 				array_merge(['cle' => $k], (is_array($v) ? $v : ['valeur' => $v]))
3872 3872
 			);
3873 3873
 			$texte .= $res;
@@ -4052,7 +4052,7 @@  discard block
 block discarded – undo
4052 4052
 	}
4053 4053
 
4054 4054
 	$c = serialize($c);
4055
-	$cle = calculer_cle_action($form . $c);
4055
+	$cle = calculer_cle_action($form.$c);
4056 4056
 	$c = "$cle:$c";
4057 4057
 
4058 4058
 	// on ne stocke pas les contextes dans des fichiers en cache
@@ -4110,15 +4110,15 @@  discard block
 block discarded – undo
4110 4110
 	}
4111 4111
 	// toujours encoder l'url source dans le bloc ajax
4112 4112
 	$r = self();
4113
-	$r = ' data-origin="' . $r . '"';
4113
+	$r = ' data-origin="'.$r.'"';
4114 4114
 	$class = 'ajaxbloc';
4115 4115
 	if ($ajaxid and is_string($ajaxid)) {
4116 4116
 		// ajaxid est normalement conforme a un nom de classe css
4117 4117
 		// on ne verifie pas la conformite, mais on passe entites_html par dessus par precaution
4118
-		$class .= ' ajax-id-' . entites_html($ajaxid);
4118
+		$class .= ' ajax-id-'.entites_html($ajaxid);
4119 4119
 	}
4120 4120
 
4121
-	return "<div class='$class' " . "data-ajax-env='$env'$r>\n$emboite</div><!--ajaxbloc-->\n";
4121
+	return "<div class='$class' "."data-ajax-env='$env'$r>\n$emboite</div><!--ajaxbloc-->\n";
4122 4122
 }
4123 4123
 
4124 4124
 /**
@@ -4162,7 +4162,7 @@  discard block
 block discarded – undo
4162 4162
 		$cle = substr($c, 0, $p);
4163 4163
 		$c = substr($c, $p + 1);
4164 4164
 
4165
-		if ($cle == calculer_cle_action($form . $c)) {
4165
+		if ($cle == calculer_cle_action($form.$c)) {
4166 4166
 			$env = @unserialize($c);
4167 4167
 			return $env;
4168 4168
 		}
@@ -4283,13 +4283,13 @@  discard block
 block discarded – undo
4283 4283
 				}
4284 4284
 			}
4285 4285
 		}
4286
-		$att .= 'class="' . ($class ? attribut_html($class) . ' ' : '') . (defined('_LIEN_OU_EXPOSE_CLASS_ON') ? _LIEN_OU_EXPOSE_CLASS_ON : 'on') . '"';
4286
+		$att .= 'class="'.($class ? attribut_html($class).' ' : '').(defined('_LIEN_OU_EXPOSE_CLASS_ON') ? _LIEN_OU_EXPOSE_CLASS_ON : 'on').'"';
4287 4287
 	} else {
4288 4288
 		$bal = 'a';
4289 4289
 		$att = "href='$url'"
4290
-			. ($title ? " title='" . attribut_html($title) . "'" : '')
4291
-			. ($class ? " class='" . attribut_html($class) . "'" : '')
4292
-			. ($rel ? " rel='" . attribut_html($rel) . "'" : '')
4290
+			. ($title ? " title='".attribut_html($title)."'" : '')
4291
+			. ($class ? " class='".attribut_html($class)."'" : '')
4292
+			. ($rel ? " rel='".attribut_html($rel)."'" : '')
4293 4293
 			. $evt;
4294 4294
 	}
4295 4295
 	if ($libelle === null) {
@@ -4428,7 +4428,7 @@  discard block
 block discarded – undo
4428 4428
 
4429 4429
 	// Icône
4430 4430
 	$icone = http_img_pack($fond, $alt, "width='$size' height='$size'");
4431
-	$icone = '<span class="icone-image' . ($fonction ? " icone-fonction icone-fonction-$fonction" : '') . "\">$icone</span>";
4431
+	$icone = '<span class="icone-image'.($fonction ? " icone-fonction icone-fonction-$fonction" : '')."\">$icone</span>";
4432 4432
 
4433 4433
 	// Markup final
4434 4434
 	if ($type == 'lien') {
@@ -4703,20 +4703,20 @@  discard block
 block discarded – undo
4703 4703
 		$class_form = 'ajax';
4704 4704
 		$class = str_replace('ajax', '', $class);
4705 4705
 	}
4706
-	$class_btn = 'submit ' . trim($class);
4706
+	$class_btn = 'submit '.trim($class);
4707 4707
 
4708 4708
 	if ($confirm) {
4709
-		$confirm = 'confirm("' . attribut_html($confirm) . '")';
4709
+		$confirm = 'confirm("'.attribut_html($confirm).'")';
4710 4710
 		if ($callback) {
4711 4711
 			$callback = "$confirm?($callback):false";
4712 4712
 		} else {
4713 4713
 			$callback = $confirm;
4714 4714
 		}
4715 4715
 	}
4716
-	$onclick = $callback ? " onclick='return " . addcslashes($callback, "'") . "'" : '';
4716
+	$onclick = $callback ? " onclick='return ".addcslashes($callback, "'")."'" : '';
4717 4717
 	$title = $title ? " title='$title'" : '';
4718 4718
 
4719
-	return "<form class='bouton_action_post $class_form' method='post' action='$url'><div>" . form_hidden($url)
4719
+	return "<form class='bouton_action_post $class_form' method='post' action='$url'><div>".form_hidden($url)
4720 4720
 	. "<button type='submit' class='$class_btn'$title$onclick>$libelle</button></div></form>";
4721 4721
 }
4722 4722
 
@@ -4781,14 +4781,14 @@  discard block
 block discarded – undo
4781 4781
 		$champ_titre = '';
4782 4782
 		if ($demande_titre) {
4783 4783
 			// si pas de titre declare mais champ titre, il sera peuple par le select *
4784
-			$champ_titre = (!empty($desc['titre'])) ? ', ' . $desc['titre'] : '';
4784
+			$champ_titre = (!empty($desc['titre'])) ? ', '.$desc['titre'] : '';
4785 4785
 		}
4786 4786
 		include_spip('base/abstract_sql');
4787 4787
 		include_spip('base/connect_sql');
4788 4788
 		$objets[$type_objet][$id_objet] = sql_fetsel(
4789
-			'*' . $champ_titre,
4789
+			'*'.$champ_titre,
4790 4790
 			$desc['table_sql'],
4791
-			id_table_objet($type_objet) . ' = ' . intval($id_objet)
4791
+			id_table_objet($type_objet).' = '.intval($id_objet)
4792 4792
 		);
4793 4793
 
4794 4794
 		// Toujours noter la longueur d'introduction, même si pas demandé cette fois-ci
@@ -4881,8 +4881,7 @@  discard block
 block discarded – undo
4881 4881
 	if (isset($ligne_sql['chapo'])) {
4882 4882
 		$chapo = $ligne_sql['chapo'];
4883 4883
 		$texte = strlen($descriptif) ?
4884
-			'' :
4885
-			"$chapo \n\n $texte";
4884
+			'' : "$chapo \n\n $texte";
4886 4885
 	}
4887 4886
 
4888 4887
 	// Longueur en paramètre, sinon celle renseignée dans la description de l'objet, sinon valeur en dur
@@ -4957,7 +4956,7 @@  discard block
 block discarded – undo
4957 4956
 		return $texte;
4958 4957
 	}
4959 4958
 
4960
-	$traitement = str_replace('%s', "'" . texte_script($texte) . "'", $traitement);
4959
+	$traitement = str_replace('%s', "'".texte_script($texte)."'", $traitement);
4961 4960
 
4962 4961
 	// signaler qu'on est dans l'espace prive pour les filtres qui se servent de ce flag
4963 4962
 	if (test_espace_prive()) {
@@ -4996,7 +4995,7 @@  discard block
 block discarded – undo
4996 4995
 	}
4997 4996
 	$url = generer_objet_url($id_objet, $objet, '', '', null, '', $connect);
4998 4997
 
4999
-	return "<a href='$url' class='$objet'>" . couper($titre, $longueur) . '</a>';
4998
+	return "<a href='$url' class='$objet'>".couper($titre, $longueur).'</a>';
5000 4999
 }
5001 5000
 
5002 5001
 /**
@@ -5022,10 +5021,10 @@  discard block
 block discarded – undo
5022 5021
 function wrap($texte, $wrap) {
5023 5022
 	$balises = extraire_balises($wrap);
5024 5023
 	if (preg_match_all(",<([a-z]\w*)\b[^>]*>,UimsS", $wrap, $regs, PREG_PATTERN_ORDER)) {
5025
-		$texte = $wrap . $texte;
5024
+		$texte = $wrap.$texte;
5026 5025
 		$regs = array_reverse($regs[1]);
5027
-		$wrap = '</' . implode('></', $regs) . '>';
5028
-		$texte = $texte . $wrap;
5026
+		$wrap = '</'.implode('></', $regs).'>';
5027
+		$texte = $texte.$wrap;
5029 5028
 	}
5030 5029
 
5031 5030
 	return $texte;
@@ -5056,7 +5055,7 @@  discard block
 block discarded – undo
5056 5055
 
5057 5056
 	// caster $u en array si besoin
5058 5057
 	if (is_object($u)) {
5059
-		$u = (array)$u;
5058
+		$u = (array) $u;
5060 5059
 	}
5061 5060
 
5062 5061
 	if (is_array($u)) {
@@ -5078,7 +5077,7 @@  discard block
 block discarded – undo
5078 5077
 		// sinon on passe a la ligne et on indente
5079 5078
 		$i_str = str_pad('', $indent, ' ');
5080 5079
 		foreach ($u as $k => $v) {
5081
-			$out .= $join . $i_str . "$k: " . filtre_print_dist($v, $join, $indent + 2);
5080
+			$out .= $join.$i_str."$k: ".filtre_print_dist($v, $join, $indent + 2);
5082 5081
 		}
5083 5082
 
5084 5083
 		return $out;
@@ -5132,7 +5131,7 @@  discard block
 block discarded – undo
5132 5131
  * @return string
5133 5132
  */
5134 5133
 function objet_icone($objet, $taille = 24, $class = '') {
5135
-	$icone = objet_info($objet, 'icone_objet') . '-' . $taille . '.png';
5134
+	$icone = objet_info($objet, 'icone_objet').'-'.$taille.'.png';
5136 5135
 	$icone = chemin_image($icone);
5137 5136
 	$balise_img = charger_filtre('balise_img');
5138 5137
 
@@ -5158,7 +5157,7 @@  discard block
 block discarded – undo
5158 5157
  */
5159 5158
 function objet_T($objet, $chaine, $args = [], $options = []) {
5160 5159
 	$chaine = explode(':', $chaine);
5161
-	if ($t = _T($objet . ':' . end($chaine), $args, array_merge($options, ['force' => false]))) {
5160
+	if ($t = _T($objet.':'.end($chaine), $args, array_merge($options, ['force' => false]))) {
5162 5161
 		return $t;
5163 5162
 	}
5164 5163
 	$chaine = implode(':', $chaine);
@@ -5224,7 +5223,7 @@  discard block
 block discarded – undo
5224 5223
 	$cache = recuperer_fond($fond, $contexte, $options, $connect);
5225 5224
 
5226 5225
 	// calculer le nom de la css
5227
-	$dir_var = sous_repertoire(_DIR_VAR, 'cache-' . $extension);
5226
+	$dir_var = sous_repertoire(_DIR_VAR, 'cache-'.$extension);
5228 5227
 	$nom_safe = preg_replace(',\W,', '_', str_replace('.', '_', $fond));
5229 5228
 	$contexte_implicite = calculer_contexte_implicite();
5230 5229
 
@@ -5232,14 +5231,14 @@  discard block
 block discarded – undo
5232 5231
 	// mais on peut hasher selon le contenu a la demande, si plusieurs contextes produisent un meme contenu
5233 5232
 	// reduit la variabilite du nom et donc le nombre de css concatenees possibles in fine
5234 5233
 	if (isset($options['hash_on_content']) and $options['hash_on_content']) {
5235
-		$hash = md5($contexte_implicite['host'] . '::' . $cache);
5234
+		$hash = md5($contexte_implicite['host'].'::'.$cache);
5236 5235
 	}
5237 5236
 	else {
5238 5237
 		unset($contexte_implicite['notes']); // pas pertinent pour signaler un changeemnt de contenu pour des css/js
5239 5238
 		ksort($contexte);
5240
-		$hash = md5($fond . json_encode($contexte_implicite, JSON_THROW_ON_ERROR) . json_encode($contexte, JSON_THROW_ON_ERROR) . $connect);
5239
+		$hash = md5($fond.json_encode($contexte_implicite, JSON_THROW_ON_ERROR).json_encode($contexte, JSON_THROW_ON_ERROR).$connect);
5241 5240
 	}
5242
-	$filename = $dir_var . $extension . "dyn-$nom_safe-" . substr($hash, 0, 8) . ".$extension";
5241
+	$filename = $dir_var.$extension."dyn-$nom_safe-".substr($hash, 0, 8).".$extension";
5243 5242
 
5244 5243
 	// mettre a jour le fichier si il n'existe pas
5245 5244
 	// ou trop ancien
@@ -5247,8 +5246,8 @@  discard block
 block discarded – undo
5247 5246
 	// et recopie sur le fichier cible uniquement si il change
5248 5247
 	if (
5249 5248
 		!file_exists($filename)
5250
-		or !file_exists($filename . '.last')
5251
-		or (isset($cache['lastmodified']) and $cache['lastmodified'] and filemtime($filename . '.last') < $cache['lastmodified'])
5249
+		or !file_exists($filename.'.last')
5250
+		or (isset($cache['lastmodified']) and $cache['lastmodified'] and filemtime($filename.'.last') < $cache['lastmodified'])
5252 5251
 		or (defined('_VAR_MODE') and _VAR_MODE == 'recalcul')
5253 5252
 	) {
5254 5253
 		$contenu = $cache['texte'];
@@ -5272,10 +5271,10 @@  discard block
 block discarded – undo
5272 5271
 			}
5273 5272
 			// pas de date dans le commentaire car sinon ca invalide le md5 et force la maj
5274 5273
 			// mais on peut mettre un md5 du contenu, ce qui donne un aperu rapide si la feuille a change ou non
5275
-			$comment .= "}\n   md5:" . md5($contenu) . " */\n";
5274
+			$comment .= "}\n   md5:".md5($contenu)." */\n";
5276 5275
 		}
5277 5276
 		// et ecrire le fichier si il change
5278
-		ecrire_fichier_calcule_si_modifie($filename, $comment . $contenu, false, true);
5277
+		ecrire_fichier_calcule_si_modifie($filename, $comment.$contenu, false, true);
5279 5278
 	}
5280 5279
 
5281 5280
 	return timestamp($filename);
@@ -5508,7 +5507,7 @@  discard block
 block discarded – undo
5508 5507
 	if ($e > 0 and strlen($mid) > 8) {
5509 5508
 		$mid = '***...***';
5510 5509
 	}
5511
-	return substr($passe, 0, $e) . $mid . ($e > 0 ? substr($passe, -$e) : '');
5510
+	return substr($passe, 0, $e).$mid.($e > 0 ? substr($passe, -$e) : '');
5512 5511
 }
5513 5512
 
5514 5513
 
@@ -5570,7 +5569,7 @@  discard block
 block discarded – undo
5570 5569
 		case 'id':
5571 5570
 		case 'anchor':
5572 5571
 			if (preg_match(',^\d,', $texte)) {
5573
-				$texte = substr($type, 0, 1) . $texte;
5572
+				$texte = substr($type, 0, 1).$texte;
5574 5573
 			}
5575 5574
 	}
5576 5575
 
@@ -5580,9 +5579,9 @@  discard block
 block discarded – undo
5580 5579
 
5581 5580
 	if (strlen($texte) < $longueur_mini and $longueur_mini < $longueur_maxi) {
5582 5581
 		if (preg_match(',^\d,', $texte)) {
5583
-			$texte = ($type ? substr($type, 0, 1) : 's') . $texte;
5582
+			$texte = ($type ? substr($type, 0, 1) : 's').$texte;
5584 5583
 		}
5585
-		$texte .= $separateur . md5($original);
5584
+		$texte .= $separateur.md5($original);
5586 5585
 		$texte = substr($texte, 0, $longueur_mini);
5587 5586
 	}
5588 5587
 
Please login to merge, or discard this patch.
ecrire/src/Chiffrer/SpipCles.php 2 patches
Indentation   +167 added lines, -167 removed lines patch added patch discarded remove patch
@@ -14,171 +14,171 @@
 block discarded – undo
14 14
 
15 15
 /** Gestion des clés d’authentification / chiffrement de SPIP */
16 16
 final class SpipCles {
17
-	private static array $instances = [];
18
-
19
-	private string $file = _DIR_ETC . 'cles.php';
20
-	private Cles $cles;
21
-
22
-	public static function instance(string $file = ''): self {
23
-		if (empty(self::$instances[$file])) {
24
-			self::$instances[$file] = new self($file);
25
-		}
26
-		return self::$instances[$file];
27
-	}
28
-
29
-	/**
30
-	 * Retourne le secret du site (shorthand)
31
-	 * @uses self::getSecretSite()
32
-	 */
33
-	public static function secret_du_site(): ?string {
34
-		return (self::instance())->getSecretSite();
35
-	}
36
-
37
-	private function __construct(string $file = '') {
38
-		if ($file) {
39
-			$this->file = $file;
40
-		}
41
-		$this->cles = new Cles($this->read());
42
-	}
43
-
44
-	/**
45
-	 * Renvoyer le secret du site
46
-	 *
47
-	 * Le secret du site doit rester aussi secret que possible, et est eternel
48
-	 * On ne doit pas l'exporter
49
-	 *
50
-	 * Le secret est partagé entre une clé disque et une clé bdd
51
-	 *
52
-	 * @return string
53
-	 */
54
-	public function getSecretSite(bool $autoInit = true): ?string {
55
-		$key = $this->getKey('secret_du_site', $autoInit);
56
-		$meta = $this->getMetaKey('secret_du_site', $autoInit);
57
-		// conserve la même longeur.
58
-		return $key ^ $meta;
59
-	}
60
-
61
-	/** Renvoyer le secret des authentifications */
62
-	public function getSecretAuth(bool $autoInit = false): ?string {
63
-		return $this->getKey('secret_des_auth', $autoInit);
64
-	}
65
-	public function save(): bool {
66
-		return ecrire_fichier_securise($this->file, $this->cles->toJson());
67
-	}
68
-
69
-	/**
70
-	 * Fournir une sauvegarde chiffree des cles (a l'aide d'une autre clé, comme le pass d'un auteur)
71
-	 *
72
-	 * @param string $withKey Clé de chiffrage de la sauvegarde
73
-	 * @return string Contenu de la sauvegarde chiffrée générée
74
-	 */
75
-	public function backup(
76
-		#[\SensitiveParameter]
77
-		string $withKey
78
-	): string {
79
-		if (count($this->cles)) {
80
-			return Chiffrement::chiffrer($this->cles->toJson(), $withKey);
81
-		}
82
-		return '';
83
-	}
84
-
85
-	/**
86
-	 * Restaurer les cles manquantes depuis une sauvegarde chiffree des cles
87
-	 * (si la sauvegarde est bien valide)
88
-	 *
89
-	 * @param string $backup Sauvegarde chiffrée (générée par backup())
90
-	 * @param int $id_auteur
91
-	 * @param string $pass
92
-	 * @return void
93
-	 */
94
-	public function restore(
95
-		string $backup,
96
-		#[\SensitiveParameter]
97
-		string $password_clair,
98
-		#[\SensitiveParameter]
99
-		string $password_hash,
100
-		int $id_auteur
101
-	): bool {
102
-		if (empty($backup)) {
103
-			return false;
104
-		}
105
-
106
-		$sauvegarde = Chiffrement::dechiffrer($backup, $password_clair);
107
-		$json = json_decode($sauvegarde, true);
108
-		if (!$json) {
109
-			return false;
110
-		}
111
-
112
-		// cela semble une sauvegarde valide
113
-		$cles_potentielles = array_map('base64_decode', $json);
114
-
115
-		// il faut faire une double verif sur secret_des_auth
116
-		// pour s'assurer qu'elle permet bien de decrypter le pass de l'auteur qui fournit la sauvegarde
117
-		// et par extension tous les passwords
118
-		if (!empty($cles_potentielles['secret_des_auth'])) {
119
-			if (!Password::verifier($password_clair, $password_hash, $cles_potentielles['secret_des_auth'])) {
120
-				spip_log("Restauration de la cle `secret_des_auth` par id_auteur $id_auteur erronnee, on ignore", 'chiffrer' . _LOG_INFO_IMPORTANTE);
121
-				unset($cles_potentielles['secret_des_auth']);
122
-			}
123
-		}
124
-
125
-		// on merge les cles pour recuperer les cles manquantes
126
-		$restauration = false;
127
-		foreach ($cles_potentielles as $name => $key) {
128
-			if (!$this->cles->has($name)) {
129
-				$this->cles->set($name, $key);
130
-				spip_log("Restauration de la cle $name par id_auteur $id_auteur", 'chiffrer' . _LOG_INFO_IMPORTANTE);
131
-				$restauration = true;
132
-			}
133
-		}
134
-		return $restauration;
135
-	}
136
-
137
-	private function getKey(string $name, bool $autoInit): ?string {
138
-		if ($this->cles->has($name)) {
139
-			return $this->cles->get($name);
140
-		}
141
-		if ($autoInit) {
142
-			$this->cles->generate($name);
143
-			// si l'ecriture de fichier a bien marche on peut utiliser la cle
144
-			if ($this->save()) {
145
-				return $this->cles->get($name);
146
-			}
147
-			// sinon loger et annule la cle generee car il ne faut pas l'utiliser
148
-			spip_log('Echec ecriture du fichier cle ' . $this->file . " ; impossible de generer une cle $name", 'chiffrer' . _LOG_ERREUR);
149
-			$this->cles->delete($name);
150
-		}
151
-		return null;
152
-	}
153
-
154
-	private function getMetaKey(string $name, bool $autoInit = true): ?string {
155
-		if (!isset($GLOBALS['meta'][$name])) {
156
-			include_spip('base/abstract_sql');
157
-			$GLOBALS['meta'][$name] = sql_getfetsel('valeur', 'spip_meta', 'nom = ' . sql_quote($name, '', 'string'));
158
-		}
159
-		$key = base64_decode($GLOBALS['meta'][$name] ?? '');
160
-		if (strlen($key) === \SODIUM_CRYPTO_SECRETBOX_KEYBYTES) {
161
-			return $key;
162
-		}
163
-		if (!$autoInit) {
164
-			return null;
165
-		}
166
-		$key = Chiffrement::keygen();
167
-		ecrire_meta($name, base64_encode($key), 'non');
168
-		lire_metas(); // au cas ou ecrire_meta() ne fonctionne pas
169
-
170
-		return $key;
171
-	}
172
-
173
-	private function read(): array {
174
-		lire_fichier_securise($this->file, $json);
175
-		if (
176
-			$json
177
-			and $json = \json_decode($json, true)
178
-			and is_array($json)
179
-		) {
180
-			return array_map('base64_decode', $json);
181
-		}
182
-		return [];
183
-	}
17
+    private static array $instances = [];
18
+
19
+    private string $file = _DIR_ETC . 'cles.php';
20
+    private Cles $cles;
21
+
22
+    public static function instance(string $file = ''): self {
23
+        if (empty(self::$instances[$file])) {
24
+            self::$instances[$file] = new self($file);
25
+        }
26
+        return self::$instances[$file];
27
+    }
28
+
29
+    /**
30
+     * Retourne le secret du site (shorthand)
31
+     * @uses self::getSecretSite()
32
+     */
33
+    public static function secret_du_site(): ?string {
34
+        return (self::instance())->getSecretSite();
35
+    }
36
+
37
+    private function __construct(string $file = '') {
38
+        if ($file) {
39
+            $this->file = $file;
40
+        }
41
+        $this->cles = new Cles($this->read());
42
+    }
43
+
44
+    /**
45
+     * Renvoyer le secret du site
46
+     *
47
+     * Le secret du site doit rester aussi secret que possible, et est eternel
48
+     * On ne doit pas l'exporter
49
+     *
50
+     * Le secret est partagé entre une clé disque et une clé bdd
51
+     *
52
+     * @return string
53
+     */
54
+    public function getSecretSite(bool $autoInit = true): ?string {
55
+        $key = $this->getKey('secret_du_site', $autoInit);
56
+        $meta = $this->getMetaKey('secret_du_site', $autoInit);
57
+        // conserve la même longeur.
58
+        return $key ^ $meta;
59
+    }
60
+
61
+    /** Renvoyer le secret des authentifications */
62
+    public function getSecretAuth(bool $autoInit = false): ?string {
63
+        return $this->getKey('secret_des_auth', $autoInit);
64
+    }
65
+    public function save(): bool {
66
+        return ecrire_fichier_securise($this->file, $this->cles->toJson());
67
+    }
68
+
69
+    /**
70
+     * Fournir une sauvegarde chiffree des cles (a l'aide d'une autre clé, comme le pass d'un auteur)
71
+     *
72
+     * @param string $withKey Clé de chiffrage de la sauvegarde
73
+     * @return string Contenu de la sauvegarde chiffrée générée
74
+     */
75
+    public function backup(
76
+        #[\SensitiveParameter]
77
+        string $withKey
78
+    ): string {
79
+        if (count($this->cles)) {
80
+            return Chiffrement::chiffrer($this->cles->toJson(), $withKey);
81
+        }
82
+        return '';
83
+    }
84
+
85
+    /**
86
+     * Restaurer les cles manquantes depuis une sauvegarde chiffree des cles
87
+     * (si la sauvegarde est bien valide)
88
+     *
89
+     * @param string $backup Sauvegarde chiffrée (générée par backup())
90
+     * @param int $id_auteur
91
+     * @param string $pass
92
+     * @return void
93
+     */
94
+    public function restore(
95
+        string $backup,
96
+        #[\SensitiveParameter]
97
+        string $password_clair,
98
+        #[\SensitiveParameter]
99
+        string $password_hash,
100
+        int $id_auteur
101
+    ): bool {
102
+        if (empty($backup)) {
103
+            return false;
104
+        }
105
+
106
+        $sauvegarde = Chiffrement::dechiffrer($backup, $password_clair);
107
+        $json = json_decode($sauvegarde, true);
108
+        if (!$json) {
109
+            return false;
110
+        }
111
+
112
+        // cela semble une sauvegarde valide
113
+        $cles_potentielles = array_map('base64_decode', $json);
114
+
115
+        // il faut faire une double verif sur secret_des_auth
116
+        // pour s'assurer qu'elle permet bien de decrypter le pass de l'auteur qui fournit la sauvegarde
117
+        // et par extension tous les passwords
118
+        if (!empty($cles_potentielles['secret_des_auth'])) {
119
+            if (!Password::verifier($password_clair, $password_hash, $cles_potentielles['secret_des_auth'])) {
120
+                spip_log("Restauration de la cle `secret_des_auth` par id_auteur $id_auteur erronnee, on ignore", 'chiffrer' . _LOG_INFO_IMPORTANTE);
121
+                unset($cles_potentielles['secret_des_auth']);
122
+            }
123
+        }
124
+
125
+        // on merge les cles pour recuperer les cles manquantes
126
+        $restauration = false;
127
+        foreach ($cles_potentielles as $name => $key) {
128
+            if (!$this->cles->has($name)) {
129
+                $this->cles->set($name, $key);
130
+                spip_log("Restauration de la cle $name par id_auteur $id_auteur", 'chiffrer' . _LOG_INFO_IMPORTANTE);
131
+                $restauration = true;
132
+            }
133
+        }
134
+        return $restauration;
135
+    }
136
+
137
+    private function getKey(string $name, bool $autoInit): ?string {
138
+        if ($this->cles->has($name)) {
139
+            return $this->cles->get($name);
140
+        }
141
+        if ($autoInit) {
142
+            $this->cles->generate($name);
143
+            // si l'ecriture de fichier a bien marche on peut utiliser la cle
144
+            if ($this->save()) {
145
+                return $this->cles->get($name);
146
+            }
147
+            // sinon loger et annule la cle generee car il ne faut pas l'utiliser
148
+            spip_log('Echec ecriture du fichier cle ' . $this->file . " ; impossible de generer une cle $name", 'chiffrer' . _LOG_ERREUR);
149
+            $this->cles->delete($name);
150
+        }
151
+        return null;
152
+    }
153
+
154
+    private function getMetaKey(string $name, bool $autoInit = true): ?string {
155
+        if (!isset($GLOBALS['meta'][$name])) {
156
+            include_spip('base/abstract_sql');
157
+            $GLOBALS['meta'][$name] = sql_getfetsel('valeur', 'spip_meta', 'nom = ' . sql_quote($name, '', 'string'));
158
+        }
159
+        $key = base64_decode($GLOBALS['meta'][$name] ?? '');
160
+        if (strlen($key) === \SODIUM_CRYPTO_SECRETBOX_KEYBYTES) {
161
+            return $key;
162
+        }
163
+        if (!$autoInit) {
164
+            return null;
165
+        }
166
+        $key = Chiffrement::keygen();
167
+        ecrire_meta($name, base64_encode($key), 'non');
168
+        lire_metas(); // au cas ou ecrire_meta() ne fonctionne pas
169
+
170
+        return $key;
171
+    }
172
+
173
+    private function read(): array {
174
+        lire_fichier_securise($this->file, $json);
175
+        if (
176
+            $json
177
+            and $json = \json_decode($json, true)
178
+            and is_array($json)
179
+        ) {
180
+            return array_map('base64_decode', $json);
181
+        }
182
+        return [];
183
+    }
184 184
 }
Please login to merge, or discard this patch.
Spacing   +5 added lines, -5 removed lines patch added patch discarded remove patch
@@ -16,7 +16,7 @@  discard block
 block discarded – undo
16 16
 final class SpipCles {
17 17
 	private static array $instances = [];
18 18
 
19
-	private string $file = _DIR_ETC . 'cles.php';
19
+	private string $file = _DIR_ETC.'cles.php';
20 20
 	private Cles $cles;
21 21
 
22 22
 	public static function instance(string $file = ''): self {
@@ -117,7 +117,7 @@  discard block
 block discarded – undo
117 117
 		// et par extension tous les passwords
118 118
 		if (!empty($cles_potentielles['secret_des_auth'])) {
119 119
 			if (!Password::verifier($password_clair, $password_hash, $cles_potentielles['secret_des_auth'])) {
120
-				spip_log("Restauration de la cle `secret_des_auth` par id_auteur $id_auteur erronnee, on ignore", 'chiffrer' . _LOG_INFO_IMPORTANTE);
120
+				spip_log("Restauration de la cle `secret_des_auth` par id_auteur $id_auteur erronnee, on ignore", 'chiffrer'._LOG_INFO_IMPORTANTE);
121 121
 				unset($cles_potentielles['secret_des_auth']);
122 122
 			}
123 123
 		}
@@ -127,7 +127,7 @@  discard block
 block discarded – undo
127 127
 		foreach ($cles_potentielles as $name => $key) {
128 128
 			if (!$this->cles->has($name)) {
129 129
 				$this->cles->set($name, $key);
130
-				spip_log("Restauration de la cle $name par id_auteur $id_auteur", 'chiffrer' . _LOG_INFO_IMPORTANTE);
130
+				spip_log("Restauration de la cle $name par id_auteur $id_auteur", 'chiffrer'._LOG_INFO_IMPORTANTE);
131 131
 				$restauration = true;
132 132
 			}
133 133
 		}
@@ -145,7 +145,7 @@  discard block
 block discarded – undo
145 145
 				return $this->cles->get($name);
146 146
 			}
147 147
 			// sinon loger et annule la cle generee car il ne faut pas l'utiliser
148
-			spip_log('Echec ecriture du fichier cle ' . $this->file . " ; impossible de generer une cle $name", 'chiffrer' . _LOG_ERREUR);
148
+			spip_log('Echec ecriture du fichier cle '.$this->file." ; impossible de generer une cle $name", 'chiffrer'._LOG_ERREUR);
149 149
 			$this->cles->delete($name);
150 150
 		}
151 151
 		return null;
@@ -154,7 +154,7 @@  discard block
 block discarded – undo
154 154
 	private function getMetaKey(string $name, bool $autoInit = true): ?string {
155 155
 		if (!isset($GLOBALS['meta'][$name])) {
156 156
 			include_spip('base/abstract_sql');
157
-			$GLOBALS['meta'][$name] = sql_getfetsel('valeur', 'spip_meta', 'nom = ' . sql_quote($name, '', 'string'));
157
+			$GLOBALS['meta'][$name] = sql_getfetsel('valeur', 'spip_meta', 'nom = '.sql_quote($name, '', 'string'));
158 158
 		}
159 159
 		$key = base64_decode($GLOBALS['meta'][$name] ?? '');
160 160
 		if (strlen($key) === \SODIUM_CRYPTO_SECRETBOX_KEYBYTES) {
Please login to merge, or discard this patch.
ecrire/inc/modifier.php 2 patches
Indentation   +261 added lines, -261 removed lines patch added patch discarded remove patch
@@ -17,7 +17,7 @@  discard block
 block discarded – undo
17 17
  **/
18 18
 
19 19
 if (!defined('_ECRIRE_INC_VERSION')) {
20
-	return;
20
+    return;
21 21
 }
22 22
 
23 23
 /**
@@ -39,28 +39,28 @@  discard block
 block discarded – undo
39 39
  *     Tableau des champs et valeurs collectées
40 40
  */
41 41
 function collecter_requests($include_list, $exclude_list = [], $set = null, $tous = false) {
42
-	$c = $set;
43
-	if (!$c) {
44
-		$c = [];
45
-		foreach ($include_list as $champ) {
46
-			// on ne collecte que les champs reellement envoyes par defaut.
47
-			// le cas d'un envoi de valeur NULL peut du coup poser probleme.
48
-			$val = _request($champ);
49
-			if ($tous or $val !== null) {
50
-				$c[$champ] = $val;
51
-			}
52
-		}
53
-		// on ajoute toujours la lang en saisie possible
54
-		// meme si pas prevu au depart pour l'objet concerne
55
-		if ($l = _request('changer_lang')) {
56
-			$c['lang'] = $l;
57
-		}
58
-	}
59
-	foreach ($exclude_list as $champ) {
60
-		unset($c[$champ]);
61
-	}
62
-
63
-	return $c;
42
+    $c = $set;
43
+    if (!$c) {
44
+        $c = [];
45
+        foreach ($include_list as $champ) {
46
+            // on ne collecte que les champs reellement envoyes par defaut.
47
+            // le cas d'un envoi de valeur NULL peut du coup poser probleme.
48
+            $val = _request($champ);
49
+            if ($tous or $val !== null) {
50
+                $c[$champ] = $val;
51
+            }
52
+        }
53
+        // on ajoute toujours la lang en saisie possible
54
+        // meme si pas prevu au depart pour l'objet concerne
55
+        if ($l = _request('changer_lang')) {
56
+            $c['lang'] = $l;
57
+        }
58
+    }
59
+    foreach ($exclude_list as $champ) {
60
+        unset($c[$champ]);
61
+    }
62
+
63
+    return $c;
64 64
 }
65 65
 
66 66
 /**
@@ -97,242 +97,242 @@  discard block
 block discarded – undo
97 97
  *     - chaîne : Texte d'un message d'erreur
98 98
  */
99 99
 function objet_modifier_champs($objet, $id_objet, $options, $c = null, $serveur = '') {
100
-	if (!$id_objet = intval($id_objet)) {
101
-		spip_log('Erreur $id_objet non defini', 'warn');
102
-
103
-		return _T('erreur_technique_enregistrement_impossible');
104
-	}
105
-
106
-	include_spip('inc/filtres');
107
-
108
-	$table_objet = table_objet($objet, $serveur);
109
-	$spip_table_objet = table_objet_sql($objet, $serveur);
110
-	$id_table_objet = id_table_objet($objet, $serveur);
111
-	$trouver_table = charger_fonction('trouver_table', 'base');
112
-	$desc = $trouver_table($spip_table_objet, $serveur);
113
-
114
-	// Appels incomplets (sans $c)
115
-	if (!is_array($c)) {
116
-		spip_log('erreur appel objet_modifier_champs(' . $objet . '), manque $c');
117
-
118
-		return _T('erreur_technique_enregistrement_impossible');
119
-	}
120
-
121
-	// Securite : certaines variables ne sont jamais acceptees ici
122
-	// car elles ne relevent pas de autoriser(xxx, modifier) ;
123
-	// il faut passer par instituer_XX()
124
-	// TODO: faut-il passer ces variables interdites
125
-	// dans un fichier de description separe ?
126
-	unset($c['statut']);
127
-	unset($c['id_parent']);
128
-	unset($c['id_rubrique']);
129
-	unset($c['id_secteur']);
130
-
131
-	// Gerer les champs non vides
132
-	if (isset($options['nonvide']) and is_array($options['nonvide'])) {
133
-		foreach ($options['nonvide'] as $champ => $sinon) {
134
-			if (isset($c[$champ]) and $c[$champ] === '') {
135
-				$c[$champ] = $sinon;
136
-			}
137
-		}
138
-	}
139
-
140
-	// N'accepter que les champs qui existent dans la table
141
-	$champs = array_intersect_key($c, $desc['field']);
142
-	// et dont la valeur n'est pas null
143
-	$champs = array_filter($champs, static function ($var) {
144
-		return $var !== null;
145
-	});
146
-	// TODO: ici aussi on peut valider les contenus
147
-	// en fonction du type
148
-
149
-	// Nettoyer les valeurs
150
-	$champs = array_map('corriger_caracteres', $champs);
151
-
152
-	// On récupère l'état avant toute modification
153
-	$row = sql_fetsel('*', $spip_table_objet, $id_table_objet . '=' . $id_objet);
154
-
155
-	// Envoyer aux plugins
156
-	$champs = pipeline(
157
-		'pre_edition',
158
-		[
159
-			'args' => [
160
-				'table' => $spip_table_objet, // compatibilite
161
-				'table_objet' => $table_objet,
162
-				'spip_table_objet' => $spip_table_objet,
163
-				'desc' => $desc,
164
-				'type' => $objet,
165
-				'id_objet' => $id_objet,
166
-				'data' => $options['data'] ?? null,
167
-				'champs' => $options['champs'] ?? [], // [doc] c'est quoi ?
168
-				'champs_anciens' => $row, // état du contenu avant modif
169
-				'serveur' => $serveur,
170
-				'action' => $options['action'] ?? 'modifier'
171
-			],
172
-			'data' => $champs
173
-		]
174
-	);
175
-
176
-	if (!$champs) {
177
-		return false;
178
-	}
179
-
180
-
181
-	// marquer le fait que l'objet est travaille par toto a telle date
182
-	include_spip('inc/config');
183
-	if (lire_config('articles_modif', 'non') !== 'non') {
184
-		include_spip('inc/drapeau_edition');
185
-		signale_edition($id_objet, $GLOBALS['visiteur_session'], $objet);
186
-	}
187
-
188
-	// Verifier si les mises a jour sont pertinentes, datees, en conflit etc
189
-	include_spip('inc/editer');
190
-	if (!isset($options['data']) or is_null($options['data'])) {
191
-		$options['data'] = &$_POST;
192
-	}
193
-	$conflits = controler_md5($champs, $options['data'], $objet, $id_objet, $serveur);
194
-	// cas hypothetique : normalement inc/editer verifie en amont le conflit edition
195
-	// et gere l'interface
196
-	// ici on ne renvoie donc qu'un messsage d'erreur, au cas ou on y arrive quand meme
197
-	if ($conflits) {
198
-		return _T('titre_conflit_edition');
199
-	}
200
-
201
-	if ($champs) {
202
-		// cas particulier de la langue : passer par instituer_langue_objet
203
-		if (isset($champs['lang'])) {
204
-			if ($changer_lang = $champs['lang']) {
205
-				$id_rubrique = 0;
206
-				if (isset($desc['field']['id_rubrique'])) {
207
-					$parent = ($objet == 'rubrique') ? 'id_parent' : 'id_rubrique';
208
-					$id_rubrique = sql_getfetsel($parent, $spip_table_objet, "$id_table_objet=" . intval($id_objet));
209
-				}
210
-				$instituer_langue_objet = charger_fonction('instituer_langue_objet', 'action');
211
-				$champs['lang'] = $instituer_langue_objet($objet, $id_objet, $id_rubrique, $changer_lang, $serveur);
212
-			}
213
-			// on laisse 'lang' dans $champs,
214
-			// ca permet de passer dans le pipeline post_edition et de journaliser
215
-			// et ca ne gene pas qu'on refasse un sql_updateq dessus apres l'avoir
216
-			// deja pris en compte
217
-		}
218
-
219
-		// la modif peut avoir lieu
220
-
221
-		// faut-il ajouter date_modif ?
222
-		if (
223
-			!empty($options['date_modif'])
224
-			and !isset($champs[$options['date_modif']])
225
-		) {
226
-			$champs[$options['date_modif']] = date('Y-m-d H:i:s');
227
-		}
228
-
229
-		// allez on commit la modif
230
-		sql_updateq($spip_table_objet, $champs, "$id_table_objet=" . intval($id_objet), [], $serveur);
231
-
232
-		// on verifie si elle est bien passee
233
-		$moof = sql_fetsel(
234
-			array_keys($champs),
235
-			$spip_table_objet,
236
-			"$id_table_objet=" . intval($id_objet),
237
-			[],
238
-			[],
239
-			'',
240
-			[],
241
-			$serveur
242
-		);
243
-		// si difference entre les champs, reperer les champs mal enregistres
244
-		if ($moof != $champs) {
245
-			$liste = [];
246
-			foreach ($moof as $k => $v) {
247
-				if (
248
-					$v !== $champs[$k]
249
-					// ne pas alerter si le champ est numerique est que les valeurs sont equivalentes
250
-					and (!is_numeric($v) or intval($v) !== intval($champs[$k]))
251
-					// ne pas alerter si le champ est date, qu'on a envoye une valeur vide et qu'on recupere une date nulle
252
-					and (strlen($champs[$k]) or !in_array($v, ['0000-00-00 00:00:00', '0000-00-00']))
253
-				) {
254
-					$liste[] = $k;
255
-					$conflits[$k]['post'] = $champs[$k];
256
-					$conflits[$k]['save'] = $v;
257
-
258
-					// cas specifique MySQL+emoji : si l'un est la
259
-					// conversion utf8_noplanes de l'autre alors c'est OK
260
-					if (defined('_MYSQL_NOPLANES') && _MYSQL_NOPLANES) {
261
-						include_spip('inc/charsets');
262
-						if ($v == utf8_noplanes($champs[$k])) {
263
-							array_pop($liste);
264
-						}
265
-					}
266
-				}
267
-			}
268
-			// si un champ n'a pas ete correctement enregistre, loger et retourner une erreur
269
-			// c'est un cas exceptionnel
270
-			if (count($liste)) {
271
-				spip_log(
272
-					"Erreur enregistrement en base $objet/$id_objet champs :" . var_export($conflits, true),
273
-					'modifier.' . _LOG_CRITIQUE
274
-				);
275
-
276
-				return _T(
277
-					'erreur_technique_enregistrement_champs',
278
-					['champs' => "<i>'" . implode("'</i>,<i>'", $liste) . "'</i>"]
279
-				);
280
-			}
281
-		}
282
-
283
-		// Invalider les caches
284
-		if (isset($options['invalideur']) and $options['invalideur']) {
285
-			include_spip('inc/invalideur');
286
-			if (is_array($options['invalideur'])) {
287
-				array_map('suivre_invalideur', $options['invalideur']);
288
-			} else {
289
-				suivre_invalideur($options['invalideur']);
290
-			}
291
-		}
292
-
293
-		// Notifications, gestion des revisions...
294
-		// en standard, appelle |nouvelle_revision ci-dessous
295
-		pipeline(
296
-			'post_edition',
297
-			[
298
-				'args' => [
299
-					'table' => $spip_table_objet,
300
-					'table_objet' => $table_objet,
301
-					'spip_table_objet' => $spip_table_objet,
302
-					'desc' => $desc,
303
-					'type' => $objet,
304
-					'id_objet' => $id_objet,
305
-					'champs' => $options['champs'] ?? [], // [doc] kesako ?
306
-					'champs_anciens' => $row, // état du contenu avant modif
307
-					'serveur' => $serveur,
308
-					'action' => $options['action'] ?? 'modifier'
309
-				],
310
-				'data' => $champs
311
-			]
312
-		);
313
-	}
314
-
315
-	// journaliser l'affaire
316
-	// message a affiner :-)
317
-	include_spip('inc/filtres_mini');
318
-	$qui = '';
319
-	if (!empty($GLOBALS['visiteur_session']['id_auteur'])) {
320
-		$qui .= ' #id_auteur:' . $GLOBALS['visiteur_session']['id_auteur'] . '#';
321
-	}
322
-	if (!empty($GLOBALS['visiteur_session']['nom'])) {
323
-		$qui .= ' #nom:' . $GLOBALS['visiteur_session']['nom'] . '#';
324
-	}
325
-	if ($qui == '') {
326
-		$qui = '#ip:' . $GLOBALS['ip'] . '#';
327
-	}
328
-	journal(_L($qui . ' a édité ' . $objet . ' ' . $id_objet . ' (' . join(
329
-		'+',
330
-		array_diff(array_keys($champs), ['date_modif'])
331
-	) . ')'), [
332
-		'faire' => 'modifier',
333
-		'quoi' => $objet,
334
-		'id' => $id_objet
335
-	]);
336
-
337
-	return '';
100
+    if (!$id_objet = intval($id_objet)) {
101
+        spip_log('Erreur $id_objet non defini', 'warn');
102
+
103
+        return _T('erreur_technique_enregistrement_impossible');
104
+    }
105
+
106
+    include_spip('inc/filtres');
107
+
108
+    $table_objet = table_objet($objet, $serveur);
109
+    $spip_table_objet = table_objet_sql($objet, $serveur);
110
+    $id_table_objet = id_table_objet($objet, $serveur);
111
+    $trouver_table = charger_fonction('trouver_table', 'base');
112
+    $desc = $trouver_table($spip_table_objet, $serveur);
113
+
114
+    // Appels incomplets (sans $c)
115
+    if (!is_array($c)) {
116
+        spip_log('erreur appel objet_modifier_champs(' . $objet . '), manque $c');
117
+
118
+        return _T('erreur_technique_enregistrement_impossible');
119
+    }
120
+
121
+    // Securite : certaines variables ne sont jamais acceptees ici
122
+    // car elles ne relevent pas de autoriser(xxx, modifier) ;
123
+    // il faut passer par instituer_XX()
124
+    // TODO: faut-il passer ces variables interdites
125
+    // dans un fichier de description separe ?
126
+    unset($c['statut']);
127
+    unset($c['id_parent']);
128
+    unset($c['id_rubrique']);
129
+    unset($c['id_secteur']);
130
+
131
+    // Gerer les champs non vides
132
+    if (isset($options['nonvide']) and is_array($options['nonvide'])) {
133
+        foreach ($options['nonvide'] as $champ => $sinon) {
134
+            if (isset($c[$champ]) and $c[$champ] === '') {
135
+                $c[$champ] = $sinon;
136
+            }
137
+        }
138
+    }
139
+
140
+    // N'accepter que les champs qui existent dans la table
141
+    $champs = array_intersect_key($c, $desc['field']);
142
+    // et dont la valeur n'est pas null
143
+    $champs = array_filter($champs, static function ($var) {
144
+        return $var !== null;
145
+    });
146
+    // TODO: ici aussi on peut valider les contenus
147
+    // en fonction du type
148
+
149
+    // Nettoyer les valeurs
150
+    $champs = array_map('corriger_caracteres', $champs);
151
+
152
+    // On récupère l'état avant toute modification
153
+    $row = sql_fetsel('*', $spip_table_objet, $id_table_objet . '=' . $id_objet);
154
+
155
+    // Envoyer aux plugins
156
+    $champs = pipeline(
157
+        'pre_edition',
158
+        [
159
+            'args' => [
160
+                'table' => $spip_table_objet, // compatibilite
161
+                'table_objet' => $table_objet,
162
+                'spip_table_objet' => $spip_table_objet,
163
+                'desc' => $desc,
164
+                'type' => $objet,
165
+                'id_objet' => $id_objet,
166
+                'data' => $options['data'] ?? null,
167
+                'champs' => $options['champs'] ?? [], // [doc] c'est quoi ?
168
+                'champs_anciens' => $row, // état du contenu avant modif
169
+                'serveur' => $serveur,
170
+                'action' => $options['action'] ?? 'modifier'
171
+            ],
172
+            'data' => $champs
173
+        ]
174
+    );
175
+
176
+    if (!$champs) {
177
+        return false;
178
+    }
179
+
180
+
181
+    // marquer le fait que l'objet est travaille par toto a telle date
182
+    include_spip('inc/config');
183
+    if (lire_config('articles_modif', 'non') !== 'non') {
184
+        include_spip('inc/drapeau_edition');
185
+        signale_edition($id_objet, $GLOBALS['visiteur_session'], $objet);
186
+    }
187
+
188
+    // Verifier si les mises a jour sont pertinentes, datees, en conflit etc
189
+    include_spip('inc/editer');
190
+    if (!isset($options['data']) or is_null($options['data'])) {
191
+        $options['data'] = &$_POST;
192
+    }
193
+    $conflits = controler_md5($champs, $options['data'], $objet, $id_objet, $serveur);
194
+    // cas hypothetique : normalement inc/editer verifie en amont le conflit edition
195
+    // et gere l'interface
196
+    // ici on ne renvoie donc qu'un messsage d'erreur, au cas ou on y arrive quand meme
197
+    if ($conflits) {
198
+        return _T('titre_conflit_edition');
199
+    }
200
+
201
+    if ($champs) {
202
+        // cas particulier de la langue : passer par instituer_langue_objet
203
+        if (isset($champs['lang'])) {
204
+            if ($changer_lang = $champs['lang']) {
205
+                $id_rubrique = 0;
206
+                if (isset($desc['field']['id_rubrique'])) {
207
+                    $parent = ($objet == 'rubrique') ? 'id_parent' : 'id_rubrique';
208
+                    $id_rubrique = sql_getfetsel($parent, $spip_table_objet, "$id_table_objet=" . intval($id_objet));
209
+                }
210
+                $instituer_langue_objet = charger_fonction('instituer_langue_objet', 'action');
211
+                $champs['lang'] = $instituer_langue_objet($objet, $id_objet, $id_rubrique, $changer_lang, $serveur);
212
+            }
213
+            // on laisse 'lang' dans $champs,
214
+            // ca permet de passer dans le pipeline post_edition et de journaliser
215
+            // et ca ne gene pas qu'on refasse un sql_updateq dessus apres l'avoir
216
+            // deja pris en compte
217
+        }
218
+
219
+        // la modif peut avoir lieu
220
+
221
+        // faut-il ajouter date_modif ?
222
+        if (
223
+            !empty($options['date_modif'])
224
+            and !isset($champs[$options['date_modif']])
225
+        ) {
226
+            $champs[$options['date_modif']] = date('Y-m-d H:i:s');
227
+        }
228
+
229
+        // allez on commit la modif
230
+        sql_updateq($spip_table_objet, $champs, "$id_table_objet=" . intval($id_objet), [], $serveur);
231
+
232
+        // on verifie si elle est bien passee
233
+        $moof = sql_fetsel(
234
+            array_keys($champs),
235
+            $spip_table_objet,
236
+            "$id_table_objet=" . intval($id_objet),
237
+            [],
238
+            [],
239
+            '',
240
+            [],
241
+            $serveur
242
+        );
243
+        // si difference entre les champs, reperer les champs mal enregistres
244
+        if ($moof != $champs) {
245
+            $liste = [];
246
+            foreach ($moof as $k => $v) {
247
+                if (
248
+                    $v !== $champs[$k]
249
+                    // ne pas alerter si le champ est numerique est que les valeurs sont equivalentes
250
+                    and (!is_numeric($v) or intval($v) !== intval($champs[$k]))
251
+                    // ne pas alerter si le champ est date, qu'on a envoye une valeur vide et qu'on recupere une date nulle
252
+                    and (strlen($champs[$k]) or !in_array($v, ['0000-00-00 00:00:00', '0000-00-00']))
253
+                ) {
254
+                    $liste[] = $k;
255
+                    $conflits[$k]['post'] = $champs[$k];
256
+                    $conflits[$k]['save'] = $v;
257
+
258
+                    // cas specifique MySQL+emoji : si l'un est la
259
+                    // conversion utf8_noplanes de l'autre alors c'est OK
260
+                    if (defined('_MYSQL_NOPLANES') && _MYSQL_NOPLANES) {
261
+                        include_spip('inc/charsets');
262
+                        if ($v == utf8_noplanes($champs[$k])) {
263
+                            array_pop($liste);
264
+                        }
265
+                    }
266
+                }
267
+            }
268
+            // si un champ n'a pas ete correctement enregistre, loger et retourner une erreur
269
+            // c'est un cas exceptionnel
270
+            if (count($liste)) {
271
+                spip_log(
272
+                    "Erreur enregistrement en base $objet/$id_objet champs :" . var_export($conflits, true),
273
+                    'modifier.' . _LOG_CRITIQUE
274
+                );
275
+
276
+                return _T(
277
+                    'erreur_technique_enregistrement_champs',
278
+                    ['champs' => "<i>'" . implode("'</i>,<i>'", $liste) . "'</i>"]
279
+                );
280
+            }
281
+        }
282
+
283
+        // Invalider les caches
284
+        if (isset($options['invalideur']) and $options['invalideur']) {
285
+            include_spip('inc/invalideur');
286
+            if (is_array($options['invalideur'])) {
287
+                array_map('suivre_invalideur', $options['invalideur']);
288
+            } else {
289
+                suivre_invalideur($options['invalideur']);
290
+            }
291
+        }
292
+
293
+        // Notifications, gestion des revisions...
294
+        // en standard, appelle |nouvelle_revision ci-dessous
295
+        pipeline(
296
+            'post_edition',
297
+            [
298
+                'args' => [
299
+                    'table' => $spip_table_objet,
300
+                    'table_objet' => $table_objet,
301
+                    'spip_table_objet' => $spip_table_objet,
302
+                    'desc' => $desc,
303
+                    'type' => $objet,
304
+                    'id_objet' => $id_objet,
305
+                    'champs' => $options['champs'] ?? [], // [doc] kesako ?
306
+                    'champs_anciens' => $row, // état du contenu avant modif
307
+                    'serveur' => $serveur,
308
+                    'action' => $options['action'] ?? 'modifier'
309
+                ],
310
+                'data' => $champs
311
+            ]
312
+        );
313
+    }
314
+
315
+    // journaliser l'affaire
316
+    // message a affiner :-)
317
+    include_spip('inc/filtres_mini');
318
+    $qui = '';
319
+    if (!empty($GLOBALS['visiteur_session']['id_auteur'])) {
320
+        $qui .= ' #id_auteur:' . $GLOBALS['visiteur_session']['id_auteur'] . '#';
321
+    }
322
+    if (!empty($GLOBALS['visiteur_session']['nom'])) {
323
+        $qui .= ' #nom:' . $GLOBALS['visiteur_session']['nom'] . '#';
324
+    }
325
+    if ($qui == '') {
326
+        $qui = '#ip:' . $GLOBALS['ip'] . '#';
327
+    }
328
+    journal(_L($qui . ' a édité ' . $objet . ' ' . $id_objet . ' (' . join(
329
+        '+',
330
+        array_diff(array_keys($champs), ['date_modif'])
331
+    ) . ')'), [
332
+        'faire' => 'modifier',
333
+        'quoi' => $objet,
334
+        'id' => $id_objet
335
+    ]);
336
+
337
+    return '';
338 338
 }
Please login to merge, or discard this patch.
Spacing   +14 added lines, -14 removed lines patch added patch discarded remove patch
@@ -113,7 +113,7 @@  discard block
 block discarded – undo
113 113
 
114 114
 	// Appels incomplets (sans $c)
115 115
 	if (!is_array($c)) {
116
-		spip_log('erreur appel objet_modifier_champs(' . $objet . '), manque $c');
116
+		spip_log('erreur appel objet_modifier_champs('.$objet.'), manque $c');
117 117
 
118 118
 		return _T('erreur_technique_enregistrement_impossible');
119 119
 	}
@@ -140,7 +140,7 @@  discard block
 block discarded – undo
140 140
 	// N'accepter que les champs qui existent dans la table
141 141
 	$champs = array_intersect_key($c, $desc['field']);
142 142
 	// et dont la valeur n'est pas null
143
-	$champs = array_filter($champs, static function ($var) {
143
+	$champs = array_filter($champs, static function($var) {
144 144
 		return $var !== null;
145 145
 	});
146 146
 	// TODO: ici aussi on peut valider les contenus
@@ -150,7 +150,7 @@  discard block
 block discarded – undo
150 150
 	$champs = array_map('corriger_caracteres', $champs);
151 151
 
152 152
 	// On récupère l'état avant toute modification
153
-	$row = sql_fetsel('*', $spip_table_objet, $id_table_objet . '=' . $id_objet);
153
+	$row = sql_fetsel('*', $spip_table_objet, $id_table_objet.'='.$id_objet);
154 154
 
155 155
 	// Envoyer aux plugins
156 156
 	$champs = pipeline(
@@ -205,7 +205,7 @@  discard block
 block discarded – undo
205 205
 				$id_rubrique = 0;
206 206
 				if (isset($desc['field']['id_rubrique'])) {
207 207
 					$parent = ($objet == 'rubrique') ? 'id_parent' : 'id_rubrique';
208
-					$id_rubrique = sql_getfetsel($parent, $spip_table_objet, "$id_table_objet=" . intval($id_objet));
208
+					$id_rubrique = sql_getfetsel($parent, $spip_table_objet, "$id_table_objet=".intval($id_objet));
209 209
 				}
210 210
 				$instituer_langue_objet = charger_fonction('instituer_langue_objet', 'action');
211 211
 				$champs['lang'] = $instituer_langue_objet($objet, $id_objet, $id_rubrique, $changer_lang, $serveur);
@@ -227,13 +227,13 @@  discard block
 block discarded – undo
227 227
 		}
228 228
 
229 229
 		// allez on commit la modif
230
-		sql_updateq($spip_table_objet, $champs, "$id_table_objet=" . intval($id_objet), [], $serveur);
230
+		sql_updateq($spip_table_objet, $champs, "$id_table_objet=".intval($id_objet), [], $serveur);
231 231
 
232 232
 		// on verifie si elle est bien passee
233 233
 		$moof = sql_fetsel(
234 234
 			array_keys($champs),
235 235
 			$spip_table_objet,
236
-			"$id_table_objet=" . intval($id_objet),
236
+			"$id_table_objet=".intval($id_objet),
237 237
 			[],
238 238
 			[],
239 239
 			'',
@@ -269,13 +269,13 @@  discard block
 block discarded – undo
269 269
 			// c'est un cas exceptionnel
270 270
 			if (count($liste)) {
271 271
 				spip_log(
272
-					"Erreur enregistrement en base $objet/$id_objet champs :" . var_export($conflits, true),
273
-					'modifier.' . _LOG_CRITIQUE
272
+					"Erreur enregistrement en base $objet/$id_objet champs :".var_export($conflits, true),
273
+					'modifier.'._LOG_CRITIQUE
274 274
 				);
275 275
 
276 276
 				return _T(
277 277
 					'erreur_technique_enregistrement_champs',
278
-					['champs' => "<i>'" . implode("'</i>,<i>'", $liste) . "'</i>"]
278
+					['champs' => "<i>'".implode("'</i>,<i>'", $liste)."'</i>"]
279 279
 				);
280 280
 			}
281 281
 		}
@@ -317,18 +317,18 @@  discard block
 block discarded – undo
317 317
 	include_spip('inc/filtres_mini');
318 318
 	$qui = '';
319 319
 	if (!empty($GLOBALS['visiteur_session']['id_auteur'])) {
320
-		$qui .= ' #id_auteur:' . $GLOBALS['visiteur_session']['id_auteur'] . '#';
320
+		$qui .= ' #id_auteur:'.$GLOBALS['visiteur_session']['id_auteur'].'#';
321 321
 	}
322 322
 	if (!empty($GLOBALS['visiteur_session']['nom'])) {
323
-		$qui .= ' #nom:' . $GLOBALS['visiteur_session']['nom'] . '#';
323
+		$qui .= ' #nom:'.$GLOBALS['visiteur_session']['nom'].'#';
324 324
 	}
325 325
 	if ($qui == '') {
326
-		$qui = '#ip:' . $GLOBALS['ip'] . '#';
326
+		$qui = '#ip:'.$GLOBALS['ip'].'#';
327 327
 	}
328
-	journal(_L($qui . ' a édité ' . $objet . ' ' . $id_objet . ' (' . join(
328
+	journal(_L($qui.' a édité '.$objet.' '.$id_objet.' ('.join(
329 329
 		'+',
330 330
 		array_diff(array_keys($champs), ['date_modif'])
331
-	) . ')'), [
331
+	).')'), [
332 332
 		'faire' => 'modifier',
333 333
 		'quoi' => $objet,
334 334
 		'id' => $id_objet
Please login to merge, or discard this patch.
ecrire/auth/spip.php 3 patches
Indentation   +412 added lines, -412 removed lines patch added patch discarded remove patch
@@ -19,7 +19,7 @@  discard block
 block discarded – undo
19 19
 use Spip\Chiffrer\SpipCles;
20 20
 
21 21
 if (!defined('_ECRIRE_INC_VERSION')) {
22
-	return;
22
+    return;
23 23
 }
24 24
 
25 25
 /**
@@ -34,170 +34,170 @@  discard block
 block discarded – undo
34 34
  */
35 35
 function auth_spip_dist($login, $pass, $serveur = '', $phpauth = false) {
36 36
 
37
-	// retrouver le login
38
-	$login = auth_spip_retrouver_login($login);
39
-	// login inconnu, n'allons pas plus loin
40
-	if (!$login) {
41
-		return [];
42
-	}
43
-
44
-	$md5pass = '';
45
-	$shapass = $shanext = '';
46
-	$auteur_peut_sauver_cles = false;
47
-
48
-	if ($pass) {
49
-		$row = sql_fetsel(
50
-			'*',
51
-			'spip_auteurs',
52
-			'login=' . sql_quote($login, $serveur, 'text') . " AND statut<>'5poubelle'",
53
-			'',
54
-			'',
55
-			'',
56
-			'',
57
-			$serveur
58
-		);
59
-
60
-		// lever un flag si cet auteur peut sauver les cles
61
-		if ($row['statut'] === '0minirezo' and $row['webmestre'] === 'oui' and isset($row['backup_cles'])) {
62
-			$auteur_peut_sauver_cles = true;
63
-		}
64
-	}
65
-
66
-	// login inexistant ou mot de passe vide
67
-	if (!$pass or !$row) {
68
-		return [];
69
-	}
70
-
71
-	include_spip('inc/chiffrer');
72
-	$cles = SpipCles::instance();
73
-	$secret = $cles->getSecretAuth();
74
-
75
-	$hash = null;
76
-	switch (strlen($row['pass'])) {
77
-		// legacy = md5 ou sha256
78
-		case 32:
79
-			// tres anciens mots de passe encodes en md5(alea.pass)
80
-			$hash = md5($row['alea_actuel'] . $pass);
81
-			$methode = 'md5';
82
-		case 64:
83
-			if (empty($hash)) {
84
-				// anciens mots de passe encodes en sha256(alea.pass)
85
-				include_spip('auth/sha256.inc');
86
-				$hash = spip_sha256($row['alea_actuel'] . $pass);
87
-				$methode = 'sha256';
88
-			}
89
-			if ($row['pass'] === $hash) {
90
-				spip_log("validation du mot de passe pour l'auteur #" . $row['id_auteur'] . " $login via $methode", 'auth' . _LOG_DEBUG);
91
-				// ce n'est pas cense arriver, mais si jamais c'est un backup inutilisable, il faut le nettoyer pour ne pas bloquer la creation d'une nouvelle cle d'auth
92
-				if (!empty($row['backup_cles'])) {
93
-					sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur=' . intval($row['id_auteur']));
94
-				}
95
-				break;
96
-			}
97
-
98
-		// on teste la methode par defaut, au cas ou ce serait un pass moderne qui a la malchance d'etre en 64char de long
99
-
100
-		case 60:
101
-		case 98:
102
-		default:
103
-			// doit-on restaurer un backup des cles ?
104
-			// si on a le bon pass on peut decoder le backup, retrouver la cle, et du coup valider le pass
105
-			if (
106
-				!$secret
107
-				and $auteur_peut_sauver_cles
108
-				and !empty($row['backup_cles'])
109
-			) {
110
-				if ($cles->restore($row['backup_cles'], $pass, $row['pass'], $row['id_auteur'])) {
111
-					spip_log('Les cles secretes ont ete restaurées avec le backup du webmestre #' . $row['id_auteur'], 'auth' . _LOG_INFO_IMPORTANTE);
112
-					if ($cles->save()) {
113
-						$secret = $cles->getSecretAuth();
114
-					}
115
-					else {
116
-						spip_log("Echec restauration des cles : verifier les droits d'ecriture ?", 'auth' . _LOG_ERREUR);
117
-						// et on echoue car on ne veut pas que la situation reste telle quelle
118
-						raler_fichier(_DIR_ETC . 'cles.php');
119
-					}
120
-				}
121
-				else {
122
-					spip_log('Pas de cle secrete disponible (fichier config/cle.php absent ?) mais le backup du webmestre #' . $row['id_auteur'] . " n'est pas valide", 'auth' . _LOG_ERREUR);
123
-					sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur=' . intval($row['id_auteur']));
124
-				}
125
-			}
126
-
127
-			if (!$secret or !Password::verifier($pass, $row['pass'], $secret)) {
128
-				unset($row);
129
-			}
130
-			else {
131
-				spip_log("validation du mot de passe pour l'auteur #" . $row['id_auteur'] . " $login via Password::verifier", 'auth' . _LOG_DEBUG);
132
-			}
133
-			break;
134
-	}
135
-
136
-	// Migration depuis ancienne version : si on a pas encore de cle
137
-	// ET si c'est le login d'un auteur qui peut sauver la cle
138
-	// créer la clé (en s'assurant bien que personne n'a de backup d'un precedent fichier cle.php)
139
-	// si c'est un auteur normal, on ne fait rien, il garde son ancien pass hashé en sha256 en attendant le login d'un webmestre
140
-	if (!$secret and $auteur_peut_sauver_cles) {
141
-		if (auth_spip_initialiser_secret()) {
142
-			$secret = $cles->getSecretAuth();
143
-		}
144
-	}
145
-
146
-	// login/mot de passe incorrect
147
-	if (empty($row)) {
148
-		return [];
149
-	}
150
-
151
-	// fait tourner le codage du pass dans la base
152
-	// sauf si phpauth : cela reviendrait a changer l'alea a chaque hit, et aucune action verifiable par securiser_action()
153
-	if (!$phpauth and $secret) {
154
-		include_spip('inc/acces'); // pour creer_uniqid et verifier_htaccess
155
-		$pass_hash_next = Password::hacher($pass, $secret);
156
-		if ($pass_hash_next) {
157
-			$set = [
158
-				'alea_actuel' => 'alea_futur', // @deprecated 4.1
159
-				'alea_futur' => sql_quote(creer_uniqid(), $serveur, 'text'), // @deprecated 4.1
160
-				'pass' => sql_quote($pass_hash_next, $serveur, 'text'),
161
-			];
162
-
163
-			// regenerer un htpass si on a active/desactive le plugin htpasswd
164
-			// et/ou que l'algo a change - pour etre certain de toujours utiliser le bon algo
165
-			$htpass = generer_htpass($pass);
166
-			if (strlen($htpass) !== strlen($row['htpass'])) {
167
-				$set['htpass'] = sql_quote($htpass, $serveur, 'text');
168
-			}
169
-
170
-			// a chaque login de webmestre : sauvegarde chiffree des clés du site (avec les pass du webmestre)
171
-			if ($auteur_peut_sauver_cles) {
172
-				$set['backup_cles'] = sql_quote($cles->backup($pass), $serveur, 'text');
173
-			}
174
-
175
-			@sql_update(
176
-				'spip_auteurs',
177
-				$set,
178
-				'id_auteur=' . intval($row['id_auteur']) . ' AND pass=' . sql_quote(
179
-					$row['pass'],
180
-					$serveur,
181
-					'text'
182
-				),
183
-				[],
184
-				$serveur
185
-			);
186
-
187
-			// si on a change le htpass car changement d'algo, regenerer les fichiers htpasswd
188
-			if (isset($set['htpass'])) {
189
-				ecrire_acces();
190
-			}
191
-		}
192
-
193
-		// En profiter pour verifier la securite de tmp/
194
-		// Si elle ne fonctionne pas a l'installation, prevenir
195
-		if (!verifier_htaccess(_DIR_TMP) and defined('_ECRIRE_INSTALL')) {
196
-			return false;
197
-		}
198
-	}
199
-
200
-	return $row;
37
+    // retrouver le login
38
+    $login = auth_spip_retrouver_login($login);
39
+    // login inconnu, n'allons pas plus loin
40
+    if (!$login) {
41
+        return [];
42
+    }
43
+
44
+    $md5pass = '';
45
+    $shapass = $shanext = '';
46
+    $auteur_peut_sauver_cles = false;
47
+
48
+    if ($pass) {
49
+        $row = sql_fetsel(
50
+            '*',
51
+            'spip_auteurs',
52
+            'login=' . sql_quote($login, $serveur, 'text') . " AND statut<>'5poubelle'",
53
+            '',
54
+            '',
55
+            '',
56
+            '',
57
+            $serveur
58
+        );
59
+
60
+        // lever un flag si cet auteur peut sauver les cles
61
+        if ($row['statut'] === '0minirezo' and $row['webmestre'] === 'oui' and isset($row['backup_cles'])) {
62
+            $auteur_peut_sauver_cles = true;
63
+        }
64
+    }
65
+
66
+    // login inexistant ou mot de passe vide
67
+    if (!$pass or !$row) {
68
+        return [];
69
+    }
70
+
71
+    include_spip('inc/chiffrer');
72
+    $cles = SpipCles::instance();
73
+    $secret = $cles->getSecretAuth();
74
+
75
+    $hash = null;
76
+    switch (strlen($row['pass'])) {
77
+        // legacy = md5 ou sha256
78
+        case 32:
79
+            // tres anciens mots de passe encodes en md5(alea.pass)
80
+            $hash = md5($row['alea_actuel'] . $pass);
81
+            $methode = 'md5';
82
+        case 64:
83
+            if (empty($hash)) {
84
+                // anciens mots de passe encodes en sha256(alea.pass)
85
+                include_spip('auth/sha256.inc');
86
+                $hash = spip_sha256($row['alea_actuel'] . $pass);
87
+                $methode = 'sha256';
88
+            }
89
+            if ($row['pass'] === $hash) {
90
+                spip_log("validation du mot de passe pour l'auteur #" . $row['id_auteur'] . " $login via $methode", 'auth' . _LOG_DEBUG);
91
+                // ce n'est pas cense arriver, mais si jamais c'est un backup inutilisable, il faut le nettoyer pour ne pas bloquer la creation d'une nouvelle cle d'auth
92
+                if (!empty($row['backup_cles'])) {
93
+                    sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur=' . intval($row['id_auteur']));
94
+                }
95
+                break;
96
+            }
97
+
98
+        // on teste la methode par defaut, au cas ou ce serait un pass moderne qui a la malchance d'etre en 64char de long
99
+
100
+        case 60:
101
+        case 98:
102
+        default:
103
+            // doit-on restaurer un backup des cles ?
104
+            // si on a le bon pass on peut decoder le backup, retrouver la cle, et du coup valider le pass
105
+            if (
106
+                !$secret
107
+                and $auteur_peut_sauver_cles
108
+                and !empty($row['backup_cles'])
109
+            ) {
110
+                if ($cles->restore($row['backup_cles'], $pass, $row['pass'], $row['id_auteur'])) {
111
+                    spip_log('Les cles secretes ont ete restaurées avec le backup du webmestre #' . $row['id_auteur'], 'auth' . _LOG_INFO_IMPORTANTE);
112
+                    if ($cles->save()) {
113
+                        $secret = $cles->getSecretAuth();
114
+                    }
115
+                    else {
116
+                        spip_log("Echec restauration des cles : verifier les droits d'ecriture ?", 'auth' . _LOG_ERREUR);
117
+                        // et on echoue car on ne veut pas que la situation reste telle quelle
118
+                        raler_fichier(_DIR_ETC . 'cles.php');
119
+                    }
120
+                }
121
+                else {
122
+                    spip_log('Pas de cle secrete disponible (fichier config/cle.php absent ?) mais le backup du webmestre #' . $row['id_auteur'] . " n'est pas valide", 'auth' . _LOG_ERREUR);
123
+                    sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur=' . intval($row['id_auteur']));
124
+                }
125
+            }
126
+
127
+            if (!$secret or !Password::verifier($pass, $row['pass'], $secret)) {
128
+                unset($row);
129
+            }
130
+            else {
131
+                spip_log("validation du mot de passe pour l'auteur #" . $row['id_auteur'] . " $login via Password::verifier", 'auth' . _LOG_DEBUG);
132
+            }
133
+            break;
134
+    }
135
+
136
+    // Migration depuis ancienne version : si on a pas encore de cle
137
+    // ET si c'est le login d'un auteur qui peut sauver la cle
138
+    // créer la clé (en s'assurant bien que personne n'a de backup d'un precedent fichier cle.php)
139
+    // si c'est un auteur normal, on ne fait rien, il garde son ancien pass hashé en sha256 en attendant le login d'un webmestre
140
+    if (!$secret and $auteur_peut_sauver_cles) {
141
+        if (auth_spip_initialiser_secret()) {
142
+            $secret = $cles->getSecretAuth();
143
+        }
144
+    }
145
+
146
+    // login/mot de passe incorrect
147
+    if (empty($row)) {
148
+        return [];
149
+    }
150
+
151
+    // fait tourner le codage du pass dans la base
152
+    // sauf si phpauth : cela reviendrait a changer l'alea a chaque hit, et aucune action verifiable par securiser_action()
153
+    if (!$phpauth and $secret) {
154
+        include_spip('inc/acces'); // pour creer_uniqid et verifier_htaccess
155
+        $pass_hash_next = Password::hacher($pass, $secret);
156
+        if ($pass_hash_next) {
157
+            $set = [
158
+                'alea_actuel' => 'alea_futur', // @deprecated 4.1
159
+                'alea_futur' => sql_quote(creer_uniqid(), $serveur, 'text'), // @deprecated 4.1
160
+                'pass' => sql_quote($pass_hash_next, $serveur, 'text'),
161
+            ];
162
+
163
+            // regenerer un htpass si on a active/desactive le plugin htpasswd
164
+            // et/ou que l'algo a change - pour etre certain de toujours utiliser le bon algo
165
+            $htpass = generer_htpass($pass);
166
+            if (strlen($htpass) !== strlen($row['htpass'])) {
167
+                $set['htpass'] = sql_quote($htpass, $serveur, 'text');
168
+            }
169
+
170
+            // a chaque login de webmestre : sauvegarde chiffree des clés du site (avec les pass du webmestre)
171
+            if ($auteur_peut_sauver_cles) {
172
+                $set['backup_cles'] = sql_quote($cles->backup($pass), $serveur, 'text');
173
+            }
174
+
175
+            @sql_update(
176
+                'spip_auteurs',
177
+                $set,
178
+                'id_auteur=' . intval($row['id_auteur']) . ' AND pass=' . sql_quote(
179
+                    $row['pass'],
180
+                    $serveur,
181
+                    'text'
182
+                ),
183
+                [],
184
+                $serveur
185
+            );
186
+
187
+            // si on a change le htpass car changement d'algo, regenerer les fichiers htpasswd
188
+            if (isset($set['htpass'])) {
189
+                ecrire_acces();
190
+            }
191
+        }
192
+
193
+        // En profiter pour verifier la securite de tmp/
194
+        // Si elle ne fonctionne pas a l'installation, prevenir
195
+        if (!verifier_htaccess(_DIR_TMP) and defined('_ECRIRE_INSTALL')) {
196
+            return false;
197
+        }
198
+    }
199
+
200
+    return $row;
201 201
 }
202 202
 
203 203
 /**
@@ -212,37 +212,37 @@  discard block
 block discarded – undo
212 212
  * @return bool
213 213
  */
214 214
 function auth_spip_initialiser_secret(bool $force = false): bool {
215
-	include_spip('inc/chiffrer');
216
-	$cles = SpipCles::instance();
217
-	$secret = $cles->getSecretAuth();
218
-
219
-	// on ne fait rien si on a un secret dispo
220
-	if ($secret) {
221
-		return false;
222
-	}
223
-
224
-	// si force, on ne verifie pas la presence d'un backup chez un webmestre
225
-	if ($force) {
226
-		spip_log('Pas de cle secrete disponible, on regenere une nouvelle cle forcee - tous les mots de passe sont invalides', 'auth' . _LOG_INFO_IMPORTANTE);
227
-		$secret = $cles->getSecretAuth(true);
228
-		return true;
229
-	}
230
-
231
-	$has_backup = sql_allfetsel('id_auteur', 'spip_auteurs', 'statut=' . sql_quote('0minirezo') . ' AND webmestre=' . sql_quote('oui') . " AND backup_cles!=''");
232
-	$has_backup = array_column($has_backup, 'id_auteur');
233
-	if (empty($has_backup)) {
234
-		spip_log("Pas de cle secrete disponible, et aucun webmestre n'a de backup, on regenere une nouvelle cle - tous les mots de passe sont invalides", 'auth' . _LOG_INFO_IMPORTANTE);
235
-		if ($secret = $cles->getSecretAuth(true)) {
236
-			return true;
237
-		}
238
-		spip_log("Echec generation d'une nouvelle cle : verifier les droits d'ecriture ?", 'auth' . _LOG_ERREUR);
239
-		// et on echoue car on ne veut pas que la situation reste telle quelle
240
-		raler_fichier(_DIR_ETC . 'cles.php');
241
-	}
242
-	else {
243
-		spip_log('Pas de cle secrete disponible (fichier config/cle.php absent ?) un des webmestres #' . implode(', #', $has_backup) . ' doit se connecter pour restaurer son backup des cles', 'auth' . _LOG_ERREUR);
244
-	}
245
-	return false;
215
+    include_spip('inc/chiffrer');
216
+    $cles = SpipCles::instance();
217
+    $secret = $cles->getSecretAuth();
218
+
219
+    // on ne fait rien si on a un secret dispo
220
+    if ($secret) {
221
+        return false;
222
+    }
223
+
224
+    // si force, on ne verifie pas la presence d'un backup chez un webmestre
225
+    if ($force) {
226
+        spip_log('Pas de cle secrete disponible, on regenere une nouvelle cle forcee - tous les mots de passe sont invalides', 'auth' . _LOG_INFO_IMPORTANTE);
227
+        $secret = $cles->getSecretAuth(true);
228
+        return true;
229
+    }
230
+
231
+    $has_backup = sql_allfetsel('id_auteur', 'spip_auteurs', 'statut=' . sql_quote('0minirezo') . ' AND webmestre=' . sql_quote('oui') . " AND backup_cles!=''");
232
+    $has_backup = array_column($has_backup, 'id_auteur');
233
+    if (empty($has_backup)) {
234
+        spip_log("Pas de cle secrete disponible, et aucun webmestre n'a de backup, on regenere une nouvelle cle - tous les mots de passe sont invalides", 'auth' . _LOG_INFO_IMPORTANTE);
235
+        if ($secret = $cles->getSecretAuth(true)) {
236
+            return true;
237
+        }
238
+        spip_log("Echec generation d'une nouvelle cle : verifier les droits d'ecriture ?", 'auth' . _LOG_ERREUR);
239
+        // et on echoue car on ne veut pas que la situation reste telle quelle
240
+        raler_fichier(_DIR_ETC . 'cles.php');
241
+    }
242
+    else {
243
+        spip_log('Pas de cle secrete disponible (fichier config/cle.php absent ?) un des webmestres #' . implode(', #', $has_backup) . ' doit se connecter pour restaurer son backup des cles', 'auth' . _LOG_ERREUR);
244
+    }
245
+    return false;
246 246
 }
247 247
 
248 248
 /**
@@ -252,19 +252,19 @@  discard block
 block discarded – undo
252 252
  * @return array
253 253
  */
254 254
 function auth_spip_formulaire_login($flux) {
255
-	// javascript qui gere la securite du login en evitant de faire circuler le pass en clair
256
-	$js = file_get_contents(find_in_path('prive/javascript/login.js'));
257
-	$flux['data'] .=
258
-		  '<script type="text/javascript">/*<![CDATA[*/'
259
-		. "$js\n"
260
-		. "var login_info={'login':'" . $flux['args']['contexte']['var_login'] . "',"
261
-		. "'page_auteur': '" . generer_url_public('informer_auteur') . "',"
262
-		. "'informe_auteur_en_cours':false,"
263
-		. "'attente_informe':0};"
264
-		. "jQuery(function(){jQuery('#var_login').change(actualise_auteur);});"
265
-		. '/*]]>*/</script>';
266
-
267
-	return $flux;
255
+    // javascript qui gere la securite du login en evitant de faire circuler le pass en clair
256
+    $js = file_get_contents(find_in_path('prive/javascript/login.js'));
257
+    $flux['data'] .=
258
+            '<script type="text/javascript">/*<![CDATA[*/'
259
+        . "$js\n"
260
+        . "var login_info={'login':'" . $flux['args']['contexte']['var_login'] . "',"
261
+        . "'page_auteur': '" . generer_url_public('informer_auteur') . "',"
262
+        . "'informe_auteur_en_cours':false,"
263
+        . "'attente_informe':0};"
264
+        . "jQuery(function(){jQuery('#var_login').change(actualise_auteur);});"
265
+        . '/*]]>*/</script>';
266
+
267
+    return $flux;
268 268
 }
269 269
 
270 270
 
@@ -276,11 +276,11 @@  discard block
 block discarded – undo
276 276
  *   toujours true pour un auteur cree dans SPIP
277 277
  */
278 278
 function auth_spip_autoriser_modifier_login(string $serveur = ''): bool {
279
-	// les fonctions d'ecriture sur base distante sont encore incompletes
280
-	if (strlen($serveur)) {
281
-		return false;
282
-	}
283
-	return true;
279
+    // les fonctions d'ecriture sur base distante sont encore incompletes
280
+    if (strlen($serveur)) {
281
+        return false;
282
+    }
283
+    return true;
284 284
 }
285 285
 
286 286
 /**
@@ -294,25 +294,25 @@  discard block
 block discarded – undo
294 294
  *  message d'erreur si login non valide, chaine vide sinon
295 295
  */
296 296
 function auth_spip_verifier_login($new_login, $id_auteur = 0, $serveur = '') {
297
-	// login et mot de passe
298
-	if (strlen($new_login)) {
299
-		if (strlen($new_login) < _LOGIN_TROP_COURT) {
300
-			return _T('info_login_trop_court_car_pluriel', ['nb' => _LOGIN_TROP_COURT]);
301
-		} else {
302
-			$n = sql_countsel(
303
-				'spip_auteurs',
304
-				'login=' . sql_quote($new_login) . ' AND id_auteur!=' . intval($id_auteur) . " AND statut!='5poubelle'",
305
-				'',
306
-				'',
307
-				$serveur
308
-			);
309
-			if ($n) {
310
-				return _T('info_login_existant');
311
-			}
312
-		}
313
-	}
314
-
315
-	return '';
297
+    // login et mot de passe
298
+    if (strlen($new_login)) {
299
+        if (strlen($new_login) < _LOGIN_TROP_COURT) {
300
+            return _T('info_login_trop_court_car_pluriel', ['nb' => _LOGIN_TROP_COURT]);
301
+        } else {
302
+            $n = sql_countsel(
303
+                'spip_auteurs',
304
+                'login=' . sql_quote($new_login) . ' AND id_auteur!=' . intval($id_auteur) . " AND statut!='5poubelle'",
305
+                '',
306
+                '',
307
+                $serveur
308
+            );
309
+            if ($n) {
310
+                return _T('info_login_existant');
311
+            }
312
+        }
313
+    }
314
+
315
+    return '';
316 316
 }
317 317
 
318 318
 /**
@@ -324,41 +324,41 @@  discard block
 block discarded – undo
324 324
  * @return bool
325 325
  */
326 326
 function auth_spip_modifier_login($new_login, $id_auteur, $serveur = '') {
327
-	if (is_null($new_login) or auth_spip_verifier_login($new_login, $id_auteur, $serveur) != '') {
328
-		return false;
329
-	}
330
-	if (
331
-		!$id_auteur = intval($id_auteur)
332
-		or !$auteur = sql_fetsel('login', 'spip_auteurs', 'id_auteur=' . intval($id_auteur), '', '', '', '', $serveur)
333
-	) {
334
-		return false;
335
-	}
336
-	if ($new_login == $auteur['login']) {
337
-		return true;
338
-	} // on a rien fait mais c'est bon !
339
-
340
-	include_spip('action/editer_auteur');
341
-
342
-	// vider le login des auteurs a la poubelle qui avaient ce meme login
343
-	if (strlen($new_login)) {
344
-		$anciens = sql_allfetsel(
345
-			'id_auteur',
346
-			'spip_auteurs',
347
-			'login=' . sql_quote($new_login, $serveur, 'text') . " AND statut='5poubelle'",
348
-			'',
349
-			'',
350
-			'',
351
-			'',
352
-			$serveur
353
-		);
354
-		while ($row = array_pop($anciens)) {
355
-			auteur_modifier($row['id_auteur'], ['login' => ''], true); // manque la gestion de $serveur
356
-		}
357
-	}
358
-
359
-	auteur_modifier($id_auteur, ['login' => $new_login], true); // manque la gestion de $serveur
360
-
361
-	return true;
327
+    if (is_null($new_login) or auth_spip_verifier_login($new_login, $id_auteur, $serveur) != '') {
328
+        return false;
329
+    }
330
+    if (
331
+        !$id_auteur = intval($id_auteur)
332
+        or !$auteur = sql_fetsel('login', 'spip_auteurs', 'id_auteur=' . intval($id_auteur), '', '', '', '', $serveur)
333
+    ) {
334
+        return false;
335
+    }
336
+    if ($new_login == $auteur['login']) {
337
+        return true;
338
+    } // on a rien fait mais c'est bon !
339
+
340
+    include_spip('action/editer_auteur');
341
+
342
+    // vider le login des auteurs a la poubelle qui avaient ce meme login
343
+    if (strlen($new_login)) {
344
+        $anciens = sql_allfetsel(
345
+            'id_auteur',
346
+            'spip_auteurs',
347
+            'login=' . sql_quote($new_login, $serveur, 'text') . " AND statut='5poubelle'",
348
+            '',
349
+            '',
350
+            '',
351
+            '',
352
+            $serveur
353
+        );
354
+        while ($row = array_pop($anciens)) {
355
+            auteur_modifier($row['id_auteur'], ['login' => ''], true); // manque la gestion de $serveur
356
+        }
357
+    }
358
+
359
+    auteur_modifier($id_auteur, ['login' => $new_login], true); // manque la gestion de $serveur
360
+
361
+    return true;
362 362
 }
363 363
 
364 364
 /**
@@ -370,44 +370,44 @@  discard block
 block discarded – undo
370 370
  * @return string
371 371
  */
372 372
 function auth_spip_retrouver_login($login, $serveur = '') {
373
-	if (!strlen($login)) {
374
-		return null;
375
-	} // pas la peine de requeter
376
-	$l = sql_quote($login, $serveur, 'text');
377
-	if (
378
-		$r = sql_getfetsel(
379
-			'login',
380
-			'spip_auteurs',
381
-			"statut<>'5poubelle'" .
382
-			' AND (length(pass)>0)' .
383
-			" AND (login=$l)",
384
-			'',
385
-			'',
386
-			'',
387
-			'',
388
-			$serveur
389
-		)
390
-	) {
391
-		return $r;
392
-	}
393
-	// Si pas d'auteur avec ce login
394
-	// regarder s'il a saisi son nom ou son mail.
395
-	// Ne pas fusionner avec la requete precedente
396
-	// car un nom peut etre homonyme d'un autre login
397
-	else {
398
-		return sql_getfetsel(
399
-			'login',
400
-			'spip_auteurs',
401
-			"statut<>'5poubelle'" .
402
-			' AND (length(pass)>0)' .
403
-			" AND (login<>'' AND (nom=$l OR email=$l))",
404
-			'',
405
-			'',
406
-			'',
407
-			'',
408
-			$serveur
409
-		);
410
-	}
373
+    if (!strlen($login)) {
374
+        return null;
375
+    } // pas la peine de requeter
376
+    $l = sql_quote($login, $serveur, 'text');
377
+    if (
378
+        $r = sql_getfetsel(
379
+            'login',
380
+            'spip_auteurs',
381
+            "statut<>'5poubelle'" .
382
+            ' AND (length(pass)>0)' .
383
+            " AND (login=$l)",
384
+            '',
385
+            '',
386
+            '',
387
+            '',
388
+            $serveur
389
+        )
390
+    ) {
391
+        return $r;
392
+    }
393
+    // Si pas d'auteur avec ce login
394
+    // regarder s'il a saisi son nom ou son mail.
395
+    // Ne pas fusionner avec la requete precedente
396
+    // car un nom peut etre homonyme d'un autre login
397
+    else {
398
+        return sql_getfetsel(
399
+            'login',
400
+            'spip_auteurs',
401
+            "statut<>'5poubelle'" .
402
+            ' AND (length(pass)>0)' .
403
+            " AND (login<>'' AND (nom=$l OR email=$l))",
404
+            '',
405
+            '',
406
+            '',
407
+            '',
408
+            $serveur
409
+        );
410
+    }
411 411
 }
412 412
 
413 413
 /**
@@ -418,11 +418,11 @@  discard block
 block discarded – undo
418 418
  *  toujours true pour un auteur cree dans SPIP
419 419
  */
420 420
 function auth_spip_autoriser_modifier_pass(string $serveur = ''): bool {
421
-	// les fonctions d'ecriture sur base distante sont encore incompletes
422
-	if (strlen($serveur)) {
423
-		return false;
424
-	}
425
-	return true;
421
+    // les fonctions d'ecriture sur base distante sont encore incompletes
422
+    if (strlen($serveur)) {
423
+        return false;
424
+    }
425
+    return true;
426 426
 }
427 427
 
428 428
 
@@ -443,12 +443,12 @@  discard block
 block discarded – undo
443 443
  *  message d'erreur si login non valide, chaine vide sinon
444 444
  */
445 445
 function auth_spip_verifier_pass($login, $new_pass, $id_auteur = 0, $serveur = '') {
446
-	// login et mot de passe
447
-	if (strlen($new_pass) < _PASS_LONGUEUR_MINI) {
448
-		return _T('info_passe_trop_court_car_pluriel', ['nb' => _PASS_LONGUEUR_MINI]);
449
-	}
446
+    // login et mot de passe
447
+    if (strlen($new_pass) < _PASS_LONGUEUR_MINI) {
448
+        return _T('info_passe_trop_court_car_pluriel', ['nb' => _PASS_LONGUEUR_MINI]);
449
+    }
450 450
 
451
-	return '';
451
+    return '';
452 452
 }
453 453
 
454 454
 /**
@@ -462,48 +462,48 @@  discard block
 block discarded – undo
462 462
  * @return bool
463 463
  */
464 464
 function auth_spip_modifier_pass($login, $new_pass, $id_auteur, $serveur = '') {
465
-	if (is_null($new_pass) or auth_spip_verifier_pass($login, $new_pass, $id_auteur, $serveur) != '') {
466
-		return false;
467
-	}
468
-
469
-	if (
470
-		!$id_auteur = intval($id_auteur)
471
-		or !$auteur = sql_fetsel('login, statut, webmestre', 'spip_auteurs', 'id_auteur=' . intval($id_auteur), '', '', '', '', $serveur)
472
-	) {
473
-		return false;
474
-	}
475
-
476
-	include_spip('inc/chiffrer');
477
-	$cles = SpipCles::instance();
478
-	$secret = $cles->getSecretAuth();
479
-	if (!$secret) {
480
-		if (auth_spip_initialiser_secret()) {
481
-			$secret = $cles->getSecretAuth();
482
-		}
483
-		else {
484
-			return false;
485
-		}
486
-	}
487
-
488
-
489
-	include_spip('inc/acces');
490
-	$set = [
491
-		'pass' => Password::hacher($new_pass, $secret),
492
-		'htpass' => generer_htpass($new_pass),
493
-		'alea_actuel' => creer_uniqid(), // @deprecated 4.1
494
-		'alea_futur' => creer_uniqid(), // @deprecated 4.1
495
-		'low_sec' => '',
496
-	];
497
-
498
-	// si c'est un webmestre, on met a jour son backup des cles
499
-	if ($auteur['statut'] === '0minirezo' and $auteur['webmestre'] === 'oui') {
500
-		$set['backup_cles'] = $cles->backup($new_pass);
501
-	}
502
-
503
-	include_spip('action/editer_auteur');
504
-	auteur_modifier($id_auteur, $set, true); // manque la gestion de $serveur
505
-
506
-	return true; // on a bien modifie le pass
465
+    if (is_null($new_pass) or auth_spip_verifier_pass($login, $new_pass, $id_auteur, $serveur) != '') {
466
+        return false;
467
+    }
468
+
469
+    if (
470
+        !$id_auteur = intval($id_auteur)
471
+        or !$auteur = sql_fetsel('login, statut, webmestre', 'spip_auteurs', 'id_auteur=' . intval($id_auteur), '', '', '', '', $serveur)
472
+    ) {
473
+        return false;
474
+    }
475
+
476
+    include_spip('inc/chiffrer');
477
+    $cles = SpipCles::instance();
478
+    $secret = $cles->getSecretAuth();
479
+    if (!$secret) {
480
+        if (auth_spip_initialiser_secret()) {
481
+            $secret = $cles->getSecretAuth();
482
+        }
483
+        else {
484
+            return false;
485
+        }
486
+    }
487
+
488
+
489
+    include_spip('inc/acces');
490
+    $set = [
491
+        'pass' => Password::hacher($new_pass, $secret),
492
+        'htpass' => generer_htpass($new_pass),
493
+        'alea_actuel' => creer_uniqid(), // @deprecated 4.1
494
+        'alea_futur' => creer_uniqid(), // @deprecated 4.1
495
+        'low_sec' => '',
496
+    ];
497
+
498
+    // si c'est un webmestre, on met a jour son backup des cles
499
+    if ($auteur['statut'] === '0minirezo' and $auteur['webmestre'] === 'oui') {
500
+        $set['backup_cles'] = $cles->backup($new_pass);
501
+    }
502
+
503
+    include_spip('action/editer_auteur');
504
+    auteur_modifier($id_auteur, $set, true); // manque la gestion de $serveur
505
+
506
+    return true; // on a bien modifie le pass
507 507
 }
508 508
 
509 509
 /**
@@ -517,58 +517,58 @@  discard block
 block discarded – undo
517 517
  * @return void
518 518
  */
519 519
 function auth_spip_synchroniser_distant($id_auteur, $champs, $options = [], string $serveur = ''): void {
520
-	// ne rien faire pour une base distante : on ne sait pas regenerer les htaccess
521
-	if (strlen($serveur)) {
522
-		return;
523
-	}
524
-	// si un login, pass ou statut a ete modifie
525
-	// regenerer les fichier htpass
526
-	if (
527
-		isset($champs['login'])
528
-		or isset($champs['pass'])
529
-		or isset($champs['statut'])
530
-		or (isset($options['all']) and $options['all'])
531
-	) {
532
-		$htaccess = _DIR_RESTREINT . _ACCESS_FILE_NAME;
533
-		$htpasswd = _DIR_TMP . _AUTH_USER_FILE;
534
-
535
-		// Cette variable de configuration peut etre posee par un plugin
536
-		// par exemple acces_restreint ;
537
-		// si .htaccess existe, outrepasser spip_meta
538
-		if (
539
-			(!isset($GLOBALS['meta']['creer_htpasswd']) or ($GLOBALS['meta']['creer_htpasswd'] != 'oui'))
540
-			and !@file_exists($htaccess)
541
-		) {
542
-			spip_unlink($htpasswd);
543
-			spip_unlink($htpasswd . '-admin');
544
-
545
-			return;
546
-		}
547
-
548
-		# remarque : ici on laisse passer les "nouveau" de maniere a leur permettre
549
-		# de devenir redacteur le cas echeant (auth http)... a nettoyer
550
-		// attention, il faut au prealable se connecter a la base (necessaire car utilise par install)
551
-
552
-		$p1 = ''; // login:htpass pour tous
553
-		$p2 = ''; // login:htpass pour les admins
554
-		$s = sql_select(
555
-			'login, htpass, statut',
556
-			'spip_auteurs',
557
-			sql_in('statut', ['1comite', '0minirezo', 'nouveau'])
558
-		);
559
-		while ($t = sql_fetch($s)) {
560
-			if (strlen($t['login']) and strlen($t['htpass'])) {
561
-				$p1 .= $t['login'] . ':' . $t['htpass'] . "\n";
562
-				if ($t['statut'] == '0minirezo') {
563
-					$p2 .= $t['login'] . ':' . $t['htpass'] . "\n";
564
-				}
565
-			}
566
-		}
567
-		sql_free($s);
568
-		if ($p1) {
569
-			ecrire_fichier($htpasswd, $p1);
570
-			ecrire_fichier($htpasswd . '-admin', $p2);
571
-			spip_log("Ecriture de $htpasswd et $htpasswd-admin");
572
-		}
573
-	}
520
+    // ne rien faire pour une base distante : on ne sait pas regenerer les htaccess
521
+    if (strlen($serveur)) {
522
+        return;
523
+    }
524
+    // si un login, pass ou statut a ete modifie
525
+    // regenerer les fichier htpass
526
+    if (
527
+        isset($champs['login'])
528
+        or isset($champs['pass'])
529
+        or isset($champs['statut'])
530
+        or (isset($options['all']) and $options['all'])
531
+    ) {
532
+        $htaccess = _DIR_RESTREINT . _ACCESS_FILE_NAME;
533
+        $htpasswd = _DIR_TMP . _AUTH_USER_FILE;
534
+
535
+        // Cette variable de configuration peut etre posee par un plugin
536
+        // par exemple acces_restreint ;
537
+        // si .htaccess existe, outrepasser spip_meta
538
+        if (
539
+            (!isset($GLOBALS['meta']['creer_htpasswd']) or ($GLOBALS['meta']['creer_htpasswd'] != 'oui'))
540
+            and !@file_exists($htaccess)
541
+        ) {
542
+            spip_unlink($htpasswd);
543
+            spip_unlink($htpasswd . '-admin');
544
+
545
+            return;
546
+        }
547
+
548
+        # remarque : ici on laisse passer les "nouveau" de maniere a leur permettre
549
+        # de devenir redacteur le cas echeant (auth http)... a nettoyer
550
+        // attention, il faut au prealable se connecter a la base (necessaire car utilise par install)
551
+
552
+        $p1 = ''; // login:htpass pour tous
553
+        $p2 = ''; // login:htpass pour les admins
554
+        $s = sql_select(
555
+            'login, htpass, statut',
556
+            'spip_auteurs',
557
+            sql_in('statut', ['1comite', '0minirezo', 'nouveau'])
558
+        );
559
+        while ($t = sql_fetch($s)) {
560
+            if (strlen($t['login']) and strlen($t['htpass'])) {
561
+                $p1 .= $t['login'] . ':' . $t['htpass'] . "\n";
562
+                if ($t['statut'] == '0minirezo') {
563
+                    $p2 .= $t['login'] . ':' . $t['htpass'] . "\n";
564
+                }
565
+            }
566
+        }
567
+        sql_free($s);
568
+        if ($p1) {
569
+            ecrire_fichier($htpasswd, $p1);
570
+            ecrire_fichier($htpasswd . '-admin', $p2);
571
+            spip_log("Ecriture de $htpasswd et $htpasswd-admin");
572
+        }
573
+    }
574 574
 }
Please login to merge, or discard this patch.
Spacing   +34 added lines, -34 removed lines patch added patch discarded remove patch
@@ -49,7 +49,7 @@  discard block
 block discarded – undo
49 49
 		$row = sql_fetsel(
50 50
 			'*',
51 51
 			'spip_auteurs',
52
-			'login=' . sql_quote($login, $serveur, 'text') . " AND statut<>'5poubelle'",
52
+			'login='.sql_quote($login, $serveur, 'text')." AND statut<>'5poubelle'",
53 53
 			'',
54 54
 			'',
55 55
 			'',
@@ -77,20 +77,20 @@  discard block
 block discarded – undo
77 77
 		// legacy = md5 ou sha256
78 78
 		case 32:
79 79
 			// tres anciens mots de passe encodes en md5(alea.pass)
80
-			$hash = md5($row['alea_actuel'] . $pass);
80
+			$hash = md5($row['alea_actuel'].$pass);
81 81
 			$methode = 'md5';
82 82
 		case 64:
83 83
 			if (empty($hash)) {
84 84
 				// anciens mots de passe encodes en sha256(alea.pass)
85 85
 				include_spip('auth/sha256.inc');
86
-				$hash = spip_sha256($row['alea_actuel'] . $pass);
86
+				$hash = spip_sha256($row['alea_actuel'].$pass);
87 87
 				$methode = 'sha256';
88 88
 			}
89 89
 			if ($row['pass'] === $hash) {
90
-				spip_log("validation du mot de passe pour l'auteur #" . $row['id_auteur'] . " $login via $methode", 'auth' . _LOG_DEBUG);
90
+				spip_log("validation du mot de passe pour l'auteur #".$row['id_auteur']." $login via $methode", 'auth'._LOG_DEBUG);
91 91
 				// ce n'est pas cense arriver, mais si jamais c'est un backup inutilisable, il faut le nettoyer pour ne pas bloquer la creation d'une nouvelle cle d'auth
92 92
 				if (!empty($row['backup_cles'])) {
93
-					sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur=' . intval($row['id_auteur']));
93
+					sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur='.intval($row['id_auteur']));
94 94
 				}
95 95
 				break;
96 96
 			}
@@ -108,19 +108,19 @@  discard block
 block discarded – undo
108 108
 				and !empty($row['backup_cles'])
109 109
 			) {
110 110
 				if ($cles->restore($row['backup_cles'], $pass, $row['pass'], $row['id_auteur'])) {
111
-					spip_log('Les cles secretes ont ete restaurées avec le backup du webmestre #' . $row['id_auteur'], 'auth' . _LOG_INFO_IMPORTANTE);
111
+					spip_log('Les cles secretes ont ete restaurées avec le backup du webmestre #'.$row['id_auteur'], 'auth'._LOG_INFO_IMPORTANTE);
112 112
 					if ($cles->save()) {
113 113
 						$secret = $cles->getSecretAuth();
114 114
 					}
115 115
 					else {
116
-						spip_log("Echec restauration des cles : verifier les droits d'ecriture ?", 'auth' . _LOG_ERREUR);
116
+						spip_log("Echec restauration des cles : verifier les droits d'ecriture ?", 'auth'._LOG_ERREUR);
117 117
 						// et on echoue car on ne veut pas que la situation reste telle quelle
118
-						raler_fichier(_DIR_ETC . 'cles.php');
118
+						raler_fichier(_DIR_ETC.'cles.php');
119 119
 					}
120 120
 				}
121 121
 				else {
122
-					spip_log('Pas de cle secrete disponible (fichier config/cle.php absent ?) mais le backup du webmestre #' . $row['id_auteur'] . " n'est pas valide", 'auth' . _LOG_ERREUR);
123
-					sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur=' . intval($row['id_auteur']));
122
+					spip_log('Pas de cle secrete disponible (fichier config/cle.php absent ?) mais le backup du webmestre #'.$row['id_auteur']." n'est pas valide", 'auth'._LOG_ERREUR);
123
+					sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur='.intval($row['id_auteur']));
124 124
 				}
125 125
 			}
126 126
 
@@ -128,7 +128,7 @@  discard block
 block discarded – undo
128 128
 				unset($row);
129 129
 			}
130 130
 			else {
131
-				spip_log("validation du mot de passe pour l'auteur #" . $row['id_auteur'] . " $login via Password::verifier", 'auth' . _LOG_DEBUG);
131
+				spip_log("validation du mot de passe pour l'auteur #".$row['id_auteur']." $login via Password::verifier", 'auth'._LOG_DEBUG);
132 132
 			}
133 133
 			break;
134 134
 	}
@@ -175,7 +175,7 @@  discard block
 block discarded – undo
175 175
 			@sql_update(
176 176
 				'spip_auteurs',
177 177
 				$set,
178
-				'id_auteur=' . intval($row['id_auteur']) . ' AND pass=' . sql_quote(
178
+				'id_auteur='.intval($row['id_auteur']).' AND pass='.sql_quote(
179 179
 					$row['pass'],
180 180
 					$serveur,
181 181
 					'text'
@@ -223,24 +223,24 @@  discard block
 block discarded – undo
223 223
 
224 224
 	// si force, on ne verifie pas la presence d'un backup chez un webmestre
225 225
 	if ($force) {
226
-		spip_log('Pas de cle secrete disponible, on regenere une nouvelle cle forcee - tous les mots de passe sont invalides', 'auth' . _LOG_INFO_IMPORTANTE);
226
+		spip_log('Pas de cle secrete disponible, on regenere une nouvelle cle forcee - tous les mots de passe sont invalides', 'auth'._LOG_INFO_IMPORTANTE);
227 227
 		$secret = $cles->getSecretAuth(true);
228 228
 		return true;
229 229
 	}
230 230
 
231
-	$has_backup = sql_allfetsel('id_auteur', 'spip_auteurs', 'statut=' . sql_quote('0minirezo') . ' AND webmestre=' . sql_quote('oui') . " AND backup_cles!=''");
231
+	$has_backup = sql_allfetsel('id_auteur', 'spip_auteurs', 'statut='.sql_quote('0minirezo').' AND webmestre='.sql_quote('oui')." AND backup_cles!=''");
232 232
 	$has_backup = array_column($has_backup, 'id_auteur');
233 233
 	if (empty($has_backup)) {
234
-		spip_log("Pas de cle secrete disponible, et aucun webmestre n'a de backup, on regenere une nouvelle cle - tous les mots de passe sont invalides", 'auth' . _LOG_INFO_IMPORTANTE);
234
+		spip_log("Pas de cle secrete disponible, et aucun webmestre n'a de backup, on regenere une nouvelle cle - tous les mots de passe sont invalides", 'auth'._LOG_INFO_IMPORTANTE);
235 235
 		if ($secret = $cles->getSecretAuth(true)) {
236 236
 			return true;
237 237
 		}
238
-		spip_log("Echec generation d'une nouvelle cle : verifier les droits d'ecriture ?", 'auth' . _LOG_ERREUR);
238
+		spip_log("Echec generation d'une nouvelle cle : verifier les droits d'ecriture ?", 'auth'._LOG_ERREUR);
239 239
 		// et on echoue car on ne veut pas que la situation reste telle quelle
240
-		raler_fichier(_DIR_ETC . 'cles.php');
240
+		raler_fichier(_DIR_ETC.'cles.php');
241 241
 	}
242 242
 	else {
243
-		spip_log('Pas de cle secrete disponible (fichier config/cle.php absent ?) un des webmestres #' . implode(', #', $has_backup) . ' doit se connecter pour restaurer son backup des cles', 'auth' . _LOG_ERREUR);
243
+		spip_log('Pas de cle secrete disponible (fichier config/cle.php absent ?) un des webmestres #'.implode(', #', $has_backup).' doit se connecter pour restaurer son backup des cles', 'auth'._LOG_ERREUR);
244 244
 	}
245 245
 	return false;
246 246
 }
@@ -257,8 +257,8 @@  discard block
 block discarded – undo
257 257
 	$flux['data'] .=
258 258
 		  '<script type="text/javascript">/*<![CDATA[*/'
259 259
 		. "$js\n"
260
-		. "var login_info={'login':'" . $flux['args']['contexte']['var_login'] . "',"
261
-		. "'page_auteur': '" . generer_url_public('informer_auteur') . "',"
260
+		. "var login_info={'login':'".$flux['args']['contexte']['var_login']."',"
261
+		. "'page_auteur': '".generer_url_public('informer_auteur')."',"
262 262
 		. "'informe_auteur_en_cours':false,"
263 263
 		. "'attente_informe':0};"
264 264
 		. "jQuery(function(){jQuery('#var_login').change(actualise_auteur);});"
@@ -301,7 +301,7 @@  discard block
 block discarded – undo
301 301
 		} else {
302 302
 			$n = sql_countsel(
303 303
 				'spip_auteurs',
304
-				'login=' . sql_quote($new_login) . ' AND id_auteur!=' . intval($id_auteur) . " AND statut!='5poubelle'",
304
+				'login='.sql_quote($new_login).' AND id_auteur!='.intval($id_auteur)." AND statut!='5poubelle'",
305 305
 				'',
306 306
 				'',
307 307
 				$serveur
@@ -329,7 +329,7 @@  discard block
 block discarded – undo
329 329
 	}
330 330
 	if (
331 331
 		!$id_auteur = intval($id_auteur)
332
-		or !$auteur = sql_fetsel('login', 'spip_auteurs', 'id_auteur=' . intval($id_auteur), '', '', '', '', $serveur)
332
+		or !$auteur = sql_fetsel('login', 'spip_auteurs', 'id_auteur='.intval($id_auteur), '', '', '', '', $serveur)
333 333
 	) {
334 334
 		return false;
335 335
 	}
@@ -344,7 +344,7 @@  discard block
 block discarded – undo
344 344
 		$anciens = sql_allfetsel(
345 345
 			'id_auteur',
346 346
 			'spip_auteurs',
347
-			'login=' . sql_quote($new_login, $serveur, 'text') . " AND statut='5poubelle'",
347
+			'login='.sql_quote($new_login, $serveur, 'text')." AND statut='5poubelle'",
348 348
 			'',
349 349
 			'',
350 350
 			'',
@@ -378,8 +378,8 @@  discard block
 block discarded – undo
378 378
 		$r = sql_getfetsel(
379 379
 			'login',
380 380
 			'spip_auteurs',
381
-			"statut<>'5poubelle'" .
382
-			' AND (length(pass)>0)' .
381
+			"statut<>'5poubelle'".
382
+			' AND (length(pass)>0)'.
383 383
 			" AND (login=$l)",
384 384
 			'',
385 385
 			'',
@@ -398,8 +398,8 @@  discard block
 block discarded – undo
398 398
 		return sql_getfetsel(
399 399
 			'login',
400 400
 			'spip_auteurs',
401
-			"statut<>'5poubelle'" .
402
-			' AND (length(pass)>0)' .
401
+			"statut<>'5poubelle'".
402
+			' AND (length(pass)>0)'.
403 403
 			" AND (login<>'' AND (nom=$l OR email=$l))",
404 404
 			'',
405 405
 			'',
@@ -468,7 +468,7 @@  discard block
 block discarded – undo
468 468
 
469 469
 	if (
470 470
 		!$id_auteur = intval($id_auteur)
471
-		or !$auteur = sql_fetsel('login, statut, webmestre', 'spip_auteurs', 'id_auteur=' . intval($id_auteur), '', '', '', '', $serveur)
471
+		or !$auteur = sql_fetsel('login, statut, webmestre', 'spip_auteurs', 'id_auteur='.intval($id_auteur), '', '', '', '', $serveur)
472 472
 	) {
473 473
 		return false;
474 474
 	}
@@ -529,8 +529,8 @@  discard block
 block discarded – undo
529 529
 		or isset($champs['statut'])
530 530
 		or (isset($options['all']) and $options['all'])
531 531
 	) {
532
-		$htaccess = _DIR_RESTREINT . _ACCESS_FILE_NAME;
533
-		$htpasswd = _DIR_TMP . _AUTH_USER_FILE;
532
+		$htaccess = _DIR_RESTREINT._ACCESS_FILE_NAME;
533
+		$htpasswd = _DIR_TMP._AUTH_USER_FILE;
534 534
 
535 535
 		// Cette variable de configuration peut etre posee par un plugin
536 536
 		// par exemple acces_restreint ;
@@ -540,7 +540,7 @@  discard block
 block discarded – undo
540 540
 			and !@file_exists($htaccess)
541 541
 		) {
542 542
 			spip_unlink($htpasswd);
543
-			spip_unlink($htpasswd . '-admin');
543
+			spip_unlink($htpasswd.'-admin');
544 544
 
545 545
 			return;
546 546
 		}
@@ -558,16 +558,16 @@  discard block
 block discarded – undo
558 558
 		);
559 559
 		while ($t = sql_fetch($s)) {
560 560
 			if (strlen($t['login']) and strlen($t['htpass'])) {
561
-				$p1 .= $t['login'] . ':' . $t['htpass'] . "\n";
561
+				$p1 .= $t['login'].':'.$t['htpass']."\n";
562 562
 				if ($t['statut'] == '0minirezo') {
563
-					$p2 .= $t['login'] . ':' . $t['htpass'] . "\n";
563
+					$p2 .= $t['login'].':'.$t['htpass']."\n";
564 564
 				}
565 565
 			}
566 566
 		}
567 567
 		sql_free($s);
568 568
 		if ($p1) {
569 569
 			ecrire_fichier($htpasswd, $p1);
570
-			ecrire_fichier($htpasswd . '-admin', $p2);
570
+			ecrire_fichier($htpasswd.'-admin', $p2);
571 571
 			spip_log("Ecriture de $htpasswd et $htpasswd-admin");
572 572
 		}
573 573
 	}
Please login to merge, or discard this patch.
Braces   +5 added lines, -10 removed lines patch added patch discarded remove patch
@@ -111,14 +111,12 @@  discard block
 block discarded – undo
111 111
 					spip_log('Les cles secretes ont ete restaurées avec le backup du webmestre #' . $row['id_auteur'], 'auth' . _LOG_INFO_IMPORTANTE);
112 112
 					if ($cles->save()) {
113 113
 						$secret = $cles->getSecretAuth();
114
-					}
115
-					else {
114
+					} else {
116 115
 						spip_log("Echec restauration des cles : verifier les droits d'ecriture ?", 'auth' . _LOG_ERREUR);
117 116
 						// et on echoue car on ne veut pas que la situation reste telle quelle
118 117
 						raler_fichier(_DIR_ETC . 'cles.php');
119 118
 					}
120
-				}
121
-				else {
119
+				} else {
122 120
 					spip_log('Pas de cle secrete disponible (fichier config/cle.php absent ?) mais le backup du webmestre #' . $row['id_auteur'] . " n'est pas valide", 'auth' . _LOG_ERREUR);
123 121
 					sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur=' . intval($row['id_auteur']));
124 122
 				}
@@ -126,8 +124,7 @@  discard block
 block discarded – undo
126 124
 
127 125
 			if (!$secret or !Password::verifier($pass, $row['pass'], $secret)) {
128 126
 				unset($row);
129
-			}
130
-			else {
127
+			} else {
131 128
 				spip_log("validation du mot de passe pour l'auteur #" . $row['id_auteur'] . " $login via Password::verifier", 'auth' . _LOG_DEBUG);
132 129
 			}
133 130
 			break;
@@ -238,8 +235,7 @@  discard block
 block discarded – undo
238 235
 		spip_log("Echec generation d'une nouvelle cle : verifier les droits d'ecriture ?", 'auth' . _LOG_ERREUR);
239 236
 		// et on echoue car on ne veut pas que la situation reste telle quelle
240 237
 		raler_fichier(_DIR_ETC . 'cles.php');
241
-	}
242
-	else {
238
+	} else {
243 239
 		spip_log('Pas de cle secrete disponible (fichier config/cle.php absent ?) un des webmestres #' . implode(', #', $has_backup) . ' doit se connecter pour restaurer son backup des cles', 'auth' . _LOG_ERREUR);
244 240
 	}
245 241
 	return false;
@@ -479,8 +475,7 @@  discard block
 block discarded – undo
479 475
 	if (!$secret) {
480 476
 		if (auth_spip_initialiser_secret()) {
481 477
 			$secret = $cles->getSecretAuth();
482
-		}
483
-		else {
478
+		} else {
484 479
 			return false;
485 480
 		}
486 481
 	}
Please login to merge, or discard this patch.
ecrire/inc/informer.php 2 patches
Indentation   +61 added lines, -61 removed lines patch added patch discarded remove patch
@@ -11,77 +11,77 @@
 block discarded – undo
11 11
 \***************************************************************************/
12 12
 
13 13
 if (!defined('_ECRIRE_INC_VERSION')) {
14
-	return;
14
+    return;
15 15
 }
16 16
 
17 17
 # Les information d'une rubrique selectionnee dans le mini navigateur
18 18
 
19 19
 function inc_informer_dist($id, $col, $exclus, $rac, $type, $do = 'aff') {
20
-	include_spip('inc/texte');
21
-	$titre = $descriptif = '';
22
-	if ($type === 'rubrique') {
23
-		$row = sql_fetsel('titre, descriptif', 'spip_rubriques', 'id_rubrique = ' . intval($id));
24
-		if ($row) {
25
-			$titre = typo($row['titre']);
26
-			$descriptif = propre($row['descriptif']);
27
-		} else {
28
-			$titre = _T('info_racine_site');
29
-		}
30
-	}
20
+    include_spip('inc/texte');
21
+    $titre = $descriptif = '';
22
+    if ($type === 'rubrique') {
23
+        $row = sql_fetsel('titre, descriptif', 'spip_rubriques', 'id_rubrique = ' . intval($id));
24
+        if ($row) {
25
+            $titre = typo($row['titre']);
26
+            $descriptif = propre($row['descriptif']);
27
+        } else {
28
+            $titre = _T('info_racine_site');
29
+        }
30
+    }
31 31
 
32
-	$res = '';
33
-	if (
34
-		$type === 'rubrique'
35
-		and intval($GLOBALS['visiteur_session']['prefs']['display'] ?? 0) !== 1
36
-		and isset($GLOBALS['meta']['image_process'])
37
-	) {
38
-		if ($GLOBALS['meta']['image_process'] !== 'non') {
39
-			$chercher_logo = charger_fonction('chercher_logo', 'inc');
40
-			if ($res = $chercher_logo($id, 'id_rubrique', 'on')) {
41
-				[$fid, $dir, $nom, $format] = $res;
42
-				include_spip('inc/filtres_images_mini');
43
-				$res = image_reduire("<img src='$fid' alt='' />", 100, 48);
44
-				if ($res) {
45
-					$res = "<div class='informer__media' style='float: " . $GLOBALS['spip_lang_right'] . '; margin-' . $GLOBALS['spip_lang_right'] . ": -5px; margin-top: -5px;'>$res</div>";
46
-				}
47
-			}
48
-		}
49
-	}
32
+    $res = '';
33
+    if (
34
+        $type === 'rubrique'
35
+        and intval($GLOBALS['visiteur_session']['prefs']['display'] ?? 0) !== 1
36
+        and isset($GLOBALS['meta']['image_process'])
37
+    ) {
38
+        if ($GLOBALS['meta']['image_process'] !== 'non') {
39
+            $chercher_logo = charger_fonction('chercher_logo', 'inc');
40
+            if ($res = $chercher_logo($id, 'id_rubrique', 'on')) {
41
+                [$fid, $dir, $nom, $format] = $res;
42
+                include_spip('inc/filtres_images_mini');
43
+                $res = image_reduire("<img src='$fid' alt='' />", 100, 48);
44
+                if ($res) {
45
+                    $res = "<div class='informer__media' style='float: " . $GLOBALS['spip_lang_right'] . '; margin-' . $GLOBALS['spip_lang_right'] . ": -5px; margin-top: -5px;'>$res</div>";
46
+                }
47
+            }
48
+        }
49
+    }
50 50
 
51
-	$rac = spip_htmlentities($rac, ENT_QUOTES);
52
-	$do = spip_htmlentities($do, ENT_QUOTES);
53
-	$id = intval($id);
51
+    $rac = spip_htmlentities($rac, ENT_QUOTES);
52
+    $do = spip_htmlentities($do, ENT_QUOTES);
53
+    $id = intval($id);
54 54
 
55 55
 # ce lien provoque la selection (directe) de la rubrique cliquee
56 56
 # et l'affichage de son titre dans le bandeau
57
-	$titre = strtr(
58
-		str_replace(
59
-			"'",
60
-			'&#8217;',
61
-			str_replace('"', '&#34;', textebrut($titre))
62
-		),
63
-		"\n\r",
64
-		'  '
65
-	);
57
+    $titre = strtr(
58
+        str_replace(
59
+            "'",
60
+            '&#8217;',
61
+            str_replace('"', '&#34;', textebrut($titre))
62
+        ),
63
+        "\n\r",
64
+        '  '
65
+    );
66 66
 
67
-	$js_func = $do . '_selection_titre';
67
+    $js_func = $do . '_selection_titre';
68 68
 
69
-	return "<div style='display: none;'>"
70
-	. "<input type='text' id='" . $rac . "_sel' value='$id' />"
71
-	. "<input type='text' id='" . $rac . "_sel2' value=\""
72
-	. entites_html($titre)
73
-	. '" />'
74
-	. '</div>'
75
-	. "<div class='informer' style='padding: 5px; border-top: 0px;'>"
76
-	. '<div class="informer__item">'
77
-	. (!$res ? '' : $res)
78
-	. "<p class='informer__titre'><b>" . safehtml($titre) . '</b></p>'
79
-	. (!$descriptif ? '' : "<div class='informer__descriptif'>" . safehtml($descriptif) . '</div>')
80
-	. '</div>'
81
-	. "<div class='informer__action' style='clear:both; text-align: " . $GLOBALS['spip_lang_right'] . ";'>"
82
-	. "<input type='submit' class='fondo btn submit' value='"
83
-	. _T('bouton_choisir')
84
-	. "'\nonclick=\"$js_func('$titre',$id,'selection_rubrique','id_parent'); return false;\" />"
85
-	. '</div>'
86
-	. '</div>';
69
+    return "<div style='display: none;'>"
70
+    . "<input type='text' id='" . $rac . "_sel' value='$id' />"
71
+    . "<input type='text' id='" . $rac . "_sel2' value=\""
72
+    . entites_html($titre)
73
+    . '" />'
74
+    . '</div>'
75
+    . "<div class='informer' style='padding: 5px; border-top: 0px;'>"
76
+    . '<div class="informer__item">'
77
+    . (!$res ? '' : $res)
78
+    . "<p class='informer__titre'><b>" . safehtml($titre) . '</b></p>'
79
+    . (!$descriptif ? '' : "<div class='informer__descriptif'>" . safehtml($descriptif) . '</div>')
80
+    . '</div>'
81
+    . "<div class='informer__action' style='clear:both; text-align: " . $GLOBALS['spip_lang_right'] . ";'>"
82
+    . "<input type='submit' class='fondo btn submit' value='"
83
+    . _T('bouton_choisir')
84
+    . "'\nonclick=\"$js_func('$titre',$id,'selection_rubrique','id_parent'); return false;\" />"
85
+    . '</div>'
86
+    . '</div>';
87 87
 }
Please login to merge, or discard this patch.
Spacing   +8 added lines, -8 removed lines patch added patch discarded remove patch
@@ -20,7 +20,7 @@  discard block
 block discarded – undo
20 20
 	include_spip('inc/texte');
21 21
 	$titre = $descriptif = '';
22 22
 	if ($type === 'rubrique') {
23
-		$row = sql_fetsel('titre, descriptif', 'spip_rubriques', 'id_rubrique = ' . intval($id));
23
+		$row = sql_fetsel('titre, descriptif', 'spip_rubriques', 'id_rubrique = '.intval($id));
24 24
 		if ($row) {
25 25
 			$titre = typo($row['titre']);
26 26
 			$descriptif = propre($row['descriptif']);
@@ -42,7 +42,7 @@  discard block
 block discarded – undo
42 42
 				include_spip('inc/filtres_images_mini');
43 43
 				$res = image_reduire("<img src='$fid' alt='' />", 100, 48);
44 44
 				if ($res) {
45
-					$res = "<div class='informer__media' style='float: " . $GLOBALS['spip_lang_right'] . '; margin-' . $GLOBALS['spip_lang_right'] . ": -5px; margin-top: -5px;'>$res</div>";
45
+					$res = "<div class='informer__media' style='float: ".$GLOBALS['spip_lang_right'].'; margin-'.$GLOBALS['spip_lang_right'].": -5px; margin-top: -5px;'>$res</div>";
46 46
 				}
47 47
 			}
48 48
 		}
@@ -64,21 +64,21 @@  discard block
 block discarded – undo
64 64
 		'  '
65 65
 	);
66 66
 
67
-	$js_func = $do . '_selection_titre';
67
+	$js_func = $do.'_selection_titre';
68 68
 
69 69
 	return "<div style='display: none;'>"
70
-	. "<input type='text' id='" . $rac . "_sel' value='$id' />"
71
-	. "<input type='text' id='" . $rac . "_sel2' value=\""
70
+	. "<input type='text' id='".$rac."_sel' value='$id' />"
71
+	. "<input type='text' id='".$rac."_sel2' value=\""
72 72
 	. entites_html($titre)
73 73
 	. '" />'
74 74
 	. '</div>'
75 75
 	. "<div class='informer' style='padding: 5px; border-top: 0px;'>"
76 76
 	. '<div class="informer__item">'
77 77
 	. (!$res ? '' : $res)
78
-	. "<p class='informer__titre'><b>" . safehtml($titre) . '</b></p>'
79
-	. (!$descriptif ? '' : "<div class='informer__descriptif'>" . safehtml($descriptif) . '</div>')
78
+	. "<p class='informer__titre'><b>".safehtml($titre).'</b></p>'
79
+	. (!$descriptif ? '' : "<div class='informer__descriptif'>".safehtml($descriptif).'</div>')
80 80
 	. '</div>'
81
-	. "<div class='informer__action' style='clear:both; text-align: " . $GLOBALS['spip_lang_right'] . ";'>"
81
+	. "<div class='informer__action' style='clear:both; text-align: ".$GLOBALS['spip_lang_right'].";'>"
82 82
 	. "<input type='submit' class='fondo btn submit' value='"
83 83
 	. _T('bouton_choisir')
84 84
 	. "'\nonclick=\"$js_func('$titre',$id,'selection_rubrique','id_parent'); return false;\" />"
Please login to merge, or discard this patch.
ecrire/inc/commencer_page.php 2 patches
Indentation   +56 added lines, -56 removed lines patch added patch discarded remove patch
@@ -17,7 +17,7 @@  discard block
 block discarded – undo
17 17
  **/
18 18
 
19 19
 if (!defined('_ECRIRE_INC_VERSION')) {
20
-	return;
20
+    return;
21 21
 }
22 22
 
23 23
 /**
@@ -43,25 +43,25 @@  discard block
 block discarded – undo
43 43
  * @return string Code HTML
44 44
  **/
45 45
 function inc_commencer_page_dist(
46
-	$titre = '',
47
-	$rubrique = 'accueil',
48
-	$sous_rubrique = 'accueil',
49
-	$id_rubrique = '',
50
-	$menu = true,
51
-	$minipres = false,
52
-	$alertes = true
46
+    $titre = '',
47
+    $rubrique = 'accueil',
48
+    $sous_rubrique = 'accueil',
49
+    $id_rubrique = '',
50
+    $menu = true,
51
+    $minipres = false,
52
+    $alertes = true
53 53
 ) {
54 54
 
55
-	include_spip('inc/headers');
55
+    include_spip('inc/headers');
56 56
 
57
-	http_no_cache();
57
+    http_no_cache();
58 58
 
59
-	return init_entete($titre, $id_rubrique, $minipres)
60
-	. init_body($rubrique, $sous_rubrique, $id_rubrique, $menu)
61
-	. "<div id='page'>"
62
-	. auteurs_recemment_connectes($GLOBALS['connect_id_auteur'])
63
-	. ($alertes ? alertes_auteur($GLOBALS['connect_id_auteur']) : '')
64
-	. '<div class="largeur">';
59
+    return init_entete($titre, $id_rubrique, $minipres)
60
+    . init_body($rubrique, $sous_rubrique, $id_rubrique, $menu)
61
+    . "<div id='page'>"
62
+    . auteurs_recemment_connectes($GLOBALS['connect_id_auteur'])
63
+    . ($alertes ? alertes_auteur($GLOBALS['connect_id_auteur']) : '')
64
+    . '<div class="largeur">';
65 65
 }
66 66
 
67 67
 /**
@@ -82,21 +82,21 @@  discard block
 block discarded – undo
82 82
  *     Entête du fichier HTML avec le DOCTYPE
83 83
  */
84 84
 function init_entete($titre = '', $dummy = 0, $minipres = false) {
85
-	include_spip('inc/texte');
86
-	if (!$nom_site_spip = textebrut(typo($GLOBALS['meta']['nom_site']))) {
87
-		$nom_site_spip = _T('info_mon_site_spip');
88
-	}
89
-
90
-	$titre = '['
91
-		. $nom_site_spip
92
-		. ']'
93
-		. ($titre ? ' ' . textebrut(typo($titre)) : '');
94
-
95
-	return _DOCTYPE_ECRIRE
96
-	. html_lang_attributes()
97
-	. "<head>\n"
98
-	. init_head($titre, $dummy, $minipres)
99
-	. "</head>\n";
85
+    include_spip('inc/texte');
86
+    if (!$nom_site_spip = textebrut(typo($GLOBALS['meta']['nom_site']))) {
87
+        $nom_site_spip = _T('info_mon_site_spip');
88
+    }
89
+
90
+    $titre = '['
91
+        . $nom_site_spip
92
+        . ']'
93
+        . ($titre ? ' ' . textebrut(typo($titre)) : '');
94
+
95
+    return _DOCTYPE_ECRIRE
96
+    . html_lang_attributes()
97
+    . "<head>\n"
98
+    . init_head($titre, $dummy, $minipres)
99
+    . "</head>\n";
100 100
 }
101 101
 
102 102
 /**
@@ -110,7 +110,7 @@  discard block
 block discarded – undo
110 110
  * @return string
111 111
  */
112 112
 function init_head($titre = '', $dummy = 0, $minipres = false) {
113
-	return recuperer_fond('prive/squelettes/head/dist', ['titre' => $titre, 'minipres' => $minipres ? ' ' : '']);
113
+    return recuperer_fond('prive/squelettes/head/dist', ['titre' => $titre, 'minipres' => $minipres ? ' ' : '']);
114 114
 }
115 115
 
116 116
 /**
@@ -132,20 +132,20 @@  discard block
 block discarded – undo
132 132
  */
133 133
 function init_body($rubrique = 'accueil', $sous_rubrique = 'accueil', $id_rubrique = '', $menu = true) {
134 134
 
135
-	$res = pipeline('body_prive', "<body class='"
136
-		. init_body_class() . ' ' . _request('exec') . "'"
137
-		. ($GLOBALS['spip_lang_rtl'] ? " dir='rtl'" : '')
138
-		. '>');
135
+    $res = pipeline('body_prive', "<body class='"
136
+        . init_body_class() . ' ' . _request('exec') . "'"
137
+        . ($GLOBALS['spip_lang_rtl'] ? " dir='rtl'" : '')
138
+        . '>');
139 139
 
140
-	if (!$menu) {
141
-		return $res;
142
-	}
140
+    if (!$menu) {
141
+        return $res;
142
+    }
143 143
 
144 144
 
145
-	$bandeau = charger_fonction('bandeau', 'inc');
145
+    $bandeau = charger_fonction('bandeau', 'inc');
146 146
 
147
-	return $res
148
-	. $bandeau();
147
+    return $res
148
+    . $bandeau();
149 149
 }
150 150
 
151 151
 /**
@@ -157,23 +157,23 @@  discard block
 block discarded – undo
157 157
  * @return string Classes CSS (séparées par des espaces)
158 158
  */
159 159
 function init_body_class() {
160
-	$display_modes = [
161
-		0 => 'icones_img_texte' // défaut.
162
-		/*init*/,
163
-		1 => 'icones_texte',
164
-		2 => 'icones_img_texte',
165
-		3 => 'icones_img'
166
-	];
160
+    $display_modes = [
161
+        0 => 'icones_img_texte' // défaut.
162
+        /*init*/,
163
+        1 => 'icones_texte',
164
+        2 => 'icones_img_texte',
165
+        3 => 'icones_img'
166
+    ];
167 167
 
168
-	$prefs = $GLOBALS['visiteur_session']['prefs'] ?? [];
168
+    $prefs = $GLOBALS['visiteur_session']['prefs'] ?? [];
169 169
 
170
-	$display_mode = $display_modes[intval($prefs['display'] ?? 0)] ?? $display_modes[0];
171
-	$spip_display_navigation = isset($prefs['display_navigation']) ? spip_sanitize_classname($prefs['display_navigation']) : 'navigation_avec_icones';
170
+    $display_mode = $display_modes[intval($prefs['display'] ?? 0)] ?? $display_modes[0];
171
+    $spip_display_navigation = isset($prefs['display_navigation']) ? spip_sanitize_classname($prefs['display_navigation']) : 'navigation_avec_icones';
172 172
 
173
-	$couleur = intval($prefs['couleur'] ?? 2);
173
+    $couleur = intval($prefs['couleur'] ?? 2);
174 174
 
175
-	$classes = "spip-theme-colors-$couleur $spip_display_navigation $display_mode";
176
-	return spip_sanitize_classname($classes);
175
+    $classes = "spip-theme-colors-$couleur $spip_display_navigation $display_mode";
176
+    return spip_sanitize_classname($classes);
177 177
 }
178 178
 
179 179
 
@@ -184,5 +184,5 @@  discard block
 block discarded – undo
184 184
  * @return string
185 185
  */
186 186
 function auteurs_recemment_connectes($id_auteur) {
187
-	return recuperer_fond('prive/objets/liste/auteurs_enligne');
187
+    return recuperer_fond('prive/objets/liste/auteurs_enligne');
188 188
 }
Please login to merge, or discard this patch.
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -90,7 +90,7 @@  discard block
 block discarded – undo
90 90
 	$titre = '['
91 91
 		. $nom_site_spip
92 92
 		. ']'
93
-		. ($titre ? ' ' . textebrut(typo($titre)) : '');
93
+		. ($titre ? ' '.textebrut(typo($titre)) : '');
94 94
 
95 95
 	return _DOCTYPE_ECRIRE
96 96
 	. html_lang_attributes()
@@ -133,7 +133,7 @@  discard block
 block discarded – undo
133 133
 function init_body($rubrique = 'accueil', $sous_rubrique = 'accueil', $id_rubrique = '', $menu = true) {
134 134
 
135 135
 	$res = pipeline('body_prive', "<body class='"
136
-		. init_body_class() . ' ' . _request('exec') . "'"
136
+		. init_body_class().' '._request('exec')."'"
137 137
 		. ($GLOBALS['spip_lang_rtl'] ? " dir='rtl'" : '')
138 138
 		. '>');
139 139
 
Please login to merge, or discard this patch.
ecrire/lang/spip_fr_tu.php 1 patch
Indentation   +669 added lines, -669 removed lines patch added patch discarded remove patch
@@ -4,248 +4,248 @@  discard block
 block discarded – undo
4 4
 // ** ne pas modifier le fichier **
5 5
 
6 6
 if (!defined('_ECRIRE_INC_VERSION')) {
7
-	return;
7
+    return;
8 8
 }
9 9
 
10 10
 $GLOBALS[$GLOBALS['idx_lang']] = array(
11 11
 
12
-	// A
13
-	'access_interface_graphique' => 'Retour à l’interface graphique complète',
14
-	'access_mode_texte' => 'Afficher l’interface textuelle simplifiée',
15
-	'admin_debug' => 'debug',
16
-	'admin_modifier_article' => 'Modifier cet article',
17
-	'admin_modifier_auteur' => 'Modifier cet auteur',
18
-	'admin_modifier_breve' => 'Modifier cette brève',
19
-	'admin_modifier_mot' => 'Modifier ce mot-clé',
20
-	'admin_modifier_rubrique' => 'Modifier cette rubrique',
21
-	'admin_recalculer' => 'Recalculer cette page',
22
-	'afficher_calendrier' => 'Afficher le calendrier',
23
-	'afficher_trad' => 'afficher les traductions',
24
-	'alerte_maj_impossible' => '<b>Alerte !</b> La mise à jour de la base SQL vers la version @version@ est impossible, peut-être à cause d’un problème de droit de modification sur la base de données. Contacte ton hébergeur.',
25
-	'alerte_modif_info_concourante' => 'ATTENTION : Cette information a été modifiée par ailleurs. La valeur actuelle est :',
26
-	'analyse_xml' => 'Analyse XML',
27
-	'annuler' => 'Annuler',
28
-	'antispam_champ_vide' => 'Laisse ce champ vide :',
29
-	'articles_recents' => 'Articles les plus récents',
30
-	'attention_champ_mini_nb_caractères' => 'Attention ! @nb@ caractères au minimum',
31
-	'avis_1_erreur_saisie' => 'Il y a 1 erreur dans dans ta saisie, vérifie les informations.',
32
-	'avis_archive_incorrect' => 'le fichier archive n’est pas un fichier SPIP',
33
-	'avis_archive_invalide' => 'le fichier archive n’est pas valide',
34
-	'avis_attention' => 'ATTENTION !',
35
-	'avis_champ_incorrect_type_objet' => 'Nom de champ incorrect @name@ pour objet de type @type@',
36
-	'avis_colonne_inexistante' => 'La colonne @col@ n’existe pas',
37
-	'avis_erreur' => 'Erreur : voir ci-dessous',
38
-	'avis_erreur_connexion' => 'Erreur de connexion',
39
-	'avis_erreur_cookie' => 'problème de cookie',
40
-	'avis_erreur_fonction_contexte' => 'Erreur de programmation. Cette fonction ne doit pas être appelée dans ce contexte.',
41
-	'avis_erreur_mysql' => 'Erreur SQL',
42
-	'avis_erreur_sauvegarde' => 'Erreur dans la sauvegarde (@type@ @id_objet@) !',
43
-	'avis_erreur_visiteur' => 'Problème d’accès à l’espace privé',
44
-	'avis_nb_erreurs_saisie' => 'Il y a @nb@ erreurs dans ta saisie, vérifie les informations.',
12
+    // A
13
+    'access_interface_graphique' => 'Retour à l’interface graphique complète',
14
+    'access_mode_texte' => 'Afficher l’interface textuelle simplifiée',
15
+    'admin_debug' => 'debug',
16
+    'admin_modifier_article' => 'Modifier cet article',
17
+    'admin_modifier_auteur' => 'Modifier cet auteur',
18
+    'admin_modifier_breve' => 'Modifier cette brève',
19
+    'admin_modifier_mot' => 'Modifier ce mot-clé',
20
+    'admin_modifier_rubrique' => 'Modifier cette rubrique',
21
+    'admin_recalculer' => 'Recalculer cette page',
22
+    'afficher_calendrier' => 'Afficher le calendrier',
23
+    'afficher_trad' => 'afficher les traductions',
24
+    'alerte_maj_impossible' => '<b>Alerte !</b> La mise à jour de la base SQL vers la version @version@ est impossible, peut-être à cause d’un problème de droit de modification sur la base de données. Contacte ton hébergeur.',
25
+    'alerte_modif_info_concourante' => 'ATTENTION : Cette information a été modifiée par ailleurs. La valeur actuelle est :',
26
+    'analyse_xml' => 'Analyse XML',
27
+    'annuler' => 'Annuler',
28
+    'antispam_champ_vide' => 'Laisse ce champ vide :',
29
+    'articles_recents' => 'Articles les plus récents',
30
+    'attention_champ_mini_nb_caractères' => 'Attention ! @nb@ caractères au minimum',
31
+    'avis_1_erreur_saisie' => 'Il y a 1 erreur dans dans ta saisie, vérifie les informations.',
32
+    'avis_archive_incorrect' => 'le fichier archive n’est pas un fichier SPIP',
33
+    'avis_archive_invalide' => 'le fichier archive n’est pas valide',
34
+    'avis_attention' => 'ATTENTION !',
35
+    'avis_champ_incorrect_type_objet' => 'Nom de champ incorrect @name@ pour objet de type @type@',
36
+    'avis_colonne_inexistante' => 'La colonne @col@ n’existe pas',
37
+    'avis_erreur' => 'Erreur : voir ci-dessous',
38
+    'avis_erreur_connexion' => 'Erreur de connexion',
39
+    'avis_erreur_cookie' => 'problème de cookie',
40
+    'avis_erreur_fonction_contexte' => 'Erreur de programmation. Cette fonction ne doit pas être appelée dans ce contexte.',
41
+    'avis_erreur_mysql' => 'Erreur SQL',
42
+    'avis_erreur_sauvegarde' => 'Erreur dans la sauvegarde (@type@ @id_objet@) !',
43
+    'avis_erreur_visiteur' => 'Problème d’accès à l’espace privé',
44
+    'avis_nb_erreurs_saisie' => 'Il y a @nb@ erreurs dans ta saisie, vérifie les informations.',
45 45
 
46
-	// B
47
-	'barre_a_accent_grave' => 'Insérer un A accent grave majuscule',
48
-	'barre_aide' => 'Utilise les raccourcis typographiques pour enrichir ta mise en page',
49
-	'barre_e_accent_aigu' => 'Insérer un E accent aigu majuscule',
50
-	'barre_eo' => 'Insérer un E dans l’O',
51
-	'barre_eo_maj' => 'Insérer un E dans l’O majuscule',
52
-	'barre_euro' => 'Insérer le symbole ?',
53
-	'barre_gras' => 'Mettre en {{gras}}',
54
-	'barre_guillemets' => 'Entourer de « guillemets français »',
55
-	'barre_guillemets_simples' => 'Entourer de ?guillemets de second niveau ?',
56
-	'barre_intertitre' => 'Transformer en {{{intertitre}}}',
57
-	'barre_italic' => 'Mettre en {italique}',
58
-	'barre_lien' => 'Transformer en [lien hypertexte->http://...]',
59
-	'barre_lien_input' => 'Indiquer l’adresse de ton lien (tu peux indiquer une adresse Web sous la forme http://www.monsite/com ou simplement indiquer le numéro d’un article de ce site.',
60
-	'barre_note' => 'Transformer en [[Note de bas de page]]',
61
-	'barre_paragraphe' => 'Crée un paragraphe',
62
-	'barre_quote' => '<quote>Citer un message</quote>',
63
-	'bouton_changer' => 'Changer',
64
-	'bouton_chercher' => 'Chercher',
65
-	'bouton_choisir' => 'Choisir',
66
-	'bouton_deplacer' => 'Déplacer',
67
-	'bouton_download' => 'Télécharger',
68
-	'bouton_enregistrer' => 'Enregistrer',
69
-	'bouton_radio_desactiver_messagerie_interne' => 'Désactiver la messagerie interne',
70
-	'bouton_radio_envoi_annonces' => 'Envoyer les annonces éditoriales',
71
-	'bouton_radio_non_envoi_annonces' => 'Ne pas envoyer d’annonces',
72
-	'bouton_radio_non_envoi_liste_nouveautes' => 'Ne pas envoyer la liste des nouveautés',
73
-	'bouton_recharger_page' => 'recharger cette page',
74
-	'bouton_telecharger' => 'Télécharger',
75
-	'bouton_upload' => 'Téléverser',
76
-	'bouton_valider' => 'Valider',
46
+    // B
47
+    'barre_a_accent_grave' => 'Insérer un A accent grave majuscule',
48
+    'barre_aide' => 'Utilise les raccourcis typographiques pour enrichir ta mise en page',
49
+    'barre_e_accent_aigu' => 'Insérer un E accent aigu majuscule',
50
+    'barre_eo' => 'Insérer un E dans l’O',
51
+    'barre_eo_maj' => 'Insérer un E dans l’O majuscule',
52
+    'barre_euro' => 'Insérer le symbole ?',
53
+    'barre_gras' => 'Mettre en {{gras}}',
54
+    'barre_guillemets' => 'Entourer de « guillemets français »',
55
+    'barre_guillemets_simples' => 'Entourer de ?guillemets de second niveau ?',
56
+    'barre_intertitre' => 'Transformer en {{{intertitre}}}',
57
+    'barre_italic' => 'Mettre en {italique}',
58
+    'barre_lien' => 'Transformer en [lien hypertexte->http://...]',
59
+    'barre_lien_input' => 'Indiquer l’adresse de ton lien (tu peux indiquer une adresse Web sous la forme http://www.monsite/com ou simplement indiquer le numéro d’un article de ce site.',
60
+    'barre_note' => 'Transformer en [[Note de bas de page]]',
61
+    'barre_paragraphe' => 'Crée un paragraphe',
62
+    'barre_quote' => '<quote>Citer un message</quote>',
63
+    'bouton_changer' => 'Changer',
64
+    'bouton_chercher' => 'Chercher',
65
+    'bouton_choisir' => 'Choisir',
66
+    'bouton_deplacer' => 'Déplacer',
67
+    'bouton_download' => 'Télécharger',
68
+    'bouton_enregistrer' => 'Enregistrer',
69
+    'bouton_radio_desactiver_messagerie_interne' => 'Désactiver la messagerie interne',
70
+    'bouton_radio_envoi_annonces' => 'Envoyer les annonces éditoriales',
71
+    'bouton_radio_non_envoi_annonces' => 'Ne pas envoyer d’annonces',
72
+    'bouton_radio_non_envoi_liste_nouveautes' => 'Ne pas envoyer la liste des nouveautés',
73
+    'bouton_recharger_page' => 'recharger cette page',
74
+    'bouton_telecharger' => 'Télécharger',
75
+    'bouton_upload' => 'Téléverser',
76
+    'bouton_valider' => 'Valider',
77 77
 
78
-	// C
79
-	'cal_apresmidi' => 'après-midi',
80
-	'cal_jour_entier' => 'jour entier',
81
-	'cal_matin' => 'matin',
82
-	'cal_par_jour' => 'calendrier par jour',
83
-	'cal_par_mois' => 'calendrier par mois',
84
-	'cal_par_semaine' => 'calendrier par semaine',
85
-	'choix_couleur_interface' => 'couleur ',
86
-	'choix_interface' => 'choix  de l’interface',
87
-	'colonne' => 'Colonne',
88
-	'confirm_changer_statut' => 'Attention, tu as demandé à changer le statut de cet élément. Souhaites-tu continuer ?',
89
-	'correcte' => 'correcte',
78
+    // C
79
+    'cal_apresmidi' => 'après-midi',
80
+    'cal_jour_entier' => 'jour entier',
81
+    'cal_matin' => 'matin',
82
+    'cal_par_jour' => 'calendrier par jour',
83
+    'cal_par_mois' => 'calendrier par mois',
84
+    'cal_par_semaine' => 'calendrier par semaine',
85
+    'choix_couleur_interface' => 'couleur ',
86
+    'choix_interface' => 'choix  de l’interface',
87
+    'colonne' => 'Colonne',
88
+    'confirm_changer_statut' => 'Attention, tu as demandé à changer le statut de cet élément. Souhaites-tu continuer ?',
89
+    'correcte' => 'correcte',
90 90
 
91
-	// D
92
-	'date_aujourdhui' => 'aujourd’hui',
93
-	'date_avant_jc' => 'av. J.C.',
94
-	'date_dans' => 'dans @delai@',
95
-	'date_de_mois_1' => '@j@ @nommois@',
96
-	'date_de_mois_10' => '@j@ @nommois@',
97
-	'date_de_mois_11' => '@j@ @nommois@',
98
-	'date_de_mois_12' => '@j@ @nommois@',
99
-	'date_de_mois_2' => '@j@ @nommois@',
100
-	'date_de_mois_3' => '@j@ @nommois@',
101
-	'date_de_mois_4' => '@j@ @nommois@',
102
-	'date_de_mois_5' => '@j@ @nommois@',
103
-	'date_de_mois_6' => '@j@ @nommois@',
104
-	'date_de_mois_7' => '@j@ @nommois@',
105
-	'date_de_mois_8' => '@j@ @nommois@',
106
-	'date_de_mois_9' => '@j@ @nommois@',
107
-	'date_demain' => 'demain',
108
-	'date_fmt_heures_minutes' => '@h@h@m@min',
109
-	'date_fmt_heures_minutes_court' => '@h@h@m@',
110
-	'date_fmt_jour' => '@nomjour@ @jour@',
111
-	'date_fmt_jour_heure' => '@jour@ à @heure@',
112
-	'date_fmt_jour_heure_debut_fin' => 'le @jour@ de @heure_debut@ à @heure_fin@',
113
-	'date_fmt_jour_heure_debut_fin_abbr' => 'le @dtstart@@jour@ de @heure_debut@@dtabbr@ à @dtstart@@heure_fin@@dtend@',
114
-	'date_fmt_jour_mois' => '@jour@ @nommois@',
115
-	'date_fmt_jour_mois_annee' => '@jour@ @nommois@ @annee@',
116
-	'date_fmt_mois_annee' => '@nommois@ @annee@',
117
-	'date_fmt_nomjour' => '@nomjour@ @date@',
118
-	'date_fmt_nomjour_date' => 'le @nomjour@ @date@',
119
-	'date_fmt_periode' => 'Du @date_debut@ au @date_fin@',
120
-	'date_fmt_periode_abbr' => 'Du @dtart@@date_debut@@dtabbr@ au @dtend@@date_fin@@dtabbr@',
121
-	'date_fmt_periode_from' => 'Du',
122
-	'date_fmt_periode_to' => 'au',
123
-	'date_fmt_saison_annee' => '@saison@ @annee@',
124
-	'date_heures' => 'heures',
125
-	'date_hier' => 'hier',
126
-	'date_il_y_a' => 'il y a @delai@',
127
-	'date_jnum1' => '1er',
128
-	'date_jnum10' => '10',
129
-	'date_jnum11' => '11',
130
-	'date_jnum12' => '12',
131
-	'date_jnum13' => '13',
132
-	'date_jnum14' => '14',
133
-	'date_jnum15' => '15',
134
-	'date_jnum16' => '16',
135
-	'date_jnum17' => '17',
136
-	'date_jnum18' => '18',
137
-	'date_jnum19' => '19',
138
-	'date_jnum2' => '2',
139
-	'date_jnum20' => '20',
140
-	'date_jnum21' => '21',
141
-	'date_jnum22' => '22',
142
-	'date_jnum23' => '23',
143
-	'date_jnum24' => '24',
144
-	'date_jnum25' => '25',
145
-	'date_jnum26' => '26',
146
-	'date_jnum27' => '27',
147
-	'date_jnum28' => '28',
148
-	'date_jnum29' => '29',
149
-	'date_jnum3' => '3',
150
-	'date_jnum30' => '30',
151
-	'date_jnum31' => '31',
152
-	'date_jnum4' => '4',
153
-	'date_jnum5' => '5',
154
-	'date_jnum6' => '6',
155
-	'date_jnum7' => '7',
156
-	'date_jnum8' => '8',
157
-	'date_jnum9' => '9',
158
-	'date_jour_1' => 'dimanche',
159
-	'date_jour_1_abbr' => 'dim.',
160
-	'date_jour_1_initiale' => 'd.',
161
-	'date_jour_2' => 'lundi',
162
-	'date_jour_2_abbr' => 'lun.',
163
-	'date_jour_2_initiale' => 'l.',
164
-	'date_jour_3' => 'mardi',
165
-	'date_jour_3_abbr' => 'mar.',
166
-	'date_jour_3_initiale' => 'm.',
167
-	'date_jour_4' => 'mercredi',
168
-	'date_jour_4_abbr' => 'mer.',
169
-	'date_jour_4_initiale' => 'm.',
170
-	'date_jour_5' => 'jeudi',
171
-	'date_jour_5_abbr' => 'jeu.',
172
-	'date_jour_5_initiale' => 'j.',
173
-	'date_jour_6' => 'vendredi',
174
-	'date_jour_6_abbr' => 'ven.',
175
-	'date_jour_6_initiale' => 'v.',
176
-	'date_jour_7' => 'samedi',
177
-	'date_jour_7_abbr' => 'sam.',
178
-	'date_jour_7_initiale' => 's.',
179
-	'date_jours' => 'jours',
180
-	'date_minutes' => 'minutes',
181
-	'date_mois' => 'mois',
182
-	'date_mois_1' => 'janvier',
183
-	'date_mois_10' => 'octobre',
184
-	'date_mois_10_abbr' => 'oct.',
185
-	'date_mois_11' => 'novembre',
186
-	'date_mois_11_abbr' => 'nov.',
187
-	'date_mois_12' => 'décembre',
188
-	'date_mois_12_abbr' => 'déc.',
189
-	'date_mois_1_abbr' => 'janv.',
190
-	'date_mois_2' => 'février',
191
-	'date_mois_2_abbr' => 'févr.',
192
-	'date_mois_3' => 'mars',
193
-	'date_mois_3_abbr' => 'mars',
194
-	'date_mois_4' => 'avril',
195
-	'date_mois_4_abbr' => 'avr.',
196
-	'date_mois_5' => 'mai',
197
-	'date_mois_5_abbr' => 'mai',
198
-	'date_mois_6' => 'juin',
199
-	'date_mois_6_abbr' => 'juin',
200
-	'date_mois_7' => 'juillet',
201
-	'date_mois_7_abbr' => 'juil.',
202
-	'date_mois_8' => 'août',
203
-	'date_mois_8_abbr' => 'août',
204
-	'date_mois_9' => 'septembre',
205
-	'date_mois_9_abbr' => 'sept.',
206
-	'date_saison_1' => 'hiver',
207
-	'date_saison_2' => 'printemps',
208
-	'date_saison_3' => 'été',
209
-	'date_saison_4' => 'automne',
210
-	'date_secondes' => 'secondes',
211
-	'date_semaines' => 'semaines',
212
-	'date_un_mois' => 'mois',
213
-	'date_une_heure' => 'heure',
214
-	'date_une_minute' => 'minute',
215
-	'date_une_seconde' => 'seconde',
216
-	'date_une_semaine' => 'semaine',
217
-	'dirs_commencer' => ' afin de commencer réellement l’installation',
218
-	'dirs_preliminaire' => 'Préliminaire : <b>Régler les droits d’accès</b>',
219
-	'dirs_probleme_droits' => 'Problème de droits d’accès',
220
-	'dirs_repertoires_absents' => '<p><b>Les répertoires suivants n’ont pas été trouvés :</b></p><ul>@bad_dirs@.</ul>
91
+    // D
92
+    'date_aujourdhui' => 'aujourd’hui',
93
+    'date_avant_jc' => 'av. J.C.',
94
+    'date_dans' => 'dans @delai@',
95
+    'date_de_mois_1' => '@j@ @nommois@',
96
+    'date_de_mois_10' => '@j@ @nommois@',
97
+    'date_de_mois_11' => '@j@ @nommois@',
98
+    'date_de_mois_12' => '@j@ @nommois@',
99
+    'date_de_mois_2' => '@j@ @nommois@',
100
+    'date_de_mois_3' => '@j@ @nommois@',
101
+    'date_de_mois_4' => '@j@ @nommois@',
102
+    'date_de_mois_5' => '@j@ @nommois@',
103
+    'date_de_mois_6' => '@j@ @nommois@',
104
+    'date_de_mois_7' => '@j@ @nommois@',
105
+    'date_de_mois_8' => '@j@ @nommois@',
106
+    'date_de_mois_9' => '@j@ @nommois@',
107
+    'date_demain' => 'demain',
108
+    'date_fmt_heures_minutes' => '@h@h@m@min',
109
+    'date_fmt_heures_minutes_court' => '@h@h@m@',
110
+    'date_fmt_jour' => '@nomjour@ @jour@',
111
+    'date_fmt_jour_heure' => '@jour@ à @heure@',
112
+    'date_fmt_jour_heure_debut_fin' => 'le @jour@ de @heure_debut@ à @heure_fin@',
113
+    'date_fmt_jour_heure_debut_fin_abbr' => 'le @dtstart@@jour@ de @heure_debut@@dtabbr@ à @dtstart@@heure_fin@@dtend@',
114
+    'date_fmt_jour_mois' => '@jour@ @nommois@',
115
+    'date_fmt_jour_mois_annee' => '@jour@ @nommois@ @annee@',
116
+    'date_fmt_mois_annee' => '@nommois@ @annee@',
117
+    'date_fmt_nomjour' => '@nomjour@ @date@',
118
+    'date_fmt_nomjour_date' => 'le @nomjour@ @date@',
119
+    'date_fmt_periode' => 'Du @date_debut@ au @date_fin@',
120
+    'date_fmt_periode_abbr' => 'Du @dtart@@date_debut@@dtabbr@ au @dtend@@date_fin@@dtabbr@',
121
+    'date_fmt_periode_from' => 'Du',
122
+    'date_fmt_periode_to' => 'au',
123
+    'date_fmt_saison_annee' => '@saison@ @annee@',
124
+    'date_heures' => 'heures',
125
+    'date_hier' => 'hier',
126
+    'date_il_y_a' => 'il y a @delai@',
127
+    'date_jnum1' => '1er',
128
+    'date_jnum10' => '10',
129
+    'date_jnum11' => '11',
130
+    'date_jnum12' => '12',
131
+    'date_jnum13' => '13',
132
+    'date_jnum14' => '14',
133
+    'date_jnum15' => '15',
134
+    'date_jnum16' => '16',
135
+    'date_jnum17' => '17',
136
+    'date_jnum18' => '18',
137
+    'date_jnum19' => '19',
138
+    'date_jnum2' => '2',
139
+    'date_jnum20' => '20',
140
+    'date_jnum21' => '21',
141
+    'date_jnum22' => '22',
142
+    'date_jnum23' => '23',
143
+    'date_jnum24' => '24',
144
+    'date_jnum25' => '25',
145
+    'date_jnum26' => '26',
146
+    'date_jnum27' => '27',
147
+    'date_jnum28' => '28',
148
+    'date_jnum29' => '29',
149
+    'date_jnum3' => '3',
150
+    'date_jnum30' => '30',
151
+    'date_jnum31' => '31',
152
+    'date_jnum4' => '4',
153
+    'date_jnum5' => '5',
154
+    'date_jnum6' => '6',
155
+    'date_jnum7' => '7',
156
+    'date_jnum8' => '8',
157
+    'date_jnum9' => '9',
158
+    'date_jour_1' => 'dimanche',
159
+    'date_jour_1_abbr' => 'dim.',
160
+    'date_jour_1_initiale' => 'd.',
161
+    'date_jour_2' => 'lundi',
162
+    'date_jour_2_abbr' => 'lun.',
163
+    'date_jour_2_initiale' => 'l.',
164
+    'date_jour_3' => 'mardi',
165
+    'date_jour_3_abbr' => 'mar.',
166
+    'date_jour_3_initiale' => 'm.',
167
+    'date_jour_4' => 'mercredi',
168
+    'date_jour_4_abbr' => 'mer.',
169
+    'date_jour_4_initiale' => 'm.',
170
+    'date_jour_5' => 'jeudi',
171
+    'date_jour_5_abbr' => 'jeu.',
172
+    'date_jour_5_initiale' => 'j.',
173
+    'date_jour_6' => 'vendredi',
174
+    'date_jour_6_abbr' => 'ven.',
175
+    'date_jour_6_initiale' => 'v.',
176
+    'date_jour_7' => 'samedi',
177
+    'date_jour_7_abbr' => 'sam.',
178
+    'date_jour_7_initiale' => 's.',
179
+    'date_jours' => 'jours',
180
+    'date_minutes' => 'minutes',
181
+    'date_mois' => 'mois',
182
+    'date_mois_1' => 'janvier',
183
+    'date_mois_10' => 'octobre',
184
+    'date_mois_10_abbr' => 'oct.',
185
+    'date_mois_11' => 'novembre',
186
+    'date_mois_11_abbr' => 'nov.',
187
+    'date_mois_12' => 'décembre',
188
+    'date_mois_12_abbr' => 'déc.',
189
+    'date_mois_1_abbr' => 'janv.',
190
+    'date_mois_2' => 'février',
191
+    'date_mois_2_abbr' => 'févr.',
192
+    'date_mois_3' => 'mars',
193
+    'date_mois_3_abbr' => 'mars',
194
+    'date_mois_4' => 'avril',
195
+    'date_mois_4_abbr' => 'avr.',
196
+    'date_mois_5' => 'mai',
197
+    'date_mois_5_abbr' => 'mai',
198
+    'date_mois_6' => 'juin',
199
+    'date_mois_6_abbr' => 'juin',
200
+    'date_mois_7' => 'juillet',
201
+    'date_mois_7_abbr' => 'juil.',
202
+    'date_mois_8' => 'août',
203
+    'date_mois_8_abbr' => 'août',
204
+    'date_mois_9' => 'septembre',
205
+    'date_mois_9_abbr' => 'sept.',
206
+    'date_saison_1' => 'hiver',
207
+    'date_saison_2' => 'printemps',
208
+    'date_saison_3' => 'été',
209
+    'date_saison_4' => 'automne',
210
+    'date_secondes' => 'secondes',
211
+    'date_semaines' => 'semaines',
212
+    'date_un_mois' => 'mois',
213
+    'date_une_heure' => 'heure',
214
+    'date_une_minute' => 'minute',
215
+    'date_une_seconde' => 'seconde',
216
+    'date_une_semaine' => 'semaine',
217
+    'dirs_commencer' => ' afin de commencer réellement l’installation',
218
+    'dirs_preliminaire' => 'Préliminaire : <b>Régler les droits d’accès</b>',
219
+    'dirs_probleme_droits' => 'Problème de droits d’accès',
220
+    'dirs_repertoires_absents' => '<p><b>Les répertoires suivants n’ont pas été trouvés :</b></p><ul>@bad_dirs@.</ul>
221 221
   <p>Il est probable que cela soit dû à un problème de mauvaise mise en majuscules ou minuscules.
222 222
   Vérifie que les minuscules et majuscules de ces répertoires concordent bien avec ce qui est affiché
223 223
   ci-dessus ; si ce n’est pas le cas, renomme les répertoires avec ton logiciel FTP de façon à corriger l’erreur.</p>
224 224
   <p>Une fois cette manipulation effectuée, tu pourras ',
225
-	'dirs_repertoires_suivants' => '<p><b>Les répertoires suivants ne sont pas accessibles en écriture :</b></p> <ul>@bad_dirs@</ul>
225
+    'dirs_repertoires_suivants' => '<p><b>Les répertoires suivants ne sont pas accessibles en écriture :</b></p> <ul>@bad_dirs@</ul>
226 226
   <p>Pour y remédier, utilise ton client FTP afin de régler les droits d’accès de chacun
227 227
   de ces répertoires. La procédure est expliquée en détail dans le guide d’installation.</p>
228 228
   <p>Une fois cette manipulation effectuée, tu pourras ',
229
-	'double_occurrence' => 'Double occurrence de @balise@',
229
+    'double_occurrence' => 'Double occurrence de @balise@',
230 230
 
231
-	// E
232
-	'en_cours' => 'en cours',
233
-	'envoi_via_le_site' => 'Envoi via le site',
234
-	'erreur' => 'Erreur',
235
-	'erreur_balise_non_fermee' => 'dernière balise non refermée :',
236
-	'erreur_technique_ajaxform' => 'Ooops. Une erreur innatendue a empêché de soumettre le formulaire. Tu peux essayer à nouveau.',
237
-	'erreur_technique_enregistrement_champs' => 'Une erreur technique a empêché l’enregistrement correct du champ @champs@.',
238
-	'erreur_technique_enregistrement_impossible' => 'Une erreur technique a empêché l’enregistrement.',
239
-	'erreur_texte' => 'erreur(s)',
240
-	'etape' => 'Étape',
231
+    // E
232
+    'en_cours' => 'en cours',
233
+    'envoi_via_le_site' => 'Envoi via le site',
234
+    'erreur' => 'Erreur',
235
+    'erreur_balise_non_fermee' => 'dernière balise non refermée :',
236
+    'erreur_technique_ajaxform' => 'Ooops. Une erreur innatendue a empêché de soumettre le formulaire. Tu peux essayer à nouveau.',
237
+    'erreur_technique_enregistrement_champs' => 'Une erreur technique a empêché l’enregistrement correct du champ @champs@.',
238
+    'erreur_technique_enregistrement_impossible' => 'Une erreur technique a empêché l’enregistrement.',
239
+    'erreur_texte' => 'erreur(s)',
240
+    'etape' => 'Étape',
241 241
 
242
-	// F
243
-	'fichier_introuvable' => 'Fichier @fichier@ introuvable.',
244
-	'fonction_introuvable' => 'Fonction @fonction@() introuvable.',
245
-	'form_auteur_confirmation' => 'Confirme ton adresse email',
246
-	'form_auteur_email_modifie' => 'Ton adresse email a été modifiée.',
247
-	'form_auteur_envoi_mail_confirmation' => 'Un courrier électronique de confirmation vient d’être envoyé à @email@. Visite l’adresse Web mentionnée dans ce courrier pour valider ton adresse mail.',
248
-	'form_auteur_mail_confirmation' => 'Salut,
242
+    // F
243
+    'fichier_introuvable' => 'Fichier @fichier@ introuvable.',
244
+    'fonction_introuvable' => 'Fonction @fonction@() introuvable.',
245
+    'form_auteur_confirmation' => 'Confirme ton adresse email',
246
+    'form_auteur_email_modifie' => 'Ton adresse email a été modifiée.',
247
+    'form_auteur_envoi_mail_confirmation' => 'Un courrier électronique de confirmation vient d’être envoyé à @email@. Visite l’adresse Web mentionnée dans ce courrier pour valider ton adresse mail.',
248
+    'form_auteur_mail_confirmation' => 'Salut,
249 249
 
250 250
 Tu as demandé à changer ton adresse email.
251 251
 Pour confirmer ta nouvelle adresse, il suffit de te connecter à
@@ -254,346 +254,346 @@  discard block
 block discarded – undo
254 254
 
255 255
     @url@
256 256
 ',
257
-	'form_deja_inscrit' => 'Tu es déjà inscrit.',
258
-	'form_email_non_valide' => 'Ton adresse email n’est pas valide.',
259
-	'form_forum_access_refuse' => 'Tu n’as plus accès à ce site.',
260
-	'form_forum_bonjour' => 'Salut @nom@,',
261
-	'form_forum_confirmer_email' => 'Pour confirmer ton adresse email, va à cette adresse : @url_confirm@',
262
-	'form_forum_email_deja_enregistre' => 'Cette adresse email est déjà enregistrée, tu peux donc utiliser ton mot de passe habituel.',
263
-	'form_forum_identifiant_mail' => 'Ton nouvel identifiant vient de t’être envoyé par email.',
264
-	'form_forum_identifiants' => 'Identifiants personnels',
265
-	'form_forum_indiquer_nom_email' => 'Indique ici ton nom et ton adresse email. Ton identifiant personnel te parviendra rapidement, par courrier électronique.',
266
-	'form_forum_login' => 'login :',
267
-	'form_forum_message_auto' => '(ceci est un message automatique)',
268
-	'form_forum_pass' => 'mot de passe :',
269
-	'form_forum_probleme_mail' => 'Problème de mail : l’identifiant ne peut pas être envoyé.',
270
-	'form_forum_voici1' => 'Voici tes identifiants pour pouvoir participer à la vie du site "@nom_site_spip@" (@adresse_site@) :',
271
-	'form_forum_voici2' => 'Voici tes identifiants pour proposer des articles sur
257
+    'form_deja_inscrit' => 'Tu es déjà inscrit.',
258
+    'form_email_non_valide' => 'Ton adresse email n’est pas valide.',
259
+    'form_forum_access_refuse' => 'Tu n’as plus accès à ce site.',
260
+    'form_forum_bonjour' => 'Salut @nom@,',
261
+    'form_forum_confirmer_email' => 'Pour confirmer ton adresse email, va à cette adresse : @url_confirm@',
262
+    'form_forum_email_deja_enregistre' => 'Cette adresse email est déjà enregistrée, tu peux donc utiliser ton mot de passe habituel.',
263
+    'form_forum_identifiant_mail' => 'Ton nouvel identifiant vient de t’être envoyé par email.',
264
+    'form_forum_identifiants' => 'Identifiants personnels',
265
+    'form_forum_indiquer_nom_email' => 'Indique ici ton nom et ton adresse email. Ton identifiant personnel te parviendra rapidement, par courrier électronique.',
266
+    'form_forum_login' => 'login :',
267
+    'form_forum_message_auto' => '(ceci est un message automatique)',
268
+    'form_forum_pass' => 'mot de passe :',
269
+    'form_forum_probleme_mail' => 'Problème de mail : l’identifiant ne peut pas être envoyé.',
270
+    'form_forum_voici1' => 'Voici tes identifiants pour pouvoir participer à la vie du site "@nom_site_spip@" (@adresse_site@) :',
271
+    'form_forum_voici2' => 'Voici tes identifiants pour proposer des articles sur
272 272
 le site "@nom_site_spip@" (@adresse_login@) :',
273
-	'form_indiquer_email' => 'Indique ton adresse email.',
274
-	'form_indiquer_nom' => 'Indique ton nom.',
275
-	'form_indiquer_nom_site' => 'Indique le nom de ton site.',
276
-	'form_pet_deja_enregistre' => 'Ce site est déjà enregistré',
277
-	'form_pet_signature_pasprise' => 'Ta signature n’est pas prise en compte.',
278
-	'form_prop_confirmer_envoi' => 'Confirmer l’envoi',
279
-	'form_prop_description' => 'Description/commentaire',
280
-	'form_prop_enregistre' => 'Ta proposition est enregistrée, elle apparaîtra en ligne après validation par les responsables de ce site.',
281
-	'form_prop_envoyer' => 'Envoyer un message',
282
-	'form_prop_indiquer_email' => 'Indiquer une adresse email valide',
283
-	'form_prop_indiquer_nom_site' => 'Indiquer le nom du site.',
284
-	'form_prop_indiquer_sujet' => 'Indiquer un sujet',
285
-	'form_prop_message_envoye' => 'Message envoyé',
286
-	'form_prop_non_enregistre' => 'Ta proposition n’a pas été enregistrée.',
287
-	'form_prop_sujet' => 'Sujet',
288
-	'form_prop_url_site' => 'Adresse URL du site',
289
-	'format_date_attendu' => 'Saisir une date au format jj/mm/aaaa.',
290
-	'format_date_incorrecte' => 'La date ou son format est incorrect',
291
-	'format_heure_attendu' => 'Saisir une heure au format hh:mm.',
292
-	'format_heure_incorrecte' => 'L’heure ou son format est incorrect',
293
-	'forum_non_inscrit' => 'Tu n’es pas inscrit, ou l’adresse ou le mot de passe sont erronés.',
294
-	'forum_par_auteur' => 'par @auteur@',
295
-	'forum_titre_erreur' => 'Erreur...',
273
+    'form_indiquer_email' => 'Indique ton adresse email.',
274
+    'form_indiquer_nom' => 'Indique ton nom.',
275
+    'form_indiquer_nom_site' => 'Indique le nom de ton site.',
276
+    'form_pet_deja_enregistre' => 'Ce site est déjà enregistré',
277
+    'form_pet_signature_pasprise' => 'Ta signature n’est pas prise en compte.',
278
+    'form_prop_confirmer_envoi' => 'Confirmer l’envoi',
279
+    'form_prop_description' => 'Description/commentaire',
280
+    'form_prop_enregistre' => 'Ta proposition est enregistrée, elle apparaîtra en ligne après validation par les responsables de ce site.',
281
+    'form_prop_envoyer' => 'Envoyer un message',
282
+    'form_prop_indiquer_email' => 'Indiquer une adresse email valide',
283
+    'form_prop_indiquer_nom_site' => 'Indiquer le nom du site.',
284
+    'form_prop_indiquer_sujet' => 'Indiquer un sujet',
285
+    'form_prop_message_envoye' => 'Message envoyé',
286
+    'form_prop_non_enregistre' => 'Ta proposition n’a pas été enregistrée.',
287
+    'form_prop_sujet' => 'Sujet',
288
+    'form_prop_url_site' => 'Adresse URL du site',
289
+    'format_date_attendu' => 'Saisir une date au format jj/mm/aaaa.',
290
+    'format_date_incorrecte' => 'La date ou son format est incorrect',
291
+    'format_heure_attendu' => 'Saisir une heure au format hh:mm.',
292
+    'format_heure_incorrecte' => 'L’heure ou son format est incorrect',
293
+    'forum_non_inscrit' => 'Tu n’es pas inscrit, ou l’adresse ou le mot de passe sont erronés.',
294
+    'forum_par_auteur' => 'par @auteur@',
295
+    'forum_titre_erreur' => 'Erreur...',
296 296
 
297
-	// I
298
-	'ical_texte_rss_articles' => 'Le fichier « backend » des articles de ce site se trouve à l’adresse :',
299
-	'ical_texte_rss_articles2' => 'Tu peux également obtenir des fichiers « backend » pour les articles de chaque rubrique du site :',
300
-	'ical_texte_rss_breves' => 'Il existe de plus un fichier contenant les brèves du site. En précisant un numéro de rubrique, tu obtiendras uniquement les brèves de cette rubrique.',
301
-	'icone_a_suivre' => 'À suivre',
302
-	'icone_admin_site' => 'Administration du site',
303
-	'icone_agenda' => 'Agenda',
304
-	'icone_aide_ligne' => 'Aide',
305
-	'icone_articles' => 'Articles',
306
-	'icone_auteurs' => 'Auteurs',
307
-	'icone_brouteur' => 'Navigation rapide',
308
-	'icone_configuration_site' => 'Configuration',
309
-	'icone_configurer_site' => 'Configurer ton site',
310
-	'icone_creer_nouvel_auteur' => 'Créer un nouvel auteur',
311
-	'icone_creer_rubrique' => 'Créer une rubrique',
312
-	'icone_creer_sous_rubrique' => 'Créer une sous-rubrique',
313
-	'icone_deconnecter' => 'Se déconnecter',
314
-	'icone_discussions' => 'Discussions',
315
-	'icone_doc_rubrique' => 'Documents des rubriques',
316
-	'icone_ecrire_article' => 'Écrire un nouvel article',
317
-	'icone_edition_site' => 'Édition',
318
-	'icone_gestion_langues' => 'Gestion des langues',
319
-	'icone_informations_personnelles' => 'Informations personnelles',
320
-	'icone_interface_complet' => 'interface complète',
321
-	'icone_interface_simple' => 'Interface simplifiée',
322
-	'icone_maintenance_site' => 'Maintenance du site',
323
-	'icone_messagerie_personnelle' => 'Messagerie personnelle',
324
-	'icone_repartition_debut' => 'Afficher la répartition depuis le début',
325
-	'icone_rubriques' => 'Rubriques',
326
-	'icone_sauver_site' => 'Sauvegarde du site',
327
-	'icone_site_entier' => 'Tout le site',
328
-	'icone_sites_references' => 'Sites référencés',
329
-	'icone_statistiques' => 'Statistiques du site',
330
-	'icone_suivi_activite' => 'Suivre la vie du site',
331
-	'icone_suivi_actualite' => 'Évolution du site',
332
-	'icone_suivi_pettions' => 'Suivre/gérer les pétitions',
333
-	'icone_suivi_revisions' => 'Modifications des articles',
334
-	'icone_supprimer_document' => 'Supprimer ce document',
335
-	'icone_supprimer_image' => 'Supprimer cette image',
336
-	'icone_tous_articles' => 'Tous tes articles',
337
-	'icone_tous_auteur' => 'Tous les auteurs',
338
-	'icone_tous_visiteur' => 'Tous les visiteurs',
339
-	'icone_visiter_site' => 'Voir le site public',
340
-	'icone_voir_en_ligne' => 'Voir en ligne',
341
-	'img_indisponible' => 'image indisponible',
342
-	'impossible' => 'impossible',
343
-	'info_a_suivre' => 'À SUIVRE »',
344
-	'info_acces_interdit' => 'Accès interdit',
345
-	'info_acces_refuse' => 'Accès refusé',
346
-	'info_action' => 'Action : @action@',
347
-	'info_administrer_rubriques' => 'Tu peux administrer cette rubrique et ses sous-rubriques',
348
-	'info_adresse_non_indiquee' => 'Tu n’as pas indiqué d’adresse à tester !',
349
-	'info_aide' => 'AIDE :',
350
-	'info_ajouter_mot' => 'Ajouter ce mot',
351
-	'info_annonce' => 'ANNONCE',
352
-	'info_annonces_generales' => 'Annonces générales :',
353
-	'info_article_propose' => 'Article proposé',
354
-	'info_article_publie' => 'Article publié',
355
-	'info_article_redaction' => 'Article en cours de rédaction',
356
-	'info_article_refuse' => 'Article refusé',
357
-	'info_article_supprime' => 'Article supprimé',
358
-	'info_articles' => 'Articles',
359
-	'info_articles_a_valider' => 'Les articles à valider',
360
-	'info_articles_nb' => '@nb@ articles',
361
-	'info_articles_proposes' => 'Articles proposés',
362
-	'info_articles_un' => '1 article',
363
-	'info_auteurs_nombre' => 'auteur(s) :',
364
-	'info_authentification_ftp' => 'Authentification (par FTP).',
365
-	'info_breves_2' => 'brèves',
366
-	'info_breves_nb' => '@nb@ brèves',
367
-	'info_breves_un' => '1 brève',
368
-	'info_connexion_refusee' => 'Connexion refusée',
369
-	'info_contact_developpeur' => 'Contacte un développeur.',
370
-	'info_contenance' => 'Ce site contient :',
371
-	'info_contribution' => 'contributions',
372
-	'info_copyright' => '@spip@ est un logiciel libre distribué @lien_gpl@.',
373
-	'info_copyright_doc' => 'Pour plus d’informations, voir le site <a href="@spipnet@">@spipnet_affiche@</a>.',
374
-	'info_copyright_gpl' => 'sous licence GPL',
375
-	'info_cours_edition' => 'En cours de modification',
376
-	'info_creer_repertoire' => 'Crée un fichier ou un répertoire nommé :',
377
-	'info_creer_repertoire_2' => 'à l’intérieur du sous-répertoire <b>@repertoire@</b>, puis :',
378
-	'info_creer_vignette' => 'création automatique de la vignette',
379
-	'info_creerdansrubrique_non_autorise' => 'Tu n’as pas de droits suffisants pour créer un contenu dans cette rubrique',
380
-	'info_deplier' => 'Déplier',
381
-	'info_descriptif_nombre' => 'descriptif(s) :',
382
-	'info_description' => 'Description :',
383
-	'info_description_2' => 'Description :',
384
-	'info_dimension' => 'Dimensions :',
385
-	'info_documents_nb' => '@nb@ documents',
386
-	'info_documents_un' => '1 document',
387
-	'info_ecire_message_prive' => 'Écrire un message privé',
388
-	'info_email_invalide' => 'Adresse email invalide.',
389
-	'info_en_cours_validation' => 'Tes articles en cours de rédaction',
390
-	'info_en_ligne' => 'Actuellement en ligne :',
391
-	'info_envoyer_message_prive' => 'Envoyer un message privé à cet auteur',
392
-	'info_erreur_requete' => 'Erreur dans la requête :',
393
-	'info_erreur_squelette2' => 'Aucun squelette <b>@fichier@</b> n’est disponible...',
394
-	'info_erreur_systeme' => 'Erreur système (errno @errsys@)',
395
-	'info_erreur_systeme2' => 'Le disque dur est peut-être plein, ou la base de données endommagée.<br />
297
+    // I
298
+    'ical_texte_rss_articles' => 'Le fichier « backend » des articles de ce site se trouve à l’adresse :',
299
+    'ical_texte_rss_articles2' => 'Tu peux également obtenir des fichiers « backend » pour les articles de chaque rubrique du site :',
300
+    'ical_texte_rss_breves' => 'Il existe de plus un fichier contenant les brèves du site. En précisant un numéro de rubrique, tu obtiendras uniquement les brèves de cette rubrique.',
301
+    'icone_a_suivre' => 'À suivre',
302
+    'icone_admin_site' => 'Administration du site',
303
+    'icone_agenda' => 'Agenda',
304
+    'icone_aide_ligne' => 'Aide',
305
+    'icone_articles' => 'Articles',
306
+    'icone_auteurs' => 'Auteurs',
307
+    'icone_brouteur' => 'Navigation rapide',
308
+    'icone_configuration_site' => 'Configuration',
309
+    'icone_configurer_site' => 'Configurer ton site',
310
+    'icone_creer_nouvel_auteur' => 'Créer un nouvel auteur',
311
+    'icone_creer_rubrique' => 'Créer une rubrique',
312
+    'icone_creer_sous_rubrique' => 'Créer une sous-rubrique',
313
+    'icone_deconnecter' => 'Se déconnecter',
314
+    'icone_discussions' => 'Discussions',
315
+    'icone_doc_rubrique' => 'Documents des rubriques',
316
+    'icone_ecrire_article' => 'Écrire un nouvel article',
317
+    'icone_edition_site' => 'Édition',
318
+    'icone_gestion_langues' => 'Gestion des langues',
319
+    'icone_informations_personnelles' => 'Informations personnelles',
320
+    'icone_interface_complet' => 'interface complète',
321
+    'icone_interface_simple' => 'Interface simplifiée',
322
+    'icone_maintenance_site' => 'Maintenance du site',
323
+    'icone_messagerie_personnelle' => 'Messagerie personnelle',
324
+    'icone_repartition_debut' => 'Afficher la répartition depuis le début',
325
+    'icone_rubriques' => 'Rubriques',
326
+    'icone_sauver_site' => 'Sauvegarde du site',
327
+    'icone_site_entier' => 'Tout le site',
328
+    'icone_sites_references' => 'Sites référencés',
329
+    'icone_statistiques' => 'Statistiques du site',
330
+    'icone_suivi_activite' => 'Suivre la vie du site',
331
+    'icone_suivi_actualite' => 'Évolution du site',
332
+    'icone_suivi_pettions' => 'Suivre/gérer les pétitions',
333
+    'icone_suivi_revisions' => 'Modifications des articles',
334
+    'icone_supprimer_document' => 'Supprimer ce document',
335
+    'icone_supprimer_image' => 'Supprimer cette image',
336
+    'icone_tous_articles' => 'Tous tes articles',
337
+    'icone_tous_auteur' => 'Tous les auteurs',
338
+    'icone_tous_visiteur' => 'Tous les visiteurs',
339
+    'icone_visiter_site' => 'Voir le site public',
340
+    'icone_voir_en_ligne' => 'Voir en ligne',
341
+    'img_indisponible' => 'image indisponible',
342
+    'impossible' => 'impossible',
343
+    'info_a_suivre' => 'À SUIVRE »',
344
+    'info_acces_interdit' => 'Accès interdit',
345
+    'info_acces_refuse' => 'Accès refusé',
346
+    'info_action' => 'Action : @action@',
347
+    'info_administrer_rubriques' => 'Tu peux administrer cette rubrique et ses sous-rubriques',
348
+    'info_adresse_non_indiquee' => 'Tu n’as pas indiqué d’adresse à tester !',
349
+    'info_aide' => 'AIDE :',
350
+    'info_ajouter_mot' => 'Ajouter ce mot',
351
+    'info_annonce' => 'ANNONCE',
352
+    'info_annonces_generales' => 'Annonces générales :',
353
+    'info_article_propose' => 'Article proposé',
354
+    'info_article_publie' => 'Article publié',
355
+    'info_article_redaction' => 'Article en cours de rédaction',
356
+    'info_article_refuse' => 'Article refusé',
357
+    'info_article_supprime' => 'Article supprimé',
358
+    'info_articles' => 'Articles',
359
+    'info_articles_a_valider' => 'Les articles à valider',
360
+    'info_articles_nb' => '@nb@ articles',
361
+    'info_articles_proposes' => 'Articles proposés',
362
+    'info_articles_un' => '1 article',
363
+    'info_auteurs_nombre' => 'auteur(s) :',
364
+    'info_authentification_ftp' => 'Authentification (par FTP).',
365
+    'info_breves_2' => 'brèves',
366
+    'info_breves_nb' => '@nb@ brèves',
367
+    'info_breves_un' => '1 brève',
368
+    'info_connexion_refusee' => 'Connexion refusée',
369
+    'info_contact_developpeur' => 'Contacte un développeur.',
370
+    'info_contenance' => 'Ce site contient :',
371
+    'info_contribution' => 'contributions',
372
+    'info_copyright' => '@spip@ est un logiciel libre distribué @lien_gpl@.',
373
+    'info_copyright_doc' => 'Pour plus d’informations, voir le site <a href="@spipnet@">@spipnet_affiche@</a>.',
374
+    'info_copyright_gpl' => 'sous licence GPL',
375
+    'info_cours_edition' => 'En cours de modification',
376
+    'info_creer_repertoire' => 'Crée un fichier ou un répertoire nommé :',
377
+    'info_creer_repertoire_2' => 'à l’intérieur du sous-répertoire <b>@repertoire@</b>, puis :',
378
+    'info_creer_vignette' => 'création automatique de la vignette',
379
+    'info_creerdansrubrique_non_autorise' => 'Tu n’as pas de droits suffisants pour créer un contenu dans cette rubrique',
380
+    'info_deplier' => 'Déplier',
381
+    'info_descriptif_nombre' => 'descriptif(s) :',
382
+    'info_description' => 'Description :',
383
+    'info_description_2' => 'Description :',
384
+    'info_dimension' => 'Dimensions :',
385
+    'info_documents_nb' => '@nb@ documents',
386
+    'info_documents_un' => '1 document',
387
+    'info_ecire_message_prive' => 'Écrire un message privé',
388
+    'info_email_invalide' => 'Adresse email invalide.',
389
+    'info_en_cours_validation' => 'Tes articles en cours de rédaction',
390
+    'info_en_ligne' => 'Actuellement en ligne :',
391
+    'info_envoyer_message_prive' => 'Envoyer un message privé à cet auteur',
392
+    'info_erreur_requete' => 'Erreur dans la requête :',
393
+    'info_erreur_squelette2' => 'Aucun squelette <b>@fichier@</b> n’est disponible...',
394
+    'info_erreur_systeme' => 'Erreur système (errno @errsys@)',
395
+    'info_erreur_systeme2' => 'Le disque dur est peut-être plein, ou la base de données endommagée.<br />
396 396
 <span style="color:red;">Essaie de <a href=\'@script@\'>réparer la base</a>, ou contacte ton hébergeur.</span>',
397
-	'info_fini' => 'C’est fini !',
398
-	'info_format_image' => 'Formats d’images pouvant être utilisées pour créer des vignettes : @gd_formats@.',
399
-	'info_format_non_defini' => 'format non défini',
400
-	'info_grand_ecran' => 'Grand écran',
401
-	'info_image_aide' => 'AIDE',
402
-	'info_image_process_titre' => 'Comment faire de nouveaux signets',
403
-	'info_impossible_lire_page' => '<b>Erreur !</b> Impossible de lire la page <tt><html>@test_proxy@</html></tt> à travers le proxy ',
404
-	'info_installation_systeme_publication' => 'Installation du système de publication...',
405
-	'info_installer_documents' => 'Tu peux installer automatiquement tous les documents contenus dans le dossier @upload@.',
406
-	'info_installer_ftp' => 'En tant qu’administrateur, tu peux installer (par FTP) des fichiers dans le dossier @upload@ pour ensuite les sélectionner directement ici.',
407
-	'info_installer_images' => 'Tu peux installer des images aux formats JPEG, GIF et PNG.',
408
-	'info_installer_images_dossier' => 'Installer des images dans le dossier @upload@ pour pouvoir les sélectionner ici.',
409
-	'info_interface_complete' => 'interface complète',
410
-	'info_interface_simple' => 'Interface simplifiée',
411
-	'info_joindre_document_article' => 'Tu peux joindre à cet article des documents de type',
412
-	'info_joindre_document_rubrique' => 'Tu peux ajouter dans cette rubrique des documents de type',
413
-	'info_joindre_documents_article' => 'Tu peux joindre à ton article des documents de type :',
414
-	'info_l_article' => 'l’article',
415
-	'info_la_breve' => 'la brève',
416
-	'info_la_rubrique' => 'la rubrique',
417
-	'info_langue_principale' => 'Langue principale du site',
418
-	'info_largeur_vignette' => '@largeur_vignette@ × @hauteur_vignette@ pixels',
419
-	'info_les_auteurs_1' => 'par @les_auteurs@',
420
-	'info_logo_format_interdit' => 'Seuls les logos aux formats @formats@ sont autorisés.',
421
-	'info_logo_max_poids' => 'Les logos doivent obligatoirement faire moins de @maxi@ (ce fichier fait @actuel@).',
422
-	'info_mail_fournisseur' => '[email protected]',
423
-	'info_message_2' => 'MESSAGE',
424
-	'info_message_supprime' => 'MESSAGE SUPPRIMÉ',
425
-	'info_messages_nb' => '@nb@ messages',
426
-	'info_messages_un' => '1 message',
427
-	'info_mise_en_ligne' => 'Date de mise en ligne :',
428
-	'info_modification_parametres_securite' => 'modifications des paramètres de sécurité',
429
-	'info_mois_courant' => 'Dans le courant du mois :',
430
-	'info_mot_cle_ajoute' => 'Le mot-clé suivant a été ajouté à',
431
-	'info_multi_herit' => 'Langue par défaut',
432
-	'info_multi_langues_soulignees' => 'Les <u>langues soulignées</u> bénéficient d’une traduction totale ou partielle des textes de l’interface. Si tu sélectionnes ces langues, de nombreux éléments du site public (dates, formulaires) seront automatiquement traduits. Pour les langues non soulignées, ces éléments apparaîtront dans la langue principale du site.',
433
-	'info_multilinguisme' => 'Multilinguisme',
434
-	'info_nom_non_utilisateurs_connectes' => 'Ton nom n’apparaît pas dans la liste des utilisateurs connectés.',
435
-	'info_nom_utilisateurs_connectes' => 'Ton nom apparaît dans la liste des utilisateurs connectés.',
436
-	'info_nombre_en_ligne' => 'Actuellement en ligne :',
437
-	'info_non_resultat' => 'Aucun résultat pour "@cherche_mot@"',
438
-	'info_non_utilisation_messagerie' => 'Tu n’utilise pas la messagerie interne de ce site.',
439
-	'info_nouveau_message' => 'TU AS UN NOUVEAU MESSAGE',
440
-	'info_nouveaux_messages' => 'TU AS @total_messages@ NOUVEAUX MESSAGES',
441
-	'info_numero_abbreviation' => 'N° ',
442
-	'info_obligatoire' => 'Cette information est obligatoire',
443
-	'info_page_actuelle' => 'Page actuelle',
444
-	'info_pense_bete' => 'PENSE-BÊTE',
445
-	'info_petit_ecran' => 'Petit écran',
446
-	'info_petition_close' => 'Pétition close',
447
-	'info_pixels' => 'pixels',
448
-	'info_plusieurs_mots_trouves' => 'Plusieurs mots-clés trouvés pour "@cherche_mot@" :',
449
-	'info_portfolio_automatique' => 'Portfolio automatique :',
450
-	'info_premier_resultat' => '[@debut_limit@ premiers résultats sur @total@]',
451
-	'info_premier_resultat_sur' => '[@debut_limit@ premiers résultats sur @total@]',
452
-	'info_propose_1' => '[@nom_site_spip@] Propose : @titre@',
453
-	'info_propose_2' => 'Article proposé
397
+    'info_fini' => 'C’est fini !',
398
+    'info_format_image' => 'Formats d’images pouvant être utilisées pour créer des vignettes : @gd_formats@.',
399
+    'info_format_non_defini' => 'format non défini',
400
+    'info_grand_ecran' => 'Grand écran',
401
+    'info_image_aide' => 'AIDE',
402
+    'info_image_process_titre' => 'Comment faire de nouveaux signets',
403
+    'info_impossible_lire_page' => '<b>Erreur !</b> Impossible de lire la page <tt><html>@test_proxy@</html></tt> à travers le proxy ',
404
+    'info_installation_systeme_publication' => 'Installation du système de publication...',
405
+    'info_installer_documents' => 'Tu peux installer automatiquement tous les documents contenus dans le dossier @upload@.',
406
+    'info_installer_ftp' => 'En tant qu’administrateur, tu peux installer (par FTP) des fichiers dans le dossier @upload@ pour ensuite les sélectionner directement ici.',
407
+    'info_installer_images' => 'Tu peux installer des images aux formats JPEG, GIF et PNG.',
408
+    'info_installer_images_dossier' => 'Installer des images dans le dossier @upload@ pour pouvoir les sélectionner ici.',
409
+    'info_interface_complete' => 'interface complète',
410
+    'info_interface_simple' => 'Interface simplifiée',
411
+    'info_joindre_document_article' => 'Tu peux joindre à cet article des documents de type',
412
+    'info_joindre_document_rubrique' => 'Tu peux ajouter dans cette rubrique des documents de type',
413
+    'info_joindre_documents_article' => 'Tu peux joindre à ton article des documents de type :',
414
+    'info_l_article' => 'l’article',
415
+    'info_la_breve' => 'la brève',
416
+    'info_la_rubrique' => 'la rubrique',
417
+    'info_langue_principale' => 'Langue principale du site',
418
+    'info_largeur_vignette' => '@largeur_vignette@ × @hauteur_vignette@ pixels',
419
+    'info_les_auteurs_1' => 'par @les_auteurs@',
420
+    'info_logo_format_interdit' => 'Seuls les logos aux formats @formats@ sont autorisés.',
421
+    'info_logo_max_poids' => 'Les logos doivent obligatoirement faire moins de @maxi@ (ce fichier fait @actuel@).',
422
+    'info_mail_fournisseur' => '[email protected]',
423
+    'info_message_2' => 'MESSAGE',
424
+    'info_message_supprime' => 'MESSAGE SUPPRIMÉ',
425
+    'info_messages_nb' => '@nb@ messages',
426
+    'info_messages_un' => '1 message',
427
+    'info_mise_en_ligne' => 'Date de mise en ligne :',
428
+    'info_modification_parametres_securite' => 'modifications des paramètres de sécurité',
429
+    'info_mois_courant' => 'Dans le courant du mois :',
430
+    'info_mot_cle_ajoute' => 'Le mot-clé suivant a été ajouté à',
431
+    'info_multi_herit' => 'Langue par défaut',
432
+    'info_multi_langues_soulignees' => 'Les <u>langues soulignées</u> bénéficient d’une traduction totale ou partielle des textes de l’interface. Si tu sélectionnes ces langues, de nombreux éléments du site public (dates, formulaires) seront automatiquement traduits. Pour les langues non soulignées, ces éléments apparaîtront dans la langue principale du site.',
433
+    'info_multilinguisme' => 'Multilinguisme',
434
+    'info_nom_non_utilisateurs_connectes' => 'Ton nom n’apparaît pas dans la liste des utilisateurs connectés.',
435
+    'info_nom_utilisateurs_connectes' => 'Ton nom apparaît dans la liste des utilisateurs connectés.',
436
+    'info_nombre_en_ligne' => 'Actuellement en ligne :',
437
+    'info_non_resultat' => 'Aucun résultat pour "@cherche_mot@"',
438
+    'info_non_utilisation_messagerie' => 'Tu n’utilise pas la messagerie interne de ce site.',
439
+    'info_nouveau_message' => 'TU AS UN NOUVEAU MESSAGE',
440
+    'info_nouveaux_messages' => 'TU AS @total_messages@ NOUVEAUX MESSAGES',
441
+    'info_numero_abbreviation' => 'N° ',
442
+    'info_obligatoire' => 'Cette information est obligatoire',
443
+    'info_page_actuelle' => 'Page actuelle',
444
+    'info_pense_bete' => 'PENSE-BÊTE',
445
+    'info_petit_ecran' => 'Petit écran',
446
+    'info_petition_close' => 'Pétition close',
447
+    'info_pixels' => 'pixels',
448
+    'info_plusieurs_mots_trouves' => 'Plusieurs mots-clés trouvés pour "@cherche_mot@" :',
449
+    'info_portfolio_automatique' => 'Portfolio automatique :',
450
+    'info_premier_resultat' => '[@debut_limit@ premiers résultats sur @total@]',
451
+    'info_premier_resultat_sur' => '[@debut_limit@ premiers résultats sur @total@]',
452
+    'info_propose_1' => '[@nom_site_spip@] Propose : @titre@',
453
+    'info_propose_2' => 'Article proposé
454 454
 ---------------',
455
-	'info_propose_3' => 'L’article "@titre@" est proposé à la publication.',
456
-	'info_propose_4' => 'Tu es invité à venir le consulter et à donner ton opinion',
457
-	'info_propose_5' => 'dans le forum qui lui est attaché. Il est disponible à l’adresse :',
458
-	'info_publie_01' => 'L’article "@titre@" a été validé par @connect_nom@.',
459
-	'info_publie_1' => '[@nom_site_spip@] PUBLIE : @titre@',
460
-	'info_publie_2' => 'Article publié
455
+    'info_propose_3' => 'L’article "@titre@" est proposé à la publication.',
456
+    'info_propose_4' => 'Tu es invité à venir le consulter et à donner ton opinion',
457
+    'info_propose_5' => 'dans le forum qui lui est attaché. Il est disponible à l’adresse :',
458
+    'info_publie_01' => 'L’article "@titre@" a été validé par @connect_nom@.',
459
+    'info_publie_1' => '[@nom_site_spip@] PUBLIE : @titre@',
460
+    'info_publie_2' => 'Article publié
461 461
 --------------',
462
-	'info_rechercher' => 'Rechercher',
463
-	'info_rechercher_02' => 'Rechercher :',
464
-	'info_remplacer_vignette' => 'Remplacer la vignette par défaut par un logo personnalisé :',
465
-	'info_rubriques_nb' => '@nb@ rubriques',
466
-	'info_rubriques_un' => '1 rubrique',
467
-	'info_sans_titre_2' => 'sans titre',
468
-	'info_selectionner_fichier' => 'Tu peux sélectionner un fichier du dossier @upload@',
469
-	'info_selectionner_fichier_2' => 'Sélectionner un fichier :',
470
-	'info_sites_nb' => '@nb@ sites',
471
-	'info_sites_un' => '1 site',
472
-	'info_supprimer_vignette' => 'supprimer la vignette',
473
-	'info_symbole_bleu' => 'Le symbole <b>bleu</b> indique un <b>pense-bête</b> : c’est-à-dire un message à ton usage personnel.',
474
-	'info_symbole_jaune' => 'Le symbole <b>jaune</b> indique une <b>annonce à tous les rédacteurs</b> : modifiable par tous les administrateurs, et visible par tous les rédacteurs.',
475
-	'info_symbole_vert' => 'Le symbole <b>vert</b> indique les <b>messages échangés avec d’autres utilisateurs</b> du site.',
476
-	'info_telecharger_nouveau_logo' => 'Télécharger un nouveau logo :',
477
-	'info_telecharger_ordinateur' => 'Télécharger depuis ton ordinateur :',
478
-	'info_tous_resultats_enregistres' => '[tous les résultats sont enregistrés]',
479
-	'info_tout_afficher' => 'Tout afficher',
480
-	'info_travaux_texte' => 'Ce site n’est pas encore configuré. Reviens plus tard...',
481
-	'info_travaux_titre' => 'Site en travaux',
482
-	'info_trop_resultat' => 'Trop de résultats pour "@cherche_mot@" ; affine la recherche.',
483
-	'info_utilisation_messagerie_interne' => 'Tu utilises la messagerie interne de ce site.',
484
-	'info_valider_lien' => 'valider ce lien',
485
-	'info_verifier_image' => ', vérifie que tes images ont été transférées correctement.',
486
-	'info_vignette_defaut' => 'Vignette par défaut',
487
-	'info_vignette_personnalisee' => 'Vignette personnalisée',
488
-	'info_visite' => 'visite :',
489
-	'info_vos_rendez_vous' => 'Tes rendez-vous à venir',
490
-	'infos_vos_pense_bete' => 'Tes pense-bêtes',
462
+    'info_rechercher' => 'Rechercher',
463
+    'info_rechercher_02' => 'Rechercher :',
464
+    'info_remplacer_vignette' => 'Remplacer la vignette par défaut par un logo personnalisé :',
465
+    'info_rubriques_nb' => '@nb@ rubriques',
466
+    'info_rubriques_un' => '1 rubrique',
467
+    'info_sans_titre_2' => 'sans titre',
468
+    'info_selectionner_fichier' => 'Tu peux sélectionner un fichier du dossier @upload@',
469
+    'info_selectionner_fichier_2' => 'Sélectionner un fichier :',
470
+    'info_sites_nb' => '@nb@ sites',
471
+    'info_sites_un' => '1 site',
472
+    'info_supprimer_vignette' => 'supprimer la vignette',
473
+    'info_symbole_bleu' => 'Le symbole <b>bleu</b> indique un <b>pense-bête</b> : c’est-à-dire un message à ton usage personnel.',
474
+    'info_symbole_jaune' => 'Le symbole <b>jaune</b> indique une <b>annonce à tous les rédacteurs</b> : modifiable par tous les administrateurs, et visible par tous les rédacteurs.',
475
+    'info_symbole_vert' => 'Le symbole <b>vert</b> indique les <b>messages échangés avec d’autres utilisateurs</b> du site.',
476
+    'info_telecharger_nouveau_logo' => 'Télécharger un nouveau logo :',
477
+    'info_telecharger_ordinateur' => 'Télécharger depuis ton ordinateur :',
478
+    'info_tous_resultats_enregistres' => '[tous les résultats sont enregistrés]',
479
+    'info_tout_afficher' => 'Tout afficher',
480
+    'info_travaux_texte' => 'Ce site n’est pas encore configuré. Reviens plus tard...',
481
+    'info_travaux_titre' => 'Site en travaux',
482
+    'info_trop_resultat' => 'Trop de résultats pour "@cherche_mot@" ; affine la recherche.',
483
+    'info_utilisation_messagerie_interne' => 'Tu utilises la messagerie interne de ce site.',
484
+    'info_valider_lien' => 'valider ce lien',
485
+    'info_verifier_image' => ', vérifie que tes images ont été transférées correctement.',
486
+    'info_vignette_defaut' => 'Vignette par défaut',
487
+    'info_vignette_personnalisee' => 'Vignette personnalisée',
488
+    'info_visite' => 'visite :',
489
+    'info_vos_rendez_vous' => 'Tes rendez-vous à venir',
490
+    'infos_vos_pense_bete' => 'Tes pense-bêtes',
491 491
 
492
-	// L
493
-	'label_ajout_id_rapide' => 'Ajout rapide',
494
-	'label_poids_fichier' => 'Taille',
495
-	'label_ponctuer' => '@label@ :',
496
-	'lien_afficher_icones_seuls' => 'Afficher uniquement les icones',
497
-	'lien_afficher_texte_icones' => 'Afficher les icones et le texte',
498
-	'lien_afficher_texte_seul' => 'Afficher uniquement le texte',
499
-	'lien_aller_a_la_derniere_page' => 'Aller à la dernière page',
500
-	'lien_aller_a_la_page_nb' => 'Aller à la page @nb@',
501
-	'lien_aller_a_la_page_precedente' => 'Aller à la page précédente',
502
-	'lien_aller_a_la_page_suivante' => 'Aller à la page suivante',
503
-	'lien_aller_a_la_premiere_page' => 'Aller à la première page',
504
-	'lien_liberer' => 'libérer',
505
-	'lien_liberer_tous' => 'Tout libérer',
506
-	'lien_nouvea_pense_bete' => 'NOUVEAU PENSE-BÊTE',
507
-	'lien_nouveau_message' => 'NOUVEAU MESSAGE',
508
-	'lien_nouvelle_annonce' => 'NOUVELLE ANNONCE',
509
-	'lien_petitions' => 'PÉTITION',
510
-	'lien_popularite' => 'popularité : @popularite@%',
511
-	'lien_racine_site' => 'RACINE DU SITE',
512
-	'lien_reessayer' => 'réessayer',
513
-	'lien_repondre_message' => 'Répondre à ce message',
514
-	'lien_supprimer' => 'supprimer',
515
-	'lien_tout_afficher' => 'Tout afficher',
516
-	'lien_visite_site' => 'visiter ce site',
517
-	'lien_visites' => '@visites@ visites',
518
-	'lien_voir_auteur' => 'Voir cet auteur',
519
-	'ligne' => 'Ligne',
520
-	'login' => 'Connexion',
521
-	'login_acces_prive' => 'accès à l’espace privé',
522
-	'login_autre_identifiant' => 'se connecter sous un autre identifiant',
523
-	'login_cookie_accepte' => 'Régle ton navigateur pour qu’il les accepte (au moins pour ce site).',
524
-	'login_cookie_oblige' => 'Pour t’identifier de façon sûre sur ce site, tu dois accepter les cookies.',
525
-	'login_deconnexion_ok' => 'Déconnexion effectuée.',
526
-	'login_erreur_pass' => 'Erreur de mot de passe.',
527
-	'login_espace_prive' => 'espace privé',
528
-	'login_identifiant_inconnu' => 'L’identifiant « @login@ » est inconnu.',
529
-	'login_login' => 'Login :',
530
-	'login_login2' => 'Login ou adresse email@circ@ :',
531
-	'login_login_pass_incorrect' => '(Login ou mot de passe incorrect.)',
532
-	'login_motpasseoublie' => 'mot de passe oublié ?',
533
-	'login_non_securise' => 'Attention, ce formulaire n’est pas sécurisé.
492
+    // L
493
+    'label_ajout_id_rapide' => 'Ajout rapide',
494
+    'label_poids_fichier' => 'Taille',
495
+    'label_ponctuer' => '@label@ :',
496
+    'lien_afficher_icones_seuls' => 'Afficher uniquement les icones',
497
+    'lien_afficher_texte_icones' => 'Afficher les icones et le texte',
498
+    'lien_afficher_texte_seul' => 'Afficher uniquement le texte',
499
+    'lien_aller_a_la_derniere_page' => 'Aller à la dernière page',
500
+    'lien_aller_a_la_page_nb' => 'Aller à la page @nb@',
501
+    'lien_aller_a_la_page_precedente' => 'Aller à la page précédente',
502
+    'lien_aller_a_la_page_suivante' => 'Aller à la page suivante',
503
+    'lien_aller_a_la_premiere_page' => 'Aller à la première page',
504
+    'lien_liberer' => 'libérer',
505
+    'lien_liberer_tous' => 'Tout libérer',
506
+    'lien_nouvea_pense_bete' => 'NOUVEAU PENSE-BÊTE',
507
+    'lien_nouveau_message' => 'NOUVEAU MESSAGE',
508
+    'lien_nouvelle_annonce' => 'NOUVELLE ANNONCE',
509
+    'lien_petitions' => 'PÉTITION',
510
+    'lien_popularite' => 'popularité : @popularite@%',
511
+    'lien_racine_site' => 'RACINE DU SITE',
512
+    'lien_reessayer' => 'réessayer',
513
+    'lien_repondre_message' => 'Répondre à ce message',
514
+    'lien_supprimer' => 'supprimer',
515
+    'lien_tout_afficher' => 'Tout afficher',
516
+    'lien_visite_site' => 'visiter ce site',
517
+    'lien_visites' => '@visites@ visites',
518
+    'lien_voir_auteur' => 'Voir cet auteur',
519
+    'ligne' => 'Ligne',
520
+    'login' => 'Connexion',
521
+    'login_acces_prive' => 'accès à l’espace privé',
522
+    'login_autre_identifiant' => 'se connecter sous un autre identifiant',
523
+    'login_cookie_accepte' => 'Régle ton navigateur pour qu’il les accepte (au moins pour ce site).',
524
+    'login_cookie_oblige' => 'Pour t’identifier de façon sûre sur ce site, tu dois accepter les cookies.',
525
+    'login_deconnexion_ok' => 'Déconnexion effectuée.',
526
+    'login_erreur_pass' => 'Erreur de mot de passe.',
527
+    'login_espace_prive' => 'espace privé',
528
+    'login_identifiant_inconnu' => 'L’identifiant « @login@ » est inconnu.',
529
+    'login_login' => 'Login :',
530
+    'login_login2' => 'Login ou adresse email@circ@ :',
531
+    'login_login_pass_incorrect' => '(Login ou mot de passe incorrect.)',
532
+    'login_motpasseoublie' => 'mot de passe oublié ?',
533
+    'login_non_securise' => 'Attention, ce formulaire n’est pas sécurisé.
534 534
 			Si tu ne veux pas que ton mot de passe puisse être
535 535
 			intercepté sur le réseau, active Javascript
536 536
 			dans ton navigateur et',
537
-	'login_nouvelle_tentative' => 'Nouvelle tentative',
538
-	'login_par_ici' => 'Tu es enregistré... par ici...',
539
-	'login_pass2' => 'Mot de passe :',
540
-	'login_preferez_refuser' => '<b>Si tu préfére refuser les cookies</b>, une autre méthode de connexion (moins sécurisée) est à ta disposition :',
541
-	'login_recharger' => 'recharger cette page',
542
-	'login_rester_identifie' => 'Se souvenir de moi',
543
-	'login_retour_public' => 'Retour au site public',
544
-	'login_retour_site' => 'Retour au site public',
545
-	'login_retoursitepublic' => 'retour au site public',
546
-	'login_sans_cookie' => 'Identification sans cookie',
547
-	'login_securise' => 'Login sécurisé',
548
-	'login_sinscrire' => 's’inscrire',
549
-	'login_test_navigateur' => 'test navigateur/reconnexion',
550
-	'login_verifiez_navigateur' => '(Vérifie toutefois que ton navigateur n’a pas mémorisé ton mot de passe...)',
537
+    'login_nouvelle_tentative' => 'Nouvelle tentative',
538
+    'login_par_ici' => 'Tu es enregistré... par ici...',
539
+    'login_pass2' => 'Mot de passe :',
540
+    'login_preferez_refuser' => '<b>Si tu préfére refuser les cookies</b>, une autre méthode de connexion (moins sécurisée) est à ta disposition :',
541
+    'login_recharger' => 'recharger cette page',
542
+    'login_rester_identifie' => 'Se souvenir de moi',
543
+    'login_retour_public' => 'Retour au site public',
544
+    'login_retour_site' => 'Retour au site public',
545
+    'login_retoursitepublic' => 'retour au site public',
546
+    'login_sans_cookie' => 'Identification sans cookie',
547
+    'login_securise' => 'Login sécurisé',
548
+    'login_sinscrire' => 's’inscrire',
549
+    'login_test_navigateur' => 'test navigateur/reconnexion',
550
+    'login_verifiez_navigateur' => '(Vérifie toutefois que ton navigateur n’a pas mémorisé ton mot de passe...)',
551 551
 
552
-	// M
553
-	'masquer_colonne' => 'Masquer cette colonne',
554
-	'masquer_trad' => 'masquer les traductions',
555
-	'message_nouveaux_identifiants_echec' => 'Impossible de générer de nouveaux identifiants.',
556
-	'message_nouveaux_identifiants_echec_envoi' => 'Les nouveaux identifiants de connexion n’ont pas pu être envoyés.',
557
-	'message_nouveaux_identifiants_ok' => 'Les nouveaux identifiants de connexion ont été envoyés à @email@.',
558
-	'module_fichiers_langues' => 'Fichiers de langue',
552
+    // M
553
+    'masquer_colonne' => 'Masquer cette colonne',
554
+    'masquer_trad' => 'masquer les traductions',
555
+    'message_nouveaux_identifiants_echec' => 'Impossible de générer de nouveaux identifiants.',
556
+    'message_nouveaux_identifiants_echec_envoi' => 'Les nouveaux identifiants de connexion n’ont pas pu être envoyés.',
557
+    'message_nouveaux_identifiants_ok' => 'Les nouveaux identifiants de connexion ont été envoyés à @email@.',
558
+    'module_fichiers_langues' => 'Fichiers de langue',
559 559
 
560
-	// N
561
-	'navigateur_pas_redirige' => 'Si votre navigateur n’est pas redirigé, cliquez ici pour continuer.',
562
-	'numero' => 'Numéro',
560
+    // N
561
+    'navigateur_pas_redirige' => 'Si votre navigateur n’est pas redirigé, cliquez ici pour continuer.',
562
+    'numero' => 'Numéro',
563 563
 
564
-	// O
565
-	'occurence' => 'Occurence',
566
-	'onglet_affacer_base' => 'Effacer la base',
567
-	'onglet_auteur' => 'L’auteur',
568
-	'onglet_contenu_site' => 'Contenu du site',
569
-	'onglet_evolution_visite_mod' => 'Évolution',
570
-	'onglet_fonctions_avances' => 'Fonctions avancées',
571
-	'onglet_informations_personnelles' => 'Informations personnelles',
572
-	'onglet_interactivite' => 'Interactivité',
573
-	'onglet_messagerie' => 'Messagerie',
574
-	'onglet_repartition_rubrique' => 'Répartition par rubriques',
575
-	'onglet_save_restaur_base' => 'Sauvegarder/restaurer la base',
576
-	'onglet_vider_cache' => 'Vider le cache',
564
+    // O
565
+    'occurence' => 'Occurence',
566
+    'onglet_affacer_base' => 'Effacer la base',
567
+    'onglet_auteur' => 'L’auteur',
568
+    'onglet_contenu_site' => 'Contenu du site',
569
+    'onglet_evolution_visite_mod' => 'Évolution',
570
+    'onglet_fonctions_avances' => 'Fonctions avancées',
571
+    'onglet_informations_personnelles' => 'Informations personnelles',
572
+    'onglet_interactivite' => 'Interactivité',
573
+    'onglet_messagerie' => 'Messagerie',
574
+    'onglet_repartition_rubrique' => 'Répartition par rubriques',
575
+    'onglet_save_restaur_base' => 'Sauvegarder/restaurer la base',
576
+    'onglet_vider_cache' => 'Vider le cache',
577 577
 
578
-	// P
579
-	'pass_choix_pass' => 'Choisis ton nouveau mot de passe :',
580
-	'pass_erreur' => 'Erreur',
581
-	'pass_erreur_acces_refuse' => '<b>Erreur :</b> tu n’as plus accès à ce site.',
582
-	'pass_erreur_code_inconnu' => '<b>Erreur :</b> ce code ne correspond à aucun des visiteurs ayant accès à ce site.',
583
-	'pass_erreur_non_enregistre' => '<b>Erreur :</b> l’adresse <tt>@email_oubli@</tt> n’est pas enregistrée sur ce site.',
584
-	'pass_erreur_non_valide' => '<b>Erreur :</b> cet email <tt>@email_oubli@</tt> n’est pas valide !',
585
-	'pass_erreur_probleme_technique' => '<b>Erreur :</b> à cause d’un problème technique, l’email ne peut pas être envoyé.',
586
-	'pass_espace_prive_bla' => 'L’espace privé de ce site est ouvert aux
578
+    // P
579
+    'pass_choix_pass' => 'Choisis ton nouveau mot de passe :',
580
+    'pass_erreur' => 'Erreur',
581
+    'pass_erreur_acces_refuse' => '<b>Erreur :</b> tu n’as plus accès à ce site.',
582
+    'pass_erreur_code_inconnu' => '<b>Erreur :</b> ce code ne correspond à aucun des visiteurs ayant accès à ce site.',
583
+    'pass_erreur_non_enregistre' => '<b>Erreur :</b> l’adresse <tt>@email_oubli@</tt> n’est pas enregistrée sur ce site.',
584
+    'pass_erreur_non_valide' => '<b>Erreur :</b> cet email <tt>@email_oubli@</tt> n’est pas valide !',
585
+    'pass_erreur_probleme_technique' => '<b>Erreur :</b> à cause d’un problème technique, l’email ne peut pas être envoyé.',
586
+    'pass_espace_prive_bla' => 'L’espace privé de ce site est ouvert aux
587 587
 		visiteurs, après inscription. Une fois enregistré,
588 588
 		tu pourras consulter les articles en cours de rédaction,
589 589
 		proposer des articles et participer à tous les forums.',
590
-	'pass_forum_bla' => 'Tu as demandé à intervenir sur un forum
590
+    'pass_forum_bla' => 'Tu as demandé à intervenir sur un forum
591 591
 		réservé aux visiteurs enregistrés.',
592
-	'pass_indiquez_cidessous' => 'Indique ci-dessous l’adresse email sous laquelle tu
592
+    'pass_indiquez_cidessous' => 'Indique ci-dessous l’adresse email sous laquelle tu
593 593
 			t’es précédemment enregistré. Tu
594 594
 			recevras un email t’indiquant la marche à suivre pour
595 595
 			récupérer ton accès.',
596
-	'pass_mail_passcookie' => '(ceci est un message automatique)
596
+    'pass_mail_passcookie' => '(ceci est un message automatique)
597 597
 Pour retrouver ton accès au site
598 598
 @nom_site_spip@ (@adresse_site@)
599 599
 Rends toi à l’adresse suivante :
@@ -604,146 +604,146 @@  discard block
 block discarded – undo
604 604
 et te reconnecter au site.
605 605
 
606 606
 ',
607
-	'pass_mot_oublie' => 'Mot de passe oublié',
608
-	'pass_nouveau_enregistre' => 'Ton nouveau mot de passe a été enregistré.',
609
-	'pass_nouveau_pass' => 'Nouveau mot de passe',
610
-	'pass_ok' => 'OK',
611
-	'pass_oubli_mot' => 'Oubli du mot de passe',
612
-	'pass_procedure_changer' => 'Pour changer ton mot de passe, merci d’indiquer l’adresse email associée à ton compte.',
613
-	'pass_quitter_fenetre' => 'Quitter cette fenêtre',
614
-	'pass_rappel_login' => 'Rappel : ton identifiant (login) est « @login@ ».',
615
-	'pass_recevoir_mail' => 'Un lien de réinitialisation de ton mot de passe t’a été envoyé sur ton adresse email (si celle-ci est valide).',
616
-	'pass_retour_public' => 'Retour sur le site public',
617
-	'pass_rien_a_faire_ici' => 'Rien à faire ici.',
618
-	'pass_vousinscrire' => 'T’inscrire sur ce site',
619
-	'precedent' => 'précédent',
620
-	'previsualisation' => 'Prévisualisation',
621
-	'previsualiser' => 'Prévisualiser',
607
+    'pass_mot_oublie' => 'Mot de passe oublié',
608
+    'pass_nouveau_enregistre' => 'Ton nouveau mot de passe a été enregistré.',
609
+    'pass_nouveau_pass' => 'Nouveau mot de passe',
610
+    'pass_ok' => 'OK',
611
+    'pass_oubli_mot' => 'Oubli du mot de passe',
612
+    'pass_procedure_changer' => 'Pour changer ton mot de passe, merci d’indiquer l’adresse email associée à ton compte.',
613
+    'pass_quitter_fenetre' => 'Quitter cette fenêtre',
614
+    'pass_rappel_login' => 'Rappel : ton identifiant (login) est « @login@ ».',
615
+    'pass_recevoir_mail' => 'Un lien de réinitialisation de ton mot de passe t’a été envoyé sur ton adresse email (si celle-ci est valide).',
616
+    'pass_retour_public' => 'Retour sur le site public',
617
+    'pass_rien_a_faire_ici' => 'Rien à faire ici.',
618
+    'pass_vousinscrire' => 'T’inscrire sur ce site',
619
+    'precedent' => 'précédent',
620
+    'previsualisation' => 'Prévisualisation',
621
+    'previsualiser' => 'Prévisualiser',
622 622
 
623
-	// R
624
-	'retour' => 'Retour',
623
+    // R
624
+    'retour' => 'Retour',
625 625
 
626
-	// S
627
-	'spip_conforme_dtd' => 'SPIP considère ce document comme conforme à son DOCTYPE :',
628
-	'squelette' => 'squelette',
629
-	'squelette_inclus_ligne' => 'squelette inclus, ligne',
630
-	'squelette_ligne' => 'squelette, ligne',
631
-	'stats_visites_et_popularite' => '@visites@ visites ; popularité : @popularite@',
632
-	'suivant' => 'suivant',
626
+    // S
627
+    'spip_conforme_dtd' => 'SPIP considère ce document comme conforme à son DOCTYPE :',
628
+    'squelette' => 'squelette',
629
+    'squelette_inclus_ligne' => 'squelette inclus, ligne',
630
+    'squelette_ligne' => 'squelette, ligne',
631
+    'stats_visites_et_popularite' => '@visites@ visites ; popularité : @popularite@',
632
+    'suivant' => 'suivant',
633 633
 
634
-	// T
635
-	'taille_go' => '@taille@ Go',
636
-	'taille_ko' => '@taille@ ko',
637
-	'taille_mo' => '@taille@ Mo',
638
-	'taille_octets' => '@taille@ octets',
639
-	'texte_actualite_site_1' => 'Quand tu seras familiarisé(e) avec l’interface, tu pourras cliquer sur « ',
640
-	'texte_actualite_site_2' => 'interface complète',
641
-	'texte_actualite_site_3' => ' » pour ouvrir plus de possibilités.',
642
-	'texte_creation_automatique_vignette' => 'La création automatique de vignettes de prévisualisation est activée sur ce site. Si tu installe à partir de ce formulaire des images au(x) format(s) @gd_formats@, elles seront accompagnées d’une vignette d’une taille maximale de @taille_preview@ pixels.',
643
-	'texte_documents_associes' => 'Les documents suivants sont associés à l’article,
634
+    // T
635
+    'taille_go' => '@taille@ Go',
636
+    'taille_ko' => '@taille@ ko',
637
+    'taille_mo' => '@taille@ Mo',
638
+    'taille_octets' => '@taille@ octets',
639
+    'texte_actualite_site_1' => 'Quand tu seras familiarisé(e) avec l’interface, tu pourras cliquer sur « ',
640
+    'texte_actualite_site_2' => 'interface complète',
641
+    'texte_actualite_site_3' => ' » pour ouvrir plus de possibilités.',
642
+    'texte_creation_automatique_vignette' => 'La création automatique de vignettes de prévisualisation est activée sur ce site. Si tu installe à partir de ce formulaire des images au(x) format(s) @gd_formats@, elles seront accompagnées d’une vignette d’une taille maximale de @taille_preview@ pixels.',
643
+    'texte_documents_associes' => 'Les documents suivants sont associés à l’article,
644 644
 				mais ils n’y ont pas été directement
645 645
 				insérés. Selon la mise en page du site public,
646 646
 				ils pourront apparaître sous forme de documents joints.',
647
-	'texte_erreur_mise_niveau_base' => 'Erreur de base de données lors de la mise à niveau.
647
+    'texte_erreur_mise_niveau_base' => 'Erreur de base de données lors de la mise à niveau.
648 648
   L’image <b>@fichier@</b> n’est pas passée (article @id_article@).
649 649
   Note bien cette référence, réessaye la mise à
650 650
   niveau, et enfin vérifie que les images apparaissent
651 651
   toujours dans les articles.',
652
-	'texte_erreur_visiteur' => 'Tu as tenté d’accéder à l’espace privé avec un login qui ne le permet pas.',
653
-	'texte_inc_auth_1' => 'Tu es identifié sous le
652
+    'texte_erreur_visiteur' => 'Tu as tenté d’accéder à l’espace privé avec un login qui ne le permet pas.',
653
+    'texte_inc_auth_1' => 'Tu es identifié sous le
654 654
   login <b>@auth_login@</b>, mais celui-ci n’existe pas/plus dans la base.
655 655
   Essaye de te',
656
-	'texte_inc_auth_2' => 'reconnecter',
657
-	'texte_inc_auth_3' => ', après avoir éventuellement quitté puis
656
+    'texte_inc_auth_2' => 'reconnecter',
657
+    'texte_inc_auth_3' => ', après avoir éventuellement quitté puis
658 658
 		redémarré ton navigateur.',
659
-	'texte_inc_config' => 'Les modifications effectuées dans ces pages influent notablement sur le
659
+    'texte_inc_config' => 'Les modifications effectuées dans ces pages influent notablement sur le
660 660
  fonctionnement de ton site. Nous te recommandons de ne pas y intervenir tant que tu n’es pas
661 661
  familier du fonctionnement du système SPIP. <br /><br /><b>Plus
662 662
  généralement, il est fortement conseillé
663 663
  de laisser la charge de ces pages au webmestre principal de ton site.</b>',
664
-	'texte_inc_meta_1' => 'Le système a rencontré une erreur lors de l’écriture du fichier <code>@fichier@</code>. En tant qu’administrateur du site,',
665
-	'texte_inc_meta_2' => 'vérifie les droits d’ecriture',
666
-	'texte_inc_meta_3' => 'sur le répertoire <code>@repertoire@</code>.',
667
-	'texte_statut_en_cours_redaction' => 'en cours de rédaction',
668
-	'texte_statut_poubelle' => 'à la poubelle',
669
-	'texte_statut_propose_evaluation' => 'proposé à l’évaluation',
670
-	'texte_statut_publie' => 'publié en ligne',
671
-	'texte_statut_refuse' => 'refusé',
672
-	'titre_ajouter_mot_cle' => 'AJOUTER UN MOT-CLÉ :',
673
-	'titre_cadre_raccourcis' => 'RACCOURCIS :',
674
-	'titre_changer_couleur_interface' => 'Changer la couleur de l’interface',
675
-	'titre_image_admin_article' => 'Tu peux administrer cet article',
676
-	'titre_image_administrateur' => 'Administrateur',
677
-	'titre_image_aide' => 'De l’aide sur cet élément',
678
-	'titre_image_auteur_supprime' => 'Auteur supprimé',
679
-	'titre_image_redacteur' => 'Rédacteur sans accès',
680
-	'titre_image_redacteur_02' => 'Rédacteur',
681
-	'titre_image_selecteur' => 'Afficher la liste',
682
-	'titre_image_visiteur' => 'Visiteur',
683
-	'titre_joindre_document' => 'JOINDRE UN DOCUMENT',
684
-	'titre_mots_cles' => 'MOTS-CLÉS',
685
-	'titre_probleme_technique' => 'Attention : un problème technique (serveur SQL) empêche l’accès à cette partie du site. Merci de ta compréhension.',
686
-	'titre_publier_document' => 'PUBLIER UN DOCUMENT DANS CETTE RUBRIQUE',
687
-	'titre_signatures_attente' => 'Signatures en attente de validation',
688
-	'titre_signatures_confirmees' => 'Signatures confirmées',
689
-	'titre_statistiques' => 'Statistiques du site',
690
-	'titre_titre_document' => 'Titre du document :',
691
-	'todo' => 'à venir',
692
-	'trad_definir_reference' => 'Choisir "@titre@" comme référence des traductions',
693
-	'trad_reference' => '(référence des traductions)',
664
+    'texte_inc_meta_1' => 'Le système a rencontré une erreur lors de l’écriture du fichier <code>@fichier@</code>. En tant qu’administrateur du site,',
665
+    'texte_inc_meta_2' => 'vérifie les droits d’ecriture',
666
+    'texte_inc_meta_3' => 'sur le répertoire <code>@repertoire@</code>.',
667
+    'texte_statut_en_cours_redaction' => 'en cours de rédaction',
668
+    'texte_statut_poubelle' => 'à la poubelle',
669
+    'texte_statut_propose_evaluation' => 'proposé à l’évaluation',
670
+    'texte_statut_publie' => 'publié en ligne',
671
+    'texte_statut_refuse' => 'refusé',
672
+    'titre_ajouter_mot_cle' => 'AJOUTER UN MOT-CLÉ :',
673
+    'titre_cadre_raccourcis' => 'RACCOURCIS :',
674
+    'titre_changer_couleur_interface' => 'Changer la couleur de l’interface',
675
+    'titre_image_admin_article' => 'Tu peux administrer cet article',
676
+    'titre_image_administrateur' => 'Administrateur',
677
+    'titre_image_aide' => 'De l’aide sur cet élément',
678
+    'titre_image_auteur_supprime' => 'Auteur supprimé',
679
+    'titre_image_redacteur' => 'Rédacteur sans accès',
680
+    'titre_image_redacteur_02' => 'Rédacteur',
681
+    'titre_image_selecteur' => 'Afficher la liste',
682
+    'titre_image_visiteur' => 'Visiteur',
683
+    'titre_joindre_document' => 'JOINDRE UN DOCUMENT',
684
+    'titre_mots_cles' => 'MOTS-CLÉS',
685
+    'titre_probleme_technique' => 'Attention : un problème technique (serveur SQL) empêche l’accès à cette partie du site. Merci de ta compréhension.',
686
+    'titre_publier_document' => 'PUBLIER UN DOCUMENT DANS CETTE RUBRIQUE',
687
+    'titre_signatures_attente' => 'Signatures en attente de validation',
688
+    'titre_signatures_confirmees' => 'Signatures confirmées',
689
+    'titre_statistiques' => 'Statistiques du site',
690
+    'titre_titre_document' => 'Titre du document :',
691
+    'todo' => 'à venir',
692
+    'trad_definir_reference' => 'Choisir "@titre@" comme référence des traductions',
693
+    'trad_reference' => '(référence des traductions)',
694 694
 
695
-	// U
696
-	'upload_limit' => 'Ce fichier est trop gros pour le serveur ; la taille maximum autorisée en <i>upload</i> est de @max@.',
695
+    // U
696
+    'upload_limit' => 'Ce fichier est trop gros pour le serveur ; la taille maximum autorisée en <i>upload</i> est de @max@.',
697 697
 
698
-	// Z
699
-	'zbug_balise_b_aval' => ' : balise B en aval',
700
-	'zbug_balise_inexistante' => 'Balise @balise@ mal déclarée pour @from@',
701
-	'zbug_balise_sans_argument' => 'Argument manquant dans la balise @balise@',
702
-	'zbug_boucle' => 'boucle',
703
-	'zbug_boucle_recursive_undef' => 'boucle récursive non définie',
704
-	'zbug_calcul' => 'calcul',
705
-	'zbug_champ_hors_boucle' => 'Champ @champ@ hors boucle',
706
-	'zbug_champ_hors_critere' => 'Champ @champ@ hors critère @critere@',
707
-	'zbug_champ_hors_motif' => 'Champ @champ@ hors d’un contexte @motif@',
708
-	'zbug_code' => 'code',
709
-	'zbug_critere_inconnu' => 'critère inconnu @critere@',
710
-	'zbug_critere_sur_table_sans_cle_primaire' => '{@critere@} sur une table sans clef primaire atomique',
711
-	'zbug_distant_interdit' => 'externe interdit',
712
-	'zbug_doublon_table_sans_cle_primaire' => 'doublons sur une table sans clef primaire atomique',
713
-	'zbug_doublon_table_sans_index' => 'doublons sur une table sans index',
714
-	'zbug_erreur_boucle_double' => 'BOUCLE@id@ : double définition',
715
-	'zbug_erreur_boucle_fermant' => 'BOUCLE@id@ : tag fermant manquant',
716
-	'zbug_erreur_boucle_syntaxe' => 'Syntaxe boucle incorrecte',
717
-	'zbug_erreur_compilation' => 'Erreur de compilation',
718
-	'zbug_erreur_execution_page' => 'erreur d’exécution de la page',
719
-	'zbug_erreur_filtre' => 'Erreur : filtre <b>« @filtre@ »</b> non défini',
720
-	'zbug_erreur_filtre_nbarg_min' => 'Filtre @filtre@ : il manque @nb@ argument(s)',
721
-	'zbug_erreur_meme_parent' => '{meme_parent} ne s’applique qu’aux boucles (FORUMS) ou (RUBRIQUES)',
722
-	'zbug_erreur_squelette' => 'Erreur(s) dans le squelette',
723
-	'zbug_hors_compilation' => 'Hors Compilation',
724
-	'zbug_info_erreur_squelette' => 'Erreur sur le site',
725
-	'zbug_inversion_ordre_inexistant' => 'inversion d’un ordre inexistant',
726
-	'zbug_pagination_sans_critere' => '#PAGINATION sans critère {pagination} ou employé dans une boucle récursive',
727
-	'zbug_parametres_inclus_incorrects' => 'Paramètre d’inclusion incorrect : @param@',
728
-	'zbug_profile' => 'Temps de calcul : @time@',
729
-	'zbug_resultat' => 'résultat',
730
-	'zbug_serveur_indefini' => 'serveur SQL indéfini',
731
-	'zbug_statistiques' => 'Statistiques des requêtes SQL classées par durée',
732
-	'zbug_table_inconnue' => 'Table SQL « @table@ » inconnue',
733
-	'zxml_connus_attributs' => 'attributs connus',
734
-	'zxml_de' => 'de',
735
-	'zxml_inconnu_attribut' => 'attribut inconnu',
736
-	'zxml_inconnu_balise' => 'balise inconnue',
737
-	'zxml_inconnu_entite' => 'entité inconnue',
738
-	'zxml_inconnu_id' => 'ID inconnu',
739
-	'zxml_mais_de' => 'mais de',
740
-	'zxml_non_conforme' => 'n’est pas conforme au motif',
741
-	'zxml_non_fils' => 'n’est pas un fils de',
742
-	'zxml_nonvide_balise' => 'balise non vide',
743
-	'zxml_obligatoire_attribut' => 'attribut obligatoire mais absent dans',
744
-	'zxml_succession_fils_incorrecte' => 'succession des fils incorrecte',
745
-	'zxml_survoler' => 'survoler pour voir les corrects',
746
-	'zxml_valeur_attribut' => 'valeur de l’attribut',
747
-	'zxml_vide_balise' => 'balise vide',
748
-	'zxml_vu' => 'vu auparavant'
698
+    // Z
699
+    'zbug_balise_b_aval' => ' : balise B en aval',
700
+    'zbug_balise_inexistante' => 'Balise @balise@ mal déclarée pour @from@',
701
+    'zbug_balise_sans_argument' => 'Argument manquant dans la balise @balise@',
702
+    'zbug_boucle' => 'boucle',
703
+    'zbug_boucle_recursive_undef' => 'boucle récursive non définie',
704
+    'zbug_calcul' => 'calcul',
705
+    'zbug_champ_hors_boucle' => 'Champ @champ@ hors boucle',
706
+    'zbug_champ_hors_critere' => 'Champ @champ@ hors critère @critere@',
707
+    'zbug_champ_hors_motif' => 'Champ @champ@ hors d’un contexte @motif@',
708
+    'zbug_code' => 'code',
709
+    'zbug_critere_inconnu' => 'critère inconnu @critere@',
710
+    'zbug_critere_sur_table_sans_cle_primaire' => '{@critere@} sur une table sans clef primaire atomique',
711
+    'zbug_distant_interdit' => 'externe interdit',
712
+    'zbug_doublon_table_sans_cle_primaire' => 'doublons sur une table sans clef primaire atomique',
713
+    'zbug_doublon_table_sans_index' => 'doublons sur une table sans index',
714
+    'zbug_erreur_boucle_double' => 'BOUCLE@id@ : double définition',
715
+    'zbug_erreur_boucle_fermant' => 'BOUCLE@id@ : tag fermant manquant',
716
+    'zbug_erreur_boucle_syntaxe' => 'Syntaxe boucle incorrecte',
717
+    'zbug_erreur_compilation' => 'Erreur de compilation',
718
+    'zbug_erreur_execution_page' => 'erreur d’exécution de la page',
719
+    'zbug_erreur_filtre' => 'Erreur : filtre <b>« @filtre@ »</b> non défini',
720
+    'zbug_erreur_filtre_nbarg_min' => 'Filtre @filtre@ : il manque @nb@ argument(s)',
721
+    'zbug_erreur_meme_parent' => '{meme_parent} ne s’applique qu’aux boucles (FORUMS) ou (RUBRIQUES)',
722
+    'zbug_erreur_squelette' => 'Erreur(s) dans le squelette',
723
+    'zbug_hors_compilation' => 'Hors Compilation',
724
+    'zbug_info_erreur_squelette' => 'Erreur sur le site',
725
+    'zbug_inversion_ordre_inexistant' => 'inversion d’un ordre inexistant',
726
+    'zbug_pagination_sans_critere' => '#PAGINATION sans critère {pagination} ou employé dans une boucle récursive',
727
+    'zbug_parametres_inclus_incorrects' => 'Paramètre d’inclusion incorrect : @param@',
728
+    'zbug_profile' => 'Temps de calcul : @time@',
729
+    'zbug_resultat' => 'résultat',
730
+    'zbug_serveur_indefini' => 'serveur SQL indéfini',
731
+    'zbug_statistiques' => 'Statistiques des requêtes SQL classées par durée',
732
+    'zbug_table_inconnue' => 'Table SQL « @table@ » inconnue',
733
+    'zxml_connus_attributs' => 'attributs connus',
734
+    'zxml_de' => 'de',
735
+    'zxml_inconnu_attribut' => 'attribut inconnu',
736
+    'zxml_inconnu_balise' => 'balise inconnue',
737
+    'zxml_inconnu_entite' => 'entité inconnue',
738
+    'zxml_inconnu_id' => 'ID inconnu',
739
+    'zxml_mais_de' => 'mais de',
740
+    'zxml_non_conforme' => 'n’est pas conforme au motif',
741
+    'zxml_non_fils' => 'n’est pas un fils de',
742
+    'zxml_nonvide_balise' => 'balise non vide',
743
+    'zxml_obligatoire_attribut' => 'attribut obligatoire mais absent dans',
744
+    'zxml_succession_fils_incorrecte' => 'succession des fils incorrecte',
745
+    'zxml_survoler' => 'survoler pour voir les corrects',
746
+    'zxml_valeur_attribut' => 'valeur de l’attribut',
747
+    'zxml_vide_balise' => 'balise vide',
748
+    'zxml_vu' => 'vu auparavant'
749 749
 );
Please login to merge, or discard this patch.