Completed
Push — master ( a56a38...81a660 )
by cam
01:36
created
prive/formulaires/configurer_reducteur.php 2 patches
Indentation   +78 added lines, -78 removed lines patch added patch discarded remove patch
@@ -17,7 +17,7 @@  discard block
 block discarded – undo
17 17
  **/
18 18
 
19 19
 if (!defined('_ECRIRE_INC_VERSION')) {
20
-	return;
20
+    return;
21 21
 }
22 22
 
23 23
 /**
@@ -27,24 +27,24 @@  discard block
 block discarded – undo
27 27
  *     Environnement du formulaire
28 28
  **/
29 29
 function formulaires_configurer_reducteur_charger_dist() {
30
-	$valeurs = [];
31
-	foreach (
32
-		[
33
-			'image_process',
34
-			'formats_graphiques',
35
-			'creer_preview',
36
-			'taille_preview',
37
-		] as $m
38
-	) {
39
-		$valeurs[$m] = $GLOBALS['meta'][$m] ?? null;
40
-	}
41
-
42
-	$valeurs['taille_preview'] = (int) $valeurs['taille_preview'];
43
-	if ($valeurs['taille_preview'] < 10) {
44
-		$valeurs['taille_preview'] = 120;
45
-	}
46
-
47
-	return $valeurs;
30
+    $valeurs = [];
31
+    foreach (
32
+        [
33
+            'image_process',
34
+            'formats_graphiques',
35
+            'creer_preview',
36
+            'taille_preview',
37
+        ] as $m
38
+    ) {
39
+        $valeurs[$m] = $GLOBALS['meta'][$m] ?? null;
40
+    }
41
+
42
+    $valeurs['taille_preview'] = (int) $valeurs['taille_preview'];
43
+    if ($valeurs['taille_preview'] < 10) {
44
+        $valeurs['taille_preview'] = 120;
45
+    }
46
+
47
+    return $valeurs;
48 48
 }
49 49
 
50 50
 
@@ -55,52 +55,52 @@  discard block
 block discarded – undo
55 55
  *     Retours des traitements
56 56
  **/
57 57
 function formulaires_configurer_reducteur_traiter_dist() {
58
-	$res = ['editable' => true];
59
-
60
-	if (is_array($image_process = _request('image_process_'))) {
61
-		$image_process = array_keys($image_process);
62
-		$image_process = reset($image_process);
63
-
64
-		// application du choix de vignette
65
-		if ($image_process) {
66
-			// mettre a jour les formats graphiques lisibles
67
-			switch ($image_process) {
68
-				case 'gd2':
69
-					$formats_graphiques = $GLOBALS['meta']['gd_formats_read'];
70
-					break;
71
-				case 'netpbm':
72
-					$formats_graphiques = $GLOBALS['meta']['netpbm_formats'];
73
-					break;
74
-				case 'convert':
75
-				case 'imagick':
76
-					$formats_graphiques = 'gif,jpg,png,webp';
77
-					break;
78
-				default: #debug
79
-					$formats_graphiques = '';
80
-					$image_process = 'non';
81
-					break;
82
-			}
83
-			ecrire_meta('formats_graphiques', $formats_graphiques, 'non');
84
-			ecrire_meta('image_process', $image_process, 'non');
85
-		}
86
-	}
87
-
88
-	foreach (
89
-		[
90
-			'creer_preview'
91
-		] as $m
92
-	) {
93
-		if (!is_null($v = _request($m))) {
94
-			ecrire_meta($m, $v == 'oui' ? 'oui' : 'non');
95
-		}
96
-	}
97
-	if (!is_null($v = _request('taille_preview'))) {
98
-		ecrire_meta('taille_preview', (int) $v);
99
-	}
100
-
101
-	$res['message_ok'] = _T('config_info_enregistree');
102
-
103
-	return $res;
58
+    $res = ['editable' => true];
59
+
60
+    if (is_array($image_process = _request('image_process_'))) {
61
+        $image_process = array_keys($image_process);
62
+        $image_process = reset($image_process);
63
+
64
+        // application du choix de vignette
65
+        if ($image_process) {
66
+            // mettre a jour les formats graphiques lisibles
67
+            switch ($image_process) {
68
+                case 'gd2':
69
+                    $formats_graphiques = $GLOBALS['meta']['gd_formats_read'];
70
+                    break;
71
+                case 'netpbm':
72
+                    $formats_graphiques = $GLOBALS['meta']['netpbm_formats'];
73
+                    break;
74
+                case 'convert':
75
+                case 'imagick':
76
+                    $formats_graphiques = 'gif,jpg,png,webp';
77
+                    break;
78
+                default: #debug
79
+                    $formats_graphiques = '';
80
+                    $image_process = 'non';
81
+                    break;
82
+            }
83
+            ecrire_meta('formats_graphiques', $formats_graphiques, 'non');
84
+            ecrire_meta('image_process', $image_process, 'non');
85
+        }
86
+    }
87
+
88
+    foreach (
89
+        [
90
+            'creer_preview'
91
+        ] as $m
92
+    ) {
93
+        if (!is_null($v = _request($m))) {
94
+            ecrire_meta($m, $v == 'oui' ? 'oui' : 'non');
95
+        }
96
+    }
97
+    if (!is_null($v = _request('taille_preview'))) {
98
+        ecrire_meta('taille_preview', (int) $v);
99
+    }
100
+
101
+    $res['message_ok'] = _T('config_info_enregistree');
102
+
103
+    return $res;
104 104
 }
105 105
 
106 106
 /**
@@ -113,17 +113,17 @@  discard block
 block discarded – undo
113 113
  *     URL d'action pour tester la librairie graphique en créant une vignette
114 114
  **/
115 115
 function url_vignette_choix(string $process): string {
116
-	$ok = match ($process) {
117
-		'gd2' => function_exists('ImageCreateTrueColor'),
118
-		'netpbm' => !(defined('_PNMSCALE_COMMAND') && _PNMSCALE_COMMAND == ''),
119
-		'imagick' => method_exists(\Imagick::class, 'readImage'),
120
-		'convert' => !(defined('_CONVERT_COMMAND') && _CONVERT_COMMAND == ''),
121
-		default => false,
122
-	};
123
-
124
-	if (!$ok) {
125
-		return '';
126
-	}
127
-
128
-	return generer_url_action('tester', "arg=$process&time=" . time());
116
+    $ok = match ($process) {
117
+        'gd2' => function_exists('ImageCreateTrueColor'),
118
+        'netpbm' => !(defined('_PNMSCALE_COMMAND') && _PNMSCALE_COMMAND == ''),
119
+        'imagick' => method_exists(\Imagick::class, 'readImage'),
120
+        'convert' => !(defined('_CONVERT_COMMAND') && _CONVERT_COMMAND == ''),
121
+        default => false,
122
+    };
123
+
124
+    if (!$ok) {
125
+        return '';
126
+    }
127
+
128
+    return generer_url_action('tester', "arg=$process&time=" . time());
129 129
 }
Please login to merge, or discard this patch.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -125,5 +125,5 @@
 block discarded – undo
125 125
 		return '';
126 126
 	}
127 127
 
128
-	return generer_url_action('tester', "arg=$process&time=" . time());
128
+	return generer_url_action('tester', "arg=$process&time=".time());
129 129
 }
Please login to merge, or discard this patch.
ecrire/action/tester.php 2 patches
Indentation   +98 added lines, -98 removed lines patch added patch discarded remove patch
@@ -16,7 +16,7 @@  discard block
 block discarded – undo
16 16
  */
17 17
 
18 18
 if (!defined('_ECRIRE_INC_VERSION')) {
19
-	return;
19
+    return;
20 20
 }
21 21
 
22 22
 /**
@@ -29,101 +29,101 @@  discard block
 block discarded – undo
29 29
  * redirige sur l'image ainsi créée (sinon sur une image d'echec).
30 30
  **/
31 31
 function action_tester_dist() {
32
-	$arg = _request('arg');
33
-
34
-	// verifier les formats acceptes par GD
35
-	if ($arg === 'gd2') {
36
-		$gd_formats = [];
37
-
38
-		if (function_exists('imagetypes')) {
39
-			if (imagetypes() & IMG_GIF) {
40
-				$gd_formats[] = 'gif';
41
-			}
42
-			if (imagetypes() & IMG_JPG) {
43
-				$gd_formats[] = 'jpg';
44
-			}
45
-			if (imagetypes() & IMG_PNG) {
46
-				$gd_formats[] = 'png';
47
-			}
48
-			if (imagetypes() & IMG_WEBP) {
49
-				$gd_formats[] = 'webp';
50
-			}
51
-		}
52
-
53
-		$gd_formats = implode(',', $gd_formats);
54
-		ecrire_meta('gd_formats_read', $gd_formats);
55
-		ecrire_meta('gd_formats', $gd_formats);
56
-
57
-	} elseif ($arg == 'netpbm') {
58
-		// verifier les formats netpbm
59
-		if (!defined('_PNMSCALE_COMMAND')) {
60
-			define('_PNMSCALE_COMMAND', 'pnmscale');
61
-		} // Securite : mes_options.php peut preciser le chemin absolu
62
-		if (_PNMSCALE_COMMAND == '') {
63
-			return;
64
-		}
65
-		$netpbm_formats = [];
66
-
67
-		$jpegtopnm_command = str_replace(
68
-			'pnmscale',
69
-			'jpegtopnm',
70
-			_PNMSCALE_COMMAND
71
-		);
72
-		$pnmtojpeg_command = str_replace(
73
-			'pnmscale',
74
-			'pnmtojpeg',
75
-			_PNMSCALE_COMMAND
76
-		);
77
-
78
-		$vignette = _ROOT_IMG_PACK . 'test.jpg';
79
-		$dest = _DIR_VAR . 'test-jpg.jpg';
80
-		$commande = "$jpegtopnm_command $vignette | " . _PNMSCALE_COMMAND . " -width 10 | $pnmtojpeg_command > $dest";
81
-		spip_log($commande);
82
-		exec($commande);
83
-		if (($taille = @getimagesize($dest)) && $taille[1] == 10) {
84
-			$netpbm_formats[] = 'jpg';
85
-		}
86
-		$giftopnm_command = str_replace('pnmscale', 'giftopnm', _PNMSCALE_COMMAND);
87
-		$pnmtojpeg_command = str_replace('pnmscale', 'pnmtojpeg', _PNMSCALE_COMMAND);
88
-		$vignette = _ROOT_IMG_PACK . 'test.gif';
89
-		$dest = _DIR_VAR . 'test-gif.jpg';
90
-		$commande = "$giftopnm_command $vignette | " . _PNMSCALE_COMMAND . " -width 10 | $pnmtojpeg_command > $dest";
91
-		spip_log($commande);
92
-		exec($commande);
93
-		if (($taille = @getimagesize($dest)) && $taille[1] == 10) {
94
-			$netpbm_formats[] = 'gif';
95
-		}
96
-
97
-		$pngtopnm_command = str_replace('pnmscale', 'pngtopnm', _PNMSCALE_COMMAND);
98
-		$vignette = _ROOT_IMG_PACK . 'test.png';
99
-		$dest = _DIR_VAR . 'test-gif.jpg';
100
-		$commande = "$pngtopnm_command $vignette | " . _PNMSCALE_COMMAND . " -width 10 | $pnmtojpeg_command > $dest";
101
-		spip_log($commande);
102
-		exec($commande);
103
-		if (($taille = @getimagesize($dest)) && $taille[1] == 10) {
104
-			$netpbm_formats[] = 'png';
105
-		}
106
-
107
-		ecrire_meta('netpbm_formats', implode(',', $netpbm_formats ?: []));
108
-	}
109
-
110
-	// et maintenant envoyer la vignette de tests
111
-	if (in_array($arg, ['gd2', 'imagick', 'convert', 'netpbm'])) {
112
-		include_spip('inc/filtres');
113
-		include_spip('inc/filtres_images_mini');
114
-		$taille_preview = 150;
115
-		$image = _image_valeurs_trans(_DIR_IMG_PACK . 'test_image.jpg', "reduire-$taille_preview-$taille_preview", 'jpg');
116
-
117
-		$image['fichier_dest'] = _DIR_VAR . "test_$arg";
118
-
119
-		if (
120
-			($preview = _image_creer_vignette($image, $taille_preview, $taille_preview, $arg, true))
121
-			&& $preview['width'] * $preview['height'] > 0
122
-		) {
123
-			redirige_par_entete($preview['fichier']);
124
-		}
125
-	}
126
-
127
-	# image echec
128
-	redirige_par_entete(chemin_image('echec-reducteur-xx.svg'));
32
+    $arg = _request('arg');
33
+
34
+    // verifier les formats acceptes par GD
35
+    if ($arg === 'gd2') {
36
+        $gd_formats = [];
37
+
38
+        if (function_exists('imagetypes')) {
39
+            if (imagetypes() & IMG_GIF) {
40
+                $gd_formats[] = 'gif';
41
+            }
42
+            if (imagetypes() & IMG_JPG) {
43
+                $gd_formats[] = 'jpg';
44
+            }
45
+            if (imagetypes() & IMG_PNG) {
46
+                $gd_formats[] = 'png';
47
+            }
48
+            if (imagetypes() & IMG_WEBP) {
49
+                $gd_formats[] = 'webp';
50
+            }
51
+        }
52
+
53
+        $gd_formats = implode(',', $gd_formats);
54
+        ecrire_meta('gd_formats_read', $gd_formats);
55
+        ecrire_meta('gd_formats', $gd_formats);
56
+
57
+    } elseif ($arg == 'netpbm') {
58
+        // verifier les formats netpbm
59
+        if (!defined('_PNMSCALE_COMMAND')) {
60
+            define('_PNMSCALE_COMMAND', 'pnmscale');
61
+        } // Securite : mes_options.php peut preciser le chemin absolu
62
+        if (_PNMSCALE_COMMAND == '') {
63
+            return;
64
+        }
65
+        $netpbm_formats = [];
66
+
67
+        $jpegtopnm_command = str_replace(
68
+            'pnmscale',
69
+            'jpegtopnm',
70
+            _PNMSCALE_COMMAND
71
+        );
72
+        $pnmtojpeg_command = str_replace(
73
+            'pnmscale',
74
+            'pnmtojpeg',
75
+            _PNMSCALE_COMMAND
76
+        );
77
+
78
+        $vignette = _ROOT_IMG_PACK . 'test.jpg';
79
+        $dest = _DIR_VAR . 'test-jpg.jpg';
80
+        $commande = "$jpegtopnm_command $vignette | " . _PNMSCALE_COMMAND . " -width 10 | $pnmtojpeg_command > $dest";
81
+        spip_log($commande);
82
+        exec($commande);
83
+        if (($taille = @getimagesize($dest)) && $taille[1] == 10) {
84
+            $netpbm_formats[] = 'jpg';
85
+        }
86
+        $giftopnm_command = str_replace('pnmscale', 'giftopnm', _PNMSCALE_COMMAND);
87
+        $pnmtojpeg_command = str_replace('pnmscale', 'pnmtojpeg', _PNMSCALE_COMMAND);
88
+        $vignette = _ROOT_IMG_PACK . 'test.gif';
89
+        $dest = _DIR_VAR . 'test-gif.jpg';
90
+        $commande = "$giftopnm_command $vignette | " . _PNMSCALE_COMMAND . " -width 10 | $pnmtojpeg_command > $dest";
91
+        spip_log($commande);
92
+        exec($commande);
93
+        if (($taille = @getimagesize($dest)) && $taille[1] == 10) {
94
+            $netpbm_formats[] = 'gif';
95
+        }
96
+
97
+        $pngtopnm_command = str_replace('pnmscale', 'pngtopnm', _PNMSCALE_COMMAND);
98
+        $vignette = _ROOT_IMG_PACK . 'test.png';
99
+        $dest = _DIR_VAR . 'test-gif.jpg';
100
+        $commande = "$pngtopnm_command $vignette | " . _PNMSCALE_COMMAND . " -width 10 | $pnmtojpeg_command > $dest";
101
+        spip_log($commande);
102
+        exec($commande);
103
+        if (($taille = @getimagesize($dest)) && $taille[1] == 10) {
104
+            $netpbm_formats[] = 'png';
105
+        }
106
+
107
+        ecrire_meta('netpbm_formats', implode(',', $netpbm_formats ?: []));
108
+    }
109
+
110
+    // et maintenant envoyer la vignette de tests
111
+    if (in_array($arg, ['gd2', 'imagick', 'convert', 'netpbm'])) {
112
+        include_spip('inc/filtres');
113
+        include_spip('inc/filtres_images_mini');
114
+        $taille_preview = 150;
115
+        $image = _image_valeurs_trans(_DIR_IMG_PACK . 'test_image.jpg', "reduire-$taille_preview-$taille_preview", 'jpg');
116
+
117
+        $image['fichier_dest'] = _DIR_VAR . "test_$arg";
118
+
119
+        if (
120
+            ($preview = _image_creer_vignette($image, $taille_preview, $taille_preview, $arg, true))
121
+            && $preview['width'] * $preview['height'] > 0
122
+        ) {
123
+            redirige_par_entete($preview['fichier']);
124
+        }
125
+    }
126
+
127
+    # image echec
128
+    redirige_par_entete(chemin_image('echec-reducteur-xx.svg'));
129 129
 }
Please login to merge, or discard this patch.
Spacing   +11 added lines, -11 removed lines patch added patch discarded remove patch
@@ -75,9 +75,9 @@  discard block
 block discarded – undo
75 75
 			_PNMSCALE_COMMAND
76 76
 		);
77 77
 
78
-		$vignette = _ROOT_IMG_PACK . 'test.jpg';
79
-		$dest = _DIR_VAR . 'test-jpg.jpg';
80
-		$commande = "$jpegtopnm_command $vignette | " . _PNMSCALE_COMMAND . " -width 10 | $pnmtojpeg_command > $dest";
78
+		$vignette = _ROOT_IMG_PACK.'test.jpg';
79
+		$dest = _DIR_VAR.'test-jpg.jpg';
80
+		$commande = "$jpegtopnm_command $vignette | "._PNMSCALE_COMMAND." -width 10 | $pnmtojpeg_command > $dest";
81 81
 		spip_log($commande);
82 82
 		exec($commande);
83 83
 		if (($taille = @getimagesize($dest)) && $taille[1] == 10) {
@@ -85,9 +85,9 @@  discard block
 block discarded – undo
85 85
 		}
86 86
 		$giftopnm_command = str_replace('pnmscale', 'giftopnm', _PNMSCALE_COMMAND);
87 87
 		$pnmtojpeg_command = str_replace('pnmscale', 'pnmtojpeg', _PNMSCALE_COMMAND);
88
-		$vignette = _ROOT_IMG_PACK . 'test.gif';
89
-		$dest = _DIR_VAR . 'test-gif.jpg';
90
-		$commande = "$giftopnm_command $vignette | " . _PNMSCALE_COMMAND . " -width 10 | $pnmtojpeg_command > $dest";
88
+		$vignette = _ROOT_IMG_PACK.'test.gif';
89
+		$dest = _DIR_VAR.'test-gif.jpg';
90
+		$commande = "$giftopnm_command $vignette | "._PNMSCALE_COMMAND." -width 10 | $pnmtojpeg_command > $dest";
91 91
 		spip_log($commande);
92 92
 		exec($commande);
93 93
 		if (($taille = @getimagesize($dest)) && $taille[1] == 10) {
@@ -95,9 +95,9 @@  discard block
 block discarded – undo
95 95
 		}
96 96
 
97 97
 		$pngtopnm_command = str_replace('pnmscale', 'pngtopnm', _PNMSCALE_COMMAND);
98
-		$vignette = _ROOT_IMG_PACK . 'test.png';
99
-		$dest = _DIR_VAR . 'test-gif.jpg';
100
-		$commande = "$pngtopnm_command $vignette | " . _PNMSCALE_COMMAND . " -width 10 | $pnmtojpeg_command > $dest";
98
+		$vignette = _ROOT_IMG_PACK.'test.png';
99
+		$dest = _DIR_VAR.'test-gif.jpg';
100
+		$commande = "$pngtopnm_command $vignette | "._PNMSCALE_COMMAND." -width 10 | $pnmtojpeg_command > $dest";
101 101
 		spip_log($commande);
102 102
 		exec($commande);
103 103
 		if (($taille = @getimagesize($dest)) && $taille[1] == 10) {
@@ -112,9 +112,9 @@  discard block
 block discarded – undo
112 112
 		include_spip('inc/filtres');
113 113
 		include_spip('inc/filtres_images_mini');
114 114
 		$taille_preview = 150;
115
-		$image = _image_valeurs_trans(_DIR_IMG_PACK . 'test_image.jpg', "reduire-$taille_preview-$taille_preview", 'jpg');
115
+		$image = _image_valeurs_trans(_DIR_IMG_PACK.'test_image.jpg', "reduire-$taille_preview-$taille_preview", 'jpg');
116 116
 
117
-		$image['fichier_dest'] = _DIR_VAR . "test_$arg";
117
+		$image['fichier_dest'] = _DIR_VAR."test_$arg";
118 118
 
119 119
 		if (
120 120
 			($preview = _image_creer_vignette($image, $taille_preview, $taille_preview, $arg, true))
Please login to merge, or discard this patch.
ecrire/inc/filtres_images_lib_mini.php 2 patches
Indentation   +1287 added lines, -1287 removed lines patch added patch discarded remove patch
@@ -17,7 +17,7 @@  discard block
 block discarded – undo
17 17
  */
18 18
 
19 19
 if (!defined('_ECRIRE_INC_VERSION')) {
20
-	return;
20
+    return;
21 21
 }
22 22
 include_spip('inc/filtres'); // par precaution
23 23
 include_spip('inc/filtres_images_mini'); // par precaution
@@ -37,21 +37,21 @@  discard block
 block discarded – undo
37 37
  *     Le code de la couleur en hexadécimal.
38 38
  */
39 39
 function _couleur_dec_to_hex($red, $green, $blue) {
40
-	$red = dechex($red);
41
-	$green = dechex($green);
42
-	$blue = dechex($blue);
43
-
44
-	if (strlen($red) == 1) {
45
-		$red = '0' . $red;
46
-	}
47
-	if (strlen($green) == 1) {
48
-		$green = '0' . $green;
49
-	}
50
-	if (strlen($blue) == 1) {
51
-		$blue = '0' . $blue;
52
-	}
53
-
54
-	return "$red$green$blue";
40
+    $red = dechex($red);
41
+    $green = dechex($green);
42
+    $blue = dechex($blue);
43
+
44
+    if (strlen($red) == 1) {
45
+        $red = '0' . $red;
46
+    }
47
+    if (strlen($green) == 1) {
48
+        $green = '0' . $green;
49
+    }
50
+    if (strlen($blue) == 1) {
51
+        $blue = '0' . $blue;
52
+    }
53
+
54
+    return "$red$green$blue";
55 55
 }
56 56
 
57 57
 /**
@@ -63,18 +63,18 @@  discard block
 block discarded – undo
63 63
  *     Un tableau des 3 éléments : rouge, vert, bleu.
64 64
  */
65 65
 function _couleur_hex_to_dec($couleur) {
66
-	$couleur ??= '';
67
-	$couleur = couleur_html_to_hex($couleur);
68
-	$couleur = ltrim($couleur, '#');
69
-	if (strlen($couleur) === 3) {
70
-		$couleur = $couleur[0] . $couleur[0] . $couleur[1] . $couleur[1] . $couleur[2] . $couleur[2];
71
-	}
72
-	$retour = [];
73
-	$retour['red'] = hexdec(substr($couleur, 0, 2));
74
-	$retour['green'] = hexdec(substr($couleur, 2, 2));
75
-	$retour['blue'] = hexdec(substr($couleur, 4, 2));
76
-
77
-	return $retour;
66
+    $couleur ??= '';
67
+    $couleur = couleur_html_to_hex($couleur);
68
+    $couleur = ltrim($couleur, '#');
69
+    if (strlen($couleur) === 3) {
70
+        $couleur = $couleur[0] . $couleur[0] . $couleur[1] . $couleur[1] . $couleur[2] . $couleur[2];
71
+    }
72
+    $retour = [];
73
+    $retour['red'] = hexdec(substr($couleur, 0, 2));
74
+    $retour['green'] = hexdec(substr($couleur, 2, 2));
75
+    $retour['blue'] = hexdec(substr($couleur, 4, 2));
76
+
77
+    return $retour;
78 78
 }
79 79
 
80 80
 
@@ -91,8 +91,8 @@  discard block
 block discarded – undo
91 91
  *     Le code de la couleur en hexadécimal.
92 92
  */
93 93
 function _couleur_hsl_to_hex($hue, $saturation, $lightness) {
94
-	$rgb = _couleur_hsl_to_rgb($hue, $saturation, $lightness);
95
-	return _couleur_dec_to_hex($rgb['r'], $rgb['g'], $rgb['b']);
94
+    $rgb = _couleur_hsl_to_rgb($hue, $saturation, $lightness);
95
+    return _couleur_dec_to_hex($rgb['r'], $rgb['g'], $rgb['b']);
96 96
 }
97 97
 
98 98
 /**
@@ -104,8 +104,8 @@  discard block
 block discarded – undo
104 104
  *     Un tableau des 3 éléments : teinte, saturation, luminosité.
105 105
  */
106 106
 function _couleur_hex_to_hsl($couleur) {
107
-	$rgb = _couleur_hex_to_dec($couleur);
108
-	return _couleur_rgb_to_hsl($rgb['red'], $rgb['green'], $rgb['blue']);
107
+    $rgb = _couleur_hex_to_dec($couleur);
108
+    return _couleur_rgb_to_hsl($rgb['red'], $rgb['green'], $rgb['blue']);
109 109
 }
110 110
 
111 111
 /**
@@ -120,55 +120,55 @@  discard block
 block discarded – undo
120 120
  * @return array
121 121
  */
122 122
 function _couleur_rgb_to_hsl($R, $G, $B) {
123
-	$H = null;
124
-	$var_R = ($R / 255); // Where RGB values = 0 ÷ 255
125
-	$var_G = ($G / 255);
126
-	$var_B = ($B / 255);
127
-
128
-	$var_Min = min($var_R, $var_G, $var_B);   //Min. value of RGB
129
-	$var_Max = max($var_R, $var_G, $var_B);   //Max. value of RGB
130
-	$del_Max = $var_Max - $var_Min;           //Delta RGB value
131
-
132
-	$L = ($var_Max + $var_Min) / 2;
133
-
134
-	if ($del_Max == 0) {
135
-		//This is a gray, no chroma...
136
-		$H = 0; //HSL results = 0 ÷ 1
137
-		$S = 0;
138
-	} else {
139
-		// Chromatic data...
140
-		$S = $L < 0.5 ? $del_Max / ($var_Max + $var_Min) : $del_Max / (2 - $var_Max - $var_Min);
141
-
142
-		$del_R = ((($var_Max - $var_R) / 6) + ($del_Max / 2)) / $del_Max;
143
-		$del_G = ((($var_Max - $var_G) / 6) + ($del_Max / 2)) / $del_Max;
144
-		$del_B = ((($var_Max - $var_B) / 6) + ($del_Max / 2)) / $del_Max;
145
-
146
-		if ($var_R === $var_Max) {
147
-			$H = $del_B - $del_G;
148
-		} else {
149
-			if ($var_G === $var_Max) {
150
-				$H = (1 / 3) + $del_R - $del_B;
151
-			} else {
152
-				if ($var_B === $var_Max) {
153
-					$H = (2 / 3) + $del_G - $del_R;
154
-				}
155
-			}
156
-		}
157
-
158
-		if ($H < 0) {
159
-			$H += 1;
160
-		}
161
-		if ($H > 1) {
162
-			$H -= 1;
163
-		}
164
-	}
165
-
166
-	$ret = [];
167
-	$ret['h'] = $H;
168
-	$ret['s'] = $S;
169
-	$ret['l'] = $L;
170
-
171
-	return $ret;
123
+    $H = null;
124
+    $var_R = ($R / 255); // Where RGB values = 0 ÷ 255
125
+    $var_G = ($G / 255);
126
+    $var_B = ($B / 255);
127
+
128
+    $var_Min = min($var_R, $var_G, $var_B);   //Min. value of RGB
129
+    $var_Max = max($var_R, $var_G, $var_B);   //Max. value of RGB
130
+    $del_Max = $var_Max - $var_Min;           //Delta RGB value
131
+
132
+    $L = ($var_Max + $var_Min) / 2;
133
+
134
+    if ($del_Max == 0) {
135
+        //This is a gray, no chroma...
136
+        $H = 0; //HSL results = 0 ÷ 1
137
+        $S = 0;
138
+    } else {
139
+        // Chromatic data...
140
+        $S = $L < 0.5 ? $del_Max / ($var_Max + $var_Min) : $del_Max / (2 - $var_Max - $var_Min);
141
+
142
+        $del_R = ((($var_Max - $var_R) / 6) + ($del_Max / 2)) / $del_Max;
143
+        $del_G = ((($var_Max - $var_G) / 6) + ($del_Max / 2)) / $del_Max;
144
+        $del_B = ((($var_Max - $var_B) / 6) + ($del_Max / 2)) / $del_Max;
145
+
146
+        if ($var_R === $var_Max) {
147
+            $H = $del_B - $del_G;
148
+        } else {
149
+            if ($var_G === $var_Max) {
150
+                $H = (1 / 3) + $del_R - $del_B;
151
+            } else {
152
+                if ($var_B === $var_Max) {
153
+                    $H = (2 / 3) + $del_G - $del_R;
154
+                }
155
+            }
156
+        }
157
+
158
+        if ($H < 0) {
159
+            $H += 1;
160
+        }
161
+        if ($H > 1) {
162
+            $H -= 1;
163
+        }
164
+    }
165
+
166
+    $ret = [];
167
+    $ret['h'] = $H;
168
+    $ret['s'] = $S;
169
+    $ret['l'] = $L;
170
+
171
+    return $ret;
172 172
 }
173 173
 
174 174
 
@@ -184,48 +184,48 @@  discard block
 block discarded – undo
184 184
  * @return array
185 185
  */
186 186
 function _couleur_hsl_to_rgb($H, $S, $L) {
187
-	// helper
188
-	$hue_2_rgb = function ($v1, $v2, $vH) {
189
-		if ($vH < 0) {
190
-			$vH += 1;
191
-		}
192
-		if ($vH > 1) {
193
-			$vH -= 1;
194
-		}
195
-		if ((6 * $vH) < 1) {
196
-			return ($v1 + ($v2 - $v1) * 6 * $vH);
197
-		}
198
-		if ((2 * $vH) < 1) {
199
-			return ($v2);
200
-		}
201
-		if ((3 * $vH) < 2) {
202
-			return ($v1 + ($v2 - $v1) * ((2 / 3) - $vH) * 6);
203
-		}
204
-
205
-		return ($v1);
206
-	};
207
-
208
-	if ($S == 0) {
209
-		// HSV values = 0 -> 1
210
-		$R = $L * 255;
211
-		$G = $L * 255;
212
-		$B = $L * 255;
213
-	} else {
214
-		$var_2 = $L < 0.5 ? $L * (1 + $S) : ($L + $S) - ($S * $L);
215
-
216
-		$var_1 = 2 * $L - $var_2;
217
-
218
-		$R = 255 * $hue_2_rgb($var_1, $var_2, $H + (1 / 3));
219
-		$G = 255 * $hue_2_rgb($var_1, $var_2, $H);
220
-		$B = 255 * $hue_2_rgb($var_1, $var_2, $H - (1 / 3));
221
-	}
222
-
223
-	$ret = [];
224
-	$ret['r'] = floor($R);
225
-	$ret['g'] = floor($G);
226
-	$ret['b'] = floor($B);
227
-
228
-	return $ret;
187
+    // helper
188
+    $hue_2_rgb = function ($v1, $v2, $vH) {
189
+        if ($vH < 0) {
190
+            $vH += 1;
191
+        }
192
+        if ($vH > 1) {
193
+            $vH -= 1;
194
+        }
195
+        if ((6 * $vH) < 1) {
196
+            return ($v1 + ($v2 - $v1) * 6 * $vH);
197
+        }
198
+        if ((2 * $vH) < 1) {
199
+            return ($v2);
200
+        }
201
+        if ((3 * $vH) < 2) {
202
+            return ($v1 + ($v2 - $v1) * ((2 / 3) - $vH) * 6);
203
+        }
204
+
205
+        return ($v1);
206
+    };
207
+
208
+    if ($S == 0) {
209
+        // HSV values = 0 -> 1
210
+        $R = $L * 255;
211
+        $G = $L * 255;
212
+        $B = $L * 255;
213
+    } else {
214
+        $var_2 = $L < 0.5 ? $L * (1 + $S) : ($L + $S) - ($S * $L);
215
+
216
+        $var_1 = 2 * $L - $var_2;
217
+
218
+        $R = 255 * $hue_2_rgb($var_1, $var_2, $H + (1 / 3));
219
+        $G = 255 * $hue_2_rgb($var_1, $var_2, $H);
220
+        $B = 255 * $hue_2_rgb($var_1, $var_2, $H - (1 / 3));
221
+    }
222
+
223
+    $ret = [];
224
+    $ret['r'] = floor($R);
225
+    $ret['g'] = floor($G);
226
+    $ret['b'] = floor($B);
227
+
228
+    return $ret;
229 229
 }
230 230
 
231 231
 /**
@@ -243,11 +243,11 @@  discard block
 block discarded – undo
243 243
  *     true si il faut supprimer le fichier temporaire ; false sinon.
244 244
  */
245 245
 function statut_effacer_images_temporaires($stat) {
246
-	static $statut = false; // par defaut on grave toute les images
247
-	if ($stat === 'get') {
248
-		return $statut;
249
-	}
250
-	$statut = (bool) $stat;
246
+    static $statut = false; // par defaut on grave toute les images
247
+    if ($stat === 'get') {
248
+        return $statut;
249
+    }
250
+    $statut = (bool) $stat;
251 251
 }
252 252
 
253 253
 
@@ -300,251 +300,251 @@  discard block
 block discarded – undo
300 300
  *     - array : tableau décrivant de l'image
301 301
  */
302 302
 function _image_valeurs_trans($img, $effet, $forcer_format = false, $fonction_creation = null, $find_in_path = false, $support_svg = false) {
303
-	$valeurs = [];
304
-	$ret = [];
305
-	$f = null;
306
-	static $images_recalcul = [];
307
-	if (strlen($img) == 0) {
308
-		return false;
309
-	}
310
-
311
-	$source = trim(extraire_attribut($img, 'src') ?? '');
312
-	if (strlen($source) < 1) {
313
-		if (!str_starts_with($img, '<img ')) {
314
-			$source = $img;
315
-			$img = "<img src='$source' />";
316
-		} else {
317
-			// pas d'attribut src sur cette balise <img../>
318
-			return false;
319
-		}
320
-	} elseif (
321
-		preg_match('@^data:image/([^;]*);base64,(.*)$@isS', $source, $regs)
322
-		&& ($extension = _image_trouver_extension_depuis_mime('image/' . $regs[1]))
323
-		&& in_array($extension, _image_extensions_acceptees_en_entree())
324
-	) {
325
-		# gerer img src="data:....base64"
326
-		$local = sous_repertoire(_DIR_VAR, 'image-data') . md5($regs[2]) . '.' . _image_extension_normalisee($extension);
327
-		if (!file_exists($local)) {
328
-			ecrire_fichier($local, base64_decode($regs[2]));
329
-		}
330
-		if ($sanitizer = charger_fonction($extension, 'sanitizer', true)) {
331
-			$sanitizer($local);
332
-		}
333
-		$source = $local;
334
-		$img = inserer_attribut($img, 'src', $source);
335
-		# eviter les mauvaises surprises lors de conversions de format
336
-		$img = inserer_attribut($img, 'width', '');
337
-		$img = inserer_attribut($img, 'height', '');
338
-	}
339
-
340
-	// les protocoles web prennent au moins 3 lettres
341
-	if (tester_url_absolue($source)) {
342
-		include_spip('inc/distant');
343
-		$fichier = _DIR_RACINE . copie_locale($source);
344
-		if (!$fichier) {
345
-			return '';
346
-		}
347
-		if (
348
-			($extension = _image_trouver_extension($fichier))
349
-			&& ($sanitizer = charger_fonction($extension, 'sanitizer', true))
350
-		) {
351
-			$sanitizer($fichier);
352
-		}
353
-	} else {
354
-		// enlever le timestamp eventuel
355
-		if (str_contains($source, '?')) {
356
-			$source = preg_replace(',[?]\d+$,', '', $source);
357
-		}
358
-		if (
359
-			str_contains($source, '?')
360
-			&& str_starts_with($source, _DIR_IMG)
361
-			&& file_exists($f = preg_replace(',[?].*$,', '', $source))
362
-		) {
363
-			$source = $f;
364
-		}
365
-		$fichier = $source;
366
-	}
367
-
368
-	$terminaison_dest = '';
369
-	if ($terminaison = _image_trouver_extension($fichier)) {
370
-		$terminaison_dest = ($terminaison == 'gif') ? 'png' : $terminaison;
371
-	}
372
-
373
-	if (
374
-		$forcer_format !== false
375
-		&& ($terminaison_dest !== 'svg' || $support_svg || !in_array($forcer_format, _image_extensions_acceptees_en_sortie()))
376
-	) {
377
-		$terminaison_dest = $forcer_format;
378
-	}
379
-
380
-	if (!$terminaison_dest) {
381
-		return false;
382
-	}
383
-
384
-	$nom_fichier = substr($fichier, 0, strlen($fichier) - (strlen($terminaison) + 1));
385
-	$fichier_dest = $nom_fichier;
386
-	if (
387
-		$find_in_path && ($f = find_in_path($fichier)) && ($fichier = $f)
388
-		|| @file_exists($f = $fichier)
389
-	) {
390
-		// on ne passe jamais la balise img qui est peut-être en x2 et à laquelle on ne peut pas faire confiance
391
-		// on lit directement les infos du fichier
392
-		[$ret['hauteur'], $ret['largeur']] = taille_image($f);
393
-		$date_src = @filemtime($f);
394
-	} elseif (
395
-		@file_exists($f = "$fichier.src")
396
-		&& lire_fichier($f, $valeurs)
397
-		&& ($valeurs = unserialize($valeurs))
398
-		&& isset($valeurs['hauteur_dest'])
399
-		&& isset($valeurs['largeur_dest'])
400
-	) {
401
-		$ret['hauteur'] = $valeurs['hauteur_dest'];
402
-		$ret['largeur'] = $valeurs['largeur_dest'];
403
-		$date_src = $valeurs['date'];
404
-	} // pas de fichier source par la
405
-	else {
406
-		return false;
407
-	}
408
-
409
-	// pas de taille mesurable ?
410
-	if (
411
-		!$ret['hauteur']
412
-		|| !($ret['hauteur'] = (int) round($ret['hauteur']))
413
-		|| !$ret['largeur']
414
-		|| !($ret['largeur'] = (int) round($ret['largeur']))
415
-	) {
416
-		return false;
417
-	}
418
-
419
-	// les images calculees dependent du chemin du fichier source
420
-	// pour une meme image source et un meme filtre on aboutira a 2 fichiers selon si l'appel est dans le public ou dans le prive
421
-	// ce n'est pas totalement optimal en terme de stockage, mais chaque image est associee a un fichier .src
422
-	// qui contient la methode de reconstrucion (le filtre + les arguments d'appel) et les arguments different entre prive et public
423
-	// la mise en commun du fichier image cree donc un bug et des problemes qui necessiteraient beaucoup de complexite de code
424
-	// alors que ca concerne peu de site au final
425
-	// la release de r23632+r23633+r23634 a provoque peu de remontee de bug attestant du peu de sites impactes
426
-	$identifiant = $fichier;
427
-
428
-	// cas general :
429
-	// on a un dossier cache commun et un nom de fichier qui varie avec l'effet
430
-	// cas particulier de reduire :
431
-	// un cache par dimension, et le nom de fichier est conserve, suffixe par la dimension aussi
432
-	$cache = 'cache-gd2';
433
-	if (str_starts_with($effet, 'reduire')) {
434
-		[, $maxWidth, $maxHeight] = explode('-', $effet);
435
-		[$destWidth, $destHeight] = _image_ratio($ret['largeur'], $ret['hauteur'], $maxWidth, $maxHeight);
436
-		$ret['largeur_dest'] = $destWidth;
437
-		$ret['hauteur_dest'] = $destHeight;
438
-		$effet = "L{$destWidth}xH$destHeight";
439
-		$cache = 'cache-vignettes';
440
-		$fichier_dest = basename($fichier_dest);
441
-		if (($ret['largeur'] <= $maxWidth) && ($ret['hauteur'] <= $maxHeight)) {
442
-			// on garde la terminaison initiale car image simplement copiee
443
-			// et on postfixe son nom avec un md5 du path
444
-			$terminaison_dest = $terminaison;
445
-			$fichier_dest .= '-' . substr(md5("$identifiant"), 0, 5);
446
-		} else {
447
-			$fichier_dest .= '-' . substr(md5("$identifiant-$effet"), 0, 5);
448
-		}
449
-		$cache = sous_repertoire(_DIR_VAR, $cache);
450
-		$cache = sous_repertoire($cache, $effet);
451
-	} else {
452
-		$fichier_dest = md5("$identifiant-$effet");
453
-		$cache = sous_repertoire(_DIR_VAR, $cache);
454
-		$cache = sous_repertoire($cache, substr($fichier_dest, 0, 2));
455
-		$fichier_dest = substr($fichier_dest, 2);
456
-	}
457
-
458
-	$fichier_dest = $cache . $fichier_dest . '.' . $terminaison_dest;
459
-
460
-	$GLOBALS['images_calculees'][] = $fichier_dest;
461
-
462
-	$creer = true;
463
-	// si recalcul des images demande, recalculer chaque image une fois
464
-	if (defined('_VAR_IMAGES') && _VAR_IMAGES && !isset($images_recalcul[$fichier_dest])) {
465
-		$images_recalcul[$fichier_dest] = true;
466
-	} else {
467
-		if (@file_exists($f = $fichier_dest)) {
468
-			if (filemtime($f) >= $date_src) {
469
-				$creer = false;
470
-			}
471
-		} else {
472
-			if (
473
-				@file_exists($f = "$fichier_dest.src")
474
-				&& lire_fichier($f, $valeurs)
475
-				&& ($valeurs = unserialize($valeurs))
476
-				&& $valeurs['date'] >= $date_src
477
-			) {
478
-				$creer = false;
479
-			}
480
-		}
481
-	}
482
-	if ($creer && !@file_exists($fichier)) {
483
-		if (!@file_exists("$fichier.src")) {
484
-			spip_log("Image absente : $fichier", 'images' . _LOG_ERREUR);
485
-
486
-			return false;
487
-		}
488
-		# on reconstruit l'image source absente a partir de la chaine des .src
489
-		reconstruire_image_intermediaire($fichier);
490
-	}
491
-
492
-	if ($creer) {
493
-		spip_log(
494
-			'filtre image ' . ($fonction_creation ? reset($fonction_creation) : '') . "[$effet] sur $fichier",
495
-			'images' . _LOG_DEBUG
496
-		);
497
-	}
498
-
499
-	$term_fonction = _image_trouver_extension_pertinente($fichier);
500
-	$ret['fonction_imagecreatefrom'] = '_imagecreatefrom' . $term_fonction;
501
-	$ret['fichier'] = $fichier;
502
-	$ret['fonction_image'] = '_image_image' . $terminaison_dest;
503
-	$ret['fichier_dest'] = $fichier_dest;
504
-	$ret['format_source'] = _image_extension_normalisee($terminaison);
505
-	$ret['format_dest'] = $terminaison_dest;
506
-	$ret['date_src'] = $date_src;
507
-	$ret['creer'] = $creer;
508
-	$ret['class'] = extraire_attribut($img, 'class');
509
-	$ret['alt'] = extraire_attribut($img, 'alt');
510
-	$ret['style'] = extraire_attribut($img, 'style');
511
-	$ret['tag'] = $img;
512
-	if ($fonction_creation) {
513
-		$ret['reconstruction'] = $fonction_creation;
514
-		# ecrire ici comment creer le fichier, car il est pas sur qu'on l'ecrira reelement
515
-		# cas de image_reduire qui finalement ne reduit pas l'image source
516
-		# ca evite d'essayer de le creer au prochain hit si il n'est pas la
517
-		#ecrire_fichier($ret['fichier_dest'].'.src',serialize($ret),true);
518
-	}
519
-
520
-	$ret = pipeline('image_preparer_filtre', [
521
-			'args' => [
522
-				'img' => $img,
523
-				'effet' => $effet,
524
-				'forcer_format' => $forcer_format,
525
-				'fonction_creation' => $fonction_creation,
526
-				'find_in_path' => $find_in_path,
527
-			],
528
-			'data' => $ret
529
-		]);
530
-
531
-	// une globale pour le debug en cas de crash memoire
532
-	$GLOBALS['derniere_image_calculee'] = $ret;
533
-
534
-	// traiter le cas particulier des SVG : si le filtre n'a pas annonce explicitement qu'il savait faire, on delegue
535
-	if ($term_fonction === 'svg') {
536
-		if ($creer && !$support_svg) {
537
-			process_image_svg_identite($ret);
538
-			$ret['creer'] = false;
539
-		}
540
-	}
541
-	else {
542
-		if (!function_exists($ret['fonction_imagecreatefrom'])) {
543
-			return false;
544
-		}
545
-	}
546
-
547
-	return $ret;
303
+    $valeurs = [];
304
+    $ret = [];
305
+    $f = null;
306
+    static $images_recalcul = [];
307
+    if (strlen($img) == 0) {
308
+        return false;
309
+    }
310
+
311
+    $source = trim(extraire_attribut($img, 'src') ?? '');
312
+    if (strlen($source) < 1) {
313
+        if (!str_starts_with($img, '<img ')) {
314
+            $source = $img;
315
+            $img = "<img src='$source' />";
316
+        } else {
317
+            // pas d'attribut src sur cette balise <img../>
318
+            return false;
319
+        }
320
+    } elseif (
321
+        preg_match('@^data:image/([^;]*);base64,(.*)$@isS', $source, $regs)
322
+        && ($extension = _image_trouver_extension_depuis_mime('image/' . $regs[1]))
323
+        && in_array($extension, _image_extensions_acceptees_en_entree())
324
+    ) {
325
+        # gerer img src="data:....base64"
326
+        $local = sous_repertoire(_DIR_VAR, 'image-data') . md5($regs[2]) . '.' . _image_extension_normalisee($extension);
327
+        if (!file_exists($local)) {
328
+            ecrire_fichier($local, base64_decode($regs[2]));
329
+        }
330
+        if ($sanitizer = charger_fonction($extension, 'sanitizer', true)) {
331
+            $sanitizer($local);
332
+        }
333
+        $source = $local;
334
+        $img = inserer_attribut($img, 'src', $source);
335
+        # eviter les mauvaises surprises lors de conversions de format
336
+        $img = inserer_attribut($img, 'width', '');
337
+        $img = inserer_attribut($img, 'height', '');
338
+    }
339
+
340
+    // les protocoles web prennent au moins 3 lettres
341
+    if (tester_url_absolue($source)) {
342
+        include_spip('inc/distant');
343
+        $fichier = _DIR_RACINE . copie_locale($source);
344
+        if (!$fichier) {
345
+            return '';
346
+        }
347
+        if (
348
+            ($extension = _image_trouver_extension($fichier))
349
+            && ($sanitizer = charger_fonction($extension, 'sanitizer', true))
350
+        ) {
351
+            $sanitizer($fichier);
352
+        }
353
+    } else {
354
+        // enlever le timestamp eventuel
355
+        if (str_contains($source, '?')) {
356
+            $source = preg_replace(',[?]\d+$,', '', $source);
357
+        }
358
+        if (
359
+            str_contains($source, '?')
360
+            && str_starts_with($source, _DIR_IMG)
361
+            && file_exists($f = preg_replace(',[?].*$,', '', $source))
362
+        ) {
363
+            $source = $f;
364
+        }
365
+        $fichier = $source;
366
+    }
367
+
368
+    $terminaison_dest = '';
369
+    if ($terminaison = _image_trouver_extension($fichier)) {
370
+        $terminaison_dest = ($terminaison == 'gif') ? 'png' : $terminaison;
371
+    }
372
+
373
+    if (
374
+        $forcer_format !== false
375
+        && ($terminaison_dest !== 'svg' || $support_svg || !in_array($forcer_format, _image_extensions_acceptees_en_sortie()))
376
+    ) {
377
+        $terminaison_dest = $forcer_format;
378
+    }
379
+
380
+    if (!$terminaison_dest) {
381
+        return false;
382
+    }
383
+
384
+    $nom_fichier = substr($fichier, 0, strlen($fichier) - (strlen($terminaison) + 1));
385
+    $fichier_dest = $nom_fichier;
386
+    if (
387
+        $find_in_path && ($f = find_in_path($fichier)) && ($fichier = $f)
388
+        || @file_exists($f = $fichier)
389
+    ) {
390
+        // on ne passe jamais la balise img qui est peut-être en x2 et à laquelle on ne peut pas faire confiance
391
+        // on lit directement les infos du fichier
392
+        [$ret['hauteur'], $ret['largeur']] = taille_image($f);
393
+        $date_src = @filemtime($f);
394
+    } elseif (
395
+        @file_exists($f = "$fichier.src")
396
+        && lire_fichier($f, $valeurs)
397
+        && ($valeurs = unserialize($valeurs))
398
+        && isset($valeurs['hauteur_dest'])
399
+        && isset($valeurs['largeur_dest'])
400
+    ) {
401
+        $ret['hauteur'] = $valeurs['hauteur_dest'];
402
+        $ret['largeur'] = $valeurs['largeur_dest'];
403
+        $date_src = $valeurs['date'];
404
+    } // pas de fichier source par la
405
+    else {
406
+        return false;
407
+    }
408
+
409
+    // pas de taille mesurable ?
410
+    if (
411
+        !$ret['hauteur']
412
+        || !($ret['hauteur'] = (int) round($ret['hauteur']))
413
+        || !$ret['largeur']
414
+        || !($ret['largeur'] = (int) round($ret['largeur']))
415
+    ) {
416
+        return false;
417
+    }
418
+
419
+    // les images calculees dependent du chemin du fichier source
420
+    // pour une meme image source et un meme filtre on aboutira a 2 fichiers selon si l'appel est dans le public ou dans le prive
421
+    // ce n'est pas totalement optimal en terme de stockage, mais chaque image est associee a un fichier .src
422
+    // qui contient la methode de reconstrucion (le filtre + les arguments d'appel) et les arguments different entre prive et public
423
+    // la mise en commun du fichier image cree donc un bug et des problemes qui necessiteraient beaucoup de complexite de code
424
+    // alors que ca concerne peu de site au final
425
+    // la release de r23632+r23633+r23634 a provoque peu de remontee de bug attestant du peu de sites impactes
426
+    $identifiant = $fichier;
427
+
428
+    // cas general :
429
+    // on a un dossier cache commun et un nom de fichier qui varie avec l'effet
430
+    // cas particulier de reduire :
431
+    // un cache par dimension, et le nom de fichier est conserve, suffixe par la dimension aussi
432
+    $cache = 'cache-gd2';
433
+    if (str_starts_with($effet, 'reduire')) {
434
+        [, $maxWidth, $maxHeight] = explode('-', $effet);
435
+        [$destWidth, $destHeight] = _image_ratio($ret['largeur'], $ret['hauteur'], $maxWidth, $maxHeight);
436
+        $ret['largeur_dest'] = $destWidth;
437
+        $ret['hauteur_dest'] = $destHeight;
438
+        $effet = "L{$destWidth}xH$destHeight";
439
+        $cache = 'cache-vignettes';
440
+        $fichier_dest = basename($fichier_dest);
441
+        if (($ret['largeur'] <= $maxWidth) && ($ret['hauteur'] <= $maxHeight)) {
442
+            // on garde la terminaison initiale car image simplement copiee
443
+            // et on postfixe son nom avec un md5 du path
444
+            $terminaison_dest = $terminaison;
445
+            $fichier_dest .= '-' . substr(md5("$identifiant"), 0, 5);
446
+        } else {
447
+            $fichier_dest .= '-' . substr(md5("$identifiant-$effet"), 0, 5);
448
+        }
449
+        $cache = sous_repertoire(_DIR_VAR, $cache);
450
+        $cache = sous_repertoire($cache, $effet);
451
+    } else {
452
+        $fichier_dest = md5("$identifiant-$effet");
453
+        $cache = sous_repertoire(_DIR_VAR, $cache);
454
+        $cache = sous_repertoire($cache, substr($fichier_dest, 0, 2));
455
+        $fichier_dest = substr($fichier_dest, 2);
456
+    }
457
+
458
+    $fichier_dest = $cache . $fichier_dest . '.' . $terminaison_dest;
459
+
460
+    $GLOBALS['images_calculees'][] = $fichier_dest;
461
+
462
+    $creer = true;
463
+    // si recalcul des images demande, recalculer chaque image une fois
464
+    if (defined('_VAR_IMAGES') && _VAR_IMAGES && !isset($images_recalcul[$fichier_dest])) {
465
+        $images_recalcul[$fichier_dest] = true;
466
+    } else {
467
+        if (@file_exists($f = $fichier_dest)) {
468
+            if (filemtime($f) >= $date_src) {
469
+                $creer = false;
470
+            }
471
+        } else {
472
+            if (
473
+                @file_exists($f = "$fichier_dest.src")
474
+                && lire_fichier($f, $valeurs)
475
+                && ($valeurs = unserialize($valeurs))
476
+                && $valeurs['date'] >= $date_src
477
+            ) {
478
+                $creer = false;
479
+            }
480
+        }
481
+    }
482
+    if ($creer && !@file_exists($fichier)) {
483
+        if (!@file_exists("$fichier.src")) {
484
+            spip_log("Image absente : $fichier", 'images' . _LOG_ERREUR);
485
+
486
+            return false;
487
+        }
488
+        # on reconstruit l'image source absente a partir de la chaine des .src
489
+        reconstruire_image_intermediaire($fichier);
490
+    }
491
+
492
+    if ($creer) {
493
+        spip_log(
494
+            'filtre image ' . ($fonction_creation ? reset($fonction_creation) : '') . "[$effet] sur $fichier",
495
+            'images' . _LOG_DEBUG
496
+        );
497
+    }
498
+
499
+    $term_fonction = _image_trouver_extension_pertinente($fichier);
500
+    $ret['fonction_imagecreatefrom'] = '_imagecreatefrom' . $term_fonction;
501
+    $ret['fichier'] = $fichier;
502
+    $ret['fonction_image'] = '_image_image' . $terminaison_dest;
503
+    $ret['fichier_dest'] = $fichier_dest;
504
+    $ret['format_source'] = _image_extension_normalisee($terminaison);
505
+    $ret['format_dest'] = $terminaison_dest;
506
+    $ret['date_src'] = $date_src;
507
+    $ret['creer'] = $creer;
508
+    $ret['class'] = extraire_attribut($img, 'class');
509
+    $ret['alt'] = extraire_attribut($img, 'alt');
510
+    $ret['style'] = extraire_attribut($img, 'style');
511
+    $ret['tag'] = $img;
512
+    if ($fonction_creation) {
513
+        $ret['reconstruction'] = $fonction_creation;
514
+        # ecrire ici comment creer le fichier, car il est pas sur qu'on l'ecrira reelement
515
+        # cas de image_reduire qui finalement ne reduit pas l'image source
516
+        # ca evite d'essayer de le creer au prochain hit si il n'est pas la
517
+        #ecrire_fichier($ret['fichier_dest'].'.src',serialize($ret),true);
518
+    }
519
+
520
+    $ret = pipeline('image_preparer_filtre', [
521
+            'args' => [
522
+                'img' => $img,
523
+                'effet' => $effet,
524
+                'forcer_format' => $forcer_format,
525
+                'fonction_creation' => $fonction_creation,
526
+                'find_in_path' => $find_in_path,
527
+            ],
528
+            'data' => $ret
529
+        ]);
530
+
531
+    // une globale pour le debug en cas de crash memoire
532
+    $GLOBALS['derniere_image_calculee'] = $ret;
533
+
534
+    // traiter le cas particulier des SVG : si le filtre n'a pas annonce explicitement qu'il savait faire, on delegue
535
+    if ($term_fonction === 'svg') {
536
+        if ($creer && !$support_svg) {
537
+            process_image_svg_identite($ret);
538
+            $ret['creer'] = false;
539
+        }
540
+    }
541
+    else {
542
+        if (!function_exists($ret['fonction_imagecreatefrom'])) {
543
+            return false;
544
+        }
545
+    }
546
+
547
+    return $ret;
548 548
 }
549 549
 
550 550
 
@@ -552,54 +552,54 @@  discard block
 block discarded – undo
552 552
  * Extensions d’images acceptées en entrée
553 553
  */
554 554
 function _image_extensions_acceptees_en_entree(): array {
555
-	static $extensions = null;
556
-	if (empty($extensions)) {
557
-		$extensions = ['png', 'gif', 'jpg', 'jpeg'];
558
-		if (!empty($GLOBALS['meta']['gd_formats'])) {
559
-			// action=tester renseigne gd_formats et detecte le support de webp
560
-			$extensions = array_merge(explode(',', $GLOBALS['meta']['gd_formats']));
561
-			$extensions = array_map('trim', $extensions);
562
-			$extensions = array_filter($extensions);
563
-			if (in_array('jpg', $extensions)) {
564
-				$extensions[] = 'jpeg';
565
-			}
566
-			$extensions = array_unique($extensions);
567
-		}
568
-		$extensions[] = 'svg'; // on le supporte toujours avec des fonctions specifiques
569
-	}
570
-
571
-	return $extensions;
555
+    static $extensions = null;
556
+    if (empty($extensions)) {
557
+        $extensions = ['png', 'gif', 'jpg', 'jpeg'];
558
+        if (!empty($GLOBALS['meta']['gd_formats'])) {
559
+            // action=tester renseigne gd_formats et detecte le support de webp
560
+            $extensions = array_merge(explode(',', $GLOBALS['meta']['gd_formats']));
561
+            $extensions = array_map('trim', $extensions);
562
+            $extensions = array_filter($extensions);
563
+            if (in_array('jpg', $extensions)) {
564
+                $extensions[] = 'jpeg';
565
+            }
566
+            $extensions = array_unique($extensions);
567
+        }
568
+        $extensions[] = 'svg'; // on le supporte toujours avec des fonctions specifiques
569
+    }
570
+
571
+    return $extensions;
572 572
 }
573 573
 
574 574
 /**
575 575
  * Extensions d’images acceptées en sortie
576 576
  */
577 577
 function _image_extensions_acceptees_en_sortie(): array {
578
-	static $extensions = null;
579
-	if (empty($extensions)) {
580
-		$extensions = _image_extensions_acceptees_en_entree();
581
-		$extensions = array_diff($extensions, ['jpeg']);
582
-		if (in_array('gif', $extensions) && !function_exists('imagegif')) {
583
-			$extensions = array_diff($extensions, ['gif']);
584
-		}
585
-		if (in_array('webp', $extensions) && !function_exists('imagewebp')) {
586
-			$extensions = array_diff($extensions, ['webp']);
587
-		}
588
-	}
589
-
590
-	return $extensions;
578
+    static $extensions = null;
579
+    if (empty($extensions)) {
580
+        $extensions = _image_extensions_acceptees_en_entree();
581
+        $extensions = array_diff($extensions, ['jpeg']);
582
+        if (in_array('gif', $extensions) && !function_exists('imagegif')) {
583
+            $extensions = array_diff($extensions, ['gif']);
584
+        }
585
+        if (in_array('webp', $extensions) && !function_exists('imagewebp')) {
586
+            $extensions = array_diff($extensions, ['webp']);
587
+        }
588
+    }
589
+
590
+    return $extensions;
591 591
 }
592 592
 
593 593
 function _image_extension_normalisee($extension) {
594
-	$extension = strtolower($extension);
595
-	if ($extension === 'jpeg') {
596
-		$extension = 'jpg';
597
-	}
598
-	return $extension;
594
+    $extension = strtolower($extension);
595
+    if ($extension === 'jpeg') {
596
+        $extension = 'jpg';
597
+    }
598
+    return $extension;
599 599
 }
600 600
 
601 601
 function _image_extensions_conservent_transparence() {
602
-	return ['png', 'webp'];
602
+    return ['png', 'webp'];
603 603
 }
604 604
 
605 605
 
@@ -609,11 +609,11 @@  discard block
 block discarded – undo
609 609
  * @return string
610 610
  */
611 611
 function _image_trouver_extension($path) {
612
-	$preg_extensions = implode('|', _image_extensions_acceptees_en_entree());
613
-	if (preg_match(",\.($preg_extensions)($|[?]),i", $path, $regs)) {
614
-		return strtolower($regs[1]);
615
-	}
616
-	return '';
612
+    $preg_extensions = implode('|', _image_extensions_acceptees_en_entree());
613
+    if (preg_match(",\.($preg_extensions)($|[?]),i", $path, $regs)) {
614
+        return strtolower($regs[1]);
615
+    }
616
+    return '';
617 617
 }
618 618
 
619 619
 /**
@@ -624,28 +624,28 @@  discard block
 block discarded – undo
624 624
  * @return string Extension, dans le format attendu par les fonctions 'gd' ('jpeg' pour les .jpg par exemple)
625 625
  */
626 626
 function _image_trouver_extension_pertinente($path) {
627
-	$path = supprimer_timestamp($path);
628
-	$terminaison = _image_trouver_extension($path);
629
-	if ($terminaison == 'jpg') {
630
-		$terminaison = 'jpeg';
631
-	}
632
-
633
-	if (!file_exists($path)) {
634
-		return $terminaison;
635
-	}
636
-
637
-	if (!$info = @spip_getimagesize($path)) {
638
-		return $terminaison;
639
-	}
640
-
641
-	$mime = $info['mime'] ?? image_type_to_mime_type($info[2]);
642
-
643
-	$_terminaison = _image_trouver_extension_depuis_mime($mime);
644
-	if ($_terminaison && $_terminaison !== $terminaison) {
645
-		spip_log("Mauvaise extension du fichier : $path . Son type mime est : $mime", 'images.' . _LOG_INFO_IMPORTANTE);
646
-		$terminaison = $_terminaison;
647
-	}
648
-	return $terminaison;
627
+    $path = supprimer_timestamp($path);
628
+    $terminaison = _image_trouver_extension($path);
629
+    if ($terminaison == 'jpg') {
630
+        $terminaison = 'jpeg';
631
+    }
632
+
633
+    if (!file_exists($path)) {
634
+        return $terminaison;
635
+    }
636
+
637
+    if (!$info = @spip_getimagesize($path)) {
638
+        return $terminaison;
639
+    }
640
+
641
+    $mime = $info['mime'] ?? image_type_to_mime_type($info[2]);
642
+
643
+    $_terminaison = _image_trouver_extension_depuis_mime($mime);
644
+    if ($_terminaison && $_terminaison !== $terminaison) {
645
+        spip_log("Mauvaise extension du fichier : $path . Son type mime est : $mime", 'images.' . _LOG_INFO_IMPORTANTE);
646
+        $terminaison = $_terminaison;
647
+    }
648
+    return $terminaison;
649 649
 }
650 650
 
651 651
 /**
@@ -653,14 +653,14 @@  discard block
 block discarded – undo
653 653
  * @return string
654 654
  */
655 655
 function _image_trouver_extension_depuis_mime($mime) {
656
-	return match (strtolower($mime)) {
657
-		'image/png', 'image/x-png' => 'png',
658
-		'image/jpg', 'image/jpeg', 'image/pjpeg' => 'jpeg',
659
-		'image/gif' => 'gif',
660
-		'image/webp', 'image/x-webp' => 'webp',
661
-		'image/svg+xml' => 'svg',
662
-		default => '',
663
-	};
656
+    return match (strtolower($mime)) {
657
+        'image/png', 'image/x-png' => 'png',
658
+        'image/jpg', 'image/jpeg', 'image/pjpeg' => 'jpeg',
659
+        'image/gif' => 'gif',
660
+        'image/webp', 'image/x-webp' => 'webp',
661
+        'image/svg+xml' => 'svg',
662
+        default => '',
663
+    };
664 664
 }
665 665
 
666 666
 
@@ -680,18 +680,18 @@  discard block
 block discarded – undo
680 680
  *     Une ressource de type Image GD.
681 681
  */
682 682
 function _imagecreatefrom_func(string $func, string $filename) {
683
-	if (!function_exists($func)) {
684
-		spip_log("GD indisponible : $func inexistante. Traitement $filename impossible.", _LOG_CRITIQUE);
685
-		erreur_squelette("GD indisponible : $func inexistante. Traitement $filename impossible.");
686
-		return null;
687
-	}
688
-	$img = @$func($filename);
689
-	if (!$img) {
690
-		spip_log("Erreur lecture imagecreatefromjpeg $filename", _LOG_CRITIQUE);
691
-		erreur_squelette("Erreur lecture imagecreatefromjpeg $filename");
692
-		$img = imagecreate(10, 10);
693
-	}
694
-	return $img;
683
+    if (!function_exists($func)) {
684
+        spip_log("GD indisponible : $func inexistante. Traitement $filename impossible.", _LOG_CRITIQUE);
685
+        erreur_squelette("GD indisponible : $func inexistante. Traitement $filename impossible.");
686
+        return null;
687
+    }
688
+    $img = @$func($filename);
689
+    if (!$img) {
690
+        spip_log("Erreur lecture imagecreatefromjpeg $filename", _LOG_CRITIQUE);
691
+        erreur_squelette("Erreur lecture imagecreatefromjpeg $filename");
692
+        $img = imagecreate(10, 10);
693
+    }
694
+    return $img;
695 695
 }
696 696
 
697 697
 /**
@@ -707,7 +707,7 @@  discard block
 block discarded – undo
707 707
  *     Une ressource de type Image GD.
708 708
  */
709 709
 function _imagecreatefromjpeg($filename) {
710
-	return _imagecreatefrom_func('imagecreatefromjpeg', $filename);
710
+    return _imagecreatefrom_func('imagecreatefromjpeg', $filename);
711 711
 }
712 712
 
713 713
 /**
@@ -723,7 +723,7 @@  discard block
 block discarded – undo
723 723
  *     Une ressource de type Image GD.
724 724
  */
725 725
 function _imagecreatefrompng($filename) {
726
-	return _imagecreatefrom_func('imagecreatefrompng', $filename);
726
+    return _imagecreatefrom_func('imagecreatefrompng', $filename);
727 727
 }
728 728
 
729 729
 /**
@@ -739,7 +739,7 @@  discard block
 block discarded – undo
739 739
  *     Une ressource de type Image GD.
740 740
  */
741 741
 function _imagecreatefromgif($filename) {
742
-	return _imagecreatefrom_func('imagecreatefromgif', $filename);
742
+    return _imagecreatefrom_func('imagecreatefromgif', $filename);
743 743
 }
744 744
 
745 745
 
@@ -756,7 +756,7 @@  discard block
 block discarded – undo
756 756
  *     Une ressource de type Image GD.
757 757
  */
758 758
 function _imagecreatefromwebp($filename) {
759
-	return _imagecreatefrom_func('imagecreatefromwebp', $filename);
759
+    return _imagecreatefrom_func('imagecreatefromwebp', $filename);
760 760
 }
761 761
 
762 762
 /**
@@ -774,24 +774,24 @@  discard block
 block discarded – undo
774 774
  *     - true si une image est bien retournée.
775 775
  */
776 776
 function _image_imagepng($img, $fichier) {
777
-	if (!function_exists('imagepng')) {
778
-		return false;
779
-	}
780
-	$tmp = $fichier . '.tmp';
781
-	$ret = imagepng($img, $tmp);
782
-	if (file_exists($tmp)) {
783
-		$taille_test = @getimagesize($tmp);
784
-		if (empty($taille_test[0])) {
785
-			return false;
786
-		}
787
-
788
-		spip_unlink($fichier); // le fichier peut deja exister
789
-		@rename($tmp, $fichier);
790
-
791
-		return $ret;
792
-	}
793
-
794
-	return false;
777
+    if (!function_exists('imagepng')) {
778
+        return false;
779
+    }
780
+    $tmp = $fichier . '.tmp';
781
+    $ret = imagepng($img, $tmp);
782
+    if (file_exists($tmp)) {
783
+        $taille_test = @getimagesize($tmp);
784
+        if (empty($taille_test[0])) {
785
+            return false;
786
+        }
787
+
788
+        spip_unlink($fichier); // le fichier peut deja exister
789
+        @rename($tmp, $fichier);
790
+
791
+        return $ret;
792
+    }
793
+
794
+    return false;
795 795
 }
796 796
 
797 797
 /**
@@ -809,24 +809,24 @@  discard block
 block discarded – undo
809 809
  *     - true si une image est bien retournée.
810 810
  */
811 811
 function _image_imagegif($img, $fichier) {
812
-	if (!function_exists('imagegif')) {
813
-		return false;
814
-	}
815
-	$tmp = $fichier . '.tmp';
816
-	$ret = imagegif($img, $tmp);
817
-	if (file_exists($tmp)) {
818
-		$taille_test = @getimagesize($tmp);
819
-		if (empty($taille_test[0])) {
820
-			return false;
821
-		}
822
-
823
-		spip_unlink($fichier); // le fichier peut deja exister
824
-		@rename($tmp, $fichier);
825
-
826
-		return $ret;
827
-	}
828
-
829
-	return false;
812
+    if (!function_exists('imagegif')) {
813
+        return false;
814
+    }
815
+    $tmp = $fichier . '.tmp';
816
+    $ret = imagegif($img, $tmp);
817
+    if (file_exists($tmp)) {
818
+        $taille_test = @getimagesize($tmp);
819
+        if (empty($taille_test[0])) {
820
+            return false;
821
+        }
822
+
823
+        spip_unlink($fichier); // le fichier peut deja exister
824
+        @rename($tmp, $fichier);
825
+
826
+        return $ret;
827
+    }
828
+
829
+    return false;
830 830
 }
831 831
 
832 832
 /**
@@ -849,29 +849,29 @@  discard block
 block discarded – undo
849 849
  *     - true si une image est bien retournée.
850 850
  */
851 851
 function _image_imagejpg($img, $fichier, $qualite = _IMG_GD_QUALITE) {
852
-	if (!function_exists('imagejpeg')) {
853
-		return false;
854
-	}
855
-	$tmp = $fichier . '.tmp';
852
+    if (!function_exists('imagejpeg')) {
853
+        return false;
854
+    }
855
+    $tmp = $fichier . '.tmp';
856 856
 
857
-	// Enable interlancing
858
-	imageinterlace($img, true);
857
+    // Enable interlancing
858
+    imageinterlace($img, true);
859 859
 
860
-	$ret = imagejpeg($img, $tmp, $qualite);
860
+    $ret = imagejpeg($img, $tmp, $qualite);
861 861
 
862
-	if (file_exists($tmp)) {
863
-		$taille_test = @getimagesize($tmp);
864
-		if (empty($taille_test[0])) {
865
-			return false;
866
-		}
862
+    if (file_exists($tmp)) {
863
+        $taille_test = @getimagesize($tmp);
864
+        if (empty($taille_test[0])) {
865
+            return false;
866
+        }
867 867
 
868
-		spip_unlink($fichier); // le fichier peut deja exister
869
-		@rename($tmp, $fichier);
868
+        spip_unlink($fichier); // le fichier peut deja exister
869
+        @rename($tmp, $fichier);
870 870
 
871
-		return $ret;
872
-	}
871
+        return $ret;
872
+    }
873 873
 
874
-	return false;
874
+    return false;
875 875
 }
876 876
 
877 877
 /**
@@ -889,9 +889,9 @@  discard block
 block discarded – undo
889 889
  *     true si le fichier a bien été créé ; false sinon.
890 890
  */
891 891
 function _image_imageico($img, $fichier) {
892
-	$gd_image_array = [$img];
892
+    $gd_image_array = [$img];
893 893
 
894
-	return ecrire_fichier($fichier, phpthumb_functions::GD2ICOstring($gd_image_array));
894
+    return ecrire_fichier($fichier, phpthumb_functions::GD2ICOstring($gd_image_array));
895 895
 }
896 896
 
897 897
 
@@ -910,24 +910,24 @@  discard block
 block discarded – undo
910 910
  *     - true si une image est bien retournée.
911 911
  */
912 912
 function _image_imagewebp($img, $fichier, $qualite = _IMG_GD_QUALITE) {
913
-	if (!function_exists('imagewebp')) {
914
-		return false;
915
-	}
916
-	$tmp = $fichier . '.tmp';
917
-	$ret = imagewebp($img, $tmp, $qualite);
918
-	if (file_exists($tmp)) {
919
-		$taille_test = @getimagesize($tmp);
920
-		if (empty($taille_test[0])) {
921
-			return false;
922
-		}
923
-
924
-		spip_unlink($fichier); // le fichier peut deja exister
925
-		@rename($tmp, $fichier);
926
-
927
-		return $ret;
928
-	}
929
-
930
-	return false;
913
+    if (!function_exists('imagewebp')) {
914
+        return false;
915
+    }
916
+    $tmp = $fichier . '.tmp';
917
+    $ret = imagewebp($img, $tmp, $qualite);
918
+    if (file_exists($tmp)) {
919
+        $taille_test = @getimagesize($tmp);
920
+        if (empty($taille_test[0])) {
921
+            return false;
922
+        }
923
+
924
+        spip_unlink($fichier); // le fichier peut deja exister
925
+        @rename($tmp, $fichier);
926
+
927
+        return $ret;
928
+    }
929
+
930
+    return false;
931 931
 }
932 932
 
933 933
 /**
@@ -947,35 +947,35 @@  discard block
 block discarded – undo
947 947
  */
948 948
 function _image_imagesvg($img, $fichier) {
949 949
 
950
-	$tmp = $fichier . '.tmp';
951
-	if (!str_contains($img, '<')) {
952
-		$img = supprimer_timestamp($img);
953
-		if (!file_exists($img)) {
954
-			return false;
955
-		}
956
-		@copy($img, $tmp);
957
-		if (filesize($tmp) === filesize($img)) {
958
-			spip_unlink($fichier); // le fichier peut deja exister
959
-			@rename($tmp, $fichier);
960
-			return true;
961
-		}
962
-		return false;
963
-	}
964
-
965
-	file_put_contents($tmp, $img);
966
-	if (file_exists($tmp)) {
967
-		$taille_test = spip_getimagesize($tmp);
968
-		if (empty($taille_test[0])) {
969
-			return false;
970
-		}
971
-
972
-		spip_unlink($fichier); // le fichier peut deja exister
973
-		@rename($tmp, $fichier);
974
-
975
-		return true;
976
-	}
977
-
978
-	return false;
950
+    $tmp = $fichier . '.tmp';
951
+    if (!str_contains($img, '<')) {
952
+        $img = supprimer_timestamp($img);
953
+        if (!file_exists($img)) {
954
+            return false;
955
+        }
956
+        @copy($img, $tmp);
957
+        if (filesize($tmp) === filesize($img)) {
958
+            spip_unlink($fichier); // le fichier peut deja exister
959
+            @rename($tmp, $fichier);
960
+            return true;
961
+        }
962
+        return false;
963
+    }
964
+
965
+    file_put_contents($tmp, $img);
966
+    if (file_exists($tmp)) {
967
+        $taille_test = spip_getimagesize($tmp);
968
+        if (empty($taille_test[0])) {
969
+            return false;
970
+        }
971
+
972
+        spip_unlink($fichier); // le fichier peut deja exister
973
+        @rename($tmp, $fichier);
974
+
975
+        return true;
976
+    }
977
+
978
+    return false;
979 979
 }
980 980
 
981 981
 
@@ -1003,30 +1003,30 @@  discard block
 block discarded – undo
1003 1003
  *     - false sinon.
1004 1004
  */
1005 1005
 function _image_gd_output($img, $valeurs, $qualite = _IMG_GD_QUALITE, $fonction = null) {
1006
-	if (is_null($fonction)) {
1007
-		$fonction = '_image_image' . $valeurs['format_dest'];
1008
-	}
1009
-	$ret = false;
1010
-	#un flag pour reperer les images gravees
1011
-	$lock = (
1012
-		!statut_effacer_images_temporaires('get')
1013
-		|| @file_exists($valeurs['fichier_dest'])
1014
-		&& !@file_exists($valeurs['fichier_dest'] . '.src')
1015
-	);
1016
-	if (
1017
-		function_exists($fonction)
1018
-		&& ($ret = $fonction($img, $valeurs['fichier_dest'], $qualite)) # on a reussi a creer l'image
1019
-		&& isset($valeurs['reconstruction']) # et on sait comment la resonctruire le cas echeant
1020
-		&& !$lock && @file_exists($valeurs['fichier_dest'])
1021
-	) {
1022
-		// dans tous les cas mettre a jour la taille de l'image finale
1023
-		[$valeurs['hauteur_dest'], $valeurs['largeur_dest']] = taille_image($valeurs['fichier_dest']);
1024
-		$valeurs['date'] = @filemtime($valeurs['fichier_dest']);
1025
-		// pour la retrouver apres disparition
1026
-		ecrire_fichier($valeurs['fichier_dest'] . '.src', serialize($valeurs), true);
1027
-	}
1028
-
1029
-	return $ret;
1006
+    if (is_null($fonction)) {
1007
+        $fonction = '_image_image' . $valeurs['format_dest'];
1008
+    }
1009
+    $ret = false;
1010
+    #un flag pour reperer les images gravees
1011
+    $lock = (
1012
+        !statut_effacer_images_temporaires('get')
1013
+        || @file_exists($valeurs['fichier_dest'])
1014
+        && !@file_exists($valeurs['fichier_dest'] . '.src')
1015
+    );
1016
+    if (
1017
+        function_exists($fonction)
1018
+        && ($ret = $fonction($img, $valeurs['fichier_dest'], $qualite)) # on a reussi a creer l'image
1019
+        && isset($valeurs['reconstruction']) # et on sait comment la resonctruire le cas echeant
1020
+        && !$lock && @file_exists($valeurs['fichier_dest'])
1021
+    ) {
1022
+        // dans tous les cas mettre a jour la taille de l'image finale
1023
+        [$valeurs['hauteur_dest'], $valeurs['largeur_dest']] = taille_image($valeurs['fichier_dest']);
1024
+        $valeurs['date'] = @filemtime($valeurs['fichier_dest']);
1025
+        // pour la retrouver apres disparition
1026
+        ecrire_fichier($valeurs['fichier_dest'] . '.src', serialize($valeurs), true);
1027
+    }
1028
+
1029
+    return $ret;
1030 1030
 }
1031 1031
 
1032 1032
 /**
@@ -1039,28 +1039,28 @@  discard block
 block discarded – undo
1039 1039
  *     Chemin vers le fichier manquant
1040 1040
  **/
1041 1041
 function reconstruire_image_intermediaire($fichier_manquant) {
1042
-	$source = null;
1043
-	$reconstruire = [];
1044
-	$fichier = $fichier_manquant;
1045
-	while (
1046
-		!str_contains($fichier, '://')
1047
-		&& !@file_exists($fichier)
1048
-		&& lire_fichier($src = "$fichier.src", $source)
1049
-		&& ($valeurs = unserialize($source))
1050
-		&& ($fichier = $valeurs['fichier']) # l'origine est connue (on ne verifie pas son existence, qu'importe ...)
1051
-	) {
1052
-		spip_unlink($src); // si jamais on a un timeout pendant la reconstruction, elle se fera naturellement au hit suivant
1053
-		$reconstruire[] = $valeurs['reconstruction'];
1054
-	}
1055
-	while (count($reconstruire)) {
1056
-		$r = array_pop($reconstruire);
1057
-		$fonction = $r[0];
1058
-		$args = $r[1];
1059
-		$fonction(...$args);
1060
-	}
1061
-	// cette image intermediaire est commune a plusieurs series de filtre, il faut la conserver
1062
-	// mais l'on peut nettoyer les miettes de sa creation
1063
-	ramasse_miettes($fichier_manquant);
1042
+    $source = null;
1043
+    $reconstruire = [];
1044
+    $fichier = $fichier_manquant;
1045
+    while (
1046
+        !str_contains($fichier, '://')
1047
+        && !@file_exists($fichier)
1048
+        && lire_fichier($src = "$fichier.src", $source)
1049
+        && ($valeurs = unserialize($source))
1050
+        && ($fichier = $valeurs['fichier']) # l'origine est connue (on ne verifie pas son existence, qu'importe ...)
1051
+    ) {
1052
+        spip_unlink($src); // si jamais on a un timeout pendant la reconstruction, elle se fera naturellement au hit suivant
1053
+        $reconstruire[] = $valeurs['reconstruction'];
1054
+    }
1055
+    while (count($reconstruire)) {
1056
+        $r = array_pop($reconstruire);
1057
+        $fonction = $r[0];
1058
+        $args = $r[1];
1059
+        $fonction(...$args);
1060
+    }
1061
+    // cette image intermediaire est commune a plusieurs series de filtre, il faut la conserver
1062
+    // mais l'on peut nettoyer les miettes de sa creation
1063
+    ramasse_miettes($fichier_manquant);
1064 1064
 }
1065 1065
 
1066 1066
 /**
@@ -1080,26 +1080,26 @@  discard block
 block discarded – undo
1080 1080
  *     Chemin du fichier d'image calculé
1081 1081
  **/
1082 1082
 function ramasse_miettes($fichier) {
1083
-	$source = null;
1084
-	if (
1085
-		str_contains($fichier, '://')
1086
-		|| !lire_fichier($src = "$fichier.src", $source)
1087
-		|| !$valeurs = unserialize($source)
1088
-	) {
1089
-		return;
1090
-	}
1091
-	spip_unlink($src); # on supprime la reference a sa source pour marquer cette image comme non intermediaire
1092
-	while (
1093
-		($fichier = $valeurs['fichier'])
1094
-		&& str_starts_with($fichier, _DIR_VAR)
1095
-		&& lire_fichier($src = "$fichier.src", $source)
1096
-		&& ($valeurs = unserialize($source))  # et valide
1097
-	) {
1098
-		# on efface le fichier
1099
-		spip_unlink($fichier);
1100
-		# mais laisse le .src qui permet de savoir comment reconstruire l'image si besoin
1101
-		#spip_unlink($src);
1102
-	}
1083
+    $source = null;
1084
+    if (
1085
+        str_contains($fichier, '://')
1086
+        || !lire_fichier($src = "$fichier.src", $source)
1087
+        || !$valeurs = unserialize($source)
1088
+    ) {
1089
+        return;
1090
+    }
1091
+    spip_unlink($src); # on supprime la reference a sa source pour marquer cette image comme non intermediaire
1092
+    while (
1093
+        ($fichier = $valeurs['fichier'])
1094
+        && str_starts_with($fichier, _DIR_VAR)
1095
+        && lire_fichier($src = "$fichier.src", $source)
1096
+        && ($valeurs = unserialize($source))  # et valide
1097
+    ) {
1098
+        # on efface le fichier
1099
+        spip_unlink($fichier);
1100
+        # mais laisse le .src qui permet de savoir comment reconstruire l'image si besoin
1101
+        #spip_unlink($src);
1102
+    }
1103 1103
 }
1104 1104
 
1105 1105
 
@@ -1124,33 +1124,33 @@  discard block
 block discarded – undo
1124 1124
  *     Code HTML de l'image
1125 1125
  **/
1126 1126
 function image_graver($img) {
1127
-	// appeler le filtre post_image_filtrer qui permet de faire
1128
-	// des traitements auto a la fin d'une serie de filtres
1129
-	$img = pipeline('post_image_filtrer', $img);
1130
-
1131
-	$fichier_ori = $fichier = (extraire_attribut($img, 'src') ?? '');
1132
-	if (($p = strpos($fichier, '?')) !== false) {
1133
-		$fichier = substr($fichier, 0, $p);
1134
-	}
1135
-	if (strlen($fichier) < 1 && !str_starts_with($img, '<img ')) {
1136
-		$fichier = $img;
1137
-	}
1138
-	if (strlen($fichier)) {
1139
-		# si jamais le fichier final n'a pas ete calcule car suppose temporaire
1140
-		# et qu'il ne s'agit pas d'une URL
1141
-		if (!str_contains($fichier, '://') && !@file_exists($fichier)) {
1142
-			reconstruire_image_intermediaire($fichier);
1143
-		}
1144
-		ramasse_miettes($fichier);
1145
-
1146
-		// ajouter le timestamp si besoin
1147
-		if (!str_contains($fichier_ori, '?')) {
1148
-			// on utilise str_replace pour attraper le onmouseover des logo si besoin
1149
-			$img = str_replace($fichier_ori, timestamp($fichier_ori), $img);
1150
-		}
1151
-	}
1152
-
1153
-	return $img;
1127
+    // appeler le filtre post_image_filtrer qui permet de faire
1128
+    // des traitements auto a la fin d'une serie de filtres
1129
+    $img = pipeline('post_image_filtrer', $img);
1130
+
1131
+    $fichier_ori = $fichier = (extraire_attribut($img, 'src') ?? '');
1132
+    if (($p = strpos($fichier, '?')) !== false) {
1133
+        $fichier = substr($fichier, 0, $p);
1134
+    }
1135
+    if (strlen($fichier) < 1 && !str_starts_with($img, '<img ')) {
1136
+        $fichier = $img;
1137
+    }
1138
+    if (strlen($fichier)) {
1139
+        # si jamais le fichier final n'a pas ete calcule car suppose temporaire
1140
+        # et qu'il ne s'agit pas d'une URL
1141
+        if (!str_contains($fichier, '://') && !@file_exists($fichier)) {
1142
+            reconstruire_image_intermediaire($fichier);
1143
+        }
1144
+        ramasse_miettes($fichier);
1145
+
1146
+        // ajouter le timestamp si besoin
1147
+        if (!str_contains($fichier_ori, '?')) {
1148
+            // on utilise str_replace pour attraper le onmouseover des logo si besoin
1149
+            $img = str_replace($fichier_ori, timestamp($fichier_ori), $img);
1150
+        }
1151
+    }
1152
+
1153
+    return $img;
1154 1154
 }
1155 1155
 
1156 1156
 /**
@@ -1177,32 +1177,32 @@  discard block
 block discarded – undo
1177 1177
  *     Code html modifié de la balise.
1178 1178
  **/
1179 1179
 function _image_tag_changer_taille($tag, $width, $height, $style = false) {
1180
-	if ($style === false) {
1181
-		$style = extraire_attribut($tag, 'style');
1182
-	}
1183
-
1184
-	// enlever le width et height du style
1185
-	if ($style) {
1186
-		$style = preg_replace(',(^|;)\s*(width|height)\s*:\s*[^;]+,ims', '', $style);
1187
-	}
1188
-	if ($style && $style[0] === ';') {
1189
-		$style = substr($style, 1);
1190
-	}
1191
-
1192
-	// mettre des attributs de width et height sur les images,
1193
-	// ca accelere le rendu du navigateur
1194
-	// ca permet aux navigateurs de reserver la bonne taille
1195
-	// quand on a desactive l'affichage des images.
1196
-	$tag = inserer_attribut($tag, 'width', round($width));
1197
-	$tag = inserer_attribut($tag, 'height', round($height));
1198
-
1199
-	// attributs deprecies. Transformer en CSS
1200
-	if ($espace = extraire_attribut($tag, 'hspace')) {
1201
-		$style = "margin:{$espace}px;" . $style;
1202
-		$tag = inserer_attribut($tag, 'hspace', '');
1203
-	}
1204
-
1205
-	return inserer_attribut($tag, 'style', (string) $style, true, !(bool) $style);
1180
+    if ($style === false) {
1181
+        $style = extraire_attribut($tag, 'style');
1182
+    }
1183
+
1184
+    // enlever le width et height du style
1185
+    if ($style) {
1186
+        $style = preg_replace(',(^|;)\s*(width|height)\s*:\s*[^;]+,ims', '', $style);
1187
+    }
1188
+    if ($style && $style[0] === ';') {
1189
+        $style = substr($style, 1);
1190
+    }
1191
+
1192
+    // mettre des attributs de width et height sur les images,
1193
+    // ca accelere le rendu du navigateur
1194
+    // ca permet aux navigateurs de reserver la bonne taille
1195
+    // quand on a desactive l'affichage des images.
1196
+    $tag = inserer_attribut($tag, 'width', round($width));
1197
+    $tag = inserer_attribut($tag, 'height', round($height));
1198
+
1199
+    // attributs deprecies. Transformer en CSS
1200
+    if ($espace = extraire_attribut($tag, 'hspace')) {
1201
+        $style = "margin:{$espace}px;" . $style;
1202
+        $tag = inserer_attribut($tag, 'hspace', '');
1203
+    }
1204
+
1205
+    return inserer_attribut($tag, 'style', (string) $style, true, !(bool) $style);
1206 1206
 }
1207 1207
 
1208 1208
 
@@ -1228,70 +1228,70 @@  discard block
 block discarded – undo
1228 1228
  *     Retourne le code HTML de l'image
1229 1229
  **/
1230 1230
 function _image_ecrire_tag($valeurs, $surcharge = []) {
1231
-	$valeurs = pipeline('image_ecrire_tag_preparer', $valeurs);
1232
-
1233
-	// fermer les tags img pas bien fermes;
1234
-	$tag = str_replace('>', '/>', str_replace('/>', '>', $valeurs['tag']));
1235
-
1236
-	// le style
1237
-	$style = $valeurs['style'];
1238
-	if (isset($surcharge['style'])) {
1239
-		$style = $surcharge['style'];
1240
-		unset($surcharge['style']);
1241
-	}
1242
-
1243
-	// traiter specifiquement la largeur et la hauteur
1244
-	$width = $valeurs['largeur'];
1245
-	if (isset($surcharge['width'])) {
1246
-		$width = $surcharge['width'];
1247
-		unset($surcharge['width']);
1248
-	}
1249
-	$height = $valeurs['hauteur'];
1250
-	if (isset($surcharge['height'])) {
1251
-		$height = $surcharge['height'];
1252
-		unset($surcharge['height']);
1253
-	}
1254
-
1255
-	$tag = _image_tag_changer_taille($tag, $width, $height, $style);
1256
-	// traiter specifiquement le src qui peut etre repris dans un onmouseout
1257
-	// on remplace toute les ref a src dans le tag
1258
-	$src = extraire_attribut($tag, 'src');
1259
-	if (isset($surcharge['src'])) {
1260
-		$tag = str_replace($src, $surcharge['src'], $tag);
1261
-		// si il y a des & dans src, alors ils peuvent provenir d'un &amp
1262
-		// pas garanti comme methode, mais mieux que rien
1263
-		if (str_contains($src, '&')) {
1264
-			$tag = str_replace(str_replace('&', '&amp;', $src), $surcharge['src'], $tag);
1265
-		}
1266
-		$src = $surcharge['src'];
1267
-		unset($surcharge['src']);
1268
-	}
1269
-
1270
-	$class = $valeurs['class'];
1271
-	if (isset($surcharge['class'])) {
1272
-		$class = $surcharge['class'];
1273
-		unset($surcharge['class']);
1274
-	}
1275
-	if (is_scalar($class) && strlen($class)) {
1276
-		$tag = inserer_attribut($tag, 'class', $class);
1277
-	}
1278
-
1279
-	if ($surcharge !== []) {
1280
-		foreach ($surcharge as $attribut => $valeur) {
1281
-			$tag = inserer_attribut($tag, $attribut, $valeur);
1282
-		}
1283
-	}
1284
-
1285
-	return pipeline(
1286
-		'image_ecrire_tag_finir',
1287
-		[
1288
-			'args' => [
1289
-				'valeurs' => $valeurs,
1290
-				'surcharge' => $surcharge,
1291
-			],
1292
-			'data' => $tag
1293
-		]
1294
-	);
1231
+    $valeurs = pipeline('image_ecrire_tag_preparer', $valeurs);
1232
+
1233
+    // fermer les tags img pas bien fermes;
1234
+    $tag = str_replace('>', '/>', str_replace('/>', '>', $valeurs['tag']));
1235
+
1236
+    // le style
1237
+    $style = $valeurs['style'];
1238
+    if (isset($surcharge['style'])) {
1239
+        $style = $surcharge['style'];
1240
+        unset($surcharge['style']);
1241
+    }
1242
+
1243
+    // traiter specifiquement la largeur et la hauteur
1244
+    $width = $valeurs['largeur'];
1245
+    if (isset($surcharge['width'])) {
1246
+        $width = $surcharge['width'];
1247
+        unset($surcharge['width']);
1248
+    }
1249
+    $height = $valeurs['hauteur'];
1250
+    if (isset($surcharge['height'])) {
1251
+        $height = $surcharge['height'];
1252
+        unset($surcharge['height']);
1253
+    }
1254
+
1255
+    $tag = _image_tag_changer_taille($tag, $width, $height, $style);
1256
+    // traiter specifiquement le src qui peut etre repris dans un onmouseout
1257
+    // on remplace toute les ref a src dans le tag
1258
+    $src = extraire_attribut($tag, 'src');
1259
+    if (isset($surcharge['src'])) {
1260
+        $tag = str_replace($src, $surcharge['src'], $tag);
1261
+        // si il y a des & dans src, alors ils peuvent provenir d'un &amp
1262
+        // pas garanti comme methode, mais mieux que rien
1263
+        if (str_contains($src, '&')) {
1264
+            $tag = str_replace(str_replace('&', '&amp;', $src), $surcharge['src'], $tag);
1265
+        }
1266
+        $src = $surcharge['src'];
1267
+        unset($surcharge['src']);
1268
+    }
1269
+
1270
+    $class = $valeurs['class'];
1271
+    if (isset($surcharge['class'])) {
1272
+        $class = $surcharge['class'];
1273
+        unset($surcharge['class']);
1274
+    }
1275
+    if (is_scalar($class) && strlen($class)) {
1276
+        $tag = inserer_attribut($tag, 'class', $class);
1277
+    }
1278
+
1279
+    if ($surcharge !== []) {
1280
+        foreach ($surcharge as $attribut => $valeur) {
1281
+            $tag = inserer_attribut($tag, $attribut, $valeur);
1282
+        }
1283
+    }
1284
+
1285
+    return pipeline(
1286
+        'image_ecrire_tag_finir',
1287
+        [
1288
+            'args' => [
1289
+                'valeurs' => $valeurs,
1290
+                'surcharge' => $surcharge,
1291
+            ],
1292
+            'data' => $tag
1293
+        ]
1294
+    );
1295 1295
 }
1296 1296
 
1297 1297
 /**
@@ -1314,268 +1314,268 @@  discard block
 block discarded – undo
1314 1314
  *     Description de l'image, sinon null.
1315 1315
  **/
1316 1316
 function _image_creer_vignette($valeurs, $maxWidth, $maxHeight, $process = 'AUTO', $force = false) {
1317
-	$srcHeight = null;
1318
-	$retour = [];
1319
-	// ordre de preference des formats graphiques pour creer les vignettes
1320
-	// le premier format disponible, selon la methode demandee, est utilise
1321
-	$image = $valeurs['fichier'];
1322
-	$format = $valeurs['format_source'];
1323
-	$destdir = dirname($valeurs['fichier_dest']);
1324
-	$destfile = basename($valeurs['fichier_dest'], '.' . $valeurs['format_dest']);
1325
-
1326
-	$format_sortie = $valeurs['format_dest'];
1327
-
1328
-	if ($process == 'AUTO' && isset($GLOBALS['meta']['image_process'])) {
1329
-		$process = $GLOBALS['meta']['image_process'];
1330
-	}
1331
-
1332
-	// si le doc n'est pas une image dans un format accetpable, refuser
1333
-	if (!$force && !in_array($format, formats_image_acceptables($process === 'gd2'))) {
1334
-		return;
1335
-	}
1336
-	$destination = "$destdir/$destfile";
1337
-
1338
-	// calculer la taille
1339
-	if (($srcWidth = $valeurs['largeur']) && ($srcHeight = $valeurs['hauteur'])) {
1340
-		if (!($destWidth = $valeurs['largeur_dest']) || !($destHeight = $valeurs['hauteur_dest'])) {
1341
-			[$destWidth, $destHeight] = _image_ratio($srcWidth, $srcHeight, $maxWidth, $maxHeight);
1342
-		}
1343
-	} elseif ($process == 'convert' || $process == 'imagick') {
1344
-		$destWidth = $maxWidth;
1345
-		$destHeight = $maxHeight;
1346
-	} else {
1347
-		spip_log("echec $process sur $image");
1348
-
1349
-		return;
1350
-	}
1351
-
1352
-	$vignette = '';
1353
-
1354
-	// Si l'image est de la taille demandee (ou plus petite), simplement la retourner
1355
-	if ($srcWidth && $srcWidth <= $maxWidth && $srcHeight <= $maxHeight) {
1356
-		$vignette = $destination . '.' . $format;
1357
-		@copy($image, $vignette);
1358
-	}
1359
-
1360
-	elseif ($valeurs['format_source'] === 'svg') {
1361
-		include_spip('inc/svg');
1362
-		if ($svg = svg_redimensionner($valeurs['fichier'], $destWidth, $destHeight)) {
1363
-			$format_sortie = 'svg';
1364
-			$vignette = $destination . '.' . $format_sortie;
1365
-			$valeurs['fichier_dest'] = $vignette;
1366
-			_image_gd_output($svg, $valeurs);
1367
-		}
1368
-	}
1369
-
1370
-	// imagemagick en ligne de commande
1371
-	elseif ($process == 'convert') {
1372
-		if (!defined('_CONVERT_COMMAND')) {
1373
-			define('_CONVERT_COMMAND', 'convert');
1374
-		} // Securite : mes_options.php peut preciser le chemin absolu
1375
-		if (!defined('_RESIZE_COMMAND')) {
1376
-			define('_RESIZE_COMMAND', _CONVERT_COMMAND . ' -quality ' . _IMG_CONVERT_QUALITE . ' -orient Undefined -resize %xx%y! %src %dest');
1377
-		}
1378
-		$vignette = $destination . '.' . $format_sortie;
1379
-		$commande = str_replace(
1380
-			['%x', '%y', '%src', '%dest'],
1381
-			[
1382
-				$destWidth,
1383
-				$destHeight,
1384
-				escapeshellcmd($image),
1385
-				escapeshellcmd($vignette)
1386
-			],
1387
-			_RESIZE_COMMAND
1388
-		);
1389
-		spip_log($commande);
1390
-		exec($commande);
1391
-		if (!@file_exists($vignette)) {
1392
-			spip_log("echec convert sur $vignette");
1393
-
1394
-			return;  // echec commande
1395
-		}
1396
-	}
1397
-
1398
-	// php5 imagemagick
1399
-	elseif ($process == 'imagick') {
1400
-		if (!class_exists(\Imagick::class)) {
1401
-			spip_log('Classe Imagick absente !', _LOG_ERREUR);
1402
-
1403
-			return;
1404
-		}
1405
-
1406
-		// chemin compatible Windows
1407
-		$output = realpath(dirname($destination));
1408
-		if (!$output) {
1409
-			return;
1410
-		}
1411
-		$vignette = $output . DIRECTORY_SEPARATOR . basename($destination) . '.' . $format_sortie;
1412
-
1413
-		$imagick = new Imagick();
1414
-		$imagick->readImage(realpath($image));
1415
-		$imagick->resizeImage(
1416
-			$destWidth,
1417
-			$destHeight,
1418
-			Imagick::FILTER_LANCZOS,
1419
-			1
1420
-		);//, IMAGICK_FILTER_LANCZOS, _IMG_IMAGICK_QUALITE / 100);
1421
-		$imagick->writeImage($vignette);
1422
-
1423
-		if (!@file_exists($vignette)) {
1424
-			spip_log("echec imagick sur $vignette");
1425
-
1426
-			return;
1427
-		}
1428
-		// remettre le chemin relatif car c'est ce qu'attend SPIP pour la suite (en particlier action/tester)
1429
-		$vignette = $destination . '.' . $format_sortie;
1430
-	}
1431
-
1432
-	// netpbm
1433
-	elseif ($process == 'netpbm') {
1434
-		if (!defined('_PNMSCALE_COMMAND')) {
1435
-			define('_PNMSCALE_COMMAND', 'pnmscale');
1436
-		} // Securite : mes_options.php peut preciser le chemin absolu
1437
-		if (_PNMSCALE_COMMAND == '') {
1438
-			return;
1439
-		}
1440
-		$vignette = $destination . '.' . $format_sortie;
1441
-		$pnmtojpeg_command = str_replace('pnmscale', 'pnmtojpeg', _PNMSCALE_COMMAND);
1442
-		if ($format == 'jpg') {
1443
-			$jpegtopnm_command = str_replace('pnmscale', 'jpegtopnm', _PNMSCALE_COMMAND);
1444
-			exec("$jpegtopnm_command $image | " . _PNMSCALE_COMMAND . " -width $destWidth | $pnmtojpeg_command > $vignette");
1445
-			if (!($s = @filesize($vignette))) {
1446
-				spip_unlink($vignette);
1447
-			}
1448
-			if (!@file_exists($vignette)) {
1449
-				spip_log("echec netpbm-jpg sur $vignette");
1450
-
1451
-				return;
1452
-			}
1453
-		} else {
1454
-			if ($format == 'gif') {
1455
-				$giftopnm_command = str_replace('pnmscale', 'giftopnm', _PNMSCALE_COMMAND);
1456
-				exec("$giftopnm_command $image | " . _PNMSCALE_COMMAND . " -width $destWidth | $pnmtojpeg_command > $vignette");
1457
-				if (!($s = @filesize($vignette))) {
1458
-					spip_unlink($vignette);
1459
-				}
1460
-				if (!@file_exists($vignette)) {
1461
-					spip_log("echec netpbm-gif sur $vignette");
1462
-
1463
-					return;
1464
-				}
1465
-			} else {
1466
-				if ($format == 'png') {
1467
-					$pngtopnm_command = str_replace('pnmscale', 'pngtopnm', _PNMSCALE_COMMAND);
1468
-					exec("$pngtopnm_command $image | " . _PNMSCALE_COMMAND . " -width $destWidth | $pnmtojpeg_command > $vignette");
1469
-					if (!($s = @filesize($vignette))) {
1470
-						spip_unlink($vignette);
1471
-					}
1472
-					if (!@file_exists($vignette)) {
1473
-						spip_log("echec netpbm-png sur $vignette");
1474
-
1475
-						return;
1476
-					}
1477
-				}
1478
-			}
1479
-		}
1480
-	}
1481
-
1482
-	// gd ou gd2
1483
-	elseif ($process === 'gd2') {
1484
-		if (!function_exists('gd_info')) {
1485
-			spip_log('Librairie GD absente !', _LOG_ERREUR);
1486
-
1487
-			return;
1488
-		}
1489
-		if (_IMG_GD_MAX_PIXELS && $srcWidth * $srcHeight > _IMG_GD_MAX_PIXELS) {
1490
-			spip_log('vignette gd2 impossible : ' . $srcWidth * $srcHeight . 'pixels');
1491
-
1492
-			return;
1493
-		}
1494
-		$destFormat = $format_sortie;
1495
-		if (!$destFormat) {
1496
-			spip_log("pas de format pour $image");
1497
-
1498
-			return;
1499
-		}
1500
-
1501
-		$fonction_imagecreatefrom = $valeurs['fonction_imagecreatefrom'];
1502
-		if (!function_exists($fonction_imagecreatefrom)) {
1503
-			return;
1504
-		}
1505
-		$srcImage = @$fonction_imagecreatefrom($image);
1506
-		if (!$srcImage) {
1507
-			spip_log('echec gd2');
1508
-
1509
-			return;
1510
-		}
1511
-
1512
-		// Initialisation de l'image destination
1513
-		$destImage = null;
1514
-		if ($process == 'gd2' && $destFormat != 'gif') {
1515
-			$destImage = ImageCreateTrueColor($destWidth, $destHeight);
1516
-		}
1517
-		if (!$destImage) {
1518
-			$destImage = ImageCreate($destWidth, $destHeight);
1519
-		}
1520
-
1521
-		// Recopie de l'image d'origine avec adaptation de la taille
1522
-		$ok = false;
1523
-		if ($process == 'gd2' && function_exists('ImageCopyResampled')) {
1524
-			if ($format == 'gif') {
1525
-				// Si un GIF est transparent,
1526
-				// fabriquer un PNG transparent
1527
-				$transp = imagecolortransparent($srcImage);
1528
-				if ($transp > 0) {
1529
-					$destFormat = 'png';
1530
-				}
1531
-			}
1532
-			if (in_array($destFormat, _image_extensions_conservent_transparence())) {
1533
-				// Conserver la transparence
1534
-				if (function_exists('imageAntiAlias')) {
1535
-					imageAntiAlias($destImage, true);
1536
-				}
1537
-				@imagealphablending($destImage, false);
1538
-				@imagesavealpha($destImage, true);
1539
-			}
1540
-			$ok = @ImageCopyResampled($destImage, $srcImage, 0, 0, 0, 0, $destWidth, $destHeight, $srcWidth, $srcHeight);
1541
-		}
1542
-		if (!$ok) {
1543
-			$ok = ImageCopyResized($destImage, $srcImage, 0, 0, 0, 0, $destWidth, $destHeight, $srcWidth, $srcHeight);
1544
-		}
1545
-
1546
-		// Sauvegarde de l'image destination
1547
-		$valeurs['fichier_dest'] = $vignette = "$destination.$destFormat";
1548
-		$valeurs['format_dest'] = $format = $destFormat;
1549
-		_image_gd_output($destImage, $valeurs);
1550
-
1551
-		if ($srcImage) {
1552
-			ImageDestroy($srcImage);
1553
-		}
1554
-		ImageDestroy($destImage);
1555
-	}
1556
-
1557
-	if (!$vignette || !$size = @spip_getimagesize($vignette)) {
1558
-		$size = [$destWidth, $destHeight];
1559
-	}
1560
-
1561
-	// Gaffe: en safe mode, pas d'acces a la vignette,
1562
-	// donc risque de balancer "width='0'", ce qui masque l'image sous MSIE
1563
-	if ($size[0] < 1) {
1564
-		$size[0] = $destWidth;
1565
-	}
1566
-	if ($size[1] < 1) {
1567
-		$size[1] = $destHeight;
1568
-	}
1569
-
1570
-	$retour['width'] = $largeur = $size[0];
1571
-	$retour['height'] = $hauteur = $size[1];
1572
-
1573
-	$retour['fichier'] = $vignette;
1574
-	$retour['format'] = $format;
1575
-	$retour['date'] = @filemtime($vignette);
1576
-
1577
-	// renvoyer l'image
1578
-	return $retour;
1317
+    $srcHeight = null;
1318
+    $retour = [];
1319
+    // ordre de preference des formats graphiques pour creer les vignettes
1320
+    // le premier format disponible, selon la methode demandee, est utilise
1321
+    $image = $valeurs['fichier'];
1322
+    $format = $valeurs['format_source'];
1323
+    $destdir = dirname($valeurs['fichier_dest']);
1324
+    $destfile = basename($valeurs['fichier_dest'], '.' . $valeurs['format_dest']);
1325
+
1326
+    $format_sortie = $valeurs['format_dest'];
1327
+
1328
+    if ($process == 'AUTO' && isset($GLOBALS['meta']['image_process'])) {
1329
+        $process = $GLOBALS['meta']['image_process'];
1330
+    }
1331
+
1332
+    // si le doc n'est pas une image dans un format accetpable, refuser
1333
+    if (!$force && !in_array($format, formats_image_acceptables($process === 'gd2'))) {
1334
+        return;
1335
+    }
1336
+    $destination = "$destdir/$destfile";
1337
+
1338
+    // calculer la taille
1339
+    if (($srcWidth = $valeurs['largeur']) && ($srcHeight = $valeurs['hauteur'])) {
1340
+        if (!($destWidth = $valeurs['largeur_dest']) || !($destHeight = $valeurs['hauteur_dest'])) {
1341
+            [$destWidth, $destHeight] = _image_ratio($srcWidth, $srcHeight, $maxWidth, $maxHeight);
1342
+        }
1343
+    } elseif ($process == 'convert' || $process == 'imagick') {
1344
+        $destWidth = $maxWidth;
1345
+        $destHeight = $maxHeight;
1346
+    } else {
1347
+        spip_log("echec $process sur $image");
1348
+
1349
+        return;
1350
+    }
1351
+
1352
+    $vignette = '';
1353
+
1354
+    // Si l'image est de la taille demandee (ou plus petite), simplement la retourner
1355
+    if ($srcWidth && $srcWidth <= $maxWidth && $srcHeight <= $maxHeight) {
1356
+        $vignette = $destination . '.' . $format;
1357
+        @copy($image, $vignette);
1358
+    }
1359
+
1360
+    elseif ($valeurs['format_source'] === 'svg') {
1361
+        include_spip('inc/svg');
1362
+        if ($svg = svg_redimensionner($valeurs['fichier'], $destWidth, $destHeight)) {
1363
+            $format_sortie = 'svg';
1364
+            $vignette = $destination . '.' . $format_sortie;
1365
+            $valeurs['fichier_dest'] = $vignette;
1366
+            _image_gd_output($svg, $valeurs);
1367
+        }
1368
+    }
1369
+
1370
+    // imagemagick en ligne de commande
1371
+    elseif ($process == 'convert') {
1372
+        if (!defined('_CONVERT_COMMAND')) {
1373
+            define('_CONVERT_COMMAND', 'convert');
1374
+        } // Securite : mes_options.php peut preciser le chemin absolu
1375
+        if (!defined('_RESIZE_COMMAND')) {
1376
+            define('_RESIZE_COMMAND', _CONVERT_COMMAND . ' -quality ' . _IMG_CONVERT_QUALITE . ' -orient Undefined -resize %xx%y! %src %dest');
1377
+        }
1378
+        $vignette = $destination . '.' . $format_sortie;
1379
+        $commande = str_replace(
1380
+            ['%x', '%y', '%src', '%dest'],
1381
+            [
1382
+                $destWidth,
1383
+                $destHeight,
1384
+                escapeshellcmd($image),
1385
+                escapeshellcmd($vignette)
1386
+            ],
1387
+            _RESIZE_COMMAND
1388
+        );
1389
+        spip_log($commande);
1390
+        exec($commande);
1391
+        if (!@file_exists($vignette)) {
1392
+            spip_log("echec convert sur $vignette");
1393
+
1394
+            return;  // echec commande
1395
+        }
1396
+    }
1397
+
1398
+    // php5 imagemagick
1399
+    elseif ($process == 'imagick') {
1400
+        if (!class_exists(\Imagick::class)) {
1401
+            spip_log('Classe Imagick absente !', _LOG_ERREUR);
1402
+
1403
+            return;
1404
+        }
1405
+
1406
+        // chemin compatible Windows
1407
+        $output = realpath(dirname($destination));
1408
+        if (!$output) {
1409
+            return;
1410
+        }
1411
+        $vignette = $output . DIRECTORY_SEPARATOR . basename($destination) . '.' . $format_sortie;
1412
+
1413
+        $imagick = new Imagick();
1414
+        $imagick->readImage(realpath($image));
1415
+        $imagick->resizeImage(
1416
+            $destWidth,
1417
+            $destHeight,
1418
+            Imagick::FILTER_LANCZOS,
1419
+            1
1420
+        );//, IMAGICK_FILTER_LANCZOS, _IMG_IMAGICK_QUALITE / 100);
1421
+        $imagick->writeImage($vignette);
1422
+
1423
+        if (!@file_exists($vignette)) {
1424
+            spip_log("echec imagick sur $vignette");
1425
+
1426
+            return;
1427
+        }
1428
+        // remettre le chemin relatif car c'est ce qu'attend SPIP pour la suite (en particlier action/tester)
1429
+        $vignette = $destination . '.' . $format_sortie;
1430
+    }
1431
+
1432
+    // netpbm
1433
+    elseif ($process == 'netpbm') {
1434
+        if (!defined('_PNMSCALE_COMMAND')) {
1435
+            define('_PNMSCALE_COMMAND', 'pnmscale');
1436
+        } // Securite : mes_options.php peut preciser le chemin absolu
1437
+        if (_PNMSCALE_COMMAND == '') {
1438
+            return;
1439
+        }
1440
+        $vignette = $destination . '.' . $format_sortie;
1441
+        $pnmtojpeg_command = str_replace('pnmscale', 'pnmtojpeg', _PNMSCALE_COMMAND);
1442
+        if ($format == 'jpg') {
1443
+            $jpegtopnm_command = str_replace('pnmscale', 'jpegtopnm', _PNMSCALE_COMMAND);
1444
+            exec("$jpegtopnm_command $image | " . _PNMSCALE_COMMAND . " -width $destWidth | $pnmtojpeg_command > $vignette");
1445
+            if (!($s = @filesize($vignette))) {
1446
+                spip_unlink($vignette);
1447
+            }
1448
+            if (!@file_exists($vignette)) {
1449
+                spip_log("echec netpbm-jpg sur $vignette");
1450
+
1451
+                return;
1452
+            }
1453
+        } else {
1454
+            if ($format == 'gif') {
1455
+                $giftopnm_command = str_replace('pnmscale', 'giftopnm', _PNMSCALE_COMMAND);
1456
+                exec("$giftopnm_command $image | " . _PNMSCALE_COMMAND . " -width $destWidth | $pnmtojpeg_command > $vignette");
1457
+                if (!($s = @filesize($vignette))) {
1458
+                    spip_unlink($vignette);
1459
+                }
1460
+                if (!@file_exists($vignette)) {
1461
+                    spip_log("echec netpbm-gif sur $vignette");
1462
+
1463
+                    return;
1464
+                }
1465
+            } else {
1466
+                if ($format == 'png') {
1467
+                    $pngtopnm_command = str_replace('pnmscale', 'pngtopnm', _PNMSCALE_COMMAND);
1468
+                    exec("$pngtopnm_command $image | " . _PNMSCALE_COMMAND . " -width $destWidth | $pnmtojpeg_command > $vignette");
1469
+                    if (!($s = @filesize($vignette))) {
1470
+                        spip_unlink($vignette);
1471
+                    }
1472
+                    if (!@file_exists($vignette)) {
1473
+                        spip_log("echec netpbm-png sur $vignette");
1474
+
1475
+                        return;
1476
+                    }
1477
+                }
1478
+            }
1479
+        }
1480
+    }
1481
+
1482
+    // gd ou gd2
1483
+    elseif ($process === 'gd2') {
1484
+        if (!function_exists('gd_info')) {
1485
+            spip_log('Librairie GD absente !', _LOG_ERREUR);
1486
+
1487
+            return;
1488
+        }
1489
+        if (_IMG_GD_MAX_PIXELS && $srcWidth * $srcHeight > _IMG_GD_MAX_PIXELS) {
1490
+            spip_log('vignette gd2 impossible : ' . $srcWidth * $srcHeight . 'pixels');
1491
+
1492
+            return;
1493
+        }
1494
+        $destFormat = $format_sortie;
1495
+        if (!$destFormat) {
1496
+            spip_log("pas de format pour $image");
1497
+
1498
+            return;
1499
+        }
1500
+
1501
+        $fonction_imagecreatefrom = $valeurs['fonction_imagecreatefrom'];
1502
+        if (!function_exists($fonction_imagecreatefrom)) {
1503
+            return;
1504
+        }
1505
+        $srcImage = @$fonction_imagecreatefrom($image);
1506
+        if (!$srcImage) {
1507
+            spip_log('echec gd2');
1508
+
1509
+            return;
1510
+        }
1511
+
1512
+        // Initialisation de l'image destination
1513
+        $destImage = null;
1514
+        if ($process == 'gd2' && $destFormat != 'gif') {
1515
+            $destImage = ImageCreateTrueColor($destWidth, $destHeight);
1516
+        }
1517
+        if (!$destImage) {
1518
+            $destImage = ImageCreate($destWidth, $destHeight);
1519
+        }
1520
+
1521
+        // Recopie de l'image d'origine avec adaptation de la taille
1522
+        $ok = false;
1523
+        if ($process == 'gd2' && function_exists('ImageCopyResampled')) {
1524
+            if ($format == 'gif') {
1525
+                // Si un GIF est transparent,
1526
+                // fabriquer un PNG transparent
1527
+                $transp = imagecolortransparent($srcImage);
1528
+                if ($transp > 0) {
1529
+                    $destFormat = 'png';
1530
+                }
1531
+            }
1532
+            if (in_array($destFormat, _image_extensions_conservent_transparence())) {
1533
+                // Conserver la transparence
1534
+                if (function_exists('imageAntiAlias')) {
1535
+                    imageAntiAlias($destImage, true);
1536
+                }
1537
+                @imagealphablending($destImage, false);
1538
+                @imagesavealpha($destImage, true);
1539
+            }
1540
+            $ok = @ImageCopyResampled($destImage, $srcImage, 0, 0, 0, 0, $destWidth, $destHeight, $srcWidth, $srcHeight);
1541
+        }
1542
+        if (!$ok) {
1543
+            $ok = ImageCopyResized($destImage, $srcImage, 0, 0, 0, 0, $destWidth, $destHeight, $srcWidth, $srcHeight);
1544
+        }
1545
+
1546
+        // Sauvegarde de l'image destination
1547
+        $valeurs['fichier_dest'] = $vignette = "$destination.$destFormat";
1548
+        $valeurs['format_dest'] = $format = $destFormat;
1549
+        _image_gd_output($destImage, $valeurs);
1550
+
1551
+        if ($srcImage) {
1552
+            ImageDestroy($srcImage);
1553
+        }
1554
+        ImageDestroy($destImage);
1555
+    }
1556
+
1557
+    if (!$vignette || !$size = @spip_getimagesize($vignette)) {
1558
+        $size = [$destWidth, $destHeight];
1559
+    }
1560
+
1561
+    // Gaffe: en safe mode, pas d'acces a la vignette,
1562
+    // donc risque de balancer "width='0'", ce qui masque l'image sous MSIE
1563
+    if ($size[0] < 1) {
1564
+        $size[0] = $destWidth;
1565
+    }
1566
+    if ($size[1] < 1) {
1567
+        $size[1] = $destHeight;
1568
+    }
1569
+
1570
+    $retour['width'] = $largeur = $size[0];
1571
+    $retour['height'] = $hauteur = $size[1];
1572
+
1573
+    $retour['fichier'] = $vignette;
1574
+    $retour['format'] = $format;
1575
+    $retour['date'] = @filemtime($vignette);
1576
+
1577
+    // renvoyer l'image
1578
+    return $retour;
1579 1579
 }
1580 1580
 
1581 1581
 /**
@@ -1595,25 +1595,25 @@  discard block
 block discarded – undo
1595 1595
  * @return array Liste [ largeur, hauteur, ratio de réduction ]
1596 1596
  **/
1597 1597
 function _image_ratio(int $srcWidth, int $srcHeight, int $maxWidth, int $maxHeight): array {
1598
-	$ratioWidth = $srcWidth / $maxWidth;
1599
-	$ratioHeight = $srcHeight / $maxHeight;
1600
-
1601
-	if ($srcWidth <= $maxWidth && $srcHeight <= $maxHeight) {
1602
-		$destWidth = $srcWidth;
1603
-		$destHeight = $srcHeight;
1604
-	} elseif ($ratioWidth < $ratioHeight) {
1605
-		$destWidth = $srcWidth / $ratioHeight;
1606
-		$destHeight = $maxHeight;
1607
-	} else {
1608
-		$destWidth = $maxWidth;
1609
-		$destHeight = $srcHeight / $ratioWidth;
1610
-	}
1611
-
1612
-	return [
1613
-		(int) round($destWidth),
1614
-		(int) round($destHeight),
1615
-		max($ratioWidth, $ratioHeight)
1616
-	];
1598
+    $ratioWidth = $srcWidth / $maxWidth;
1599
+    $ratioHeight = $srcHeight / $maxHeight;
1600
+
1601
+    if ($srcWidth <= $maxWidth && $srcHeight <= $maxHeight) {
1602
+        $destWidth = $srcWidth;
1603
+        $destHeight = $srcHeight;
1604
+    } elseif ($ratioWidth < $ratioHeight) {
1605
+        $destWidth = $srcWidth / $ratioHeight;
1606
+        $destHeight = $maxHeight;
1607
+    } else {
1608
+        $destWidth = $maxWidth;
1609
+        $destHeight = $srcHeight / $ratioWidth;
1610
+    }
1611
+
1612
+    return [
1613
+        (int) round($destWidth),
1614
+        (int) round($destHeight),
1615
+        max($ratioWidth, $ratioHeight)
1616
+    ];
1617 1617
 }
1618 1618
 
1619 1619
 /**
@@ -1633,25 +1633,25 @@  discard block
 block discarded – undo
1633 1633
  * @return array Liste [ largeur, hauteur, ratio de réduction ]
1634 1634
  **/
1635 1635
 function ratio_passe_partout(int $srcWidth, int $srcHeight, int $maxWidth, int $maxHeight): array {
1636
-	$ratioWidth = $srcWidth / $maxWidth;
1637
-	$ratioHeight = $srcHeight / $maxHeight;
1638
-
1639
-	if ($srcWidth <= $maxWidth && $srcHeight <= $maxHeight) {
1640
-		$destWidth = $srcWidth;
1641
-		$destHeight = $srcHeight;
1642
-	} elseif ($ratioWidth > $ratioHeight) {
1643
-		$destWidth = $srcWidth / $ratioHeight;
1644
-		$destHeight = $maxHeight;
1645
-	} else {
1646
-		$destWidth = $maxWidth;
1647
-		$destHeight = $srcHeight / $ratioWidth;
1648
-	}
1649
-
1650
-	return [
1651
-		(int) round($destWidth),
1652
-		(int) round($destHeight),
1653
-		min($ratioWidth, $ratioHeight)
1654
-	];
1636
+    $ratioWidth = $srcWidth / $maxWidth;
1637
+    $ratioHeight = $srcHeight / $maxHeight;
1638
+
1639
+    if ($srcWidth <= $maxWidth && $srcHeight <= $maxHeight) {
1640
+        $destWidth = $srcWidth;
1641
+        $destHeight = $srcHeight;
1642
+    } elseif ($ratioWidth > $ratioHeight) {
1643
+        $destWidth = $srcWidth / $ratioHeight;
1644
+        $destHeight = $maxHeight;
1645
+    } else {
1646
+        $destWidth = $maxWidth;
1647
+        $destHeight = $srcHeight / $ratioWidth;
1648
+    }
1649
+
1650
+    return [
1651
+        (int) round($destWidth),
1652
+        (int) round($destHeight),
1653
+        min($ratioWidth, $ratioHeight)
1654
+    ];
1655 1655
 }
1656 1656
 
1657 1657
 
@@ -1664,12 +1664,12 @@  discard block
 block discarded – undo
1664 1664
  * @return string
1665 1665
  */
1666 1666
 function process_image_svg_identite($image) {
1667
-	if ($image['creer']) {
1668
-		$source = $image['fichier'];
1669
-		_image_gd_output($source, $image);
1670
-	}
1667
+    if ($image['creer']) {
1668
+        $source = $image['fichier'];
1669
+        _image_gd_output($source, $image);
1670
+    }
1671 1671
 
1672
-	return _image_ecrire_tag($image, ['src' => $image['fichier_dest']]);
1672
+    return _image_ecrire_tag($image, ['src' => $image['fichier_dest']]);
1673 1673
 }
1674 1674
 
1675 1675
 
@@ -1702,102 +1702,102 @@  discard block
 block discarded – undo
1702 1702
  *     Code HTML de la balise img produite
1703 1703
  **/
1704 1704
 function process_image_reduire($fonction, $img, $taille, $taille_y, $force, $process = 'AUTO') {
1705
-	$image = false;
1706
-	if ($process == 'AUTO' && isset($GLOBALS['meta']['image_process'])) {
1707
-		$process = $GLOBALS['meta']['image_process'];
1708
-	}
1709
-	# determiner le format de sortie
1710
-	$format_sortie = false; // le choix par defaut sera bon
1711
-	if ($process === 'netpbm') {
1712
-		$format_sortie = 'jpg';
1713
-	} elseif ($process === 'gd2') {
1714
-		$image = _image_valeurs_trans($img, "reduire-{$taille}-{$taille_y}", $format_sortie, $fonction, false, _SVG_SUPPORTED);
1715
-		// on verifie que l'extension choisie est bonne (en principe oui)
1716
-		$gd_formats = formats_image_acceptables(true);
1717
-		if (
1718
-			is_array($image)
1719
-			&& (!in_array($image['format_dest'], $gd_formats) || !in_array($image['format_dest'], _image_extensions_acceptees_en_sortie()))
1720
-		) {
1721
-			$formats_sortie = $image['format_source'] == 'jpg' ? ['jpg', 'png', 'gif'] : ['png', 'jpg', 'gif'];
1722
-			// Choisir le format destination
1723
-			// - on sauve de preference en JPEG (meilleure compression)
1724
-			// - pour le GIF : les GD recentes peuvent le lire mais pas l'ecrire
1725
-			# bug : gd_formats contient la liste des fichiers qu'on sait *lire*,
1726
-			# pas *ecrire*
1727
-			$format_sortie = '';
1728
-			foreach ($formats_sortie as $fmt) {
1729
-				if (in_array($fmt, $gd_formats) && in_array($fmt, _image_extensions_acceptees_en_sortie())) {
1730
-					$format_sortie = $fmt;
1731
-					break;
1732
-				}
1733
-			}
1734
-			$image = false;
1735
-		}
1736
-	}
1737
-
1738
-	if (!is_array($image)) {
1739
-		$image = _image_valeurs_trans($img, "reduire-{$taille}-{$taille_y}", $format_sortie, $fonction, false, _SVG_SUPPORTED);
1740
-	}
1741
-
1742
-	if (!is_array($image) || !$image['largeur'] || !$image['hauteur']) {
1743
-		spip_log("image_reduire_src:pas de version locale de $img ou extension non prise en charge");
1744
-		// on peut resizer en mode html si on dispose des elements
1745
-		[$srcw, $srch] = taille_image($img);
1746
-		if ($srcw && $srch) {
1747
-			[$w, $h] = _image_ratio($srcw, $srch, $taille, $taille_y);
1748
-
1749
-			return _image_tag_changer_taille($img, $w, $h);
1750
-		}
1751
-		// la on n'a pas d'infos sur l'image source... on refile le truc a css
1752
-		// sous la forme style='max-width: NNpx;'
1753
-		return inserer_attribut(
1754
-			$img,
1755
-			'style',
1756
-			"max-width: {$taille}px;max-width: min(100%,{$taille}px); max-height: {$taille_y}px"
1757
-		);
1758
-	}
1759
-
1760
-	// si l'image est plus petite que la cible retourner une copie cachee de l'image
1761
-	if (($image['largeur'] <= $taille) && ($image['hauteur'] <= $taille_y)) {
1762
-		if ($image['creer']) {
1763
-			@copy($image['fichier'], $image['fichier_dest']);
1764
-		}
1765
-
1766
-		return _image_ecrire_tag($image, ['src' => $image['fichier_dest']]);
1767
-	}
1768
-
1769
-	if ($image['creer'] == false && !$force) {
1770
-		return _image_ecrire_tag(
1771
-			$image,
1772
-			['src' => $image['fichier_dest'], 'width' => $image['largeur_dest'], 'height' => $image['hauteur_dest']]
1773
-		);
1774
-	}
1775
-
1776
-	if (in_array($image['format_source'], _image_extensions_acceptees_en_entree())) {
1777
-		$destWidth = $image['largeur_dest'];
1778
-		$destHeight = $image['hauteur_dest'];
1779
-		$logo = $image['fichier'];
1780
-		$date = $image['date_src'];
1781
-		$preview = _image_creer_vignette($image, $taille, $taille_y, $process, $force);
1782
-
1783
-		if ($preview && $preview['fichier']) {
1784
-			$logo = $preview['fichier'];
1785
-			$destWidth = $preview['width'];
1786
-			$destHeight = $preview['height'];
1787
-			$date = $preview['date'];
1788
-		}
1789
-		// dans l'espace prive mettre un timestamp sur l'adresse
1790
-		// de l'image, de facon a tromper le cache du navigateur
1791
-		// quand on fait supprimer/reuploader un logo
1792
-		// (pas de filemtime si SAFE MODE)
1793
-		$date = test_espace_prive() ? ('?' . $date) : '';
1794
-
1795
-		return _image_ecrire_tag($image, ['src' => "$logo$date", 'width' => $destWidth, 'height' => $destHeight]);
1796
-	}
1797
-	else {
1798
-		# BMP, tiff ... les redacteurs osent tout!
1799
-		return $img;
1800
-	}
1705
+    $image = false;
1706
+    if ($process == 'AUTO' && isset($GLOBALS['meta']['image_process'])) {
1707
+        $process = $GLOBALS['meta']['image_process'];
1708
+    }
1709
+    # determiner le format de sortie
1710
+    $format_sortie = false; // le choix par defaut sera bon
1711
+    if ($process === 'netpbm') {
1712
+        $format_sortie = 'jpg';
1713
+    } elseif ($process === 'gd2') {
1714
+        $image = _image_valeurs_trans($img, "reduire-{$taille}-{$taille_y}", $format_sortie, $fonction, false, _SVG_SUPPORTED);
1715
+        // on verifie que l'extension choisie est bonne (en principe oui)
1716
+        $gd_formats = formats_image_acceptables(true);
1717
+        if (
1718
+            is_array($image)
1719
+            && (!in_array($image['format_dest'], $gd_formats) || !in_array($image['format_dest'], _image_extensions_acceptees_en_sortie()))
1720
+        ) {
1721
+            $formats_sortie = $image['format_source'] == 'jpg' ? ['jpg', 'png', 'gif'] : ['png', 'jpg', 'gif'];
1722
+            // Choisir le format destination
1723
+            // - on sauve de preference en JPEG (meilleure compression)
1724
+            // - pour le GIF : les GD recentes peuvent le lire mais pas l'ecrire
1725
+            # bug : gd_formats contient la liste des fichiers qu'on sait *lire*,
1726
+            # pas *ecrire*
1727
+            $format_sortie = '';
1728
+            foreach ($formats_sortie as $fmt) {
1729
+                if (in_array($fmt, $gd_formats) && in_array($fmt, _image_extensions_acceptees_en_sortie())) {
1730
+                    $format_sortie = $fmt;
1731
+                    break;
1732
+                }
1733
+            }
1734
+            $image = false;
1735
+        }
1736
+    }
1737
+
1738
+    if (!is_array($image)) {
1739
+        $image = _image_valeurs_trans($img, "reduire-{$taille}-{$taille_y}", $format_sortie, $fonction, false, _SVG_SUPPORTED);
1740
+    }
1741
+
1742
+    if (!is_array($image) || !$image['largeur'] || !$image['hauteur']) {
1743
+        spip_log("image_reduire_src:pas de version locale de $img ou extension non prise en charge");
1744
+        // on peut resizer en mode html si on dispose des elements
1745
+        [$srcw, $srch] = taille_image($img);
1746
+        if ($srcw && $srch) {
1747
+            [$w, $h] = _image_ratio($srcw, $srch, $taille, $taille_y);
1748
+
1749
+            return _image_tag_changer_taille($img, $w, $h);
1750
+        }
1751
+        // la on n'a pas d'infos sur l'image source... on refile le truc a css
1752
+        // sous la forme style='max-width: NNpx;'
1753
+        return inserer_attribut(
1754
+            $img,
1755
+            'style',
1756
+            "max-width: {$taille}px;max-width: min(100%,{$taille}px); max-height: {$taille_y}px"
1757
+        );
1758
+    }
1759
+
1760
+    // si l'image est plus petite que la cible retourner une copie cachee de l'image
1761
+    if (($image['largeur'] <= $taille) && ($image['hauteur'] <= $taille_y)) {
1762
+        if ($image['creer']) {
1763
+            @copy($image['fichier'], $image['fichier_dest']);
1764
+        }
1765
+
1766
+        return _image_ecrire_tag($image, ['src' => $image['fichier_dest']]);
1767
+    }
1768
+
1769
+    if ($image['creer'] == false && !$force) {
1770
+        return _image_ecrire_tag(
1771
+            $image,
1772
+            ['src' => $image['fichier_dest'], 'width' => $image['largeur_dest'], 'height' => $image['hauteur_dest']]
1773
+        );
1774
+    }
1775
+
1776
+    if (in_array($image['format_source'], _image_extensions_acceptees_en_entree())) {
1777
+        $destWidth = $image['largeur_dest'];
1778
+        $destHeight = $image['hauteur_dest'];
1779
+        $logo = $image['fichier'];
1780
+        $date = $image['date_src'];
1781
+        $preview = _image_creer_vignette($image, $taille, $taille_y, $process, $force);
1782
+
1783
+        if ($preview && $preview['fichier']) {
1784
+            $logo = $preview['fichier'];
1785
+            $destWidth = $preview['width'];
1786
+            $destHeight = $preview['height'];
1787
+            $date = $preview['date'];
1788
+        }
1789
+        // dans l'espace prive mettre un timestamp sur l'adresse
1790
+        // de l'image, de facon a tromper le cache du navigateur
1791
+        // quand on fait supprimer/reuploader un logo
1792
+        // (pas de filemtime si SAFE MODE)
1793
+        $date = test_espace_prive() ? ('?' . $date) : '';
1794
+
1795
+        return _image_ecrire_tag($image, ['src' => "$logo$date", 'width' => $destWidth, 'height' => $destHeight]);
1796
+    }
1797
+    else {
1798
+        # BMP, tiff ... les redacteurs osent tout!
1799
+        return $img;
1800
+    }
1801 1801
 }
1802 1802
 
1803 1803
 /**
@@ -1811,145 +1811,145 @@  discard block
 block discarded – undo
1811 1811
  * Class phpthumb_functions
1812 1812
  */
1813 1813
 class phpthumb_functions {
1814
-	/**
1815
-	 * Retourne la couleur d'un pixel dans une image
1816
-	 *
1817
-	 * @param GdImage $img
1818
-	 * @param int $x
1819
-	 * @param int $y
1820
-	 * @return array|bool
1821
-	 */
1822
-	public static function GetPixelColor(&$img, $x, $y) {
1823
-		if ($img instanceof \GdImage) {
1824
-			return @ImageColorsForIndex($img, @ImageColorAt($img, $x, $y));
1825
-		}
1826
-		return false;
1827
-	}
1828
-
1829
-	/**
1830
-	 * Retourne un nombre dans une représentation en Little Endian
1831
-	 *
1832
-	 * @param int $number
1833
-	 * @param int $minbytes
1834
-	 * @return string
1835
-	 */
1836
-	public static function LittleEndian2String($number, $minbytes = 1) {
1837
-		$intstring = '';
1838
-		while ($number > 0) {
1839
-			$intstring .= chr($number & 255);
1840
-			$number >>= 8;
1841
-		}
1842
-
1843
-		return str_pad($intstring, $minbytes, "\x00", STR_PAD_RIGHT);
1844
-	}
1845
-
1846
-	/**
1847
-	 * Transforme une ressource GD en image au format ICO
1848
-	 *
1849
-	 * @param array $gd_image_array
1850
-	 *     Tableau de ressources d'images GD
1851
-	 * @return string
1852
-	 *     Image au format ICO
1853
-	 */
1854
-	public static function GD2ICOstring(&$gd_image_array) {
1855
-		foreach ($gd_image_array as $key => $gd_image) {
1856
-			$ImageWidths[$key] = ImageSX($gd_image);
1857
-			$ImageHeights[$key] = ImageSY($gd_image);
1858
-			$bpp[$key] = ImageIsTrueColor($gd_image) ? 32 : 24;
1859
-			$totalcolors[$key] = ImageColorsTotal($gd_image);
1860
-
1861
-			$icXOR[$key] = '';
1862
-			for ($y = $ImageHeights[$key] - 1; $y >= 0; $y--) {
1863
-				for ($x = 0; $x < $ImageWidths[$key]; $x++) {
1864
-					$argb = phpthumb_functions::GetPixelColor($gd_image, $x, $y);
1865
-					$a = round(255 * ((127 - $argb['alpha']) / 127));
1866
-					$r = $argb['red'];
1867
-					$g = $argb['green'];
1868
-					$b = $argb['blue'];
1869
-
1870
-					if ($bpp[$key] == 32) {
1871
-						$icXOR[$key] .= chr($b) . chr($g) . chr($r) . chr($a);
1872
-					} elseif ($bpp[$key] === 24) {
1873
-						$icXOR[$key] .= chr($b) . chr($g) . chr($r);
1874
-					}
1875
-
1876
-					if ($a < 128) {
1877
-						@$icANDmask[$key][$y] .= '1';
1878
-					} else {
1879
-						@$icANDmask[$key][$y] .= '0';
1880
-					}
1881
-				}
1882
-				// mask bits are 32-bit aligned per scanline
1883
-				while (strlen($icANDmask[$key][$y]) % 32) {
1884
-					$icANDmask[$key][$y] .= '0';
1885
-				}
1886
-			}
1887
-			$icAND[$key] = '';
1888
-			foreach ($icANDmask[$key] as $y => $scanlinemaskbits) {
1889
-				for ($i = 0; $i < strlen($scanlinemaskbits); $i += 8) {
1890
-					$icAND[$key] .= chr(bindec(str_pad(substr($scanlinemaskbits, $i, 8), 8, '0', STR_PAD_LEFT)));
1891
-				}
1892
-			}
1893
-		}
1894
-
1895
-		foreach (array_keys($gd_image_array) as $key) {
1896
-			$biSizeImage = $ImageWidths[$key] * $ImageHeights[$key] * ($bpp[$key] / 8);
1897
-
1898
-			// BITMAPINFOHEADER - 40 bytes
1899
-			$BitmapInfoHeader[$key] = '';
1900
-			$BitmapInfoHeader[$key] .= "\x28\x00\x00\x00";                // DWORD  biSize;
1901
-			$BitmapInfoHeader[$key] .= phpthumb_functions::LittleEndian2String($ImageWidths[$key], 4);    // LONG   biWidth;
1902
-			// The biHeight member specifies the combined
1903
-			// height of the XOR and AND masks.
1904
-			$BitmapInfoHeader[$key] .= phpthumb_functions::LittleEndian2String($ImageHeights[$key] * 2, 4); // LONG   biHeight;
1905
-			$BitmapInfoHeader[$key] .= "\x01\x00";                    // WORD   biPlanes;
1906
-			$BitmapInfoHeader[$key] .= chr($bpp[$key]) . "\x00";              // wBitCount;
1907
-			$BitmapInfoHeader[$key] .= "\x00\x00\x00\x00";                // DWORD  biCompression;
1908
-			$BitmapInfoHeader[$key] .= phpthumb_functions::LittleEndian2String($biSizeImage, 4);      // DWORD  biSizeImage;
1909
-			$BitmapInfoHeader[$key] .= "\x00\x00\x00\x00";                // LONG   biXPelsPerMeter;
1910
-			$BitmapInfoHeader[$key] .= "\x00\x00\x00\x00";                // LONG   biYPelsPerMeter;
1911
-			$BitmapInfoHeader[$key] .= "\x00\x00\x00\x00";                // DWORD  biClrUsed;
1912
-			$BitmapInfoHeader[$key] .= "\x00\x00\x00\x00";                // DWORD  biClrImportant;
1913
-		}
1914
-
1915
-
1916
-		$icondata = "\x00\x00";                    // idReserved;   // Reserved (must be 0)
1917
-		$icondata .= "\x01\x00";                    // idType;	   // Resource Type (1 for icons)
1918
-		$icondata .= phpthumb_functions::LittleEndian2String(count($gd_image_array), 2);  // idCount;	  // How many images?
1919
-
1920
-		$dwImageOffset = 6 + (count($gd_image_array) * 16);
1921
-		foreach (array_keys($gd_image_array) as $key) {
1922
-			// ICONDIRENTRY   idEntries[1]; // An entry for each image (idCount of 'em)
1923
-
1924
-			$icondata .= chr($ImageWidths[$key]);           // bWidth;		  // Width, in pixels, of the image
1925
-			$icondata .= chr($ImageHeights[$key]);          // bHeight;		 // Height, in pixels, of the image
1926
-			$icondata .= chr($totalcolors[$key]);           // bColorCount;	 // Number of colors in image (0 if >=8bpp)
1927
-			$icondata .= "\x00";                    // bReserved;	   // Reserved ( must be 0)
1928
-
1929
-			$icondata .= "\x01\x00";                  // wPlanes;		 // Color Planes
1930
-			$icondata .= chr($bpp[$key]) . "\x00";            // wBitCount;	   // Bits per pixel
1931
-
1932
-			$dwBytesInRes = 40 + strlen($icXOR[$key]) + strlen($icAND[$key]);
1933
-			$icondata .= phpthumb_functions::LittleEndian2String(
1934
-				$dwBytesInRes,
1935
-				4
1936
-			);     // dwBytesInRes;	// How many bytes in this resource?
1937
-
1938
-			$icondata .= phpthumb_functions::LittleEndian2String(
1939
-				$dwImageOffset,
1940
-				4
1941
-			);    // dwImageOffset;   // Where in the file is this image?
1942
-			$dwImageOffset += strlen($BitmapInfoHeader[$key]);
1943
-			$dwImageOffset += strlen($icXOR[$key]);
1944
-			$dwImageOffset += strlen($icAND[$key]);
1945
-		}
1946
-
1947
-		foreach (array_keys($gd_image_array) as $key) {
1948
-			$icondata .= $BitmapInfoHeader[$key];
1949
-			$icondata .= $icXOR[$key];
1950
-			$icondata .= $icAND[$key];
1951
-		}
1952
-
1953
-		return $icondata;
1954
-	}
1814
+    /**
1815
+     * Retourne la couleur d'un pixel dans une image
1816
+     *
1817
+     * @param GdImage $img
1818
+     * @param int $x
1819
+     * @param int $y
1820
+     * @return array|bool
1821
+     */
1822
+    public static function GetPixelColor(&$img, $x, $y) {
1823
+        if ($img instanceof \GdImage) {
1824
+            return @ImageColorsForIndex($img, @ImageColorAt($img, $x, $y));
1825
+        }
1826
+        return false;
1827
+    }
1828
+
1829
+    /**
1830
+     * Retourne un nombre dans une représentation en Little Endian
1831
+     *
1832
+     * @param int $number
1833
+     * @param int $minbytes
1834
+     * @return string
1835
+     */
1836
+    public static function LittleEndian2String($number, $minbytes = 1) {
1837
+        $intstring = '';
1838
+        while ($number > 0) {
1839
+            $intstring .= chr($number & 255);
1840
+            $number >>= 8;
1841
+        }
1842
+
1843
+        return str_pad($intstring, $minbytes, "\x00", STR_PAD_RIGHT);
1844
+    }
1845
+
1846
+    /**
1847
+     * Transforme une ressource GD en image au format ICO
1848
+     *
1849
+     * @param array $gd_image_array
1850
+     *     Tableau de ressources d'images GD
1851
+     * @return string
1852
+     *     Image au format ICO
1853
+     */
1854
+    public static function GD2ICOstring(&$gd_image_array) {
1855
+        foreach ($gd_image_array as $key => $gd_image) {
1856
+            $ImageWidths[$key] = ImageSX($gd_image);
1857
+            $ImageHeights[$key] = ImageSY($gd_image);
1858
+            $bpp[$key] = ImageIsTrueColor($gd_image) ? 32 : 24;
1859
+            $totalcolors[$key] = ImageColorsTotal($gd_image);
1860
+
1861
+            $icXOR[$key] = '';
1862
+            for ($y = $ImageHeights[$key] - 1; $y >= 0; $y--) {
1863
+                for ($x = 0; $x < $ImageWidths[$key]; $x++) {
1864
+                    $argb = phpthumb_functions::GetPixelColor($gd_image, $x, $y);
1865
+                    $a = round(255 * ((127 - $argb['alpha']) / 127));
1866
+                    $r = $argb['red'];
1867
+                    $g = $argb['green'];
1868
+                    $b = $argb['blue'];
1869
+
1870
+                    if ($bpp[$key] == 32) {
1871
+                        $icXOR[$key] .= chr($b) . chr($g) . chr($r) . chr($a);
1872
+                    } elseif ($bpp[$key] === 24) {
1873
+                        $icXOR[$key] .= chr($b) . chr($g) . chr($r);
1874
+                    }
1875
+
1876
+                    if ($a < 128) {
1877
+                        @$icANDmask[$key][$y] .= '1';
1878
+                    } else {
1879
+                        @$icANDmask[$key][$y] .= '0';
1880
+                    }
1881
+                }
1882
+                // mask bits are 32-bit aligned per scanline
1883
+                while (strlen($icANDmask[$key][$y]) % 32) {
1884
+                    $icANDmask[$key][$y] .= '0';
1885
+                }
1886
+            }
1887
+            $icAND[$key] = '';
1888
+            foreach ($icANDmask[$key] as $y => $scanlinemaskbits) {
1889
+                for ($i = 0; $i < strlen($scanlinemaskbits); $i += 8) {
1890
+                    $icAND[$key] .= chr(bindec(str_pad(substr($scanlinemaskbits, $i, 8), 8, '0', STR_PAD_LEFT)));
1891
+                }
1892
+            }
1893
+        }
1894
+
1895
+        foreach (array_keys($gd_image_array) as $key) {
1896
+            $biSizeImage = $ImageWidths[$key] * $ImageHeights[$key] * ($bpp[$key] / 8);
1897
+
1898
+            // BITMAPINFOHEADER - 40 bytes
1899
+            $BitmapInfoHeader[$key] = '';
1900
+            $BitmapInfoHeader[$key] .= "\x28\x00\x00\x00";                // DWORD  biSize;
1901
+            $BitmapInfoHeader[$key] .= phpthumb_functions::LittleEndian2String($ImageWidths[$key], 4);    // LONG   biWidth;
1902
+            // The biHeight member specifies the combined
1903
+            // height of the XOR and AND masks.
1904
+            $BitmapInfoHeader[$key] .= phpthumb_functions::LittleEndian2String($ImageHeights[$key] * 2, 4); // LONG   biHeight;
1905
+            $BitmapInfoHeader[$key] .= "\x01\x00";                    // WORD   biPlanes;
1906
+            $BitmapInfoHeader[$key] .= chr($bpp[$key]) . "\x00";              // wBitCount;
1907
+            $BitmapInfoHeader[$key] .= "\x00\x00\x00\x00";                // DWORD  biCompression;
1908
+            $BitmapInfoHeader[$key] .= phpthumb_functions::LittleEndian2String($biSizeImage, 4);      // DWORD  biSizeImage;
1909
+            $BitmapInfoHeader[$key] .= "\x00\x00\x00\x00";                // LONG   biXPelsPerMeter;
1910
+            $BitmapInfoHeader[$key] .= "\x00\x00\x00\x00";                // LONG   biYPelsPerMeter;
1911
+            $BitmapInfoHeader[$key] .= "\x00\x00\x00\x00";                // DWORD  biClrUsed;
1912
+            $BitmapInfoHeader[$key] .= "\x00\x00\x00\x00";                // DWORD  biClrImportant;
1913
+        }
1914
+
1915
+
1916
+        $icondata = "\x00\x00";                    // idReserved;   // Reserved (must be 0)
1917
+        $icondata .= "\x01\x00";                    // idType;	   // Resource Type (1 for icons)
1918
+        $icondata .= phpthumb_functions::LittleEndian2String(count($gd_image_array), 2);  // idCount;	  // How many images?
1919
+
1920
+        $dwImageOffset = 6 + (count($gd_image_array) * 16);
1921
+        foreach (array_keys($gd_image_array) as $key) {
1922
+            // ICONDIRENTRY   idEntries[1]; // An entry for each image (idCount of 'em)
1923
+
1924
+            $icondata .= chr($ImageWidths[$key]);           // bWidth;		  // Width, in pixels, of the image
1925
+            $icondata .= chr($ImageHeights[$key]);          // bHeight;		 // Height, in pixels, of the image
1926
+            $icondata .= chr($totalcolors[$key]);           // bColorCount;	 // Number of colors in image (0 if >=8bpp)
1927
+            $icondata .= "\x00";                    // bReserved;	   // Reserved ( must be 0)
1928
+
1929
+            $icondata .= "\x01\x00";                  // wPlanes;		 // Color Planes
1930
+            $icondata .= chr($bpp[$key]) . "\x00";            // wBitCount;	   // Bits per pixel
1931
+
1932
+            $dwBytesInRes = 40 + strlen($icXOR[$key]) + strlen($icAND[$key]);
1933
+            $icondata .= phpthumb_functions::LittleEndian2String(
1934
+                $dwBytesInRes,
1935
+                4
1936
+            );     // dwBytesInRes;	// How many bytes in this resource?
1937
+
1938
+            $icondata .= phpthumb_functions::LittleEndian2String(
1939
+                $dwImageOffset,
1940
+                4
1941
+            );    // dwImageOffset;   // Where in the file is this image?
1942
+            $dwImageOffset += strlen($BitmapInfoHeader[$key]);
1943
+            $dwImageOffset += strlen($icXOR[$key]);
1944
+            $dwImageOffset += strlen($icAND[$key]);
1945
+        }
1946
+
1947
+        foreach (array_keys($gd_image_array) as $key) {
1948
+            $icondata .= $BitmapInfoHeader[$key];
1949
+            $icondata .= $icXOR[$key];
1950
+            $icondata .= $icAND[$key];
1951
+        }
1952
+
1953
+        return $icondata;
1954
+    }
1955 1955
 }
Please login to merge, or discard this patch.
Spacing   +67 added lines, -67 removed lines patch added patch discarded remove patch
@@ -42,13 +42,13 @@  discard block
 block discarded – undo
42 42
 	$blue = dechex($blue);
43 43
 
44 44
 	if (strlen($red) == 1) {
45
-		$red = '0' . $red;
45
+		$red = '0'.$red;
46 46
 	}
47 47
 	if (strlen($green) == 1) {
48
-		$green = '0' . $green;
48
+		$green = '0'.$green;
49 49
 	}
50 50
 	if (strlen($blue) == 1) {
51
-		$blue = '0' . $blue;
51
+		$blue = '0'.$blue;
52 52
 	}
53 53
 
54 54
 	return "$red$green$blue";
@@ -67,7 +67,7 @@  discard block
 block discarded – undo
67 67
 	$couleur = couleur_html_to_hex($couleur);
68 68
 	$couleur = ltrim($couleur, '#');
69 69
 	if (strlen($couleur) === 3) {
70
-		$couleur = $couleur[0] . $couleur[0] . $couleur[1] . $couleur[1] . $couleur[2] . $couleur[2];
70
+		$couleur = $couleur[0].$couleur[0].$couleur[1].$couleur[1].$couleur[2].$couleur[2];
71 71
 	}
72 72
 	$retour = [];
73 73
 	$retour['red'] = hexdec(substr($couleur, 0, 2));
@@ -125,9 +125,9 @@  discard block
 block discarded – undo
125 125
 	$var_G = ($G / 255);
126 126
 	$var_B = ($B / 255);
127 127
 
128
-	$var_Min = min($var_R, $var_G, $var_B);   //Min. value of RGB
129
-	$var_Max = max($var_R, $var_G, $var_B);   //Max. value of RGB
130
-	$del_Max = $var_Max - $var_Min;           //Delta RGB value
128
+	$var_Min = min($var_R, $var_G, $var_B); //Min. value of RGB
129
+	$var_Max = max($var_R, $var_G, $var_B); //Max. value of RGB
130
+	$del_Max = $var_Max - $var_Min; //Delta RGB value
131 131
 
132 132
 	$L = ($var_Max + $var_Min) / 2;
133 133
 
@@ -185,7 +185,7 @@  discard block
 block discarded – undo
185 185
  */
186 186
 function _couleur_hsl_to_rgb($H, $S, $L) {
187 187
 	// helper
188
-	$hue_2_rgb = function ($v1, $v2, $vH) {
188
+	$hue_2_rgb = function($v1, $v2, $vH) {
189 189
 		if ($vH < 0) {
190 190
 			$vH += 1;
191 191
 		}
@@ -319,11 +319,11 @@  discard block
 block discarded – undo
319 319
 		}
320 320
 	} elseif (
321 321
 		preg_match('@^data:image/([^;]*);base64,(.*)$@isS', $source, $regs)
322
-		&& ($extension = _image_trouver_extension_depuis_mime('image/' . $regs[1]))
322
+		&& ($extension = _image_trouver_extension_depuis_mime('image/'.$regs[1]))
323 323
 		&& in_array($extension, _image_extensions_acceptees_en_entree())
324 324
 	) {
325 325
 		# gerer img src="data:....base64"
326
-		$local = sous_repertoire(_DIR_VAR, 'image-data') . md5($regs[2]) . '.' . _image_extension_normalisee($extension);
326
+		$local = sous_repertoire(_DIR_VAR, 'image-data').md5($regs[2]).'.'._image_extension_normalisee($extension);
327 327
 		if (!file_exists($local)) {
328 328
 			ecrire_fichier($local, base64_decode($regs[2]));
329 329
 		}
@@ -340,7 +340,7 @@  discard block
 block discarded – undo
340 340
 	// les protocoles web prennent au moins 3 lettres
341 341
 	if (tester_url_absolue($source)) {
342 342
 		include_spip('inc/distant');
343
-		$fichier = _DIR_RACINE . copie_locale($source);
343
+		$fichier = _DIR_RACINE.copie_locale($source);
344 344
 		if (!$fichier) {
345 345
 			return '';
346 346
 		}
@@ -442,9 +442,9 @@  discard block
 block discarded – undo
442 442
 			// on garde la terminaison initiale car image simplement copiee
443 443
 			// et on postfixe son nom avec un md5 du path
444 444
 			$terminaison_dest = $terminaison;
445
-			$fichier_dest .= '-' . substr(md5("$identifiant"), 0, 5);
445
+			$fichier_dest .= '-'.substr(md5("$identifiant"), 0, 5);
446 446
 		} else {
447
-			$fichier_dest .= '-' . substr(md5("$identifiant-$effet"), 0, 5);
447
+			$fichier_dest .= '-'.substr(md5("$identifiant-$effet"), 0, 5);
448 448
 		}
449 449
 		$cache = sous_repertoire(_DIR_VAR, $cache);
450 450
 		$cache = sous_repertoire($cache, $effet);
@@ -455,7 +455,7 @@  discard block
 block discarded – undo
455 455
 		$fichier_dest = substr($fichier_dest, 2);
456 456
 	}
457 457
 
458
-	$fichier_dest = $cache . $fichier_dest . '.' . $terminaison_dest;
458
+	$fichier_dest = $cache.$fichier_dest.'.'.$terminaison_dest;
459 459
 
460 460
 	$GLOBALS['images_calculees'][] = $fichier_dest;
461 461
 
@@ -481,7 +481,7 @@  discard block
 block discarded – undo
481 481
 	}
482 482
 	if ($creer && !@file_exists($fichier)) {
483 483
 		if (!@file_exists("$fichier.src")) {
484
-			spip_log("Image absente : $fichier", 'images' . _LOG_ERREUR);
484
+			spip_log("Image absente : $fichier", 'images'._LOG_ERREUR);
485 485
 
486 486
 			return false;
487 487
 		}
@@ -491,15 +491,15 @@  discard block
 block discarded – undo
491 491
 
492 492
 	if ($creer) {
493 493
 		spip_log(
494
-			'filtre image ' . ($fonction_creation ? reset($fonction_creation) : '') . "[$effet] sur $fichier",
495
-			'images' . _LOG_DEBUG
494
+			'filtre image '.($fonction_creation ? reset($fonction_creation) : '')."[$effet] sur $fichier",
495
+			'images'._LOG_DEBUG
496 496
 		);
497 497
 	}
498 498
 
499 499
 	$term_fonction = _image_trouver_extension_pertinente($fichier);
500
-	$ret['fonction_imagecreatefrom'] = '_imagecreatefrom' . $term_fonction;
500
+	$ret['fonction_imagecreatefrom'] = '_imagecreatefrom'.$term_fonction;
501 501
 	$ret['fichier'] = $fichier;
502
-	$ret['fonction_image'] = '_image_image' . $terminaison_dest;
502
+	$ret['fonction_image'] = '_image_image'.$terminaison_dest;
503 503
 	$ret['fichier_dest'] = $fichier_dest;
504 504
 	$ret['format_source'] = _image_extension_normalisee($terminaison);
505 505
 	$ret['format_dest'] = $terminaison_dest;
@@ -642,7 +642,7 @@  discard block
 block discarded – undo
642 642
 
643 643
 	$_terminaison = _image_trouver_extension_depuis_mime($mime);
644 644
 	if ($_terminaison && $_terminaison !== $terminaison) {
645
-		spip_log("Mauvaise extension du fichier : $path . Son type mime est : $mime", 'images.' . _LOG_INFO_IMPORTANTE);
645
+		spip_log("Mauvaise extension du fichier : $path . Son type mime est : $mime", 'images.'._LOG_INFO_IMPORTANTE);
646 646
 		$terminaison = $_terminaison;
647 647
 	}
648 648
 	return $terminaison;
@@ -777,7 +777,7 @@  discard block
 block discarded – undo
777 777
 	if (!function_exists('imagepng')) {
778 778
 		return false;
779 779
 	}
780
-	$tmp = $fichier . '.tmp';
780
+	$tmp = $fichier.'.tmp';
781 781
 	$ret = imagepng($img, $tmp);
782 782
 	if (file_exists($tmp)) {
783 783
 		$taille_test = @getimagesize($tmp);
@@ -812,7 +812,7 @@  discard block
 block discarded – undo
812 812
 	if (!function_exists('imagegif')) {
813 813
 		return false;
814 814
 	}
815
-	$tmp = $fichier . '.tmp';
815
+	$tmp = $fichier.'.tmp';
816 816
 	$ret = imagegif($img, $tmp);
817 817
 	if (file_exists($tmp)) {
818 818
 		$taille_test = @getimagesize($tmp);
@@ -852,7 +852,7 @@  discard block
 block discarded – undo
852 852
 	if (!function_exists('imagejpeg')) {
853 853
 		return false;
854 854
 	}
855
-	$tmp = $fichier . '.tmp';
855
+	$tmp = $fichier.'.tmp';
856 856
 
857 857
 	// Enable interlancing
858 858
 	imageinterlace($img, true);
@@ -913,7 +913,7 @@  discard block
 block discarded – undo
913 913
 	if (!function_exists('imagewebp')) {
914 914
 		return false;
915 915
 	}
916
-	$tmp = $fichier . '.tmp';
916
+	$tmp = $fichier.'.tmp';
917 917
 	$ret = imagewebp($img, $tmp, $qualite);
918 918
 	if (file_exists($tmp)) {
919 919
 		$taille_test = @getimagesize($tmp);
@@ -947,7 +947,7 @@  discard block
 block discarded – undo
947 947
  */
948 948
 function _image_imagesvg($img, $fichier) {
949 949
 
950
-	$tmp = $fichier . '.tmp';
950
+	$tmp = $fichier.'.tmp';
951 951
 	if (!str_contains($img, '<')) {
952 952
 		$img = supprimer_timestamp($img);
953 953
 		if (!file_exists($img)) {
@@ -1004,14 +1004,14 @@  discard block
 block discarded – undo
1004 1004
  */
1005 1005
 function _image_gd_output($img, $valeurs, $qualite = _IMG_GD_QUALITE, $fonction = null) {
1006 1006
 	if (is_null($fonction)) {
1007
-		$fonction = '_image_image' . $valeurs['format_dest'];
1007
+		$fonction = '_image_image'.$valeurs['format_dest'];
1008 1008
 	}
1009 1009
 	$ret = false;
1010 1010
 	#un flag pour reperer les images gravees
1011 1011
 	$lock = (
1012 1012
 		!statut_effacer_images_temporaires('get')
1013 1013
 		|| @file_exists($valeurs['fichier_dest'])
1014
-		&& !@file_exists($valeurs['fichier_dest'] . '.src')
1014
+		&& !@file_exists($valeurs['fichier_dest'].'.src')
1015 1015
 	);
1016 1016
 	if (
1017 1017
 		function_exists($fonction)
@@ -1023,7 +1023,7 @@  discard block
 block discarded – undo
1023 1023
 		[$valeurs['hauteur_dest'], $valeurs['largeur_dest']] = taille_image($valeurs['fichier_dest']);
1024 1024
 		$valeurs['date'] = @filemtime($valeurs['fichier_dest']);
1025 1025
 		// pour la retrouver apres disparition
1026
-		ecrire_fichier($valeurs['fichier_dest'] . '.src', serialize($valeurs), true);
1026
+		ecrire_fichier($valeurs['fichier_dest'].'.src', serialize($valeurs), true);
1027 1027
 	}
1028 1028
 
1029 1029
 	return $ret;
@@ -1198,7 +1198,7 @@  discard block
 block discarded – undo
1198 1198
 
1199 1199
 	// attributs deprecies. Transformer en CSS
1200 1200
 	if ($espace = extraire_attribut($tag, 'hspace')) {
1201
-		$style = "margin:{$espace}px;" . $style;
1201
+		$style = "margin:{$espace}px;".$style;
1202 1202
 		$tag = inserer_attribut($tag, 'hspace', '');
1203 1203
 	}
1204 1204
 
@@ -1321,7 +1321,7 @@  discard block
 block discarded – undo
1321 1321
 	$image = $valeurs['fichier'];
1322 1322
 	$format = $valeurs['format_source'];
1323 1323
 	$destdir = dirname($valeurs['fichier_dest']);
1324
-	$destfile = basename($valeurs['fichier_dest'], '.' . $valeurs['format_dest']);
1324
+	$destfile = basename($valeurs['fichier_dest'], '.'.$valeurs['format_dest']);
1325 1325
 
1326 1326
 	$format_sortie = $valeurs['format_dest'];
1327 1327
 
@@ -1353,7 +1353,7 @@  discard block
 block discarded – undo
1353 1353
 
1354 1354
 	// Si l'image est de la taille demandee (ou plus petite), simplement la retourner
1355 1355
 	if ($srcWidth && $srcWidth <= $maxWidth && $srcHeight <= $maxHeight) {
1356
-		$vignette = $destination . '.' . $format;
1356
+		$vignette = $destination.'.'.$format;
1357 1357
 		@copy($image, $vignette);
1358 1358
 	}
1359 1359
 
@@ -1361,7 +1361,7 @@  discard block
 block discarded – undo
1361 1361
 		include_spip('inc/svg');
1362 1362
 		if ($svg = svg_redimensionner($valeurs['fichier'], $destWidth, $destHeight)) {
1363 1363
 			$format_sortie = 'svg';
1364
-			$vignette = $destination . '.' . $format_sortie;
1364
+			$vignette = $destination.'.'.$format_sortie;
1365 1365
 			$valeurs['fichier_dest'] = $vignette;
1366 1366
 			_image_gd_output($svg, $valeurs);
1367 1367
 		}
@@ -1373,9 +1373,9 @@  discard block
 block discarded – undo
1373 1373
 			define('_CONVERT_COMMAND', 'convert');
1374 1374
 		} // Securite : mes_options.php peut preciser le chemin absolu
1375 1375
 		if (!defined('_RESIZE_COMMAND')) {
1376
-			define('_RESIZE_COMMAND', _CONVERT_COMMAND . ' -quality ' . _IMG_CONVERT_QUALITE . ' -orient Undefined -resize %xx%y! %src %dest');
1376
+			define('_RESIZE_COMMAND', _CONVERT_COMMAND.' -quality '._IMG_CONVERT_QUALITE.' -orient Undefined -resize %xx%y! %src %dest');
1377 1377
 		}
1378
-		$vignette = $destination . '.' . $format_sortie;
1378
+		$vignette = $destination.'.'.$format_sortie;
1379 1379
 		$commande = str_replace(
1380 1380
 			['%x', '%y', '%src', '%dest'],
1381 1381
 			[
@@ -1391,7 +1391,7 @@  discard block
 block discarded – undo
1391 1391
 		if (!@file_exists($vignette)) {
1392 1392
 			spip_log("echec convert sur $vignette");
1393 1393
 
1394
-			return;  // echec commande
1394
+			return; // echec commande
1395 1395
 		}
1396 1396
 	}
1397 1397
 
@@ -1408,7 +1408,7 @@  discard block
 block discarded – undo
1408 1408
 		if (!$output) {
1409 1409
 			return;
1410 1410
 		}
1411
-		$vignette = $output . DIRECTORY_SEPARATOR . basename($destination) . '.' . $format_sortie;
1411
+		$vignette = $output.DIRECTORY_SEPARATOR.basename($destination).'.'.$format_sortie;
1412 1412
 
1413 1413
 		$imagick = new Imagick();
1414 1414
 		$imagick->readImage(realpath($image));
@@ -1417,7 +1417,7 @@  discard block
 block discarded – undo
1417 1417
 			$destHeight,
1418 1418
 			Imagick::FILTER_LANCZOS,
1419 1419
 			1
1420
-		);//, IMAGICK_FILTER_LANCZOS, _IMG_IMAGICK_QUALITE / 100);
1420
+		); //, IMAGICK_FILTER_LANCZOS, _IMG_IMAGICK_QUALITE / 100);
1421 1421
 		$imagick->writeImage($vignette);
1422 1422
 
1423 1423
 		if (!@file_exists($vignette)) {
@@ -1426,7 +1426,7 @@  discard block
 block discarded – undo
1426 1426
 			return;
1427 1427
 		}
1428 1428
 		// remettre le chemin relatif car c'est ce qu'attend SPIP pour la suite (en particlier action/tester)
1429
-		$vignette = $destination . '.' . $format_sortie;
1429
+		$vignette = $destination.'.'.$format_sortie;
1430 1430
 	}
1431 1431
 
1432 1432
 	// netpbm
@@ -1437,11 +1437,11 @@  discard block
 block discarded – undo
1437 1437
 		if (_PNMSCALE_COMMAND == '') {
1438 1438
 			return;
1439 1439
 		}
1440
-		$vignette = $destination . '.' . $format_sortie;
1440
+		$vignette = $destination.'.'.$format_sortie;
1441 1441
 		$pnmtojpeg_command = str_replace('pnmscale', 'pnmtojpeg', _PNMSCALE_COMMAND);
1442 1442
 		if ($format == 'jpg') {
1443 1443
 			$jpegtopnm_command = str_replace('pnmscale', 'jpegtopnm', _PNMSCALE_COMMAND);
1444
-			exec("$jpegtopnm_command $image | " . _PNMSCALE_COMMAND . " -width $destWidth | $pnmtojpeg_command > $vignette");
1444
+			exec("$jpegtopnm_command $image | "._PNMSCALE_COMMAND." -width $destWidth | $pnmtojpeg_command > $vignette");
1445 1445
 			if (!($s = @filesize($vignette))) {
1446 1446
 				spip_unlink($vignette);
1447 1447
 			}
@@ -1453,7 +1453,7 @@  discard block
 block discarded – undo
1453 1453
 		} else {
1454 1454
 			if ($format == 'gif') {
1455 1455
 				$giftopnm_command = str_replace('pnmscale', 'giftopnm', _PNMSCALE_COMMAND);
1456
-				exec("$giftopnm_command $image | " . _PNMSCALE_COMMAND . " -width $destWidth | $pnmtojpeg_command > $vignette");
1456
+				exec("$giftopnm_command $image | "._PNMSCALE_COMMAND." -width $destWidth | $pnmtojpeg_command > $vignette");
1457 1457
 				if (!($s = @filesize($vignette))) {
1458 1458
 					spip_unlink($vignette);
1459 1459
 				}
@@ -1465,7 +1465,7 @@  discard block
 block discarded – undo
1465 1465
 			} else {
1466 1466
 				if ($format == 'png') {
1467 1467
 					$pngtopnm_command = str_replace('pnmscale', 'pngtopnm', _PNMSCALE_COMMAND);
1468
-					exec("$pngtopnm_command $image | " . _PNMSCALE_COMMAND . " -width $destWidth | $pnmtojpeg_command > $vignette");
1468
+					exec("$pngtopnm_command $image | "._PNMSCALE_COMMAND." -width $destWidth | $pnmtojpeg_command > $vignette");
1469 1469
 					if (!($s = @filesize($vignette))) {
1470 1470
 						spip_unlink($vignette);
1471 1471
 					}
@@ -1487,7 +1487,7 @@  discard block
 block discarded – undo
1487 1487
 			return;
1488 1488
 		}
1489 1489
 		if (_IMG_GD_MAX_PIXELS && $srcWidth * $srcHeight > _IMG_GD_MAX_PIXELS) {
1490
-			spip_log('vignette gd2 impossible : ' . $srcWidth * $srcHeight . 'pixels');
1490
+			spip_log('vignette gd2 impossible : '.$srcWidth * $srcHeight.'pixels');
1491 1491
 
1492 1492
 			return;
1493 1493
 		}
@@ -1790,7 +1790,7 @@  discard block
 block discarded – undo
1790 1790
 		// de l'image, de facon a tromper le cache du navigateur
1791 1791
 		// quand on fait supprimer/reuploader un logo
1792 1792
 		// (pas de filemtime si SAFE MODE)
1793
-		$date = test_espace_prive() ? ('?' . $date) : '';
1793
+		$date = test_espace_prive() ? ('?'.$date) : '';
1794 1794
 
1795 1795
 		return _image_ecrire_tag($image, ['src' => "$logo$date", 'width' => $destWidth, 'height' => $destHeight]);
1796 1796
 	}
@@ -1868,9 +1868,9 @@  discard block
 block discarded – undo
1868 1868
 					$b = $argb['blue'];
1869 1869
 
1870 1870
 					if ($bpp[$key] == 32) {
1871
-						$icXOR[$key] .= chr($b) . chr($g) . chr($r) . chr($a);
1871
+						$icXOR[$key] .= chr($b).chr($g).chr($r).chr($a);
1872 1872
 					} elseif ($bpp[$key] === 24) {
1873
-						$icXOR[$key] .= chr($b) . chr($g) . chr($r);
1873
+						$icXOR[$key] .= chr($b).chr($g).chr($r);
1874 1874
 					}
1875 1875
 
1876 1876
 					if ($a < 128) {
@@ -1897,48 +1897,48 @@  discard block
 block discarded – undo
1897 1897
 
1898 1898
 			// BITMAPINFOHEADER - 40 bytes
1899 1899
 			$BitmapInfoHeader[$key] = '';
1900
-			$BitmapInfoHeader[$key] .= "\x28\x00\x00\x00";                // DWORD  biSize;
1901
-			$BitmapInfoHeader[$key] .= phpthumb_functions::LittleEndian2String($ImageWidths[$key], 4);    // LONG   biWidth;
1900
+			$BitmapInfoHeader[$key] .= "\x28\x00\x00\x00"; // DWORD  biSize;
1901
+			$BitmapInfoHeader[$key] .= phpthumb_functions::LittleEndian2String($ImageWidths[$key], 4); // LONG   biWidth;
1902 1902
 			// The biHeight member specifies the combined
1903 1903
 			// height of the XOR and AND masks.
1904 1904
 			$BitmapInfoHeader[$key] .= phpthumb_functions::LittleEndian2String($ImageHeights[$key] * 2, 4); // LONG   biHeight;
1905
-			$BitmapInfoHeader[$key] .= "\x01\x00";                    // WORD   biPlanes;
1906
-			$BitmapInfoHeader[$key] .= chr($bpp[$key]) . "\x00";              // wBitCount;
1907
-			$BitmapInfoHeader[$key] .= "\x00\x00\x00\x00";                // DWORD  biCompression;
1908
-			$BitmapInfoHeader[$key] .= phpthumb_functions::LittleEndian2String($biSizeImage, 4);      // DWORD  biSizeImage;
1909
-			$BitmapInfoHeader[$key] .= "\x00\x00\x00\x00";                // LONG   biXPelsPerMeter;
1910
-			$BitmapInfoHeader[$key] .= "\x00\x00\x00\x00";                // LONG   biYPelsPerMeter;
1911
-			$BitmapInfoHeader[$key] .= "\x00\x00\x00\x00";                // DWORD  biClrUsed;
1912
-			$BitmapInfoHeader[$key] .= "\x00\x00\x00\x00";                // DWORD  biClrImportant;
1905
+			$BitmapInfoHeader[$key] .= "\x01\x00"; // WORD   biPlanes;
1906
+			$BitmapInfoHeader[$key] .= chr($bpp[$key])."\x00"; // wBitCount;
1907
+			$BitmapInfoHeader[$key] .= "\x00\x00\x00\x00"; // DWORD  biCompression;
1908
+			$BitmapInfoHeader[$key] .= phpthumb_functions::LittleEndian2String($biSizeImage, 4); // DWORD  biSizeImage;
1909
+			$BitmapInfoHeader[$key] .= "\x00\x00\x00\x00"; // LONG   biXPelsPerMeter;
1910
+			$BitmapInfoHeader[$key] .= "\x00\x00\x00\x00"; // LONG   biYPelsPerMeter;
1911
+			$BitmapInfoHeader[$key] .= "\x00\x00\x00\x00"; // DWORD  biClrUsed;
1912
+			$BitmapInfoHeader[$key] .= "\x00\x00\x00\x00"; // DWORD  biClrImportant;
1913 1913
 		}
1914 1914
 
1915 1915
 
1916
-		$icondata = "\x00\x00";                    // idReserved;   // Reserved (must be 0)
1917
-		$icondata .= "\x01\x00";                    // idType;	   // Resource Type (1 for icons)
1918
-		$icondata .= phpthumb_functions::LittleEndian2String(count($gd_image_array), 2);  // idCount;	  // How many images?
1916
+		$icondata = "\x00\x00"; // idReserved;   // Reserved (must be 0)
1917
+		$icondata .= "\x01\x00"; // idType;	   // Resource Type (1 for icons)
1918
+		$icondata .= phpthumb_functions::LittleEndian2String(count($gd_image_array), 2); // idCount;	  // How many images?
1919 1919
 
1920 1920
 		$dwImageOffset = 6 + (count($gd_image_array) * 16);
1921 1921
 		foreach (array_keys($gd_image_array) as $key) {
1922 1922
 			// ICONDIRENTRY   idEntries[1]; // An entry for each image (idCount of 'em)
1923 1923
 
1924
-			$icondata .= chr($ImageWidths[$key]);           // bWidth;		  // Width, in pixels, of the image
1925
-			$icondata .= chr($ImageHeights[$key]);          // bHeight;		 // Height, in pixels, of the image
1926
-			$icondata .= chr($totalcolors[$key]);           // bColorCount;	 // Number of colors in image (0 if >=8bpp)
1927
-			$icondata .= "\x00";                    // bReserved;	   // Reserved ( must be 0)
1924
+			$icondata .= chr($ImageWidths[$key]); // bWidth;		  // Width, in pixels, of the image
1925
+			$icondata .= chr($ImageHeights[$key]); // bHeight;		 // Height, in pixels, of the image
1926
+			$icondata .= chr($totalcolors[$key]); // bColorCount;	 // Number of colors in image (0 if >=8bpp)
1927
+			$icondata .= "\x00"; // bReserved;	   // Reserved ( must be 0)
1928 1928
 
1929
-			$icondata .= "\x01\x00";                  // wPlanes;		 // Color Planes
1930
-			$icondata .= chr($bpp[$key]) . "\x00";            // wBitCount;	   // Bits per pixel
1929
+			$icondata .= "\x01\x00"; // wPlanes;		 // Color Planes
1930
+			$icondata .= chr($bpp[$key])."\x00"; // wBitCount;	   // Bits per pixel
1931 1931
 
1932 1932
 			$dwBytesInRes = 40 + strlen($icXOR[$key]) + strlen($icAND[$key]);
1933 1933
 			$icondata .= phpthumb_functions::LittleEndian2String(
1934 1934
 				$dwBytesInRes,
1935 1935
 				4
1936
-			);     // dwBytesInRes;	// How many bytes in this resource?
1936
+			); // dwBytesInRes;	// How many bytes in this resource?
1937 1937
 
1938 1938
 			$icondata .= phpthumb_functions::LittleEndian2String(
1939 1939
 				$dwImageOffset,
1940 1940
 				4
1941
-			);    // dwImageOffset;   // Where in the file is this image?
1941
+			); // dwImageOffset;   // Where in the file is this image?
1942 1942
 			$dwImageOffset += strlen($BitmapInfoHeader[$key]);
1943 1943
 			$dwImageOffset += strlen($icXOR[$key]);
1944 1944
 			$dwImageOffset += strlen($icAND[$key]);
Please login to merge, or discard this patch.
ecrire/inc/utils.php 2 patches
Indentation   +2268 added lines, -2269 removed lines patch added patch discarded remove patch
@@ -16,7 +16,7 @@  discard block
 block discarded – undo
16 16
  **/
17 17
 
18 18
 if (!defined('_ECRIRE_INC_VERSION')) {
19
-	return;
19
+    return;
20 20
 }
21 21
 
22 22
 
@@ -47,71 +47,71 @@  discard block
 block discarded – undo
47 47
  *     Nom de la fonction, ou false.
48 48
  */
49 49
 function charger_fonction($nom, $dossier = 'exec', $continue = false) {
50
-	static $echecs = [];
51
-
52
-	if (strlen($dossier) and substr($dossier, -1) != '/') {
53
-		$dossier .= '/';
54
-	}
55
-	$f = str_replace('/', '_', $dossier) . $nom;
56
-
57
-	if (function_exists($f)) {
58
-		return $f;
59
-	}
60
-	if (function_exists($g = $f . '_dist')) {
61
-		return $g;
62
-	}
63
-
64
-	if (isset($echecs[$f])) {
65
-		return $echecs[$f];
66
-	}
67
-	// Sinon charger le fichier de declaration si plausible
68
-
69
-	if (!preg_match(',^\w+$,', $f)) {
70
-		if ($continue) {
71
-			return false;
72
-		} //appel interne, on passe
73
-		include_spip('inc/minipres');
74
-		echo minipres();
75
-		exit;
76
-	}
77
-
78
-	// passer en minuscules (cf les balises de formulaires)
79
-	// et inclure le fichier
80
-	if (
81
-		!$inc = include_spip($dossier . ($d = strtolower($nom)))
82
-		// si le fichier truc/machin/nom.php n'existe pas,
83
-		// la fonction peut etre definie dans truc/machin.php qui regroupe plusieurs petites fonctions
84
-		and strlen(dirname($dossier)) and dirname($dossier) != '.'
85
-	) {
86
-		include_spip(substr($dossier, 0, -1));
87
-	}
88
-	if (function_exists($f)) {
89
-		return $f;
90
-	}
91
-	if (function_exists($g)) {
92
-		return $g;
93
-	}
94
-
95
-	if ($continue) {
96
-		return $echecs[$f] = false;
97
-	}
98
-
99
-	// Echec : message d'erreur
100
-	spip_log("fonction $nom ($f ou $g) indisponible" .
101
-		($inc ? '' : " (fichier $d absent de $dossier)"));
102
-
103
-	include_spip('inc/minipres');
104
-	echo minipres(
105
-		_T('forum_titre_erreur'),
106
-		$inc ?
107
-			_T('fonction_introuvable', ['fonction' => '<code>' . spip_htmlentities($f) . '</code>'])
108
-			. '<br />'
109
-			. _T('fonction_introuvable', ['fonction' => '<code>' . spip_htmlentities($g) . '</code>'])
110
-			:
111
-			_T('fichier_introuvable', ['fichier' => '<code>' . spip_htmlentities($d) . '</code>']),
112
-		['all_inline' => true,'status' => 404]
113
-	);
114
-	exit;
50
+    static $echecs = [];
51
+
52
+    if (strlen($dossier) and substr($dossier, -1) != '/') {
53
+        $dossier .= '/';
54
+    }
55
+    $f = str_replace('/', '_', $dossier) . $nom;
56
+
57
+    if (function_exists($f)) {
58
+        return $f;
59
+    }
60
+    if (function_exists($g = $f . '_dist')) {
61
+        return $g;
62
+    }
63
+
64
+    if (isset($echecs[$f])) {
65
+        return $echecs[$f];
66
+    }
67
+    // Sinon charger le fichier de declaration si plausible
68
+
69
+    if (!preg_match(',^\w+$,', $f)) {
70
+        if ($continue) {
71
+            return false;
72
+        } //appel interne, on passe
73
+        include_spip('inc/minipres');
74
+        echo minipres();
75
+        exit;
76
+    }
77
+
78
+    // passer en minuscules (cf les balises de formulaires)
79
+    // et inclure le fichier
80
+    if (
81
+        !$inc = include_spip($dossier . ($d = strtolower($nom)))
82
+        // si le fichier truc/machin/nom.php n'existe pas,
83
+        // la fonction peut etre definie dans truc/machin.php qui regroupe plusieurs petites fonctions
84
+        and strlen(dirname($dossier)) and dirname($dossier) != '.'
85
+    ) {
86
+        include_spip(substr($dossier, 0, -1));
87
+    }
88
+    if (function_exists($f)) {
89
+        return $f;
90
+    }
91
+    if (function_exists($g)) {
92
+        return $g;
93
+    }
94
+
95
+    if ($continue) {
96
+        return $echecs[$f] = false;
97
+    }
98
+
99
+    // Echec : message d'erreur
100
+    spip_log("fonction $nom ($f ou $g) indisponible" .
101
+        ($inc ? '' : " (fichier $d absent de $dossier)"));
102
+
103
+    include_spip('inc/minipres');
104
+    echo minipres(
105
+        _T('forum_titre_erreur'),
106
+        $inc ?
107
+            _T('fonction_introuvable', ['fonction' => '<code>' . spip_htmlentities($f) . '</code>'])
108
+            . '<br />'
109
+            . _T('fonction_introuvable', ['fonction' => '<code>' . spip_htmlentities($g) . '</code>'])
110
+            :
111
+            _T('fichier_introuvable', ['fichier' => '<code>' . spip_htmlentities($d) . '</code>']),
112
+        ['all_inline' => true,'status' => 404]
113
+    );
114
+    exit;
115 115
 }
116 116
 
117 117
 /**
@@ -121,17 +121,17 @@  discard block
 block discarded – undo
121 121
  * @return bool
122 122
  */
123 123
 function include_once_check($file) {
124
-	if (file_exists($file)) {
125
-		include_once $file;
124
+    if (file_exists($file)) {
125
+        include_once $file;
126 126
 
127
-		return true;
128
-	}
129
-	$crash = (isset($GLOBALS['meta']['message_crash_plugins']) ? unserialize($GLOBALS['meta']['message_crash_plugins']) : '');
130
-	$crash = ($crash ?: []);
131
-	$crash[$file] = true;
132
-	ecrire_meta('message_crash_plugins', serialize($crash));
127
+        return true;
128
+    }
129
+    $crash = (isset($GLOBALS['meta']['message_crash_plugins']) ? unserialize($GLOBALS['meta']['message_crash_plugins']) : '');
130
+    $crash = ($crash ?: []);
131
+    $crash[$file] = true;
132
+    ecrire_meta('message_crash_plugins', serialize($crash));
133 133
 
134
-	return false;
134
+    return false;
135 135
 }
136 136
 
137 137
 
@@ -155,7 +155,7 @@  discard block
 block discarded – undo
155 155
  *     - string : chemin du fichier trouvé
156 156
  **/
157 157
 function include_spip($f, $include = true) {
158
-	return find_in_path($f . '.php', '', $include);
158
+    return find_in_path($f . '.php', '', $include);
159 159
 }
160 160
 
161 161
 /**
@@ -175,7 +175,7 @@  discard block
 block discarded – undo
175 175
  *     - string : chemin du fichier trouvé
176 176
  **/
177 177
 function require_spip($f) {
178
-	return find_in_path($f . '.php', '', 'required');
178
+    return find_in_path($f . '.php', '', 'required');
179 179
 }
180 180
 
181 181
 
@@ -184,27 +184,27 @@  discard block
 block discarded – undo
184 184
  * quand on a besoin dans le PHP de filtres/fonctions qui y sont definis
185 185
  */
186 186
 function include_fichiers_fonctions() {
187
-	static $done = false;
188
-	if (!$done) {
189
-		include_spip('inc/lang');
190
-
191
-		// NB: mes_fonctions peut initialiser $dossier_squelettes (old-style)
192
-		// donc il faut l'inclure "en globals"
193
-		if ($f = find_in_path('mes_fonctions.php')) {
194
-			global $dossier_squelettes;
195
-			include_once(_ROOT_CWD . $f);
196
-		}
197
-
198
-		if (@is_readable(_CACHE_PLUGINS_FCT)) {
199
-			// chargement optimise precompile
200
-			include_once(_CACHE_PLUGINS_FCT);
201
-		}
202
-		if (test_espace_prive()) {
203
-			include_spip('inc/filtres_ecrire');
204
-		}
205
-		include_spip('public/fonctions'); // charger les fichiers fonctions associes aux criteres, balises..
206
-		$done = true;
207
-	}
187
+    static $done = false;
188
+    if (!$done) {
189
+        include_spip('inc/lang');
190
+
191
+        // NB: mes_fonctions peut initialiser $dossier_squelettes (old-style)
192
+        // donc il faut l'inclure "en globals"
193
+        if ($f = find_in_path('mes_fonctions.php')) {
194
+            global $dossier_squelettes;
195
+            include_once(_ROOT_CWD . $f);
196
+        }
197
+
198
+        if (@is_readable(_CACHE_PLUGINS_FCT)) {
199
+            // chargement optimise precompile
200
+            include_once(_CACHE_PLUGINS_FCT);
201
+        }
202
+        if (test_espace_prive()) {
203
+            include_spip('inc/filtres_ecrire');
204
+        }
205
+        include_spip('public/fonctions'); // charger les fichiers fonctions associes aux criteres, balises..
206
+        $done = true;
207
+    }
208 208
 }
209 209
 
210 210
 /**
@@ -230,23 +230,23 @@  discard block
 block discarded – undo
230 230
  *     Les paramètres du pipeline modifiés
231 231
  **/
232 232
 function minipipe($fonc, &$val) {
233
-	// fonction
234
-	if (function_exists($fonc)) {
235
-		$val = $fonc($val);
236
-	} // Class::Methode
237
-	else {
238
-		if (
239
-			preg_match('/^(\w*)::(\w*)$/S', $fonc, $regs)
240
-			and $methode = [$regs[1], $regs[2]]
241
-			and is_callable($methode)
242
-		) {
243
-			$val = $methode($val);
244
-		} else {
245
-			spip_log("Erreur - '$fonc' non definie !");
246
-		}
247
-	}
248
-
249
-	return $val;
233
+    // fonction
234
+    if (function_exists($fonc)) {
235
+        $val = $fonc($val);
236
+    } // Class::Methode
237
+    else {
238
+        if (
239
+            preg_match('/^(\w*)::(\w*)$/S', $fonc, $regs)
240
+            and $methode = [$regs[1], $regs[2]]
241
+            and is_callable($methode)
242
+        ) {
243
+            $val = $methode($val);
244
+        } else {
245
+            spip_log("Erreur - '$fonc' non definie !");
246
+        }
247
+    }
248
+
249
+    return $val;
250 250
 }
251 251
 
252 252
 /**
@@ -277,46 +277,46 @@  discard block
 block discarded – undo
277 277
  *     Résultat
278 278
  */
279 279
 function pipeline($action, $val = null) {
280
-	static $charger;
281
-
282
-	// chargement initial des fonctions mises en cache, ou generation du cache
283
-	if (!$charger) {
284
-		if (!($ok = @is_readable($charger = _CACHE_PIPELINES))) {
285
-			include_spip('inc/plugin');
286
-			// generer les fichiers php precompiles
287
-			// de chargement des plugins et des pipelines
288
-			actualise_plugins_actifs();
289
-			if (!($ok = @is_readable($charger))) {
290
-				spip_log("fichier $charger pas cree");
291
-			}
292
-		}
293
-
294
-		if ($ok) {
295
-			include_once $charger;
296
-		}
297
-	}
298
-
299
-	// appliquer notre fonction si elle existe
300
-	$fonc = 'execute_pipeline_' . strtolower($action);
301
-	if (function_exists($fonc)) {
302
-		$val = $fonc($val);
303
-	} // plantage ?
304
-	else {
305
-		spip_log("fonction $fonc absente : pipeline desactive", _LOG_ERREUR);
306
-	}
307
-
308
-	// si le flux est une table avec 2 cle args&data
309
-	// on ne ressort du pipe que les donnees dans 'data'
310
-	// array_key_exists pour php 4.1.0
311
-	if (
312
-		is_array($val)
313
-		and count($val) == 2
314
-		and (array_key_exists('data', $val))
315
-	) {
316
-		$val = $val['data'];
317
-	}
318
-
319
-	return $val;
280
+    static $charger;
281
+
282
+    // chargement initial des fonctions mises en cache, ou generation du cache
283
+    if (!$charger) {
284
+        if (!($ok = @is_readable($charger = _CACHE_PIPELINES))) {
285
+            include_spip('inc/plugin');
286
+            // generer les fichiers php precompiles
287
+            // de chargement des plugins et des pipelines
288
+            actualise_plugins_actifs();
289
+            if (!($ok = @is_readable($charger))) {
290
+                spip_log("fichier $charger pas cree");
291
+            }
292
+        }
293
+
294
+        if ($ok) {
295
+            include_once $charger;
296
+        }
297
+    }
298
+
299
+    // appliquer notre fonction si elle existe
300
+    $fonc = 'execute_pipeline_' . strtolower($action);
301
+    if (function_exists($fonc)) {
302
+        $val = $fonc($val);
303
+    } // plantage ?
304
+    else {
305
+        spip_log("fonction $fonc absente : pipeline desactive", _LOG_ERREUR);
306
+    }
307
+
308
+    // si le flux est une table avec 2 cle args&data
309
+    // on ne ressort du pipe que les donnees dans 'data'
310
+    // array_key_exists pour php 4.1.0
311
+    if (
312
+        is_array($val)
313
+        and count($val) == 2
314
+        and (array_key_exists('data', $val))
315
+    ) {
316
+        $val = $val['data'];
317
+    }
318
+
319
+    return $val;
320 320
 }
321 321
 
322 322
 /**
@@ -360,38 +360,38 @@  discard block
 block discarded – undo
360 360
  *     paramètre est planté pour cause de compatibilité ascendante.
361 361
  */
362 362
 function spip_log($message = null, $name = null) {
363
-	static $pre = [];
364
-	static $log;
365
-	preg_match('/^([a-z_]*)\.?(\d)?$/iS', (string)$name, $regs);
366
-	if (!isset($regs[1]) or !$logname = $regs[1]) {
367
-		$logname = null;
368
-	}
369
-	if (!isset($regs[2])) {
370
-		$niveau = _LOG_INFO;
371
-	}
372
-	else {
373
-		$niveau = intval($regs[2]);
374
-	}
375
-
376
-	if ($niveau <= (defined('_LOG_FILTRE_GRAVITE') ? _LOG_FILTRE_GRAVITE : _LOG_INFO_IMPORTANTE)) {
377
-		if (!$pre) {
378
-			$pre = [
379
-				_LOG_HS => 'HS:',
380
-				_LOG_ALERTE_ROUGE => 'ALERTE:',
381
-				_LOG_CRITIQUE => 'CRITIQUE:',
382
-				_LOG_ERREUR => 'ERREUR:',
383
-				_LOG_AVERTISSEMENT => 'WARNING:',
384
-				_LOG_INFO_IMPORTANTE => '!INFO:',
385
-				_LOG_INFO => 'info:',
386
-				_LOG_DEBUG => 'debug:'
387
-			];
388
-			$log = charger_fonction('log', 'inc');
389
-		}
390
-		if (!is_string($message)) {
391
-			$message = print_r($message, true);
392
-		}
393
-		$log($pre[$niveau] . ' ' . $message, $logname);
394
-	}
363
+    static $pre = [];
364
+    static $log;
365
+    preg_match('/^([a-z_]*)\.?(\d)?$/iS', (string)$name, $regs);
366
+    if (!isset($regs[1]) or !$logname = $regs[1]) {
367
+        $logname = null;
368
+    }
369
+    if (!isset($regs[2])) {
370
+        $niveau = _LOG_INFO;
371
+    }
372
+    else {
373
+        $niveau = intval($regs[2]);
374
+    }
375
+
376
+    if ($niveau <= (defined('_LOG_FILTRE_GRAVITE') ? _LOG_FILTRE_GRAVITE : _LOG_INFO_IMPORTANTE)) {
377
+        if (!$pre) {
378
+            $pre = [
379
+                _LOG_HS => 'HS:',
380
+                _LOG_ALERTE_ROUGE => 'ALERTE:',
381
+                _LOG_CRITIQUE => 'CRITIQUE:',
382
+                _LOG_ERREUR => 'ERREUR:',
383
+                _LOG_AVERTISSEMENT => 'WARNING:',
384
+                _LOG_INFO_IMPORTANTE => '!INFO:',
385
+                _LOG_INFO => 'info:',
386
+                _LOG_DEBUG => 'debug:'
387
+            ];
388
+            $log = charger_fonction('log', 'inc');
389
+        }
390
+        if (!is_string($message)) {
391
+            $message = print_r($message, true);
392
+        }
393
+        $log($pre[$niveau] . ' ' . $message, $logname);
394
+    }
395 395
 }
396 396
 
397 397
 /**
@@ -402,8 +402,8 @@  discard block
 block discarded – undo
402 402
  * @param array $opt Tableau d'options
403 403
  **/
404 404
 function journal($phrase, $opt = []) {
405
-	$journal = charger_fonction('journal', 'inc');
406
-	$journal($phrase, $opt);
405
+    $journal = charger_fonction('journal', 'inc');
406
+    $journal($phrase, $opt);
407 407
 }
408 408
 
409 409
 
@@ -422,37 +422,37 @@  discard block
 block discarded – undo
422 422
  **/
423 423
 function _request($var, $c = false) {
424 424
 
425
-	if (is_array($c)) {
426
-		return $c[$var] ?? null;
427
-	}
428
-
429
-	if (isset($_GET[$var])) {
430
-		$a = $_GET[$var];
431
-	} elseif (isset($_POST[$var])) {
432
-		$a = $_POST[$var];
433
-	} else {
434
-		return null;
435
-	}
436
-
437
-	// Si on est en ajax et en POST tout a ete encode
438
-	// via encodeURIComponent, il faut donc repasser
439
-	// dans le charset local...
440
-	if (
441
-		defined('_AJAX')
442
-		and _AJAX
443
-		and isset($GLOBALS['meta']['charset'])
444
-		and $GLOBALS['meta']['charset'] != 'utf-8'
445
-		and is_string($a)
446
-		// check rapide mais pas fiable
447
-		and preg_match(',[\x80-\xFF],', $a)
448
-		// check fiable
449
-		and include_spip('inc/charsets')
450
-		and is_utf8($a)
451
-	) {
452
-		return importer_charset($a, 'utf-8');
453
-	}
454
-
455
-	return $a;
425
+    if (is_array($c)) {
426
+        return $c[$var] ?? null;
427
+    }
428
+
429
+    if (isset($_GET[$var])) {
430
+        $a = $_GET[$var];
431
+    } elseif (isset($_POST[$var])) {
432
+        $a = $_POST[$var];
433
+    } else {
434
+        return null;
435
+    }
436
+
437
+    // Si on est en ajax et en POST tout a ete encode
438
+    // via encodeURIComponent, il faut donc repasser
439
+    // dans le charset local...
440
+    if (
441
+        defined('_AJAX')
442
+        and _AJAX
443
+        and isset($GLOBALS['meta']['charset'])
444
+        and $GLOBALS['meta']['charset'] != 'utf-8'
445
+        and is_string($a)
446
+        // check rapide mais pas fiable
447
+        and preg_match(',[\x80-\xFF],', $a)
448
+        // check fiable
449
+        and include_spip('inc/charsets')
450
+        and is_utf8($a)
451
+    ) {
452
+        return importer_charset($a, 'utf-8');
453
+    }
454
+
455
+    return $a;
456 456
 }
457 457
 
458 458
 
@@ -470,22 +470,22 @@  discard block
 block discarded – undo
470 470
  *     - false sinon
471 471
  **/
472 472
 function set_request($var, $val = null, $c = false) {
473
-	if (is_array($c)) {
474
-		unset($c[$var]);
475
-		if ($val !== null) {
476
-			$c[$var] = $val;
477
-		}
473
+    if (is_array($c)) {
474
+        unset($c[$var]);
475
+        if ($val !== null) {
476
+            $c[$var] = $val;
477
+        }
478 478
 
479
-		return $c;
480
-	}
479
+        return $c;
480
+    }
481 481
 
482
-	unset($_GET[$var]);
483
-	unset($_POST[$var]);
484
-	if ($val !== null) {
485
-		$_GET[$var] = $val;
486
-	}
482
+    unset($_GET[$var]);
483
+    unset($_POST[$var]);
484
+    if ($val !== null) {
485
+        $_GET[$var] = $val;
486
+    }
487 487
 
488
-	return false; # n'affecte pas $c
488
+    return false; # n'affecte pas $c
489 489
 }
490 490
 
491 491
 /**
@@ -505,25 +505,25 @@  discard block
 block discarded – undo
505 505
  * @return array|mixed|string
506 506
  */
507 507
 function spip_sanitize_from_request($value, $key, $sanitize_function = 'entites_html') {
508
-	if (is_array($value)) {
509
-		if ($key == '*') {
510
-			$key = array_keys($value);
511
-		}
512
-		if (!is_array($key)) {
513
-			$key = [$key];
514
-		}
515
-		foreach ($key as $k) {
516
-			if (!empty($value[$k])) {
517
-				$value[$k] = spip_sanitize_from_request($value[$k], $k, $sanitize_function);
518
-			}
519
-		}
520
-		return $value;
521
-	}
522
-	// si la valeur vient des GET ou POST on la sanitize
523
-	if (!empty($value) and $value == _request($key)) {
524
-		$value = $sanitize_function($value);
525
-	}
526
-	return $value;
508
+    if (is_array($value)) {
509
+        if ($key == '*') {
510
+            $key = array_keys($value);
511
+        }
512
+        if (!is_array($key)) {
513
+            $key = [$key];
514
+        }
515
+        foreach ($key as $k) {
516
+            if (!empty($value[$k])) {
517
+                $value[$k] = spip_sanitize_from_request($value[$k], $k, $sanitize_function);
518
+            }
519
+        }
520
+        return $value;
521
+    }
522
+    // si la valeur vient des GET ou POST on la sanitize
523
+    if (!empty($value) and $value == _request($key)) {
524
+        $value = $sanitize_function($value);
525
+    }
526
+    return $value;
527 527
 }
528 528
 
529 529
 /**
@@ -531,23 +531,22 @@  discard block
 block discarded – undo
531 531
  *
532 532
  * On est sur le web, on exclut certains protocoles,
533 533
  * notamment 'file://', 'php://' et d'autres…
534
-
535 534
  * @param string $url
536 535
  * @return bool
537 536
  */
538 537
 function tester_url_absolue($url) {
539
-	$url = trim($url ?? '');
540
-	if ($url && preg_match(';^([a-z]{3,7}:)?//;Uims', $url, $m)) {
541
-		if (
542
-			isset($m[1])
543
-			and $p = strtolower(rtrim($m[1], ':'))
544
-			and in_array($p, ['file', 'php', 'zlib', 'glob', 'phar', 'ssh2', 'rar', 'ogg', 'expect', 'zip'])
545
-		) {
546
-			return false;
547
-		}
548
-		return true;
549
-	}
550
-	return false;
538
+    $url = trim($url ?? '');
539
+    if ($url && preg_match(';^([a-z]{3,7}:)?//;Uims', $url, $m)) {
540
+        if (
541
+            isset($m[1])
542
+            and $p = strtolower(rtrim($m[1], ':'))
543
+            and in_array($p, ['file', 'php', 'zlib', 'glob', 'phar', 'ssh2', 'rar', 'ogg', 'expect', 'zip'])
544
+        ) {
545
+            return false;
546
+        }
547
+        return true;
548
+    }
549
+    return false;
551 550
 }
552 551
 
553 552
 /**
@@ -569,100 +568,100 @@  discard block
 block discarded – undo
569 568
  * @return string URL
570 569
  */
571 570
 function parametre_url($url, $c, $v = null, $sep = '&amp;') {
572
-	// requete erronnee : plusieurs variable dans $c et aucun $v
573
-	if (strpos($c, '|') !== false and is_null($v)) {
574
-		return null;
575
-	}
576
-
577
-	// lever l'#ancre
578
-	if (preg_match(',^([^#]*)(#.*)$,', $url, $r)) {
579
-		$url = $r[1];
580
-		$ancre = $r[2];
581
-	} else {
582
-		$ancre = '';
583
-	}
584
-
585
-	// eclater
586
-	$url = preg_split(',[?]|&amp;|&,', $url);
587
-
588
-	// recuperer la base
589
-	$a = array_shift($url);
590
-	if (!$a) {
591
-		$a = './';
592
-	}
593
-
594
-	// preparer la regexp de maniere securisee
595
-	$regexp = explode('|', $c);
596
-	foreach ($regexp as $r => $e) {
597
-		$regexp[$r] = str_replace('[]', '\[\]', preg_replace(',[^\w\d\[\]-],', '', $e));
598
-	}
599
-	$regexp = ',^(' . implode('|', $regexp) . '[[]?[]]?)(=.*)?$,';
600
-	$ajouts = array_flip(explode('|', $c));
601
-	$u = is_array($v) ? $v : rawurlencode((string) $v);
602
-	$testv = (is_array($v) ? count($v) : strlen((string) $v));
603
-	$v_read = null;
604
-	// lire les variables et agir
605
-	foreach ($url as $n => $val) {
606
-		if (preg_match($regexp, urldecode($val), $r)) {
607
-			$r = array_pad($r, 3, null);
608
-			if ($v === null) {
609
-				// c'est un tableau, on memorise les valeurs
610
-				if (substr($r[1], -2) == '[]') {
611
-					if (!$v_read) {
612
-						$v_read = [];
613
-					}
614
-					$v_read[] = $r[2] ? substr($r[2], 1) : '';
615
-				} // c'est un scalaire, on retourne direct
616
-				else {
617
-					return $r[2] ? substr($r[2], 1) : '';
618
-				}
619
-			} // suppression
620
-			elseif (!$testv) {
621
-				unset($url[$n]);
622
-			}
623
-			// Ajout. Pour une variable, remplacer au meme endroit,
624
-			// pour un tableau ce sera fait dans la prochaine boucle
625
-			elseif (substr($r[1], -2) != '[]') {
626
-				$url[$n] = $r[1] . '=' . $u;
627
-				unset($ajouts[$r[1]]);
628
-			}
629
-			// Pour les tableaux on laisse tomber les valeurs de
630
-			// départ, on remplira à l'étape suivante
631
-			else {
632
-				unset($url[$n]);
633
-			}
634
-		}
635
-	}
636
-
637
-	// traiter les parametres pas encore trouves
638
-	if (
639
-		$v === null
640
-		and $args = func_get_args()
641
-		and count($args) == 2
642
-	) {
643
-		return $v_read; // rien trouve ou un tableau
644
-	} elseif ($testv) {
645
-		foreach ($ajouts as $k => $n) {
646
-			if (!is_array($v)) {
647
-				$url[] = $k . '=' . $u;
648
-			} else {
649
-				$id = (substr($k, -2) == '[]') ? $k : ($k . '[]');
650
-				foreach ($v as $w) {
651
-					$url[] = $id . '=' . (is_array($w) ? 'Array' : rawurlencode($w));
652
-				}
653
-			}
654
-		}
655
-	}
656
-
657
-	// eliminer les vides
658
-	$url = array_filter($url);
659
-
660
-	// recomposer l'adresse
661
-	if ($url) {
662
-		$a .= '?' . join($sep, $url);
663
-	}
664
-
665
-	return $a . $ancre;
571
+    // requete erronnee : plusieurs variable dans $c et aucun $v
572
+    if (strpos($c, '|') !== false and is_null($v)) {
573
+        return null;
574
+    }
575
+
576
+    // lever l'#ancre
577
+    if (preg_match(',^([^#]*)(#.*)$,', $url, $r)) {
578
+        $url = $r[1];
579
+        $ancre = $r[2];
580
+    } else {
581
+        $ancre = '';
582
+    }
583
+
584
+    // eclater
585
+    $url = preg_split(',[?]|&amp;|&,', $url);
586
+
587
+    // recuperer la base
588
+    $a = array_shift($url);
589
+    if (!$a) {
590
+        $a = './';
591
+    }
592
+
593
+    // preparer la regexp de maniere securisee
594
+    $regexp = explode('|', $c);
595
+    foreach ($regexp as $r => $e) {
596
+        $regexp[$r] = str_replace('[]', '\[\]', preg_replace(',[^\w\d\[\]-],', '', $e));
597
+    }
598
+    $regexp = ',^(' . implode('|', $regexp) . '[[]?[]]?)(=.*)?$,';
599
+    $ajouts = array_flip(explode('|', $c));
600
+    $u = is_array($v) ? $v : rawurlencode((string) $v);
601
+    $testv = (is_array($v) ? count($v) : strlen((string) $v));
602
+    $v_read = null;
603
+    // lire les variables et agir
604
+    foreach ($url as $n => $val) {
605
+        if (preg_match($regexp, urldecode($val), $r)) {
606
+            $r = array_pad($r, 3, null);
607
+            if ($v === null) {
608
+                // c'est un tableau, on memorise les valeurs
609
+                if (substr($r[1], -2) == '[]') {
610
+                    if (!$v_read) {
611
+                        $v_read = [];
612
+                    }
613
+                    $v_read[] = $r[2] ? substr($r[2], 1) : '';
614
+                } // c'est un scalaire, on retourne direct
615
+                else {
616
+                    return $r[2] ? substr($r[2], 1) : '';
617
+                }
618
+            } // suppression
619
+            elseif (!$testv) {
620
+                unset($url[$n]);
621
+            }
622
+            // Ajout. Pour une variable, remplacer au meme endroit,
623
+            // pour un tableau ce sera fait dans la prochaine boucle
624
+            elseif (substr($r[1], -2) != '[]') {
625
+                $url[$n] = $r[1] . '=' . $u;
626
+                unset($ajouts[$r[1]]);
627
+            }
628
+            // Pour les tableaux on laisse tomber les valeurs de
629
+            // départ, on remplira à l'étape suivante
630
+            else {
631
+                unset($url[$n]);
632
+            }
633
+        }
634
+    }
635
+
636
+    // traiter les parametres pas encore trouves
637
+    if (
638
+        $v === null
639
+        and $args = func_get_args()
640
+        and count($args) == 2
641
+    ) {
642
+        return $v_read; // rien trouve ou un tableau
643
+    } elseif ($testv) {
644
+        foreach ($ajouts as $k => $n) {
645
+            if (!is_array($v)) {
646
+                $url[] = $k . '=' . $u;
647
+            } else {
648
+                $id = (substr($k, -2) == '[]') ? $k : ($k . '[]');
649
+                foreach ($v as $w) {
650
+                    $url[] = $id . '=' . (is_array($w) ? 'Array' : rawurlencode($w));
651
+                }
652
+            }
653
+        }
654
+    }
655
+
656
+    // eliminer les vides
657
+    $url = array_filter($url);
658
+
659
+    // recomposer l'adresse
660
+    if ($url) {
661
+        $a .= '?' . join($sep, $url);
662
+    }
663
+
664
+    return $a . $ancre;
666 665
 }
667 666
 
668 667
 /**
@@ -677,22 +676,22 @@  discard block
 block discarded – undo
677 676
  * @uses translitteration()
678 677
  */
679 678
 function ancre_url(string $url, ?string $ancre = ''): string {
680
-	$ancre ??= '';
681
-	// lever l'#ancre
682
-	if (preg_match(',^([^#]*)(#.*)$,', $url, $r)) {
683
-		$url = $r[1];
684
-	}
685
-	if (preg_match('/[^-_a-zA-Z0-9]+/S', $ancre)) {
686
-		if (!function_exists('translitteration')) {
687
-			include_spip('inc/charsets');
688
-		}
689
-		$ancre = preg_replace(
690
-			['/^[^-_a-zA-Z0-9]+/', '/[^-_a-zA-Z0-9]/'],
691
-			['', '-'],
692
-			translitteration($ancre)
693
-		);
694
-	}
695
-	return $url . (strlen($ancre) ? '#' . $ancre : '');
679
+    $ancre ??= '';
680
+    // lever l'#ancre
681
+    if (preg_match(',^([^#]*)(#.*)$,', $url, $r)) {
682
+        $url = $r[1];
683
+    }
684
+    if (preg_match('/[^-_a-zA-Z0-9]+/S', $ancre)) {
685
+        if (!function_exists('translitteration')) {
686
+            include_spip('inc/charsets');
687
+        }
688
+        $ancre = preg_replace(
689
+            ['/^[^-_a-zA-Z0-9]+/', '/[^-_a-zA-Z0-9]/'],
690
+            ['', '-'],
691
+            translitteration($ancre)
692
+        );
693
+    }
694
+    return $url . (strlen($ancre) ? '#' . $ancre : '');
696 695
 }
697 696
 
698 697
 /**
@@ -702,16 +701,16 @@  discard block
 block discarded – undo
702 701
  * @return string
703 702
  */
704 703
 function nettoyer_uri($reset = null) {
705
-	static $done = false;
706
-	static $propre = '';
707
-	if (!is_null($reset)) {
708
-		return $propre = $reset;
709
-	}
710
-	if ($done) {
711
-		return $propre;
712
-	}
713
-	$done = true;
714
-	return $propre = nettoyer_uri_var($GLOBALS['REQUEST_URI']);
704
+    static $done = false;
705
+    static $propre = '';
706
+    if (!is_null($reset)) {
707
+        return $propre = $reset;
708
+    }
709
+    if ($done) {
710
+        return $propre;
711
+    }
712
+    $done = true;
713
+    return $propre = nettoyer_uri_var($GLOBALS['REQUEST_URI']);
715 714
 }
716 715
 
717 716
 /**
@@ -723,16 +722,16 @@  discard block
 block discarded – undo
723 722
  * @return string
724 723
  */
725 724
 function nettoyer_uri_var($request_uri) {
726
-	$uri1 = $request_uri;
727
-	do {
728
-		$uri = $uri1;
729
-		$uri1 = preg_replace(
730
-			',([?&])(var_[^=&]*|PHPSESSID|fbclid|utm_[^=&]*)=[^&]*(&|$),i',
731
-			'\1',
732
-			$uri
733
-		);
734
-	} while ($uri <> $uri1);
735
-	return preg_replace(',[?&]$,', '', $uri1);
725
+    $uri1 = $request_uri;
726
+    do {
727
+        $uri = $uri1;
728
+        $uri1 = preg_replace(
729
+            ',([?&])(var_[^=&]*|PHPSESSID|fbclid|utm_[^=&]*)=[^&]*(&|$),i',
730
+            '\1',
731
+            $uri
732
+        );
733
+    } while ($uri <> $uri1);
734
+    return preg_replace(',[?&]$,', '', $uri1);
736 735
 }
737 736
 
738 737
 
@@ -746,48 +745,48 @@  discard block
 block discarded – undo
746 745
  *    URL vers soi-même
747 746
  **/
748 747
 function self($amp = '&amp;', $root = false) {
749
-	$url = nettoyer_uri();
750
-	if (
751
-		!$root
752
-		and (
753
-			// si pas de profondeur on peut tronquer
754
-			$GLOBALS['profondeur_url'] < (_DIR_RESTREINT ? 1 : 2)
755
-			// sinon c'est OK si _SET_HTML_BASE a ete force a false
756
-			or (defined('_SET_HTML_BASE') and !_SET_HTML_BASE))
757
-	) {
758
-		$url = preg_replace(',^[^?]*/,', '', $url);
759
-	}
760
-	// ajouter le cas echeant les variables _POST['id_...']
761
-	foreach ($_POST as $v => $c) {
762
-		if (substr($v, 0, 3) == 'id_') {
763
-			$url = parametre_url($url, $v, $c, '&');
764
-		}
765
-	}
766
-
767
-	// supprimer les variables sans interet
768
-	if (test_espace_prive()) {
769
-		$url = preg_replace(',([?&])('
770
-			. 'lang|show_docs|'
771
-			. 'changer_lang|var_lang|action)=[^&]*,i', '\1', $url);
772
-		$url = preg_replace(',([?&])[&]+,', '\1', $url);
773
-		$url = preg_replace(',[&]$,', '\1', $url);
774
-	}
775
-
776
-	// eviter les hacks
777
-	include_spip('inc/filtres_mini');
778
-	$url = spip_htmlspecialchars($url);
779
-
780
-	$url = str_replace(["'", '"', '<', '[', ']', ':'], ['%27', '%22', '%3C', '%5B', '%5D', '%3A'], $url);
781
-
782
-	// &amp; ?
783
-	if ($amp != '&amp;') {
784
-		$url = str_replace('&amp;', $amp, $url);
785
-	}
786
-
787
-	// Si ca demarre par ? ou vide, donner './'
788
-	$url = preg_replace(',^([?].*)?$,', './\1', $url);
789
-
790
-	return $url;
748
+    $url = nettoyer_uri();
749
+    if (
750
+        !$root
751
+        and (
752
+            // si pas de profondeur on peut tronquer
753
+            $GLOBALS['profondeur_url'] < (_DIR_RESTREINT ? 1 : 2)
754
+            // sinon c'est OK si _SET_HTML_BASE a ete force a false
755
+            or (defined('_SET_HTML_BASE') and !_SET_HTML_BASE))
756
+    ) {
757
+        $url = preg_replace(',^[^?]*/,', '', $url);
758
+    }
759
+    // ajouter le cas echeant les variables _POST['id_...']
760
+    foreach ($_POST as $v => $c) {
761
+        if (substr($v, 0, 3) == 'id_') {
762
+            $url = parametre_url($url, $v, $c, '&');
763
+        }
764
+    }
765
+
766
+    // supprimer les variables sans interet
767
+    if (test_espace_prive()) {
768
+        $url = preg_replace(',([?&])('
769
+            . 'lang|show_docs|'
770
+            . 'changer_lang|var_lang|action)=[^&]*,i', '\1', $url);
771
+        $url = preg_replace(',([?&])[&]+,', '\1', $url);
772
+        $url = preg_replace(',[&]$,', '\1', $url);
773
+    }
774
+
775
+    // eviter les hacks
776
+    include_spip('inc/filtres_mini');
777
+    $url = spip_htmlspecialchars($url);
778
+
779
+    $url = str_replace(["'", '"', '<', '[', ']', ':'], ['%27', '%22', '%3C', '%5B', '%5D', '%3A'], $url);
780
+
781
+    // &amp; ?
782
+    if ($amp != '&amp;') {
783
+        $url = str_replace('&amp;', $amp, $url);
784
+    }
785
+
786
+    // Si ca demarre par ? ou vide, donner './'
787
+    $url = preg_replace(',^([?].*)?$,', './\1', $url);
788
+
789
+    return $url;
791 790
 }
792 791
 
793 792
 
@@ -798,7 +797,7 @@  discard block
 block discarded – undo
798 797
  *     true si c'est le cas, false sinon.
799 798
  */
800 799
 function test_espace_prive() {
801
-	return defined('_ESPACE_PRIVE') ? _ESPACE_PRIVE : false;
800
+    return defined('_ESPACE_PRIVE') ? _ESPACE_PRIVE : false;
802 801
 }
803 802
 
804 803
 /**
@@ -808,7 +807,7 @@  discard block
 block discarded – undo
808 807
  * @return bool
809 808
  */
810 809
 function test_plugin_actif($plugin) {
811
-	return ($plugin and defined('_DIR_PLUGIN_' . strtoupper($plugin))) ? true : false;
810
+    return ($plugin and defined('_DIR_PLUGIN_' . strtoupper($plugin))) ? true : false;
812 811
 }
813 812
 
814 813
 /**
@@ -839,52 +838,52 @@  discard block
 block discarded – undo
839 838
  *     texte
840 839
  */
841 840
 function _T($texte, $args = [], $options = []) {
842
-	static $traduire = false;
843
-	$o = ['class' => '', 'force' => true, 'sanitize' => true];
844
-	if ($options) {
845
-		// support de l'ancien argument $class
846
-		if (is_string($options)) {
847
-			$options = ['class' => $options];
848
-		}
849
-		$o = array_merge($o, $options);
850
-	}
851
-
852
-	if (!$traduire) {
853
-		$traduire = charger_fonction('traduire', 'inc');
854
-		include_spip('inc/lang');
855
-	}
856
-
857
-	// On peut passer explicitement la langue dans le tableau
858
-	// On utilise le même nom de variable que la globale
859
-	if (isset($args['spip_lang'])) {
860
-		$lang = $args['spip_lang'];
861
-		// On l'enleve pour ne pas le passer au remplacement
862
-		unset($args['spip_lang']);
863
-	} // Sinon on prend la langue du contexte
864
-	else {
865
-		$lang = $GLOBALS['spip_lang'];
866
-	}
867
-	$text = $traduire($texte, $lang);
868
-
869
-	if ($text === null || !strlen($text)) {
870
-		if (!$o['force']) {
871
-			return '';
872
-		}
873
-
874
-		$text = $texte;
875
-
876
-		// pour les chaines non traduites, assurer un service minimum
877
-		if (!$GLOBALS['test_i18n'] and (_request('var_mode') != 'traduction')) {
878
-			$n = strpos($text, ':');
879
-			if ($n !== false) {
880
-				$text = substr($text, $n + 1);
881
-			}
882
-			$text = str_replace('_', ' ', $text);
883
-		}
884
-		$o['class'] = null;
885
-	}
886
-
887
-	return _L($text, $args, $o);
841
+    static $traduire = false;
842
+    $o = ['class' => '', 'force' => true, 'sanitize' => true];
843
+    if ($options) {
844
+        // support de l'ancien argument $class
845
+        if (is_string($options)) {
846
+            $options = ['class' => $options];
847
+        }
848
+        $o = array_merge($o, $options);
849
+    }
850
+
851
+    if (!$traduire) {
852
+        $traduire = charger_fonction('traduire', 'inc');
853
+        include_spip('inc/lang');
854
+    }
855
+
856
+    // On peut passer explicitement la langue dans le tableau
857
+    // On utilise le même nom de variable que la globale
858
+    if (isset($args['spip_lang'])) {
859
+        $lang = $args['spip_lang'];
860
+        // On l'enleve pour ne pas le passer au remplacement
861
+        unset($args['spip_lang']);
862
+    } // Sinon on prend la langue du contexte
863
+    else {
864
+        $lang = $GLOBALS['spip_lang'];
865
+    }
866
+    $text = $traduire($texte, $lang);
867
+
868
+    if ($text === null || !strlen($text)) {
869
+        if (!$o['force']) {
870
+            return '';
871
+        }
872
+
873
+        $text = $texte;
874
+
875
+        // pour les chaines non traduites, assurer un service minimum
876
+        if (!$GLOBALS['test_i18n'] and (_request('var_mode') != 'traduction')) {
877
+            $n = strpos($text, ':');
878
+            if ($n !== false) {
879
+                $text = substr($text, $n + 1);
880
+            }
881
+            $text = str_replace('_', ' ', $text);
882
+        }
883
+        $o['class'] = null;
884
+    }
885
+
886
+    return _L($text, $args, $o);
888 887
 }
889 888
 
890 889
 
@@ -911,53 +910,53 @@  discard block
 block discarded – undo
911 910
  *     texte
912 911
  */
913 912
 function _L($text, $args = [], $options = []) {
914
-	$f = $text;
915
-	$defaut_options = [
916
-		'class' => null,
917
-		'sanitize' => true,
918
-	];
919
-	// support de l'ancien argument $class
920
-	if ($options and is_string($options)) {
921
-		$options = ['class' => $options];
922
-	}
923
-	if (is_array($options)) {
924
-		$options += $defaut_options;
925
-	} else {
926
-		$options = $defaut_options;
927
-	}
928
-
929
-	if (is_array($args) and count($args)) {
930
-		if (!function_exists('interdire_scripts')) {
931
-			include_spip('inc/texte');
932
-		}
933
-		if (!function_exists('echapper_html_suspect')) {
934
-			include_spip('inc/texte_mini');
935
-		}
936
-		foreach ($args as $name => $value) {
937
-			if (strpos($text, (string) "@$name@") !== false) {
938
-				if ($options['sanitize']) {
939
-					$value = echapper_html_suspect($value);
940
-					$value = interdire_scripts($value, -1);
941
-				}
942
-				if (!empty($options['class'])) {
943
-					$value = "<span class='" . $options['class'] . "'>$value</span>";
944
-				}
945
-				$text = str_replace("@$name@", $value, $text);
946
-				unset($args[$name]);
947
-			}
948
-		}
949
-		// Si des variables n'ont pas ete inserees, le signaler
950
-		// (chaines de langues pas a jour)
951
-		if ($args) {
952
-			spip_log("$f:  variables inutilisees " . join(', ', array_keys($args)), _LOG_DEBUG);
953
-		}
954
-	}
955
-
956
-	if (($GLOBALS['test_i18n'] or (_request('var_mode') == 'traduction')) and is_null($options['class'])) {
957
-		return "<span class='debug-traduction-erreur'>$text</span>";
958
-	} else {
959
-		return $text;
960
-	}
913
+    $f = $text;
914
+    $defaut_options = [
915
+        'class' => null,
916
+        'sanitize' => true,
917
+    ];
918
+    // support de l'ancien argument $class
919
+    if ($options and is_string($options)) {
920
+        $options = ['class' => $options];
921
+    }
922
+    if (is_array($options)) {
923
+        $options += $defaut_options;
924
+    } else {
925
+        $options = $defaut_options;
926
+    }
927
+
928
+    if (is_array($args) and count($args)) {
929
+        if (!function_exists('interdire_scripts')) {
930
+            include_spip('inc/texte');
931
+        }
932
+        if (!function_exists('echapper_html_suspect')) {
933
+            include_spip('inc/texte_mini');
934
+        }
935
+        foreach ($args as $name => $value) {
936
+            if (strpos($text, (string) "@$name@") !== false) {
937
+                if ($options['sanitize']) {
938
+                    $value = echapper_html_suspect($value);
939
+                    $value = interdire_scripts($value, -1);
940
+                }
941
+                if (!empty($options['class'])) {
942
+                    $value = "<span class='" . $options['class'] . "'>$value</span>";
943
+                }
944
+                $text = str_replace("@$name@", $value, $text);
945
+                unset($args[$name]);
946
+            }
947
+        }
948
+        // Si des variables n'ont pas ete inserees, le signaler
949
+        // (chaines de langues pas a jour)
950
+        if ($args) {
951
+            spip_log("$f:  variables inutilisees " . join(', ', array_keys($args)), _LOG_DEBUG);
952
+        }
953
+    }
954
+
955
+    if (($GLOBALS['test_i18n'] or (_request('var_mode') == 'traduction')) and is_null($options['class'])) {
956
+        return "<span class='debug-traduction-erreur'>$text</span>";
957
+    } else {
958
+        return $text;
959
+    }
961 960
 }
962 961
 
963 962
 
@@ -971,13 +970,13 @@  discard block
 block discarded – undo
971 970
  * @return string
972 971
  */
973 972
 function joli_repertoire($rep) {
974
-	$a = substr($rep, 0, 1);
975
-	if ($a <> '.' and $a <> '/') {
976
-		$rep = (_DIR_RESTREINT ? '' : _DIR_RESTREINT_ABS) . $rep;
977
-	}
978
-	$rep = preg_replace(',(^\.\.\/),', '', $rep);
973
+    $a = substr($rep, 0, 1);
974
+    if ($a <> '.' and $a <> '/') {
975
+        $rep = (_DIR_RESTREINT ? '' : _DIR_RESTREINT_ABS) . $rep;
976
+    }
977
+    $rep = preg_replace(',(^\.\.\/),', '', $rep);
979 978
 
980
-	return $rep;
979
+    return $rep;
981 980
 }
982 981
 
983 982
 
@@ -1002,54 +1001,54 @@  discard block
 block discarded – undo
1002 1001
  * @return float|int|string|void
1003 1002
  */
1004 1003
 function spip_timer($t = 'rien', $raw = false) {
1005
-	static $time;
1006
-	$a = time();
1007
-	$b = microtime();
1008
-	// microtime peut contenir les microsecondes et le temps
1009
-	$b = explode(' ', $b);
1010
-	if (count($b) == 2) {
1011
-		$a = end($b);
1012
-	} // plus precis !
1013
-	$b = reset($b);
1014
-	if (!isset($time[$t])) {
1015
-		$time[$t] = $a + $b;
1016
-	} else {
1017
-		$p = ($a + $b - $time[$t]) * 1000;
1018
-		unset($time[$t]);
1004
+    static $time;
1005
+    $a = time();
1006
+    $b = microtime();
1007
+    // microtime peut contenir les microsecondes et le temps
1008
+    $b = explode(' ', $b);
1009
+    if (count($b) == 2) {
1010
+        $a = end($b);
1011
+    } // plus precis !
1012
+    $b = reset($b);
1013
+    if (!isset($time[$t])) {
1014
+        $time[$t] = $a + $b;
1015
+    } else {
1016
+        $p = ($a + $b - $time[$t]) * 1000;
1017
+        unset($time[$t]);
1019 1018
 #			echo "'$p'";exit;
1020
-		if ($raw) {
1021
-			return $p;
1022
-		}
1023
-		if ($p < 1000) {
1024
-			$s = '';
1025
-		} else {
1026
-			$s = sprintf('%d ', $x = floor($p / 1000));
1027
-			$p -= ($x * 1000);
1028
-		}
1019
+        if ($raw) {
1020
+            return $p;
1021
+        }
1022
+        if ($p < 1000) {
1023
+            $s = '';
1024
+        } else {
1025
+            $s = sprintf('%d ', $x = floor($p / 1000));
1026
+            $p -= ($x * 1000);
1027
+        }
1029 1028
 
1030
-		return $s . sprintf($s ? '%07.3f ms' : '%.3f ms', $p);
1031
-	}
1029
+        return $s . sprintf($s ? '%07.3f ms' : '%.3f ms', $p);
1030
+    }
1032 1031
 }
1033 1032
 
1034 1033
 
1035 1034
 // Renvoie False si un fichier n'est pas plus vieux que $duree secondes,
1036 1035
 // sinon renvoie True et le date sauf si ca n'est pas souhaite
1037 1036
 function spip_touch($fichier, $duree = 0, $touch = true) {
1038
-	if ($duree) {
1039
-		clearstatcache();
1040
-		if ((@$f = filemtime($fichier)) and ($f >= time() - $duree)) {
1041
-			return false;
1042
-		}
1043
-	}
1044
-	if ($touch !== false) {
1045
-		if (!@touch($fichier)) {
1046
-			spip_unlink($fichier);
1047
-			@touch($fichier);
1048
-		};
1049
-		@chmod($fichier, _SPIP_CHMOD & ~0111);
1050
-	}
1037
+    if ($duree) {
1038
+        clearstatcache();
1039
+        if ((@$f = filemtime($fichier)) and ($f >= time() - $duree)) {
1040
+            return false;
1041
+        }
1042
+    }
1043
+    if ($touch !== false) {
1044
+        if (!@touch($fichier)) {
1045
+            spip_unlink($fichier);
1046
+            @touch($fichier);
1047
+        };
1048
+        @chmod($fichier, _SPIP_CHMOD & ~0111);
1049
+    }
1051 1050
 
1052
-	return true;
1051
+    return true;
1053 1052
 }
1054 1053
 
1055 1054
 
@@ -1060,11 +1059,11 @@  discard block
 block discarded – undo
1060 1059
  * @uses cron()
1061 1060
  **/
1062 1061
 function action_cron() {
1063
-	include_spip('inc/headers');
1064
-	http_response_code(204); // No Content
1065
-	header('Connection: close');
1066
-	define('_DIRECT_CRON_FORCE', true);
1067
-	cron();
1062
+    include_spip('inc/headers');
1063
+    http_response_code(204); // No Content
1064
+    header('Connection: close');
1065
+    define('_DIRECT_CRON_FORCE', true);
1066
+    cron();
1068 1067
 }
1069 1068
 
1070 1069
 /**
@@ -1080,26 +1079,26 @@  discard block
 block discarded – undo
1080 1079
  *     True si la tache a pu être effectuée
1081 1080
  */
1082 1081
 function cron($taches = [], $taches_old = []) {
1083
-	// si pas en mode cron force, laisser tomber.
1084
-	if (!defined('_DIRECT_CRON_FORCE')) {
1085
-		return false;
1086
-	}
1087
-	if (!is_array($taches)) {
1088
-		$taches = $taches_old;
1089
-	} // compat anciens appels
1090
-	// si taches a inserer en base et base inaccessible, laisser tomber
1091
-	// sinon on ne verifie pas la connexion tout de suite, car si ca se trouve
1092
-	// queue_sleep_time_to_next_job() dira qu'il n'y a rien a faire
1093
-	// et on evite d'ouvrir une connexion pour rien (utilisation de _DIRECT_CRON_FORCE dans mes_options.php)
1094
-	if ($taches and count($taches) and !spip_connect()) {
1095
-		return false;
1096
-	}
1097
-	spip_log('cron !', 'jq' . _LOG_DEBUG);
1098
-	if ($genie = charger_fonction('genie', 'inc', true)) {
1099
-		return $genie($taches);
1100
-	}
1101
-
1102
-	return false;
1082
+    // si pas en mode cron force, laisser tomber.
1083
+    if (!defined('_DIRECT_CRON_FORCE')) {
1084
+        return false;
1085
+    }
1086
+    if (!is_array($taches)) {
1087
+        $taches = $taches_old;
1088
+    } // compat anciens appels
1089
+    // si taches a inserer en base et base inaccessible, laisser tomber
1090
+    // sinon on ne verifie pas la connexion tout de suite, car si ca se trouve
1091
+    // queue_sleep_time_to_next_job() dira qu'il n'y a rien a faire
1092
+    // et on evite d'ouvrir une connexion pour rien (utilisation de _DIRECT_CRON_FORCE dans mes_options.php)
1093
+    if ($taches and count($taches) and !spip_connect()) {
1094
+        return false;
1095
+    }
1096
+    spip_log('cron !', 'jq' . _LOG_DEBUG);
1097
+    if ($genie = charger_fonction('genie', 'inc', true)) {
1098
+        return $genie($taches);
1099
+    }
1100
+
1101
+    return false;
1103 1102
 }
1104 1103
 
1105 1104
 /**
@@ -1131,17 +1130,17 @@  discard block
 block discarded – undo
1131 1130
  *     Le numéro de travail ajouté ou `0` si aucun travail n’a été ajouté.
1132 1131
  */
1133 1132
 function job_queue_add(
1134
-	$function,
1135
-	$description,
1136
-	$arguments = [],
1137
-	$file = '',
1138
-	$no_duplicate = false,
1139
-	$time = 0,
1140
-	$priority = 0
1133
+    $function,
1134
+    $description,
1135
+    $arguments = [],
1136
+    $file = '',
1137
+    $no_duplicate = false,
1138
+    $time = 0,
1139
+    $priority = 0
1141 1140
 ) {
1142
-	include_spip('inc/queue');
1141
+    include_spip('inc/queue');
1143 1142
 
1144
-	return queue_add_job($function, $description, $arguments, $file, $no_duplicate, $time, $priority);
1143
+    return queue_add_job($function, $description, $arguments, $file, $no_duplicate, $time, $priority);
1145 1144
 }
1146 1145
 
1147 1146
 /**
@@ -1152,9 +1151,9 @@  discard block
 block discarded – undo
1152 1151
  * @return bool
1153 1152
  */
1154 1153
 function job_queue_remove($id_job) {
1155
-	include_spip('inc/queue');
1154
+    include_spip('inc/queue');
1156 1155
 
1157
-	return queue_remove_job($id_job);
1156
+    return queue_remove_job($id_job);
1158 1157
 }
1159 1158
 
1160 1159
 /**
@@ -1167,9 +1166,9 @@  discard block
 block discarded – undo
1167 1166
  *     or an array of simple array to link multiples objet in one time
1168 1167
  */
1169 1168
 function job_queue_link($id_job, $objets) {
1170
-	include_spip('inc/queue');
1169
+    include_spip('inc/queue');
1171 1170
 
1172
-	return queue_link_job($id_job, $objets);
1171
+    return queue_link_job($id_job, $objets);
1173 1172
 }
1174 1173
 
1175 1174
 
@@ -1189,36 +1188,36 @@  discard block
 block discarded – undo
1189 1188
  *  - `null` si la queue n'est pas encore initialisée
1190 1189
  */
1191 1190
 function queue_sleep_time_to_next_job($force = null) {
1192
-	static $queue_next_job_time = -1;
1193
-	if ($force === true) {
1194
-		$queue_next_job_time = -1;
1195
-	} elseif ($force) {
1196
-		$queue_next_job_time = $force;
1197
-	}
1198
-
1199
-	if ($queue_next_job_time == -1) {
1200
-		if (!defined('_JQ_NEXT_JOB_TIME_FILENAME')) {
1201
-			define('_JQ_NEXT_JOB_TIME_FILENAME', _DIR_TMP . 'job_queue_next.txt');
1202
-		}
1203
-		// utiliser un cache memoire si dispo
1204
-		if (function_exists('cache_get') and defined('_MEMOIZE_MEMORY') and _MEMOIZE_MEMORY) {
1205
-			$queue_next_job_time = cache_get(_JQ_NEXT_JOB_TIME_FILENAME);
1206
-		} else {
1207
-			$queue_next_job_time = null;
1208
-			if (lire_fichier(_JQ_NEXT_JOB_TIME_FILENAME, $contenu)) {
1209
-				$queue_next_job_time = intval($contenu);
1210
-			}
1211
-		}
1212
-	}
1213
-
1214
-	if (is_null($queue_next_job_time)) {
1215
-		return null;
1216
-	}
1217
-	if (!$_SERVER['REQUEST_TIME']) {
1218
-		$_SERVER['REQUEST_TIME'] = time();
1219
-	}
1220
-
1221
-	return $queue_next_job_time - $_SERVER['REQUEST_TIME'];
1191
+    static $queue_next_job_time = -1;
1192
+    if ($force === true) {
1193
+        $queue_next_job_time = -1;
1194
+    } elseif ($force) {
1195
+        $queue_next_job_time = $force;
1196
+    }
1197
+
1198
+    if ($queue_next_job_time == -1) {
1199
+        if (!defined('_JQ_NEXT_JOB_TIME_FILENAME')) {
1200
+            define('_JQ_NEXT_JOB_TIME_FILENAME', _DIR_TMP . 'job_queue_next.txt');
1201
+        }
1202
+        // utiliser un cache memoire si dispo
1203
+        if (function_exists('cache_get') and defined('_MEMOIZE_MEMORY') and _MEMOIZE_MEMORY) {
1204
+            $queue_next_job_time = cache_get(_JQ_NEXT_JOB_TIME_FILENAME);
1205
+        } else {
1206
+            $queue_next_job_time = null;
1207
+            if (lire_fichier(_JQ_NEXT_JOB_TIME_FILENAME, $contenu)) {
1208
+                $queue_next_job_time = intval($contenu);
1209
+            }
1210
+        }
1211
+    }
1212
+
1213
+    if (is_null($queue_next_job_time)) {
1214
+        return null;
1215
+    }
1216
+    if (!$_SERVER['REQUEST_TIME']) {
1217
+        $_SERVER['REQUEST_TIME'] = time();
1218
+    }
1219
+
1220
+    return $queue_next_job_time - $_SERVER['REQUEST_TIME'];
1222 1221
 }
1223 1222
 
1224 1223
 
@@ -1230,11 +1229,11 @@  discard block
 block discarded – undo
1230 1229
  * @return string
1231 1230
  */
1232 1231
 function quote_amp($u) {
1233
-	return preg_replace(
1234
-		'/&(?![a-z]{0,4}\w{2,3};|#x?[0-9a-f]{2,6};)/i',
1235
-		'&amp;',
1236
-		$u
1237
-	);
1232
+    return preg_replace(
1233
+        '/&(?![a-z]{0,4}\w{2,3};|#x?[0-9a-f]{2,6};)/i',
1234
+        '&amp;',
1235
+        $u
1236
+    );
1238 1237
 }
1239 1238
 
1240 1239
 
@@ -1257,27 +1256,27 @@  discard block
 block discarded – undo
1257 1256
  *     Balise HTML `<script>` et son contenu
1258 1257
  **/
1259 1258
 function http_script($script, $src = '', $noscript = '') {
1260
-	static $done = [];
1259
+    static $done = [];
1261 1260
 
1262
-	if ($src && !isset($done[$src])) {
1263
-		$done[$src] = true;
1264
-		$src = find_in_path($src, _JAVASCRIPT);
1265
-		$src = " src='$src'";
1266
-	} else {
1267
-		$src = '';
1268
-	}
1269
-	if ($script) {
1270
-		$script = ("/*<![CDATA[*/\n" .
1271
-			preg_replace(',</([^>]*)>,', '<\/\1>', $script) .
1272
-			'/*]]>*/');
1273
-	}
1274
-	if ($noscript) {
1275
-		$noscript = "<noscript>\n\t$noscript\n</noscript>\n";
1276
-	}
1261
+    if ($src && !isset($done[$src])) {
1262
+        $done[$src] = true;
1263
+        $src = find_in_path($src, _JAVASCRIPT);
1264
+        $src = " src='$src'";
1265
+    } else {
1266
+        $src = '';
1267
+    }
1268
+    if ($script) {
1269
+        $script = ("/*<![CDATA[*/\n" .
1270
+            preg_replace(',</([^>]*)>,', '<\/\1>', $script) .
1271
+            '/*]]>*/');
1272
+    }
1273
+    if ($noscript) {
1274
+        $noscript = "<noscript>\n\t$noscript\n</noscript>\n";
1275
+    }
1277 1276
 
1278
-	return ($src or $script or $noscript)
1279
-		? "<script type='text/javascript'$src>$script</script>$noscript"
1280
-		: '';
1277
+    return ($src or $script or $noscript)
1278
+        ? "<script type='text/javascript'$src>$script</script>$noscript"
1279
+        : '';
1281 1280
 }
1282 1281
 
1283 1282
 
@@ -1312,7 +1311,7 @@  discard block
 block discarded – undo
1312 1311
  *     texte échappé
1313 1312
  **/
1314 1313
 function texte_script(string $texte): string {
1315
-	return str_replace('\'', '\\\'', str_replace('\\', '\\\\', $texte));
1314
+    return str_replace('\'', '\\\'', str_replace('\\', '\\\\', $texte));
1316 1315
 }
1317 1316
 
1318 1317
 
@@ -1349,68 +1348,68 @@  discard block
 block discarded – undo
1349 1348
  *     Liste des chemins, par ordre de priorité.
1350 1349
  **/
1351 1350
 function _chemin($dir_path = null) {
1352
-	static $path_base = null;
1353
-	static $path_full = null;
1354
-	if ($path_base == null) {
1355
-		// Chemin standard depuis l'espace public
1356
-		$path = defined('_SPIP_PATH') ? _SPIP_PATH :
1357
-			_DIR_RACINE . ':' .
1358
-			_DIR_RACINE . 'squelettes-dist/:' .
1359
-			_DIR_RACINE . 'prive/:' .
1360
-			_DIR_RESTREINT;
1361
-		// Ajouter squelettes/
1362
-		if (@is_dir(_DIR_RACINE . 'squelettes')) {
1363
-			$path = _DIR_RACINE . 'squelettes/:' . $path;
1364
-		}
1365
-		foreach (explode(':', $path) as $dir) {
1366
-			if (strlen($dir) and substr($dir, -1) != '/') {
1367
-				$dir .= '/';
1368
-			}
1369
-			$path_base[] = $dir;
1370
-		}
1371
-		$path_full = $path_base;
1372
-		// Et le(s) dossier(s) des squelettes nommes
1373
-		if (strlen($GLOBALS['dossier_squelettes'])) {
1374
-			foreach (array_reverse(explode(':', $GLOBALS['dossier_squelettes'])) as $d) {
1375
-				array_unshift($path_full, ($d[0] == '/' ? '' : _DIR_RACINE) . $d . '/');
1376
-			}
1377
-		}
1378
-		$GLOBALS['path_sig'] = md5(serialize($path_full));
1379
-	}
1380
-	if ($dir_path === null) {
1381
-		return $path_full;
1382
-	}
1383
-
1384
-	if (is_array($dir_path) or strlen($dir_path)) {
1385
-		$tete = '';
1386
-		if (reset($path_base) == _DIR_RACINE . 'squelettes/') {
1387
-			$tete = array_shift($path_base);
1388
-		}
1389
-		$dirs = (is_array($dir_path) ? $dir_path : explode(':', $dir_path));
1390
-		$dirs = array_reverse($dirs);
1391
-		foreach ($dirs as $dir_path) {
1392
-			if (substr($dir_path, -1) != '/') {
1393
-				$dir_path .= '/';
1394
-			}
1395
-			if (!in_array($dir_path, $path_base)) {
1396
-				array_unshift($path_base, $dir_path);
1397
-			}
1398
-		}
1399
-		if (strlen($tete)) {
1400
-			array_unshift($path_base, $tete);
1401
-		}
1402
-	}
1403
-	$path_full = $path_base;
1404
-	// Et le(s) dossier(s) des squelettes nommes
1405
-	if (strlen($GLOBALS['dossier_squelettes'])) {
1406
-		foreach (array_reverse(explode(':', $GLOBALS['dossier_squelettes'])) as $d) {
1407
-			array_unshift($path_full, ((isset($d[0]) and $d[0] == '/') ? '' : _DIR_RACINE) . $d . '/');
1408
-		}
1409
-	}
1410
-
1411
-	$GLOBALS['path_sig'] = md5(serialize($path_full));
1412
-
1413
-	return $path_full;
1351
+    static $path_base = null;
1352
+    static $path_full = null;
1353
+    if ($path_base == null) {
1354
+        // Chemin standard depuis l'espace public
1355
+        $path = defined('_SPIP_PATH') ? _SPIP_PATH :
1356
+            _DIR_RACINE . ':' .
1357
+            _DIR_RACINE . 'squelettes-dist/:' .
1358
+            _DIR_RACINE . 'prive/:' .
1359
+            _DIR_RESTREINT;
1360
+        // Ajouter squelettes/
1361
+        if (@is_dir(_DIR_RACINE . 'squelettes')) {
1362
+            $path = _DIR_RACINE . 'squelettes/:' . $path;
1363
+        }
1364
+        foreach (explode(':', $path) as $dir) {
1365
+            if (strlen($dir) and substr($dir, -1) != '/') {
1366
+                $dir .= '/';
1367
+            }
1368
+            $path_base[] = $dir;
1369
+        }
1370
+        $path_full = $path_base;
1371
+        // Et le(s) dossier(s) des squelettes nommes
1372
+        if (strlen($GLOBALS['dossier_squelettes'])) {
1373
+            foreach (array_reverse(explode(':', $GLOBALS['dossier_squelettes'])) as $d) {
1374
+                array_unshift($path_full, ($d[0] == '/' ? '' : _DIR_RACINE) . $d . '/');
1375
+            }
1376
+        }
1377
+        $GLOBALS['path_sig'] = md5(serialize($path_full));
1378
+    }
1379
+    if ($dir_path === null) {
1380
+        return $path_full;
1381
+    }
1382
+
1383
+    if (is_array($dir_path) or strlen($dir_path)) {
1384
+        $tete = '';
1385
+        if (reset($path_base) == _DIR_RACINE . 'squelettes/') {
1386
+            $tete = array_shift($path_base);
1387
+        }
1388
+        $dirs = (is_array($dir_path) ? $dir_path : explode(':', $dir_path));
1389
+        $dirs = array_reverse($dirs);
1390
+        foreach ($dirs as $dir_path) {
1391
+            if (substr($dir_path, -1) != '/') {
1392
+                $dir_path .= '/';
1393
+            }
1394
+            if (!in_array($dir_path, $path_base)) {
1395
+                array_unshift($path_base, $dir_path);
1396
+            }
1397
+        }
1398
+        if (strlen($tete)) {
1399
+            array_unshift($path_base, $tete);
1400
+        }
1401
+    }
1402
+    $path_full = $path_base;
1403
+    // Et le(s) dossier(s) des squelettes nommes
1404
+    if (strlen($GLOBALS['dossier_squelettes'])) {
1405
+        foreach (array_reverse(explode(':', $GLOBALS['dossier_squelettes'])) as $d) {
1406
+            array_unshift($path_full, ((isset($d[0]) and $d[0] == '/') ? '' : _DIR_RACINE) . $d . '/');
1407
+        }
1408
+    }
1409
+
1410
+    $GLOBALS['path_sig'] = md5(serialize($path_full));
1411
+
1412
+    return $path_full;
1414 1413
 }
1415 1414
 
1416 1415
 /**
@@ -1423,17 +1422,17 @@  discard block
 block discarded – undo
1423 1422
  * @return array Liste de chemins
1424 1423
  **/
1425 1424
 function creer_chemin() {
1426
-	$path_a = _chemin();
1427
-	static $c = '';
1425
+    $path_a = _chemin();
1426
+    static $c = '';
1428 1427
 
1429
-	// on calcule le chemin si le dossier skel a change
1430
-	if ($c != $GLOBALS['dossier_squelettes']) {
1431
-		// assurer le non plantage lors de la montee de version :
1432
-		$c = $GLOBALS['dossier_squelettes'];
1433
-		$path_a = _chemin(''); // forcer un recalcul du chemin
1434
-	}
1428
+    // on calcule le chemin si le dossier skel a change
1429
+    if ($c != $GLOBALS['dossier_squelettes']) {
1430
+        // assurer le non plantage lors de la montee de version :
1431
+        $c = $GLOBALS['dossier_squelettes'];
1432
+        $path_a = _chemin(''); // forcer un recalcul du chemin
1433
+    }
1435 1434
 
1436
-	return $path_a;
1435
+    return $path_a;
1437 1436
 }
1438 1437
 
1439 1438
 
@@ -1445,61 +1444,61 @@  discard block
 block discarded – undo
1445 1444
  * @return string[] Nom des thèmes.
1446 1445
  */
1447 1446
 function lister_themes_prives(): array {
1448
-	static $themes = null;
1449
-	if (is_null($themes)) {
1450
-		// si pas encore definie
1451
-		if (!defined('_SPIP_THEME_PRIVE')) {
1452
-			define('_SPIP_THEME_PRIVE', 'spip');
1453
-		}
1454
-		$themes = [_SPIP_THEME_PRIVE];
1455
-		// Lors d'une installation neuve, prefs n'est pas definie ; sinon, c'est un tableau sérialisé
1456
-		// FIXME: Aussitôt après une demande d'inscription, $prefs vaut une chaine statut_tmp;
1457
-		$prefs = $GLOBALS['visiteur_session']['prefs'] ?? [];
1458
-		if (is_string($prefs) and (stripos($prefs, 'a:') === 0)) {
1459
-			$prefs = unserialize($prefs);
1460
-		} else {
1461
-			$prefs = [];
1462
-		}
1463
-
1464
-		$theme = $prefs['theme'] ?? $GLOBALS['theme_prive_defaut'] ?? null;
1465
-		if ($theme and $theme !== _SPIP_THEME_PRIVE) {
1466
-			// placer le theme choisi en tete
1467
-			array_unshift($themes, $theme);
1468
-		}
1469
-	}
1470
-
1471
-	return $themes;
1447
+    static $themes = null;
1448
+    if (is_null($themes)) {
1449
+        // si pas encore definie
1450
+        if (!defined('_SPIP_THEME_PRIVE')) {
1451
+            define('_SPIP_THEME_PRIVE', 'spip');
1452
+        }
1453
+        $themes = [_SPIP_THEME_PRIVE];
1454
+        // Lors d'une installation neuve, prefs n'est pas definie ; sinon, c'est un tableau sérialisé
1455
+        // FIXME: Aussitôt après une demande d'inscription, $prefs vaut une chaine statut_tmp;
1456
+        $prefs = $GLOBALS['visiteur_session']['prefs'] ?? [];
1457
+        if (is_string($prefs) and (stripos($prefs, 'a:') === 0)) {
1458
+            $prefs = unserialize($prefs);
1459
+        } else {
1460
+            $prefs = [];
1461
+        }
1462
+
1463
+        $theme = $prefs['theme'] ?? $GLOBALS['theme_prive_defaut'] ?? null;
1464
+        if ($theme and $theme !== _SPIP_THEME_PRIVE) {
1465
+            // placer le theme choisi en tete
1466
+            array_unshift($themes, $theme);
1467
+        }
1468
+    }
1469
+
1470
+    return $themes;
1472 1471
 }
1473 1472
 
1474 1473
 function find_in_theme($file, $subdir = '', $include = false) {
1475
-	static $themefiles = [];
1476
-	if (isset($themefiles["$subdir$file"])) {
1477
-		return $themefiles["$subdir$file"];
1478
-	}
1479
-	// on peut fournir une icone generique -xx.svg qui fera le job dans toutes les tailles, et qui est prioritaire sur le png
1480
-	// si il y a un .svg a la bonne taille (-16.svg) a cote, on l'utilise en remplacement du -16.png
1481
-	if (
1482
-		preg_match(',-(\d+)[.](png|gif|svg)$,', $file, $m)
1483
-		and $file_svg_generique = substr($file, 0, -strlen($m[0])) . '-xx.svg'
1484
-		and $f = find_in_theme("$file_svg_generique")
1485
-	) {
1486
-		if ($fsize = substr($f, 0, -6) . $m[1] . '.svg' and file_exists($fsize)) {
1487
-			return $themefiles["$subdir$file"] = $fsize;
1488
-		}
1489
-		else {
1490
-			return $themefiles["$subdir$file"] = "$f?" . $m[1] . 'px';
1491
-		}
1492
-	}
1493
-
1494
-	$themes = lister_themes_prives();
1495
-	foreach ($themes as $theme) {
1496
-		if ($f = find_in_path($file, "prive/themes/$theme/$subdir", $include)) {
1497
-			return $themefiles["$subdir$file"] = $f;
1498
-		}
1499
-	}
1500
-	spip_log("$file introuvable dans le theme prive " . reset($themes), 'theme');
1501
-
1502
-	return $themefiles["$subdir$file"] = '';
1474
+    static $themefiles = [];
1475
+    if (isset($themefiles["$subdir$file"])) {
1476
+        return $themefiles["$subdir$file"];
1477
+    }
1478
+    // on peut fournir une icone generique -xx.svg qui fera le job dans toutes les tailles, et qui est prioritaire sur le png
1479
+    // si il y a un .svg a la bonne taille (-16.svg) a cote, on l'utilise en remplacement du -16.png
1480
+    if (
1481
+        preg_match(',-(\d+)[.](png|gif|svg)$,', $file, $m)
1482
+        and $file_svg_generique = substr($file, 0, -strlen($m[0])) . '-xx.svg'
1483
+        and $f = find_in_theme("$file_svg_generique")
1484
+    ) {
1485
+        if ($fsize = substr($f, 0, -6) . $m[1] . '.svg' and file_exists($fsize)) {
1486
+            return $themefiles["$subdir$file"] = $fsize;
1487
+        }
1488
+        else {
1489
+            return $themefiles["$subdir$file"] = "$f?" . $m[1] . 'px';
1490
+        }
1491
+    }
1492
+
1493
+    $themes = lister_themes_prives();
1494
+    foreach ($themes as $theme) {
1495
+        if ($f = find_in_path($file, "prive/themes/$theme/$subdir", $include)) {
1496
+            return $themefiles["$subdir$file"] = $f;
1497
+        }
1498
+    }
1499
+    spip_log("$file introuvable dans le theme prive " . reset($themes), 'theme');
1500
+
1501
+    return $themefiles["$subdir$file"] = '';
1503 1502
 }
1504 1503
 
1505 1504
 
@@ -1523,31 +1522,31 @@  discard block
 block discarded – undo
1523 1522
  *     sinon chaîne vide.
1524 1523
  **/
1525 1524
 function chemin_image($icone) {
1526
-	static $icone_renommer;
1527
-	if ($p = strpos($icone, '?')) {
1528
-		$icone = substr($icone, 0, $p);
1529
-	}
1530
-	// gerer le cas d'un double appel en evitant de refaire le travail inutilement
1531
-	if (strpos($icone, '/') !== false and file_exists($icone)) {
1532
-		return $icone;
1533
-	}
1534
-
1535
-	// si c'est un nom d'image complet (article-24.png) essayer de le renvoyer direct
1536
-	if (preg_match(',[.](png|gif|jpg|webp|svg)$,', $icone) and $f = find_in_theme("images/$icone")) {
1537
-		return $f;
1538
-	}
1539
-	// sinon passer par le module de renommage
1540
-	if (is_null($icone_renommer)) {
1541
-		$icone_renommer = charger_fonction('icone_renommer', 'inc', true);
1542
-	}
1543
-	if ($icone_renommer) {
1544
-		[$icone, $fonction] = $icone_renommer($icone, '');
1545
-		if (file_exists($icone)) {
1546
-			return $icone;
1547
-		}
1548
-	}
1549
-
1550
-	return find_in_path($icone, _NOM_IMG_PACK);
1525
+    static $icone_renommer;
1526
+    if ($p = strpos($icone, '?')) {
1527
+        $icone = substr($icone, 0, $p);
1528
+    }
1529
+    // gerer le cas d'un double appel en evitant de refaire le travail inutilement
1530
+    if (strpos($icone, '/') !== false and file_exists($icone)) {
1531
+        return $icone;
1532
+    }
1533
+
1534
+    // si c'est un nom d'image complet (article-24.png) essayer de le renvoyer direct
1535
+    if (preg_match(',[.](png|gif|jpg|webp|svg)$,', $icone) and $f = find_in_theme("images/$icone")) {
1536
+        return $f;
1537
+    }
1538
+    // sinon passer par le module de renommage
1539
+    if (is_null($icone_renommer)) {
1540
+        $icone_renommer = charger_fonction('icone_renommer', 'inc', true);
1541
+    }
1542
+    if ($icone_renommer) {
1543
+        [$icone, $fonction] = $icone_renommer($icone, '');
1544
+        if (file_exists($icone)) {
1545
+            return $icone;
1546
+        }
1547
+    }
1548
+
1549
+    return find_in_path($icone, _NOM_IMG_PACK);
1551 1550
 }
1552 1551
 
1553 1552
 //
@@ -1585,128 +1584,128 @@  discard block
 block discarded – undo
1585 1584
  *     - false : fichier introuvable
1586 1585
  **/
1587 1586
 function find_in_path($file, $dirname = '', $include = false) {
1588
-	static $dirs = [];
1589
-	static $inc = []; # cf https://git.spip.net/spip/spip/commit/42e4e028e38c839121efaee84308d08aee307eec
1590
-	static $c = '';
1591
-
1592
-	if (!$file and !strlen($file)) {
1593
-		return false;
1594
-	}
1595
-
1596
-	// on calcule le chemin si le dossier skel a change
1597
-	if ($c != $GLOBALS['dossier_squelettes']) {
1598
-		// assurer le non plantage lors de la montee de version :
1599
-		$c = $GLOBALS['dossier_squelettes'];
1600
-		creer_chemin(); // forcer un recalcul du chemin et la mise a jour de path_sig
1601
-	}
1602
-
1603
-	if (isset($GLOBALS['path_files'][$GLOBALS['path_sig']][$dirname][$file])) {
1604
-		if (!$GLOBALS['path_files'][$GLOBALS['path_sig']][$dirname][$file]) {
1605
-			return false;
1606
-		}
1607
-		if ($include and !isset($inc[$dirname][$file])) {
1608
-			include_once _ROOT_CWD . $GLOBALS['path_files'][$GLOBALS['path_sig']][$dirname][$file];
1609
-			$inc[$dirname][$file] = $inc[''][$dirname . $file] = true;
1610
-		}
1611
-
1612
-		return $GLOBALS['path_files'][$GLOBALS['path_sig']][$dirname][$file];
1613
-	}
1614
-
1615
-	$a = strrpos($file, '/');
1616
-	if ($a !== false) {
1617
-		$dirname .= substr($file, 0, ++$a);
1618
-		$file = substr($file, $a);
1619
-	}
1620
-
1621
-	foreach (creer_chemin() as $dir) {
1622
-		if (!isset($dirs[$a = $dir . $dirname])) {
1623
-			$dirs[$a] = (is_dir(_ROOT_CWD . $a) || !$a);
1624
-		}
1625
-		if ($dirs[$a]) {
1626
-			if (file_exists(_ROOT_CWD . ($a .= $file))) {
1627
-				if ($include and !isset($inc[$dirname][$file])) {
1628
-					include_once _ROOT_CWD . $a;
1629
-					$inc[$dirname][$file] = $inc[''][$dirname . $file] = true;
1630
-				}
1631
-				if (!defined('_SAUVER_CHEMIN')) {
1632
-					// si le chemin n'a pas encore ete charge, ne pas lever le flag, ne pas cacher
1633
-					if (is_null($GLOBALS['path_files'])) {
1634
-						return $a;
1635
-					}
1636
-					define('_SAUVER_CHEMIN', true);
1637
-				}
1638
-
1639
-				return $GLOBALS['path_files'][$GLOBALS['path_sig']][$dirname][$file] = $GLOBALS['path_files'][$GLOBALS['path_sig']][''][$dirname . $file] = $a;
1640
-			}
1641
-		}
1642
-	}
1643
-
1644
-	if ($include) {
1645
-		spip_log("include_spip $dirname$file non trouve");
1646
-		if ($include === 'required') {
1647
-			echo '<pre>',
1648
-			'<strong>Erreur Fatale</strong><br />';
1649
-			if (function_exists('debug_print_backtrace')) {
1650
-				debug_print_backtrace();
1651
-			}
1652
-			echo '</pre>';
1653
-			die("Erreur interne: ne peut inclure $dirname$file");
1654
-		}
1655
-	}
1656
-
1657
-	if (!defined('_SAUVER_CHEMIN')) {
1658
-		// si le chemin n'a pas encore ete charge, ne pas lever le flag, ne pas cacher
1659
-		if (is_null($GLOBALS['path_files'])) {
1660
-			return false;
1661
-		}
1662
-		define('_SAUVER_CHEMIN', true);
1663
-	}
1664
-
1665
-	return $GLOBALS['path_files'][$GLOBALS['path_sig']][$dirname][$file] = $GLOBALS['path_files'][$GLOBALS['path_sig']][''][$dirname . $file] = false;
1587
+    static $dirs = [];
1588
+    static $inc = []; # cf https://git.spip.net/spip/spip/commit/42e4e028e38c839121efaee84308d08aee307eec
1589
+    static $c = '';
1590
+
1591
+    if (!$file and !strlen($file)) {
1592
+        return false;
1593
+    }
1594
+
1595
+    // on calcule le chemin si le dossier skel a change
1596
+    if ($c != $GLOBALS['dossier_squelettes']) {
1597
+        // assurer le non plantage lors de la montee de version :
1598
+        $c = $GLOBALS['dossier_squelettes'];
1599
+        creer_chemin(); // forcer un recalcul du chemin et la mise a jour de path_sig
1600
+    }
1601
+
1602
+    if (isset($GLOBALS['path_files'][$GLOBALS['path_sig']][$dirname][$file])) {
1603
+        if (!$GLOBALS['path_files'][$GLOBALS['path_sig']][$dirname][$file]) {
1604
+            return false;
1605
+        }
1606
+        if ($include and !isset($inc[$dirname][$file])) {
1607
+            include_once _ROOT_CWD . $GLOBALS['path_files'][$GLOBALS['path_sig']][$dirname][$file];
1608
+            $inc[$dirname][$file] = $inc[''][$dirname . $file] = true;
1609
+        }
1610
+
1611
+        return $GLOBALS['path_files'][$GLOBALS['path_sig']][$dirname][$file];
1612
+    }
1613
+
1614
+    $a = strrpos($file, '/');
1615
+    if ($a !== false) {
1616
+        $dirname .= substr($file, 0, ++$a);
1617
+        $file = substr($file, $a);
1618
+    }
1619
+
1620
+    foreach (creer_chemin() as $dir) {
1621
+        if (!isset($dirs[$a = $dir . $dirname])) {
1622
+            $dirs[$a] = (is_dir(_ROOT_CWD . $a) || !$a);
1623
+        }
1624
+        if ($dirs[$a]) {
1625
+            if (file_exists(_ROOT_CWD . ($a .= $file))) {
1626
+                if ($include and !isset($inc[$dirname][$file])) {
1627
+                    include_once _ROOT_CWD . $a;
1628
+                    $inc[$dirname][$file] = $inc[''][$dirname . $file] = true;
1629
+                }
1630
+                if (!defined('_SAUVER_CHEMIN')) {
1631
+                    // si le chemin n'a pas encore ete charge, ne pas lever le flag, ne pas cacher
1632
+                    if (is_null($GLOBALS['path_files'])) {
1633
+                        return $a;
1634
+                    }
1635
+                    define('_SAUVER_CHEMIN', true);
1636
+                }
1637
+
1638
+                return $GLOBALS['path_files'][$GLOBALS['path_sig']][$dirname][$file] = $GLOBALS['path_files'][$GLOBALS['path_sig']][''][$dirname . $file] = $a;
1639
+            }
1640
+        }
1641
+    }
1642
+
1643
+    if ($include) {
1644
+        spip_log("include_spip $dirname$file non trouve");
1645
+        if ($include === 'required') {
1646
+            echo '<pre>',
1647
+            '<strong>Erreur Fatale</strong><br />';
1648
+            if (function_exists('debug_print_backtrace')) {
1649
+                debug_print_backtrace();
1650
+            }
1651
+            echo '</pre>';
1652
+            die("Erreur interne: ne peut inclure $dirname$file");
1653
+        }
1654
+    }
1655
+
1656
+    if (!defined('_SAUVER_CHEMIN')) {
1657
+        // si le chemin n'a pas encore ete charge, ne pas lever le flag, ne pas cacher
1658
+        if (is_null($GLOBALS['path_files'])) {
1659
+            return false;
1660
+        }
1661
+        define('_SAUVER_CHEMIN', true);
1662
+    }
1663
+
1664
+    return $GLOBALS['path_files'][$GLOBALS['path_sig']][$dirname][$file] = $GLOBALS['path_files'][$GLOBALS['path_sig']][''][$dirname . $file] = false;
1666 1665
 }
1667 1666
 
1668 1667
 function clear_path_cache() {
1669
-	$GLOBALS['path_files'] = [];
1670
-	spip_unlink(_CACHE_CHEMIN);
1668
+    $GLOBALS['path_files'] = [];
1669
+    spip_unlink(_CACHE_CHEMIN);
1671 1670
 }
1672 1671
 
1673 1672
 function load_path_cache() {
1674
-	// charger le path des plugins
1675
-	if (@is_readable(_CACHE_PLUGINS_PATH)) {
1676
-		include_once(_CACHE_PLUGINS_PATH);
1677
-	}
1678
-	$GLOBALS['path_files'] = [];
1679
-	// si le visiteur est admin,
1680
-	// on ne recharge pas le cache pour forcer sa mise a jour
1681
-	if (
1682
-		// la session n'est pas encore chargee a ce moment, on ne peut donc pas s'y fier
1683
-		//AND (!isset($GLOBALS['visiteur_session']['statut']) OR $GLOBALS['visiteur_session']['statut']!='0minirezo')
1684
-		// utiliser le cookie est un pis aller qui marche 'en general'
1685
-		// on blinde par un second test au moment de la lecture de la session
1686
-		// !isset($_COOKIE[$GLOBALS['cookie_prefix'].'_admin'])
1687
-		// et en ignorant ce cache en cas de recalcul explicite
1688
-		!_request('var_mode')
1689
-	) {
1690
-		// on essaye de lire directement sans verrou pour aller plus vite
1691
-		if ($contenu = spip_file_get_contents(_CACHE_CHEMIN)) {
1692
-			// mais si semble corrompu on relit avec un verrou
1693
-			if (!$GLOBALS['path_files'] = unserialize($contenu)) {
1694
-				lire_fichier(_CACHE_CHEMIN, $contenu);
1695
-				if (!$GLOBALS['path_files'] = unserialize($contenu)) {
1696
-					$GLOBALS['path_files'] = [];
1697
-				}
1698
-			}
1699
-		}
1700
-	}
1673
+    // charger le path des plugins
1674
+    if (@is_readable(_CACHE_PLUGINS_PATH)) {
1675
+        include_once(_CACHE_PLUGINS_PATH);
1676
+    }
1677
+    $GLOBALS['path_files'] = [];
1678
+    // si le visiteur est admin,
1679
+    // on ne recharge pas le cache pour forcer sa mise a jour
1680
+    if (
1681
+        // la session n'est pas encore chargee a ce moment, on ne peut donc pas s'y fier
1682
+        //AND (!isset($GLOBALS['visiteur_session']['statut']) OR $GLOBALS['visiteur_session']['statut']!='0minirezo')
1683
+        // utiliser le cookie est un pis aller qui marche 'en general'
1684
+        // on blinde par un second test au moment de la lecture de la session
1685
+        // !isset($_COOKIE[$GLOBALS['cookie_prefix'].'_admin'])
1686
+        // et en ignorant ce cache en cas de recalcul explicite
1687
+        !_request('var_mode')
1688
+    ) {
1689
+        // on essaye de lire directement sans verrou pour aller plus vite
1690
+        if ($contenu = spip_file_get_contents(_CACHE_CHEMIN)) {
1691
+            // mais si semble corrompu on relit avec un verrou
1692
+            if (!$GLOBALS['path_files'] = unserialize($contenu)) {
1693
+                lire_fichier(_CACHE_CHEMIN, $contenu);
1694
+                if (!$GLOBALS['path_files'] = unserialize($contenu)) {
1695
+                    $GLOBALS['path_files'] = [];
1696
+                }
1697
+            }
1698
+        }
1699
+    }
1701 1700
 }
1702 1701
 
1703 1702
 function save_path_cache() {
1704
-	if (
1705
-		defined('_SAUVER_CHEMIN')
1706
-		and _SAUVER_CHEMIN
1707
-	) {
1708
-		ecrire_fichier(_CACHE_CHEMIN, serialize($GLOBALS['path_files']));
1709
-	}
1703
+    if (
1704
+        defined('_SAUVER_CHEMIN')
1705
+        and _SAUVER_CHEMIN
1706
+    ) {
1707
+        ecrire_fichier(_CACHE_CHEMIN, serialize($GLOBALS['path_files']));
1708
+    }
1710 1709
 }
1711 1710
 
1712 1711
 
@@ -1726,33 +1725,33 @@  discard block
 block discarded – undo
1726 1725
  * @return array
1727 1726
  */
1728 1727
 function find_all_in_path($dir, $pattern, $recurs = false) {
1729
-	$liste_fichiers = [];
1730
-	$maxfiles = 10000;
1731
-
1732
-	// cas borderline si dans mes_options on appelle redirige_par_entete qui utilise _T et charge un fichier de langue
1733
-	// on a pas encore inclus flock.php
1734
-	if (!function_exists('preg_files')) {
1735
-		include_once _ROOT_RESTREINT . 'inc/flock.php';
1736
-	}
1737
-
1738
-	// Parcourir le chemin
1739
-	foreach (creer_chemin() as $d) {
1740
-		$f = $d . $dir;
1741
-		if (@is_dir($f)) {
1742
-			$liste = preg_files($f, $pattern, $maxfiles - count($liste_fichiers), $recurs === true ? [] : $recurs);
1743
-			foreach ($liste as $chemin) {
1744
-				$nom = basename($chemin);
1745
-				// ne prendre que les fichiers pas deja trouves
1746
-				// car find_in_path prend le premier qu'il trouve,
1747
-				// les autres sont donc masques
1748
-				if (!isset($liste_fichiers[$nom])) {
1749
-					$liste_fichiers[$nom] = $chemin;
1750
-				}
1751
-			}
1752
-		}
1753
-	}
1754
-
1755
-	return $liste_fichiers;
1728
+    $liste_fichiers = [];
1729
+    $maxfiles = 10000;
1730
+
1731
+    // cas borderline si dans mes_options on appelle redirige_par_entete qui utilise _T et charge un fichier de langue
1732
+    // on a pas encore inclus flock.php
1733
+    if (!function_exists('preg_files')) {
1734
+        include_once _ROOT_RESTREINT . 'inc/flock.php';
1735
+    }
1736
+
1737
+    // Parcourir le chemin
1738
+    foreach (creer_chemin() as $d) {
1739
+        $f = $d . $dir;
1740
+        if (@is_dir($f)) {
1741
+            $liste = preg_files($f, $pattern, $maxfiles - count($liste_fichiers), $recurs === true ? [] : $recurs);
1742
+            foreach ($liste as $chemin) {
1743
+                $nom = basename($chemin);
1744
+                // ne prendre que les fichiers pas deja trouves
1745
+                // car find_in_path prend le premier qu'il trouve,
1746
+                // les autres sont donc masques
1747
+                if (!isset($liste_fichiers[$nom])) {
1748
+                    $liste_fichiers[$nom] = $chemin;
1749
+                }
1750
+            }
1751
+        }
1752
+    }
1753
+
1754
+    return $liste_fichiers;
1756 1755
 }
1757 1756
 
1758 1757
 /**
@@ -1764,17 +1763,17 @@  discard block
 block discarded – undo
1764 1763
  * @return bool
1765 1764
  */
1766 1765
 function autoriser_sans_cookie($nom, $strict = false) {
1767
-	static $autsanscookie = ['install', 'base_repair'];
1766
+    static $autsanscookie = ['install', 'base_repair'];
1768 1767
 
1769
-	if (in_array($nom, $autsanscookie)) {
1770
-		if (test_espace_prive()) {
1771
-			include_spip('base/connect_sql');
1772
-			if (!$strict or !spip_connect()) {
1773
-				return true;
1774
-			}
1775
-		}
1776
-	}
1777
-	return false;
1768
+    if (in_array($nom, $autsanscookie)) {
1769
+        if (test_espace_prive()) {
1770
+            include_spip('base/connect_sql');
1771
+            if (!$strict or !spip_connect()) {
1772
+                return true;
1773
+            }
1774
+        }
1775
+    }
1776
+    return false;
1778 1777
 }
1779 1778
 
1780 1779
 /**
@@ -1784,60 +1783,60 @@  discard block
 block discarded – undo
1784 1783
  * @return string
1785 1784
  */
1786 1785
 function charger_fonction_url(string $quoi, string $type = '') {
1787
-	if ($type === 'defaut') {
1788
-		$objet = objet_type($quoi);
1789
-		if (
1790
-			$f = charger_fonction('generer_' . $objet . '_url', 'urls', true)
1791
-			// deprecated
1792
-			or $f = charger_fonction('generer_url_' . $objet, 'urls', true)
1793
-		) {
1794
-			return $f;
1795
-		}
1796
-		return '';
1797
-	}
1798
-
1799
-	$url_type = $type;
1800
-	if (!$url_type) {
1801
-		$url_type = $GLOBALS['type_urls'] ?? $GLOBALS['meta']['type_urls'] ?? 'page'; // sinon type "page" par défaut
1802
-	}
1803
-
1804
-	// inclure le module d'url
1805
-	include_spip('urls/' . $url_type);
1806
-
1807
-	switch ($quoi) {
1808
-		case 'page':
1809
-			if (
1810
-				 function_exists($f = "urls_{$url_type}_generer_url_page")
1811
-				or function_exists($f .= '_dist')
1812
-				// ou une fonction custom utilisateur independante du type d'url
1813
-				or function_exists($f = 'generer_url_page')
1814
-				or function_exists($f .= '_dist')
1815
-			) {
1816
-				return $f;
1817
-			}
1818
-			// pas de compat ancienne version ici, c'est une nouvelle feature
1819
-			return '';
1820
-		case 'objet':
1821
-		case 'decoder':
1822
-		default:
1823
-			$fquoi = ($quoi === 'objet' ? 'generer_url_objet' : 'decoder_url');
1824
-			if (
1825
-				function_exists($f = "urls_{$url_type}_{$fquoi}")
1826
-				or function_exists($f .= '_dist')
1827
-			) {
1828
-				return $f;
1829
-			}
1830
-			// est-ce qu'on a une ancienne fonction urls_xxx_dist() ?
1831
-			// c'est un ancien module d'url, on appelle l'ancienne fonction qui fait tout
1832
-			if ($f = charger_fonction($url_type, 'urls', true)) {
1833
-				return $f;
1834
-			}
1835
-			// sinon on se rabat sur les urls page si ce n'est pas un type demande explicitement
1836
-			if (!$type and $url_type !== 'page') {
1837
-				return charger_fonction_url($quoi, 'page');
1838
-			}
1839
-			return '';
1840
-	}
1786
+    if ($type === 'defaut') {
1787
+        $objet = objet_type($quoi);
1788
+        if (
1789
+            $f = charger_fonction('generer_' . $objet . '_url', 'urls', true)
1790
+            // deprecated
1791
+            or $f = charger_fonction('generer_url_' . $objet, 'urls', true)
1792
+        ) {
1793
+            return $f;
1794
+        }
1795
+        return '';
1796
+    }
1797
+
1798
+    $url_type = $type;
1799
+    if (!$url_type) {
1800
+        $url_type = $GLOBALS['type_urls'] ?? $GLOBALS['meta']['type_urls'] ?? 'page'; // sinon type "page" par défaut
1801
+    }
1802
+
1803
+    // inclure le module d'url
1804
+    include_spip('urls/' . $url_type);
1805
+
1806
+    switch ($quoi) {
1807
+        case 'page':
1808
+            if (
1809
+                    function_exists($f = "urls_{$url_type}_generer_url_page")
1810
+                or function_exists($f .= '_dist')
1811
+                // ou une fonction custom utilisateur independante du type d'url
1812
+                or function_exists($f = 'generer_url_page')
1813
+                or function_exists($f .= '_dist')
1814
+            ) {
1815
+                return $f;
1816
+            }
1817
+            // pas de compat ancienne version ici, c'est une nouvelle feature
1818
+            return '';
1819
+        case 'objet':
1820
+        case 'decoder':
1821
+        default:
1822
+            $fquoi = ($quoi === 'objet' ? 'generer_url_objet' : 'decoder_url');
1823
+            if (
1824
+                function_exists($f = "urls_{$url_type}_{$fquoi}")
1825
+                or function_exists($f .= '_dist')
1826
+            ) {
1827
+                return $f;
1828
+            }
1829
+            // est-ce qu'on a une ancienne fonction urls_xxx_dist() ?
1830
+            // c'est un ancien module d'url, on appelle l'ancienne fonction qui fait tout
1831
+            if ($f = charger_fonction($url_type, 'urls', true)) {
1832
+                return $f;
1833
+            }
1834
+            // sinon on se rabat sur les urls page si ce n'est pas un type demande explicitement
1835
+            if (!$type and $url_type !== 'page') {
1836
+                return charger_fonction_url($quoi, 'page');
1837
+            }
1838
+            return '';
1839
+    }
1841 1840
 }
1842 1841
 
1843 1842
 
@@ -1863,48 +1862,48 @@  discard block
 block discarded – undo
1863 1862
  *   url codee ou fonction de decodage
1864 1863
  */
1865 1864
 function generer_objet_url($id, string $entite, string $args = '', string $ancre = '', ?bool $public = null, string $type = '', string $connect = ''): string {
1866
-	if ($public === null) {
1867
-		$public = !test_espace_prive();
1868
-	}
1869
-	$id = intval($id);
1870
-	$entite = objet_type($entite); // cas particulier d'appels sur objet/id_objet...
1871
-
1872
-	if (!$public) {
1873
-		if (!$entite) {
1874
-			return '';
1875
-		}
1876
-		if (!function_exists('generer_objet_url_ecrire')) {
1877
-			include_spip('inc/urls');
1878
-		}
1879
-		$res = generer_objet_url_ecrire($id, $entite, $args, $ancre, false, $connect);
1880
-	} else {
1881
-		$f = charger_fonction_url('objet', $type ?? '');
1882
-
1883
-		// @deprecated si $entite='', on veut la fonction de passage URL ==> id
1884
-		// @see charger_fonction_url
1885
-		if (!$entite) {
1886
-			return $f;
1887
-		}
1888
-
1889
-		// mais d'abord il faut tester le cas des urls sur une
1890
-		// base distante
1891
-		if (
1892
-			$connect
1893
-			and $g = charger_fonction('connect', 'urls', true)
1894
-		) {
1895
-			$f = $g;
1896
-		}
1897
-
1898
-		$res = $f(intval($id), $entite, $args ?: '', $ancre ?: '', $connect);
1899
-	}
1900
-	if ($res) {
1901
-		return $res;
1902
-	}
1903
-
1904
-	// On a ete gentil mais la ....
1905
-	spip_log("generer_objet_url: entite $entite ($f) inconnue $type $public $connect", _LOG_ERREUR);
1906
-
1907
-	return '';
1865
+    if ($public === null) {
1866
+        $public = !test_espace_prive();
1867
+    }
1868
+    $id = intval($id);
1869
+    $entite = objet_type($entite); // cas particulier d'appels sur objet/id_objet...
1870
+
1871
+    if (!$public) {
1872
+        if (!$entite) {
1873
+            return '';
1874
+        }
1875
+        if (!function_exists('generer_objet_url_ecrire')) {
1876
+            include_spip('inc/urls');
1877
+        }
1878
+        $res = generer_objet_url_ecrire($id, $entite, $args, $ancre, false, $connect);
1879
+    } else {
1880
+        $f = charger_fonction_url('objet', $type ?? '');
1881
+
1882
+        // @deprecated si $entite='', on veut la fonction de passage URL ==> id
1883
+        // @see charger_fonction_url
1884
+        if (!$entite) {
1885
+            return $f;
1886
+        }
1887
+
1888
+        // mais d'abord il faut tester le cas des urls sur une
1889
+        // base distante
1890
+        if (
1891
+            $connect
1892
+            and $g = charger_fonction('connect', 'urls', true)
1893
+        ) {
1894
+            $f = $g;
1895
+        }
1896
+
1897
+        $res = $f(intval($id), $entite, $args ?: '', $ancre ?: '', $connect);
1898
+    }
1899
+    if ($res) {
1900
+        return $res;
1901
+    }
1902
+
1903
+    // On a ete gentil mais la ....
1904
+    spip_log("generer_objet_url: entite $entite ($f) inconnue $type $public $connect", _LOG_ERREUR);
1905
+
1906
+    return '';
1908 1907
 }
1909 1908
 
1910 1909
 /**
@@ -1912,10 +1911,10 @@  discard block
 block discarded – undo
1912 1911
  * @see generer_objet_url
1913 1912
  */
1914 1913
 function generer_url_entite($id = 0, $entite = '', $args = '', $ancre = '', $public = null, $type = null) {
1915
-	if ($public and is_string($public)) {
1916
-		return generer_objet_url(intval($id), $entite, $args ?: '', $ancre ?: '', true, $type ?? '', $public);
1917
-	}
1918
-	return generer_objet_url(intval($id), $entite, $args ?: '', $ancre ?: '', $public, $type ?? '');
1914
+    if ($public and is_string($public)) {
1915
+        return generer_objet_url(intval($id), $entite, $args ?: '', $ancre ?: '', true, $type ?? '', $public);
1916
+    }
1917
+    return generer_objet_url(intval($id), $entite, $args ?: '', $ancre ?: '', $public, $type ?? '');
1919 1918
 }
1920 1919
 
1921 1920
 /**
@@ -1927,19 +1926,19 @@  discard block
 block discarded – undo
1927 1926
  * @return string
1928 1927
  */
1929 1928
 function generer_objet_url_ecrire_edit($id, string $entite, string $args = '', string $ancre = ''): string {
1930
-	$id = intval($id);
1931
-	$exec = objet_info($entite, 'url_edit');
1932
-	$url = generer_url_ecrire($exec, $args);
1933
-	if (intval($id)) {
1934
-		$url = parametre_url($url, id_table_objet($entite), $id);
1935
-	} else {
1936
-		$url = parametre_url($url, 'new', 'oui');
1937
-	}
1938
-	if ($ancre) {
1939
-		$url = ancre_url($url, $ancre);
1940
-	}
1929
+    $id = intval($id);
1930
+    $exec = objet_info($entite, 'url_edit');
1931
+    $url = generer_url_ecrire($exec, $args);
1932
+    if (intval($id)) {
1933
+        $url = parametre_url($url, id_table_objet($entite), $id);
1934
+    } else {
1935
+        $url = parametre_url($url, 'new', 'oui');
1936
+    }
1937
+    if ($ancre) {
1938
+        $url = ancre_url($url, $ancre);
1939
+    }
1941 1940
 
1942
-	return $url;
1941
+    return $url;
1943 1942
 }
1944 1943
 
1945 1944
 /**
@@ -1947,18 +1946,18 @@  discard block
 block discarded – undo
1947 1946
  * @see generer_objet_url_ecrire_edit
1948 1947
  */
1949 1948
 function generer_url_ecrire_entite_edit($id, $entite, $args = '', $ancre = '') {
1950
-	return generer_objet_url_ecrire_edit(intval($id), $entite, $args, $ancre);
1949
+    return generer_objet_url_ecrire_edit(intval($id), $entite, $args, $ancre);
1951 1950
 }
1952 1951
 
1953 1952
 
1954 1953
 function urls_connect_dist($i, &$entite, $args = '', $ancre = '', $public = null) {
1955
-	include_spip('base/connect_sql');
1956
-	$id_type = id_table_objet($entite, $public);
1954
+    include_spip('base/connect_sql');
1955
+    $id_type = id_table_objet($entite, $public);
1957 1956
 
1958
-	return _DIR_RACINE . get_spip_script('./')
1959
-	. '?' . _SPIP_PAGE . "=$entite&$id_type=$i&connect=$public"
1960
-	. (!$args ? '' : "&$args")
1961
-	. (!$ancre ? '' : "#$ancre");
1957
+    return _DIR_RACINE . get_spip_script('./')
1958
+    . '?' . _SPIP_PAGE . "=$entite&$id_type=$i&connect=$public"
1959
+    . (!$args ? '' : "&$args")
1960
+    . (!$ancre ? '' : "#$ancre");
1962 1961
 }
1963 1962
 
1964 1963
 
@@ -1969,18 +1968,18 @@  discard block
 block discarded – undo
1969 1968
  * @return string
1970 1969
  */
1971 1970
 function urlencode_1738($url) {
1972
-	if (preg_match(',[^\x00-\x7E],sS', $url)) {
1973
-		$uri = '';
1974
-		for ($i = 0; $i < strlen($url); $i++) {
1975
-			if (ord($a = $url[$i]) > 127) {
1976
-				$a = rawurlencode($a);
1977
-			}
1978
-			$uri .= $a;
1979
-		}
1980
-		$url = $uri;
1981
-	}
1971
+    if (preg_match(',[^\x00-\x7E],sS', $url)) {
1972
+        $uri = '';
1973
+        for ($i = 0; $i < strlen($url); $i++) {
1974
+            if (ord($a = $url[$i]) > 127) {
1975
+                $a = rawurlencode($a);
1976
+            }
1977
+            $uri .= $a;
1978
+        }
1979
+        $url = $uri;
1980
+    }
1982 1981
 
1983
-	return quote_amp($url);
1982
+    return quote_amp($url);
1984 1983
 }
1985 1984
 
1986 1985
 /**
@@ -1996,14 +1995,14 @@  discard block
 block discarded – undo
1996 1995
  * @return string
1997 1996
  */
1998 1997
 function generer_objet_url_absolue($id = 0, string $entite = '', string $args = '', string $ancre = '', ?bool $public = null, string $type = '', string $connect = ''): string {
1999
-	$id = intval($id);
2000
-	$h = generer_objet_url($id, $entite, $args, $ancre, $public, $type, $connect);
2001
-	if (!preg_match(',^\w+:,', $h)) {
2002
-		include_spip('inc/filtres_mini');
2003
-		$h = url_absolue($h);
2004
-	}
1998
+    $id = intval($id);
1999
+    $h = generer_objet_url($id, $entite, $args, $ancre, $public, $type, $connect);
2000
+    if (!preg_match(',^\w+:,', $h)) {
2001
+        include_spip('inc/filtres_mini');
2002
+        $h = url_absolue($h);
2003
+    }
2005 2004
 
2006
-	return $h;
2005
+    return $h;
2007 2006
 }
2008 2007
 
2009 2008
 /**
@@ -2011,7 +2010,7 @@  discard block
 block discarded – undo
2011 2010
  * @see  generer_objet_url_absolue
2012 2011
  */
2013 2012
 function generer_url_entite_absolue($id = 0, $entite = '', $args = '', $ancre = '', $connect = null) {
2014
-	return generer_objet_url_absolue(intval($id), $entite, $args, $ancre, true, '', $connect ?? '');
2013
+    return generer_objet_url_absolue(intval($id), $entite, $args, $ancre, true, '', $connect ?? '');
2015 2014
 }
2016 2015
 
2017 2016
 
@@ -2027,11 +2026,11 @@  discard block
 block discarded – undo
2027 2026
  *     true si la valeur est considérée active ; false sinon.
2028 2027
  **/
2029 2028
 function test_valeur_serveur($truc) {
2030
-	if (!$truc) {
2031
-		return false;
2032
-	}
2029
+    if (!$truc) {
2030
+        return false;
2031
+    }
2033 2032
 
2034
-	return (strtolower($truc) !== 'off');
2033
+    return (strtolower($truc) !== 'off');
2035 2034
 }
2036 2035
 
2037 2036
 //
@@ -2059,89 +2058,89 @@  discard block
 block discarded – undo
2059 2058
  */
2060 2059
 function url_de_base($profondeur = null) {
2061 2060
 
2062
-	static $url = [];
2063
-	if (is_array($profondeur)) {
2064
-		return $url = $profondeur;
2065
-	}
2066
-	if ($profondeur === false) {
2067
-		return $url;
2068
-	}
2069
-
2070
-	if (is_null($profondeur)) {
2071
-		$profondeur = $GLOBALS['profondeur_url'] ?? (_DIR_RESTREINT ? 0 : 1);
2072
-	}
2073
-
2074
-	if (isset($url[$profondeur])) {
2075
-		return $url[$profondeur];
2076
-	}
2077
-
2078
-	$http = 'http';
2079
-
2080
-	if (
2081
-		isset($_SERVER['SCRIPT_URI'])
2082
-		and substr($_SERVER['SCRIPT_URI'], 0, 5) == 'https'
2083
-	) {
2084
-		$http = 'https';
2085
-	} elseif (
2086
-		isset($_SERVER['HTTPS'])
2087
-		and test_valeur_serveur($_SERVER['HTTPS'])
2088
-	) {
2089
-		$http = 'https';
2090
-	}
2091
-
2092
-	// note : HTTP_HOST contient le :port si necessaire
2093
-	if ($host = $_SERVER['HTTP_HOST'] ?? null) {
2094
-		// Filtrer $host pour proteger d'attaques d'entete HTTP
2095
-		$host = (filter_var($host, FILTER_SANITIZE_URL) ?: null);
2096
-	}
2097
-
2098
-	// si on n'a pas trouvé d'hôte du tout, en dernier recours on utilise adresse_site comme fallback
2099
-	if (is_null($host) and isset($GLOBALS['meta']['adresse_site'])) {
2100
-		$host = $GLOBALS['meta']['adresse_site'];
2101
-		if ($scheme = parse_url($host, PHP_URL_SCHEME)) {
2102
-			$http = $scheme;
2103
-			$host = str_replace("{$scheme}://", '', $host);
2104
-		}
2105
-	}
2106
-	if (
2107
-		isset($_SERVER['SERVER_PORT'])
2108
-		and $port = $_SERVER['SERVER_PORT']
2109
-		and strpos($host, ':') == false
2110
-	) {
2111
-		if (!defined('_PORT_HTTP_STANDARD')) {
2112
-			define('_PORT_HTTP_STANDARD', '80');
2113
-		}
2114
-		if (!defined('_PORT_HTTPS_STANDARD')) {
2115
-			define('_PORT_HTTPS_STANDARD', '443');
2116
-		}
2117
-		if ($http == 'http' and !in_array($port, explode(',', _PORT_HTTP_STANDARD))) {
2118
-			$host .= ":$port";
2119
-		}
2120
-		if ($http == 'https' and !in_array($port, explode(',', _PORT_HTTPS_STANDARD))) {
2121
-			$host .= ":$port";
2122
-		}
2123
-	}
2124
-
2125
-	if (!$GLOBALS['REQUEST_URI']) {
2126
-		if (isset($_SERVER['REQUEST_URI'])) {
2127
-			$GLOBALS['REQUEST_URI'] = $_SERVER['REQUEST_URI'];
2128
-		} else {
2129
-			$GLOBALS['REQUEST_URI'] = (php_sapi_name() !== 'cli') ? $_SERVER['PHP_SELF'] : '';
2130
-			if (
2131
-				!empty($_SERVER['QUERY_STRING'])
2132
-				and !strpos($_SERVER['REQUEST_URI'], '?')
2133
-			) {
2134
-				$GLOBALS['REQUEST_URI'] .= '?' . $_SERVER['QUERY_STRING'];
2135
-			}
2136
-		}
2137
-	}
2138
-
2139
-	// Et nettoyer l'url
2140
-	$GLOBALS['REQUEST_URI'] = (filter_var($GLOBALS['REQUEST_URI'], FILTER_SANITIZE_URL) ?: '');
2141
-
2142
-	$url[$profondeur] = url_de_($http, $host, $GLOBALS['REQUEST_URI'], $profondeur);
2143
-
2144
-	return $url[$profondeur];
2061
+    static $url = [];
2062
+    if (is_array($profondeur)) {
2063
+        return $url = $profondeur;
2064
+    }
2065
+    if ($profondeur === false) {
2066
+        return $url;
2067
+    }
2068
+
2069
+    if (is_null($profondeur)) {
2070
+        $profondeur = $GLOBALS['profondeur_url'] ?? (_DIR_RESTREINT ? 0 : 1);
2071
+    }
2072
+
2073
+    if (isset($url[$profondeur])) {
2074
+        return $url[$profondeur];
2075
+    }
2076
+
2077
+    $http = 'http';
2078
+
2079
+    if (
2080
+        isset($_SERVER['SCRIPT_URI'])
2081
+        and substr($_SERVER['SCRIPT_URI'], 0, 5) == 'https'
2082
+    ) {
2083
+        $http = 'https';
2084
+    } elseif (
2085
+        isset($_SERVER['HTTPS'])
2086
+        and test_valeur_serveur($_SERVER['HTTPS'])
2087
+    ) {
2088
+        $http = 'https';
2089
+    }
2090
+
2091
+    // note : HTTP_HOST contient le :port si necessaire
2092
+    if ($host = $_SERVER['HTTP_HOST'] ?? null) {
2093
+        // Filtrer $host pour proteger d'attaques d'entete HTTP
2094
+        $host = (filter_var($host, FILTER_SANITIZE_URL) ?: null);
2095
+    }
2096
+
2097
+    // si on n'a pas trouvé d'hôte du tout, en dernier recours on utilise adresse_site comme fallback
2098
+    if (is_null($host) and isset($GLOBALS['meta']['adresse_site'])) {
2099
+        $host = $GLOBALS['meta']['adresse_site'];
2100
+        if ($scheme = parse_url($host, PHP_URL_SCHEME)) {
2101
+            $http = $scheme;
2102
+            $host = str_replace("{$scheme}://", '', $host);
2103
+        }
2104
+    }
2105
+    if (
2106
+        isset($_SERVER['SERVER_PORT'])
2107
+        and $port = $_SERVER['SERVER_PORT']
2108
+        and strpos($host, ':') == false
2109
+    ) {
2110
+        if (!defined('_PORT_HTTP_STANDARD')) {
2111
+            define('_PORT_HTTP_STANDARD', '80');
2112
+        }
2113
+        if (!defined('_PORT_HTTPS_STANDARD')) {
2114
+            define('_PORT_HTTPS_STANDARD', '443');
2115
+        }
2116
+        if ($http == 'http' and !in_array($port, explode(',', _PORT_HTTP_STANDARD))) {
2117
+            $host .= ":$port";
2118
+        }
2119
+        if ($http == 'https' and !in_array($port, explode(',', _PORT_HTTPS_STANDARD))) {
2120
+            $host .= ":$port";
2121
+        }
2122
+    }
2123
+
2124
+    if (!$GLOBALS['REQUEST_URI']) {
2125
+        if (isset($_SERVER['REQUEST_URI'])) {
2126
+            $GLOBALS['REQUEST_URI'] = $_SERVER['REQUEST_URI'];
2127
+        } else {
2128
+            $GLOBALS['REQUEST_URI'] = (php_sapi_name() !== 'cli') ? $_SERVER['PHP_SELF'] : '';
2129
+            if (
2130
+                !empty($_SERVER['QUERY_STRING'])
2131
+                and !strpos($_SERVER['REQUEST_URI'], '?')
2132
+            ) {
2133
+                $GLOBALS['REQUEST_URI'] .= '?' . $_SERVER['QUERY_STRING'];
2134
+            }
2135
+        }
2136
+    }
2137
+
2138
+    // Et nettoyer l'url
2139
+    $GLOBALS['REQUEST_URI'] = (filter_var($GLOBALS['REQUEST_URI'], FILTER_SANITIZE_URL) ?: '');
2140
+
2141
+    $url[$profondeur] = url_de_($http, $host, $GLOBALS['REQUEST_URI'], $profondeur);
2142
+
2143
+    return $url[$profondeur];
2145 2144
 }
2146 2145
 
2147 2146
 /**
@@ -2154,26 +2153,26 @@  discard block
 block discarded – undo
2154 2153
  * @return string
2155 2154
  */
2156 2155
 function url_de_($http, $host, $request, $prof = 0) {
2157
-	$prof = max($prof, 0);
2156
+    $prof = max($prof, 0);
2158 2157
 
2159
-	$myself = ltrim($request, '/');
2160
-	# supprimer la chaine de GET
2161
-	[$myself] = explode('?', $myself);
2162
-	// vieux mode HTTP qui envoie après le nom de la methode l'URL compléte
2163
-	// protocole, "://", nom du serveur avant le path dans _SERVER["REQUEST_URI"]
2164
-	if (strpos($myself, '://') !== false) {
2165
-		$myself = explode('://', $myself);
2166
-		array_shift($myself);
2167
-		$myself = implode('://', $myself);
2168
-		$myself = explode('/', $myself);
2169
-		array_shift($myself);
2170
-		$myself = implode('/', $myself);
2171
-	}
2172
-	$url = join('/', array_slice(explode('/', $myself), 0, -1 - $prof)) . '/';
2158
+    $myself = ltrim($request, '/');
2159
+    # supprimer la chaine de GET
2160
+    [$myself] = explode('?', $myself);
2161
+    // vieux mode HTTP qui envoie après le nom de la methode l'URL compléte
2162
+    // protocole, "://", nom du serveur avant le path dans _SERVER["REQUEST_URI"]
2163
+    if (strpos($myself, '://') !== false) {
2164
+        $myself = explode('://', $myself);
2165
+        array_shift($myself);
2166
+        $myself = implode('://', $myself);
2167
+        $myself = explode('/', $myself);
2168
+        array_shift($myself);
2169
+        $myself = implode('/', $myself);
2170
+    }
2171
+    $url = join('/', array_slice(explode('/', $myself), 0, -1 - $prof)) . '/';
2173 2172
 
2174
-	$url = $http . '://' . rtrim($host, '/') . '/' . ltrim($url, '/');
2173
+    $url = $http . '://' . rtrim($host, '/') . '/' . ltrim($url, '/');
2175 2174
 
2176
-	return $url;
2175
+    return $url;
2177 2176
 }
2178 2177
 
2179 2178
 
@@ -2208,26 +2207,26 @@  discard block
 block discarded – undo
2208 2207
  * @return string URL
2209 2208
  **/
2210 2209
 function generer_url_ecrire(?string $script = '', $args = '', $no_entities = false, $rel = false) {
2211
-	$script ??= '';
2212
-	if (!$rel) {
2213
-		$rel = url_de_base() . _DIR_RESTREINT_ABS . _SPIP_ECRIRE_SCRIPT;
2214
-	} else {
2215
-		if (!is_string($rel)) {
2216
-			$rel = _DIR_RESTREINT ?: './' . _SPIP_ECRIRE_SCRIPT;
2217
-		}
2218
-	}
2219
-
2220
-	[$script, $ancre] = array_pad(explode('#', $script), 2, null);
2221
-	if ($script and ($script <> 'accueil' or $rel)) {
2222
-		$args = "?exec=$script" . (!$args ? '' : "&$args");
2223
-	} elseif ($args) {
2224
-		$args = "?$args";
2225
-	}
2226
-	if ($ancre) {
2227
-		$args .= "#$ancre";
2228
-	}
2229
-
2230
-	return $rel . ($no_entities ? $args : str_replace('&', '&amp;', $args));
2210
+    $script ??= '';
2211
+    if (!$rel) {
2212
+        $rel = url_de_base() . _DIR_RESTREINT_ABS . _SPIP_ECRIRE_SCRIPT;
2213
+    } else {
2214
+        if (!is_string($rel)) {
2215
+            $rel = _DIR_RESTREINT ?: './' . _SPIP_ECRIRE_SCRIPT;
2216
+        }
2217
+    }
2218
+
2219
+    [$script, $ancre] = array_pad(explode('#', $script), 2, null);
2220
+    if ($script and ($script <> 'accueil' or $rel)) {
2221
+        $args = "?exec=$script" . (!$args ? '' : "&$args");
2222
+    } elseif ($args) {
2223
+        $args = "?$args";
2224
+    }
2225
+    if ($ancre) {
2226
+        $args .= "#$ancre";
2227
+    }
2228
+
2229
+    return $rel . ($no_entities ? $args : str_replace('&', '&amp;', $args));
2231 2230
 }
2232 2231
 
2233 2232
 //
@@ -2249,15 +2248,15 @@  discard block
 block discarded – undo
2249 2248
  *     Nom du fichier (constante _SPIP_SCRIPT), sinon nom par défaut
2250 2249
  **/
2251 2250
 function get_spip_script($default = '') {
2252
-	if (!defined('_SPIP_SCRIPT')) {
2253
-		return 'spip.php';
2254
-	}
2255
-	# cas define('_SPIP_SCRIPT', '');
2256
-	if (_SPIP_SCRIPT) {
2257
-		return _SPIP_SCRIPT;
2258
-	} else {
2259
-		return $default;
2260
-	}
2251
+    if (!defined('_SPIP_SCRIPT')) {
2252
+        return 'spip.php';
2253
+    }
2254
+    # cas define('_SPIP_SCRIPT', '');
2255
+    if (_SPIP_SCRIPT) {
2256
+        return _SPIP_SCRIPT;
2257
+    } else {
2258
+        return $default;
2259
+    }
2261 2260
 }
2262 2261
 
2263 2262
 /**
@@ -2286,45 +2285,45 @@  discard block
 block discarded – undo
2286 2285
  * @return string URL
2287 2286
  **/
2288 2287
 function generer_url_public($script = '', $args = '', $no_entities = false, $rel = true, $action = '') {
2289
-	// si le script est une action (spip_pass, spip_inscription),
2290
-	// standardiser vers la nouvelle API
2291
-
2292
-	if (is_array($args)) {
2293
-		$args = http_build_query($args);
2294
-	}
2295
-
2296
-	$url = '';
2297
-	if ($f = charger_fonction_url('page')) {
2298
-		$url = $f($script, $args);
2299
-		if ($url and !$rel) {
2300
-			include_spip('inc/filtres_mini');
2301
-			$url = url_absolue($url);
2302
-		}
2303
-	}
2304
-	if (!$url) {
2305
-		if (!$action) {
2306
-			$action = get_spip_script();
2307
-		}
2308
-		if ($script) {
2309
-			$action = parametre_url($action, _SPIP_PAGE, $script, '&');
2310
-		}
2311
-		if ($args) {
2312
-			$action .= (strpos($action, '?') !== false ? '&' : '?') . $args;
2313
-		}
2314
-		// ne pas generer une url avec /./?page= en cas d'url absolue et de _SPIP_SCRIPT vide
2315
-		$url = ($rel ? _DIR_RACINE . $action : rtrim(url_de_base(), '/') . preg_replace(',^/[.]/,', '/', "/$action"));
2316
-	}
2317
-
2318
-	if (!$no_entities) {
2319
-		$url = quote_amp($url);
2320
-	}
2321
-
2322
-	return $url;
2288
+    // si le script est une action (spip_pass, spip_inscription),
2289
+    // standardiser vers la nouvelle API
2290
+
2291
+    if (is_array($args)) {
2292
+        $args = http_build_query($args);
2293
+    }
2294
+
2295
+    $url = '';
2296
+    if ($f = charger_fonction_url('page')) {
2297
+        $url = $f($script, $args);
2298
+        if ($url and !$rel) {
2299
+            include_spip('inc/filtres_mini');
2300
+            $url = url_absolue($url);
2301
+        }
2302
+    }
2303
+    if (!$url) {
2304
+        if (!$action) {
2305
+            $action = get_spip_script();
2306
+        }
2307
+        if ($script) {
2308
+            $action = parametre_url($action, _SPIP_PAGE, $script, '&');
2309
+        }
2310
+        if ($args) {
2311
+            $action .= (strpos($action, '?') !== false ? '&' : '?') . $args;
2312
+        }
2313
+        // ne pas generer une url avec /./?page= en cas d'url absolue et de _SPIP_SCRIPT vide
2314
+        $url = ($rel ? _DIR_RACINE . $action : rtrim(url_de_base(), '/') . preg_replace(',^/[.]/,', '/', "/$action"));
2315
+    }
2316
+
2317
+    if (!$no_entities) {
2318
+        $url = quote_amp($url);
2319
+    }
2320
+
2321
+    return $url;
2323 2322
 }
2324 2323
 
2325 2324
 function generer_url_prive($script, $args = '', $no_entities = false) {
2326 2325
 
2327
-	return generer_url_public($script, $args, $no_entities, false, _DIR_RESTREINT_ABS . 'prive.php');
2326
+    return generer_url_public($script, $args, $no_entities, false, _DIR_RESTREINT_ABS . 'prive.php');
2328 2327
 }
2329 2328
 
2330 2329
 // Pour les formulaires en methode POST,
@@ -2349,19 +2348,19 @@  discard block
 block discarded – undo
2349 2348
  **/
2350 2349
 function generer_form_ecrire($script, $corps, $atts = '', $submit = '') {
2351 2350
 
2352
-	$script1 = explode('&', $script);
2353
-	$script1 = reset($script1);
2351
+    $script1 = explode('&', $script);
2352
+    $script1 = reset($script1);
2354 2353
 
2355
-	return "<form action='"
2356
-	. ($script ? generer_url_ecrire($script) : '')
2357
-	. "' "
2358
-	. ($atts ?: " method='post'")
2359
-	. "><div>\n"
2360
-	. "<input type='hidden' name='exec' value='$script1' />"
2361
-	. $corps
2362
-	. (!$submit ? '' :
2363
-		("<div style='text-align: " . $GLOBALS['spip_lang_right'] . "'><input class='fondo submit btn' type='submit' value=\"" . entites_html($submit) . '" /></div>'))
2364
-	. "</div></form>\n";
2354
+    return "<form action='"
2355
+    . ($script ? generer_url_ecrire($script) : '')
2356
+    . "' "
2357
+    . ($atts ?: " method='post'")
2358
+    . "><div>\n"
2359
+    . "<input type='hidden' name='exec' value='$script1' />"
2360
+    . $corps
2361
+    . (!$submit ? '' :
2362
+        ("<div style='text-align: " . $GLOBALS['spip_lang_right'] . "'><input class='fondo submit btn' type='submit' value=\"" . entites_html($submit) . '" /></div>'))
2363
+    . "</div></form>\n";
2365 2364
 }
2366 2365
 
2367 2366
 /**
@@ -2378,22 +2377,22 @@  discard block
 block discarded – undo
2378 2377
  * @return string
2379 2378
  */
2380 2379
 function generer_form_action($script, $corps, $atts = '', $public = false) {
2381
-	// si l'on est dans l'espace prive, on garde dans l'url
2382
-	// l'exec a l'origine de l'action, qui permet de savoir si il est necessaire
2383
-	// ou non de proceder a l'authentification (cas typique de l'install par exemple)
2384
-	$h = (_DIR_RACINE and !$public)
2385
-		? generer_url_ecrire(_request('exec'))
2386
-		: generer_url_public();
2380
+    // si l'on est dans l'espace prive, on garde dans l'url
2381
+    // l'exec a l'origine de l'action, qui permet de savoir si il est necessaire
2382
+    // ou non de proceder a l'authentification (cas typique de l'install par exemple)
2383
+    $h = (_DIR_RACINE and !$public)
2384
+        ? generer_url_ecrire(_request('exec'))
2385
+        : generer_url_public();
2387 2386
 
2388
-	return "\n<form action='" .
2389
-	$h .
2390
-	"'" .
2391
-	$atts .
2392
-	">\n" .
2393
-	'<div>' .
2394
-	"\n<input type='hidden' name='action' value='$script' />" .
2395
-	$corps .
2396
-	'</div></form>';
2387
+    return "\n<form action='" .
2388
+    $h .
2389
+    "'" .
2390
+    $atts .
2391
+    ">\n" .
2392
+    '<div>' .
2393
+    "\n<input type='hidden' name='action' value='$script' />" .
2394
+    $corps .
2395
+    '</div></form>';
2397 2396
 }
2398 2397
 
2399 2398
 /**
@@ -2412,22 +2411,22 @@  discard block
 block discarded – undo
2412 2411
  *     URL
2413 2412
  */
2414 2413
 function generer_url_action($script, $args = '', $no_entities = false, $public = false) {
2415
-	// si l'on est dans l'espace prive, on garde dans l'url
2416
-	// l'exec a l'origine de l'action, qui permet de savoir si il est necessaire
2417
-	// ou non de proceder a l'authentification (cas typique de l'install par exemple)
2418
-	$url = (_DIR_RACINE and !$public)
2419
-		? generer_url_ecrire(_request('exec'))
2420
-		: generer_url_public('', '', false, false);
2421
-	$url = parametre_url($url, 'action', $script);
2422
-	if ($args) {
2423
-		$url .= quote_amp('&' . $args);
2424
-	}
2414
+    // si l'on est dans l'espace prive, on garde dans l'url
2415
+    // l'exec a l'origine de l'action, qui permet de savoir si il est necessaire
2416
+    // ou non de proceder a l'authentification (cas typique de l'install par exemple)
2417
+    $url = (_DIR_RACINE and !$public)
2418
+        ? generer_url_ecrire(_request('exec'))
2419
+        : generer_url_public('', '', false, false);
2420
+    $url = parametre_url($url, 'action', $script);
2421
+    if ($args) {
2422
+        $url .= quote_amp('&' . $args);
2423
+    }
2425 2424
 
2426
-	if ($no_entities) {
2427
-		$url = str_replace('&amp;', '&', $url);
2428
-	}
2425
+    if ($no_entities) {
2426
+        $url = str_replace('&amp;', '&', $url);
2427
+    }
2429 2428
 
2430
-	return $url;
2429
+    return $url;
2431 2430
 }
2432 2431
 
2433 2432
 
@@ -2446,23 +2445,23 @@  discard block
 block discarded – undo
2446 2445
  *     URL
2447 2446
  */
2448 2447
 function generer_url_api(string $script, string $path, string $args, bool $no_entities = false, ?bool $public = null) {
2449
-	if (is_null($public)) {
2450
-		$public = (_DIR_RACINE ? false : '');
2451
-	}
2452
-	if (substr($script, -4) !== '.api') {
2453
-		$script .= '.api';
2454
-	}
2455
-	$url =
2456
-		(($public ? _DIR_RACINE : _DIR_RESTREINT) ?: './')
2457
-	. $script . '/'
2458
-	. ($path ? trim($path, '/') : '')
2459
-	. ($args ? '?' . quote_amp($args) : '');
2448
+    if (is_null($public)) {
2449
+        $public = (_DIR_RACINE ? false : '');
2450
+    }
2451
+    if (substr($script, -4) !== '.api') {
2452
+        $script .= '.api';
2453
+    }
2454
+    $url =
2455
+        (($public ? _DIR_RACINE : _DIR_RESTREINT) ?: './')
2456
+    . $script . '/'
2457
+    . ($path ? trim($path, '/') : '')
2458
+    . ($args ? '?' . quote_amp($args) : '');
2460 2459
 
2461
-	if ($no_entities) {
2462
-		$url = str_replace('&amp;', '&', $url);
2463
-	}
2460
+    if ($no_entities) {
2461
+        $url = str_replace('&amp;', '&', $url);
2462
+    }
2464 2463
 
2465
-	return $url;
2464
+    return $url;
2466 2465
 }
2467 2466
 
2468 2467
 
@@ -2475,8 +2474,8 @@  discard block
 block discarded – undo
2475 2474
  * @param string $ta Répertoire temporaire accessible
2476 2475
  */
2477 2476
 function spip_initialisation($pi = null, $pa = null, $ti = null, $ta = null) {
2478
-	spip_initialisation_core($pi, $pa, $ti, $ta);
2479
-	spip_initialisation_suite();
2477
+    spip_initialisation_core($pi, $pa, $ti, $ta);
2478
+    spip_initialisation_suite();
2480 2479
 }
2481 2480
 
2482 2481
 /**
@@ -2496,315 +2495,315 @@  discard block
 block discarded – undo
2496 2495
  * @param string $ta Répertoire temporaire accessible
2497 2496
  */
2498 2497
 function spip_initialisation_core($pi = null, $pa = null, $ti = null, $ta = null) {
2499
-	static $too_late = 0;
2500
-	if ($too_late++) {
2501
-		return;
2502
-	}
2503
-
2504
-	// Declaration des repertoires
2505
-
2506
-	// le nom du repertoire plugins/ activables/desactivables
2507
-	if (!defined('_DIR_PLUGINS')) {
2508
-		define('_DIR_PLUGINS', _DIR_RACINE . 'plugins/');
2509
-	}
2510
-
2511
-	// le nom du repertoire des extensions/ permanentes du core, toujours actives
2512
-	if (!defined('_DIR_PLUGINS_DIST')) {
2513
-		define('_DIR_PLUGINS_DIST', _DIR_RACINE . 'plugins-dist/');
2514
-	}
2515
-
2516
-	// le nom du repertoire des librairies
2517
-	if (!defined('_DIR_LIB')) {
2518
-		define('_DIR_LIB', _DIR_RACINE . 'lib/');
2519
-	}
2520
-
2521
-	// répertoire des libs via Composer
2522
-	if (!defined('_DIR_VENDOR')) {
2523
-		define('_DIR_VENDOR', _DIR_RACINE . 'vendor/');
2524
-	}
2525
-
2526
-	if (!defined('_DIR_IMG')) {
2527
-		define('_DIR_IMG', $pa);
2528
-	}
2529
-	if (!defined('_DIR_LOGOS')) {
2530
-		define('_DIR_LOGOS', $pa);
2531
-	}
2532
-	if (!defined('_DIR_IMG_ICONES')) {
2533
-		define('_DIR_IMG_ICONES', _DIR_LOGOS . 'icones/');
2534
-	}
2535
-
2536
-	if (!defined('_DIR_DUMP')) {
2537
-		define('_DIR_DUMP', $ti . 'dump/');
2538
-	}
2539
-	if (!defined('_DIR_SESSIONS')) {
2540
-		define('_DIR_SESSIONS', $ti . 'sessions/');
2541
-	}
2542
-	if (!defined('_DIR_TRANSFERT')) {
2543
-		define('_DIR_TRANSFERT', $ti . 'upload/');
2544
-	}
2545
-	if (!defined('_DIR_CACHE')) {
2546
-		define('_DIR_CACHE', $ti . 'cache/');
2547
-	}
2548
-	if (!defined('_DIR_CACHE_XML')) {
2549
-		define('_DIR_CACHE_XML', _DIR_CACHE . 'xml/');
2550
-	}
2551
-	if (!defined('_DIR_SKELS')) {
2552
-		define('_DIR_SKELS', _DIR_CACHE . 'skel/');
2553
-	}
2554
-	if (!defined('_DIR_AIDE')) {
2555
-		define('_DIR_AIDE', _DIR_CACHE . 'aide/');
2556
-	}
2557
-	if (!defined('_DIR_TMP')) {
2558
-		define('_DIR_TMP', $ti);
2559
-	}
2560
-
2561
-	if (!defined('_DIR_VAR')) {
2562
-		define('_DIR_VAR', $ta);
2563
-	}
2564
-
2565
-	if (!defined('_DIR_ETC')) {
2566
-		define('_DIR_ETC', $pi);
2567
-	}
2568
-	if (!defined('_DIR_CONNECT')) {
2569
-		define('_DIR_CONNECT', $pi);
2570
-	}
2571
-	if (!defined('_DIR_CHMOD')) {
2572
-		define('_DIR_CHMOD', $pi);
2573
-	}
2574
-
2575
-	if (!isset($GLOBALS['test_dirs'])) {
2576
-		// Pas $pi car il est bon de le mettre hors ecriture apres intstall
2577
-		// il sera rajoute automatiquement si besoin a l'etape 2 de l'install
2578
-	$GLOBALS['test_dirs'] = [$pa, $ti, $ta];
2579
-	}
2580
-
2581
-	// Declaration des fichiers
2582
-
2583
-	if (!defined('_CACHE_PLUGINS_PATH')) {
2584
-		define('_CACHE_PLUGINS_PATH', _DIR_CACHE . 'charger_plugins_chemins.php');
2585
-	}
2586
-	if (!defined('_CACHE_PLUGINS_OPT')) {
2587
-		define('_CACHE_PLUGINS_OPT', _DIR_CACHE . 'charger_plugins_options.php');
2588
-	}
2589
-	if (!defined('_CACHE_PLUGINS_FCT')) {
2590
-		define('_CACHE_PLUGINS_FCT', _DIR_CACHE . 'charger_plugins_fonctions.php');
2591
-	}
2592
-	if (!defined('_CACHE_PIPELINES')) {
2593
-		define('_CACHE_PIPELINES', _DIR_CACHE . 'charger_pipelines.php');
2594
-	}
2595
-	if (!defined('_CACHE_CHEMIN')) {
2596
-		define('_CACHE_CHEMIN', _DIR_CACHE . 'chemin.txt');
2597
-	}
2598
-
2599
-	# attention .php obligatoire pour ecrire_fichier_securise
2600
-	if (!defined('_FILE_META')) {
2601
-		define('_FILE_META', $ti . 'meta_cache.php');
2602
-	}
2603
-	if (!defined('_DIR_LOG')) {
2604
-		define('_DIR_LOG', _DIR_TMP . 'log/');
2605
-	}
2606
-	if (!defined('_FILE_LOG')) {
2607
-		define('_FILE_LOG', 'spip');
2608
-	}
2609
-	if (!defined('_FILE_LOG_SUFFIX')) {
2610
-		define('_FILE_LOG_SUFFIX', '.log');
2611
-	}
2612
-
2613
-	// Le fichier de connexion a la base de donnees
2614
-	// tient compte des anciennes versions (inc_connect...)
2615
-	if (!defined('_FILE_CONNECT_INS')) {
2616
-		define('_FILE_CONNECT_INS', 'connect');
2617
-	}
2618
-	if (!defined('_FILE_CONNECT')) {
2619
-		define(
2620
-			'_FILE_CONNECT',
2621
-			(@is_readable($f = _DIR_CONNECT . _FILE_CONNECT_INS . '.php') ? $f
2622
-			: (@is_readable($f = _DIR_RESTREINT . 'inc_connect.php') ? $f
2623
-			: false))
2624
-		);
2625
-	}
2626
-
2627
-	// Le fichier de reglages des droits
2628
-	if (!defined('_FILE_CHMOD_INS')) {
2629
-		define('_FILE_CHMOD_INS', 'chmod');
2630
-	}
2631
-	if (!defined('_FILE_CHMOD')) {
2632
-		define(
2633
-			'_FILE_CHMOD',
2634
-			(@is_readable($f = _DIR_CHMOD . _FILE_CHMOD_INS . '.php') ? $f
2635
-			: false)
2636
-		);
2637
-	}
2638
-
2639
-	if (!defined('_FILE_LDAP')) {
2640
-		define('_FILE_LDAP', 'ldap.php');
2641
-	}
2642
-
2643
-	if (!defined('_FILE_TMP_SUFFIX')) {
2644
-		define('_FILE_TMP_SUFFIX', '.tmp.php');
2645
-	}
2646
-	if (!defined('_FILE_CONNECT_TMP')) {
2647
-		define('_FILE_CONNECT_TMP', _DIR_CONNECT . _FILE_CONNECT_INS . _FILE_TMP_SUFFIX);
2648
-	}
2649
-	if (!defined('_FILE_CHMOD_TMP')) {
2650
-		define('_FILE_CHMOD_TMP', _DIR_CHMOD . _FILE_CHMOD_INS . _FILE_TMP_SUFFIX);
2651
-	}
2652
-
2653
-	// Definition des droits d'acces en ecriture
2654
-	if (!defined('_SPIP_CHMOD') and _FILE_CHMOD) {
2655
-		include_once _FILE_CHMOD;
2656
-	}
2657
-
2658
-	// Se mefier des fichiers mal remplis!
2659
-	if (!defined('_SPIP_CHMOD')) {
2660
-		define('_SPIP_CHMOD', 0777);
2661
-	}
2662
-
2663
-	if (!defined('_DEFAULT_CHARSET')) {
2664
-		/** Le charset par défaut lors de l'installation */
2665
-		define('_DEFAULT_CHARSET', 'utf-8');
2666
-	}
2667
-	if (!defined('_ROOT_PLUGINS')) {
2668
-		define('_ROOT_PLUGINS', _ROOT_RACINE . 'plugins/');
2669
-	}
2670
-	if (!defined('_ROOT_PLUGINS_DIST')) {
2671
-		define('_ROOT_PLUGINS_DIST', _ROOT_RACINE . 'plugins-dist/');
2672
-	}
2673
-	if (!defined('_ROOT_PLUGINS_SUPPL') && defined('_DIR_PLUGINS_SUPPL') && _DIR_PLUGINS_SUPPL) {
2674
-		define('_ROOT_PLUGINS_SUPPL', _ROOT_RACINE . str_replace(_DIR_RACINE, '', _DIR_PLUGINS_SUPPL));
2675
-	}
2676
-
2677
-	// La taille des Log
2678
-	if (!defined('_MAX_LOG')) {
2679
-		define('_MAX_LOG', 100);
2680
-	}
2681
-
2682
-	// Sommes-nous dans l'empire du Mal ?
2683
-	// (ou sous le signe du Pingouin, ascendant GNU ?)
2684
-	if (isset($_SERVER['SERVER_SOFTWARE']) and str_contains($_SERVER['SERVER_SOFTWARE'], '(Win')) {
2685
-		if (!defined('_OS_SERVEUR')) {
2686
-			define('_OS_SERVEUR', 'windows');
2687
-		}
2688
-		if (!defined('_SPIP_LOCK_MODE')) {
2689
-			define('_SPIP_LOCK_MODE', 1);
2690
-		} // utiliser le flock php
2691
-	} else {
2692
-		if (!defined('_OS_SERVEUR')) {
2693
-			define('_OS_SERVEUR', '');
2694
-		}
2695
-		if (!defined('_SPIP_LOCK_MODE')) {
2696
-			define('_SPIP_LOCK_MODE', 1);
2697
-		} // utiliser le flock php
2698
-		#if (!defined('_SPIP_LOCK_MODE')) define('_SPIP_LOCK_MODE',2); // utiliser le nfslock de spip mais link() est tres souvent interdite
2699
-	}
2700
-
2701
-	// Langue par defaut
2702
-	if (!defined('_LANGUE_PAR_DEFAUT')) {
2703
-		define('_LANGUE_PAR_DEFAUT', 'fr');
2704
-	}
2705
-
2706
-	//
2707
-	// Module de lecture/ecriture/suppression de fichiers utilisant flock()
2708
-	// (non surchargeable en l'etat ; attention si on utilise include_spip()
2709
-	// pour le rendre surchargeable, on va provoquer un reecriture
2710
-	// systematique du noyau ou une baisse de perfs => a etudier)
2711
-	include_once _ROOT_RESTREINT . 'inc/flock.php';
2712
-
2713
-	// charger tout de suite le path et son cache
2714
-	load_path_cache();
2715
-
2716
-	// *********** traiter les variables ************
2717
-
2718
-	//
2719
-	// Securite
2720
-	//
2721
-
2722
-	// Ne pas se faire manger par un bug php qui accepte ?GLOBALS[truc]=toto
2723
-	if (isset($_REQUEST['GLOBALS'])) {
2724
-		die();
2725
-	}
2726
-	// nettoyer les magic quotes \' et les caracteres nuls %00
2727
-	spip_desinfecte($_GET);
2728
-	spip_desinfecte($_POST);
2729
-	spip_desinfecte($_COOKIE);
2730
-	spip_desinfecte($_REQUEST);
2731
-
2732
-	// appliquer le cookie_prefix
2733
-	if ($GLOBALS['cookie_prefix'] != 'spip') {
2734
-		include_spip('inc/cookie');
2735
-		recuperer_cookies_spip($GLOBALS['cookie_prefix']);
2736
-	}
2737
-
2738
-	// Compatibilite avec serveurs ne fournissant pas $REQUEST_URI
2739
-	if (isset($_SERVER['REQUEST_URI'])) {
2740
-		$GLOBALS['REQUEST_URI'] = $_SERVER['REQUEST_URI'];
2741
-	} else {
2742
-		$GLOBALS['REQUEST_URI'] = (php_sapi_name() !== 'cli') ? $_SERVER['PHP_SELF'] : '';
2743
-		if (
2744
-			!empty($_SERVER['QUERY_STRING'])
2745
-			and !strpos($_SERVER['REQUEST_URI'], '?')
2746
-		) {
2747
-			$GLOBALS['REQUEST_URI'] .= '?' . $_SERVER['QUERY_STRING'];
2748
-		}
2749
-	}
2750
-
2751
-	// Duree de validite de l'alea pour les cookies et ce qui s'ensuit.
2752
-	if (!defined('_RENOUVELLE_ALEA')) {
2753
-		define('_RENOUVELLE_ALEA', 12 * 3600);
2754
-	}
2755
-	if (!defined('_DUREE_COOKIE_ADMIN')) {
2756
-		define('_DUREE_COOKIE_ADMIN', 14 * 24 * 3600);
2757
-	}
2758
-
2759
-	// charger les meta si possible et renouveller l'alea au besoin
2760
-	// charge aussi effacer_meta et ecrire_meta
2761
-	$inc_meta = charger_fonction('meta', 'inc');
2762
-	$inc_meta();
2763
-
2764
-	// nombre de repertoires depuis la racine
2765
-	// on compare a l'adresse de spip.php : $_SERVER["SCRIPT_NAME"]
2766
-	// ou a defaut celle donnee en meta ; (mais si celle-ci est fausse
2767
-	// le calcul est faux)
2768
-	if (!_DIR_RESTREINT) {
2769
-		$GLOBALS['profondeur_url'] = 1;
2770
-	} else {
2771
-		$uri = isset($_SERVER['REQUEST_URI']) ? explode('?', $_SERVER['REQUEST_URI']) : '';
2772
-		$uri_ref = $_SERVER['SCRIPT_NAME'];
2773
-		if (
2774
-			!$uri_ref
2775
-			// si on est appele avec un autre ti, on est sans doute en mutu
2776
-			// si jamais c'est de la mutu avec sous rep, on est perdu si on se fie
2777
-			// a spip.php qui est a la racine du spip, et vue qu'on sait pas se reperer
2778
-			// s'en remettre a l'adresse du site. alea jacta est.
2779
-			or $ti !== _NOM_TEMPORAIRES_INACCESSIBLES
2780
-		) {
2781
-			if (isset($GLOBALS['meta']['adresse_site'])) {
2782
-				$uri_ref = parse_url($GLOBALS['meta']['adresse_site']);
2783
-				$uri_ref = ($uri_ref['path'] ?? '') . '/';
2784
-			} else {
2785
-				$uri_ref = '';
2786
-			}
2787
-		}
2788
-		if (!$uri or !$uri_ref) {
2789
-			$GLOBALS['profondeur_url'] = 0;
2790
-		} else {
2791
-			$GLOBALS['profondeur_url'] = max(
2792
-				0,
2793
-				substr_count($uri[0], '/')
2794
-				- substr_count($uri_ref, '/')
2795
-			);
2796
-		}
2797
-	}
2798
-	// s'il y a un cookie ou PHP_AUTH, initialiser visiteur_session
2799
-	if (_FILE_CONNECT) {
2800
-		if (
2801
-			verifier_visiteur() == '0minirezo'
2802
-			// si c'est un admin sans cookie admin, il faut ignorer le cache chemin !
2803
-			and !isset($_COOKIE['spip_admin'])
2804
-		) {
2805
-			clear_path_cache();
2806
-		}
2807
-	}
2498
+    static $too_late = 0;
2499
+    if ($too_late++) {
2500
+        return;
2501
+    }
2502
+
2503
+    // Declaration des repertoires
2504
+
2505
+    // le nom du repertoire plugins/ activables/desactivables
2506
+    if (!defined('_DIR_PLUGINS')) {
2507
+        define('_DIR_PLUGINS', _DIR_RACINE . 'plugins/');
2508
+    }
2509
+
2510
+    // le nom du repertoire des extensions/ permanentes du core, toujours actives
2511
+    if (!defined('_DIR_PLUGINS_DIST')) {
2512
+        define('_DIR_PLUGINS_DIST', _DIR_RACINE . 'plugins-dist/');
2513
+    }
2514
+
2515
+    // le nom du repertoire des librairies
2516
+    if (!defined('_DIR_LIB')) {
2517
+        define('_DIR_LIB', _DIR_RACINE . 'lib/');
2518
+    }
2519
+
2520
+    // répertoire des libs via Composer
2521
+    if (!defined('_DIR_VENDOR')) {
2522
+        define('_DIR_VENDOR', _DIR_RACINE . 'vendor/');
2523
+    }
2524
+
2525
+    if (!defined('_DIR_IMG')) {
2526
+        define('_DIR_IMG', $pa);
2527
+    }
2528
+    if (!defined('_DIR_LOGOS')) {
2529
+        define('_DIR_LOGOS', $pa);
2530
+    }
2531
+    if (!defined('_DIR_IMG_ICONES')) {
2532
+        define('_DIR_IMG_ICONES', _DIR_LOGOS . 'icones/');
2533
+    }
2534
+
2535
+    if (!defined('_DIR_DUMP')) {
2536
+        define('_DIR_DUMP', $ti . 'dump/');
2537
+    }
2538
+    if (!defined('_DIR_SESSIONS')) {
2539
+        define('_DIR_SESSIONS', $ti . 'sessions/');
2540
+    }
2541
+    if (!defined('_DIR_TRANSFERT')) {
2542
+        define('_DIR_TRANSFERT', $ti . 'upload/');
2543
+    }
2544
+    if (!defined('_DIR_CACHE')) {
2545
+        define('_DIR_CACHE', $ti . 'cache/');
2546
+    }
2547
+    if (!defined('_DIR_CACHE_XML')) {
2548
+        define('_DIR_CACHE_XML', _DIR_CACHE . 'xml/');
2549
+    }
2550
+    if (!defined('_DIR_SKELS')) {
2551
+        define('_DIR_SKELS', _DIR_CACHE . 'skel/');
2552
+    }
2553
+    if (!defined('_DIR_AIDE')) {
2554
+        define('_DIR_AIDE', _DIR_CACHE . 'aide/');
2555
+    }
2556
+    if (!defined('_DIR_TMP')) {
2557
+        define('_DIR_TMP', $ti);
2558
+    }
2559
+
2560
+    if (!defined('_DIR_VAR')) {
2561
+        define('_DIR_VAR', $ta);
2562
+    }
2563
+
2564
+    if (!defined('_DIR_ETC')) {
2565
+        define('_DIR_ETC', $pi);
2566
+    }
2567
+    if (!defined('_DIR_CONNECT')) {
2568
+        define('_DIR_CONNECT', $pi);
2569
+    }
2570
+    if (!defined('_DIR_CHMOD')) {
2571
+        define('_DIR_CHMOD', $pi);
2572
+    }
2573
+
2574
+    if (!isset($GLOBALS['test_dirs'])) {
2575
+        // Pas $pi car il est bon de le mettre hors ecriture apres intstall
2576
+        // il sera rajoute automatiquement si besoin a l'etape 2 de l'install
2577
+    $GLOBALS['test_dirs'] = [$pa, $ti, $ta];
2578
+    }
2579
+
2580
+    // Declaration des fichiers
2581
+
2582
+    if (!defined('_CACHE_PLUGINS_PATH')) {
2583
+        define('_CACHE_PLUGINS_PATH', _DIR_CACHE . 'charger_plugins_chemins.php');
2584
+    }
2585
+    if (!defined('_CACHE_PLUGINS_OPT')) {
2586
+        define('_CACHE_PLUGINS_OPT', _DIR_CACHE . 'charger_plugins_options.php');
2587
+    }
2588
+    if (!defined('_CACHE_PLUGINS_FCT')) {
2589
+        define('_CACHE_PLUGINS_FCT', _DIR_CACHE . 'charger_plugins_fonctions.php');
2590
+    }
2591
+    if (!defined('_CACHE_PIPELINES')) {
2592
+        define('_CACHE_PIPELINES', _DIR_CACHE . 'charger_pipelines.php');
2593
+    }
2594
+    if (!defined('_CACHE_CHEMIN')) {
2595
+        define('_CACHE_CHEMIN', _DIR_CACHE . 'chemin.txt');
2596
+    }
2597
+
2598
+    # attention .php obligatoire pour ecrire_fichier_securise
2599
+    if (!defined('_FILE_META')) {
2600
+        define('_FILE_META', $ti . 'meta_cache.php');
2601
+    }
2602
+    if (!defined('_DIR_LOG')) {
2603
+        define('_DIR_LOG', _DIR_TMP . 'log/');
2604
+    }
2605
+    if (!defined('_FILE_LOG')) {
2606
+        define('_FILE_LOG', 'spip');
2607
+    }
2608
+    if (!defined('_FILE_LOG_SUFFIX')) {
2609
+        define('_FILE_LOG_SUFFIX', '.log');
2610
+    }
2611
+
2612
+    // Le fichier de connexion a la base de donnees
2613
+    // tient compte des anciennes versions (inc_connect...)
2614
+    if (!defined('_FILE_CONNECT_INS')) {
2615
+        define('_FILE_CONNECT_INS', 'connect');
2616
+    }
2617
+    if (!defined('_FILE_CONNECT')) {
2618
+        define(
2619
+            '_FILE_CONNECT',
2620
+            (@is_readable($f = _DIR_CONNECT . _FILE_CONNECT_INS . '.php') ? $f
2621
+            : (@is_readable($f = _DIR_RESTREINT . 'inc_connect.php') ? $f
2622
+            : false))
2623
+        );
2624
+    }
2625
+
2626
+    // Le fichier de reglages des droits
2627
+    if (!defined('_FILE_CHMOD_INS')) {
2628
+        define('_FILE_CHMOD_INS', 'chmod');
2629
+    }
2630
+    if (!defined('_FILE_CHMOD')) {
2631
+        define(
2632
+            '_FILE_CHMOD',
2633
+            (@is_readable($f = _DIR_CHMOD . _FILE_CHMOD_INS . '.php') ? $f
2634
+            : false)
2635
+        );
2636
+    }
2637
+
2638
+    if (!defined('_FILE_LDAP')) {
2639
+        define('_FILE_LDAP', 'ldap.php');
2640
+    }
2641
+
2642
+    if (!defined('_FILE_TMP_SUFFIX')) {
2643
+        define('_FILE_TMP_SUFFIX', '.tmp.php');
2644
+    }
2645
+    if (!defined('_FILE_CONNECT_TMP')) {
2646
+        define('_FILE_CONNECT_TMP', _DIR_CONNECT . _FILE_CONNECT_INS . _FILE_TMP_SUFFIX);
2647
+    }
2648
+    if (!defined('_FILE_CHMOD_TMP')) {
2649
+        define('_FILE_CHMOD_TMP', _DIR_CHMOD . _FILE_CHMOD_INS . _FILE_TMP_SUFFIX);
2650
+    }
2651
+
2652
+    // Definition des droits d'acces en ecriture
2653
+    if (!defined('_SPIP_CHMOD') and _FILE_CHMOD) {
2654
+        include_once _FILE_CHMOD;
2655
+    }
2656
+
2657
+    // Se mefier des fichiers mal remplis!
2658
+    if (!defined('_SPIP_CHMOD')) {
2659
+        define('_SPIP_CHMOD', 0777);
2660
+    }
2661
+
2662
+    if (!defined('_DEFAULT_CHARSET')) {
2663
+        /** Le charset par défaut lors de l'installation */
2664
+        define('_DEFAULT_CHARSET', 'utf-8');
2665
+    }
2666
+    if (!defined('_ROOT_PLUGINS')) {
2667
+        define('_ROOT_PLUGINS', _ROOT_RACINE . 'plugins/');
2668
+    }
2669
+    if (!defined('_ROOT_PLUGINS_DIST')) {
2670
+        define('_ROOT_PLUGINS_DIST', _ROOT_RACINE . 'plugins-dist/');
2671
+    }
2672
+    if (!defined('_ROOT_PLUGINS_SUPPL') && defined('_DIR_PLUGINS_SUPPL') && _DIR_PLUGINS_SUPPL) {
2673
+        define('_ROOT_PLUGINS_SUPPL', _ROOT_RACINE . str_replace(_DIR_RACINE, '', _DIR_PLUGINS_SUPPL));
2674
+    }
2675
+
2676
+    // La taille des Log
2677
+    if (!defined('_MAX_LOG')) {
2678
+        define('_MAX_LOG', 100);
2679
+    }
2680
+
2681
+    // Sommes-nous dans l'empire du Mal ?
2682
+    // (ou sous le signe du Pingouin, ascendant GNU ?)
2683
+    if (isset($_SERVER['SERVER_SOFTWARE']) and str_contains($_SERVER['SERVER_SOFTWARE'], '(Win')) {
2684
+        if (!defined('_OS_SERVEUR')) {
2685
+            define('_OS_SERVEUR', 'windows');
2686
+        }
2687
+        if (!defined('_SPIP_LOCK_MODE')) {
2688
+            define('_SPIP_LOCK_MODE', 1);
2689
+        } // utiliser le flock php
2690
+    } else {
2691
+        if (!defined('_OS_SERVEUR')) {
2692
+            define('_OS_SERVEUR', '');
2693
+        }
2694
+        if (!defined('_SPIP_LOCK_MODE')) {
2695
+            define('_SPIP_LOCK_MODE', 1);
2696
+        } // utiliser le flock php
2697
+        #if (!defined('_SPIP_LOCK_MODE')) define('_SPIP_LOCK_MODE',2); // utiliser le nfslock de spip mais link() est tres souvent interdite
2698
+    }
2699
+
2700
+    // Langue par defaut
2701
+    if (!defined('_LANGUE_PAR_DEFAUT')) {
2702
+        define('_LANGUE_PAR_DEFAUT', 'fr');
2703
+    }
2704
+
2705
+    //
2706
+    // Module de lecture/ecriture/suppression de fichiers utilisant flock()
2707
+    // (non surchargeable en l'etat ; attention si on utilise include_spip()
2708
+    // pour le rendre surchargeable, on va provoquer un reecriture
2709
+    // systematique du noyau ou une baisse de perfs => a etudier)
2710
+    include_once _ROOT_RESTREINT . 'inc/flock.php';
2711
+
2712
+    // charger tout de suite le path et son cache
2713
+    load_path_cache();
2714
+
2715
+    // *********** traiter les variables ************
2716
+
2717
+    //
2718
+    // Securite
2719
+    //
2720
+
2721
+    // Ne pas se faire manger par un bug php qui accepte ?GLOBALS[truc]=toto
2722
+    if (isset($_REQUEST['GLOBALS'])) {
2723
+        die();
2724
+    }
2725
+    // nettoyer les magic quotes \' et les caracteres nuls %00
2726
+    spip_desinfecte($_GET);
2727
+    spip_desinfecte($_POST);
2728
+    spip_desinfecte($_COOKIE);
2729
+    spip_desinfecte($_REQUEST);
2730
+
2731
+    // appliquer le cookie_prefix
2732
+    if ($GLOBALS['cookie_prefix'] != 'spip') {
2733
+        include_spip('inc/cookie');
2734
+        recuperer_cookies_spip($GLOBALS['cookie_prefix']);
2735
+    }
2736
+
2737
+    // Compatibilite avec serveurs ne fournissant pas $REQUEST_URI
2738
+    if (isset($_SERVER['REQUEST_URI'])) {
2739
+        $GLOBALS['REQUEST_URI'] = $_SERVER['REQUEST_URI'];
2740
+    } else {
2741
+        $GLOBALS['REQUEST_URI'] = (php_sapi_name() !== 'cli') ? $_SERVER['PHP_SELF'] : '';
2742
+        if (
2743
+            !empty($_SERVER['QUERY_STRING'])
2744
+            and !strpos($_SERVER['REQUEST_URI'], '?')
2745
+        ) {
2746
+            $GLOBALS['REQUEST_URI'] .= '?' . $_SERVER['QUERY_STRING'];
2747
+        }
2748
+    }
2749
+
2750
+    // Duree de validite de l'alea pour les cookies et ce qui s'ensuit.
2751
+    if (!defined('_RENOUVELLE_ALEA')) {
2752
+        define('_RENOUVELLE_ALEA', 12 * 3600);
2753
+    }
2754
+    if (!defined('_DUREE_COOKIE_ADMIN')) {
2755
+        define('_DUREE_COOKIE_ADMIN', 14 * 24 * 3600);
2756
+    }
2757
+
2758
+    // charger les meta si possible et renouveller l'alea au besoin
2759
+    // charge aussi effacer_meta et ecrire_meta
2760
+    $inc_meta = charger_fonction('meta', 'inc');
2761
+    $inc_meta();
2762
+
2763
+    // nombre de repertoires depuis la racine
2764
+    // on compare a l'adresse de spip.php : $_SERVER["SCRIPT_NAME"]
2765
+    // ou a defaut celle donnee en meta ; (mais si celle-ci est fausse
2766
+    // le calcul est faux)
2767
+    if (!_DIR_RESTREINT) {
2768
+        $GLOBALS['profondeur_url'] = 1;
2769
+    } else {
2770
+        $uri = isset($_SERVER['REQUEST_URI']) ? explode('?', $_SERVER['REQUEST_URI']) : '';
2771
+        $uri_ref = $_SERVER['SCRIPT_NAME'];
2772
+        if (
2773
+            !$uri_ref
2774
+            // si on est appele avec un autre ti, on est sans doute en mutu
2775
+            // si jamais c'est de la mutu avec sous rep, on est perdu si on se fie
2776
+            // a spip.php qui est a la racine du spip, et vue qu'on sait pas se reperer
2777
+            // s'en remettre a l'adresse du site. alea jacta est.
2778
+            or $ti !== _NOM_TEMPORAIRES_INACCESSIBLES
2779
+        ) {
2780
+            if (isset($GLOBALS['meta']['adresse_site'])) {
2781
+                $uri_ref = parse_url($GLOBALS['meta']['adresse_site']);
2782
+                $uri_ref = ($uri_ref['path'] ?? '') . '/';
2783
+            } else {
2784
+                $uri_ref = '';
2785
+            }
2786
+        }
2787
+        if (!$uri or !$uri_ref) {
2788
+            $GLOBALS['profondeur_url'] = 0;
2789
+        } else {
2790
+            $GLOBALS['profondeur_url'] = max(
2791
+                0,
2792
+                substr_count($uri[0], '/')
2793
+                - substr_count($uri_ref, '/')
2794
+            );
2795
+        }
2796
+    }
2797
+    // s'il y a un cookie ou PHP_AUTH, initialiser visiteur_session
2798
+    if (_FILE_CONNECT) {
2799
+        if (
2800
+            verifier_visiteur() == '0minirezo'
2801
+            // si c'est un admin sans cookie admin, il faut ignorer le cache chemin !
2802
+            and !isset($_COOKIE['spip_admin'])
2803
+        ) {
2804
+            clear_path_cache();
2805
+        }
2806
+    }
2808 2807
 }
2809 2808
 
2810 2809
 /**
@@ -2813,157 +2812,157 @@  discard block
 block discarded – undo
2813 2812
  *
2814 2813
  */
2815 2814
 function spip_initialisation_suite() {
2816
-	static $too_late = 0;
2817
-	if ($too_late++) {
2818
-		return;
2819
-	}
2820
-
2821
-	// taille mini des login
2822
-	if (!defined('_LOGIN_TROP_COURT')) {
2823
-		define('_LOGIN_TROP_COURT', 4);
2824
-	}
2825
-
2826
-	// la taille maxi des logos (0 : pas de limite) (pas de define par defaut, ce n'est pas utile)
2827
-	#if (!defined('_LOGO_MAX_SIZE')) define('_LOGO_MAX_SIZE', 0); # poids en ko
2828
-	#if (!defined('_LOGO_MAX_WIDTH')) define('_LOGO_MAX_WIDTH', 0); # largeur en pixels
2829
-	#if (!defined('_LOGO_MAX_HEIGHT')) define('_LOGO_MAX_HEIGHT', 0); # hauteur en pixels
2830
-
2831
-	// la taille maxi des images (0 : pas de limite) (pas de define par defaut, ce n'est pas utile)
2832
-	#if (!defined('_DOC_MAX_SIZE')) define('_DOC_MAX_SIZE', 0); # poids en ko
2833
-	#if (!defined('_IMG_MAX_SIZE')) define('_IMG_MAX_SIZE', 0); # poids en ko
2834
-	#if (!defined('_IMG_MAX_WIDTH')) define('_IMG_MAX_WIDTH', 0); # largeur en pixels
2835
-	#if (!defined('_IMG_MAX_HEIGHT')) define('_IMG_MAX_HEIGHT', 0); # hauteur en pixels
2836
-
2837
-	if (!defined('_PASS_LONGUEUR_MINI')) {
2838
-		define('_PASS_LONGUEUR_MINI', 6);
2839
-	}
2840
-
2841
-	// largeur maximale des images dans l'administration
2842
-	if (!defined('_IMG_ADMIN_MAX_WIDTH')) {
2843
-		define('_IMG_ADMIN_MAX_WIDTH', 768);
2844
-	}
2845
-
2846
-	// Qualite des images calculees automatiquement. C'est un nombre entre 0 et 100, meme pour imagick (on ramene a 0..1 par la suite)
2847
-	if (!defined('_IMG_QUALITE')) {
2848
-		define('_IMG_QUALITE', 85);
2849
-	} # valeur par defaut
2850
-	if (!defined('_IMG_GD_QUALITE')) {
2851
-		define('_IMG_GD_QUALITE', _IMG_QUALITE);
2852
-	} # surcharge pour la lib GD
2853
-	if (!defined('_IMG_CONVERT_QUALITE')) {
2854
-		define('_IMG_CONVERT_QUALITE', _IMG_QUALITE);
2855
-	} # surcharge pour imagick en ligne de commande
2856
-	// Historiquement la valeur pour imagick semble differente. Si ca n'est pas necessaire, il serait preferable de garder _IMG_QUALITE
2857
-	if (!defined('_IMG_IMAGICK_QUALITE')) {
2858
-		define('_IMG_IMAGICK_QUALITE', 75);
2859
-	} # surcharge pour imagick en PHP
2860
-
2861
-	if (!defined('_COPIE_LOCALE_MAX_SIZE')) {
2862
-		define('_COPIE_LOCALE_MAX_SIZE', 33_554_432);
2863
-	} // poids en octet
2864
-
2865
-	// qq chaines standard
2866
-	if (!defined('_ACCESS_FILE_NAME')) {
2867
-		define('_ACCESS_FILE_NAME', '.htaccess');
2868
-	}
2869
-	if (!defined('_AUTH_USER_FILE')) {
2870
-		define('_AUTH_USER_FILE', '.htpasswd');
2871
-	}
2872
-	if (!defined('_SPIP_DUMP')) {
2873
-		define('_SPIP_DUMP', 'dump@nom_site@@[email protected]');
2874
-	}
2875
-	if (!defined('_CACHE_RUBRIQUES')) {
2876
-		/** Fichier cache pour le navigateur de rubrique du bandeau */
2877
-		define('_CACHE_RUBRIQUES', _DIR_TMP . 'menu-rubriques-cache.txt');
2878
-	}
2879
-	if (!defined('_CACHE_RUBRIQUES_MAX')) {
2880
-		/** Nombre maxi de rubriques enfants affichées pour chaque rubrique du navigateur de rubrique du bandeau */
2881
-		define('_CACHE_RUBRIQUES_MAX', 500);
2882
-	}
2883
-
2884
-	if (!defined('_CACHE_CONTEXTES_AJAX_SUR_LONGUEUR')) {
2885
-		/**
2886
-		 * Basculer les contextes ajax en fichier si la longueur d’url est trop grande
2887
-		 * @var int Nombre de caractères */
2888
-		define('_CACHE_CONTEXTES_AJAX_SUR_LONGUEUR', 2000);
2889
-	}
2890
-
2891
-	if (!defined('_EXTENSION_SQUELETTES')) {
2892
-		define('_EXTENSION_SQUELETTES', 'html');
2893
-	}
2894
-
2895
-	if (!defined('_DOCTYPE_ECRIRE')) {
2896
-		/** Définit le doctype de l’espace privé */
2897
-		define('_DOCTYPE_ECRIRE', "<!DOCTYPE html>\n");
2898
-	}
2899
-	if (!defined('_DOCTYPE_AIDE')) {
2900
-		/** Définit le doctype de l’aide en ligne */
2901
-		define(
2902
-			'_DOCTYPE_AIDE',
2903
-			"<!DOCTYPE html PUBLIC '-//W3C//DTD HTML 4.01 Frameset//EN' 'http://www.w3.org/TR/1999/REC-html401-19991224/frameset.dtd'>"
2904
-		);
2905
-	}
2906
-
2907
-	if (!defined('_SPIP_SCRIPT')) {
2908
-		/** L'adresse de base du site ; on peut mettre '' si la racine est gerée par
2909
-		 * le script de l'espace public, alias index.php */
2910
-		define('_SPIP_SCRIPT', 'spip.php');
2911
-	}
2912
-	if (!defined('_SPIP_PAGE')) {
2913
-		/** Argument page, personalisable en cas de conflit avec un autre script */
2914
-		define('_SPIP_PAGE', 'page');
2915
-	}
2916
-
2917
-	// le script de l'espace prive
2918
-	// Mettre a "index.php" si DirectoryIndex ne le fait pas ou pb connexes:
2919
-	// les anciens IIS n'acceptent pas les POST sur ecrire/ (#419)
2920
-	// meme pb sur thttpd cf. https://forum.spip.net/fr_184153.html
2921
-	if (!defined('_SPIP_ECRIRE_SCRIPT')) {
2922
-		if (!empty($_SERVER['SERVER_SOFTWARE']) and preg_match(',IIS|thttpd,', $_SERVER['SERVER_SOFTWARE'])) {
2923
-			define('_SPIP_ECRIRE_SCRIPT', 'index.php');
2924
-		} else {
2925
-			define('_SPIP_ECRIRE_SCRIPT', '');
2926
-		}
2927
-	}
2928
-
2929
-
2930
-	if (!defined('_SPIP_AJAX')) {
2931
-		define('_SPIP_AJAX', ((!isset($_COOKIE['spip_accepte_ajax']))
2932
-			? 1
2933
-			: (($_COOKIE['spip_accepte_ajax'] != -1) ? 1 : 0)));
2934
-	}
2935
-
2936
-	// La requete est-elle en ajax ?
2937
-	if (!defined('_AJAX')) {
2938
-		define(
2939
-			'_AJAX',
2940
-			(isset($_SERVER['HTTP_X_REQUESTED_WITH']) # ajax jQuery
2941
-				or !empty($_REQUEST['var_ajax_redir']) # redirection 302 apres ajax jQuery
2942
-				or !empty($_REQUEST['var_ajaxcharset']) # compat ascendante pour plugins
2943
-				or !empty($_REQUEST['var_ajax']) # forms ajax & inclure ajax de spip
2944
-			)
2945
-			and empty($_REQUEST['var_noajax']) # horrible exception, car c'est pas parce que la requete est ajax jquery qu'il faut tuer tous les formulaires ajax qu'elle contient
2946
-		);
2947
-	}
2948
-
2949
-	# nombre de pixels maxi pour calcul de la vignette avec gd
2950
-	# au dela de 5500000 on considere que php n'est pas limite en memoire pour cette operation
2951
-	# les configurations limitees en memoire ont un seuil plutot vers 1MPixel
2952
-	if (!defined('_IMG_GD_MAX_PIXELS')) {
2953
-		define(
2954
-			'_IMG_GD_MAX_PIXELS',
2955
-			(isset($GLOBALS['meta']['max_taille_vignettes']) and $GLOBALS['meta']['max_taille_vignettes'])
2956
-			? $GLOBALS['meta']['max_taille_vignettes']
2957
-			: 0
2958
-		);
2959
-	}
2960
-
2961
-	// Protocoles a normaliser dans les chaines de langues
2962
-	if (!defined('_PROTOCOLES_STD')) {
2963
-		define('_PROTOCOLES_STD', 'http|https|ftp|mailto|webcal');
2964
-	}
2965
-
2966
-	init_var_mode();
2815
+    static $too_late = 0;
2816
+    if ($too_late++) {
2817
+        return;
2818
+    }
2819
+
2820
+    // taille mini des login
2821
+    if (!defined('_LOGIN_TROP_COURT')) {
2822
+        define('_LOGIN_TROP_COURT', 4);
2823
+    }
2824
+
2825
+    // la taille maxi des logos (0 : pas de limite) (pas de define par defaut, ce n'est pas utile)
2826
+    #if (!defined('_LOGO_MAX_SIZE')) define('_LOGO_MAX_SIZE', 0); # poids en ko
2827
+    #if (!defined('_LOGO_MAX_WIDTH')) define('_LOGO_MAX_WIDTH', 0); # largeur en pixels
2828
+    #if (!defined('_LOGO_MAX_HEIGHT')) define('_LOGO_MAX_HEIGHT', 0); # hauteur en pixels
2829
+
2830
+    // la taille maxi des images (0 : pas de limite) (pas de define par defaut, ce n'est pas utile)
2831
+    #if (!defined('_DOC_MAX_SIZE')) define('_DOC_MAX_SIZE', 0); # poids en ko
2832
+    #if (!defined('_IMG_MAX_SIZE')) define('_IMG_MAX_SIZE', 0); # poids en ko
2833
+    #if (!defined('_IMG_MAX_WIDTH')) define('_IMG_MAX_WIDTH', 0); # largeur en pixels
2834
+    #if (!defined('_IMG_MAX_HEIGHT')) define('_IMG_MAX_HEIGHT', 0); # hauteur en pixels
2835
+
2836
+    if (!defined('_PASS_LONGUEUR_MINI')) {
2837
+        define('_PASS_LONGUEUR_MINI', 6);
2838
+    }
2839
+
2840
+    // largeur maximale des images dans l'administration
2841
+    if (!defined('_IMG_ADMIN_MAX_WIDTH')) {
2842
+        define('_IMG_ADMIN_MAX_WIDTH', 768);
2843
+    }
2844
+
2845
+    // Qualite des images calculees automatiquement. C'est un nombre entre 0 et 100, meme pour imagick (on ramene a 0..1 par la suite)
2846
+    if (!defined('_IMG_QUALITE')) {
2847
+        define('_IMG_QUALITE', 85);
2848
+    } # valeur par defaut
2849
+    if (!defined('_IMG_GD_QUALITE')) {
2850
+        define('_IMG_GD_QUALITE', _IMG_QUALITE);
2851
+    } # surcharge pour la lib GD
2852
+    if (!defined('_IMG_CONVERT_QUALITE')) {
2853
+        define('_IMG_CONVERT_QUALITE', _IMG_QUALITE);
2854
+    } # surcharge pour imagick en ligne de commande
2855
+    // Historiquement la valeur pour imagick semble differente. Si ca n'est pas necessaire, il serait preferable de garder _IMG_QUALITE
2856
+    if (!defined('_IMG_IMAGICK_QUALITE')) {
2857
+        define('_IMG_IMAGICK_QUALITE', 75);
2858
+    } # surcharge pour imagick en PHP
2859
+
2860
+    if (!defined('_COPIE_LOCALE_MAX_SIZE')) {
2861
+        define('_COPIE_LOCALE_MAX_SIZE', 33_554_432);
2862
+    } // poids en octet
2863
+
2864
+    // qq chaines standard
2865
+    if (!defined('_ACCESS_FILE_NAME')) {
2866
+        define('_ACCESS_FILE_NAME', '.htaccess');
2867
+    }
2868
+    if (!defined('_AUTH_USER_FILE')) {
2869
+        define('_AUTH_USER_FILE', '.htpasswd');
2870
+    }
2871
+    if (!defined('_SPIP_DUMP')) {
2872
+        define('_SPIP_DUMP', 'dump@nom_site@@[email protected]');
2873
+    }
2874
+    if (!defined('_CACHE_RUBRIQUES')) {
2875
+        /** Fichier cache pour le navigateur de rubrique du bandeau */
2876
+        define('_CACHE_RUBRIQUES', _DIR_TMP . 'menu-rubriques-cache.txt');
2877
+    }
2878
+    if (!defined('_CACHE_RUBRIQUES_MAX')) {
2879
+        /** Nombre maxi de rubriques enfants affichées pour chaque rubrique du navigateur de rubrique du bandeau */
2880
+        define('_CACHE_RUBRIQUES_MAX', 500);
2881
+    }
2882
+
2883
+    if (!defined('_CACHE_CONTEXTES_AJAX_SUR_LONGUEUR')) {
2884
+        /**
2885
+         * Basculer les contextes ajax en fichier si la longueur d’url est trop grande
2886
+         * @var int Nombre de caractères */
2887
+        define('_CACHE_CONTEXTES_AJAX_SUR_LONGUEUR', 2000);
2888
+    }
2889
+
2890
+    if (!defined('_EXTENSION_SQUELETTES')) {
2891
+        define('_EXTENSION_SQUELETTES', 'html');
2892
+    }
2893
+
2894
+    if (!defined('_DOCTYPE_ECRIRE')) {
2895
+        /** Définit le doctype de l’espace privé */
2896
+        define('_DOCTYPE_ECRIRE', "<!DOCTYPE html>\n");
2897
+    }
2898
+    if (!defined('_DOCTYPE_AIDE')) {
2899
+        /** Définit le doctype de l’aide en ligne */
2900
+        define(
2901
+            '_DOCTYPE_AIDE',
2902
+            "<!DOCTYPE html PUBLIC '-//W3C//DTD HTML 4.01 Frameset//EN' 'http://www.w3.org/TR/1999/REC-html401-19991224/frameset.dtd'>"
2903
+        );
2904
+    }
2905
+
2906
+    if (!defined('_SPIP_SCRIPT')) {
2907
+        /** L'adresse de base du site ; on peut mettre '' si la racine est gerée par
2908
+         * le script de l'espace public, alias index.php */
2909
+        define('_SPIP_SCRIPT', 'spip.php');
2910
+    }
2911
+    if (!defined('_SPIP_PAGE')) {
2912
+        /** Argument page, personalisable en cas de conflit avec un autre script */
2913
+        define('_SPIP_PAGE', 'page');
2914
+    }
2915
+
2916
+    // le script de l'espace prive
2917
+    // Mettre a "index.php" si DirectoryIndex ne le fait pas ou pb connexes:
2918
+    // les anciens IIS n'acceptent pas les POST sur ecrire/ (#419)
2919
+    // meme pb sur thttpd cf. https://forum.spip.net/fr_184153.html
2920
+    if (!defined('_SPIP_ECRIRE_SCRIPT')) {
2921
+        if (!empty($_SERVER['SERVER_SOFTWARE']) and preg_match(',IIS|thttpd,', $_SERVER['SERVER_SOFTWARE'])) {
2922
+            define('_SPIP_ECRIRE_SCRIPT', 'index.php');
2923
+        } else {
2924
+            define('_SPIP_ECRIRE_SCRIPT', '');
2925
+        }
2926
+    }
2927
+
2928
+
2929
+    if (!defined('_SPIP_AJAX')) {
2930
+        define('_SPIP_AJAX', ((!isset($_COOKIE['spip_accepte_ajax']))
2931
+            ? 1
2932
+            : (($_COOKIE['spip_accepte_ajax'] != -1) ? 1 : 0)));
2933
+    }
2934
+
2935
+    // La requete est-elle en ajax ?
2936
+    if (!defined('_AJAX')) {
2937
+        define(
2938
+            '_AJAX',
2939
+            (isset($_SERVER['HTTP_X_REQUESTED_WITH']) # ajax jQuery
2940
+                or !empty($_REQUEST['var_ajax_redir']) # redirection 302 apres ajax jQuery
2941
+                or !empty($_REQUEST['var_ajaxcharset']) # compat ascendante pour plugins
2942
+                or !empty($_REQUEST['var_ajax']) # forms ajax & inclure ajax de spip
2943
+            )
2944
+            and empty($_REQUEST['var_noajax']) # horrible exception, car c'est pas parce que la requete est ajax jquery qu'il faut tuer tous les formulaires ajax qu'elle contient
2945
+        );
2946
+    }
2947
+
2948
+    # nombre de pixels maxi pour calcul de la vignette avec gd
2949
+    # au dela de 5500000 on considere que php n'est pas limite en memoire pour cette operation
2950
+    # les configurations limitees en memoire ont un seuil plutot vers 1MPixel
2951
+    if (!defined('_IMG_GD_MAX_PIXELS')) {
2952
+        define(
2953
+            '_IMG_GD_MAX_PIXELS',
2954
+            (isset($GLOBALS['meta']['max_taille_vignettes']) and $GLOBALS['meta']['max_taille_vignettes'])
2955
+            ? $GLOBALS['meta']['max_taille_vignettes']
2956
+            : 0
2957
+        );
2958
+    }
2959
+
2960
+    // Protocoles a normaliser dans les chaines de langues
2961
+    if (!defined('_PROTOCOLES_STD')) {
2962
+        define('_PROTOCOLES_STD', 'http|https|ftp|mailto|webcal');
2963
+    }
2964
+
2965
+    init_var_mode();
2967 2966
 }
2968 2967
 
2969 2968
 /**
@@ -2997,136 +2996,136 @@  discard block
 block discarded – undo
2997 2996
  * `   var_mode` (calcul ou recalcul).
2998 2997
  */
2999 2998
 function init_var_mode() {
3000
-	static $done = false;
3001
-	if (!$done) {
3002
-		if (isset($_GET['var_mode'])) {
3003
-			$var_mode = explode(',', $_GET['var_mode']);
3004
-			// tout le monde peut calcul/recalcul
3005
-			if (!defined('_VAR_MODE')) {
3006
-				if (in_array('recalcul', $var_mode)) {
3007
-					define('_VAR_MODE', 'recalcul');
3008
-				} elseif (in_array('calcul', $var_mode)) {
3009
-					define('_VAR_MODE', 'calcul');
3010
-				}
3011
-			}
3012
-			$var_mode = array_diff($var_mode, ['calcul', 'recalcul']);
3013
-			if ($var_mode) {
3014
-				include_spip('inc/autoriser');
3015
-				// autoriser preview si preview seulement, et sinon autoriser debug
3016
-				if (
3017
-					autoriser(
3018
-						($_GET['var_mode'] == 'preview')
3019
-						? 'previsualiser'
3020
-						: 'debug'
3021
-					)
3022
-				) {
3023
-					if (in_array('traduction', $var_mode)) {
3024
-						// forcer le calcul pour passer dans traduire
3025
-						if (!defined('_VAR_MODE')) {
3026
-							define('_VAR_MODE', 'calcul');
3027
-						}
3028
-						// et ne pas enregistrer de cache pour ne pas trainer les surlignages sur d'autres pages
3029
-						if (!defined('_VAR_NOCACHE')) {
3030
-							define('_VAR_NOCACHE', true);
3031
-						}
3032
-						$var_mode = array_diff($var_mode, ['traduction']);
3033
-					}
3034
-					if (in_array('preview', $var_mode)) {
3035
-						// basculer sur les criteres de preview dans les boucles
3036
-						if (!defined('_VAR_PREVIEW')) {
3037
-							define('_VAR_PREVIEW', true);
3038
-						}
3039
-						// forcer le calcul
3040
-						if (!defined('_VAR_MODE')) {
3041
-							define('_VAR_MODE', 'calcul');
3042
-						}
3043
-						// et ne pas enregistrer de cache
3044
-						if (!defined('_VAR_NOCACHE')) {
3045
-							define('_VAR_NOCACHE', true);
3046
-						}
3047
-						$var_mode = array_diff($var_mode, ['preview']);
3048
-					}
3049
-					if (in_array('inclure', $var_mode)) {
3050
-						// forcer le compilo et ignorer les caches existants
3051
-						if (!defined('_VAR_MODE')) {
3052
-							define('_VAR_MODE', 'calcul');
3053
-						}
3054
-						if (!defined('_VAR_INCLURE')) {
3055
-							define('_VAR_INCLURE', true);
3056
-						}
3057
-						// et ne pas enregistrer de cache
3058
-						if (!defined('_VAR_NOCACHE')) {
3059
-							define('_VAR_NOCACHE', true);
3060
-						}
3061
-						$var_mode = array_diff($var_mode, ['inclure']);
3062
-					}
3063
-					if (in_array('urls', $var_mode)) {
3064
-						// forcer le compilo et ignorer les caches existants
3065
-						if (!defined('_VAR_MODE')) {
3066
-							define('_VAR_MODE', 'calcul');
3067
-						}
3068
-						if (!defined('_VAR_URLS')) {
3069
-							define('_VAR_URLS', true);
3070
-						}
3071
-						$var_mode = array_diff($var_mode, ['urls']);
3072
-					}
3073
-					if (in_array('images', $var_mode)) {
3074
-						// forcer le compilo et ignorer les caches existants
3075
-						if (!defined('_VAR_MODE')) {
3076
-							define('_VAR_MODE', 'calcul');
3077
-						}
3078
-						// indiquer qu'on doit recalculer les images
3079
-						if (!defined('_VAR_IMAGES')) {
3080
-							define('_VAR_IMAGES', true);
3081
-						}
3082
-						$var_mode = array_diff($var_mode, ['images']);
3083
-					}
3084
-					if (in_array('debug', $var_mode)) {
3085
-						if (!defined('_VAR_MODE')) {
3086
-							define('_VAR_MODE', 'debug');
3087
-						}
3088
-						// et ne pas enregistrer de cache
3089
-						if (!defined('_VAR_NOCACHE')) {
3090
-							define('_VAR_NOCACHE', true);
3091
-						}
3092
-						$var_mode = array_diff($var_mode, ['debug']);
3093
-					}
3094
-					if (count($var_mode) and !defined('_VAR_MODE')) {
3095
-						define('_VAR_MODE', reset($var_mode));
3096
-					}
3097
-					if (isset($GLOBALS['visiteur_session']['nom'])) {
3098
-						spip_log($GLOBALS['visiteur_session']['nom']
3099
-							. ' ' . _VAR_MODE);
3100
-					}
3101
-				} // pas autorise ?
3102
-				else {
3103
-					// si on n'est pas connecte on se redirige, si on est pas en cli et pas deja en train de se loger
3104
-					if (
3105
-						!$GLOBALS['visiteur_session']
3106
-						and !empty($_SERVER['HTTP_HOST'])
3107
-						and !empty($_SERVER['REQUEST_METHOD'])
3108
-						and $_SERVER['REQUEST_METHOD'] === 'GET'
3109
-					) {
3110
-						$self = self('&', true);
3111
-						if (strpos($self, 'page=login') === false) {
3112
-							include_spip('inc/headers');
3113
-							$redirect = parametre_url(self('&', true), 'var_mode', $_GET['var_mode'], '&');
3114
-							redirige_par_entete(generer_url_public('login', 'url=' . rawurlencode($redirect), true));
3115
-						}
3116
-					}
3117
-					// sinon tant pis
3118
-				}
3119
-			}
3120
-		}
3121
-		if (!defined('_VAR_MODE')) {
3122
-			/**
3123
-			 * Indique le mode de calcul ou d'affichage de la page.
3124
-			 * @see init_var_mode()
3125
-			 */
3126
-			define('_VAR_MODE', false);
3127
-		}
3128
-		$done = true;
3129
-	}
2999
+    static $done = false;
3000
+    if (!$done) {
3001
+        if (isset($_GET['var_mode'])) {
3002
+            $var_mode = explode(',', $_GET['var_mode']);
3003
+            // tout le monde peut calcul/recalcul
3004
+            if (!defined('_VAR_MODE')) {
3005
+                if (in_array('recalcul', $var_mode)) {
3006
+                    define('_VAR_MODE', 'recalcul');
3007
+                } elseif (in_array('calcul', $var_mode)) {
3008
+                    define('_VAR_MODE', 'calcul');
3009
+                }
3010
+            }
3011
+            $var_mode = array_diff($var_mode, ['calcul', 'recalcul']);
3012
+            if ($var_mode) {
3013
+                include_spip('inc/autoriser');
3014
+                // autoriser preview si preview seulement, et sinon autoriser debug
3015
+                if (
3016
+                    autoriser(
3017
+                        ($_GET['var_mode'] == 'preview')
3018
+                        ? 'previsualiser'
3019
+                        : 'debug'
3020
+                    )
3021
+                ) {
3022
+                    if (in_array('traduction', $var_mode)) {
3023
+                        // forcer le calcul pour passer dans traduire
3024
+                        if (!defined('_VAR_MODE')) {
3025
+                            define('_VAR_MODE', 'calcul');
3026
+                        }
3027
+                        // et ne pas enregistrer de cache pour ne pas trainer les surlignages sur d'autres pages
3028
+                        if (!defined('_VAR_NOCACHE')) {
3029
+                            define('_VAR_NOCACHE', true);
3030
+                        }
3031
+                        $var_mode = array_diff($var_mode, ['traduction']);
3032
+                    }
3033
+                    if (in_array('preview', $var_mode)) {
3034
+                        // basculer sur les criteres de preview dans les boucles
3035
+                        if (!defined('_VAR_PREVIEW')) {
3036
+                            define('_VAR_PREVIEW', true);
3037
+                        }
3038
+                        // forcer le calcul
3039
+                        if (!defined('_VAR_MODE')) {
3040
+                            define('_VAR_MODE', 'calcul');
3041
+                        }
3042
+                        // et ne pas enregistrer de cache
3043
+                        if (!defined('_VAR_NOCACHE')) {
3044
+                            define('_VAR_NOCACHE', true);
3045
+                        }
3046
+                        $var_mode = array_diff($var_mode, ['preview']);
3047
+                    }
3048
+                    if (in_array('inclure', $var_mode)) {
3049
+                        // forcer le compilo et ignorer les caches existants
3050
+                        if (!defined('_VAR_MODE')) {
3051
+                            define('_VAR_MODE', 'calcul');
3052
+                        }
3053
+                        if (!defined('_VAR_INCLURE')) {
3054
+                            define('_VAR_INCLURE', true);
3055
+                        }
3056
+                        // et ne pas enregistrer de cache
3057
+                        if (!defined('_VAR_NOCACHE')) {
3058
+                            define('_VAR_NOCACHE', true);
3059
+                        }
3060
+                        $var_mode = array_diff($var_mode, ['inclure']);
3061
+                    }
3062
+                    if (in_array('urls', $var_mode)) {
3063
+                        // forcer le compilo et ignorer les caches existants
3064
+                        if (!defined('_VAR_MODE')) {
3065
+                            define('_VAR_MODE', 'calcul');
3066
+                        }
3067
+                        if (!defined('_VAR_URLS')) {
3068
+                            define('_VAR_URLS', true);
3069
+                        }
3070
+                        $var_mode = array_diff($var_mode, ['urls']);
3071
+                    }
3072
+                    if (in_array('images', $var_mode)) {
3073
+                        // forcer le compilo et ignorer les caches existants
3074
+                        if (!defined('_VAR_MODE')) {
3075
+                            define('_VAR_MODE', 'calcul');
3076
+                        }
3077
+                        // indiquer qu'on doit recalculer les images
3078
+                        if (!defined('_VAR_IMAGES')) {
3079
+                            define('_VAR_IMAGES', true);
3080
+                        }
3081
+                        $var_mode = array_diff($var_mode, ['images']);
3082
+                    }
3083
+                    if (in_array('debug', $var_mode)) {
3084
+                        if (!defined('_VAR_MODE')) {
3085
+                            define('_VAR_MODE', 'debug');
3086
+                        }
3087
+                        // et ne pas enregistrer de cache
3088
+                        if (!defined('_VAR_NOCACHE')) {
3089
+                            define('_VAR_NOCACHE', true);
3090
+                        }
3091
+                        $var_mode = array_diff($var_mode, ['debug']);
3092
+                    }
3093
+                    if (count($var_mode) and !defined('_VAR_MODE')) {
3094
+                        define('_VAR_MODE', reset($var_mode));
3095
+                    }
3096
+                    if (isset($GLOBALS['visiteur_session']['nom'])) {
3097
+                        spip_log($GLOBALS['visiteur_session']['nom']
3098
+                            . ' ' . _VAR_MODE);
3099
+                    }
3100
+                } // pas autorise ?
3101
+                else {
3102
+                    // si on n'est pas connecte on se redirige, si on est pas en cli et pas deja en train de se loger
3103
+                    if (
3104
+                        !$GLOBALS['visiteur_session']
3105
+                        and !empty($_SERVER['HTTP_HOST'])
3106
+                        and !empty($_SERVER['REQUEST_METHOD'])
3107
+                        and $_SERVER['REQUEST_METHOD'] === 'GET'
3108
+                    ) {
3109
+                        $self = self('&', true);
3110
+                        if (strpos($self, 'page=login') === false) {
3111
+                            include_spip('inc/headers');
3112
+                            $redirect = parametre_url(self('&', true), 'var_mode', $_GET['var_mode'], '&');
3113
+                            redirige_par_entete(generer_url_public('login', 'url=' . rawurlencode($redirect), true));
3114
+                        }
3115
+                    }
3116
+                    // sinon tant pis
3117
+                }
3118
+            }
3119
+        }
3120
+        if (!defined('_VAR_MODE')) {
3121
+            /**
3122
+             * Indique le mode de calcul ou d'affichage de la page.
3123
+             * @see init_var_mode()
3124
+             */
3125
+            define('_VAR_MODE', false);
3126
+        }
3127
+        $done = true;
3128
+    }
3130 3129
 }
3131 3130
 
3132 3131
 /**
@@ -3138,16 +3137,16 @@  discard block
 block discarded – undo
3138 3137
  * @param bool $deep = true : appliquer récursivement
3139 3138
 **/
3140 3139
 function spip_desinfecte(&$t, $deep = true) {
3141
-	foreach ($t as $key => $val) {
3142
-		if (is_string($t[$key])) {
3143
-			$t[$key] = str_replace(chr(0), '-', $t[$key]);
3144
-		} // traiter aussi les "texte_plus" de article_edit
3145
-		else {
3146
-			if ($deep and is_array($t[$key]) and $key !== 'GLOBALS') {
3147
-				spip_desinfecte($t[$key], $deep);
3148
-			}
3149
-		}
3150
-	}
3140
+    foreach ($t as $key => $val) {
3141
+        if (is_string($t[$key])) {
3142
+            $t[$key] = str_replace(chr(0), '-', $t[$key]);
3143
+        } // traiter aussi les "texte_plus" de article_edit
3144
+        else {
3145
+            if ($deep and is_array($t[$key]) and $key !== 'GLOBALS') {
3146
+                spip_desinfecte($t[$key], $deep);
3147
+            }
3148
+        }
3149
+    }
3151 3150
 }
3152 3151
 
3153 3152
 /**
@@ -3160,64 +3159,64 @@  discard block
 block discarded – undo
3160 3159
  * @return string|0|false
3161 3160
 **/
3162 3161
 function verifier_visiteur() {
3163
-	@spip_initialisation_core(
3164
-		(_DIR_RACINE . _NOM_PERMANENTS_INACCESSIBLES),
3165
-		(_DIR_RACINE . _NOM_PERMANENTS_ACCESSIBLES),
3166
-		(_DIR_RACINE . _NOM_TEMPORAIRES_INACCESSIBLES),
3167
-		(_DIR_RACINE . _NOM_TEMPORAIRES_ACCESSIBLES)
3168
-	);
3169
-
3170
-	// Demarrer une session NON AUTHENTIFIEE si on donne son nom
3171
-	// dans un formulaire sans login (ex: #FORMULAIRE_FORUM)
3172
-	// Attention on separe bien session_nom et nom, pour eviter
3173
-	// les melanges entre donnees SQL et variables plus aleatoires
3174
-	$variables_session = ['session_nom', 'session_email'];
3175
-	foreach ($variables_session as $var) {
3176
-		if (_request($var) !== null) {
3177
-			$init = true;
3178
-			break;
3179
-		}
3180
-	}
3181
-	if (isset($init)) {
3182
-		#@spip_initialisation_suite();
3183
-		$session = charger_fonction('session', 'inc');
3184
-		$session();
3185
-		include_spip('inc/texte');
3186
-		foreach ($variables_session as $var) {
3187
-			if (($a = _request($var)) !== null) {
3188
-				$GLOBALS['visiteur_session'][$var] = safehtml($a);
3189
-			}
3190
-		}
3191
-		if (!isset($GLOBALS['visiteur_session']['id_auteur'])) {
3192
-			$GLOBALS['visiteur_session']['id_auteur'] = 0;
3193
-		}
3194
-		$session($GLOBALS['visiteur_session']);
3195
-
3196
-		return 0;
3197
-	}
3198
-
3199
-	$h = (isset($_SERVER['PHP_AUTH_USER']) and !$GLOBALS['ignore_auth_http']);
3200
-	if ($h or isset($_COOKIE['spip_session']) or isset($_COOKIE[$GLOBALS['cookie_prefix'] . '_session'])) {
3201
-		$session = charger_fonction('session', 'inc');
3202
-		if ($session()) {
3203
-			return $GLOBALS['visiteur_session']['statut'];
3204
-		}
3205
-		if ($h and isset($_SERVER['PHP_AUTH_PW'])) {
3206
-			include_spip('inc/auth');
3207
-			$h = lire_php_auth($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']);
3208
-		}
3209
-		if ($h) {
3210
-			$GLOBALS['visiteur_session'] = $h;
3211
-
3212
-			return $GLOBALS['visiteur_session']['statut'];
3213
-		}
3214
-	}
3215
-
3216
-	// au moins son navigateur nous dit la langue preferee de cet inconnu
3217
-	include_spip('inc/lang');
3218
-	utiliser_langue_visiteur();
3219
-
3220
-	return false;
3162
+    @spip_initialisation_core(
3163
+        (_DIR_RACINE . _NOM_PERMANENTS_INACCESSIBLES),
3164
+        (_DIR_RACINE . _NOM_PERMANENTS_ACCESSIBLES),
3165
+        (_DIR_RACINE . _NOM_TEMPORAIRES_INACCESSIBLES),
3166
+        (_DIR_RACINE . _NOM_TEMPORAIRES_ACCESSIBLES)
3167
+    );
3168
+
3169
+    // Demarrer une session NON AUTHENTIFIEE si on donne son nom
3170
+    // dans un formulaire sans login (ex: #FORMULAIRE_FORUM)
3171
+    // Attention on separe bien session_nom et nom, pour eviter
3172
+    // les melanges entre donnees SQL et variables plus aleatoires
3173
+    $variables_session = ['session_nom', 'session_email'];
3174
+    foreach ($variables_session as $var) {
3175
+        if (_request($var) !== null) {
3176
+            $init = true;
3177
+            break;
3178
+        }
3179
+    }
3180
+    if (isset($init)) {
3181
+        #@spip_initialisation_suite();
3182
+        $session = charger_fonction('session', 'inc');
3183
+        $session();
3184
+        include_spip('inc/texte');
3185
+        foreach ($variables_session as $var) {
3186
+            if (($a = _request($var)) !== null) {
3187
+                $GLOBALS['visiteur_session'][$var] = safehtml($a);
3188
+            }
3189
+        }
3190
+        if (!isset($GLOBALS['visiteur_session']['id_auteur'])) {
3191
+            $GLOBALS['visiteur_session']['id_auteur'] = 0;
3192
+        }
3193
+        $session($GLOBALS['visiteur_session']);
3194
+
3195
+        return 0;
3196
+    }
3197
+
3198
+    $h = (isset($_SERVER['PHP_AUTH_USER']) and !$GLOBALS['ignore_auth_http']);
3199
+    if ($h or isset($_COOKIE['spip_session']) or isset($_COOKIE[$GLOBALS['cookie_prefix'] . '_session'])) {
3200
+        $session = charger_fonction('session', 'inc');
3201
+        if ($session()) {
3202
+            return $GLOBALS['visiteur_session']['statut'];
3203
+        }
3204
+        if ($h and isset($_SERVER['PHP_AUTH_PW'])) {
3205
+            include_spip('inc/auth');
3206
+            $h = lire_php_auth($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']);
3207
+        }
3208
+        if ($h) {
3209
+            $GLOBALS['visiteur_session'] = $h;
3210
+
3211
+            return $GLOBALS['visiteur_session']['statut'];
3212
+        }
3213
+    }
3214
+
3215
+    // au moins son navigateur nous dit la langue preferee de cet inconnu
3216
+    include_spip('inc/lang');
3217
+    utiliser_langue_visiteur();
3218
+
3219
+    return false;
3221 3220
 }
3222 3221
 
3223 3222
 
@@ -3240,21 +3239,21 @@  discard block
 block discarded – undo
3240 3239
  *     - string Langue utilisée.
3241 3240
  **/
3242 3241
 function lang_select($lang = null) {
3243
-	static $pile_langues = [];
3244
-	if (!function_exists('changer_langue')) {
3245
-		include_spip('inc/lang');
3246
-	}
3247
-	if ($lang === null) {
3248
-		$lang = array_pop($pile_langues);
3249
-	} else {
3250
-		array_push($pile_langues, $GLOBALS['spip_lang']);
3251
-	}
3252
-	if (isset($GLOBALS['spip_lang']) and $lang == $GLOBALS['spip_lang']) {
3253
-		return $lang;
3254
-	}
3255
-	changer_langue($lang);
3242
+    static $pile_langues = [];
3243
+    if (!function_exists('changer_langue')) {
3244
+        include_spip('inc/lang');
3245
+    }
3246
+    if ($lang === null) {
3247
+        $lang = array_pop($pile_langues);
3248
+    } else {
3249
+        array_push($pile_langues, $GLOBALS['spip_lang']);
3250
+    }
3251
+    if (isset($GLOBALS['spip_lang']) and $lang == $GLOBALS['spip_lang']) {
3252
+        return $lang;
3253
+    }
3254
+    changer_langue($lang);
3256 3255
 
3257
-	return $lang;
3256
+    return $lang;
3258 3257
 }
3259 3258
 
3260 3259
 /**
@@ -3271,20 +3270,20 @@  discard block
 block discarded – undo
3271 3270
  *     Identifiant de la session
3272 3271
  **/
3273 3272
 function spip_session($force = false) {
3274
-	static $session;
3275
-	if ($force or !isset($session)) {
3276
-		$s = pipeline(
3277
-			'definir_session',
3278
-			$GLOBALS['visiteur_session']
3279
-				? serialize($GLOBALS['visiteur_session'])
3280
-				. '_' . @$_COOKIE['spip_session']
3281
-				: ''
3282
-		);
3283
-		$session = $s ? substr(md5($s), 0, 8) : '';
3284
-	}
3273
+    static $session;
3274
+    if ($force or !isset($session)) {
3275
+        $s = pipeline(
3276
+            'definir_session',
3277
+            $GLOBALS['visiteur_session']
3278
+                ? serialize($GLOBALS['visiteur_session'])
3279
+                . '_' . @$_COOKIE['spip_session']
3280
+                : ''
3281
+        );
3282
+        $session = $s ? substr(md5($s), 0, 8) : '';
3283
+    }
3285 3284
 
3286
-	#spip_log('session: '.$session);
3287
-	return $session;
3285
+    #spip_log('session: '.$session);
3286
+    return $session;
3288 3287
 }
3289 3288
 
3290 3289
 
@@ -3303,9 +3302,9 @@  discard block
 block discarded – undo
3303 3302
  *    Lien sur une icone d'aide
3304 3303
  **/
3305 3304
 function aider($aide = '', $distante = false) {
3306
-	$aider = charger_fonction('aide', 'inc', true);
3305
+    $aider = charger_fonction('aide', 'inc', true);
3307 3306
 
3308
-	return $aider ? $aider($aide, '', [], $distante) : '';
3307
+    return $aider ? $aider($aide, '', [], $distante) : '';
3309 3308
 }
3310 3309
 
3311 3310
 /**
@@ -3315,35 +3314,35 @@  discard block
 block discarded – undo
3315 3314
  */
3316 3315
 function exec_info_dist() {
3317 3316
 
3318
-	include_spip('inc/autoriser');
3319
-	if (autoriser('phpinfos')) {
3320
-		$cookies_masques = ['spip_session', 'PHPSESSID'];
3321
-		$cookies_backup = [];
3322
-		$server_backup = ['HTTP_COOKIE' => $_SERVER['HTTP_COOKIE'] ?? []];
3323
-		$env_backup = ['HTTP_COOKIE' => $_ENV['HTTP_COOKIE'] ?? []];
3324
-		$mask = '******************************';
3325
-		foreach ($cookies_masques as $k) {
3326
-			if (!empty($_COOKIE[$k])) {
3327
-				$cookies_backup[$k] = $_COOKIE[$k];
3328
-				$_SERVER['HTTP_COOKIE'] = str_replace("$k=" . $_COOKIE[$k], "$k=$mask", $_SERVER['HTTP_COOKIE'] ?? []);
3329
-				$_ENV['HTTP_COOKIE'] = str_replace("$k=" . $_COOKIE[$k], "$k=$mask", $_ENV['HTTP_COOKIE'] ?? []);
3330
-				$_COOKIE[$k] = $mask;
3331
-			}
3332
-		}
3333
-		phpinfo();
3334
-		foreach ($cookies_backup as $k => $v) {
3335
-			$_COOKIE[$k] = $v;
3336
-		}
3337
-		foreach ($server_backup as $k => $v) {
3338
-			$_SERVER[$k] = $v;
3339
-		}
3340
-		foreach ($env_backup as $k => $v) {
3341
-			$_ENV[$k] = $v;
3342
-		}
3343
-	} else {
3344
-		include_spip('inc/filtres');
3345
-		sinon_interdire_acces();
3346
-	}
3317
+    include_spip('inc/autoriser');
3318
+    if (autoriser('phpinfos')) {
3319
+        $cookies_masques = ['spip_session', 'PHPSESSID'];
3320
+        $cookies_backup = [];
3321
+        $server_backup = ['HTTP_COOKIE' => $_SERVER['HTTP_COOKIE'] ?? []];
3322
+        $env_backup = ['HTTP_COOKIE' => $_ENV['HTTP_COOKIE'] ?? []];
3323
+        $mask = '******************************';
3324
+        foreach ($cookies_masques as $k) {
3325
+            if (!empty($_COOKIE[$k])) {
3326
+                $cookies_backup[$k] = $_COOKIE[$k];
3327
+                $_SERVER['HTTP_COOKIE'] = str_replace("$k=" . $_COOKIE[$k], "$k=$mask", $_SERVER['HTTP_COOKIE'] ?? []);
3328
+                $_ENV['HTTP_COOKIE'] = str_replace("$k=" . $_COOKIE[$k], "$k=$mask", $_ENV['HTTP_COOKIE'] ?? []);
3329
+                $_COOKIE[$k] = $mask;
3330
+            }
3331
+        }
3332
+        phpinfo();
3333
+        foreach ($cookies_backup as $k => $v) {
3334
+            $_COOKIE[$k] = $v;
3335
+        }
3336
+        foreach ($server_backup as $k => $v) {
3337
+            $_SERVER[$k] = $v;
3338
+        }
3339
+        foreach ($env_backup as $k => $v) {
3340
+            $_ENV[$k] = $v;
3341
+        }
3342
+    } else {
3343
+        include_spip('inc/filtres');
3344
+        sinon_interdire_acces();
3345
+    }
3347 3346
 }
3348 3347
 
3349 3348
 /**
@@ -3363,13 +3362,13 @@  discard block
 block discarded – undo
3363 3362
  *     - string si $message à false.
3364 3363
  **/
3365 3364
 function erreur_squelette($message = '', $lieu = '') {
3366
-	$debusquer = charger_fonction('debusquer', 'public');
3367
-	if (is_array($lieu)) {
3368
-		include_spip('public/compiler');
3369
-		$lieu = reconstruire_contexte_compil($lieu);
3370
-	}
3365
+    $debusquer = charger_fonction('debusquer', 'public');
3366
+    if (is_array($lieu)) {
3367
+        include_spip('public/compiler');
3368
+        $lieu = reconstruire_contexte_compil($lieu);
3369
+    }
3371 3370
 
3372
-	return $debusquer($message, $lieu);
3371
+    return $debusquer($message, $lieu);
3373 3372
 }
3374 3373
 
3375 3374
 /**
@@ -3406,108 +3405,108 @@  discard block
 block discarded – undo
3406 3405
  *     - ou tableau d'information sur le squelette.
3407 3406
  */
3408 3407
 function recuperer_fond($fond, $contexte = [], $options = [], string $connect = '') {
3409
-	if (!function_exists('evaluer_fond')) {
3410
-		include_spip('public/assembler');
3411
-	}
3412
-	// assurer la compat avec l'ancienne syntaxe
3413
-	// (trim etait le 3eme argument, par defaut a true)
3414
-	if (!is_array($options)) {
3415
-		$options = ['trim' => $options];
3416
-	}
3417
-	if (!isset($options['trim'])) {
3418
-		$options['trim'] = true;
3419
-	}
3420
-
3421
-	if (isset($contexte['connect'])) {
3422
-		$connect = $contexte['connect'];
3423
-		unset($contexte['connect']);
3424
-	}
3425
-
3426
-	$texte = '';
3427
-	$pages = [];
3428
-	$lang_select = '';
3429
-	if (!isset($options['etoile']) or !$options['etoile']) {
3430
-		// Si on a inclus sans fixer le critere de lang, on prend la langue courante
3431
-		if (!isset($contexte['lang'])) {
3432
-			$contexte['lang'] = $GLOBALS['spip_lang'];
3433
-		}
3434
-
3435
-		if ($contexte['lang'] != $GLOBALS['meta']['langue_site']) {
3436
-			$lang_select = lang_select($contexte['lang']);
3437
-		}
3438
-	}
3439
-
3440
-	if (!isset($GLOBALS['_INC_PUBLIC'])) {
3441
-		$GLOBALS['_INC_PUBLIC'] = 0;
3442
-	}
3443
-
3444
-	$GLOBALS['_INC_PUBLIC']++;
3445
-
3446
-	// fix #4235
3447
-	$cache_utilise_session_appelant	= ($GLOBALS['cache_utilise_session'] ?? null);
3448
-
3449
-
3450
-	foreach (is_array($fond) ? $fond : [$fond] as $f) {
3451
-		unset($GLOBALS['cache_utilise_session']);	// fix #4235
3452
-
3453
-		$page = evaluer_fond($f, $contexte, $connect);
3454
-		if ($page === '') {
3455
-			$c = $options['compil'] ?? '';
3456
-			$a = ['fichier' => $f];
3457
-			$erreur = _T('info_erreur_squelette2', $a); // squelette introuvable
3458
-			erreur_squelette($erreur, $c);
3459
-			// eviter des erreurs strictes ensuite sur $page['cle'] en PHP >= 5.4
3460
-			$page = ['texte' => '', 'erreur' => $erreur];
3461
-		}
3462
-
3463
-		$page = pipeline('recuperer_fond', [
3464
-			'args' => ['fond' => $f, 'contexte' => $contexte, 'options' => $options, 'connect' => $connect],
3465
-			'data' => $page
3466
-		]);
3467
-		if (isset($options['ajax']) and $options['ajax']) {
3468
-			if (!function_exists('encoder_contexte_ajax')) {
3469
-				include_spip('inc/filtres');
3470
-			}
3471
-			$page['texte'] = encoder_contexte_ajax(
3472
-				array_merge(
3473
-					$contexte,
3474
-					['fond' => $f],
3475
-					($connect ? ['connect' => $connect] : [])
3476
-				),
3477
-				'',
3478
-				$page['texte'],
3479
-				$options['ajax']
3480
-			);
3481
-		}
3482
-
3483
-		if (isset($options['raw']) and $options['raw']) {
3484
-			$pages[] = $page;
3485
-		} else {
3486
-			$texte .= $options['trim'] ? rtrim($page['texte'] ?? '') : $page['texte'];
3487
-		}
3488
-
3489
-		// contamination de la session appelante, pour les inclusions statiques
3490
-		if (isset($page['invalideurs']['session'])) {
3491
-			$cache_utilise_session_appelant = $page['invalideurs']['session'];
3492
-		}
3493
-	}
3494
-
3495
-	// restaurer le sessionnement du contexte appelant,
3496
-	// éventuellement contaminé si on vient de récupérer une inclusion statique sessionnée
3497
-	if (isset($cache_utilise_session_appelant)) {
3498
-		$GLOBALS['cache_utilise_session'] = $cache_utilise_session_appelant;
3499
-	}
3500
-
3501
-	$GLOBALS['_INC_PUBLIC']--;
3502
-
3503
-	if ($lang_select) {
3504
-		lang_select();
3505
-	}
3506
-	if (isset($options['raw']) and $options['raw']) {
3507
-		return is_array($fond) ? $pages : reset($pages);
3508
-	} else {
3509
-		return $options['trim'] ? ltrim($texte) : $texte;
3510
-	}
3408
+    if (!function_exists('evaluer_fond')) {
3409
+        include_spip('public/assembler');
3410
+    }
3411
+    // assurer la compat avec l'ancienne syntaxe
3412
+    // (trim etait le 3eme argument, par defaut a true)
3413
+    if (!is_array($options)) {
3414
+        $options = ['trim' => $options];
3415
+    }
3416
+    if (!isset($options['trim'])) {
3417
+        $options['trim'] = true;
3418
+    }
3419
+
3420
+    if (isset($contexte['connect'])) {
3421
+        $connect = $contexte['connect'];
3422
+        unset($contexte['connect']);
3423
+    }
3424
+
3425
+    $texte = '';
3426
+    $pages = [];
3427
+    $lang_select = '';
3428
+    if (!isset($options['etoile']) or !$options['etoile']) {
3429
+        // Si on a inclus sans fixer le critere de lang, on prend la langue courante
3430
+        if (!isset($contexte['lang'])) {
3431
+            $contexte['lang'] = $GLOBALS['spip_lang'];
3432
+        }
3433
+
3434
+        if ($contexte['lang'] != $GLOBALS['meta']['langue_site']) {
3435
+            $lang_select = lang_select($contexte['lang']);
3436
+        }
3437
+    }
3438
+
3439
+    if (!isset($GLOBALS['_INC_PUBLIC'])) {
3440
+        $GLOBALS['_INC_PUBLIC'] = 0;
3441
+    }
3442
+
3443
+    $GLOBALS['_INC_PUBLIC']++;
3444
+
3445
+    // fix #4235
3446
+    $cache_utilise_session_appelant	= ($GLOBALS['cache_utilise_session'] ?? null);
3447
+
3448
+
3449
+    foreach (is_array($fond) ? $fond : [$fond] as $f) {
3450
+        unset($GLOBALS['cache_utilise_session']);	// fix #4235
3451
+
3452
+        $page = evaluer_fond($f, $contexte, $connect);
3453
+        if ($page === '') {
3454
+            $c = $options['compil'] ?? '';
3455
+            $a = ['fichier' => $f];
3456
+            $erreur = _T('info_erreur_squelette2', $a); // squelette introuvable
3457
+            erreur_squelette($erreur, $c);
3458
+            // eviter des erreurs strictes ensuite sur $page['cle'] en PHP >= 5.4
3459
+            $page = ['texte' => '', 'erreur' => $erreur];
3460
+        }
3461
+
3462
+        $page = pipeline('recuperer_fond', [
3463
+            'args' => ['fond' => $f, 'contexte' => $contexte, 'options' => $options, 'connect' => $connect],
3464
+            'data' => $page
3465
+        ]);
3466
+        if (isset($options['ajax']) and $options['ajax']) {
3467
+            if (!function_exists('encoder_contexte_ajax')) {
3468
+                include_spip('inc/filtres');
3469
+            }
3470
+            $page['texte'] = encoder_contexte_ajax(
3471
+                array_merge(
3472
+                    $contexte,
3473
+                    ['fond' => $f],
3474
+                    ($connect ? ['connect' => $connect] : [])
3475
+                ),
3476
+                '',
3477
+                $page['texte'],
3478
+                $options['ajax']
3479
+            );
3480
+        }
3481
+
3482
+        if (isset($options['raw']) and $options['raw']) {
3483
+            $pages[] = $page;
3484
+        } else {
3485
+            $texte .= $options['trim'] ? rtrim($page['texte'] ?? '') : $page['texte'];
3486
+        }
3487
+
3488
+        // contamination de la session appelante, pour les inclusions statiques
3489
+        if (isset($page['invalideurs']['session'])) {
3490
+            $cache_utilise_session_appelant = $page['invalideurs']['session'];
3491
+        }
3492
+    }
3493
+
3494
+    // restaurer le sessionnement du contexte appelant,
3495
+    // éventuellement contaminé si on vient de récupérer une inclusion statique sessionnée
3496
+    if (isset($cache_utilise_session_appelant)) {
3497
+        $GLOBALS['cache_utilise_session'] = $cache_utilise_session_appelant;
3498
+    }
3499
+
3500
+    $GLOBALS['_INC_PUBLIC']--;
3501
+
3502
+    if ($lang_select) {
3503
+        lang_select();
3504
+    }
3505
+    if (isset($options['raw']) and $options['raw']) {
3506
+        return is_array($fond) ? $pages : reset($pages);
3507
+    } else {
3508
+        return $options['trim'] ? ltrim($texte) : $texte;
3509
+    }
3511 3510
 }
3512 3511
 
3513 3512
 /**
@@ -3517,7 +3516,7 @@  discard block
 block discarded – undo
3517 3516
  * @return string
3518 3517
  */
3519 3518
 function trouve_modele($nom) {
3520
-	return trouver_fond($nom, 'modeles/');
3519
+    return trouver_fond($nom, 'modeles/');
3521 3520
 }
3522 3521
 
3523 3522
 /**
@@ -3533,21 +3532,21 @@  discard block
 block discarded – undo
3533 3532
  * @return array|string
3534 3533
  */
3535 3534
 function trouver_fond($nom, $dir = '', $pathinfo = false) {
3536
-	$f = find_in_path($nom . '.' . _EXTENSION_SQUELETTES, $dir ? rtrim($dir, '/') . '/' : '');
3537
-	if (!$pathinfo) {
3538
-		return $f;
3539
-	}
3540
-	// renvoyer un tableau detaille si $pathinfo==true
3541
-	$p = pathinfo($f);
3542
-	if (!isset($p['extension']) or !$p['extension']) {
3543
-		$p['extension'] = _EXTENSION_SQUELETTES;
3544
-	}
3545
-	if (!isset($p['extension']) or !$p['filename']) {
3546
-		$p['filename'] = ($p['basename'] ? substr($p['basename'], 0, -strlen($p['extension']) - 1) : '');
3547
-	}
3548
-	$p['fond'] = ($f ? substr($f, 0, -strlen($p['extension']) - 1) : '');
3535
+    $f = find_in_path($nom . '.' . _EXTENSION_SQUELETTES, $dir ? rtrim($dir, '/') . '/' : '');
3536
+    if (!$pathinfo) {
3537
+        return $f;
3538
+    }
3539
+    // renvoyer un tableau detaille si $pathinfo==true
3540
+    $p = pathinfo($f);
3541
+    if (!isset($p['extension']) or !$p['extension']) {
3542
+        $p['extension'] = _EXTENSION_SQUELETTES;
3543
+    }
3544
+    if (!isset($p['extension']) or !$p['filename']) {
3545
+        $p['filename'] = ($p['basename'] ? substr($p['basename'], 0, -strlen($p['extension']) - 1) : '');
3546
+    }
3547
+    $p['fond'] = ($f ? substr($f, 0, -strlen($p['extension']) - 1) : '');
3549 3548
 
3550
-	return $p;
3549
+    return $p;
3551 3550
 }
3552 3551
 
3553 3552
 /**
@@ -3567,21 +3566,21 @@  discard block
 block discarded – undo
3567 3566
  *     Nom de l'exec, sinon chaîne vide.
3568 3567
  **/
3569 3568
 function tester_url_ecrire($nom) {
3570
-	static $exec = [];
3571
-	if (isset($exec[$nom])) {
3572
-		return $exec[$nom];
3573
-	}
3574
-	// tester si c'est une page en squelette
3575
-	if (trouver_fond($nom, 'prive/squelettes/contenu/')) {
3576
-		return $exec[$nom] = 'fond';
3577
-	} // echafaudage d'un fond !
3578
-	elseif (include_spip('public/styliser_par_z') and z_echafaudable($nom)) {
3579
-		return $exec[$nom] = 'fond';
3580
-	}
3581
-	// attention, il ne faut pas inclure l'exec ici
3582
-	// car sinon #URL_ECRIRE provoque des inclusions
3583
-	// et des define intrusifs potentiels
3584
-	return $exec[$nom] = ((find_in_path("{$nom}.php", 'exec/') or charger_fonction($nom, 'exec', true)) ? $nom : '');
3569
+    static $exec = [];
3570
+    if (isset($exec[$nom])) {
3571
+        return $exec[$nom];
3572
+    }
3573
+    // tester si c'est une page en squelette
3574
+    if (trouver_fond($nom, 'prive/squelettes/contenu/')) {
3575
+        return $exec[$nom] = 'fond';
3576
+    } // echafaudage d'un fond !
3577
+    elseif (include_spip('public/styliser_par_z') and z_echafaudable($nom)) {
3578
+        return $exec[$nom] = 'fond';
3579
+    }
3580
+    // attention, il ne faut pas inclure l'exec ici
3581
+    // car sinon #URL_ECRIRE provoque des inclusions
3582
+    // et des define intrusifs potentiels
3583
+    return $exec[$nom] = ((find_in_path("{$nom}.php", 'exec/') or charger_fonction($nom, 'exec', true)) ? $nom : '');
3585 3584
 }
3586 3585
 
3587 3586
 /**
@@ -3591,37 +3590,37 @@  discard block
 block discarded – undo
3591 3590
  *     true si la constante _VERSION_HTML n'est pas définie ou égale à html5
3592 3591
  **/
3593 3592
 function html5_permis() {
3594
-	return (!defined('_VERSION_HTML')
3595
-		or _VERSION_HTML !== 'html4');
3593
+    return (!defined('_VERSION_HTML')
3594
+        or _VERSION_HTML !== 'html4');
3596 3595
 }
3597 3596
 
3598 3597
 /**
3599 3598
  * Lister les formats image acceptes par les lib et fonctions images
3600 3599
  */
3601 3600
 function formats_image_acceptables(?bool $gd = null, bool $svg_allowed = true): array {
3602
-	$formats = null;
3603
-	if (!is_null($gd)) {
3604
-		$config = ($gd ? 'gd_formats' : 'formats_graphiques');
3605
-		if (isset($GLOBALS['meta'][$config])) {
3606
-			$formats = $GLOBALS['meta'][$config];
3607
-			$formats = explode(',', $formats);
3608
-			$formats = array_filter($formats);
3609
-			$formats = array_map('trim', $formats);
3610
-		}
3611
-	}
3612
-	if (is_null($formats)) {
3613
-		include_spip('inc/filtres_images_lib_mini');
3614
-		$formats = _image_extensions_acceptees_en_entree();
3615
-	}
3616
-
3617
-	if ($svg_allowed) {
3618
-		if (!in_array('svg', $formats)) {
3619
-			$formats[] = 'svg';
3620
-		}
3621
-	} else {
3622
-		$formats = array_diff($formats, ['svg']);
3623
-	}
3624
-	return $formats;
3601
+    $formats = null;
3602
+    if (!is_null($gd)) {
3603
+        $config = ($gd ? 'gd_formats' : 'formats_graphiques');
3604
+        if (isset($GLOBALS['meta'][$config])) {
3605
+            $formats = $GLOBALS['meta'][$config];
3606
+            $formats = explode(',', $formats);
3607
+            $formats = array_filter($formats);
3608
+            $formats = array_map('trim', $formats);
3609
+        }
3610
+    }
3611
+    if (is_null($formats)) {
3612
+        include_spip('inc/filtres_images_lib_mini');
3613
+        $formats = _image_extensions_acceptees_en_entree();
3614
+    }
3615
+
3616
+    if ($svg_allowed) {
3617
+        if (!in_array('svg', $formats)) {
3618
+            $formats[] = 'svg';
3619
+        }
3620
+    } else {
3621
+        $formats = array_diff($formats, ['svg']);
3622
+    }
3623
+    return $formats;
3625 3624
 }
3626 3625
 
3627 3626
 /**
@@ -3630,20 +3629,20 @@  discard block
 block discarded – undo
3630 3629
  * @return array|bool
3631 3630
  */
3632 3631
 function spip_getimagesize($fichier) {
3633
-	if (!$imagesize = @getimagesize($fichier)) {
3634
-		include_spip('inc/svg');
3635
-		if ($attrs = svg_lire_attributs($fichier)) {
3636
-			[$width, $height, $viewbox] = svg_getimagesize_from_attr($attrs);
3637
-			$imagesize = [
3638
-				$width,
3639
-				$height,
3640
-				IMAGETYPE_SVG,
3641
-				"width=\"{$width}\" height=\"{$height}\"",
3642
-				'mime' => 'image/svg+xml'
3643
-			];
3644
-		}
3645
-	}
3646
-	return $imagesize;
3632
+    if (!$imagesize = @getimagesize($fichier)) {
3633
+        include_spip('inc/svg');
3634
+        if ($attrs = svg_lire_attributs($fichier)) {
3635
+            [$width, $height, $viewbox] = svg_getimagesize_from_attr($attrs);
3636
+            $imagesize = [
3637
+                $width,
3638
+                $height,
3639
+                IMAGETYPE_SVG,
3640
+                "width=\"{$width}\" height=\"{$height}\"",
3641
+                'mime' => 'image/svg+xml'
3642
+            ];
3643
+        }
3644
+    }
3645
+    return $imagesize;
3647 3646
 }
3648 3647
 
3649 3648
 /**
@@ -3657,19 +3656,19 @@  discard block
 block discarded – undo
3657 3656
  * @param string $statut
3658 3657
  */
3659 3658
 function avertir_auteurs($nom, $message, $statut = '') {
3660
-	$alertes = $GLOBALS['meta']['message_alertes_auteurs'];
3661
-	if (
3662
-		!$alertes
3663
-		or !is_array($alertes = unserialize($alertes))
3664
-	) {
3665
-		$alertes = [];
3666
-	}
3659
+    $alertes = $GLOBALS['meta']['message_alertes_auteurs'];
3660
+    if (
3661
+        !$alertes
3662
+        or !is_array($alertes = unserialize($alertes))
3663
+    ) {
3664
+        $alertes = [];
3665
+    }
3667 3666
 
3668
-	if (!isset($alertes[$statut])) {
3669
-		$alertes[$statut] = [];
3670
-	}
3671
-	$alertes[$statut][$nom] = $message;
3672
-	ecrire_meta('message_alertes_auteurs', serialize($alertes));
3667
+    if (!isset($alertes[$statut])) {
3668
+        $alertes[$statut] = [];
3669
+    }
3670
+    $alertes[$statut][$nom] = $message;
3671
+    ecrire_meta('message_alertes_auteurs', serialize($alertes));
3673 3672
 }
3674 3673
 
3675 3674
 /**
@@ -3683,10 +3682,10 @@  discard block
 block discarded – undo
3683 3682
  * @return string|string[]
3684 3683
  */
3685 3684
 function spip_sanitize_classname($classes) {
3686
-	if (is_array($classes)) {
3687
-		return array_map('spip_sanitize_classname', $classes);
3688
-	}
3689
-	return preg_replace('/[^ 0-9a-z_\-+@]/i', '', $classes);
3685
+    if (is_array($classes)) {
3686
+        return array_map('spip_sanitize_classname', $classes);
3687
+    }
3688
+    return preg_replace('/[^ 0-9a-z_\-+@]/i', '', $classes);
3690 3689
 }
3691 3690
 
3692 3691
 
@@ -3711,32 +3710,32 @@  discard block
 block discarded – undo
3711 3710
  *    Avec operateur : bool.
3712 3711
  **/
3713 3712
 function spip_version_compare($v1, $v2, $op = null) {
3714
-	$v1 = strtolower(preg_replace(',([0-9])[\s.-]?(dev|alpha|a|beta|b|rc|pl|p),i', '\\1.\\2', $v1));
3715
-	$v2 = strtolower(preg_replace(',([0-9])[\s.-]?(dev|alpha|a|beta|b|rc|pl|p),i', '\\1.\\2', $v2));
3716
-	$v1 = str_replace('rc', 'RC', $v1); // certaines versions de PHP ne comprennent RC qu'en majuscule
3717
-	$v2 = str_replace('rc', 'RC', $v2); // certaines versions de PHP ne comprennent RC qu'en majuscule
3718
-
3719
-	$v1 = explode('.', $v1);
3720
-	$v2 = explode('.', $v2);
3721
-	// $v1 est toujours une version, donc sans etoile
3722
-	while (count($v1) < count($v2)) {
3723
-		$v1[] = '0';
3724
-	}
3725
-
3726
-	// $v2 peut etre une borne, donc accepte l'etoile
3727
-	$etoile = false;
3728
-	foreach ($v1 as $k => $v) {
3729
-		if (!isset($v2[$k])) {
3730
-			$v2[] = ($etoile and (is_numeric($v) or $v == 'pl' or $v == 'p')) ? $v : '0';
3731
-		} else {
3732
-			if ($v2[$k] == '*') {
3733
-				$etoile = true;
3734
-				$v2[$k] = $v;
3735
-			}
3736
-		}
3737
-	}
3738
-	$v1 = implode('.', $v1);
3739
-	$v2 = implode('.', $v2);
3740
-
3741
-	return $op ? version_compare($v1, $v2, $op) : version_compare($v1, $v2);
3713
+    $v1 = strtolower(preg_replace(',([0-9])[\s.-]?(dev|alpha|a|beta|b|rc|pl|p),i', '\\1.\\2', $v1));
3714
+    $v2 = strtolower(preg_replace(',([0-9])[\s.-]?(dev|alpha|a|beta|b|rc|pl|p),i', '\\1.\\2', $v2));
3715
+    $v1 = str_replace('rc', 'RC', $v1); // certaines versions de PHP ne comprennent RC qu'en majuscule
3716
+    $v2 = str_replace('rc', 'RC', $v2); // certaines versions de PHP ne comprennent RC qu'en majuscule
3717
+
3718
+    $v1 = explode('.', $v1);
3719
+    $v2 = explode('.', $v2);
3720
+    // $v1 est toujours une version, donc sans etoile
3721
+    while (count($v1) < count($v2)) {
3722
+        $v1[] = '0';
3723
+    }
3724
+
3725
+    // $v2 peut etre une borne, donc accepte l'etoile
3726
+    $etoile = false;
3727
+    foreach ($v1 as $k => $v) {
3728
+        if (!isset($v2[$k])) {
3729
+            $v2[] = ($etoile and (is_numeric($v) or $v == 'pl' or $v == 'p')) ? $v : '0';
3730
+        } else {
3731
+            if ($v2[$k] == '*') {
3732
+                $etoile = true;
3733
+                $v2[$k] = $v;
3734
+            }
3735
+        }
3736
+    }
3737
+    $v1 = implode('.', $v1);
3738
+    $v2 = implode('.', $v2);
3739
+
3740
+    return $op ? version_compare($v1, $v2, $op) : version_compare($v1, $v2);
3742 3741
 }
Please login to merge, or discard this patch.
Braces   +2 added lines, -4 removed lines patch added patch discarded remove patch
@@ -368,8 +368,7 @@  discard block
 block discarded – undo
368 368
 	}
369 369
 	if (!isset($regs[2])) {
370 370
 		$niveau = _LOG_INFO;
371
-	}
372
-	else {
371
+	} else {
373 372
 		$niveau = intval($regs[2]);
374 373
 	}
375 374
 
@@ -1485,8 +1484,7 @@  discard block
 block discarded – undo
1485 1484
 	) {
1486 1485
 		if ($fsize = substr($f, 0, -6) . $m[1] . '.svg' and file_exists($fsize)) {
1487 1486
 			return $themefiles["$subdir$file"] = $fsize;
1488
-		}
1489
-		else {
1487
+		} else {
1490 1488
 			return $themefiles["$subdir$file"] = "$f?" . $m[1] . 'px';
1491 1489
 		}
1492 1490
 	}
Please login to merge, or discard this patch.
ecrire/lang/ecrire_fr.php 1 patch
Indentation   +838 added lines, -838 removed lines patch added patch discarded remove patch
@@ -2,437 +2,437 @@  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
-	'activer_plugin' => 'Activer le plugin',
12
-	'affichage' => 'Affichage',
13
-	'aide_non_disponible' => 'Cette partie de l’aide en ligne n’est pas encore disponible dans cette langue.',
14
-	'annuler_recherche' => 'Annuler la recherche',
15
-	'auteur' => 'Auteur :',
16
-	'avis_acces_interdit' => 'Accès interdit.',
17
-	'avis_acces_interdit_prive' => 'Vous n’avez pas le droit d’accéder à la page <b>@exec@</b>.',
18
-	'avis_article_modifie' => 'Attention, @nom_auteur_modif@ a travaillé sur cet article il y a @date_diff@ minutes',
19
-	'avis_aucun_resultat' => 'Aucun résultat.',
20
-	'avis_base_inaccessible' => 'Impossible de se connecter à la base de données @base@.',
21
-	'avis_chemin_invalide_1' => 'Le chemin que vous avez choisi',
22
-	'avis_chemin_invalide_2' => 'ne semble pas valide. Veuillez retourner à la page précédente et vérifier les informations fournies.',
23
-	'avis_connexion_echec_1' => 'La connexion  à la base de données a échoué.',
24
-	'avis_connexion_echec_2' => 'Revenez à la page précédente, et vérifiez les informations que vous avez fournies.',
25
-	'avis_connexion_echec_3' => '<b>N.B.</b> Sur de nombreux serveurs, vous devez <b>demander</b> l’activation de votre accès à la base de données avant de pouvoir l’utiliser. Si vous ne pouvez vous connecter, vérifiez que vous avez effectué cette démarche.',
26
-	'avis_connexion_erreur_creer_base' => 'La base de données n’a pas pu être créée.',
27
-	'avis_connexion_erreur_fichier_cle_manquant_1' => 'L’installation doit être faite par un webmestre avec un backup des clés et son mot de passe',
28
-	'avis_connexion_erreur_fichier_cle_manquant_2' => 'L’installation doit être faite par un webmestre avec un backup des clés',
29
-	'avis_connexion_erreur_nom_base' => 'Le nom de la base ne peut contenir que des lettres, des chiffres et des tirets',
30
-	'avis_connexion_ldap_echec_1' => 'La connexion au serveur LDAP a échoué.',
31
-	'avis_connexion_ldap_echec_2' => 'Revenez à la page précédente, et vérifiez les informations que vous avez fournies.',
32
-	'avis_connexion_ldap_echec_3' => 'Alternativement, n’utilisez pas le support LDAP pour importer des utilisateurs.',
33
-	'avis_deplacement_rubrique' => 'Attention ! Cette rubrique contient @contient_breves@ brève@scb@ : si vous la déplacez, veuillez cocher cette case de confirmation.',
34
-	'avis_erreur_connexion_mysql' => 'Erreur de connexion SQL',
35
-	'avis_erreur_creation_compte' => 'Echec lors de l’initialisation du compte',
36
-	'avis_espace_interdit' => '<b>Espace interdit</b> <div>SPIP est déjà installé.</div>',
37
-	'avis_lecture_noms_bases_1' => 'Le programme d’installation n’a pas pu lire les noms des bases de données installées.',
38
-	'avis_lecture_noms_bases_2' => 'Soit aucune base n’est disponible, soit la fonction permettant de lister les bases a été désactivée
10
+    // A
11
+    'activer_plugin' => 'Activer le plugin',
12
+    'affichage' => 'Affichage',
13
+    'aide_non_disponible' => 'Cette partie de l’aide en ligne n’est pas encore disponible dans cette langue.',
14
+    'annuler_recherche' => 'Annuler la recherche',
15
+    'auteur' => 'Auteur :',
16
+    'avis_acces_interdit' => 'Accès interdit.',
17
+    'avis_acces_interdit_prive' => 'Vous n’avez pas le droit d’accéder à la page <b>@exec@</b>.',
18
+    'avis_article_modifie' => 'Attention, @nom_auteur_modif@ a travaillé sur cet article il y a @date_diff@ minutes',
19
+    'avis_aucun_resultat' => 'Aucun résultat.',
20
+    'avis_base_inaccessible' => 'Impossible de se connecter à la base de données @base@.',
21
+    'avis_chemin_invalide_1' => 'Le chemin que vous avez choisi',
22
+    'avis_chemin_invalide_2' => 'ne semble pas valide. Veuillez retourner à la page précédente et vérifier les informations fournies.',
23
+    'avis_connexion_echec_1' => 'La connexion  à la base de données a échoué.',
24
+    'avis_connexion_echec_2' => 'Revenez à la page précédente, et vérifiez les informations que vous avez fournies.',
25
+    'avis_connexion_echec_3' => '<b>N.B.</b> Sur de nombreux serveurs, vous devez <b>demander</b> l’activation de votre accès à la base de données avant de pouvoir l’utiliser. Si vous ne pouvez vous connecter, vérifiez que vous avez effectué cette démarche.',
26
+    'avis_connexion_erreur_creer_base' => 'La base de données n’a pas pu être créée.',
27
+    'avis_connexion_erreur_fichier_cle_manquant_1' => 'L’installation doit être faite par un webmestre avec un backup des clés et son mot de passe',
28
+    'avis_connexion_erreur_fichier_cle_manquant_2' => 'L’installation doit être faite par un webmestre avec un backup des clés',
29
+    'avis_connexion_erreur_nom_base' => 'Le nom de la base ne peut contenir que des lettres, des chiffres et des tirets',
30
+    'avis_connexion_ldap_echec_1' => 'La connexion au serveur LDAP a échoué.',
31
+    'avis_connexion_ldap_echec_2' => 'Revenez à la page précédente, et vérifiez les informations que vous avez fournies.',
32
+    'avis_connexion_ldap_echec_3' => 'Alternativement, n’utilisez pas le support LDAP pour importer des utilisateurs.',
33
+    'avis_deplacement_rubrique' => 'Attention ! Cette rubrique contient @contient_breves@ brève@scb@ : si vous la déplacez, veuillez cocher cette case de confirmation.',
34
+    'avis_erreur_connexion_mysql' => 'Erreur de connexion SQL',
35
+    'avis_erreur_creation_compte' => 'Echec lors de l’initialisation du compte',
36
+    'avis_espace_interdit' => '<b>Espace interdit</b> <div>SPIP est déjà installé.</div>',
37
+    'avis_lecture_noms_bases_1' => 'Le programme d’installation n’a pas pu lire les noms des bases de données installées.',
38
+    'avis_lecture_noms_bases_2' => 'Soit aucune base n’est disponible, soit la fonction permettant de lister les bases a été désactivée
39 39
 		pour des raisons de sécurité (ce qui est le cas chez de nombreux hébergeurs).',
40
-	'avis_lecture_noms_bases_3' => 'Dans la seconde alternative, il est probable qu’une base portant votre nom de login soit utilisable :',
41
-	'avis_non_acces_page' => 'Vous n’avez pas accès à cette page.',
42
-	'avis_operation_echec' => 'L’opération a échoué.',
43
-	'avis_operation_impossible' => 'Opération impossible',
44
-	'avis_suppression_base' => 'ATTENTION, la suppression des données est irréversible',
40
+    'avis_lecture_noms_bases_3' => 'Dans la seconde alternative, il est probable qu’une base portant votre nom de login soit utilisable :',
41
+    'avis_non_acces_page' => 'Vous n’avez pas accès à cette page.',
42
+    'avis_operation_echec' => 'L’opération a échoué.',
43
+    'avis_operation_impossible' => 'Opération impossible',
44
+    'avis_suppression_base' => 'ATTENTION, la suppression des données est irréversible',
45 45
 
46
-	// B
47
-	'bouton_acces_ldap' => 'Ajouter l’accès à LDAP',
48
-	'bouton_ajouter' => 'Ajouter',
49
-	'bouton_annuler' => 'Annuler',
50
-	'bouton_cache_activer' => 'Réactiver le cache',
51
-	'bouton_cache_desactiver' => 'Désactiver temporairement le cache',
52
-	'bouton_demande_publication' => 'Demander la publication de cet article',
53
-	'bouton_desactive_tout' => 'Tout désactiver',
54
-	'bouton_desinstaller' => 'Désinstaller',
55
-	'bouton_effacer_tout' => 'Effacer TOUT',
56
-	'bouton_envoyer_message' => 'Message définitif : envoyer',
57
-	'bouton_fermer' => 'Fermer',
58
-	'bouton_mettre_a_jour_base' => 'Mettre à jour la base de données',
59
-	'bouton_modifier' => 'Modifier',
60
-	'bouton_radio_afficher' => 'Afficher',
61
-	'bouton_radio_apparaitre_liste_redacteurs_connectes' => 'Apparaître dans la liste des rédacteurs connectés',
62
-	'bouton_radio_envoi_annonces_adresse' => 'Envoyer les annonces à l’adresse :',
63
-	'bouton_radio_envoi_liste_nouveautes' => 'Envoyer la liste des nouveautés',
64
-	'bouton_radio_non_apparaitre_liste_redacteurs_connectes' => 'Ne pas apparaître dans la liste des rédacteurs',
65
-	'bouton_radio_non_envoi_annonces_editoriales' => 'Ne pas envoyer d’annonces éditoriales',
66
-	'bouton_redirection' => 'REDIRECTION',
67
-	'bouton_reinitialiser_aux_valeurs_par_defaut' => 'Réinitialiser aux valeurs par défaut',
68
-	'bouton_relancer_inscription' => 'Relancer l’inscription',
69
-	'bouton_relancer_inscriptions' => 'Relancer les inscriptions',
70
-	'bouton_relancer_installation' => 'Relancer l’installation',
71
-	'bouton_reset_password' => 'Générer un nouveau mot de passe et l’envoyer par email',
72
-	'bouton_suivant' => 'Suivant',
73
-	'bouton_tenter_recuperation' => 'Tenter une réparation',
74
-	'bouton_test_proxy' => 'Essayer le proxy',
75
-	'bouton_vider_cache' => 'Vider le cache',
46
+    // B
47
+    'bouton_acces_ldap' => 'Ajouter l’accès à LDAP',
48
+    'bouton_ajouter' => 'Ajouter',
49
+    'bouton_annuler' => 'Annuler',
50
+    'bouton_cache_activer' => 'Réactiver le cache',
51
+    'bouton_cache_desactiver' => 'Désactiver temporairement le cache',
52
+    'bouton_demande_publication' => 'Demander la publication de cet article',
53
+    'bouton_desactive_tout' => 'Tout désactiver',
54
+    'bouton_desinstaller' => 'Désinstaller',
55
+    'bouton_effacer_tout' => 'Effacer TOUT',
56
+    'bouton_envoyer_message' => 'Message définitif : envoyer',
57
+    'bouton_fermer' => 'Fermer',
58
+    'bouton_mettre_a_jour_base' => 'Mettre à jour la base de données',
59
+    'bouton_modifier' => 'Modifier',
60
+    'bouton_radio_afficher' => 'Afficher',
61
+    'bouton_radio_apparaitre_liste_redacteurs_connectes' => 'Apparaître dans la liste des rédacteurs connectés',
62
+    'bouton_radio_envoi_annonces_adresse' => 'Envoyer les annonces à l’adresse :',
63
+    'bouton_radio_envoi_liste_nouveautes' => 'Envoyer la liste des nouveautés',
64
+    'bouton_radio_non_apparaitre_liste_redacteurs_connectes' => 'Ne pas apparaître dans la liste des rédacteurs',
65
+    'bouton_radio_non_envoi_annonces_editoriales' => 'Ne pas envoyer d’annonces éditoriales',
66
+    'bouton_redirection' => 'REDIRECTION',
67
+    'bouton_reinitialiser_aux_valeurs_par_defaut' => 'Réinitialiser aux valeurs par défaut',
68
+    'bouton_relancer_inscription' => 'Relancer l’inscription',
69
+    'bouton_relancer_inscriptions' => 'Relancer les inscriptions',
70
+    'bouton_relancer_installation' => 'Relancer l’installation',
71
+    'bouton_reset_password' => 'Générer un nouveau mot de passe et l’envoyer par email',
72
+    'bouton_suivant' => 'Suivant',
73
+    'bouton_tenter_recuperation' => 'Tenter une réparation',
74
+    'bouton_test_proxy' => 'Essayer le proxy',
75
+    'bouton_vider_cache' => 'Vider le cache',
76 76
 
77
-	// C
78
-	'cache_modifiable_webmestre' => 'Ce paramètre est modifiable par le webmestre du site.',
79
-	'calendrier_synchro' => 'Si vous utilisez un logiciel d’agenda compatible <b>iCal</b>, vous pouvez le synchroniser avec les informations de ce site.',
80
-	'config_activer_champs' => 'Activer les champs suivants',
81
-	'config_choix_base_sup' => 'indiquer une base sur ce serveur',
82
-	'config_erreur_base_sup' => 'SPIP n’a pas accès à la liste des bases accessibles',
83
-	'config_info_base_sup' => 'Si vous avez d’autres bases de données à interroger à travers SPIP, avec son serveur SQL ou avec un autre, le formulaire ci-dessous, vous permet de les déclarer. Si vous laissez certains champs vides, les identifiants de connexion à la base principale seront utilisés.',
84
-	'config_info_base_sup_disponibles' => 'Bases supplémentaires déjà interrogeables :',
85
-	'config_info_enregistree' => 'La nouvelle configuration a été enregistrée',
86
-	'config_info_logos' => 'Chaque élément du site peut avoir un logo, ainsi qu’un « logo de survol »',
87
-	'config_info_logos_utiliser' => 'Utiliser les logos',
88
-	'config_info_logos_utiliser_non' => 'Ne pas utiliser les logos',
89
-	'config_info_logos_utiliser_survol' => 'Utiliser les logos de survol',
90
-	'config_info_logos_utiliser_survol_non' => 'Ne pas utiliser les logos de survol',
91
-	'config_info_redirection' => 'En activant cette option, vous pourrez créer des articles virtuels, simples références d’articles publiés sur d’autres sites ou hors de SPIP.',
92
-	'config_redirection' => 'Articles virtuels',
93
-	'config_titre_base_sup' => 'Déclaration d’une base supplémentaire',
94
-	'config_titre_base_sup_choix' => 'Choisissez une base supplémentaire',
95
-	'connexion_ldap' => 'Connexion :',
96
-	'creer_et_associer_un_auteur' => 'Créer et associer un auteur',
77
+    // C
78
+    'cache_modifiable_webmestre' => 'Ce paramètre est modifiable par le webmestre du site.',
79
+    'calendrier_synchro' => 'Si vous utilisez un logiciel d’agenda compatible <b>iCal</b>, vous pouvez le synchroniser avec les informations de ce site.',
80
+    'config_activer_champs' => 'Activer les champs suivants',
81
+    'config_choix_base_sup' => 'indiquer une base sur ce serveur',
82
+    'config_erreur_base_sup' => 'SPIP n’a pas accès à la liste des bases accessibles',
83
+    'config_info_base_sup' => 'Si vous avez d’autres bases de données à interroger à travers SPIP, avec son serveur SQL ou avec un autre, le formulaire ci-dessous, vous permet de les déclarer. Si vous laissez certains champs vides, les identifiants de connexion à la base principale seront utilisés.',
84
+    'config_info_base_sup_disponibles' => 'Bases supplémentaires déjà interrogeables :',
85
+    'config_info_enregistree' => 'La nouvelle configuration a été enregistrée',
86
+    'config_info_logos' => 'Chaque élément du site peut avoir un logo, ainsi qu’un « logo de survol »',
87
+    'config_info_logos_utiliser' => 'Utiliser les logos',
88
+    'config_info_logos_utiliser_non' => 'Ne pas utiliser les logos',
89
+    'config_info_logos_utiliser_survol' => 'Utiliser les logos de survol',
90
+    'config_info_logos_utiliser_survol_non' => 'Ne pas utiliser les logos de survol',
91
+    'config_info_redirection' => 'En activant cette option, vous pourrez créer des articles virtuels, simples références d’articles publiés sur d’autres sites ou hors de SPIP.',
92
+    'config_redirection' => 'Articles virtuels',
93
+    'config_titre_base_sup' => 'Déclaration d’une base supplémentaire',
94
+    'config_titre_base_sup_choix' => 'Choisissez une base supplémentaire',
95
+    'connexion_ldap' => 'Connexion :',
96
+    'creer_et_associer_un_auteur' => 'Créer et associer un auteur',
97 97
 
98
-	// D
99
-	'date_mot_heures' => 'heures',
98
+    // D
99
+    'date_mot_heures' => 'heures',
100 100
 
101
-	// E
102
-	'ecran_connexion_couleur_principale' => 'Couleur principale',
103
-	'ecran_connexion_image_fond' => 'Image de fond',
104
-	'ecran_connexion_image_fond_explication' => 'Utiliser une image (format JPEG, 1920x1080 pixels)',
105
-	'ecran_connexion_image_revenir_couleur_defaut' => 'Revenir à la couleur par défaut',
106
-	'ecran_connexion_titre' => 'Écran de connexion',
107
-	'ecran_securite' => ' + écran de sécurité @version@',
108
-	'email' => 'email',
109
-	'email_2' => 'email :',
110
-	'en_savoir_plus' => 'En savoir plus',
111
-	'entree_adresse_annuaire' => 'Adresse de l’annuaire',
112
-	'entree_adresse_email' => 'Votre adresse email',
113
-	'entree_adresse_email_2' => 'Adresse email',
114
-	'entree_base_donnee_1' => 'Adresse de la base de données',
115
-	'entree_base_donnee_2' => '(Souvent cette adresse correspond à celle de votre site, parfois elle correspond à la mention « localhost », parfois elle est laissée totalement vide.)',
116
-	'entree_biographie' => 'Courte biographie en quelques mots.',
117
-	'entree_chemin_acces' => '<b>Entrer</b> le chemin d’accès :',
118
-	'entree_cle_pgp' => 'Votre clé PGP',
119
-	'entree_cle_pgp_2' => 'Clé PGP',
120
-	'entree_contenu_rubrique' => '(Contenu de la rubrique en quelques mots.)',
121
-	'entree_identifiants_connexion' => 'Vos identifiants de connexion...',
122
-	'entree_identifiants_connexion_2' => 'Identifiants de connexion',
123
-	'entree_informations_connexion_ldap' => 'Veuillez entrer dans ce formulaire les informations de connexion à votre annuaire LDAP.
101
+    // E
102
+    'ecran_connexion_couleur_principale' => 'Couleur principale',
103
+    'ecran_connexion_image_fond' => 'Image de fond',
104
+    'ecran_connexion_image_fond_explication' => 'Utiliser une image (format JPEG, 1920x1080 pixels)',
105
+    'ecran_connexion_image_revenir_couleur_defaut' => 'Revenir à la couleur par défaut',
106
+    'ecran_connexion_titre' => 'Écran de connexion',
107
+    'ecran_securite' => ' + écran de sécurité @version@',
108
+    'email' => 'email',
109
+    'email_2' => 'email :',
110
+    'en_savoir_plus' => 'En savoir plus',
111
+    'entree_adresse_annuaire' => 'Adresse de l’annuaire',
112
+    'entree_adresse_email' => 'Votre adresse email',
113
+    'entree_adresse_email_2' => 'Adresse email',
114
+    'entree_base_donnee_1' => 'Adresse de la base de données',
115
+    'entree_base_donnee_2' => '(Souvent cette adresse correspond à celle de votre site, parfois elle correspond à la mention « localhost », parfois elle est laissée totalement vide.)',
116
+    'entree_biographie' => 'Courte biographie en quelques mots.',
117
+    'entree_chemin_acces' => '<b>Entrer</b> le chemin d’accès :',
118
+    'entree_cle_pgp' => 'Votre clé PGP',
119
+    'entree_cle_pgp_2' => 'Clé PGP',
120
+    'entree_contenu_rubrique' => '(Contenu de la rubrique en quelques mots.)',
121
+    'entree_identifiants_connexion' => 'Vos identifiants de connexion...',
122
+    'entree_identifiants_connexion_2' => 'Identifiants de connexion',
123
+    'entree_informations_connexion_ldap' => 'Veuillez entrer dans ce formulaire les informations de connexion à votre annuaire LDAP.
124 124
 	Ces informations doivent pouvoir vous être fournies par l’administrateur du système,
125 125
 	ou du réseau.',
126
-	'entree_infos_perso' => 'Qui êtes-vous ?',
127
-	'entree_infos_perso_2' => 'Qui est l’auteur ?',
128
-	'entree_interieur_rubrique' => 'À l’intérieur de la rubrique :',
129
-	'entree_liens_sites' => '<b>Lien hypertexte</b> (référence, site à visiter...)',
130
-	'entree_login' => 'Votre login',
131
-	'entree_login_connexion_1' => 'Le login de connexion',
132
-	'entree_login_connexion_2' => '(Correspond parfois à votre login d’accès au FTP ; parfois laissé vide)',
133
-	'entree_mot_passe' => 'Votre mot de passe',
134
-	'entree_mot_passe_1' => 'Le mot de passe de connexion',
135
-	'entree_mot_passe_2' => '(Correspond parfois à votre mot de passe pour le FTP ; parfois laissé vide)',
136
-	'entree_nom_fichier' => 'Veuillez entrer le nom du fichier @texte_compresse@ :',
137
-	'entree_nom_pseudo' => 'Votre nom ou votre pseudo',
138
-	'entree_nom_pseudo_1' => '(Votre nom ou votre pseudo)',
139
-	'entree_nom_pseudo_2' => 'Nom ou pseudo',
140
-	'entree_nom_site' => 'Le nom de votre site',
141
-	'entree_nom_site_2' => 'Nom du site de l’auteur',
142
-	'entree_nouveau_passe' => 'Nouveau mot de passe',
143
-	'entree_passe_ldap' => 'Mot de passe',
144
-	'entree_port_annuaire' => 'Le numéro de port de l’annuaire',
145
-	'entree_signature' => 'Signature',
146
-	'entree_titre_obligatoire' => '<b>Titre</b> [Obligatoire]<br />',
147
-	'entree_url' => 'L’adresse (URL) de votre site',
148
-	'entree_url_2' => 'Adresse (URL) du site',
149
-	'erreur_connect_deja_existant' => 'Un serveur existe déjà avec ce nom',
150
-	'erreur_contenu_suspect' => 'Texte échappé',
151
-	'erreur_email_deja_existant' => 'Cette adresse email est déjà enregistrée.',
152
-	'erreur_nom_connect_incorrect' => 'Ce nom de serveur n’est pas autorisé',
153
-	'erreur_plugin_attribut_balise_manquant' => 'Attribut @attribut@ manquant dans la balise @balise@.',
154
-	'erreur_plugin_desinstalation_echouee' => 'La désinstallation du plugin a échoué. Vous pouvez néanmoins le désactiver.',
155
-	'erreur_plugin_fichier_absent' => 'Fichier absent',
156
-	'erreur_plugin_fichier_def_absent' => 'Fichier de définition absent',
157
-	'erreur_plugin_nom_fonction_interdit' => 'Nom de fonction interdit',
158
-	'erreur_plugin_nom_manquant' => 'Nom du plugin manquant',
159
-	'erreur_plugin_prefix_manquant' => 'Espace de nommage du plugin non défini',
160
-	'erreur_plugin_tag_plugin_absent' => '&lt;plugin&gt; manquant dans le fichier de définition',
161
-	'erreur_plugin_version_manquant' => 'Version du plugin manquante',
162
-	'erreur_type_fichier' => 'Type de fichier incorrect',
126
+    'entree_infos_perso' => 'Qui êtes-vous ?',
127
+    'entree_infos_perso_2' => 'Qui est l’auteur ?',
128
+    'entree_interieur_rubrique' => 'À l’intérieur de la rubrique :',
129
+    'entree_liens_sites' => '<b>Lien hypertexte</b> (référence, site à visiter...)',
130
+    'entree_login' => 'Votre login',
131
+    'entree_login_connexion_1' => 'Le login de connexion',
132
+    'entree_login_connexion_2' => '(Correspond parfois à votre login d’accès au FTP ; parfois laissé vide)',
133
+    'entree_mot_passe' => 'Votre mot de passe',
134
+    'entree_mot_passe_1' => 'Le mot de passe de connexion',
135
+    'entree_mot_passe_2' => '(Correspond parfois à votre mot de passe pour le FTP ; parfois laissé vide)',
136
+    'entree_nom_fichier' => 'Veuillez entrer le nom du fichier @texte_compresse@ :',
137
+    'entree_nom_pseudo' => 'Votre nom ou votre pseudo',
138
+    'entree_nom_pseudo_1' => '(Votre nom ou votre pseudo)',
139
+    'entree_nom_pseudo_2' => 'Nom ou pseudo',
140
+    'entree_nom_site' => 'Le nom de votre site',
141
+    'entree_nom_site_2' => 'Nom du site de l’auteur',
142
+    'entree_nouveau_passe' => 'Nouveau mot de passe',
143
+    'entree_passe_ldap' => 'Mot de passe',
144
+    'entree_port_annuaire' => 'Le numéro de port de l’annuaire',
145
+    'entree_signature' => 'Signature',
146
+    'entree_titre_obligatoire' => '<b>Titre</b> [Obligatoire]<br />',
147
+    'entree_url' => 'L’adresse (URL) de votre site',
148
+    'entree_url_2' => 'Adresse (URL) du site',
149
+    'erreur_connect_deja_existant' => 'Un serveur existe déjà avec ce nom',
150
+    'erreur_contenu_suspect' => 'Texte échappé',
151
+    'erreur_email_deja_existant' => 'Cette adresse email est déjà enregistrée.',
152
+    'erreur_nom_connect_incorrect' => 'Ce nom de serveur n’est pas autorisé',
153
+    'erreur_plugin_attribut_balise_manquant' => 'Attribut @attribut@ manquant dans la balise @balise@.',
154
+    'erreur_plugin_desinstalation_echouee' => 'La désinstallation du plugin a échoué. Vous pouvez néanmoins le désactiver.',
155
+    'erreur_plugin_fichier_absent' => 'Fichier absent',
156
+    'erreur_plugin_fichier_def_absent' => 'Fichier de définition absent',
157
+    'erreur_plugin_nom_fonction_interdit' => 'Nom de fonction interdit',
158
+    'erreur_plugin_nom_manquant' => 'Nom du plugin manquant',
159
+    'erreur_plugin_prefix_manquant' => 'Espace de nommage du plugin non défini',
160
+    'erreur_plugin_tag_plugin_absent' => '&lt;plugin&gt; manquant dans le fichier de définition',
161
+    'erreur_plugin_version_manquant' => 'Version du plugin manquante',
162
+    'erreur_type_fichier' => 'Type de fichier incorrect',
163 163
 
164
-	// H
165
-	'htaccess_a_simuler' => 'Avertissement : la configuration de votre serveur HTTP ne tient pas compte des fichiers @htaccess@. Pour pouvoir assurer une bonne sécurité, il faut que vous modifiiez cette configuration sur ce point, ou bien que les constantes @constantes@ (définissables dans le fichier mes_options.php) aient comme valeur des répertoires en dehors de @document_root@.',
166
-	'htaccess_inoperant' => 'htaccess inopérant',
164
+    // H
165
+    'htaccess_a_simuler' => 'Avertissement : la configuration de votre serveur HTTP ne tient pas compte des fichiers @htaccess@. Pour pouvoir assurer une bonne sécurité, il faut que vous modifiiez cette configuration sur ce point, ou bien que les constantes @constantes@ (définissables dans le fichier mes_options.php) aient comme valeur des répertoires en dehors de @document_root@.',
166
+    'htaccess_inoperant' => 'htaccess inopérant',
167 167
 
168
-	// I
169
-	'ical_info1' => 'Cette page présente plusieurs méthodes pour rester en contact avec la vie de ce site.',
170
-	'ical_info2' => 'Pour plus de renseignements sur toutes ces techniques, n’hésitez pas à consulter <a href="@spipnet@">la documentation de SPIP</a>.',
171
-	'ical_info_calendrier' => 'Deux calendriers sont à votre disposition. Le premier est un plan du site annonçant tous les articles publiés. Le second contient les annonces éditoriales ainsi que vos derniers messages privés : il vous est réservé grâce à une clé personnelle, que vous pouvez modifier à tout moment en renouvelant votre mot de passe.',
172
-	'ical_methode_http' => 'Téléchargement',
173
-	'ical_methode_webcal' => 'Synchronisation (webcal://)',
174
-	'ical_texte_prive' => 'Ce calendrier, à usage strictement personnel, vous informe de l’activité éditoriale privée de ce site (tâches et rendez-vous personnels, articles et brèves proposés...).',
175
-	'ical_texte_public' => 'Ce calendrier vous permet de suivre l’activité publique de ce site (articles et brèves publiés).',
176
-	'ical_texte_rss' => 'Vous pouvez syndiquer les nouveautés de ce site dans n’importe quel lecteur de fichiers au format XML/RSS (Rich Site Summary). C’est aussi le format qui permet à SPIP de lire les nouveautés publiées sur d’autres sites utilisant un format d’échange compatible (sites syndiqués).',
177
-	'ical_titre_js' => 'Javascript',
178
-	'ical_titre_mailing' => 'Mailing-list',
179
-	'ical_titre_rss' => 'Fichiers de syndication',
180
-	'icone_accueil' => 'Accueil',
181
-	'icone_activer_cookie' => 'Activer le cookie de correspondance',
182
-	'icone_activite' => 'Activité',
183
-	'icone_admin_plugin' => 'Gestion des plugins',
184
-	'icone_administration' => 'Maintenance',
185
-	'icone_afficher_auteurs' => 'Afficher les auteurs',
186
-	'icone_afficher_visiteurs' => 'Afficher les visiteurs',
187
-	'icone_arret_discussion' => 'Ne plus participer à cette discussion',
188
-	'icone_calendrier' => 'Calendrier',
189
-	'icone_configuration' => 'Configuration',
190
-	'icone_creer_auteur' => 'Créer un nouvel auteur et l’associer à cet article',
191
-	'icone_creer_mot_cle' => 'Créer un nouveau mot-clé et le lier à cet article',
192
-	'icone_creer_rubrique_2' => 'Créer une nouvelle rubrique',
193
-	'icone_developpement' => 'Développement',
194
-	'icone_edition' => 'Édition',
195
-	'icone_ma_langue' => 'Ma langue',
196
-	'icone_mes_infos' => 'Mes informations',
197
-	'icone_mes_preferences' => 'Mes préférences',
198
-	'icone_modifier_article' => 'Modifier cet article',
199
-	'icone_modifier_rubrique' => 'Modifier cette rubrique',
200
-	'icone_publication' => 'Publication',
201
-	'icone_relancer_signataire' => 'Relancer le signataire',
202
-	'icone_retour' => 'Retour',
203
-	'icone_retour_article' => 'Retour à l’article',
204
-	'icone_squelette' => 'Squelettes',
205
-	'icone_suivi_publication' => 'Suivi de la publication',
206
-	'icone_supprimer_cookie' => 'Supprimer le cookie de correspondance',
207
-	'icone_supprimer_rubrique' => 'Supprimer cette rubrique',
208
-	'icone_supprimer_signature' => 'Supprimer cette signature',
209
-	'icone_valider_signature' => 'Valider cette signature',
210
-	'image_administrer_rubrique' => 'Vous pouvez administrer cette rubrique',
211
-	'impossible_modifier_login_auteur' => 'Impossible de modifier le login.',
212
-	'impossible_modifier_pass_auteur' => 'Impossible de modifier le mot de passe.',
213
-	'info_1_article' => '1 article',
214
-	'info_1_auteur' => '1 auteur',
215
-	'info_1_message' => '1 message',
216
-	'info_1_mot_cle' => '1 mot-clé',
217
-	'info_1_rubrique' => '1 rubrique',
218
-	'info_1_visiteur' => '1 visiteur',
219
-	'info_activer_cookie' => 'Vous pouvez activer un <b>cookie de correspondance</b>, ce qui vous
168
+    // I
169
+    'ical_info1' => 'Cette page présente plusieurs méthodes pour rester en contact avec la vie de ce site.',
170
+    'ical_info2' => 'Pour plus de renseignements sur toutes ces techniques, n’hésitez pas à consulter <a href="@spipnet@">la documentation de SPIP</a>.',
171
+    'ical_info_calendrier' => 'Deux calendriers sont à votre disposition. Le premier est un plan du site annonçant tous les articles publiés. Le second contient les annonces éditoriales ainsi que vos derniers messages privés : il vous est réservé grâce à une clé personnelle, que vous pouvez modifier à tout moment en renouvelant votre mot de passe.',
172
+    'ical_methode_http' => 'Téléchargement',
173
+    'ical_methode_webcal' => 'Synchronisation (webcal://)',
174
+    'ical_texte_prive' => 'Ce calendrier, à usage strictement personnel, vous informe de l’activité éditoriale privée de ce site (tâches et rendez-vous personnels, articles et brèves proposés...).',
175
+    'ical_texte_public' => 'Ce calendrier vous permet de suivre l’activité publique de ce site (articles et brèves publiés).',
176
+    'ical_texte_rss' => 'Vous pouvez syndiquer les nouveautés de ce site dans n’importe quel lecteur de fichiers au format XML/RSS (Rich Site Summary). C’est aussi le format qui permet à SPIP de lire les nouveautés publiées sur d’autres sites utilisant un format d’échange compatible (sites syndiqués).',
177
+    'ical_titre_js' => 'Javascript',
178
+    'ical_titre_mailing' => 'Mailing-list',
179
+    'ical_titre_rss' => 'Fichiers de syndication',
180
+    'icone_accueil' => 'Accueil',
181
+    'icone_activer_cookie' => 'Activer le cookie de correspondance',
182
+    'icone_activite' => 'Activité',
183
+    'icone_admin_plugin' => 'Gestion des plugins',
184
+    'icone_administration' => 'Maintenance',
185
+    'icone_afficher_auteurs' => 'Afficher les auteurs',
186
+    'icone_afficher_visiteurs' => 'Afficher les visiteurs',
187
+    'icone_arret_discussion' => 'Ne plus participer à cette discussion',
188
+    'icone_calendrier' => 'Calendrier',
189
+    'icone_configuration' => 'Configuration',
190
+    'icone_creer_auteur' => 'Créer un nouvel auteur et l’associer à cet article',
191
+    'icone_creer_mot_cle' => 'Créer un nouveau mot-clé et le lier à cet article',
192
+    'icone_creer_rubrique_2' => 'Créer une nouvelle rubrique',
193
+    'icone_developpement' => 'Développement',
194
+    'icone_edition' => 'Édition',
195
+    'icone_ma_langue' => 'Ma langue',
196
+    'icone_mes_infos' => 'Mes informations',
197
+    'icone_mes_preferences' => 'Mes préférences',
198
+    'icone_modifier_article' => 'Modifier cet article',
199
+    'icone_modifier_rubrique' => 'Modifier cette rubrique',
200
+    'icone_publication' => 'Publication',
201
+    'icone_relancer_signataire' => 'Relancer le signataire',
202
+    'icone_retour' => 'Retour',
203
+    'icone_retour_article' => 'Retour à l’article',
204
+    'icone_squelette' => 'Squelettes',
205
+    'icone_suivi_publication' => 'Suivi de la publication',
206
+    'icone_supprimer_cookie' => 'Supprimer le cookie de correspondance',
207
+    'icone_supprimer_rubrique' => 'Supprimer cette rubrique',
208
+    'icone_supprimer_signature' => 'Supprimer cette signature',
209
+    'icone_valider_signature' => 'Valider cette signature',
210
+    'image_administrer_rubrique' => 'Vous pouvez administrer cette rubrique',
211
+    'impossible_modifier_login_auteur' => 'Impossible de modifier le login.',
212
+    'impossible_modifier_pass_auteur' => 'Impossible de modifier le mot de passe.',
213
+    'info_1_article' => '1 article',
214
+    'info_1_auteur' => '1 auteur',
215
+    'info_1_message' => '1 message',
216
+    'info_1_mot_cle' => '1 mot-clé',
217
+    'info_1_rubrique' => '1 rubrique',
218
+    'info_1_visiteur' => '1 visiteur',
219
+    'info_activer_cookie' => 'Vous pouvez activer un <b>cookie de correspondance</b>, ce qui vous
220 220
 	permettra de passer facilement du site public au site privé.',
221
-	'info_activer_menu_developpement' => 'Afficher le menu Développement',
222
-	'info_admin_etre_webmestre' => 'Me donner les droits de webmestre',
223
-	'info_admin_je_suis_webmestre' => 'Je suis <b>webmestre</b>',
224
-	'info_admin_statuer_webmestre' => 'Donner à cet administrateur les droits de webmestre',
225
-	'info_admin_webmestre' => 'Cet administrateur est <b>webmestre</b>',
226
-	'info_administrateur' => 'Administrateur',
227
-	'info_administrateur_1' => 'Administrateur',
228
-	'info_administrateur_2' => 'du site (<i>utilisez avec précaution</i>)',
229
-	'info_administrateur_site_01' => 'Si vous êtes administrateur du site, veuillez',
230
-	'info_administrateur_site_02' => 'cliquer sur ce lien',
231
-	'info_administrateurs' => 'Administrateurs',
232
-	'info_administrer_rubrique' => 'Vous pouvez administrer cette rubrique',
233
-	'info_adresse' => 'à l’adresse :',
234
-	'info_adresse_desinscription' => 'Adresse de désinscription :',
235
-	'info_adresse_url' => 'Adresse (URL) du site public',
236
-	'info_afficher_par_nb' => 'Afficher par',
237
-	'info_aide_en_ligne' => 'Aide en ligne SPIP',
238
-	'info_ajout_image' => 'Lorsque vous ajoutez des images en tant que documents joints à un article,
221
+    'info_activer_menu_developpement' => 'Afficher le menu Développement',
222
+    'info_admin_etre_webmestre' => 'Me donner les droits de webmestre',
223
+    'info_admin_je_suis_webmestre' => 'Je suis <b>webmestre</b>',
224
+    'info_admin_statuer_webmestre' => 'Donner à cet administrateur les droits de webmestre',
225
+    'info_admin_webmestre' => 'Cet administrateur est <b>webmestre</b>',
226
+    'info_administrateur' => 'Administrateur',
227
+    'info_administrateur_1' => 'Administrateur',
228
+    'info_administrateur_2' => 'du site (<i>utilisez avec précaution</i>)',
229
+    'info_administrateur_site_01' => 'Si vous êtes administrateur du site, veuillez',
230
+    'info_administrateur_site_02' => 'cliquer sur ce lien',
231
+    'info_administrateurs' => 'Administrateurs',
232
+    'info_administrer_rubrique' => 'Vous pouvez administrer cette rubrique',
233
+    'info_adresse' => 'à l’adresse :',
234
+    'info_adresse_desinscription' => 'Adresse de désinscription :',
235
+    'info_adresse_url' => 'Adresse (URL) du site public',
236
+    'info_afficher_par_nb' => 'Afficher par',
237
+    'info_aide_en_ligne' => 'Aide en ligne SPIP',
238
+    'info_ajout_image' => 'Lorsque vous ajoutez des images en tant que documents joints à un article,
239 239
 		SPIP peut créer pour vous, automatiquement, des vignettes (miniatures) des
240 240
 		images insérées. Cela permet par exemple de créer
241 241
 		automatiquement une galerie ou un portfolio.',
242
-	'info_ajouter_rubrique' => 'Ajouter une autre rubrique à administrer :',
243
-	'info_annonce_nouveautes' => 'Annonce des nouveautés',
244
-	'info_article' => 'article',
245
-	'info_article_2' => 'articles',
246
-	'info_article_a_paraitre' => 'Les articles post-datés à paraître',
247
-	'info_articles_02' => 'articles',
248
-	'info_articles_2' => 'Articles',
249
-	'info_articles_auteur' => 'Les articles de cet auteur',
250
-	'info_articles_miens' => 'Mes articles',
251
-	'info_articles_tous' => 'Tous les articles',
252
-	'info_articles_trouves' => 'Articles trouvés',
253
-	'info_attente_validation' => 'Vos articles en attente de validation',
254
-	'info_aucun_article' => 'Aucun article',
255
-	'info_aucun_auteur' => 'Aucun auteur',
256
-	'info_aucun_message' => 'Aucun message',
257
-	'info_aucun_rubrique' => 'Aucune rubrique',
258
-	'info_aujourdhui' => 'aujourd’hui :',
259
-	'info_auteur_gere_rubriques' => 'Cet auteur gère les rubriques suivantes :',
260
-	'info_auteur_gere_toutes_rubriques' => 'Cet auteur gère <b>toutes les rubriques</b>',
261
-	'info_auteur_gere_toutes_rubriques_2' => 'Je gère <b>toutes les rubriques</b>',
262
-	'info_auteurs' => 'Les auteurs',
263
-	'info_auteurs_par_tri' => 'Auteurs@partri@',
264
-	'info_auteurs_trouves' => 'Auteurs trouvés',
265
-	'info_authentification_externe' => 'Authentification externe',
266
-	'info_avertissement' => 'Avertissement',
267
-	'info_barre_outils' => 'avec sa barre d’outils ?',
268
-	'info_base_installee' => 'La structure de votre base de données est installée.',
269
-	'info_bio' => 'Biographie',
270
-	'info_cache_desactive' => 'Le cache est temporairement désactivé.',
271
-	'info_chapeau' => 'Chapeau',
272
-	'info_chapeau_2' => 'Chapeau :',
273
-	'info_chemin_acces_1' => 'Options : <b>Chemin d’accès dans l’annuaire</b>',
274
-	'info_chemin_acces_2' => 'Vous devez désormais configurer le chemin d’accès aux informations dans l’annuaire. Cette information est indispensable pour lire les profils utilisateurs stockés dans l’annuaire.',
275
-	'info_chemin_acces_annuaire' => 'Options : <b>Chemin d’accès dans l’annuaire</b>',
276
-	'info_choix_base' => 'Troisième étape :',
277
-	'info_classement_1' => '<sup>er</sup> sur @liste@',
278
-	'info_classement_2' => '<sup>e</sup> sur @liste@',
279
-	'info_code_acces' => 'N’oubliez pas vos propres codes d’accès !',
280
-	'info_config_suivi' => 'Si cette adresse correspond à une mailing-list, vous pouvez indiquer ci-dessous l’adresse à laquelle les participants au site peuvent s’inscrire. Cette adresse peut être une URL (par exemple la page d’inscription à la liste par le Web), ou une adresse email dotée d’un sujet spécifique (par exemple : <tt>@adresse_suivi@?subject=subscribe</tt>) :',
281
-	'info_config_suivi_explication' => 'Vous pouvez vous abonner à la mailing-list de ce site. Vous recevrez alors par courrier électronique les annonces d’articles et de brèves proposés à la publication.',
282
-	'info_confirmer_passe' => 'Confirmer ce nouveau mot de passe :',
283
-	'info_conflit_edition_avis_non_sauvegarde' => 'Attention, les champs suivants ont été modifiés par ailleurs. Vos modifications sur ces champs n’ont donc pas été enregistrées.',
284
-	'info_conflit_edition_differences' => 'Différences :',
285
-	'info_conflit_edition_version_enregistree' => 'La version enregistrée :',
286
-	'info_conflit_edition_votre_version' => 'Votre version :',
287
-	'info_connexion_base' => 'Essai de connexion à la base',
288
-	'info_connexion_base_donnee' => 'Connexion à votre base de données',
289
-	'info_connexion_ldap_ok' => '<b>La connexion LDAP a réussi.</b><p> Vous pouvez passer à l’étape suivante.</p>',
290
-	'info_connexion_mysql' => 'Votre connexion SQL',
291
-	'info_connexion_ok' => 'La connexion a réussi.',
292
-	'info_contact' => 'Contact',
293
-	'info_contenu_articles' => 'Contenu des articles',
294
-	'info_contributions' => 'Contributions',
295
-	'info_creation_paragraphe' => 'Pour créer des paragraphes, laissez simplement des lignes vides.',
296
-	'info_creation_rubrique' => 'Avant de pouvoir écrire des articles,<br /> vous devez créer au moins une rubrique.<br />',
297
-	'info_creation_tables' => 'Création des tables de la base',
298
-	'info_creer_base' => '<b>Créer</b> une nouvelle base de données :',
299
-	'info_dans_rubrique' => 'Dans la rubrique :',
300
-	'info_date_publication_anterieure' => 'Date de rédaction antérieure :',
301
-	'info_date_referencement' => 'DATE DE RÉFÉRENCEMENT DE CE SITE :',
302
-	'info_derniere_etape' => 'C’est terminé !',
303
-	'info_descriptif' => 'Descriptif :',
304
-	'info_desinstaller_plugin' => 'supprime les données et désactive le plugin',
305
-	'info_discussion_cours' => 'Discussions en cours',
306
-	'info_ecrire_article' => 'Avant de pouvoir écrire des articles, vous devez créer au moins une rubrique.',
307
-	'info_email_envoi' => 'Adresse email d’envoi (optionnel)',
308
-	'info_email_envoi_txt' => 'Indiquez ici l’adresse à utiliser pour envoyer les emails (à défaut, l’adresse destinataire sera utilisée comme adresse d’envoi) :',
309
-	'info_email_webmestre' => 'Adresse email du webmestre',
310
-	'info_envoi_email_automatique' => 'Envoi de mails automatique',
311
-	'info_envoyer_maintenant' => 'Envoyer maintenant',
312
-	'info_etape_suivante' => 'Passer à l’étape suivante',
313
-	'info_etape_suivante_1' => 'Vous pouvez passer à l’étape suivante.',
314
-	'info_etape_suivante_2' => 'Vous pouvez passer à l’étape suivante.',
315
-	'info_exceptions_proxy' => 'Exceptions pour le proxy',
316
-	'info_exportation_base' => 'exportation de la base vers @archive@',
317
-	'info_facilite_suivi_activite' => 'Afin de faciliter le suivi de l’activité
242
+    'info_ajouter_rubrique' => 'Ajouter une autre rubrique à administrer :',
243
+    'info_annonce_nouveautes' => 'Annonce des nouveautés',
244
+    'info_article' => 'article',
245
+    'info_article_2' => 'articles',
246
+    'info_article_a_paraitre' => 'Les articles post-datés à paraître',
247
+    'info_articles_02' => 'articles',
248
+    'info_articles_2' => 'Articles',
249
+    'info_articles_auteur' => 'Les articles de cet auteur',
250
+    'info_articles_miens' => 'Mes articles',
251
+    'info_articles_tous' => 'Tous les articles',
252
+    'info_articles_trouves' => 'Articles trouvés',
253
+    'info_attente_validation' => 'Vos articles en attente de validation',
254
+    'info_aucun_article' => 'Aucun article',
255
+    'info_aucun_auteur' => 'Aucun auteur',
256
+    'info_aucun_message' => 'Aucun message',
257
+    'info_aucun_rubrique' => 'Aucune rubrique',
258
+    'info_aujourdhui' => 'aujourd’hui :',
259
+    'info_auteur_gere_rubriques' => 'Cet auteur gère les rubriques suivantes :',
260
+    'info_auteur_gere_toutes_rubriques' => 'Cet auteur gère <b>toutes les rubriques</b>',
261
+    'info_auteur_gere_toutes_rubriques_2' => 'Je gère <b>toutes les rubriques</b>',
262
+    'info_auteurs' => 'Les auteurs',
263
+    'info_auteurs_par_tri' => 'Auteurs@partri@',
264
+    'info_auteurs_trouves' => 'Auteurs trouvés',
265
+    'info_authentification_externe' => 'Authentification externe',
266
+    'info_avertissement' => 'Avertissement',
267
+    'info_barre_outils' => 'avec sa barre d’outils ?',
268
+    'info_base_installee' => 'La structure de votre base de données est installée.',
269
+    'info_bio' => 'Biographie',
270
+    'info_cache_desactive' => 'Le cache est temporairement désactivé.',
271
+    'info_chapeau' => 'Chapeau',
272
+    'info_chapeau_2' => 'Chapeau :',
273
+    'info_chemin_acces_1' => 'Options : <b>Chemin d’accès dans l’annuaire</b>',
274
+    'info_chemin_acces_2' => 'Vous devez désormais configurer le chemin d’accès aux informations dans l’annuaire. Cette information est indispensable pour lire les profils utilisateurs stockés dans l’annuaire.',
275
+    'info_chemin_acces_annuaire' => 'Options : <b>Chemin d’accès dans l’annuaire</b>',
276
+    'info_choix_base' => 'Troisième étape :',
277
+    'info_classement_1' => '<sup>er</sup> sur @liste@',
278
+    'info_classement_2' => '<sup>e</sup> sur @liste@',
279
+    'info_code_acces' => 'N’oubliez pas vos propres codes d’accès !',
280
+    'info_config_suivi' => 'Si cette adresse correspond à une mailing-list, vous pouvez indiquer ci-dessous l’adresse à laquelle les participants au site peuvent s’inscrire. Cette adresse peut être une URL (par exemple la page d’inscription à la liste par le Web), ou une adresse email dotée d’un sujet spécifique (par exemple : <tt>@adresse_suivi@?subject=subscribe</tt>) :',
281
+    'info_config_suivi_explication' => 'Vous pouvez vous abonner à la mailing-list de ce site. Vous recevrez alors par courrier électronique les annonces d’articles et de brèves proposés à la publication.',
282
+    'info_confirmer_passe' => 'Confirmer ce nouveau mot de passe :',
283
+    'info_conflit_edition_avis_non_sauvegarde' => 'Attention, les champs suivants ont été modifiés par ailleurs. Vos modifications sur ces champs n’ont donc pas été enregistrées.',
284
+    'info_conflit_edition_differences' => 'Différences :',
285
+    'info_conflit_edition_version_enregistree' => 'La version enregistrée :',
286
+    'info_conflit_edition_votre_version' => 'Votre version :',
287
+    'info_connexion_base' => 'Essai de connexion à la base',
288
+    'info_connexion_base_donnee' => 'Connexion à votre base de données',
289
+    'info_connexion_ldap_ok' => '<b>La connexion LDAP a réussi.</b><p> Vous pouvez passer à l’étape suivante.</p>',
290
+    'info_connexion_mysql' => 'Votre connexion SQL',
291
+    'info_connexion_ok' => 'La connexion a réussi.',
292
+    'info_contact' => 'Contact',
293
+    'info_contenu_articles' => 'Contenu des articles',
294
+    'info_contributions' => 'Contributions',
295
+    'info_creation_paragraphe' => 'Pour créer des paragraphes, laissez simplement des lignes vides.',
296
+    'info_creation_rubrique' => 'Avant de pouvoir écrire des articles,<br /> vous devez créer au moins une rubrique.<br />',
297
+    'info_creation_tables' => 'Création des tables de la base',
298
+    'info_creer_base' => '<b>Créer</b> une nouvelle base de données :',
299
+    'info_dans_rubrique' => 'Dans la rubrique :',
300
+    'info_date_publication_anterieure' => 'Date de rédaction antérieure :',
301
+    'info_date_referencement' => 'DATE DE RÉFÉRENCEMENT DE CE SITE :',
302
+    'info_derniere_etape' => 'C’est terminé !',
303
+    'info_descriptif' => 'Descriptif :',
304
+    'info_desinstaller_plugin' => 'supprime les données et désactive le plugin',
305
+    'info_discussion_cours' => 'Discussions en cours',
306
+    'info_ecrire_article' => 'Avant de pouvoir écrire des articles, vous devez créer au moins une rubrique.',
307
+    'info_email_envoi' => 'Adresse email d’envoi (optionnel)',
308
+    'info_email_envoi_txt' => 'Indiquez ici l’adresse à utiliser pour envoyer les emails (à défaut, l’adresse destinataire sera utilisée comme adresse d’envoi) :',
309
+    'info_email_webmestre' => 'Adresse email du webmestre',
310
+    'info_envoi_email_automatique' => 'Envoi de mails automatique',
311
+    'info_envoyer_maintenant' => 'Envoyer maintenant',
312
+    'info_etape_suivante' => 'Passer à l’étape suivante',
313
+    'info_etape_suivante_1' => 'Vous pouvez passer à l’étape suivante.',
314
+    'info_etape_suivante_2' => 'Vous pouvez passer à l’étape suivante.',
315
+    'info_exceptions_proxy' => 'Exceptions pour le proxy',
316
+    'info_exportation_base' => 'exportation de la base vers @archive@',
317
+    'info_facilite_suivi_activite' => 'Afin de faciliter le suivi de l’activité
318 318
 		éditoriale du site, SPIP peut faire parvenir par mail, par exemple
319 319
 		à une mailing-list des rédacteurs, l’annonce des demandes de
320 320
 		publication et des validations d’articles. Indiquer une ou plusieurs adresses, séparées par des virgules.',
321
-	'info_fichiers_authent' => 'Fichiers d’authentification « .htpasswd »',
322
-	'info_forums_abo_invites' => 'Votre site comporte des forums sur abonnement ; les visiteurs sont donc invités à s’enregistrer sur le site public.',
323
-	'info_gauche_admin_tech' => '<b>Cette page est uniquement accessible aux responsables du site.</b><p> Elle donne accès aux différentes
321
+    'info_fichiers_authent' => 'Fichiers d’authentification « .htpasswd »',
322
+    'info_forums_abo_invites' => 'Votre site comporte des forums sur abonnement ; les visiteurs sont donc invités à s’enregistrer sur le site public.',
323
+    'info_gauche_admin_tech' => '<b>Cette page est uniquement accessible aux responsables du site.</b><p> Elle donne accès aux différentes
324 324
 fonctions de maintenance technique. Certaines d’entre elles donnent lieu à un processus d’authentification spécifique, qui
325 325
 exige d’avoir un accès FTP au site Web.</p>',
326
-	'info_gauche_admin_vider' => '<b>Cette page est uniquement accessible aux responsables du site.</b><p> Elle donne accès aux différentes
326
+    'info_gauche_admin_vider' => '<b>Cette page est uniquement accessible aux responsables du site.</b><p> Elle donne accès aux différentes
327 327
 fonctions de maintenance technique. Certaines d’entre elles donnent lieu à un processus d’authentification spécifique, qui
328 328
 exige d’avoir un accès FTP au site Web.</p>',
329
-	'info_gauche_auteurs' => 'Vous trouverez ici tous les auteurs du site.
329
+    'info_gauche_auteurs' => 'Vous trouverez ici tous les auteurs du site.
330 330
  Leur statut est indiqué par la couleur de leur icone (administrateur = vert ; rédacteur = jaune).',
331
-	'info_gauche_auteurs_exterieurs' => 'Les auteurs extérieurs, sans accès au site, sont indiqués par une icone bleue ;
331
+    'info_gauche_auteurs_exterieurs' => 'Les auteurs extérieurs, sans accès au site, sont indiqués par une icone bleue ;
332 332
 		les auteurs effacés par une icone grise.',
333
-	'info_gauche_messagerie' => 'La messagerie vous permet d’échanger des messages entre rédacteurs, de conserver des pense-bêtes (pour votre usage personnel) ou d’afficher des annonces sur la page d’accueil de l’espace privé (si vous êtes administrateur).',
334
-	'info_gauche_statistiques_referers' => 'Cette page présente la liste des <i>referers</i>, c’est-à-dire des sites contenant des liens menant vers votre propre site, uniquement pour hier et aujourd’hui ; cette liste est remise à zéro toutes les 24 heures.',
335
-	'info_gauche_visiteurs_enregistres' => 'Vous trouverez ici les visiteurs enregistrés
333
+    'info_gauche_messagerie' => 'La messagerie vous permet d’échanger des messages entre rédacteurs, de conserver des pense-bêtes (pour votre usage personnel) ou d’afficher des annonces sur la page d’accueil de l’espace privé (si vous êtes administrateur).',
334
+    'info_gauche_statistiques_referers' => 'Cette page présente la liste des <i>referers</i>, c’est-à-dire des sites contenant des liens menant vers votre propre site, uniquement pour hier et aujourd’hui ; cette liste est remise à zéro toutes les 24 heures.',
335
+    'info_gauche_visiteurs_enregistres' => 'Vous trouverez ici les visiteurs enregistrés
336 336
 	dans l’espace public du site (forums sur abonnement).',
337
-	'info_generation_miniatures_images' => 'Génération de miniatures des images',
338
-	'info_gerer_trad_objets' => '@objets@ : gérer les liens de traduction',
339
-	'info_hebergeur_desactiver_envoi_email' => 'Certains hébergeurs désactivent l’envoi automatique de
337
+    'info_generation_miniatures_images' => 'Génération de miniatures des images',
338
+    'info_gerer_trad_objets' => '@objets@ : gérer les liens de traduction',
339
+    'info_hebergeur_desactiver_envoi_email' => 'Certains hébergeurs désactivent l’envoi automatique de
340 340
 		mails depuis leurs serveurs. Dans ce cas, les fonctionnalités suivantes
341 341
 		de SPIP ne fonctionneront pas.',
342
-	'info_hier' => 'hier :',
343
-	'info_identification_publique' => 'Votre identité publique...',
344
-	'info_image_process' => 'Veuillez sélectionner la meilleure méthode de fabrication des vignettes en cliquant sur l’image correspondante.',
345
-	'info_images_auto' => 'Images calculées automatiquement',
346
-	'info_informations_personnelles' => 'Informations personnelles',
347
-	'info_inscription' => 'Inscription le',
348
-	'info_inscription_automatique' => 'Inscription automatique de nouveaux rédacteurs',
349
-	'info_jeu_caractere' => 'Jeu de caractères du site',
350
-	'info_jours' => 'jours',
351
-	'info_laisser_champs_vides' => 'laisser ces champs vides)',
352
-	'info_langues' => 'Langues du site',
353
-	'info_ldap_ok' => 'L’authentification LDAP est installée.',
354
-	'info_lien_hypertexte' => 'Lien hypertexte :',
355
-	'info_liste_nouveautes_envoyee' => 'La liste des nouveautés a été envoyée',
356
-	'info_liste_redacteurs_connectes' => 'Liste des rédacteurs connectés',
357
-	'info_login_existant' => 'Ce login existe déjà.',
358
-	'info_login_trop_court' => 'Login trop court.',
359
-	'info_login_trop_court_car_pluriel' => 'Le login doit contenir au moins @nb@ caractères.',
360
-	'info_logos' => 'Les logos',
361
-	'info_maximum' => 'maximum :',
362
-	'info_meme_rubrique' => 'Dans la même rubrique',
363
-	'info_message_en_redaction' => 'Vos messages en cours de rédaction',
364
-	'info_message_technique' => 'Message technique :',
365
-	'info_messagerie_interne' => 'Messagerie interne',
366
-	'info_mise_a_niveau_base' => 'mise à niveau de votre base SQL',
367
-	'info_mise_a_niveau_base_2' => '{{Attention !}} Vous avez installé une version
342
+    'info_hier' => 'hier :',
343
+    'info_identification_publique' => 'Votre identité publique...',
344
+    'info_image_process' => 'Veuillez sélectionner la meilleure méthode de fabrication des vignettes en cliquant sur l’image correspondante.',
345
+    'info_images_auto' => 'Images calculées automatiquement',
346
+    'info_informations_personnelles' => 'Informations personnelles',
347
+    'info_inscription' => 'Inscription le',
348
+    'info_inscription_automatique' => 'Inscription automatique de nouveaux rédacteurs',
349
+    'info_jeu_caractere' => 'Jeu de caractères du site',
350
+    'info_jours' => 'jours',
351
+    'info_laisser_champs_vides' => 'laisser ces champs vides)',
352
+    'info_langues' => 'Langues du site',
353
+    'info_ldap_ok' => 'L’authentification LDAP est installée.',
354
+    'info_lien_hypertexte' => 'Lien hypertexte :',
355
+    'info_liste_nouveautes_envoyee' => 'La liste des nouveautés a été envoyée',
356
+    'info_liste_redacteurs_connectes' => 'Liste des rédacteurs connectés',
357
+    'info_login_existant' => 'Ce login existe déjà.',
358
+    'info_login_trop_court' => 'Login trop court.',
359
+    'info_login_trop_court_car_pluriel' => 'Le login doit contenir au moins @nb@ caractères.',
360
+    'info_logos' => 'Les logos',
361
+    'info_maximum' => 'maximum :',
362
+    'info_meme_rubrique' => 'Dans la même rubrique',
363
+    'info_message_en_redaction' => 'Vos messages en cours de rédaction',
364
+    'info_message_technique' => 'Message technique :',
365
+    'info_messagerie_interne' => 'Messagerie interne',
366
+    'info_mise_a_niveau_base' => 'mise à niveau de votre base SQL',
367
+    'info_mise_a_niveau_base_2' => '{{Attention !}} Vous avez installé une version
368 368
 		des fichiers SPIP {antérieure} à celle qui se trouvait
369 369
 		auparavant sur ce site : votre base de données risque d’être
370 370
 		perdue et votre site ne fonctionnera plus.<br />{{Réinstallez les
371 371
 		fichiers de SPIP.}}',
372
-	'info_modification_enregistree' => 'Votre modification a été enregistrée',
373
-	'info_modifier_auteur' => 'Modifier l’auteur :',
374
-	'info_modifier_rubrique' => 'Modifier la rubrique :',
375
-	'info_modifier_titre' => 'Modifier : @titre@',
376
-	'info_mon_site_spip' => 'Mon site SPIP',
377
-	'info_moyenne' => 'moyenne :',
378
-	'info_multi_cet_article' => 'Langue de cet article :',
379
-	'info_multi_langues_choisies' => 'Veuillez sélectionner ci-après les langues à disposition des rédacteurs de votre site.
372
+    'info_modification_enregistree' => 'Votre modification a été enregistrée',
373
+    'info_modifier_auteur' => 'Modifier l’auteur :',
374
+    'info_modifier_rubrique' => 'Modifier la rubrique :',
375
+    'info_modifier_titre' => 'Modifier : @titre@',
376
+    'info_mon_site_spip' => 'Mon site SPIP',
377
+    'info_moyenne' => 'moyenne :',
378
+    'info_multi_cet_article' => 'Langue de cet article :',
379
+    'info_multi_langues_choisies' => 'Veuillez sélectionner ci-après les langues à disposition des rédacteurs de votre site.
380 380
 		Les langues déjà utilisées dans votre site (affichées en premier) ne peuvent pas être désactivées.',
381
-	'info_multi_objets' => '@objets@ : activer le menu de langue',
382
-	'info_multi_secteurs' => '... seulement pour les rubriques situées à la racine ?',
383
-	'info_nb_articles' => '@nb@ articles',
384
-	'info_nb_auteurs' => '@nb@ auteurs',
385
-	'info_nb_messages' => '@nb@ messages',
386
-	'info_nb_mots_cles' => '@nb@ mots-clés',
387
-	'info_nb_rubriques' => '@nb@ rubriques',
388
-	'info_nb_visiteurs' => '@nb@ visiteurs',
389
-	'info_nom' => 'Nom',
390
-	'info_nom_destinataire' => 'Nom du destinataire',
391
-	'info_nom_pas_conforme' => 'les tags html ne sont pas autorisés',
392
-	'info_nom_site' => 'Nom de votre site',
393
-	'info_nombre_articles' => '@nb_articles@ articles,',
394
-	'info_nombre_rubriques' => '@nb_rubriques@ rubriques,',
395
-	'info_nombre_sites' => '@nb_sites@ sites,',
396
-	'info_non_deplacer' => 'Ne pas déplacer...',
397
-	'info_non_envoi_annonce_dernieres_nouveautes' => 'SPIP peut envoyer, régulièrement, l’annonce des dernières nouveautés du site
381
+    'info_multi_objets' => '@objets@ : activer le menu de langue',
382
+    'info_multi_secteurs' => '... seulement pour les rubriques situées à la racine ?',
383
+    'info_nb_articles' => '@nb@ articles',
384
+    'info_nb_auteurs' => '@nb@ auteurs',
385
+    'info_nb_messages' => '@nb@ messages',
386
+    'info_nb_mots_cles' => '@nb@ mots-clés',
387
+    'info_nb_rubriques' => '@nb@ rubriques',
388
+    'info_nb_visiteurs' => '@nb@ visiteurs',
389
+    'info_nom' => 'Nom',
390
+    'info_nom_destinataire' => 'Nom du destinataire',
391
+    'info_nom_pas_conforme' => 'les tags html ne sont pas autorisés',
392
+    'info_nom_site' => 'Nom de votre site',
393
+    'info_nombre_articles' => '@nb_articles@ articles,',
394
+    'info_nombre_rubriques' => '@nb_rubriques@ rubriques,',
395
+    'info_nombre_sites' => '@nb_sites@ sites,',
396
+    'info_non_deplacer' => 'Ne pas déplacer...',
397
+    'info_non_envoi_annonce_dernieres_nouveautes' => 'SPIP peut envoyer, régulièrement, l’annonce des dernières nouveautés du site
398 398
 		(articles et brèves récemment publiés).',
399
-	'info_non_envoi_liste_nouveautes' => 'Ne pas envoyer la liste des nouveautés',
400
-	'info_non_modifiable' => 'ne peut pas être modifié',
401
-	'info_non_suppression_mot_cle' => 'je ne veux pas supprimer ce mot-clé.',
402
-	'info_notes' => 'Notes',
403
-	'info_nouvel_article' => 'Nouvel article',
404
-	'info_nouvelle_traduction' => 'Nouvelle traduction :',
405
-	'info_numero_article' => 'ARTICLE NUMÉRO :',
406
-	'info_obligatoire_02' => '(obligatoire)',
407
-	'info_option_accepter_visiteurs' => 'Accepter l’inscription de visiteurs du site public',
408
-	'info_option_ne_pas_accepter_visiteurs' => 'Refuser l’inscription des visiteurs',
409
-	'info_options_avancees' => 'OPTIONS AVANCÉES',
410
-	'info_ou' => 'ou...',
411
-	'info_page_interdite' => 'Page interdite',
412
-	'info_par_nom' => 'par nom',
413
-	'info_par_nombre_article' => 'par nombre d’articles',
414
-	'info_par_statut' => 'par statut',
415
-	'info_par_tri' => '’(par @tri@)’',
416
-	'info_passe_trop_court' => 'Mot de passe trop court.',
417
-	'info_passe_trop_court_car_pluriel' => 'Le mot de passe doit contenir au moins @nb@ caractères.',
418
-	'info_passes_identiques' => 'Les deux mots de passe ne sont pas identiques.',
419
-	'info_plus_cinq_car' => 'plus de 5 caractères',
420
-	'info_plus_cinq_car_2' => '(Plus de 5 caractères)',
421
-	'info_plus_trois_car' => '(Plus de 3 caractères)',
422
-	'info_popularite' => 'popularité : @popularite@ ; visites : @visites@',
423
-	'info_post_scriptum' => 'Post-Scriptum',
424
-	'info_post_scriptum_2' => 'Post-scriptum :',
425
-	'info_pour' => 'pour',
426
-	'info_preview_texte' => 'Il est possible de prévisualiser les différents éléments éditoriaux du site ayant au moins le statut « proposé », ainsi que les éléments en cours de rédaction dont on est l’auteur. Cette fonctionnalité doit-elle être disponible pour les administrateurs, les rédacteurs, ou personne ?',
427
-	'info_procedez_par_etape' => 'procédez étape par étape',
428
-	'info_procedure_maj_version' => 'la procédure de mise à jour doit être lancée afin d’adapter
399
+    'info_non_envoi_liste_nouveautes' => 'Ne pas envoyer la liste des nouveautés',
400
+    'info_non_modifiable' => 'ne peut pas être modifié',
401
+    'info_non_suppression_mot_cle' => 'je ne veux pas supprimer ce mot-clé.',
402
+    'info_notes' => 'Notes',
403
+    'info_nouvel_article' => 'Nouvel article',
404
+    'info_nouvelle_traduction' => 'Nouvelle traduction :',
405
+    'info_numero_article' => 'ARTICLE NUMÉRO :',
406
+    'info_obligatoire_02' => '(obligatoire)',
407
+    'info_option_accepter_visiteurs' => 'Accepter l’inscription de visiteurs du site public',
408
+    'info_option_ne_pas_accepter_visiteurs' => 'Refuser l’inscription des visiteurs',
409
+    'info_options_avancees' => 'OPTIONS AVANCÉES',
410
+    'info_ou' => 'ou...',
411
+    'info_page_interdite' => 'Page interdite',
412
+    'info_par_nom' => 'par nom',
413
+    'info_par_nombre_article' => 'par nombre d’articles',
414
+    'info_par_statut' => 'par statut',
415
+    'info_par_tri' => '’(par @tri@)’',
416
+    'info_passe_trop_court' => 'Mot de passe trop court.',
417
+    'info_passe_trop_court_car_pluriel' => 'Le mot de passe doit contenir au moins @nb@ caractères.',
418
+    'info_passes_identiques' => 'Les deux mots de passe ne sont pas identiques.',
419
+    'info_plus_cinq_car' => 'plus de 5 caractères',
420
+    'info_plus_cinq_car_2' => '(Plus de 5 caractères)',
421
+    'info_plus_trois_car' => '(Plus de 3 caractères)',
422
+    'info_popularite' => 'popularité : @popularite@ ; visites : @visites@',
423
+    'info_post_scriptum' => 'Post-Scriptum',
424
+    'info_post_scriptum_2' => 'Post-scriptum :',
425
+    'info_pour' => 'pour',
426
+    'info_preview_texte' => 'Il est possible de prévisualiser les différents éléments éditoriaux du site ayant au moins le statut « proposé », ainsi que les éléments en cours de rédaction dont on est l’auteur. Cette fonctionnalité doit-elle être disponible pour les administrateurs, les rédacteurs, ou personne ?',
427
+    'info_procedez_par_etape' => 'procédez étape par étape',
428
+    'info_procedure_maj_version' => 'la procédure de mise à jour doit être lancée afin d’adapter
429 429
 	la base de données à la nouvelle version de SPIP.',
430
-	'info_proxy_ok' => 'Test du proxy réussi.',
431
-	'info_ps' => 'P.-S.',
432
-	'info_publier' => 'publier',
433
-	'info_publies' => 'Vos articles publiés en ligne',
434
-	'info_question_accepter_visiteurs' => 'Si les squelettes de votre site prévoient l’enregistrement de visiteurs sans accès à l’espace privé, veuillez activer l’option ci-dessous :',
435
-	'info_question_inscription_nouveaux_redacteurs' => 'Acceptez-vous les inscriptions de nouveaux rédacteurs à
430
+    'info_proxy_ok' => 'Test du proxy réussi.',
431
+    'info_ps' => 'P.-S.',
432
+    'info_publier' => 'publier',
433
+    'info_publies' => 'Vos articles publiés en ligne',
434
+    'info_question_accepter_visiteurs' => 'Si les squelettes de votre site prévoient l’enregistrement de visiteurs sans accès à l’espace privé, veuillez activer l’option ci-dessous :',
435
+    'info_question_inscription_nouveaux_redacteurs' => 'Acceptez-vous les inscriptions de nouveaux rédacteurs à
436 436
   partir du site public ? Si vous acceptez, les visiteurs pourront s’inscrire
437 437
   depuis un formulaire automatisé et accéderont alors à l’espace privé pour
438 438
   proposer leurs propres articles. <div class="notice">Lors de la phase d’inscription,
@@ -441,405 +441,405 @@  discard block
 block discarded – undo
441 441
   hébergeurs désactivent l’envoi de mails depuis leurs
442 442
   serveurs : dans ce cas, l’inscription automatique est
443 443
   impossible.</div>',
444
-	'info_qui_edite' => '@nom_auteur_modif@ a travaillé sur ce contenu il y a @date_diff@ minutes',
445
-	'info_racine_site' => 'Racine du site',
446
-	'info_recharger_page' => 'Veuillez recharger cette page dans quelques instants.',
447
-	'info_recherche_auteur_zero' => 'Aucun résultat pour « @cherche_auteur@ ».',
448
-	'info_recommencer' => 'Veuillez recommencer.',
449
-	'info_redacteur_1' => 'Rédacteur',
450
-	'info_redacteur_2' => 'ayant accès à l’espace privé (<i>recommandé</i>)',
451
-	'info_redacteurs' => 'Rédacteurs',
452
-	'info_redaction_en_cours' => 'EN COURS DE RÉDACTION',
453
-	'info_redirection' => 'Redirection',
454
-	'info_redirection_activee' => 'La redirection est activée.',
455
-	'info_redirection_boucle' => 'Vous essayez de rediriger l’article sur lui-même.',
456
-	'info_redirection_desactivee' => 'La redirection a été supprimée.',
457
-	'info_refuses' => 'Vos articles refusés',
458
-	'info_reglage_ldap' => 'Options : <b>Réglage de l’importation LDAP</b>',
459
-	'info_renvoi_article' => '<b>Redirection.</b> Cet article renvoie à la page :',
460
-	'info_reserve_admin' => 'Seuls les administrateurs peuvent modifier cette adresse.',
461
-	'info_restreindre_rubrique' => 'Restreindre la gestion à la rubrique :',
462
-	'info_resultat_recherche' => 'Résultats de la recherche :',
463
-	'info_rubriques' => 'Rubriques',
464
-	'info_rubriques_02' => 'rubriques',
465
-	'info_rubriques_trouvees' => 'Rubriques trouvées',
466
-	'info_sans_titre' => 'Sans titre',
467
-	'info_selection_chemin_acces' => '<b>Sélectionnez</b> ci-après le chemin d’accès dans l’annuaire :',
468
-	'info_signatures' => 'signatures',
469
-	'info_site' => 'Site',
470
-	'info_site_2' => 'site :',
471
-	'info_site_min' => 'site',
472
-	'info_site_reference_2' => 'Site référencé',
473
-	'info_site_web' => 'Site Web :',
474
-	'info_sites' => 'sites',
475
-	'info_sites_lies_mot' => 'Les sites référencés liés à ce mot-clé',
476
-	'info_sites_proxy' => 'Utiliser un proxy',
477
-	'info_sites_trouves' => 'Sites trouvés',
478
-	'info_sous_titre' => 'Soustitre :',
479
-	'info_statut_administrateur' => 'Administrateur',
480
-	'info_statut_auteur' => 'Statut de cet auteur :',
481
-	'info_statut_auteur_2' => 'Je suis',
482
-	'info_statut_auteur_a_confirmer' => 'Inscription à confirmer',
483
-	'info_statut_auteur_autre' => 'Autre statut :',
484
-	'info_statut_redacteur' => 'Rédacteur',
485
-	'info_statut_utilisateurs_1' => 'Statut par défaut des utilisateurs importés',
486
-	'info_statut_utilisateurs_2' => 'Choisissez le statut qui est attribué aux personnes présentes dans l’annuaire LDAP lorsqu’elles se connectent pour la première fois. Vous pourrez par la suite modifier cette valeur pour chaque auteur au cas par cas.',
487
-	'info_suivi_activite' => 'Suivi de l’activité éditoriale',
488
-	'info_surtitre' => 'Surtitre :',
489
-	'info_syndication_integrale_1' => 'Votre site propose des fichiers de syndication (voir « <a href="@url@">@titre@</a> »).',
490
-	'info_syndication_integrale_2' => 'Souhaitez-vous transmettre les articles dans leur intégralité, ou ne diffuser qu’un résumé de quelques centaines de caractères ?',
491
-	'info_table_prefix' => 'Vous pouvez modifier le préfixe du nom des tables de données (ceci est indispensable lorsque l’on souhaite installer plusieurs sites dans la même base de données). Ce préfixe s’écrit en lettres minuscules, non accentuées, et sans espace.',
492
-	'info_taille_maximale_images' => 'SPIP va tester la taille maximale des images qu’il peut traiter (en millions de pixels).<br /> Les images plus grandes ne seront pas réduites.',
493
-	'info_taille_maximale_vignette' => 'Taille maximale des vignettes générées par le système :',
494
-	'info_terminer_installation' => 'Vous pouvez maintenant terminer la procédure d’installation standard.',
495
-	'info_texte' => 'Texte',
496
-	'info_texte_explicatif' => 'Texte explicatif',
497
-	'info_texte_long' => '(le texte est long : il apparaît donc en plusieurs parties qui seront recollées après validation.)',
498
-	'info_texte_message' => 'Texte de votre message',
499
-	'info_texte_message_02' => 'Texte du message',
500
-	'info_titre' => 'Titre :',
501
-	'info_total' => 'total :',
502
-	'info_tous_articles_en_redaction' => 'Tous les articles en cours de rédaction',
503
-	'info_tous_articles_presents' => 'Tous les articles publiés dans cette rubrique',
504
-	'info_tous_articles_refuses' => 'Tous les articles refusés',
505
-	'info_tous_les' => 'tous les :',
506
-	'info_tout_site' => 'Tout le site',
507
-	'info_tout_site2' => 'L’article n’a pas été traduit dans cette langue.',
508
-	'info_tout_site3' => 'L’article a été traduit dans cette langue, mais des modifications ont été apportées par la suite à l’article de référence. La traduction doit être mise à jour.',
509
-	'info_tout_site4' => 'L’article a été traduit dans cette langue, et la traduction est à jour.',
510
-	'info_tout_site5' => 'Article original.',
511
-	'info_tout_site6' => '<b>Attention :</b> seuls les articles originaux sont affichés.
444
+    'info_qui_edite' => '@nom_auteur_modif@ a travaillé sur ce contenu il y a @date_diff@ minutes',
445
+    'info_racine_site' => 'Racine du site',
446
+    'info_recharger_page' => 'Veuillez recharger cette page dans quelques instants.',
447
+    'info_recherche_auteur_zero' => 'Aucun résultat pour « @cherche_auteur@ ».',
448
+    'info_recommencer' => 'Veuillez recommencer.',
449
+    'info_redacteur_1' => 'Rédacteur',
450
+    'info_redacteur_2' => 'ayant accès à l’espace privé (<i>recommandé</i>)',
451
+    'info_redacteurs' => 'Rédacteurs',
452
+    'info_redaction_en_cours' => 'EN COURS DE RÉDACTION',
453
+    'info_redirection' => 'Redirection',
454
+    'info_redirection_activee' => 'La redirection est activée.',
455
+    'info_redirection_boucle' => 'Vous essayez de rediriger l’article sur lui-même.',
456
+    'info_redirection_desactivee' => 'La redirection a été supprimée.',
457
+    'info_refuses' => 'Vos articles refusés',
458
+    'info_reglage_ldap' => 'Options : <b>Réglage de l’importation LDAP</b>',
459
+    'info_renvoi_article' => '<b>Redirection.</b> Cet article renvoie à la page :',
460
+    'info_reserve_admin' => 'Seuls les administrateurs peuvent modifier cette adresse.',
461
+    'info_restreindre_rubrique' => 'Restreindre la gestion à la rubrique :',
462
+    'info_resultat_recherche' => 'Résultats de la recherche :',
463
+    'info_rubriques' => 'Rubriques',
464
+    'info_rubriques_02' => 'rubriques',
465
+    'info_rubriques_trouvees' => 'Rubriques trouvées',
466
+    'info_sans_titre' => 'Sans titre',
467
+    'info_selection_chemin_acces' => '<b>Sélectionnez</b> ci-après le chemin d’accès dans l’annuaire :',
468
+    'info_signatures' => 'signatures',
469
+    'info_site' => 'Site',
470
+    'info_site_2' => 'site :',
471
+    'info_site_min' => 'site',
472
+    'info_site_reference_2' => 'Site référencé',
473
+    'info_site_web' => 'Site Web :',
474
+    'info_sites' => 'sites',
475
+    'info_sites_lies_mot' => 'Les sites référencés liés à ce mot-clé',
476
+    'info_sites_proxy' => 'Utiliser un proxy',
477
+    'info_sites_trouves' => 'Sites trouvés',
478
+    'info_sous_titre' => 'Soustitre :',
479
+    'info_statut_administrateur' => 'Administrateur',
480
+    'info_statut_auteur' => 'Statut de cet auteur :',
481
+    'info_statut_auteur_2' => 'Je suis',
482
+    'info_statut_auteur_a_confirmer' => 'Inscription à confirmer',
483
+    'info_statut_auteur_autre' => 'Autre statut :',
484
+    'info_statut_redacteur' => 'Rédacteur',
485
+    'info_statut_utilisateurs_1' => 'Statut par défaut des utilisateurs importés',
486
+    'info_statut_utilisateurs_2' => 'Choisissez le statut qui est attribué aux personnes présentes dans l’annuaire LDAP lorsqu’elles se connectent pour la première fois. Vous pourrez par la suite modifier cette valeur pour chaque auteur au cas par cas.',
487
+    'info_suivi_activite' => 'Suivi de l’activité éditoriale',
488
+    'info_surtitre' => 'Surtitre :',
489
+    'info_syndication_integrale_1' => 'Votre site propose des fichiers de syndication (voir « <a href="@url@">@titre@</a> »).',
490
+    'info_syndication_integrale_2' => 'Souhaitez-vous transmettre les articles dans leur intégralité, ou ne diffuser qu’un résumé de quelques centaines de caractères ?',
491
+    'info_table_prefix' => 'Vous pouvez modifier le préfixe du nom des tables de données (ceci est indispensable lorsque l’on souhaite installer plusieurs sites dans la même base de données). Ce préfixe s’écrit en lettres minuscules, non accentuées, et sans espace.',
492
+    'info_taille_maximale_images' => 'SPIP va tester la taille maximale des images qu’il peut traiter (en millions de pixels).<br /> Les images plus grandes ne seront pas réduites.',
493
+    'info_taille_maximale_vignette' => 'Taille maximale des vignettes générées par le système :',
494
+    'info_terminer_installation' => 'Vous pouvez maintenant terminer la procédure d’installation standard.',
495
+    'info_texte' => 'Texte',
496
+    'info_texte_explicatif' => 'Texte explicatif',
497
+    'info_texte_long' => '(le texte est long : il apparaît donc en plusieurs parties qui seront recollées après validation.)',
498
+    'info_texte_message' => 'Texte de votre message',
499
+    'info_texte_message_02' => 'Texte du message',
500
+    'info_titre' => 'Titre :',
501
+    'info_total' => 'total :',
502
+    'info_tous_articles_en_redaction' => 'Tous les articles en cours de rédaction',
503
+    'info_tous_articles_presents' => 'Tous les articles publiés dans cette rubrique',
504
+    'info_tous_articles_refuses' => 'Tous les articles refusés',
505
+    'info_tous_les' => 'tous les :',
506
+    'info_tout_site' => 'Tout le site',
507
+    'info_tout_site2' => 'L’article n’a pas été traduit dans cette langue.',
508
+    'info_tout_site3' => 'L’article a été traduit dans cette langue, mais des modifications ont été apportées par la suite à l’article de référence. La traduction doit être mise à jour.',
509
+    'info_tout_site4' => 'L’article a été traduit dans cette langue, et la traduction est à jour.',
510
+    'info_tout_site5' => 'Article original.',
511
+    'info_tout_site6' => '<b>Attention :</b> seuls les articles originaux sont affichés.
512 512
 Les traductions sont associées à l’original,
513 513
 dans une couleur qui indique leur état :',
514
-	'info_traductions' => 'Traductions',
515
-	'info_travail_colaboratif' => 'Travail collaboratif sur les articles',
516
-	'info_un_article' => 'un article,',
517
-	'info_un_site' => 'un site,',
518
-	'info_une_rubrique' => 'une rubrique,',
519
-	'info_une_rubrique_02' => '1 rubrique',
520
-	'info_url' => 'URL :',
521
-	'info_url_proxy' => 'URL du proxy',
522
-	'info_url_proxy_pas_conforme' => 'l’URL du proxy n’est pas valide.',
523
-	'info_url_site_pas_conforme' => 'l’URL du site n’est pas valide.',
524
-	'info_url_test_proxy' => 'URL de test',
525
-	'info_urlref' => 'Lien hypertexte :',
526
-	'info_utilisation_spip' => 'Vous pouvez maintenant commencer à utiliser le système de publication assistée...',
527
-	'info_visites_par_mois' => 'Affichage par mois :',
528
-	'info_visiteur_1' => 'Visiteur',
529
-	'info_visiteur_2' => 'du site public',
530
-	'info_visiteurs' => 'Visiteurs',
531
-	'info_visiteurs_02' => 'Visiteurs du site public',
532
-	'info_webmestre_forces' => 'Les webmestres sont actuellement définis dans <tt>@file_options@</tt>.',
533
-	'install_adresse_base_hebergeur' => 'Adresse de la base de données attribuée par l’hébergeur',
534
-	'install_connect_ok' => 'La nouvelle base a bien été déclarée sous le nom de serveur @connect@.',
535
-	'install_echec_annonce' => 'L’installation va probablement échouer, ou aboutir à un site non fonctionnel...',
536
-	'install_extension_mbstring' => 'SPIP ne fonctionne pas avec :',
537
-	'install_extension_php_obligatoire' => 'SPIP exige l’extension php :',
538
-	'install_login_base_hebergeur' => 'Login de connexion attribué par l’hébergeur',
539
-	'install_nom_base_hebergeur' => 'Nom de la base attribué par l’hébergeur :',
540
-	'install_pas_table' => 'Base actuellement sans tables',
541
-	'install_pass_base_hebergeur' => 'Mot de passe de connexion attribué par l’hébergeur',
542
-	'install_php_extension' => 'Les extensions suivantes sont manquantes : @extensions@',
543
-	'install_php_version' => 'PHP version @version@ insuffisant (minimum = @minimum@)',
544
-	'install_php_version_max' => 'PHP version @version@ trop récent (maximum = @maximum@)',
545
-	'install_select_langue' => 'Sélectionnez une langue puis cliquez sur le bouton « suivant » pour lancer la procédure d’installation.',
546
-	'install_select_type_db' => 'Indiquer le type de base de données :',
547
-	'install_select_type_mysql' => 'MySQL',
548
-	'install_select_type_pg' => 'PostgreSQL',
549
-	'install_select_type_sqlite2' => 'SQLite 2',
550
-	'install_select_type_sqlite3' => 'SQLite 3',
551
-	'install_serveur_hebergeur' => 'Serveur de base de données attribué par l’hébergeur',
552
-	'install_table_prefix_hebergeur' => 'Préfixe de table attribué par l’hébergeur :',
553
-	'install_tables_base' => 'Tables de la base',
554
-	'install_types_db_connus' => 'SPIP sait utiliser <b>MySQL</b> (le plus répandu) et <b>SQLite</b>.',
555
-	'install_types_db_connus_avertissement' => 'Le support de <b>PostgreSQL</b> est également proposé à titre experimental',
556
-	'instituer_erreur_statut_a_change' => 'Le statut a déjà été modifié',
557
-	'instituer_erreur_statut_non_autorise' => 'Vous ne pouvez pas choisir ce statut',
558
-	'intem_redacteur' => 'rédacteur',
559
-	'intitule_licence' => 'Licence',
560
-	'item_accepter_inscriptions' => 'Accepter les inscriptions',
561
-	'item_activer_messages_avertissement' => 'Activer les messages d’avertissement',
562
-	'item_administrateur_2' => 'administrateur',
563
-	'item_afficher_calendrier' => 'Afficher dans le calendrier',
564
-	'item_autoriser_syndication_integrale' => 'Diffuser l’intégralité des articles dans les fichiers de syndication',
565
-	'item_choix_administrateurs' => 'les administrateurs',
566
-	'item_choix_generation_miniature' => 'Générer automatiquement les miniatures des images.',
567
-	'item_choix_non_generation_miniature' => 'Ne pas générer de miniatures des images.',
568
-	'item_choix_redacteurs' => 'les rédacteurs',
569
-	'item_choix_visiteurs' => 'les visiteurs du site public',
570
-	'item_creer_fichiers_authent' => 'Créer les fichiers .htpasswd',
571
-	'item_login' => 'Login',
572
-	'item_messagerie_agenda' => 'Activer la messagerie et l’agenda',
573
-	'item_mots_cles_association_articles' => 'aux articles',
574
-	'item_mots_cles_association_rubriques' => 'aux rubriques',
575
-	'item_mots_cles_association_sites' => 'aux sites référencés ou syndiqués.',
576
-	'item_non' => 'Non',
577
-	'item_non_accepter_inscriptions' => 'Ne pas accepter les inscriptions',
578
-	'item_non_activer_messages_avertissement' => 'Pas de messages d’avertissement',
579
-	'item_non_afficher_calendrier' => 'Ne pas afficher dans le calendrier',
580
-	'item_non_autoriser_syndication_integrale' => 'Ne diffuser qu’un résumé',
581
-	'item_non_creer_fichiers_authent' => 'Ne pas créer ces fichiers',
582
-	'item_non_messagerie_agenda' => 'Désactiver la messagerie et l’agenda',
583
-	'item_non_publier_articles' => 'Ne pas publier les articles avant la date de publication fixée.',
584
-	'item_nouvel_auteur' => 'Nouvel auteur',
585
-	'item_nouvelle_rubrique' => 'Nouvelle rubrique',
586
-	'item_oui' => 'Oui',
587
-	'item_publier_articles' => 'Publier les articles, quelle que soit leur date de publication.',
588
-	'item_reponse_article' => 'Réponse à l’article',
589
-	'item_visiteur' => 'visiteur',
514
+    'info_traductions' => 'Traductions',
515
+    'info_travail_colaboratif' => 'Travail collaboratif sur les articles',
516
+    'info_un_article' => 'un article,',
517
+    'info_un_site' => 'un site,',
518
+    'info_une_rubrique' => 'une rubrique,',
519
+    'info_une_rubrique_02' => '1 rubrique',
520
+    'info_url' => 'URL :',
521
+    'info_url_proxy' => 'URL du proxy',
522
+    'info_url_proxy_pas_conforme' => 'l’URL du proxy n’est pas valide.',
523
+    'info_url_site_pas_conforme' => 'l’URL du site n’est pas valide.',
524
+    'info_url_test_proxy' => 'URL de test',
525
+    'info_urlref' => 'Lien hypertexte :',
526
+    'info_utilisation_spip' => 'Vous pouvez maintenant commencer à utiliser le système de publication assistée...',
527
+    'info_visites_par_mois' => 'Affichage par mois :',
528
+    'info_visiteur_1' => 'Visiteur',
529
+    'info_visiteur_2' => 'du site public',
530
+    'info_visiteurs' => 'Visiteurs',
531
+    'info_visiteurs_02' => 'Visiteurs du site public',
532
+    'info_webmestre_forces' => 'Les webmestres sont actuellement définis dans <tt>@file_options@</tt>.',
533
+    'install_adresse_base_hebergeur' => 'Adresse de la base de données attribuée par l’hébergeur',
534
+    'install_connect_ok' => 'La nouvelle base a bien été déclarée sous le nom de serveur @connect@.',
535
+    'install_echec_annonce' => 'L’installation va probablement échouer, ou aboutir à un site non fonctionnel...',
536
+    'install_extension_mbstring' => 'SPIP ne fonctionne pas avec :',
537
+    'install_extension_php_obligatoire' => 'SPIP exige l’extension php :',
538
+    'install_login_base_hebergeur' => 'Login de connexion attribué par l’hébergeur',
539
+    'install_nom_base_hebergeur' => 'Nom de la base attribué par l’hébergeur :',
540
+    'install_pas_table' => 'Base actuellement sans tables',
541
+    'install_pass_base_hebergeur' => 'Mot de passe de connexion attribué par l’hébergeur',
542
+    'install_php_extension' => 'Les extensions suivantes sont manquantes : @extensions@',
543
+    'install_php_version' => 'PHP version @version@ insuffisant (minimum = @minimum@)',
544
+    'install_php_version_max' => 'PHP version @version@ trop récent (maximum = @maximum@)',
545
+    'install_select_langue' => 'Sélectionnez une langue puis cliquez sur le bouton « suivant » pour lancer la procédure d’installation.',
546
+    'install_select_type_db' => 'Indiquer le type de base de données :',
547
+    'install_select_type_mysql' => 'MySQL',
548
+    'install_select_type_pg' => 'PostgreSQL',
549
+    'install_select_type_sqlite2' => 'SQLite 2',
550
+    'install_select_type_sqlite3' => 'SQLite 3',
551
+    'install_serveur_hebergeur' => 'Serveur de base de données attribué par l’hébergeur',
552
+    'install_table_prefix_hebergeur' => 'Préfixe de table attribué par l’hébergeur :',
553
+    'install_tables_base' => 'Tables de la base',
554
+    'install_types_db_connus' => 'SPIP sait utiliser <b>MySQL</b> (le plus répandu) et <b>SQLite</b>.',
555
+    'install_types_db_connus_avertissement' => 'Le support de <b>PostgreSQL</b> est également proposé à titre experimental',
556
+    'instituer_erreur_statut_a_change' => 'Le statut a déjà été modifié',
557
+    'instituer_erreur_statut_non_autorise' => 'Vous ne pouvez pas choisir ce statut',
558
+    'intem_redacteur' => 'rédacteur',
559
+    'intitule_licence' => 'Licence',
560
+    'item_accepter_inscriptions' => 'Accepter les inscriptions',
561
+    'item_activer_messages_avertissement' => 'Activer les messages d’avertissement',
562
+    'item_administrateur_2' => 'administrateur',
563
+    'item_afficher_calendrier' => 'Afficher dans le calendrier',
564
+    'item_autoriser_syndication_integrale' => 'Diffuser l’intégralité des articles dans les fichiers de syndication',
565
+    'item_choix_administrateurs' => 'les administrateurs',
566
+    'item_choix_generation_miniature' => 'Générer automatiquement les miniatures des images.',
567
+    'item_choix_non_generation_miniature' => 'Ne pas générer de miniatures des images.',
568
+    'item_choix_redacteurs' => 'les rédacteurs',
569
+    'item_choix_visiteurs' => 'les visiteurs du site public',
570
+    'item_creer_fichiers_authent' => 'Créer les fichiers .htpasswd',
571
+    'item_login' => 'Login',
572
+    'item_messagerie_agenda' => 'Activer la messagerie et l’agenda',
573
+    'item_mots_cles_association_articles' => 'aux articles',
574
+    'item_mots_cles_association_rubriques' => 'aux rubriques',
575
+    'item_mots_cles_association_sites' => 'aux sites référencés ou syndiqués.',
576
+    'item_non' => 'Non',
577
+    'item_non_accepter_inscriptions' => 'Ne pas accepter les inscriptions',
578
+    'item_non_activer_messages_avertissement' => 'Pas de messages d’avertissement',
579
+    'item_non_afficher_calendrier' => 'Ne pas afficher dans le calendrier',
580
+    'item_non_autoriser_syndication_integrale' => 'Ne diffuser qu’un résumé',
581
+    'item_non_creer_fichiers_authent' => 'Ne pas créer ces fichiers',
582
+    'item_non_messagerie_agenda' => 'Désactiver la messagerie et l’agenda',
583
+    'item_non_publier_articles' => 'Ne pas publier les articles avant la date de publication fixée.',
584
+    'item_nouvel_auteur' => 'Nouvel auteur',
585
+    'item_nouvelle_rubrique' => 'Nouvelle rubrique',
586
+    'item_oui' => 'Oui',
587
+    'item_publier_articles' => 'Publier les articles, quelle que soit leur date de publication.',
588
+    'item_reponse_article' => 'Réponse à l’article',
589
+    'item_visiteur' => 'visiteur',
590 590
 
591
-	// J
592
-	'jour_non_connu_nc' => 'n.c.',
591
+    // J
592
+    'jour_non_connu_nc' => 'n.c.',
593 593
 
594
-	// L
595
-	'label_bando_outils' => 'Barre d’outils',
596
-	'label_bando_outils_afficher' => 'Afficher les outils',
597
-	'label_bando_outils_masquer' => 'Masquer les outils',
598
-	'label_choix_langue' => 'Sélectionnez votre langue',
599
-	'label_langue' => 'Langue',
600
-	'label_nom_fichier_connect' => 'Indiquez le nom utilisé pour ce serveur',
601
-	'label_slogan_site' => 'Slogan du site',
602
-	'label_taille_ecran' => 'Largeur de l’écran',
603
-	'label_texte_et_icones_navigation' => 'Menu de navigation',
604
-	'label_texte_et_icones_page' => 'Affichage dans la page',
605
-	'ldap_correspondance' => 'héritage du champ @champ@',
606
-	'ldap_correspondance_1' => 'Héritage des champs LDAP',
607
-	'ldap_correspondance_2' => 'Pour chacun des champs SPIP suivants, indiquer le nom du champ LDAP correspondant. Laisser vide pour ne pas le remplir, séparer par des espaces ou des virgules pour essayer plusieurs champs LDAP.',
608
-	'lien_ajouter_auteur' => 'Ajouter cet auteur',
609
-	'lien_ajouter_une_rubrique' => 'Ajouter cette rubrique',
610
-	'lien_email' => 'email',
611
-	'lien_nom_site' => 'NOM DU SITE :',
612
-	'lien_rapide_contenu' => 'Aller au contenu',
613
-	'lien_rapide_navigation' => 'Aller à la navigation',
614
-	'lien_rapide_recherche' => 'Aller à la recherche',
615
-	'lien_retirer_auteur' => 'Retirer l’auteur',
616
-	'lien_retirer_rubrique' => 'Retirer la rubrique',
617
-	'lien_retirer_tous_auteurs' => 'Retirer tous les auteurs',
618
-	'lien_retirer_toutes_rubriques' => 'Retirer toutes les rubriques',
619
-	'lien_site' => 'site',
620
-	'lien_tout_decocher' => 'Tout décocher',
621
-	'lien_tout_deplier' => 'Tout déplier',
622
-	'lien_tout_replier' => 'Tout replier',
623
-	'lien_tout_supprimer' => 'Tout supprimer',
624
-	'lien_trier_nom' => 'Trier par nom',
625
-	'lien_trier_nombre_articles' => 'Trier par nombre d’articles',
626
-	'lien_trier_statut' => 'Trier par statut',
627
-	'lien_voir_en_ligne' => 'VOIR EN LIGNE :',
628
-	'logo_article' => 'Logo de l’article',
629
-	'logo_auteur' => 'Logo de l’auteur',
630
-	'logo_rubrique' => 'Logo de la rubrique',
631
-	'logo_site' => 'Logo de ce site',
632
-	'logo_standard_rubrique' => 'Logo standard des rubriques',
633
-	'logo_survol' => 'Logo pour survol',
594
+    // L
595
+    'label_bando_outils' => 'Barre d’outils',
596
+    'label_bando_outils_afficher' => 'Afficher les outils',
597
+    'label_bando_outils_masquer' => 'Masquer les outils',
598
+    'label_choix_langue' => 'Sélectionnez votre langue',
599
+    'label_langue' => 'Langue',
600
+    'label_nom_fichier_connect' => 'Indiquez le nom utilisé pour ce serveur',
601
+    'label_slogan_site' => 'Slogan du site',
602
+    'label_taille_ecran' => 'Largeur de l’écran',
603
+    'label_texte_et_icones_navigation' => 'Menu de navigation',
604
+    'label_texte_et_icones_page' => 'Affichage dans la page',
605
+    'ldap_correspondance' => 'héritage du champ @champ@',
606
+    'ldap_correspondance_1' => 'Héritage des champs LDAP',
607
+    'ldap_correspondance_2' => 'Pour chacun des champs SPIP suivants, indiquer le nom du champ LDAP correspondant. Laisser vide pour ne pas le remplir, séparer par des espaces ou des virgules pour essayer plusieurs champs LDAP.',
608
+    'lien_ajouter_auteur' => 'Ajouter cet auteur',
609
+    'lien_ajouter_une_rubrique' => 'Ajouter cette rubrique',
610
+    'lien_email' => 'email',
611
+    'lien_nom_site' => 'NOM DU SITE :',
612
+    'lien_rapide_contenu' => 'Aller au contenu',
613
+    'lien_rapide_navigation' => 'Aller à la navigation',
614
+    'lien_rapide_recherche' => 'Aller à la recherche',
615
+    'lien_retirer_auteur' => 'Retirer l’auteur',
616
+    'lien_retirer_rubrique' => 'Retirer la rubrique',
617
+    'lien_retirer_tous_auteurs' => 'Retirer tous les auteurs',
618
+    'lien_retirer_toutes_rubriques' => 'Retirer toutes les rubriques',
619
+    'lien_site' => 'site',
620
+    'lien_tout_decocher' => 'Tout décocher',
621
+    'lien_tout_deplier' => 'Tout déplier',
622
+    'lien_tout_replier' => 'Tout replier',
623
+    'lien_tout_supprimer' => 'Tout supprimer',
624
+    'lien_trier_nom' => 'Trier par nom',
625
+    'lien_trier_nombre_articles' => 'Trier par nombre d’articles',
626
+    'lien_trier_statut' => 'Trier par statut',
627
+    'lien_voir_en_ligne' => 'VOIR EN LIGNE :',
628
+    'logo_article' => 'Logo de l’article',
629
+    'logo_auteur' => 'Logo de l’auteur',
630
+    'logo_rubrique' => 'Logo de la rubrique',
631
+    'logo_site' => 'Logo de ce site',
632
+    'logo_standard_rubrique' => 'Logo standard des rubriques',
633
+    'logo_survol' => 'Logo pour survol',
634 634
 
635
-	// M
636
-	'menu_aide_installation_choix_base' => 'Choix de votre base',
637
-	'module_fichier_langue' => 'Fichier de langue',
638
-	'module_raccourci' => 'Raccourci',
639
-	'module_texte_affiche' => 'Texte affiché',
640
-	'module_texte_explicatif' => 'Vous pouvez insérer les raccourcis suivants dans les squelettes de votre site public. Ils seront automatiquement traduits dans les différentes langues pour lesquelles il existe un fichier de langue.',
641
-	'module_texte_traduction' => 'Le fichier de langue « @module@ » est disponible en :',
642
-	'mois_non_connu' => 'non connu',
635
+    // M
636
+    'menu_aide_installation_choix_base' => 'Choix de votre base',
637
+    'module_fichier_langue' => 'Fichier de langue',
638
+    'module_raccourci' => 'Raccourci',
639
+    'module_texte_affiche' => 'Texte affiché',
640
+    'module_texte_explicatif' => 'Vous pouvez insérer les raccourcis suivants dans les squelettes de votre site public. Ils seront automatiquement traduits dans les différentes langues pour lesquelles il existe un fichier de langue.',
641
+    'module_texte_traduction' => 'Le fichier de langue « @module@ » est disponible en :',
642
+    'mois_non_connu' => 'non connu',
643 643
 
644
-	// N
645
-	'nouvelle_version_spip' => 'La mise à jour @version@ de SPIP est disponible',
646
-	'nouvelle_version_spip_majeure' => 'Une nouvelle version SPIP @version@ est disponible',
644
+    // N
645
+    'nouvelle_version_spip' => 'La mise à jour @version@ de SPIP est disponible',
646
+    'nouvelle_version_spip_majeure' => 'Une nouvelle version SPIP @version@ est disponible',
647 647
 
648
-	// O
649
-	'onglet_contenu' => 'Contenu',
650
-	'onglet_declarer_une_autre_base' => 'Déclarer une autre base',
651
-	'onglet_discuter' => 'Discuter',
652
-	'onglet_interactivite' => 'Interactivité',
653
-	'onglet_proprietes' => 'Propriétés',
654
-	'onglet_repartition_actuelle' => 'actuellement',
655
-	'onglet_sous_rubriques' => 'Sous-rubriques',
648
+    // O
649
+    'onglet_contenu' => 'Contenu',
650
+    'onglet_declarer_une_autre_base' => 'Déclarer une autre base',
651
+    'onglet_discuter' => 'Discuter',
652
+    'onglet_interactivite' => 'Interactivité',
653
+    'onglet_proprietes' => 'Propriétés',
654
+    'onglet_repartition_actuelle' => 'actuellement',
655
+    'onglet_sous_rubriques' => 'Sous-rubriques',
656 656
 
657
-	// P
658
-	'page_pas_proxy' => 'Cette page ne doit pas passer par le proxy',
659
-	'pas_de_proxy_pour' => 'Au besoin, indiquez les machines ou domaines pour lesquels ce proxy ne doit pas s’appliquer (par exemple : @exemple@)',
660
-	'phpinfo' => 'Configuration PHP',
661
-	'plugin_charge_paquet' => 'Chargement du paquet @name@',
662
-	'plugin_charger' => 'Télécharger',
663
-	'plugin_erreur_charger' => 'erreur : impossible de charger @zip@',
664
-	'plugin_erreur_droit1' => 'Le répertoire <code>@dest@</code> n’est pas accessible en écriture.',
665
-	'plugin_erreur_droit2' => 'Veuillez vérifier les droits sur ce répertoire (et le créer le cas échéant), ou installer les fichiers par FTP.',
666
-	'plugin_erreur_zip' => 'échec pclzip : erreur @status@',
667
-	'plugin_etat_developpement' => 'en développement',
668
-	'plugin_etat_experimental' => 'expérimental',
669
-	'plugin_etat_stable' => 'stable',
670
-	'plugin_etat_test' => 'en test',
671
-	'plugin_impossible_activer' => 'Impossible d’activer le plugin @plugin@',
672
-	'plugin_info_automatique1' => 'Si vous souhaitez autoriser l’installation automatique des plugins, veuillez :',
673
-	'plugin_info_automatique1_lib' => 'Si vous souhaitez autoriser l’installation automatique de cette librairie, veuillez :',
674
-	'plugin_info_automatique2' => 'créer un répertoire <code>@rep@</code> ;',
675
-	'plugin_info_automatique3' => 'vérifier que le serveur est autorisé à écrire dans ce répertoire.',
676
-	'plugin_info_automatique_creer' => 'à créer à la racine du site.',
677
-	'plugin_info_automatique_exemples' => 'exemples :',
678
-	'plugin_info_automatique_ftp' => 'Vous pouvez installer des plugins, par FTP, dans le répertoire <tt>@rep@</tt>',
679
-	'plugin_info_automatique_lib' => 'Certains plugins demandent aussi à pouvoir télécharger des fichiers dans le répertoire <code>lib/</code>, à créer le cas échéant à la racine du site.',
680
-	'plugin_info_automatique_liste' => 'Vos listes de plugins :',
681
-	'plugin_info_automatique_liste_officielle' => 'les plugins officiels',
682
-	'plugin_info_automatique_liste_update' => 'Mettre à jour les listes',
683
-	'plugin_info_automatique_ou' => 'ou...',
684
-	'plugin_info_automatique_select' => 'Sélectionnez ci-dessous un plugin : SPIP le téléchargera et l’installera dans le répertoire <code>@rep@</code> ; si ce plugin existe déjà, il sera mis à jour.',
685
-	'plugin_info_credit' => 'Crédits',
686
-	'plugin_info_erreur_xml' => 'La déclaration de ce plugin est incorrecte',
687
-	'plugin_info_install_ok' => 'Installation réussie',
688
-	'plugin_info_necessite' => 'Nécessite :',
689
-	'plugin_info_non_compatible_spip' => 'Ce plugin n’est pas compatible avec cette version de SPIP',
690
-	'plugin_info_plugins_dist_1' => 'Les plugins ci-dessous sont chargés et activés dans le répertoire @plugins_dist@.',
691
-	'plugin_info_plugins_dist_2' => 'Ils ne sont pas désactivables.',
692
-	'plugin_info_telecharger' => 'à télécharger depuis @url@ et à installer dans @rep@',
693
-	'plugin_info_upgrade_ok' => 'Mise à jour réussie',
694
-	'plugin_librairies_installees' => 'Librairies installées',
695
-	'plugin_necessite_extension_php' => 'Nécessite l’extension PHP @plugin@ en version @version@.',
696
-	'plugin_necessite_extension_php_sans_version' => 'Nécessite l’extension PHP @plugin@',
697
-	'plugin_necessite_lib' => 'Ce plugin nécessite la librairie @lib@',
698
-	'plugin_necessite_php' => 'Nécessite @plugin@ en version @version@.',
699
-	'plugin_necessite_plugin' => 'Nécessite le plugin @plugin@ en version @version@.',
700
-	'plugin_necessite_plugin_sans_version' => 'Nécessite le plugin @plugin@',
701
-	'plugin_necessite_spip' => 'Nécessite SPIP en version @version@ minimum.',
702
-	'plugin_source' => 'source : ',
703
-	'plugin_titre_automatique' => 'Installation automatique',
704
-	'plugin_titre_automatique_ajouter' => 'Ajouter des plugins',
705
-	'plugin_titre_installation' => 'Installation du plugin @plugin@',
706
-	'plugin_titre_modifier' => 'Mes plugins',
707
-	'plugin_utilise_extension_php' => 'L’extension PHP @plugin@ doit être en version @version@.',
708
-	'plugin_utilise_php' => '@plugin@ doit être en version @version@.',
709
-	'plugin_utilise_plugin' => 'Le plugin @plugin@ doit être en version @version@.',
710
-	'plugin_zip_active' => 'Continuez pour l’activer',
711
-	'plugin_zip_adresse' => 'indiquez ci-dessous l’adresse d’un fichier zip de plugin à télécharger, ou encore l’adresse d’une liste de plugins.',
712
-	'plugin_zip_adresse_champ' => 'Adresse du plugin ou de la liste ',
713
-	'plugin_zip_content' => 'Il contient les fichiers suivants (@taille@),<br />prêts à installer dans le répertoire <code>@rep@</code>',
714
-	'plugin_zip_installe_finie' => 'Le fichier @zip@ a été décompacté et installé.',
715
-	'plugin_zip_installe_rep_finie' => 'Le fichier @zip@ a été décompacté et installé dans le répertoire @rep@',
716
-	'plugin_zip_installer' => 'Vous pouvez maintenant l’installer.',
717
-	'plugin_zip_telecharge' => 'Le fichier @zip@ a été téléchargé',
718
-	'plugins_actif_aucun' => 'Aucun plugin activé.',
719
-	'plugins_actif_un' => 'Un plugin activé.',
720
-	'plugins_actifs' => '@count@ plugins activés.',
721
-	'plugins_actifs_liste' => 'Actifs',
722
-	'plugins_compte' => '@count@ plugins',
723
-	'plugins_disponible_un' => 'Un plugin disponible.',
724
-	'plugins_disponibles' => '@count@ plugins disponibles.',
725
-	'plugins_erreur' => 'Erreur dans les plugins : @plugins@',
726
-	'plugins_liste' => 'Liste des plugins',
727
-	'plugins_liste_dist' => 'Plugins verrouillés',
728
-	'plugins_recents' => 'Plugins récents.',
729
-	'plugins_tous_liste' => 'Tous',
730
-	'plugins_vue_hierarchie' => 'Hiérarchie',
731
-	'plugins_vue_liste' => 'Liste',
732
-	'protocole_ldap' => 'Version du protocole :',
657
+    // P
658
+    'page_pas_proxy' => 'Cette page ne doit pas passer par le proxy',
659
+    'pas_de_proxy_pour' => 'Au besoin, indiquez les machines ou domaines pour lesquels ce proxy ne doit pas s’appliquer (par exemple : @exemple@)',
660
+    'phpinfo' => 'Configuration PHP',
661
+    'plugin_charge_paquet' => 'Chargement du paquet @name@',
662
+    'plugin_charger' => 'Télécharger',
663
+    'plugin_erreur_charger' => 'erreur : impossible de charger @zip@',
664
+    'plugin_erreur_droit1' => 'Le répertoire <code>@dest@</code> n’est pas accessible en écriture.',
665
+    'plugin_erreur_droit2' => 'Veuillez vérifier les droits sur ce répertoire (et le créer le cas échéant), ou installer les fichiers par FTP.',
666
+    'plugin_erreur_zip' => 'échec pclzip : erreur @status@',
667
+    'plugin_etat_developpement' => 'en développement',
668
+    'plugin_etat_experimental' => 'expérimental',
669
+    'plugin_etat_stable' => 'stable',
670
+    'plugin_etat_test' => 'en test',
671
+    'plugin_impossible_activer' => 'Impossible d’activer le plugin @plugin@',
672
+    'plugin_info_automatique1' => 'Si vous souhaitez autoriser l’installation automatique des plugins, veuillez :',
673
+    'plugin_info_automatique1_lib' => 'Si vous souhaitez autoriser l’installation automatique de cette librairie, veuillez :',
674
+    'plugin_info_automatique2' => 'créer un répertoire <code>@rep@</code> ;',
675
+    'plugin_info_automatique3' => 'vérifier que le serveur est autorisé à écrire dans ce répertoire.',
676
+    'plugin_info_automatique_creer' => 'à créer à la racine du site.',
677
+    'plugin_info_automatique_exemples' => 'exemples :',
678
+    'plugin_info_automatique_ftp' => 'Vous pouvez installer des plugins, par FTP, dans le répertoire <tt>@rep@</tt>',
679
+    'plugin_info_automatique_lib' => 'Certains plugins demandent aussi à pouvoir télécharger des fichiers dans le répertoire <code>lib/</code>, à créer le cas échéant à la racine du site.',
680
+    'plugin_info_automatique_liste' => 'Vos listes de plugins :',
681
+    'plugin_info_automatique_liste_officielle' => 'les plugins officiels',
682
+    'plugin_info_automatique_liste_update' => 'Mettre à jour les listes',
683
+    'plugin_info_automatique_ou' => 'ou...',
684
+    'plugin_info_automatique_select' => 'Sélectionnez ci-dessous un plugin : SPIP le téléchargera et l’installera dans le répertoire <code>@rep@</code> ; si ce plugin existe déjà, il sera mis à jour.',
685
+    'plugin_info_credit' => 'Crédits',
686
+    'plugin_info_erreur_xml' => 'La déclaration de ce plugin est incorrecte',
687
+    'plugin_info_install_ok' => 'Installation réussie',
688
+    'plugin_info_necessite' => 'Nécessite :',
689
+    'plugin_info_non_compatible_spip' => 'Ce plugin n’est pas compatible avec cette version de SPIP',
690
+    'plugin_info_plugins_dist_1' => 'Les plugins ci-dessous sont chargés et activés dans le répertoire @plugins_dist@.',
691
+    'plugin_info_plugins_dist_2' => 'Ils ne sont pas désactivables.',
692
+    'plugin_info_telecharger' => 'à télécharger depuis @url@ et à installer dans @rep@',
693
+    'plugin_info_upgrade_ok' => 'Mise à jour réussie',
694
+    'plugin_librairies_installees' => 'Librairies installées',
695
+    'plugin_necessite_extension_php' => 'Nécessite l’extension PHP @plugin@ en version @version@.',
696
+    'plugin_necessite_extension_php_sans_version' => 'Nécessite l’extension PHP @plugin@',
697
+    'plugin_necessite_lib' => 'Ce plugin nécessite la librairie @lib@',
698
+    'plugin_necessite_php' => 'Nécessite @plugin@ en version @version@.',
699
+    'plugin_necessite_plugin' => 'Nécessite le plugin @plugin@ en version @version@.',
700
+    'plugin_necessite_plugin_sans_version' => 'Nécessite le plugin @plugin@',
701
+    'plugin_necessite_spip' => 'Nécessite SPIP en version @version@ minimum.',
702
+    'plugin_source' => 'source : ',
703
+    'plugin_titre_automatique' => 'Installation automatique',
704
+    'plugin_titre_automatique_ajouter' => 'Ajouter des plugins',
705
+    'plugin_titre_installation' => 'Installation du plugin @plugin@',
706
+    'plugin_titre_modifier' => 'Mes plugins',
707
+    'plugin_utilise_extension_php' => 'L’extension PHP @plugin@ doit être en version @version@.',
708
+    'plugin_utilise_php' => '@plugin@ doit être en version @version@.',
709
+    'plugin_utilise_plugin' => 'Le plugin @plugin@ doit être en version @version@.',
710
+    'plugin_zip_active' => 'Continuez pour l’activer',
711
+    'plugin_zip_adresse' => 'indiquez ci-dessous l’adresse d’un fichier zip de plugin à télécharger, ou encore l’adresse d’une liste de plugins.',
712
+    'plugin_zip_adresse_champ' => 'Adresse du plugin ou de la liste ',
713
+    'plugin_zip_content' => 'Il contient les fichiers suivants (@taille@),<br />prêts à installer dans le répertoire <code>@rep@</code>',
714
+    'plugin_zip_installe_finie' => 'Le fichier @zip@ a été décompacté et installé.',
715
+    'plugin_zip_installe_rep_finie' => 'Le fichier @zip@ a été décompacté et installé dans le répertoire @rep@',
716
+    'plugin_zip_installer' => 'Vous pouvez maintenant l’installer.',
717
+    'plugin_zip_telecharge' => 'Le fichier @zip@ a été téléchargé',
718
+    'plugins_actif_aucun' => 'Aucun plugin activé.',
719
+    'plugins_actif_un' => 'Un plugin activé.',
720
+    'plugins_actifs' => '@count@ plugins activés.',
721
+    'plugins_actifs_liste' => 'Actifs',
722
+    'plugins_compte' => '@count@ plugins',
723
+    'plugins_disponible_un' => 'Un plugin disponible.',
724
+    'plugins_disponibles' => '@count@ plugins disponibles.',
725
+    'plugins_erreur' => 'Erreur dans les plugins : @plugins@',
726
+    'plugins_liste' => 'Liste des plugins',
727
+    'plugins_liste_dist' => 'Plugins verrouillés',
728
+    'plugins_recents' => 'Plugins récents.',
729
+    'plugins_tous_liste' => 'Tous',
730
+    'plugins_vue_hierarchie' => 'Hiérarchie',
731
+    'plugins_vue_liste' => 'Liste',
732
+    'protocole_ldap' => 'Version du protocole :',
733 733
 
734
-	// Q
735
-	'queue_executer_maintenant' => 'Exécuter maintenant',
736
-	'queue_info_purger' => 'Vous pouvez supprimer toutes les tâches de fond en attente et réinitialiser la liste avec les tâches périodiques',
737
-	'queue_nb_jobs_in_queue' => '@nb@ tâches en attente',
738
-	'queue_next_job_in_nb_sec' => 'Prochaine tâche dans @nb@ s',
739
-	'queue_no_job_in_queue' => 'Aucune tâche en attente',
740
-	'queue_one_job_in_queue' => '1 tâche en attente',
741
-	'queue_priorite_tache' => 'priorité',
742
-	'queue_purger_queue' => 'Réinitialiser la liste des tâches',
743
-	'queue_titre' => 'Tâches de fond',
734
+    // Q
735
+    'queue_executer_maintenant' => 'Exécuter maintenant',
736
+    'queue_info_purger' => 'Vous pouvez supprimer toutes les tâches de fond en attente et réinitialiser la liste avec les tâches périodiques',
737
+    'queue_nb_jobs_in_queue' => '@nb@ tâches en attente',
738
+    'queue_next_job_in_nb_sec' => 'Prochaine tâche dans @nb@ s',
739
+    'queue_no_job_in_queue' => 'Aucune tâche en attente',
740
+    'queue_one_job_in_queue' => '1 tâche en attente',
741
+    'queue_priorite_tache' => 'priorité',
742
+    'queue_purger_queue' => 'Réinitialiser la liste des tâches',
743
+    'queue_titre' => 'Tâches de fond',
744 744
 
745
-	// R
746
-	'repertoire_plugins' => 'Répertoire :',
747
-	'required' => '(obligatoire)',
745
+    // R
746
+    'repertoire_plugins' => 'Répertoire :',
747
+    'required' => '(obligatoire)',
748 748
 
749
-	// S
750
-	'sans_heure' => 'sans heure',
751
-	'statut_admin_restreint' => 'admin restreint',
752
-	'statut_webmestre' => 'webmestre',
749
+    // S
750
+    'sans_heure' => 'sans heure',
751
+    'statut_admin_restreint' => 'admin restreint',
752
+    'statut_webmestre' => 'webmestre',
753 753
 
754
-	// T
755
-	'tache_cron_asap' => 'Tâche CRON @function@ (ASAP)',
756
-	'tache_cron_secondes' => 'Tâche CRON @function@ (toutes les @nb@ s)',
757
-	'taille_cache_image' => 'Les images calculées automatiquement par SPIP (vignettes des documents, titres présentés sous forme graphique, fonctions mathématiques au format TeX...) occupent dans le répertoire @dir@ un total de @taille@.',
758
-	'taille_cache_moins_de' => 'La taille du cache est de moins de @octets@.',
759
-	'taille_cache_octets' => 'La taille du cache est actuellement de @octets@ environ.',
760
-	'taille_cache_vide' => 'Le cache est vide.',
761
-	'taille_repertoire_cache' => 'Taille du répertoire cache',
762
-	'text_article_propose_publication' => 'Article proposé pour la publication.',
763
-	'texte_acces_ldap_anonyme_1' => 'Certains serveurs LDAP n’acceptent aucun accès anonyme. Dans ce cas il faut spécifier un identifiant d’accès initial afin de pouvoir ensuite rechercher des informations dans l’annuaire. Dans la plupart des cas néanmoins, les champs suivants pourront être laissés vides.',
764
-	'texte_admin_effacer_01' => 'Cette commande efface <i>tout</i> le contenu de la base de données,
754
+    // T
755
+    'tache_cron_asap' => 'Tâche CRON @function@ (ASAP)',
756
+    'tache_cron_secondes' => 'Tâche CRON @function@ (toutes les @nb@ s)',
757
+    'taille_cache_image' => 'Les images calculées automatiquement par SPIP (vignettes des documents, titres présentés sous forme graphique, fonctions mathématiques au format TeX...) occupent dans le répertoire @dir@ un total de @taille@.',
758
+    'taille_cache_moins_de' => 'La taille du cache est de moins de @octets@.',
759
+    'taille_cache_octets' => 'La taille du cache est actuellement de @octets@ environ.',
760
+    'taille_cache_vide' => 'Le cache est vide.',
761
+    'taille_repertoire_cache' => 'Taille du répertoire cache',
762
+    'text_article_propose_publication' => 'Article proposé pour la publication.',
763
+    'texte_acces_ldap_anonyme_1' => 'Certains serveurs LDAP n’acceptent aucun accès anonyme. Dans ce cas il faut spécifier un identifiant d’accès initial afin de pouvoir ensuite rechercher des informations dans l’annuaire. Dans la plupart des cas néanmoins, les champs suivants pourront être laissés vides.',
764
+    'texte_admin_effacer_01' => 'Cette commande efface <i>tout</i> le contenu de la base de données,
765 765
 y compris <i>tous</i> les accès rédacteurs et administrateurs. Après l’avoir exécutée, vous devrez lancer la
766 766
 réinstallation de SPIP pour recréer une nouvelle base ainsi qu’un premier accès administrateur.',
767
-	'texte_adresse_annuaire_1' => '(Si votre annuaire est installé sur la même machine que ce site Web, il s’agit probablement de « localhost ».)',
768
-	'texte_ajout_auteur' => 'L’auteur suivant a été ajouté à l’article :',
769
-	'texte_annuaire_ldap_1' => 'Si vous avez accès à un annuaire (LDAP), vous pouvez l’utiliser pour importer automatiquement des utilisateurs sous SPIP.',
770
-	'texte_article_statut' => 'Cet article est :',
771
-	'texte_article_virtuel' => 'Article virtuel',
772
-	'texte_article_virtuel_reference' => '<b>Article virtuel :</b> article référencé dans votre site SPIP, mais redirigé vers une autre URL. Pour supprimer la redirection, effacez l’URL ci-dessus.',
773
-	'texte_aucun_resultat_auteur' => 'Aucun résultat pour "@cherche_auteur@"',
774
-	'texte_auteur_messagerie' => 'Ce site peut vous indiquer en permanence la liste des rédacteurs connectés, ce qui vous permet d’échanger des messages en direct. Vous pouvez décider de ne pas apparaître dans cette liste (vous êtes « invisible » pour les autres utilisateurs).',
775
-	'texte_auteurs' => 'LES AUTEURS',
776
-	'texte_choix_base_1' => 'Choisissez votre base :',
777
-	'texte_choix_base_2' => 'Le serveur SQL contient plusieurs bases de données.',
778
-	'texte_choix_base_3' => '<b>Sélectionnez</b> ci-après celle qui vous a été attribuée par votre hébergeur :',
779
-	'texte_choix_table_prefix' => 'Préfixe des tables :',
780
-	'texte_compte_element' => '@count@ élément',
781
-	'texte_compte_elements' => '@count@ éléments',
782
-	'texte_conflit_edition_correction' => 'Veuillez contrôler ci-dessous les différences entre les deux versions du texte ; vous pouvez aussi copier vos modifications, puis recommencer.',
783
-	'texte_connexion_mysql' => 'Consultez les informations fournies par votre hébergeur : vous devez y trouver le serveur de base de données qu’il propose et vos identifiants personnels pour vous y connecter.',
784
-	'texte_contenu_article' => '(Contenu de l’article en quelques mots.)',
785
-	'texte_contenu_articles' => 'Selon la maquette adoptée pour votre site, vous pouvez décider
767
+    'texte_adresse_annuaire_1' => '(Si votre annuaire est installé sur la même machine que ce site Web, il s’agit probablement de « localhost ».)',
768
+    'texte_ajout_auteur' => 'L’auteur suivant a été ajouté à l’article :',
769
+    'texte_annuaire_ldap_1' => 'Si vous avez accès à un annuaire (LDAP), vous pouvez l’utiliser pour importer automatiquement des utilisateurs sous SPIP.',
770
+    'texte_article_statut' => 'Cet article est :',
771
+    'texte_article_virtuel' => 'Article virtuel',
772
+    'texte_article_virtuel_reference' => '<b>Article virtuel :</b> article référencé dans votre site SPIP, mais redirigé vers une autre URL. Pour supprimer la redirection, effacez l’URL ci-dessus.',
773
+    'texte_aucun_resultat_auteur' => 'Aucun résultat pour "@cherche_auteur@"',
774
+    'texte_auteur_messagerie' => 'Ce site peut vous indiquer en permanence la liste des rédacteurs connectés, ce qui vous permet d’échanger des messages en direct. Vous pouvez décider de ne pas apparaître dans cette liste (vous êtes « invisible » pour les autres utilisateurs).',
775
+    'texte_auteurs' => 'LES AUTEURS',
776
+    'texte_choix_base_1' => 'Choisissez votre base :',
777
+    'texte_choix_base_2' => 'Le serveur SQL contient plusieurs bases de données.',
778
+    'texte_choix_base_3' => '<b>Sélectionnez</b> ci-après celle qui vous a été attribuée par votre hébergeur :',
779
+    'texte_choix_table_prefix' => 'Préfixe des tables :',
780
+    'texte_compte_element' => '@count@ élément',
781
+    'texte_compte_elements' => '@count@ éléments',
782
+    'texte_conflit_edition_correction' => 'Veuillez contrôler ci-dessous les différences entre les deux versions du texte ; vous pouvez aussi copier vos modifications, puis recommencer.',
783
+    'texte_connexion_mysql' => 'Consultez les informations fournies par votre hébergeur : vous devez y trouver le serveur de base de données qu’il propose et vos identifiants personnels pour vous y connecter.',
784
+    'texte_contenu_article' => '(Contenu de l’article en quelques mots.)',
785
+    'texte_contenu_articles' => 'Selon la maquette adoptée pour votre site, vous pouvez décider
786 786
 		que certains éléments des articles ne sont pas utilisés.
787 787
 		Utilisez la liste ci-dessous pour indiquer quels éléments sont disponibles.',
788
-	'texte_crash_base' => 'Si votre base de données a
788
+    'texte_crash_base' => 'Si votre base de données a
789 789
 			crashé, vous pouvez tenter une réparation
790 790
 			automatique.',
791
-	'texte_creer_rubrique' => 'Avant de pouvoir écrire des articles,<br /> vous devez créer une rubrique.',
792
-	'texte_date_creation_article' => 'DATE DE CRÉATION DE L’ARTICLE :', # on ajoute le ":"
793
-	'texte_date_creation_objet' => 'Date de création :', # on ajoute le ":"
794
-	'texte_date_publication_anterieure' => 'Date de rédaction antérieure :',
795
-	'texte_date_publication_anterieure_nonaffichee' => 'Ne pas afficher de date de rédaction antérieure.',
796
-	'texte_date_publication_article' => 'DATE DE PUBLICATION EN LIGNE :',
797
-	'texte_date_publication_objet' => 'Date de publication en ligne :',
798
-	'texte_definir_comme_traduction_rubrique' => 'Cette rubrique est une traduction de la rubrique numéro :',
799
-	'texte_descriptif_rapide' => 'Descriptif rapide',
800
-	'texte_effacer_base' => 'Effacer la base de données SPIP',
801
-	'texte_effacer_statistiques' => 'Effacer les statistiques',
802
-	'texte_en_cours_validation' => 'Les contenus ci-dessous sont en attente de validation.',
803
-	'texte_enrichir_mise_a_jour' => 'Vous pouvez enrichir la mise en page de votre texte en utilisant des « raccourcis typographiques ».',
804
-	'texte_fichier_authent' => '<b>SPIP doit-il créer les fichiers spéciaux
791
+    'texte_creer_rubrique' => 'Avant de pouvoir écrire des articles,<br /> vous devez créer une rubrique.',
792
+    'texte_date_creation_article' => 'DATE DE CRÉATION DE L’ARTICLE :', # on ajoute le ":"
793
+    'texte_date_creation_objet' => 'Date de création :', # on ajoute le ":"
794
+    'texte_date_publication_anterieure' => 'Date de rédaction antérieure :',
795
+    'texte_date_publication_anterieure_nonaffichee' => 'Ne pas afficher de date de rédaction antérieure.',
796
+    'texte_date_publication_article' => 'DATE DE PUBLICATION EN LIGNE :',
797
+    'texte_date_publication_objet' => 'Date de publication en ligne :',
798
+    'texte_definir_comme_traduction_rubrique' => 'Cette rubrique est une traduction de la rubrique numéro :',
799
+    'texte_descriptif_rapide' => 'Descriptif rapide',
800
+    'texte_effacer_base' => 'Effacer la base de données SPIP',
801
+    'texte_effacer_statistiques' => 'Effacer les statistiques',
802
+    'texte_en_cours_validation' => 'Les contenus ci-dessous sont en attente de validation.',
803
+    'texte_enrichir_mise_a_jour' => 'Vous pouvez enrichir la mise en page de votre texte en utilisant des « raccourcis typographiques ».',
804
+    'texte_fichier_authent' => '<b>SPIP doit-il créer les fichiers spéciaux
805 805
 <tt>.htpasswd</tt> et <tt>.htpasswd-admin</tt> dans le répertoire @dossier@ ?</b>
806 806
 <p>Ces fichiers peuvent vous servir à restreindre l’accès aux auteurs et administrateurs en d’autres endroits de votre site (programme externe de statistiques, par exemple).</p>
807 807
 <p>Si vous n’en avez pas l’utilité, vous pouvez laisser cette option à sa valeur par défaut (pas de création des fichiers).</p>',
808
-	'texte_informations_personnelles_1' => 'Le système va maintenant vous créer un accès personnalisé au site.',
809
-	'texte_informations_personnelles_2' => '(Note : il s’agit d’une réinstallation, si votre accès marche toujours vous pouvez',
810
-	'texte_introductif_article' => '(Texte introductif de l’article.)',
811
-	'texte_jeu_caractere' => 'Il est conseillé d’employer, sur votre site, l’alphabet universel (<tt>utf-8</tt>) : celui-ci permet l’affichage de textes dans toutes les langues, et ne pose plus de problèmes de compatibilité avec les navigateurs modernes.',
812
-	'texte_jeu_caractere_3' => 'Votre site est actuellement installé dans le jeu de caractères :',
813
-	'texte_jeu_caractere_4' => 'Si cela ne correspond pas à la réalité de vos données (suite, par exemple, à une restauration de base de données), ou si <em>vous démarrez ce site</em> et souhaitez partir sur un autre jeu de caractères, veuillez indiquer ce dernier ici :',
814
-	'texte_login_ldap_1' => '(Laisser vide pour un accès anonyme, ou entrer le chemin complet, par exemple « <tt>uid=dupont, ou=users, dc=mon-domaine, dc=com</tt> ».)',
815
-	'texte_login_precaution' => 'Attention ! Ceci est le login sous lequel vous êtes connecté actuellement.
808
+    'texte_informations_personnelles_1' => 'Le système va maintenant vous créer un accès personnalisé au site.',
809
+    'texte_informations_personnelles_2' => '(Note : il s’agit d’une réinstallation, si votre accès marche toujours vous pouvez',
810
+    'texte_introductif_article' => '(Texte introductif de l’article.)',
811
+    'texte_jeu_caractere' => 'Il est conseillé d’employer, sur votre site, l’alphabet universel (<tt>utf-8</tt>) : celui-ci permet l’affichage de textes dans toutes les langues, et ne pose plus de problèmes de compatibilité avec les navigateurs modernes.',
812
+    'texte_jeu_caractere_3' => 'Votre site est actuellement installé dans le jeu de caractères :',
813
+    'texte_jeu_caractere_4' => 'Si cela ne correspond pas à la réalité de vos données (suite, par exemple, à une restauration de base de données), ou si <em>vous démarrez ce site</em> et souhaitez partir sur un autre jeu de caractères, veuillez indiquer ce dernier ici :',
814
+    'texte_login_ldap_1' => '(Laisser vide pour un accès anonyme, ou entrer le chemin complet, par exemple « <tt>uid=dupont, ou=users, dc=mon-domaine, dc=com</tt> ».)',
815
+    'texte_login_precaution' => 'Attention ! Ceci est le login sous lequel vous êtes connecté actuellement.
816 816
 	Utilisez ce formulaire avec précaution...',
817
-	'texte_messagerie_agenda' => 'Une messagerie permet aux rédacteurs du site de communiquer entre eux directement dans l’espace privé du site. Elle est associée à un agenda.',
818
-	'texte_mise_a_niveau_base_1' => 'Vous venez de mettre à jour les fichiers SPIP.
817
+    'texte_messagerie_agenda' => 'Une messagerie permet aux rédacteurs du site de communiquer entre eux directement dans l’espace privé du site. Elle est associée à un agenda.',
818
+    'texte_mise_a_niveau_base_1' => 'Vous venez de mettre à jour les fichiers SPIP.
819 819
 	Il faut maintenant mettre à niveau la base de données
820 820
 	du site.',
821
-	'texte_modifier_article' => 'Modifier l’article :',
822
-	'texte_multilinguisme' => 'Si vous souhaitez gérer des objets en plusieurs langues, avec une navigation complexe, vous pouvez ajouter un menu de sélection de langue sur ces objets, en fonction de l’organisation de votre site.',
823
-	'texte_multilinguisme_trad' => 'Vous pouvez également activer un système de gestion de liens entre les différentes traductions sur certains objets.',
824
-	'texte_non_compresse' => '<i>non compressé</i> (votre serveur ne supportant pas cette fonctionnalité)',
825
-	'texte_nouvelle_version_spip_1' => 'Vous avez installé une nouvelle version de SPIP.',
826
-	'texte_nouvelle_version_spip_2' => 'Cette nouvelle version nécessite une mise à jour plus complète qu’à l’accoutumée. Si vous êtes webmestre du site, veuillez effacer le fichier @connect@ et reprendre l’installation afin de mettre à jour vos paramètres de connexion à la base de données.<p> (NB. : si vous avez oublié vos paramètres de connexion, jetez un œil au fichier @connect@ avant de le supprimer...)</p>',
827
-	'texte_operation_echec' => 'Retournez à la page précédente, sélectionnez une autre base ou créez-en une nouvelle. Vérifiez les informations fournies par votre hébergeur.',
828
-	'texte_plus_trois_car' => 'plus de 3 caractères',
829
-	'texte_plusieurs_articles' => 'Plusieurs auteurs trouvés pour "@cherche_auteur@" :',
830
-	'texte_port_annuaire' => '(La valeur indiquée par défaut convient généralement.)',
831
-	'texte_presente_plugin' => 'Cette page liste les plugins disponibles sur le site. Vous pouvez activer les plugins nécessaires en cochant la case correspondante.',
832
-	'texte_proposer_publication' => 'Lorsque votre article est terminé,<br /> vous pouvez proposer sa publication.',
833
-	'texte_proxy' => 'Dans certains cas (intranet, réseaux protégés), les sites distants (documentation de SPIP, sites syndiqués, etc.) ne sont accessibles qu’à travers un <i>proxy HTTP</i>. Le cas échéant, indiquez ci-dessous son adresse, sous la forme @proxy_en_cours@. En général, vous laisserez cette case vide.',
834
-	'texte_publication_articles_post_dates' => 'Quel comportement SPIP doit-il adopter face aux articles dont la
821
+    'texte_modifier_article' => 'Modifier l’article :',
822
+    'texte_multilinguisme' => 'Si vous souhaitez gérer des objets en plusieurs langues, avec une navigation complexe, vous pouvez ajouter un menu de sélection de langue sur ces objets, en fonction de l’organisation de votre site.',
823
+    'texte_multilinguisme_trad' => 'Vous pouvez également activer un système de gestion de liens entre les différentes traductions sur certains objets.',
824
+    'texte_non_compresse' => '<i>non compressé</i> (votre serveur ne supportant pas cette fonctionnalité)',
825
+    'texte_nouvelle_version_spip_1' => 'Vous avez installé une nouvelle version de SPIP.',
826
+    'texte_nouvelle_version_spip_2' => 'Cette nouvelle version nécessite une mise à jour plus complète qu’à l’accoutumée. Si vous êtes webmestre du site, veuillez effacer le fichier @connect@ et reprendre l’installation afin de mettre à jour vos paramètres de connexion à la base de données.<p> (NB. : si vous avez oublié vos paramètres de connexion, jetez un œil au fichier @connect@ avant de le supprimer...)</p>',
827
+    'texte_operation_echec' => 'Retournez à la page précédente, sélectionnez une autre base ou créez-en une nouvelle. Vérifiez les informations fournies par votre hébergeur.',
828
+    'texte_plus_trois_car' => 'plus de 3 caractères',
829
+    'texte_plusieurs_articles' => 'Plusieurs auteurs trouvés pour "@cherche_auteur@" :',
830
+    'texte_port_annuaire' => '(La valeur indiquée par défaut convient généralement.)',
831
+    'texte_presente_plugin' => 'Cette page liste les plugins disponibles sur le site. Vous pouvez activer les plugins nécessaires en cochant la case correspondante.',
832
+    'texte_proposer_publication' => 'Lorsque votre article est terminé,<br /> vous pouvez proposer sa publication.',
833
+    'texte_proxy' => 'Dans certains cas (intranet, réseaux protégés), les sites distants (documentation de SPIP, sites syndiqués, etc.) ne sont accessibles qu’à travers un <i>proxy HTTP</i>. Le cas échéant, indiquez ci-dessous son adresse, sous la forme @proxy_en_cours@. En général, vous laisserez cette case vide.',
834
+    'texte_publication_articles_post_dates' => 'Quel comportement SPIP doit-il adopter face aux articles dont la
835 835
 		date de publication a été fixée à une
836 836
 		échéance future ?',
837
-	'texte_rappel_selection_champs' => '[N’oubliez pas de sélectionner correctement ce champ.]',
838
-	'texte_recalcul_page' => 'Si vous voulez
837
+    'texte_rappel_selection_champs' => '[N’oubliez pas de sélectionner correctement ce champ.]',
838
+    'texte_recalcul_page' => 'Si vous voulez
839 839
 recalculer une seule page, passez plutôt par l’espace public et utilisez-y le bouton « recalculer ».',
840
-	'texte_recuperer_base' => 'Réparer la base de données',
841
-	'texte_reference_mais_redirige' => 'article référencé dans votre site SPIP, mais redirigé vers une autre URL.',
842
-	'texte_requetes_echouent' => '<b>Lorsque certaines requêtes SQL échouent
840
+    'texte_recuperer_base' => 'Réparer la base de données',
841
+    'texte_reference_mais_redirige' => 'article référencé dans votre site SPIP, mais redirigé vers une autre URL.',
842
+    'texte_requetes_echouent' => '<b>Lorsque certaines requêtes SQL échouent
843 843
   systématiquement et sans raison apparente, il est possible
844 844
   que ce soit à cause de la base de données
845 845
   elle-même.</b><p>
@@ -850,90 +850,90 @@  discard block
 block discarded – undo
850 850
   peut-être des indices de ce qui ne va pas...</p><p>
851 851
   Si le problème persiste, prenez contact avec votre
852 852
   hébergeur.</p>',
853
-	'texte_selection_langue_principale' => 'Vous pouvez sélectionner ci-dessous la « langue principale » du site. Ce choix ne vous oblige - heureusement ! - pas à écrire vos articles dans la langue sélectionnée, mais permet de déterminer :
853
+    'texte_selection_langue_principale' => 'Vous pouvez sélectionner ci-dessous la « langue principale » du site. Ce choix ne vous oblige - heureusement ! - pas à écrire vos articles dans la langue sélectionnée, mais permet de déterminer :
854 854
 	<ul><li> le format par défaut des dates sur le site public ;</li>
855 855
 	<li> la nature du moteur typographique que SPIP doit utiliser pour le rendu des textes ;</li>
856 856
 	<li> la langue utilisée dans les formulaires du site public ;</li>
857 857
 	<li> la langue présentée par défaut dans l’espace privé.</li></ul>',
858
-	'texte_sous_titre' => 'Sous-titre',
859
-	'texte_statistiques_visites' => '(barres foncées :  dimanche / courbe foncée : évolution de la moyenne)',
860
-	'texte_statut_attente_validation' => 'en attente de validation',
861
-	'texte_statut_publies' => 'publiés en ligne',
862
-	'texte_statut_refuses' => 'refusés',
863
-	'texte_suppression_fichiers' => 'Utilisez cette commande afin de supprimer tous les fichiers présents
858
+    'texte_sous_titre' => 'Sous-titre',
859
+    'texte_statistiques_visites' => '(barres foncées :  dimanche / courbe foncée : évolution de la moyenne)',
860
+    'texte_statut_attente_validation' => 'en attente de validation',
861
+    'texte_statut_publies' => 'publiés en ligne',
862
+    'texte_statut_refuses' => 'refusés',
863
+    'texte_suppression_fichiers' => 'Utilisez cette commande afin de supprimer tous les fichiers présents
864 864
 dans le cache SPIP. Cela permet par exemple de forcer un recalcul de toutes les pages si vous
865 865
 avez fait des modifications importantes de graphisme ou de structure du site.',
866
-	'texte_sur_titre' => 'Sur-titre',
867
-	'texte_table_ok' => ' : cette table est OK.',
868
-	'texte_tentative_recuperation' => 'Tentative de réparation',
869
-	'texte_tenter_reparation' => 'Tenter une réparation de la base de données',
870
-	'texte_test_proxy' => 'Pour faire un essai de ce proxy, indiquez ici l’adresse d’un site Web
866
+    'texte_sur_titre' => 'Sur-titre',
867
+    'texte_table_ok' => ' : cette table est OK.',
868
+    'texte_tentative_recuperation' => 'Tentative de réparation',
869
+    'texte_tenter_reparation' => 'Tenter une réparation de la base de données',
870
+    'texte_test_proxy' => 'Pour faire un essai de ce proxy, indiquez ici l’adresse d’un site Web
871 871
 				que vous souhaitez tester.',
872
-	'texte_titre_02' => 'Titre :',
873
-	'texte_titre_obligatoire' => '<b>Titre</b> [Obligatoire]',
874
-	'texte_travail_article' => '@nom_auteur_modif@ a travaillé sur cet article il y a @date_diff@ minutes',
875
-	'texte_travail_collaboratif' => 'S’il est fréquent que plusieurs rédacteurs
872
+    'texte_titre_02' => 'Titre :',
873
+    'texte_titre_obligatoire' => '<b>Titre</b> [Obligatoire]',
874
+    'texte_travail_article' => '@nom_auteur_modif@ a travaillé sur cet article il y a @date_diff@ minutes',
875
+    'texte_travail_collaboratif' => 'S’il est fréquent que plusieurs rédacteurs
876 876
 		travaillent sur le même article, le système
877 877
 		peut afficher les articles récemment « ouverts »
878 878
 		afin d’éviter les modifications simultanées.
879 879
 		Cette option est désactivée par défaut
880 880
 		afin d’éviter d’afficher des messages d’avertissement
881 881
 		intempestifs.',
882
-	'texte_vide' => 'vide',
883
-	'texte_vider_cache' => 'Vider le cache',
884
-	'titre_admin_tech' => 'Maintenance technique',
885
-	'titre_admin_vider' => 'Maintenance technique',
886
-	'titre_ajouter_un_auteur' => 'Ajouter un auteur',
887
-	'titre_ajouter_un_mot' => 'Ajouter un mot-clé',
888
-	'titre_cadre_afficher_article' => 'Afficher les articles',
889
-	'titre_cadre_afficher_traductions' => 'Afficher l’état des traductions pour les langues suivantes :',
890
-	'titre_cadre_ajouter_auteur' => 'AJOUTER UN AUTEUR :',
891
-	'titre_cadre_interieur_rubrique' => 'À l’intérieur de la rubrique',
892
-	'titre_cadre_numero_auteur' => 'AUTEUR NUMÉRO',
893
-	'titre_cadre_numero_objet' => '@objet@ NUMÉRO :',
894
-	'titre_cadre_signature_obligatoire' => '<b>Signature</b> [Obligatoire]<br />',
895
-	'titre_config_contenu_notifications' => 'Notifications',
896
-	'titre_config_contenu_prive' => 'Dans l’espace privé',
897
-	'titre_config_contenu_public' => 'Sur le site public',
898
-	'titre_config_fonctions' => 'Configuration du site',
899
-	'titre_config_langage' => 'Configurer la langue',
900
-	'titre_configuration' => 'Configuration du site',
901
-	'titre_configurer_preferences' => 'Configurer vos préférences',
902
-	'titre_configurer_preferences_menus' => 'Configurer vos préférences de menus',
903
-	'titre_conflit_edition' => 'Conflit lors de l’édition',
904
-	'titre_connexion_ldap' => 'Options : <b>Votre connexion LDAP</b>',
905
-	'titre_groupe_mots' => 'GROUPE DE MOTS :',
906
-	'titre_identite_site' => 'Identité du site',
907
-	'titre_langue_article' => 'Langue de l’article',
908
-	'titre_langue_rubrique' => 'Langue de la rubrique',
909
-	'titre_langue_trad_article' => 'LANGUE ET TRADUCTIONS DE L’ARTICLE',
910
-	'titre_les_articles' => 'LES ARTICLES',
911
-	'titre_messagerie_agenda' => 'Messagerie et agenda',
912
-	'titre_naviguer_dans_le_site' => 'Naviguer dans le site...',
913
-	'titre_nouvelle_rubrique' => 'Nouvelle rubrique',
914
-	'titre_numero_rubrique' => 'RUBRIQUE NUMÉRO :',
915
-	'titre_page_articles_edit' => 'Modifier : @titre@',
916
-	'titre_page_articles_page' => 'Les articles',
917
-	'titre_page_articles_tous' => 'Tout le site',
918
-	'titre_page_calendrier' => 'Calendrier @nom_mois@ @annee@',
919
-	'titre_page_config_contenu' => 'Configuration du site',
920
-	'titre_page_delete_all' => 'suppression totale et irréversible',
921
-	'titre_page_recherche' => 'Résultats de la recherche @recherche@',
922
-	'titre_page_statistiques_referers' => 'Statistiques (liens entrants)',
923
-	'titre_page_upgrade' => 'Mise à niveau de SPIP',
924
-	'titre_preference_menus_favoris' => 'Menus favoris',
925
-	'titre_publication_articles_post_dates' => 'Publication des articles post-datés',
926
-	'titre_reparation' => 'Réparation',
927
-	'titre_suivi_petition' => 'Suivi des pétitions',
928
-	'tls_ldap' => 'Transport Layer Security :',
929
-	'trad_article_traduction' => 'Toutes les versions de cet article :',
930
-	'trad_delier' => 'Ne plus lier à ces traductions',
931
-	'trad_lier' => 'Cet article est une traduction de l’article numéro :',
932
-	'trad_new' => 'Écrire une nouvelle traduction',
882
+    'texte_vide' => 'vide',
883
+    'texte_vider_cache' => 'Vider le cache',
884
+    'titre_admin_tech' => 'Maintenance technique',
885
+    'titre_admin_vider' => 'Maintenance technique',
886
+    'titre_ajouter_un_auteur' => 'Ajouter un auteur',
887
+    'titre_ajouter_un_mot' => 'Ajouter un mot-clé',
888
+    'titre_cadre_afficher_article' => 'Afficher les articles',
889
+    'titre_cadre_afficher_traductions' => 'Afficher l’état des traductions pour les langues suivantes :',
890
+    'titre_cadre_ajouter_auteur' => 'AJOUTER UN AUTEUR :',
891
+    'titre_cadre_interieur_rubrique' => 'À l’intérieur de la rubrique',
892
+    'titre_cadre_numero_auteur' => 'AUTEUR NUMÉRO',
893
+    'titre_cadre_numero_objet' => '@objet@ NUMÉRO :',
894
+    'titre_cadre_signature_obligatoire' => '<b>Signature</b> [Obligatoire]<br />',
895
+    'titre_config_contenu_notifications' => 'Notifications',
896
+    'titre_config_contenu_prive' => 'Dans l’espace privé',
897
+    'titre_config_contenu_public' => 'Sur le site public',
898
+    'titre_config_fonctions' => 'Configuration du site',
899
+    'titre_config_langage' => 'Configurer la langue',
900
+    'titre_configuration' => 'Configuration du site',
901
+    'titre_configurer_preferences' => 'Configurer vos préférences',
902
+    'titre_configurer_preferences_menus' => 'Configurer vos préférences de menus',
903
+    'titre_conflit_edition' => 'Conflit lors de l’édition',
904
+    'titre_connexion_ldap' => 'Options : <b>Votre connexion LDAP</b>',
905
+    'titre_groupe_mots' => 'GROUPE DE MOTS :',
906
+    'titre_identite_site' => 'Identité du site',
907
+    'titre_langue_article' => 'Langue de l’article',
908
+    'titre_langue_rubrique' => 'Langue de la rubrique',
909
+    'titre_langue_trad_article' => 'LANGUE ET TRADUCTIONS DE L’ARTICLE',
910
+    'titre_les_articles' => 'LES ARTICLES',
911
+    'titre_messagerie_agenda' => 'Messagerie et agenda',
912
+    'titre_naviguer_dans_le_site' => 'Naviguer dans le site...',
913
+    'titre_nouvelle_rubrique' => 'Nouvelle rubrique',
914
+    'titre_numero_rubrique' => 'RUBRIQUE NUMÉRO :',
915
+    'titre_page_articles_edit' => 'Modifier : @titre@',
916
+    'titre_page_articles_page' => 'Les articles',
917
+    'titre_page_articles_tous' => 'Tout le site',
918
+    'titre_page_calendrier' => 'Calendrier @nom_mois@ @annee@',
919
+    'titre_page_config_contenu' => 'Configuration du site',
920
+    'titre_page_delete_all' => 'suppression totale et irréversible',
921
+    'titre_page_recherche' => 'Résultats de la recherche @recherche@',
922
+    'titre_page_statistiques_referers' => 'Statistiques (liens entrants)',
923
+    'titre_page_upgrade' => 'Mise à niveau de SPIP',
924
+    'titre_preference_menus_favoris' => 'Menus favoris',
925
+    'titre_publication_articles_post_dates' => 'Publication des articles post-datés',
926
+    'titre_reparation' => 'Réparation',
927
+    'titre_suivi_petition' => 'Suivi des pétitions',
928
+    'tls_ldap' => 'Transport Layer Security :',
929
+    'trad_article_traduction' => 'Toutes les versions de cet article :',
930
+    'trad_delier' => 'Ne plus lier à ces traductions',
931
+    'trad_lier' => 'Cet article est une traduction de l’article numéro :',
932
+    'trad_new' => 'Écrire une nouvelle traduction',
933 933
 
934
-	// U
935
-	'utf8_convert_erreur_orig' => 'Erreur : le jeu de caractères @charset@ n’est pas supporté.',
934
+    // U
935
+    'utf8_convert_erreur_orig' => 'Erreur : le jeu de caractères @charset@ n’est pas supporté.',
936 936
 
937
-	// V
938
-	'version' => 'Version :'
937
+    // V
938
+    'version' => 'Version :'
939 939
 );
Please login to merge, or discard this patch.