Completed
Push — master ( c5242e...e18136 )
by cam
04:48
created
ecrire/inc/filtres.php 1 patch
Indentation   +2274 added lines, -2274 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
 /**
@@ -75,38 +75,38 @@  discard block
 block discarded – undo
75 75
  *     Fonction PHP correspondante du filtre demandé
76 76
  */
77 77
 function chercher_filtre($fonc, $default = null) {
78
-	if (!$fonc) {
79
-		return $default;
80
-	}
81
-	// Cas des types mime, sans confondre avec les appels de fonction de classe
82
-	// Foo::Bar
83
-	// qui peuvent etre avec un namespace : space\Foo::Bar
84
-	if (preg_match(',^[\w]+/,', $fonc)) {
85
-		$nom = preg_replace(',\W,', '_', $fonc);
86
-		$f = chercher_filtre($nom);
87
-		// cas du sous-type MIME sans filtre associe, passer au type:
88
-		// si filtre_text_plain pas defini, passe a filtre_text
89
-		if (!$f and $nom !== $fonc) {
90
-			$f = chercher_filtre(preg_replace(',\W.*$,', '', $fonc));
91
-		}
92
-
93
-		return $f;
94
-	}
95
-
96
-	include_fichiers_fonctions();
97
-	foreach (array('filtre_' . $fonc, 'filtre_' . $fonc . '_dist', $fonc) as $f) {
98
-		trouver_filtre_matrice($f); // charge des fichiers spécifiques éventuels
99
-		// fonction ou name\space\fonction
100
-		if (is_callable($f)) {
101
-			return $f;
102
-		}
103
-		// méthode statique d'une classe Classe::methode ou name\space\Classe::methode
104
-		elseif (false === strpos($f, '::') and is_callable(array($f))) {
105
-			return $f;
106
-		}
107
-	}
108
-
109
-	return $default;
78
+    if (!$fonc) {
79
+        return $default;
80
+    }
81
+    // Cas des types mime, sans confondre avec les appels de fonction de classe
82
+    // Foo::Bar
83
+    // qui peuvent etre avec un namespace : space\Foo::Bar
84
+    if (preg_match(',^[\w]+/,', $fonc)) {
85
+        $nom = preg_replace(',\W,', '_', $fonc);
86
+        $f = chercher_filtre($nom);
87
+        // cas du sous-type MIME sans filtre associe, passer au type:
88
+        // si filtre_text_plain pas defini, passe a filtre_text
89
+        if (!$f and $nom !== $fonc) {
90
+            $f = chercher_filtre(preg_replace(',\W.*$,', '', $fonc));
91
+        }
92
+
93
+        return $f;
94
+    }
95
+
96
+    include_fichiers_fonctions();
97
+    foreach (array('filtre_' . $fonc, 'filtre_' . $fonc . '_dist', $fonc) as $f) {
98
+        trouver_filtre_matrice($f); // charge des fichiers spécifiques éventuels
99
+        // fonction ou name\space\fonction
100
+        if (is_callable($f)) {
101
+            return $f;
102
+        }
103
+        // méthode statique d'une classe Classe::methode ou name\space\Classe::methode
104
+        elseif (false === strpos($f, '::') and is_callable(array($f))) {
105
+            return $f;
106
+        }
107
+    }
108
+
109
+    return $default;
110 110
 }
111 111
 
112 112
 /**
@@ -150,8 +150,8 @@  discard block
 block discarded – undo
150 150
  *     Chaîne vide sinon.
151 151
  **/
152 152
 function appliquer_filtre($arg, $filtre) {
153
-	$args = func_get_args();
154
-	return appliquer_filtre_sinon($arg, $filtre, $args, '');
153
+    $args = func_get_args();
154
+    return appliquer_filtre_sinon($arg, $filtre, $args, '');
155 155
 }
156 156
 
157 157
 /**
@@ -176,8 +176,8 @@  discard block
 block discarded – undo
176 176
  *     Texte d'origine sinon
177 177
  **/
178 178
 function appliquer_si_filtre($arg, $filtre) {
179
-	$args = func_get_args();
180
-	return appliquer_filtre_sinon($arg, $filtre, $args, $arg);
179
+    $args = func_get_args();
180
+    return appliquer_filtre_sinon($arg, $filtre, $args, $arg);
181 181
 }
182 182
 
183 183
 /**
@@ -193,12 +193,12 @@  discard block
 block discarded – undo
193 193
  *     Version de SPIP
194 194
  **/
195 195
 function spip_version() {
196
-	$version = $GLOBALS['spip_version_affichee'];
197
-	if ($vcs_version = version_vcs_courante(_DIR_RACINE)) {
198
-		$version .= " $vcs_version";
199
-	}
196
+    $version = $GLOBALS['spip_version_affichee'];
197
+    if ($vcs_version = version_vcs_courante(_DIR_RACINE)) {
198
+        $version .= " $vcs_version";
199
+    }
200 200
 
201
-	return $version;
201
+    return $version;
202 202
 }
203 203
 
204 204
 /**
@@ -211,19 +211,19 @@  discard block
 block discarded – undo
211 211
  *    - string|null si $raw = false
212 212
  */
213 213
 function version_vcs_courante($dir, $raw = false) {
214
-	$desc = decrire_version_git($dir);
215
-	if ($desc === null) {
216
-		$desc = decrire_version_svn($dir);
217
-	}
218
-	if ($desc === null or $raw) {
219
-		return $desc;
220
-	}
221
-	// affichage "GIT [master: abcdef]"
222
-	$commit = isset($desc['commit_short']) ? $desc['commit_short'] : $desc['commit'];
223
-	if ($desc['branch']) {
224
-		$commit = $desc['branch'] . ': ' . $commit;
225
-	}
226
-	return "{$desc['vcs']} [$commit]";
214
+    $desc = decrire_version_git($dir);
215
+    if ($desc === null) {
216
+        $desc = decrire_version_svn($dir);
217
+    }
218
+    if ($desc === null or $raw) {
219
+        return $desc;
220
+    }
221
+    // affichage "GIT [master: abcdef]"
222
+    $commit = isset($desc['commit_short']) ? $desc['commit_short'] : $desc['commit'];
223
+    if ($desc['branch']) {
224
+        $commit = $desc['branch'] . ': ' . $commit;
225
+    }
226
+    return "{$desc['vcs']} [$commit]";
227 227
 }
228 228
 
229 229
 /**
@@ -235,24 +235,24 @@  discard block
 block discarded – undo
235 235
  *      array ['branch' => xx, 'commit' => yy] sinon.
236 236
  **/
237 237
 function decrire_version_git($dir) {
238
-	if (!$dir) {
239
-		$dir = '.';
240
-	}
238
+    if (!$dir) {
239
+        $dir = '.';
240
+    }
241 241
 
242
-	// version installee par GIT
243
-	if (lire_fichier($dir . '/.git/HEAD', $c)) {
244
-		$currentHead = trim(substr($c, 4));
245
-		if (lire_fichier($dir . '/.git/' . $currentHead, $hash)) {
246
-			return [
247
-				'vcs' => 'GIT',
248
-				'branch' => basename($currentHead),
249
-				'commit' => trim($hash),
250
-				'commit_short' => substr(trim($hash), 0, 8),
251
-			];
252
-		}
253
-	}
242
+    // version installee par GIT
243
+    if (lire_fichier($dir . '/.git/HEAD', $c)) {
244
+        $currentHead = trim(substr($c, 4));
245
+        if (lire_fichier($dir . '/.git/' . $currentHead, $hash)) {
246
+            return [
247
+                'vcs' => 'GIT',
248
+                'branch' => basename($currentHead),
249
+                'commit' => trim($hash),
250
+                'commit_short' => substr(trim($hash), 0, 8),
251
+            ];
252
+        }
253
+    }
254 254
 
255
-	return null;
255
+    return null;
256 256
 }
257 257
 
258 258
 
@@ -265,25 +265,25 @@  discard block
 block discarded – undo
265 265
  *      array ['commit' => yy, 'date' => xx, 'author' => xx] sinon.
266 266
  **/
267 267
 function decrire_version_svn($dir) {
268
-	if (!$dir) {
269
-		$dir = '.';
270
-	}
271
-	// version installee par SVN
272
-	if (file_exists($dir . '/.svn/wc.db') && class_exists('SQLite3')) {
273
-		$db = new SQLite3($dir . '/.svn/wc.db');
274
-		$result = $db->query('SELECT changed_revision FROM nodes WHERE local_relpath = "" LIMIT 1');
275
-		if ($result) {
276
-			$row = $result->fetchArray();
277
-			if ($row['changed_revision'] != "") {
278
-				return [
279
-					'vcs' => 'SVN',
280
-					'branch' => '',
281
-					'commit' => $row['changed_revision'],
282
-				];
283
-			}
284
-		}
285
-	}
286
-	return null;
268
+    if (!$dir) {
269
+        $dir = '.';
270
+    }
271
+    // version installee par SVN
272
+    if (file_exists($dir . '/.svn/wc.db') && class_exists('SQLite3')) {
273
+        $db = new SQLite3($dir . '/.svn/wc.db');
274
+        $result = $db->query('SELECT changed_revision FROM nodes WHERE local_relpath = "" LIMIT 1');
275
+        if ($result) {
276
+            $row = $result->fetchArray();
277
+            if ($row['changed_revision'] != "") {
278
+                return [
279
+                    'vcs' => 'SVN',
280
+                    'branch' => '',
281
+                    'commit' => $row['changed_revision'],
282
+                ];
283
+            }
284
+        }
285
+    }
286
+    return null;
287 287
 }
288 288
 
289 289
 // La matrice est necessaire pour ne filtrer _que_ des fonctions definies dans filtres_images
@@ -330,18 +330,18 @@  discard block
 block discarded – undo
330 330
  *     Code HTML retourné par le filtre
331 331
  **/
332 332
 function filtrer($filtre) {
333
-	$tous = func_get_args();
334
-	if (trouver_filtre_matrice($filtre) and substr($filtre, 0, 6) == 'image_') {
335
-		return image_filtrer($tous);
336
-	} elseif ($f = chercher_filtre($filtre)) {
337
-		array_shift($tous);
338
-		return call_user_func_array($f, $tous);
339
-	} else {
340
-		// le filtre n'existe pas, on provoque une erreur
341
-		$msg = array('zbug_erreur_filtre', array('filtre' => texte_script($filtre)));
342
-		erreur_squelette($msg);
343
-		return '';
344
-	}
333
+    $tous = func_get_args();
334
+    if (trouver_filtre_matrice($filtre) and substr($filtre, 0, 6) == 'image_') {
335
+        return image_filtrer($tous);
336
+    } elseif ($f = chercher_filtre($filtre)) {
337
+        array_shift($tous);
338
+        return call_user_func_array($f, $tous);
339
+    } else {
340
+        // le filtre n'existe pas, on provoque une erreur
341
+        $msg = array('zbug_erreur_filtre', array('filtre' => texte_script($filtre)));
342
+        erreur_squelette($msg);
343
+        return '';
344
+    }
345 345
 }
346 346
 
347 347
 /**
@@ -358,11 +358,11 @@  discard block
 block discarded – undo
358 358
  * @return bool true si on trouve le filtre dans la matrice, false sinon.
359 359
  */
360 360
 function trouver_filtre_matrice($filtre) {
361
-	if (isset($GLOBALS['spip_matrice'][$filtre]) and is_string($f = $GLOBALS['spip_matrice'][$filtre])) {
362
-		find_in_path($f, '', true);
363
-		$GLOBALS['spip_matrice'][$filtre] = true;
364
-	}
365
-	return !empty($GLOBALS['spip_matrice'][$filtre]);
361
+    if (isset($GLOBALS['spip_matrice'][$filtre]) and is_string($f = $GLOBALS['spip_matrice'][$filtre])) {
362
+        find_in_path($f, '', true);
363
+        $GLOBALS['spip_matrice'][$filtre] = true;
364
+    }
365
+    return !empty($GLOBALS['spip_matrice'][$filtre]);
366 366
 }
367 367
 
368 368
 
@@ -390,8 +390,8 @@  discard block
 block discarded – undo
390 390
  * @return mixed
391 391
  */
392 392
 function filtre_set(&$Pile, $val, $key, $continue = null) {
393
-	$Pile['vars'][$key] = $val;
394
-	return $continue ? $val : '';
393
+    $Pile['vars'][$key] = $val;
394
+    return $continue ? $val : '';
395 395
 }
396 396
 
397 397
 /**
@@ -417,8 +417,8 @@  discard block
 block discarded – undo
417 417
  * @return string|mixed Retourne `$val` si `$continue` présent, sinon ''.
418 418
  */
419 419
 function filtre_setenv(&$Pile, $val, $key, $continue = null) {
420
-	$Pile[0][$key] = $val;
421
-	return $continue ? $val : '';
420
+    $Pile[0][$key] = $val;
421
+    return $continue ? $val : '';
422 422
 }
423 423
 
424 424
 /**
@@ -427,8 +427,8 @@  discard block
 block discarded – undo
427 427
  * @return string
428 428
  */
429 429
 function filtre_sanitize_env(&$Pile, $keys) {
430
-	$Pile[0] = spip_sanitize_from_request($Pile[0], $keys);
431
-	return '';
430
+    $Pile[0] = spip_sanitize_from_request($Pile[0], $keys);
431
+    return '';
432 432
 }
433 433
 
434 434
 
@@ -451,18 +451,18 @@  discard block
 block discarded – undo
451 451
  * @return mixed Retourne la valeur (sans la modifier).
452 452
  */
453 453
 function filtre_debug($val, $key = null) {
454
-	$debug = (
455
-		is_null($key) ? '' : (var_export($key, true) . " = ")
456
-		) . var_export($val, true);
454
+    $debug = (
455
+        is_null($key) ? '' : (var_export($key, true) . " = ")
456
+        ) . var_export($val, true);
457 457
 
458
-	include_spip('inc/autoriser');
459
-	if (autoriser('webmestre')) {
460
-		echo "<div class='spip_debug'>\n", $debug, "</div>\n";
461
-	}
458
+    include_spip('inc/autoriser');
459
+    if (autoriser('webmestre')) {
460
+        echo "<div class='spip_debug'>\n", $debug, "</div>\n";
461
+    }
462 462
 
463
-	spip_log($debug, 'debug');
463
+    spip_log($debug, 'debug');
464 464
 
465
-	return $val;
465
+    return $val;
466 466
 }
467 467
 
468 468
 
@@ -490,82 +490,82 @@  discard block
 block discarded – undo
490 490
  *     Texte qui a reçu les filtres
491 491
  **/
492 492
 function image_filtrer($args) {
493
-	$filtre = array_shift($args); # enlever $filtre
494
-	$texte = array_shift($args);
495
-	if (!strlen($texte)) {
496
-		return;
497
-	}
498
-	find_in_path('filtres_images_mini.php', 'inc/', true);
499
-	statut_effacer_images_temporaires(true); // activer la suppression des images temporaires car le compilo finit la chaine par un image_graver
500
-	// Cas du nom de fichier local
501
-	$is_file = trim($texte);
502
-	if (strpos(substr($is_file, strlen(_DIR_RACINE)), '..') !== false
503
-		  or strpbrk($is_file, "<>\n\r\t") !== false
504
-		  or strpos($is_file, '/') === 0
505
-	) {
506
-		$is_file = false;
507
-	}
508
-	if ($is_file) {
509
-		$is_local_file = function($path) {
510
-			if (strpos($path, "?") !== false) {
511
-				$path = supprimer_timestamp($path);
512
-				// remove ?24px added by find_in_theme on .svg files
513
-				$path = preg_replace(",\?[[:digit:]]+(px)$,", "", $path);
514
-			}
515
-			return file_exists($path);
516
-		};
517
-		if ($is_local_file($is_file) or tester_url_absolue($is_file)) {
518
-			array_unshift($args, "<img src='$is_file' />");
519
-			$res = call_user_func_array($filtre, $args);
520
-			statut_effacer_images_temporaires(false); // desactiver pour les appels hors compilo
521
-			return $res;
522
-		}
523
-	}
524
-
525
-	// Cas general : trier toutes les images, avec eventuellement leur <span>
526
-	if (preg_match_all(
527
-		',(<([a-z]+) [^<>]*spip_documents[^<>]*>)?\s*(<img\s.*>),UimsS',
528
-		$texte, $tags, PREG_SET_ORDER)) {
529
-		foreach ($tags as $tag) {
530
-			$class = extraire_attribut($tag[3], 'class');
531
-			if (!$class or
532
-				(strpos($class, 'filtre_inactif') === false
533
-					// compat historique a virer en 3.2
534
-					and strpos($class, 'no_image_filtrer') === false)
535
-			) {
536
-				array_unshift($args, $tag[3]);
537
-				if ($reduit = call_user_func_array($filtre, $args)) {
538
-					// En cas de span spip_documents, modifier le style=...width:
539
-					if ($tag[1]) {
540
-						$w = extraire_attribut($reduit, 'width');
541
-						if (!$w and preg_match(",width:\s*(\d+)px,S", extraire_attribut($reduit, 'style'), $regs)) {
542
-							$w = $regs[1];
543
-						}
544
-						if ($w and ($style = extraire_attribut($tag[1], 'style'))) {
545
-							$style = preg_replace(",width:\s*\d+px,S", "width:${w}px", $style);
546
-							$replace = inserer_attribut($tag[1], 'style', $style);
547
-							$texte = str_replace($tag[1], $replace, $texte);
548
-						}
549
-					}
550
-					// traiter aussi un eventuel mouseover
551
-					if ($mouseover = extraire_attribut($reduit, 'onmouseover')) {
552
-						if (preg_match(",this[.]src=['\"]([^'\"]+)['\"],ims", $mouseover, $match)) {
553
-							$srcover = $match[1];
554
-							array_shift($args);
555
-							array_unshift($args, "<img src='" . $match[1] . "' />");
556
-							$srcover_filter = call_user_func_array($filtre, $args);
557
-							$srcover_filter = extraire_attribut($srcover_filter, 'src');
558
-							$reduit = str_replace($srcover, $srcover_filter, $reduit);
559
-						}
560
-					}
561
-					$texte = str_replace($tag[3], $reduit, $texte);
562
-				}
563
-				array_shift($args);
564
-			}
565
-		}
566
-	}
567
-	statut_effacer_images_temporaires(false); // desactiver pour les appels hors compilo
568
-	return $texte;
493
+    $filtre = array_shift($args); # enlever $filtre
494
+    $texte = array_shift($args);
495
+    if (!strlen($texte)) {
496
+        return;
497
+    }
498
+    find_in_path('filtres_images_mini.php', 'inc/', true);
499
+    statut_effacer_images_temporaires(true); // activer la suppression des images temporaires car le compilo finit la chaine par un image_graver
500
+    // Cas du nom de fichier local
501
+    $is_file = trim($texte);
502
+    if (strpos(substr($is_file, strlen(_DIR_RACINE)), '..') !== false
503
+          or strpbrk($is_file, "<>\n\r\t") !== false
504
+          or strpos($is_file, '/') === 0
505
+    ) {
506
+        $is_file = false;
507
+    }
508
+    if ($is_file) {
509
+        $is_local_file = function($path) {
510
+            if (strpos($path, "?") !== false) {
511
+                $path = supprimer_timestamp($path);
512
+                // remove ?24px added by find_in_theme on .svg files
513
+                $path = preg_replace(",\?[[:digit:]]+(px)$,", "", $path);
514
+            }
515
+            return file_exists($path);
516
+        };
517
+        if ($is_local_file($is_file) or tester_url_absolue($is_file)) {
518
+            array_unshift($args, "<img src='$is_file' />");
519
+            $res = call_user_func_array($filtre, $args);
520
+            statut_effacer_images_temporaires(false); // desactiver pour les appels hors compilo
521
+            return $res;
522
+        }
523
+    }
524
+
525
+    // Cas general : trier toutes les images, avec eventuellement leur <span>
526
+    if (preg_match_all(
527
+        ',(<([a-z]+) [^<>]*spip_documents[^<>]*>)?\s*(<img\s.*>),UimsS',
528
+        $texte, $tags, PREG_SET_ORDER)) {
529
+        foreach ($tags as $tag) {
530
+            $class = extraire_attribut($tag[3], 'class');
531
+            if (!$class or
532
+                (strpos($class, 'filtre_inactif') === false
533
+                    // compat historique a virer en 3.2
534
+                    and strpos($class, 'no_image_filtrer') === false)
535
+            ) {
536
+                array_unshift($args, $tag[3]);
537
+                if ($reduit = call_user_func_array($filtre, $args)) {
538
+                    // En cas de span spip_documents, modifier le style=...width:
539
+                    if ($tag[1]) {
540
+                        $w = extraire_attribut($reduit, 'width');
541
+                        if (!$w and preg_match(",width:\s*(\d+)px,S", extraire_attribut($reduit, 'style'), $regs)) {
542
+                            $w = $regs[1];
543
+                        }
544
+                        if ($w and ($style = extraire_attribut($tag[1], 'style'))) {
545
+                            $style = preg_replace(",width:\s*\d+px,S", "width:${w}px", $style);
546
+                            $replace = inserer_attribut($tag[1], 'style', $style);
547
+                            $texte = str_replace($tag[1], $replace, $texte);
548
+                        }
549
+                    }
550
+                    // traiter aussi un eventuel mouseover
551
+                    if ($mouseover = extraire_attribut($reduit, 'onmouseover')) {
552
+                        if (preg_match(",this[.]src=['\"]([^'\"]+)['\"],ims", $mouseover, $match)) {
553
+                            $srcover = $match[1];
554
+                            array_shift($args);
555
+                            array_unshift($args, "<img src='" . $match[1] . "' />");
556
+                            $srcover_filter = call_user_func_array($filtre, $args);
557
+                            $srcover_filter = extraire_attribut($srcover_filter, 'src');
558
+                            $reduit = str_replace($srcover, $srcover_filter, $reduit);
559
+                        }
560
+                    }
561
+                    $texte = str_replace($tag[3], $reduit, $texte);
562
+                }
563
+                array_shift($args);
564
+            }
565
+        }
566
+    }
567
+    statut_effacer_images_temporaires(false); // desactiver pour les appels hors compilo
568
+    return $texte;
569 569
 }
570 570
 
571 571
 /**
@@ -580,77 +580,77 @@  discard block
 block discarded – undo
580 580
  **/
581 581
 function taille_image($img, $force_refresh = false) {
582 582
 
583
-	static $largeur_img = array(), $hauteur_img = array();
584
-	$srcWidth = 0;
585
-	$srcHeight = 0;
586
-
587
-	$src = extraire_attribut($img, 'src');
588
-
589
-	if (!$src) {
590
-		$src = $img;
591
-	} else {
592
-		$srcWidth = extraire_attribut($img, 'width');
593
-		$srcHeight = extraire_attribut($img, 'height');
594
-	}
595
-
596
-	// ne jamais operer directement sur une image distante pour des raisons de perfo
597
-	// la copie locale a toutes les chances d'etre la ou de resservir
598
-	if (tester_url_absolue($src)) {
599
-		include_spip('inc/distant');
600
-		$fichier = copie_locale($src);
601
-		$src = $fichier ? _DIR_RACINE . $fichier : $src;
602
-	}
603
-	if (($p = strpos($src, '?')) !== false) {
604
-		$src = substr($src, 0, $p);
605
-	}
606
-
607
-	$srcsize = false;
608
-	if (isset($largeur_img[$src]) and !$force_refresh) {
609
-		$srcWidth = $largeur_img[$src];
610
-	}
611
-	if (isset($hauteur_img[$src]) and !$force_refresh) {
612
-		$srcHeight = $hauteur_img[$src];
613
-	}
614
-	if (!$srcWidth or !$srcHeight) {
615
-
616
-		if (file_exists($src)
617
-			and $srcsize = spip_getimagesize($src)
618
-		) {
619
-			if (!$srcWidth) {
620
-				$largeur_img[$src] = $srcWidth = $srcsize[0];
621
-			}
622
-			if (!$srcHeight) {
623
-				$hauteur_img[$src] = $srcHeight = $srcsize[1];
624
-			}
625
-		}
626
-		elseif(strpos($src, "<svg") !== false) {
627
-			include_spip('inc/svg');
628
-			if ($attrs = svg_lire_attributs($src)){
629
-				list($width, $height, $viewbox) = svg_getimagesize_from_attr($attrs);
630
-				if (!$srcWidth){
631
-					$largeur_img[$src] = $srcWidth = $width;
632
-				}
633
-				if (!$srcHeight){
634
-					$hauteur_img[$src] = $srcHeight = $height;
635
-				}
636
-			}
637
-		}
638
-		// $src peut etre une reference a une image temporaire dont a n'a que le log .src
639
-		// on s'y refere, l'image sera reconstruite en temps utile si necessaire
640
-		elseif (@file_exists($f = "$src.src")
641
-			and lire_fichier($f, $valeurs)
642
-			and $valeurs = unserialize($valeurs)
643
-		) {
644
-			if (!$srcWidth) {
645
-				$largeur_img[$src] = $srcWidth = $valeurs["largeur_dest"];
646
-			}
647
-			if (!$srcHeight) {
648
-				$hauteur_img[$src] = $srcHeight = $valeurs["hauteur_dest"];
649
-			}
650
-		}
651
-	}
652
-
653
-	return array($srcHeight, $srcWidth);
583
+    static $largeur_img = array(), $hauteur_img = array();
584
+    $srcWidth = 0;
585
+    $srcHeight = 0;
586
+
587
+    $src = extraire_attribut($img, 'src');
588
+
589
+    if (!$src) {
590
+        $src = $img;
591
+    } else {
592
+        $srcWidth = extraire_attribut($img, 'width');
593
+        $srcHeight = extraire_attribut($img, 'height');
594
+    }
595
+
596
+    // ne jamais operer directement sur une image distante pour des raisons de perfo
597
+    // la copie locale a toutes les chances d'etre la ou de resservir
598
+    if (tester_url_absolue($src)) {
599
+        include_spip('inc/distant');
600
+        $fichier = copie_locale($src);
601
+        $src = $fichier ? _DIR_RACINE . $fichier : $src;
602
+    }
603
+    if (($p = strpos($src, '?')) !== false) {
604
+        $src = substr($src, 0, $p);
605
+    }
606
+
607
+    $srcsize = false;
608
+    if (isset($largeur_img[$src]) and !$force_refresh) {
609
+        $srcWidth = $largeur_img[$src];
610
+    }
611
+    if (isset($hauteur_img[$src]) and !$force_refresh) {
612
+        $srcHeight = $hauteur_img[$src];
613
+    }
614
+    if (!$srcWidth or !$srcHeight) {
615
+
616
+        if (file_exists($src)
617
+            and $srcsize = spip_getimagesize($src)
618
+        ) {
619
+            if (!$srcWidth) {
620
+                $largeur_img[$src] = $srcWidth = $srcsize[0];
621
+            }
622
+            if (!$srcHeight) {
623
+                $hauteur_img[$src] = $srcHeight = $srcsize[1];
624
+            }
625
+        }
626
+        elseif(strpos($src, "<svg") !== false) {
627
+            include_spip('inc/svg');
628
+            if ($attrs = svg_lire_attributs($src)){
629
+                list($width, $height, $viewbox) = svg_getimagesize_from_attr($attrs);
630
+                if (!$srcWidth){
631
+                    $largeur_img[$src] = $srcWidth = $width;
632
+                }
633
+                if (!$srcHeight){
634
+                    $hauteur_img[$src] = $srcHeight = $height;
635
+                }
636
+            }
637
+        }
638
+        // $src peut etre une reference a une image temporaire dont a n'a que le log .src
639
+        // on s'y refere, l'image sera reconstruite en temps utile si necessaire
640
+        elseif (@file_exists($f = "$src.src")
641
+            and lire_fichier($f, $valeurs)
642
+            and $valeurs = unserialize($valeurs)
643
+        ) {
644
+            if (!$srcWidth) {
645
+                $largeur_img[$src] = $srcWidth = $valeurs["largeur_dest"];
646
+            }
647
+            if (!$srcHeight) {
648
+                $hauteur_img[$src] = $srcHeight = $valeurs["hauteur_dest"];
649
+            }
650
+        }
651
+    }
652
+
653
+    return array($srcHeight, $srcWidth);
654 654
 }
655 655
 
656 656
 
@@ -668,12 +668,12 @@  discard block
 block discarded – undo
668 668
  *     Largeur en pixels, NULL ou 0 si aucune image.
669 669
  **/
670 670
 function largeur($img) {
671
-	if (!$img) {
672
-		return;
673
-	}
674
-	list($h, $l) = taille_image($img);
671
+    if (!$img) {
672
+        return;
673
+    }
674
+    list($h, $l) = taille_image($img);
675 675
 
676
-	return $l;
676
+    return $l;
677 677
 }
678 678
 
679 679
 /**
@@ -690,12 +690,12 @@  discard block
 block discarded – undo
690 690
  *     Hauteur en pixels, NULL ou 0 si aucune image.
691 691
  **/
692 692
 function hauteur($img) {
693
-	if (!$img) {
694
-		return;
695
-	}
696
-	list($h, $l) = taille_image($img);
693
+    if (!$img) {
694
+        return;
695
+    }
696
+    list($h, $l) = taille_image($img);
697 697
 
698
-	return $h;
698
+    return $h;
699 699
 }
700 700
 
701 701
 
@@ -715,11 +715,11 @@  discard block
 block discarded – undo
715 715
  * @return string
716 716
  **/
717 717
 function corriger_entites_html($texte) {
718
-	if (strpos($texte, '&amp;') === false) {
719
-		return $texte;
720
-	}
718
+    if (strpos($texte, '&amp;') === false) {
719
+        return $texte;
720
+    }
721 721
 
722
-	return preg_replace(',&amp;(#[0-9][0-9][0-9]+;|amp;),iS', '&\1', $texte);
722
+    return preg_replace(',&amp;(#[0-9][0-9][0-9]+;|amp;),iS', '&\1', $texte);
723 723
 }
724 724
 
725 725
 /**
@@ -734,11 +734,11 @@  discard block
 block discarded – undo
734 734
  * @return string
735 735
  **/
736 736
 function corriger_toutes_entites_html($texte) {
737
-	if (strpos($texte, '&amp;') === false) {
738
-		return $texte;
739
-	}
737
+    if (strpos($texte, '&amp;') === false) {
738
+        return $texte;
739
+    }
740 740
 
741
-	return preg_replace(',&amp;(#?[a-z0-9]+;),iS', '&\1', $texte);
741
+    return preg_replace(',&amp;(#?[a-z0-9]+;),iS', '&\1', $texte);
742 742
 }
743 743
 
744 744
 /**
@@ -748,7 +748,7 @@  discard block
 block discarded – undo
748 748
  * @return string
749 749
  **/
750 750
 function proteger_amp($texte) {
751
-	return str_replace('&', '&amp;', $texte);
751
+    return str_replace('&', '&amp;', $texte);
752 752
 }
753 753
 
754 754
 
@@ -779,20 +779,20 @@  discard block
 block discarded – undo
779 779
  * @return mixed|string
780 780
  */
781 781
 function entites_html($texte, $tout = false, $quote = true) {
782
-	if (!is_string($texte) or !$texte
783
-		or strpbrk($texte, "&\"'<>") == false
784
-	) {
785
-		return $texte;
786
-	}
787
-	include_spip('inc/texte');
788
-	$flags = ($quote ? ENT_QUOTES : ENT_NOQUOTES);
789
-	$flags |= ENT_HTML401;
790
-	$texte = spip_htmlspecialchars(echappe_retour(echappe_html($texte, '', true), '', 'proteger_amp'), $flags);
791
-	if ($tout) {
792
-		return corriger_toutes_entites_html($texte);
793
-	} else {
794
-		return corriger_entites_html($texte);
795
-	}
782
+    if (!is_string($texte) or !$texte
783
+        or strpbrk($texte, "&\"'<>") == false
784
+    ) {
785
+        return $texte;
786
+    }
787
+    include_spip('inc/texte');
788
+    $flags = ($quote ? ENT_QUOTES : ENT_NOQUOTES);
789
+    $flags |= ENT_HTML401;
790
+    $texte = spip_htmlspecialchars(echappe_retour(echappe_html($texte, '', true), '', 'proteger_amp'), $flags);
791
+    if ($tout) {
792
+        return corriger_toutes_entites_html($texte);
793
+    } else {
794
+        return corriger_entites_html($texte);
795
+    }
796 796
 }
797 797
 
798 798
 /**
@@ -811,37 +811,37 @@  discard block
 block discarded – undo
811 811
  *     Texte converti
812 812
  **/
813 813
 function filtrer_entites($texte) {
814
-	if (strpos($texte, '&') === false) {
815
-		return $texte;
816
-	}
817
-	// filtrer
818
-	$texte = html2unicode($texte);
819
-	// remettre le tout dans le charset cible
820
-	$texte = unicode2charset($texte);
821
-	// cas particulier des " et ' qu'il faut filtrer aussi
822
-	// (on le faisait deja avec un &quot;)
823
-	if (strpos($texte, "&#") !== false) {
824
-		$texte = str_replace(array("&#039;", "&#39;", "&#034;", "&#34;"), array("'", "'", '"', '"'), $texte);
825
-	}
814
+    if (strpos($texte, '&') === false) {
815
+        return $texte;
816
+    }
817
+    // filtrer
818
+    $texte = html2unicode($texte);
819
+    // remettre le tout dans le charset cible
820
+    $texte = unicode2charset($texte);
821
+    // cas particulier des " et ' qu'il faut filtrer aussi
822
+    // (on le faisait deja avec un &quot;)
823
+    if (strpos($texte, "&#") !== false) {
824
+        $texte = str_replace(array("&#039;", "&#39;", "&#034;", "&#34;"), array("'", "'", '"', '"'), $texte);
825
+    }
826 826
 
827
-	return $texte;
827
+    return $texte;
828 828
 }
829 829
 
830 830
 
831 831
 if (!function_exists('filtre_filtrer_entites_dist')) {
832
-	/**
833
-	 * Version sécurisée de filtrer_entites
834
-	 * 
835
-	 * @uses interdire_scripts()
836
-	 * @uses filtrer_entites()
837
-	 * 
838
-	 * @param string $t
839
-	 * @return string
840
-	 */
841
-	function filtre_filtrer_entites_dist($t) {
842
-		include_spip('inc/texte');
843
-		return interdire_scripts(filtrer_entites($t));
844
-	}
832
+    /**
833
+     * Version sécurisée de filtrer_entites
834
+     * 
835
+     * @uses interdire_scripts()
836
+     * @uses filtrer_entites()
837
+     * 
838
+     * @param string $t
839
+     * @return string
840
+     */
841
+    function filtre_filtrer_entites_dist($t) {
842
+        include_spip('inc/texte');
843
+        return interdire_scripts(filtrer_entites($t));
844
+    }
845 845
 }
846 846
 
847 847
 
@@ -856,18 +856,18 @@  discard block
 block discarded – undo
856 856
  * @return string|array
857 857
  **/
858 858
 function supprimer_caracteres_illegaux($texte) {
859
-	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";
860
-	static $to = null;
859
+    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";
860
+    static $to = null;
861 861
 
862
-	if (is_array($texte)) {
863
-		return array_map('supprimer_caracteres_illegaux', $texte);
864
-	}
862
+    if (is_array($texte)) {
863
+        return array_map('supprimer_caracteres_illegaux', $texte);
864
+    }
865 865
 
866
-	if (!$to) {
867
-		$to = str_repeat('-', strlen($from));
868
-	}
866
+    if (!$to) {
867
+        $to = str_repeat('-', strlen($from));
868
+    }
869 869
 
870
-	return strtr($texte, $from, $to);
870
+    return strtr($texte, $from, $to);
871 871
 }
872 872
 
873 873
 /**
@@ -879,10 +879,10 @@  discard block
 block discarded – undo
879 879
  * @return string|array
880 880
  **/
881 881
 function corriger_caracteres($texte) {
882
-	$texte = corriger_caracteres_windows($texte);
883
-	$texte = supprimer_caracteres_illegaux($texte);
882
+    $texte = corriger_caracteres_windows($texte);
883
+    $texte = supprimer_caracteres_illegaux($texte);
884 884
 
885
-	return $texte;
885
+    return $texte;
886 886
 }
887 887
 
888 888
 /**
@@ -900,40 +900,40 @@  discard block
 block discarded – undo
900 900
  */
901 901
 function texte_backend($texte) {
902 902
 
903
-	static $apostrophe = array("&#8217;", "'"); # n'allouer qu'une fois
903
+    static $apostrophe = array("&#8217;", "'"); # n'allouer qu'une fois
904 904
 
905
-	// si on a des liens ou des images, les passer en absolu
906
-	$texte = liens_absolus($texte);
905
+    // si on a des liens ou des images, les passer en absolu
906
+    $texte = liens_absolus($texte);
907 907
 
908
-	// echapper les tags &gt; &lt;
909
-	$texte = preg_replace(',&(gt|lt);,S', '&amp;\1;', $texte);
908
+    // echapper les tags &gt; &lt;
909
+    $texte = preg_replace(',&(gt|lt);,S', '&amp;\1;', $texte);
910 910
 
911
-	// importer les &eacute;
912
-	$texte = filtrer_entites($texte);
911
+    // importer les &eacute;
912
+    $texte = filtrer_entites($texte);
913 913
 
914
-	// " -> &quot; et tout ce genre de choses
915
-	$u = $GLOBALS['meta']['pcre_u'];
916
-	$texte = str_replace("&nbsp;", " ", $texte);
917
-	$texte = preg_replace('/\s{2,}/S' . $u, " ", $texte);
918
-	// ne pas echapper les sinqle quotes car certains outils de syndication gerent mal
919
-	$texte = entites_html($texte, false, false);
920
-	// mais bien echapper les double quotes !
921
-	$texte = str_replace('"', '&#034;', $texte);
914
+    // " -> &quot; et tout ce genre de choses
915
+    $u = $GLOBALS['meta']['pcre_u'];
916
+    $texte = str_replace("&nbsp;", " ", $texte);
917
+    $texte = preg_replace('/\s{2,}/S' . $u, " ", $texte);
918
+    // ne pas echapper les sinqle quotes car certains outils de syndication gerent mal
919
+    $texte = entites_html($texte, false, false);
920
+    // mais bien echapper les double quotes !
921
+    $texte = str_replace('"', '&#034;', $texte);
922 922
 
923
-	// verifier le charset
924
-	$texte = charset2unicode($texte);
923
+    // verifier le charset
924
+    $texte = charset2unicode($texte);
925 925
 
926
-	// Caracteres problematiques en iso-latin 1
927
-	if (isset($GLOBALS['meta']['charset']) and $GLOBALS['meta']['charset'] == 'iso-8859-1') {
928
-		$texte = str_replace(chr(156), '&#156;', $texte);
929
-		$texte = str_replace(chr(140), '&#140;', $texte);
930
-		$texte = str_replace(chr(159), '&#159;', $texte);
931
-	}
926
+    // Caracteres problematiques en iso-latin 1
927
+    if (isset($GLOBALS['meta']['charset']) and $GLOBALS['meta']['charset'] == 'iso-8859-1') {
928
+        $texte = str_replace(chr(156), '&#156;', $texte);
929
+        $texte = str_replace(chr(140), '&#140;', $texte);
930
+        $texte = str_replace(chr(159), '&#159;', $texte);
931
+    }
932 932
 
933
-	// l'apostrophe curly pose probleme a certains lecteure de RSS
934
-	// et le caractere apostrophe alourdit les squelettes avec PHP
935
-	// ==> on les remplace par l'entite HTML
936
-	return str_replace($apostrophe, "'", $texte);
933
+    // l'apostrophe curly pose probleme a certains lecteure de RSS
934
+    // et le caractere apostrophe alourdit les squelettes avec PHP
935
+    // ==> on les remplace par l'entite HTML
936
+    return str_replace($apostrophe, "'", $texte);
937 937
 }
938 938
 
939 939
 /**
@@ -950,7 +950,7 @@  discard block
 block discarded – undo
950 950
  *     Texte encodé et quote pour XML
951 951
  */
952 952
 function texte_backendq($texte) {
953
-	return addslashes(texte_backend($texte));
953
+    return addslashes(texte_backend($texte));
954 954
 }
955 955
 
956 956
 
@@ -973,9 +973,9 @@  discard block
 block discarded – undo
973 973
  *     Numéro de titre, sinon chaîne vide
974 974
  **/
975 975
 function supprimer_numero($texte) {
976
-	return preg_replace(
977
-		",^[[:space:]]*([0-9]+)([.)]|" . chr(194) . '?' . chr(176) . ")[[:space:]]+,S",
978
-		"", $texte);
976
+    return preg_replace(
977
+        ",^[[:space:]]*([0-9]+)([.)]|" . chr(194) . '?' . chr(176) . ")[[:space:]]+,S",
978
+        "", $texte);
979 979
 }
980 980
 
981 981
 /**
@@ -998,13 +998,13 @@  discard block
 block discarded – undo
998 998
  *     Numéro de titre, sinon chaîne vide
999 999
  **/
1000 1000
 function recuperer_numero($texte) {
1001
-	if (preg_match(
1002
-		",^[[:space:]]*([0-9]+)([.)]|" . chr(194) . '?' . chr(176) . ")[[:space:]]+,S",
1003
-		$texte, $regs)) {
1004
-		return strval($regs[1]);
1005
-	} else {
1006
-		return '';
1007
-	}
1001
+    if (preg_match(
1002
+        ",^[[:space:]]*([0-9]+)([.)]|" . chr(194) . '?' . chr(176) . ")[[:space:]]+,S",
1003
+        $texte, $regs)) {
1004
+        return strval($regs[1]);
1005
+    } else {
1006
+        return '';
1007
+    }
1008 1008
 }
1009 1009
 
1010 1010
 /**
@@ -1031,13 +1031,13 @@  discard block
 block discarded – undo
1031 1031
  *     Texte converti
1032 1032
  **/
1033 1033
 function supprimer_tags($texte, $rempl = "") {
1034
-	$texte = preg_replace(",<(!--|\w|/|!\[endif|!\[if)[^>]*>,US", $rempl, $texte);
1035
-	// ne pas oublier un < final non ferme car coupe
1036
-	$texte = preg_replace(",<(!--|\w|/).*$,US", $rempl, $texte);
1037
-	// mais qui peut aussi etre un simple signe plus petit que
1038
-	$texte = str_replace('<', '&lt;', $texte);
1034
+    $texte = preg_replace(",<(!--|\w|/|!\[endif|!\[if)[^>]*>,US", $rempl, $texte);
1035
+    // ne pas oublier un < final non ferme car coupe
1036
+    $texte = preg_replace(",<(!--|\w|/).*$,US", $rempl, $texte);
1037
+    // mais qui peut aussi etre un simple signe plus petit que
1038
+    $texte = str_replace('<', '&lt;', $texte);
1039 1039
 
1040
-	return $texte;
1040
+    return $texte;
1041 1041
 }
1042 1042
 
1043 1043
 /**
@@ -1060,9 +1060,9 @@  discard block
 block discarded – undo
1060 1060
  *     Texte converti
1061 1061
  **/
1062 1062
 function echapper_tags($texte, $rempl = "") {
1063
-	$texte = preg_replace("/<([^>]*)>/", "&lt;\\1&gt;", $texte);
1063
+    $texte = preg_replace("/<([^>]*)>/", "&lt;\\1&gt;", $texte);
1064 1064
 
1065
-	return $texte;
1065
+    return $texte;
1066 1066
 }
1067 1067
 
1068 1068
 /**
@@ -1083,18 +1083,18 @@  discard block
 block discarded – undo
1083 1083
  *     Texte converti
1084 1084
  **/
1085 1085
 function textebrut($texte) {
1086
-	$u = $GLOBALS['meta']['pcre_u'];
1087
-	$texte = preg_replace('/\s+/S' . $u, " ", $texte);
1088
-	$texte = preg_replace("/<(p|br)( [^>]*)?" . ">/iS", "\n\n", $texte);
1089
-	$texte = preg_replace("/^\n+/", "", $texte);
1090
-	$texte = preg_replace("/\n+$/", "", $texte);
1091
-	$texte = preg_replace("/\n +/", "\n", $texte);
1092
-	$texte = supprimer_tags($texte);
1093
-	$texte = preg_replace("/(&nbsp;| )+/S", " ", $texte);
1094
-	// nettoyer l'apostrophe curly qui pose probleme a certains rss-readers, lecteurs de mail...
1095
-	$texte = str_replace("&#8217;", "'", $texte);
1086
+    $u = $GLOBALS['meta']['pcre_u'];
1087
+    $texte = preg_replace('/\s+/S' . $u, " ", $texte);
1088
+    $texte = preg_replace("/<(p|br)( [^>]*)?" . ">/iS", "\n\n", $texte);
1089
+    $texte = preg_replace("/^\n+/", "", $texte);
1090
+    $texte = preg_replace("/\n+$/", "", $texte);
1091
+    $texte = preg_replace("/\n +/", "\n", $texte);
1092
+    $texte = supprimer_tags($texte);
1093
+    $texte = preg_replace("/(&nbsp;| )+/S", " ", $texte);
1094
+    // nettoyer l'apostrophe curly qui pose probleme a certains rss-readers, lecteurs de mail...
1095
+    $texte = str_replace("&#8217;", "'", $texte);
1096 1096
 
1097
-	return $texte;
1097
+    return $texte;
1098 1098
 }
1099 1099
 
1100 1100
 
@@ -1110,17 +1110,17 @@  discard block
 block discarded – undo
1110 1110
  *     Texte avec liens ouvrants
1111 1111
  **/
1112 1112
 function liens_ouvrants($texte) {
1113
-	if (preg_match_all(",(<a\s+[^>]*https?://[^>]*class=[\"']spip_(out|url)\b[^>]+>),imsS",
1114
-		$texte, $liens, PREG_PATTERN_ORDER)) {
1115
-		foreach ($liens[0] as $a) {
1116
-			$rel = 'noopener noreferrer ' . extraire_attribut($a, 'rel');
1117
-			$ablank = inserer_attribut($a, 'rel', $rel);
1118
-			$ablank = inserer_attribut($ablank, 'target', '_blank');
1119
-			$texte = str_replace($a, $ablank, $texte);
1120
-		}
1121
-	}
1113
+    if (preg_match_all(",(<a\s+[^>]*https?://[^>]*class=[\"']spip_(out|url)\b[^>]+>),imsS",
1114
+        $texte, $liens, PREG_PATTERN_ORDER)) {
1115
+        foreach ($liens[0] as $a) {
1116
+            $rel = 'noopener noreferrer ' . extraire_attribut($a, 'rel');
1117
+            $ablank = inserer_attribut($a, 'rel', $rel);
1118
+            $ablank = inserer_attribut($ablank, 'target', '_blank');
1119
+            $texte = str_replace($a, $ablank, $texte);
1120
+        }
1121
+    }
1122 1122
 
1123
-	return $texte;
1123
+    return $texte;
1124 1124
 }
1125 1125
 
1126 1126
 /**
@@ -1130,22 +1130,22 @@  discard block
 block discarded – undo
1130 1130
  * @return string
1131 1131
  */
1132 1132
 function liens_nofollow($texte) {
1133
-	if (stripos($texte, "<a") === false) {
1134
-		return $texte;
1135
-	}
1133
+    if (stripos($texte, "<a") === false) {
1134
+        return $texte;
1135
+    }
1136 1136
 
1137
-	if (preg_match_all(",<a\b[^>]*>,UimsS", $texte, $regs, PREG_PATTERN_ORDER)) {
1138
-		foreach ($regs[0] as $a) {
1139
-			$rel = extraire_attribut($a, "rel");
1140
-			if (strpos($rel, "nofollow") === false) {
1141
-				$rel = "nofollow" . ($rel ? " $rel" : "");
1142
-				$anofollow = inserer_attribut($a, "rel", $rel);
1143
-				$texte = str_replace($a, $anofollow, $texte);
1144
-			}
1145
-		}
1146
-	}
1137
+    if (preg_match_all(",<a\b[^>]*>,UimsS", $texte, $regs, PREG_PATTERN_ORDER)) {
1138
+        foreach ($regs[0] as $a) {
1139
+            $rel = extraire_attribut($a, "rel");
1140
+            if (strpos($rel, "nofollow") === false) {
1141
+                $rel = "nofollow" . ($rel ? " $rel" : "");
1142
+                $anofollow = inserer_attribut($a, "rel", $rel);
1143
+                $texte = str_replace($a, $anofollow, $texte);
1144
+            }
1145
+        }
1146
+    }
1147 1147
 
1148
-	return $texte;
1148
+    return $texte;
1149 1149
 }
1150 1150
 
1151 1151
 /**
@@ -1164,12 +1164,12 @@  discard block
 block discarded – undo
1164 1164
  *     Texte sans paraghaphes
1165 1165
  **/
1166 1166
 function PtoBR($texte) {
1167
-	$u = $GLOBALS['meta']['pcre_u'];
1168
-	$texte = preg_replace("@</p>@iS", "\n", $texte);
1169
-	$texte = preg_replace("@<p\b.*>@UiS", "<br />", $texte);
1170
-	$texte = preg_replace("@^\s*<br />@S" . $u, "", $texte);
1167
+    $u = $GLOBALS['meta']['pcre_u'];
1168
+    $texte = preg_replace("@</p>@iS", "\n", $texte);
1169
+    $texte = preg_replace("@<p\b.*>@UiS", "<br />", $texte);
1170
+    $texte = preg_replace("@^\s*<br />@S" . $u, "", $texte);
1171 1171
 
1172
-	return $texte;
1172
+    return $texte;
1173 1173
 }
1174 1174
 
1175 1175
 
@@ -1194,14 +1194,14 @@  discard block
 block discarded – undo
1194 1194
  * @return string Texte encadré du style CSS
1195 1195
  */
1196 1196
 function lignes_longues($texte) {
1197
-	if (!strlen(trim($texte))) {
1198
-		return $texte;
1199
-	}
1200
-	include_spip('inc/texte');
1201
-	$tag = preg_match(',</?(' . _BALISES_BLOCS . ')[>[:space:]],iS', $texte) ?
1202
-		'div' : 'span';
1197
+    if (!strlen(trim($texte))) {
1198
+        return $texte;
1199
+    }
1200
+    include_spip('inc/texte');
1201
+    $tag = preg_match(',</?(' . _BALISES_BLOCS . ')[>[:space:]],iS', $texte) ?
1202
+        'div' : 'span';
1203 1203
 
1204
-	return "<$tag style='word-wrap:break-word;'>$texte</$tag>";
1204
+    return "<$tag style='word-wrap:break-word;'>$texte</$tag>";
1205 1205
 }
1206 1206
 
1207 1207
 /**
@@ -1220,30 +1220,30 @@  discard block
 block discarded – undo
1220 1220
  * @return string Texte en majuscule
1221 1221
  */
1222 1222
 function majuscules($texte) {
1223
-	if (!strlen($texte)) {
1224
-		return '';
1225
-	}
1223
+    if (!strlen($texte)) {
1224
+        return '';
1225
+    }
1226 1226
 
1227
-	// Cas du turc
1228
-	if ($GLOBALS['spip_lang'] == 'tr') {
1229
-		# remplacer hors des tags et des entites
1230
-		if (preg_match_all(',<[^<>]+>|&[^;]+;,S', $texte, $regs, PREG_SET_ORDER)) {
1231
-			foreach ($regs as $n => $match) {
1232
-				$texte = str_replace($match[0], "@@SPIP_TURC$n@@", $texte);
1233
-			}
1234
-		}
1227
+    // Cas du turc
1228
+    if ($GLOBALS['spip_lang'] == 'tr') {
1229
+        # remplacer hors des tags et des entites
1230
+        if (preg_match_all(',<[^<>]+>|&[^;]+;,S', $texte, $regs, PREG_SET_ORDER)) {
1231
+            foreach ($regs as $n => $match) {
1232
+                $texte = str_replace($match[0], "@@SPIP_TURC$n@@", $texte);
1233
+            }
1234
+        }
1235 1235
 
1236
-		$texte = str_replace('i', '&#304;', $texte);
1236
+        $texte = str_replace('i', '&#304;', $texte);
1237 1237
 
1238
-		if ($regs) {
1239
-			foreach ($regs as $n => $match) {
1240
-				$texte = str_replace("@@SPIP_TURC$n@@", $match[0], $texte);
1241
-			}
1242
-		}
1243
-	}
1238
+        if ($regs) {
1239
+            foreach ($regs as $n => $match) {
1240
+                $texte = str_replace("@@SPIP_TURC$n@@", $match[0], $texte);
1241
+            }
1242
+        }
1243
+    }
1244 1244
 
1245
-	// Cas general
1246
-	return "<span style='text-transform: uppercase;'>$texte</span>";
1245
+    // Cas general
1246
+    return "<span style='text-transform: uppercase;'>$texte</span>";
1247 1247
 }
1248 1248
 
1249 1249
 /**
@@ -1261,29 +1261,29 @@  discard block
 block discarded – undo
1261 1261
  * @return string
1262 1262
  **/
1263 1263
 function taille_en_octets($taille) {
1264
-	if (!defined('_KILOBYTE')) {
1265
-		/**
1266
-		 * Définit le nombre d'octets dans un Kilobyte
1267
-		 *
1268
-		 * @var int
1269
-		 **/
1270
-		define('_KILOBYTE', 1024);
1271
-	}
1264
+    if (!defined('_KILOBYTE')) {
1265
+        /**
1266
+         * Définit le nombre d'octets dans un Kilobyte
1267
+         *
1268
+         * @var int
1269
+         **/
1270
+        define('_KILOBYTE', 1024);
1271
+    }
1272 1272
 
1273
-	if ($taille < 1) {
1274
-		return '';
1275
-	}
1276
-	if ($taille < _KILOBYTE) {
1277
-		$taille = _T('taille_octets', array('taille' => $taille));
1278
-	} elseif ($taille < _KILOBYTE * _KILOBYTE) {
1279
-		$taille = _T('taille_ko', array('taille' => round($taille / _KILOBYTE, 1)));
1280
-	} elseif ($taille < _KILOBYTE * _KILOBYTE * _KILOBYTE) {
1281
-		$taille = _T('taille_mo', array('taille' => round($taille / _KILOBYTE / _KILOBYTE, 1)));
1282
-	} else {
1283
-		$taille = _T('taille_go', array('taille' => round($taille / _KILOBYTE / _KILOBYTE / _KILOBYTE, 2)));
1284
-	}
1273
+    if ($taille < 1) {
1274
+        return '';
1275
+    }
1276
+    if ($taille < _KILOBYTE) {
1277
+        $taille = _T('taille_octets', array('taille' => $taille));
1278
+    } elseif ($taille < _KILOBYTE * _KILOBYTE) {
1279
+        $taille = _T('taille_ko', array('taille' => round($taille / _KILOBYTE, 1)));
1280
+    } elseif ($taille < _KILOBYTE * _KILOBYTE * _KILOBYTE) {
1281
+        $taille = _T('taille_mo', array('taille' => round($taille / _KILOBYTE / _KILOBYTE, 1)));
1282
+    } else {
1283
+        $taille = _T('taille_go', array('taille' => round($taille / _KILOBYTE / _KILOBYTE / _KILOBYTE, 2)));
1284
+    }
1285 1285
 
1286
-	return $taille;
1286
+    return $taille;
1287 1287
 }
1288 1288
 
1289 1289
 
@@ -1305,15 +1305,15 @@  discard block
 block discarded – undo
1305 1305
  *     Texte prêt pour être utilisé en attribut HTML
1306 1306
  **/
1307 1307
 function attribut_html($texte, $textebrut = true) {
1308
-	$u = $GLOBALS['meta']['pcre_u'];
1309
-	if ($textebrut) {
1310
-		$texte = preg_replace(array(",\n,", ",\s(?=\s),msS" . $u), array(" ", ""), textebrut($texte));
1311
-	}
1312
-	$texte = texte_backend($texte);
1313
-	$texte = str_replace(array("'", '"'), array('&#039;', '&#034;'), $texte);
1308
+    $u = $GLOBALS['meta']['pcre_u'];
1309
+    if ($textebrut) {
1310
+        $texte = preg_replace(array(",\n,", ",\s(?=\s),msS" . $u), array(" ", ""), textebrut($texte));
1311
+    }
1312
+    $texte = texte_backend($texte);
1313
+    $texte = str_replace(array("'", '"'), array('&#039;', '&#034;'), $texte);
1314 1314
 
1315
-	return preg_replace(array("/&(amp;|#38;)/", "/&(?![A-Za-z]{0,4}\w{2,3};|#[0-9]{2,5};)/"), array("&", "&#38;"),
1316
-		$texte);
1315
+    return preg_replace(array("/&(amp;|#38;)/", "/&(?![A-Za-z]{0,4}\w{2,3};|#[0-9]{2,5};)/"), array("&", "&#38;"),
1316
+        $texte);
1317 1317
 }
1318 1318
 
1319 1319
 
@@ -1333,12 +1333,12 @@  discard block
 block discarded – undo
1333 1333
  *     URL ou chaîne vide
1334 1334
  **/
1335 1335
 function vider_url($url, $entites = true) {
1336
-	# un message pour abs_url
1337
-	$GLOBALS['mode_abs_url'] = 'url';
1338
-	$url = trim($url);
1339
-	$r = ",^(?:" . _PROTOCOLES_STD . '):?/?/?$,iS';
1336
+    # un message pour abs_url
1337
+    $GLOBALS['mode_abs_url'] = 'url';
1338
+    $url = trim($url);
1339
+    $r = ",^(?:" . _PROTOCOLES_STD . '):?/?/?$,iS';
1340 1340
 
1341
-	return preg_match($r, $url) ? '' : ($entites ? entites_html($url) : $url);
1341
+    return preg_match($r, $url) ? '' : ($entites ? entites_html($url) : $url);
1342 1342
 }
1343 1343
 
1344 1344
 
@@ -1353,10 +1353,10 @@  discard block
 block discarded – undo
1353 1353
  * @return string Adresse email maquillée
1354 1354
  **/
1355 1355
 function antispam($texte) {
1356
-	include_spip('inc/acces');
1357
-	$masque = creer_pass_aleatoire(3);
1356
+    include_spip('inc/acces');
1357
+    $masque = creer_pass_aleatoire(3);
1358 1358
 
1359
-	return preg_replace("/@/", " $masque ", $texte);
1359
+    return preg_replace("/@/", " $masque ", $texte);
1360 1360
 }
1361 1361
 
1362 1362
 /**
@@ -1388,12 +1388,12 @@  discard block
 block discarded – undo
1388 1388
  *     True si on a le droit d'accès, false sinon.
1389 1389
  **/
1390 1390
 function securiser_acces($id_auteur, $cle, $dir, $op = '', $args = '') {
1391
-	include_spip('inc/acces');
1392
-	if ($op) {
1393
-		$dir .= " $op $args";
1394
-	}
1391
+    include_spip('inc/acces');
1392
+    if ($op) {
1393
+        $dir .= " $op $args";
1394
+    }
1395 1395
 
1396
-	return verifier_low_sec($id_auteur, $cle, $dir);
1396
+    return verifier_low_sec($id_auteur, $cle, $dir);
1397 1397
 }
1398 1398
 
1399 1399
 /**
@@ -1418,11 +1418,11 @@  discard block
 block discarded – undo
1418 1418
  *     Retourne $texte, sinon $sinon.
1419 1419
  **/
1420 1420
 function sinon($texte, $sinon = '') {
1421
-	if ($texte or (!is_array($texte) and strlen($texte))) {
1422
-		return $texte;
1423
-	} else {
1424
-		return $sinon;
1425
-	}
1421
+    if ($texte or (!is_array($texte) and strlen($texte))) {
1422
+        return $texte;
1423
+    } else {
1424
+        return $sinon;
1425
+    }
1426 1426
 }
1427 1427
 
1428 1428
 /**
@@ -1446,7 +1446,7 @@  discard block
 block discarded – undo
1446 1446
  * @return mixed
1447 1447
  **/
1448 1448
 function choixsivide($a, $vide, $pasvide) {
1449
-	return $a ? $pasvide : $vide;
1449
+    return $a ? $pasvide : $vide;
1450 1450
 }
1451 1451
 
1452 1452
 /**
@@ -1470,7 +1470,7 @@  discard block
 block discarded – undo
1470 1470
  * @return mixed
1471 1471
  **/
1472 1472
 function choixsiegal($a1, $a2, $v, $f) {
1473
-	return ($a1 == $a2) ? $v : $f;
1473
+    return ($a1 == $a2) ? $v : $f;
1474 1474
 }
1475 1475
 
1476 1476
 //
@@ -1489,13 +1489,13 @@  discard block
 block discarded – undo
1489 1489
  * @return string
1490 1490
  **/
1491 1491
 function filtrer_ical($texte) {
1492
-	#include_spip('inc/charsets');
1493
-	$texte = html2unicode($texte);
1494
-	$texte = unicode2charset(charset2unicode($texte, $GLOBALS['meta']['charset'], 1), 'utf-8');
1495
-	$texte = preg_replace("/\n/", " ", $texte);
1496
-	$texte = preg_replace("/,/", "\,", $texte);
1492
+    #include_spip('inc/charsets');
1493
+    $texte = html2unicode($texte);
1494
+    $texte = unicode2charset(charset2unicode($texte, $GLOBALS['meta']['charset'], 1), 'utf-8');
1495
+    $texte = preg_replace("/\n/", " ", $texte);
1496
+    $texte = preg_replace("/,/", "\,", $texte);
1497 1497
 
1498
-	return $texte;
1498
+    return $texte;
1499 1499
 }
1500 1500
 
1501 1501
 
@@ -1520,53 +1520,53 @@  discard block
 block discarded – undo
1520 1520
  * @return string
1521 1521
  **/
1522 1522
 function post_autobr($texte, $delim = "\n_ ") {
1523
-	if (!function_exists('echappe_html')) {
1524
-		include_spip('inc/texte_mini');
1525
-	}
1526
-	$texte = str_replace("\r\n", "\r", $texte);
1527
-	$texte = str_replace("\r", "\n", $texte);
1528
-
1529
-	if (preg_match(",\n+$,", $texte, $fin)) {
1530
-		$texte = substr($texte, 0, -strlen($fin = $fin[0]));
1531
-	} else {
1532
-		$fin = '';
1533
-	}
1534
-
1535
-	$texte = echappe_html($texte, '', true);
1536
-
1537
-	// echapper les modeles
1538
-	if (strpos($texte, "<") !== false) {
1539
-		include_spip('inc/lien');
1540
-		if (defined('_PREG_MODELE')) {
1541
-			$preg_modeles = "@" . _PREG_MODELE . "@imsS";
1542
-			$texte = echappe_html($texte, '', true, $preg_modeles);
1543
-		}
1544
-	}
1545
-
1546
-	$debut = '';
1547
-	$suite = $texte;
1548
-	while ($t = strpos('-' . $suite, "\n", 1)) {
1549
-		$debut .= substr($suite, 0, $t - 1);
1550
-		$suite = substr($suite, $t);
1551
-		$car = substr($suite, 0, 1);
1552
-		if (($car <> '-') and ($car <> '_') and ($car <> "\n") and ($car <> "|") and ($car <> "}")
1553
-			and !preg_match(',^\s*(\n|</?(quote|div|dl|dt|dd)|$),S', ($suite))
1554
-			and !preg_match(',</?(quote|div|dl|dt|dd)> *$,iS', $debut)
1555
-		) {
1556
-			$debut .= $delim;
1557
-		} else {
1558
-			$debut .= "\n";
1559
-		}
1560
-		if (preg_match(",^\n+,", $suite, $regs)) {
1561
-			$debut .= $regs[0];
1562
-			$suite = substr($suite, strlen($regs[0]));
1563
-		}
1564
-	}
1565
-	$texte = $debut . $suite;
1566
-
1567
-	$texte = echappe_retour($texte);
1568
-
1569
-	return $texte . $fin;
1523
+    if (!function_exists('echappe_html')) {
1524
+        include_spip('inc/texte_mini');
1525
+    }
1526
+    $texte = str_replace("\r\n", "\r", $texte);
1527
+    $texte = str_replace("\r", "\n", $texte);
1528
+
1529
+    if (preg_match(",\n+$,", $texte, $fin)) {
1530
+        $texte = substr($texte, 0, -strlen($fin = $fin[0]));
1531
+    } else {
1532
+        $fin = '';
1533
+    }
1534
+
1535
+    $texte = echappe_html($texte, '', true);
1536
+
1537
+    // echapper les modeles
1538
+    if (strpos($texte, "<") !== false) {
1539
+        include_spip('inc/lien');
1540
+        if (defined('_PREG_MODELE')) {
1541
+            $preg_modeles = "@" . _PREG_MODELE . "@imsS";
1542
+            $texte = echappe_html($texte, '', true, $preg_modeles);
1543
+        }
1544
+    }
1545
+
1546
+    $debut = '';
1547
+    $suite = $texte;
1548
+    while ($t = strpos('-' . $suite, "\n", 1)) {
1549
+        $debut .= substr($suite, 0, $t - 1);
1550
+        $suite = substr($suite, $t);
1551
+        $car = substr($suite, 0, 1);
1552
+        if (($car <> '-') and ($car <> '_') and ($car <> "\n") and ($car <> "|") and ($car <> "}")
1553
+            and !preg_match(',^\s*(\n|</?(quote|div|dl|dt|dd)|$),S', ($suite))
1554
+            and !preg_match(',</?(quote|div|dl|dt|dd)> *$,iS', $debut)
1555
+        ) {
1556
+            $debut .= $delim;
1557
+        } else {
1558
+            $debut .= "\n";
1559
+        }
1560
+        if (preg_match(",^\n+,", $suite, $regs)) {
1561
+            $debut .= $regs[0];
1562
+            $suite = substr($suite, strlen($regs[0]));
1563
+        }
1564
+    }
1565
+    $texte = $debut . $suite;
1566
+
1567
+    $texte = echappe_retour($texte);
1568
+
1569
+    return $texte . $fin;
1570 1570
 }
1571 1571
 
1572 1572
 
@@ -1607,46 +1607,46 @@  discard block
 block discarded – undo
1607 1607
  * @return string
1608 1608
  **/
1609 1609
 function extraire_idiome($letexte, $lang = null, $options = array()) {
1610
-	static $traduire = false;
1611
-	if ($letexte
1612
-		and preg_match_all(_EXTRAIRE_IDIOME, $letexte, $regs, PREG_SET_ORDER)
1613
-	) {
1614
-		if (!$traduire) {
1615
-			$traduire = charger_fonction('traduire', 'inc');
1616
-			include_spip('inc/lang');
1617
-		}
1618
-		if (!$lang) {
1619
-			$lang = $GLOBALS['spip_lang'];
1620
-		}
1621
-		// Compatibilité avec le prototype de fonction précédente qui utilisait un boolean
1622
-		if (is_bool($options)) {
1623
-			$options = array('echappe_span' => $options);
1624
-		}
1625
-		if (!isset($options['echappe_span'])) {
1626
-			$options = array_merge($options, array('echappe_span' => false));
1627
-		}
1628
-
1629
-		foreach ($regs as $reg) {
1630
-			$cle = ($reg[1] ? $reg[1] . ':' : '') . $reg[2];
1631
-			$desc = $traduire($cle, $lang, true);
1632
-			$l = $desc->langue;
1633
-			// si pas de traduction, on laissera l'écriture de l'idiome entier dans le texte.
1634
-			if (strlen($desc->texte)) {
1635
-				$trad = code_echappement($desc->texte, 'idiome', false);
1636
-				if ($l !== $lang) {
1637
-					$trad = str_replace("'", '"', inserer_attribut($trad, 'lang', $l));
1638
-				}
1639
-				if (lang_dir($l) !== lang_dir($lang)) {
1640
-					$trad = str_replace("'", '"', inserer_attribut($trad, 'dir', lang_dir($l)));
1641
-				}
1642
-				if (!$options['echappe_span']) {
1643
-					$trad = echappe_retour($trad, 'idiome');
1644
-				}
1645
-				$letexte = str_replace($reg[0], $trad, $letexte);
1646
-			}
1647
-		}
1648
-	}
1649
-	return $letexte;
1610
+    static $traduire = false;
1611
+    if ($letexte
1612
+        and preg_match_all(_EXTRAIRE_IDIOME, $letexte, $regs, PREG_SET_ORDER)
1613
+    ) {
1614
+        if (!$traduire) {
1615
+            $traduire = charger_fonction('traduire', 'inc');
1616
+            include_spip('inc/lang');
1617
+        }
1618
+        if (!$lang) {
1619
+            $lang = $GLOBALS['spip_lang'];
1620
+        }
1621
+        // Compatibilité avec le prototype de fonction précédente qui utilisait un boolean
1622
+        if (is_bool($options)) {
1623
+            $options = array('echappe_span' => $options);
1624
+        }
1625
+        if (!isset($options['echappe_span'])) {
1626
+            $options = array_merge($options, array('echappe_span' => false));
1627
+        }
1628
+
1629
+        foreach ($regs as $reg) {
1630
+            $cle = ($reg[1] ? $reg[1] . ':' : '') . $reg[2];
1631
+            $desc = $traduire($cle, $lang, true);
1632
+            $l = $desc->langue;
1633
+            // si pas de traduction, on laissera l'écriture de l'idiome entier dans le texte.
1634
+            if (strlen($desc->texte)) {
1635
+                $trad = code_echappement($desc->texte, 'idiome', false);
1636
+                if ($l !== $lang) {
1637
+                    $trad = str_replace("'", '"', inserer_attribut($trad, 'lang', $l));
1638
+                }
1639
+                if (lang_dir($l) !== lang_dir($lang)) {
1640
+                    $trad = str_replace("'", '"', inserer_attribut($trad, 'dir', lang_dir($l)));
1641
+                }
1642
+                if (!$options['echappe_span']) {
1643
+                    $trad = echappe_retour($trad, 'idiome');
1644
+                }
1645
+                $letexte = str_replace($reg[0], $trad, $letexte);
1646
+            }
1647
+        }
1648
+    }
1649
+    return $letexte;
1650 1650
 }
1651 1651
 
1652 1652
 /**
@@ -1698,67 +1698,67 @@  discard block
 block discarded – undo
1698 1698
  **/
1699 1699
 function extraire_multi($letexte, $lang = null, $options = array()) {
1700 1700
 
1701
-	if ($letexte
1702
-		and preg_match_all(_EXTRAIRE_MULTI, $letexte, $regs, PREG_SET_ORDER)
1703
-	) {
1704
-		if (!$lang) {
1705
-			$lang = $GLOBALS['spip_lang'];
1706
-		}
1707
-
1708
-		// Compatibilité avec le prototype de fonction précédente qui utilisait un boolean
1709
-		if (is_bool($options)) {
1710
-			$options = array('echappe_span' => $options, 'lang_defaut' => _LANGUE_PAR_DEFAUT);
1711
-		}
1712
-		if (!isset($options['echappe_span'])) {
1713
-			$options = array_merge($options, array('echappe_span' => false));
1714
-		}
1715
-		if (!isset($options['lang_defaut'])) {
1716
-			$options = array_merge($options, array('lang_defaut' => _LANGUE_PAR_DEFAUT));
1717
-		}
1718
-
1719
-		include_spip('inc/lang');
1720
-		foreach ($regs as $reg) {
1721
-			// chercher la version de la langue courante
1722
-			$trads = extraire_trads($reg[1]);
1723
-			if ($l = approcher_langue($trads, $lang)) {
1724
-				$trad = $trads[$l];
1725
-			} else {
1726
-				if ($options['lang_defaut'] == 'aucune') {
1727
-					$trad = '';
1728
-				} else {
1729
-					// langue absente, prendre le fr ou une langue précisée (meme comportement que inc/traduire.php)
1730
-					// ou la premiere dispo
1731
-					// mais typographier le texte selon les regles de celle-ci
1732
-					// Attention aux blocs multi sur plusieurs lignes
1733
-					if (!$l = approcher_langue($trads, $options['lang_defaut'])) {
1734
-						$l = key($trads);
1735
-					}
1736
-					$trad = $trads[$l];
1737
-					$typographie = charger_fonction(lang_typo($l), 'typographie');
1738
-					$trad = $typographie($trad);
1739
-					// Tester si on echappe en span ou en div
1740
-					// il ne faut pas echapper en div si propre produit un seul paragraphe
1741
-					include_spip('inc/texte');
1742
-					$trad_propre = preg_replace(",(^<p[^>]*>|</p>$),Uims", "", propre($trad));
1743
-					$mode = preg_match(',</?(' . _BALISES_BLOCS . ')[>[:space:]],iS', $trad_propre) ? 'div' : 'span';
1744
-					if ($mode === 'div') {
1745
-						$trad = rtrim($trad) . "\n\n";
1746
-					}
1747
-					$trad = code_echappement($trad, 'multi', false, $mode);
1748
-					$trad = str_replace("'", '"', inserer_attribut($trad, 'lang', $l));
1749
-					if (lang_dir($l) !== lang_dir($lang)) {
1750
-						$trad = str_replace("'", '"', inserer_attribut($trad, 'dir', lang_dir($l)));
1751
-					}
1752
-					if (!$options['echappe_span']) {
1753
-						$trad = echappe_retour($trad, 'multi');
1754
-					}
1755
-				}
1756
-			}
1757
-			$letexte = str_replace($reg[0], $trad, $letexte);
1758
-		}
1759
-	}
1760
-
1761
-	return $letexte;
1701
+    if ($letexte
1702
+        and preg_match_all(_EXTRAIRE_MULTI, $letexte, $regs, PREG_SET_ORDER)
1703
+    ) {
1704
+        if (!$lang) {
1705
+            $lang = $GLOBALS['spip_lang'];
1706
+        }
1707
+
1708
+        // Compatibilité avec le prototype de fonction précédente qui utilisait un boolean
1709
+        if (is_bool($options)) {
1710
+            $options = array('echappe_span' => $options, 'lang_defaut' => _LANGUE_PAR_DEFAUT);
1711
+        }
1712
+        if (!isset($options['echappe_span'])) {
1713
+            $options = array_merge($options, array('echappe_span' => false));
1714
+        }
1715
+        if (!isset($options['lang_defaut'])) {
1716
+            $options = array_merge($options, array('lang_defaut' => _LANGUE_PAR_DEFAUT));
1717
+        }
1718
+
1719
+        include_spip('inc/lang');
1720
+        foreach ($regs as $reg) {
1721
+            // chercher la version de la langue courante
1722
+            $trads = extraire_trads($reg[1]);
1723
+            if ($l = approcher_langue($trads, $lang)) {
1724
+                $trad = $trads[$l];
1725
+            } else {
1726
+                if ($options['lang_defaut'] == 'aucune') {
1727
+                    $trad = '';
1728
+                } else {
1729
+                    // langue absente, prendre le fr ou une langue précisée (meme comportement que inc/traduire.php)
1730
+                    // ou la premiere dispo
1731
+                    // mais typographier le texte selon les regles de celle-ci
1732
+                    // Attention aux blocs multi sur plusieurs lignes
1733
+                    if (!$l = approcher_langue($trads, $options['lang_defaut'])) {
1734
+                        $l = key($trads);
1735
+                    }
1736
+                    $trad = $trads[$l];
1737
+                    $typographie = charger_fonction(lang_typo($l), 'typographie');
1738
+                    $trad = $typographie($trad);
1739
+                    // Tester si on echappe en span ou en div
1740
+                    // il ne faut pas echapper en div si propre produit un seul paragraphe
1741
+                    include_spip('inc/texte');
1742
+                    $trad_propre = preg_replace(",(^<p[^>]*>|</p>$),Uims", "", propre($trad));
1743
+                    $mode = preg_match(',</?(' . _BALISES_BLOCS . ')[>[:space:]],iS', $trad_propre) ? 'div' : 'span';
1744
+                    if ($mode === 'div') {
1745
+                        $trad = rtrim($trad) . "\n\n";
1746
+                    }
1747
+                    $trad = code_echappement($trad, 'multi', false, $mode);
1748
+                    $trad = str_replace("'", '"', inserer_attribut($trad, 'lang', $l));
1749
+                    if (lang_dir($l) !== lang_dir($lang)) {
1750
+                        $trad = str_replace("'", '"', inserer_attribut($trad, 'dir', lang_dir($l)));
1751
+                    }
1752
+                    if (!$options['echappe_span']) {
1753
+                        $trad = echappe_retour($trad, 'multi');
1754
+                    }
1755
+                }
1756
+            }
1757
+            $letexte = str_replace($reg[0], $trad, $letexte);
1758
+        }
1759
+    }
1760
+
1761
+    return $letexte;
1762 1762
 }
1763 1763
 
1764 1764
 /**
@@ -1774,20 +1774,20 @@  discard block
 block discarded – undo
1774 1774
  *     Peut retourner un code de langue vide, lorsqu'un texte par défaut est indiqué.
1775 1775
  **/
1776 1776
 function extraire_trads($bloc) {
1777
-	$lang = '';
1777
+    $lang = '';
1778 1778
 // ce reg fait planter l'analyse multi s'il y a de l'{italique} dans le champ
1779 1779
 //	while (preg_match("/^(.*?)[{\[]([a-z_]+)[}\]]/siS", $bloc, $regs)) {
1780
-	while (preg_match("/^(.*?)[\[]([a-z_]+)[\]]/siS", $bloc, $regs)) {
1781
-		$texte = trim($regs[1]);
1782
-		if ($texte or $lang) {
1783
-			$trads[$lang] = $texte;
1784
-		}
1785
-		$bloc = substr($bloc, strlen($regs[0]));
1786
-		$lang = $regs[2];
1787
-	}
1788
-	$trads[$lang] = $bloc;
1780
+    while (preg_match("/^(.*?)[\[]([a-z_]+)[\]]/siS", $bloc, $regs)) {
1781
+        $texte = trim($regs[1]);
1782
+        if ($texte or $lang) {
1783
+            $trads[$lang] = $texte;
1784
+        }
1785
+        $bloc = substr($bloc, strlen($regs[0]));
1786
+        $lang = $regs[2];
1787
+    }
1788
+    $trads[$lang] = $bloc;
1789 1789
 
1790
-	return $trads;
1790
+    return $trads;
1791 1791
 }
1792 1792
 
1793 1793
 
@@ -1798,7 +1798,7 @@  discard block
 block discarded – undo
1798 1798
  * @return string L'initiale en majuscule
1799 1799
  */
1800 1800
 function filtre_initiale($nom) {
1801
-	return spip_substr(trim(strtoupper(extraire_multi($nom))), 0, 1);
1801
+    return spip_substr(trim(strtoupper(extraire_multi($nom))), 0, 1);
1802 1802
 }
1803 1803
 
1804 1804
 
@@ -1843,33 +1843,33 @@  discard block
 block discarded – undo
1843 1843
  *      - null (interne) : si on empile
1844 1844
  **/
1845 1845
 function unique($donnee, $famille = '', $cpt = false) {
1846
-	static $mem = array();
1847
-	// permettre de vider la pile et de la restaurer
1848
-	// pour le calcul de introduction...
1849
-	if ($famille == '_spip_raz_') {
1850
-		$tmp = $mem;
1851
-		$mem = array();
1852
-
1853
-		return $tmp;
1854
-	} elseif ($famille == '_spip_set_') {
1855
-		$mem = $donnee;
1856
-
1857
-		return;
1858
-	}
1859
-	// eviter une notice
1860
-	if (!isset($mem[$famille])) {
1861
-		$mem[$famille] = array();
1862
-	}
1863
-	if ($cpt) {
1864
-		return count($mem[$famille]);
1865
-	}
1866
-	// eviter une notice
1867
-	if (!isset($mem[$famille][$donnee])) {
1868
-		$mem[$famille][$donnee] = 0;
1869
-	}
1870
-	if (!($mem[$famille][$donnee]++)) {
1871
-		return $donnee;
1872
-	}
1846
+    static $mem = array();
1847
+    // permettre de vider la pile et de la restaurer
1848
+    // pour le calcul de introduction...
1849
+    if ($famille == '_spip_raz_') {
1850
+        $tmp = $mem;
1851
+        $mem = array();
1852
+
1853
+        return $tmp;
1854
+    } elseif ($famille == '_spip_set_') {
1855
+        $mem = $donnee;
1856
+
1857
+        return;
1858
+    }
1859
+    // eviter une notice
1860
+    if (!isset($mem[$famille])) {
1861
+        $mem[$famille] = array();
1862
+    }
1863
+    if ($cpt) {
1864
+        return count($mem[$famille]);
1865
+    }
1866
+    // eviter une notice
1867
+    if (!isset($mem[$famille][$donnee])) {
1868
+        $mem[$famille][$donnee] = 0;
1869
+    }
1870
+    if (!($mem[$famille][$donnee]++)) {
1871
+        return $donnee;
1872
+    }
1873 1873
 }
1874 1874
 
1875 1875
 
@@ -1899,16 +1899,16 @@  discard block
 block discarded – undo
1899 1899
  *     Une des valeurs en fonction du compteur.
1900 1900
  **/
1901 1901
 function alterner($i, ...$args) {
1902
-	// recuperer les arguments (attention fonctions un peu space)
1903
-	$num = count($args);
1902
+    // recuperer les arguments (attention fonctions un peu space)
1903
+    $num = count($args);
1904 1904
 
1905
-	if ($num === 1 && is_array($args[0])) {
1906
-		$args = $args[0];
1907
-		$num = count($args);
1908
-	}
1905
+    if ($num === 1 && is_array($args[0])) {
1906
+        $args = $args[0];
1907
+        $num = count($args);
1908
+    }
1909 1909
 
1910
-	// renvoyer le i-ieme argument, modulo le nombre d'arguments
1911
-	return $args[(intval($i) - 1) % $num];
1910
+    // renvoyer le i-ieme argument, modulo le nombre d'arguments
1911
+    return $args[(intval($i) - 1) % $num];
1912 1912
 }
1913 1913
 
1914 1914
 
@@ -1933,46 +1933,46 @@  discard block
 block discarded – undo
1933 1933
  *     - Tableau complet (si 2e argument)
1934 1934
  **/
1935 1935
 function extraire_attribut($balise, $attribut, $complet = false) {
1936
-	if (is_array($balise)) {
1937
-		array_walk(
1938
-			$balise,
1939
-			function(&$a, $key, $t){
1940
-				$a = extraire_attribut($a, $t);
1941
-			},
1942
-			$attribut
1943
-		);
1944
-
1945
-		return $balise;
1946
-	}
1947
-	if (preg_match(
1948
-		',(^.*?<(?:(?>\s*)(?>[\w:.-]+)(?>(?:=(?:"[^"]*"|\'[^\']*\'|[^\'"]\S*))?))*?)(\s+'
1949
-		. $attribut
1950
-		. '(?:=\s*("[^"]*"|\'[^\']*\'|[^\'"]\S*))?)()((?:[\s/][^>]*)?>.*),isS',
1951
-
1952
-		$balise, $r)) {
1953
-		if (isset($r[3][0]) and ($r[3][0] == '"' || $r[3][0] == "'")) {
1954
-			$r[4] = substr($r[3], 1, -1);
1955
-			$r[3] = $r[3][0];
1956
-		} elseif ($r[3] !== '') {
1957
-			$r[4] = $r[3];
1958
-			$r[3] = '';
1959
-		} else {
1960
-			$r[4] = trim($r[2]);
1961
-		}
1962
-		$att = $r[4];
1963
-		if (strpos($att, "&#") !== false) {
1964
-			$att = str_replace(array("&#039;", "&#39;", "&#034;", "&#34;"), array("'", "'", '"', '"'), $att);
1965
-		}
1966
-		$att = filtrer_entites($att);
1967
-	} else {
1968
-		$att = null;
1969
-	}
1970
-
1971
-	if ($complet) {
1972
-		return array($att, $r);
1973
-	} else {
1974
-		return $att;
1975
-	}
1936
+    if (is_array($balise)) {
1937
+        array_walk(
1938
+            $balise,
1939
+            function(&$a, $key, $t){
1940
+                $a = extraire_attribut($a, $t);
1941
+            },
1942
+            $attribut
1943
+        );
1944
+
1945
+        return $balise;
1946
+    }
1947
+    if (preg_match(
1948
+        ',(^.*?<(?:(?>\s*)(?>[\w:.-]+)(?>(?:=(?:"[^"]*"|\'[^\']*\'|[^\'"]\S*))?))*?)(\s+'
1949
+        . $attribut
1950
+        . '(?:=\s*("[^"]*"|\'[^\']*\'|[^\'"]\S*))?)()((?:[\s/][^>]*)?>.*),isS',
1951
+
1952
+        $balise, $r)) {
1953
+        if (isset($r[3][0]) and ($r[3][0] == '"' || $r[3][0] == "'")) {
1954
+            $r[4] = substr($r[3], 1, -1);
1955
+            $r[3] = $r[3][0];
1956
+        } elseif ($r[3] !== '') {
1957
+            $r[4] = $r[3];
1958
+            $r[3] = '';
1959
+        } else {
1960
+            $r[4] = trim($r[2]);
1961
+        }
1962
+        $att = $r[4];
1963
+        if (strpos($att, "&#") !== false) {
1964
+            $att = str_replace(array("&#039;", "&#39;", "&#034;", "&#34;"), array("'", "'", '"', '"'), $att);
1965
+        }
1966
+        $att = filtrer_entites($att);
1967
+    } else {
1968
+        $att = null;
1969
+    }
1970
+
1971
+    if ($complet) {
1972
+        return array($att, $r);
1973
+    } else {
1974
+        return $att;
1975
+    }
1976 1976
 }
1977 1977
 
1978 1978
 /**
@@ -2004,37 +2004,37 @@  discard block
 block discarded – undo
2004 2004
  *     Code html modifié
2005 2005
  **/
2006 2006
 function inserer_attribut($balise, $attribut, $val, $proteger = true, $vider = false) {
2007
-	// preparer l'attribut
2008
-	// supprimer les &nbsp; etc mais pas les balises html
2009
-	// qui ont un sens dans un attribut value d'un input
2010
-	if ($proteger) {
2011
-		$val = attribut_html($val, false);
2012
-	}
2013
-
2014
-	// echapper les ' pour eviter tout bug
2015
-	$val = str_replace("'", "&#039;", $val);
2016
-	if ($vider and strlen($val) == 0) {
2017
-		$insert = '';
2018
-	} else {
2019
-		$insert = " $attribut='$val'";
2020
-	}
2021
-
2022
-	list($old, $r) = extraire_attribut($balise, $attribut, true);
2023
-
2024
-	if ($old !== null) {
2025
-		// Remplacer l'ancien attribut du meme nom
2026
-		$balise = $r[1] . $insert . $r[5];
2027
-	} else {
2028
-		// preferer une balise " />" (comme <img />)
2029
-		if (preg_match(',/>,', $balise)) {
2030
-			$balise = preg_replace(",\s?/>,S", $insert . " />", $balise, 1);
2031
-		} // sinon une balise <a ...> ... </a>
2032
-		else {
2033
-			$balise = preg_replace(",\s?>,S", $insert . ">", $balise, 1);
2034
-		}
2035
-	}
2036
-
2037
-	return $balise;
2007
+    // preparer l'attribut
2008
+    // supprimer les &nbsp; etc mais pas les balises html
2009
+    // qui ont un sens dans un attribut value d'un input
2010
+    if ($proteger) {
2011
+        $val = attribut_html($val, false);
2012
+    }
2013
+
2014
+    // echapper les ' pour eviter tout bug
2015
+    $val = str_replace("'", "&#039;", $val);
2016
+    if ($vider and strlen($val) == 0) {
2017
+        $insert = '';
2018
+    } else {
2019
+        $insert = " $attribut='$val'";
2020
+    }
2021
+
2022
+    list($old, $r) = extraire_attribut($balise, $attribut, true);
2023
+
2024
+    if ($old !== null) {
2025
+        // Remplacer l'ancien attribut du meme nom
2026
+        $balise = $r[1] . $insert . $r[5];
2027
+    } else {
2028
+        // preferer une balise " />" (comme <img />)
2029
+        if (preg_match(',/>,', $balise)) {
2030
+            $balise = preg_replace(",\s?/>,S", $insert . " />", $balise, 1);
2031
+        } // sinon une balise <a ...> ... </a>
2032
+        else {
2033
+            $balise = preg_replace(",\s?>,S", $insert . ">", $balise, 1);
2034
+        }
2035
+    }
2036
+
2037
+    return $balise;
2038 2038
 }
2039 2039
 
2040 2040
 /**
@@ -2052,7 +2052,7 @@  discard block
 block discarded – undo
2052 2052
  * @return string Code HTML sans l'attribut
2053 2053
  **/
2054 2054
 function vider_attribut($balise, $attribut) {
2055
-	return inserer_attribut($balise, $attribut, '', false, true);
2055
+    return inserer_attribut($balise, $attribut, '', false, true);
2056 2056
 }
2057 2057
 
2058 2058
 /**
@@ -2064,50 +2064,50 @@  discard block
 block discarded – undo
2064 2064
  * @return string
2065 2065
  */
2066 2066
 function modifier_class($balise, $class, $operation='ajouter') {
2067
-	if (is_string($class)) {
2068
-		$class = explode(' ', trim($class));
2069
-	}
2070
-	$class = array_filter($class);
2071
-
2072
-	// si la ou les classes ont des caracteres invalides on ne fait rien
2073
-	if (preg_match(",[^\w-],", implode('', $class))) {
2074
-		return $balise;
2075
-	}
2076
-
2077
-	if ($class) {
2078
-		$class = array_unique($class);
2079
-		$class_courante = extraire_attribut($balise, 'class');
2080
-
2081
-		$class_new = $class_courante;
2082
-		foreach ($class as $c) {
2083
-			if ($c) {
2084
-				$is_class_presente = false;
2085
-				if (strpos($class_courante, $c) !== false
2086
-					and preg_match("/(^|\s)".preg_quote($c)."($|\s)/", $class_courante)) {
2087
-					$is_class_presente = true;
2088
-				}
2089
-				if (in_array($operation, ['ajouter', 'commuter'])
2090
-					and !$is_class_presente) {
2091
-					$class_new = rtrim($class_new) . " " . $c;
2092
-				}
2093
-				elseif (in_array($operation, ['supprimer', 'commuter'])
2094
-					and $is_class_presente) {
2095
-					$class_new = trim(preg_replace("/(^|\s)".preg_quote($c)."($|\s)/", "\\1", $class_new));
2096
-				}
2097
-			}
2098
-		}
2099
-
2100
-		if ($class_new !== $class_courante) {
2101
-			if (strlen($class_new)) {
2102
-				$balise = inserer_attribut($balise, 'class', $class_new);
2103
-			}
2104
-			elseif ($class_courante) {
2105
-				$balise = vider_attribut($balise, 'class');
2106
-			}
2107
-		}
2108
-	}
2109
-
2110
-	return $balise;
2067
+    if (is_string($class)) {
2068
+        $class = explode(' ', trim($class));
2069
+    }
2070
+    $class = array_filter($class);
2071
+
2072
+    // si la ou les classes ont des caracteres invalides on ne fait rien
2073
+    if (preg_match(",[^\w-],", implode('', $class))) {
2074
+        return $balise;
2075
+    }
2076
+
2077
+    if ($class) {
2078
+        $class = array_unique($class);
2079
+        $class_courante = extraire_attribut($balise, 'class');
2080
+
2081
+        $class_new = $class_courante;
2082
+        foreach ($class as $c) {
2083
+            if ($c) {
2084
+                $is_class_presente = false;
2085
+                if (strpos($class_courante, $c) !== false
2086
+                    and preg_match("/(^|\s)".preg_quote($c)."($|\s)/", $class_courante)) {
2087
+                    $is_class_presente = true;
2088
+                }
2089
+                if (in_array($operation, ['ajouter', 'commuter'])
2090
+                    and !$is_class_presente) {
2091
+                    $class_new = rtrim($class_new) . " " . $c;
2092
+                }
2093
+                elseif (in_array($operation, ['supprimer', 'commuter'])
2094
+                    and $is_class_presente) {
2095
+                    $class_new = trim(preg_replace("/(^|\s)".preg_quote($c)."($|\s)/", "\\1", $class_new));
2096
+                }
2097
+            }
2098
+        }
2099
+
2100
+        if ($class_new !== $class_courante) {
2101
+            if (strlen($class_new)) {
2102
+                $balise = inserer_attribut($balise, 'class', $class_new);
2103
+            }
2104
+            elseif ($class_courante) {
2105
+                $balise = vider_attribut($balise, 'class');
2106
+            }
2107
+        }
2108
+    }
2109
+
2110
+    return $balise;
2111 2111
 }
2112 2112
 
2113 2113
 /**
@@ -2117,7 +2117,7 @@  discard block
 block discarded – undo
2117 2117
  * @return string
2118 2118
  */
2119 2119
 function ajouter_class($balise, $class){
2120
-	return modifier_class($balise, $class, 'ajouter');
2120
+    return modifier_class($balise, $class, 'ajouter');
2121 2121
 }
2122 2122
 
2123 2123
 /**
@@ -2127,7 +2127,7 @@  discard block
 block discarded – undo
2127 2127
  * @return string
2128 2128
  */
2129 2129
 function supprimer_class($balise, $class){
2130
-	return modifier_class($balise, $class, 'supprimer');
2130
+    return modifier_class($balise, $class, 'supprimer');
2131 2131
 }
2132 2132
 
2133 2133
 /**
@@ -2138,7 +2138,7 @@  discard block
 block discarded – undo
2138 2138
  * @return string
2139 2139
  */
2140 2140
 function commuter_class($balise, $class){
2141
-	return modifier_class($balise, $class, 'commuter');
2141
+    return modifier_class($balise, $class, 'commuter');
2142 2142
 }
2143 2143
 
2144 2144
 /**
@@ -2149,9 +2149,9 @@  discard block
 block discarded – undo
2149 2149
  * @return string
2150 2150
  */
2151 2151
 function tester_config($id, $mode = '') {
2152
-	include_spip('action/inscrire_auteur');
2152
+    include_spip('action/inscrire_auteur');
2153 2153
 
2154
-	return tester_statut_inscription($mode, $id);
2154
+    return tester_statut_inscription($mode, $id);
2155 2155
 }
2156 2156
 
2157 2157
 //
@@ -2176,7 +2176,7 @@  discard block
 block discarded – undo
2176 2176
  * @return int $a+$b
2177 2177
  **/
2178 2178
 function plus($a, $b) {
2179
-	return $a + $b;
2179
+    return $a + $b;
2180 2180
 }
2181 2181
 function strplus($a, $b) {return strize('plus', $a, $b);}
2182 2182
 /**
@@ -2195,7 +2195,7 @@  discard block
 block discarded – undo
2195 2195
  * @return int $a-$b
2196 2196
  **/
2197 2197
 function moins($a, $b) {
2198
-	return $a - $b;
2198
+    return $a - $b;
2199 2199
 }
2200 2200
 function strmoins($a, $b) {return strize('moins', $a, $b);}
2201 2201
 
@@ -2216,7 +2216,7 @@  discard block
 block discarded – undo
2216 2216
  * @return int $a*$b
2217 2217
  **/
2218 2218
 function mult($a, $b) {
2219
-	return $a * $b;
2219
+    return $a * $b;
2220 2220
 }
2221 2221
 function strmult($a, $b) {return strize('mult', $a, $b);}
2222 2222
 
@@ -2237,7 +2237,7 @@  discard block
 block discarded – undo
2237 2237
  * @return int $a/$b (ou 0 si $b est nul)
2238 2238
  **/
2239 2239
 function div($a, $b) {
2240
-	return $b ? $a / $b : 0;
2240
+    return $b ? $a / $b : 0;
2241 2241
 }
2242 2242
 function strdiv($a, $b) {return strize('div', $a, $b);}
2243 2243
 
@@ -2259,7 +2259,7 @@  discard block
 block discarded – undo
2259 2259
  * @return int ($nb % $mod) + $add
2260 2260
  **/
2261 2261
 function modulo($nb, $mod, $add = 0) {
2262
-	return ($mod ? $nb % $mod : 0) + $add;
2262
+    return ($mod ? $nb % $mod : 0) + $add;
2263 2263
 }
2264 2264
 
2265 2265
 
@@ -2274,24 +2274,24 @@  discard block
 block discarded – undo
2274 2274
  *      - true sinon
2275 2275
  **/
2276 2276
 function nom_acceptable($nom) {
2277
-	if (!is_string($nom)) {
2278
-		return false;
2279
-	}
2280
-	if (!defined('_TAGS_NOM_AUTEUR')) {
2281
-		define('_TAGS_NOM_AUTEUR', '');
2282
-	}
2283
-	$tags_acceptes = array_unique(explode(',', 'multi,' . _TAGS_NOM_AUTEUR));
2284
-	foreach ($tags_acceptes as $tag) {
2285
-		if (strlen($tag)) {
2286
-			$remp1[] = '<' . trim($tag) . '>';
2287
-			$remp1[] = '</' . trim($tag) . '>';
2288
-			$remp2[] = '\x60' . trim($tag) . '\x61';
2289
-			$remp2[] = '\x60/' . trim($tag) . '\x61';
2290
-		}
2291
-	}
2292
-	$v_nom = str_replace($remp2, $remp1, supprimer_tags(str_replace($remp1, $remp2, $nom)));
2277
+    if (!is_string($nom)) {
2278
+        return false;
2279
+    }
2280
+    if (!defined('_TAGS_NOM_AUTEUR')) {
2281
+        define('_TAGS_NOM_AUTEUR', '');
2282
+    }
2283
+    $tags_acceptes = array_unique(explode(',', 'multi,' . _TAGS_NOM_AUTEUR));
2284
+    foreach ($tags_acceptes as $tag) {
2285
+        if (strlen($tag)) {
2286
+            $remp1[] = '<' . trim($tag) . '>';
2287
+            $remp1[] = '</' . trim($tag) . '>';
2288
+            $remp2[] = '\x60' . trim($tag) . '\x61';
2289
+            $remp2[] = '\x60/' . trim($tag) . '\x61';
2290
+        }
2291
+    }
2292
+    $v_nom = str_replace($remp2, $remp1, supprimer_tags(str_replace($remp1, $remp2, $nom)));
2293 2293
 
2294
-	return str_replace('&lt;', '<', $v_nom) == $nom;
2294
+    return str_replace('&lt;', '<', $v_nom) == $nom;
2295 2295
 }
2296 2296
 
2297 2297
 
@@ -2307,14 +2307,14 @@  discard block
 block discarded – undo
2307 2307
  *      - renvoie un tableau si l'entree est un tableau
2308 2308
  **/
2309 2309
 function email_valide($adresses) {
2310
-	if (is_array($adresses)) {
2311
-		$adresses = array_map('email_valide', $adresses);
2312
-		$adresses = array_filter($adresses);
2313
-		return $adresses;
2314
-	}
2310
+    if (is_array($adresses)) {
2311
+        $adresses = array_map('email_valide', $adresses);
2312
+        $adresses = array_filter($adresses);
2313
+        return $adresses;
2314
+    }
2315 2315
 
2316
-	$email_valide = charger_fonction('email_valide', 'inc');
2317
-	return $email_valide($adresses);
2316
+    $email_valide = charger_fonction('email_valide', 'inc');
2317
+    return $email_valide($adresses);
2318 2318
 }
2319 2319
 
2320 2320
 /**
@@ -2328,20 +2328,20 @@  discard block
 block discarded – undo
2328 2328
  * @return string Texte
2329 2329
  **/
2330 2330
 function afficher_enclosures($tags) {
2331
-	$s = array();
2332
-	foreach (extraire_balises($tags, 'a') as $tag) {
2333
-		if (extraire_attribut($tag, 'rel') == 'enclosure'
2334
-			and $t = extraire_attribut($tag, 'href')
2335
-		) {
2336
-			$s[] = preg_replace(',>[^<]+</a>,S',
2337
-				'>'
2338
-				. http_img_pack('attachment-16.png', $t,
2339
-					'title="' . attribut_html($t) . '"')
2340
-				. '</a>', $tag);
2341
-		}
2342
-	}
2331
+    $s = array();
2332
+    foreach (extraire_balises($tags, 'a') as $tag) {
2333
+        if (extraire_attribut($tag, 'rel') == 'enclosure'
2334
+            and $t = extraire_attribut($tag, 'href')
2335
+        ) {
2336
+            $s[] = preg_replace(',>[^<]+</a>,S',
2337
+                '>'
2338
+                . http_img_pack('attachment-16.png', $t,
2339
+                    'title="' . attribut_html($t) . '"')
2340
+                . '</a>', $tag);
2341
+        }
2342
+    }
2343 2343
 
2344
-	return join('&nbsp;', $s);
2344
+    return join('&nbsp;', $s);
2345 2345
 }
2346 2346
 
2347 2347
 /**
@@ -2356,15 +2356,15 @@  discard block
 block discarded – undo
2356 2356
  * @return string Liens trouvés
2357 2357
  **/
2358 2358
 function afficher_tags($tags, $rels = 'tag,directory') {
2359
-	$s = array();
2360
-	foreach (extraire_balises($tags, 'a') as $tag) {
2361
-		$rel = extraire_attribut($tag, 'rel');
2362
-		if (strstr(",$rels,", ",$rel,")) {
2363
-			$s[] = $tag;
2364
-		}
2365
-	}
2359
+    $s = array();
2360
+    foreach (extraire_balises($tags, 'a') as $tag) {
2361
+        $rel = extraire_attribut($tag, 'rel');
2362
+        if (strstr(",$rels,", ",$rel,")) {
2363
+            $s[] = $tag;
2364
+        }
2365
+    }
2366 2366
 
2367
-	return join(', ', $s);
2367
+    return join(', ', $s);
2368 2368
 }
2369 2369
 
2370 2370
 
@@ -2386,21 +2386,21 @@  discard block
 block discarded – undo
2386 2386
  * @return string Tag HTML `<a>` avec microformat.
2387 2387
  **/
2388 2388
 function enclosure2microformat($e) {
2389
-	if (!$url = filtrer_entites(extraire_attribut($e, 'url'))) {
2390
-		$url = filtrer_entites(extraire_attribut($e, 'href'));
2391
-	}
2392
-	$type = extraire_attribut($e, 'type');
2393
-	if (!$length = extraire_attribut($e, 'length')) {
2394
-		# <media:content : longeur dans fileSize. On tente.
2395
-		$length = extraire_attribut($e, 'fileSize');
2396
-	}
2397
-	$fichier = basename($url);
2389
+    if (!$url = filtrer_entites(extraire_attribut($e, 'url'))) {
2390
+        $url = filtrer_entites(extraire_attribut($e, 'href'));
2391
+    }
2392
+    $type = extraire_attribut($e, 'type');
2393
+    if (!$length = extraire_attribut($e, 'length')) {
2394
+        # <media:content : longeur dans fileSize. On tente.
2395
+        $length = extraire_attribut($e, 'fileSize');
2396
+    }
2397
+    $fichier = basename($url);
2398 2398
 
2399
-	return '<a rel="enclosure"'
2400
-	. ($url ? ' href="' . spip_htmlspecialchars($url) . '"' : '')
2401
-	. ($type ? ' type="' . spip_htmlspecialchars($type) . '"' : '')
2402
-	. ($length ? ' title="' . spip_htmlspecialchars($length) . '"' : '')
2403
-	. '>' . $fichier . '</a>';
2399
+    return '<a rel="enclosure"'
2400
+    . ($url ? ' href="' . spip_htmlspecialchars($url) . '"' : '')
2401
+    . ($type ? ' type="' . spip_htmlspecialchars($type) . '"' : '')
2402
+    . ($length ? ' title="' . spip_htmlspecialchars($length) . '"' : '')
2403
+    . '>' . $fichier . '</a>';
2404 2404
 }
2405 2405
 
2406 2406
 /**
@@ -2418,24 +2418,24 @@  discard block
 block discarded – undo
2418 2418
  * @return string Tags RSS `<enclosure>`.
2419 2419
  **/
2420 2420
 function microformat2enclosure($tags) {
2421
-	$enclosures = array();
2422
-	foreach (extraire_balises($tags, 'a') as $e) {
2423
-		if (extraire_attribut($e, 'rel') == 'enclosure') {
2424
-			$url = filtrer_entites(extraire_attribut($e, 'href'));
2425
-			$type = extraire_attribut($e, 'type');
2426
-			if (!$length = intval(extraire_attribut($e, 'title'))) {
2427
-				$length = intval(extraire_attribut($e, 'length'));
2428
-			} # vieux data
2429
-			$fichier = basename($url);
2430
-			$enclosures[] = '<enclosure'
2431
-				. ($url ? ' url="' . spip_htmlspecialchars($url) . '"' : '')
2432
-				. ($type ? ' type="' . spip_htmlspecialchars($type) . '"' : '')
2433
-				. ($length ? ' length="' . $length . '"' : '')
2434
-				. ' />';
2435
-		}
2436
-	}
2421
+    $enclosures = array();
2422
+    foreach (extraire_balises($tags, 'a') as $e) {
2423
+        if (extraire_attribut($e, 'rel') == 'enclosure') {
2424
+            $url = filtrer_entites(extraire_attribut($e, 'href'));
2425
+            $type = extraire_attribut($e, 'type');
2426
+            if (!$length = intval(extraire_attribut($e, 'title'))) {
2427
+                $length = intval(extraire_attribut($e, 'length'));
2428
+            } # vieux data
2429
+            $fichier = basename($url);
2430
+            $enclosures[] = '<enclosure'
2431
+                . ($url ? ' url="' . spip_htmlspecialchars($url) . '"' : '')
2432
+                . ($type ? ' type="' . spip_htmlspecialchars($type) . '"' : '')
2433
+                . ($length ? ' length="' . $length . '"' : '')
2434
+                . ' />';
2435
+        }
2436
+    }
2437 2437
 
2438
-	return join("\n", $enclosures);
2438
+    return join("\n", $enclosures);
2439 2439
 }
2440 2440
 
2441 2441
 
@@ -2451,16 +2451,16 @@  discard block
 block discarded – undo
2451 2451
  * @return string Tags RSS Atom `<dc:subject>`.
2452 2452
  **/
2453 2453
 function tags2dcsubject($tags) {
2454
-	$subjects = '';
2455
-	foreach (extraire_balises($tags, 'a') as $e) {
2456
-		if (extraire_attribut($e, 'rel') == 'tag') {
2457
-			$subjects .= '<dc:subject>'
2458
-				. texte_backend(textebrut($e))
2459
-				. '</dc:subject>' . "\n";
2460
-		}
2461
-	}
2454
+    $subjects = '';
2455
+    foreach (extraire_balises($tags, 'a') as $e) {
2456
+        if (extraire_attribut($e, 'rel') == 'tag') {
2457
+            $subjects .= '<dc:subject>'
2458
+                . texte_backend(textebrut($e))
2459
+                . '</dc:subject>' . "\n";
2460
+        }
2461
+    }
2462 2462
 
2463
-	return $subjects;
2463
+    return $subjects;
2464 2464
 }
2465 2465
 
2466 2466
 /**
@@ -2489,23 +2489,23 @@  discard block
 block discarded – undo
2489 2489
  *     - Tableau de résultats, si tableau en entrée.
2490 2490
  **/
2491 2491
 function extraire_balise($texte, $tag = 'a') {
2492
-	if (is_array($texte)) {
2493
-		array_walk(
2494
-			$texte,
2495
-			function(&$a, $key, $t){
2496
-				$a = extraire_balise($a, $t);
2497
-			},
2498
-			$tag
2499
-		);
2492
+    if (is_array($texte)) {
2493
+        array_walk(
2494
+            $texte,
2495
+            function(&$a, $key, $t){
2496
+                $a = extraire_balise($a, $t);
2497
+            },
2498
+            $tag
2499
+        );
2500 2500
 
2501
-		return $texte;
2502
-	}
2501
+        return $texte;
2502
+    }
2503 2503
 
2504
-	if (preg_match(
2505
-		",<$tag\b[^>]*(/>|>.*</$tag\b[^>]*>|>),UimsS",
2506
-		$texte, $regs)) {
2507
-		return $regs[0];
2508
-	}
2504
+    if (preg_match(
2505
+        ",<$tag\b[^>]*(/>|>.*</$tag\b[^>]*>|>),UimsS",
2506
+        $texte, $regs)) {
2507
+        return $regs[0];
2508
+    }
2509 2509
 }
2510 2510
 
2511 2511
 /**
@@ -2533,25 +2533,25 @@  discard block
 block discarded – undo
2533 2533
  *     - Tableau de résultats, si tableau en entrée.
2534 2534
  **/
2535 2535
 function extraire_balises($texte, $tag = 'a') {
2536
-	if (is_array($texte)) {
2537
-		array_walk(
2538
-			$texte,
2539
-			function(&$a, $key, $t){
2540
-				$a = extraire_balises($a, $t);
2541
-			},
2542
-			$tag
2543
-		);
2536
+    if (is_array($texte)) {
2537
+        array_walk(
2538
+            $texte,
2539
+            function(&$a, $key, $t){
2540
+                $a = extraire_balises($a, $t);
2541
+            },
2542
+            $tag
2543
+        );
2544 2544
 
2545
-		return $texte;
2546
-	}
2545
+        return $texte;
2546
+    }
2547 2547
 
2548
-	if (preg_match_all(
2549
-		",<${tag}\b[^>]*(/>|>.*</${tag}\b[^>]*>|>),UimsS",
2550
-		$texte, $regs, PREG_PATTERN_ORDER)) {
2551
-		return $regs[0];
2552
-	} else {
2553
-		return array();
2554
-	}
2548
+    if (preg_match_all(
2549
+        ",<${tag}\b[^>]*(/>|>.*</${tag}\b[^>]*>|>),UimsS",
2550
+        $texte, $regs, PREG_PATTERN_ORDER)) {
2551
+        return $regs[0];
2552
+    } else {
2553
+        return array();
2554
+    }
2555 2555
 }
2556 2556
 
2557 2557
 /**
@@ -2580,11 +2580,11 @@  discard block
 block discarded – undo
2580 2580
  *     - `$def` si on n'a pas transmis de tableau
2581 2581
  **/
2582 2582
 function in_any($val, $vals, $def = '') {
2583
-	if (!is_array($vals) and $v = unserialize($vals)) {
2584
-		$vals = $v;
2585
-	}
2583
+    if (!is_array($vals) and $v = unserialize($vals)) {
2584
+        $vals = $v;
2585
+    }
2586 2586
 
2587
-	return (!is_array($vals) ? $def : (in_array($val, $vals) ? ' ' : ''));
2587
+    return (!is_array($vals) ? $def : (in_array($val, $vals) ? ' ' : ''));
2588 2588
 }
2589 2589
 
2590 2590
 
@@ -2605,12 +2605,12 @@  discard block
 block discarded – undo
2605 2605
  *     Résultat du calcul
2606 2606
  **/
2607 2607
 function valeur_numerique($expr) {
2608
-	$a = 0;
2609
-	if (preg_match(',^[0-9]+(\s*[+*-]\s*[0-9]+)*$,S', trim($expr))) {
2610
-		eval("\$a = $expr;");
2611
-	}
2608
+    $a = 0;
2609
+    if (preg_match(',^[0-9]+(\s*[+*-]\s*[0-9]+)*$,S', trim($expr))) {
2610
+        eval("\$a = $expr;");
2611
+    }
2612 2612
 
2613
-	return intval($a);
2613
+    return intval($a);
2614 2614
 }
2615 2615
 
2616 2616
 /**
@@ -2629,7 +2629,7 @@  discard block
 block discarded – undo
2629 2629
  *      Retourne `$a*$b/$c`
2630 2630
  **/
2631 2631
 function regledetrois($a, $b, $c) {
2632
-	return round($a * $b / $c);
2632
+    return round($a * $b / $c);
2633 2633
 }
2634 2634
 
2635 2635
 
@@ -2653,76 +2653,76 @@  discard block
 block discarded – undo
2653 2653
  **/
2654 2654
 function form_hidden($action) {
2655 2655
 
2656
-	$contexte = array();
2657
-	include_spip('inc/urls');
2658
-	if ($p = urls_decoder_url($action, '')
2659
-		and reset($p)
2660
-	) {
2661
-		$fond = array_shift($p);
2662
-		if ($fond != '404') {
2663
-			$contexte = array_shift($p);
2664
-			$contexte['page'] = $fond;
2665
-			$action = preg_replace('/([?]' . preg_quote($fond) . '[^&=]*[0-9]+)(&|$)/', '?&', $action);
2666
-		}
2667
-	}
2668
-	// defaire ce qu'a injecte urls_decoder_url : a revoir en modifiant la signature de urls_decoder_url
2669
-	if (defined('_DEFINIR_CONTEXTE_TYPE') and _DEFINIR_CONTEXTE_TYPE) {
2670
-		unset($contexte['type']);
2671
-	}
2672
-	if (defined('_DEFINIR_CONTEXTE_TYPE_PAGE') and _DEFINIR_CONTEXTE_TYPE_PAGE) {
2673
-		unset($contexte['type-page']);
2674
-	}
2675
-
2676
-	// on va remplir un tableau de valeurs en prenant bien soin de ne pas
2677
-	// ecraser les elements de la forme mots[]=1&mots[]=2
2678
-	$values = array();
2679
-
2680
-	// d'abord avec celles de l'url
2681
-	if (false !== ($p = strpos($action, '?'))) {
2682
-		foreach (preg_split('/&(amp;)?/S', substr($action, $p + 1)) as $c) {
2683
-			$c = explode('=', $c, 2);
2684
-			$var = array_shift($c);
2685
-			$val = array_shift($c);
2686
-			if ($var) {
2687
-				$val = rawurldecode($val);
2688
-				$var = rawurldecode($var); // decoder les [] eventuels
2689
-				if (preg_match(',\[\]$,S', $var)) {
2690
-					$values[] = array($var, $val);
2691
-				} else {
2692
-					if (!isset($values[$var])) {
2693
-						$values[$var] = array($var, $val);
2694
-					}
2695
-				}
2696
-			}
2697
-		}
2698
-	}
2699
-
2700
-	// ensuite avec celles du contexte, sans doublonner !
2701
-	foreach ($contexte as $var => $val) {
2702
-		if (preg_match(',\[\]$,S', $var)) {
2703
-			$values[] = array($var, $val);
2704
-		} else {
2705
-			if (!isset($values[$var])) {
2706
-				$values[$var] = array($var, $val);
2707
-			}
2708
-		}
2709
-	}
2710
-
2711
-	// puis on rassemble le tout
2712
-	$hidden = array();
2713
-	foreach ($values as $value) {
2714
-		list($var, $val) = $value;
2715
-		$hidden[] = '<input name="'
2716
-			. entites_html($var)
2717
-			. '"'
2718
-			. (is_null($val)
2719
-				? ''
2720
-				: ' value="' . entites_html($val) . '"'
2721
-			)
2722
-			. ' type="hidden"' . "\n/>";
2723
-	}
2724
-
2725
-	return join("", $hidden);
2656
+    $contexte = array();
2657
+    include_spip('inc/urls');
2658
+    if ($p = urls_decoder_url($action, '')
2659
+        and reset($p)
2660
+    ) {
2661
+        $fond = array_shift($p);
2662
+        if ($fond != '404') {
2663
+            $contexte = array_shift($p);
2664
+            $contexte['page'] = $fond;
2665
+            $action = preg_replace('/([?]' . preg_quote($fond) . '[^&=]*[0-9]+)(&|$)/', '?&', $action);
2666
+        }
2667
+    }
2668
+    // defaire ce qu'a injecte urls_decoder_url : a revoir en modifiant la signature de urls_decoder_url
2669
+    if (defined('_DEFINIR_CONTEXTE_TYPE') and _DEFINIR_CONTEXTE_TYPE) {
2670
+        unset($contexte['type']);
2671
+    }
2672
+    if (defined('_DEFINIR_CONTEXTE_TYPE_PAGE') and _DEFINIR_CONTEXTE_TYPE_PAGE) {
2673
+        unset($contexte['type-page']);
2674
+    }
2675
+
2676
+    // on va remplir un tableau de valeurs en prenant bien soin de ne pas
2677
+    // ecraser les elements de la forme mots[]=1&mots[]=2
2678
+    $values = array();
2679
+
2680
+    // d'abord avec celles de l'url
2681
+    if (false !== ($p = strpos($action, '?'))) {
2682
+        foreach (preg_split('/&(amp;)?/S', substr($action, $p + 1)) as $c) {
2683
+            $c = explode('=', $c, 2);
2684
+            $var = array_shift($c);
2685
+            $val = array_shift($c);
2686
+            if ($var) {
2687
+                $val = rawurldecode($val);
2688
+                $var = rawurldecode($var); // decoder les [] eventuels
2689
+                if (preg_match(',\[\]$,S', $var)) {
2690
+                    $values[] = array($var, $val);
2691
+                } else {
2692
+                    if (!isset($values[$var])) {
2693
+                        $values[$var] = array($var, $val);
2694
+                    }
2695
+                }
2696
+            }
2697
+        }
2698
+    }
2699
+
2700
+    // ensuite avec celles du contexte, sans doublonner !
2701
+    foreach ($contexte as $var => $val) {
2702
+        if (preg_match(',\[\]$,S', $var)) {
2703
+            $values[] = array($var, $val);
2704
+        } else {
2705
+            if (!isset($values[$var])) {
2706
+                $values[$var] = array($var, $val);
2707
+            }
2708
+        }
2709
+    }
2710
+
2711
+    // puis on rassemble le tout
2712
+    $hidden = array();
2713
+    foreach ($values as $value) {
2714
+        list($var, $val) = $value;
2715
+        $hidden[] = '<input name="'
2716
+            . entites_html($var)
2717
+            . '"'
2718
+            . (is_null($val)
2719
+                ? ''
2720
+                : ' value="' . entites_html($val) . '"'
2721
+            )
2722
+            . ' type="hidden"' . "\n/>";
2723
+    }
2724
+
2725
+    return join("", $hidden);
2726 2726
 }
2727 2727
 
2728 2728
 
@@ -2744,7 +2744,7 @@  discard block
 block discarded – undo
2744 2744
  *    - la première valeur du tableau sinon.
2745 2745
  **/
2746 2746
 function filtre_reset($array) {
2747
-	return !is_array($array) ? null : reset($array);
2747
+    return !is_array($array) ? null : reset($array);
2748 2748
 }
2749 2749
 
2750 2750
 /**
@@ -2765,7 +2765,7 @@  discard block
 block discarded – undo
2765 2765
  *    - la dernière valeur du tableau sinon.
2766 2766
  **/
2767 2767
 function filtre_end($array) {
2768
-	return !is_array($array) ? null : end($array);
2768
+    return !is_array($array) ? null : end($array);
2769 2769
 }
2770 2770
 
2771 2771
 /**
@@ -2785,11 +2785,11 @@  discard block
 block discarded – undo
2785 2785
  *
2786 2786
  **/
2787 2787
 function filtre_push($array, $val) {
2788
-	if (!is_array($array) or !array_push($array, $val)) {
2789
-		return '';
2790
-	}
2788
+    if (!is_array($array) or !array_push($array, $val)) {
2789
+        return '';
2790
+    }
2791 2791
 
2792
-	return $array;
2792
+    return $array;
2793 2793
 }
2794 2794
 
2795 2795
 /**
@@ -2808,7 +2808,7 @@  discard block
 block discarded – undo
2808 2808
  *     - `true` si la valeur existe dans le tableau, `false` sinon.
2809 2809
  **/
2810 2810
 function filtre_find($array, $val) {
2811
-	return (is_array($array) and in_array($val, $array));
2811
+    return (is_array($array) and in_array($val, $array));
2812 2812
 }
2813 2813
 
2814 2814
 
@@ -2825,15 +2825,15 @@  discard block
 block discarded – undo
2825 2825
  *     Contenu avec urls en absolus
2826 2826
  **/
2827 2827
 function urls_absolues_css($contenu, $source) {
2828
-	$path = suivre_lien(url_absolue($source), './');
2828
+    $path = suivre_lien(url_absolue($source), './');
2829 2829
 
2830
-	return preg_replace_callback(
2831
-		",url\s*\(\s*['\"]?([^'\"/#\s][^:]*)['\"]?\s*\),Uims",
2832
-		function($x) use ($path) {
2833
-			return "url('" . suivre_lien($path, $x[1]) . "')";
2834
-		},
2835
-		$contenu
2836
-	);
2830
+    return preg_replace_callback(
2831
+        ",url\s*\(\s*['\"]?([^'\"/#\s][^:]*)['\"]?\s*\),Uims",
2832
+        function($x) use ($path) {
2833
+            return "url('" . suivre_lien($path, $x[1]) . "')";
2834
+        },
2835
+        $contenu
2836
+    );
2837 2837
 }
2838 2838
 
2839 2839
 
@@ -2862,118 +2862,118 @@  discard block
 block discarded – undo
2862 2862
  *     Chemin du fichier CSS inversé
2863 2863
  **/
2864 2864
 function direction_css($css, $voulue = '') {
2865
-	if (!preg_match(',(_rtl)?\.css$,i', $css, $r)) {
2866
-		return $css;
2867
-	}
2868
-	include_spip("inc/lang");
2869
-	// si on a precise le sens voulu en argument, le prendre en compte
2870
-	if ($voulue = strtolower($voulue)) {
2871
-		if ($voulue != 'rtl' and $voulue != 'ltr') {
2872
-			$voulue = lang_dir($voulue);
2873
-		}
2874
-	} else {
2875
-		$voulue = lang_dir();
2876
-	}
2877
-
2878
-	$r = count($r) > 1;
2879
-	$right = $r ? 'left' : 'right'; // 'right' de la css lue en entree
2880
-	$dir = $r ? 'rtl' : 'ltr';
2881
-	$ndir = $r ? 'ltr' : 'rtl';
2882
-
2883
-	if ($voulue == $dir) {
2884
-		return $css;
2885
-	}
2886
-
2887
-	if (
2888
-		// url absolue
2889
-		preg_match(",^https?:,i", $css)
2890
-		// ou qui contient un ?
2891
-		or (($p = strpos($css, '?')) !== false)
2892
-	) {
2893
-		$distant = true;
2894
-		$cssf = parse_url($css);
2895
-		$cssf = $cssf['path'] . ($cssf['query'] ? "?" . $cssf['query'] : "");
2896
-		$cssf = preg_replace(',[?:&=],', "_", $cssf);
2897
-	} else {
2898
-		$distant = false;
2899
-		$cssf = $css;
2900
-		// 1. regarder d'abord si un fichier avec la bonne direction n'est pas aussi
2901
-		//propose (rien a faire dans ce cas)
2902
-		$f = preg_replace(',(_rtl)?\.css$,i', '_' . $ndir . '.css', $css);
2903
-		if (@file_exists($f)) {
2904
-			return $f;
2905
-		}
2906
-	}
2907
-
2908
-	// 2.
2909
-	$dir_var = sous_repertoire(_DIR_VAR, 'cache-css');
2910
-	$f = $dir_var
2911
-		. preg_replace(',.*/(.*?)(_rtl)?\.css,', '\1', $cssf)
2912
-		. '.' . substr(md5($cssf), 0, 4) . '_' . $ndir . '.css';
2913
-
2914
-	// la css peut etre distante (url absolue !)
2915
-	if ($distant) {
2916
-		include_spip('inc/distant');
2917
-		$res = recuperer_url($css);
2918
-		if (!$res or !$contenu = $res['page']) {
2919
-			return $css;
2920
-		}
2921
-	} else {
2922
-		if ((@filemtime($f) > @filemtime($css))
2923
-			and (_VAR_MODE != 'recalcul')
2924
-		) {
2925
-			return $f;
2926
-		}
2927
-		if (!lire_fichier($css, $contenu)) {
2928
-			return $css;
2929
-		}
2930
-	}
2931
-
2932
-
2933
-	// Inverser la direction gauche-droite en utilisant CSSTidy qui gere aussi les shorthands
2934
-	include_spip("lib/csstidy/class.csstidy");
2935
-	$parser = new csstidy();
2936
-	$parser->set_cfg('optimise_shorthands', 0);
2937
-	$parser->set_cfg('reverse_left_and_right', true);
2938
-	$parser->parse($contenu);
2939
-
2940
-	$contenu = $parser->print->plain();
2941
-
2942
-
2943
-	// reperer les @import auxquels il faut propager le direction_css
2944
-	preg_match_all(",\@import\s*url\s*\(\s*['\"]?([^'\"/][^:]*)['\"]?\s*\),Uims", $contenu, $regs);
2945
-	$src = array();
2946
-	$src_direction_css = array();
2947
-	$src_faux_abs = array();
2948
-	$d = dirname($css);
2949
-	foreach ($regs[1] as $k => $import_css) {
2950
-		$css_direction = direction_css("$d/$import_css", $voulue);
2951
-		// si la css_direction est dans le meme path que la css d'origine, on tronque le path, elle sera passee en absolue
2952
-		if (substr($css_direction, 0, strlen($d) + 1) == "$d/") {
2953
-			$css_direction = substr($css_direction, strlen($d) + 1);
2954
-		} // si la css_direction commence par $dir_var on la fait passer pour une absolue
2955
-		elseif (substr($css_direction, 0, strlen($dir_var)) == $dir_var) {
2956
-			$css_direction = substr($css_direction, strlen($dir_var));
2957
-			$src_faux_abs["/@@@@@@/" . $css_direction] = $css_direction;
2958
-			$css_direction = "/@@@@@@/" . $css_direction;
2959
-		}
2960
-		$src[] = $regs[0][$k];
2961
-		$src_direction_css[] = str_replace($import_css, $css_direction, $regs[0][$k]);
2962
-	}
2963
-	$contenu = str_replace($src, $src_direction_css, $contenu);
2964
-
2965
-	$contenu = urls_absolues_css($contenu, $css);
2966
-
2967
-	// virer les fausses url absolues que l'on a mis dans les import
2968
-	if (count($src_faux_abs)) {
2969
-		$contenu = str_replace(array_keys($src_faux_abs), $src_faux_abs, $contenu);
2970
-	}
2971
-
2972
-	if (!ecrire_fichier($f, $contenu)) {
2973
-		return $css;
2974
-	}
2975
-
2976
-	return $f;
2865
+    if (!preg_match(',(_rtl)?\.css$,i', $css, $r)) {
2866
+        return $css;
2867
+    }
2868
+    include_spip("inc/lang");
2869
+    // si on a precise le sens voulu en argument, le prendre en compte
2870
+    if ($voulue = strtolower($voulue)) {
2871
+        if ($voulue != 'rtl' and $voulue != 'ltr') {
2872
+            $voulue = lang_dir($voulue);
2873
+        }
2874
+    } else {
2875
+        $voulue = lang_dir();
2876
+    }
2877
+
2878
+    $r = count($r) > 1;
2879
+    $right = $r ? 'left' : 'right'; // 'right' de la css lue en entree
2880
+    $dir = $r ? 'rtl' : 'ltr';
2881
+    $ndir = $r ? 'ltr' : 'rtl';
2882
+
2883
+    if ($voulue == $dir) {
2884
+        return $css;
2885
+    }
2886
+
2887
+    if (
2888
+        // url absolue
2889
+        preg_match(",^https?:,i", $css)
2890
+        // ou qui contient un ?
2891
+        or (($p = strpos($css, '?')) !== false)
2892
+    ) {
2893
+        $distant = true;
2894
+        $cssf = parse_url($css);
2895
+        $cssf = $cssf['path'] . ($cssf['query'] ? "?" . $cssf['query'] : "");
2896
+        $cssf = preg_replace(',[?:&=],', "_", $cssf);
2897
+    } else {
2898
+        $distant = false;
2899
+        $cssf = $css;
2900
+        // 1. regarder d'abord si un fichier avec la bonne direction n'est pas aussi
2901
+        //propose (rien a faire dans ce cas)
2902
+        $f = preg_replace(',(_rtl)?\.css$,i', '_' . $ndir . '.css', $css);
2903
+        if (@file_exists($f)) {
2904
+            return $f;
2905
+        }
2906
+    }
2907
+
2908
+    // 2.
2909
+    $dir_var = sous_repertoire(_DIR_VAR, 'cache-css');
2910
+    $f = $dir_var
2911
+        . preg_replace(',.*/(.*?)(_rtl)?\.css,', '\1', $cssf)
2912
+        . '.' . substr(md5($cssf), 0, 4) . '_' . $ndir . '.css';
2913
+
2914
+    // la css peut etre distante (url absolue !)
2915
+    if ($distant) {
2916
+        include_spip('inc/distant');
2917
+        $res = recuperer_url($css);
2918
+        if (!$res or !$contenu = $res['page']) {
2919
+            return $css;
2920
+        }
2921
+    } else {
2922
+        if ((@filemtime($f) > @filemtime($css))
2923
+            and (_VAR_MODE != 'recalcul')
2924
+        ) {
2925
+            return $f;
2926
+        }
2927
+        if (!lire_fichier($css, $contenu)) {
2928
+            return $css;
2929
+        }
2930
+    }
2931
+
2932
+
2933
+    // Inverser la direction gauche-droite en utilisant CSSTidy qui gere aussi les shorthands
2934
+    include_spip("lib/csstidy/class.csstidy");
2935
+    $parser = new csstidy();
2936
+    $parser->set_cfg('optimise_shorthands', 0);
2937
+    $parser->set_cfg('reverse_left_and_right', true);
2938
+    $parser->parse($contenu);
2939
+
2940
+    $contenu = $parser->print->plain();
2941
+
2942
+
2943
+    // reperer les @import auxquels il faut propager le direction_css
2944
+    preg_match_all(",\@import\s*url\s*\(\s*['\"]?([^'\"/][^:]*)['\"]?\s*\),Uims", $contenu, $regs);
2945
+    $src = array();
2946
+    $src_direction_css = array();
2947
+    $src_faux_abs = array();
2948
+    $d = dirname($css);
2949
+    foreach ($regs[1] as $k => $import_css) {
2950
+        $css_direction = direction_css("$d/$import_css", $voulue);
2951
+        // si la css_direction est dans le meme path que la css d'origine, on tronque le path, elle sera passee en absolue
2952
+        if (substr($css_direction, 0, strlen($d) + 1) == "$d/") {
2953
+            $css_direction = substr($css_direction, strlen($d) + 1);
2954
+        } // si la css_direction commence par $dir_var on la fait passer pour une absolue
2955
+        elseif (substr($css_direction, 0, strlen($dir_var)) == $dir_var) {
2956
+            $css_direction = substr($css_direction, strlen($dir_var));
2957
+            $src_faux_abs["/@@@@@@/" . $css_direction] = $css_direction;
2958
+            $css_direction = "/@@@@@@/" . $css_direction;
2959
+        }
2960
+        $src[] = $regs[0][$k];
2961
+        $src_direction_css[] = str_replace($import_css, $css_direction, $regs[0][$k]);
2962
+    }
2963
+    $contenu = str_replace($src, $src_direction_css, $contenu);
2964
+
2965
+    $contenu = urls_absolues_css($contenu, $css);
2966
+
2967
+    // virer les fausses url absolues que l'on a mis dans les import
2968
+    if (count($src_faux_abs)) {
2969
+        $contenu = str_replace(array_keys($src_faux_abs), $src_faux_abs, $contenu);
2970
+    }
2971
+
2972
+    if (!ecrire_fichier($f, $contenu)) {
2973
+        return $css;
2974
+    }
2975
+
2976
+    return $f;
2977 2977
 }
2978 2978
 
2979 2979
 
@@ -2996,45 +2996,45 @@  discard block
 block discarded – undo
2996 2996
  *     - Chemin ou URL du fichier CSS source sinon.
2997 2997
  **/
2998 2998
 function url_absolue_css($css) {
2999
-	if (!preg_match(',\.css$,i', $css, $r)) {
3000
-		return $css;
3001
-	}
2999
+    if (!preg_match(',\.css$,i', $css, $r)) {
3000
+        return $css;
3001
+    }
3002 3002
 
3003
-	$url_absolue_css = url_absolue($css);
3003
+    $url_absolue_css = url_absolue($css);
3004 3004
 
3005
-	$f = basename($css, '.css');
3006
-	$f = sous_repertoire(_DIR_VAR, 'cache-css')
3007
-		. preg_replace(",(.*?)(_rtl|_ltr)?$,", "\\1-urlabs-" . substr(md5("$css-urlabs"), 0, 4) . "\\2", $f)
3008
-		. '.css';
3005
+    $f = basename($css, '.css');
3006
+    $f = sous_repertoire(_DIR_VAR, 'cache-css')
3007
+        . preg_replace(",(.*?)(_rtl|_ltr)?$,", "\\1-urlabs-" . substr(md5("$css-urlabs"), 0, 4) . "\\2", $f)
3008
+        . '.css';
3009 3009
 
3010
-	if ((@filemtime($f) > @filemtime($css)) and (_VAR_MODE != 'recalcul')) {
3011
-		return $f;
3012
-	}
3010
+    if ((@filemtime($f) > @filemtime($css)) and (_VAR_MODE != 'recalcul')) {
3011
+        return $f;
3012
+    }
3013 3013
 
3014
-	if ($url_absolue_css == $css) {
3015
-		if (strncmp($GLOBALS['meta']['adresse_site'], $css, $l = strlen($GLOBALS['meta']['adresse_site'])) != 0
3016
-			or !lire_fichier(_DIR_RACINE . substr($css, $l), $contenu)
3017
-		) {
3018
-			include_spip('inc/distant');
3019
-			$contenu = recuperer_url($css);
3020
-			$contenu = $contenu['page'] ?? '';
3021
-			if (!$contenu) {
3022
-				return $css;
3023
-			}
3024
-		}
3025
-	} elseif (!lire_fichier($css, $contenu)) {
3026
-		return $css;
3027
-	}
3014
+    if ($url_absolue_css == $css) {
3015
+        if (strncmp($GLOBALS['meta']['adresse_site'], $css, $l = strlen($GLOBALS['meta']['adresse_site'])) != 0
3016
+            or !lire_fichier(_DIR_RACINE . substr($css, $l), $contenu)
3017
+        ) {
3018
+            include_spip('inc/distant');
3019
+            $contenu = recuperer_url($css);
3020
+            $contenu = $contenu['page'] ?? '';
3021
+            if (!$contenu) {
3022
+                return $css;
3023
+            }
3024
+        }
3025
+    } elseif (!lire_fichier($css, $contenu)) {
3026
+        return $css;
3027
+    }
3028 3028
 
3029
-	// passer les url relatives a la css d'origine en url absolues
3030
-	$contenu = urls_absolues_css($contenu, $css);
3029
+    // passer les url relatives a la css d'origine en url absolues
3030
+    $contenu = urls_absolues_css($contenu, $css);
3031 3031
 
3032
-	// ecrire la css
3033
-	if (!ecrire_fichier($f, $contenu)) {
3034
-		return $css;
3035
-	}
3032
+    // ecrire la css
3033
+    if (!ecrire_fichier($f, $contenu)) {
3034
+        return $css;
3035
+    }
3036 3036
 
3037
-	return $f;
3037
+    return $f;
3038 3038
 }
3039 3039
 
3040 3040
 
@@ -3068,24 +3068,24 @@  discard block
 block discarded – undo
3068 3068
  *     Valeur trouvée ou valeur par défaut.
3069 3069
  **/
3070 3070
 function table_valeur($table, $cle, $defaut = '', $conserver_null = false) {
3071
-	foreach (explode('/', $cle) as $k) {
3071
+    foreach (explode('/', $cle) as $k) {
3072 3072
 
3073
-		$table = is_string($table) ? @unserialize($table) : $table;
3073
+        $table = is_string($table) ? @unserialize($table) : $table;
3074 3074
 
3075
-		if (is_object($table)) {
3076
-			$table = (($k !== "") and isset($table->$k)) ? $table->$k : $defaut;
3077
-		} elseif (is_array($table)) {
3078
-			if ($conserver_null) {
3079
-				$table = array_key_exists($k, $table) ? $table[$k] : $defaut;
3080
-			} else {
3081
-				$table = isset($table[$k]) ? $table[$k] : $defaut;
3082
-			}
3083
-		} else {
3084
-			$table = $defaut;
3085
-		}
3086
-	}
3075
+        if (is_object($table)) {
3076
+            $table = (($k !== "") and isset($table->$k)) ? $table->$k : $defaut;
3077
+        } elseif (is_array($table)) {
3078
+            if ($conserver_null) {
3079
+                $table = array_key_exists($k, $table) ? $table[$k] : $defaut;
3080
+            } else {
3081
+                $table = isset($table[$k]) ? $table[$k] : $defaut;
3082
+            }
3083
+        } else {
3084
+            $table = $defaut;
3085
+        }
3086
+    }
3087 3087
 
3088
-	return $table;
3088
+    return $table;
3089 3089
 }
3090 3090
 
3091 3091
 /**
@@ -3118,22 +3118,22 @@  discard block
 block discarded – undo
3118 3118
  *     - string : expression trouvée.
3119 3119
  **/
3120 3120
 function filtre_match_dist($texte, $expression, $modif = "UimsS", $capte = 0) {
3121
-	if (intval($modif) and $capte == 0) {
3122
-		$capte = $modif;
3123
-		$modif = "UimsS";
3124
-	}
3125
-	$expression = str_replace("\/", "/", $expression);
3126
-	$expression = str_replace("/", "\/", $expression);
3121
+    if (intval($modif) and $capte == 0) {
3122
+        $capte = $modif;
3123
+        $modif = "UimsS";
3124
+    }
3125
+    $expression = str_replace("\/", "/", $expression);
3126
+    $expression = str_replace("/", "\/", $expression);
3127 3127
 
3128
-	if (preg_match('/' . $expression . '/' . $modif, $texte, $r)) {
3129
-		if (isset($r[$capte])) {
3130
-			return $r[$capte];
3131
-		} else {
3132
-			return true;
3133
-		}
3134
-	}
3128
+    if (preg_match('/' . $expression . '/' . $modif, $texte, $r)) {
3129
+        if (isset($r[$capte])) {
3130
+            return $r[$capte];
3131
+        } else {
3132
+            return true;
3133
+        }
3134
+    }
3135 3135
 
3136
-	return false;
3136
+    return false;
3137 3137
 }
3138 3138
 
3139 3139
 
@@ -3160,10 +3160,10 @@  discard block
 block discarded – undo
3160 3160
  *     Texte
3161 3161
  **/
3162 3162
 function replace($texte, $expression, $replace = '', $modif = "UimsS") {
3163
-	$expression = str_replace("\/", "/", $expression);
3164
-	$expression = str_replace("/", "\/", $expression);
3163
+    $expression = str_replace("\/", "/", $expression);
3164
+    $expression = str_replace("/", "\/", $expression);
3165 3165
 
3166
-	return preg_replace('/' . $expression . '/' . $modif, $replace, $texte);
3166
+    return preg_replace('/' . $expression . '/' . $modif, $replace, $texte);
3167 3167
 }
3168 3168
 
3169 3169
 
@@ -3181,21 +3181,21 @@  discard block
 block discarded – undo
3181 3181
  **/
3182 3182
 function traiter_doublons_documents(&$doublons, $letexte) {
3183 3183
 
3184
-	// Verifier dans le texte & les notes (pas beau, helas)
3185
-	$t = $letexte . $GLOBALS['les_notes'];
3184
+    // Verifier dans le texte & les notes (pas beau, helas)
3185
+    $t = $letexte . $GLOBALS['les_notes'];
3186 3186
 
3187
-	if (strstr($t, 'spip_document_') // evite le preg_match_all si inutile
3188
-		and preg_match_all(
3189
-			',<[^>]+\sclass=["\']spip_document_([0-9]+)[\s"\'],imsS',
3190
-			$t, $matches, PREG_PATTERN_ORDER)
3191
-	) {
3192
-		if (!isset($doublons['documents'])) {
3193
-			$doublons['documents'] = "";
3194
-		}
3195
-		$doublons['documents'] .= "," . join(',', $matches[1]);
3196
-	}
3187
+    if (strstr($t, 'spip_document_') // evite le preg_match_all si inutile
3188
+        and preg_match_all(
3189
+            ',<[^>]+\sclass=["\']spip_document_([0-9]+)[\s"\'],imsS',
3190
+            $t, $matches, PREG_PATTERN_ORDER)
3191
+    ) {
3192
+        if (!isset($doublons['documents'])) {
3193
+            $doublons['documents'] = "";
3194
+        }
3195
+        $doublons['documents'] .= "," . join(',', $matches[1]);
3196
+    }
3197 3197
 
3198
-	return $letexte;
3198
+    return $letexte;
3199 3199
 }
3200 3200
 
3201 3201
 /**
@@ -3209,7 +3209,7 @@  discard block
 block discarded – undo
3209 3209
  * @return string Chaîne vide
3210 3210
  **/
3211 3211
 function vide($texte) {
3212
-	return "";
3212
+    return "";
3213 3213
 }
3214 3214
 
3215 3215
 //
@@ -3238,23 +3238,23 @@  discard block
 block discarded – undo
3238 3238
  *      Code HTML résultant
3239 3239
  **/
3240 3240
 function env_to_params($env, $ignore_params = array()) {
3241
-	$ignore_params = array_merge(
3242
-		array('id', 'lang', 'id_document', 'date', 'date_redac', 'align', 'fond', '', 'recurs', 'emb', 'dir_racine'),
3243
-		$ignore_params
3244
-	);
3245
-	if (!is_array($env)) {
3246
-		$env = unserialize($env);
3247
-	}
3248
-	$texte = "";
3249
-	if ($env) {
3250
-		foreach ($env as $i => $j) {
3251
-			if (is_string($j) and !in_array($i, $ignore_params)) {
3252
-				$texte .= "<param name='" . attribut_html($i) . "'\n\tvalue='" . attribut_html($j) . "' />";
3253
-			}
3254
-		}
3255
-	}
3256
-
3257
-	return $texte;
3241
+    $ignore_params = array_merge(
3242
+        array('id', 'lang', 'id_document', 'date', 'date_redac', 'align', 'fond', '', 'recurs', 'emb', 'dir_racine'),
3243
+        $ignore_params
3244
+    );
3245
+    if (!is_array($env)) {
3246
+        $env = unserialize($env);
3247
+    }
3248
+    $texte = "";
3249
+    if ($env) {
3250
+        foreach ($env as $i => $j) {
3251
+            if (is_string($j) and !in_array($i, $ignore_params)) {
3252
+                $texte .= "<param name='" . attribut_html($i) . "'\n\tvalue='" . attribut_html($j) . "' />";
3253
+            }
3254
+        }
3255
+    }
3256
+
3257
+    return $texte;
3258 3258
 }
3259 3259
 
3260 3260
 /**
@@ -3277,23 +3277,23 @@  discard block
 block discarded – undo
3277 3277
  *      Code HTML résultant
3278 3278
  **/
3279 3279
 function env_to_attributs($env, $ignore_params = array()) {
3280
-	$ignore_params = array_merge(
3281
-		array('id', 'lang', 'id_document', 'date', 'date_redac', 'align', 'fond', '', 'recurs', 'emb', 'dir_racine'),
3282
-		$ignore_params
3283
-	);
3284
-	if (!is_array($env)) {
3285
-		$env = unserialize($env);
3286
-	}
3287
-	$texte = "";
3288
-	if ($env) {
3289
-		foreach ($env as $i => $j) {
3290
-			if (is_string($j) and !in_array($i, $ignore_params)) {
3291
-				$texte .= attribut_html($i) . "='" . attribut_html($j) . "' ";
3292
-			}
3293
-		}
3294
-	}
3280
+    $ignore_params = array_merge(
3281
+        array('id', 'lang', 'id_document', 'date', 'date_redac', 'align', 'fond', '', 'recurs', 'emb', 'dir_racine'),
3282
+        $ignore_params
3283
+    );
3284
+    if (!is_array($env)) {
3285
+        $env = unserialize($env);
3286
+    }
3287
+    $texte = "";
3288
+    if ($env) {
3289
+        foreach ($env as $i => $j) {
3290
+            if (is_string($j) and !in_array($i, $ignore_params)) {
3291
+                $texte .= attribut_html($i) . "='" . attribut_html($j) . "' ";
3292
+            }
3293
+        }
3294
+    }
3295 3295
 
3296
-	return $texte;
3296
+    return $texte;
3297 3297
 }
3298 3298
 
3299 3299
 
@@ -3311,7 +3311,7 @@  discard block
 block discarded – undo
3311 3311
  * @return string Chaînes concaténés
3312 3312
  **/
3313 3313
 function concat(...$args) : string {
3314
-	return join('', $args);
3314
+    return join('', $args);
3315 3315
 }
3316 3316
 
3317 3317
 
@@ -3331,23 +3331,23 @@  discard block
 block discarded – undo
3331 3331
  *     Contenu du ou des fichiers, concaténé
3332 3332
  **/
3333 3333
 function charge_scripts($files, $script = true) {
3334
-	$flux = "";
3335
-	foreach (is_array($files) ? $files : explode("|", $files) as $file) {
3336
-		if (!is_string($file)) {
3337
-			continue;
3338
-		}
3339
-		if ($script) {
3340
-			$file = preg_match(",^\w+$,", $file) ? "javascript/$file.js" : '';
3341
-		}
3342
-		if ($file) {
3343
-			$path = find_in_path($file);
3344
-			if ($path) {
3345
-				$flux .= spip_file_get_contents($path);
3346
-			}
3347
-		}
3348
-	}
3334
+    $flux = "";
3335
+    foreach (is_array($files) ? $files : explode("|", $files) as $file) {
3336
+        if (!is_string($file)) {
3337
+            continue;
3338
+        }
3339
+        if ($script) {
3340
+            $file = preg_match(",^\w+$,", $file) ? "javascript/$file.js" : '';
3341
+        }
3342
+        if ($file) {
3343
+            $path = find_in_path($file);
3344
+            if ($path) {
3345
+                $flux .= spip_file_get_contents($path);
3346
+            }
3347
+        }
3348
+    }
3349 3349
 
3350
-	return $flux;
3350
+    return $flux;
3351 3351
 }
3352 3352
 
3353 3353
 
@@ -3369,64 +3369,64 @@  discard block
 block discarded – undo
3369 3369
  */
3370 3370
 function http_img_pack($img, $alt, $atts = '', $title = '', $options = array()) {
3371 3371
 
3372
-	$img_file = $img;
3373
-	if ($p = strpos($img_file, '?')) {
3374
-		$img_file = substr($img_file,0, $p);
3375
-	}
3376
-	if (!isset($options['chemin_image']) or $options['chemin_image'] == true) {
3377
-		$img_file = chemin_image($img);
3378
-	}
3379
-	else {
3380
-		if (!isset($options['variante_svg_si_possible']) or $options['variante_svg_si_possible'] == true){
3381
-			// on peut fournir une icone generique -xx.svg qui fera le job dans toutes les tailles, et qui est prioritaire sur le png
3382
-			// si il y a un .svg a la bonne taille (-16.svg) a cote, on l'utilise en remplacement du -16.png
3383
-			if (preg_match(',-(\d+)[.](png|gif|svg)$,', $img_file, $m)
3384
-			  and $variante_svg_generique = substr($img_file, 0, -strlen($m[0])) . "-xx.svg"
3385
-			  and file_exists($variante_svg_generique)) {
3386
-				if ($variante_svg_size = substr($variante_svg_generique,0,-6) . $m[1] . ".svg" and file_exists($variante_svg_size)) {
3387
-					$img_file = $variante_svg_size;
3388
-				}
3389
-				else {
3390
-					$img_file = $variante_svg_generique;
3391
-				}
3392
-			}
3393
-		}
3394
-	}
3395
-	if (stripos($atts, 'width') === false) {
3396
-		// utiliser directement l'info de taille presente dans le nom
3397
-		if ((!isset($options['utiliser_suffixe_size'])
3398
-				or $options['utiliser_suffixe_size'] == true
3399
-			  or strpos($img_file, '-xx.svg') !== false)
3400
-			and (preg_match(',-([0-9]+)[.](png|gif|svg)$,', $img, $regs)
3401
-					 or preg_match(',\?([0-9]+)px$,', $img, $regs))
3402
-		) {
3403
-			$largeur = $hauteur = intval($regs[1]);
3404
-		} else {
3405
-			$taille = taille_image($img_file);
3406
-			list($hauteur, $largeur) = $taille;
3407
-			if (!$hauteur or !$largeur) {
3408
-				return "";
3409
-			}
3410
-		}
3411
-		$atts .= " width='" . $largeur . "' height='" . $hauteur . "'";
3412
-	}
3413
-
3414
-	if (file_exists($img_file)) {
3415
-		$img_file = timestamp($img_file);
3416
-	}
3417
-	if ($alt === false) {
3418
-		$alt = '';
3419
-	}
3420
-	elseif($alt or $alt==='') {
3421
-		$alt = " alt='".attribut_html($alt)."'";
3422
-	}
3423
-	else {
3424
-		$alt = " alt='".attribut_html($title)."'";
3425
-	}
3426
-	return "<img src='$img_file'$alt"
3427
-	. ($title ? ' title="' . attribut_html($title) . '"' : '')
3428
-	. " " . ltrim($atts)
3429
-	. " />";
3372
+    $img_file = $img;
3373
+    if ($p = strpos($img_file, '?')) {
3374
+        $img_file = substr($img_file,0, $p);
3375
+    }
3376
+    if (!isset($options['chemin_image']) or $options['chemin_image'] == true) {
3377
+        $img_file = chemin_image($img);
3378
+    }
3379
+    else {
3380
+        if (!isset($options['variante_svg_si_possible']) or $options['variante_svg_si_possible'] == true){
3381
+            // on peut fournir une icone generique -xx.svg qui fera le job dans toutes les tailles, et qui est prioritaire sur le png
3382
+            // si il y a un .svg a la bonne taille (-16.svg) a cote, on l'utilise en remplacement du -16.png
3383
+            if (preg_match(',-(\d+)[.](png|gif|svg)$,', $img_file, $m)
3384
+              and $variante_svg_generique = substr($img_file, 0, -strlen($m[0])) . "-xx.svg"
3385
+              and file_exists($variante_svg_generique)) {
3386
+                if ($variante_svg_size = substr($variante_svg_generique,0,-6) . $m[1] . ".svg" and file_exists($variante_svg_size)) {
3387
+                    $img_file = $variante_svg_size;
3388
+                }
3389
+                else {
3390
+                    $img_file = $variante_svg_generique;
3391
+                }
3392
+            }
3393
+        }
3394
+    }
3395
+    if (stripos($atts, 'width') === false) {
3396
+        // utiliser directement l'info de taille presente dans le nom
3397
+        if ((!isset($options['utiliser_suffixe_size'])
3398
+                or $options['utiliser_suffixe_size'] == true
3399
+              or strpos($img_file, '-xx.svg') !== false)
3400
+            and (preg_match(',-([0-9]+)[.](png|gif|svg)$,', $img, $regs)
3401
+                     or preg_match(',\?([0-9]+)px$,', $img, $regs))
3402
+        ) {
3403
+            $largeur = $hauteur = intval($regs[1]);
3404
+        } else {
3405
+            $taille = taille_image($img_file);
3406
+            list($hauteur, $largeur) = $taille;
3407
+            if (!$hauteur or !$largeur) {
3408
+                return "";
3409
+            }
3410
+        }
3411
+        $atts .= " width='" . $largeur . "' height='" . $hauteur . "'";
3412
+    }
3413
+
3414
+    if (file_exists($img_file)) {
3415
+        $img_file = timestamp($img_file);
3416
+    }
3417
+    if ($alt === false) {
3418
+        $alt = '';
3419
+    }
3420
+    elseif($alt or $alt==='') {
3421
+        $alt = " alt='".attribut_html($alt)."'";
3422
+    }
3423
+    else {
3424
+        $alt = " alt='".attribut_html($title)."'";
3425
+    }
3426
+    return "<img src='$img_file'$alt"
3427
+    . ($title ? ' title="' . attribut_html($title) . '"' : '')
3428
+    . " " . ltrim($atts)
3429
+    . " />";
3430 3430
 }
3431 3431
 
3432 3432
 /**
@@ -3438,68 +3438,68 @@  discard block
 block discarded – undo
3438 3438
  * @return string
3439 3439
  */
3440 3440
 function http_style_background($img, $att = '', $size=null) {
3441
-	if ($size and is_numeric($size)){
3442
-		$size = trim($size) . "px";
3443
-	}
3444
-	return " style='background" .
3445
-		($att ? "" : "-image") . ": url(\"" . chemin_image($img) . "\")" . ($att ? (' ' . $att) : '') . ";"
3446
-		. ($size ? "background-size:{$size};" : '')
3447
-		. "'";
3441
+    if ($size and is_numeric($size)){
3442
+        $size = trim($size) . "px";
3443
+    }
3444
+    return " style='background" .
3445
+        ($att ? "" : "-image") . ": url(\"" . chemin_image($img) . "\")" . ($att ? (' ' . $att) : '') . ";"
3446
+        . ($size ? "background-size:{$size};" : '')
3447
+        . "'";
3448 3448
 }
3449 3449
 
3450 3450
 
3451 3451
 function helper_filtre_balise_img_svg_arguments($alt_or_size, $class_or_size, $size) {
3452
-	$args = [$alt_or_size, $class_or_size, $size];
3453
-	while (is_null(end($args)) and count($args)) {
3454
-		array_pop($args);
3455
-	}
3456
-	if (!count($args)) {
3457
-		return [null, null, null];
3458
-	}
3459
-	if (count($args) < 3) {
3460
-		$maybe_size = array_pop($args);
3461
-		// @2x
3462
-		// @1.5x
3463
-		// 512
3464
-		// 512x*
3465
-		// 512x300
3466
-		if (!strlen($maybe_size)
3467
-			or !preg_match(',^(@\d+(\.\d+)?x|\d+(x\*)?|\d+x\d+)$,', trim($maybe_size))) {
3468
-			$args[] = $maybe_size;
3469
-			$maybe_size = null;
3470
-		}
3471
-		while (count($args)<2) {
3472
-			$args[] = null; // default alt or class
3473
-		}
3474
-		$args[] = $maybe_size;
3475
-	}
3476
-	return $args;
3452
+    $args = [$alt_or_size, $class_or_size, $size];
3453
+    while (is_null(end($args)) and count($args)) {
3454
+        array_pop($args);
3455
+    }
3456
+    if (!count($args)) {
3457
+        return [null, null, null];
3458
+    }
3459
+    if (count($args) < 3) {
3460
+        $maybe_size = array_pop($args);
3461
+        // @2x
3462
+        // @1.5x
3463
+        // 512
3464
+        // 512x*
3465
+        // 512x300
3466
+        if (!strlen($maybe_size)
3467
+            or !preg_match(',^(@\d+(\.\d+)?x|\d+(x\*)?|\d+x\d+)$,', trim($maybe_size))) {
3468
+            $args[] = $maybe_size;
3469
+            $maybe_size = null;
3470
+        }
3471
+        while (count($args)<2) {
3472
+            $args[] = null; // default alt or class
3473
+        }
3474
+        $args[] = $maybe_size;
3475
+    }
3476
+    return $args;
3477 3477
 }
3478 3478
 
3479 3479
 function helper_filtre_balise_img_svg_size($img, $size) {
3480
-	// si size est de la forme '@2x' c'est un coeff multiplicateur sur la densite
3481
-	if (strpos($size, '@') === 0 and substr($size,-1) === 'x') {
3482
-		$coef = floatval(substr($size, 1, -1));
3483
-		list($h, $w) = taille_image($img);
3484
-		$height = intval(round($h / $coef));
3485
-		$width = intval(round($w / $coef));
3486
-	}
3487
-	// sinon c'est une valeur seule si image caree ou largeurxhauteur
3488
-	else {
3489
-		$size = explode('x', $size, 2);
3490
-		$size = array_map('trim', $size);
3491
-		$height = $width = intval(array_shift($size));
3492
-
3493
-		if (count($size) and reset($size)) {
3494
-			$height = array_shift($size);
3495
-			if ($height === '*') {
3496
-				list($h, $w) = taille_image($img);
3497
-				$height = intval(round($h * $width / $w));
3498
-			}
3499
-		}
3500
-	}
3501
-
3502
-	return [$width, $height];
3480
+    // si size est de la forme '@2x' c'est un coeff multiplicateur sur la densite
3481
+    if (strpos($size, '@') === 0 and substr($size,-1) === 'x') {
3482
+        $coef = floatval(substr($size, 1, -1));
3483
+        list($h, $w) = taille_image($img);
3484
+        $height = intval(round($h / $coef));
3485
+        $width = intval(round($w / $coef));
3486
+    }
3487
+    // sinon c'est une valeur seule si image caree ou largeurxhauteur
3488
+    else {
3489
+        $size = explode('x', $size, 2);
3490
+        $size = array_map('trim', $size);
3491
+        $height = $width = intval(array_shift($size));
3492
+
3493
+        if (count($size) and reset($size)) {
3494
+            $height = array_shift($size);
3495
+            if ($height === '*') {
3496
+                list($h, $w) = taille_image($img);
3497
+                $height = intval(round($h * $width / $w));
3498
+            }
3499
+        }
3500
+    }
3501
+
3502
+    return [$width, $height];
3503 3503
 }
3504 3504
 
3505 3505
 /**
@@ -3535,38 +3535,38 @@  discard block
 block discarded – undo
3535 3535
  */
3536 3536
 function filtre_balise_img_dist($img, $alt = '', $class = null, $size=null) {
3537 3537
 
3538
-	list($alt, $class, $size) = helper_filtre_balise_img_svg_arguments($alt, $class, $size);
3538
+    list($alt, $class, $size) = helper_filtre_balise_img_svg_arguments($alt, $class, $size);
3539 3539
 
3540
-	$img = trim($img);
3541
-	if (strpos($img, '<img') === 0) {
3542
-		if (!is_null($alt)) {
3543
-			$img = inserer_attribut($img, 'alt', $alt);
3544
-		}
3545
-		if (!is_null($class)) {
3546
-			if (strlen($class)) {
3547
-				$img = inserer_attribut($img, 'class', $class);
3548
-			}
3549
-			else {
3550
-				$img = vider_attribut($img, 'class');
3551
-			}
3552
-		}
3553
-	}
3554
-	else {
3555
-		$img = http_img_pack($img, $alt, $class ? " class='" . attribut_html($class) . "'" : '', '',
3556
-				array('chemin_image' => false, 'utiliser_suffixe_size' => false));
3557
-		if (is_null($alt)) {
3558
-			$img = vider_attribut($img, 'alt');
3559
-		}
3560
-	}
3540
+    $img = trim($img);
3541
+    if (strpos($img, '<img') === 0) {
3542
+        if (!is_null($alt)) {
3543
+            $img = inserer_attribut($img, 'alt', $alt);
3544
+        }
3545
+        if (!is_null($class)) {
3546
+            if (strlen($class)) {
3547
+                $img = inserer_attribut($img, 'class', $class);
3548
+            }
3549
+            else {
3550
+                $img = vider_attribut($img, 'class');
3551
+            }
3552
+        }
3553
+    }
3554
+    else {
3555
+        $img = http_img_pack($img, $alt, $class ? " class='" . attribut_html($class) . "'" : '', '',
3556
+                array('chemin_image' => false, 'utiliser_suffixe_size' => false));
3557
+        if (is_null($alt)) {
3558
+            $img = vider_attribut($img, 'alt');
3559
+        }
3560
+    }
3561 3561
 
3562
-	if ($img and !is_null($size) and strlen($size = trim($size))) {
3563
-		list($width, $height) = helper_filtre_balise_img_svg_size($img, $size);
3562
+    if ($img and !is_null($size) and strlen($size = trim($size))) {
3563
+        list($width, $height) = helper_filtre_balise_img_svg_size($img, $size);
3564 3564
 
3565
-		$img = inserer_attribut($img, 'width', $width);
3566
-		$img = inserer_attribut($img, 'height', $height);
3567
-	}
3565
+        $img = inserer_attribut($img, 'width', $width);
3566
+        $img = inserer_attribut($img, 'height', $height);
3567
+    }
3568 3568
 
3569
-	return $img;
3569
+    return $img;
3570 3570
 }
3571 3571
 
3572 3572
 
@@ -3600,67 +3600,67 @@  discard block
 block discarded – undo
3600 3600
  */
3601 3601
 function filtre_balise_svg_dist($img, $alt = '', $class = null, $size=null) {
3602 3602
 
3603
-	$img = trim($img);
3604
-	$img_file = $img;
3605
-	if (strpos($img, '<svg') === false){
3606
-		if ($p = strpos($img_file, '?')){
3607
-			$img_file = substr($img_file, 0, $p);
3608
-		}
3603
+    $img = trim($img);
3604
+    $img_file = $img;
3605
+    if (strpos($img, '<svg') === false){
3606
+        if ($p = strpos($img_file, '?')){
3607
+            $img_file = substr($img_file, 0, $p);
3608
+        }
3609 3609
 
3610
-		if (!$img_file or !$svg = file_get_contents($img_file)){
3611
-			return '';
3612
-		}
3613
-	}
3610
+        if (!$img_file or !$svg = file_get_contents($img_file)){
3611
+            return '';
3612
+        }
3613
+    }
3614 3614
 
3615
-	if (!preg_match(",<svg\b[^>]*>,UimsS", $svg, $match)) {
3616
-		return '';
3617
-	}
3615
+    if (!preg_match(",<svg\b[^>]*>,UimsS", $svg, $match)) {
3616
+        return '';
3617
+    }
3618 3618
 
3619
-	list($alt, $class, $size) = helper_filtre_balise_img_svg_arguments($alt, $class, $size);
3619
+    list($alt, $class, $size) = helper_filtre_balise_img_svg_arguments($alt, $class, $size);
3620 3620
 
3621
-	$balise_svg = $match[0];
3622
-	$balise_svg_source = $balise_svg;
3621
+    $balise_svg = $match[0];
3622
+    $balise_svg_source = $balise_svg;
3623 3623
 
3624
-	// entete XML à supprimer
3625
-	$svg = preg_replace(',^\s*<\?xml[^>]*\?' . '>,', '', $svg);
3624
+    // entete XML à supprimer
3625
+    $svg = preg_replace(',^\s*<\?xml[^>]*\?' . '>,', '', $svg);
3626 3626
 
3627
-	// IE est toujours mon ami
3628
-	$balise_svg = inserer_attribut($balise_svg, 'focusable', 'false');
3627
+    // IE est toujours mon ami
3628
+    $balise_svg = inserer_attribut($balise_svg, 'focusable', 'false');
3629 3629
 
3630
-	// regler la classe
3631
-	if (!is_null($class)) {
3632
-		if (strlen($class)) {
3633
-			$balise_svg = inserer_attribut($balise_svg, 'class', $class);
3634
-		}
3635
-		else {
3636
-			$balise_svg = vider_attribut($balise_svg, 'class');
3637
-		}
3638
-	}
3630
+    // regler la classe
3631
+    if (!is_null($class)) {
3632
+        if (strlen($class)) {
3633
+            $balise_svg = inserer_attribut($balise_svg, 'class', $class);
3634
+        }
3635
+        else {
3636
+            $balise_svg = vider_attribut($balise_svg, 'class');
3637
+        }
3638
+    }
3639 3639
 
3640
-	// regler le alt
3641
-	if ($alt){
3642
-		$balise_svg = inserer_attribut($balise_svg, 'role', 'img');
3643
-		$id = "img-svg-title-" . substr(md5("$img_file:$svg:$alt"),0,4);
3644
-		$balise_svg = inserer_attribut($balise_svg, 'aria-labelledby', $id);
3645
-		$title = "<title id=\"$id\">" . entites_html($alt)."</title>\n";
3646
-		$balise_svg .= $title;
3647
-	}
3648
-	else {
3649
-		$balise_svg = inserer_attribut($balise_svg, 'aria-hidden', 'true');
3650
-	}
3640
+    // regler le alt
3641
+    if ($alt){
3642
+        $balise_svg = inserer_attribut($balise_svg, 'role', 'img');
3643
+        $id = "img-svg-title-" . substr(md5("$img_file:$svg:$alt"),0,4);
3644
+        $balise_svg = inserer_attribut($balise_svg, 'aria-labelledby', $id);
3645
+        $title = "<title id=\"$id\">" . entites_html($alt)."</title>\n";
3646
+        $balise_svg .= $title;
3647
+    }
3648
+    else {
3649
+        $balise_svg = inserer_attribut($balise_svg, 'aria-hidden', 'true');
3650
+    }
3651 3651
 
3652
-	$svg = str_replace($balise_svg_source, $balise_svg, $svg);
3652
+    $svg = str_replace($balise_svg_source, $balise_svg, $svg);
3653 3653
 
3654
-	if (!is_null($size) and strlen($size = trim($size))) {
3655
-		list($width, $height) = helper_filtre_balise_img_svg_size($svg, $size);
3654
+    if (!is_null($size) and strlen($size = trim($size))) {
3655
+        list($width, $height) = helper_filtre_balise_img_svg_size($svg, $size);
3656 3656
 
3657
-		if (!function_exists('svg_redimensionner')) {
3658
-			include_spip('inc/svg');
3659
-		}
3660
-		$svg = svg_redimensionner($svg, $width, $height);
3661
-	}
3657
+        if (!function_exists('svg_redimensionner')) {
3658
+            include_spip('inc/svg');
3659
+        }
3660
+        $svg = svg_redimensionner($svg, $width, $height);
3661
+    }
3662 3662
 
3663
-	return $svg;
3663
+    return $svg;
3664 3664
 }
3665 3665
 
3666 3666
 
@@ -3686,17 +3686,17 @@  discard block
 block discarded – undo
3686 3686
  *     Code HTML résultant
3687 3687
  **/
3688 3688
 function filtre_foreach_dist($tableau, $modele = 'foreach') {
3689
-	$texte = '';
3690
-	if (is_array($tableau)) {
3691
-		foreach ($tableau as $k => $v) {
3692
-			$res = recuperer_fond('modeles/' . $modele,
3693
-				array_merge(array('cle' => $k), (is_array($v) ? $v : array('valeur' => $v)))
3694
-			);
3695
-			$texte .= $res;
3696
-		}
3697
-	}
3689
+    $texte = '';
3690
+    if (is_array($tableau)) {
3691
+        foreach ($tableau as $k => $v) {
3692
+            $res = recuperer_fond('modeles/' . $modele,
3693
+                array_merge(array('cle' => $k), (is_array($v) ? $v : array('valeur' => $v)))
3694
+            );
3695
+            $texte .= $res;
3696
+        }
3697
+    }
3698 3698
 
3699
-	return $texte;
3699
+    return $texte;
3700 3700
 }
3701 3701
 
3702 3702
 
@@ -3721,37 +3721,37 @@  discard block
 block discarded – undo
3721 3721
  *         - tout : retourne toutes les informations du plugin actif
3722 3722
  **/
3723 3723
 function filtre_info_plugin_dist($plugin, $type_info, $reload = false) {
3724
-	include_spip('inc/plugin');
3725
-	$plugin = strtoupper($plugin);
3726
-	$plugins_actifs = liste_plugin_actifs();
3727
-
3728
-	if (!$plugin) {
3729
-		return serialize(array_keys($plugins_actifs));
3730
-	} elseif (empty($plugins_actifs[$plugin]) and !$reload) {
3731
-		return '';
3732
-	} elseif (($type_info == 'est_actif') and !$reload) {
3733
-		return $plugins_actifs[$plugin] ? 1 : 0;
3734
-	} elseif (isset($plugins_actifs[$plugin][$type_info]) and !$reload) {
3735
-		return $plugins_actifs[$plugin][$type_info];
3736
-	} else {
3737
-		$get_infos = charger_fonction('get_infos', 'plugins');
3738
-		// On prend en compte les extensions
3739
-		if (!is_dir($plugins_actifs[$plugin]['dir_type'])) {
3740
-			$dir_plugins = constant($plugins_actifs[$plugin]['dir_type']);
3741
-		} else {
3742
-			$dir_plugins = $plugins_actifs[$plugin]['dir_type'];
3743
-		}
3744
-		if (!$infos = $get_infos($plugins_actifs[$plugin]['dir'], $reload, $dir_plugins)) {
3745
-			return '';
3746
-		}
3747
-		if ($type_info == 'tout') {
3748
-			return $infos;
3749
-		} elseif ($type_info == 'est_actif') {
3750
-			return $infos ? 1 : 0;
3751
-		} else {
3752
-			return strval($infos[$type_info]);
3753
-		}
3754
-	}
3724
+    include_spip('inc/plugin');
3725
+    $plugin = strtoupper($plugin);
3726
+    $plugins_actifs = liste_plugin_actifs();
3727
+
3728
+    if (!$plugin) {
3729
+        return serialize(array_keys($plugins_actifs));
3730
+    } elseif (empty($plugins_actifs[$plugin]) and !$reload) {
3731
+        return '';
3732
+    } elseif (($type_info == 'est_actif') and !$reload) {
3733
+        return $plugins_actifs[$plugin] ? 1 : 0;
3734
+    } elseif (isset($plugins_actifs[$plugin][$type_info]) and !$reload) {
3735
+        return $plugins_actifs[$plugin][$type_info];
3736
+    } else {
3737
+        $get_infos = charger_fonction('get_infos', 'plugins');
3738
+        // On prend en compte les extensions
3739
+        if (!is_dir($plugins_actifs[$plugin]['dir_type'])) {
3740
+            $dir_plugins = constant($plugins_actifs[$plugin]['dir_type']);
3741
+        } else {
3742
+            $dir_plugins = $plugins_actifs[$plugin]['dir_type'];
3743
+        }
3744
+        if (!$infos = $get_infos($plugins_actifs[$plugin]['dir'], $reload, $dir_plugins)) {
3745
+            return '';
3746
+        }
3747
+        if ($type_info == 'tout') {
3748
+            return $infos;
3749
+        } elseif ($type_info == 'est_actif') {
3750
+            return $infos ? 1 : 0;
3751
+        } else {
3752
+            return strval($infos[$type_info]);
3753
+        }
3754
+    }
3755 3755
 }
3756 3756
 
3757 3757
 
@@ -3778,9 +3778,9 @@  discard block
 block discarded – undo
3778 3778
  *     Code HTML de l'image de puce de statut à insérer (et du menu de changement si présent)
3779 3779
  */
3780 3780
 function puce_changement_statut($id_objet, $statut, $id_rubrique, $type, $ajax = false) {
3781
-	$puce_statut = charger_fonction('puce_statut', 'inc');
3781
+    $puce_statut = charger_fonction('puce_statut', 'inc');
3782 3782
 
3783
-	return $puce_statut($id_objet, $statut, $id_rubrique, $type, $ajax);
3783
+    return $puce_statut($id_objet, $statut, $id_rubrique, $type, $ajax);
3784 3784
 }
3785 3785
 
3786 3786
 
@@ -3810,13 +3810,13 @@  discard block
 block discarded – undo
3810 3810
  *     Code HTML de l'image de puce de statut à insérer (et du menu de changement si présent)
3811 3811
  */
3812 3812
 function filtre_puce_statut_dist($statut, $objet, $id_objet = 0, $id_parent = 0) {
3813
-	static $puce_statut = null;
3814
-	if (!$puce_statut) {
3815
-		$puce_statut = charger_fonction('puce_statut', 'inc');
3816
-	}
3813
+    static $puce_statut = null;
3814
+    if (!$puce_statut) {
3815
+        $puce_statut = charger_fonction('puce_statut', 'inc');
3816
+    }
3817 3817
 
3818
-	return $puce_statut($id_objet, $statut, $id_parent, $objet, false,
3819
-		objet_info($objet, 'editable') ? _ACTIVER_PUCE_RAPIDE : false);
3818
+    return $puce_statut($id_objet, $statut, $id_parent, $objet, false,
3819
+        objet_info($objet, 'editable') ? _ACTIVER_PUCE_RAPIDE : false);
3820 3820
 }
3821 3821
 
3822 3822
 
@@ -3843,95 +3843,95 @@  discard block
 block discarded – undo
3843 3843
  *   hash du contexte
3844 3844
  */
3845 3845
 function encoder_contexte_ajax($c, $form = '', $emboite = null, $ajaxid = '') {
3846
-	if (is_string($c)
3847
-		and @unserialize($c) !== false
3848
-	) {
3849
-		$c = unserialize($c);
3850
-	}
3851
-
3852
-	// supprimer les parametres debut_x
3853
-	// pour que la pagination ajax ne soit pas plantee
3854
-	// si on charge la page &debut_x=1 : car alors en cliquant sur l'item 0,
3855
-	// le debut_x=0 n'existe pas, et on resterait sur 1
3856
-	if (is_array($c)) {
3857
-		foreach ($c as $k => $v) {
3858
-			if (strpos($k, 'debut_') === 0) {
3859
-				unset($c[$k]);
3860
-			}
3861
-		}
3862
-	}
3863
-
3864
-	if (!function_exists('calculer_cle_action')) {
3865
-		include_spip("inc/securiser_action");
3866
-	}
3867
-
3868
-	$c = serialize($c);
3869
-	$cle = calculer_cle_action($form . $c);
3870
-	$c = "$cle:$c";
3871
-
3872
-	// on ne stocke pas les contextes dans des fichiers en cache
3873
-	// par defaut, sauf si cette configuration a été forcée
3874
-	// OU que la longueur de l’argument géneré est plus long
3875
-	// que ce qui est toléré.
3876
-	$cache_contextes_ajax = (defined('_CACHE_CONTEXTES_AJAX') and _CACHE_CONTEXTES_AJAX);
3877
-	if (!$cache_contextes_ajax) {
3878
-		$env = $c;
3879
-		if (function_exists('gzdeflate') && function_exists('gzinflate')) {
3880
-			$env = gzdeflate($env);
3881
-		}
3882
-		$env = _xor($env);
3883
-		$env = base64_encode($env);
3884
-		$len = strlen($env);
3885
-		// Si l’url est trop longue pour le navigateur
3886
-		$max_len = _CACHE_CONTEXTES_AJAX_SUR_LONGUEUR;
3887
-		if ($len > $max_len) {
3888
-			$cache_contextes_ajax = true;
3889
-			spip_log("Contextes AJAX forces en fichiers !"
3890
-				. " Cela arrive lorsque la valeur du contexte" 
3891
-				. " depasse la longueur maximale autorisee ($max_len). Ici : $len."
3892
-				, _LOG_AVERTISSEMENT);
3893
-		}
3894
-		// Sinon si Suhosin est actif et a une la valeur maximale des variables en GET...
3895
-		elseif (
3896
-			$max_len = @ini_get('suhosin.get.max_value_length')
3897
-			and $max_len < $len
3898
-		) {
3899
-			$cache_contextes_ajax = true;
3900
-			spip_log("Contextes AJAX forces en fichiers !"
3901
-				. " Cela arrive lorsque la valeur du contexte"
3902
-				. " depasse la longueur maximale autorisee par Suhosin"
3903
-				. " ($max_len) dans 'suhosin.get.max_value_length'. Ici : $len."
3904
-				. " Vous devriez modifier les parametres de Suhosin"
3905
-				. " pour accepter au moins 1024 caracteres.", _LOG_AVERTISSEMENT);
3906
-		} 
3907
-
3908
-	}
3909
-
3910
-	if ($cache_contextes_ajax) {
3911
-		$dir = sous_repertoire(_DIR_CACHE, 'contextes');
3912
-		// stocker les contextes sur disque et ne passer qu'un hash dans l'url
3913
-		$md5 = md5($c);
3914
-		ecrire_fichier("$dir/c$md5", $c);
3915
-		$env = $md5;
3916
-	}
3917
-
3918
-	if ($emboite === null) {
3919
-		return $env;
3920
-	}
3921
-	if (!trim($emboite)) {
3922
-		return "";
3923
-	}
3924
-	// toujours encoder l'url source dans le bloc ajax
3925
-	$r = self();
3926
-	$r = ' data-origin="' . $r . '"';
3927
-	$class = 'ajaxbloc';
3928
-	if ($ajaxid and is_string($ajaxid)) {
3929
-		// ajaxid est normalement conforme a un nom de classe css
3930
-		// on ne verifie pas la conformite, mais on passe entites_html par dessus par precaution
3931
-		$class .= ' ajax-id-' . entites_html($ajaxid);
3932
-	}
3933
-
3934
-	return "<div class='$class' " . "data-ajax-env='$env'$r>\n$emboite</div><!--ajaxbloc-->\n";
3846
+    if (is_string($c)
3847
+        and @unserialize($c) !== false
3848
+    ) {
3849
+        $c = unserialize($c);
3850
+    }
3851
+
3852
+    // supprimer les parametres debut_x
3853
+    // pour que la pagination ajax ne soit pas plantee
3854
+    // si on charge la page &debut_x=1 : car alors en cliquant sur l'item 0,
3855
+    // le debut_x=0 n'existe pas, et on resterait sur 1
3856
+    if (is_array($c)) {
3857
+        foreach ($c as $k => $v) {
3858
+            if (strpos($k, 'debut_') === 0) {
3859
+                unset($c[$k]);
3860
+            }
3861
+        }
3862
+    }
3863
+
3864
+    if (!function_exists('calculer_cle_action')) {
3865
+        include_spip("inc/securiser_action");
3866
+    }
3867
+
3868
+    $c = serialize($c);
3869
+    $cle = calculer_cle_action($form . $c);
3870
+    $c = "$cle:$c";
3871
+
3872
+    // on ne stocke pas les contextes dans des fichiers en cache
3873
+    // par defaut, sauf si cette configuration a été forcée
3874
+    // OU que la longueur de l’argument géneré est plus long
3875
+    // que ce qui est toléré.
3876
+    $cache_contextes_ajax = (defined('_CACHE_CONTEXTES_AJAX') and _CACHE_CONTEXTES_AJAX);
3877
+    if (!$cache_contextes_ajax) {
3878
+        $env = $c;
3879
+        if (function_exists('gzdeflate') && function_exists('gzinflate')) {
3880
+            $env = gzdeflate($env);
3881
+        }
3882
+        $env = _xor($env);
3883
+        $env = base64_encode($env);
3884
+        $len = strlen($env);
3885
+        // Si l’url est trop longue pour le navigateur
3886
+        $max_len = _CACHE_CONTEXTES_AJAX_SUR_LONGUEUR;
3887
+        if ($len > $max_len) {
3888
+            $cache_contextes_ajax = true;
3889
+            spip_log("Contextes AJAX forces en fichiers !"
3890
+                . " Cela arrive lorsque la valeur du contexte" 
3891
+                . " depasse la longueur maximale autorisee ($max_len). Ici : $len."
3892
+                , _LOG_AVERTISSEMENT);
3893
+        }
3894
+        // Sinon si Suhosin est actif et a une la valeur maximale des variables en GET...
3895
+        elseif (
3896
+            $max_len = @ini_get('suhosin.get.max_value_length')
3897
+            and $max_len < $len
3898
+        ) {
3899
+            $cache_contextes_ajax = true;
3900
+            spip_log("Contextes AJAX forces en fichiers !"
3901
+                . " Cela arrive lorsque la valeur du contexte"
3902
+                . " depasse la longueur maximale autorisee par Suhosin"
3903
+                . " ($max_len) dans 'suhosin.get.max_value_length'. Ici : $len."
3904
+                . " Vous devriez modifier les parametres de Suhosin"
3905
+                . " pour accepter au moins 1024 caracteres.", _LOG_AVERTISSEMENT);
3906
+        } 
3907
+
3908
+    }
3909
+
3910
+    if ($cache_contextes_ajax) {
3911
+        $dir = sous_repertoire(_DIR_CACHE, 'contextes');
3912
+        // stocker les contextes sur disque et ne passer qu'un hash dans l'url
3913
+        $md5 = md5($c);
3914
+        ecrire_fichier("$dir/c$md5", $c);
3915
+        $env = $md5;
3916
+    }
3917
+
3918
+    if ($emboite === null) {
3919
+        return $env;
3920
+    }
3921
+    if (!trim($emboite)) {
3922
+        return "";
3923
+    }
3924
+    // toujours encoder l'url source dans le bloc ajax
3925
+    $r = self();
3926
+    $r = ' data-origin="' . $r . '"';
3927
+    $class = 'ajaxbloc';
3928
+    if ($ajaxid and is_string($ajaxid)) {
3929
+        // ajaxid est normalement conforme a un nom de classe css
3930
+        // on ne verifie pas la conformite, mais on passe entites_html par dessus par precaution
3931
+        $class .= ' ajax-id-' . entites_html($ajaxid);
3932
+    }
3933
+
3934
+    return "<div class='$class' " . "data-ajax-env='$env'$r>\n$emboite</div><!--ajaxbloc-->\n";
3935 3935
 }
3936 3936
 
3937 3937
 /**
@@ -3951,36 +3951,36 @@  discard block
 block discarded – undo
3951 3951
  *   - false : erreur de décodage
3952 3952
  */
3953 3953
 function decoder_contexte_ajax($c, $form = '') {
3954
-	if (!function_exists('calculer_cle_action')) {
3955
-		include_spip("inc/securiser_action");
3956
-	}
3957
-	if (((defined('_CACHE_CONTEXTES_AJAX') and _CACHE_CONTEXTES_AJAX) or strlen($c) == 32)
3958
-		and $dir = sous_repertoire(_DIR_CACHE, 'contextes')
3959
-		and lire_fichier("$dir/c$c", $contexte)
3960
-	) {
3961
-		$c = $contexte;
3962
-	} else {
3963
-		$c = @base64_decode($c);
3964
-		$c = _xor($c);
3965
-		if (function_exists('gzdeflate') && function_exists('gzinflate')) {
3966
-			$c = @gzinflate($c);
3967
-		}
3968
-	}
3969
-
3970
-	// extraire la signature en debut de contexte
3971
-	// et la verifier avant de deserializer
3972
-	// format : signature:donneesserializees
3973
-	if ($p = strpos($c,":")){
3974
-		$cle = substr($c,0,$p);
3975
-		$c = substr($c,$p+1);
3976
-
3977
-		if ($cle == calculer_cle_action($form . $c)) {
3978
-			$env = @unserialize($c);
3979
-			return $env;
3980
-		}
3981
-	}
3982
-
3983
-	return false;
3954
+    if (!function_exists('calculer_cle_action')) {
3955
+        include_spip("inc/securiser_action");
3956
+    }
3957
+    if (((defined('_CACHE_CONTEXTES_AJAX') and _CACHE_CONTEXTES_AJAX) or strlen($c) == 32)
3958
+        and $dir = sous_repertoire(_DIR_CACHE, 'contextes')
3959
+        and lire_fichier("$dir/c$c", $contexte)
3960
+    ) {
3961
+        $c = $contexte;
3962
+    } else {
3963
+        $c = @base64_decode($c);
3964
+        $c = _xor($c);
3965
+        if (function_exists('gzdeflate') && function_exists('gzinflate')) {
3966
+            $c = @gzinflate($c);
3967
+        }
3968
+    }
3969
+
3970
+    // extraire la signature en debut de contexte
3971
+    // et la verifier avant de deserializer
3972
+    // format : signature:donneesserializees
3973
+    if ($p = strpos($c,":")){
3974
+        $cle = substr($c,0,$p);
3975
+        $c = substr($c,$p+1);
3976
+
3977
+        if ($cle == calculer_cle_action($form . $c)) {
3978
+            $env = @unserialize($c);
3979
+            return $env;
3980
+        }
3981
+    }
3982
+
3983
+    return false;
3984 3984
 }
3985 3985
 
3986 3986
 
@@ -3998,20 +3998,20 @@  discard block
 block discarded – undo
3998 3998
  *    Message décrypté ou encrypté
3999 3999
  **/
4000 4000
 function _xor($message, $key = null) {
4001
-	if (is_null($key)) {
4002
-		if (!function_exists('calculer_cle_action')) {
4003
-			include_spip("inc/securiser_action");
4004
-		}
4005
-		$key = pack("H*", calculer_cle_action('_xor'));
4006
-	}
4001
+    if (is_null($key)) {
4002
+        if (!function_exists('calculer_cle_action')) {
4003
+            include_spip("inc/securiser_action");
4004
+        }
4005
+        $key = pack("H*", calculer_cle_action('_xor'));
4006
+    }
4007 4007
 
4008
-	$keylen = strlen($key);
4009
-	$messagelen = strlen($message);
4010
-	for ($i = 0; $i < $messagelen; $i++) {
4011
-		$message[$i] = ~($message[$i] ^ $key[$i % $keylen]);
4012
-	}
4008
+    $keylen = strlen($key);
4009
+    $messagelen = strlen($message);
4010
+    for ($i = 0; $i < $messagelen; $i++) {
4011
+        $message[$i] = ~($message[$i] ^ $key[$i % $keylen]);
4012
+    }
4013 4013
 
4014
-	return $message;
4014
+    return $message;
4015 4015
 }
4016 4016
 
4017 4017
 /**
@@ -4074,37 +4074,37 @@  discard block
 block discarded – undo
4074 4074
  *   Code HTML
4075 4075
  */
4076 4076
 function lien_ou_expose($url, $libelle = null, $on = false, $class = "", $title = "", $rel = "", $evt = '') {
4077
-	if ($on) {
4078
-		$bal = 'strong';
4079
-		$class = "";
4080
-		$att = "";
4081
-		// si $on passe la balise et optionnelement une ou ++classe
4082
-		// a.active span.selected.active etc....
4083
-		if (is_string($on) and (strncmp($on, 'a', 1)==0 or strncmp($on, 'span', 4)==0 or strncmp($on, 'strong', 6)==0)){
4084
-			$on = explode(".", $on);
4085
-			// on verifie que c'est exactement une des 3 balises a, span ou strong
4086
-			if (in_array(reset($on), array('a', 'span', 'strong'))){
4087
-				$bal = array_shift($on);
4088
-				$class = implode(" ", $on);
4089
-				if ($bal=="a"){
4090
-					$att = 'href="#" ';
4091
-				}
4092
-			}
4093
-		}
4094
-		$att .= 'class="' . ($class ? attribut_html($class) . ' ' : '') . (defined('_LIEN_OU_EXPOSE_CLASS_ON') ? _LIEN_OU_EXPOSE_CLASS_ON : 'on') . '"';
4095
-	} else {
4096
-		$bal = 'a';
4097
-		$att = "href='$url'"
4098
-			. ($title ? " title='" . attribut_html($title) . "'" : '')
4099
-			. ($class ? " class='" . attribut_html($class) . "'" : '')
4100
-			. ($rel ? " rel='" . attribut_html($rel) . "'" : '')
4101
-			. $evt;
4102
-	}
4103
-	if ($libelle === null) {
4104
-		$libelle = $url;
4105
-	}
4106
-
4107
-	return "<$bal $att>$libelle</$bal>";
4077
+    if ($on) {
4078
+        $bal = 'strong';
4079
+        $class = "";
4080
+        $att = "";
4081
+        // si $on passe la balise et optionnelement une ou ++classe
4082
+        // a.active span.selected.active etc....
4083
+        if (is_string($on) and (strncmp($on, 'a', 1)==0 or strncmp($on, 'span', 4)==0 or strncmp($on, 'strong', 6)==0)){
4084
+            $on = explode(".", $on);
4085
+            // on verifie que c'est exactement une des 3 balises a, span ou strong
4086
+            if (in_array(reset($on), array('a', 'span', 'strong'))){
4087
+                $bal = array_shift($on);
4088
+                $class = implode(" ", $on);
4089
+                if ($bal=="a"){
4090
+                    $att = 'href="#" ';
4091
+                }
4092
+            }
4093
+        }
4094
+        $att .= 'class="' . ($class ? attribut_html($class) . ' ' : '') . (defined('_LIEN_OU_EXPOSE_CLASS_ON') ? _LIEN_OU_EXPOSE_CLASS_ON : 'on') . '"';
4095
+    } else {
4096
+        $bal = 'a';
4097
+        $att = "href='$url'"
4098
+            . ($title ? " title='" . attribut_html($title) . "'" : '')
4099
+            . ($class ? " class='" . attribut_html($class) . "'" : '')
4100
+            . ($rel ? " rel='" . attribut_html($rel) . "'" : '')
4101
+            . $evt;
4102
+    }
4103
+    if ($libelle === null) {
4104
+        $libelle = $url;
4105
+    }
4106
+
4107
+    return "<$bal $att>$libelle</$bal>";
4108 4108
 }
4109 4109
 
4110 4110
 
@@ -4121,37 +4121,37 @@  discard block
 block discarded – undo
4121 4121
  * @return string : la chaine de langue finale en utilisant la fonction _T()
4122 4122
  */
4123 4123
 function singulier_ou_pluriel($nb, $chaine_un, $chaine_plusieurs, $var = 'nb', $vars = array()) {
4124
-	static $local_singulier_ou_pluriel = array();
4124
+    static $local_singulier_ou_pluriel = array();
4125 4125
 
4126
-	// si nb=0 ou pas de $vars valide on retourne une chaine vide, a traiter par un |sinon
4127
-	if (!is_numeric($nb) or $nb == 0) {
4128
-		return "";
4129
-	}
4130
-	if (!is_array($vars)) {
4131
-		return "";
4132
-	}
4126
+    // si nb=0 ou pas de $vars valide on retourne une chaine vide, a traiter par un |sinon
4127
+    if (!is_numeric($nb) or $nb == 0) {
4128
+        return "";
4129
+    }
4130
+    if (!is_array($vars)) {
4131
+        return "";
4132
+    }
4133 4133
 
4134
-	$langue = $GLOBALS['spip_lang'];
4135
-	if (!isset($local_singulier_ou_pluriel[$langue])) {
4136
-		$local_singulier_ou_pluriel[$langue] = false;
4137
-		if ($f = charger_fonction("singulier_ou_pluriel_${langue}", 'inc', true)
4138
-		  or $f = charger_fonction("singulier_ou_pluriel", 'inc', true)) {
4139
-			$local_singulier_ou_pluriel[$langue] = $f;
4140
-		}
4141
-	}
4134
+    $langue = $GLOBALS['spip_lang'];
4135
+    if (!isset($local_singulier_ou_pluriel[$langue])) {
4136
+        $local_singulier_ou_pluriel[$langue] = false;
4137
+        if ($f = charger_fonction("singulier_ou_pluriel_${langue}", 'inc', true)
4138
+          or $f = charger_fonction("singulier_ou_pluriel", 'inc', true)) {
4139
+            $local_singulier_ou_pluriel[$langue] = $f;
4140
+        }
4141
+    }
4142 4142
 
4143
-	// si on a une surcharge on l'utilise
4144
-	if ($local_singulier_ou_pluriel[$langue]) {
4145
-		return ($local_singulier_ou_pluriel[$langue])($nb, $chaine_un, $chaine_plusieurs, $var, $vars);
4146
-	}
4143
+    // si on a une surcharge on l'utilise
4144
+    if ($local_singulier_ou_pluriel[$langue]) {
4145
+        return ($local_singulier_ou_pluriel[$langue])($nb, $chaine_un, $chaine_plusieurs, $var, $vars);
4146
+    }
4147 4147
 
4148
-	// sinon traitement par defaut
4149
-	$vars[$var] = $nb;
4150
-	if ($nb >= 2) {
4151
-		return _T($chaine_plusieurs, $vars);
4152
-	} else {
4153
-		return _T($chaine_un, $vars);
4154
-	}
4148
+    // sinon traitement par defaut
4149
+    $vars[$var] = $nb;
4150
+    if ($nb >= 2) {
4151
+        return _T($chaine_plusieurs, $vars);
4152
+    } else {
4153
+        return _T($chaine_un, $vars);
4154
+    }
4155 4155
 }
4156 4156
 
4157 4157
 
@@ -4179,71 +4179,71 @@  discard block
 block discarded – undo
4179 4179
  */
4180 4180
 function prepare_icone_base($type, $lien, $texte, $fond, $fonction = '', $class = '', $javascript = '') {
4181 4181
 
4182
-	$class_lien = $class_bouton = $class;
4183
-
4184
-	// Normaliser la fonction et compléter la classe en fonction
4185
-	if (in_array($fonction, ['del', 'supprimer.gif'])) {
4186
-		$class_lien .= ' danger';
4187
-		$class_bouton .= ' btn_danger';
4188
-	} elseif ($fonction == 'rien.gif') {
4189
-		$fonction = '';
4190
-	} elseif ($fonction == 'delsafe') {
4191
-		$fonction = 'del';
4192
-	}
4193
-
4194
-	$fond_origine = $fond;
4195
-	// Remappage des icone : article-24.png+new => article-new-24.png
4196
-	if ($icone_renommer = charger_fonction('icone_renommer', 'inc', true)) {
4197
-		list($fond, $fonction) = $icone_renommer($fond, $fonction);
4198
-	}
4199
-
4200
-	// Ajouter le type d'objet dans la classe
4201
-	$objet_type = substr(basename($fond), 0, -4);
4202
-	$class_lien .= " $objet_type";
4203
-	$class_bouton .= " $objet_type";
4204
-
4205
-	// Texte
4206
-	$alt = attribut_html($texte);
4207
-	$title = " title=\"$alt\""; // est-ce pertinent de doubler le alt par un title ?
4208
-
4209
-	// Liens : préparer les classes ajax
4210
-	$ajax = '';
4211
-	if ($type === 'lien') {
4212
-		if (strpos($class_lien, 'ajax') !== false) {
4213
-			$ajax = 'ajax';
4214
-			if (strpos($class_lien, 'preload') !== false) {
4215
-				$ajax .= ' preload';
4216
-			}
4217
-			if (strpos($class_lien, 'nocache') !== false) {
4218
-				$ajax .= ' nocache';
4219
-			}
4220
-			$ajax = " class='$ajax'";
4221
-		}
4222
-	}
4223
-
4224
-	// Repérer la taille et l'ajouter dans la classe
4225
-	$size = 24;
4226
-	if (preg_match("/-([0-9]{1,3})[.](gif|png|svg)$/i", $fond, $match)
4227
-	  or preg_match("/-([0-9]{1,3})([.](gif|png|svg))?$/i", $fond_origine, $match)) {
4228
-		$size = $match[1];
4229
-	}
4230
-	$class_lien .= " s$size";
4231
-	$class_bouton .= " s$size";
4232
-
4233
-	// Icône
4234
-	$icone = http_img_pack($fond, $alt, "width='$size' height='$size'");
4235
-	$icone = "<span class=\"icone-image".($fonction ? " icone-fonction icone-fonction-$fonction" : "") . "\">$icone</span>";
4236
-
4237
-	// Markup final
4238
-	if ($type == 'lien') {
4239
-		return "<span class='icone $class_lien'>"
4240
-		. "<a href='$lien'$title$ajax$javascript>"
4241
-		. $icone
4242
-		. "<b>$texte</b>"
4243
-		. "</a></span>\n";
4244
-	} else {
4245
-		return bouton_action("$icone $texte", $lien, $class_bouton, $javascript, $alt);
4246
-	}
4182
+    $class_lien = $class_bouton = $class;
4183
+
4184
+    // Normaliser la fonction et compléter la classe en fonction
4185
+    if (in_array($fonction, ['del', 'supprimer.gif'])) {
4186
+        $class_lien .= ' danger';
4187
+        $class_bouton .= ' btn_danger';
4188
+    } elseif ($fonction == 'rien.gif') {
4189
+        $fonction = '';
4190
+    } elseif ($fonction == 'delsafe') {
4191
+        $fonction = 'del';
4192
+    }
4193
+
4194
+    $fond_origine = $fond;
4195
+    // Remappage des icone : article-24.png+new => article-new-24.png
4196
+    if ($icone_renommer = charger_fonction('icone_renommer', 'inc', true)) {
4197
+        list($fond, $fonction) = $icone_renommer($fond, $fonction);
4198
+    }
4199
+
4200
+    // Ajouter le type d'objet dans la classe
4201
+    $objet_type = substr(basename($fond), 0, -4);
4202
+    $class_lien .= " $objet_type";
4203
+    $class_bouton .= " $objet_type";
4204
+
4205
+    // Texte
4206
+    $alt = attribut_html($texte);
4207
+    $title = " title=\"$alt\""; // est-ce pertinent de doubler le alt par un title ?
4208
+
4209
+    // Liens : préparer les classes ajax
4210
+    $ajax = '';
4211
+    if ($type === 'lien') {
4212
+        if (strpos($class_lien, 'ajax') !== false) {
4213
+            $ajax = 'ajax';
4214
+            if (strpos($class_lien, 'preload') !== false) {
4215
+                $ajax .= ' preload';
4216
+            }
4217
+            if (strpos($class_lien, 'nocache') !== false) {
4218
+                $ajax .= ' nocache';
4219
+            }
4220
+            $ajax = " class='$ajax'";
4221
+        }
4222
+    }
4223
+
4224
+    // Repérer la taille et l'ajouter dans la classe
4225
+    $size = 24;
4226
+    if (preg_match("/-([0-9]{1,3})[.](gif|png|svg)$/i", $fond, $match)
4227
+      or preg_match("/-([0-9]{1,3})([.](gif|png|svg))?$/i", $fond_origine, $match)) {
4228
+        $size = $match[1];
4229
+    }
4230
+    $class_lien .= " s$size";
4231
+    $class_bouton .= " s$size";
4232
+
4233
+    // Icône
4234
+    $icone = http_img_pack($fond, $alt, "width='$size' height='$size'");
4235
+    $icone = "<span class=\"icone-image".($fonction ? " icone-fonction icone-fonction-$fonction" : "") . "\">$icone</span>";
4236
+
4237
+    // Markup final
4238
+    if ($type == 'lien') {
4239
+        return "<span class='icone $class_lien'>"
4240
+        . "<a href='$lien'$title$ajax$javascript>"
4241
+        . $icone
4242
+        . "<b>$texte</b>"
4243
+        . "</a></span>\n";
4244
+    } else {
4245
+        return bouton_action("$icone $texte", $lien, $class_bouton, $javascript, $alt);
4246
+    }
4247 4247
 }
4248 4248
 
4249 4249
 /**
@@ -4267,7 +4267,7 @@  discard block
 block discarded – undo
4267 4267
  *     Code HTML du lien
4268 4268
  **/
4269 4269
 function icone_base($lien, $texte, $fond, $fonction = "", $class = "", $javascript = "") {
4270
-	return prepare_icone_base('lien', $lien, $texte, $fond, $fonction, $class, $javascript);
4270
+    return prepare_icone_base('lien', $lien, $texte, $fond, $fonction, $class, $javascript);
4271 4271
 }
4272 4272
 
4273 4273
 /**
@@ -4302,7 +4302,7 @@  discard block
 block discarded – undo
4302 4302
  *     Code HTML du lien
4303 4303
  **/
4304 4304
 function filtre_icone_verticale_dist($lien, $texte, $fond, $fonction = "", $class = "", $javascript = "") {
4305
-	return icone_base($lien, $texte, $fond, $fonction, "verticale $class", $javascript);
4305
+    return icone_base($lien, $texte, $fond, $fonction, "verticale $class", $javascript);
4306 4306
 }
4307 4307
 
4308 4308
 /**
@@ -4347,7 +4347,7 @@  discard block
 block discarded – undo
4347 4347
  *     Code HTML du lien
4348 4348
  **/
4349 4349
 function filtre_icone_horizontale_dist($lien, $texte, $fond, $fonction = "", $class = "", $javascript = "") {
4350
-	return icone_base($lien, $texte, $fond, $fonction, "horizontale $class", $javascript);
4350
+    return icone_base($lien, $texte, $fond, $fonction, "horizontale $class", $javascript);
4351 4351
 }
4352 4352
 
4353 4353
 /**
@@ -4378,7 +4378,7 @@  discard block
 block discarded – undo
4378 4378
  *     Code HTML du lien
4379 4379
  **/
4380 4380
 function filtre_bouton_action_horizontal_dist($lien, $texte, $fond, $fonction = "", $class = "", $confirm = "") {
4381
-	return prepare_icone_base('bouton', $lien, $texte, $fond, $fonction, $class, $confirm);
4381
+    return prepare_icone_base('bouton', $lien, $texte, $fond, $fonction, $class, $confirm);
4382 4382
 }
4383 4383
 
4384 4384
 /**
@@ -4409,7 +4409,7 @@  discard block
 block discarded – undo
4409 4409
  *     Code HTML du lien
4410 4410
  */
4411 4411
 function filtre_icone_dist($lien, $texte, $fond, $align = "", $fonction = "", $class = "", $javascript = "") {
4412
-	return icone_base($lien, $texte, $fond, $fonction, "verticale $align $class", $javascript);
4412
+    return icone_base($lien, $texte, $fond, $fonction, "verticale $align $class", $javascript);
4413 4413
 }
4414 4414
 
4415 4415
 
@@ -4457,23 +4457,23 @@  discard block
 block discarded – undo
4457 4457
  * @return string Code CSS
4458 4458
  */
4459 4459
 function bando_images_background() {
4460
-	include_spip('inc/bandeau');
4461
-	// recuperer tous les boutons et leurs images
4462
-	$boutons = definir_barre_boutons(definir_barre_contexte(), true, false);
4460
+    include_spip('inc/bandeau');
4461
+    // recuperer tous les boutons et leurs images
4462
+    $boutons = definir_barre_boutons(definir_barre_contexte(), true, false);
4463 4463
 
4464
-	$res = "";
4465
-	foreach ($boutons as $page => $detail) {
4466
-		$selecteur = (in_array($page, array('outils_rapides', 'outils_collaboratifs')) ? "" : ".navigation_avec_icones ");
4467
-		if (is_array($detail->sousmenu)) {
4468
-			foreach ($detail->sousmenu as $souspage => $sousdetail) {
4469
-				if ($sousdetail->icone and strlen(trim($sousdetail->icone))) {
4470
-					$res .= "\n$selecteur.bando2_$souspage {background-image:url(" . $sousdetail->icone . ");}";
4471
-				}
4472
-			}
4473
-		}
4474
-	}
4464
+    $res = "";
4465
+    foreach ($boutons as $page => $detail) {
4466
+        $selecteur = (in_array($page, array('outils_rapides', 'outils_collaboratifs')) ? "" : ".navigation_avec_icones ");
4467
+        if (is_array($detail->sousmenu)) {
4468
+            foreach ($detail->sousmenu as $souspage => $sousdetail) {
4469
+                if ($sousdetail->icone and strlen(trim($sousdetail->icone))) {
4470
+                    $res .= "\n$selecteur.bando2_$souspage {background-image:url(" . $sousdetail->icone . ");}";
4471
+                }
4472
+            }
4473
+        }
4474
+    }
4475 4475
 
4476
-	return $res;
4476
+    return $res;
4477 4477
 }
4478 4478
 
4479 4479
 /**
@@ -4498,27 +4498,27 @@  discard block
 block discarded – undo
4498 4498
  */
4499 4499
 function bouton_action($libelle, $url, $class = '', $confirm = '', $title = '', $callback = '') {
4500 4500
 
4501
-	// Classes : dispatcher `ajax` sur le formulaire
4502
-	$class_form = '';
4503
-	if (strpos($class, 'ajax') !== false) {
4504
-		$class_form = 'ajax';
4505
-		$class = str_replace('ajax', '', $class);
4506
-	}
4507
-	$class_btn = 'submit ' . trim($class);
4501
+    // Classes : dispatcher `ajax` sur le formulaire
4502
+    $class_form = '';
4503
+    if (strpos($class, 'ajax') !== false) {
4504
+        $class_form = 'ajax';
4505
+        $class = str_replace('ajax', '', $class);
4506
+    }
4507
+    $class_btn = 'submit ' . trim($class);
4508 4508
 
4509
-	if ($confirm) {
4510
-		$confirm = "confirm(\"" . attribut_html($confirm) . "\")";
4511
-		if ($callback) {
4512
-			$callback = "$confirm?($callback):false";
4513
-		} else {
4514
-			$callback = $confirm;
4515
-		}
4516
-	}
4517
-	$onclick = $callback ? " onclick='return " . addcslashes($callback, "'") . "'" : "";
4518
-	$title = $title ? " title='$title'" : '';
4509
+    if ($confirm) {
4510
+        $confirm = "confirm(\"" . attribut_html($confirm) . "\")";
4511
+        if ($callback) {
4512
+            $callback = "$confirm?($callback):false";
4513
+        } else {
4514
+            $callback = $confirm;
4515
+        }
4516
+    }
4517
+    $onclick = $callback ? " onclick='return " . addcslashes($callback, "'") . "'" : "";
4518
+    $title = $title ? " title='$title'" : '';
4519 4519
 
4520
-	return "<form class='bouton_action_post $class_form' method='post' action='$url'><div>" . form_hidden($url)
4521
-	. "<button type='submit' class='$class_btn'$title$onclick>$libelle</button></div></form>";
4520
+    return "<form class='bouton_action_post $class_form' method='post' action='$url'><div>" . form_hidden($url)
4521
+    . "<button type='submit' class='$class_btn'$title$onclick>$libelle</button></div></form>";
4522 4522
 }
4523 4523
 
4524 4524
 /**
@@ -4541,89 +4541,89 @@  discard block
 block discarded – undo
4541 4541
  * @return string
4542 4542
  */
4543 4543
 function generer_info_entite($id_objet, $type_objet, $info, $etoile = '', $params = []) {
4544
-	static $trouver_table = null;
4545
-	static $objets;
4546
-
4547
-	// On verifie qu'on a tout ce qu'il faut
4548
-	$id_objet = intval($id_objet);
4549
-	if (!($id_objet and $type_objet and $info)) {
4550
-		return '';
4551
-	}
4552
-
4553
-	// si on a deja note que l'objet n'existe pas, ne pas aller plus loin
4554
-	if (isset($objets[$type_objet]) and $objets[$type_objet] === false) {
4555
-		return '';
4556
-	}
4557
-
4558
-	// Si on demande l'url, on retourne direct la fonction
4559
-	if ($info == 'url') {
4560
-		return generer_url_entite($id_objet, $type_objet, ...$params);
4561
-	}
4562
-
4563
-	// Sinon on va tout chercher dans la table et on garde en memoire
4564
-	$demande_titre = ($info === 'titre');
4565
-	$demande_introduction = ($info === 'introduction');
4566
-
4567
-	// 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
4568
-	if (!isset($objets[$type_objet][$id_objet])
4569
-		or
4570
-		($demande_titre and !isset($objets[$type_objet][$id_objet]['titre']))
4571
-	) {
4572
-		if (!$trouver_table) {
4573
-			$trouver_table = charger_fonction('trouver_table', 'base');
4574
-		}
4575
-		$desc = $trouver_table(table_objet_sql($type_objet));
4576
-		if (!$desc) {
4577
-			return $objets[$type_objet] = false;
4578
-		}
4579
-
4580
-		// Si on demande le titre, on le gere en interne
4581
-		$champ_titre = "";
4582
-		if ($demande_titre) {
4583
-			// si pas de titre declare mais champ titre, il sera peuple par le select *
4584
-			$champ_titre = (!empty($desc['titre'])) ? ', ' . $desc['titre'] : '';
4585
-		}
4586
-		include_spip('base/abstract_sql');
4587
-		include_spip('base/connect_sql');
4588
-		$objets[$type_objet][$id_objet] = sql_fetsel(
4589
-			'*' . $champ_titre,
4590
-			$desc['table_sql'],
4591
-			id_table_objet($type_objet) . ' = ' . intval($id_objet)
4592
-		);
4593
-
4594
-		// Toujours noter la longueur d'introduction, même si pas demandé cette fois-ci
4595
-		$objets[$type_objet]['introduction_longueur'] = $desc['introduction_longueur'] ?? null;
4596
-	}
4597
-
4598
-	// Pour les fonction generer_xxx, si on demande l'introduction,
4599
-	// ajouter la longueur au début des params supplémentaires
4600
-	if ($demande_introduction) {
4601
-		$introduction_longueur = $objets[$type_objet]['introduction_longueur'];
4602
-		array_unshift($params, $introduction_longueur);
4603
-	}
4604
-
4605
-	// Si la fonction generer_TRUC_TYPE existe, on l'utilise pour formater $info_generee
4606
-	if ($generer = charger_fonction("generer_${info}_${type_objet}", '', true)) {
4607
-		$info_generee = $generer($id_objet, $objets[$type_objet][$id_objet], ...$params);
4608
-	} // Si la fonction generer_TRUC_entite existe, on l'utilise pour formater $info_generee
4609
-	else {
4610
-		if ($generer = charger_fonction("generer_${info}_entite", '', true)) {
4611
-			$info_generee = $generer($id_objet, $type_objet, $objets[$type_objet][$id_objet], ...$params);
4612
-		} // Sinon on prend directement le champ SQL tel quel
4613
-		else {
4614
-			$info_generee = (isset($objets[$type_objet][$id_objet][$info]) ? $objets[$type_objet][$id_objet][$info] : '');
4615
-		}
4616
-	}
4617
-
4618
-	// On va ensuite appliquer les traitements automatiques si besoin
4619
-	if (!$etoile) {
4620
-		// FIXME: on fournit un ENV minimum avec id et type et connect=''
4621
-		// mais ce fonctionnement est a ameliorer !
4622
-		$info_generee = appliquer_traitement_champ($info_generee, $info, table_objet($type_objet),
4623
-			array('id_objet' => $id_objet, 'objet' => $type_objet, ''));
4624
-	}
4625
-
4626
-	return $info_generee;
4544
+    static $trouver_table = null;
4545
+    static $objets;
4546
+
4547
+    // On verifie qu'on a tout ce qu'il faut
4548
+    $id_objet = intval($id_objet);
4549
+    if (!($id_objet and $type_objet and $info)) {
4550
+        return '';
4551
+    }
4552
+
4553
+    // si on a deja note que l'objet n'existe pas, ne pas aller plus loin
4554
+    if (isset($objets[$type_objet]) and $objets[$type_objet] === false) {
4555
+        return '';
4556
+    }
4557
+
4558
+    // Si on demande l'url, on retourne direct la fonction
4559
+    if ($info == 'url') {
4560
+        return generer_url_entite($id_objet, $type_objet, ...$params);
4561
+    }
4562
+
4563
+    // Sinon on va tout chercher dans la table et on garde en memoire
4564
+    $demande_titre = ($info === 'titre');
4565
+    $demande_introduction = ($info === 'introduction');
4566
+
4567
+    // 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
4568
+    if (!isset($objets[$type_objet][$id_objet])
4569
+        or
4570
+        ($demande_titre and !isset($objets[$type_objet][$id_objet]['titre']))
4571
+    ) {
4572
+        if (!$trouver_table) {
4573
+            $trouver_table = charger_fonction('trouver_table', 'base');
4574
+        }
4575
+        $desc = $trouver_table(table_objet_sql($type_objet));
4576
+        if (!$desc) {
4577
+            return $objets[$type_objet] = false;
4578
+        }
4579
+
4580
+        // Si on demande le titre, on le gere en interne
4581
+        $champ_titre = "";
4582
+        if ($demande_titre) {
4583
+            // si pas de titre declare mais champ titre, il sera peuple par le select *
4584
+            $champ_titre = (!empty($desc['titre'])) ? ', ' . $desc['titre'] : '';
4585
+        }
4586
+        include_spip('base/abstract_sql');
4587
+        include_spip('base/connect_sql');
4588
+        $objets[$type_objet][$id_objet] = sql_fetsel(
4589
+            '*' . $champ_titre,
4590
+            $desc['table_sql'],
4591
+            id_table_objet($type_objet) . ' = ' . intval($id_objet)
4592
+        );
4593
+
4594
+        // Toujours noter la longueur d'introduction, même si pas demandé cette fois-ci
4595
+        $objets[$type_objet]['introduction_longueur'] = $desc['introduction_longueur'] ?? null;
4596
+    }
4597
+
4598
+    // Pour les fonction generer_xxx, si on demande l'introduction,
4599
+    // ajouter la longueur au début des params supplémentaires
4600
+    if ($demande_introduction) {
4601
+        $introduction_longueur = $objets[$type_objet]['introduction_longueur'];
4602
+        array_unshift($params, $introduction_longueur);
4603
+    }
4604
+
4605
+    // Si la fonction generer_TRUC_TYPE existe, on l'utilise pour formater $info_generee
4606
+    if ($generer = charger_fonction("generer_${info}_${type_objet}", '', true)) {
4607
+        $info_generee = $generer($id_objet, $objets[$type_objet][$id_objet], ...$params);
4608
+    } // Si la fonction generer_TRUC_entite existe, on l'utilise pour formater $info_generee
4609
+    else {
4610
+        if ($generer = charger_fonction("generer_${info}_entite", '', true)) {
4611
+            $info_generee = $generer($id_objet, $type_objet, $objets[$type_objet][$id_objet], ...$params);
4612
+        } // Sinon on prend directement le champ SQL tel quel
4613
+        else {
4614
+            $info_generee = (isset($objets[$type_objet][$id_objet][$info]) ? $objets[$type_objet][$id_objet][$info] : '');
4615
+        }
4616
+    }
4617
+
4618
+    // On va ensuite appliquer les traitements automatiques si besoin
4619
+    if (!$etoile) {
4620
+        // FIXME: on fournit un ENV minimum avec id et type et connect=''
4621
+        // mais ce fonctionnement est a ameliorer !
4622
+        $info_generee = appliquer_traitement_champ($info_generee, $info, table_objet($type_objet),
4623
+            array('id_objet' => $id_objet, 'objet' => $type_objet, ''));
4624
+    }
4625
+
4626
+    return $info_generee;
4627 4627
 }
4628 4628
 
4629 4629
 /**
@@ -4656,36 +4656,36 @@  discard block
 block discarded – undo
4656 4656
  */
4657 4657
 function generer_introduction_entite($id_objet, $type_objet, $ligne_sql, $introduction_longueur = null, $longueur_ou_suite = null, $suite = null, $connect = '') {
4658 4658
 
4659
-	$descriptif = $ligne_sql['descriptif'] ?? '';
4660
-	$texte = $ligne_sql['texte'] ?? '';
4661
-	// En absence de descriptif, on se rabat sur chapo + texte
4662
-	if (isset($ligne_sql['chapo'])) {
4663
-		$chapo = $ligne_sql['chapo'];
4664
-		$texte = strlen($descriptif) ?
4665
-			'' :
4666
-			"$chapo \n\n $texte";
4667
-	}
4659
+    $descriptif = $ligne_sql['descriptif'] ?? '';
4660
+    $texte = $ligne_sql['texte'] ?? '';
4661
+    // En absence de descriptif, on se rabat sur chapo + texte
4662
+    if (isset($ligne_sql['chapo'])) {
4663
+        $chapo = $ligne_sql['chapo'];
4664
+        $texte = strlen($descriptif) ?
4665
+            '' :
4666
+            "$chapo \n\n $texte";
4667
+    }
4668 4668
 
4669
-	// Longueur en paramètre, sinon celle renseignée dans la description de l'objet, sinon valeur en dur
4670
-	if (!intval($longueur_ou_suite)) {
4671
-		$longueur = intval($introduction_longueur ?: 600);
4672
-	} else {
4673
-		$longueur = intval($longueur_ou_suite);
4674
-	}
4669
+    // Longueur en paramètre, sinon celle renseignée dans la description de l'objet, sinon valeur en dur
4670
+    if (!intval($longueur_ou_suite)) {
4671
+        $longueur = intval($introduction_longueur ?: 600);
4672
+    } else {
4673
+        $longueur = intval($longueur_ou_suite);
4674
+    }
4675 4675
 
4676
-	// On peut optionnellement passer la suite en 1er paramètre de la balise
4677
-	// Ex : #INTRODUCTION{...}
4678
-	if (
4679
-		is_null($suite)
4680
-		and !intval($longueur_ou_suite)
4681
-	) {
4682
-		$suite = $longueur_ou_suite;
4683
-	}
4676
+    // On peut optionnellement passer la suite en 1er paramètre de la balise
4677
+    // Ex : #INTRODUCTION{...}
4678
+    if (
4679
+        is_null($suite)
4680
+        and !intval($longueur_ou_suite)
4681
+    ) {
4682
+        $suite = $longueur_ou_suite;
4683
+    }
4684 4684
 
4685
-	$f = chercher_filtre('introduction');
4686
-	$introduction = $f($descriptif, $texte, $longueur, $connect, $suite);
4685
+    $f = chercher_filtre('introduction');
4686
+    $introduction = $f($descriptif, $texte, $longueur, $connect, $suite);
4687 4687
 
4688
-	return $introduction;
4688
+    return $introduction;
4689 4689
 }
4690 4690
 
4691 4691
 /**
@@ -4699,44 +4699,44 @@  discard block
 block discarded – undo
4699 4699
  * @return string
4700 4700
  */
4701 4701
 function appliquer_traitement_champ($texte, $champ, $table_objet = '', $env = array(), $connect = '') {
4702
-	if (!$champ) {
4703
-		return $texte;
4704
-	}
4702
+    if (!$champ) {
4703
+        return $texte;
4704
+    }
4705 4705
 	
4706
-	// On charge toujours les filtres de texte car la majorité des traitements les utilisent
4707
-	// et il ne faut pas partir du principe que c'est déjà chargé (form ajax, etc)
4708
-	include_spip('inc/texte');
4706
+    // On charge toujours les filtres de texte car la majorité des traitements les utilisent
4707
+    // et il ne faut pas partir du principe que c'est déjà chargé (form ajax, etc)
4708
+    include_spip('inc/texte');
4709 4709
 	
4710
-	$champ = strtoupper($champ);
4711
-	$traitements = isset($GLOBALS['table_des_traitements'][$champ]) ? $GLOBALS['table_des_traitements'][$champ] : false;
4712
-	if (!$traitements or !is_array($traitements)) {
4713
-		return $texte;
4714
-	}
4710
+    $champ = strtoupper($champ);
4711
+    $traitements = isset($GLOBALS['table_des_traitements'][$champ]) ? $GLOBALS['table_des_traitements'][$champ] : false;
4712
+    if (!$traitements or !is_array($traitements)) {
4713
+        return $texte;
4714
+    }
4715 4715
 
4716
-	$traitement = '';
4717
-	if ($table_objet and (!isset($traitements[0]) or count($traitements) > 1)) {
4718
-		// necessaire pour prendre en charge les vieux appels avec un table_objet_sql en 3e arg
4719
-		$table_objet = table_objet($table_objet);
4720
-		if (isset($traitements[$table_objet])) {
4721
-			$traitement = $traitements[$table_objet];
4722
-		}
4723
-	}
4724
-	if (!$traitement and isset($traitements[0])) {
4725
-		$traitement = $traitements[0];
4726
-	}
4727
-	// (sinon prendre le premier de la liste par defaut ?)
4716
+    $traitement = '';
4717
+    if ($table_objet and (!isset($traitements[0]) or count($traitements) > 1)) {
4718
+        // necessaire pour prendre en charge les vieux appels avec un table_objet_sql en 3e arg
4719
+        $table_objet = table_objet($table_objet);
4720
+        if (isset($traitements[$table_objet])) {
4721
+            $traitement = $traitements[$table_objet];
4722
+        }
4723
+    }
4724
+    if (!$traitement and isset($traitements[0])) {
4725
+        $traitement = $traitements[0];
4726
+    }
4727
+    // (sinon prendre le premier de la liste par defaut ?)
4728 4728
 
4729
-	if (!$traitement) {
4730
-		return $texte;
4731
-	}
4729
+    if (!$traitement) {
4730
+        return $texte;
4731
+    }
4732 4732
 
4733
-	$traitement = str_replace('%s', "'" . texte_script($texte) . "'", $traitement);
4733
+    $traitement = str_replace('%s', "'" . texte_script($texte) . "'", $traitement);
4734 4734
 
4735
-	// Fournir $connect et $Pile[0] au traitement si besoin
4736
-	$Pile = array(0 => $env);
4737
-	eval("\$texte = $traitement;");
4735
+    // Fournir $connect et $Pile[0] au traitement si besoin
4736
+    $Pile = array(0 => $env);
4737
+    eval("\$texte = $traitement;");
4738 4738
 
4739
-	return $texte;
4739
+    return $texte;
4740 4740
 }
4741 4741
 
4742 4742
 
@@ -4750,21 +4750,21 @@  discard block
 block discarded – undo
4750 4750
  * @return string
4751 4751
  */
4752 4752
 function generer_lien_entite($id_objet, $objet, $longueur = 80, $connect = null) {
4753
-	include_spip('inc/liens');
4754
-	$titre = traiter_raccourci_titre($id_objet, $objet, $connect);
4755
-	// lorsque l'objet n'est plus declare (plugin desactive par exemple)
4756
-	// le raccourcis n'est plus valide
4757
-	$titre = isset($titre['titre']) ? typo($titre['titre']) : '';
4758
-	// on essaye avec generer_info_entite ?
4759
-	if (!strlen($titre) and !$connect) {
4760
-		$titre = generer_info_entite($id_objet, $objet, 'titre');
4761
-	}
4762
-	if (!strlen($titre)) {
4763
-		$titre = _T('info_sans_titre');
4764
-	}
4765
-	$url = generer_url_entite($id_objet, $objet, '', '', $connect);
4753
+    include_spip('inc/liens');
4754
+    $titre = traiter_raccourci_titre($id_objet, $objet, $connect);
4755
+    // lorsque l'objet n'est plus declare (plugin desactive par exemple)
4756
+    // le raccourcis n'est plus valide
4757
+    $titre = isset($titre['titre']) ? typo($titre['titre']) : '';
4758
+    // on essaye avec generer_info_entite ?
4759
+    if (!strlen($titre) and !$connect) {
4760
+        $titre = generer_info_entite($id_objet, $objet, 'titre');
4761
+    }
4762
+    if (!strlen($titre)) {
4763
+        $titre = _T('info_sans_titre');
4764
+    }
4765
+    $url = generer_url_entite($id_objet, $objet, '', '', $connect);
4766 4766
 
4767
-	return "<a href='$url' class='$objet'>" . couper($titre, $longueur) . "</a>";
4767
+    return "<a href='$url' class='$objet'>" . couper($titre, $longueur) . "</a>";
4768 4768
 }
4769 4769
 
4770 4770
 
@@ -4781,15 +4781,15 @@  discard block
 block discarded – undo
4781 4781
  * @return string
4782 4782
  */
4783 4783
 function wrap($texte, $wrap) {
4784
-	$balises = extraire_balises($wrap);
4785
-	if (preg_match_all(",<([a-z]\w*)\b[^>]*>,UimsS", $wrap, $regs, PREG_PATTERN_ORDER)) {
4786
-		$texte = $wrap . $texte;
4787
-		$regs = array_reverse($regs[1]);
4788
-		$wrap = "</" . implode("></", $regs) . ">";
4789
-		$texte = $texte . $wrap;
4790
-	}
4784
+    $balises = extraire_balises($wrap);
4785
+    if (preg_match_all(",<([a-z]\w*)\b[^>]*>,UimsS", $wrap, $regs, PREG_PATTERN_ORDER)) {
4786
+        $texte = $wrap . $texte;
4787
+        $regs = array_reverse($regs[1]);
4788
+        $wrap = "</" . implode("></", $regs) . ">";
4789
+        $texte = $texte . $wrap;
4790
+    }
4791 4791
 
4792
-	return $texte;
4792
+    return $texte;
4793 4793
 }
4794 4794
 
4795 4795
 
@@ -4809,43 +4809,43 @@  discard block
 block discarded – undo
4809 4809
  * @return array|mixed|string
4810 4810
  */
4811 4811
 function filtre_print_dist($u, $join = "<br />", $indent = 0) {
4812
-	if (is_string($u)) {
4813
-		$u = typo($u);
4812
+    if (is_string($u)) {
4813
+        $u = typo($u);
4814 4814
 
4815
-		return $u;
4816
-	}
4815
+        return $u;
4816
+    }
4817 4817
 
4818
-	// caster $u en array si besoin
4819
-	if (is_object($u)) {
4820
-		$u = (array)$u;
4821
-	}
4818
+    // caster $u en array si besoin
4819
+    if (is_object($u)) {
4820
+        $u = (array)$u;
4821
+    }
4822 4822
 
4823
-	if (is_array($u)) {
4824
-		$out = "";
4825
-		// toutes les cles sont numeriques ?
4826
-		// et aucun enfant n'est un tableau
4827
-		// liste simple separee par des virgules
4828
-		$numeric_keys = array_map('is_numeric', array_keys($u));
4829
-		$array_values = array_map('is_array', $u);
4830
-		$object_values = array_map('is_object', $u);
4831
-		if (array_sum($numeric_keys) == count($numeric_keys)
4832
-			and !array_sum($array_values)
4833
-			and !array_sum($object_values)
4834
-		) {
4835
-			return join(", ", array_map('filtre_print_dist', $u));
4836
-		}
4823
+    if (is_array($u)) {
4824
+        $out = "";
4825
+        // toutes les cles sont numeriques ?
4826
+        // et aucun enfant n'est un tableau
4827
+        // liste simple separee par des virgules
4828
+        $numeric_keys = array_map('is_numeric', array_keys($u));
4829
+        $array_values = array_map('is_array', $u);
4830
+        $object_values = array_map('is_object', $u);
4831
+        if (array_sum($numeric_keys) == count($numeric_keys)
4832
+            and !array_sum($array_values)
4833
+            and !array_sum($object_values)
4834
+        ) {
4835
+            return join(", ", array_map('filtre_print_dist', $u));
4836
+        }
4837 4837
 
4838
-		// sinon on passe a la ligne et on indente
4839
-		$i_str = str_pad("", $indent, " ");
4840
-		foreach ($u as $k => $v) {
4841
-			$out .= $join . $i_str . "$k: " . filtre_print_dist($v, $join, $indent + 2);
4842
-		}
4838
+        // sinon on passe a la ligne et on indente
4839
+        $i_str = str_pad("", $indent, " ");
4840
+        foreach ($u as $k => $v) {
4841
+            $out .= $join . $i_str . "$k: " . filtre_print_dist($v, $join, $indent + 2);
4842
+        }
4843 4843
 
4844
-		return $out;
4845
-	}
4844
+        return $out;
4845
+    }
4846 4846
 
4847
-	// on sait pas quoi faire...
4848
-	return $u;
4847
+    // on sait pas quoi faire...
4848
+    return $u;
4849 4849
 }
4850 4850
 
4851 4851
 
@@ -4858,10 +4858,10 @@  discard block
 block discarded – undo
4858 4858
  * @return string|array
4859 4859
  */
4860 4860
 function objet_info($objet, $info) {
4861
-	$table = table_objet_sql($objet);
4862
-	$infos = lister_tables_objets_sql($table);
4861
+    $table = table_objet_sql($objet);
4862
+    $infos = lister_tables_objets_sql($table);
4863 4863
 
4864
-	return (isset($infos[$info]) ? $infos[$info] : '');
4864
+    return (isset($infos[$info]) ? $infos[$info] : '');
4865 4865
 }
4866 4866
 
4867 4867
 /**
@@ -4876,11 +4876,11 @@  discard block
 block discarded – undo
4876 4876
  *     Texte traduit du comptage, tel que '3 articles'
4877 4877
  */
4878 4878
 function objet_afficher_nb($nb, $objet) {
4879
-	if (!$nb) {
4880
-		return _T(objet_info($objet, 'info_aucun_objet'));
4881
-	} else {
4882
-		return _T(objet_info($objet, $nb == 1 ? 'info_1_objet' : 'info_nb_objets'), array('nb' => $nb));
4883
-	}
4879
+    if (!$nb) {
4880
+        return _T(objet_info($objet, 'info_aucun_objet'));
4881
+    } else {
4882
+        return _T(objet_info($objet, $nb == 1 ? 'info_1_objet' : 'info_nb_objets'), array('nb' => $nb));
4883
+    }
4884 4884
 }
4885 4885
 
4886 4886
 /**
@@ -4892,11 +4892,11 @@  discard block
 block discarded – undo
4892 4892
  * @return string
4893 4893
  */
4894 4894
 function objet_icone($objet, $taille = 24, $class='') {
4895
-	$icone = objet_info($objet, 'icone_objet') . "-" . $taille . ".png";
4896
-	$icone = chemin_image($icone);
4897
-	$balise_img = charger_filtre('balise_img');
4895
+    $icone = objet_info($objet, 'icone_objet') . "-" . $taille . ".png";
4896
+    $icone = chemin_image($icone);
4897
+    $balise_img = charger_filtre('balise_img');
4898 4898
 
4899
-	return $icone ? $balise_img($icone, _T(objet_info($objet, 'texte_objet')), $class, $taille) : '';
4899
+    return $icone ? $balise_img($icone, _T(objet_info($objet, 'texte_objet')), $class, $taille) : '';
4900 4900
 }
4901 4901
 
4902 4902
 /**
@@ -4917,12 +4917,12 @@  discard block
 block discarded – undo
4917 4917
  * @return string
4918 4918
  */
4919 4919
 function objet_T($objet, $chaine, $args = array(), $options = array()){
4920
-	$chaine = explode(':',$chaine);
4921
-	if ($t = _T($objet . ':' . end($chaine), $args, array_merge($options, array('force'=>false)))) {
4922
-		return $t;
4923
-	}
4924
-	$chaine = implode(':',$chaine);
4925
-	return _T($chaine, $args, $options);
4920
+    $chaine = explode(':',$chaine);
4921
+    if ($t = _T($objet . ':' . end($chaine), $args, array_merge($options, array('force'=>false)))) {
4922
+        return $t;
4923
+    }
4924
+    $chaine = implode(':',$chaine);
4925
+    return _T($chaine, $args, $options);
4926 4926
 }
4927 4927
 
4928 4928
 /**
@@ -4936,17 +4936,17 @@  discard block
 block discarded – undo
4936 4936
  * @return string      Code HTML
4937 4937
  */
4938 4938
 function insert_head_css_conditionnel($flux) {
4939
-	if (strpos($flux, '<!-- insert_head_css -->') === false
4940
-		and $p = strpos($flux, '<!-- insert_head -->')
4941
-	) {
4942
-		// plutot avant le premier js externe (jquery) pour etre non bloquant
4943
-		if ($p1 = stripos($flux, '<script src=') and $p1 < $p) {
4944
-			$p = $p1;
4945
-		}
4946
-		$flux = substr_replace($flux, pipeline('insert_head_css', '<!-- insert_head_css -->'), $p, 0);
4947
-	}
4939
+    if (strpos($flux, '<!-- insert_head_css -->') === false
4940
+        and $p = strpos($flux, '<!-- insert_head -->')
4941
+    ) {
4942
+        // plutot avant le premier js externe (jquery) pour etre non bloquant
4943
+        if ($p1 = stripos($flux, '<script src=') and $p1 < $p) {
4944
+            $p = $p1;
4945
+        }
4946
+        $flux = substr_replace($flux, pipeline('insert_head_css', '<!-- insert_head_css -->'), $p, 0);
4947
+    }
4948 4948
 
4949
-	return $flux;
4949
+    return $flux;
4950 4950
 }
4951 4951
 
4952 4952
 /**
@@ -4969,69 +4969,69 @@  discard block
 block discarded – undo
4969 4969
  * @return string
4970 4970
  */
4971 4971
 function produire_fond_statique($fond, $contexte = array(), $options = array(), $connect = '') {
4972
-	if (isset($contexte['format'])) {
4973
-		$extension = $contexte['format'];
4974
-		unset($contexte['format']);
4975
-	} else {
4976
-		$extension = 'html';
4977
-		if (preg_match(',[.](css|js|json|xml|svg)$,', $fond, $m)) {
4978
-			$extension = $m[1];
4979
-		}
4980
-	}
4981
-	// recuperer le contenu produit par le squelette
4982
-	$options['raw'] = true;
4983
-	$cache = recuperer_fond($fond, $contexte, $options, $connect);
4984
-
4985
-	// calculer le nom de la css
4986
-	$dir_var = sous_repertoire(_DIR_VAR, 'cache-' . $extension);
4987
-	$nom_safe = preg_replace(",\W,", '_', str_replace('.', '_', $fond));
4988
-	$contexte_implicite = calculer_contexte_implicite();
4989
-
4990
-	// par defaut on hash selon les contextes qui sont a priori moins variables
4991
-	// mais on peut hasher selon le contenu a la demande, si plusieurs contextes produisent un meme contenu
4992
-	// reduit la variabilite du nom et donc le nombre de css concatenees possibles in fine
4993
-	if (isset($options['hash_on_content']) and $options['hash_on_content']) {
4994
-		$hash = md5($contexte_implicite['host'] . '::'. $cache);
4995
-	}
4996
-	else {
4997
-		unset($contexte_implicite['notes']); // pas pertinent pour signaler un changeemnt de contenu pour des css/js
4998
-		ksort($contexte);
4999
-		$hash = md5($fond . json_encode($contexte_implicite) . json_encode($contexte) . $connect);
5000
-	}
5001
-	$filename = $dir_var . $extension . "dyn-$nom_safe-" . substr($hash, 0, 8) . ".$extension";
5002
-
5003
-	// mettre a jour le fichier si il n'existe pas
5004
-	// ou trop ancien
5005
-	// le dernier fichier produit est toujours suffixe par .last
5006
-	// et recopie sur le fichier cible uniquement si il change
5007
-	if (!file_exists($filename)
5008
-		or !file_exists($filename . ".last")
5009
-		or (isset($cache['lastmodified']) and $cache['lastmodified'] and filemtime($filename . ".last") < $cache['lastmodified'])
5010
-		or (defined('_VAR_MODE') and _VAR_MODE == 'recalcul')
5011
-	) {
5012
-		$contenu = $cache['texte'];
5013
-		// passer les urls en absolu si c'est une css
5014
-		if ($extension == "css") {
5015
-			$contenu = urls_absolues_css($contenu,
5016
-				test_espace_prive() ? generer_url_ecrire('accueil') : generer_url_public($fond));
5017
-		}
5018
-
5019
-		$comment = '';
5020
-		// ne pas insérer de commentaire sur certains formats
5021
-		if (!in_array($extension, ['json', 'xml', 'svg'])) {
5022
-			$comment = "/* #PRODUIRE{fond=$fond";
5023
-			foreach ($contexte as $k => $v) {
5024
-				$comment .= ",$k=$v";
5025
-			}
5026
-			// pas de date dans le commentaire car sinon ca invalide le md5 et force la maj
5027
-			// mais on peut mettre un md5 du contenu, ce qui donne un aperu rapide si la feuille a change ou non
5028
-			$comment .= "}\n   md5:" . md5($contenu) . " */\n";
5029
-		}
5030
-		// et ecrire le fichier si il change
5031
-		ecrire_fichier_calcule_si_modifie($filename, $comment . $contenu, false, true);
5032
-	}
5033
-
5034
-	return timestamp($filename);
4972
+    if (isset($contexte['format'])) {
4973
+        $extension = $contexte['format'];
4974
+        unset($contexte['format']);
4975
+    } else {
4976
+        $extension = 'html';
4977
+        if (preg_match(',[.](css|js|json|xml|svg)$,', $fond, $m)) {
4978
+            $extension = $m[1];
4979
+        }
4980
+    }
4981
+    // recuperer le contenu produit par le squelette
4982
+    $options['raw'] = true;
4983
+    $cache = recuperer_fond($fond, $contexte, $options, $connect);
4984
+
4985
+    // calculer le nom de la css
4986
+    $dir_var = sous_repertoire(_DIR_VAR, 'cache-' . $extension);
4987
+    $nom_safe = preg_replace(",\W,", '_', str_replace('.', '_', $fond));
4988
+    $contexte_implicite = calculer_contexte_implicite();
4989
+
4990
+    // par defaut on hash selon les contextes qui sont a priori moins variables
4991
+    // mais on peut hasher selon le contenu a la demande, si plusieurs contextes produisent un meme contenu
4992
+    // reduit la variabilite du nom et donc le nombre de css concatenees possibles in fine
4993
+    if (isset($options['hash_on_content']) and $options['hash_on_content']) {
4994
+        $hash = md5($contexte_implicite['host'] . '::'. $cache);
4995
+    }
4996
+    else {
4997
+        unset($contexte_implicite['notes']); // pas pertinent pour signaler un changeemnt de contenu pour des css/js
4998
+        ksort($contexte);
4999
+        $hash = md5($fond . json_encode($contexte_implicite) . json_encode($contexte) . $connect);
5000
+    }
5001
+    $filename = $dir_var . $extension . "dyn-$nom_safe-" . substr($hash, 0, 8) . ".$extension";
5002
+
5003
+    // mettre a jour le fichier si il n'existe pas
5004
+    // ou trop ancien
5005
+    // le dernier fichier produit est toujours suffixe par .last
5006
+    // et recopie sur le fichier cible uniquement si il change
5007
+    if (!file_exists($filename)
5008
+        or !file_exists($filename . ".last")
5009
+        or (isset($cache['lastmodified']) and $cache['lastmodified'] and filemtime($filename . ".last") < $cache['lastmodified'])
5010
+        or (defined('_VAR_MODE') and _VAR_MODE == 'recalcul')
5011
+    ) {
5012
+        $contenu = $cache['texte'];
5013
+        // passer les urls en absolu si c'est une css
5014
+        if ($extension == "css") {
5015
+            $contenu = urls_absolues_css($contenu,
5016
+                test_espace_prive() ? generer_url_ecrire('accueil') : generer_url_public($fond));
5017
+        }
5018
+
5019
+        $comment = '';
5020
+        // ne pas insérer de commentaire sur certains formats
5021
+        if (!in_array($extension, ['json', 'xml', 'svg'])) {
5022
+            $comment = "/* #PRODUIRE{fond=$fond";
5023
+            foreach ($contexte as $k => $v) {
5024
+                $comment .= ",$k=$v";
5025
+            }
5026
+            // pas de date dans le commentaire car sinon ca invalide le md5 et force la maj
5027
+            // mais on peut mettre un md5 du contenu, ce qui donne un aperu rapide si la feuille a change ou non
5028
+            $comment .= "}\n   md5:" . md5($contenu) . " */\n";
5029
+        }
5030
+        // et ecrire le fichier si il change
5031
+        ecrire_fichier_calcule_si_modifie($filename, $comment . $contenu, false, true);
5032
+    }
5033
+
5034
+    return timestamp($filename);
5035 5035
 }
5036 5036
 
5037 5037
 /**
@@ -5044,14 +5044,14 @@  discard block
 block discarded – undo
5044 5044
  *    $fichier auquel on a ajouté le timestamp
5045 5045
  */
5046 5046
 function timestamp($fichier) {
5047
-	if (!$fichier
5048
-		or !file_exists($fichier)
5049
-		or !$m = filemtime($fichier)
5050
-	) {
5051
-		return $fichier;
5052
-	}
5047
+    if (!$fichier
5048
+        or !file_exists($fichier)
5049
+        or !$m = filemtime($fichier)
5050
+    ) {
5051
+        return $fichier;
5052
+    }
5053 5053
 
5054
-	return "$fichier?$m";
5054
+    return "$fichier?$m";
5055 5055
 }
5056 5056
 
5057 5057
 /**
@@ -5061,11 +5061,11 @@  discard block
 block discarded – undo
5061 5061
  * @return string
5062 5062
  */
5063 5063
 function supprimer_timestamp($url) {
5064
-	if (strpos($url, "?") === false) {
5065
-		return $url;
5066
-	}
5064
+    if (strpos($url, "?") === false) {
5065
+        return $url;
5066
+    }
5067 5067
 
5068
-	return preg_replace(",\?[[:digit:]]+$,", "", $url);
5068
+    return preg_replace(",\?[[:digit:]]+$,", "", $url);
5069 5069
 }
5070 5070
 
5071 5071
 /**
@@ -5080,9 +5080,9 @@  discard block
 block discarded – undo
5080 5080
  * @return string
5081 5081
  */
5082 5082
 function filtre_nettoyer_titre_email_dist($titre) {
5083
-	include_spip('inc/envoyer_mail');
5083
+    include_spip('inc/envoyer_mail');
5084 5084
 
5085
-	return nettoyer_titre_email($titre);
5085
+    return nettoyer_titre_email($titre);
5086 5086
 }
5087 5087
 
5088 5088
 /**
@@ -5104,19 +5104,19 @@  discard block
 block discarded – undo
5104 5104
  * @return string
5105 5105
  */
5106 5106
 function filtre_chercher_rubrique_dist(
5107
-	$titre,
5108
-	$id_objet,
5109
-	$id_parent,
5110
-	$objet,
5111
-	$id_secteur,
5112
-	$restreint,
5113
-	$actionable = false,
5114
-	$retour_sans_cadre = false
5107
+    $titre,
5108
+    $id_objet,
5109
+    $id_parent,
5110
+    $objet,
5111
+    $id_secteur,
5112
+    $restreint,
5113
+    $actionable = false,
5114
+    $retour_sans_cadre = false
5115 5115
 ) {
5116
-	include_spip('inc/filtres_ecrire');
5116
+    include_spip('inc/filtres_ecrire');
5117 5117
 
5118
-	return chercher_rubrique($titre, $id_objet, $id_parent, $objet, $id_secteur, $restreint, $actionable,
5119
-		$retour_sans_cadre);
5118
+    return chercher_rubrique($titre, $id_objet, $id_parent, $objet, $id_secteur, $restreint, $actionable,
5119
+        $retour_sans_cadre);
5120 5120
 }
5121 5121
 
5122 5122
 /**
@@ -5145,56 +5145,56 @@  discard block
 block discarded – undo
5145 5145
  *     Chaîne vide si l'accès est autorisé
5146 5146
  */
5147 5147
 function sinon_interdire_acces($ok = false, $url = '', $statut = 0, $message = null) {
5148
-	if ($ok) {
5149
-		return '';
5150
-	}
5151
-
5152
-	// Vider tous les tampons
5153
-	$level = @ob_get_level();
5154
-	while ($level--) {
5155
-		@ob_end_clean();
5156
-	}
5157
-
5158
-	include_spip('inc/headers');
5159
-
5160
-	// S'il y a une URL, on redirige (si pas de statut, la fonction mettra 302 par défaut)
5161
-	if ($url) {
5162
-		redirige_par_entete($url, '', $statut);
5163
-	}
5164
-
5165
-	// ecriture simplifiee avec message en 3eme argument (= statut 403)
5166
-	if (!is_numeric($statut) and is_null($message)) {
5167
-		$message = $statut;
5168
-		$statut = 0;
5169
-	}
5170
-	if (!$message) {
5171
-		$message = '';
5172
-	}
5173
-	$statut = intval($statut);
5174
-
5175
-	// Si on est dans l'espace privé, on génère du 403 Forbidden par defaut ou du 404
5176
-	if (test_espace_prive()) {
5177
-		if (!$statut or !in_array($statut, array(404, 403))) {
5178
-			$statut = 403;
5179
-		}
5180
-		http_status(403);
5181
-		$echec = charger_fonction('403', 'exec');
5182
-		$echec($message);
5183
-	} else {
5184
-		// Sinon dans l'espace public on redirige vers une 404 par défaut, car elle toujours présente normalement
5185
-		if (!$statut) {
5186
-			$statut = 404;
5187
-		}
5188
-		// Dans tous les cas on modifie l'entité avec ce qui est demandé
5189
-		http_status($statut);
5190
-		// Si le statut est une erreur et qu'il n'y a pas de redirection on va chercher le squelette du même nom
5191
-		if ($statut >= 400) {
5192
-			echo recuperer_fond("$statut", array('erreur' => $message));
5193
-		}
5194
-	}
5195
-
5196
-
5197
-	exit;
5148
+    if ($ok) {
5149
+        return '';
5150
+    }
5151
+
5152
+    // Vider tous les tampons
5153
+    $level = @ob_get_level();
5154
+    while ($level--) {
5155
+        @ob_end_clean();
5156
+    }
5157
+
5158
+    include_spip('inc/headers');
5159
+
5160
+    // S'il y a une URL, on redirige (si pas de statut, la fonction mettra 302 par défaut)
5161
+    if ($url) {
5162
+        redirige_par_entete($url, '', $statut);
5163
+    }
5164
+
5165
+    // ecriture simplifiee avec message en 3eme argument (= statut 403)
5166
+    if (!is_numeric($statut) and is_null($message)) {
5167
+        $message = $statut;
5168
+        $statut = 0;
5169
+    }
5170
+    if (!$message) {
5171
+        $message = '';
5172
+    }
5173
+    $statut = intval($statut);
5174
+
5175
+    // Si on est dans l'espace privé, on génère du 403 Forbidden par defaut ou du 404
5176
+    if (test_espace_prive()) {
5177
+        if (!$statut or !in_array($statut, array(404, 403))) {
5178
+            $statut = 403;
5179
+        }
5180
+        http_status(403);
5181
+        $echec = charger_fonction('403', 'exec');
5182
+        $echec($message);
5183
+    } else {
5184
+        // Sinon dans l'espace public on redirige vers une 404 par défaut, car elle toujours présente normalement
5185
+        if (!$statut) {
5186
+            $statut = 404;
5187
+        }
5188
+        // Dans tous les cas on modifie l'entité avec ce qui est demandé
5189
+        http_status($statut);
5190
+        // Si le statut est une erreur et qu'il n'y a pas de redirection on va chercher le squelette du même nom
5191
+        if ($statut >= 400) {
5192
+            echo recuperer_fond("$statut", array('erreur' => $message));
5193
+        }
5194
+    }
5195
+
5196
+
5197
+    exit;
5198 5198
 }
5199 5199
 
5200 5200
 /**
@@ -5205,11 +5205,11 @@  discard block
 block discarded – undo
5205 5205
  * @return string
5206 5206
  */
5207 5207
 function filtre_compacte_dist($source, $format = null) {
5208
-	if (function_exists('compacte')) {
5209
-		return compacte($source, $format);
5210
-	}
5208
+    if (function_exists('compacte')) {
5209
+        return compacte($source, $format);
5210
+    }
5211 5211
 
5212
-	return $source;
5212
+    return $source;
5213 5213
 }
5214 5214
 
5215 5215
 
@@ -5221,31 +5221,31 @@  discard block
 block discarded – undo
5221 5221
  * @return string
5222 5222
  */
5223 5223
 function spip_affiche_mot_de_passe_masque($passe, $afficher_partiellement = false, $portion_pourcent = null) {
5224
-	$l = strlen($passe);
5225
-
5226
-	if ($l<=8 or !$afficher_partiellement){
5227
-		if (!$l) {
5228
-			return ''; // montrer qu'il y a pas de mot de passe si il y en a pas
5229
-		}
5230
-		return str_pad('',$afficher_partiellement ? $l : 16,'*');
5231
-	}
5232
-
5233
-	if (is_null($portion_pourcent)) {
5234
-		if (!defined('_SPIP_AFFICHE_MOT_DE_PASSE_MASQUE_PERCENT')) {
5235
-			define('_SPIP_AFFICHE_MOT_DE_PASSE_MASQUE_PERCENT', 20); // 20%
5236
-		}
5237
-		$portion_pourcent = _SPIP_AFFICHE_MOT_DE_PASSE_MASQUE_PERCENT;
5238
-	}
5239
-	if ($portion_pourcent >= 100) {
5240
-		return $passe;
5241
-	}
5242
-	$e = intval(ceil($l * $portion_pourcent / 100 / 2));
5243
-	$e = max($e, 0);
5244
-	$mid = str_pad('',$l-2*$e,'*');
5245
-	if ($e>0 and strlen($mid)>8){
5246
-		$mid = '***...***';
5247
-	}
5248
-	return substr($passe,0,$e) . $mid . ($e > 0 ? substr($passe,-$e) : '');
5224
+    $l = strlen($passe);
5225
+
5226
+    if ($l<=8 or !$afficher_partiellement){
5227
+        if (!$l) {
5228
+            return ''; // montrer qu'il y a pas de mot de passe si il y en a pas
5229
+        }
5230
+        return str_pad('',$afficher_partiellement ? $l : 16,'*');
5231
+    }
5232
+
5233
+    if (is_null($portion_pourcent)) {
5234
+        if (!defined('_SPIP_AFFICHE_MOT_DE_PASSE_MASQUE_PERCENT')) {
5235
+            define('_SPIP_AFFICHE_MOT_DE_PASSE_MASQUE_PERCENT', 20); // 20%
5236
+        }
5237
+        $portion_pourcent = _SPIP_AFFICHE_MOT_DE_PASSE_MASQUE_PERCENT;
5238
+    }
5239
+    if ($portion_pourcent >= 100) {
5240
+        return $passe;
5241
+    }
5242
+    $e = intval(ceil($l * $portion_pourcent / 100 / 2));
5243
+    $e = max($e, 0);
5244
+    $mid = str_pad('',$l-2*$e,'*');
5245
+    if ($e>0 and strlen($mid)>8){
5246
+        $mid = '***...***';
5247
+    }
5248
+    return substr($passe,0,$e) . $mid . ($e > 0 ? substr($passe,-$e) : '');
5249 5249
 }
5250 5250
 
5251 5251
 
@@ -5266,64 +5266,64 @@  discard block
 block discarded – undo
5266 5266
  */
5267 5267
 function identifiant_slug($texte, $type = '', $options = array()) {
5268 5268
 
5269
-	$original = $texte;
5270
-	$separateur = (isset($options['separateur'])?$options['separateur']:'_');
5271
-	$longueur_maxi = (isset($options['longueur_maxi'])?$options['longueur_maxi']:60);
5272
-	$longueur_mini = (isset($options['longueur_mini'])?$options['longueur_mini']:0);
5269
+    $original = $texte;
5270
+    $separateur = (isset($options['separateur'])?$options['separateur']:'_');
5271
+    $longueur_maxi = (isset($options['longueur_maxi'])?$options['longueur_maxi']:60);
5272
+    $longueur_mini = (isset($options['longueur_mini'])?$options['longueur_mini']:0);
5273 5273
 
5274
-	if (!function_exists('translitteration')) {
5275
-		include_spip('inc/charsets');
5276
-	}
5274
+    if (!function_exists('translitteration')) {
5275
+        include_spip('inc/charsets');
5276
+    }
5277 5277
 
5278
-	// pas de balise html
5279
-	if (strpos($texte, '<') !== false) {
5280
-		$texte = strip_tags($texte);
5281
-	}
5282
-	if (strpos($texte, '&') !== false) {
5283
-		$texte = unicode2charset($texte);
5284
-	}
5285
-	// On enlève les espaces indésirables
5286
-	$texte = trim($texte);
5278
+    // pas de balise html
5279
+    if (strpos($texte, '<') !== false) {
5280
+        $texte = strip_tags($texte);
5281
+    }
5282
+    if (strpos($texte, '&') !== false) {
5283
+        $texte = unicode2charset($texte);
5284
+    }
5285
+    // On enlève les espaces indésirables
5286
+    $texte = trim($texte);
5287 5287
 
5288
-	// On enlève les accents et cie
5289
-	$texte = translitteration($texte);
5288
+    // On enlève les accents et cie
5289
+    $texte = translitteration($texte);
5290 5290
 
5291
-	// On remplace tout ce qui n'est pas un mot par un séparateur
5292
-	$texte = preg_replace(',[\W_]+,ms', $separateur, $texte);
5291
+    // On remplace tout ce qui n'est pas un mot par un séparateur
5292
+    $texte = preg_replace(',[\W_]+,ms', $separateur, $texte);
5293 5293
 
5294
-	// nettoyer les doubles occurences du separateur si besoin
5295
-	while (strpos($texte, "$separateur$separateur") !== false) {
5296
-		$texte = str_replace("$separateur$separateur", $separateur, $texte);
5297
-	}
5294
+    // nettoyer les doubles occurences du separateur si besoin
5295
+    while (strpos($texte, "$separateur$separateur") !== false) {
5296
+        $texte = str_replace("$separateur$separateur", $separateur, $texte);
5297
+    }
5298 5298
 
5299
-	// pas de separateur au debut ni a la fin
5300
-	$texte = trim($texte, $separateur);
5299
+    // pas de separateur au debut ni a la fin
5300
+    $texte = trim($texte, $separateur);
5301 5301
 
5302
-	// en minuscules
5303
-	$texte = strtolower($texte);
5302
+    // en minuscules
5303
+    $texte = strtolower($texte);
5304 5304
 
5305
-	switch ($type) {
5306
-		case 'class':
5307
-		case 'id':
5308
-		case 'anchor':
5309
-			if (preg_match(',^\d,', $texte)) {
5310
-				$texte = substr($type, 0, 1).$texte;
5311
-			}
5312
-	}
5305
+    switch ($type) {
5306
+        case 'class':
5307
+        case 'id':
5308
+        case 'anchor':
5309
+            if (preg_match(',^\d,', $texte)) {
5310
+                $texte = substr($type, 0, 1).$texte;
5311
+            }
5312
+    }
5313 5313
 
5314
-	if (strlen($texte)>$longueur_maxi) {
5315
-		$texte = substr($texte, 0, $longueur_maxi);
5316
-	}
5314
+    if (strlen($texte)>$longueur_maxi) {
5315
+        $texte = substr($texte, 0, $longueur_maxi);
5316
+    }
5317 5317
 
5318
-	if (strlen($texte) < $longueur_mini and $longueur_mini < $longueur_maxi) {
5319
-		if (preg_match(',^\d,', $texte)) {
5320
-			$texte = ($type ? substr($type,0,1) : "s") . $texte;
5321
-		}
5322
-		$texte .= $separateur . md5($original);
5323
-		$texte = substr($texte, 0, $longueur_mini);
5324
-	}
5318
+    if (strlen($texte) < $longueur_mini and $longueur_mini < $longueur_maxi) {
5319
+        if (preg_match(',^\d,', $texte)) {
5320
+            $texte = ($type ? substr($type,0,1) : "s") . $texte;
5321
+        }
5322
+        $texte .= $separateur . md5($original);
5323
+        $texte = substr($texte, 0, $longueur_mini);
5324
+    }
5325 5325
 
5326
-	return $texte;
5326
+    return $texte;
5327 5327
 }
5328 5328
 
5329 5329
 
@@ -5344,14 +5344,14 @@  discard block
 block discarded – undo
5344 5344
  * @exemple `<:info_maximum|label_nettoyer:>`
5345 5345
  */
5346 5346
 function label_nettoyer(string $text, bool $ucfirst = true) : string {
5347
-	$label = rtrim($text, " : \t\n\r\0\x0B\xc2\xa0");
5348
-	if ($label and $label[-1] === ';') {
5349
-		$label = preg_replace("#(\&nbsp;)+$#", "", $label);
5350
-	}
5351
-	if ($ucfirst) {
5352
-		$label = spip_ucfirst($label);
5353
-	}
5354
-	return $label;
5347
+    $label = rtrim($text, " : \t\n\r\0\x0B\xc2\xa0");
5348
+    if ($label and $label[-1] === ';') {
5349
+        $label = preg_replace("#(\&nbsp;)+$#", "", $label);
5350
+    }
5351
+    if ($ucfirst) {
5352
+        $label = spip_ucfirst($label);
5353
+    }
5354
+    return $label;
5355 5355
 }
5356 5356
 
5357 5357
 /**
@@ -5364,8 +5364,8 @@  discard block
 block discarded – undo
5364 5364
  * @exemple `<:info_maximum|label_ponctuer:>`
5365 5365
  */
5366 5366
 function label_ponctuer(string $text, bool $ucfirst = true) : string {
5367
-	$label = label_nettoyer($text, $ucfirst);
5368
-	return _T('label_ponctuer', ['label' => $label]);
5367
+    $label = label_nettoyer($text, $ucfirst);
5368
+    return _T('label_ponctuer', ['label' => $label]);
5369 5369
 }
5370 5370
 
5371 5371
 
@@ -5378,19 +5378,19 @@  discard block
 block discarded – undo
5378 5378
  * @return array
5379 5379
  */
5380 5380
 function helper_filtre_objet_lister_enfants_ou_parents($objet, $id_objet, $fonction) {
5381
-	if (!in_array($fonction, ['objet_lister_parents', 'objet_lister_enfants', 'objet_lister_parents_par_type', 'objet_lister_enfants_par_type'])) {
5382
-		return [];
5383
-	}
5381
+    if (!in_array($fonction, ['objet_lister_parents', 'objet_lister_enfants', 'objet_lister_parents_par_type', 'objet_lister_enfants_par_type'])) {
5382
+        return [];
5383
+    }
5384 5384
 
5385
-	// compatibilite signature inversee
5386
-	if (is_numeric($objet) and !is_numeric($id_objet)) {
5387
-		list($objet, $id_objet) = [$id_objet, $objet];
5388
-	}
5385
+    // compatibilite signature inversee
5386
+    if (is_numeric($objet) and !is_numeric($id_objet)) {
5387
+        list($objet, $id_objet) = [$id_objet, $objet];
5388
+    }
5389 5389
 
5390
-	if (!function_exists($fonction)) {
5391
-		include_spip('base/objets');
5392
-	}
5393
-	return $fonction($objet, $id_objet);
5390
+    if (!function_exists($fonction)) {
5391
+        include_spip('base/objets');
5392
+    }
5393
+    return $fonction($objet, $id_objet);
5394 5394
 }
5395 5395
 
5396 5396
 
@@ -5405,7 +5405,7 @@  discard block
 block discarded – undo
5405 5405
  * @return array
5406 5406
  */
5407 5407
 function filtre_objet_lister_parents_dist($objet, $id_objet) {
5408
-	return helper_filtre_objet_lister_enfants_ou_parents($objet, $id_objet, 'objet_lister_parents');
5408
+    return helper_filtre_objet_lister_enfants_ou_parents($objet, $id_objet, 'objet_lister_parents');
5409 5409
 }
5410 5410
 
5411 5411
 /**
@@ -5419,7 +5419,7 @@  discard block
 block discarded – undo
5419 5419
  * @return array
5420 5420
  */
5421 5421
 function filtre_objet_lister_parents_par_type_dist($objet, $id_objet) {
5422
-	return helper_filtre_objet_lister_enfants_ou_parents($objet, $id_objet, 'objet_lister_parents_par_type');
5422
+    return helper_filtre_objet_lister_enfants_ou_parents($objet, $id_objet, 'objet_lister_parents_par_type');
5423 5423
 }
5424 5424
 
5425 5425
 /**
@@ -5433,7 +5433,7 @@  discard block
 block discarded – undo
5433 5433
  * @return array
5434 5434
  */
5435 5435
 function filtre_objet_lister_enfants_dist($objet, $id_objet) {
5436
-	return helper_filtre_objet_lister_enfants_ou_parents($objet, $id_objet, 'objet_lister_enfants');
5436
+    return helper_filtre_objet_lister_enfants_ou_parents($objet, $id_objet, 'objet_lister_enfants');
5437 5437
 }
5438 5438
 
5439 5439
 /**
@@ -5447,6 +5447,6 @@  discard block
 block discarded – undo
5447 5447
  * @return array
5448 5448
  */
5449 5449
 function filtre_objet_lister_enfants_par_type_dist($objet, $id_objet) {
5450
-	return helper_filtre_objet_lister_enfants_ou_parents($objet, $id_objet, 'objet_lister_enfants_par_type');
5450
+    return helper_filtre_objet_lister_enfants_ou_parents($objet, $id_objet, 'objet_lister_enfants_par_type');
5451 5451
 }
5452 5452
 
Please login to merge, or discard this patch.
ecrire/lang/spip_fr.php 1 patch
Indentation   +668 added lines, -668 removed lines patch added patch discarded remove patch
@@ -2,247 +2,247 @@  discard block
 block discarded – undo
2 2
 // This is a SPIP language file  --  Ceci est un fichier langue de SPIP
3 3
 // Fichier source, a modifier dans https://git.spip.net/spip/spip.git
4 4
 if (!defined('_ECRIRE_INC_VERSION')) {
5
-	return;
5
+    return;
6 6
 }
7 7
 
8 8
 $GLOBALS[$GLOBALS['idx_lang']] = array(
9 9
 
10
-	// A
11
-	'access_interface_graphique' => 'Retour à l’interface graphique complète',
12
-	'access_mode_texte' => 'Afficher l’interface textuelle simplifiée',
13
-	'admin_debug' => 'debug',
14
-	'admin_modifier_article' => 'Modifier cet article',
15
-	'admin_modifier_auteur' => 'Modifier cet auteur',
16
-	'admin_modifier_breve' => 'Modifier cette brève',
17
-	'admin_modifier_mot' => 'Modifier ce mot-clé',
18
-	'admin_modifier_rubrique' => 'Modifier cette rubrique',
19
-	'admin_recalculer' => 'Recalculer cette page',
20
-	'afficher_calendrier' => 'Afficher le calendrier',
21
-	'afficher_trad' => 'afficher les traductions',
22
-	'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. Veuillez contacter votre hébergeur.',
23
-	'alerte_modif_info_concourante' => 'ATTENTION : Cette information a été modifiée par ailleurs. La valeur actuelle est :',
24
-	'analyse_xml' => 'Analyse XML',
25
-	'annuler' => 'Annuler',
26
-	'antispam_champ_vide' => 'Veuillez laisser ce champ vide :',
27
-	'articles_recents' => 'Articles les plus récents',
28
-	'attention_champ_mini_nb_caractères' => 'Attention ! @nb@ caractères au minimum',
29
-	'avis_1_erreur_saisie' => 'Il y a 1 erreur dans votre saisie, veuillez vérifier les informations.',
30
-	'avis_archive_incorrect' => 'le fichier archive n’est pas un fichier SPIP',
31
-	'avis_archive_invalide' => 'le fichier archive n’est pas valide',
32
-	'avis_attention' => 'ATTENTION !',
33
-	'avis_champ_incorrect_type_objet' => 'Nom de champ incorrect @name@ pour objet de type @type@',
34
-	'avis_colonne_inexistante' => 'La colonne @col@ n’existe pas',
35
-	'avis_erreur' => 'Erreur : voir ci-dessous',
36
-	'avis_erreur_connexion' => 'Erreur de connexion',
37
-	'avis_erreur_cookie' => 'problème de cookie',
38
-	'avis_erreur_fonction_contexte' => 'Erreur de programmation. Cette fonction ne doit pas être appelée dans ce contexte.',
39
-	'avis_erreur_mysql' => 'Erreur SQL',
40
-	'avis_erreur_sauvegarde' => 'Erreur dans la sauvegarde (@type@ @id_objet@) !',
41
-	'avis_erreur_visiteur' => 'Problème d’accès à l’espace privé',
42
-	'avis_nb_erreurs_saisie' => 'Il y a @nb@ erreurs dans votre saisie, veuillez vérifier les informations.',
10
+    // A
11
+    'access_interface_graphique' => 'Retour à l’interface graphique complète',
12
+    'access_mode_texte' => 'Afficher l’interface textuelle simplifiée',
13
+    'admin_debug' => 'debug',
14
+    'admin_modifier_article' => 'Modifier cet article',
15
+    'admin_modifier_auteur' => 'Modifier cet auteur',
16
+    'admin_modifier_breve' => 'Modifier cette brève',
17
+    'admin_modifier_mot' => 'Modifier ce mot-clé',
18
+    'admin_modifier_rubrique' => 'Modifier cette rubrique',
19
+    'admin_recalculer' => 'Recalculer cette page',
20
+    'afficher_calendrier' => 'Afficher le calendrier',
21
+    'afficher_trad' => 'afficher les traductions',
22
+    '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. Veuillez contacter votre hébergeur.',
23
+    'alerte_modif_info_concourante' => 'ATTENTION : Cette information a été modifiée par ailleurs. La valeur actuelle est :',
24
+    'analyse_xml' => 'Analyse XML',
25
+    'annuler' => 'Annuler',
26
+    'antispam_champ_vide' => 'Veuillez laisser ce champ vide :',
27
+    'articles_recents' => 'Articles les plus récents',
28
+    'attention_champ_mini_nb_caractères' => 'Attention ! @nb@ caractères au minimum',
29
+    'avis_1_erreur_saisie' => 'Il y a 1 erreur dans votre saisie, veuillez vérifier les informations.',
30
+    'avis_archive_incorrect' => 'le fichier archive n’est pas un fichier SPIP',
31
+    'avis_archive_invalide' => 'le fichier archive n’est pas valide',
32
+    'avis_attention' => 'ATTENTION !',
33
+    'avis_champ_incorrect_type_objet' => 'Nom de champ incorrect @name@ pour objet de type @type@',
34
+    'avis_colonne_inexistante' => 'La colonne @col@ n’existe pas',
35
+    'avis_erreur' => 'Erreur : voir ci-dessous',
36
+    'avis_erreur_connexion' => 'Erreur de connexion',
37
+    'avis_erreur_cookie' => 'problème de cookie',
38
+    'avis_erreur_fonction_contexte' => 'Erreur de programmation. Cette fonction ne doit pas être appelée dans ce contexte.',
39
+    'avis_erreur_mysql' => 'Erreur SQL',
40
+    'avis_erreur_sauvegarde' => 'Erreur dans la sauvegarde (@type@ @id_objet@) !',
41
+    'avis_erreur_visiteur' => 'Problème d’accès à l’espace privé',
42
+    'avis_nb_erreurs_saisie' => 'Il y a @nb@ erreurs dans votre saisie, veuillez vérifier les informations.',
43 43
 
44
-	// B
45
-	'barre_a_accent_grave' => 'Insérer un A accent grave majuscule',
46
-	'barre_aide' => 'Utilisez les raccourcis typographiques pour enrichir votre mise en page',
47
-	'barre_e_accent_aigu' => 'Insérer un E accent aigu majuscule',
48
-	'barre_eo' => 'Insérer un E dans l’O',
49
-	'barre_eo_maj' => 'Insérer un E dans l’O majuscule',
50
-	'barre_euro' => 'Insérer le symbole €',
51
-	'barre_gras' => 'Mettre en {{gras}}',
52
-	'barre_guillemets' => 'Entourer de « guillemets »',
53
-	'barre_guillemets_simples' => 'Entourer de “guillemets de second niveau”',
54
-	'barre_intertitre' => 'Transformer en {{{intertitre}}}',
55
-	'barre_italic' => 'Mettre en {italique}',
56
-	'barre_lien' => 'Transformer en [lien hypertexte->http://...]',
57
-	'barre_lien_input' => 'Veuillez indiquer l’adresse de votre lien (vous pouvez indiquer une adresse Web sous la forme http://www.monsite/com ou simplement indiquer le numéro d’un article de ce site.',
58
-	'barre_note' => 'Transformer en [[Note de bas de page]]',
59
-	'barre_paragraphe' => 'Créer un paragraphe',
60
-	'barre_quote' => '<quote>Citer un message</quote>',
61
-	'bouton_changer' => 'Changer',
62
-	'bouton_chercher' => 'Chercher',
63
-	'bouton_choisir' => 'Choisir',
64
-	'bouton_deplacer' => 'Déplacer',
65
-	'bouton_download' => 'Télécharger',
66
-	'bouton_enregistrer' => 'Enregistrer',
67
-	'bouton_radio_desactiver_messagerie_interne' => 'Désactiver la messagerie interne',
68
-	'bouton_radio_envoi_annonces' => 'Envoyer les annonces éditoriales',
69
-	'bouton_radio_non_envoi_annonces' => 'Ne pas envoyer d’annonces',
70
-	'bouton_radio_non_envoi_liste_nouveautes' => 'Ne pas envoyer la liste des nouveautés',
71
-	'bouton_recharger_page' => 'recharger cette page',
72
-	'bouton_telecharger' => 'Télécharger',
73
-	'bouton_upload' => 'Téléverser',
74
-	'bouton_valider' => 'Valider',
44
+    // B
45
+    'barre_a_accent_grave' => 'Insérer un A accent grave majuscule',
46
+    'barre_aide' => 'Utilisez les raccourcis typographiques pour enrichir votre mise en page',
47
+    'barre_e_accent_aigu' => 'Insérer un E accent aigu majuscule',
48
+    'barre_eo' => 'Insérer un E dans l’O',
49
+    'barre_eo_maj' => 'Insérer un E dans l’O majuscule',
50
+    'barre_euro' => 'Insérer le symbole €',
51
+    'barre_gras' => 'Mettre en {{gras}}',
52
+    'barre_guillemets' => 'Entourer de « guillemets »',
53
+    'barre_guillemets_simples' => 'Entourer de “guillemets de second niveau”',
54
+    'barre_intertitre' => 'Transformer en {{{intertitre}}}',
55
+    'barre_italic' => 'Mettre en {italique}',
56
+    'barre_lien' => 'Transformer en [lien hypertexte->http://...]',
57
+    'barre_lien_input' => 'Veuillez indiquer l’adresse de votre lien (vous pouvez indiquer une adresse Web sous la forme http://www.monsite/com ou simplement indiquer le numéro d’un article de ce site.',
58
+    'barre_note' => 'Transformer en [[Note de bas de page]]',
59
+    'barre_paragraphe' => 'Créer un paragraphe',
60
+    'barre_quote' => '<quote>Citer un message</quote>',
61
+    'bouton_changer' => 'Changer',
62
+    'bouton_chercher' => 'Chercher',
63
+    'bouton_choisir' => 'Choisir',
64
+    'bouton_deplacer' => 'Déplacer',
65
+    'bouton_download' => 'Télécharger',
66
+    'bouton_enregistrer' => 'Enregistrer',
67
+    'bouton_radio_desactiver_messagerie_interne' => 'Désactiver la messagerie interne',
68
+    'bouton_radio_envoi_annonces' => 'Envoyer les annonces éditoriales',
69
+    'bouton_radio_non_envoi_annonces' => 'Ne pas envoyer d’annonces',
70
+    'bouton_radio_non_envoi_liste_nouveautes' => 'Ne pas envoyer la liste des nouveautés',
71
+    'bouton_recharger_page' => 'recharger cette page',
72
+    'bouton_telecharger' => 'Télécharger',
73
+    'bouton_upload' => 'Téléverser',
74
+    'bouton_valider' => 'Valider',
75 75
 
76
-	// C
77
-	'cal_apresmidi' => 'après-midi',
78
-	'cal_jour_entier' => 'jour entier',
79
-	'cal_matin' => 'matin',
80
-	'cal_par_jour' => 'calendrier par jour',
81
-	'cal_par_mois' => 'calendrier par mois',
82
-	'cal_par_semaine' => 'calendrier par semaine',
83
-	'choix_couleur_interface' => 'couleur ',
84
-	'choix_interface' => 'choix  de l’interface',
85
-	'colonne' => 'Colonne',
86
-	'confirm_changer_statut' => 'Attention, vous avez demandé à changer le statut de cet élément. Souhaitez-vous continuer ?',
87
-	'correcte' => 'correcte', # chaine utilisée dans le debugueur : "validation .. impossible" ou "validation .. correcte"
76
+    // C
77
+    'cal_apresmidi' => 'après-midi',
78
+    'cal_jour_entier' => 'jour entier',
79
+    'cal_matin' => 'matin',
80
+    'cal_par_jour' => 'calendrier par jour',
81
+    'cal_par_mois' => 'calendrier par mois',
82
+    'cal_par_semaine' => 'calendrier par semaine',
83
+    'choix_couleur_interface' => 'couleur ',
84
+    'choix_interface' => 'choix  de l’interface',
85
+    'colonne' => 'Colonne',
86
+    'confirm_changer_statut' => 'Attention, vous avez demandé à changer le statut de cet élément. Souhaitez-vous continuer ?',
87
+    'correcte' => 'correcte', # chaine utilisée dans le debugueur : "validation .. impossible" ou "validation .. correcte"
88 88
 
89
-	// D
90
-	'date_aujourdhui' => 'aujourd’hui',
91
-	'date_avant_jc' => 'av. J.C.',
92
-	'date_dans' => 'dans @delai@',
93
-	'date_de_mois_1' => '@j@ @nommois@',
94
-	'date_de_mois_10' => '@j@ @nommois@',
95
-	'date_de_mois_11' => '@j@ @nommois@',
96
-	'date_de_mois_12' => '@j@ @nommois@',
97
-	'date_de_mois_2' => '@j@ @nommois@',
98
-	'date_de_mois_3' => '@j@ @nommois@',
99
-	'date_de_mois_4' => '@j@ @nommois@',
100
-	'date_de_mois_5' => '@j@ @nommois@',
101
-	'date_de_mois_6' => '@j@ @nommois@',
102
-	'date_de_mois_7' => '@j@ @nommois@',
103
-	'date_de_mois_8' => '@j@ @nommois@',
104
-	'date_de_mois_9' => '@j@ @nommois@',
105
-	'date_demain' => 'demain',
106
-	'date_fmt_heures_minutes' => '@h@h@m@min',
107
-	'date_fmt_heures_minutes_court' => '@h@h@m@',
108
-	'date_fmt_jour' => '@nomjour@ @jour@',
109
-	'date_fmt_jour_heure' => '@jour@ à @heure@',
110
-	'date_fmt_jour_heure_debut_fin' => '@jour@ de @heure_debut@ à @heure_fin@',
111
-	'date_fmt_jour_heure_debut_fin_abbr' => '@dtstart@@jour@ de @heure_debut@@dtabbr@ à @dtend@@heure_fin@@dtabbr@',
112
-	'date_fmt_jour_mois' => '@jour@ @nommois@',
113
-	'date_fmt_jour_mois_annee' => '@jour@ @nommois@ @annee@',
114
-	'date_fmt_mois_annee' => '@nommois@ @annee@',
115
-	'date_fmt_nomjour' => '@nomjour@ @date@',
116
-	'date_fmt_nomjour_date' => 'le @nomjour@ @date@',
117
-	'date_fmt_periode' => 'Du @date_debut@ au @date_fin@',
118
-	'date_fmt_periode_abbr' => 'Du @dtart@@date_debut@@dtabbr@ au @dtend@@date_fin@@dtabbr@',
119
-	'date_fmt_periode_from' => 'Du',
120
-	'date_fmt_periode_to' => 'au',
121
-	'date_fmt_saison_annee' => '@saison@ @annee@',
122
-	'date_heures' => 'heures',
123
-	'date_hier' => 'hier',
124
-	'date_il_y_a' => 'il y a @delai@',
125
-	'date_jnum1' => '1er',
126
-	'date_jnum10' => '10',
127
-	'date_jnum11' => '11',
128
-	'date_jnum12' => '12',
129
-	'date_jnum13' => '13',
130
-	'date_jnum14' => '14',
131
-	'date_jnum15' => '15',
132
-	'date_jnum16' => '16',
133
-	'date_jnum17' => '17',
134
-	'date_jnum18' => '18',
135
-	'date_jnum19' => '19',
136
-	'date_jnum2' => '2',
137
-	'date_jnum20' => '20',
138
-	'date_jnum21' => '21',
139
-	'date_jnum22' => '22',
140
-	'date_jnum23' => '23',
141
-	'date_jnum24' => '24',
142
-	'date_jnum25' => '25',
143
-	'date_jnum26' => '26',
144
-	'date_jnum27' => '27',
145
-	'date_jnum28' => '28',
146
-	'date_jnum29' => '29',
147
-	'date_jnum3' => '3',
148
-	'date_jnum30' => '30',
149
-	'date_jnum31' => '31',
150
-	'date_jnum4' => '4',
151
-	'date_jnum5' => '5',
152
-	'date_jnum6' => '6',
153
-	'date_jnum7' => '7',
154
-	'date_jnum8' => '8',
155
-	'date_jnum9' => '9',
156
-	'date_jour_1' => 'dimanche',
157
-	'date_jour_1_abbr' => 'dim.',
158
-	'date_jour_1_initiale' => 'd.',
159
-	'date_jour_2' => 'lundi',
160
-	'date_jour_2_abbr' => 'lun.',
161
-	'date_jour_2_initiale' => 'l.',
162
-	'date_jour_3' => 'mardi',
163
-	'date_jour_3_abbr' => 'mar.',
164
-	'date_jour_3_initiale' => 'm.',
165
-	'date_jour_4' => 'mercredi',
166
-	'date_jour_4_abbr' => 'mer.',
167
-	'date_jour_4_initiale' => 'm.',
168
-	'date_jour_5' => 'jeudi',
169
-	'date_jour_5_abbr' => 'jeu.',
170
-	'date_jour_5_initiale' => 'j.',
171
-	'date_jour_6' => 'vendredi',
172
-	'date_jour_6_abbr' => 'ven.',
173
-	'date_jour_6_initiale' => 'v.',
174
-	'date_jour_7' => 'samedi',
175
-	'date_jour_7_abbr' => 'sam.',
176
-	'date_jour_7_initiale' => 's.',
177
-	'date_jours' => 'jours',
178
-	'date_minutes' => 'minutes',
179
-	'date_mois' => 'mois',
180
-	'date_mois_1' => 'janvier',
181
-	'date_mois_10' => 'octobre',
182
-	'date_mois_10_abbr' => 'oct.',
183
-	'date_mois_11' => 'novembre',
184
-	'date_mois_11_abbr' => 'nov.',
185
-	'date_mois_12' => 'décembre',
186
-	'date_mois_12_abbr' => 'déc.',
187
-	'date_mois_1_abbr' => 'janv.',
188
-	'date_mois_2' => 'février',
189
-	'date_mois_2_abbr' => 'févr.',
190
-	'date_mois_3' => 'mars',
191
-	'date_mois_3_abbr' => 'mars',
192
-	'date_mois_4' => 'avril',
193
-	'date_mois_4_abbr' => 'avr.',
194
-	'date_mois_5' => 'mai',
195
-	'date_mois_5_abbr' => 'mai',
196
-	'date_mois_6' => 'juin',
197
-	'date_mois_6_abbr' => 'juin',
198
-	'date_mois_7' => 'juillet',
199
-	'date_mois_7_abbr' => 'juil.',
200
-	'date_mois_8' => 'août',
201
-	'date_mois_8_abbr' => 'août',
202
-	'date_mois_9' => 'septembre',
203
-	'date_mois_9_abbr' => 'sept.',
204
-	'date_saison_1' => 'hiver',
205
-	'date_saison_2' => 'printemps',
206
-	'date_saison_3' => 'été',
207
-	'date_saison_4' => 'automne',
208
-	'date_secondes' => 'secondes',
209
-	'date_semaines' => 'semaines',
210
-	'date_un_mois' => 'mois',
211
-	'date_une_heure' => 'heure',
212
-	'date_une_minute' => 'minute',
213
-	'date_une_seconde' => 'seconde',
214
-	'date_une_semaine' => 'semaine',
215
-	'dirs_commencer' => ' afin de commencer réellement l’installation',
216
-	'dirs_preliminaire' => 'Préliminaire : <b>Régler les droits d’accès</b>',
217
-	'dirs_probleme_droits' => 'Problème de droits d’accès',
218
-	'dirs_repertoires_absents' => '<p><b>Les répertoires suivants n’ont pas été trouvés :</b></p><ul>@bad_dirs@</ul>
89
+    // D
90
+    'date_aujourdhui' => 'aujourd’hui',
91
+    'date_avant_jc' => 'av. J.C.',
92
+    'date_dans' => 'dans @delai@',
93
+    'date_de_mois_1' => '@j@ @nommois@',
94
+    'date_de_mois_10' => '@j@ @nommois@',
95
+    'date_de_mois_11' => '@j@ @nommois@',
96
+    'date_de_mois_12' => '@j@ @nommois@',
97
+    'date_de_mois_2' => '@j@ @nommois@',
98
+    'date_de_mois_3' => '@j@ @nommois@',
99
+    'date_de_mois_4' => '@j@ @nommois@',
100
+    'date_de_mois_5' => '@j@ @nommois@',
101
+    'date_de_mois_6' => '@j@ @nommois@',
102
+    'date_de_mois_7' => '@j@ @nommois@',
103
+    'date_de_mois_8' => '@j@ @nommois@',
104
+    'date_de_mois_9' => '@j@ @nommois@',
105
+    'date_demain' => 'demain',
106
+    'date_fmt_heures_minutes' => '@h@h@m@min',
107
+    'date_fmt_heures_minutes_court' => '@h@h@m@',
108
+    'date_fmt_jour' => '@nomjour@ @jour@',
109
+    'date_fmt_jour_heure' => '@jour@ à @heure@',
110
+    'date_fmt_jour_heure_debut_fin' => '@jour@ de @heure_debut@ à @heure_fin@',
111
+    'date_fmt_jour_heure_debut_fin_abbr' => '@dtstart@@jour@ de @heure_debut@@dtabbr@ à @dtend@@heure_fin@@dtabbr@',
112
+    'date_fmt_jour_mois' => '@jour@ @nommois@',
113
+    'date_fmt_jour_mois_annee' => '@jour@ @nommois@ @annee@',
114
+    'date_fmt_mois_annee' => '@nommois@ @annee@',
115
+    'date_fmt_nomjour' => '@nomjour@ @date@',
116
+    'date_fmt_nomjour_date' => 'le @nomjour@ @date@',
117
+    'date_fmt_periode' => 'Du @date_debut@ au @date_fin@',
118
+    'date_fmt_periode_abbr' => 'Du @dtart@@date_debut@@dtabbr@ au @dtend@@date_fin@@dtabbr@',
119
+    'date_fmt_periode_from' => 'Du',
120
+    'date_fmt_periode_to' => 'au',
121
+    'date_fmt_saison_annee' => '@saison@ @annee@',
122
+    'date_heures' => 'heures',
123
+    'date_hier' => 'hier',
124
+    'date_il_y_a' => 'il y a @delai@',
125
+    'date_jnum1' => '1er',
126
+    'date_jnum10' => '10',
127
+    'date_jnum11' => '11',
128
+    'date_jnum12' => '12',
129
+    'date_jnum13' => '13',
130
+    'date_jnum14' => '14',
131
+    'date_jnum15' => '15',
132
+    'date_jnum16' => '16',
133
+    'date_jnum17' => '17',
134
+    'date_jnum18' => '18',
135
+    'date_jnum19' => '19',
136
+    'date_jnum2' => '2',
137
+    'date_jnum20' => '20',
138
+    'date_jnum21' => '21',
139
+    'date_jnum22' => '22',
140
+    'date_jnum23' => '23',
141
+    'date_jnum24' => '24',
142
+    'date_jnum25' => '25',
143
+    'date_jnum26' => '26',
144
+    'date_jnum27' => '27',
145
+    'date_jnum28' => '28',
146
+    'date_jnum29' => '29',
147
+    'date_jnum3' => '3',
148
+    'date_jnum30' => '30',
149
+    'date_jnum31' => '31',
150
+    'date_jnum4' => '4',
151
+    'date_jnum5' => '5',
152
+    'date_jnum6' => '6',
153
+    'date_jnum7' => '7',
154
+    'date_jnum8' => '8',
155
+    'date_jnum9' => '9',
156
+    'date_jour_1' => 'dimanche',
157
+    'date_jour_1_abbr' => 'dim.',
158
+    'date_jour_1_initiale' => 'd.',
159
+    'date_jour_2' => 'lundi',
160
+    'date_jour_2_abbr' => 'lun.',
161
+    'date_jour_2_initiale' => 'l.',
162
+    'date_jour_3' => 'mardi',
163
+    'date_jour_3_abbr' => 'mar.',
164
+    'date_jour_3_initiale' => 'm.',
165
+    'date_jour_4' => 'mercredi',
166
+    'date_jour_4_abbr' => 'mer.',
167
+    'date_jour_4_initiale' => 'm.',
168
+    'date_jour_5' => 'jeudi',
169
+    'date_jour_5_abbr' => 'jeu.',
170
+    'date_jour_5_initiale' => 'j.',
171
+    'date_jour_6' => 'vendredi',
172
+    'date_jour_6_abbr' => 'ven.',
173
+    'date_jour_6_initiale' => 'v.',
174
+    'date_jour_7' => 'samedi',
175
+    'date_jour_7_abbr' => 'sam.',
176
+    'date_jour_7_initiale' => 's.',
177
+    'date_jours' => 'jours',
178
+    'date_minutes' => 'minutes',
179
+    'date_mois' => 'mois',
180
+    'date_mois_1' => 'janvier',
181
+    'date_mois_10' => 'octobre',
182
+    'date_mois_10_abbr' => 'oct.',
183
+    'date_mois_11' => 'novembre',
184
+    'date_mois_11_abbr' => 'nov.',
185
+    'date_mois_12' => 'décembre',
186
+    'date_mois_12_abbr' => 'déc.',
187
+    'date_mois_1_abbr' => 'janv.',
188
+    'date_mois_2' => 'février',
189
+    'date_mois_2_abbr' => 'févr.',
190
+    'date_mois_3' => 'mars',
191
+    'date_mois_3_abbr' => 'mars',
192
+    'date_mois_4' => 'avril',
193
+    'date_mois_4_abbr' => 'avr.',
194
+    'date_mois_5' => 'mai',
195
+    'date_mois_5_abbr' => 'mai',
196
+    'date_mois_6' => 'juin',
197
+    'date_mois_6_abbr' => 'juin',
198
+    'date_mois_7' => 'juillet',
199
+    'date_mois_7_abbr' => 'juil.',
200
+    'date_mois_8' => 'août',
201
+    'date_mois_8_abbr' => 'août',
202
+    'date_mois_9' => 'septembre',
203
+    'date_mois_9_abbr' => 'sept.',
204
+    'date_saison_1' => 'hiver',
205
+    'date_saison_2' => 'printemps',
206
+    'date_saison_3' => 'été',
207
+    'date_saison_4' => 'automne',
208
+    'date_secondes' => 'secondes',
209
+    'date_semaines' => 'semaines',
210
+    'date_un_mois' => 'mois',
211
+    'date_une_heure' => 'heure',
212
+    'date_une_minute' => 'minute',
213
+    'date_une_seconde' => 'seconde',
214
+    'date_une_semaine' => 'semaine',
215
+    'dirs_commencer' => ' afin de commencer réellement l’installation',
216
+    'dirs_preliminaire' => 'Préliminaire : <b>Régler les droits d’accès</b>',
217
+    'dirs_probleme_droits' => 'Problème de droits d’accès',
218
+    'dirs_repertoires_absents' => '<p><b>Les répertoires suivants n’ont pas été trouvés :</b></p><ul>@bad_dirs@</ul>
219 219
   <p>Il est probable que cela soit dû à un problème de mauvaise mise en majuscules ou minuscules.
220 220
   Vérifiez que les minuscules et majuscules de ces répertoires concordent bien avec ce qui est affiché
221 221
   ci-dessus ; si ce n’est pas le cas, renommez les répertoires avec votre logiciel FTP de façon à corriger l’erreur.</p>
222 222
   <p>Une fois cette manipulation effectuée, vous pourrez ',
223
-	'dirs_repertoires_suivants' => '<p><b>Les répertoires suivants ne sont pas accessibles en écriture :</b></p> <ul>@bad_dirs@</ul>
223
+    'dirs_repertoires_suivants' => '<p><b>Les répertoires suivants ne sont pas accessibles en écriture :</b></p> <ul>@bad_dirs@</ul>
224 224
   <p>Pour y remédier, utilisez votre client FTP afin de régler les droits d’accès de chacun
225 225
   de ces répertoires. La procédure est expliquée en détail dans le guide d’installation.</p>
226 226
   <p>Une fois cette manipulation effectuée, vous pourrez ',
227
-	'double_occurrence' => 'Double occurrence de @balise@',
227
+    'double_occurrence' => 'Double occurrence de @balise@',
228 228
 
229
-	// E
230
-	'en_cours' => 'en cours',
231
-	'envoi_via_le_site' => 'Envoi via le site',
232
-	'erreur' => 'Erreur',
233
-	'erreur_balise_non_fermee' => 'dernière balise non refermée :',
234
-	'erreur_technique_ajaxform' => 'Oups. Une erreur inattendue a empêché de soumettre le formulaire. Vous pouvez essayer à nouveau.',
235
-	'erreur_technique_enregistrement_champs' => 'Une erreur technique a empêché l’enregistrement correct du champ @champs@.',
236
-	'erreur_technique_enregistrement_impossible' => 'Une erreur technique a empêché l’enregistrement.',
237
-	'erreur_texte' => 'erreur(s)',
238
-	'etape' => 'Étape',
229
+    // E
230
+    'en_cours' => 'en cours',
231
+    'envoi_via_le_site' => 'Envoi via le site',
232
+    'erreur' => 'Erreur',
233
+    'erreur_balise_non_fermee' => 'dernière balise non refermée :',
234
+    'erreur_technique_ajaxform' => 'Oups. Une erreur inattendue a empêché de soumettre le formulaire. Vous pouvez essayer à nouveau.',
235
+    'erreur_technique_enregistrement_champs' => 'Une erreur technique a empêché l’enregistrement correct du champ @champs@.',
236
+    'erreur_technique_enregistrement_impossible' => 'Une erreur technique a empêché l’enregistrement.',
237
+    'erreur_texte' => 'erreur(s)',
238
+    'etape' => 'Étape',
239 239
 
240
-	// F
241
-	'fichier_introuvable' => 'Fichier @fichier@ introuvable',
242
-	'form_auteur_confirmation' => 'Confirmez votre adresse email',
243
-	'form_auteur_email_modifie' => 'Votre adresse email a été modifiée.',
244
-	'form_auteur_envoi_mail_confirmation' => 'Un courrier électronique de confirmation vient d’être envoyé à @email@. Vous devrez visiter l’adresse Web mentionnée dans ce courrier pour valider votre adresse mail.',
245
-	'form_auteur_mail_confirmation' => 'Bonjour,
240
+    // F
241
+    'fichier_introuvable' => 'Fichier @fichier@ introuvable',
242
+    'form_auteur_confirmation' => 'Confirmez votre adresse email',
243
+    'form_auteur_email_modifie' => 'Votre adresse email a été modifiée.',
244
+    'form_auteur_envoi_mail_confirmation' => 'Un courrier électronique de confirmation vient d’être envoyé à @email@. Vous devrez visiter l’adresse Web mentionnée dans ce courrier pour valider votre adresse mail.',
245
+    'form_auteur_mail_confirmation' => 'Bonjour,
246 246
 
247 247
 Vous avez demandé à changer votre adresse email.
248 248
 Pour confirmer votre nouvelle adresse, il suffit de vous connecter à
@@ -251,346 +251,346 @@  discard block
 block discarded – undo
251 251
 
252 252
     @url@
253 253
 ',
254
-	'form_deja_inscrit' => 'Vous êtes déjà inscrit.',
255
-	'form_email_non_valide' => 'Votre adresse email n’est pas valide.',
256
-	'form_forum_access_refuse' => 'Vous n’avez plus accès à ce site.',
257
-	'form_forum_bonjour' => 'Bonjour @nom@,',
258
-	'form_forum_confirmer_email' => 'Pour confirmer votre adresse email, rendez-vous à cette adresse : @url_confirm@',
259
-	'form_forum_email_deja_enregistre' => 'Cette adresse email est déjà enregistrée, vous pouvez donc utiliser votre mot de passe habituel.',
260
-	'form_forum_identifiant_mail' => 'Votre nouvel identifiant vient de vous être envoyé par email.',
261
-	'form_forum_identifiants' => 'Identifiants personnels',
262
-	'form_forum_indiquer_nom_email' => 'Indiquez ici votre nom et votre adresse email. Votre identifiant personnel vous parviendra rapidement, par courrier électronique.',
263
-	'form_forum_login' => 'login :',
264
-	'form_forum_message_auto' => '(ceci est un message automatique)',
265
-	'form_forum_pass' => 'mot de passe :',
266
-	'form_forum_probleme_mail' => 'Problème de mail : l’identifiant ne peut pas être envoyé.',
267
-	'form_forum_voici1' => 'Voici vos identifiants pour pouvoir participer à la vie du site "@nom_site_spip@" (@adresse_site@) :',
268
-	'form_forum_voici2' => 'Voici vos identifiants pour proposer des articles sur
254
+    'form_deja_inscrit' => 'Vous êtes déjà inscrit.',
255
+    'form_email_non_valide' => 'Votre adresse email n’est pas valide.',
256
+    'form_forum_access_refuse' => 'Vous n’avez plus accès à ce site.',
257
+    'form_forum_bonjour' => 'Bonjour @nom@,',
258
+    'form_forum_confirmer_email' => 'Pour confirmer votre adresse email, rendez-vous à cette adresse : @url_confirm@',
259
+    'form_forum_email_deja_enregistre' => 'Cette adresse email est déjà enregistrée, vous pouvez donc utiliser votre mot de passe habituel.',
260
+    'form_forum_identifiant_mail' => 'Votre nouvel identifiant vient de vous être envoyé par email.',
261
+    'form_forum_identifiants' => 'Identifiants personnels',
262
+    'form_forum_indiquer_nom_email' => 'Indiquez ici votre nom et votre adresse email. Votre identifiant personnel vous parviendra rapidement, par courrier électronique.',
263
+    'form_forum_login' => 'login :',
264
+    'form_forum_message_auto' => '(ceci est un message automatique)',
265
+    'form_forum_pass' => 'mot de passe :',
266
+    'form_forum_probleme_mail' => 'Problème de mail : l’identifiant ne peut pas être envoyé.',
267
+    'form_forum_voici1' => 'Voici vos identifiants pour pouvoir participer à la vie du site "@nom_site_spip@" (@adresse_site@) :',
268
+    'form_forum_voici2' => 'Voici vos identifiants pour proposer des articles sur
269 269
 le site "@nom_site_spip@" (@adresse_login@) :',
270
-	'form_indiquer_email' => 'Veuillez indiquer votre adresse email.',
271
-	'form_indiquer_nom' => 'Veuillez indiquer votre nom.',
272
-	'form_indiquer_nom_site' => 'Veuillez indiquer le nom de votre site.',
273
-	'form_pet_deja_enregistre' => 'Ce site est déjà enregistré',
274
-	'form_pet_signature_pasprise' => 'Votre signature n’est pas prise en compte.',
275
-	'form_prop_confirmer_envoi' => 'Confirmer l’envoi',
276
-	'form_prop_description' => 'Description/commentaire',
277
-	'form_prop_enregistre' => 'Votre proposition est enregistrée, elle apparaîtra en ligne après validation par les responsables de ce site.',
278
-	'form_prop_envoyer' => 'Envoyer un message',
279
-	'form_prop_indiquer_email' => 'Veuillez indiquer une adresse email valide',
280
-	'form_prop_indiquer_nom_site' => 'Veuillez indiquer le nom du site.',
281
-	'form_prop_indiquer_sujet' => 'Veuillez indiquer un sujet',
282
-	'form_prop_message_envoye' => 'Message envoyé',
283
-	'form_prop_non_enregistre' => 'Votre proposition n’a pas été enregistrée.',
284
-	'form_prop_sujet' => 'Sujet',
285
-	'form_prop_url_site' => 'Adresse URL du site',
286
-	'format_date_attendu' => 'Saisir une date au format jj/mm/aaaa.',
287
-	'format_date_incorrecte' => 'La date ou son format est incorrect',
288
-	'format_heure_attendu' => 'Saisir une heure au format hh:mm.',
289
-	'format_heure_incorrecte' => 'L’heure ou son format est incorrect',
290
-	'forum_non_inscrit' => 'Vous n’êtes pas inscrit, ou l’adresse ou le mot de passe sont erronés.',
291
-	'forum_par_auteur' => 'par @auteur@',
292
-	'forum_titre_erreur' => 'Erreur...',
270
+    'form_indiquer_email' => 'Veuillez indiquer votre adresse email.',
271
+    'form_indiquer_nom' => 'Veuillez indiquer votre nom.',
272
+    'form_indiquer_nom_site' => 'Veuillez indiquer le nom de votre site.',
273
+    'form_pet_deja_enregistre' => 'Ce site est déjà enregistré',
274
+    'form_pet_signature_pasprise' => 'Votre signature n’est pas prise en compte.',
275
+    'form_prop_confirmer_envoi' => 'Confirmer l’envoi',
276
+    'form_prop_description' => 'Description/commentaire',
277
+    'form_prop_enregistre' => 'Votre proposition est enregistrée, elle apparaîtra en ligne après validation par les responsables de ce site.',
278
+    'form_prop_envoyer' => 'Envoyer un message',
279
+    'form_prop_indiquer_email' => 'Veuillez indiquer une adresse email valide',
280
+    'form_prop_indiquer_nom_site' => 'Veuillez indiquer le nom du site.',
281
+    'form_prop_indiquer_sujet' => 'Veuillez indiquer un sujet',
282
+    'form_prop_message_envoye' => 'Message envoyé',
283
+    'form_prop_non_enregistre' => 'Votre proposition n’a pas été enregistrée.',
284
+    'form_prop_sujet' => 'Sujet',
285
+    'form_prop_url_site' => 'Adresse URL du site',
286
+    'format_date_attendu' => 'Saisir une date au format jj/mm/aaaa.',
287
+    'format_date_incorrecte' => 'La date ou son format est incorrect',
288
+    'format_heure_attendu' => 'Saisir une heure au format hh:mm.',
289
+    'format_heure_incorrecte' => 'L’heure ou son format est incorrect',
290
+    'forum_non_inscrit' => 'Vous n’êtes pas inscrit, ou l’adresse ou le mot de passe sont erronés.',
291
+    'forum_par_auteur' => 'par @auteur@',
292
+    'forum_titre_erreur' => 'Erreur...',
293 293
 
294
-	// I
295
-	'ical_texte_rss_articles' => 'Le fichier « backend » des articles de ce site se trouve à l’adresse :',
296
-	'ical_texte_rss_articles2' => 'Vous pouvez également obtenir des fichiers « backend » pour les articles de chaque rubrique du site :',
297
-	'ical_texte_rss_breves' => 'Il existe de plus un fichier contenant les brèves du site. En précisant un numéro de rubrique, vous obtiendrez uniquement les brèves de cette rubrique.',
298
-	'icone_a_suivre' => 'À suivre',
299
-	'icone_admin_site' => 'Administration du site',
300
-	'icone_agenda' => 'Agenda',
301
-	'icone_aide_ligne' => 'Aide',
302
-	'icone_articles' => 'Articles',
303
-	'icone_auteurs' => 'Auteurs',
304
-	'icone_brouteur' => 'Navigation rapide',
305
-	'icone_configuration_site' => 'Configuration',
306
-	'icone_configurer_site' => 'Configurer votre site',
307
-	'icone_creer_nouvel_auteur' => 'Créer un nouvel auteur',
308
-	'icone_creer_rubrique' => 'Créer une rubrique',
309
-	'icone_creer_sous_rubrique' => 'Créer une sous-rubrique',
310
-	'icone_deconnecter' => 'Se déconnecter',
311
-	'icone_discussions' => 'Discussions',
312
-	'icone_doc_rubrique' => 'Documents des rubriques',
313
-	'icone_ecrire_article' => 'Écrire un nouvel article',
314
-	'icone_edition_site' => 'Édition',
315
-	'icone_gestion_langues' => 'Gestion des langues',
316
-	'icone_informations_personnelles' => 'Informations personnelles',
317
-	'icone_interface_complet' => 'interface complète',
318
-	'icone_interface_simple' => 'Interface simplifiée',
319
-	'icone_maintenance_site' => 'Maintenance du site',
320
-	'icone_messagerie_personnelle' => 'Messagerie personnelle',
321
-	'icone_repartition_debut' => 'Afficher la répartition depuis le début',
322
-	'icone_rubriques' => 'Rubriques',
323
-	'icone_sauver_site' => 'Sauvegarde du site',
324
-	'icone_site_entier' => 'Tout le site',
325
-	'icone_sites_references' => 'Sites référencés',
326
-	'icone_statistiques' => 'Statistiques du site',
327
-	'icone_suivi_activite' => 'Suivre la vie du site',
328
-	'icone_suivi_actualite' => 'Évolution du site',
329
-	'icone_suivi_pettions' => 'Suivre/gérer les pétitions',
330
-	'icone_suivi_revisions' => 'Modifications des articles',
331
-	'icone_supprimer_document' => 'Supprimer ce document',
332
-	'icone_supprimer_image' => 'Supprimer cette image',
333
-	'icone_tous_articles' => 'Tous vos articles',
334
-	'icone_tous_auteur' => 'Tous les auteurs',
335
-	'icone_tous_visiteur' => 'Tous les visiteurs',
336
-	'icone_visiter_site' => 'Voir le site public',
337
-	'icone_voir_en_ligne' => 'Voir en ligne',
338
-	'img_indisponible' => 'image indisponible',
339
-	'impossible' => 'impossible',
340
-	'info_a_suivre' => 'À SUIVRE »',
341
-	'info_acces_interdit' => 'Accès interdit',
342
-	'info_acces_refuse' => 'Accès refusé',
343
-	'info_action' => 'Action : @action@',
344
-	'info_administrer_rubriques' => 'Vous pouvez administrer cette rubrique et ses sous-rubriques',
345
-	'info_adresse_non_indiquee' => 'Vous n’avez pas indiqué d’adresse à tester !',
346
-	'info_aide' => 'AIDE :',
347
-	'info_ajouter_mot' => 'Ajouter ce mot',
348
-	'info_annonce' => 'ANNONCE',
349
-	'info_annonces_generales' => 'Annonces générales :',
350
-	'info_article_propose' => 'Article proposé',
351
-	'info_article_publie' => 'Article publié',
352
-	'info_article_redaction' => 'Article en cours de rédaction',
353
-	'info_article_refuse' => 'Article refusé',
354
-	'info_article_supprime' => 'Article supprimé',
355
-	'info_articles' => 'Articles',
356
-	'info_articles_a_valider' => 'Les articles à valider',
357
-	'info_articles_nb' => '@nb@ articles',
358
-	'info_articles_proposes' => 'Articles proposés',
359
-	'info_articles_un' => '1 article',
360
-	'info_auteurs_nombre' => 'auteur(s) :',
361
-	'info_authentification_ftp' => 'Authentification (par FTP).',
362
-	'info_breves_2' => 'brèves',
363
-	'info_breves_nb' => '@nb@ brèves',
364
-	'info_breves_un' => '1 brève',
365
-	'info_connexion_refusee' => 'Connexion refusée',
366
-	'info_contact_developpeur' => 'Veuillez contacter un développeur.',
367
-	'info_contenance' => 'Ce site contient :',
368
-	'info_contribution' => 'contributions',
369
-	'info_copyright' => '@spip@ est un logiciel libre distribué @lien_gpl@.',
370
-	'info_copyright_doc' => 'Pour plus d’informations, voir le site <a href="@spipnet@">@spipnet_affiche@</a>.',
371
-	'info_copyright_gpl' => 'sous licence GPL',
372
-	'info_cours_edition' => 'En cours de modification',
373
-	'info_creer_repertoire' => 'Veuillez créer un fichier ou un répertoire nommé :',
374
-	'info_creer_repertoire_2' => 'à l’intérieur du sous-répertoire <b>@repertoire@</b>, puis :',
375
-	'info_creer_vignette' => 'création automatique de la vignette',
376
-	'info_creerdansrubrique_non_autorise' => 'Vous n’avez pas de droits suffisants pour créer un contenu dans cette rubrique',
377
-	'info_deplier' => 'Déplier',
378
-	'info_descriptif_nombre' => 'descriptif(s) :',
379
-	'info_description' => 'Description :',
380
-	'info_description_2' => 'Description :',
381
-	'info_dimension' => 'Dimensions :',
382
-	'info_documents_nb' => '@nb@ documents',
383
-	'info_documents_un' => '1 document',
384
-	'info_ecire_message_prive' => 'Écrire un message privé',
385
-	'info_email_invalide' => 'Adresse email invalide.',
386
-	'info_en_cours_validation' => 'Vos articles en cours de rédaction',
387
-	'info_en_ligne' => 'Actuellement en ligne :',
388
-	'info_envoyer_message_prive' => 'Envoyer un message privé à cet auteur',
389
-	'info_erreur_requete' => 'Erreur dans la requête :',
390
-	'info_erreur_squelette2' => 'Aucun squelette <b>@fichier@</b> n’est disponible...',
391
-	'info_erreur_systeme' => 'Erreur système (errno @errsys@)',
392
-	'info_erreur_systeme2' => 'Le disque dur est peut-être plein, ou la base de données endommagée.<br />
294
+    // I
295
+    'ical_texte_rss_articles' => 'Le fichier « backend » des articles de ce site se trouve à l’adresse :',
296
+    'ical_texte_rss_articles2' => 'Vous pouvez également obtenir des fichiers « backend » pour les articles de chaque rubrique du site :',
297
+    'ical_texte_rss_breves' => 'Il existe de plus un fichier contenant les brèves du site. En précisant un numéro de rubrique, vous obtiendrez uniquement les brèves de cette rubrique.',
298
+    'icone_a_suivre' => 'À suivre',
299
+    'icone_admin_site' => 'Administration du site',
300
+    'icone_agenda' => 'Agenda',
301
+    'icone_aide_ligne' => 'Aide',
302
+    'icone_articles' => 'Articles',
303
+    'icone_auteurs' => 'Auteurs',
304
+    'icone_brouteur' => 'Navigation rapide',
305
+    'icone_configuration_site' => 'Configuration',
306
+    'icone_configurer_site' => 'Configurer votre site',
307
+    'icone_creer_nouvel_auteur' => 'Créer un nouvel auteur',
308
+    'icone_creer_rubrique' => 'Créer une rubrique',
309
+    'icone_creer_sous_rubrique' => 'Créer une sous-rubrique',
310
+    'icone_deconnecter' => 'Se déconnecter',
311
+    'icone_discussions' => 'Discussions',
312
+    'icone_doc_rubrique' => 'Documents des rubriques',
313
+    'icone_ecrire_article' => 'Écrire un nouvel article',
314
+    'icone_edition_site' => 'Édition',
315
+    'icone_gestion_langues' => 'Gestion des langues',
316
+    'icone_informations_personnelles' => 'Informations personnelles',
317
+    'icone_interface_complet' => 'interface complète',
318
+    'icone_interface_simple' => 'Interface simplifiée',
319
+    'icone_maintenance_site' => 'Maintenance du site',
320
+    'icone_messagerie_personnelle' => 'Messagerie personnelle',
321
+    'icone_repartition_debut' => 'Afficher la répartition depuis le début',
322
+    'icone_rubriques' => 'Rubriques',
323
+    'icone_sauver_site' => 'Sauvegarde du site',
324
+    'icone_site_entier' => 'Tout le site',
325
+    'icone_sites_references' => 'Sites référencés',
326
+    'icone_statistiques' => 'Statistiques du site',
327
+    'icone_suivi_activite' => 'Suivre la vie du site',
328
+    'icone_suivi_actualite' => 'Évolution du site',
329
+    'icone_suivi_pettions' => 'Suivre/gérer les pétitions',
330
+    'icone_suivi_revisions' => 'Modifications des articles',
331
+    'icone_supprimer_document' => 'Supprimer ce document',
332
+    'icone_supprimer_image' => 'Supprimer cette image',
333
+    'icone_tous_articles' => 'Tous vos articles',
334
+    'icone_tous_auteur' => 'Tous les auteurs',
335
+    'icone_tous_visiteur' => 'Tous les visiteurs',
336
+    'icone_visiter_site' => 'Voir le site public',
337
+    'icone_voir_en_ligne' => 'Voir en ligne',
338
+    'img_indisponible' => 'image indisponible',
339
+    'impossible' => 'impossible',
340
+    'info_a_suivre' => 'À SUIVRE »',
341
+    'info_acces_interdit' => 'Accès interdit',
342
+    'info_acces_refuse' => 'Accès refusé',
343
+    'info_action' => 'Action : @action@',
344
+    'info_administrer_rubriques' => 'Vous pouvez administrer cette rubrique et ses sous-rubriques',
345
+    'info_adresse_non_indiquee' => 'Vous n’avez pas indiqué d’adresse à tester !',
346
+    'info_aide' => 'AIDE :',
347
+    'info_ajouter_mot' => 'Ajouter ce mot',
348
+    'info_annonce' => 'ANNONCE',
349
+    'info_annonces_generales' => 'Annonces générales :',
350
+    'info_article_propose' => 'Article proposé',
351
+    'info_article_publie' => 'Article publié',
352
+    'info_article_redaction' => 'Article en cours de rédaction',
353
+    'info_article_refuse' => 'Article refusé',
354
+    'info_article_supprime' => 'Article supprimé',
355
+    'info_articles' => 'Articles',
356
+    'info_articles_a_valider' => 'Les articles à valider',
357
+    'info_articles_nb' => '@nb@ articles',
358
+    'info_articles_proposes' => 'Articles proposés',
359
+    'info_articles_un' => '1 article',
360
+    'info_auteurs_nombre' => 'auteur(s) :',
361
+    'info_authentification_ftp' => 'Authentification (par FTP).',
362
+    'info_breves_2' => 'brèves',
363
+    'info_breves_nb' => '@nb@ brèves',
364
+    'info_breves_un' => '1 brève',
365
+    'info_connexion_refusee' => 'Connexion refusée',
366
+    'info_contact_developpeur' => 'Veuillez contacter un développeur.',
367
+    'info_contenance' => 'Ce site contient :',
368
+    'info_contribution' => 'contributions',
369
+    'info_copyright' => '@spip@ est un logiciel libre distribué @lien_gpl@.',
370
+    'info_copyright_doc' => 'Pour plus d’informations, voir le site <a href="@spipnet@">@spipnet_affiche@</a>.',
371
+    'info_copyright_gpl' => 'sous licence GPL',
372
+    'info_cours_edition' => 'En cours de modification',
373
+    'info_creer_repertoire' => 'Veuillez créer un fichier ou un répertoire nommé :',
374
+    'info_creer_repertoire_2' => 'à l’intérieur du sous-répertoire <b>@repertoire@</b>, puis :',
375
+    'info_creer_vignette' => 'création automatique de la vignette',
376
+    'info_creerdansrubrique_non_autorise' => 'Vous n’avez pas de droits suffisants pour créer un contenu dans cette rubrique',
377
+    'info_deplier' => 'Déplier',
378
+    'info_descriptif_nombre' => 'descriptif(s) :',
379
+    'info_description' => 'Description :',
380
+    'info_description_2' => 'Description :',
381
+    'info_dimension' => 'Dimensions :',
382
+    'info_documents_nb' => '@nb@ documents',
383
+    'info_documents_un' => '1 document',
384
+    'info_ecire_message_prive' => 'Écrire un message privé',
385
+    'info_email_invalide' => 'Adresse email invalide.',
386
+    'info_en_cours_validation' => 'Vos articles en cours de rédaction',
387
+    'info_en_ligne' => 'Actuellement en ligne :',
388
+    'info_envoyer_message_prive' => 'Envoyer un message privé à cet auteur',
389
+    'info_erreur_requete' => 'Erreur dans la requête :',
390
+    'info_erreur_squelette2' => 'Aucun squelette <b>@fichier@</b> n’est disponible...',
391
+    'info_erreur_systeme' => 'Erreur système (errno @errsys@)',
392
+    'info_erreur_systeme2' => 'Le disque dur est peut-être plein, ou la base de données endommagée.<br />
393 393
 <span style="color:red;">Essayez de <a href=\'@script@\'>réparer la base</a>, ou contactez votre hébergeur.</span>',
394
-	'info_fini' => 'C’est fini !',
395
-	'info_format_image' => 'Formats d’images pouvant être utilisées pour créer des vignettes : @gd_formats@.',
396
-	'info_format_non_defini' => 'format non défini',
397
-	'info_grand_ecran' => 'Grand écran',
398
-	'info_image_aide' => 'AIDE',
399
-	'info_image_process_titre' => 'Méthode de fabrication des vignettes',
400
-	'info_impossible_lire_page' => '<b>Erreur !</b> Impossible de lire la page <tt><html>@test_proxy@</html></tt> à travers le proxy ',
401
-	'info_installation_systeme_publication' => 'Installation du système de publication...',
402
-	'info_installer_documents' => 'Vous pouvez installer automatiquement tous les documents contenus dans le dossier @upload@.',
403
-	'info_installer_ftp' => 'En tant qu’administrateur, vous pouvez installer (par FTP) des fichiers dans le dossier @upload@ pour ensuite les sélectionner directement ici.',
404
-	'info_installer_images' => 'Vous pouvez installer des images aux formats JPEG, GIF et PNG.',
405
-	'info_installer_images_dossier' => 'Installer des images dans le dossier @upload@ pour pouvoir les sélectionner ici.',
406
-	'info_interface_complete' => 'interface complète',
407
-	'info_interface_simple' => 'Interface simplifiée',
408
-	'info_joindre_document_article' => 'Vous pouvez joindre à cet article des documents de type',
409
-	'info_joindre_document_rubrique' => 'Vous pouvez ajouter dans cette rubrique des documents de type',
410
-	'info_joindre_documents_article' => 'Vous pouvez joindre à votre article des documents de type :',
411
-	'info_l_article' => 'l’article',
412
-	'info_la_breve' => 'la brève',
413
-	'info_la_rubrique' => 'la rubrique',
414
-	'info_langue_principale' => 'Langue principale du site',
415
-	'info_largeur_vignette' => '@largeur_vignette@ × @hauteur_vignette@ pixels',
416
-	'info_les_auteurs_1' => 'par @les_auteurs@',
417
-	'info_logo_format_interdit' => 'Seuls les logos aux formats @formats@ sont autorisés.',
418
-	'info_logo_max_poids' => 'Les logos doivent obligatoirement faire moins de @maxi@ (ce fichier fait @actuel@).',
419
-	'info_mail_fournisseur' => '[email protected]',
420
-	'info_message_2' => 'MESSAGE',
421
-	'info_message_supprime' => 'MESSAGE SUPPRIMÉ',
422
-	'info_messages_nb' => '@nb@ messages',
423
-	'info_messages_un' => '1 message',
424
-	'info_mise_en_ligne' => 'Date de mise en ligne :',
425
-	'info_modification_parametres_securite' => 'modifications des paramètres de sécurité',
426
-	'info_mois_courant' => 'Dans le courant du mois :',
427
-	'info_mot_cle_ajoute' => 'Le mot-clé suivant a été ajouté à',
428
-	'info_multi_herit' => 'Langue par défaut',
429
-	'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 vous sélectionnez 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.',
430
-	'info_multilinguisme' => 'Multilinguisme',
431
-	'info_nom_non_utilisateurs_connectes' => 'Votre nom n’apparaît pas dans la liste des utilisateurs connectés.',
432
-	'info_nom_utilisateurs_connectes' => 'Votre nom apparaît dans la liste des utilisateurs connectés.',
433
-	'info_nombre_en_ligne' => 'Actuellement en ligne :',
434
-	'info_non_resultat' => 'Aucun résultat pour "@cherche_mot@"',
435
-	'info_non_utilisation_messagerie' => 'Vous n’utilisez pas la messagerie interne de ce site.',
436
-	'info_nouveau_message' => 'VOUS AVEZ UN NOUVEAU MESSAGE',
437
-	'info_nouveaux_messages' => 'VOUS AVEZ @total_messages@ NOUVEAUX MESSAGES',
438
-	'info_numero_abbreviation' => 'N° ',
439
-	'info_obligatoire' => 'Cette information est obligatoire',
440
-	'info_page_actuelle' => 'Page actuelle',
441
-	'info_pense_bete' => 'PENSE-BÊTE',
442
-	'info_petit_ecran' => 'Petit écran',
443
-	'info_petition_close' => 'Pétition close',
444
-	'info_pixels' => 'pixels',
445
-	'info_plusieurs_mots_trouves' => 'Plusieurs mots-clés trouvés pour "@cherche_mot@" :',
446
-	'info_portfolio_automatique' => 'Portfolio automatique :',
447
-	'info_premier_resultat' => '[@debut_limit@ premiers résultats sur @total@]',
448
-	'info_premier_resultat_sur' => '[@debut_limit@ premiers résultats sur @total@]',
449
-	'info_propose_1' => '[@nom_site_spip@] Propose : @titre@',
450
-	'info_propose_2' => 'Article proposé
394
+    'info_fini' => 'C’est fini !',
395
+    'info_format_image' => 'Formats d’images pouvant être utilisées pour créer des vignettes : @gd_formats@.',
396
+    'info_format_non_defini' => 'format non défini',
397
+    'info_grand_ecran' => 'Grand écran',
398
+    'info_image_aide' => 'AIDE',
399
+    'info_image_process_titre' => 'Méthode de fabrication des vignettes',
400
+    'info_impossible_lire_page' => '<b>Erreur !</b> Impossible de lire la page <tt><html>@test_proxy@</html></tt> à travers le proxy ',
401
+    'info_installation_systeme_publication' => 'Installation du système de publication...',
402
+    'info_installer_documents' => 'Vous pouvez installer automatiquement tous les documents contenus dans le dossier @upload@.',
403
+    'info_installer_ftp' => 'En tant qu’administrateur, vous pouvez installer (par FTP) des fichiers dans le dossier @upload@ pour ensuite les sélectionner directement ici.',
404
+    'info_installer_images' => 'Vous pouvez installer des images aux formats JPEG, GIF et PNG.',
405
+    'info_installer_images_dossier' => 'Installer des images dans le dossier @upload@ pour pouvoir les sélectionner ici.',
406
+    'info_interface_complete' => 'interface complète',
407
+    'info_interface_simple' => 'Interface simplifiée',
408
+    'info_joindre_document_article' => 'Vous pouvez joindre à cet article des documents de type',
409
+    'info_joindre_document_rubrique' => 'Vous pouvez ajouter dans cette rubrique des documents de type',
410
+    'info_joindre_documents_article' => 'Vous pouvez joindre à votre article des documents de type :',
411
+    'info_l_article' => 'l’article',
412
+    'info_la_breve' => 'la brève',
413
+    'info_la_rubrique' => 'la rubrique',
414
+    'info_langue_principale' => 'Langue principale du site',
415
+    'info_largeur_vignette' => '@largeur_vignette@ × @hauteur_vignette@ pixels',
416
+    'info_les_auteurs_1' => 'par @les_auteurs@',
417
+    'info_logo_format_interdit' => 'Seuls les logos aux formats @formats@ sont autorisés.',
418
+    'info_logo_max_poids' => 'Les logos doivent obligatoirement faire moins de @maxi@ (ce fichier fait @actuel@).',
419
+    'info_mail_fournisseur' => '[email protected]',
420
+    'info_message_2' => 'MESSAGE',
421
+    'info_message_supprime' => 'MESSAGE SUPPRIMÉ',
422
+    'info_messages_nb' => '@nb@ messages',
423
+    'info_messages_un' => '1 message',
424
+    'info_mise_en_ligne' => 'Date de mise en ligne :',
425
+    'info_modification_parametres_securite' => 'modifications des paramètres de sécurité',
426
+    'info_mois_courant' => 'Dans le courant du mois :',
427
+    'info_mot_cle_ajoute' => 'Le mot-clé suivant a été ajouté à',
428
+    'info_multi_herit' => 'Langue par défaut',
429
+    '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 vous sélectionnez 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.',
430
+    'info_multilinguisme' => 'Multilinguisme',
431
+    'info_nom_non_utilisateurs_connectes' => 'Votre nom n’apparaît pas dans la liste des utilisateurs connectés.',
432
+    'info_nom_utilisateurs_connectes' => 'Votre nom apparaît dans la liste des utilisateurs connectés.',
433
+    'info_nombre_en_ligne' => 'Actuellement en ligne :',
434
+    'info_non_resultat' => 'Aucun résultat pour "@cherche_mot@"',
435
+    'info_non_utilisation_messagerie' => 'Vous n’utilisez pas la messagerie interne de ce site.',
436
+    'info_nouveau_message' => 'VOUS AVEZ UN NOUVEAU MESSAGE',
437
+    'info_nouveaux_messages' => 'VOUS AVEZ @total_messages@ NOUVEAUX MESSAGES',
438
+    'info_numero_abbreviation' => 'N° ',
439
+    'info_obligatoire' => 'Cette information est obligatoire',
440
+    'info_page_actuelle' => 'Page actuelle',
441
+    'info_pense_bete' => 'PENSE-BÊTE',
442
+    'info_petit_ecran' => 'Petit écran',
443
+    'info_petition_close' => 'Pétition close',
444
+    'info_pixels' => 'pixels',
445
+    'info_plusieurs_mots_trouves' => 'Plusieurs mots-clés trouvés pour "@cherche_mot@" :',
446
+    'info_portfolio_automatique' => 'Portfolio automatique :',
447
+    'info_premier_resultat' => '[@debut_limit@ premiers résultats sur @total@]',
448
+    'info_premier_resultat_sur' => '[@debut_limit@ premiers résultats sur @total@]',
449
+    'info_propose_1' => '[@nom_site_spip@] Propose : @titre@',
450
+    'info_propose_2' => 'Article proposé
451 451
 ---------------',
452
-	'info_propose_3' => 'L’article "@titre@" est proposé à la publication.',
453
-	'info_propose_4' => 'Vous êtes invité à venir le consulter et à donner votre opinion',
454
-	'info_propose_5' => 'dans le forum qui lui est attaché. Il est disponible à l’adresse :',
455
-	'info_publie_01' => 'L’article "@titre@" a été validé par @connect_nom@.',
456
-	'info_publie_1' => '[@nom_site_spip@] PUBLIE : @titre@',
457
-	'info_publie_2' => 'Article publié
452
+    'info_propose_3' => 'L’article "@titre@" est proposé à la publication.',
453
+    'info_propose_4' => 'Vous êtes invité à venir le consulter et à donner votre opinion',
454
+    'info_propose_5' => 'dans le forum qui lui est attaché. Il est disponible à l’adresse :',
455
+    'info_publie_01' => 'L’article "@titre@" a été validé par @connect_nom@.',
456
+    'info_publie_1' => '[@nom_site_spip@] PUBLIE : @titre@',
457
+    'info_publie_2' => 'Article publié
458 458
 --------------',
459
-	'info_rechercher' => 'Rechercher',
460
-	'info_rechercher_02' => 'Rechercher :',
461
-	'info_remplacer_vignette' => 'Remplacer la vignette par défaut par un logo personnalisé :',
462
-	'info_rubriques_nb' => '@nb@ rubriques',
463
-	'info_rubriques_un' => '1 rubrique',
464
-	'info_sans_titre_2' => 'sans titre',
465
-	'info_selectionner_fichier' => 'Vous pouvez sélectionner un fichier du dossier @upload@',
466
-	'info_selectionner_fichier_2' => 'Sélectionner un fichier :',
467
-	'info_sites_nb' => '@nb@ sites',
468
-	'info_sites_un' => '1 site',
469
-	'info_supprimer_vignette' => 'supprimer la vignette',
470
-	'info_symbole_bleu' => 'Le symbole <b>bleu</b> indique un <b>pense-bête</b> : c’est-à-dire un message à votre usage personnel.',
471
-	'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.',
472
-	'info_symbole_vert' => 'Le symbole <b>vert</b> indique les <b>messages échangés avec d’autres utilisateurs</b> du site.',
473
-	'info_telecharger_nouveau_logo' => 'Télécharger un nouveau logo :',
474
-	'info_telecharger_ordinateur' => 'Télécharger depuis votre ordinateur :',
475
-	'info_tous_resultats_enregistres' => '[tous les résultats sont enregistrés]',
476
-	'info_tout_afficher' => 'Tout afficher',
477
-	'info_travaux_texte' => 'Ce site n’est pas encore configuré. Revenez plus tard...',
478
-	'info_travaux_titre' => 'Site en travaux',
479
-	'info_trop_resultat' => 'Trop de résultats pour "@cherche_mot@" ; veuillez affiner la recherche.',
480
-	'info_utilisation_messagerie_interne' => 'Vous utilisez la messagerie interne de ce site.',
481
-	'info_valider_lien' => 'valider ce lien',
482
-	'info_verifier_image' => ', veuillez vérifier que vos images ont été transférées correctement.',
483
-	'info_vignette_defaut' => 'Vignette par défaut',
484
-	'info_vignette_personnalisee' => 'Vignette personnalisée',
485
-	'info_visite' => 'visite :',
486
-	'info_vos_rendez_vous' => 'Vos rendez-vous à venir',
487
-	'infos_vos_pense_bete' => 'Vos pense-bêtes',
459
+    'info_rechercher' => 'Rechercher',
460
+    'info_rechercher_02' => 'Rechercher :',
461
+    'info_remplacer_vignette' => 'Remplacer la vignette par défaut par un logo personnalisé :',
462
+    'info_rubriques_nb' => '@nb@ rubriques',
463
+    'info_rubriques_un' => '1 rubrique',
464
+    'info_sans_titre_2' => 'sans titre',
465
+    'info_selectionner_fichier' => 'Vous pouvez sélectionner un fichier du dossier @upload@',
466
+    'info_selectionner_fichier_2' => 'Sélectionner un fichier :',
467
+    'info_sites_nb' => '@nb@ sites',
468
+    'info_sites_un' => '1 site',
469
+    'info_supprimer_vignette' => 'supprimer la vignette',
470
+    'info_symbole_bleu' => 'Le symbole <b>bleu</b> indique un <b>pense-bête</b> : c’est-à-dire un message à votre usage personnel.',
471
+    '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.',
472
+    'info_symbole_vert' => 'Le symbole <b>vert</b> indique les <b>messages échangés avec d’autres utilisateurs</b> du site.',
473
+    'info_telecharger_nouveau_logo' => 'Télécharger un nouveau logo :',
474
+    'info_telecharger_ordinateur' => 'Télécharger depuis votre ordinateur :',
475
+    'info_tous_resultats_enregistres' => '[tous les résultats sont enregistrés]',
476
+    'info_tout_afficher' => 'Tout afficher',
477
+    'info_travaux_texte' => 'Ce site n’est pas encore configuré. Revenez plus tard...',
478
+    'info_travaux_titre' => 'Site en travaux',
479
+    'info_trop_resultat' => 'Trop de résultats pour "@cherche_mot@" ; veuillez affiner la recherche.',
480
+    'info_utilisation_messagerie_interne' => 'Vous utilisez la messagerie interne de ce site.',
481
+    'info_valider_lien' => 'valider ce lien',
482
+    'info_verifier_image' => ', veuillez vérifier que vos images ont été transférées correctement.',
483
+    'info_vignette_defaut' => 'Vignette par défaut',
484
+    'info_vignette_personnalisee' => 'Vignette personnalisée',
485
+    'info_visite' => 'visite :',
486
+    'info_vos_rendez_vous' => 'Vos rendez-vous à venir',
487
+    'infos_vos_pense_bete' => 'Vos pense-bêtes',
488 488
 
489
-	// L
490
-	'label_ajout_id_rapide' => 'Ajout rapide',
491
-	'label_ponctuer' => '@label@ :',
492
-	'label_poids_fichier' => 'Taille',
493
-	'lien_afficher_icones_seuls' => 'Afficher uniquement les icones',
494
-	'lien_afficher_texte_icones' => 'Afficher les icones et le texte',
495
-	'lien_afficher_texte_seul' => 'Afficher uniquement le texte',
496
-	'lien_aller_a_la_derniere_page' => 'Aller à la dernière page',
497
-	'lien_aller_a_la_page_nb' => 'Aller à la page @nb@',
498
-	'lien_aller_a_la_page_precedente' => 'Aller à la page précédente',
499
-	'lien_aller_a_la_page_suivante' => 'Aller à la page suivante',
500
-	'lien_aller_a_la_premiere_page' => 'Aller à la première page',
501
-	'lien_liberer' => 'libérer',
502
-	'lien_liberer_tous' => 'Tout libérer',
503
-	'lien_nouvea_pense_bete' => 'NOUVEAU PENSE-BÊTE',
504
-	'lien_nouveau_message' => 'NOUVEAU MESSAGE',
505
-	'lien_nouvelle_annonce' => 'NOUVELLE ANNONCE',
506
-	'lien_petitions' => 'PÉTITION',
507
-	'lien_popularite' => 'popularité : @popularite@%',
508
-	'lien_racine_site' => 'RACINE DU SITE',
509
-	'lien_reessayer' => 'réessayer',
510
-	'lien_repondre_message' => 'Répondre à ce message',
511
-	'lien_supprimer' => 'supprimer',
512
-	'lien_tout_afficher' => 'Tout afficher',
513
-	'lien_visite_site' => 'visiter ce site',
514
-	'lien_visites' => '@visites@ visites',
515
-	'lien_voir_auteur' => 'Voir cet auteur',
516
-	'ligne' => 'Ligne',
517
-	'login' => 'Connexion',
518
-	'login_acces_prive' => 'accès à l’espace privé',
519
-	'login_autre_identifiant' => 'se connecter sous un autre identifiant',
520
-	'login_cookie_accepte' => 'Veuillez régler votre navigateur pour qu’il les accepte (au moins pour ce site).',
521
-	'login_cookie_oblige' => 'Pour vous identifier de façon sûre sur ce site, vous devez accepter les cookies.',
522
-	'login_deconnexion_ok' => 'Déconnexion effectuée.',
523
-	'login_erreur_pass' => 'Erreur de mot de passe.',
524
-	'login_espace_prive' => 'espace privé',
525
-	'login_identifiant_inconnu' => 'L’identifiant « @login@ » est inconnu.',
526
-	'login_login' => 'Login :',
527
-	'login_login2' => 'Login ou adresse email :',
528
-	'login_login_pass_incorrect' => '(Login ou mot de passe incorrect.)',
529
-	'login_motpasseoublie' => 'mot de passe oublié ?',
530
-	'login_non_securise' => 'Attention, ce formulaire n’est pas sécurisé.
489
+    // L
490
+    'label_ajout_id_rapide' => 'Ajout rapide',
491
+    'label_ponctuer' => '@label@ :',
492
+    'label_poids_fichier' => 'Taille',
493
+    'lien_afficher_icones_seuls' => 'Afficher uniquement les icones',
494
+    'lien_afficher_texte_icones' => 'Afficher les icones et le texte',
495
+    'lien_afficher_texte_seul' => 'Afficher uniquement le texte',
496
+    'lien_aller_a_la_derniere_page' => 'Aller à la dernière page',
497
+    'lien_aller_a_la_page_nb' => 'Aller à la page @nb@',
498
+    'lien_aller_a_la_page_precedente' => 'Aller à la page précédente',
499
+    'lien_aller_a_la_page_suivante' => 'Aller à la page suivante',
500
+    'lien_aller_a_la_premiere_page' => 'Aller à la première page',
501
+    'lien_liberer' => 'libérer',
502
+    'lien_liberer_tous' => 'Tout libérer',
503
+    'lien_nouvea_pense_bete' => 'NOUVEAU PENSE-BÊTE',
504
+    'lien_nouveau_message' => 'NOUVEAU MESSAGE',
505
+    'lien_nouvelle_annonce' => 'NOUVELLE ANNONCE',
506
+    'lien_petitions' => 'PÉTITION',
507
+    'lien_popularite' => 'popularité : @popularite@%',
508
+    'lien_racine_site' => 'RACINE DU SITE',
509
+    'lien_reessayer' => 'réessayer',
510
+    'lien_repondre_message' => 'Répondre à ce message',
511
+    'lien_supprimer' => 'supprimer',
512
+    'lien_tout_afficher' => 'Tout afficher',
513
+    'lien_visite_site' => 'visiter ce site',
514
+    'lien_visites' => '@visites@ visites',
515
+    'lien_voir_auteur' => 'Voir cet auteur',
516
+    'ligne' => 'Ligne',
517
+    'login' => 'Connexion',
518
+    'login_acces_prive' => 'accès à l’espace privé',
519
+    'login_autre_identifiant' => 'se connecter sous un autre identifiant',
520
+    'login_cookie_accepte' => 'Veuillez régler votre navigateur pour qu’il les accepte (au moins pour ce site).',
521
+    'login_cookie_oblige' => 'Pour vous identifier de façon sûre sur ce site, vous devez accepter les cookies.',
522
+    'login_deconnexion_ok' => 'Déconnexion effectuée.',
523
+    'login_erreur_pass' => 'Erreur de mot de passe.',
524
+    'login_espace_prive' => 'espace privé',
525
+    'login_identifiant_inconnu' => 'L’identifiant « @login@ » est inconnu.',
526
+    'login_login' => 'Login :',
527
+    'login_login2' => 'Login ou adresse email :',
528
+    'login_login_pass_incorrect' => '(Login ou mot de passe incorrect.)',
529
+    'login_motpasseoublie' => 'mot de passe oublié ?',
530
+    'login_non_securise' => 'Attention, ce formulaire n’est pas sécurisé.
531 531
 			Si vous ne voulez pas que votre mot de passe puisse être
532 532
 			intercepté sur le réseau, veuillez activer Javascript
533 533
 			dans votre navigateur et',
534
-	'login_nouvelle_tentative' => 'Nouvelle tentative',
535
-	'login_par_ici' => 'Vous êtes enregistré... par ici...',
536
-	'login_pass2' => 'Mot de passe :',
537
-	'login_preferez_refuser' => '<b>Si vous préférez refuser les cookies</b>, une autre méthode de connexion (moins sécurisée) est à votre disposition :',
538
-	'login_recharger' => 'recharger cette page',
539
-	'login_rester_identifie' => 'Se souvenir de moi',
540
-	'login_retour_public' => 'Retour au site public',
541
-	'login_retour_site' => 'Retour au site public',
542
-	'login_retoursitepublic' => 'retour au site public',
543
-	'login_sans_cookie' => 'Identification sans cookie',
544
-	'login_securise' => 'Login sécurisé',
545
-	'login_sinscrire' => 's’inscrire',
546
-	'login_test_navigateur' => 'test navigateur/reconnexion',
547
-	'login_verifiez_navigateur' => '(Vérifiez toutefois que votre navigateur n’a pas mémorisé votre mot de passe...)',
534
+    'login_nouvelle_tentative' => 'Nouvelle tentative',
535
+    'login_par_ici' => 'Vous êtes enregistré... par ici...',
536
+    'login_pass2' => 'Mot de passe :',
537
+    'login_preferez_refuser' => '<b>Si vous préférez refuser les cookies</b>, une autre méthode de connexion (moins sécurisée) est à votre disposition :',
538
+    'login_recharger' => 'recharger cette page',
539
+    'login_rester_identifie' => 'Se souvenir de moi',
540
+    'login_retour_public' => 'Retour au site public',
541
+    'login_retour_site' => 'Retour au site public',
542
+    'login_retoursitepublic' => 'retour au site public',
543
+    'login_sans_cookie' => 'Identification sans cookie',
544
+    'login_securise' => 'Login sécurisé',
545
+    'login_sinscrire' => 's’inscrire',
546
+    'login_test_navigateur' => 'test navigateur/reconnexion',
547
+    'login_verifiez_navigateur' => '(Vérifiez toutefois que votre navigateur n’a pas mémorisé votre mot de passe...)',
548 548
 
549
-	// M
550
-	'masquer_colonne' => 'Masquer cette colonne',
551
-	'masquer_trad' => 'masquer les traductions',
552
-	'message_nouveaux_identifiants_echec' => 'Impossible de générer de nouveaux identifiants.',
553
-	'message_nouveaux_identifiants_echec_envoi' => 'Les nouveaux identifiants de connexion n’ont pas pu être envoyés.',
554
-	'message_nouveaux_identifiants_ok' => 'Les nouveaux identifiants de connexion ont été envoyés à @email@.',
555
-	'module_fichiers_langues' => 'Fichiers de langue',
549
+    // M
550
+    'masquer_colonne' => 'Masquer cette colonne',
551
+    'masquer_trad' => 'masquer les traductions',
552
+    'message_nouveaux_identifiants_echec' => 'Impossible de générer de nouveaux identifiants.',
553
+    'message_nouveaux_identifiants_echec_envoi' => 'Les nouveaux identifiants de connexion n’ont pas pu être envoyés.',
554
+    'message_nouveaux_identifiants_ok' => 'Les nouveaux identifiants de connexion ont été envoyés à @email@.',
555
+    'module_fichiers_langues' => 'Fichiers de langue',
556 556
 
557
-	// N
558
-	'navigateur_pas_redirige' => 'Si votre navigateur n’est pas redirigé, cliquez ici pour continuer.',
559
-	'numero' => 'Numéro',
557
+    // N
558
+    'navigateur_pas_redirige' => 'Si votre navigateur n’est pas redirigé, cliquez ici pour continuer.',
559
+    'numero' => 'Numéro',
560 560
 
561
-	// O
562
-	'occurence' => 'Occurrence',
563
-	'onglet_affacer_base' => 'Effacer la base',
564
-	'onglet_auteur' => 'L’auteur',
565
-	'onglet_contenu_site' => 'Contenu du site',
566
-	'onglet_evolution_visite_mod' => 'Évolution',
567
-	'onglet_fonctions_avances' => 'Fonctions avancées',
568
-	'onglet_informations_personnelles' => 'Informations personnelles',
569
-	'onglet_interactivite' => 'Interactivité',
570
-	'onglet_messagerie' => 'Messagerie',
571
-	'onglet_repartition_rubrique' => 'Répartition par rubriques',
572
-	'onglet_save_restaur_base' => 'Sauvegarder/restaurer la base',
573
-	'onglet_vider_cache' => 'Vider le cache',
561
+    // O
562
+    'occurence' => 'Occurrence',
563
+    'onglet_affacer_base' => 'Effacer la base',
564
+    'onglet_auteur' => 'L’auteur',
565
+    'onglet_contenu_site' => 'Contenu du site',
566
+    'onglet_evolution_visite_mod' => 'Évolution',
567
+    'onglet_fonctions_avances' => 'Fonctions avancées',
568
+    'onglet_informations_personnelles' => 'Informations personnelles',
569
+    'onglet_interactivite' => 'Interactivité',
570
+    'onglet_messagerie' => 'Messagerie',
571
+    'onglet_repartition_rubrique' => 'Répartition par rubriques',
572
+    'onglet_save_restaur_base' => 'Sauvegarder/restaurer la base',
573
+    'onglet_vider_cache' => 'Vider le cache',
574 574
 
575
-	// P
576
-	'pass_choix_pass' => 'Veuillez choisir votre nouveau mot de passe :',
577
-	'pass_erreur' => 'Erreur',
578
-	'pass_erreur_acces_refuse' => '<b>Erreur :</b> vous n’avez plus accès à ce site.',
579
-	'pass_erreur_code_inconnu' => '<b>Erreur :</b> ce code ne correspond à aucun des visiteurs ayant accès à ce site.',
580
-	'pass_erreur_non_enregistre' => '<b>Erreur :</b> l’adresse <tt>@email_oubli@</tt> n’est pas enregistrée sur ce site.',
581
-	'pass_erreur_non_valide' => '<b>Erreur :</b> cet email <tt>@email_oubli@</tt> n’est pas valide !',
582
-	'pass_erreur_probleme_technique' => '<b>Erreur :</b> à cause d’un problème technique, l’email ne peut pas être envoyé.',
583
-	'pass_espace_prive_bla' => 'L’espace privé de ce site est ouvert aux
575
+    // P
576
+    'pass_choix_pass' => 'Veuillez choisir votre nouveau mot de passe :',
577
+    'pass_erreur' => 'Erreur',
578
+    'pass_erreur_acces_refuse' => '<b>Erreur :</b> vous n’avez plus accès à ce site.',
579
+    'pass_erreur_code_inconnu' => '<b>Erreur :</b> ce code ne correspond à aucun des visiteurs ayant accès à ce site.',
580
+    'pass_erreur_non_enregistre' => '<b>Erreur :</b> l’adresse <tt>@email_oubli@</tt> n’est pas enregistrée sur ce site.',
581
+    'pass_erreur_non_valide' => '<b>Erreur :</b> cet email <tt>@email_oubli@</tt> n’est pas valide !',
582
+    'pass_erreur_probleme_technique' => '<b>Erreur :</b> à cause d’un problème technique, l’email ne peut pas être envoyé.',
583
+    'pass_espace_prive_bla' => 'L’espace privé de ce site est ouvert aux
584 584
 		visiteurs, après inscription. Une fois enregistré,
585 585
 		vous pourrez consulter les articles en cours de rédaction,
586 586
 		proposer des articles et participer à tous les forums.',
587
-	'pass_forum_bla' => 'Vous avez demandé à intervenir sur un forum
587
+    'pass_forum_bla' => 'Vous avez demandé à intervenir sur un forum
588 588
 		réservé aux visiteurs enregistrés.',
589
-	'pass_indiquez_cidessous' => 'Indiquez ci-dessous l’adresse email sous laquelle vous
589
+    'pass_indiquez_cidessous' => 'Indiquez ci-dessous l’adresse email sous laquelle vous
590 590
 			vous êtes précédemment enregistré. Vous
591 591
 			recevrez un email vous indiquant la marche à suivre pour
592 592
 			récupérer votre accès.',
593
-	'pass_mail_passcookie' => '(ceci est un message automatique)
593
+    'pass_mail_passcookie' => '(ceci est un message automatique)
594 594
 Pour retrouver votre accès au site
595 595
 @nom_site_spip@ (@adresse_site@)
596 596
 
@@ -602,146 +602,146 @@  discard block
 block discarded – undo
602 602
 et vous reconnecter au site.
603 603
 
604 604
 ',
605
-	'pass_mot_oublie' => 'Mot de passe oublié',
606
-	'pass_nouveau_enregistre' => 'Votre nouveau mot de passe a été enregistré.',
607
-	'pass_nouveau_pass' => 'Nouveau mot de passe',
608
-	'pass_ok' => 'OK',
609
-	'pass_oubli_mot' => 'Oubli du mot de passe',
610
-	'pass_procedure_changer' => 'Pour modifier votre mot de passe, merci d’indiquer l’adresse email associée à votre compte.',
611
-	'pass_quitter_fenetre' => 'Quitter cette fenêtre',
612
-	'pass_rappel_login' => 'Rappel : votre identifiant (login) est « @login@ ».',
613
-	'pass_recevoir_mail' => 'Un lien de réinitialisation de votre mot de passe vous a été envoyé sur votre adresse email (si celle-ci est valide).',
614
-	'pass_retour_public' => 'Retour sur le site public',
615
-	'pass_rien_a_faire_ici' => 'Rien à faire ici.',
616
-	'pass_vousinscrire' => 'Vous inscrire sur ce site',
617
-	'precedent' => 'précédent',
618
-	'previsualisation' => 'Prévisualisation',
619
-	'previsualiser' => 'Prévisualiser',
605
+    'pass_mot_oublie' => 'Mot de passe oublié',
606
+    'pass_nouveau_enregistre' => 'Votre nouveau mot de passe a été enregistré.',
607
+    'pass_nouveau_pass' => 'Nouveau mot de passe',
608
+    'pass_ok' => 'OK',
609
+    'pass_oubli_mot' => 'Oubli du mot de passe',
610
+    'pass_procedure_changer' => 'Pour modifier votre mot de passe, merci d’indiquer l’adresse email associée à votre compte.',
611
+    'pass_quitter_fenetre' => 'Quitter cette fenêtre',
612
+    'pass_rappel_login' => 'Rappel : votre identifiant (login) est « @login@ ».',
613
+    'pass_recevoir_mail' => 'Un lien de réinitialisation de votre mot de passe vous a été envoyé sur votre adresse email (si celle-ci est valide).',
614
+    'pass_retour_public' => 'Retour sur le site public',
615
+    'pass_rien_a_faire_ici' => 'Rien à faire ici.',
616
+    'pass_vousinscrire' => 'Vous inscrire sur ce site',
617
+    'precedent' => 'précédent',
618
+    'previsualisation' => 'Prévisualisation',
619
+    'previsualiser' => 'Prévisualiser',
620 620
 
621
-	// R
622
-	'retour' => 'Retour',
621
+    // R
622
+    'retour' => 'Retour',
623 623
 
624
-	// S
625
-	'spip_conforme_dtd' => 'SPIP considère ce document comme conforme à son DOCTYPE :',
626
-	'squelette' => 'squelette',
627
-	'squelette_inclus_ligne' => 'squelette inclus, ligne',
628
-	'squelette_ligne' => 'squelette, ligne',
629
-	'stats_visites_et_popularite' => '@visites@ visites ; popularité : @popularite@',
630
-	'suivant' => 'suivant',
624
+    // S
625
+    'spip_conforme_dtd' => 'SPIP considère ce document comme conforme à son DOCTYPE :',
626
+    'squelette' => 'squelette',
627
+    'squelette_inclus_ligne' => 'squelette inclus, ligne',
628
+    'squelette_ligne' => 'squelette, ligne',
629
+    'stats_visites_et_popularite' => '@visites@ visites ; popularité : @popularite@',
630
+    'suivant' => 'suivant',
631 631
 
632
-	// T
633
-	'taille_go' => '@taille@ Go',
634
-	'taille_ko' => '@taille@ ko',
635
-	'taille_mo' => '@taille@ Mo',
636
-	'taille_octets' => '@taille@ octets',
637
-	'texte_actualite_site_1' => 'Quand vous serez familiarisé(e) avec l’interface, vous pourrez cliquer sur « ',
638
-	'texte_actualite_site_2' => 'interface complète',
639
-	'texte_actualite_site_3' => ' » pour ouvrir plus de possibilités.',
640
-	'texte_creation_automatique_vignette' => 'La création automatique de vignettes de prévisualisation est activée sur ce site. Si vous installez à 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.',
641
-	'texte_documents_associes' => 'Les documents suivants sont associés à l’article,
632
+    // T
633
+    'taille_go' => '@taille@ Go',
634
+    'taille_ko' => '@taille@ ko',
635
+    'taille_mo' => '@taille@ Mo',
636
+    'taille_octets' => '@taille@ octets',
637
+    'texte_actualite_site_1' => 'Quand vous serez familiarisé(e) avec l’interface, vous pourrez cliquer sur « ',
638
+    'texte_actualite_site_2' => 'interface complète',
639
+    'texte_actualite_site_3' => ' » pour ouvrir plus de possibilités.',
640
+    'texte_creation_automatique_vignette' => 'La création automatique de vignettes de prévisualisation est activée sur ce site. Si vous installez à 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.',
641
+    'texte_documents_associes' => 'Les documents suivants sont associés à l’article,
642 642
 				mais ils n’y ont pas été directement
643 643
 				insérés. Selon la mise en page du site public,
644 644
 				ils pourront apparaître sous forme de documents joints.',
645
-	'texte_erreur_mise_niveau_base' => 'Erreur de base de données lors de la mise à niveau.
645
+    'texte_erreur_mise_niveau_base' => 'Erreur de base de données lors de la mise à niveau.
646 646
 		L’image <b>@fichier@</b> n’est pas passée (article @id_article@).
647 647
 		Notez bien cette référence, réessayez la mise à
648 648
 		niveau, et enfin vérifiez que les images apparaissent
649 649
 		toujours dans les articles.',
650
-	'texte_erreur_visiteur' => 'Vous avez tenté d’accéder à l’espace privé avec un login qui ne le permet pas.',
651
-	'texte_inc_auth_1' => 'Vous êtes identifié sous le
650
+    'texte_erreur_visiteur' => 'Vous avez tenté d’accéder à l’espace privé avec un login qui ne le permet pas.',
651
+    'texte_inc_auth_1' => 'Vous êtes identifié sous le
652 652
 		login <b>@auth_login@</b>, mais celui-ci n’existe pas/plus dans la base.
653 653
 		Essayez de vous',
654
-	'texte_inc_auth_2' => 'reconnecter',
655
-	'texte_inc_auth_3' => ', après avoir éventuellement quitté puis
654
+    'texte_inc_auth_2' => 'reconnecter',
655
+    'texte_inc_auth_3' => ', après avoir éventuellement quitté puis
656 656
 		redémarré votre navigateur.',
657
-	'texte_inc_config' => 'Les modifications effectuées dans ces pages influent notablement sur le
657
+    'texte_inc_config' => 'Les modifications effectuées dans ces pages influent notablement sur le
658 658
  fonctionnement de votre site. Nous vous recommandons de ne pas y intervenir tant que vous n’êtes pas
659 659
  familier du fonctionnement du système SPIP. <br /><br /><b>Plus
660 660
  généralement, il est fortement conseillé
661 661
  de laisser la charge de ces pages au webmestre principal de votre site.</b>',
662
-	'texte_inc_meta_1' => 'Le système a rencontré une erreur lors de l’écriture du fichier <code>@fichier@</code>. Veuillez, en tant qu’administrateur du site,',
663
-	'texte_inc_meta_2' => 'vérifier les droits d’écriture',
664
-	'texte_inc_meta_3' => 'sur le répertoire <code>@repertoire@</code>.',
665
-	'texte_statut_en_cours_redaction' => 'en cours de rédaction',
666
-	'texte_statut_poubelle' => 'à la poubelle',
667
-	'texte_statut_propose_evaluation' => 'proposé à l’évaluation',
668
-	'texte_statut_publie' => 'publié en ligne',
669
-	'texte_statut_refuse' => 'refusé',
670
-	'titre_ajouter_mot_cle' => 'AJOUTER UN MOT-CLÉ :',
671
-	'titre_cadre_raccourcis' => 'RACCOURCIS :',
672
-	'titre_changer_couleur_interface' => 'Changer la couleur de l’interface',
673
-	'titre_image_admin_article' => 'Vous pouvez administrer cet article',
674
-	'titre_image_administrateur' => 'Administrateur',
675
-	'titre_image_aide' => 'De l’aide sur cet élément',
676
-	'titre_image_auteur_supprime' => 'Auteur supprimé',
677
-	'titre_image_redacteur' => 'Rédacteur sans accès',
678
-	'titre_image_redacteur_02' => 'Rédacteur',
679
-	'titre_image_selecteur' => 'Afficher la liste',
680
-	'titre_image_visiteur' => 'Visiteur',
681
-	'titre_joindre_document' => 'JOINDRE UN DOCUMENT',
682
-	'titre_mots_cles' => 'MOTS-CLÉS',
683
-	'titre_probleme_technique' => 'Attention : un problème technique (serveur SQL) empêche l’accès à cette partie du site. Merci de votre compréhension.',
684
-	'titre_publier_document' => 'PUBLIER UN DOCUMENT DANS CETTE RUBRIQUE',
685
-	'titre_signatures_attente' => 'Signatures en attente de validation',
686
-	'titre_signatures_confirmees' => 'Signatures confirmées',
687
-	'titre_statistiques' => 'Statistiques du site',
688
-	'titre_titre_document' => 'Titre du document :',
689
-	'todo' => 'à venir',
690
-	'trad_definir_reference' => 'Choisir "@titre@" comme référence des traductions',
691
-	'trad_reference' => '(référence des traductions)',
662
+    'texte_inc_meta_1' => 'Le système a rencontré une erreur lors de l’écriture du fichier <code>@fichier@</code>. Veuillez, en tant qu’administrateur du site,',
663
+    'texte_inc_meta_2' => 'vérifier les droits d’écriture',
664
+    'texte_inc_meta_3' => 'sur le répertoire <code>@repertoire@</code>.',
665
+    'texte_statut_en_cours_redaction' => 'en cours de rédaction',
666
+    'texte_statut_poubelle' => 'à la poubelle',
667
+    'texte_statut_propose_evaluation' => 'proposé à l’évaluation',
668
+    'texte_statut_publie' => 'publié en ligne',
669
+    'texte_statut_refuse' => 'refusé',
670
+    'titre_ajouter_mot_cle' => 'AJOUTER UN MOT-CLÉ :',
671
+    'titre_cadre_raccourcis' => 'RACCOURCIS :',
672
+    'titre_changer_couleur_interface' => 'Changer la couleur de l’interface',
673
+    'titre_image_admin_article' => 'Vous pouvez administrer cet article',
674
+    'titre_image_administrateur' => 'Administrateur',
675
+    'titre_image_aide' => 'De l’aide sur cet élément',
676
+    'titre_image_auteur_supprime' => 'Auteur supprimé',
677
+    'titre_image_redacteur' => 'Rédacteur sans accès',
678
+    'titre_image_redacteur_02' => 'Rédacteur',
679
+    'titre_image_selecteur' => 'Afficher la liste',
680
+    'titre_image_visiteur' => 'Visiteur',
681
+    'titre_joindre_document' => 'JOINDRE UN DOCUMENT',
682
+    'titre_mots_cles' => 'MOTS-CLÉS',
683
+    'titre_probleme_technique' => 'Attention : un problème technique (serveur SQL) empêche l’accès à cette partie du site. Merci de votre compréhension.',
684
+    'titre_publier_document' => 'PUBLIER UN DOCUMENT DANS CETTE RUBRIQUE',
685
+    'titre_signatures_attente' => 'Signatures en attente de validation',
686
+    'titre_signatures_confirmees' => 'Signatures confirmées',
687
+    'titre_statistiques' => 'Statistiques du site',
688
+    'titre_titre_document' => 'Titre du document :',
689
+    'todo' => 'à venir',
690
+    'trad_definir_reference' => 'Choisir "@titre@" comme référence des traductions',
691
+    'trad_reference' => '(référence des traductions)',
692 692
 
693
-	// U
694
-	'upload_limit' => 'Ce fichier est trop gros pour le serveur ; la taille maximum autorisée en <i>upload</i> est de @max@.',
693
+    // U
694
+    'upload_limit' => 'Ce fichier est trop gros pour le serveur ; la taille maximum autorisée en <i>upload</i> est de @max@.',
695 695
 
696
-	// Z
697
-	'zbug_balise_b_aval' => ' : balise B en aval',
698
-	'zbug_balise_inexistante' => 'Balise @balise@ mal déclarée pour @from@',
699
-	'zbug_balise_sans_argument' => 'Argument manquant dans la balise @balise@',
700
-	'zbug_boucle' => 'boucle',
701
-	'zbug_boucle_recursive_undef' => 'Boucle récursive non définie : @nom@',
702
-	'zbug_calcul' => 'calcul',
703
-	'zbug_champ_hors_boucle' => 'Champ @champ@ hors boucle',
704
-	'zbug_champ_hors_critere' => 'Champ @champ@ hors critère @critere@',
705
-	'zbug_champ_hors_motif' => 'Champ @champ@ hors d’un contexte @motif@',
706
-	'zbug_code' => 'code',
707
-	'zbug_critere_inconnu' => 'Critère inconnu @critere@',
708
-	'zbug_critere_sur_table_sans_cle_primaire' => '{@critere@} sur une table sans clef primaire atomique',
709
-	'zbug_distant_interdit' => 'Externe interdit', # Contexte : une base de données "externe", pas gérée par SPIP, mais que SPIP 1.8 sait utiliser dans ses boucles -- seul problèmes certaines manipulations sont interdites sur ces bases-là.
710
-	'zbug_doublon_table_sans_cle_primaire' => 'Doublons sur une table sans clef primaire atomique',
711
-	'zbug_doublon_table_sans_index' => 'Doublons sur une table sans index',
712
-	'zbug_erreur_boucle_double' => 'Double définition de la boucle @id@',
713
-	'zbug_erreur_boucle_fermant' => 'Boucle @id@ non fermée',
714
-	'zbug_erreur_boucle_syntaxe' => 'Syntaxe de la boucle @id@ incorrecte',
715
-	'zbug_erreur_compilation' => 'Erreur de compilation',
716
-	'zbug_erreur_execution_page' => 'Erreur d’exécution',
717
-	'zbug_erreur_filtre' => 'Filtre @filtre@ non défini',
718
-	'zbug_erreur_filtre_nbarg_min' => 'Filtre @filtre@ : il manque @nb@ argument(s)',
719
-	'zbug_erreur_meme_parent' => 'Le critère {meme_parent} ne s’applique qu’aux boucles (FORUMS) ou (RUBRIQUES)',
720
-	'zbug_erreur_squelette' => 'Erreur(s) dans le squelette',
721
-	'zbug_hors_compilation' => 'Hors Compilation',
722
-	'zbug_info_erreur_squelette' => 'Erreur sur le site',
723
-	'zbug_inversion_ordre_inexistant' => 'Inversion d’un ordre inexistant',
724
-	'zbug_pagination_sans_critere' => 'Balise #PAGINATION sans critère {pagination} ou employé dans une boucle récursive',
725
-	'zbug_parametres_inclus_incorrects' => 'Paramètre d’inclusion incorrect : @param@',
726
-	'zbug_profile' => 'Temps de calcul : @time@',
727
-	'zbug_resultat' => 'résultat',
728
-	'zbug_serveur_indefini' => 'Serveur SQL indéfini',
729
-	'zbug_statistiques' => 'Statistiques des requêtes SQL classées par durée',
730
-	'zbug_table_inconnue' => 'Table SQL « @table@ » inconnue',
731
-	'zxml_connus_attributs' => 'attributs connus',
732
-	'zxml_de' => 'de',
733
-	'zxml_inconnu_attribut' => 'attribut inconnu',
734
-	'zxml_inconnu_balise' => 'balise inconnue',
735
-	'zxml_inconnu_entite' => 'entité inconnue',
736
-	'zxml_inconnu_id' => 'ID inconnu',
737
-	'zxml_mais_de' => 'mais de',
738
-	'zxml_non_conforme' => 'n’est pas conforme au motif',
739
-	'zxml_non_fils' => 'n’est pas un fils de',
740
-	'zxml_nonvide_balise' => 'balise non vide',
741
-	'zxml_obligatoire_attribut' => 'attribut obligatoire mais absent dans',
742
-	'zxml_succession_fils_incorrecte' => 'succession des fils incorrecte',
743
-	'zxml_survoler' => 'survoler pour voir les corrects',
744
-	'zxml_valeur_attribut' => 'valeur de l’attribut',
745
-	'zxml_vide_balise' => 'balise vide',
746
-	'zxml_vu' => 'vu auparavant'
696
+    // Z
697
+    'zbug_balise_b_aval' => ' : balise B en aval',
698
+    'zbug_balise_inexistante' => 'Balise @balise@ mal déclarée pour @from@',
699
+    'zbug_balise_sans_argument' => 'Argument manquant dans la balise @balise@',
700
+    'zbug_boucle' => 'boucle',
701
+    'zbug_boucle_recursive_undef' => 'Boucle récursive non définie : @nom@',
702
+    'zbug_calcul' => 'calcul',
703
+    'zbug_champ_hors_boucle' => 'Champ @champ@ hors boucle',
704
+    'zbug_champ_hors_critere' => 'Champ @champ@ hors critère @critere@',
705
+    'zbug_champ_hors_motif' => 'Champ @champ@ hors d’un contexte @motif@',
706
+    'zbug_code' => 'code',
707
+    'zbug_critere_inconnu' => 'Critère inconnu @critere@',
708
+    'zbug_critere_sur_table_sans_cle_primaire' => '{@critere@} sur une table sans clef primaire atomique',
709
+    'zbug_distant_interdit' => 'Externe interdit', # Contexte : une base de données "externe", pas gérée par SPIP, mais que SPIP 1.8 sait utiliser dans ses boucles -- seul problèmes certaines manipulations sont interdites sur ces bases-là.
710
+    'zbug_doublon_table_sans_cle_primaire' => 'Doublons sur une table sans clef primaire atomique',
711
+    'zbug_doublon_table_sans_index' => 'Doublons sur une table sans index',
712
+    'zbug_erreur_boucle_double' => 'Double définition de la boucle @id@',
713
+    'zbug_erreur_boucle_fermant' => 'Boucle @id@ non fermée',
714
+    'zbug_erreur_boucle_syntaxe' => 'Syntaxe de la boucle @id@ incorrecte',
715
+    'zbug_erreur_compilation' => 'Erreur de compilation',
716
+    'zbug_erreur_execution_page' => 'Erreur d’exécution',
717
+    'zbug_erreur_filtre' => 'Filtre @filtre@ non défini',
718
+    'zbug_erreur_filtre_nbarg_min' => 'Filtre @filtre@ : il manque @nb@ argument(s)',
719
+    'zbug_erreur_meme_parent' => 'Le critère {meme_parent} ne s’applique qu’aux boucles (FORUMS) ou (RUBRIQUES)',
720
+    'zbug_erreur_squelette' => 'Erreur(s) dans le squelette',
721
+    'zbug_hors_compilation' => 'Hors Compilation',
722
+    'zbug_info_erreur_squelette' => 'Erreur sur le site',
723
+    'zbug_inversion_ordre_inexistant' => 'Inversion d’un ordre inexistant',
724
+    'zbug_pagination_sans_critere' => 'Balise #PAGINATION sans critère {pagination} ou employé dans une boucle récursive',
725
+    'zbug_parametres_inclus_incorrects' => 'Paramètre d’inclusion incorrect : @param@',
726
+    'zbug_profile' => 'Temps de calcul : @time@',
727
+    'zbug_resultat' => 'résultat',
728
+    'zbug_serveur_indefini' => 'Serveur SQL indéfini',
729
+    'zbug_statistiques' => 'Statistiques des requêtes SQL classées par durée',
730
+    'zbug_table_inconnue' => 'Table SQL « @table@ » inconnue',
731
+    'zxml_connus_attributs' => 'attributs connus',
732
+    'zxml_de' => 'de',
733
+    'zxml_inconnu_attribut' => 'attribut inconnu',
734
+    'zxml_inconnu_balise' => 'balise inconnue',
735
+    'zxml_inconnu_entite' => 'entité inconnue',
736
+    'zxml_inconnu_id' => 'ID inconnu',
737
+    'zxml_mais_de' => 'mais de',
738
+    'zxml_non_conforme' => 'n’est pas conforme au motif',
739
+    'zxml_non_fils' => 'n’est pas un fils de',
740
+    'zxml_nonvide_balise' => 'balise non vide',
741
+    'zxml_obligatoire_attribut' => 'attribut obligatoire mais absent dans',
742
+    'zxml_succession_fils_incorrecte' => 'succession des fils incorrecte',
743
+    'zxml_survoler' => 'survoler pour voir les corrects',
744
+    'zxml_valeur_attribut' => 'valeur de l’attribut',
745
+    'zxml_vide_balise' => 'balise vide',
746
+    'zxml_vu' => 'vu auparavant'
747 747
 );
Please login to merge, or discard this patch.