Completed
Push — master ( 69f484...b12e59 )
by cam
04:14
created
ecrire/public/references.php 3 patches
Doc Comments   +17 added lines, -3 removed lines patch added patch discarded remove patch
@@ -322,7 +322,7 @@  discard block
 block discarded – undo
322 322
  *           est dans une autre table et construit la jointure dessus
323 323
  *         - liste (table, champ, fonction) idem, mais en passant un
324 324
  *           nom de fonction qui s'occupera de créer la jointure.
325
- * @return array
325
+ * @return string[]
326 326
  *     Liste (nom du champ alias, nom du champ). Le nom du champ alias
327 327
  *     est une expression pour le SELECT de la boucle du style "mots.titre AS titre_mot"
328 328
  **/
@@ -500,7 +500,7 @@  discard block
 block discarded – undo
500 500
  *     Nom de la balise
501 501
  * @param Champ $p
502 502
  *     AST au niveau de la balise
503
- * @return string
503
+ * @return Champ
504 504
  *     Code PHP pour d'exécution de la balise et de ses filtres
505 505
  **/
506 506
 function calculer_balise_DEFAUT_dist($nom, $p) {
@@ -784,6 +784,9 @@  discard block
 block discarded – undo
784 784
 //  - deux etoiles => pas de securite non plus !
785 785
 //
786 786
 // http://code.spip.net/@applique_filtres
787
+/**
788
+ * @param Champ $p
789
+ */
787 790
 function applique_filtres($p) {
788 791
 
789 792
 	// Traitements standards (cf. supra)
@@ -858,6 +861,9 @@  discard block
 block discarded – undo
858 861
 
859 862
 // Filtres et,ou,oui,non,sinon,xou,xor,and,or,not,yes
860 863
 // et comparateurs
864
+/**
865
+ * @param string $arg
866
+ */
861 867
 function filtre_logique($fonc, $code, $arg) {
862 868
 
863 869
 	switch (true) {
@@ -881,6 +887,9 @@  discard block
 block discarded – undo
881 887
 }
882 888
 
883 889
 // http://code.spip.net/@compose_filtres_args
890
+/**
891
+ * @param string $sep
892
+ */
884 893
 function compose_filtres_args($p, $args, $sep) {
885 894
 	$arglist = "";
886 895
 	foreach ($args as $arg) {
@@ -928,6 +937,11 @@  discard block
 block discarded – undo
928 937
 //
929 938
 
930 939
 // http://code.spip.net/@rindex_pile
940
+/**
941
+ * @param Champ $p
942
+ * @param string $champ
943
+ * @param string $motif
944
+ */
931 945
 function rindex_pile($p, $champ, $motif) {
932 946
 	$n = 0;
933 947
 	$b = $p->id_boucle;
@@ -957,7 +971,7 @@  discard block
 block discarded – undo
957 971
 
958 972
 /** 
959 973
  * Retourne le nom de la balise indiquée pour les messages d’erreurs
960
- * @param Pile $p Description de la balise
974
+ * @param Champ $p Description de la balise
961 975
  * @param string $champ Nom du champ
962 976
  * @return string Nom de la balise, avec indication de boucle explicite si présent.
963 977
  */
Please login to merge, or discard this patch.
Indentation   +490 added lines, -490 removed lines patch added patch discarded remove patch
@@ -16,7 +16,7 @@  discard block
 block discarded – undo
16 16
  * @package SPIP\Core\Compilateur\References
17 17
  **/
18 18
 if (!defined('_ECRIRE_INC_VERSION')) {
19
-	return;
19
+    return;
20 20
 }
21 21
 
22 22
 /**
@@ -41,14 +41,14 @@  discard block
 block discarded – undo
41 41
  *     - '' si une référence explicite incorrecte est envoyée
42 42
  */
43 43
 function index_boucle($p) {
44
-	if (strlen($p->nom_boucle)) {
45
-		// retourne l’index explicite demandé s’il existe
46
-		if (!empty($p->boucles[$p->nom_boucle])) {
47
-			return $p->nom_boucle;
48
-		}
49
-		return '';
50
-	} 
51
-	return $p->id_boucle;
44
+    if (strlen($p->nom_boucle)) {
45
+        // retourne l’index explicite demandé s’il existe
46
+        if (!empty($p->boucles[$p->nom_boucle])) {
47
+            return $p->nom_boucle;
48
+        }
49
+        return '';
50
+    } 
51
+    return $p->id_boucle;
52 52
 }
53 53
 
54 54
 
@@ -71,17 +71,17 @@  discard block
 block discarded – undo
71 71
  *     - '' si une référence explicite incorrecte est envoyée
72 72
  */
73 73
 function index_boucle_mere($p) {
74
-	if (strlen($p->nom_boucle)) {
75
-		// retourne l’index explicite demandé s’il existe
76
-		if (!empty($p->boucles[$p->nom_boucle])) {
77
-			return $p->nom_boucle;
78
-		}
79
-		return '';
80
-	} 
81
-	if (!empty($p->descr['id_mere'])) {
82
-		return $p->descr['id_mere'];
83
-	}
84
-	return '';
74
+    if (strlen($p->nom_boucle)) {
75
+        // retourne l’index explicite demandé s’il existe
76
+        if (!empty($p->boucles[$p->nom_boucle])) {
77
+            return $p->nom_boucle;
78
+        }
79
+        return '';
80
+    } 
81
+    if (!empty($p->descr['id_mere'])) {
82
+        return $p->descr['id_mere'];
83
+    }
84
+    return '';
85 85
 }
86 86
 
87 87
 /**
@@ -115,69 +115,69 @@  discard block
 block discarded – undo
115 115
  *     Code PHP pour obtenir le champ SQL
116 116
  */
117 117
 function index_pile(
118
-	$idb,
119
-	$nom_champ,
120
-	&$boucles,
121
-	$explicite = '',
122
-	$defaut = null,
123
-	$remonte_pile = true,
124
-	$select = true
118
+    $idb,
119
+    $nom_champ,
120
+    &$boucles,
121
+    $explicite = '',
122
+    $defaut = null,
123
+    $remonte_pile = true,
124
+    $select = true
125 125
 ) {
126
-	if (!is_string($defaut)) {
127
-		$defaut = '@$Pile[0][\'' . strtolower($nom_champ) . '\']';
128
-	}
129
-
130
-	$i = 0;
131
-	if (strlen($explicite)) {
132
-		// Recherche d'un champ dans un etage superieur
133
-		while (($idb !== $explicite) && ($idb !== '')) {
134
-			#	spip_log("Cherchexpl: $nom_champ '$explicite' '$idb' '$i'");
135
-			$i++;
136
-			$idb = $boucles[$idb]->id_parent;
137
-		}
138
-	}
139
-
140
-	#	spip_log("Cherche: $nom_champ a partir de '$idb'");
141
-	$nom_champ = strtolower($nom_champ);
142
-	$conditionnel = array();
143
-	// attention: entre la boucle nommee 0, "" et le tableau vide,
144
-	// il y a incoherences qu'il vaut mieux eviter
145
-	while (isset($boucles[$idb])) {
146
-		$joker = true;
147
-		// modifie $joker si tous les champs sont autorisés.
148
-		// $t = le select pour le champ, si on l'a trouvé (ou si joker)
149
-		// $c = le nom du champ demandé
150
-		list($t, $c) = index_tables_en_pile($idb, $nom_champ, $boucles, $joker);
151
-		if ($t) {
152
-			if ($select and !in_array($t, $boucles[$idb]->select)) {
153
-				$boucles[$idb]->select[] = $t;
154
-			}
155
-			$champ = '$Pile[$SP' . ($i ? "-$i" : "") . '][\'' . $c . '\']';
156
-			if (!$joker) {
157
-				return index_compose($conditionnel, $champ);
158
-			}
159
-
160
-			// tant que l'on trouve des tables avec joker, on continue
161
-			// avec la boucle parente et on conditionne à l'exécution
162
-			// la présence du champ. Si le champ existe à l'exécution
163
-			// dans une boucle, il est pris, sinon on le cherche dans le parent...
164
-			$conditionnel[] = "isset($champ)?$champ";
165
-		}
166
-
167
-		if ($remonte_pile) {
168
-			#	spip_log("On remonte vers $i");
169
-			// Sinon on remonte d'un cran
170
-			$idb = $boucles[$idb]->id_parent;
171
-			$i++;
172
-		} else {
173
-			$idb = null;
174
-		}
175
-	}
176
-
177
-	#	spip_log("Pas vu $nom_champ");
178
-	// esperons qu'il y sera
179
-	// ou qu'on a fourni une valeur par "defaut" plus pertinent
180
-	return index_compose($conditionnel, $defaut);
126
+    if (!is_string($defaut)) {
127
+        $defaut = '@$Pile[0][\'' . strtolower($nom_champ) . '\']';
128
+    }
129
+
130
+    $i = 0;
131
+    if (strlen($explicite)) {
132
+        // Recherche d'un champ dans un etage superieur
133
+        while (($idb !== $explicite) && ($idb !== '')) {
134
+            #	spip_log("Cherchexpl: $nom_champ '$explicite' '$idb' '$i'");
135
+            $i++;
136
+            $idb = $boucles[$idb]->id_parent;
137
+        }
138
+    }
139
+
140
+    #	spip_log("Cherche: $nom_champ a partir de '$idb'");
141
+    $nom_champ = strtolower($nom_champ);
142
+    $conditionnel = array();
143
+    // attention: entre la boucle nommee 0, "" et le tableau vide,
144
+    // il y a incoherences qu'il vaut mieux eviter
145
+    while (isset($boucles[$idb])) {
146
+        $joker = true;
147
+        // modifie $joker si tous les champs sont autorisés.
148
+        // $t = le select pour le champ, si on l'a trouvé (ou si joker)
149
+        // $c = le nom du champ demandé
150
+        list($t, $c) = index_tables_en_pile($idb, $nom_champ, $boucles, $joker);
151
+        if ($t) {
152
+            if ($select and !in_array($t, $boucles[$idb]->select)) {
153
+                $boucles[$idb]->select[] = $t;
154
+            }
155
+            $champ = '$Pile[$SP' . ($i ? "-$i" : "") . '][\'' . $c . '\']';
156
+            if (!$joker) {
157
+                return index_compose($conditionnel, $champ);
158
+            }
159
+
160
+            // tant que l'on trouve des tables avec joker, on continue
161
+            // avec la boucle parente et on conditionne à l'exécution
162
+            // la présence du champ. Si le champ existe à l'exécution
163
+            // dans une boucle, il est pris, sinon on le cherche dans le parent...
164
+            $conditionnel[] = "isset($champ)?$champ";
165
+        }
166
+
167
+        if ($remonte_pile) {
168
+            #	spip_log("On remonte vers $i");
169
+            // Sinon on remonte d'un cran
170
+            $idb = $boucles[$idb]->id_parent;
171
+            $i++;
172
+        } else {
173
+            $idb = null;
174
+        }
175
+    }
176
+
177
+    #	spip_log("Pas vu $nom_champ");
178
+    // esperons qu'il y sera
179
+    // ou qu'on a fourni une valeur par "defaut" plus pertinent
180
+    return index_compose($conditionnel, $defaut);
181 181
 }
182 182
 
183 183
 /**
@@ -191,12 +191,12 @@  discard block
 block discarded – undo
191 191
  * @return string              Code PHP complet de recherche d'un champ
192 192
  */
193 193
 function index_compose($conditionnel, $defaut) {
194
-	while ($c = array_pop($conditionnel)) {
195
-		// si on passe defaut = '', ne pas générer d'erreur de compilation.
196
-		$defaut = "($c:(" . ($defaut ? $defaut : "''") . "))";
197
-	}
194
+    while ($c = array_pop($conditionnel)) {
195
+        // si on passe defaut = '', ne pas générer d'erreur de compilation.
196
+        $defaut = "($c:(" . ($defaut ? $defaut : "''") . "))";
197
+    }
198 198
 
199
-	return $defaut;
199
+    return $defaut;
200 200
 }
201 201
 
202 202
 /**
@@ -232,74 +232,74 @@  discard block
 block discarded – undo
232 232
  **/
233 233
 function index_tables_en_pile($idb, $nom_champ, &$boucles, &$joker) {
234 234
 
235
-	$r = $boucles[$idb]->type_requete;
236
-	// boucle recursive, c'est foutu...
237
-	if ($r == TYPE_RECURSIF) {
238
-		return array();
239
-	}
240
-	if (!$r) {
241
-		$joker = false; // indiquer a l'appelant
242
-		# continuer pour chercher l'erreur suivante
243
-		return array("'#" . $r . ':' . $nom_champ . "'", '');
244
-	}
245
-
246
-	$desc = $boucles[$idb]->show;
247
-	// le nom du champ est il une exception de la table ? un alias ?
248
-	$excep = isset($GLOBALS['exceptions_des_tables'][$r]) ? $GLOBALS['exceptions_des_tables'][$r] : '';
249
-	if ($excep) {
250
-		$excep = isset($excep[$nom_champ]) ? $excep[$nom_champ] : '';
251
-	}
252
-	if ($excep) {
253
-		$joker = false; // indiquer a l'appelant
254
-		return index_exception($boucles[$idb], $desc, $nom_champ, $excep);
255
-	} // pas d'alias. Le champ existe t'il ?
256
-	else {
257
-		// le champ est réellement présent, on le prend.
258
-		if (isset($desc['field'][$nom_champ])) {
259
-			$t = $boucles[$idb]->id_table;
260
-			$joker = false; // indiquer a l'appelant
261
-			return array("$t.$nom_champ", $nom_champ);
262
-		}
263
-		// Tous les champs sont-ils acceptés ?
264
-		// Si oui, on retourne le champ, et on lève le flag joker
265
-		// C'est le cas des itérateurs DATA qui acceptent tout
266
-		// et testent la présence du champ à l'exécution et non à la compilation
267
-		// car ils ne connaissent pas ici leurs contenus.
268
-		elseif (/*$joker AND */
269
-		isset($desc['field']['*'])
270
-		) {
271
-			$joker = true; // indiquer a l'appelant
272
-			return array($nom_champ, $nom_champ);
273
-		}
274
-		// pas d'alias, pas de champ, pas de joker...
275
-		// tenter via une jointure...
276
-		else {
277
-			$joker = false; // indiquer a l'appelant
278
-			// regarder si le champ est deja dans une jointure existante
279
-			// sinon, si il y a des joitures explicites, la construire
280
-			if (!$t = trouver_champ_exterieur($nom_champ, $boucles[$idb]->from, $boucles[$idb])) {
281
-				if ($boucles[$idb]->jointures_explicites) {
282
-					// [todo] Ne pas lancer que lorsque il y a des jointures explicites !!!!
283
-					// fonctionnel, il suffit d'utiliser $boucles[$idb]->jointures au lieu de jointures_explicites
284
-					// mais est-ce ce qu'on veut ?
285
-					$jointures = preg_split("/\s+/", $boucles[$idb]->jointures_explicites);
286
-					if ($cle = trouver_jointure_champ($nom_champ, $boucles[$idb], $jointures)) {
287
-						$t = trouver_champ_exterieur($nom_champ, $boucles[$idb]->from, $boucles[$idb]);
288
-					}
289
-				}
290
-			}
291
-			if ($t) {
292
-				// si on a trouvé une jointure possible, on fait comme
293
-				// si c'était une exception pour le champ demandé
294
-				return index_exception($boucles[$idb],
295
-					$desc,
296
-					$nom_champ,
297
-					array($t[1]['id_table'], reset($t[2])));
298
-			}
299
-
300
-			return array('', '');
301
-		}
302
-	}
235
+    $r = $boucles[$idb]->type_requete;
236
+    // boucle recursive, c'est foutu...
237
+    if ($r == TYPE_RECURSIF) {
238
+        return array();
239
+    }
240
+    if (!$r) {
241
+        $joker = false; // indiquer a l'appelant
242
+        # continuer pour chercher l'erreur suivante
243
+        return array("'#" . $r . ':' . $nom_champ . "'", '');
244
+    }
245
+
246
+    $desc = $boucles[$idb]->show;
247
+    // le nom du champ est il une exception de la table ? un alias ?
248
+    $excep = isset($GLOBALS['exceptions_des_tables'][$r]) ? $GLOBALS['exceptions_des_tables'][$r] : '';
249
+    if ($excep) {
250
+        $excep = isset($excep[$nom_champ]) ? $excep[$nom_champ] : '';
251
+    }
252
+    if ($excep) {
253
+        $joker = false; // indiquer a l'appelant
254
+        return index_exception($boucles[$idb], $desc, $nom_champ, $excep);
255
+    } // pas d'alias. Le champ existe t'il ?
256
+    else {
257
+        // le champ est réellement présent, on le prend.
258
+        if (isset($desc['field'][$nom_champ])) {
259
+            $t = $boucles[$idb]->id_table;
260
+            $joker = false; // indiquer a l'appelant
261
+            return array("$t.$nom_champ", $nom_champ);
262
+        }
263
+        // Tous les champs sont-ils acceptés ?
264
+        // Si oui, on retourne le champ, et on lève le flag joker
265
+        // C'est le cas des itérateurs DATA qui acceptent tout
266
+        // et testent la présence du champ à l'exécution et non à la compilation
267
+        // car ils ne connaissent pas ici leurs contenus.
268
+        elseif (/*$joker AND */
269
+        isset($desc['field']['*'])
270
+        ) {
271
+            $joker = true; // indiquer a l'appelant
272
+            return array($nom_champ, $nom_champ);
273
+        }
274
+        // pas d'alias, pas de champ, pas de joker...
275
+        // tenter via une jointure...
276
+        else {
277
+            $joker = false; // indiquer a l'appelant
278
+            // regarder si le champ est deja dans une jointure existante
279
+            // sinon, si il y a des joitures explicites, la construire
280
+            if (!$t = trouver_champ_exterieur($nom_champ, $boucles[$idb]->from, $boucles[$idb])) {
281
+                if ($boucles[$idb]->jointures_explicites) {
282
+                    // [todo] Ne pas lancer que lorsque il y a des jointures explicites !!!!
283
+                    // fonctionnel, il suffit d'utiliser $boucles[$idb]->jointures au lieu de jointures_explicites
284
+                    // mais est-ce ce qu'on veut ?
285
+                    $jointures = preg_split("/\s+/", $boucles[$idb]->jointures_explicites);
286
+                    if ($cle = trouver_jointure_champ($nom_champ, $boucles[$idb], $jointures)) {
287
+                        $t = trouver_champ_exterieur($nom_champ, $boucles[$idb]->from, $boucles[$idb]);
288
+                    }
289
+                }
290
+            }
291
+            if ($t) {
292
+                // si on a trouvé une jointure possible, on fait comme
293
+                // si c'était une exception pour le champ demandé
294
+                return index_exception($boucles[$idb],
295
+                    $desc,
296
+                    $nom_champ,
297
+                    array($t[1]['id_table'], reset($t[2])));
298
+            }
299
+
300
+            return array('', '');
301
+        }
302
+    }
303 303
 }
304 304
 
305 305
 
@@ -327,52 +327,52 @@  discard block
 block discarded – undo
327 327
  *     est une expression pour le SELECT de la boucle du style "mots.titre AS titre_mot"
328 328
  **/
329 329
 function index_exception(&$boucle, $desc, $nom_champ, $excep) {
330
-	static $trouver_table;
331
-	if (!$trouver_table) {
332
-		$trouver_table = charger_fonction('trouver_table', 'base');
333
-	}
334
-
335
-	if (is_array($excep)) {
336
-		// permettre aux plugins de gerer eux meme des jointures derogatoire ingerables
337
-		$t = null;
338
-		if (count($excep) == 3) {
339
-			$index_exception_derogatoire = array_pop($excep);
340
-			$t = $index_exception_derogatoire($boucle, $desc, $nom_champ, $excep);
341
-		}
342
-		if ($t == null) {
343
-			list($e, $x) = $excep;  #PHP4 affecte de gauche a droite
344
-			$excep = $x;    #PHP5 de droite a gauche !
345
-			$j = $trouver_table($e, $boucle->sql_serveur);
346
-			if (!$j) {
347
-				return array('', '');
348
-			}
349
-			$e = $j['table'];
350
-			if (!$t = array_search($e, $boucle->from)) {
351
-				$k = $j['key']['PRIMARY KEY'];
352
-				if (strpos($k, ',')) {
353
-					$l = (preg_split('/\s*,\s*/', $k));
354
-					$k = $desc['key']['PRIMARY KEY'];
355
-					if (!in_array($k, $l)) {
356
-						spip_log("jointure impossible $e " . join(',', $l));
357
-
358
-						return array('', '');
359
-					}
360
-				}
361
-				$k = array($boucle->id_table, array($e), $k);
362
-				fabrique_jointures($boucle, array($k));
363
-				$t = array_search($e, $boucle->from);
364
-			}
365
-		}
366
-	} else {
367
-		$t = $boucle->id_table;
368
-	}
369
-	// demander a SQL de gerer le synonyme
370
-	// ca permet que excep soit dynamique (Cedric, 2/3/06)
371
-	if ($excep != $nom_champ) {
372
-		$excep .= ' AS ' . $nom_champ;
373
-	}
374
-
375
-	return array("$t.$excep", $nom_champ);
330
+    static $trouver_table;
331
+    if (!$trouver_table) {
332
+        $trouver_table = charger_fonction('trouver_table', 'base');
333
+    }
334
+
335
+    if (is_array($excep)) {
336
+        // permettre aux plugins de gerer eux meme des jointures derogatoire ingerables
337
+        $t = null;
338
+        if (count($excep) == 3) {
339
+            $index_exception_derogatoire = array_pop($excep);
340
+            $t = $index_exception_derogatoire($boucle, $desc, $nom_champ, $excep);
341
+        }
342
+        if ($t == null) {
343
+            list($e, $x) = $excep;  #PHP4 affecte de gauche a droite
344
+            $excep = $x;    #PHP5 de droite a gauche !
345
+            $j = $trouver_table($e, $boucle->sql_serveur);
346
+            if (!$j) {
347
+                return array('', '');
348
+            }
349
+            $e = $j['table'];
350
+            if (!$t = array_search($e, $boucle->from)) {
351
+                $k = $j['key']['PRIMARY KEY'];
352
+                if (strpos($k, ',')) {
353
+                    $l = (preg_split('/\s*,\s*/', $k));
354
+                    $k = $desc['key']['PRIMARY KEY'];
355
+                    if (!in_array($k, $l)) {
356
+                        spip_log("jointure impossible $e " . join(',', $l));
357
+
358
+                        return array('', '');
359
+                    }
360
+                }
361
+                $k = array($boucle->id_table, array($e), $k);
362
+                fabrique_jointures($boucle, array($k));
363
+                $t = array_search($e, $boucle->from);
364
+            }
365
+        }
366
+    } else {
367
+        $t = $boucle->id_table;
368
+    }
369
+    // demander a SQL de gerer le synonyme
370
+    // ca permet que excep soit dynamique (Cedric, 2/3/06)
371
+    if ($excep != $nom_champ) {
372
+        $excep .= ' AS ' . $nom_champ;
373
+    }
374
+
375
+    return array("$t.$excep", $nom_champ);
376 376
 }
377 377
 
378 378
 /**
@@ -397,7 +397,7 @@  discard block
 block discarded – undo
397 397
  *     Code PHP pour retrouver le champ
398 398
  */
399 399
 function champ_sql($champ, $p, $defaut = null, $remonte_pile = true) {
400
-	return index_pile($p->id_boucle, $champ, $p->boucles, $p->nom_boucle, $defaut, $remonte_pile);
400
+    return index_pile($p->id_boucle, $champ, $p->boucles, $p->nom_boucle, $defaut, $remonte_pile);
401 401
 }
402 402
 
403 403
 
@@ -417,9 +417,9 @@  discard block
 block discarded – undo
417 417
  *     Code PHP pour d'exécution de la balise et de ses filtres
418 418
  **/
419 419
 function calculer_champ($p) {
420
-	$p = calculer_balise($p->nom_champ, $p);
420
+    $p = calculer_balise($p->nom_champ, $p);
421 421
 
422
-	return applique_filtres($p);
422
+    return applique_filtres($p);
423 423
 }
424 424
 
425 425
 
@@ -456,28 +456,28 @@  discard block
 block discarded – undo
456 456
  **/
457 457
 function calculer_balise($nom, $p) {
458 458
 
459
-	// S'agit-t-il d'une balise_XXXX[_dist]() ?
460
-	if ($f = charger_fonction($nom, 'balise', true)) {
461
-		$p->balise_calculee = true;
462
-		$res = $f($p);
463
-		if ($res !== null and is_object($res)) {
464
-			return $res;
465
-		}
466
-	}
467
-
468
-	// Certaines des balises comportant un _ sont generiques
469
-	if ($f = strpos($nom, '_')
470
-		and $f = charger_fonction(substr($nom, 0, $f + 1), 'balise', true)
471
-	) {
472
-		$res = $f($p);
473
-		if ($res !== null and is_object($res)) {
474
-			return $res;
475
-		}
476
-	}
477
-
478
-	$f = charger_fonction('DEFAUT', 'calculer_balise');
479
-
480
-	return $f($nom, $p);
459
+    // S'agit-t-il d'une balise_XXXX[_dist]() ?
460
+    if ($f = charger_fonction($nom, 'balise', true)) {
461
+        $p->balise_calculee = true;
462
+        $res = $f($p);
463
+        if ($res !== null and is_object($res)) {
464
+            return $res;
465
+        }
466
+    }
467
+
468
+    // Certaines des balises comportant un _ sont generiques
469
+    if ($f = strpos($nom, '_')
470
+        and $f = charger_fonction(substr($nom, 0, $f + 1), 'balise', true)
471
+    ) {
472
+        $res = $f($p);
473
+        if ($res !== null and is_object($res)) {
474
+            return $res;
475
+        }
476
+    }
477
+
478
+    $f = charger_fonction('DEFAUT', 'calculer_balise');
479
+
480
+    return $f($nom, $p);
481 481
 }
482 482
 
483 483
 
@@ -505,36 +505,36 @@  discard block
 block discarded – undo
505 505
  **/
506 506
 function calculer_balise_DEFAUT_dist($nom, $p) {
507 507
 
508
-	// ca pourrait etre un champ SQL homonyme,
509
-	$p->code = index_pile($p->id_boucle, $nom, $p->boucles, $p->nom_boucle);
510
-
511
-	// compatibilite: depuis qu'on accepte #BALISE{ses_args} sans [(...)] autour
512
-	// il faut recracher {...} quand ce n'est finalement pas des args
513
-	if ($p->fonctions and (!$p->fonctions[0][0]) and $p->fonctions[0][1]) {
514
-		$code = addslashes($p->fonctions[0][1]);
515
-		$p->code .= " . '$code'";
516
-	}
517
-
518
-	// ne pas passer le filtre securite sur les id_xxx
519
-	if (strpos($nom, 'ID_') === 0) {
520
-		$p->interdire_scripts = false;
521
-	}
522
-
523
-	// Compatibilite ascendante avec les couleurs html (#FEFEFE) :
524
-	// SI le champ SQL n'est pas trouve
525
-	// ET si la balise a une forme de couleur
526
-	// ET s'il n'y a ni filtre ni etoile
527
-	// ALORS retourner la couleur.
528
-	// Ca permet si l'on veut vraiment de recuperer [(#ACCEDE*)]
529
-	if (preg_match("/^[A-F]{1,6}$/i", $nom)
530
-		and !$p->etoile
531
-		and !$p->fonctions
532
-	) {
533
-		$p->code = "'#$nom'";
534
-		$p->interdire_scripts = false;
535
-	}
536
-
537
-	return $p;
508
+    // ca pourrait etre un champ SQL homonyme,
509
+    $p->code = index_pile($p->id_boucle, $nom, $p->boucles, $p->nom_boucle);
510
+
511
+    // compatibilite: depuis qu'on accepte #BALISE{ses_args} sans [(...)] autour
512
+    // il faut recracher {...} quand ce n'est finalement pas des args
513
+    if ($p->fonctions and (!$p->fonctions[0][0]) and $p->fonctions[0][1]) {
514
+        $code = addslashes($p->fonctions[0][1]);
515
+        $p->code .= " . '$code'";
516
+    }
517
+
518
+    // ne pas passer le filtre securite sur les id_xxx
519
+    if (strpos($nom, 'ID_') === 0) {
520
+        $p->interdire_scripts = false;
521
+    }
522
+
523
+    // Compatibilite ascendante avec les couleurs html (#FEFEFE) :
524
+    // SI le champ SQL n'est pas trouve
525
+    // ET si la balise a une forme de couleur
526
+    // ET s'il n'y a ni filtre ni etoile
527
+    // ALORS retourner la couleur.
528
+    // Ca permet si l'on veut vraiment de recuperer [(#ACCEDE*)]
529
+    if (preg_match("/^[A-F]{1,6}$/i", $nom)
530
+        and !$p->etoile
531
+        and !$p->fonctions
532
+    ) {
533
+        $p->code = "'#$nom'";
534
+        $p->interdire_scripts = false;
535
+    }
536
+
537
+    return $p;
538 538
 }
539 539
 
540 540
 
@@ -577,36 +577,36 @@  discard block
 block discarded – undo
577 577
  **/
578 578
 function calculer_balise_dynamique($p, $nom, $l, $supp = array()) {
579 579
 
580
-	if (!balise_distante_interdite($p)) {
581
-		$p->code = "''";
582
-
583
-		return $p;
584
-	}
585
-	// compatibilite: depuis qu'on accepte #BALISE{ses_args} sans [(...)] autour
586
-	// il faut recracher {...} quand ce n'est finalement pas des args
587
-	if ($p->fonctions and (!$p->fonctions[0][0]) and $p->fonctions[0][1]) {
588
-		$p->fonctions = null;
589
-	}
590
-
591
-	if ($p->param and ($c = $p->param[0])) {
592
-		// liste d'arguments commence toujours par la chaine vide
593
-		array_shift($c);
594
-		// construire la liste d'arguments comme pour un filtre
595
-		$param = compose_filtres_args($p, $c, ',');
596
-	} else {
597
-		$param = "";
598
-	}
599
-	$collecte = collecter_balise_dynamique($l, $p, $nom);
600
-
601
-	$p->code = sprintf(CODE_EXECUTER_BALISE, $nom,
602
-		join(',', $collecte),
603
-		($collecte ? $param : substr($param, 1)), # virer la virgule
604
-		memoriser_contexte_compil($p),
605
-		(!$supp ? '' : (', ' . join(',', $supp))));
606
-
607
-	$p->interdire_scripts = false;
608
-
609
-	return $p;
580
+    if (!balise_distante_interdite($p)) {
581
+        $p->code = "''";
582
+
583
+        return $p;
584
+    }
585
+    // compatibilite: depuis qu'on accepte #BALISE{ses_args} sans [(...)] autour
586
+    // il faut recracher {...} quand ce n'est finalement pas des args
587
+    if ($p->fonctions and (!$p->fonctions[0][0]) and $p->fonctions[0][1]) {
588
+        $p->fonctions = null;
589
+    }
590
+
591
+    if ($p->param and ($c = $p->param[0])) {
592
+        // liste d'arguments commence toujours par la chaine vide
593
+        array_shift($c);
594
+        // construire la liste d'arguments comme pour un filtre
595
+        $param = compose_filtres_args($p, $c, ',');
596
+    } else {
597
+        $param = "";
598
+    }
599
+    $collecte = collecter_balise_dynamique($l, $p, $nom);
600
+
601
+    $p->code = sprintf(CODE_EXECUTER_BALISE, $nom,
602
+        join(',', $collecte),
603
+        ($collecte ? $param : substr($param, 1)), # virer la virgule
604
+        memoriser_contexte_compil($p),
605
+        (!$supp ? '' : (', ' . join(',', $supp))));
606
+
607
+    $p->interdire_scripts = false;
608
+
609
+    return $p;
610 610
 }
611 611
 
612 612
 
@@ -636,13 +636,13 @@  discard block
 block discarded – undo
636 636
  *     Liste des codes PHP d'éxecution des balises collectées
637 637
  **/
638 638
 function collecter_balise_dynamique($l, &$p, $nom) {
639
-	$args = array();
640
-	foreach ($l as $c) {
641
-		$x = calculer_balise($c, $p);
642
-		$args[] = $x->code;
643
-	}
639
+    $args = array();
640
+    foreach ($l as $c) {
641
+        $x = calculer_balise($c, $p);
642
+        $args[] = $x->code;
643
+    }
644 644
 
645
-	return $args;
645
+    return $args;
646 646
 }
647 647
 
648 648
 
@@ -657,20 +657,20 @@  discard block
 block discarded – undo
657 657
  *     Nom de la connexion
658 658
  **/
659 659
 function trouver_nom_serveur_distant($p) {
660
-	$nom = $p->id_boucle;
661
-	if ($nom
662
-		and isset($p->boucles[$nom])
663
-	) {
664
-		$s = $p->boucles[$nom]->sql_serveur;
665
-		if (strlen($s)
666
-			and strlen($serveur = strtolower($s))
667
-			and !in_array($serveur, $GLOBALS['exception_des_connect'])
668
-		) {
669
-			return $serveur;
670
-		}
671
-	}
672
-
673
-	return "";
660
+    $nom = $p->id_boucle;
661
+    if ($nom
662
+        and isset($p->boucles[$nom])
663
+    ) {
664
+        $s = $p->boucles[$nom]->sql_serveur;
665
+        if (strlen($s)
666
+            and strlen($serveur = strtolower($s))
667
+            and !in_array($serveur, $GLOBALS['exception_des_connect'])
668
+        ) {
669
+            return $serveur;
670
+        }
671
+    }
672
+
673
+    return "";
674 674
 }
675 675
 
676 676
 
@@ -694,15 +694,15 @@  discard block
 block discarded – undo
694 694
  *     - false : La balise est interdite car le serveur est distant
695 695
  **/
696 696
 function balise_distante_interdite($p) {
697
-	$nom = $p->id_boucle;
697
+    $nom = $p->id_boucle;
698 698
 
699
-	if ($nom and trouver_nom_serveur_distant($p)) {
700
-		spip_log($nom . ':' . $p->nom_champ . ' ' . _T('zbug_distant_interdit'));
699
+    if ($nom and trouver_nom_serveur_distant($p)) {
700
+        spip_log($nom . ':' . $p->nom_champ . ' ' . _T('zbug_distant_interdit'));
701 701
 
702
-		return false;
703
-	}
702
+        return false;
703
+    }
704 704
 
705
-	return true;
705
+    return true;
706 706
 }
707 707
 
708 708
 
@@ -713,67 +713,67 @@  discard block
 block discarded – undo
713 713
 // http://code.spip.net/@champs_traitements
714 714
 function champs_traitements($p) {
715 715
 
716
-	if (isset($GLOBALS['table_des_traitements'][$p->nom_champ])) {
717
-		$ps = $GLOBALS['table_des_traitements'][$p->nom_champ];
718
-	} else {
719
-		// quand on utilise un traitement catch-all *
720
-		// celui-ci ne s'applique pas sur les balises calculees qui peuvent gerer
721
-		// leur propre securite
722
-		if (!$p->balise_calculee) {
723
-			$ps = $GLOBALS['table_des_traitements']['*'];
724
-		} else {
725
-			$ps = false;
726
-		}
727
-	}
728
-
729
-	if (is_array($ps)) {
730
-		// Recuperer le type de boucle (articles, DATA) et la table SQL sur laquelle elle porte
731
-		$idb = index_boucle($p);
732
-		// mais on peut aussi etre hors boucle. Se mefier.
733
-		$type_requete = isset($p->boucles[$idb]->type_requete) ? $p->boucles[$idb]->type_requete : false;
734
-		$table_sql = isset($p->boucles[$idb]->show['table_sql']) ? $p->boucles[$idb]->show['table_sql'] : false;
735
-
736
-		// le traitement peut n'etre defini que pour une table en particulier "spip_articles"
737
-		if ($table_sql and isset($ps[$table_sql])) {
738
-			$ps = $ps[$table_sql];
739
-		} // ou pour une boucle en particulier "DATA","articles"
740
-		elseif ($type_requete and isset($ps[$type_requete])) {
741
-			$ps = $ps[$type_requete];
742
-		} // ou pour indiferrement quelle que soit la boucle
743
-		elseif (isset($ps[0])) {
744
-			$ps = $ps[0];
745
-		} else {
746
-			$ps = false;
747
-		}
748
-	}
749
-
750
-	if (!$ps) {
751
-		return $p->code;
752
-	}
753
-
754
-	// Si une boucle DOCUMENTS{doublons} est presente dans le squelette,
755
-	// ou si in INCLURE contient {doublons}
756
-	// on insere une fonction de remplissage du tableau des doublons 
757
-	// dans les filtres propre() ou typo()
758
-	// (qui traitent les raccourcis <docXX> referencant les docs)
759
-
760
-	if (isset($p->descr['documents'])
761
-		and
762
-		$p->descr['documents']
763
-		and (
764
-			(strpos($ps, 'propre') !== false)
765
-			or
766
-			(strpos($ps, 'typo') !== false)
767
-		)
768
-	) {
769
-		$ps = 'traiter_doublons_documents($doublons, ' . $ps . ')';
770
-	}
771
-
772
-	// La protection des champs par |safehtml est assuree par les extensions
773
-	// dans la declaration des traitements des champs sensibles
774
-
775
-	// Remplacer enfin le placeholder %s par le vrai code de la balise
776
-	return str_replace('%s', $p->code, $ps);
716
+    if (isset($GLOBALS['table_des_traitements'][$p->nom_champ])) {
717
+        $ps = $GLOBALS['table_des_traitements'][$p->nom_champ];
718
+    } else {
719
+        // quand on utilise un traitement catch-all *
720
+        // celui-ci ne s'applique pas sur les balises calculees qui peuvent gerer
721
+        // leur propre securite
722
+        if (!$p->balise_calculee) {
723
+            $ps = $GLOBALS['table_des_traitements']['*'];
724
+        } else {
725
+            $ps = false;
726
+        }
727
+    }
728
+
729
+    if (is_array($ps)) {
730
+        // Recuperer le type de boucle (articles, DATA) et la table SQL sur laquelle elle porte
731
+        $idb = index_boucle($p);
732
+        // mais on peut aussi etre hors boucle. Se mefier.
733
+        $type_requete = isset($p->boucles[$idb]->type_requete) ? $p->boucles[$idb]->type_requete : false;
734
+        $table_sql = isset($p->boucles[$idb]->show['table_sql']) ? $p->boucles[$idb]->show['table_sql'] : false;
735
+
736
+        // le traitement peut n'etre defini que pour une table en particulier "spip_articles"
737
+        if ($table_sql and isset($ps[$table_sql])) {
738
+            $ps = $ps[$table_sql];
739
+        } // ou pour une boucle en particulier "DATA","articles"
740
+        elseif ($type_requete and isset($ps[$type_requete])) {
741
+            $ps = $ps[$type_requete];
742
+        } // ou pour indiferrement quelle que soit la boucle
743
+        elseif (isset($ps[0])) {
744
+            $ps = $ps[0];
745
+        } else {
746
+            $ps = false;
747
+        }
748
+    }
749
+
750
+    if (!$ps) {
751
+        return $p->code;
752
+    }
753
+
754
+    // Si une boucle DOCUMENTS{doublons} est presente dans le squelette,
755
+    // ou si in INCLURE contient {doublons}
756
+    // on insere une fonction de remplissage du tableau des doublons 
757
+    // dans les filtres propre() ou typo()
758
+    // (qui traitent les raccourcis <docXX> referencant les docs)
759
+
760
+    if (isset($p->descr['documents'])
761
+        and
762
+        $p->descr['documents']
763
+        and (
764
+            (strpos($ps, 'propre') !== false)
765
+            or
766
+            (strpos($ps, 'typo') !== false)
767
+        )
768
+    ) {
769
+        $ps = 'traiter_doublons_documents($doublons, ' . $ps . ')';
770
+    }
771
+
772
+    // La protection des champs par |safehtml est assuree par les extensions
773
+    // dans la declaration des traitements des champs sensibles
774
+
775
+    // Remplacer enfin le placeholder %s par le vrai code de la balise
776
+    return str_replace('%s', $p->code, $ps);
777 777
 }
778 778
 
779 779
 
@@ -786,109 +786,109 @@  discard block
 block discarded – undo
786 786
 // http://code.spip.net/@applique_filtres
787 787
 function applique_filtres($p) {
788 788
 
789
-	// Traitements standards (cf. supra)
790
-	if ($p->etoile == '') {
791
-		$code = champs_traitements($p);
792
-	} else {
793
-		$code = $p->code;
794
-	}
789
+    // Traitements standards (cf. supra)
790
+    if ($p->etoile == '') {
791
+        $code = champs_traitements($p);
792
+    } else {
793
+        $code = $p->code;
794
+    }
795 795
 
796
-	// Appliquer les filtres perso
797
-	if ($p->param) {
798
-		$code = compose_filtres($p, $code);
799
-	}
796
+    // Appliquer les filtres perso
797
+    if ($p->param) {
798
+        $code = compose_filtres($p, $code);
799
+    }
800 800
 
801
-	// S'il y a un lien avec la session, ajouter un code qui levera
802
-	// un drapeau dans la structure d'invalidation $Cache
803
-	if (isset($p->descr['session'])) {
804
-		$code = "invalideur_session(\$Cache, $code)";
805
-	}
801
+    // S'il y a un lien avec la session, ajouter un code qui levera
802
+    // un drapeau dans la structure d'invalidation $Cache
803
+    if (isset($p->descr['session'])) {
804
+        $code = "invalideur_session(\$Cache, $code)";
805
+    }
806 806
 
807
-	$code = sandbox_composer_interdire_scripts($code, $p);
807
+    $code = sandbox_composer_interdire_scripts($code, $p);
808 808
 
809
-	return $code;
809
+    return $code;
810 810
 }
811 811
 
812 812
 // Cf. function pipeline dans ecrire/inc_utils.php
813 813
 // http://code.spip.net/@compose_filtres
814 814
 function compose_filtres(&$p, $code) {
815 815
 
816
-	$image_miette = false;
817
-	foreach ($p->param as $filtre) {
818
-		$fonc = array_shift($filtre);
819
-		if (!$fonc) {
820
-			continue;
821
-		} // normalement qu'au premier tour.
822
-		$is_filtre_image = ((substr($fonc, 0, 6) == 'image_') and $fonc != 'image_graver');
823
-		if ($image_miette and !$is_filtre_image) {
824
-			// il faut graver maintenant car apres le filtre en cours
825
-			// on est pas sur d'avoir encore le nom du fichier dans le pipe
826
-			$code = "filtrer('image_graver', $code)";
827
-			$image_miette = false;
828
-		}
829
-		// recuperer les arguments du filtre, 
830
-		// a separer par "," ou ":" dans le cas du filtre "?{a,b}"
831
-		if ($fonc !== '?') {
832
-			$sep = ',';
833
-		} else {
834
-			$sep = ':';
835
-			// |?{a,b} *doit* avoir exactement 2 arguments ; on les force
836
-			if (count($filtre) != 2) {
837
-				$filtre = array(isset($filtre[0]) ? $filtre[0] : "", isset($filtre[1]) ? $filtre[1] : "");
838
-			}
839
-		}
840
-		$arglist = compose_filtres_args($p, $filtre, $sep);
841
-		$logique = filtre_logique($fonc, $code, substr($arglist, 1));
842
-		if ($logique) {
843
-			$code = $logique;
844
-		} else {
845
-			$code = sandbox_composer_filtre($fonc, $code, $arglist, $p);
846
-			if ($is_filtre_image) {
847
-				$image_miette = true;
848
-			}
849
-		}
850
-	}
851
-	// ramasser les images intermediaires inutiles et graver l'image finale
852
-	if ($image_miette) {
853
-		$code = "filtrer('image_graver',$code)";
854
-	}
855
-
856
-	return $code;
816
+    $image_miette = false;
817
+    foreach ($p->param as $filtre) {
818
+        $fonc = array_shift($filtre);
819
+        if (!$fonc) {
820
+            continue;
821
+        } // normalement qu'au premier tour.
822
+        $is_filtre_image = ((substr($fonc, 0, 6) == 'image_') and $fonc != 'image_graver');
823
+        if ($image_miette and !$is_filtre_image) {
824
+            // il faut graver maintenant car apres le filtre en cours
825
+            // on est pas sur d'avoir encore le nom du fichier dans le pipe
826
+            $code = "filtrer('image_graver', $code)";
827
+            $image_miette = false;
828
+        }
829
+        // recuperer les arguments du filtre, 
830
+        // a separer par "," ou ":" dans le cas du filtre "?{a,b}"
831
+        if ($fonc !== '?') {
832
+            $sep = ',';
833
+        } else {
834
+            $sep = ':';
835
+            // |?{a,b} *doit* avoir exactement 2 arguments ; on les force
836
+            if (count($filtre) != 2) {
837
+                $filtre = array(isset($filtre[0]) ? $filtre[0] : "", isset($filtre[1]) ? $filtre[1] : "");
838
+            }
839
+        }
840
+        $arglist = compose_filtres_args($p, $filtre, $sep);
841
+        $logique = filtre_logique($fonc, $code, substr($arglist, 1));
842
+        if ($logique) {
843
+            $code = $logique;
844
+        } else {
845
+            $code = sandbox_composer_filtre($fonc, $code, $arglist, $p);
846
+            if ($is_filtre_image) {
847
+                $image_miette = true;
848
+            }
849
+        }
850
+    }
851
+    // ramasser les images intermediaires inutiles et graver l'image finale
852
+    if ($image_miette) {
853
+        $code = "filtrer('image_graver',$code)";
854
+    }
855
+
856
+    return $code;
857 857
 }
858 858
 
859 859
 // Filtres et,ou,oui,non,sinon,xou,xor,and,or,not,yes
860 860
 // et comparateurs
861 861
 function filtre_logique($fonc, $code, $arg) {
862 862
 
863
-	switch (true) {
864
-		case in_array($fonc, $GLOBALS['table_criteres_infixes']):
865
-			return "($code $fonc $arg)";
866
-		case ($fonc == 'and') or ($fonc == 'et'):
867
-			return "((($code) AND ($arg)) ?' ' :'')";
868
-		case ($fonc == 'or') or ($fonc == 'ou'):
869
-			return "((($code) OR ($arg)) ?' ' :'')";
870
-		case ($fonc == 'xor') or ($fonc == 'xou'):
871
-			return "((($code) XOR ($arg)) ?' ' :'')";
872
-		case ($fonc == 'sinon'):
873
-			return "(((\$a = $code) OR (is_string(\$a) AND strlen(\$a))) ? \$a : $arg)";
874
-		case ($fonc == 'not') or ($fonc == 'non'):
875
-			return "(($code) ?'' :' ')";
876
-		case ($fonc == 'yes') or ($fonc == 'oui'):
877
-			return "(($code) ?' ' :'')";
878
-	}
879
-
880
-	return '';
863
+    switch (true) {
864
+        case in_array($fonc, $GLOBALS['table_criteres_infixes']):
865
+            return "($code $fonc $arg)";
866
+        case ($fonc == 'and') or ($fonc == 'et'):
867
+            return "((($code) AND ($arg)) ?' ' :'')";
868
+        case ($fonc == 'or') or ($fonc == 'ou'):
869
+            return "((($code) OR ($arg)) ?' ' :'')";
870
+        case ($fonc == 'xor') or ($fonc == 'xou'):
871
+            return "((($code) XOR ($arg)) ?' ' :'')";
872
+        case ($fonc == 'sinon'):
873
+            return "(((\$a = $code) OR (is_string(\$a) AND strlen(\$a))) ? \$a : $arg)";
874
+        case ($fonc == 'not') or ($fonc == 'non'):
875
+            return "(($code) ?'' :' ')";
876
+        case ($fonc == 'yes') or ($fonc == 'oui'):
877
+            return "(($code) ?' ' :'')";
878
+    }
879
+
880
+    return '';
881 881
 }
882 882
 
883 883
 // http://code.spip.net/@compose_filtres_args
884 884
 function compose_filtres_args($p, $args, $sep) {
885
-	$arglist = "";
886
-	foreach ($args as $arg) {
887
-		$arglist .= $sep .
888
-			calculer_liste($arg, $p->descr, $p->boucles, $p->id_boucle);
889
-	}
885
+    $arglist = "";
886
+    foreach ($args as $arg) {
887
+        $arglist .= $sep .
888
+            calculer_liste($arg, $p->descr, $p->boucles, $p->id_boucle);
889
+    }
890 890
 
891
-	return $arglist;
891
+    return $arglist;
892 892
 }
893 893
 
894 894
 
@@ -906,15 +906,15 @@  discard block
 block discarded – undo
906 906
  **/
907 907
 function calculer_argument_precedent($idb, $nom_champ, &$boucles, $defaut = null) {
908 908
 
909
-	// si recursif, forcer l'extraction du champ SQL mais ignorer le code
910
-	if ($boucles[$idb]->externe) {
911
-		index_pile($idb, $nom_champ, $boucles, '', $defaut);
912
-		// retourner $Pile[$SP] et pas $Pile[0] si recursion en 1ere boucle
913
-		// on ignore le defaut fourni dans ce cas
914
-		$defaut = "@\$Pile[\$SP]['$nom_champ']";
915
-	}
909
+    // si recursif, forcer l'extraction du champ SQL mais ignorer le code
910
+    if ($boucles[$idb]->externe) {
911
+        index_pile($idb, $nom_champ, $boucles, '', $defaut);
912
+        // retourner $Pile[$SP] et pas $Pile[0] si recursion en 1ere boucle
913
+        // on ignore le defaut fourni dans ce cas
914
+        $defaut = "@\$Pile[\$SP]['$nom_champ']";
915
+    }
916 916
 
917
-	return index_pile($boucles[$idb]->id_parent, $nom_champ, $boucles, '', $defaut);
917
+    return index_pile($boucles[$idb]->id_parent, $nom_champ, $boucles, '', $defaut);
918 918
 }
919 919
 
920 920
 //
@@ -929,30 +929,30 @@  discard block
 block discarded – undo
929 929
 
930 930
 // http://code.spip.net/@rindex_pile
931 931
 function rindex_pile($p, $champ, $motif) {
932
-	$n = 0;
933
-	$b = $p->id_boucle;
934
-	$p->code = '';
935
-	while ($b != '') {
936
-		foreach ($p->boucles[$b]->criteres as $critere) {
937
-			if ($critere->op == $motif) {
938
-				$p->code = '$Pile[$SP' . (($n == 0) ? "" : "-$n") .
939
-					"]['$champ']";
940
-				$b = '';
941
-				break 2;
942
-			}
943
-		}
944
-		$n++;
945
-		$b = $p->boucles[$b]->id_parent;
946
-	}
947
-
948
-	// si on est hors d'une boucle de {recherche}, cette balise est vide
949
-	if (!$p->code) {
950
-		$p->code = "''";
951
-	}
952
-
953
-	$p->interdire_scripts = false;
954
-
955
-	return $p;
932
+    $n = 0;
933
+    $b = $p->id_boucle;
934
+    $p->code = '';
935
+    while ($b != '') {
936
+        foreach ($p->boucles[$b]->criteres as $critere) {
937
+            if ($critere->op == $motif) {
938
+                $p->code = '$Pile[$SP' . (($n == 0) ? "" : "-$n") .
939
+                    "]['$champ']";
940
+                $b = '';
941
+                break 2;
942
+            }
943
+        }
944
+        $n++;
945
+        $b = $p->boucles[$b]->id_parent;
946
+    }
947
+
948
+    // si on est hors d'une boucle de {recherche}, cette balise est vide
949
+    if (!$p->code) {
950
+        $p->code = "''";
951
+    }
952
+
953
+    $p->interdire_scripts = false;
954
+
955
+    return $p;
956 956
 }
957 957
 
958 958
 /** 
@@ -962,7 +962,7 @@  discard block
 block discarded – undo
962 962
  * @return string Nom de la balise, avec indication de boucle explicite si présent.
963 963
  */
964 964
 function zbug_presenter_champ($p, $champ = "") {
965
-	$balise = $champ ? $champ : $p->nom_champ;
966
-	$explicite = $explicite = $p->nom_boucle ? $p->nom_boucle . ':' : '';
967
-	return "#{$explicite}{$balise}";
965
+    $balise = $champ ? $champ : $p->nom_champ;
966
+    $explicite = $explicite = $p->nom_boucle ? $p->nom_boucle . ':' : '';
967
+    return "#{$explicite}{$balise}";
968 968
 }
969 969
\ No newline at end of file
Please login to merge, or discard this patch.
Spacing   +14 added lines, -14 removed lines patch added patch discarded remove patch
@@ -124,7 +124,7 @@  discard block
 block discarded – undo
124 124
 	$select = true
125 125
 ) {
126 126
 	if (!is_string($defaut)) {
127
-		$defaut = '@$Pile[0][\'' . strtolower($nom_champ) . '\']';
127
+		$defaut = '@$Pile[0][\''.strtolower($nom_champ).'\']';
128 128
 	}
129 129
 
130 130
 	$i = 0;
@@ -152,7 +152,7 @@  discard block
 block discarded – undo
152 152
 			if ($select and !in_array($t, $boucles[$idb]->select)) {
153 153
 				$boucles[$idb]->select[] = $t;
154 154
 			}
155
-			$champ = '$Pile[$SP' . ($i ? "-$i" : "") . '][\'' . $c . '\']';
155
+			$champ = '$Pile[$SP'.($i ? "-$i" : "").'][\''.$c.'\']';
156 156
 			if (!$joker) {
157 157
 				return index_compose($conditionnel, $champ);
158 158
 			}
@@ -193,7 +193,7 @@  discard block
 block discarded – undo
193 193
 function index_compose($conditionnel, $defaut) {
194 194
 	while ($c = array_pop($conditionnel)) {
195 195
 		// si on passe defaut = '', ne pas générer d'erreur de compilation.
196
-		$defaut = "($c:(" . ($defaut ? $defaut : "''") . "))";
196
+		$defaut = "($c:(".($defaut ? $defaut : "''")."))";
197 197
 	}
198 198
 
199 199
 	return $defaut;
@@ -240,7 +240,7 @@  discard block
 block discarded – undo
240 240
 	if (!$r) {
241 241
 		$joker = false; // indiquer a l'appelant
242 242
 		# continuer pour chercher l'erreur suivante
243
-		return array("'#" . $r . ':' . $nom_champ . "'", '');
243
+		return array("'#".$r.':'.$nom_champ."'", '');
244 244
 	}
245 245
 
246 246
 	$desc = $boucles[$idb]->show;
@@ -340,8 +340,8 @@  discard block
 block discarded – undo
340 340
 			$t = $index_exception_derogatoire($boucle, $desc, $nom_champ, $excep);
341 341
 		}
342 342
 		if ($t == null) {
343
-			list($e, $x) = $excep;  #PHP4 affecte de gauche a droite
344
-			$excep = $x;    #PHP5 de droite a gauche !
343
+			list($e, $x) = $excep; #PHP4 affecte de gauche a droite
344
+			$excep = $x; #PHP5 de droite a gauche !
345 345
 			$j = $trouver_table($e, $boucle->sql_serveur);
346 346
 			if (!$j) {
347 347
 				return array('', '');
@@ -353,7 +353,7 @@  discard block
 block discarded – undo
353 353
 					$l = (preg_split('/\s*,\s*/', $k));
354 354
 					$k = $desc['key']['PRIMARY KEY'];
355 355
 					if (!in_array($k, $l)) {
356
-						spip_log("jointure impossible $e " . join(',', $l));
356
+						spip_log("jointure impossible $e ".join(',', $l));
357 357
 
358 358
 						return array('', '');
359 359
 					}
@@ -369,7 +369,7 @@  discard block
 block discarded – undo
369 369
 	// demander a SQL de gerer le synonyme
370 370
 	// ca permet que excep soit dynamique (Cedric, 2/3/06)
371 371
 	if ($excep != $nom_champ) {
372
-		$excep .= ' AS ' . $nom_champ;
372
+		$excep .= ' AS '.$nom_champ;
373 373
 	}
374 374
 
375 375
 	return array("$t.$excep", $nom_champ);
@@ -602,7 +602,7 @@  discard block
 block discarded – undo
602 602
 		join(',', $collecte),
603 603
 		($collecte ? $param : substr($param, 1)), # virer la virgule
604 604
 		memoriser_contexte_compil($p),
605
-		(!$supp ? '' : (', ' . join(',', $supp))));
605
+		(!$supp ? '' : (', '.join(',', $supp))));
606 606
 
607 607
 	$p->interdire_scripts = false;
608 608
 
@@ -697,7 +697,7 @@  discard block
 block discarded – undo
697 697
 	$nom = $p->id_boucle;
698 698
 
699 699
 	if ($nom and trouver_nom_serveur_distant($p)) {
700
-		spip_log($nom . ':' . $p->nom_champ . ' ' . _T('zbug_distant_interdit'));
700
+		spip_log($nom.':'.$p->nom_champ.' '._T('zbug_distant_interdit'));
701 701
 
702 702
 		return false;
703 703
 	}
@@ -766,7 +766,7 @@  discard block
 block discarded – undo
766 766
 			(strpos($ps, 'typo') !== false)
767 767
 		)
768 768
 	) {
769
-		$ps = 'traiter_doublons_documents($doublons, ' . $ps . ')';
769
+		$ps = 'traiter_doublons_documents($doublons, '.$ps.')';
770 770
 	}
771 771
 
772 772
 	// La protection des champs par |safehtml est assuree par les extensions
@@ -884,7 +884,7 @@  discard block
 block discarded – undo
884 884
 function compose_filtres_args($p, $args, $sep) {
885 885
 	$arglist = "";
886 886
 	foreach ($args as $arg) {
887
-		$arglist .= $sep .
887
+		$arglist .= $sep.
888 888
 			calculer_liste($arg, $p->descr, $p->boucles, $p->id_boucle);
889 889
 	}
890 890
 
@@ -935,7 +935,7 @@  discard block
 block discarded – undo
935 935
 	while ($b != '') {
936 936
 		foreach ($p->boucles[$b]->criteres as $critere) {
937 937
 			if ($critere->op == $motif) {
938
-				$p->code = '$Pile[$SP' . (($n == 0) ? "" : "-$n") .
938
+				$p->code = '$Pile[$SP'.(($n == 0) ? "" : "-$n").
939 939
 					"]['$champ']";
940 940
 				$b = '';
941 941
 				break 2;
@@ -963,6 +963,6 @@  discard block
 block discarded – undo
963 963
  */
964 964
 function zbug_presenter_champ($p, $champ = "") {
965 965
 	$balise = $champ ? $champ : $p->nom_champ;
966
-	$explicite = $explicite = $p->nom_boucle ? $p->nom_boucle . ':' : '';
966
+	$explicite = $explicite = $p->nom_boucle ? $p->nom_boucle.':' : '';
967 967
 	return "#{$explicite}{$balise}";
968 968
 }
969 969
\ No newline at end of file
Please login to merge, or discard this patch.
ecrire/public/balises.php 2 patches
Indentation   +911 added lines, -911 removed lines patch added patch discarded remove patch
@@ -26,7 +26,7 @@  discard block
 block discarded – undo
26 26
  **/
27 27
 
28 28
 if (!defined('_ECRIRE_INC_VERSION')) {
29
-	return;
29
+    return;
30 30
 }
31 31
 
32 32
 /**
@@ -48,14 +48,14 @@  discard block
 block discarded – undo
48 48
  *     Code PHP si cet argument est présent, sinon null
49 49
  **/
50 50
 function interprete_argument_balise($n, $p) {
51
-	if (($p->param) && (!$p->param[0][0]) && (count($p->param[0]) > $n)) {
52
-		return calculer_liste($p->param[0][$n],
53
-			$p->descr,
54
-			$p->boucles,
55
-			$p->id_boucle);
56
-	} else {
57
-		return null;
58
-	}
51
+    if (($p->param) && (!$p->param[0][0]) && (count($p->param[0]) > $n)) {
52
+        return calculer_liste($p->param[0][$n],
53
+            $p->descr,
54
+            $p->boucles,
55
+            $p->id_boucle);
56
+    } else {
57
+        return null;
58
+    }
59 59
 }
60 60
 
61 61
 
@@ -75,10 +75,10 @@  discard block
 block discarded – undo
75 75
  *     Pile complétée par le code à générer
76 76
  **/
77 77
 function balise_NOM_SITE_SPIP_dist($p) {
78
-	$p->code = "\$GLOBALS['meta']['nom_site']";
78
+    $p->code = "\$GLOBALS['meta']['nom_site']";
79 79
 
80
-	#$p->interdire_scripts = true;
81
-	return $p;
80
+    #$p->interdire_scripts = true;
81
+    return $p;
82 82
 }
83 83
 
84 84
 /**
@@ -94,10 +94,10 @@  discard block
 block discarded – undo
94 94
  *     Pile complétée par le code à générer
95 95
  **/
96 96
 function balise_EMAIL_WEBMASTER_dist($p) {
97
-	$p->code = "\$GLOBALS['meta']['email_webmaster']";
97
+    $p->code = "\$GLOBALS['meta']['email_webmaster']";
98 98
 
99
-	#$p->interdire_scripts = true;
100
-	return $p;
99
+    #$p->interdire_scripts = true;
100
+    return $p;
101 101
 }
102 102
 
103 103
 /**
@@ -113,10 +113,10 @@  discard block
 block discarded – undo
113 113
  *     Pile complétée par le code à générer
114 114
  **/
115 115
 function balise_DESCRIPTIF_SITE_SPIP_dist($p) {
116
-	$p->code = "\$GLOBALS['meta']['descriptif_site']";
116
+    $p->code = "\$GLOBALS['meta']['descriptif_site']";
117 117
 
118
-	#$p->interdire_scripts = true;
119
-	return $p;
118
+    #$p->interdire_scripts = true;
119
+    return $p;
120 120
 }
121 121
 
122 122
 
@@ -137,10 +137,10 @@  discard block
 block discarded – undo
137 137
  *     Pile complétée par le code à générer
138 138
  **/
139 139
 function balise_CHARSET_dist($p) {
140
-	$p->code = "\$GLOBALS['meta']['charset']";
140
+    $p->code = "\$GLOBALS['meta']['charset']";
141 141
 
142
-	#$p->interdire_scripts = true;
143
-	return $p;
142
+    #$p->interdire_scripts = true;
143
+    return $p;
144 144
 }
145 145
 
146 146
 /**
@@ -165,11 +165,11 @@  discard block
 block discarded – undo
165 165
  *     Pile complétée par le code à générer
166 166
  **/
167 167
 function balise_LANG_LEFT_dist($p) {
168
-	$_lang = champ_sql('lang', $p);
169
-	$p->code = "lang_dir($_lang, 'left','right')";
170
-	$p->interdire_scripts = false;
168
+    $_lang = champ_sql('lang', $p);
169
+    $p->code = "lang_dir($_lang, 'left','right')";
170
+    $p->interdire_scripts = false;
171 171
 
172
-	return $p;
172
+    return $p;
173 173
 }
174 174
 
175 175
 /**
@@ -189,11 +189,11 @@  discard block
 block discarded – undo
189 189
  *     Pile complétée par le code à générer
190 190
  **/
191 191
 function balise_LANG_RIGHT_dist($p) {
192
-	$_lang = champ_sql('lang', $p);
193
-	$p->code = "lang_dir($_lang, 'right','left')";
194
-	$p->interdire_scripts = false;
192
+    $_lang = champ_sql('lang', $p);
193
+    $p->code = "lang_dir($_lang, 'right','left')";
194
+    $p->interdire_scripts = false;
195 195
 
196
-	return $p;
196
+    return $p;
197 197
 }
198 198
 
199 199
 /**
@@ -218,11 +218,11 @@  discard block
 block discarded – undo
218 218
  *     Pile complétée par le code à générer
219 219
  **/
220 220
 function balise_LANG_DIR_dist($p) {
221
-	$_lang = champ_sql('lang', $p);
222
-	$p->code = "lang_dir($_lang, 'ltr','rtl')";
223
-	$p->interdire_scripts = false;
221
+    $_lang = champ_sql('lang', $p);
222
+    $p->code = "lang_dir($_lang, 'ltr','rtl')";
223
+    $p->interdire_scripts = false;
224 224
 
225
-	return $p;
225
+    return $p;
226 226
 }
227 227
 
228 228
 
@@ -239,10 +239,10 @@  discard block
 block discarded – undo
239 239
  *     Pile complétée par le code à générer
240 240
  **/
241 241
 function balise_PUCE_dist($p) {
242
-	$p->code = "definir_puce()";
243
-	$p->interdire_scripts = false;
242
+    $p->code = "definir_puce()";
243
+    $p->interdire_scripts = false;
244 244
 
245
-	return $p;
245
+    return $p;
246 246
 }
247 247
 
248 248
 
@@ -266,12 +266,12 @@  discard block
 block discarded – undo
266 266
  *     Pile completée du code PHP d'exécution de la balise
267 267
  */
268 268
 function balise_DATE_dist($p) {
269
-	$d = champ_sql('date', $p);
269
+    $d = champ_sql('date', $p);
270 270
 #	if ($d === "@\$Pile[0]['date']")
271 271
 #		$d = "isset(\$Pile[0]['date']) ? $d : time()";
272
-	$p->code = $d;
272
+    $p->code = $d;
273 273
 
274
-	return $p;
274
+    return $p;
275 275
 }
276 276
 
277 277
 
@@ -291,13 +291,13 @@  discard block
 block discarded – undo
291 291
  *     Pile completée du code PHP d'exécution de la balise
292 292
  */
293 293
 function balise_DATE_REDAC_dist($p) {
294
-	$d = champ_sql('date_redac', $p);
294
+    $d = champ_sql('date_redac', $p);
295 295
 #	if ($d === "@\$Pile[0]['date_redac']")
296 296
 #		$d = "isset(\$Pile[0]['date_redac']) ? $d : time()";
297
-	$p->code = $d;
298
-	$p->interdire_scripts = false;
297
+    $p->code = $d;
298
+    $p->interdire_scripts = false;
299 299
 
300
-	return $p;
300
+    return $p;
301 301
 }
302 302
 
303 303
 /**
@@ -316,10 +316,10 @@  discard block
 block discarded – undo
316 316
  *     Pile completée du code PHP d'exécution de la balise
317 317
  */
318 318
 function balise_DATE_MODIF_dist($p) {
319
-	$p->code = champ_sql('date_modif', $p);
320
-	$p->interdire_scripts = false;
319
+    $p->code = champ_sql('date_modif', $p);
320
+    $p->interdire_scripts = false;
321 321
 
322
-	return $p;
322
+    return $p;
323 323
 }
324 324
 
325 325
 /**
@@ -337,13 +337,13 @@  discard block
 block discarded – undo
337 337
  *     Pile completée du code PHP d'exécution de la balise
338 338
  */
339 339
 function balise_DATE_NOUVEAUTES_dist($p) {
340
-	$p->code = "((\$GLOBALS['meta']['quoi_de_neuf'] == 'oui'
340
+    $p->code = "((\$GLOBALS['meta']['quoi_de_neuf'] == 'oui'
341 341
 	AND isset(\$GLOBALS['meta']['dernier_envoi_neuf'])) ?
342 342
 	\$GLOBALS['meta']['dernier_envoi_neuf'] :
343 343
 	\"'0000-00-00'\")";
344
-	$p->interdire_scripts = false;
344
+    $p->interdire_scripts = false;
345 345
 
346
-	return $p;
346
+    return $p;
347 347
 }
348 348
 
349 349
 
@@ -362,11 +362,11 @@  discard block
 block discarded – undo
362 362
  *     Pile completée du code PHP d'exécution de la balise
363 363
  */
364 364
 function balise_DOSSIER_SQUELETTE_dist($p) {
365
-	$code = substr(addslashes(dirname($p->descr['sourcefile'])), strlen(_DIR_RACINE));
366
-	$p->code = "_DIR_RACINE . '$code'" .
367
-		$p->interdire_scripts = false;
365
+    $code = substr(addslashes(dirname($p->descr['sourcefile'])), strlen(_DIR_RACINE));
366
+    $p->code = "_DIR_RACINE . '$code'" .
367
+        $p->interdire_scripts = false;
368 368
 
369
-	return $p;
369
+    return $p;
370 370
 }
371 371
 
372 372
 /**
@@ -381,11 +381,11 @@  discard block
 block discarded – undo
381 381
  *     Pile completée du code PHP d'exécution de la balise
382 382
  */
383 383
 function balise_SQUELETTE_dist($p) {
384
-	$code = addslashes($p->descr['sourcefile']);
385
-	$p->code = "'$code'" .
386
-		$p->interdire_scripts = false;
384
+    $code = addslashes($p->descr['sourcefile']);
385
+    $p->code = "'$code'" .
386
+        $p->interdire_scripts = false;
387 387
 
388
-	return $p;
388
+    return $p;
389 389
 }
390 390
 
391 391
 /**
@@ -404,10 +404,10 @@  discard block
 block discarded – undo
404 404
  *     Pile completée du code PHP d'exécution de la balise
405 405
  */
406 406
 function balise_SPIP_VERSION_dist($p) {
407
-	$p->code = "spip_version()";
408
-	$p->interdire_scripts = false;
407
+    $p->code = "spip_version()";
408
+    $p->interdire_scripts = false;
409 409
 
410
-	return $p;
410
+    return $p;
411 411
 }
412 412
 
413 413
 
@@ -433,18 +433,18 @@  discard block
 block discarded – undo
433 433
  *     Pile complétée par le code à générer
434 434
  **/
435 435
 function balise_NOM_SITE_dist($p) {
436
-	if (!$p->etoile) {
437
-		$p->code = "supprimer_numero(calculer_url(" .
438
-			champ_sql('url_site', $p) . "," .
439
-			champ_sql('nom_site', $p) .
440
-			", 'titre', \$connect, false))";
441
-	} else {
442
-		$p->code = champ_sql('nom_site', $p);
443
-	}
436
+    if (!$p->etoile) {
437
+        $p->code = "supprimer_numero(calculer_url(" .
438
+            champ_sql('url_site', $p) . "," .
439
+            champ_sql('nom_site', $p) .
440
+            ", 'titre', \$connect, false))";
441
+    } else {
442
+        $p->code = champ_sql('nom_site', $p);
443
+    }
444 444
 
445
-	$p->interdire_scripts = true;
445
+    $p->interdire_scripts = true;
446 446
 
447
-	return $p;
447
+    return $p;
448 448
 }
449 449
 
450 450
 
@@ -461,11 +461,11 @@  discard block
 block discarded – undo
461 461
  *     Pile complétée par le code à générer
462 462
  **/
463 463
 function balise_NOTES_dist($p) {
464
-	// Recuperer les notes
465
-	$p->code = 'calculer_notes()';
464
+    // Recuperer les notes
465
+    $p->code = 'calculer_notes()';
466 466
 
467
-	#$p->interdire_scripts = true;
468
-	return $p;
467
+    #$p->interdire_scripts = true;
468
+    return $p;
469 469
 }
470 470
 
471 471
 
@@ -487,10 +487,10 @@  discard block
 block discarded – undo
487 487
  *     Pile complétée par le code à générer
488 488
  **/
489 489
 function balise_RECHERCHE_dist($p) {
490
-	$p->code = 'entites_html(_request("recherche"))';
491
-	$p->interdire_scripts = false;
490
+    $p->code = 'entites_html(_request("recherche"))';
491
+    $p->interdire_scripts = false;
492 492
 
493
-	return $p;
493
+    return $p;
494 494
 }
495 495
 
496 496
 
@@ -508,17 +508,17 @@  discard block
 block discarded – undo
508 508
  *     Pile complétée par le code à générer
509 509
  **/
510 510
 function balise_COMPTEUR_BOUCLE_dist($p) {
511
-	$b = index_boucle_mere($p);
512
-	if ($b === '') {
513
-		$msg = array('zbug_champ_hors_boucle', array('champ' => zbug_presenter_champ($p)));
514
-		erreur_squelette($msg, $p);
515
-	} else {
516
-		$p->code = "\$Numrows['$b']['compteur_boucle']";
517
-		$p->boucles[$b]->cptrows = true;
518
-		$p->interdire_scripts = false;
511
+    $b = index_boucle_mere($p);
512
+    if ($b === '') {
513
+        $msg = array('zbug_champ_hors_boucle', array('champ' => zbug_presenter_champ($p)));
514
+        erreur_squelette($msg, $p);
515
+    } else {
516
+        $p->code = "\$Numrows['$b']['compteur_boucle']";
517
+        $p->boucles[$b]->cptrows = true;
518
+        $p->interdire_scripts = false;
519 519
 
520
-		return $p;
521
-	}
520
+        return $p;
521
+    }
522 522
 }
523 523
 
524 524
 /**
@@ -536,17 +536,17 @@  discard block
 block discarded – undo
536 536
  *     Pile complétée par le code à générer
537 537
  **/
538 538
 function balise_TOTAL_BOUCLE_dist($p) {
539
-	$b = index_boucle_mere($p);
540
-	if ($b === '') {
541
-		$msg = array('zbug_champ_hors_boucle', array('champ' => zbug_presenter_champ($p)));
542
-		erreur_squelette($msg, $p);
543
-	} else {
544
-		$p->code = "\$Numrows['$b']['total']";
545
-		$p->boucles[$b]->numrows = true;
546
-		$p->interdire_scripts = false;
547
-	}
539
+    $b = index_boucle_mere($p);
540
+    if ($b === '') {
541
+        $msg = array('zbug_champ_hors_boucle', array('champ' => zbug_presenter_champ($p)));
542
+        erreur_squelette($msg, $p);
543
+    } else {
544
+        $p->code = "\$Numrows['$b']['total']";
545
+        $p->boucles[$b]->numrows = true;
546
+        $p->interdire_scripts = false;
547
+    }
548 548
 
549
-	return $p;
549
+    return $p;
550 550
 }
551 551
 
552 552
 
@@ -566,7 +566,7 @@  discard block
 block discarded – undo
566 566
  *     Pile complétée par le code à générer
567 567
  **/
568 568
 function balise_POINTS_dist($p) {
569
-	return rindex_pile($p, 'points', 'recherche');
569
+    return rindex_pile($p, 'points', 'recherche');
570 570
 }
571 571
 
572 572
 
@@ -587,12 +587,12 @@  discard block
 block discarded – undo
587 587
  *     Pile complétée par le code à générer
588 588
  **/
589 589
 function balise_POPULARITE_ABSOLUE_dist($p) {
590
-	$p->code = 'ceil(' .
591
-		champ_sql('popularite', $p) .
592
-		')';
593
-	$p->interdire_scripts = false;
590
+    $p->code = 'ceil(' .
591
+        champ_sql('popularite', $p) .
592
+        ')';
593
+    $p->interdire_scripts = false;
594 594
 
595
-	return $p;
595
+    return $p;
596 596
 }
597 597
 
598 598
 /**
@@ -612,10 +612,10 @@  discard block
 block discarded – undo
612 612
  *     Pile complétée par le code à générer
613 613
  **/
614 614
 function balise_POPULARITE_SITE_dist($p) {
615
-	$p->code = 'ceil($GLOBALS["meta"][\'popularite_total\'])';
616
-	$p->interdire_scripts = false;
615
+    $p->code = 'ceil($GLOBALS["meta"][\'popularite_total\'])';
616
+    $p->interdire_scripts = false;
617 617
 
618
-	return $p;
618
+    return $p;
619 619
 }
620 620
 
621 621
 /**
@@ -636,10 +636,10 @@  discard block
 block discarded – undo
636 636
  *     Pile complétée par le code à générer
637 637
  **/
638 638
 function balise_POPULARITE_MAX_dist($p) {
639
-	$p->code = 'ceil($GLOBALS["meta"][\'popularite_max\'])';
640
-	$p->interdire_scripts = false;
639
+    $p->code = 'ceil($GLOBALS["meta"][\'popularite_max\'])';
640
+    $p->interdire_scripts = false;
641 641
 
642
-	return $p;
642
+    return $p;
643 643
 }
644 644
 
645 645
 
@@ -665,14 +665,14 @@  discard block
 block discarded – undo
665 665
  *     Pile complétée par le code à générer
666 666
  **/
667 667
 function balise_VALEUR_dist($p) {
668
-	$b = $p->nom_boucle ? $p->nom_boucle : $p->id_boucle;
669
-	$p->code = index_pile($p->id_boucle, 'valeur', $p->boucles, $b);;
670
-	if (($v = interprete_argument_balise(1, $p)) !== null) {
671
-		$p->code = 'table_valeur(' . $p->code . ', ' . $v . ')';
672
-	}
673
-	$p->interdire_scripts = true;
668
+    $b = $p->nom_boucle ? $p->nom_boucle : $p->id_boucle;
669
+    $p->code = index_pile($p->id_boucle, 'valeur', $p->boucles, $b);;
670
+    if (($v = interprete_argument_balise(1, $p)) !== null) {
671
+        $p->code = 'table_valeur(' . $p->code . ', ' . $v . ')';
672
+    }
673
+    $p->interdire_scripts = true;
674 674
 
675
-	return $p;
675
+    return $p;
676 676
 }
677 677
 
678 678
 /**
@@ -701,17 +701,17 @@  discard block
 block discarded – undo
701 701
  *     Pile complétée par le code à générer
702 702
  **/
703 703
 function balise_EXPOSE_dist($p) {
704
-	$on = "'on'";
705
-	$off = "''";
706
-	if (($v = interprete_argument_balise(1, $p)) !== null) {
707
-		$on = $v;
708
-		if (($v = interprete_argument_balise(2, $p)) !== null) {
709
-			$off = $v;
710
-		}
704
+    $on = "'on'";
705
+    $off = "''";
706
+    if (($v = interprete_argument_balise(1, $p)) !== null) {
707
+        $on = $v;
708
+        if (($v = interprete_argument_balise(2, $p)) !== null) {
709
+            $off = $v;
710
+        }
711 711
 
712
-	}
712
+    }
713 713
 
714
-	return calculer_balise_expose($p, $on, $off);
714
+    return calculer_balise_expose($p, $on, $off);
715 715
 }
716 716
 
717 717
 /**
@@ -729,36 +729,36 @@  discard block
 block discarded – undo
729 729
  *     Pile complétée par le code à générer
730 730
  **/
731 731
 function calculer_balise_expose($p, $on, $off) {
732
-	$b = index_boucle($p);
733
-	if (empty($p->boucles[$b]->primary)) {
734
-		$msg = array('zbug_champ_hors_boucle', array('champ' => zbug_presenter_champ($p)));
735
-		erreur_squelette($msg, $p);
736
-	} else {
732
+    $b = index_boucle($p);
733
+    if (empty($p->boucles[$b]->primary)) {
734
+        $msg = array('zbug_champ_hors_boucle', array('champ' => zbug_presenter_champ($p)));
735
+        erreur_squelette($msg, $p);
736
+    } else {
737 737
 
738
-		$key = $p->boucles[$b]->primary;
739
-		$type = $p->boucles[$p->id_boucle]->primary;
740
-		$desc = $p->boucles[$b]->show;
741
-		$connect = sql_quote($p->boucles[$b]->sql_serveur);
738
+        $key = $p->boucles[$b]->primary;
739
+        $type = $p->boucles[$p->id_boucle]->primary;
740
+        $desc = $p->boucles[$b]->show;
741
+        $connect = sql_quote($p->boucles[$b]->sql_serveur);
742 742
 
743
-		// Ne pas utiliser champ_sql, on jongle avec le nom boucle explicite
744
-		$c = index_pile($p->id_boucle, $type, $p->boucles);
743
+        // Ne pas utiliser champ_sql, on jongle avec le nom boucle explicite
744
+        $c = index_pile($p->id_boucle, $type, $p->boucles);
745 745
 
746
-		if (isset($desc['field']['id_parent'])) {
747
-			$parent = 0; // pour if (!$parent) dans calculer_expose
748
-		} elseif (isset($desc['field']['id_rubrique'])) {
749
-			$parent = index_pile($p->id_boucle, 'id_rubrique', $p->boucles, $b);
750
-		} elseif (isset($desc['field']['id_groupe'])) {
751
-			$parent = index_pile($p->id_boucle, 'id_groupe', $p->boucles, $b);
752
-		} else {
753
-			$parent = "''";
754
-		}
746
+        if (isset($desc['field']['id_parent'])) {
747
+            $parent = 0; // pour if (!$parent) dans calculer_expose
748
+        } elseif (isset($desc['field']['id_rubrique'])) {
749
+            $parent = index_pile($p->id_boucle, 'id_rubrique', $p->boucles, $b);
750
+        } elseif (isset($desc['field']['id_groupe'])) {
751
+            $parent = index_pile($p->id_boucle, 'id_groupe', $p->boucles, $b);
752
+        } else {
753
+            $parent = "''";
754
+        }
755 755
 
756
-		$p->code = "(calcul_exposer($c, '$type', \$Pile[0], $parent, '$key', $connect) ? $on : $off)";
757
-	}
756
+        $p->code = "(calcul_exposer($c, '$type', \$Pile[0], $parent, '$key', $connect) ? $on : $off)";
757
+    }
758 758
 
759
-	$p->interdire_scripts = false;
759
+    $p->interdire_scripts = false;
760 760
 
761
-	return $p;
761
+    return $p;
762 762
 }
763 763
 
764 764
 
@@ -796,47 +796,47 @@  discard block
 block discarded – undo
796 796
  **/
797 797
 function balise_INTRODUCTION_dist($p) {
798 798
 
799
-	$type = $p->type_requete;
800
-
801
-	$_texte = champ_sql('texte', $p);
802
-	$trouver_table = charger_fonction('trouver_table', 'base');
803
-	$desc = $trouver_table(table_objet_sql($type));
804
-	$_descriptif = "''";
805
-	if ($desc and isset($desc['field']['descriptif'])) {
806
-		// notamment articles et rubriques mais aussi tout nouvel objet concerne
807
-		$_descriptif = champ_sql('descriptif', $p);
808
-	}
809
-
810
-	// notamment les articles mais aussi tout nouvel objet concerne
811
-	if ($desc and isset($desc['field']['chapo'])) {
812
-		$_chapo = champ_sql('chapo', $p);
813
-		$_texte = "(strlen($_descriptif))
799
+    $type = $p->type_requete;
800
+
801
+    $_texte = champ_sql('texte', $p);
802
+    $trouver_table = charger_fonction('trouver_table', 'base');
803
+    $desc = $trouver_table(table_objet_sql($type));
804
+    $_descriptif = "''";
805
+    if ($desc and isset($desc['field']['descriptif'])) {
806
+        // notamment articles et rubriques mais aussi tout nouvel objet concerne
807
+        $_descriptif = champ_sql('descriptif', $p);
808
+    }
809
+
810
+    // notamment les articles mais aussi tout nouvel objet concerne
811
+    if ($desc and isset($desc['field']['chapo'])) {
812
+        $_chapo = champ_sql('chapo', $p);
813
+        $_texte = "(strlen($_descriptif))
814 814
 		? ''
815 815
 		: $_chapo . \"\\n\\n\" . $_texte";
816
-	}
816
+    }
817 817
 
818
-	// longueur en parametre, ou valeur par defaut
819
-	$longueur_defaut = objet_info($type, 'introduction_longueur');
820
-	if (!$longueur_defaut) {
821
-		$longueur_defaut = 600;
822
-	}
818
+    // longueur en parametre, ou valeur par defaut
819
+    $longueur_defaut = objet_info($type, 'introduction_longueur');
820
+    if (!$longueur_defaut) {
821
+        $longueur_defaut = 600;
822
+    }
823 823
 
824
-	$_suite = 'null';
825
-	$_longueur = $longueur_defaut;
826
-	if (($v = interprete_argument_balise(1, $p)) !== null) {
827
-		$_longueur = 'is_numeric(' . $v . ')?intval(' . $v . '):' . $longueur_defaut;
828
-		$_suite = '!is_numeric(' . $v . ')?' . $v . ':null';
829
-	}
830
-	if (($v2 = interprete_argument_balise(2, $p)) !== null) {
831
-		$_suite = $v2;
832
-	}
824
+    $_suite = 'null';
825
+    $_longueur = $longueur_defaut;
826
+    if (($v = interprete_argument_balise(1, $p)) !== null) {
827
+        $_longueur = 'is_numeric(' . $v . ')?intval(' . $v . '):' . $longueur_defaut;
828
+        $_suite = '!is_numeric(' . $v . ')?' . $v . ':null';
829
+    }
830
+    if (($v2 = interprete_argument_balise(2, $p)) !== null) {
831
+        $_suite = $v2;
832
+    }
833 833
 
834
-	$f = chercher_filtre('introduction');
835
-	$p->code = "$f($_descriptif, $_texte, $_longueur, \$connect, $_suite)";
834
+    $f = chercher_filtre('introduction');
835
+    $p->code = "$f($_descriptif, $_texte, $_longueur, \$connect, $_suite)";
836 836
 
837
-	#$p->interdire_scripts = true;
838
-	$p->etoile = '*'; // propre est deja fait dans le calcul de l'intro
839
-	return $p;
837
+    #$p->interdire_scripts = true;
838
+    $p->etoile = '*'; // propre est deja fait dans le calcul de l'intro
839
+    return $p;
840 840
 }
841 841
 
842 842
 
@@ -856,15 +856,15 @@  discard block
 block discarded – undo
856 856
  *     Pile complétée par le code à générer
857 857
  **/
858 858
 function balise_LANG_dist($p) {
859
-	$_lang = champ_sql('lang', $p);
860
-	if (!$p->etoile) {
861
-		$p->code = "spip_htmlentities($_lang ? $_lang : \$GLOBALS['spip_lang'])";
862
-	} else {
863
-		$p->code = "spip_htmlentities($_lang)";
864
-	}
865
-	$p->interdire_scripts = false;
859
+    $_lang = champ_sql('lang', $p);
860
+    if (!$p->etoile) {
861
+        $p->code = "spip_htmlentities($_lang ? $_lang : \$GLOBALS['spip_lang'])";
862
+    } else {
863
+        $p->code = "spip_htmlentities($_lang)";
864
+    }
865
+    $p->interdire_scripts = false;
866 866
 
867
-	return $p;
867
+    return $p;
868 868
 }
869 869
 
870 870
 /**
@@ -886,44 +886,44 @@  discard block
 block discarded – undo
886 886
  *     Pile complétée par le code à générer
887 887
  */
888 888
 function balise_LESAUTEURS_dist($p) {
889
-	// Cherche le champ 'lesauteurs' dans la pile
890
-	$_lesauteurs = champ_sql('lesauteurs', $p, false);
891
-
892
-	// Si le champ n'existe pas (cas de spip_articles), on applique
893
-	// le modele lesauteurs.html en passant id_article dans le contexte;
894
-	// dans le cas contraire on prend le champ 'lesauteurs'
895
-	// (cf extension sites/)
896
-	if ($_lesauteurs
897
-		and $_lesauteurs != '@$Pile[0][\'lesauteurs\']'
898
-	) {
899
-		$p->code = "safehtml($_lesauteurs)";
900
-		// $p->interdire_scripts = true;
901
-	} else {
902
-		if (!$p->id_boucle) {
903
-			$connect = '';
904
-			$objet = 'article';
905
-			$id_table_objet = 'id_article';
906
-		} else {
907
-			$b = $p->nom_boucle ? $p->nom_boucle : $p->id_boucle;
908
-			$connect = $p->boucles[$b]->sql_serveur;
909
-			$type_boucle = $p->boucles[$b]->type_requete;
910
-			$objet = objet_type($type_boucle);
911
-			$id_table_objet = id_table_objet($type_boucle);
912
-		}
913
-		$c = memoriser_contexte_compil($p);
914
-
915
-		$p->code = sprintf(CODE_RECUPERER_FOND, "'modeles/lesauteurs'",
916
-			"array('objet'=>'" . $objet .
917
-			"','id_objet' => " . champ_sql($id_table_objet, $p) .
918
-			",'$id_table_objet' => " . champ_sql($id_table_objet, $p) .
919
-			($objet == 'article' ? "" : ",'id_article' => " . champ_sql('id_article', $p)) .
920
-			")",
921
-			"'trim'=>true, 'compil'=>array($c)",
922
-			_q($connect));
923
-		$p->interdire_scripts = false; // securite apposee par recuperer_fond()
924
-	}
925
-
926
-	return $p;
889
+    // Cherche le champ 'lesauteurs' dans la pile
890
+    $_lesauteurs = champ_sql('lesauteurs', $p, false);
891
+
892
+    // Si le champ n'existe pas (cas de spip_articles), on applique
893
+    // le modele lesauteurs.html en passant id_article dans le contexte;
894
+    // dans le cas contraire on prend le champ 'lesauteurs'
895
+    // (cf extension sites/)
896
+    if ($_lesauteurs
897
+        and $_lesauteurs != '@$Pile[0][\'lesauteurs\']'
898
+    ) {
899
+        $p->code = "safehtml($_lesauteurs)";
900
+        // $p->interdire_scripts = true;
901
+    } else {
902
+        if (!$p->id_boucle) {
903
+            $connect = '';
904
+            $objet = 'article';
905
+            $id_table_objet = 'id_article';
906
+        } else {
907
+            $b = $p->nom_boucle ? $p->nom_boucle : $p->id_boucle;
908
+            $connect = $p->boucles[$b]->sql_serveur;
909
+            $type_boucle = $p->boucles[$b]->type_requete;
910
+            $objet = objet_type($type_boucle);
911
+            $id_table_objet = id_table_objet($type_boucle);
912
+        }
913
+        $c = memoriser_contexte_compil($p);
914
+
915
+        $p->code = sprintf(CODE_RECUPERER_FOND, "'modeles/lesauteurs'",
916
+            "array('objet'=>'" . $objet .
917
+            "','id_objet' => " . champ_sql($id_table_objet, $p) .
918
+            ",'$id_table_objet' => " . champ_sql($id_table_objet, $p) .
919
+            ($objet == 'article' ? "" : ",'id_article' => " . champ_sql('id_article', $p)) .
920
+            ")",
921
+            "'trim'=>true, 'compil'=>array($c)",
922
+            _q($connect));
923
+        $p->interdire_scripts = false; // securite apposee par recuperer_fond()
924
+    }
925
+
926
+    return $p;
927 927
 }
928 928
 
929 929
 
@@ -950,75 +950,75 @@  discard block
 block discarded – undo
950 950
  *     Pile complétée par le code à générer
951 951
  */
952 952
 function balise_RANG_dist($p) {
953
-	$b = index_boucle($p);
954
-	if ($b === '') {
955
-		$msg = array(
956
-			'zbug_champ_hors_boucle',
957
-			array('champ' => '#RANG')
958
-		);
959
-		erreur_squelette($msg, $p);
960
-	} else {
961
-		// chercher d'abord un champ sql rang (mais pas dans le env : defaut '' si on trouve pas de champ sql)
962
-		// dans la boucle immediatement englobante uniquement
963
-		// sinon on compose le champ calcule
964
-		$_rang = champ_sql('rang', $p, '', false);
965
-
966
-		// si pas trouve de champ sql rang :
967
-		if (!$_rang or $_rang == "''") {
968
-			$boucle = &$p->boucles[$b];
969
-
970
-			// on gere le cas ou #RANG est une extraction du numero dans le titre
971
-			$trouver_table = charger_fonction('trouver_table', 'base');
972
-			$desc = $trouver_table($boucle->id_table);
973
-			$_titre = ''; # où extraire le numero ?
953
+    $b = index_boucle($p);
954
+    if ($b === '') {
955
+        $msg = array(
956
+            'zbug_champ_hors_boucle',
957
+            array('champ' => '#RANG')
958
+        );
959
+        erreur_squelette($msg, $p);
960
+    } else {
961
+        // chercher d'abord un champ sql rang (mais pas dans le env : defaut '' si on trouve pas de champ sql)
962
+        // dans la boucle immediatement englobante uniquement
963
+        // sinon on compose le champ calcule
964
+        $_rang = champ_sql('rang', $p, '', false);
965
+
966
+        // si pas trouve de champ sql rang :
967
+        if (!$_rang or $_rang == "''") {
968
+            $boucle = &$p->boucles[$b];
969
+
970
+            // on gere le cas ou #RANG est une extraction du numero dans le titre
971
+            $trouver_table = charger_fonction('trouver_table', 'base');
972
+            $desc = $trouver_table($boucle->id_table);
973
+            $_titre = ''; # où extraire le numero ?
974 974
 			
975
-			if (isset($desc['titre'])) {
976
-				$t = $desc['titre'];
977
-				if (
978
-					// Soit on trouve avec la déclaration de la lang AVANT
979
-					preg_match(';(?:lang\s*,)\s*(.*?titre)\s*(,|$);', $t, $m)
980
-					// Soit on prend depuis le début
981
-					or preg_match(';^(.*?titre)\s*(,|$);', $t, $m)
982
-				) {
983
-					$m = preg_replace(',as\s+titre$,i', '', $m[1]);
984
-					$m = trim($m);
985
-					if ($m != "''") {
986
-						if (!preg_match(",\W,", $m)) {
987
-							$m = $boucle->id_table . ".$m";
988
-						}
975
+            if (isset($desc['titre'])) {
976
+                $t = $desc['titre'];
977
+                if (
978
+                    // Soit on trouve avec la déclaration de la lang AVANT
979
+                    preg_match(';(?:lang\s*,)\s*(.*?titre)\s*(,|$);', $t, $m)
980
+                    // Soit on prend depuis le début
981
+                    or preg_match(';^(.*?titre)\s*(,|$);', $t, $m)
982
+                ) {
983
+                    $m = preg_replace(',as\s+titre$,i', '', $m[1]);
984
+                    $m = trim($m);
985
+                    if ($m != "''") {
986
+                        if (!preg_match(",\W,", $m)) {
987
+                            $m = $boucle->id_table . ".$m";
988
+                        }
989 989
 						
990
-						$m .= " AS titre_rang";
991
-
992
-						$boucle->select[] = $m;
993
-						$_titre = '$Pile[$SP][\'titre_rang\']';
994
-					}
995
-				}
996
-			}
997
-
998
-			// si on n'a rien trouvé, on utilise le champ titre classique
999
-			if (!$_titre) {
1000
-				$_titre = champ_sql('titre', $p);
1001
-			}
1002
-
1003
-			// et on recupere aussi les infos de liaison si on est en train d'editer les liens justement
1004
-			// cas des formulaires xxx_lies utilises par #FORMULAIRE_EDITER_LIENS
1005
-			$type_boucle = $boucle->type_requete;
1006
-			$objet = objet_type($type_boucle);
1007
-			$id_table_objet = id_table_objet($type_boucle);
1008
-			$_primary = champ_sql($id_table_objet, $p, '', false);
1009
-			$_env = '$Pile[0]';
1010
-
1011
-			if (!$_titre) {$_titre = "''";}
1012
-			if (!$_primary) {$_primary = "''";}
1013
-			$_rang = "calculer_rang_smart($_titre, '$objet', $_primary, $_env)";
1014
-
1015
-		}
990
+                        $m .= " AS titre_rang";
991
+
992
+                        $boucle->select[] = $m;
993
+                        $_titre = '$Pile[$SP][\'titre_rang\']';
994
+                    }
995
+                }
996
+            }
997
+
998
+            // si on n'a rien trouvé, on utilise le champ titre classique
999
+            if (!$_titre) {
1000
+                $_titre = champ_sql('titre', $p);
1001
+            }
1002
+
1003
+            // et on recupere aussi les infos de liaison si on est en train d'editer les liens justement
1004
+            // cas des formulaires xxx_lies utilises par #FORMULAIRE_EDITER_LIENS
1005
+            $type_boucle = $boucle->type_requete;
1006
+            $objet = objet_type($type_boucle);
1007
+            $id_table_objet = id_table_objet($type_boucle);
1008
+            $_primary = champ_sql($id_table_objet, $p, '', false);
1009
+            $_env = '$Pile[0]';
1010
+
1011
+            if (!$_titre) {$_titre = "''";}
1012
+            if (!$_primary) {$_primary = "''";}
1013
+            $_rang = "calculer_rang_smart($_titre, '$objet', $_primary, $_env)";
1014
+
1015
+        }
1016 1016
 		
1017
-		$p->code = $_rang;
1018
-		$p->interdire_scripts = false;
1019
-	}
1017
+        $p->code = $_rang;
1018
+        $p->interdire_scripts = false;
1019
+    }
1020 1020
 	
1021
-	return $p;
1021
+    return $p;
1022 1022
 }
1023 1023
 
1024 1024
 
@@ -1040,12 +1040,12 @@  discard block
 block discarded – undo
1040 1040
  *     Pile complétée par le code à générer
1041 1041
  **/
1042 1042
 function balise_POPULARITE_dist($p) {
1043
-	$_popularite = champ_sql('popularite', $p);
1044
-	$p->code = "(ceil(min(100, 100 * $_popularite
1043
+    $_popularite = champ_sql('popularite', $p);
1044
+    $p->code = "(ceil(min(100, 100 * $_popularite
1045 1045
 	/ max(1 , 0 + \$GLOBALS['meta']['popularite_max']))))";
1046
-	$p->interdire_scripts = false;
1046
+    $p->interdire_scripts = false;
1047 1047
 
1048
-	return $p;
1048
+    return $p;
1049 1049
 }
1050 1050
 
1051 1051
 /**
@@ -1092,65 +1092,65 @@  discard block
 block discarded – undo
1092 1092
  *     Pile complétée par le code à générer
1093 1093
  */
1094 1094
 function balise_PAGINATION_dist($p, $liste = 'true') {
1095
-	$b = index_boucle_mere($p);
1096
-
1097
-	// s'il n'y a pas de nom de boucle, on ne peut pas paginer
1098
-	if ($b === '') {
1099
-		$msg = array(
1100
-			'zbug_champ_hors_boucle',
1101
-			array('champ' => $liste ? 'PAGINATION' : 'ANCRE_PAGINATION')
1102
-		);
1103
-		erreur_squelette($msg, $p);
1104
-
1105
-		return $p;
1106
-	}
1107
-
1108
-	// s'il n'y a pas de mode_partie, c'est qu'on se trouve
1109
-	// dans un boucle recursive ou qu'on a oublie le critere {pagination}
1110
-	if (!$p->boucles[$b]->mode_partie) {
1111
-		if (!$p->boucles[$b]->table_optionnelle) {
1112
-			$msg = array(
1113
-				'zbug_pagination_sans_critere',
1114
-				array('champ' => '#PAGINATION')
1115
-			);
1116
-			erreur_squelette($msg, $p);
1117
-		}
1118
-
1119
-		return $p;
1120
-	}
1121
-
1122
-	// a priori true
1123
-	// si false, le compilo va bloquer sur des syntaxes avec un filtre sans argument qui suit la balise
1124
-	// si true, les arguments simples (sans truc=chose) vont degager
1125
-	$_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $p->id_boucle, false, false);
1126
-	if (count($_contexte)) {
1127
-		$key = key($_contexte);
1128
-		if (is_numeric($key)) {
1129
-			array_shift($_contexte);
1130
-			$__modele = interprete_argument_balise(1, $p);
1131
-		}
1132
-	}
1133
-
1134
-	if (count($_contexte)) {
1135
-		$code_contexte = implode(',', $_contexte);
1136
-	} else {
1137
-		$code_contexte = '';
1138
-	}
1139
-
1140
-	$connect = $p->boucles[$b]->sql_serveur;
1141
-	$pas = $p->boucles[$b]->total_parties;
1142
-	$f_pagination = chercher_filtre('pagination');
1143
-	$type = $p->boucles[$b]->modificateur['debut_nom'];
1144
-	$modif = ($type[0] !== "'") ? "'debut'.$type"
1145
-		: ("'debut" . substr($type, 1));
1146
-
1147
-	$p->code = sprintf(CODE_PAGINATION, $f_pagination, $b, $type, $modif, $pas, $liste,
1148
-		((isset($__modele) and $__modele) ? $__modele : "''"), _q($connect), $code_contexte);
1149
-
1150
-	$p->boucles[$b]->numrows = true;
1151
-	$p->interdire_scripts = false;
1152
-
1153
-	return $p;
1095
+    $b = index_boucle_mere($p);
1096
+
1097
+    // s'il n'y a pas de nom de boucle, on ne peut pas paginer
1098
+    if ($b === '') {
1099
+        $msg = array(
1100
+            'zbug_champ_hors_boucle',
1101
+            array('champ' => $liste ? 'PAGINATION' : 'ANCRE_PAGINATION')
1102
+        );
1103
+        erreur_squelette($msg, $p);
1104
+
1105
+        return $p;
1106
+    }
1107
+
1108
+    // s'il n'y a pas de mode_partie, c'est qu'on se trouve
1109
+    // dans un boucle recursive ou qu'on a oublie le critere {pagination}
1110
+    if (!$p->boucles[$b]->mode_partie) {
1111
+        if (!$p->boucles[$b]->table_optionnelle) {
1112
+            $msg = array(
1113
+                'zbug_pagination_sans_critere',
1114
+                array('champ' => '#PAGINATION')
1115
+            );
1116
+            erreur_squelette($msg, $p);
1117
+        }
1118
+
1119
+        return $p;
1120
+    }
1121
+
1122
+    // a priori true
1123
+    // si false, le compilo va bloquer sur des syntaxes avec un filtre sans argument qui suit la balise
1124
+    // si true, les arguments simples (sans truc=chose) vont degager
1125
+    $_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $p->id_boucle, false, false);
1126
+    if (count($_contexte)) {
1127
+        $key = key($_contexte);
1128
+        if (is_numeric($key)) {
1129
+            array_shift($_contexte);
1130
+            $__modele = interprete_argument_balise(1, $p);
1131
+        }
1132
+    }
1133
+
1134
+    if (count($_contexte)) {
1135
+        $code_contexte = implode(',', $_contexte);
1136
+    } else {
1137
+        $code_contexte = '';
1138
+    }
1139
+
1140
+    $connect = $p->boucles[$b]->sql_serveur;
1141
+    $pas = $p->boucles[$b]->total_parties;
1142
+    $f_pagination = chercher_filtre('pagination');
1143
+    $type = $p->boucles[$b]->modificateur['debut_nom'];
1144
+    $modif = ($type[0] !== "'") ? "'debut'.$type"
1145
+        : ("'debut" . substr($type, 1));
1146
+
1147
+    $p->code = sprintf(CODE_PAGINATION, $f_pagination, $b, $type, $modif, $pas, $liste,
1148
+        ((isset($__modele) and $__modele) ? $__modele : "''"), _q($connect), $code_contexte);
1149
+
1150
+    $p->boucles[$b]->numrows = true;
1151
+    $p->interdire_scripts = false;
1152
+
1153
+    return $p;
1154 1154
 }
1155 1155
 
1156 1156
 
@@ -1177,11 +1177,11 @@  discard block
 block discarded – undo
1177 1177
  *     Pile complétée par le code à générer
1178 1178
  **/
1179 1179
 function balise_ANCRE_PAGINATION_dist($p) {
1180
-	if ($f = charger_fonction('PAGINATION', 'balise', true)) {
1181
-		return $f($p, $liste = 'false');
1182
-	} else {
1183
-		return null;
1184
-	} // ou une erreur ?
1180
+    if ($f = charger_fonction('PAGINATION', 'balise', true)) {
1181
+        return $f($p, $liste = 'false');
1182
+    } else {
1183
+        return null;
1184
+    } // ou une erreur ?
1185 1185
 }
1186 1186
 
1187 1187
 
@@ -1202,18 +1202,18 @@  discard block
 block discarded – undo
1202 1202
  *     Pile complétée par le code à générer
1203 1203
  **/
1204 1204
 function balise_GRAND_TOTAL_dist($p) {
1205
-	$b = index_boucle_mere($p);
1206
-	if ($b === '') {
1207
-		$msg = array('zbug_champ_hors_boucle', array('champ' => zbug_presenter_champ($p)));
1208
-		erreur_squelette($msg, $p);
1209
-	} else {
1210
-		$p->code = "(isset(\$Numrows['$b']['grand_total'])
1205
+    $b = index_boucle_mere($p);
1206
+    if ($b === '') {
1207
+        $msg = array('zbug_champ_hors_boucle', array('champ' => zbug_presenter_champ($p)));
1208
+        erreur_squelette($msg, $p);
1209
+    } else {
1210
+        $p->code = "(isset(\$Numrows['$b']['grand_total'])
1211 1211
 			? \$Numrows['$b']['grand_total'] : \$Numrows['$b']['total'])";
1212
-		$p->boucles[$b]->numrows = true;
1213
-		$p->interdire_scripts = false;
1214
-	}
1212
+        $p->boucles[$b]->numrows = true;
1213
+        $p->interdire_scripts = false;
1214
+    }
1215 1215
 
1216
-	return $p;
1216
+    return $p;
1217 1217
 }
1218 1218
 
1219 1219
 
@@ -1241,10 +1241,10 @@  discard block
 block discarded – undo
1241 1241
  *     Pile complétée par le code à générer
1242 1242
  **/
1243 1243
 function balise_SELF_dist($p) {
1244
-	$p->code = 'self()';
1245
-	$p->interdire_scripts = false;
1244
+    $p->code = 'self()';
1245
+    $p->interdire_scripts = false;
1246 1246
 
1247
-	return $p;
1247
+    return $p;
1248 1248
 }
1249 1249
 
1250 1250
 
@@ -1271,17 +1271,17 @@  discard block
 block discarded – undo
1271 1271
  *     Pile complétée par le code à générer
1272 1272
  **/
1273 1273
 function balise_CHEMIN_dist($p) {
1274
-	$arg = interprete_argument_balise(1, $p);
1275
-	if (!$arg) {
1276
-		$msg = array('zbug_balise_sans_argument', array('balise' => ' CHEMIN'));
1277
-		erreur_squelette($msg, $p);
1278
-	} else {
1279
-		$p->code = 'find_in_path(' . $arg . ')';
1280
-	}
1274
+    $arg = interprete_argument_balise(1, $p);
1275
+    if (!$arg) {
1276
+        $msg = array('zbug_balise_sans_argument', array('balise' => ' CHEMIN'));
1277
+        erreur_squelette($msg, $p);
1278
+    } else {
1279
+        $p->code = 'find_in_path(' . $arg . ')';
1280
+    }
1281 1281
 
1282
-	$p->interdire_scripts = false;
1282
+    $p->interdire_scripts = false;
1283 1283
 
1284
-	return $p;
1284
+    return $p;
1285 1285
 }
1286 1286
 
1287 1287
 /**
@@ -1306,16 +1306,16 @@  discard block
 block discarded – undo
1306 1306
  *     Pile complétée par le code à générer
1307 1307
  **/
1308 1308
 function balise_CHEMIN_IMAGE_dist($p) {
1309
-	$arg = interprete_argument_balise(1, $p);
1310
-	if (!$arg) {
1311
-		$msg = array('zbug_balise_sans_argument', array('balise' => ' CHEMIN_IMAGE'));
1312
-		erreur_squelette($msg, $p);
1313
-	} else {
1314
-		$p->code = 'chemin_image(' . $arg . ')';
1315
-	}
1309
+    $arg = interprete_argument_balise(1, $p);
1310
+    if (!$arg) {
1311
+        $msg = array('zbug_balise_sans_argument', array('balise' => ' CHEMIN_IMAGE'));
1312
+        erreur_squelette($msg, $p);
1313
+    } else {
1314
+        $p->code = 'chemin_image(' . $arg . ')';
1315
+    }
1316 1316
 
1317
-	#$p->interdire_scripts = true;
1318
-	return $p;
1317
+    #$p->interdire_scripts = true;
1318
+    return $p;
1319 1319
 }
1320 1320
 
1321 1321
 
@@ -1353,36 +1353,36 @@  discard block
 block discarded – undo
1353 1353
  **/
1354 1354
 function balise_ENV_dist($p, $src = null) {
1355 1355
 
1356
-	// cle du tableau desiree
1357
-	$_nom = interprete_argument_balise(1, $p);
1358
-	// valeur par defaut
1359
-	$_sinon = interprete_argument_balise(2, $p);
1356
+    // cle du tableau desiree
1357
+    $_nom = interprete_argument_balise(1, $p);
1358
+    // valeur par defaut
1359
+    $_sinon = interprete_argument_balise(2, $p);
1360 1360
 
1361
-	// $src est un tableau de donnees sources eventuellement transmis
1362
-	// en absence, on utilise l'environnement du squelette $Pile[0]
1361
+    // $src est un tableau de donnees sources eventuellement transmis
1362
+    // en absence, on utilise l'environnement du squelette $Pile[0]
1363 1363
 
1364
-	if (!$_nom) {
1365
-		// cas de #ENV sans argument : on retourne le serialize() du tableau
1366
-		// une belle fonction [(#ENV|affiche_env)] serait pratique
1367
-		if ($src) {
1368
-			$p->code = '(is_array($a = (' . $src . ')) ? serialize($a) : "")';
1369
-		} else {
1370
-			$p->code = '@serialize($Pile[0])';
1371
-		}
1372
-	} else {
1373
-		if (!$src) {
1374
-			$src = '@$Pile[0]';
1375
-		}
1376
-		if ($_sinon) {
1377
-			$p->code = "sinon(table_valeur($src, (string)$_nom, null), $_sinon)";
1378
-		} else {
1379
-			$p->code = "table_valeur($src, (string)$_nom, null)";
1380
-		}
1381
-	}
1364
+    if (!$_nom) {
1365
+        // cas de #ENV sans argument : on retourne le serialize() du tableau
1366
+        // une belle fonction [(#ENV|affiche_env)] serait pratique
1367
+        if ($src) {
1368
+            $p->code = '(is_array($a = (' . $src . ')) ? serialize($a) : "")';
1369
+        } else {
1370
+            $p->code = '@serialize($Pile[0])';
1371
+        }
1372
+    } else {
1373
+        if (!$src) {
1374
+            $src = '@$Pile[0]';
1375
+        }
1376
+        if ($_sinon) {
1377
+            $p->code = "sinon(table_valeur($src, (string)$_nom, null), $_sinon)";
1378
+        } else {
1379
+            $p->code = "table_valeur($src, (string)$_nom, null)";
1380
+        }
1381
+    }
1382 1382
 
1383
-	#$p->interdire_scripts = true;
1383
+    #$p->interdire_scripts = true;
1384 1384
 
1385
-	return $p;
1385
+    return $p;
1386 1386
 }
1387 1387
 
1388 1388
 /**
@@ -1412,16 +1412,16 @@  discard block
 block discarded – undo
1412 1412
  *     Pile completée du code PHP d'exécution de la balise
1413 1413
  */
1414 1414
 function balise_CONFIG_dist($p) {
1415
-	if (!$arg = interprete_argument_balise(1, $p)) {
1416
-		$arg = "''";
1417
-	}
1418
-	$_sinon = interprete_argument_balise(2, $p);
1419
-	$_unserialize = sinon(interprete_argument_balise(3, $p), "false");
1415
+    if (!$arg = interprete_argument_balise(1, $p)) {
1416
+        $arg = "''";
1417
+    }
1418
+    $_sinon = interprete_argument_balise(2, $p);
1419
+    $_unserialize = sinon(interprete_argument_balise(3, $p), "false");
1420 1420
 
1421
-	$p->code = '(include_spip(\'inc/config\')?lire_config(' . $arg . ',' .
1422
-		($_sinon && $_sinon != "''" ? $_sinon : 'null') . ',' . $_unserialize . "):'')";
1421
+    $p->code = '(include_spip(\'inc/config\')?lire_config(' . $arg . ',' .
1422
+        ($_sinon && $_sinon != "''" ? $_sinon : 'null') . ',' . $_unserialize . "):'')";
1423 1423
 
1424
-	return $p;
1424
+    return $p;
1425 1425
 }
1426 1426
 
1427 1427
 
@@ -1444,10 +1444,10 @@  discard block
 block discarded – undo
1444 1444
  *     Pile completée du code PHP d'exécution de la balise
1445 1445
  */
1446 1446
 function balise_CONNECT_dist($p) {
1447
-	$p->code = '($connect ? $connect : NULL)';
1448
-	$p->interdire_scripts = false;
1447
+    $p->code = '($connect ? $connect : NULL)';
1448
+    $p->interdire_scripts = false;
1449 1449
 
1450
-	return $p;
1450
+    return $p;
1451 1451
 }
1452 1452
 
1453 1453
 
@@ -1475,15 +1475,15 @@  discard block
 block discarded – undo
1475 1475
  *     Pile completée du code PHP d'exécution de la balise
1476 1476
  **/
1477 1477
 function balise_SESSION_dist($p) {
1478
-	$p->descr['session'] = true;
1478
+    $p->descr['session'] = true;
1479 1479
 
1480
-	$f = function_exists('balise_ENV')
1481
-		? 'balise_ENV'
1482
-		: 'balise_ENV_dist';
1480
+    $f = function_exists('balise_ENV')
1481
+        ? 'balise_ENV'
1482
+        : 'balise_ENV_dist';
1483 1483
 
1484
-	$p = $f($p, '$GLOBALS["visiteur_session"]');
1484
+    $p = $f($p, '$GLOBALS["visiteur_session"]');
1485 1485
 
1486
-	return $p;
1486
+    return $p;
1487 1487
 }
1488 1488
 
1489 1489
 
@@ -1506,18 +1506,18 @@  discard block
 block discarded – undo
1506 1506
  *     Pile completée du code PHP d'exécution de la balise
1507 1507
  **/
1508 1508
 function balise_SESSION_SET_dist($p) {
1509
-	$_nom = interprete_argument_balise(1, $p);
1510
-	$_val = interprete_argument_balise(2, $p);
1511
-	if (!$_nom or !$_val) {
1512
-		$err_b_s_a = array('zbug_balise_sans_argument', array('balise' => 'SESSION_SET'));
1513
-		erreur_squelette($err_b_s_a, $p);
1514
-	} else {
1515
-		$p->code = '(include_spip("inc/session") AND session_set(' . $_nom . ',' . $_val . '))';
1516
-	}
1509
+    $_nom = interprete_argument_balise(1, $p);
1510
+    $_val = interprete_argument_balise(2, $p);
1511
+    if (!$_nom or !$_val) {
1512
+        $err_b_s_a = array('zbug_balise_sans_argument', array('balise' => 'SESSION_SET'));
1513
+        erreur_squelette($err_b_s_a, $p);
1514
+    } else {
1515
+        $p->code = '(include_spip("inc/session") AND session_set(' . $_nom . ',' . $_val . '))';
1516
+    }
1517 1517
 
1518
-	$p->interdire_scripts = false;
1518
+    $p->interdire_scripts = false;
1519 1519
 
1520
-	return $p;
1520
+    return $p;
1521 1521
 }
1522 1522
 
1523 1523
 
@@ -1548,25 +1548,25 @@  discard block
 block discarded – undo
1548 1548
  *     Pile completée du code PHP d'exécution de la balise
1549 1549
  **/
1550 1550
 function balise_EVAL_dist($p) {
1551
-	$php = interprete_argument_balise(1, $p);
1552
-	if ($php) {
1553
-		# optimisation sur les #EVAL{une expression sans #BALISE}
1554
-		# attention au commentaire "// x signes" qui precede
1555
-		if (preg_match(",^([[:space:]]*//[^\n]*\n)'([^']+)'$,ms",
1556
-			$php, $r)) {
1557
-			$p->code = /* $r[1]. */
1558
-				'(' . $r[2] . ')';
1559
-		} else {
1560
-			$p->code = "eval('return '.$php.';')";
1561
-		}
1562
-	} else {
1563
-		$msg = array('zbug_balise_sans_argument', array('balise' => ' EVAL'));
1564
-		erreur_squelette($msg, $p);
1565
-	}
1551
+    $php = interprete_argument_balise(1, $p);
1552
+    if ($php) {
1553
+        # optimisation sur les #EVAL{une expression sans #BALISE}
1554
+        # attention au commentaire "// x signes" qui precede
1555
+        if (preg_match(",^([[:space:]]*//[^\n]*\n)'([^']+)'$,ms",
1556
+            $php, $r)) {
1557
+            $p->code = /* $r[1]. */
1558
+                '(' . $r[2] . ')';
1559
+        } else {
1560
+            $p->code = "eval('return '.$php.';')";
1561
+        }
1562
+    } else {
1563
+        $msg = array('zbug_balise_sans_argument', array('balise' => ' EVAL'));
1564
+        erreur_squelette($msg, $p);
1565
+    }
1566 1566
 
1567
-	#$p->interdire_scripts = true;
1567
+    #$p->interdire_scripts = true;
1568 1568
 
1569
-	return $p;
1569
+    return $p;
1570 1570
 }
1571 1571
 
1572 1572
 
@@ -1596,18 +1596,18 @@  discard block
 block discarded – undo
1596 1596
  **/
1597 1597
 function balise_CHAMP_SQL_dist($p) {
1598 1598
 
1599
-	if ($p->param
1600
-		and isset($p->param[0][1][0])
1601
-		and $champ = ($p->param[0][1][0]->texte)
1602
-	) {
1603
-		$p->code = champ_sql($champ, $p);
1604
-	} else {
1605
-		$err_b_s_a = array('zbug_balise_sans_argument', array('balise' => ' CHAMP_SQL'));
1606
-		erreur_squelette($err_b_s_a, $p);
1607
-	}
1599
+    if ($p->param
1600
+        and isset($p->param[0][1][0])
1601
+        and $champ = ($p->param[0][1][0]->texte)
1602
+    ) {
1603
+        $p->code = champ_sql($champ, $p);
1604
+    } else {
1605
+        $err_b_s_a = array('zbug_balise_sans_argument', array('balise' => ' CHAMP_SQL'));
1606
+        erreur_squelette($err_b_s_a, $p);
1607
+    }
1608 1608
 
1609
-	#$p->interdire_scripts = true;
1610
-	return $p;
1609
+    #$p->interdire_scripts = true;
1610
+    return $p;
1611 1611
 }
1612 1612
 
1613 1613
 /**
@@ -1633,13 +1633,13 @@  discard block
 block discarded – undo
1633 1633
  *     Pile complétée par le code à générer
1634 1634
  **/
1635 1635
 function balise_VAL_dist($p) {
1636
-	$p->code = interprete_argument_balise(1, $p);
1637
-	if (!strlen($p->code)) {
1638
-		$p->code = "''";
1639
-	}
1640
-	$p->interdire_scripts = false;
1636
+    $p->code = interprete_argument_balise(1, $p);
1637
+    if (!strlen($p->code)) {
1638
+        $p->code = "''";
1639
+    }
1640
+    $p->interdire_scripts = false;
1641 1641
 
1642
-	return $p;
1642
+    return $p;
1643 1643
 }
1644 1644
 
1645 1645
 /**
@@ -1685,10 +1685,10 @@  discard block
 block discarded – undo
1685 1685
  *     Pile complétée par le code à générer
1686 1686
  **/
1687 1687
 function balise_REM_dist($p) {
1688
-	$p->code = "''";
1689
-	$p->interdire_scripts = false;
1688
+    $p->code = "''";
1689
+    $p->interdire_scripts = false;
1690 1690
 
1691
-	return $p;
1691
+    return $p;
1692 1692
 }
1693 1693
 
1694 1694
 
@@ -1712,18 +1712,18 @@  discard block
 block discarded – undo
1712 1712
  **/
1713 1713
 function balise_HTTP_HEADER_dist($p) {
1714 1714
 
1715
-	$header = interprete_argument_balise(1, $p);
1716
-	if (!$header) {
1717
-		$err_b_s_a = array('zbug_balise_sans_argument', array('balise' => 'HTTP_HEADER'));
1718
-		erreur_squelette($err_b_s_a, $p);
1719
-	} else {
1720
-		$p->code = "'<'.'?php header(' . _q("
1721
-			. $header
1722
-			. ") . '); ?'.'>'";
1723
-	}
1724
-	$p->interdire_scripts = false;
1715
+    $header = interprete_argument_balise(1, $p);
1716
+    if (!$header) {
1717
+        $err_b_s_a = array('zbug_balise_sans_argument', array('balise' => 'HTTP_HEADER'));
1718
+        erreur_squelette($err_b_s_a, $p);
1719
+    } else {
1720
+        $p->code = "'<'.'?php header(' . _q("
1721
+            . $header
1722
+            . ") . '); ?'.'>'";
1723
+    }
1724
+    $p->interdire_scripts = false;
1725 1725
 
1726
-	return $p;
1726
+    return $p;
1727 1727
 }
1728 1728
 
1729 1729
 
@@ -1748,20 +1748,20 @@  discard block
 block discarded – undo
1748 1748
  *     Pile complétée par le code à générer
1749 1749
  **/
1750 1750
 function balise_FILTRE_dist($p) {
1751
-	if ($p->param) {
1752
-		$args = array();
1753
-		foreach ($p->param as $i => $ignore) {
1754
-			$args[] = interprete_argument_balise($i + 1, $p);
1755
-		}
1756
-		$p->code = "'<' . '"
1757
-			. '?php header("X-Spip-Filtre: \'.'
1758
-			. join('.\'|\'.', $args)
1759
-			. " . '\"); ?'.'>'";
1751
+    if ($p->param) {
1752
+        $args = array();
1753
+        foreach ($p->param as $i => $ignore) {
1754
+            $args[] = interprete_argument_balise($i + 1, $p);
1755
+        }
1756
+        $p->code = "'<' . '"
1757
+            . '?php header("X-Spip-Filtre: \'.'
1758
+            . join('.\'|\'.', $args)
1759
+            . " . '\"); ?'.'>'";
1760 1760
 
1761
-		$p->interdire_scripts = false;
1761
+        $p->interdire_scripts = false;
1762 1762
 
1763
-		return $p;
1764
-	}
1763
+        return $p;
1764
+    }
1765 1765
 }
1766 1766
 
1767 1767
 
@@ -1797,53 +1797,53 @@  discard block
 block discarded – undo
1797 1797
  **/
1798 1798
 function balise_CACHE_dist($p) {
1799 1799
 
1800
-	if ($p->param) {
1801
-		$duree = valeur_numerique($p->param[0][1][0]->texte);
1802
-
1803
-		// noter la duree du cache dans un entete proprietaire
1804
-
1805
-		$code = "'<'.'" . '?php header("X-Spip-Cache: '
1806
-			. $duree
1807
-			. '"); ?' . "'.'>'";
1808
-
1809
-		// Remplir le header Cache-Control
1810
-		// cas #CACHE{0}
1811
-		if ($duree == 0) {
1812
-			$code .= ".'<'.'"
1813
-				. '?php header("Cache-Control: no-cache, must-revalidate"); ?'
1814
-				. "'.'><'.'"
1815
-				. '?php header("Pragma: no-cache"); ?'
1816
-				. "'.'>'";
1817
-		}
1818
-
1819
-		// recuperer les parametres suivants
1820
-		$i = 1;
1821
-		while (isset($p->param[0][++$i])) {
1822
-			$pa = ($p->param[0][$i][0]->texte);
1823
-
1824
-			if ($pa == 'cache-client'
1825
-				and $duree > 0
1826
-			) {
1827
-				$code .= ".'<'.'" . '?php header("Cache-Control: max-age='
1828
-					. $duree
1829
-					. '"); ?' . "'.'>'";
1830
-				// il semble logique, si on cache-client, de ne pas invalider
1831
-				$pa = 'statique';
1832
-			}
1833
-
1834
-			if ($pa == 'statique'
1835
-				and $duree > 0
1836
-			) {
1837
-				$code .= ".'<'.'" . '?php header("X-Spip-Statique: oui"); ?' . "'.'>'";
1838
-			}
1839
-		}
1840
-	} else {
1841
-		$code = "''";
1842
-	}
1843
-	$p->code = $code;
1844
-	$p->interdire_scripts = false;
1845
-
1846
-	return $p;
1800
+    if ($p->param) {
1801
+        $duree = valeur_numerique($p->param[0][1][0]->texte);
1802
+
1803
+        // noter la duree du cache dans un entete proprietaire
1804
+
1805
+        $code = "'<'.'" . '?php header("X-Spip-Cache: '
1806
+            . $duree
1807
+            . '"); ?' . "'.'>'";
1808
+
1809
+        // Remplir le header Cache-Control
1810
+        // cas #CACHE{0}
1811
+        if ($duree == 0) {
1812
+            $code .= ".'<'.'"
1813
+                . '?php header("Cache-Control: no-cache, must-revalidate"); ?'
1814
+                . "'.'><'.'"
1815
+                . '?php header("Pragma: no-cache"); ?'
1816
+                . "'.'>'";
1817
+        }
1818
+
1819
+        // recuperer les parametres suivants
1820
+        $i = 1;
1821
+        while (isset($p->param[0][++$i])) {
1822
+            $pa = ($p->param[0][$i][0]->texte);
1823
+
1824
+            if ($pa == 'cache-client'
1825
+                and $duree > 0
1826
+            ) {
1827
+                $code .= ".'<'.'" . '?php header("Cache-Control: max-age='
1828
+                    . $duree
1829
+                    . '"); ?' . "'.'>'";
1830
+                // il semble logique, si on cache-client, de ne pas invalider
1831
+                $pa = 'statique';
1832
+            }
1833
+
1834
+            if ($pa == 'statique'
1835
+                and $duree > 0
1836
+            ) {
1837
+                $code .= ".'<'.'" . '?php header("X-Spip-Statique: oui"); ?' . "'.'>'";
1838
+            }
1839
+        }
1840
+    } else {
1841
+        $code = "''";
1842
+    }
1843
+    $p->code = $code;
1844
+    $p->interdire_scripts = false;
1845
+
1846
+    return $p;
1847 1847
 }
1848 1848
 
1849 1849
 
@@ -1875,13 +1875,13 @@  discard block
 block discarded – undo
1875 1875
  *     Pile complétée par le code à générer
1876 1876
  */
1877 1877
 function balise_INSERT_HEAD_dist($p) {
1878
-	$p->code = "'<'.'"
1879
-		. '?php header("X-Spip-Filtre: insert_head_css_conditionnel"); ?'
1880
-		. "'.'>'";
1881
-	$p->code .= ". pipeline('insert_head','<!-- insert_head -->')";
1882
-	$p->interdire_scripts = false;
1878
+    $p->code = "'<'.'"
1879
+        . '?php header("X-Spip-Filtre: insert_head_css_conditionnel"); ?'
1880
+        . "'.'>'";
1881
+    $p->code .= ". pipeline('insert_head','<!-- insert_head -->')";
1882
+    $p->interdire_scripts = false;
1883 1883
 
1884
-	return $p;
1884
+    return $p;
1885 1885
 }
1886 1886
 
1887 1887
 /**
@@ -1899,10 +1899,10 @@  discard block
 block discarded – undo
1899 1899
  *     Pile complétée par le code à générer
1900 1900
  */
1901 1901
 function balise_INSERT_HEAD_CSS_dist($p) {
1902
-	$p->code = "pipeline('insert_head_css','<!-- insert_head_css -->')";
1903
-	$p->interdire_scripts = false;
1902
+    $p->code = "pipeline('insert_head_css','<!-- insert_head_css -->')";
1903
+    $p->interdire_scripts = false;
1904 1904
 
1905
-	return $p;
1905
+    return $p;
1906 1906
 }
1907 1907
 
1908 1908
 /**
@@ -1917,11 +1917,11 @@  discard block
 block discarded – undo
1917 1917
  *     Pile complétée par le code à générer
1918 1918
  **/
1919 1919
 function balise_INCLUDE_dist($p) {
1920
-	if (function_exists('balise_INCLURE')) {
1921
-		return balise_INCLURE($p);
1922
-	} else {
1923
-		return balise_INCLURE_dist($p);
1924
-	}
1920
+    if (function_exists('balise_INCLURE')) {
1921
+        return balise_INCLURE($p);
1922
+    } else {
1923
+        return balise_INCLURE_dist($p);
1924
+    }
1925 1925
 }
1926 1926
 
1927 1927
 /**
@@ -1955,68 +1955,68 @@  discard block
 block discarded – undo
1955 1955
  *     Pile complétée par le code à générer
1956 1956
  **/
1957 1957
 function balise_INCLURE_dist($p) {
1958
-	$id_boucle = $p->id_boucle;
1959
-	// la lang n'est pas passe de facon automatique par argumenter
1960
-	// mais le sera pas recuperer_fond, sauf si etoile=>true est passe
1961
-	// en option
1962
-
1963
-	$_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $id_boucle, false, false);
1964
-
1965
-	// erreur de syntaxe = fond absent
1966
-	// (2 messages d'erreur SPIP pour le prix d'un, mais pas d'erreur PHP
1967
-	if (!$_contexte) {
1968
-		$contexte = array();
1969
-	}
1970
-
1971
-	if (isset($_contexte['fond'])) {
1972
-
1973
-		$f = $_contexte['fond'];
1974
-		// toujours vrai :
1975
-		if (preg_match('/^.fond.\s*=>(.*)$/s', $f, $r)) {
1976
-			$f = $r[1];
1977
-			unset($_contexte['fond']);
1978
-		} else {
1979
-			spip_log("compilation de #INCLURE a revoir");
1980
-		}
1981
-
1982
-		// #INCLURE{doublons}
1983
-		if (isset($_contexte['doublons'])) {
1984
-			$_contexte['doublons'] = "'doublons' => \$doublons";
1985
-		}
1986
-
1987
-		// Critere d'inclusion {env} (et {self} pour compatibilite ascendante)
1988
-		$flag_env = false;
1989
-		if (isset($_contexte['env']) or isset($_contexte['self'])) {
1990
-			$flag_env = true;
1991
-			unset($_contexte['env']);
1992
-		}
1993
-
1994
-		$_options = array();
1995
-		if (isset($_contexte['ajax'])) {
1996
-			$_options[] = preg_replace(",=>(.*)$,ims", '=> ($v=(\\1))?$v:true', $_contexte['ajax']);
1997
-			unset($_contexte['ajax']);
1998
-		}
1999
-		if ($p->etoile) {
2000
-			$_options[] = "'etoile'=>true";
2001
-		}
2002
-		$_options[] = "'compil'=>array(" . memoriser_contexte_compil($p) . ")";
2003
-
2004
-		$_l = 'array(' . join(",\n\t", $_contexte) . ')';
2005
-		if ($flag_env) {
2006
-			$_l = "array_merge(\$Pile[0],$_l)";
2007
-		}
2008
-
2009
-		$p->code = sprintf(CODE_RECUPERER_FOND, $f, $_l, join(',', $_options), "_request('connect')");
2010
-
2011
-	} elseif (!isset($_contexte[1])) {
2012
-		$msg = array('zbug_balise_sans_argument', array('balise' => ' INCLURE'));
2013
-		erreur_squelette($msg, $p);
2014
-	} else {
2015
-		$p->code = 'charge_scripts(' . $_contexte[1] . ',false)';
2016
-	}
2017
-
2018
-	$p->interdire_scripts = false; // la securite est assuree par recuperer_fond
2019
-	return $p;
1958
+    $id_boucle = $p->id_boucle;
1959
+    // la lang n'est pas passe de facon automatique par argumenter
1960
+    // mais le sera pas recuperer_fond, sauf si etoile=>true est passe
1961
+    // en option
1962
+
1963
+    $_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $id_boucle, false, false);
1964
+
1965
+    // erreur de syntaxe = fond absent
1966
+    // (2 messages d'erreur SPIP pour le prix d'un, mais pas d'erreur PHP
1967
+    if (!$_contexte) {
1968
+        $contexte = array();
1969
+    }
1970
+
1971
+    if (isset($_contexte['fond'])) {
1972
+
1973
+        $f = $_contexte['fond'];
1974
+        // toujours vrai :
1975
+        if (preg_match('/^.fond.\s*=>(.*)$/s', $f, $r)) {
1976
+            $f = $r[1];
1977
+            unset($_contexte['fond']);
1978
+        } else {
1979
+            spip_log("compilation de #INCLURE a revoir");
1980
+        }
1981
+
1982
+        // #INCLURE{doublons}
1983
+        if (isset($_contexte['doublons'])) {
1984
+            $_contexte['doublons'] = "'doublons' => \$doublons";
1985
+        }
1986
+
1987
+        // Critere d'inclusion {env} (et {self} pour compatibilite ascendante)
1988
+        $flag_env = false;
1989
+        if (isset($_contexte['env']) or isset($_contexte['self'])) {
1990
+            $flag_env = true;
1991
+            unset($_contexte['env']);
1992
+        }
1993
+
1994
+        $_options = array();
1995
+        if (isset($_contexte['ajax'])) {
1996
+            $_options[] = preg_replace(",=>(.*)$,ims", '=> ($v=(\\1))?$v:true', $_contexte['ajax']);
1997
+            unset($_contexte['ajax']);
1998
+        }
1999
+        if ($p->etoile) {
2000
+            $_options[] = "'etoile'=>true";
2001
+        }
2002
+        $_options[] = "'compil'=>array(" . memoriser_contexte_compil($p) . ")";
2003
+
2004
+        $_l = 'array(' . join(",\n\t", $_contexte) . ')';
2005
+        if ($flag_env) {
2006
+            $_l = "array_merge(\$Pile[0],$_l)";
2007
+        }
2008
+
2009
+        $p->code = sprintf(CODE_RECUPERER_FOND, $f, $_l, join(',', $_options), "_request('connect')");
2010
+
2011
+    } elseif (!isset($_contexte[1])) {
2012
+        $msg = array('zbug_balise_sans_argument', array('balise' => ' INCLURE'));
2013
+        erreur_squelette($msg, $p);
2014
+    } else {
2015
+        $p->code = 'charge_scripts(' . $_contexte[1] . ',false)';
2016
+    }
2017
+
2018
+    $p->interdire_scripts = false; // la securite est assuree par recuperer_fond
2019
+    return $p;
2020 2020
 }
2021 2021
 
2022 2022
 
@@ -2044,69 +2044,69 @@  discard block
 block discarded – undo
2044 2044
  **/
2045 2045
 function balise_MODELE_dist($p) {
2046 2046
 
2047
-	$_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $p->id_boucle, false);
2048
-
2049
-	// erreur de syntaxe = fond absent
2050
-	// (2 messages d'erreur SPIP pour le prix d'un, mais pas d'erreur PHP
2051
-	if (!$_contexte) {
2052
-		$_contexte = array();
2053
-	}
2054
-
2055
-	if (!isset($_contexte[1])) {
2056
-		$msg = array('zbug_balise_sans_argument', array('balise' => ' MODELE'));
2057
-		erreur_squelette($msg, $p);
2058
-	} else {
2059
-		$nom = $_contexte[1];
2060
-		unset($_contexte[1]);
2061
-
2062
-		if (preg_match("/^\s*'[^']*'/s", $nom)) {
2063
-			$nom = "'modeles/" . substr($nom, 1);
2064
-		} else {
2065
-			$nom = "'modeles/' . $nom";
2066
-		}
2067
-
2068
-		$flag_env = false;
2069
-		if (isset($_contexte['env'])) {
2070
-			$flag_env = true;
2071
-			unset($_contexte['env']);
2072
-		}
2073
-
2074
-		// Incoherence dans la syntaxe du contexte. A revoir.
2075
-		// Reserver la cle primaire de la boucle courante si elle existe
2076
-		if (isset($p->boucles[$p->id_boucle]->primary)) {
2077
-			$primary = $p->boucles[$p->id_boucle]->primary;
2078
-			if (!strpos($primary, ',')) {
2079
-				$id = champ_sql($primary, $p);
2080
-				$_contexte[] = "'$primary'=>" . $id;
2081
-				$_contexte[] = "'id'=>" . $id;
2082
-			}
2083
-		}
2084
-		$_contexte[] = "'recurs'=>(++\$recurs)";
2085
-		$connect = '';
2086
-		if (isset($p->boucles[$p->id_boucle])) {
2087
-			$connect = $p->boucles[$p->id_boucle]->sql_serveur;
2088
-		}
2089
-
2090
-		$_options = memoriser_contexte_compil($p);
2091
-		$_options = "'compil'=>array($_options), 'trim'=>true";
2092
-		if (isset($_contexte['ajax'])) {
2093
-			$_options .= ", " . preg_replace(",=>(.*)$,ims", '=> ($v=(\\1))?$v:true', $_contexte['ajax']);
2094
-			unset($_contexte['ajax']);
2095
-		}
2096
-
2097
-		$_l = 'array(' . join(",\n\t", $_contexte) . ')';
2098
-		if ($flag_env) {
2099
-			$_l = "array_merge(\$Pile[0],$_l)";
2100
-		}
2101
-
2102
-		$page = sprintf(CODE_RECUPERER_FOND, $nom, $_l, $_options, _q($connect));
2103
-
2104
-		$p->code = "\n\t(((\$recurs=(isset(\$Pile[0]['recurs'])?\$Pile[0]['recurs']:0))>=5)? '' :\n\t$page)\n";
2105
-
2106
-		$p->interdire_scripts = false; // securite assuree par le squelette
2107
-	}
2108
-
2109
-	return $p;
2047
+    $_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $p->id_boucle, false);
2048
+
2049
+    // erreur de syntaxe = fond absent
2050
+    // (2 messages d'erreur SPIP pour le prix d'un, mais pas d'erreur PHP
2051
+    if (!$_contexte) {
2052
+        $_contexte = array();
2053
+    }
2054
+
2055
+    if (!isset($_contexte[1])) {
2056
+        $msg = array('zbug_balise_sans_argument', array('balise' => ' MODELE'));
2057
+        erreur_squelette($msg, $p);
2058
+    } else {
2059
+        $nom = $_contexte[1];
2060
+        unset($_contexte[1]);
2061
+
2062
+        if (preg_match("/^\s*'[^']*'/s", $nom)) {
2063
+            $nom = "'modeles/" . substr($nom, 1);
2064
+        } else {
2065
+            $nom = "'modeles/' . $nom";
2066
+        }
2067
+
2068
+        $flag_env = false;
2069
+        if (isset($_contexte['env'])) {
2070
+            $flag_env = true;
2071
+            unset($_contexte['env']);
2072
+        }
2073
+
2074
+        // Incoherence dans la syntaxe du contexte. A revoir.
2075
+        // Reserver la cle primaire de la boucle courante si elle existe
2076
+        if (isset($p->boucles[$p->id_boucle]->primary)) {
2077
+            $primary = $p->boucles[$p->id_boucle]->primary;
2078
+            if (!strpos($primary, ',')) {
2079
+                $id = champ_sql($primary, $p);
2080
+                $_contexte[] = "'$primary'=>" . $id;
2081
+                $_contexte[] = "'id'=>" . $id;
2082
+            }
2083
+        }
2084
+        $_contexte[] = "'recurs'=>(++\$recurs)";
2085
+        $connect = '';
2086
+        if (isset($p->boucles[$p->id_boucle])) {
2087
+            $connect = $p->boucles[$p->id_boucle]->sql_serveur;
2088
+        }
2089
+
2090
+        $_options = memoriser_contexte_compil($p);
2091
+        $_options = "'compil'=>array($_options), 'trim'=>true";
2092
+        if (isset($_contexte['ajax'])) {
2093
+            $_options .= ", " . preg_replace(",=>(.*)$,ims", '=> ($v=(\\1))?$v:true', $_contexte['ajax']);
2094
+            unset($_contexte['ajax']);
2095
+        }
2096
+
2097
+        $_l = 'array(' . join(",\n\t", $_contexte) . ')';
2098
+        if ($flag_env) {
2099
+            $_l = "array_merge(\$Pile[0],$_l)";
2100
+        }
2101
+
2102
+        $page = sprintf(CODE_RECUPERER_FOND, $nom, $_l, $_options, _q($connect));
2103
+
2104
+        $p->code = "\n\t(((\$recurs=(isset(\$Pile[0]['recurs'])?\$Pile[0]['recurs']:0))>=5)? '' :\n\t$page)\n";
2105
+
2106
+        $p->interdire_scripts = false; // securite assuree par le squelette
2107
+    }
2108
+
2109
+    return $p;
2110 2110
 }
2111 2111
 
2112 2112
 
@@ -2130,21 +2130,21 @@  discard block
 block discarded – undo
2130 2130
  *     Pile complétée par le code à générer
2131 2131
  **/
2132 2132
 function balise_SET_dist($p) {
2133
-	$_nom = interprete_argument_balise(1, $p);
2134
-	$_val = interprete_argument_balise(2, $p);
2133
+    $_nom = interprete_argument_balise(1, $p);
2134
+    $_val = interprete_argument_balise(2, $p);
2135 2135
 
2136
-	if (!$_nom or !$_val) {
2137
-		$err_b_s_a = array('zbug_balise_sans_argument', array('balise' => 'SET'));
2138
-		erreur_squelette($err_b_s_a, $p);
2139
-	}
2140
-	// affectation $_zzz inutile, mais permet de contourner un bug OpCode cache sous PHP 5.5.4
2141
-	// cf https://bugs.php.net/bug.php?id=65845
2142
-	else {
2143
-		$p->code = "vide(\$Pile['vars'][\$_zzz=(string)$_nom] = $_val)";
2144
-	}
2136
+    if (!$_nom or !$_val) {
2137
+        $err_b_s_a = array('zbug_balise_sans_argument', array('balise' => 'SET'));
2138
+        erreur_squelette($err_b_s_a, $p);
2139
+    }
2140
+    // affectation $_zzz inutile, mais permet de contourner un bug OpCode cache sous PHP 5.5.4
2141
+    // cf https://bugs.php.net/bug.php?id=65845
2142
+    else {
2143
+        $p->code = "vide(\$Pile['vars'][\$_zzz=(string)$_nom] = $_val)";
2144
+    }
2145 2145
 
2146
-	$p->interdire_scripts = false; // la balise ne renvoie rien
2147
-	return $p;
2146
+    $p->interdire_scripts = false; // la balise ne renvoie rien
2147
+    return $p;
2148 2148
 }
2149 2149
 
2150 2150
 
@@ -2174,12 +2174,12 @@  discard block
 block discarded – undo
2174 2174
  *     Pile complétée par le code à générer
2175 2175
  **/
2176 2176
 function balise_GET_dist($p) {
2177
-	$p->interdire_scripts = false; // le contenu vient de #SET, donc il est de confiance
2178
-	if (function_exists('balise_ENV')) {
2179
-		return balise_ENV($p, '$Pile["vars"]');
2180
-	} else {
2181
-		return balise_ENV_dist($p, '$Pile["vars"]');
2182
-	}
2177
+    $p->interdire_scripts = false; // le contenu vient de #SET, donc il est de confiance
2178
+    if (function_exists('balise_ENV')) {
2179
+        return balise_ENV($p, '$Pile["vars"]');
2180
+    } else {
2181
+        return balise_ENV_dist($p, '$Pile["vars"]');
2182
+    }
2183 2183
 }
2184 2184
 
2185 2185
 
@@ -2202,22 +2202,22 @@  discard block
 block discarded – undo
2202 2202
  *     Pile complétée par le code à générer
2203 2203
  **/
2204 2204
 function balise_DOUBLONS_dist($p) {
2205
-	if ($type = interprete_argument_balise(1, $p)) {
2206
-		if ($famille = interprete_argument_balise(2, $p)) {
2207
-			$type .= '.' . $famille;
2208
-		}
2209
-		$p->code = '(isset($doublons[' . $type . ']) ? $doublons[' . $type . '] : "")';
2210
-		if (!$p->etoile) {
2211
-			$p->code = 'array_filter(array_map("intval",explode(",",'
2212
-				. $p->code . ')))';
2213
-		}
2214
-	} else {
2215
-		$p->code = '$doublons';
2216
-	}
2205
+    if ($type = interprete_argument_balise(1, $p)) {
2206
+        if ($famille = interprete_argument_balise(2, $p)) {
2207
+            $type .= '.' . $famille;
2208
+        }
2209
+        $p->code = '(isset($doublons[' . $type . ']) ? $doublons[' . $type . '] : "")';
2210
+        if (!$p->etoile) {
2211
+            $p->code = 'array_filter(array_map("intval",explode(",",'
2212
+                . $p->code . ')))';
2213
+        }
2214
+    } else {
2215
+        $p->code = '$doublons';
2216
+    }
2217 2217
 
2218
-	$p->interdire_scripts = false;
2218
+    $p->interdire_scripts = false;
2219 2219
 
2220
-	return $p;
2220
+    return $p;
2221 2221
 }
2222 2222
 
2223 2223
 
@@ -2240,18 +2240,18 @@  discard block
 block discarded – undo
2240 2240
  *     Pile complétée par le code à générer
2241 2241
  **/
2242 2242
 function balise_PIPELINE_dist($p) {
2243
-	$_pipe = interprete_argument_balise(1, $p);
2244
-	if (!$_pipe) {
2245
-		$err_b_s_a = array('zbug_balise_sans_argument', array('balise' => 'PIPELINE'));
2246
-		erreur_squelette($err_b_s_a, $p);
2247
-	} else {
2248
-		$_flux = interprete_argument_balise(2, $p);
2249
-		$_flux = $_flux ? $_flux : "''";
2250
-		$p->code = "pipeline( $_pipe , $_flux )";
2251
-		$p->interdire_scripts = false;
2252
-	}
2243
+    $_pipe = interprete_argument_balise(1, $p);
2244
+    if (!$_pipe) {
2245
+        $err_b_s_a = array('zbug_balise_sans_argument', array('balise' => 'PIPELINE'));
2246
+        erreur_squelette($err_b_s_a, $p);
2247
+    } else {
2248
+        $_flux = interprete_argument_balise(2, $p);
2249
+        $_flux = $_flux ? $_flux : "''";
2250
+        $p->code = "pipeline( $_pipe , $_flux )";
2251
+        $p->interdire_scripts = false;
2252
+    }
2253 2253
 
2254
-	return $p;
2254
+    return $p;
2255 2255
 }
2256 2256
 
2257 2257
 
@@ -2276,10 +2276,10 @@  discard block
 block discarded – undo
2276 2276
  *     Pile complétée par le code à générer
2277 2277
  **/
2278 2278
 function balise_EDIT_dist($p) {
2279
-	$p->code = "''";
2280
-	$p->interdire_scripts = false;
2279
+    $p->code = "''";
2280
+    $p->interdire_scripts = false;
2281 2281
 
2282
-	return $p;
2282
+    return $p;
2283 2283
 }
2284 2284
 
2285 2285
 
@@ -2302,11 +2302,11 @@  discard block
 block discarded – undo
2302 2302
  *     Pile complétée par le code à générer
2303 2303
  **/
2304 2304
 function balise_TOTAL_UNIQUE_dist($p) {
2305
-	$_famille = interprete_argument_balise(1, $p);
2306
-	$_famille = $_famille ? $_famille : "''";
2307
-	$p->code = "unique('', $_famille, true)";
2305
+    $_famille = interprete_argument_balise(1, $p);
2306
+    $_famille = $_famille ? $_famille : "''";
2307
+    $p->code = "unique('', $_famille, true)";
2308 2308
 
2309
-	return $p;
2309
+    return $p;
2310 2310
 }
2311 2311
 
2312 2312
 /**
@@ -2329,19 +2329,19 @@  discard block
 block discarded – undo
2329 2329
  *     Pile complétée par le code à générer
2330 2330
  **/
2331 2331
 function balise_ARRAY_dist($p) {
2332
-	$_code = array();
2333
-	$n = 1;
2334
-	do {
2335
-		$_key = interprete_argument_balise($n++, $p);
2336
-		$_val = interprete_argument_balise($n++, $p);
2337
-		if ($_key and $_val) {
2338
-			$_code[] = "$_key => $_val";
2339
-		}
2340
-	} while ($_key && $_val);
2341
-	$p->code = 'array(' . join(', ', $_code) . ')';
2342
-	$p->interdire_scripts = false;
2332
+    $_code = array();
2333
+    $n = 1;
2334
+    do {
2335
+        $_key = interprete_argument_balise($n++, $p);
2336
+        $_val = interprete_argument_balise($n++, $p);
2337
+        if ($_key and $_val) {
2338
+            $_code[] = "$_key => $_val";
2339
+        }
2340
+    } while ($_key && $_val);
2341
+    $p->code = 'array(' . join(', ', $_code) . ')';
2342
+    $p->interdire_scripts = false;
2343 2343
 
2344
-	return $p;
2344
+    return $p;
2345 2345
 }
2346 2346
 
2347 2347
 /**
@@ -2360,15 +2360,15 @@  discard block
 block discarded – undo
2360 2360
  *     Pile complétée par le code à générer
2361 2361
  */
2362 2362
 function balise_LISTE_dist($p) {
2363
-	$_code = array();
2364
-	$n = 1;
2365
-	while ($_val = interprete_argument_balise($n++, $p)) {
2366
-		$_code[] = $_val;
2367
-	}
2368
-	$p->code = 'array(' . join(', ', $_code) . ')';
2369
-	$p->interdire_scripts = false;
2363
+    $_code = array();
2364
+    $n = 1;
2365
+    while ($_val = interprete_argument_balise($n++, $p)) {
2366
+        $_code[] = $_val;
2367
+    }
2368
+    $p->code = 'array(' . join(', ', $_code) . ')';
2369
+    $p->interdire_scripts = false;
2370 2370
 
2371
-	return $p;
2371
+    return $p;
2372 2372
 }
2373 2373
 
2374 2374
 
@@ -2402,19 +2402,19 @@  discard block
 block discarded – undo
2402 2402
  *     Pile complétée par le code à générer
2403 2403
  **/
2404 2404
 function balise_AUTORISER_dist($p) {
2405
-	$_code = array();
2406
-	$p->descr['session'] = true; // faire un cache par session
2405
+    $_code = array();
2406
+    $p->descr['session'] = true; // faire un cache par session
2407 2407
 
2408
-	$n = 1;
2409
-	while ($_v = interprete_argument_balise($n++, $p)) {
2410
-		$_code[] = $_v;
2411
-	}
2408
+    $n = 1;
2409
+    while ($_v = interprete_argument_balise($n++, $p)) {
2410
+        $_code[] = $_v;
2411
+    }
2412 2412
 
2413
-	$p->code = '((function_exists("autoriser")||include_spip("inc/autoriser"))&&autoriser(' . join(', ',
2414
-			$_code) . ')?" ":"")';
2415
-	$p->interdire_scripts = false;
2413
+    $p->code = '((function_exists("autoriser")||include_spip("inc/autoriser"))&&autoriser(' . join(', ',
2414
+            $_code) . ')?" ":"")';
2415
+    $p->interdire_scripts = false;
2416 2416
 
2417
-	return $p;
2417
+    return $p;
2418 2418
 }
2419 2419
 
2420 2420
 
@@ -2438,15 +2438,15 @@  discard block
 block discarded – undo
2438 2438
  *     Pile complétée par le code à générer
2439 2439
  **/
2440 2440
 function balise_PLUGIN_dist($p) {
2441
-	$plugin = interprete_argument_balise(1, $p);
2442
-	$plugin = isset($plugin) ? str_replace('\'', '"', $plugin) : '""';
2443
-	$type_info = interprete_argument_balise(2, $p);
2444
-	$type_info = isset($type_info) ? str_replace('\'', '"', $type_info) : '"est_actif"';
2441
+    $plugin = interprete_argument_balise(1, $p);
2442
+    $plugin = isset($plugin) ? str_replace('\'', '"', $plugin) : '""';
2443
+    $type_info = interprete_argument_balise(2, $p);
2444
+    $type_info = isset($type_info) ? str_replace('\'', '"', $type_info) : '"est_actif"';
2445 2445
 
2446
-	$f = chercher_filtre('info_plugin');
2447
-	$p->code = $f . '(' . $plugin . ', ' . $type_info . ')';
2446
+    $f = chercher_filtre('info_plugin');
2447
+    $p->code = $f . '(' . $plugin . ', ' . $type_info . ')';
2448 2448
 
2449
-	return $p;
2449
+    return $p;
2450 2450
 }
2451 2451
 
2452 2452
 /**
@@ -2467,11 +2467,11 @@  discard block
 block discarded – undo
2467 2467
  *     Pile complétée par le code à générer
2468 2468
  **/
2469 2469
 function balise_AIDER_dist($p) {
2470
-	$_motif = interprete_argument_balise(1, $p);
2471
-	$s = "'" . addslashes($p->descr['sourcefile']) . "'";
2472
-	$p->code = "((\$aider=charger_fonction('aide','inc',true))?\$aider($_motif,$s, \$Pile[0]):'')";
2470
+    $_motif = interprete_argument_balise(1, $p);
2471
+    $s = "'" . addslashes($p->descr['sourcefile']) . "'";
2472
+    $p->code = "((\$aider=charger_fonction('aide','inc',true))?\$aider($_motif,$s, \$Pile[0]):'')";
2473 2473
 
2474
-	return $p;
2474
+    return $p;
2475 2475
 }
2476 2476
 
2477 2477
 /**
@@ -2497,16 +2497,16 @@  discard block
 block discarded – undo
2497 2497
  *     Pile complétée par le code à générer
2498 2498
  **/
2499 2499
 function balise_ACTION_FORMULAIRE($p) {
2500
-	if (!$_url = interprete_argument_balise(1, $p)) {
2501
-		$_url = "@\$Pile[0]['action']";
2502
-	}
2503
-	if (!$_form = interprete_argument_balise(2, $p)) {
2504
-		$_form = "@\$Pile[0]['form']";
2505
-	}
2506
-
2507
-	// envoyer le nom du formulaire que l'on traite
2508
-	// transmettre les eventuels args de la balise formulaire
2509
-	$p->code = "	'<div>' .
2500
+    if (!$_url = interprete_argument_balise(1, $p)) {
2501
+        $_url = "@\$Pile[0]['action']";
2502
+    }
2503
+    if (!$_form = interprete_argument_balise(2, $p)) {
2504
+        $_form = "@\$Pile[0]['form']";
2505
+    }
2506
+
2507
+    // envoyer le nom du formulaire que l'on traite
2508
+    // transmettre les eventuels args de la balise formulaire
2509
+    $p->code = "	'<div>' .
2510 2510
 	form_hidden($_url) .
2511 2511
 	'<input name=\'formulaire_action\' type=\'hidden\'
2512 2512
 		value=\'' . $_form . '\' />' .
@@ -2515,9 +2515,9 @@  discard block
 block discarded – undo
2515 2515
 	(!empty(\$Pile[0]['_hidden']) ? @\$Pile[0]['_hidden'] : '') .
2516 2516
 	'</div>'";
2517 2517
 
2518
-	$p->interdire_scripts = false;
2518
+    $p->interdire_scripts = false;
2519 2519
 
2520
-	return $p;
2520
+    return $p;
2521 2521
 }
2522 2522
 
2523 2523
 
@@ -2547,25 +2547,25 @@  discard block
 block discarded – undo
2547 2547
  */
2548 2548
 function balise_BOUTON_ACTION_dist($p) {
2549 2549
 
2550
-	$args = array();
2551
-	for ($k = 1; $k <= 6; $k++) {
2552
-		$_a = interprete_argument_balise($k, $p);
2553
-		if (!$_a) {
2554
-			$_a = "''";
2555
-		}
2556
-		$args[] = $_a;
2557
-	}
2558
-	// supprimer les args vides
2559
-	while (end($args) == "''" and count($args) > 2) {
2560
-		array_pop($args);
2561
-	}
2562
-	$args = implode(",", $args);
2550
+    $args = array();
2551
+    for ($k = 1; $k <= 6; $k++) {
2552
+        $_a = interprete_argument_balise($k, $p);
2553
+        if (!$_a) {
2554
+            $_a = "''";
2555
+        }
2556
+        $args[] = $_a;
2557
+    }
2558
+    // supprimer les args vides
2559
+    while (end($args) == "''" and count($args) > 2) {
2560
+        array_pop($args);
2561
+    }
2562
+    $args = implode(",", $args);
2563 2563
 
2564
-	$bouton_action = chercher_filtre("bouton_action");
2565
-	$p->code = "$bouton_action($args)";
2566
-	$p->interdire_scripts = false;
2564
+    $bouton_action = chercher_filtre("bouton_action");
2565
+    $p->code = "$bouton_action($args)";
2566
+    $p->interdire_scripts = false;
2567 2567
 
2568
-	return $p;
2568
+    return $p;
2569 2569
 }
2570 2570
 
2571 2571
 
@@ -2584,10 +2584,10 @@  discard block
 block discarded – undo
2584 2584
  *     Pile complétée par le code à générer
2585 2585
  */
2586 2586
 function balise_SLOGAN_SITE_SPIP_dist($p) {
2587
-	$p->code = "\$GLOBALS['meta']['slogan_site']";
2587
+    $p->code = "\$GLOBALS['meta']['slogan_site']";
2588 2588
 
2589
-	#$p->interdire_scripts = true;
2590
-	return $p;
2589
+    #$p->interdire_scripts = true;
2590
+    return $p;
2591 2591
 }
2592 2592
 
2593 2593
 
@@ -2611,10 +2611,10 @@  discard block
 block discarded – undo
2611 2611
  *     Pile complétée par le code à générer
2612 2612
  */
2613 2613
 function balise_HTML5_dist($p) {
2614
-	$p->code = html5_permis() ? "' '" : "''";
2615
-	$p->interdire_scripts = false;
2614
+    $p->code = html5_permis() ? "' '" : "''";
2615
+    $p->interdire_scripts = false;
2616 2616
 
2617
-	return $p;
2617
+    return $p;
2618 2618
 }
2619 2619
 
2620 2620
 
@@ -2640,61 +2640,61 @@  discard block
 block discarded – undo
2640 2640
  *     Pile complétée par le code à générer
2641 2641
  */
2642 2642
 function balise_TRI_dist($p, $liste = 'true') {
2643
-	$b = index_boucle_mere($p);
2644
-	// s'il n'y a pas de nom de boucle, on ne peut pas trier
2645
-	if ($b === '') {
2646
-		$msg = array('zbug_champ_hors_boucle', array('champ' => zbug_presenter_champ($p)));
2647
-		erreur_squelette($msg, $p);
2648
-		$p->code = "''";
2643
+    $b = index_boucle_mere($p);
2644
+    // s'il n'y a pas de nom de boucle, on ne peut pas trier
2645
+    if ($b === '') {
2646
+        $msg = array('zbug_champ_hors_boucle', array('champ' => zbug_presenter_champ($p)));
2647
+        erreur_squelette($msg, $p);
2648
+        $p->code = "''";
2649 2649
 
2650
-		return $p;
2651
-	}
2652
-	$boucle = $p->boucles[$b];
2650
+        return $p;
2651
+    }
2652
+    $boucle = $p->boucles[$b];
2653 2653
 
2654
-	// s'il n'y a pas de tri_champ, c'est qu'on se trouve
2655
-	// dans un boucle recursive ou qu'on a oublie le critere {tri}
2656
-	if (!isset($boucle->modificateur['tri_champ'])) {
2657
-		$msg = array('zbug_champ_hors_critere', array(
2658
-			'champ' => zbug_presenter_champ($p),
2659
-			'critere' => 'tri'
2660
-		));
2661
-		erreur_squelette($msg, $p);
2662
-		$p->code = "''";
2654
+    // s'il n'y a pas de tri_champ, c'est qu'on se trouve
2655
+    // dans un boucle recursive ou qu'on a oublie le critere {tri}
2656
+    if (!isset($boucle->modificateur['tri_champ'])) {
2657
+        $msg = array('zbug_champ_hors_critere', array(
2658
+            'champ' => zbug_presenter_champ($p),
2659
+            'critere' => 'tri'
2660
+        ));
2661
+        erreur_squelette($msg, $p);
2662
+        $p->code = "''";
2663 2663
 
2664
-		return $p;
2665
-	}
2664
+        return $p;
2665
+    }
2666 2666
 
2667
-	$_champ = interprete_argument_balise(1, $p);
2668
-	// si pas de champ, renvoyer le critere de tri utilise
2669
-	if (!$_champ) {
2670
-		$p->code = $boucle->modificateur['tri_champ'];
2667
+    $_champ = interprete_argument_balise(1, $p);
2668
+    // si pas de champ, renvoyer le critere de tri utilise
2669
+    if (!$_champ) {
2670
+        $p->code = $boucle->modificateur['tri_champ'];
2671 2671
 
2672
-		return $p;
2673
-	}
2674
-	// forcer la jointure si besoin, et si le champ est statique
2675
-	if (preg_match(",^'([\w.]+)'$,i", $_champ, $m)) {
2676
-		index_pile($b, $m[1], $p->boucles, '', null, true, false);
2677
-	}
2672
+        return $p;
2673
+    }
2674
+    // forcer la jointure si besoin, et si le champ est statique
2675
+    if (preg_match(",^'([\w.]+)'$,i", $_champ, $m)) {
2676
+        index_pile($b, $m[1], $p->boucles, '', null, true, false);
2677
+    }
2678 2678
 
2679
-	$_libelle = interprete_argument_balise(2, $p);
2680
-	$_libelle = $_libelle ? $_libelle : $_champ;
2679
+    $_libelle = interprete_argument_balise(2, $p);
2680
+    $_libelle = $_libelle ? $_libelle : $_champ;
2681 2681
 
2682
-	$_class = interprete_argument_balise(3, $p);
2683
-	// si champ = ">" c'est un lien vers le tri croissant : de gauche a droite ==> 1
2684
-	// si champ = "<" c'est un lien vers le tri decroissant : (sens inverse) == -1
2685
-	$_issens = "in_array($_champ,array('>','<'))";
2686
-	$_sens = "(strpos('< >',$_champ)-1)";
2682
+    $_class = interprete_argument_balise(3, $p);
2683
+    // si champ = ">" c'est un lien vers le tri croissant : de gauche a droite ==> 1
2684
+    // si champ = "<" c'est un lien vers le tri decroissant : (sens inverse) == -1
2685
+    $_issens = "in_array($_champ,array('>','<'))";
2686
+    $_sens = "(strpos('< >',$_champ)-1)";
2687 2687
 
2688
-	$_variable = "((\$s=$_issens)?'sens':'tri')." . $boucle->modificateur['tri_nom'];
2689
-	$_url = "parametre_url(self(),$_variable,\$s?$_sens:$_champ)";
2690
-	$_url = "parametre_url($_url,'var_memotri',strncmp(" . $boucle->modificateur['tri_nom'] . ",'session',7)==0?$_variable:'')";
2691
-	$_on = "\$s?(" . $boucle->modificateur['tri_sens'] . "==$_sens" . '):(' . $boucle->modificateur['tri_champ'] . "==$_champ)";
2688
+    $_variable = "((\$s=$_issens)?'sens':'tri')." . $boucle->modificateur['tri_nom'];
2689
+    $_url = "parametre_url(self(),$_variable,\$s?$_sens:$_champ)";
2690
+    $_url = "parametre_url($_url,'var_memotri',strncmp(" . $boucle->modificateur['tri_nom'] . ",'session',7)==0?$_variable:'')";
2691
+    $_on = "\$s?(" . $boucle->modificateur['tri_sens'] . "==$_sens" . '):(' . $boucle->modificateur['tri_champ'] . "==$_champ)";
2692 2692
 
2693
-	$p->code = "lien_ou_expose($_url,$_libelle,$_on" . ($_class ? ",$_class" : "") . ")";
2694
-	//$p->code = "''";
2695
-	$p->interdire_scripts = false;
2693
+    $p->code = "lien_ou_expose($_url,$_libelle,$_on" . ($_class ? ",$_class" : "") . ")";
2694
+    //$p->code = "''";
2695
+    $p->interdire_scripts = false;
2696 2696
 
2697
-	return $p;
2697
+    return $p;
2698 2698
 }
2699 2699
 
2700 2700
 
@@ -2715,22 +2715,22 @@  discard block
 block discarded – undo
2715 2715
  *     Pile complétée par le code à générer
2716 2716
  */
2717 2717
 function balise_SAUTER_dist($p) {
2718
-	$id_boucle = $p->id_boucle;
2718
+    $id_boucle = $p->id_boucle;
2719 2719
 
2720
-	if (empty($p->boucles[$id_boucle])) {
2721
-		$msg = array('zbug_champ_hors_boucle', array('champ' => '#SAUTER'));
2722
-		erreur_squelette($msg, $p);
2723
-	} else {
2724
-		$boucle = $p->boucles[$id_boucle];
2725
-		$_saut = interprete_argument_balise(1, $p);
2726
-		$_compteur = "\$Numrows['$id_boucle']['compteur_boucle']";
2727
-		$_total = "\$Numrows['$id_boucle']['total']";
2720
+    if (empty($p->boucles[$id_boucle])) {
2721
+        $msg = array('zbug_champ_hors_boucle', array('champ' => '#SAUTER'));
2722
+        erreur_squelette($msg, $p);
2723
+    } else {
2724
+        $boucle = $p->boucles[$id_boucle];
2725
+        $_saut = interprete_argument_balise(1, $p);
2726
+        $_compteur = "\$Numrows['$id_boucle']['compteur_boucle']";
2727
+        $_total = "\$Numrows['$id_boucle']['total']";
2728 2728
 
2729
-		$p->code = "vide($_compteur=\$iter->skip($_saut,$_total))";
2730
-	}
2731
-	$p->interdire_scripts = false;
2729
+        $p->code = "vide($_compteur=\$iter->skip($_saut,$_total))";
2730
+    }
2731
+    $p->interdire_scripts = false;
2732 2732
 
2733
-	return $p;
2733
+    return $p;
2734 2734
 }
2735 2735
 
2736 2736
 
@@ -2752,22 +2752,22 @@  discard block
 block discarded – undo
2752 2752
  *     Pile complétée par le code à générer
2753 2753
  */
2754 2754
 function balise_PUBLIE_dist($p) {
2755
-	if (!$_type = interprete_argument_balise(1, $p)) {
2756
-		$_type = _q($p->type_requete);
2757
-		$_id = champ_sql($p->boucles[$p->id_boucle]->primary, $p);
2758
-	} else {
2759
-		$_id = interprete_argument_balise(2, $p);
2760
-	}
2755
+    if (!$_type = interprete_argument_balise(1, $p)) {
2756
+        $_type = _q($p->type_requete);
2757
+        $_id = champ_sql($p->boucles[$p->id_boucle]->primary, $p);
2758
+    } else {
2759
+        $_id = interprete_argument_balise(2, $p);
2760
+    }
2761 2761
 
2762
-	$connect = '';
2763
-	if (isset($p->boucles[$p->id_boucle])) {
2764
-		$connect = $p->boucles[$p->id_boucle]->sql_serveur;
2765
-	}
2762
+    $connect = '';
2763
+    if (isset($p->boucles[$p->id_boucle])) {
2764
+        $connect = $p->boucles[$p->id_boucle]->sql_serveur;
2765
+    }
2766 2766
 
2767
-	$p->code = "(objet_test_si_publie(" . $_type . ",intval(" . $_id . ")," . _q($connect) . ")?' ':'')";
2768
-	$p->interdire_scripts = false;
2767
+    $p->code = "(objet_test_si_publie(" . $_type . ",intval(" . $_id . ")," . _q($connect) . ")?' ':'')";
2768
+    $p->interdire_scripts = false;
2769 2769
 
2770
-	return $p;
2770
+    return $p;
2771 2771
 }
2772 2772
 
2773 2773
 /**
@@ -2796,12 +2796,12 @@  discard block
 block discarded – undo
2796 2796
  *     Pile complétée par le code à générer
2797 2797
  */
2798 2798
 function balise_PRODUIRE_dist($p) {
2799
-	$balise_inclure = charger_fonction('INCLURE', 'balise');
2800
-	$p = $balise_inclure($p);
2799
+    $balise_inclure = charger_fonction('INCLURE', 'balise');
2800
+    $p = $balise_inclure($p);
2801 2801
 
2802
-	$p->code = str_replace('recuperer_fond(', 'produire_fond_statique(', $p->code);
2802
+    $p->code = str_replace('recuperer_fond(', 'produire_fond_statique(', $p->code);
2803 2803
 
2804
-	return $p;
2804
+    return $p;
2805 2805
 }
2806 2806
 
2807 2807
 /**
@@ -2820,13 +2820,13 @@  discard block
 block discarded – undo
2820 2820
  *     Pile complétée par le code à générer
2821 2821
  */
2822 2822
 function balise_LARGEUR_ECRAN_dist($p) {
2823
-	$_class = interprete_argument_balise(1, $p);
2824
-	if (!$_class) {
2825
-		$_class = 'null';
2826
-	}
2827
-	$p->code = "(is_string($_class)?vide(\$GLOBALS['largeur_ecran']=$_class):(isset(\$GLOBALS['largeur_ecran'])?\$GLOBALS['largeur_ecran']:''))";
2823
+    $_class = interprete_argument_balise(1, $p);
2824
+    if (!$_class) {
2825
+        $_class = 'null';
2826
+    }
2827
+    $p->code = "(is_string($_class)?vide(\$GLOBALS['largeur_ecran']=$_class):(isset(\$GLOBALS['largeur_ecran'])?\$GLOBALS['largeur_ecran']:''))";
2828 2828
 
2829
-	return $p;
2829
+    return $p;
2830 2830
 }
2831 2831
 
2832 2832
 
@@ -2842,14 +2842,14 @@  discard block
 block discarded – undo
2842 2842
  *     Pile complétée par le code à générer
2843 2843
  **/
2844 2844
 function balise_CONST_dist($p) {
2845
-	$_const = interprete_argument_balise(1, $p);
2846
-	if (!strlen($_const)) {
2847
-		$p->code = "''";
2848
-	}
2849
-	else {
2850
-		$p->code = "(defined($_const)?constant($_const):'')";
2851
-	}
2852
-	$p->interdire_scripts = false;
2853
-
2854
-	return $p;
2845
+    $_const = interprete_argument_balise(1, $p);
2846
+    if (!strlen($_const)) {
2847
+        $p->code = "''";
2848
+    }
2849
+    else {
2850
+        $p->code = "(defined($_const)?constant($_const):'')";
2851
+    }
2852
+    $p->interdire_scripts = false;
2853
+
2854
+    return $p;
2855 2855
 }
Please login to merge, or discard this patch.
Spacing   +53 added lines, -53 removed lines patch added patch discarded remove patch
@@ -363,7 +363,7 @@  discard block
 block discarded – undo
363 363
  */
364 364
 function balise_DOSSIER_SQUELETTE_dist($p) {
365 365
 	$code = substr(addslashes(dirname($p->descr['sourcefile'])), strlen(_DIR_RACINE));
366
-	$p->code = "_DIR_RACINE . '$code'" .
366
+	$p->code = "_DIR_RACINE . '$code'".
367 367
 		$p->interdire_scripts = false;
368 368
 
369 369
 	return $p;
@@ -382,7 +382,7 @@  discard block
 block discarded – undo
382 382
  */
383 383
 function balise_SQUELETTE_dist($p) {
384 384
 	$code = addslashes($p->descr['sourcefile']);
385
-	$p->code = "'$code'" .
385
+	$p->code = "'$code'".
386 386
 		$p->interdire_scripts = false;
387 387
 
388 388
 	return $p;
@@ -434,9 +434,9 @@  discard block
 block discarded – undo
434 434
  **/
435 435
 function balise_NOM_SITE_dist($p) {
436 436
 	if (!$p->etoile) {
437
-		$p->code = "supprimer_numero(calculer_url(" .
438
-			champ_sql('url_site', $p) . "," .
439
-			champ_sql('nom_site', $p) .
437
+		$p->code = "supprimer_numero(calculer_url(".
438
+			champ_sql('url_site', $p).",".
439
+			champ_sql('nom_site', $p).
440 440
 			", 'titre', \$connect, false))";
441 441
 	} else {
442 442
 		$p->code = champ_sql('nom_site', $p);
@@ -587,8 +587,8 @@  discard block
 block discarded – undo
587 587
  *     Pile complétée par le code à générer
588 588
  **/
589 589
 function balise_POPULARITE_ABSOLUE_dist($p) {
590
-	$p->code = 'ceil(' .
591
-		champ_sql('popularite', $p) .
590
+	$p->code = 'ceil('.
591
+		champ_sql('popularite', $p).
592 592
 		')';
593 593
 	$p->interdire_scripts = false;
594 594
 
@@ -666,9 +666,9 @@  discard block
 block discarded – undo
666 666
  **/
667 667
 function balise_VALEUR_dist($p) {
668 668
 	$b = $p->nom_boucle ? $p->nom_boucle : $p->id_boucle;
669
-	$p->code = index_pile($p->id_boucle, 'valeur', $p->boucles, $b);;
669
+	$p->code = index_pile($p->id_boucle, 'valeur', $p->boucles, $b); ;
670 670
 	if (($v = interprete_argument_balise(1, $p)) !== null) {
671
-		$p->code = 'table_valeur(' . $p->code . ', ' . $v . ')';
671
+		$p->code = 'table_valeur('.$p->code.', '.$v.')';
672 672
 	}
673 673
 	$p->interdire_scripts = true;
674 674
 
@@ -824,8 +824,8 @@  discard block
 block discarded – undo
824 824
 	$_suite = 'null';
825 825
 	$_longueur = $longueur_defaut;
826 826
 	if (($v = interprete_argument_balise(1, $p)) !== null) {
827
-		$_longueur = 'is_numeric(' . $v . ')?intval(' . $v . '):' . $longueur_defaut;
828
-		$_suite = '!is_numeric(' . $v . ')?' . $v . ':null';
827
+		$_longueur = 'is_numeric('.$v.')?intval('.$v.'):'.$longueur_defaut;
828
+		$_suite = '!is_numeric('.$v.')?'.$v.':null';
829 829
 	}
830 830
 	if (($v2 = interprete_argument_balise(2, $p)) !== null) {
831 831
 		$_suite = $v2;
@@ -913,10 +913,10 @@  discard block
 block discarded – undo
913 913
 		$c = memoriser_contexte_compil($p);
914 914
 
915 915
 		$p->code = sprintf(CODE_RECUPERER_FOND, "'modeles/lesauteurs'",
916
-			"array('objet'=>'" . $objet .
917
-			"','id_objet' => " . champ_sql($id_table_objet, $p) .
918
-			",'$id_table_objet' => " . champ_sql($id_table_objet, $p) .
919
-			($objet == 'article' ? "" : ",'id_article' => " . champ_sql('id_article', $p)) .
916
+			"array('objet'=>'".$objet.
917
+			"','id_objet' => ".champ_sql($id_table_objet, $p).
918
+			",'$id_table_objet' => ".champ_sql($id_table_objet, $p).
919
+			($objet == 'article' ? "" : ",'id_article' => ".champ_sql('id_article', $p)).
920 920
 			")",
921 921
 			"'trim'=>true, 'compil'=>array($c)",
922 922
 			_q($connect));
@@ -984,7 +984,7 @@  discard block
 block discarded – undo
984 984
 					$m = trim($m);
985 985
 					if ($m != "''") {
986 986
 						if (!preg_match(",\W,", $m)) {
987
-							$m = $boucle->id_table . ".$m";
987
+							$m = $boucle->id_table.".$m";
988 988
 						}
989 989
 						
990 990
 						$m .= " AS titre_rang";
@@ -1008,8 +1008,8 @@  discard block
 block discarded – undo
1008 1008
 			$_primary = champ_sql($id_table_objet, $p, '', false);
1009 1009
 			$_env = '$Pile[0]';
1010 1010
 
1011
-			if (!$_titre) {$_titre = "''";}
1012
-			if (!$_primary) {$_primary = "''";}
1011
+			if (!$_titre) {$_titre = "''"; }
1012
+			if (!$_primary) {$_primary = "''"; }
1013 1013
 			$_rang = "calculer_rang_smart($_titre, '$objet', $_primary, $_env)";
1014 1014
 
1015 1015
 		}
@@ -1142,7 +1142,7 @@  discard block
 block discarded – undo
1142 1142
 	$f_pagination = chercher_filtre('pagination');
1143 1143
 	$type = $p->boucles[$b]->modificateur['debut_nom'];
1144 1144
 	$modif = ($type[0] !== "'") ? "'debut'.$type"
1145
-		: ("'debut" . substr($type, 1));
1145
+		: ("'debut".substr($type, 1));
1146 1146
 
1147 1147
 	$p->code = sprintf(CODE_PAGINATION, $f_pagination, $b, $type, $modif, $pas, $liste,
1148 1148
 		((isset($__modele) and $__modele) ? $__modele : "''"), _q($connect), $code_contexte);
@@ -1276,7 +1276,7 @@  discard block
 block discarded – undo
1276 1276
 		$msg = array('zbug_balise_sans_argument', array('balise' => ' CHEMIN'));
1277 1277
 		erreur_squelette($msg, $p);
1278 1278
 	} else {
1279
-		$p->code = 'find_in_path(' . $arg . ')';
1279
+		$p->code = 'find_in_path('.$arg.')';
1280 1280
 	}
1281 1281
 
1282 1282
 	$p->interdire_scripts = false;
@@ -1311,7 +1311,7 @@  discard block
 block discarded – undo
1311 1311
 		$msg = array('zbug_balise_sans_argument', array('balise' => ' CHEMIN_IMAGE'));
1312 1312
 		erreur_squelette($msg, $p);
1313 1313
 	} else {
1314
-		$p->code = 'chemin_image(' . $arg . ')';
1314
+		$p->code = 'chemin_image('.$arg.')';
1315 1315
 	}
1316 1316
 
1317 1317
 	#$p->interdire_scripts = true;
@@ -1365,7 +1365,7 @@  discard block
 block discarded – undo
1365 1365
 		// cas de #ENV sans argument : on retourne le serialize() du tableau
1366 1366
 		// une belle fonction [(#ENV|affiche_env)] serait pratique
1367 1367
 		if ($src) {
1368
-			$p->code = '(is_array($a = (' . $src . ')) ? serialize($a) : "")';
1368
+			$p->code = '(is_array($a = ('.$src.')) ? serialize($a) : "")';
1369 1369
 		} else {
1370 1370
 			$p->code = '@serialize($Pile[0])';
1371 1371
 		}
@@ -1418,8 +1418,8 @@  discard block
 block discarded – undo
1418 1418
 	$_sinon = interprete_argument_balise(2, $p);
1419 1419
 	$_unserialize = sinon(interprete_argument_balise(3, $p), "false");
1420 1420
 
1421
-	$p->code = '(include_spip(\'inc/config\')?lire_config(' . $arg . ',' .
1422
-		($_sinon && $_sinon != "''" ? $_sinon : 'null') . ',' . $_unserialize . "):'')";
1421
+	$p->code = '(include_spip(\'inc/config\')?lire_config('.$arg.','.
1422
+		($_sinon && $_sinon != "''" ? $_sinon : 'null').','.$_unserialize."):'')";
1423 1423
 
1424 1424
 	return $p;
1425 1425
 }
@@ -1512,7 +1512,7 @@  discard block
 block discarded – undo
1512 1512
 		$err_b_s_a = array('zbug_balise_sans_argument', array('balise' => 'SESSION_SET'));
1513 1513
 		erreur_squelette($err_b_s_a, $p);
1514 1514
 	} else {
1515
-		$p->code = '(include_spip("inc/session") AND session_set(' . $_nom . ',' . $_val . '))';
1515
+		$p->code = '(include_spip("inc/session") AND session_set('.$_nom.','.$_val.'))';
1516 1516
 	}
1517 1517
 
1518 1518
 	$p->interdire_scripts = false;
@@ -1555,7 +1555,7 @@  discard block
 block discarded – undo
1555 1555
 		if (preg_match(",^([[:space:]]*//[^\n]*\n)'([^']+)'$,ms",
1556 1556
 			$php, $r)) {
1557 1557
 			$p->code = /* $r[1]. */
1558
-				'(' . $r[2] . ')';
1558
+				'('.$r[2].')';
1559 1559
 		} else {
1560 1560
 			$p->code = "eval('return '.$php.';')";
1561 1561
 		}
@@ -1802,9 +1802,9 @@  discard block
 block discarded – undo
1802 1802
 
1803 1803
 		// noter la duree du cache dans un entete proprietaire
1804 1804
 
1805
-		$code = "'<'.'" . '?php header("X-Spip-Cache: '
1805
+		$code = "'<'.'".'?php header("X-Spip-Cache: '
1806 1806
 			. $duree
1807
-			. '"); ?' . "'.'>'";
1807
+			. '"); ?'."'.'>'";
1808 1808
 
1809 1809
 		// Remplir le header Cache-Control
1810 1810
 		// cas #CACHE{0}
@@ -1824,9 +1824,9 @@  discard block
 block discarded – undo
1824 1824
 			if ($pa == 'cache-client'
1825 1825
 				and $duree > 0
1826 1826
 			) {
1827
-				$code .= ".'<'.'" . '?php header("Cache-Control: max-age='
1827
+				$code .= ".'<'.'".'?php header("Cache-Control: max-age='
1828 1828
 					. $duree
1829
-					. '"); ?' . "'.'>'";
1829
+					. '"); ?'."'.'>'";
1830 1830
 				// il semble logique, si on cache-client, de ne pas invalider
1831 1831
 				$pa = 'statique';
1832 1832
 			}
@@ -1834,7 +1834,7 @@  discard block
 block discarded – undo
1834 1834
 			if ($pa == 'statique'
1835 1835
 				and $duree > 0
1836 1836
 			) {
1837
-				$code .= ".'<'.'" . '?php header("X-Spip-Statique: oui"); ?' . "'.'>'";
1837
+				$code .= ".'<'.'".'?php header("X-Spip-Statique: oui"); ?'."'.'>'";
1838 1838
 			}
1839 1839
 		}
1840 1840
 	} else {
@@ -1999,9 +1999,9 @@  discard block
 block discarded – undo
1999 1999
 		if ($p->etoile) {
2000 2000
 			$_options[] = "'etoile'=>true";
2001 2001
 		}
2002
-		$_options[] = "'compil'=>array(" . memoriser_contexte_compil($p) . ")";
2002
+		$_options[] = "'compil'=>array(".memoriser_contexte_compil($p).")";
2003 2003
 
2004
-		$_l = 'array(' . join(",\n\t", $_contexte) . ')';
2004
+		$_l = 'array('.join(",\n\t", $_contexte).')';
2005 2005
 		if ($flag_env) {
2006 2006
 			$_l = "array_merge(\$Pile[0],$_l)";
2007 2007
 		}
@@ -2012,7 +2012,7 @@  discard block
 block discarded – undo
2012 2012
 		$msg = array('zbug_balise_sans_argument', array('balise' => ' INCLURE'));
2013 2013
 		erreur_squelette($msg, $p);
2014 2014
 	} else {
2015
-		$p->code = 'charge_scripts(' . $_contexte[1] . ',false)';
2015
+		$p->code = 'charge_scripts('.$_contexte[1].',false)';
2016 2016
 	}
2017 2017
 
2018 2018
 	$p->interdire_scripts = false; // la securite est assuree par recuperer_fond
@@ -2060,7 +2060,7 @@  discard block
 block discarded – undo
2060 2060
 		unset($_contexte[1]);
2061 2061
 
2062 2062
 		if (preg_match("/^\s*'[^']*'/s", $nom)) {
2063
-			$nom = "'modeles/" . substr($nom, 1);
2063
+			$nom = "'modeles/".substr($nom, 1);
2064 2064
 		} else {
2065 2065
 			$nom = "'modeles/' . $nom";
2066 2066
 		}
@@ -2077,8 +2077,8 @@  discard block
 block discarded – undo
2077 2077
 			$primary = $p->boucles[$p->id_boucle]->primary;
2078 2078
 			if (!strpos($primary, ',')) {
2079 2079
 				$id = champ_sql($primary, $p);
2080
-				$_contexte[] = "'$primary'=>" . $id;
2081
-				$_contexte[] = "'id'=>" . $id;
2080
+				$_contexte[] = "'$primary'=>".$id;
2081
+				$_contexte[] = "'id'=>".$id;
2082 2082
 			}
2083 2083
 		}
2084 2084
 		$_contexte[] = "'recurs'=>(++\$recurs)";
@@ -2090,11 +2090,11 @@  discard block
 block discarded – undo
2090 2090
 		$_options = memoriser_contexte_compil($p);
2091 2091
 		$_options = "'compil'=>array($_options), 'trim'=>true";
2092 2092
 		if (isset($_contexte['ajax'])) {
2093
-			$_options .= ", " . preg_replace(",=>(.*)$,ims", '=> ($v=(\\1))?$v:true', $_contexte['ajax']);
2093
+			$_options .= ", ".preg_replace(",=>(.*)$,ims", '=> ($v=(\\1))?$v:true', $_contexte['ajax']);
2094 2094
 			unset($_contexte['ajax']);
2095 2095
 		}
2096 2096
 
2097
-		$_l = 'array(' . join(",\n\t", $_contexte) . ')';
2097
+		$_l = 'array('.join(",\n\t", $_contexte).')';
2098 2098
 		if ($flag_env) {
2099 2099
 			$_l = "array_merge(\$Pile[0],$_l)";
2100 2100
 		}
@@ -2204,12 +2204,12 @@  discard block
 block discarded – undo
2204 2204
 function balise_DOUBLONS_dist($p) {
2205 2205
 	if ($type = interprete_argument_balise(1, $p)) {
2206 2206
 		if ($famille = interprete_argument_balise(2, $p)) {
2207
-			$type .= '.' . $famille;
2207
+			$type .= '.'.$famille;
2208 2208
 		}
2209
-		$p->code = '(isset($doublons[' . $type . ']) ? $doublons[' . $type . '] : "")';
2209
+		$p->code = '(isset($doublons['.$type.']) ? $doublons['.$type.'] : "")';
2210 2210
 		if (!$p->etoile) {
2211 2211
 			$p->code = 'array_filter(array_map("intval",explode(",",'
2212
-				. $p->code . ')))';
2212
+				. $p->code.')))';
2213 2213
 		}
2214 2214
 	} else {
2215 2215
 		$p->code = '$doublons';
@@ -2338,7 +2338,7 @@  discard block
 block discarded – undo
2338 2338
 			$_code[] = "$_key => $_val";
2339 2339
 		}
2340 2340
 	} while ($_key && $_val);
2341
-	$p->code = 'array(' . join(', ', $_code) . ')';
2341
+	$p->code = 'array('.join(', ', $_code).')';
2342 2342
 	$p->interdire_scripts = false;
2343 2343
 
2344 2344
 	return $p;
@@ -2365,7 +2365,7 @@  discard block
 block discarded – undo
2365 2365
 	while ($_val = interprete_argument_balise($n++, $p)) {
2366 2366
 		$_code[] = $_val;
2367 2367
 	}
2368
-	$p->code = 'array(' . join(', ', $_code) . ')';
2368
+	$p->code = 'array('.join(', ', $_code).')';
2369 2369
 	$p->interdire_scripts = false;
2370 2370
 
2371 2371
 	return $p;
@@ -2410,8 +2410,8 @@  discard block
 block discarded – undo
2410 2410
 		$_code[] = $_v;
2411 2411
 	}
2412 2412
 
2413
-	$p->code = '((function_exists("autoriser")||include_spip("inc/autoriser"))&&autoriser(' . join(', ',
2414
-			$_code) . ')?" ":"")';
2413
+	$p->code = '((function_exists("autoriser")||include_spip("inc/autoriser"))&&autoriser('.join(', ',
2414
+			$_code).')?" ":"")';
2415 2415
 	$p->interdire_scripts = false;
2416 2416
 
2417 2417
 	return $p;
@@ -2444,7 +2444,7 @@  discard block
 block discarded – undo
2444 2444
 	$type_info = isset($type_info) ? str_replace('\'', '"', $type_info) : '"est_actif"';
2445 2445
 
2446 2446
 	$f = chercher_filtre('info_plugin');
2447
-	$p->code = $f . '(' . $plugin . ', ' . $type_info . ')';
2447
+	$p->code = $f.'('.$plugin.', '.$type_info.')';
2448 2448
 
2449 2449
 	return $p;
2450 2450
 }
@@ -2468,7 +2468,7 @@  discard block
 block discarded – undo
2468 2468
  **/
2469 2469
 function balise_AIDER_dist($p) {
2470 2470
 	$_motif = interprete_argument_balise(1, $p);
2471
-	$s = "'" . addslashes($p->descr['sourcefile']) . "'";
2471
+	$s = "'".addslashes($p->descr['sourcefile'])."'";
2472 2472
 	$p->code = "((\$aider=charger_fonction('aide','inc',true))?\$aider($_motif,$s, \$Pile[0]):'')";
2473 2473
 
2474 2474
 	return $p;
@@ -2685,12 +2685,12 @@  discard block
 block discarded – undo
2685 2685
 	$_issens = "in_array($_champ,array('>','<'))";
2686 2686
 	$_sens = "(strpos('< >',$_champ)-1)";
2687 2687
 
2688
-	$_variable = "((\$s=$_issens)?'sens':'tri')." . $boucle->modificateur['tri_nom'];
2688
+	$_variable = "((\$s=$_issens)?'sens':'tri').".$boucle->modificateur['tri_nom'];
2689 2689
 	$_url = "parametre_url(self(),$_variable,\$s?$_sens:$_champ)";
2690
-	$_url = "parametre_url($_url,'var_memotri',strncmp(" . $boucle->modificateur['tri_nom'] . ",'session',7)==0?$_variable:'')";
2691
-	$_on = "\$s?(" . $boucle->modificateur['tri_sens'] . "==$_sens" . '):(' . $boucle->modificateur['tri_champ'] . "==$_champ)";
2690
+	$_url = "parametre_url($_url,'var_memotri',strncmp(".$boucle->modificateur['tri_nom'].",'session',7)==0?$_variable:'')";
2691
+	$_on = "\$s?(".$boucle->modificateur['tri_sens']."==$_sens".'):('.$boucle->modificateur['tri_champ']."==$_champ)";
2692 2692
 
2693
-	$p->code = "lien_ou_expose($_url,$_libelle,$_on" . ($_class ? ",$_class" : "") . ")";
2693
+	$p->code = "lien_ou_expose($_url,$_libelle,$_on".($_class ? ",$_class" : "").")";
2694 2694
 	//$p->code = "''";
2695 2695
 	$p->interdire_scripts = false;
2696 2696
 
@@ -2764,7 +2764,7 @@  discard block
 block discarded – undo
2764 2764
 		$connect = $p->boucles[$p->id_boucle]->sql_serveur;
2765 2765
 	}
2766 2766
 
2767
-	$p->code = "(objet_test_si_publie(" . $_type . ",intval(" . $_id . ")," . _q($connect) . ")?' ':'')";
2767
+	$p->code = "(objet_test_si_publie(".$_type.",intval(".$_id."),"._q($connect).")?' ':'')";
2768 2768
 	$p->interdire_scripts = false;
2769 2769
 
2770 2770
 	return $p;
Please login to merge, or discard this patch.
ecrire/public/phraser_html.php 1 patch
Indentation   +755 added lines, -755 removed lines patch added patch discarded remove patch
@@ -20,7 +20,7 @@  discard block
 block discarded – undo
20 20
  **/
21 21
 
22 22
 if (!defined('_ECRIRE_INC_VERSION')) {
23
-	return;
23
+    return;
24 24
 }
25 25
 
26 26
 /** Début de la partie principale d'une boucle */
@@ -61,83 +61,83 @@  discard block
 block discarded – undo
61 61
 // http://code.spip.net/@phraser_inclure
62 62
 function phraser_inclure($texte, $ligne, $result) {
63 63
 
64
-	while (preg_match(BALISE_INCLURE, $texte, $match)) {
65
-		$match = array_pad($match, 3, null);
66
-		$p = strpos($texte, $match[0]);
67
-		$debut = substr($texte, 0, $p);
68
-		if ($p) {
69
-			$result = phraser_idiomes($debut, $ligne, $result);
70
-		}
71
-		$ligne += substr_count($debut, "\n");
72
-		$champ = new Inclure;
73
-		$champ->ligne = $ligne;
74
-		$ligne += substr_count($match[0], "\n");
75
-		$fichier = $match[2];
76
-		# assurer ici la migration .php3 => .php
77
-		# et de l'ancienne syntaxe INCLURE(page.php3) devenue surperflue
78
-		if ($fichier and preg_match(',^(.*[.]php)3$,', $fichier, $r)) {
79
-			$fichier = $r[1];
80
-		}
81
-		$champ->texte = ($fichier !== 'page.php') ? $fichier : '';
82
-		$texte = substr($texte, $p + strlen($match[0]));
83
-		// on assimile {var=val} a une liste de un argument sans fonction
84
-		phraser_args($texte, "/>", "", $result, $champ);
85
-		if (!$champ->texte or count($champ->param) > 1) {
86
-			if (!function_exists('normaliser_inclure')) {
87
-				include_spip('public/normaliser');
88
-			}
89
-			normaliser_inclure($champ);
90
-		}
91
-		$texte = substr($champ->apres, strpos($champ->apres, '>') + 1);
92
-		$champ->apres = "";
93
-		$texte = preg_replace(',^</INCLU[DR]E>,', '', $texte);
94
-		$result[] = $champ;
95
-	}
96
-
97
-	return (($texte === "") ? $result : phraser_idiomes($texte, $ligne, $result));
64
+    while (preg_match(BALISE_INCLURE, $texte, $match)) {
65
+        $match = array_pad($match, 3, null);
66
+        $p = strpos($texte, $match[0]);
67
+        $debut = substr($texte, 0, $p);
68
+        if ($p) {
69
+            $result = phraser_idiomes($debut, $ligne, $result);
70
+        }
71
+        $ligne += substr_count($debut, "\n");
72
+        $champ = new Inclure;
73
+        $champ->ligne = $ligne;
74
+        $ligne += substr_count($match[0], "\n");
75
+        $fichier = $match[2];
76
+        # assurer ici la migration .php3 => .php
77
+        # et de l'ancienne syntaxe INCLURE(page.php3) devenue surperflue
78
+        if ($fichier and preg_match(',^(.*[.]php)3$,', $fichier, $r)) {
79
+            $fichier = $r[1];
80
+        }
81
+        $champ->texte = ($fichier !== 'page.php') ? $fichier : '';
82
+        $texte = substr($texte, $p + strlen($match[0]));
83
+        // on assimile {var=val} a une liste de un argument sans fonction
84
+        phraser_args($texte, "/>", "", $result, $champ);
85
+        if (!$champ->texte or count($champ->param) > 1) {
86
+            if (!function_exists('normaliser_inclure')) {
87
+                include_spip('public/normaliser');
88
+            }
89
+            normaliser_inclure($champ);
90
+        }
91
+        $texte = substr($champ->apres, strpos($champ->apres, '>') + 1);
92
+        $champ->apres = "";
93
+        $texte = preg_replace(',^</INCLU[DR]E>,', '', $texte);
94
+        $result[] = $champ;
95
+    }
96
+
97
+    return (($texte === "") ? $result : phraser_idiomes($texte, $ligne, $result));
98 98
 }
99 99
 
100 100
 // http://code.spip.net/@phraser_polyglotte
101 101
 function phraser_polyglotte($texte, $ligne, $result) {
102 102
 
103
-	if (preg_match_all(BALISE_POLYGLOTTE, $texte, $m, PREG_SET_ORDER)) {
104
-		foreach ($m as $match) {
105
-			$p = strpos($texte, $match[0]);
106
-			$debut = substr($texte, 0, $p);
107
-			if ($p) {
108
-				$champ = new Texte;
109
-				$champ->texte = $debut;
110
-				$champ->ligne = $ligne;
111
-				$result[] = $champ;
112
-				$ligne += substr_count($champ->texte, "\n");
113
-			}
114
-
115
-			$champ = new Polyglotte;
116
-			$champ->ligne = $ligne;
117
-			$ligne += substr_count($match[0], "\n");
118
-			$lang = '';
119
-			$bloc = $match[1];
120
-			$texte = substr($texte, $p + strlen($match[0]));
121
-			while (preg_match("/^[[:space:]]*([^[{]*)[[:space:]]*[[{]([a-z_]+)[]}](.*)$/si", $bloc, $regs)) {
122
-				$trad = $regs[1];
123
-				if ($trad or $lang) {
124
-					$champ->traductions[$lang] = $trad;
125
-				}
126
-				$lang = $regs[2];
127
-				$bloc = $regs[3];
128
-			}
129
-			$champ->traductions[$lang] = $bloc;
130
-			$result[] = $champ;
131
-		}
132
-	}
133
-	if ($texte !== "") {
134
-		$champ = new Texte;
135
-		$champ->texte = $texte;
136
-		$champ->ligne = $ligne;
137
-		$result[] = $champ;
138
-	}
139
-
140
-	return $result;
103
+    if (preg_match_all(BALISE_POLYGLOTTE, $texte, $m, PREG_SET_ORDER)) {
104
+        foreach ($m as $match) {
105
+            $p = strpos($texte, $match[0]);
106
+            $debut = substr($texte, 0, $p);
107
+            if ($p) {
108
+                $champ = new Texte;
109
+                $champ->texte = $debut;
110
+                $champ->ligne = $ligne;
111
+                $result[] = $champ;
112
+                $ligne += substr_count($champ->texte, "\n");
113
+            }
114
+
115
+            $champ = new Polyglotte;
116
+            $champ->ligne = $ligne;
117
+            $ligne += substr_count($match[0], "\n");
118
+            $lang = '';
119
+            $bloc = $match[1];
120
+            $texte = substr($texte, $p + strlen($match[0]));
121
+            while (preg_match("/^[[:space:]]*([^[{]*)[[:space:]]*[[{]([a-z_]+)[]}](.*)$/si", $bloc, $regs)) {
122
+                $trad = $regs[1];
123
+                if ($trad or $lang) {
124
+                    $champ->traductions[$lang] = $trad;
125
+                }
126
+                $lang = $regs[2];
127
+                $bloc = $regs[3];
128
+            }
129
+            $champ->traductions[$lang] = $bloc;
130
+            $result[] = $champ;
131
+        }
132
+    }
133
+    if ($texte !== "") {
134
+        $champ = new Texte;
135
+        $champ->texte = $texte;
136
+        $champ->ligne = $ligne;
137
+        $result[] = $champ;
138
+    }
139
+
140
+    return $result;
141 141
 }
142 142
 
143 143
 
@@ -159,41 +159,41 @@  discard block
 block discarded – undo
159 159
  * @return array
160 160
  **/
161 161
 function phraser_idiomes($texte, $ligne, $result) {
162
-	while (preg_match(BALISE_IDIOMES, $texte, $match)) {
163
-		$match = array_pad($match, 8, null);
164
-		$p = strpos($texte, $match[0]);
165
-		$ko = (!$match[3] && ($match[5][0] !== '='));
166
-		$debut = substr($texte, 0, $p + ($ko ? strlen($match[0]) : 0));
167
-		if ($debut) {
168
-			$result = phraser_champs($debut, $ligne, $result);
169
-		}
170
-		$texte = substr($texte, $p + strlen($match[0]));
171
-		$ligne += substr_count($debut, "\n");
172
-		if ($ko) {
173
-			continue;
174
-		} // faux idiome
175
-		$champ = new Idiome;
176
-		$champ->ligne = $ligne;
177
-		$ligne += substr_count($match[0], "\n");
178
-		// Stocker les arguments de la balise de traduction
179
-		$args = array();
180
-		$largs = $match[5];
181
-		while (preg_match(BALISE_IDIOMES_ARGS, $largs, $r)) {
182
-			$args[$r[1]] = phraser_champs($r[2], 0, array());
183
-			$largs = substr($largs, strlen($r[0]));
184
-		}
185
-		$champ->arg = $args;
186
-		$champ->nom_champ = strtolower($match[3]);
187
-		$champ->module = $match[2];
188
-		// pas d'imbrication pour les filtres sur langue
189
-		phraser_args($match[7], ":", '', array(), $champ);
190
-		$result[] = $champ;
191
-	}
192
-	if ($texte !== "") {
193
-		$result = phraser_champs($texte, $ligne, $result);
194
-	}
195
-
196
-	return $result;
162
+    while (preg_match(BALISE_IDIOMES, $texte, $match)) {
163
+        $match = array_pad($match, 8, null);
164
+        $p = strpos($texte, $match[0]);
165
+        $ko = (!$match[3] && ($match[5][0] !== '='));
166
+        $debut = substr($texte, 0, $p + ($ko ? strlen($match[0]) : 0));
167
+        if ($debut) {
168
+            $result = phraser_champs($debut, $ligne, $result);
169
+        }
170
+        $texte = substr($texte, $p + strlen($match[0]));
171
+        $ligne += substr_count($debut, "\n");
172
+        if ($ko) {
173
+            continue;
174
+        } // faux idiome
175
+        $champ = new Idiome;
176
+        $champ->ligne = $ligne;
177
+        $ligne += substr_count($match[0], "\n");
178
+        // Stocker les arguments de la balise de traduction
179
+        $args = array();
180
+        $largs = $match[5];
181
+        while (preg_match(BALISE_IDIOMES_ARGS, $largs, $r)) {
182
+            $args[$r[1]] = phraser_champs($r[2], 0, array());
183
+            $largs = substr($largs, strlen($r[0]));
184
+        }
185
+        $champ->arg = $args;
186
+        $champ->nom_champ = strtolower($match[3]);
187
+        $champ->module = $match[2];
188
+        // pas d'imbrication pour les filtres sur langue
189
+        phraser_args($match[7], ":", '', array(), $champ);
190
+        $result[] = $champ;
191
+    }
192
+    if ($texte !== "") {
193
+        $result = phraser_champs($texte, $ligne, $result);
194
+    }
195
+
196
+    return $result;
197 197
 }
198 198
 
199 199
 /**
@@ -211,47 +211,47 @@  discard block
 block discarded – undo
211 211
  * @return array
212 212
  **/
213 213
 function phraser_champs($texte, $ligne, $result) {
214
-	while (preg_match("/" . NOM_DE_CHAMP . "/S", $texte, $match)) {
215
-		$p = strpos($texte, $match[0]);
216
-		// texte après la balise
217
-		$suite = substr($texte, $p + strlen($match[0]));
218
-
219
-		$debut = substr($texte, 0, $p);
220
-		if ($p) {
221
-			$result = phraser_polyglotte($debut, $ligne, $result);
222
-		}
223
-		$ligne += substr_count($debut, "\n");
224
-		$champ = new Champ;
225
-		$champ->ligne = $ligne;
226
-		$ligne += substr_count($match[0], "\n");
227
-		$champ->nom_boucle = $match[2];
228
-		$champ->nom_champ = $match[3];
229
-		$champ->etoile = $match[5];
230
-
231
-		if ($suite and $suite[0] == '{') {
232
-			phraser_arg($suite, '', array(), $champ);
233
-			// ce ltrim est une ereur de conception
234
-			// mais on le conserve par souci de compatibilite
235
-			$texte = ltrim($suite);
236
-			// Il faudrait le normaliser dans l'arbre de syntaxe abstraite
237
-			// pour faire sauter ce cas particulier a la decompilation.
238
-			/* Ce qui suit est malheureusement incomplet pour cela:
214
+    while (preg_match("/" . NOM_DE_CHAMP . "/S", $texte, $match)) {
215
+        $p = strpos($texte, $match[0]);
216
+        // texte après la balise
217
+        $suite = substr($texte, $p + strlen($match[0]));
218
+
219
+        $debut = substr($texte, 0, $p);
220
+        if ($p) {
221
+            $result = phraser_polyglotte($debut, $ligne, $result);
222
+        }
223
+        $ligne += substr_count($debut, "\n");
224
+        $champ = new Champ;
225
+        $champ->ligne = $ligne;
226
+        $ligne += substr_count($match[0], "\n");
227
+        $champ->nom_boucle = $match[2];
228
+        $champ->nom_champ = $match[3];
229
+        $champ->etoile = $match[5];
230
+
231
+        if ($suite and $suite[0] == '{') {
232
+            phraser_arg($suite, '', array(), $champ);
233
+            // ce ltrim est une ereur de conception
234
+            // mais on le conserve par souci de compatibilite
235
+            $texte = ltrim($suite);
236
+            // Il faudrait le normaliser dans l'arbre de syntaxe abstraite
237
+            // pour faire sauter ce cas particulier a la decompilation.
238
+            /* Ce qui suit est malheureusement incomplet pour cela:
239 239
 			if ($n = (strlen($suite) - strlen($texte))) {
240 240
 				$champ->apres = array(new Texte);
241 241
 				$champ->apres[0]->texte = substr($suite,0,$n);
242 242
 			}
243 243
 			*/
244
-		} else {
245
-			$texte = $suite;
246
-		}
247
-		phraser_vieux($champ);
248
-		$result[] = $champ;
249
-	}
250
-	if ($texte !== "") {
251
-		$result = phraser_polyglotte($texte, $ligne, $result);
252
-	}
253
-
254
-	return $result;
244
+        } else {
245
+            $texte = $suite;
246
+        }
247
+        phraser_vieux($champ);
248
+        $result[] = $champ;
249
+    }
250
+    if ($texte !== "") {
251
+        $result = phraser_polyglotte($texte, $ligne, $result);
252
+    }
253
+
254
+    return $result;
255 255
 }
256 256
 
257 257
 // Gestion des imbrications:
@@ -261,15 +261,15 @@  discard block
 block discarded – undo
261 261
 
262 262
 // http://code.spip.net/@phraser_champs_etendus
263 263
 function phraser_champs_etendus($texte, $ligne, $result) {
264
-	if ($texte === "") {
265
-		return $result;
266
-	}
267
-	$sep = '##';
268
-	while (strpos($texte, $sep) !== false) {
269
-		$sep .= '#';
270
-	}
271
-
272
-	return array_merge($result, phraser_champs_interieurs($texte, $ligne, $sep, array()));
264
+    if ($texte === "") {
265
+        return $result;
266
+    }
267
+    $sep = '##';
268
+    while (strpos($texte, $sep) !== false) {
269
+        $sep .= '#';
270
+    }
271
+
272
+    return array_merge($result, phraser_champs_interieurs($texte, $ligne, $sep, array()));
273 273
 }
274 274
 
275 275
 //  Analyse les filtres d'un champ etendu et affecte le resultat
@@ -280,270 +280,270 @@  discard block
 block discarded – undo
280 280
 
281 281
 // http://code.spip.net/@phraser_args
282 282
 function phraser_args($texte, $fin, $sep, $result, &$pointeur_champ) {
283
-	$texte = ltrim($texte);
284
-	while (($texte !== "") && strpos($fin, $texte[0]) === false) {
285
-		$result = phraser_arg($texte, $sep, $result, $pointeur_champ);
286
-		$texte = ltrim($texte);
287
-	}
283
+    $texte = ltrim($texte);
284
+    while (($texte !== "") && strpos($fin, $texte[0]) === false) {
285
+        $result = phraser_arg($texte, $sep, $result, $pointeur_champ);
286
+        $texte = ltrim($texte);
287
+    }
288 288
 # mettre ici la suite du texte, 
289 289
 # notamment pour que l'appelant vire le caractere fermant si besoin
290
-	$pointeur_champ->apres = $texte;
290
+    $pointeur_champ->apres = $texte;
291 291
 
292
-	return $result;
292
+    return $result;
293 293
 }
294 294
 
295 295
 // http://code.spip.net/@phraser_arg
296 296
 function phraser_arg(&$texte, $sep, $result, &$pointeur_champ) {
297
-	preg_match(",^(\|?[^}{)|]*)(.*)$,ms", $texte, $match);
298
-	$suite = ltrim($match[2]);
299
-	$fonc = trim($match[1]);
300
-	if ($fonc && $fonc[0] == "|") {
301
-		$fonc = ltrim(substr($fonc, 1));
302
-	}
303
-	$res = array($fonc);
304
-	$err_f = '';
305
-	// cas du filtre sans argument ou du critere /
306
-	if (($suite && ($suite[0] != '{')) || ($fonc && $fonc[0] == '/')) {
307
-		// si pas d'argument, alors il faut une fonction ou un double |
308
-		if (!$match[1]) {
309
-			$err_f = array('zbug_erreur_filtre', array('filtre' => $texte));
310
-			erreur_squelette($err_f, $pointeur_champ);
311
-			$texte = '';
312
-		} else {
313
-			$texte = $suite;
314
-		}
315
-		if ($err_f) {
316
-			$pointeur_champ->param = false;
317
-		} elseif ($fonc !== '') {
318
-			$pointeur_champ->param[] = $res;
319
-		}
320
-		// pour les balises avec faux filtres qui boudent ce dur larbeur
321
-		$pointeur_champ->fonctions[] = array($fonc, '');
322
-
323
-		return $result;
324
-	}
325
-	$args = ltrim(substr($suite, 1)); // virer le '(' initial
326
-	$collecte = array();
327
-	while ($args && $args[0] != '}') {
328
-		if ($args[0] == '"') {
329
-			preg_match('/^(")([^"]*)(")(.*)$/ms', $args, $regs);
330
-		} elseif ($args[0] == "'") {
331
-			preg_match("/^(')([^']*)(')(.*)$/ms", $args, $regs);
332
-		} else {
333
-			preg_match("/^([[:space:]]*)([^,([{}]*([(\[{][^])}]*[])}])?[^,}]*)([,}].*)$/ms", $args, $regs);
334
-			if (!strlen($regs[2])) {
335
-				$err_f = array('zbug_erreur_filtre', array('filtre' => $args));
336
-				erreur_squelette($err_f, $pointeur_champ);
337
-				$champ = new Texte;
338
-				$champ->apres = $champ->avant = $args = "";
339
-				break;
340
-			}
341
-		}
342
-		$arg = $regs[2];
343
-		if (trim($regs[1])) {
344
-			$champ = new Texte;
345
-			$champ->texte = $arg;
346
-			$champ->apres = $champ->avant = $regs[1];
347
-			$result[] = $champ;
348
-			$collecte[] = $champ;
349
-			$args = ltrim($regs[count($regs) - 1]);
350
-		} else {
351
-			if (!preg_match("/" . NOM_DE_CHAMP . "([{|])/", $arg, $r)) {
352
-				// 0 est un aveu d'impuissance. A completer
353
-				$arg = phraser_champs_exterieurs($arg, 0, $sep, $result);
354
-
355
-				$args = ltrim($regs[count($regs) - 1]);
356
-				$collecte = array_merge($collecte, $arg);
357
-				$result = array_merge($result, $arg);
358
-			} else {
359
-				$n = strpos($args, $r[0]);
360
-				$pred = substr($args, 0, $n);
361
-				$par = ',}';
362
-				if (preg_match('/^(.*)\($/', $pred, $m)) {
363
-					$pred = $m[1];
364
-					$par = ')';
365
-				}
366
-				if ($pred) {
367
-					$champ = new Texte;
368
-					$champ->texte = $pred;
369
-					$champ->apres = $champ->avant = "";
370
-					$result[] = $champ;
371
-					$collecte[] = $champ;
372
-				}
373
-				$rec = substr($args, $n + strlen($r[0]) - 1);
374
-				$champ = new Champ;
375
-				$champ->nom_boucle = $r[2];
376
-				$champ->nom_champ = $r[3];
377
-				$champ->etoile = $r[5];
378
-				$next = $r[6];
379
-				while ($next == '{') {
380
-					phraser_arg($rec, $sep, array(), $champ);
381
-					$args = ltrim($rec);
382
-					$next = isset($args[0]) ? $args[0] : '';
383
-				}
384
-				while ($next == '|') {
385
-					phraser_args($rec, $par, $sep, array(), $champ);
386
-					$args = $champ->apres;
387
-					$champ->apres = '';
388
-					$next = isset($args[0]) ? $args[0] : '';
389
-				}
390
-				// Si erreur de syntaxe dans un sous-argument, propager.
391
-				if ($champ->param === false) {
392
-					$err_f = true;
393
-				} else {
394
-					phraser_vieux($champ);
395
-				}
396
-				if ($par == ')') {
397
-					$args = substr($args, 1);
398
-				}
399
-				$collecte[] = $champ;
400
-				$result[] = $champ;
401
-			}
402
-		}
403
-		if (isset($args[0]) and $args[0] == ',') {
404
-			$args = ltrim(substr($args, 1));
405
-			if ($collecte) {
406
-				$res[] = $collecte;
407
-				$collecte = array();
408
-			}
409
-		}
410
-	}
411
-	if ($collecte) {
412
-		$res[] = $collecte;
413
-		$collecte = array();
414
-	}
415
-	$texte = substr($args, 1);
416
-	$source = substr($suite, 0, strlen($suite) - strlen($texte));
417
-	// propager les erreurs, et ignorer les param vides
418
-	if ($pointeur_champ->param !== false) {
419
-		if ($err_f) {
420
-			$pointeur_champ->param = false;
421
-		} elseif ($fonc !== '' || count($res) > 1) {
422
-			$pointeur_champ->param[] = $res;
423
-		}
424
-	}
425
-	// pour les balises avec faux filtres qui boudent ce dur larbeur
426
-	$pointeur_champ->fonctions[] = array($fonc, $source);
427
-
428
-	return $result;
297
+    preg_match(",^(\|?[^}{)|]*)(.*)$,ms", $texte, $match);
298
+    $suite = ltrim($match[2]);
299
+    $fonc = trim($match[1]);
300
+    if ($fonc && $fonc[0] == "|") {
301
+        $fonc = ltrim(substr($fonc, 1));
302
+    }
303
+    $res = array($fonc);
304
+    $err_f = '';
305
+    // cas du filtre sans argument ou du critere /
306
+    if (($suite && ($suite[0] != '{')) || ($fonc && $fonc[0] == '/')) {
307
+        // si pas d'argument, alors il faut une fonction ou un double |
308
+        if (!$match[1]) {
309
+            $err_f = array('zbug_erreur_filtre', array('filtre' => $texte));
310
+            erreur_squelette($err_f, $pointeur_champ);
311
+            $texte = '';
312
+        } else {
313
+            $texte = $suite;
314
+        }
315
+        if ($err_f) {
316
+            $pointeur_champ->param = false;
317
+        } elseif ($fonc !== '') {
318
+            $pointeur_champ->param[] = $res;
319
+        }
320
+        // pour les balises avec faux filtres qui boudent ce dur larbeur
321
+        $pointeur_champ->fonctions[] = array($fonc, '');
322
+
323
+        return $result;
324
+    }
325
+    $args = ltrim(substr($suite, 1)); // virer le '(' initial
326
+    $collecte = array();
327
+    while ($args && $args[0] != '}') {
328
+        if ($args[0] == '"') {
329
+            preg_match('/^(")([^"]*)(")(.*)$/ms', $args, $regs);
330
+        } elseif ($args[0] == "'") {
331
+            preg_match("/^(')([^']*)(')(.*)$/ms", $args, $regs);
332
+        } else {
333
+            preg_match("/^([[:space:]]*)([^,([{}]*([(\[{][^])}]*[])}])?[^,}]*)([,}].*)$/ms", $args, $regs);
334
+            if (!strlen($regs[2])) {
335
+                $err_f = array('zbug_erreur_filtre', array('filtre' => $args));
336
+                erreur_squelette($err_f, $pointeur_champ);
337
+                $champ = new Texte;
338
+                $champ->apres = $champ->avant = $args = "";
339
+                break;
340
+            }
341
+        }
342
+        $arg = $regs[2];
343
+        if (trim($regs[1])) {
344
+            $champ = new Texte;
345
+            $champ->texte = $arg;
346
+            $champ->apres = $champ->avant = $regs[1];
347
+            $result[] = $champ;
348
+            $collecte[] = $champ;
349
+            $args = ltrim($regs[count($regs) - 1]);
350
+        } else {
351
+            if (!preg_match("/" . NOM_DE_CHAMP . "([{|])/", $arg, $r)) {
352
+                // 0 est un aveu d'impuissance. A completer
353
+                $arg = phraser_champs_exterieurs($arg, 0, $sep, $result);
354
+
355
+                $args = ltrim($regs[count($regs) - 1]);
356
+                $collecte = array_merge($collecte, $arg);
357
+                $result = array_merge($result, $arg);
358
+            } else {
359
+                $n = strpos($args, $r[0]);
360
+                $pred = substr($args, 0, $n);
361
+                $par = ',}';
362
+                if (preg_match('/^(.*)\($/', $pred, $m)) {
363
+                    $pred = $m[1];
364
+                    $par = ')';
365
+                }
366
+                if ($pred) {
367
+                    $champ = new Texte;
368
+                    $champ->texte = $pred;
369
+                    $champ->apres = $champ->avant = "";
370
+                    $result[] = $champ;
371
+                    $collecte[] = $champ;
372
+                }
373
+                $rec = substr($args, $n + strlen($r[0]) - 1);
374
+                $champ = new Champ;
375
+                $champ->nom_boucle = $r[2];
376
+                $champ->nom_champ = $r[3];
377
+                $champ->etoile = $r[5];
378
+                $next = $r[6];
379
+                while ($next == '{') {
380
+                    phraser_arg($rec, $sep, array(), $champ);
381
+                    $args = ltrim($rec);
382
+                    $next = isset($args[0]) ? $args[0] : '';
383
+                }
384
+                while ($next == '|') {
385
+                    phraser_args($rec, $par, $sep, array(), $champ);
386
+                    $args = $champ->apres;
387
+                    $champ->apres = '';
388
+                    $next = isset($args[0]) ? $args[0] : '';
389
+                }
390
+                // Si erreur de syntaxe dans un sous-argument, propager.
391
+                if ($champ->param === false) {
392
+                    $err_f = true;
393
+                } else {
394
+                    phraser_vieux($champ);
395
+                }
396
+                if ($par == ')') {
397
+                    $args = substr($args, 1);
398
+                }
399
+                $collecte[] = $champ;
400
+                $result[] = $champ;
401
+            }
402
+        }
403
+        if (isset($args[0]) and $args[0] == ',') {
404
+            $args = ltrim(substr($args, 1));
405
+            if ($collecte) {
406
+                $res[] = $collecte;
407
+                $collecte = array();
408
+            }
409
+        }
410
+    }
411
+    if ($collecte) {
412
+        $res[] = $collecte;
413
+        $collecte = array();
414
+    }
415
+    $texte = substr($args, 1);
416
+    $source = substr($suite, 0, strlen($suite) - strlen($texte));
417
+    // propager les erreurs, et ignorer les param vides
418
+    if ($pointeur_champ->param !== false) {
419
+        if ($err_f) {
420
+            $pointeur_champ->param = false;
421
+        } elseif ($fonc !== '' || count($res) > 1) {
422
+            $pointeur_champ->param[] = $res;
423
+        }
424
+    }
425
+    // pour les balises avec faux filtres qui boudent ce dur larbeur
426
+    $pointeur_champ->fonctions[] = array($fonc, $source);
427
+
428
+    return $result;
429 429
 }
430 430
 
431 431
 
432 432
 // http://code.spip.net/@phraser_champs_exterieurs
433 433
 function phraser_champs_exterieurs($texte, $ligne, $sep, $nested) {
434
-	$res = array();
435
-	while (($p = strpos($texte, "%$sep")) !== false) {
436
-		if (!preg_match(',^%' . preg_quote($sep) . '([0-9]+)@,', substr($texte, $p), $m)) {
437
-			break;
438
-		}
439
-		$debut = substr($texte, 0, $p);
440
-		$texte = substr($texte, $p + strlen($m[0]));
441
-		if ($p) {
442
-			$res = phraser_inclure($debut, $ligne, $res);
443
-		}
444
-		$ligne += substr_count($debut, "\n");
445
-		$res[] = $nested[$m[1]];
446
-	}
447
-
448
-	return (($texte === '') ? $res : phraser_inclure($texte, $ligne, $res));
434
+    $res = array();
435
+    while (($p = strpos($texte, "%$sep")) !== false) {
436
+        if (!preg_match(',^%' . preg_quote($sep) . '([0-9]+)@,', substr($texte, $p), $m)) {
437
+            break;
438
+        }
439
+        $debut = substr($texte, 0, $p);
440
+        $texte = substr($texte, $p + strlen($m[0]));
441
+        if ($p) {
442
+            $res = phraser_inclure($debut, $ligne, $res);
443
+        }
444
+        $ligne += substr_count($debut, "\n");
445
+        $res[] = $nested[$m[1]];
446
+    }
447
+
448
+    return (($texte === '') ? $res : phraser_inclure($texte, $ligne, $res));
449 449
 }
450 450
 
451 451
 // http://code.spip.net/@phraser_champs_interieurs
452 452
 function phraser_champs_interieurs($texte, $ligne, $sep, $result) {
453
-	$i = 0; // en fait count($result)
454
-	$x = "";
455
-
456
-	while (true) {
457
-		$j = $i;
458
-		$n = $ligne;
459
-		while (preg_match(CHAMP_ETENDU, $texte, $match)) {
460
-			$p = strpos($texte, $match[0]);
461
-			$debut = substr($texte, 0, $p);
462
-			if ($p) {
463
-				$result[$i] = $debut;
464
-				$i++;
465
-			}
466
-			$nom = $match[4];
467
-			$champ = new Champ;
468
-			// ca ne marche pas encore en cas de champ imbrique
469
-			$champ->ligne = $x ? 0 : ($n + substr_count($debut, "\n"));
470
-			$champ->nom_boucle = $match[3];
471
-			$champ->nom_champ = $nom;
472
-			$champ->etoile = $match[6];
473
-			// phraser_args indiquera ou commence apres
474
-			$result = phraser_args($match[7], ")", $sep, $result, $champ);
475
-			phraser_vieux($champ);
476
-			$champ->avant =
477
-				phraser_champs_exterieurs($match[1], $n, $sep, $result);
478
-			$debut = substr($champ->apres, 1);
479
-			if (!empty($debut)) {
480
-				$n += substr_count(substr($texte, 0, strpos($texte, $debut)), "\n");
481
-			}
482
-			$champ->apres = phraser_champs_exterieurs($debut, $n, $sep, $result);
483
-
484
-			$result[$i] = $champ;
485
-			$i++;
486
-			$texte = substr($texte, $p + strlen($match[0]));
487
-		}
488
-		if ($texte !== "") {
489
-			$result[$i] = $texte;
490
-			$i++;
491
-		}
492
-		$x = '';
493
-
494
-		while ($j < $i) {
495
-			$z = $result[$j];
496
-			// j'aurais besoin de connaitre le nombre de lignes...
497
-			if (is_object($z)) {
498
-				$x .= "%$sep$j@";
499
-			} else {
500
-				$x .= $z;
501
-			}
502
-			$j++;
503
-		}
504
-		if (preg_match(CHAMP_ETENDU, $x)) {
505
-			$texte = $x;
506
-		} else {
507
-			return phraser_champs_exterieurs($x, $ligne, $sep, $result);
508
-		}
509
-	}
453
+    $i = 0; // en fait count($result)
454
+    $x = "";
455
+
456
+    while (true) {
457
+        $j = $i;
458
+        $n = $ligne;
459
+        while (preg_match(CHAMP_ETENDU, $texte, $match)) {
460
+            $p = strpos($texte, $match[0]);
461
+            $debut = substr($texte, 0, $p);
462
+            if ($p) {
463
+                $result[$i] = $debut;
464
+                $i++;
465
+            }
466
+            $nom = $match[4];
467
+            $champ = new Champ;
468
+            // ca ne marche pas encore en cas de champ imbrique
469
+            $champ->ligne = $x ? 0 : ($n + substr_count($debut, "\n"));
470
+            $champ->nom_boucle = $match[3];
471
+            $champ->nom_champ = $nom;
472
+            $champ->etoile = $match[6];
473
+            // phraser_args indiquera ou commence apres
474
+            $result = phraser_args($match[7], ")", $sep, $result, $champ);
475
+            phraser_vieux($champ);
476
+            $champ->avant =
477
+                phraser_champs_exterieurs($match[1], $n, $sep, $result);
478
+            $debut = substr($champ->apres, 1);
479
+            if (!empty($debut)) {
480
+                $n += substr_count(substr($texte, 0, strpos($texte, $debut)), "\n");
481
+            }
482
+            $champ->apres = phraser_champs_exterieurs($debut, $n, $sep, $result);
483
+
484
+            $result[$i] = $champ;
485
+            $i++;
486
+            $texte = substr($texte, $p + strlen($match[0]));
487
+        }
488
+        if ($texte !== "") {
489
+            $result[$i] = $texte;
490
+            $i++;
491
+        }
492
+        $x = '';
493
+
494
+        while ($j < $i) {
495
+            $z = $result[$j];
496
+            // j'aurais besoin de connaitre le nombre de lignes...
497
+            if (is_object($z)) {
498
+                $x .= "%$sep$j@";
499
+            } else {
500
+                $x .= $z;
501
+            }
502
+            $j++;
503
+        }
504
+        if (preg_match(CHAMP_ETENDU, $x)) {
505
+            $texte = $x;
506
+        } else {
507
+            return phraser_champs_exterieurs($x, $ligne, $sep, $result);
508
+        }
509
+    }
510 510
 }
511 511
 
512 512
 function phraser_vieux(&$champ) {
513
-	$nom = $champ->nom_champ;
514
-	if ($nom == 'EMBED_DOCUMENT') {
515
-		if (!function_exists('phraser_vieux_emb')) {
516
-			include_spip('public/normaliser');
517
-		}
518
-		phraser_vieux_emb($champ);
519
-	} elseif ($nom == 'EXPOSER') {
520
-		if (!function_exists('phraser_vieux_exposer')) {
521
-			include_spip('public/normaliser');
522
-		}
523
-		phraser_vieux_exposer($champ);
524
-	} elseif ($champ->param) {
525
-		if ($nom == 'FORMULAIRE_RECHERCHE') {
526
-			if (!function_exists('phraser_vieux_recherche')) {
527
-				include_spip('public/normaliser');
528
-			}
529
-			phraser_vieux_recherche($champ);
530
-		} elseif (preg_match(",^LOGO_[A-Z]+,", $nom)) {
531
-			if (!function_exists('phraser_vieux_logos')) {
532
-				include_spip('public/normaliser');
533
-			}
534
-			phraser_vieux_logos($champ);
535
-		} elseif ($nom == 'MODELE') {
536
-			if (!function_exists('phraser_vieux_modele')) {
537
-				include_spip('public/normaliser');
538
-			}
539
-			phraser_vieux_modele($champ);
540
-		} elseif ($nom == 'INCLURE' or $nom == 'INCLUDE') {
541
-			if (!function_exists('phraser_vieux_inclu')) {
542
-				include_spip('public/normaliser');
543
-			}
544
-			phraser_vieux_inclu($champ);
545
-		}
546
-	}
513
+    $nom = $champ->nom_champ;
514
+    if ($nom == 'EMBED_DOCUMENT') {
515
+        if (!function_exists('phraser_vieux_emb')) {
516
+            include_spip('public/normaliser');
517
+        }
518
+        phraser_vieux_emb($champ);
519
+    } elseif ($nom == 'EXPOSER') {
520
+        if (!function_exists('phraser_vieux_exposer')) {
521
+            include_spip('public/normaliser');
522
+        }
523
+        phraser_vieux_exposer($champ);
524
+    } elseif ($champ->param) {
525
+        if ($nom == 'FORMULAIRE_RECHERCHE') {
526
+            if (!function_exists('phraser_vieux_recherche')) {
527
+                include_spip('public/normaliser');
528
+            }
529
+            phraser_vieux_recherche($champ);
530
+        } elseif (preg_match(",^LOGO_[A-Z]+,", $nom)) {
531
+            if (!function_exists('phraser_vieux_logos')) {
532
+                include_spip('public/normaliser');
533
+            }
534
+            phraser_vieux_logos($champ);
535
+        } elseif ($nom == 'MODELE') {
536
+            if (!function_exists('phraser_vieux_modele')) {
537
+                include_spip('public/normaliser');
538
+            }
539
+            phraser_vieux_modele($champ);
540
+        } elseif ($nom == 'INCLURE' or $nom == 'INCLUDE') {
541
+            if (!function_exists('phraser_vieux_inclu')) {
542
+                include_spip('public/normaliser');
543
+            }
544
+            phraser_vieux_inclu($champ);
545
+        }
546
+    }
547 547
 }
548 548
 
549 549
 
@@ -571,373 +571,373 @@  discard block
 block discarded – undo
571 571
  **/
572 572
 function phraser_criteres($params, &$result) {
573 573
 
574
-	$err_ci = ''; // indiquera s'il y a eu une erreur
575
-	$args = array();
576
-	$type = $result->type_requete;
577
-	$doublons = array();
578
-	foreach ($params as $v) {
579
-		$var = $v[1][0];
580
-		$param = ($var->type != 'texte') ? "" : $var->texte;
581
-		if ((count($v) > 2) && (!preg_match(",[^A-Za-z]IN[^A-Za-z],i", $param))) {
582
-			// plus d'un argument et pas le critere IN:
583
-			// detecter comme on peut si c'est le critere implicite LIMIT debut, fin
584
-			if ($var->type != 'texte'
585
-				or preg_match("/^(n|n-|(n-)?\d+)$/S", $param)
586
-			) {
587
-				$op = ',';
588
-				$not = "";
589
-				$cond = false;
590
-			} else {
591
-				// Le debut du premier argument est l'operateur
592
-				preg_match("/^([!]?)([a-zA-Z][a-zA-Z0-9_]*)[[:space:]]*(\??)[[:space:]]*(.*)$/ms", $param, $m);
593
-				$op = $m[2];
594
-				$not = $m[1];
595
-				$cond = $m[3];
596
-				// virer le premier argument,
597
-				// et mettre son reliquat eventuel
598
-				// Recopier pour ne pas alterer le texte source
599
-				// utile au debusqueur
600
-				if ($m[4]) {
601
-					// une maniere tres sale de supprimer les "' autour de {critere "xxx","yyy"}
602
-					if (preg_match(',^(["\'])(.*)\1$,', $m[4])) {
603
-						$c = null;
604
-						eval('$c = ' . $m[4] . ';');
605
-						if (isset($c)) {
606
-							$m[4] = $c;
607
-						}
608
-					}
609
-					$texte = new Texte;
610
-					$texte->texte = $m[4];
611
-					$v[1][0] = $texte;
612
-				} else {
613
-					array_shift($v[1]);
614
-				}
615
-			}
616
-			array_shift($v); // $v[O] est vide
617
-			$crit = new Critere;
618
-			$crit->op = $op;
619
-			$crit->not = $not;
620
-			$crit->cond = $cond;
621
-			$crit->exclus = "";
622
-			$crit->param = $v;
623
-			$args[] = $crit;
624
-		} else {
625
-			if ($var->type != 'texte') {
626
-				// cas 1 seul arg ne commencant pas par du texte brut: 
627
-				// erreur ou critere infixe "/"
628
-				if (($v[1][1]->type != 'texte') || (trim($v[1][1]->texte) != '/')) {
629
-					$err_ci = array(
630
-						'zbug_critere_inconnu',
631
-						array('critere' => $var->nom_champ)
632
-					);
633
-					erreur_squelette($err_ci, $result);
634
-				} else {
635
-					$crit = new Critere;
636
-					$crit->op = '/';
637
-					$crit->not = "";
638
-					$crit->exclus = "";
639
-					$crit->param = array(array($v[1][0]), array($v[1][2]));
640
-					$args[] = $crit;
641
-				}
642
-			} else {
643
-				// traiter qq lexemes particuliers pour faciliter la suite
644
-				// les separateurs
645
-				if ($var->apres) {
646
-					$result->separateur[] = $param;
647
-				} elseif (($param == 'tout') or ($param == 'tous')) {
648
-					$result->modificateur['tout'] = true;
649
-				} elseif ($param == 'plat') {
650
-					$result->modificateur['plat'] = true;
651
-				}
652
-
653
-				// Boucle hierarchie, analyser le critere id_rubrique
654
-				// et les autres critères {id_x} pour forcer {tout} sur
655
-				// ceux-ci pour avoir la rubrique mere...
656
-				// Les autres critères de la boucle hierarchie doivent être
657
-				// traités normalement.
658
-				elseif (strcasecmp($type, 'hierarchie') == 0
659
-					and !preg_match(",^id_rubrique\b,", $param)
660
-					and preg_match(",^id_\w+\s*$,", $param)
661
-				) {
662
-					$result->modificateur['tout'] = true;
663
-				} elseif (strcasecmp($type, 'hierarchie') == 0 and $param == "id_rubrique") {
664
-					// rien a faire sur {id_rubrique} tout seul
665
-				} else {
666
-					// pas d'emplacement statique, faut un dynamique
667
-					// mais il y a 2 cas qui ont les 2 !
668
-					if (($param == 'unique') || (preg_match(',^!?doublons *,', $param))) {
669
-						// cette variable sera inseree dans le code
670
-						// et son nom sert d'indicateur des maintenant
671
-						$result->doublons = '$doublons_index';
672
-						if ($param == 'unique') {
673
-							$param = 'doublons';
674
-						}
675
-					} elseif ($param == 'recherche') {
676
-						// meme chose (a cause de #nom_de_boucle:URL_*)
677
-						$result->hash = ' ';
678
-					}
679
-
680
-					if (preg_match(',^ *([0-9-]+) *(/) *(.+) *$,', $param, $m)) {
681
-						$crit = phraser_critere_infixe($m[1], $m[3], $v, '/', '', '');
682
-					} elseif (preg_match(',^([!]?)(' . CHAMP_SQL_PLUS_FONC .
683
-						')[[:space:]]*(\??)(!?)(<=?|>=?|==?|\b(?:IN|LIKE)\b)(.*)$,is', $param, $m)) {
684
-						$a2 = trim($m[8]);
685
-						if ($a2 and ($a2[0] == "'" or $a2[0] == '"') and ($a2[0] == substr($a2, -1))) {
686
-							$a2 = substr($a2, 1, -1);
687
-						}
688
-						$crit = phraser_critere_infixe($m[2], $a2, $v,
689
-							(($m[2] == 'lang_select') ? $m[2] : $m[7]),
690
-							$m[6], $m[5]);
691
-						$crit->exclus = $m[1];
692
-					} elseif (preg_match("/^([!]?)\s*(" .
693
-						CHAMP_SQL_PLUS_FONC .
694
-						")\s*(\??)(.*)$/is", $param, $m)) {
695
-						// contient aussi les comparaisons implicites !
696
-						// Comme ci-dessus: 
697
-						// le premier arg contient l'operateur
698
-						array_shift($v);
699
-						if ($m[6]) {
700
-							$v[0][0] = new Texte;
701
-							$v[0][0]->texte = $m[6];
702
-						} else {
703
-							array_shift($v[0]);
704
-							if (!$v[0]) {
705
-								array_shift($v);
706
-							}
707
-						}
708
-						$crit = new Critere;
709
-						$crit->op = $m[2];
710
-						$crit->param = $v;
711
-						$crit->not = $m[1];
712
-						$crit->cond = $m[5];
713
-					} else {
714
-						$err_ci = array(
715
-							'zbug_critere_inconnu',
716
-							array('critere' => $param)
717
-						);
718
-						erreur_squelette($err_ci, $result);
719
-					}
720
-
721
-					if ((!preg_match(',^!?doublons *,', $param)) || $crit->not) {
722
-						$args[] = $crit;
723
-					} else {
724
-						$doublons[] = $crit;
725
-					}
726
-				}
727
-			}
728
-		}
729
-	}
730
-
731
-	// les doublons non nies doivent etre le dernier critere
732
-	// pour que la variable $doublon_index ait la bonne valeur
733
-	// cf critere_doublon
734
-	if ($doublons) {
735
-		$args = array_merge($args, $doublons);
736
-	}
737
-
738
-	// Si erreur, laisser la chaine dans ce champ pour le HTTP 503
739
-	if (!$err_ci) {
740
-		$result->criteres = $args;
741
-	}
574
+    $err_ci = ''; // indiquera s'il y a eu une erreur
575
+    $args = array();
576
+    $type = $result->type_requete;
577
+    $doublons = array();
578
+    foreach ($params as $v) {
579
+        $var = $v[1][0];
580
+        $param = ($var->type != 'texte') ? "" : $var->texte;
581
+        if ((count($v) > 2) && (!preg_match(",[^A-Za-z]IN[^A-Za-z],i", $param))) {
582
+            // plus d'un argument et pas le critere IN:
583
+            // detecter comme on peut si c'est le critere implicite LIMIT debut, fin
584
+            if ($var->type != 'texte'
585
+                or preg_match("/^(n|n-|(n-)?\d+)$/S", $param)
586
+            ) {
587
+                $op = ',';
588
+                $not = "";
589
+                $cond = false;
590
+            } else {
591
+                // Le debut du premier argument est l'operateur
592
+                preg_match("/^([!]?)([a-zA-Z][a-zA-Z0-9_]*)[[:space:]]*(\??)[[:space:]]*(.*)$/ms", $param, $m);
593
+                $op = $m[2];
594
+                $not = $m[1];
595
+                $cond = $m[3];
596
+                // virer le premier argument,
597
+                // et mettre son reliquat eventuel
598
+                // Recopier pour ne pas alterer le texte source
599
+                // utile au debusqueur
600
+                if ($m[4]) {
601
+                    // une maniere tres sale de supprimer les "' autour de {critere "xxx","yyy"}
602
+                    if (preg_match(',^(["\'])(.*)\1$,', $m[4])) {
603
+                        $c = null;
604
+                        eval('$c = ' . $m[4] . ';');
605
+                        if (isset($c)) {
606
+                            $m[4] = $c;
607
+                        }
608
+                    }
609
+                    $texte = new Texte;
610
+                    $texte->texte = $m[4];
611
+                    $v[1][0] = $texte;
612
+                } else {
613
+                    array_shift($v[1]);
614
+                }
615
+            }
616
+            array_shift($v); // $v[O] est vide
617
+            $crit = new Critere;
618
+            $crit->op = $op;
619
+            $crit->not = $not;
620
+            $crit->cond = $cond;
621
+            $crit->exclus = "";
622
+            $crit->param = $v;
623
+            $args[] = $crit;
624
+        } else {
625
+            if ($var->type != 'texte') {
626
+                // cas 1 seul arg ne commencant pas par du texte brut: 
627
+                // erreur ou critere infixe "/"
628
+                if (($v[1][1]->type != 'texte') || (trim($v[1][1]->texte) != '/')) {
629
+                    $err_ci = array(
630
+                        'zbug_critere_inconnu',
631
+                        array('critere' => $var->nom_champ)
632
+                    );
633
+                    erreur_squelette($err_ci, $result);
634
+                } else {
635
+                    $crit = new Critere;
636
+                    $crit->op = '/';
637
+                    $crit->not = "";
638
+                    $crit->exclus = "";
639
+                    $crit->param = array(array($v[1][0]), array($v[1][2]));
640
+                    $args[] = $crit;
641
+                }
642
+            } else {
643
+                // traiter qq lexemes particuliers pour faciliter la suite
644
+                // les separateurs
645
+                if ($var->apres) {
646
+                    $result->separateur[] = $param;
647
+                } elseif (($param == 'tout') or ($param == 'tous')) {
648
+                    $result->modificateur['tout'] = true;
649
+                } elseif ($param == 'plat') {
650
+                    $result->modificateur['plat'] = true;
651
+                }
652
+
653
+                // Boucle hierarchie, analyser le critere id_rubrique
654
+                // et les autres critères {id_x} pour forcer {tout} sur
655
+                // ceux-ci pour avoir la rubrique mere...
656
+                // Les autres critères de la boucle hierarchie doivent être
657
+                // traités normalement.
658
+                elseif (strcasecmp($type, 'hierarchie') == 0
659
+                    and !preg_match(",^id_rubrique\b,", $param)
660
+                    and preg_match(",^id_\w+\s*$,", $param)
661
+                ) {
662
+                    $result->modificateur['tout'] = true;
663
+                } elseif (strcasecmp($type, 'hierarchie') == 0 and $param == "id_rubrique") {
664
+                    // rien a faire sur {id_rubrique} tout seul
665
+                } else {
666
+                    // pas d'emplacement statique, faut un dynamique
667
+                    // mais il y a 2 cas qui ont les 2 !
668
+                    if (($param == 'unique') || (preg_match(',^!?doublons *,', $param))) {
669
+                        // cette variable sera inseree dans le code
670
+                        // et son nom sert d'indicateur des maintenant
671
+                        $result->doublons = '$doublons_index';
672
+                        if ($param == 'unique') {
673
+                            $param = 'doublons';
674
+                        }
675
+                    } elseif ($param == 'recherche') {
676
+                        // meme chose (a cause de #nom_de_boucle:URL_*)
677
+                        $result->hash = ' ';
678
+                    }
679
+
680
+                    if (preg_match(',^ *([0-9-]+) *(/) *(.+) *$,', $param, $m)) {
681
+                        $crit = phraser_critere_infixe($m[1], $m[3], $v, '/', '', '');
682
+                    } elseif (preg_match(',^([!]?)(' . CHAMP_SQL_PLUS_FONC .
683
+                        ')[[:space:]]*(\??)(!?)(<=?|>=?|==?|\b(?:IN|LIKE)\b)(.*)$,is', $param, $m)) {
684
+                        $a2 = trim($m[8]);
685
+                        if ($a2 and ($a2[0] == "'" or $a2[0] == '"') and ($a2[0] == substr($a2, -1))) {
686
+                            $a2 = substr($a2, 1, -1);
687
+                        }
688
+                        $crit = phraser_critere_infixe($m[2], $a2, $v,
689
+                            (($m[2] == 'lang_select') ? $m[2] : $m[7]),
690
+                            $m[6], $m[5]);
691
+                        $crit->exclus = $m[1];
692
+                    } elseif (preg_match("/^([!]?)\s*(" .
693
+                        CHAMP_SQL_PLUS_FONC .
694
+                        ")\s*(\??)(.*)$/is", $param, $m)) {
695
+                        // contient aussi les comparaisons implicites !
696
+                        // Comme ci-dessus: 
697
+                        // le premier arg contient l'operateur
698
+                        array_shift($v);
699
+                        if ($m[6]) {
700
+                            $v[0][0] = new Texte;
701
+                            $v[0][0]->texte = $m[6];
702
+                        } else {
703
+                            array_shift($v[0]);
704
+                            if (!$v[0]) {
705
+                                array_shift($v);
706
+                            }
707
+                        }
708
+                        $crit = new Critere;
709
+                        $crit->op = $m[2];
710
+                        $crit->param = $v;
711
+                        $crit->not = $m[1];
712
+                        $crit->cond = $m[5];
713
+                    } else {
714
+                        $err_ci = array(
715
+                            'zbug_critere_inconnu',
716
+                            array('critere' => $param)
717
+                        );
718
+                        erreur_squelette($err_ci, $result);
719
+                    }
720
+
721
+                    if ((!preg_match(',^!?doublons *,', $param)) || $crit->not) {
722
+                        $args[] = $crit;
723
+                    } else {
724
+                        $doublons[] = $crit;
725
+                    }
726
+                }
727
+            }
728
+        }
729
+    }
730
+
731
+    // les doublons non nies doivent etre le dernier critere
732
+    // pour que la variable $doublon_index ait la bonne valeur
733
+    // cf critere_doublon
734
+    if ($doublons) {
735
+        $args = array_merge($args, $doublons);
736
+    }
737
+
738
+    // Si erreur, laisser la chaine dans ce champ pour le HTTP 503
739
+    if (!$err_ci) {
740
+        $result->criteres = $args;
741
+    }
742 742
 }
743 743
 
744 744
 // http://code.spip.net/@phraser_critere_infixe
745 745
 function phraser_critere_infixe($arg1, $arg2, $args, $op, $not, $cond) {
746
-	$args[0] = new Texte;
747
-	$args[0]->texte = $arg1;
748
-	$args[0] = array($args[0]);
749
-	$args[1][0] = new Texte;
750
-	$args[1][0]->texte = $arg2;
751
-	$crit = new Critere;
752
-	$crit->op = $op;
753
-	$crit->not = $not;
754
-	$crit->cond = $cond;
755
-	$crit->param = $args;
756
-
757
-	return $crit;
746
+    $args[0] = new Texte;
747
+    $args[0]->texte = $arg1;
748
+    $args[0] = array($args[0]);
749
+    $args[1][0] = new Texte;
750
+    $args[1][0]->texte = $arg2;
751
+    $crit = new Critere;
752
+    $crit->op = $op;
753
+    $crit->not = $not;
754
+    $crit->cond = $cond;
755
+    $crit->param = $args;
756
+
757
+    return $crit;
758 758
 }
759 759
 
760 760
 function public_phraser_html_dist($texte, $id_parent, &$boucles, $descr, $ligne = 1) {
761 761
 
762
-	$all_res = array();
762
+    $all_res = array();
763 763
 
764
-	while (($pos_boucle = strpos($texte, BALISE_BOUCLE)) !== false) {
764
+    while (($pos_boucle = strpos($texte, BALISE_BOUCLE)) !== false) {
765 765
 
766
-		$err_b = ''; // indiquera s'il y a eu une erreur
767
-		$result = new Boucle;
768
-		$result->id_parent = $id_parent;
769
-		$result->descr = $descr;
766
+        $err_b = ''; // indiquera s'il y a eu une erreur
767
+        $result = new Boucle;
768
+        $result->id_parent = $id_parent;
769
+        $result->descr = $descr;
770 770
 # attention: reperer la premiere des 2 balises: pre_boucle ou boucle
771 771
 
772
-		if (!preg_match("," . BALISE_PRE_BOUCLE . '[0-9_],', $texte, $r)
773
-			or ($n = strpos($texte, $r[0])) === false
774
-			or ($n > $pos_boucle)
775
-		) {
776
-			$debut = substr($texte, 0, $pos_boucle);
777
-			$milieu = substr($texte, $pos_boucle);
778
-			$k = strpos($milieu, '(');
779
-			$id_boucle = trim(substr($milieu,
780
-				strlen(BALISE_BOUCLE),
781
-				$k - strlen(BALISE_BOUCLE)));
782
-			$milieu = substr($milieu, $k);
783
-
784
-		} else {
785
-			$debut = substr($texte, 0, $n);
786
-			$milieu = substr($texte, $n);
787
-			$k = strpos($milieu, '>');
788
-			$id_boucle = substr($milieu,
789
-				strlen(BALISE_PRE_BOUCLE),
790
-				$k - strlen(BALISE_PRE_BOUCLE));
791
-
792
-			if (!preg_match("," . BALISE_BOUCLE . $id_boucle . "[[:space:]]*\(,", $milieu, $r)) {
793
-				$err_b = array('zbug_erreur_boucle_syntaxe', array('id' => $id_boucle));
794
-				erreur_squelette($err_b, $result);
795
-				$texte = substr($texte, $n + 1);
796
-				continue;
797
-			} else {
798
-				$pos_boucle = $n;
799
-				$n = strpos($milieu, $r[0]);
800
-				$result->avant = substr($milieu, $k + 1, $n - $k - 1);
801
-				$milieu = substr($milieu, $n + strlen($id_boucle) + strlen(BALISE_BOUCLE));
802
-			}
803
-		}
804
-		$result->id_boucle = $id_boucle;
805
-
806
-		preg_match(SPEC_BOUCLE, $milieu, $match);
807
-		$result->type_requete = $match[0];
808
-		$milieu = substr($milieu, strlen($match[0]));
809
-		$type = $match[1];
810
-		$jointures = trim($match[2]);
811
-		$table_optionnelle = ($match[3]);
812
-		if ($jointures) {
813
-			// on affecte pas ici les jointures explicites, mais dans la compilation
814
-			// ou elles seront completees des jointures declarees
815
-			$result->jointures_explicites = $jointures;
816
-		}
817
-
818
-		if ($table_optionnelle) {
819
-			$result->table_optionnelle = $type;
820
-		}
821
-
822
-		// 1ere passe sur les criteres, vu comme des arguments sans fct
823
-		// Resultat mis dans result->param
824
-		phraser_args($milieu, "/>", "", $all_res, $result);
825
-
826
-		// En 2e passe result->criteres contiendra un tableau
827
-		// pour l'instant on met le source (chaine) :
828
-		// si elle reste ici au final, c'est qu'elle contient une erreur
829
-		$result->criteres = substr($milieu, 0, @strpos($milieu, $result->apres));
830
-		$milieu = $result->apres;
831
-		$result->apres = "";
832
-
833
-		//
834
-		// Recuperer la fin :
835
-		//
836
-		if ($milieu[0] === '/') {
837
-			$suite = substr($milieu, 2);
838
-			$milieu = '';
839
-		} else {
840
-			$milieu = substr($milieu, 1);
841
-			$s = BALISE_FIN_BOUCLE . $id_boucle . ">";
842
-			$p = strpos($milieu, $s);
843
-			if ($p === false) {
844
-				$err_b = array(
845
-					'zbug_erreur_boucle_fermant',
846
-					array('id' => $id_boucle)
847
-				);
848
-				erreur_squelette($err_b, $result);
849
-			}
850
-
851
-			$suite = substr($milieu, $p + strlen($s));
852
-			$milieu = substr($milieu, 0, $p);
853
-		}
854
-
855
-		$result->milieu = $milieu;
856
-
857
-		//
858
-		// 1. Recuperer la partie conditionnelle apres
859
-		//
860
-		$s = BALISE_POST_BOUCLE . $id_boucle . ">";
861
-		$p = strpos($suite, $s);
862
-		if ($p !== false) {
863
-			$result->apres = substr($suite, 0, $p);
864
-			$suite = substr($suite, $p + strlen($s));
865
-		}
866
-
867
-		//
868
-		// 2. Recuperer la partie alternative
869
-		//
870
-		$s = BALISE_ALT_BOUCLE . $id_boucle . ">";
871
-		$p = strpos($suite, $s);
872
-		if ($p !== false) {
873
-			$result->altern = substr($suite, 0, $p);
874
-			$suite = substr($suite, $p + strlen($s));
875
-		}
876
-		$result->ligne = $ligne + substr_count($debut, "\n");
877
-		$m = substr_count($milieu, "\n");
878
-		$b = substr_count($result->avant, "\n");
879
-		$a = substr_count($result->apres, "\n");
880
-
881
-		if ($p = strpos($type, ':')) {
882
-			$result->sql_serveur = substr($type, 0, $p);
883
-			$type = substr($type, $p + 1);
884
-		}
885
-		$soustype = strtolower($type);
886
-
887
-		if (!isset($GLOBALS["table_des_tables"][$soustype])) {
888
-			$soustype = $type;
889
-		}
890
-
891
-		$result->type_requete = $soustype;
892
-		// Lancer la 2e passe sur les criteres si la 1ere etait bonne
893
-		if (!is_array($result->param)) {
894
-			$err_b = true;
895
-		} else {
896
-			phraser_criteres($result->param, $result);
897
-			if (strncasecmp($soustype, TYPE_RECURSIF, strlen(TYPE_RECURSIF)) == 0) {
898
-				$result->type_requete = TYPE_RECURSIF;
899
-				$args = $result->param;
900
-				array_unshift($args,
901
-					substr($type, strlen(TYPE_RECURSIF)));
902
-				$result->param = $args;
903
-			}
904
-		}
905
-
906
-		$descr['id_mere_contexte'] = $id_boucle;
907
-		$result->milieu = public_phraser_html_dist($milieu, $id_boucle, $boucles, $descr, $result->ligne + $b);
908
-		// reserver la place dans la pile des boucles pour compiler ensuite dans le bon ordre
909
-		// ie les boucles qui apparaissent dans les partie conditionnelles doivent etre compilees apres cette boucle
910
-		$boucles[$id_boucle] = null;
911
-		$result->avant = public_phraser_html_dist($result->avant, $id_parent, $boucles, $descr, $result->ligne);
912
-		$result->apres = public_phraser_html_dist($result->apres, $id_parent, $boucles, $descr, $result->ligne + $b + $m);
913
-		$result->altern = public_phraser_html_dist($result->altern, $id_parent, $boucles, $descr, $result->ligne + $a + $m + $b);
914
-
915
-		// Prevenir le generateur de code que le squelette est faux
916
-		if ($err_b) {
917
-			$result->type_requete = false;
918
-		}
919
-
920
-		// Verifier qu'il n'y a pas double definition
921
-		// apres analyse des sous-parties (pas avant).
922
-
923
-		if (!empty($boucles[$id_boucle])) {
924
-			$err_b_d = array(
925
-				'zbug_erreur_boucle_double',
926
-				array('id' => $id_boucle)
927
-			);
928
-			erreur_squelette($err_b_d, $result);
929
-			// Prevenir le generateur de code que le squelette est faux
930
-			$boucles[$id_boucle]->type_requete = false;
931
-		} else {
932
-			$boucles[$id_boucle] = $result;
933
-		}
934
-		$all_res = phraser_champs_etendus($debut, $ligne, $all_res);
935
-		$all_res[] = &$boucles[$id_boucle];
936
-		if (!empty($suite)) {
937
-			$ligne += substr_count(substr($texte, 0, strpos($texte, $suite)), "\n");
938
-		}
939
-		$texte = $suite;
940
-	}
941
-
942
-	return phraser_champs_etendus($texte, $ligne, $all_res);
772
+        if (!preg_match("," . BALISE_PRE_BOUCLE . '[0-9_],', $texte, $r)
773
+            or ($n = strpos($texte, $r[0])) === false
774
+            or ($n > $pos_boucle)
775
+        ) {
776
+            $debut = substr($texte, 0, $pos_boucle);
777
+            $milieu = substr($texte, $pos_boucle);
778
+            $k = strpos($milieu, '(');
779
+            $id_boucle = trim(substr($milieu,
780
+                strlen(BALISE_BOUCLE),
781
+                $k - strlen(BALISE_BOUCLE)));
782
+            $milieu = substr($milieu, $k);
783
+
784
+        } else {
785
+            $debut = substr($texte, 0, $n);
786
+            $milieu = substr($texte, $n);
787
+            $k = strpos($milieu, '>');
788
+            $id_boucle = substr($milieu,
789
+                strlen(BALISE_PRE_BOUCLE),
790
+                $k - strlen(BALISE_PRE_BOUCLE));
791
+
792
+            if (!preg_match("," . BALISE_BOUCLE . $id_boucle . "[[:space:]]*\(,", $milieu, $r)) {
793
+                $err_b = array('zbug_erreur_boucle_syntaxe', array('id' => $id_boucle));
794
+                erreur_squelette($err_b, $result);
795
+                $texte = substr($texte, $n + 1);
796
+                continue;
797
+            } else {
798
+                $pos_boucle = $n;
799
+                $n = strpos($milieu, $r[0]);
800
+                $result->avant = substr($milieu, $k + 1, $n - $k - 1);
801
+                $milieu = substr($milieu, $n + strlen($id_boucle) + strlen(BALISE_BOUCLE));
802
+            }
803
+        }
804
+        $result->id_boucle = $id_boucle;
805
+
806
+        preg_match(SPEC_BOUCLE, $milieu, $match);
807
+        $result->type_requete = $match[0];
808
+        $milieu = substr($milieu, strlen($match[0]));
809
+        $type = $match[1];
810
+        $jointures = trim($match[2]);
811
+        $table_optionnelle = ($match[3]);
812
+        if ($jointures) {
813
+            // on affecte pas ici les jointures explicites, mais dans la compilation
814
+            // ou elles seront completees des jointures declarees
815
+            $result->jointures_explicites = $jointures;
816
+        }
817
+
818
+        if ($table_optionnelle) {
819
+            $result->table_optionnelle = $type;
820
+        }
821
+
822
+        // 1ere passe sur les criteres, vu comme des arguments sans fct
823
+        // Resultat mis dans result->param
824
+        phraser_args($milieu, "/>", "", $all_res, $result);
825
+
826
+        // En 2e passe result->criteres contiendra un tableau
827
+        // pour l'instant on met le source (chaine) :
828
+        // si elle reste ici au final, c'est qu'elle contient une erreur
829
+        $result->criteres = substr($milieu, 0, @strpos($milieu, $result->apres));
830
+        $milieu = $result->apres;
831
+        $result->apres = "";
832
+
833
+        //
834
+        // Recuperer la fin :
835
+        //
836
+        if ($milieu[0] === '/') {
837
+            $suite = substr($milieu, 2);
838
+            $milieu = '';
839
+        } else {
840
+            $milieu = substr($milieu, 1);
841
+            $s = BALISE_FIN_BOUCLE . $id_boucle . ">";
842
+            $p = strpos($milieu, $s);
843
+            if ($p === false) {
844
+                $err_b = array(
845
+                    'zbug_erreur_boucle_fermant',
846
+                    array('id' => $id_boucle)
847
+                );
848
+                erreur_squelette($err_b, $result);
849
+            }
850
+
851
+            $suite = substr($milieu, $p + strlen($s));
852
+            $milieu = substr($milieu, 0, $p);
853
+        }
854
+
855
+        $result->milieu = $milieu;
856
+
857
+        //
858
+        // 1. Recuperer la partie conditionnelle apres
859
+        //
860
+        $s = BALISE_POST_BOUCLE . $id_boucle . ">";
861
+        $p = strpos($suite, $s);
862
+        if ($p !== false) {
863
+            $result->apres = substr($suite, 0, $p);
864
+            $suite = substr($suite, $p + strlen($s));
865
+        }
866
+
867
+        //
868
+        // 2. Recuperer la partie alternative
869
+        //
870
+        $s = BALISE_ALT_BOUCLE . $id_boucle . ">";
871
+        $p = strpos($suite, $s);
872
+        if ($p !== false) {
873
+            $result->altern = substr($suite, 0, $p);
874
+            $suite = substr($suite, $p + strlen($s));
875
+        }
876
+        $result->ligne = $ligne + substr_count($debut, "\n");
877
+        $m = substr_count($milieu, "\n");
878
+        $b = substr_count($result->avant, "\n");
879
+        $a = substr_count($result->apres, "\n");
880
+
881
+        if ($p = strpos($type, ':')) {
882
+            $result->sql_serveur = substr($type, 0, $p);
883
+            $type = substr($type, $p + 1);
884
+        }
885
+        $soustype = strtolower($type);
886
+
887
+        if (!isset($GLOBALS["table_des_tables"][$soustype])) {
888
+            $soustype = $type;
889
+        }
890
+
891
+        $result->type_requete = $soustype;
892
+        // Lancer la 2e passe sur les criteres si la 1ere etait bonne
893
+        if (!is_array($result->param)) {
894
+            $err_b = true;
895
+        } else {
896
+            phraser_criteres($result->param, $result);
897
+            if (strncasecmp($soustype, TYPE_RECURSIF, strlen(TYPE_RECURSIF)) == 0) {
898
+                $result->type_requete = TYPE_RECURSIF;
899
+                $args = $result->param;
900
+                array_unshift($args,
901
+                    substr($type, strlen(TYPE_RECURSIF)));
902
+                $result->param = $args;
903
+            }
904
+        }
905
+
906
+        $descr['id_mere_contexte'] = $id_boucle;
907
+        $result->milieu = public_phraser_html_dist($milieu, $id_boucle, $boucles, $descr, $result->ligne + $b);
908
+        // reserver la place dans la pile des boucles pour compiler ensuite dans le bon ordre
909
+        // ie les boucles qui apparaissent dans les partie conditionnelles doivent etre compilees apres cette boucle
910
+        $boucles[$id_boucle] = null;
911
+        $result->avant = public_phraser_html_dist($result->avant, $id_parent, $boucles, $descr, $result->ligne);
912
+        $result->apres = public_phraser_html_dist($result->apres, $id_parent, $boucles, $descr, $result->ligne + $b + $m);
913
+        $result->altern = public_phraser_html_dist($result->altern, $id_parent, $boucles, $descr, $result->ligne + $a + $m + $b);
914
+
915
+        // Prevenir le generateur de code que le squelette est faux
916
+        if ($err_b) {
917
+            $result->type_requete = false;
918
+        }
919
+
920
+        // Verifier qu'il n'y a pas double definition
921
+        // apres analyse des sous-parties (pas avant).
922
+
923
+        if (!empty($boucles[$id_boucle])) {
924
+            $err_b_d = array(
925
+                'zbug_erreur_boucle_double',
926
+                array('id' => $id_boucle)
927
+            );
928
+            erreur_squelette($err_b_d, $result);
929
+            // Prevenir le generateur de code que le squelette est faux
930
+            $boucles[$id_boucle]->type_requete = false;
931
+        } else {
932
+            $boucles[$id_boucle] = $result;
933
+        }
934
+        $all_res = phraser_champs_etendus($debut, $ligne, $all_res);
935
+        $all_res[] = &$boucles[$id_boucle];
936
+        if (!empty($suite)) {
937
+            $ligne += substr_count(substr($texte, 0, strpos($texte, $suite)), "\n");
938
+        }
939
+        $texte = $suite;
940
+    }
941
+
942
+    return phraser_champs_etendus($texte, $ligne, $all_res);
943 943
 }
Please login to merge, or discard this patch.
ecrire/public/criteres.php 2 patches
Indentation   +1672 added lines, -1672 removed lines patch added patch discarded remove patch
@@ -17,7 +17,7 @@  discard block
 block discarded – undo
17 17
  **/
18 18
 
19 19
 if (!defined('_ECRIRE_INC_VERSION')) {
20
-	return;
20
+    return;
21 21
 }
22 22
 
23 23
 /**
@@ -43,14 +43,14 @@  discard block
 block discarded – undo
43 43
  **/
44 44
 function critere_racine_dist($idb, &$boucles, $crit) {
45 45
 
46
-	$not = $crit->not;
47
-	$boucle = &$boucles[$idb];
48
-	$id_parent = isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent']) ?
49
-		$GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] :
50
-		'id_parent';
46
+    $not = $crit->not;
47
+    $boucle = &$boucles[$idb];
48
+    $id_parent = isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent']) ?
49
+        $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] :
50
+        'id_parent';
51 51
 
52
-	$c = array("'='", "'$boucle->id_table." . "$id_parent'", 0);
53
-	$boucle->where[] = ($crit->not ? array("'NOT'", $c) : $c);
52
+    $c = array("'='", "'$boucle->id_table." . "$id_parent'", 0);
53
+    $boucle->where[] = ($crit->not ? array("'NOT'", $c) : $c);
54 54
 }
55 55
 
56 56
 
@@ -67,15 +67,15 @@  discard block
 block discarded – undo
67 67
  * @return void
68 68
  **/
69 69
 function critere_exclus_dist($idb, &$boucles, $crit) {
70
-	$not = $crit->not;
71
-	$boucle = &$boucles[$idb];
72
-	$id = $boucle->primary;
73
-
74
-	if ($not or !$id) {
75
-		return (array('zbug_critere_inconnu', array('critere' => $not . $crit->op)));
76
-	}
77
-	$arg = kwote(calculer_argument_precedent($idb, $id, $boucles));
78
-	$boucle->where[] = array("'!='", "'$boucle->id_table." . "$id'", $arg);
70
+    $not = $crit->not;
71
+    $boucle = &$boucles[$idb];
72
+    $id = $boucle->primary;
73
+
74
+    if ($not or !$id) {
75
+        return (array('zbug_critere_inconnu', array('critere' => $not . $crit->op)));
76
+    }
77
+    $arg = kwote(calculer_argument_precedent($idb, $id, $boucles));
78
+    $boucle->where[] = array("'!='", "'$boucle->id_table." . "$id'", $arg);
79 79
 }
80 80
 
81 81
 
@@ -95,73 +95,73 @@  discard block
 block discarded – undo
95 95
  * @return void
96 96
  **/
97 97
 function critere_doublons_dist($idb, &$boucles, $crit) {
98
-	$boucle = &$boucles[$idb];
99
-	$primary = $boucle->primary;
100
-
101
-	// la table nécessite une clé primaire, non composée
102
-	if (!$primary or strpos($primary, ',')) {
103
-		return (array('zbug_doublon_sur_table_sans_cle_primaire'));
104
-	}
105
-
106
-	$not = ($crit->not ? '' : 'NOT');
107
-
108
-	// le doublon s'applique sur un type de boucle (article)
109
-	$nom = "'" . $boucle->type_requete . "'";
110
-
111
-	// compléter le nom avec un nom précisé {doublons nom}
112
-	// on obtient $nom = "'article' . 'nom'"
113
-	if (isset($crit->param[0])) {
114
-		$nom .= "." . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
115
-	}
116
-
117
-	// code qui déclarera l'index du stockage de nos doublons (pour éviter une notice PHP)
118
-	$init_comment = "\n\n\t// Initialise le(s) critère(s) doublons\n";
119
-	$init_code = "\tif (!isset(\$doublons[\$d = $nom])) { \$doublons[\$d] = ''; }\n";
120
-
121
-	// on crée un sql_in avec la clé primaire de la table
122
-	// et la collection des doublons déjà emmagasinés dans le tableau
123
-	// $doublons et son index, ici $nom
124
-
125
-	// debut du code "sql_in('articles.id_article', "
126
-	$debut_in = "sql_in('" . $boucle->id_table . '.' . $primary . "', ";
127
-	// lecture des données du doublon "$doublons[$doublon_index[] = "
128
-	// Attention : boucle->doublons désigne une variable qu'on affecte
129
-	$debut_doub = '$doublons[' . (!$not ? '' : ($boucle->doublons . "[]= "));
130
-
131
-	// le debut complet du code des doublons
132
-	$debut_doub = $debut_in . $debut_doub;
133
-
134
-	// nom du doublon "('article' . 'nom')]"
135
-	$fin_doub = "($nom)]";
136
-
137
-	// si on trouve un autre critère doublon,
138
-	// on fusionne pour avoir un seul IN, et on s'en va !
139
-	foreach ($boucle->where as $k => $w) {
140
-		if (strpos($w[0], $debut_doub) === 0) {
141
-			// fusionner le sql_in (du where)
142
-			$boucle->where[$k][0] = $debut_doub . $fin_doub . ' . ' . substr($w[0], strlen($debut_in));
143
-			// fusionner l'initialisation (du hash) pour faire plus joli
144
-			$x = strpos($boucle->hash, $init_comment);
145
-			$len = strlen($init_comment);
146
-			$boucle->hash =
147
-				substr($boucle->hash, 0, $x + $len) . $init_code . substr($boucle->hash, $x + $len);
148
-
149
-			return;
150
-		}
151
-	}
152
-
153
-	// mettre l'ensemble dans un tableau pour que ce ne soit pas vu comme une constante
154
-	$boucle->where[] = array($debut_doub . $fin_doub . ", '" . $not . "')");
155
-
156
-	// déclarer le doublon s'il n'existe pas encore
157
-	$boucle->hash .= $init_comment . $init_code;
158
-
159
-
160
-	# la ligne suivante avait l'intention d'eviter une collecte deja faite
161
-	# mais elle fait planter une boucle a 2 critere doublons:
162
-	# {!doublons A}{doublons B}
163
-	# (de http://article.gmane.org/gmane.comp.web.spip.devel/31034)
164
-	#	if ($crit->not) $boucle->doublons = "";
98
+    $boucle = &$boucles[$idb];
99
+    $primary = $boucle->primary;
100
+
101
+    // la table nécessite une clé primaire, non composée
102
+    if (!$primary or strpos($primary, ',')) {
103
+        return (array('zbug_doublon_sur_table_sans_cle_primaire'));
104
+    }
105
+
106
+    $not = ($crit->not ? '' : 'NOT');
107
+
108
+    // le doublon s'applique sur un type de boucle (article)
109
+    $nom = "'" . $boucle->type_requete . "'";
110
+
111
+    // compléter le nom avec un nom précisé {doublons nom}
112
+    // on obtient $nom = "'article' . 'nom'"
113
+    if (isset($crit->param[0])) {
114
+        $nom .= "." . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
115
+    }
116
+
117
+    // code qui déclarera l'index du stockage de nos doublons (pour éviter une notice PHP)
118
+    $init_comment = "\n\n\t// Initialise le(s) critère(s) doublons\n";
119
+    $init_code = "\tif (!isset(\$doublons[\$d = $nom])) { \$doublons[\$d] = ''; }\n";
120
+
121
+    // on crée un sql_in avec la clé primaire de la table
122
+    // et la collection des doublons déjà emmagasinés dans le tableau
123
+    // $doublons et son index, ici $nom
124
+
125
+    // debut du code "sql_in('articles.id_article', "
126
+    $debut_in = "sql_in('" . $boucle->id_table . '.' . $primary . "', ";
127
+    // lecture des données du doublon "$doublons[$doublon_index[] = "
128
+    // Attention : boucle->doublons désigne une variable qu'on affecte
129
+    $debut_doub = '$doublons[' . (!$not ? '' : ($boucle->doublons . "[]= "));
130
+
131
+    // le debut complet du code des doublons
132
+    $debut_doub = $debut_in . $debut_doub;
133
+
134
+    // nom du doublon "('article' . 'nom')]"
135
+    $fin_doub = "($nom)]";
136
+
137
+    // si on trouve un autre critère doublon,
138
+    // on fusionne pour avoir un seul IN, et on s'en va !
139
+    foreach ($boucle->where as $k => $w) {
140
+        if (strpos($w[0], $debut_doub) === 0) {
141
+            // fusionner le sql_in (du where)
142
+            $boucle->where[$k][0] = $debut_doub . $fin_doub . ' . ' . substr($w[0], strlen($debut_in));
143
+            // fusionner l'initialisation (du hash) pour faire plus joli
144
+            $x = strpos($boucle->hash, $init_comment);
145
+            $len = strlen($init_comment);
146
+            $boucle->hash =
147
+                substr($boucle->hash, 0, $x + $len) . $init_code . substr($boucle->hash, $x + $len);
148
+
149
+            return;
150
+        }
151
+    }
152
+
153
+    // mettre l'ensemble dans un tableau pour que ce ne soit pas vu comme une constante
154
+    $boucle->where[] = array($debut_doub . $fin_doub . ", '" . $not . "')");
155
+
156
+    // déclarer le doublon s'il n'existe pas encore
157
+    $boucle->hash .= $init_comment . $init_code;
158
+
159
+
160
+    # la ligne suivante avait l'intention d'eviter une collecte deja faite
161
+    # mais elle fait planter une boucle a 2 critere doublons:
162
+    # {!doublons A}{doublons B}
163
+    # (de http://article.gmane.org/gmane.comp.web.spip.devel/31034)
164
+    #	if ($crit->not) $boucle->doublons = "";
165 165
 }
166 166
 
167 167
 
@@ -182,14 +182,14 @@  discard block
 block discarded – undo
182 182
  * @return void
183 183
  **/
184 184
 function critere_lang_select_dist($idb, &$boucles, $crit) {
185
-	if (!isset($crit->param[1][0]) or !($param = $crit->param[1][0]->texte)) {
186
-		$param = 'oui';
187
-	}
188
-	if ($crit->not) {
189
-		$param = ($param == 'oui') ? 'non' : 'oui';
190
-	}
191
-	$boucle = &$boucles[$idb];
192
-	$boucle->lang_select = $param;
185
+    if (!isset($crit->param[1][0]) or !($param = $crit->param[1][0]->texte)) {
186
+        $param = 'oui';
187
+    }
188
+    if ($crit->not) {
189
+        $param = ($param == 'oui') ? 'non' : 'oui';
190
+    }
191
+    $boucle = &$boucles[$idb];
192
+    $boucle->lang_select = $param;
193 193
 }
194 194
 
195 195
 
@@ -211,18 +211,18 @@  discard block
 block discarded – undo
211 211
  * @return void
212 212
  **/
213 213
 function critere_debut_dist($idb, &$boucles, $crit) {
214
-	list($un, $deux) = $crit->param;
215
-	$un = $un[0]->texte;
216
-	$deux = $deux[0]->texte;
217
-	if ($deux) {
218
-		$boucles[$idb]->limit = 'intval($Pile[0]["debut' .
219
-			$un .
220
-			'"]) . ",' .
221
-			$deux .
222
-			'"';
223
-	} else {
224
-		calculer_critere_DEFAUT_dist($idb, $boucles, $crit);
225
-	}
214
+    list($un, $deux) = $crit->param;
215
+    $un = $un[0]->texte;
216
+    $deux = $deux[0]->texte;
217
+    if ($deux) {
218
+        $boucles[$idb]->limit = 'intval($Pile[0]["debut' .
219
+            $un .
220
+            '"]) . ",' .
221
+            $deux .
222
+            '"';
223
+    } else {
224
+        calculer_critere_DEFAUT_dist($idb, $boucles, $crit);
225
+    }
226 226
 }
227 227
 
228 228
 
@@ -256,57 +256,57 @@  discard block
 block discarded – undo
256 256
  **/
257 257
 function critere_pagination_dist($idb, &$boucles, $crit) {
258 258
 
259
-	$boucle = &$boucles[$idb];
260
-	// definition de la taille de la page
261
-	$pas = !isset($crit->param[0][0]) ? "''"
262
-		: calculer_liste(array($crit->param[0][0]), $idb, $boucles, $boucle->id_parent);
263
-
264
-	if (!preg_match(_CODE_QUOTE, $pas, $r)) {
265
-		$pas = "((\$a = intval($pas)) ? \$a : 10)";
266
-	} else {
267
-		$r = intval($r[2]);
268
-		$pas = strval($r ? $r : 10);
269
-	}
270
-
271
-	// Calcul du nommage de la pagination si il existe.
272
-	// La nouvelle syntaxe {pagination 20, nom} est prise en compte et privilégiée mais on reste
273
-	// compatible avec l'ancienne car certains cas fonctionnent correctement
274
-	$type = "'$idb'";
275
-	// Calcul d'un nommage spécifique de la pagination si précisé.
276
-	// Syntaxe {pagination 20, nom}
277
-	if (isset($crit->param[0][1])) {
278
-		$type = calculer_liste(array($crit->param[0][1]), $idb, $boucles, $boucle->id_parent);
279
-	} // Ancienne syntaxe {pagination 20 nom} pour compatibilité
280
-	elseif (isset($crit->param[1][0])) {
281
-		$type = calculer_liste(array($crit->param[1][0]), $idb, $boucles, $boucle->id_parent);
282
-	}
283
-
284
-	$debut = ($type[0] !== "'") ? "'debut'.$type" : ("'debut" . substr($type, 1));
285
-	$boucle->modificateur['debut_nom'] = $type;
286
-	$partie =
287
-		// tester si le numero de page demande est de la forme '@yyy'
288
-		'isset($Pile[0][' . $debut . ']) ? $Pile[0][' . $debut . '] : _request(' . $debut . ");\n"
289
-		. "\tif(substr(\$debut_boucle,0,1)=='@'){\n"
290
-		. "\t\t" . '$debut_boucle = $Pile[0][' . $debut . '] = quete_debut_pagination(\'' . $boucle->primary . '\',$Pile[0][\'@' . $boucle->primary . '\'] = substr($debut_boucle,1),' . $pas . ',$iter);' . "\n"
291
-		. "\t\t" . '$iter->seek(0);' . "\n"
292
-		. "\t}\n"
293
-		. "\t" . '$debut_boucle = intval($debut_boucle)';
294
-
295
-	$boucle->hash .= '
259
+    $boucle = &$boucles[$idb];
260
+    // definition de la taille de la page
261
+    $pas = !isset($crit->param[0][0]) ? "''"
262
+        : calculer_liste(array($crit->param[0][0]), $idb, $boucles, $boucle->id_parent);
263
+
264
+    if (!preg_match(_CODE_QUOTE, $pas, $r)) {
265
+        $pas = "((\$a = intval($pas)) ? \$a : 10)";
266
+    } else {
267
+        $r = intval($r[2]);
268
+        $pas = strval($r ? $r : 10);
269
+    }
270
+
271
+    // Calcul du nommage de la pagination si il existe.
272
+    // La nouvelle syntaxe {pagination 20, nom} est prise en compte et privilégiée mais on reste
273
+    // compatible avec l'ancienne car certains cas fonctionnent correctement
274
+    $type = "'$idb'";
275
+    // Calcul d'un nommage spécifique de la pagination si précisé.
276
+    // Syntaxe {pagination 20, nom}
277
+    if (isset($crit->param[0][1])) {
278
+        $type = calculer_liste(array($crit->param[0][1]), $idb, $boucles, $boucle->id_parent);
279
+    } // Ancienne syntaxe {pagination 20 nom} pour compatibilité
280
+    elseif (isset($crit->param[1][0])) {
281
+        $type = calculer_liste(array($crit->param[1][0]), $idb, $boucles, $boucle->id_parent);
282
+    }
283
+
284
+    $debut = ($type[0] !== "'") ? "'debut'.$type" : ("'debut" . substr($type, 1));
285
+    $boucle->modificateur['debut_nom'] = $type;
286
+    $partie =
287
+        // tester si le numero de page demande est de la forme '@yyy'
288
+        'isset($Pile[0][' . $debut . ']) ? $Pile[0][' . $debut . '] : _request(' . $debut . ");\n"
289
+        . "\tif(substr(\$debut_boucle,0,1)=='@'){\n"
290
+        . "\t\t" . '$debut_boucle = $Pile[0][' . $debut . '] = quete_debut_pagination(\'' . $boucle->primary . '\',$Pile[0][\'@' . $boucle->primary . '\'] = substr($debut_boucle,1),' . $pas . ',$iter);' . "\n"
291
+        . "\t\t" . '$iter->seek(0);' . "\n"
292
+        . "\t}\n"
293
+        . "\t" . '$debut_boucle = intval($debut_boucle)';
294
+
295
+    $boucle->hash .= '
296 296
 	$command[\'pagination\'] = array((isset($Pile[0][' . $debut . ']) ? $Pile[0][' . $debut . '] : null), ' . $pas . ');';
297 297
 
298
-	$boucle->total_parties = $pas;
299
-	calculer_parties($boucles, $idb, $partie, 'p+');
300
-	// ajouter la cle primaire dans le select pour pouvoir gerer la pagination referencee par @id
301
-	// sauf si pas de primaire, ou si primaire composee
302
-	// dans ce cas, on ne sait pas gerer une pagination indirecte
303
-	$t = $boucle->id_table . '.' . $boucle->primary;
304
-	if ($boucle->primary
305
-		and !preg_match('/[,\s]/', $boucle->primary)
306
-		and !in_array($t, $boucle->select)
307
-	) {
308
-		$boucle->select[] = $t;
309
-	}
298
+    $boucle->total_parties = $pas;
299
+    calculer_parties($boucles, $idb, $partie, 'p+');
300
+    // ajouter la cle primaire dans le select pour pouvoir gerer la pagination referencee par @id
301
+    // sauf si pas de primaire, ou si primaire composee
302
+    // dans ce cas, on ne sait pas gerer une pagination indirecte
303
+    $t = $boucle->id_table . '.' . $boucle->primary;
304
+    if ($boucle->primary
305
+        and !preg_match('/[,\s]/', $boucle->primary)
306
+        and !in_array($t, $boucle->select)
307
+    ) {
308
+        $boucle->select[] = $t;
309
+    }
310 310
 }
311 311
 
312 312
 
@@ -328,24 +328,24 @@  discard block
 block discarded – undo
328 328
  **/
329 329
 function critere_recherche_dist($idb, &$boucles, $crit) {
330 330
 
331
-	$boucle = &$boucles[$idb];
331
+    $boucle = &$boucles[$idb];
332 332
 
333
-	if (!$boucle->primary or strpos($boucle->primary, ',')) {
334
-		erreur_squelette(_T('zbug_critere_sur_table_sans_cle_primaire', array('critere' => 'recherche')), $boucle);
333
+    if (!$boucle->primary or strpos($boucle->primary, ',')) {
334
+        erreur_squelette(_T('zbug_critere_sur_table_sans_cle_primaire', array('critere' => 'recherche')), $boucle);
335 335
 
336
-		return;
337
-	}
336
+        return;
337
+    }
338 338
 
339
-	if (isset($crit->param[0])) {
340
-		$quoi = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
341
-	} else {
342
-		$quoi = '(isset($Pile[0]["recherche"])?$Pile[0]["recherche"]:(isset($GLOBALS["recherche"])?$GLOBALS["recherche"]:""))';
343
-	}
339
+    if (isset($crit->param[0])) {
340
+        $quoi = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
341
+    } else {
342
+        $quoi = '(isset($Pile[0]["recherche"])?$Pile[0]["recherche"]:(isset($GLOBALS["recherche"])?$GLOBALS["recherche"]:""))';
343
+    }
344 344
 
345
-	$_modificateur = var_export($boucle->modificateur, true);
346
-	$boucle->hash .= '
345
+    $_modificateur = var_export($boucle->modificateur, true);
346
+    $boucle->hash .= '
347 347
 	// RECHERCHE'
348
-		. ($crit->cond ? '
348
+        . ($crit->cond ? '
349 349
 	if (!strlen(' . $quoi . ')){
350 350
 		list($rech_select, $rech_where) = array("0 as points","");
351 351
 	} else' : '') . '
@@ -356,21 +356,21 @@  discard block
 block discarded – undo
356 356
 	';
357 357
 
358 358
 
359
-	$t = $boucle->id_table . '.' . $boucle->primary;
360
-	if (!in_array($t, $boucles[$idb]->select)) {
361
-		$boucle->select[] = $t;
362
-	} # pour postgres, neuneu ici
363
-	// jointure uniquement sur le serveur principal
364
-	// (on ne peut joindre une table d'un serveur distant avec la table des resultats du serveur principal)
365
-	if (!$boucle->sql_serveur) {
366
-		$boucle->join['resultats'] = array("'" . $boucle->id_table . "'", "'id'", "'" . $boucle->primary . "'");
367
-		$boucle->from['resultats'] = 'spip_resultats';
368
-	}
369
-	$boucle->select[] = '$rech_select';
370
-	//$boucle->where[]= "\$rech_where?'resultats.id=".$boucle->id_table.".".$boucle->primary."':''";
371
-
372
-	// et la recherche trouve
373
-	$boucle->where[] = '$rech_where?$rech_where:\'\'';
359
+    $t = $boucle->id_table . '.' . $boucle->primary;
360
+    if (!in_array($t, $boucles[$idb]->select)) {
361
+        $boucle->select[] = $t;
362
+    } # pour postgres, neuneu ici
363
+    // jointure uniquement sur le serveur principal
364
+    // (on ne peut joindre une table d'un serveur distant avec la table des resultats du serveur principal)
365
+    if (!$boucle->sql_serveur) {
366
+        $boucle->join['resultats'] = array("'" . $boucle->id_table . "'", "'id'", "'" . $boucle->primary . "'");
367
+        $boucle->from['resultats'] = 'spip_resultats';
368
+    }
369
+    $boucle->select[] = '$rech_select';
370
+    //$boucle->where[]= "\$rech_where?'resultats.id=".$boucle->id_table.".".$boucle->primary."':''";
371
+
372
+    // et la recherche trouve
373
+    $boucle->where[] = '$rech_where?$rech_where:\'\'';
374 374
 }
375 375
 
376 376
 /**
@@ -387,25 +387,25 @@  discard block
 block discarded – undo
387 387
  * @return void
388 388
  **/
389 389
 function critere_traduction_dist($idb, &$boucles, $crit) {
390
-	$boucle = &$boucles[$idb];
391
-	$prim = $boucle->primary;
392
-	$table = $boucle->id_table;
393
-	$arg = kwote(calculer_argument_precedent($idb, 'id_trad', $boucles));
394
-	$dprim = kwote(calculer_argument_precedent($idb, $prim, $boucles));
395
-	$boucle->where[] =
396
-		array(
397
-			"'OR'",
398
-			array(
399
-				"'AND'",
400
-				array("'='", "'$table.id_trad'", 0),
401
-				array("'='", "'$table.$prim'", $dprim)
402
-			),
403
-			array(
404
-				"'AND'",
405
-				array("'>'", "'$table.id_trad'", 0),
406
-				array("'='", "'$table.id_trad'", $arg)
407
-			)
408
-		);
390
+    $boucle = &$boucles[$idb];
391
+    $prim = $boucle->primary;
392
+    $table = $boucle->id_table;
393
+    $arg = kwote(calculer_argument_precedent($idb, 'id_trad', $boucles));
394
+    $dprim = kwote(calculer_argument_precedent($idb, $prim, $boucles));
395
+    $boucle->where[] =
396
+        array(
397
+            "'OR'",
398
+            array(
399
+                "'AND'",
400
+                array("'='", "'$table.id_trad'", 0),
401
+                array("'='", "'$table.$prim'", $dprim)
402
+            ),
403
+            array(
404
+                "'AND'",
405
+                array("'>'", "'$table.id_trad'", 0),
406
+                array("'='", "'$table.id_trad'", $arg)
407
+            )
408
+        );
409 409
 }
410 410
 
411 411
 
@@ -423,17 +423,17 @@  discard block
 block discarded – undo
423 423
  * @return void
424 424
  **/
425 425
 function critere_origine_traduction_dist($idb, &$boucles, $crit) {
426
-	$boucle = &$boucles[$idb];
427
-	$prim = $boucle->primary;
428
-	$table = $boucle->id_table;
429
-
430
-	$c =
431
-		array(
432
-			"'OR'",
433
-			array("'='", "'$table." . "id_trad'", "'$table.$prim'"),
434
-			array("'='", "'$table.id_trad'", "'0'")
435
-		);
436
-	$boucle->where[] = ($crit->not ? array("'NOT'", $c) : $c);
426
+    $boucle = &$boucles[$idb];
427
+    $prim = $boucle->primary;
428
+    $table = $boucle->id_table;
429
+
430
+    $c =
431
+        array(
432
+            "'OR'",
433
+            array("'='", "'$table." . "id_trad'", "'$table.$prim'"),
434
+            array("'='", "'$table.id_trad'", "'0'")
435
+        );
436
+    $boucle->where[] = ($crit->not ? array("'NOT'", $c) : $c);
437 437
 }
438 438
 
439 439
 
@@ -450,20 +450,20 @@  discard block
 block discarded – undo
450 450
  **/
451 451
 function critere_meme_parent_dist($idb, &$boucles, $crit) {
452 452
 
453
-	$boucle = &$boucles[$idb];
454
-	$arg = kwote(calculer_argument_precedent($idb, 'id_parent', $boucles));
455
-	$id_parent = isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent']) ?
456
-		$GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] :
457
-		'id_parent';
458
-	$mparent = $boucle->id_table . '.' . $id_parent;
453
+    $boucle = &$boucles[$idb];
454
+    $arg = kwote(calculer_argument_precedent($idb, 'id_parent', $boucles));
455
+    $id_parent = isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent']) ?
456
+        $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] :
457
+        'id_parent';
458
+    $mparent = $boucle->id_table . '.' . $id_parent;
459 459
 
460
-	if ($boucle->type_requete == 'rubriques' or isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'])) {
461
-		$boucle->where[] = array("'='", "'$mparent'", $arg);
460
+    if ($boucle->type_requete == 'rubriques' or isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'])) {
461
+        $boucle->where[] = array("'='", "'$mparent'", $arg);
462 462
 
463
-	} // le cas FORUMS est gere dans le plugin forum, dans la fonction critere_FORUMS_meme_parent_dist()
464
-	else {
465
-		return (array('zbug_critere_inconnu', array('critere' => $crit->op . ' ' . $boucle->type_requete)));
466
-	}
463
+    } // le cas FORUMS est gere dans le plugin forum, dans la fonction critere_FORUMS_meme_parent_dist()
464
+    else {
465
+        return (array('zbug_critere_inconnu', array('critere' => $crit->op . ' ' . $boucle->type_requete)));
466
+    }
467 467
 }
468 468
 
469 469
 
@@ -494,37 +494,37 @@  discard block
 block discarded – undo
494 494
  **/
495 495
 function critere_branche_dist($idb, &$boucles, $crit) {
496 496
 
497
-	$not = $crit->not;
498
-	$boucle = &$boucles[$idb];
499
-	// prendre en priorite un identifiant en parametre {branche XX}
500
-	if (isset($crit->param[0])) {
501
-		$arg = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
502
-		// sinon on le prend chez une boucle parente
503
-	} else {
504
-		$arg = kwote(calculer_argument_precedent($idb, 'id_rubrique', $boucles), $boucle->sql_serveur, 'int NOT NULL');
505
-	}
506
-
507
-	//Trouver une jointure
508
-	$champ = "id_rubrique";
509
-	$desc = $boucle->show;
510
-	//Seulement si necessaire
511
-	if (!array_key_exists($champ, $desc['field'])) {
512
-		$cle = trouver_jointure_champ($champ, $boucle);
513
-		$trouver_table = charger_fonction("trouver_table", "base");
514
-		$desc = $trouver_table($boucle->from[$cle]);
515
-		if (count(trouver_champs_decomposes($champ, $desc)) > 1) {
516
-			$decompose = decompose_champ_id_objet($champ);
517
-			$champ = array_shift($decompose);
518
-			$boucle->where[] = array("'='", _q($cle . "." . reset($decompose)), '"' . sql_quote(end($decompose)) . '"');
519
-		}
520
-	} else {
521
-		$cle = $boucle->id_table;
522
-	}
523
-
524
-	$c = "sql_in('$cle" . ".$champ', calcul_branche_in($arg)"
525
-		. ($not ? ", 'NOT'" : '') . ")";
526
-	$boucle->where[] = !$crit->cond ? $c :
527
-		("($arg ? $c : " . ($not ? "'0=1'" : "'1=1'") . ')');
497
+    $not = $crit->not;
498
+    $boucle = &$boucles[$idb];
499
+    // prendre en priorite un identifiant en parametre {branche XX}
500
+    if (isset($crit->param[0])) {
501
+        $arg = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
502
+        // sinon on le prend chez une boucle parente
503
+    } else {
504
+        $arg = kwote(calculer_argument_precedent($idb, 'id_rubrique', $boucles), $boucle->sql_serveur, 'int NOT NULL');
505
+    }
506
+
507
+    //Trouver une jointure
508
+    $champ = "id_rubrique";
509
+    $desc = $boucle->show;
510
+    //Seulement si necessaire
511
+    if (!array_key_exists($champ, $desc['field'])) {
512
+        $cle = trouver_jointure_champ($champ, $boucle);
513
+        $trouver_table = charger_fonction("trouver_table", "base");
514
+        $desc = $trouver_table($boucle->from[$cle]);
515
+        if (count(trouver_champs_decomposes($champ, $desc)) > 1) {
516
+            $decompose = decompose_champ_id_objet($champ);
517
+            $champ = array_shift($decompose);
518
+            $boucle->where[] = array("'='", _q($cle . "." . reset($decompose)), '"' . sql_quote(end($decompose)) . '"');
519
+        }
520
+    } else {
521
+        $cle = $boucle->id_table;
522
+    }
523
+
524
+    $c = "sql_in('$cle" . ".$champ', calcul_branche_in($arg)"
525
+        . ($not ? ", 'NOT'" : '') . ")";
526
+    $boucle->where[] = !$crit->cond ? $c :
527
+        ("($arg ? $c : " . ($not ? "'0=1'" : "'1=1'") . ')');
528 528
 }
529 529
 
530 530
 /**
@@ -540,15 +540,15 @@  discard block
 block discarded – undo
540 540
  **/
541 541
 function critere_logo_dist($idb, &$boucles, $crit) {
542 542
 
543
-	$boucle = &$boucles[$idb];
544
-	$not = ($crit->not ? 'NOT' : '');
545
-	$serveur = $boucle->sql_serveur;
543
+    $boucle = &$boucles[$idb];
544
+    $not = ($crit->not ? 'NOT' : '');
545
+    $serveur = $boucle->sql_serveur;
546 546
 
547
-	$c = "sql_in('" .
548
-		$boucle->id_table . '.' . $boucle->primary
549
-		. "', lister_objets_avec_logos('" . $boucle->primary . "'), '$not', '$serveur')";
547
+    $c = "sql_in('" .
548
+        $boucle->id_table . '.' . $boucle->primary
549
+        . "', lister_objets_avec_logos('" . $boucle->primary . "'), '$not', '$serveur')";
550 550
 
551
-	$boucle->where[] = $c;
551
+    $boucle->where[] = $c;
552 552
 }
553 553
 
554 554
 
@@ -570,31 +570,31 @@  discard block
 block discarded – undo
570 570
  * @return void
571 571
  **/
572 572
 function critere_fusion_dist($idb, &$boucles, $crit) {
573
-	if ($t = isset($crit->param[0])) {
574
-		$t = $crit->param[0];
575
-		if ($t[0]->type == 'texte') {
576
-			$t = $t[0]->texte;
577
-			if (preg_match("/^(.*)\.(.*)$/", $t, $r)) {
578
-				$t = table_objet_sql($r[1]);
579
-				$t = array_search($t, $boucles[$idb]->from);
580
-				if ($t) {
581
-					$t .= '.' . $r[2];
582
-				}
583
-			}
584
-		} else {
585
-			$t = '".'
586
-				. calculer_critere_arg_dynamique($idb, $boucles, $t)
587
-				. '."';
588
-		}
589
-	}
590
-	if ($t) {
591
-		$boucles[$idb]->group[] = $t;
592
-		if (!in_array($t, $boucles[$idb]->select)) {
593
-			$boucles[$idb]->select[] = $t;
594
-		}
595
-	} else {
596
-		return (array('zbug_critere_inconnu', array('critere' => $crit->op . ' ?')));
597
-	}
573
+    if ($t = isset($crit->param[0])) {
574
+        $t = $crit->param[0];
575
+        if ($t[0]->type == 'texte') {
576
+            $t = $t[0]->texte;
577
+            if (preg_match("/^(.*)\.(.*)$/", $t, $r)) {
578
+                $t = table_objet_sql($r[1]);
579
+                $t = array_search($t, $boucles[$idb]->from);
580
+                if ($t) {
581
+                    $t .= '.' . $r[2];
582
+                }
583
+            }
584
+        } else {
585
+            $t = '".'
586
+                . calculer_critere_arg_dynamique($idb, $boucles, $t)
587
+                . '."';
588
+        }
589
+    }
590
+    if ($t) {
591
+        $boucles[$idb]->group[] = $t;
592
+        if (!in_array($t, $boucles[$idb]->select)) {
593
+            $boucles[$idb]->select[] = $t;
594
+        }
595
+    } else {
596
+        return (array('zbug_critere_inconnu', array('critere' => $crit->op . ' ?')));
597
+    }
598 598
 }
599 599
 
600 600
 /**
@@ -631,45 +631,45 @@  discard block
 block discarded – undo
631 631
  * @param Critere $crit Paramètres du critère dans cette boucle
632 632
  */
633 633
 function critere_collecte_dist($idb, &$boucles, $crit) {
634
-	if (isset($crit->param[0])) {
635
-		$_coll = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
636
-		$boucle = $boucles[$idb];
637
-		$boucle->modificateur['collate'] = "($_coll ?' COLLATE '.$_coll:'')";
638
-		$n = count($boucle->order);
639
-		if ($n && (strpos($boucle->order[$n - 1], 'COLLATE') === false)) {
640
-			// l'instruction COLLATE doit être placée avant ASC ou DESC
641
-			// notamment lors de l'utilisation `{!par xxx}{collate yyy}`
642
-			if (
643
-				(false !== $i = strpos($boucle->order[$n - 1], 'ASC'))
644
-				OR (false !== $i = strpos($boucle->order[$n - 1], 'DESC'))
645
-			) {
646
-				$boucle->order[$n - 1] = substr_replace($boucle->order[$n - 1], "' . " . $boucle->modificateur['collate'] . " . ' ", $i, 0);
647
-			} else {
648
-				$boucle->order[$n - 1] .= " . " . $boucle->modificateur['collate'];
649
-			}
650
-		}
651
-	} else {
652
-		return (array('zbug_critere_inconnu', array('critere' => $crit->op . " " . count($boucles[$idb]->order))));
653
-	}
634
+    if (isset($crit->param[0])) {
635
+        $_coll = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
636
+        $boucle = $boucles[$idb];
637
+        $boucle->modificateur['collate'] = "($_coll ?' COLLATE '.$_coll:'')";
638
+        $n = count($boucle->order);
639
+        if ($n && (strpos($boucle->order[$n - 1], 'COLLATE') === false)) {
640
+            // l'instruction COLLATE doit être placée avant ASC ou DESC
641
+            // notamment lors de l'utilisation `{!par xxx}{collate yyy}`
642
+            if (
643
+                (false !== $i = strpos($boucle->order[$n - 1], 'ASC'))
644
+                OR (false !== $i = strpos($boucle->order[$n - 1], 'DESC'))
645
+            ) {
646
+                $boucle->order[$n - 1] = substr_replace($boucle->order[$n - 1], "' . " . $boucle->modificateur['collate'] . " . ' ", $i, 0);
647
+            } else {
648
+                $boucle->order[$n - 1] .= " . " . $boucle->modificateur['collate'];
649
+            }
650
+        }
651
+    } else {
652
+        return (array('zbug_critere_inconnu', array('critere' => $crit->op . " " . count($boucles[$idb]->order))));
653
+    }
654 654
 }
655 655
 
656 656
 // http://code.spip.net/@calculer_critere_arg_dynamique
657 657
 function calculer_critere_arg_dynamique($idb, &$boucles, $crit, $suffix = '') {
658
-	$boucle = $boucles[$idb];
659
-	$alt = "('" . $boucle->id_table . '.\' . $x' . $suffix . ')';
660
-	$var = '$champs_' . $idb;
661
-	$desc = (strpos($boucle->in, "static $var =") !== false);
662
-	if (!$desc) {
663
-		$desc = $boucle->show['field'];
664
-		$desc = implode(',', array_map('_q', array_keys($desc)));
665
-		$boucles[$idb]->in .= "\n\tstatic $var = array(" . $desc . ");";
666
-	}
667
-	if ($desc) {
668
-		$alt = "(in_array(\$x, $var)  ? $alt :(\$x$suffix))";
669
-	}
670
-	$arg = calculer_liste($crit, $idb, $boucles, $boucle->id_parent);
671
-
672
-	return "((\$x = preg_replace(\"/\\W/\",'', $arg)) ? $alt : '')";
658
+    $boucle = $boucles[$idb];
659
+    $alt = "('" . $boucle->id_table . '.\' . $x' . $suffix . ')';
660
+    $var = '$champs_' . $idb;
661
+    $desc = (strpos($boucle->in, "static $var =") !== false);
662
+    if (!$desc) {
663
+        $desc = $boucle->show['field'];
664
+        $desc = implode(',', array_map('_q', array_keys($desc)));
665
+        $boucles[$idb]->in .= "\n\tstatic $var = array(" . $desc . ");";
666
+    }
667
+    if ($desc) {
668
+        $alt = "(in_array(\$x, $var)  ? $alt :(\$x$suffix))";
669
+    }
670
+    $arg = calculer_liste($crit, $idb, $boucles, $boucle->id_parent);
671
+
672
+    return "((\$x = preg_replace(\"/\\W/\",'', $arg)) ? $alt : '')";
673 673
 }
674 674
 
675 675
 /**
@@ -708,7 +708,7 @@  discard block
 block discarded – undo
708 708
  * @param Critere $crit Paramètres du critère dans cette boucle
709 709
  */
710 710
 function critere_par_dist($idb, &$boucles, $crit) {
711
-	return critere_parinverse($idb, $boucles, $crit);
711
+    return critere_parinverse($idb, $boucles, $crit);
712 712
 }
713 713
 
714 714
 /**
@@ -730,93 +730,93 @@  discard block
 block discarded – undo
730 730
  * @param Critere $crit Paramètres du critère dans cette boucle
731 731
  */
732 732
 function critere_parinverse($idb, &$boucles, $crit) {
733
-	$boucle = &$boucles[$idb];
734
-
735
-	$sens = $collecte = '';
736
-	if ($crit->not) {
737
-		$sens = " . ' DESC'";
738
-	}
739
-	if (isset($boucle->modificateur['collate'])) {
740
-		$collecte = ' . ' . $boucle->modificateur['collate'];
741
-	}
742
-
743
-	// Pour chaque paramètre du critère
744
-	foreach ($crit->param as $tri) {
745
-		$order = $fct = '';
746
-		// tris specifiés dynamiquement {par #ENV{tri}}
747
-		if ($tri[0]->type != 'texte') {
748
-			// calculer le order dynamique qui verifie les champs
749
-			$order = calculer_critere_arg_dynamique($idb, $boucles, $tri, $sens);
750
-			// ajouter 'hasard' comme possibilité de tri dynamique
751
-			calculer_critere_par_hasard($idb, $boucles, $crit);
752
-		}
753
-		// tris textuels {par titre}
754
-		else {
755
-			$par = array_shift($tri);
756
-			$par = $par->texte;
757
-
758
-			// tris de la forme {par expression champ} tel que {par num titre} ou {par multi titre}
759
-			if (preg_match(",^(\w+)[\s]+(.*)$,", $par, $m)) {
760
-				$expression = trim($m[1]);
761
-				$champ = trim($m[2]);
762
-				if (function_exists($f = 'calculer_critere_par_expression_' . $expression)) {
763
-					$order = $f($idb, $boucles, $crit, $tri, $champ);
764
-				} else {
765
-					return array('zbug_critere_inconnu', array('critere' => $crit->op . " $par"));
766
-				}
767
-
768
-			// tris de la forme {par champ} ou {par FONCTION(champ)}
769
-			} elseif (preg_match(",^" . CHAMP_SQL_PLUS_FONC . '$,is', $par, $match)) {
770
-				// {par FONCTION(champ)}
771
-				if (count($match) > 2) {
772
-					$par = substr($match[2], 1, -1);
773
-					$fct = $match[1];
774
-				}
775
-				// quelques cas spécifiques {par hasard}, {par date}
776
-				if ($par == 'hasard') {
777
-					$order = calculer_critere_par_hasard($idb, $boucles, $crit);
778
-				} elseif ($par == 'date' and !empty($boucle->show['date'])) {
779
-					$order = "'" . $boucle->id_table . "." . $boucle->show['date'] . "'";
780
-				} else {
781
-					// cas général {par champ}, {par table.champ}, ...
782
-					$order = calculer_critere_par_champ($idb, $boucles, $crit, $par);
783
-				}
784
-			}
785
-
786
-			// on ne sait pas traiter…
787
-			else {
788
-				return array('zbug_critere_inconnu', array('critere' => $crit->op . " $par"));
789
-			}
790
-
791
-			// En cas d'erreur de squelette retournée par une fonction
792
-			if (is_array($order)) {
793
-				return $order;
794
-			}
795
-		}
796
-
797
-		if (preg_match('/^\'([^"]*)\'$/', $order, $m)) {
798
-			$t = $m[1];
799
-			if (strpos($t, '.') and !in_array($t, $boucle->select)) {
800
-				$boucle->select[] = $t;
801
-			}
802
-		} else {
803
-			$sens = '';
804
-		}
805
-
806
-		if ($fct) {
807
-			if (preg_match("/^\s*'(.*)'\s*$/", $order, $r)) {
808
-				$order = "'$fct(" . $r[1] . ")'";
809
-			} else {
810
-				$order = "'$fct(' . $order . ')'";
811
-			}
812
-		}
813
-		$t = $order . $collecte . $sens;
814
-		if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
815
-			$t = $r[1] . $r[2];
816
-		}
817
-
818
-		$boucle->order[] = $t;
819
-	}
733
+    $boucle = &$boucles[$idb];
734
+
735
+    $sens = $collecte = '';
736
+    if ($crit->not) {
737
+        $sens = " . ' DESC'";
738
+    }
739
+    if (isset($boucle->modificateur['collate'])) {
740
+        $collecte = ' . ' . $boucle->modificateur['collate'];
741
+    }
742
+
743
+    // Pour chaque paramètre du critère
744
+    foreach ($crit->param as $tri) {
745
+        $order = $fct = '';
746
+        // tris specifiés dynamiquement {par #ENV{tri}}
747
+        if ($tri[0]->type != 'texte') {
748
+            // calculer le order dynamique qui verifie les champs
749
+            $order = calculer_critere_arg_dynamique($idb, $boucles, $tri, $sens);
750
+            // ajouter 'hasard' comme possibilité de tri dynamique
751
+            calculer_critere_par_hasard($idb, $boucles, $crit);
752
+        }
753
+        // tris textuels {par titre}
754
+        else {
755
+            $par = array_shift($tri);
756
+            $par = $par->texte;
757
+
758
+            // tris de la forme {par expression champ} tel que {par num titre} ou {par multi titre}
759
+            if (preg_match(",^(\w+)[\s]+(.*)$,", $par, $m)) {
760
+                $expression = trim($m[1]);
761
+                $champ = trim($m[2]);
762
+                if (function_exists($f = 'calculer_critere_par_expression_' . $expression)) {
763
+                    $order = $f($idb, $boucles, $crit, $tri, $champ);
764
+                } else {
765
+                    return array('zbug_critere_inconnu', array('critere' => $crit->op . " $par"));
766
+                }
767
+
768
+            // tris de la forme {par champ} ou {par FONCTION(champ)}
769
+            } elseif (preg_match(",^" . CHAMP_SQL_PLUS_FONC . '$,is', $par, $match)) {
770
+                // {par FONCTION(champ)}
771
+                if (count($match) > 2) {
772
+                    $par = substr($match[2], 1, -1);
773
+                    $fct = $match[1];
774
+                }
775
+                // quelques cas spécifiques {par hasard}, {par date}
776
+                if ($par == 'hasard') {
777
+                    $order = calculer_critere_par_hasard($idb, $boucles, $crit);
778
+                } elseif ($par == 'date' and !empty($boucle->show['date'])) {
779
+                    $order = "'" . $boucle->id_table . "." . $boucle->show['date'] . "'";
780
+                } else {
781
+                    // cas général {par champ}, {par table.champ}, ...
782
+                    $order = calculer_critere_par_champ($idb, $boucles, $crit, $par);
783
+                }
784
+            }
785
+
786
+            // on ne sait pas traiter…
787
+            else {
788
+                return array('zbug_critere_inconnu', array('critere' => $crit->op . " $par"));
789
+            }
790
+
791
+            // En cas d'erreur de squelette retournée par une fonction
792
+            if (is_array($order)) {
793
+                return $order;
794
+            }
795
+        }
796
+
797
+        if (preg_match('/^\'([^"]*)\'$/', $order, $m)) {
798
+            $t = $m[1];
799
+            if (strpos($t, '.') and !in_array($t, $boucle->select)) {
800
+                $boucle->select[] = $t;
801
+            }
802
+        } else {
803
+            $sens = '';
804
+        }
805
+
806
+        if ($fct) {
807
+            if (preg_match("/^\s*'(.*)'\s*$/", $order, $r)) {
808
+                $order = "'$fct(" . $r[1] . ")'";
809
+            } else {
810
+                $order = "'$fct(' . $order . ')'";
811
+            }
812
+        }
813
+        $t = $order . $collecte . $sens;
814
+        if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
815
+            $t = $r[1] . $r[2];
816
+        }
817
+
818
+        $boucle->order[] = $t;
819
+    }
820 820
 }
821 821
 
822 822
 /**
@@ -830,13 +830,13 @@  discard block
 block discarded – undo
830 830
  * @return string Clause pour le Order by
831 831
  */
832 832
 function calculer_critere_par_hasard($idb, &$boucles, $crit) {
833
-	$boucle = &$boucles[$idb];
834
-	// Si ce n'est fait, ajouter un champ 'hasard' dans le select
835
-	$parha = "rand() AS hasard";
836
-	if (!in_array($parha, $boucle->select)) {
837
-		$boucle->select[] = $parha;
838
-	}
839
-	return "'hasard'";
833
+    $boucle = &$boucles[$idb];
834
+    // Si ce n'est fait, ajouter un champ 'hasard' dans le select
835
+    $parha = "rand() AS hasard";
836
+    if (!in_array($parha, $boucle->select)) {
837
+        $boucle->select[] = $parha;
838
+    }
839
+    return "'hasard'";
840 840
 }
841 841
 
842 842
 /**
@@ -860,20 +860,20 @@  discard block
 block discarded – undo
860 860
  * @return string Clause pour le Order by
861 861
  */
862 862
 function calculer_critere_par_expression_num($idb, &$boucles, $crit, $tri, $champ) {
863
-	$_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
864
-	if (is_array($_champ)) {
865
-		return array('zbug_critere_inconnu', array('critere' => $crit->op . " num $champ"));
866
-	}
867
-	$boucle = &$boucles[$idb];
868
-	$texte = '0+' . $_champ;
869
-	$suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent);
870
-	if ($suite !== "''") {
871
-		$texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . " . \"";
872
-	}
873
-	$as = 'num' . ($boucle->order ? count($boucle->order) : "");
874
-	$boucle->select[] = $texte . " AS $as";
875
-	$order = "'$as'";
876
-	return $order;
863
+    $_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
864
+    if (is_array($_champ)) {
865
+        return array('zbug_critere_inconnu', array('critere' => $crit->op . " num $champ"));
866
+    }
867
+    $boucle = &$boucles[$idb];
868
+    $texte = '0+' . $_champ;
869
+    $suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent);
870
+    if ($suite !== "''") {
871
+        $texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . " . \"";
872
+    }
873
+    $as = 'num' . ($boucle->order ? count($boucle->order) : "");
874
+    $boucle->select[] = $texte . " AS $as";
875
+    $order = "'$as'";
876
+    return $order;
877 877
 }
878 878
 
879 879
 /**
@@ -894,20 +894,20 @@  discard block
 block discarded – undo
894 894
  * @return string Clause pour le Order by
895 895
  */
896 896
 function calculer_critere_par_expression_sinum($idb, &$boucles, $crit, $tri, $champ) {
897
-	$_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
898
-	if (is_array($_champ)) {
899
-		return array('zbug_critere_inconnu', array('critere' => $crit->op . " sinum $champ"));
900
-	}
901
-	$boucle = &$boucles[$idb];
902
-	$texte = '0+' . $_champ;
903
-	$suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent);
904
-	if ($suite !== "''") {
905
-		$texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . " . \"";
906
-	}
907
-	$as = 'sinum' . ($boucle->order ? count($boucle->order) : "");
908
-	$boucle->select[] = 'CASE (' . $texte . ') WHEN 0 THEN 1 ELSE 0 END AS ' . $as;
909
-	$order = "'$as'";
910
-	return $order;
897
+    $_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
898
+    if (is_array($_champ)) {
899
+        return array('zbug_critere_inconnu', array('critere' => $crit->op . " sinum $champ"));
900
+    }
901
+    $boucle = &$boucles[$idb];
902
+    $texte = '0+' . $_champ;
903
+    $suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent);
904
+    if ($suite !== "''") {
905
+        $texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . " . \"";
906
+    }
907
+    $as = 'sinum' . ($boucle->order ? count($boucle->order) : "");
908
+    $boucle->select[] = 'CASE (' . $texte . ') WHEN 0 THEN 1 ELSE 0 END AS ' . $as;
909
+    $order = "'$as'";
910
+    return $order;
911 911
 }
912 912
 
913 913
 
@@ -927,14 +927,14 @@  discard block
 block discarded – undo
927 927
  * @return string Clause pour le Order by
928 928
  */
929 929
 function calculer_critere_par_expression_multi($idb, &$boucles, $crit, $tri, $champ) {
930
-	$_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
931
-	if (is_array($_champ)) {
932
-		return array('zbug_critere_inconnu', array('critere' => $crit->op . " multi $champ"));
933
-	}
934
-	$boucle = &$boucles[$idb];
935
-	$boucle->select[] = "\".sql_multi('" . $_champ . "', \$GLOBALS['spip_lang']).\"";
936
-	$order = "'multi'";
937
-	return $order;
930
+    $_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
931
+    if (is_array($_champ)) {
932
+        return array('zbug_critere_inconnu', array('critere' => $crit->op . " multi $champ"));
933
+    }
934
+    $boucle = &$boucles[$idb];
935
+    $boucle->select[] = "\".sql_multi('" . $_champ . "', \$GLOBALS['spip_lang']).\"";
936
+    $order = "'multi'";
937
+    return $order;
938 938
 }
939 939
 
940 940
 /**
@@ -953,56 +953,56 @@  discard block
 block discarded – undo
953 953
  * @return array|string
954 954
  */
955 955
 function calculer_critere_par_champ($idb, &$boucles, $crit,  $par, $raw = false) {
956
-	$boucle = &$boucles[$idb];
957
-	$desc = $boucle->show;
958
-
959
-	// le champ existe dans la table, pas de souci (le plus commun)
960
-	if (isset($desc['field'][$par])) {
961
-		$par = $boucle->id_table . "." . $par;
962
-	}
963
-	// le champ est peut être une jointure
964
-	else {
965
-		$table = $table_alias = false; // toutes les tables de jointure possibles
966
-		$champ = $par;
967
-
968
-		// le champ demandé est une exception de jointure {par titre_mot}
969
-		if (isset($GLOBALS['exceptions_des_jointures'][$par])) {
970
-			list($table, $champ) = $GLOBALS['exceptions_des_jointures'][$par];
971
-		} // la table de jointure est explicitement indiquée {par truc.muche}
972
-		elseif (preg_match("/^([^,]*)\.(.*)$/", $par, $r)) {
973
-			list(, $table, $champ) = $r;
974
-			$table_alias = $table; // c'est peut-être un alias de table {par L1.titre}
975
-			$table = table_objet_sql($table);
976
-		}
977
-
978
-		// Si on connait la table d'arrivée, on la demande donc explicitement
979
-		// Sinon on cherche le champ dans les tables possibles de jointures
980
-		// Si la table est déjà dans le from, on la réutilise.
981
-		if ($infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $table)) {
982
-			$par = $infos['alias'] . "." . $champ;
983
-		} elseif (
984
-			$boucle->jointures_explicites
985
-			and $alias = trouver_jointure_champ($champ, $boucle, explode(' ', $boucle->jointures_explicites), false, $table)
986
-		) {
987
-			$par = $alias . "." . $champ;
988
-		} elseif ($alias = trouver_jointure_champ($champ, $boucle, $boucle->jointures, false, $table)) {
989
-			$par = $alias . "." . $champ;
990
-		// en spécifiant directement l'alias {par L2.titre} (situation hasardeuse tout de même)
991
-		} elseif (
992
-			$table_alias
993
-			and isset($boucle->from[$table_alias])
994
-			and $infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $boucle->from[$table_alias])
995
-		) {
996
-			$par = $infos['alias'] . "." . $champ;
997
-		} elseif ($table) {
998
-			// On avait table + champ, mais on ne les a pas trouvés
999
-			return array('zbug_critere_inconnu', array('critere' => $crit->op . " $par"));
1000
-		} else {
1001
-			// Sinon tant pis, ca doit etre un champ synthetise (cf points)
1002
-		}
1003
-	}
1004
-
1005
-	return $raw ? $par : "'$par'";
956
+    $boucle = &$boucles[$idb];
957
+    $desc = $boucle->show;
958
+
959
+    // le champ existe dans la table, pas de souci (le plus commun)
960
+    if (isset($desc['field'][$par])) {
961
+        $par = $boucle->id_table . "." . $par;
962
+    }
963
+    // le champ est peut être une jointure
964
+    else {
965
+        $table = $table_alias = false; // toutes les tables de jointure possibles
966
+        $champ = $par;
967
+
968
+        // le champ demandé est une exception de jointure {par titre_mot}
969
+        if (isset($GLOBALS['exceptions_des_jointures'][$par])) {
970
+            list($table, $champ) = $GLOBALS['exceptions_des_jointures'][$par];
971
+        } // la table de jointure est explicitement indiquée {par truc.muche}
972
+        elseif (preg_match("/^([^,]*)\.(.*)$/", $par, $r)) {
973
+            list(, $table, $champ) = $r;
974
+            $table_alias = $table; // c'est peut-être un alias de table {par L1.titre}
975
+            $table = table_objet_sql($table);
976
+        }
977
+
978
+        // Si on connait la table d'arrivée, on la demande donc explicitement
979
+        // Sinon on cherche le champ dans les tables possibles de jointures
980
+        // Si la table est déjà dans le from, on la réutilise.
981
+        if ($infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $table)) {
982
+            $par = $infos['alias'] . "." . $champ;
983
+        } elseif (
984
+            $boucle->jointures_explicites
985
+            and $alias = trouver_jointure_champ($champ, $boucle, explode(' ', $boucle->jointures_explicites), false, $table)
986
+        ) {
987
+            $par = $alias . "." . $champ;
988
+        } elseif ($alias = trouver_jointure_champ($champ, $boucle, $boucle->jointures, false, $table)) {
989
+            $par = $alias . "." . $champ;
990
+        // en spécifiant directement l'alias {par L2.titre} (situation hasardeuse tout de même)
991
+        } elseif (
992
+            $table_alias
993
+            and isset($boucle->from[$table_alias])
994
+            and $infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $boucle->from[$table_alias])
995
+        ) {
996
+            $par = $infos['alias'] . "." . $champ;
997
+        } elseif ($table) {
998
+            // On avait table + champ, mais on ne les a pas trouvés
999
+            return array('zbug_critere_inconnu', array('critere' => $crit->op . " $par"));
1000
+        } else {
1001
+            // Sinon tant pis, ca doit etre un champ synthetise (cf points)
1002
+        }
1003
+    }
1004
+
1005
+    return $raw ? $par : "'$par'";
1006 1006
 }
1007 1007
 
1008 1008
 /**
@@ -1016,11 +1016,11 @@  discard block
 block discarded – undo
1016 1016
  * @return string Champ pour le compilateur si trouvé, tel que "'alias.champ'", sinon vide.
1017 1017
  */
1018 1018
 function critere_par_joint($table, $champ, &$boucle) {
1019
-	$t = array_search($table, $boucle->from);
1020
-	if (!$t) {
1021
-		$t = trouver_jointure_champ($champ, $boucle);
1022
-	}
1023
-	return !$t ? '' : ("'" . $t . '.' . $champ . "'");
1019
+    $t = array_search($table, $boucle->from);
1020
+    if (!$t) {
1021
+        $t = trouver_jointure_champ($champ, $boucle);
1022
+    }
1023
+    return !$t ? '' : ("'" . $t . '.' . $champ . "'");
1024 1024
 }
1025 1025
 
1026 1026
 /**
@@ -1045,143 +1045,143 @@  discard block
 block discarded – undo
1045 1045
  */
1046 1046
 function critere_inverse_dist($idb, &$boucles, $crit) {
1047 1047
 
1048
-	$boucle = &$boucles[$idb];
1049
-	// Classement par ordre inverse
1050
-	if ($crit->not) {
1051
-		critere_parinverse($idb, $boucles, $crit);
1052
-	} else {
1053
-		$order = "' DESC'";
1054
-		// Classement par ordre inverse fonction eventuelle de #ENV{...}
1055
-		if (isset($crit->param[0])) {
1056
-			$critere = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
1057
-			$order = "(($critere)?' DESC':'')";
1058
-		}
1059
-
1060
-		$n = count($boucle->order);
1061
-		if (!$n) {
1062
-			if (isset($boucle->default_order[0])) {
1063
-				$boucle->default_order[0] .= ' . " DESC"';
1064
-			} else {
1065
-				$boucle->default_order[] = ' DESC';
1066
-			}
1067
-		} else {
1068
-			$t = $boucle->order[$n - 1] . " . $order";
1069
-			if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
1070
-				$t = $r[1] . $r[2];
1071
-			}
1072
-			$boucle->order[$n - 1] = $t;
1073
-		}
1074
-	}
1048
+    $boucle = &$boucles[$idb];
1049
+    // Classement par ordre inverse
1050
+    if ($crit->not) {
1051
+        critere_parinverse($idb, $boucles, $crit);
1052
+    } else {
1053
+        $order = "' DESC'";
1054
+        // Classement par ordre inverse fonction eventuelle de #ENV{...}
1055
+        if (isset($crit->param[0])) {
1056
+            $critere = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
1057
+            $order = "(($critere)?' DESC':'')";
1058
+        }
1059
+
1060
+        $n = count($boucle->order);
1061
+        if (!$n) {
1062
+            if (isset($boucle->default_order[0])) {
1063
+                $boucle->default_order[0] .= ' . " DESC"';
1064
+            } else {
1065
+                $boucle->default_order[] = ' DESC';
1066
+            }
1067
+        } else {
1068
+            $t = $boucle->order[$n - 1] . " . $order";
1069
+            if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
1070
+                $t = $r[1] . $r[2];
1071
+            }
1072
+            $boucle->order[$n - 1] = $t;
1073
+        }
1074
+    }
1075 1075
 }
1076 1076
 
1077 1077
 // http://code.spip.net/@critere_agenda_dist
1078 1078
 function critere_agenda_dist($idb, &$boucles, $crit) {
1079
-	$params = $crit->param;
1080
-
1081
-	if (count($params) < 1) {
1082
-		return array('zbug_critere_inconnu', array('critere' => $crit->op . " ?"));
1083
-	}
1084
-
1085
-	$boucle = &$boucles[$idb];
1086
-	$parent = $boucle->id_parent;
1087
-	$fields = $boucle->show['field'];
1088
-
1089
-	$date = array_shift($params);
1090
-	$type = array_shift($params);
1091
-
1092
-	// la valeur $type doit etre connue a la compilation
1093
-	// donc etre forcement reduite a un litteral unique dans le source
1094
-	$type = is_object($type[0]) ? $type[0]->texte : null;
1095
-
1096
-	// La valeur date doit designer un champ de la table SQL.
1097
-	// Si c'est un litteral unique dans le source, verifier a la compil,
1098
-	// sinon synthetiser le test de verif pour execution ulterieure
1099
-	// On prendra arbitrairement le premier champ si test negatif.
1100
-	if ((count($date) == 1) and ($date[0]->type == 'texte')) {
1101
-		$date = $date[0]->texte;
1102
-		if (!isset($fields[$date])) {
1103
-			return array('zbug_critere_inconnu', array('critere' => $crit->op . " " . $date));
1104
-		}
1105
-	} else {
1106
-		$a = calculer_liste($date, $idb, $boucles, $parent);
1107
-		$noms = array_keys($fields);
1108
-		$defaut = $noms[0];
1109
-		$noms = join(" ", $noms);
1110
-		# bien laisser 2 espaces avant $nom pour que strpos<>0
1111
-		$cond = "(\$a=strval($a))AND\nstrpos(\"  $noms \",\" \$a \")";
1112
-		$date = "'.(($cond)\n?\$a:\"$defaut\").'";
1113
-	}
1114
-	$annee = $params ? array_shift($params) : "";
1115
-	$annee = "\n" . 'sprintf("%04d", ($x = ' .
1116
-		calculer_liste($annee, $idb, $boucles, $parent) .
1117
-		') ? $x : date("Y"))';
1118
-
1119
-	$mois = $params ? array_shift($params) : "";
1120
-	$mois = "\n" . 'sprintf("%02d", ($x = ' .
1121
-		calculer_liste($mois, $idb, $boucles, $parent) .
1122
-		') ? $x : date("m"))';
1123
-
1124
-	$jour = $params ? array_shift($params) : "";
1125
-	$jour = "\n" . 'sprintf("%02d", ($x = ' .
1126
-		calculer_liste($jour, $idb, $boucles, $parent) .
1127
-		') ? $x : date("d"))';
1128
-
1129
-	$annee2 = $params ? array_shift($params) : "";
1130
-	$annee2 = "\n" . 'sprintf("%04d", ($x = ' .
1131
-		calculer_liste($annee2, $idb, $boucles, $parent) .
1132
-		') ? $x : date("Y"))';
1133
-
1134
-	$mois2 = $params ? array_shift($params) : "";
1135
-	$mois2 = "\n" . 'sprintf("%02d", ($x = ' .
1136
-		calculer_liste($mois2, $idb, $boucles, $parent) .
1137
-		') ? $x : date("m"))';
1138
-
1139
-	$jour2 = $params ? array_shift($params) : "";
1140
-	$jour2 = "\n" . 'sprintf("%02d", ($x = ' .
1141
-		calculer_liste($jour2, $idb, $boucles, $parent) .
1142
-		') ? $x : date("d"))';
1143
-
1144
-	$date = $boucle->id_table . ".$date";
1145
-
1146
-	$quote_end = ",'" . $boucle->sql_serveur . "','text'";
1147
-	if ($type == 'jour') {
1148
-		$boucle->where[] = array(
1149
-			"'='",
1150
-			"'DATE_FORMAT($date, \'%Y%m%d\')'",
1151
-			("sql_quote($annee . $mois . $jour$quote_end)")
1152
-		);
1153
-	} elseif ($type == 'mois') {
1154
-		$boucle->where[] = array(
1155
-			"'='",
1156
-			"'DATE_FORMAT($date, \'%Y%m\')'",
1157
-			("sql_quote($annee . $mois$quote_end)")
1158
-		);
1159
-	} elseif ($type == 'semaine') {
1160
-		$boucle->where[] = array(
1161
-			"'AND'",
1162
-			array(
1163
-				"'>='",
1164
-				"'DATE_FORMAT($date, \'%Y%m%d\')'",
1165
-				("date_debut_semaine($annee, $mois, $jour)")
1166
-			),
1167
-			array(
1168
-				"'<='",
1169
-				"'DATE_FORMAT($date, \'%Y%m%d\')'",
1170
-				("date_fin_semaine($annee, $mois, $jour)")
1171
-			)
1172
-		);
1173
-	} elseif (count($crit->param) > 2) {
1174
-		$boucle->where[] = array(
1175
-			"'AND'",
1176
-			array(
1177
-				"'>='",
1178
-				"'DATE_FORMAT($date, \'%Y%m%d\')'",
1179
-				("sql_quote($annee . $mois . $jour$quote_end)")
1180
-			),
1181
-			array("'<='", "'DATE_FORMAT($date, \'%Y%m%d\')'", ("sql_quote($annee2 . $mois2 . $jour2$quote_end)"))
1182
-		);
1183
-	}
1184
-	// sinon on prend tout
1079
+    $params = $crit->param;
1080
+
1081
+    if (count($params) < 1) {
1082
+        return array('zbug_critere_inconnu', array('critere' => $crit->op . " ?"));
1083
+    }
1084
+
1085
+    $boucle = &$boucles[$idb];
1086
+    $parent = $boucle->id_parent;
1087
+    $fields = $boucle->show['field'];
1088
+
1089
+    $date = array_shift($params);
1090
+    $type = array_shift($params);
1091
+
1092
+    // la valeur $type doit etre connue a la compilation
1093
+    // donc etre forcement reduite a un litteral unique dans le source
1094
+    $type = is_object($type[0]) ? $type[0]->texte : null;
1095
+
1096
+    // La valeur date doit designer un champ de la table SQL.
1097
+    // Si c'est un litteral unique dans le source, verifier a la compil,
1098
+    // sinon synthetiser le test de verif pour execution ulterieure
1099
+    // On prendra arbitrairement le premier champ si test negatif.
1100
+    if ((count($date) == 1) and ($date[0]->type == 'texte')) {
1101
+        $date = $date[0]->texte;
1102
+        if (!isset($fields[$date])) {
1103
+            return array('zbug_critere_inconnu', array('critere' => $crit->op . " " . $date));
1104
+        }
1105
+    } else {
1106
+        $a = calculer_liste($date, $idb, $boucles, $parent);
1107
+        $noms = array_keys($fields);
1108
+        $defaut = $noms[0];
1109
+        $noms = join(" ", $noms);
1110
+        # bien laisser 2 espaces avant $nom pour que strpos<>0
1111
+        $cond = "(\$a=strval($a))AND\nstrpos(\"  $noms \",\" \$a \")";
1112
+        $date = "'.(($cond)\n?\$a:\"$defaut\").'";
1113
+    }
1114
+    $annee = $params ? array_shift($params) : "";
1115
+    $annee = "\n" . 'sprintf("%04d", ($x = ' .
1116
+        calculer_liste($annee, $idb, $boucles, $parent) .
1117
+        ') ? $x : date("Y"))';
1118
+
1119
+    $mois = $params ? array_shift($params) : "";
1120
+    $mois = "\n" . 'sprintf("%02d", ($x = ' .
1121
+        calculer_liste($mois, $idb, $boucles, $parent) .
1122
+        ') ? $x : date("m"))';
1123
+
1124
+    $jour = $params ? array_shift($params) : "";
1125
+    $jour = "\n" . 'sprintf("%02d", ($x = ' .
1126
+        calculer_liste($jour, $idb, $boucles, $parent) .
1127
+        ') ? $x : date("d"))';
1128
+
1129
+    $annee2 = $params ? array_shift($params) : "";
1130
+    $annee2 = "\n" . 'sprintf("%04d", ($x = ' .
1131
+        calculer_liste($annee2, $idb, $boucles, $parent) .
1132
+        ') ? $x : date("Y"))';
1133
+
1134
+    $mois2 = $params ? array_shift($params) : "";
1135
+    $mois2 = "\n" . 'sprintf("%02d", ($x = ' .
1136
+        calculer_liste($mois2, $idb, $boucles, $parent) .
1137
+        ') ? $x : date("m"))';
1138
+
1139
+    $jour2 = $params ? array_shift($params) : "";
1140
+    $jour2 = "\n" . 'sprintf("%02d", ($x = ' .
1141
+        calculer_liste($jour2, $idb, $boucles, $parent) .
1142
+        ') ? $x : date("d"))';
1143
+
1144
+    $date = $boucle->id_table . ".$date";
1145
+
1146
+    $quote_end = ",'" . $boucle->sql_serveur . "','text'";
1147
+    if ($type == 'jour') {
1148
+        $boucle->where[] = array(
1149
+            "'='",
1150
+            "'DATE_FORMAT($date, \'%Y%m%d\')'",
1151
+            ("sql_quote($annee . $mois . $jour$quote_end)")
1152
+        );
1153
+    } elseif ($type == 'mois') {
1154
+        $boucle->where[] = array(
1155
+            "'='",
1156
+            "'DATE_FORMAT($date, \'%Y%m\')'",
1157
+            ("sql_quote($annee . $mois$quote_end)")
1158
+        );
1159
+    } elseif ($type == 'semaine') {
1160
+        $boucle->where[] = array(
1161
+            "'AND'",
1162
+            array(
1163
+                "'>='",
1164
+                "'DATE_FORMAT($date, \'%Y%m%d\')'",
1165
+                ("date_debut_semaine($annee, $mois, $jour)")
1166
+            ),
1167
+            array(
1168
+                "'<='",
1169
+                "'DATE_FORMAT($date, \'%Y%m%d\')'",
1170
+                ("date_fin_semaine($annee, $mois, $jour)")
1171
+            )
1172
+        );
1173
+    } elseif (count($crit->param) > 2) {
1174
+        $boucle->where[] = array(
1175
+            "'AND'",
1176
+            array(
1177
+                "'>='",
1178
+                "'DATE_FORMAT($date, \'%Y%m%d\')'",
1179
+                ("sql_quote($annee . $mois . $jour$quote_end)")
1180
+            ),
1181
+            array("'<='", "'DATE_FORMAT($date, \'%Y%m%d\')'", ("sql_quote($annee2 . $mois2 . $jour2$quote_end)"))
1182
+        );
1183
+    }
1184
+    // sinon on prend tout
1185 1185
 }
1186 1186
 
1187 1187
 
@@ -1206,33 +1206,33 @@  discard block
 block discarded – undo
1206 1206
  * @return void
1207 1207
  **/
1208 1208
 function calculer_critere_parties($idb, &$boucles, $crit) {
1209
-	$boucle = &$boucles[$idb];
1210
-	$a1 = $crit->param[0];
1211
-	$a2 = $crit->param[1];
1212
-	$op = $crit->op;
1213
-
1214
-	list($a11, $a12) = calculer_critere_parties_aux($idb, $boucles, $a1);
1215
-	list($a21, $a22) = calculer_critere_parties_aux($idb, $boucles, $a2);
1216
-
1217
-	if (($op == ',') && (is_numeric($a11) && (is_numeric($a21)))) {
1218
-		$boucle->limit = $a11 . ',' . $a21;
1219
-	} else {
1220
-		// 3 dans {1/3}, {2,3} ou {1,n-3}
1221
-		$boucle->total_parties = ($a21 != 'n') ? $a21 : $a22;
1222
-		// 2 dans {2/3}, {2,5}, {n-2,1}
1223
-		$partie = ($a11 != 'n') ? $a11 : $a12;
1224
-		$mode = (($op == '/') ? '/' :
1225
-			(($a11 == 'n') ? '-' : '+') . (($a21 == 'n') ? '-' : '+'));
1226
-		// cas simple {0,#ENV{truc}} compilons le en LIMIT :
1227
-		if ($a11 !== 'n' and $a21 !== 'n' and $mode == "++" and $op == ',') {
1228
-			$boucle->limit =
1229
-				(is_numeric($a11) ? "'$a11'" : $a11)
1230
-				. ".','."
1231
-				. (is_numeric($a21) ? "'$a21'" : $a21);
1232
-		} else {
1233
-			calculer_parties($boucles, $idb, $partie, $mode);
1234
-		}
1235
-	}
1209
+    $boucle = &$boucles[$idb];
1210
+    $a1 = $crit->param[0];
1211
+    $a2 = $crit->param[1];
1212
+    $op = $crit->op;
1213
+
1214
+    list($a11, $a12) = calculer_critere_parties_aux($idb, $boucles, $a1);
1215
+    list($a21, $a22) = calculer_critere_parties_aux($idb, $boucles, $a2);
1216
+
1217
+    if (($op == ',') && (is_numeric($a11) && (is_numeric($a21)))) {
1218
+        $boucle->limit = $a11 . ',' . $a21;
1219
+    } else {
1220
+        // 3 dans {1/3}, {2,3} ou {1,n-3}
1221
+        $boucle->total_parties = ($a21 != 'n') ? $a21 : $a22;
1222
+        // 2 dans {2/3}, {2,5}, {n-2,1}
1223
+        $partie = ($a11 != 'n') ? $a11 : $a12;
1224
+        $mode = (($op == '/') ? '/' :
1225
+            (($a11 == 'n') ? '-' : '+') . (($a21 == 'n') ? '-' : '+'));
1226
+        // cas simple {0,#ENV{truc}} compilons le en LIMIT :
1227
+        if ($a11 !== 'n' and $a21 !== 'n' and $mode == "++" and $op == ',') {
1228
+            $boucle->limit =
1229
+                (is_numeric($a11) ? "'$a11'" : $a11)
1230
+                . ".','."
1231
+                . (is_numeric($a21) ? "'$a21'" : $a21);
1232
+        } else {
1233
+            calculer_parties($boucles, $idb, $partie, $mode);
1234
+        }
1235
+    }
1236 1236
 }
1237 1237
 
1238 1238
 /**
@@ -1260,63 +1260,63 @@  discard block
 block discarded – undo
1260 1260
  * @return void
1261 1261
  **/
1262 1262
 function calculer_parties(&$boucles, $id_boucle, $debut, $mode) {
1263
-	$total_parties = $boucles[$id_boucle]->total_parties;
1264
-
1265
-	preg_match(",([+-/p])([+-/])?,", $mode, $regs);
1266
-	list(, $op1, $op2) = array_pad($regs, 3, null);
1267
-	$nombre_boucle = "\$Numrows['$id_boucle']['total']";
1268
-	// {1/3}
1269
-	if ($op1 == '/') {
1270
-		$pmoins1 = is_numeric($debut) ? ($debut - 1) : "($debut-1)";
1271
-		$totpos = is_numeric($total_parties) ? ($total_parties) :
1272
-			"($total_parties ? $total_parties : 1)";
1273
-		$fin = "ceil(($nombre_boucle * $debut )/$totpos) - 1";
1274
-		$debut = !$pmoins1 ? 0 : "ceil(($nombre_boucle * $pmoins1)/$totpos);";
1275
-	} else {
1276
-		// cas {n-1,x}
1277
-		if ($op1 == '-') {
1278
-			$debut = "$nombre_boucle - $debut;";
1279
-		}
1280
-
1281
-		// cas {x,n-1}
1282
-		if ($op2 == '-') {
1283
-			$fin = '$debut_boucle + ' . $nombre_boucle . ' - '
1284
-				. (is_numeric($total_parties) ? ($total_parties + 1) :
1285
-					($total_parties . ' - 1'));
1286
-		} else {
1287
-			// {x,1} ou {pagination}
1288
-			$fin = '$debut_boucle'
1289
-				. (is_numeric($total_parties) ?
1290
-					(($total_parties == 1) ? "" : (' + ' . ($total_parties - 1))) :
1291
-					('+' . $total_parties . ' - 1'));
1292
-		}
1293
-
1294
-		// {pagination}, gerer le debut_xx=-1 pour tout voir
1295
-		if ($op1 == 'p') {
1296
-			$debut .= ";\n	\$debut_boucle = ((\$tout=(\$debut_boucle == -1))?0:(\$debut_boucle))";
1297
-			$debut .= ";\n	\$debut_boucle = max(0,min(\$debut_boucle,floor(($nombre_boucle-1)/($total_parties))*($total_parties)))";
1298
-			$fin = "(\$tout ? $nombre_boucle : $fin)";
1299
-		}
1300
-	}
1301
-
1302
-	// Notes :
1303
-	// $debut_boucle et $fin_boucle sont les indices SQL du premier
1304
-	// et du dernier demandes dans la boucle : 0 pour le premier,
1305
-	// n-1 pour le dernier ; donc total_boucle = 1 + debut - fin
1306
-	// Utiliser min pour rabattre $fin_boucle sur total_boucle.
1307
-
1308
-	$boucles[$id_boucle]->mode_partie = "\n\t"
1309
-		. '$debut_boucle = ' . $debut . ";\n	"
1310
-		. "\$debut_boucle = intval(\$debut_boucle);\n	"
1311
-		. '$fin_boucle = min(' . $fin . ", \$Numrows['$id_boucle']['total'] - 1);\n	"
1312
-		. '$Numrows[\'' . $id_boucle . "']['grand_total'] = \$Numrows['$id_boucle']['total'];\n	"
1313
-		. '$Numrows[\'' . $id_boucle . '\']["total"] = max(0,$fin_boucle - $debut_boucle + 1);'
1314
-		. "\n\tif (\$debut_boucle>0"
1315
-		. " AND \$debut_boucle < \$Numrows['$id_boucle']['grand_total']"
1316
-		. " AND \$iter->seek(\$debut_boucle,'continue'))"
1317
-		. "\n\t\t\$Numrows['$id_boucle']['compteur_boucle'] = \$debut_boucle;\n\t";
1318
-
1319
-	$boucles[$id_boucle]->partie = "
1263
+    $total_parties = $boucles[$id_boucle]->total_parties;
1264
+
1265
+    preg_match(",([+-/p])([+-/])?,", $mode, $regs);
1266
+    list(, $op1, $op2) = array_pad($regs, 3, null);
1267
+    $nombre_boucle = "\$Numrows['$id_boucle']['total']";
1268
+    // {1/3}
1269
+    if ($op1 == '/') {
1270
+        $pmoins1 = is_numeric($debut) ? ($debut - 1) : "($debut-1)";
1271
+        $totpos = is_numeric($total_parties) ? ($total_parties) :
1272
+            "($total_parties ? $total_parties : 1)";
1273
+        $fin = "ceil(($nombre_boucle * $debut )/$totpos) - 1";
1274
+        $debut = !$pmoins1 ? 0 : "ceil(($nombre_boucle * $pmoins1)/$totpos);";
1275
+    } else {
1276
+        // cas {n-1,x}
1277
+        if ($op1 == '-') {
1278
+            $debut = "$nombre_boucle - $debut;";
1279
+        }
1280
+
1281
+        // cas {x,n-1}
1282
+        if ($op2 == '-') {
1283
+            $fin = '$debut_boucle + ' . $nombre_boucle . ' - '
1284
+                . (is_numeric($total_parties) ? ($total_parties + 1) :
1285
+                    ($total_parties . ' - 1'));
1286
+        } else {
1287
+            // {x,1} ou {pagination}
1288
+            $fin = '$debut_boucle'
1289
+                . (is_numeric($total_parties) ?
1290
+                    (($total_parties == 1) ? "" : (' + ' . ($total_parties - 1))) :
1291
+                    ('+' . $total_parties . ' - 1'));
1292
+        }
1293
+
1294
+        // {pagination}, gerer le debut_xx=-1 pour tout voir
1295
+        if ($op1 == 'p') {
1296
+            $debut .= ";\n	\$debut_boucle = ((\$tout=(\$debut_boucle == -1))?0:(\$debut_boucle))";
1297
+            $debut .= ";\n	\$debut_boucle = max(0,min(\$debut_boucle,floor(($nombre_boucle-1)/($total_parties))*($total_parties)))";
1298
+            $fin = "(\$tout ? $nombre_boucle : $fin)";
1299
+        }
1300
+    }
1301
+
1302
+    // Notes :
1303
+    // $debut_boucle et $fin_boucle sont les indices SQL du premier
1304
+    // et du dernier demandes dans la boucle : 0 pour le premier,
1305
+    // n-1 pour le dernier ; donc total_boucle = 1 + debut - fin
1306
+    // Utiliser min pour rabattre $fin_boucle sur total_boucle.
1307
+
1308
+    $boucles[$id_boucle]->mode_partie = "\n\t"
1309
+        . '$debut_boucle = ' . $debut . ";\n	"
1310
+        . "\$debut_boucle = intval(\$debut_boucle);\n	"
1311
+        . '$fin_boucle = min(' . $fin . ", \$Numrows['$id_boucle']['total'] - 1);\n	"
1312
+        . '$Numrows[\'' . $id_boucle . "']['grand_total'] = \$Numrows['$id_boucle']['total'];\n	"
1313
+        . '$Numrows[\'' . $id_boucle . '\']["total"] = max(0,$fin_boucle - $debut_boucle + 1);'
1314
+        . "\n\tif (\$debut_boucle>0"
1315
+        . " AND \$debut_boucle < \$Numrows['$id_boucle']['grand_total']"
1316
+        . " AND \$iter->seek(\$debut_boucle,'continue'))"
1317
+        . "\n\t\t\$Numrows['$id_boucle']['compteur_boucle'] = \$debut_boucle;\n\t";
1318
+
1319
+    $boucles[$id_boucle]->partie = "
1320 1320
 		if (\$Numrows['$id_boucle']['compteur_boucle'] <= \$debut_boucle) continue;
1321 1321
 		if (\$Numrows['$id_boucle']['compteur_boucle']-1 > \$fin_boucle) break;";
1322 1322
 }
@@ -1333,26 +1333,26 @@  discard block
 block discarded – undo
1333 1333
  * @return array          Valeur de l'élément (peut être une expression PHP), Nombre soustrait
1334 1334
  **/
1335 1335
 function calculer_critere_parties_aux($idb, &$boucles, $param) {
1336
-	if ($param[0]->type != 'texte') {
1337
-		$a1 = calculer_liste(array($param[0]), $idb, $boucles, $boucles[$idb]->id_parent);
1338
-		if (isset($param[1]->texte)) {
1339
-			preg_match(',^ *(-([0-9]+))? *$,', $param[1]->texte, $m);
1340
-
1341
-			return array("intval($a1)", ((isset($m[2]) and $m[2]) ? $m[2] : 0));
1342
-		} else {
1343
-			return array("intval($a1)", 0);
1344
-		}
1345
-	} else {
1346
-		preg_match(',^ *(([0-9]+)|n) *(- *([0-9]+)? *)?$,', $param[0]->texte, $m);
1347
-		$a1 = $m[1];
1348
-		if (empty($m[3])) {
1349
-			return array($a1, 0);
1350
-		} elseif (!empty($m[4])) {
1351
-			return array($a1, $m[4]);
1352
-		} else {
1353
-			return array($a1, calculer_liste(array($param[1]), $idb, $boucles, $boucles[$idb]->id_parent));
1354
-		}
1355
-	}
1336
+    if ($param[0]->type != 'texte') {
1337
+        $a1 = calculer_liste(array($param[0]), $idb, $boucles, $boucles[$idb]->id_parent);
1338
+        if (isset($param[1]->texte)) {
1339
+            preg_match(',^ *(-([0-9]+))? *$,', $param[1]->texte, $m);
1340
+
1341
+            return array("intval($a1)", ((isset($m[2]) and $m[2]) ? $m[2] : 0));
1342
+        } else {
1343
+            return array("intval($a1)", 0);
1344
+        }
1345
+    } else {
1346
+        preg_match(',^ *(([0-9]+)|n) *(- *([0-9]+)? *)?$,', $param[0]->texte, $m);
1347
+        $a1 = $m[1];
1348
+        if (empty($m[3])) {
1349
+            return array($a1, 0);
1350
+        } elseif (!empty($m[4])) {
1351
+            return array($a1, $m[4]);
1352
+        } else {
1353
+            return array($a1, calculer_liste(array($param[1]), $idb, $boucles, $boucles[$idb]->id_parent));
1354
+        }
1355
+    }
1356 1356
 }
1357 1357
 
1358 1358
 
@@ -1379,47 +1379,47 @@  discard block
 block discarded – undo
1379 1379
  *     array : Erreur sur un des critères
1380 1380
  **/
1381 1381
 function calculer_criteres($idb, &$boucles) {
1382
-	$msg = '';
1383
-	$boucle = $boucles[$idb];
1384
-	$table = strtoupper($boucle->type_requete);
1385
-	$serveur = strtolower($boucle->sql_serveur);
1386
-
1387
-	$defaut = charger_fonction('DEFAUT', 'calculer_critere');
1388
-	// s'il y avait une erreur de syntaxe, propager cette info
1389
-	if (!is_array($boucle->criteres)) {
1390
-		return array();
1391
-	}
1392
-
1393
-	foreach ($boucle->criteres as $crit) {
1394
-		$critere = $crit->op;
1395
-		// critere personnalise ?
1396
-		if (
1397
-			(!$serveur or
1398
-				((!function_exists($f = "critere_" . $serveur . "_" . $table . "_" . $critere))
1399
-					and (!function_exists($f = $f . "_dist"))
1400
-					and (!function_exists($f = "critere_" . $serveur . "_" . $critere))
1401
-					and (!function_exists($f = $f . "_dist"))
1402
-				)
1403
-			)
1404
-			and (!function_exists($f = "critere_" . $table . "_" . $critere))
1405
-			and (!function_exists($f = $f . "_dist"))
1406
-			and (!function_exists($f = "critere_" . $critere))
1407
-			and (!function_exists($f = $f . "_dist"))
1408
-		) {
1409
-			// fonction critere standard
1410
-			$f = $defaut;
1411
-		}
1412
-		// compile le critere
1413
-		$res = $f($idb, $boucles, $crit);
1414
-
1415
-		// Gestion centralisee des erreurs pour pouvoir propager
1416
-		if (is_array($res)) {
1417
-			$msg = $res;
1418
-			erreur_squelette($msg, $boucle);
1419
-		}
1420
-	}
1421
-
1422
-	return $msg;
1382
+    $msg = '';
1383
+    $boucle = $boucles[$idb];
1384
+    $table = strtoupper($boucle->type_requete);
1385
+    $serveur = strtolower($boucle->sql_serveur);
1386
+
1387
+    $defaut = charger_fonction('DEFAUT', 'calculer_critere');
1388
+    // s'il y avait une erreur de syntaxe, propager cette info
1389
+    if (!is_array($boucle->criteres)) {
1390
+        return array();
1391
+    }
1392
+
1393
+    foreach ($boucle->criteres as $crit) {
1394
+        $critere = $crit->op;
1395
+        // critere personnalise ?
1396
+        if (
1397
+            (!$serveur or
1398
+                ((!function_exists($f = "critere_" . $serveur . "_" . $table . "_" . $critere))
1399
+                    and (!function_exists($f = $f . "_dist"))
1400
+                    and (!function_exists($f = "critere_" . $serveur . "_" . $critere))
1401
+                    and (!function_exists($f = $f . "_dist"))
1402
+                )
1403
+            )
1404
+            and (!function_exists($f = "critere_" . $table . "_" . $critere))
1405
+            and (!function_exists($f = $f . "_dist"))
1406
+            and (!function_exists($f = "critere_" . $critere))
1407
+            and (!function_exists($f = $f . "_dist"))
1408
+        ) {
1409
+            // fonction critere standard
1410
+            $f = $defaut;
1411
+        }
1412
+        // compile le critere
1413
+        $res = $f($idb, $boucles, $crit);
1414
+
1415
+        // Gestion centralisee des erreurs pour pouvoir propager
1416
+        if (is_array($res)) {
1417
+            $msg = $res;
1418
+            erreur_squelette($msg, $boucle);
1419
+        }
1420
+    }
1421
+
1422
+    return $msg;
1423 1423
 }
1424 1424
 
1425 1425
 /**
@@ -1436,11 +1436,11 @@  discard block
 block discarded – undo
1436 1436
  * @return string         Code compilé rééchappé
1437 1437
  */
1438 1438
 function kwote($lisp, $serveur = '', $type = '') {
1439
-	if (preg_match(_CODE_QUOTE, $lisp, $r)) {
1440
-		return $r[1] . "\"" . sql_quote(str_replace(array("\\'", "\\\\"), array("'", "\\"), $r[2]), $serveur, $type) . "\"";
1441
-	} else {
1442
-		return "sql_quote($lisp, '$serveur', '" . str_replace("'", "\\'", $type) . "')";
1443
-	}
1439
+    if (preg_match(_CODE_QUOTE, $lisp, $r)) {
1440
+        return $r[1] . "\"" . sql_quote(str_replace(array("\\'", "\\\\"), array("'", "\\"), $r[2]), $serveur, $type) . "\"";
1441
+    } else {
1442
+        return "sql_quote($lisp, '$serveur', '" . str_replace("'", "\\'", $type) . "')";
1443
+    }
1444 1444
 }
1445 1445
 
1446 1446
 
@@ -1459,85 +1459,85 @@  discard block
 block discarded – undo
1459 1459
  * @return void
1460 1460
  **/
1461 1461
 function critere_IN_dist($idb, &$boucles, $crit) {
1462
-	$r = calculer_critere_infixe($idb, $boucles, $crit);
1463
-	if (!$r) {
1464
-		return (array('zbug_critere_inconnu', array('critere' => $crit->op . " ?")));
1465
-	}
1466
-	list($arg, $op, $val, $col, $where_complement) = $r;
1467
-
1468
-	$in = critere_IN_cas($idb, $boucles, $crit->not ? 'NOT' : ($crit->exclus ? 'exclus' : ''), $arg, $op, $val, $col);
1469
-
1470
-	//	inserer la condition; exemple: {id_mot ?IN (66, 62, 64)}
1471
-	$where = $in;
1472
-	if ($crit->cond) {
1473
-		$pred = calculer_argument_precedent($idb, $col, $boucles);
1474
-		$where = array("'?'", $pred, $where, "''");
1475
-		if ($where_complement) // condition annexe du type "AND (objet='article')"
1476
-		{
1477
-			$where_complement = array("'?'", $pred, $where_complement, "''");
1478
-		}
1479
-	}
1480
-	if ($crit->exclus) {
1481
-		if (!preg_match(",^L[0-9]+[.],", $arg)) {
1482
-			$where = array("'NOT'", $where);
1483
-		} else
1484
-			// un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete
1485
-			// c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent
1486
-		{
1487
-			$where = array(
1488
-				"'NOT'",
1489
-				array(
1490
-					"'IN'",
1491
-					"'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'",
1492
-					array("'SELF'", "'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'", $where)
1493
-				)
1494
-			);
1495
-		}
1496
-	}
1497
-
1498
-	$boucles[$idb]->where[] = $where;
1499
-	if ($where_complement) // condition annexe du type "AND (objet='article')"
1500
-	{
1501
-		$boucles[$idb]->where[] = $where_complement;
1502
-	}
1462
+    $r = calculer_critere_infixe($idb, $boucles, $crit);
1463
+    if (!$r) {
1464
+        return (array('zbug_critere_inconnu', array('critere' => $crit->op . " ?")));
1465
+    }
1466
+    list($arg, $op, $val, $col, $where_complement) = $r;
1467
+
1468
+    $in = critere_IN_cas($idb, $boucles, $crit->not ? 'NOT' : ($crit->exclus ? 'exclus' : ''), $arg, $op, $val, $col);
1469
+
1470
+    //	inserer la condition; exemple: {id_mot ?IN (66, 62, 64)}
1471
+    $where = $in;
1472
+    if ($crit->cond) {
1473
+        $pred = calculer_argument_precedent($idb, $col, $boucles);
1474
+        $where = array("'?'", $pred, $where, "''");
1475
+        if ($where_complement) // condition annexe du type "AND (objet='article')"
1476
+        {
1477
+            $where_complement = array("'?'", $pred, $where_complement, "''");
1478
+        }
1479
+    }
1480
+    if ($crit->exclus) {
1481
+        if (!preg_match(",^L[0-9]+[.],", $arg)) {
1482
+            $where = array("'NOT'", $where);
1483
+        } else
1484
+            // un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete
1485
+            // c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent
1486
+        {
1487
+            $where = array(
1488
+                "'NOT'",
1489
+                array(
1490
+                    "'IN'",
1491
+                    "'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'",
1492
+                    array("'SELF'", "'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'", $where)
1493
+                )
1494
+            );
1495
+        }
1496
+    }
1497
+
1498
+    $boucles[$idb]->where[] = $where;
1499
+    if ($where_complement) // condition annexe du type "AND (objet='article')"
1500
+    {
1501
+        $boucles[$idb]->where[] = $where_complement;
1502
+    }
1503 1503
 }
1504 1504
 
1505 1505
 // http://code.spip.net/@critere_IN_cas
1506 1506
 function critere_IN_cas($idb, &$boucles, $crit2, $arg, $op, $val, $col) {
1507
-	static $num = array();
1508
-	$descr = $boucles[$idb]->descr;
1509
-	$cpt = &$num[$descr['nom']][$descr['gram']][$idb];
1510
-
1511
-	$var = '$in' . $cpt++;
1512
-	$x = "\n\t$var = array();";
1513
-	foreach ($val as $k => $v) {
1514
-		if (preg_match(",^(\n//.*\n)?'(.*)'$,", $v, $r)) {
1515
-			// optimiser le traitement des constantes
1516
-			if (is_numeric($r[2])) {
1517
-				$x .= "\n\t$var" . "[]= $r[2];";
1518
-			} else {
1519
-				$x .= "\n\t$var" . "[]= " . sql_quote($r[2]) . ";";
1520
-			}
1521
-		} else {
1522
-			// Pour permettre de passer des tableaux de valeurs
1523
-			// on repere l'utilisation brute de #ENV**{X},
1524
-			// c'est-a-dire sa  traduction en ($PILE[0][X]).
1525
-			// et on deballe mais en rajoutant l'anti XSS
1526
-			$x .= "\n\tif (!(is_array(\$a = ($v))))\n\t\t$var" . "[]= \$a;\n\telse $var = array_merge($var, \$a);";
1527
-		}
1528
-	}
1529
-
1530
-	$boucles[$idb]->in .= $x;
1531
-
1532
-	// inserer le tri par defaut selon les ordres du IN ...
1533
-	// avec une ecriture de type FIELD qui degrade les performances (du meme ordre qu'un regexp)
1534
-	// et que l'on limite donc strictement aux cas necessaires :
1535
-	// si ce n'est pas un !IN, et si il n'y a pas d'autre order dans la boucle
1536
-	if (!$crit2) {
1537
-		$boucles[$idb]->default_order[] = "((!\$zqv=sql_quote($var) OR \$zqv===\"''\") ? 0 : ('FIELD($arg,' . \$zqv . ')'))";
1538
-	}
1539
-
1540
-	return "sql_in('$arg', $var" . ($crit2 == 'NOT' ? ",'NOT'" : "") . ")";
1507
+    static $num = array();
1508
+    $descr = $boucles[$idb]->descr;
1509
+    $cpt = &$num[$descr['nom']][$descr['gram']][$idb];
1510
+
1511
+    $var = '$in' . $cpt++;
1512
+    $x = "\n\t$var = array();";
1513
+    foreach ($val as $k => $v) {
1514
+        if (preg_match(",^(\n//.*\n)?'(.*)'$,", $v, $r)) {
1515
+            // optimiser le traitement des constantes
1516
+            if (is_numeric($r[2])) {
1517
+                $x .= "\n\t$var" . "[]= $r[2];";
1518
+            } else {
1519
+                $x .= "\n\t$var" . "[]= " . sql_quote($r[2]) . ";";
1520
+            }
1521
+        } else {
1522
+            // Pour permettre de passer des tableaux de valeurs
1523
+            // on repere l'utilisation brute de #ENV**{X},
1524
+            // c'est-a-dire sa  traduction en ($PILE[0][X]).
1525
+            // et on deballe mais en rajoutant l'anti XSS
1526
+            $x .= "\n\tif (!(is_array(\$a = ($v))))\n\t\t$var" . "[]= \$a;\n\telse $var = array_merge($var, \$a);";
1527
+        }
1528
+    }
1529
+
1530
+    $boucles[$idb]->in .= $x;
1531
+
1532
+    // inserer le tri par defaut selon les ordres du IN ...
1533
+    // avec une ecriture de type FIELD qui degrade les performances (du meme ordre qu'un regexp)
1534
+    // et que l'on limite donc strictement aux cas necessaires :
1535
+    // si ce n'est pas un !IN, et si il n'y a pas d'autre order dans la boucle
1536
+    if (!$crit2) {
1537
+        $boucles[$idb]->default_order[] = "((!\$zqv=sql_quote($var) OR \$zqv===\"''\") ? 0 : ('FIELD($arg,' . \$zqv . ')'))";
1538
+    }
1539
+
1540
+    return "sql_in('$arg', $var" . ($crit2 == 'NOT' ? ",'NOT'" : "") . ")";
1541 1541
 }
1542 1542
 
1543 1543
 /**
@@ -1553,22 +1553,22 @@  discard block
 block discarded – undo
1553 1553
  * @return void
1554 1554
  */
1555 1555
 function critere_where_dist($idb, &$boucles, $crit) {
1556
-	$boucle = &$boucles[$idb];
1557
-	if (isset($crit->param[0])) {
1558
-		$_where = calculer_liste($crit->param[0], $idb, $boucles, $boucle->id_parent);
1559
-	} else {
1560
-		$_where = '@$Pile[0]["where"]';
1561
-	}
1562
-
1563
-	if ($crit->cond) {
1564
-		$_where = "(($_where) ? ($_where) : '')";
1565
-	}
1566
-
1567
-	if ($crit->not) {
1568
-		$_where = "array('NOT',$_where)";
1569
-	}
1570
-
1571
-	$boucle->where[] = $_where;
1556
+    $boucle = &$boucles[$idb];
1557
+    if (isset($crit->param[0])) {
1558
+        $_where = calculer_liste($crit->param[0], $idb, $boucles, $boucle->id_parent);
1559
+    } else {
1560
+        $_where = '@$Pile[0]["where"]';
1561
+    }
1562
+
1563
+    if ($crit->cond) {
1564
+        $_where = "(($_where) ? ($_where) : '')";
1565
+    }
1566
+
1567
+    if ($crit->not) {
1568
+        $_where = "array('NOT',$_where)";
1569
+    }
1570
+
1571
+    $boucle->where[] = $_where;
1572 1572
 }
1573 1573
 
1574 1574
 /**
@@ -1596,31 +1596,31 @@  discard block
 block discarded – undo
1596 1596
  * @return void
1597 1597
  */
1598 1598
 function critere_id__dist($idb, &$boucles, $crit) {
1599
-	/** @var Boucle $boucle */
1600
-	$boucle = $boucles[$idb];
1601
-
1602
-	$champs = lister_champs_id_conditionnel(
1603
-		$boucle->show['table'],
1604
-		$boucle->show,
1605
-		$boucle->sql_serveur
1606
-	);
1607
-
1608
-	// ne pas tenir compte des critères identiques déjà présents.
1609
-	if (!empty($boucle->modificateur['criteres'])) {
1610
-		$champs = array_diff($champs, array_keys($boucle->modificateur['criteres']));
1611
-	}
1612
-	// nous aider en mode debug.
1613
-	$boucle->debug[] = "id_ : " . implode(', ', $champs);
1614
-	$boucle->modificateur['id_'] = $champs;
1615
-
1616
-	// créer un critère {id_xxx?} de chaque champ retenu
1617
-	foreach ($champs as $champ) {
1618
-		$critere_id_table = new Critere;
1619
-		$critere_id_table->op = $champ;
1620
-		$critere_id_table->cond = '?';
1621
-		$critere_id_table->ligne = $crit->ligne;
1622
-		calculer_critere_DEFAUT_dist($idb, $boucles, $critere_id_table);
1623
-	}
1599
+    /** @var Boucle $boucle */
1600
+    $boucle = $boucles[$idb];
1601
+
1602
+    $champs = lister_champs_id_conditionnel(
1603
+        $boucle->show['table'],
1604
+        $boucle->show,
1605
+        $boucle->sql_serveur
1606
+    );
1607
+
1608
+    // ne pas tenir compte des critères identiques déjà présents.
1609
+    if (!empty($boucle->modificateur['criteres'])) {
1610
+        $champs = array_diff($champs, array_keys($boucle->modificateur['criteres']));
1611
+    }
1612
+    // nous aider en mode debug.
1613
+    $boucle->debug[] = "id_ : " . implode(', ', $champs);
1614
+    $boucle->modificateur['id_'] = $champs;
1615
+
1616
+    // créer un critère {id_xxx?} de chaque champ retenu
1617
+    foreach ($champs as $champ) {
1618
+        $critere_id_table = new Critere;
1619
+        $critere_id_table->op = $champ;
1620
+        $critere_id_table->cond = '?';
1621
+        $critere_id_table->ligne = $crit->ligne;
1622
+        calculer_critere_DEFAUT_dist($idb, $boucles, $critere_id_table);
1623
+    }
1624 1624
 }
1625 1625
 
1626 1626
 /**
@@ -1640,79 +1640,79 @@  discard block
 block discarded – undo
1640 1640
  * @return array Liste de nom de champs (tel que id_article, id_mot, id_parent ...)
1641 1641
  */
1642 1642
 function lister_champs_id_conditionnel($table, $desc = null, $serveur = '') {
1643
-	// calculer la description de la table
1644
-	if (!is_array($desc)) {
1645
-		$desc = description_table($table, $serveur);
1646
-	}
1647
-	if (!$desc) {
1648
-		return [];
1649
-	}
1650
-
1651
-	// Les champs id_xx de la table demandée
1652
-	$champs = array_filter(
1653
-		array_keys($desc['field']),
1654
-		function($champ){
1655
-			return
1656
-				strpos($champ, 'id_') === 0
1657
-				or (in_array($champ, array('objet')));
1658
-		}
1659
-	);
1660
-
1661
-	// Si le champ id_rubrique appartient à la liste et si id_secteur n'est pas inclus on le rajoute.
1662
-	if (
1663
-		in_array('id_rubrique', $champs)
1664
-		and !in_array('id_secteur', $champs)
1665
-	) {
1666
-		$champs[] = 'id_secteur';
1667
-	}
1668
-
1669
-	// On ne fera pas mieux pour les tables d’un autre serveur
1670
-	if ($serveur) {
1671
-		return $champs;
1672
-	}
1673
-
1674
-	$primary = false;
1675
-	$associable = false;
1676
-	include_spip('action/editer_liens');
1677
-
1678
-	if (isset($desc['type'])) {
1679
-		$primary = id_table_objet($desc['type']);
1680
-		$associable = objet_associable($desc['type']);
1681
-	}
1682
-	if (isset($desc['field']['id_objet']) and isset($desc['field']['objet'])) {
1683
-		$associable = true;
1684
-	}
1685
-
1686
-	// liste de toutes les tables principales, sauf la notre
1687
-	$tables = lister_tables_objets_sql();
1688
-	unset($tables[$table]);
1689
-
1690
-	foreach ($tables as $_table => $_desc) {
1691
-		if (
1692
-			$associable
1693
-			or ($primary and in_array($primary, array_keys($_desc['field'])))
1694
-			or objet_associable($_desc['type'])
1695
-		) {
1696
-			$champs[] = id_table_objet($_table);
1697
-		}
1698
-	}
1699
-	$champs = array_values(array_unique($champs));
1700
-
1701
-	// Exclusions de certains id
1702
-	$exclusions = pipeline(
1703
-		'exclure_id_conditionnel',
1704
-		array(
1705
-			'args' => array(
1706
-				'table' => $table,
1707
-				'id_table_objet' => $primary,
1708
-				'associable' => $associable,
1709
-			),
1710
-			'data' => array(),
1711
-		)
1712
-	);
1713
-	$champs = array_diff($champs, $exclusions);
1714
-
1715
-	return $champs;
1643
+    // calculer la description de la table
1644
+    if (!is_array($desc)) {
1645
+        $desc = description_table($table, $serveur);
1646
+    }
1647
+    if (!$desc) {
1648
+        return [];
1649
+    }
1650
+
1651
+    // Les champs id_xx de la table demandée
1652
+    $champs = array_filter(
1653
+        array_keys($desc['field']),
1654
+        function($champ){
1655
+            return
1656
+                strpos($champ, 'id_') === 0
1657
+                or (in_array($champ, array('objet')));
1658
+        }
1659
+    );
1660
+
1661
+    // Si le champ id_rubrique appartient à la liste et si id_secteur n'est pas inclus on le rajoute.
1662
+    if (
1663
+        in_array('id_rubrique', $champs)
1664
+        and !in_array('id_secteur', $champs)
1665
+    ) {
1666
+        $champs[] = 'id_secteur';
1667
+    }
1668
+
1669
+    // On ne fera pas mieux pour les tables d’un autre serveur
1670
+    if ($serveur) {
1671
+        return $champs;
1672
+    }
1673
+
1674
+    $primary = false;
1675
+    $associable = false;
1676
+    include_spip('action/editer_liens');
1677
+
1678
+    if (isset($desc['type'])) {
1679
+        $primary = id_table_objet($desc['type']);
1680
+        $associable = objet_associable($desc['type']);
1681
+    }
1682
+    if (isset($desc['field']['id_objet']) and isset($desc['field']['objet'])) {
1683
+        $associable = true;
1684
+    }
1685
+
1686
+    // liste de toutes les tables principales, sauf la notre
1687
+    $tables = lister_tables_objets_sql();
1688
+    unset($tables[$table]);
1689
+
1690
+    foreach ($tables as $_table => $_desc) {
1691
+        if (
1692
+            $associable
1693
+            or ($primary and in_array($primary, array_keys($_desc['field'])))
1694
+            or objet_associable($_desc['type'])
1695
+        ) {
1696
+            $champs[] = id_table_objet($_table);
1697
+        }
1698
+    }
1699
+    $champs = array_values(array_unique($champs));
1700
+
1701
+    // Exclusions de certains id
1702
+    $exclusions = pipeline(
1703
+        'exclure_id_conditionnel',
1704
+        array(
1705
+            'args' => array(
1706
+                'table' => $table,
1707
+                'id_table_objet' => $primary,
1708
+                'associable' => $associable,
1709
+            ),
1710
+            'data' => array(),
1711
+        )
1712
+    );
1713
+    $champs = array_diff($champs, $exclusions);
1714
+
1715
+    return $champs;
1716 1716
 }
1717 1717
 
1718 1718
 /**
@@ -1767,27 +1767,27 @@  discard block
 block discarded – undo
1767 1767
  * @return void
1768 1768
  */
1769 1769
 function critere_tri_dist($idb, &$boucles, $crit) {
1770
-	$boucle = &$boucles[$idb];
1771
-
1772
-	// definition du champ par defaut
1773
-	$_champ_defaut = !isset($crit->param[0][0]) ? "''"
1774
-		: calculer_liste(array($crit->param[0][0]), $idb, $boucles, $boucle->id_parent);
1775
-	$_sens_defaut = !isset($crit->param[1][0]) ? "1"
1776
-		: calculer_liste(array($crit->param[1][0]), $idb, $boucles, $boucle->id_parent);
1777
-	$_variable = !isset($crit->param[2][0]) ? "'$idb'"
1778
-		: calculer_liste(array($crit->param[2][0]), $idb, $boucles, $boucle->id_parent);
1779
-
1780
-	$_tri = "((\$t=(isset(\$Pile[0]['tri'.$_variable]))?\$Pile[0]['tri'.$_variable]:((strncmp($_variable,'session',7)==0 AND session_get('tri'.$_variable))?session_get('tri'.$_variable):$_champ_defaut))?tri_protege_champ(\$t):'')";
1781
-
1782
-	$_sens_defaut = "(is_array(\$s=$_sens_defaut)?(isset(\$s[\$st=$_tri])?\$s[\$st]:reset(\$s)):\$s)";
1783
-	$_sens = "((intval(\$t=(isset(\$Pile[0]['sens'.$_variable]))?\$Pile[0]['sens'.$_variable]:((strncmp($_variable,'session',7)==0 AND session_get('sens'.$_variable))?session_get('sens'.$_variable):$_sens_defaut))==-1 OR \$t=='inverse')?-1:1)";
1784
-
1785
-	$boucle->modificateur['tri_champ'] = $_tri;
1786
-	$boucle->modificateur['tri_sens'] = $_sens;
1787
-	$boucle->modificateur['tri_nom'] = $_variable;
1788
-	// faut il inserer un test sur l'existence de $tri parmi les champs de la table ?
1789
-	// evite des erreurs sql, mais peut empecher des tri sur jointure ...
1790
-	$boucle->hash .= "
1770
+    $boucle = &$boucles[$idb];
1771
+
1772
+    // definition du champ par defaut
1773
+    $_champ_defaut = !isset($crit->param[0][0]) ? "''"
1774
+        : calculer_liste(array($crit->param[0][0]), $idb, $boucles, $boucle->id_parent);
1775
+    $_sens_defaut = !isset($crit->param[1][0]) ? "1"
1776
+        : calculer_liste(array($crit->param[1][0]), $idb, $boucles, $boucle->id_parent);
1777
+    $_variable = !isset($crit->param[2][0]) ? "'$idb'"
1778
+        : calculer_liste(array($crit->param[2][0]), $idb, $boucles, $boucle->id_parent);
1779
+
1780
+    $_tri = "((\$t=(isset(\$Pile[0]['tri'.$_variable]))?\$Pile[0]['tri'.$_variable]:((strncmp($_variable,'session',7)==0 AND session_get('tri'.$_variable))?session_get('tri'.$_variable):$_champ_defaut))?tri_protege_champ(\$t):'')";
1781
+
1782
+    $_sens_defaut = "(is_array(\$s=$_sens_defaut)?(isset(\$s[\$st=$_tri])?\$s[\$st]:reset(\$s)):\$s)";
1783
+    $_sens = "((intval(\$t=(isset(\$Pile[0]['sens'.$_variable]))?\$Pile[0]['sens'.$_variable]:((strncmp($_variable,'session',7)==0 AND session_get('sens'.$_variable))?session_get('sens'.$_variable):$_sens_defaut))==-1 OR \$t=='inverse')?-1:1)";
1784
+
1785
+    $boucle->modificateur['tri_champ'] = $_tri;
1786
+    $boucle->modificateur['tri_sens'] = $_sens;
1787
+    $boucle->modificateur['tri_nom'] = $_variable;
1788
+    // faut il inserer un test sur l'existence de $tri parmi les champs de la table ?
1789
+    // evite des erreurs sql, mais peut empecher des tri sur jointure ...
1790
+    $boucle->hash .= "
1791 1791
 	\$senstri = '';
1792 1792
 	\$tri = $_tri;
1793 1793
 	if (\$tri){
@@ -1795,8 +1795,8 @@  discard block
 block discarded – undo
1795 1795
 		\$senstri = (\$senstri<0)?' DESC':'';
1796 1796
 	};
1797 1797
 	";
1798
-	$boucle->select[] = "\".tri_champ_select(\$tri).\"";
1799
-	$boucle->order[] = "tri_champ_order(\$tri,\$command['from']).\$senstri";
1798
+    $boucle->select[] = "\".tri_champ_select(\$tri).\"";
1799
+    $boucle->order[] = "tri_champ_order(\$tri,\$command['from']).\$senstri";
1800 1800
 }
1801 1801
 
1802 1802
 # Criteres de comparaison
@@ -1813,20 +1813,20 @@  discard block
 block discarded – undo
1813 1813
  * @return void
1814 1814
  **/
1815 1815
 function calculer_critere_DEFAUT_dist($idb, &$boucles, $crit) {
1816
-	// double cas particulier {0,1} et {1/2} repere a l'analyse lexicale
1817
-	if (($crit->op == ",") or ($crit->op == '/')) {
1818
-		return calculer_critere_parties($idb, $boucles, $crit);
1819
-	}
1820
-
1821
-	$r = calculer_critere_infixe($idb, $boucles, $crit);
1822
-	if (!$r) {
1823
-		#	// on produit une erreur seulement si le critere n'a pas de '?'
1824
-		#	if (!$crit->cond) {
1825
-		return (array('zbug_critere_inconnu', array('critere' => $crit->op)));
1826
-		#	}
1827
-	} else {
1828
-		calculer_critere_DEFAUT_args($idb, $boucles, $crit, $r);
1829
-	}
1816
+    // double cas particulier {0,1} et {1/2} repere a l'analyse lexicale
1817
+    if (($crit->op == ",") or ($crit->op == '/')) {
1818
+        return calculer_critere_parties($idb, $boucles, $crit);
1819
+    }
1820
+
1821
+    $r = calculer_critere_infixe($idb, $boucles, $crit);
1822
+    if (!$r) {
1823
+        #	// on produit une erreur seulement si le critere n'a pas de '?'
1824
+        #	if (!$crit->cond) {
1825
+        return (array('zbug_critere_inconnu', array('critere' => $crit->op)));
1826
+        #	}
1827
+    } else {
1828
+        calculer_critere_DEFAUT_args($idb, $boucles, $crit, $r);
1829
+    }
1830 1830
 }
1831 1831
 
1832 1832
 
@@ -1846,63 +1846,63 @@  discard block
 block discarded – undo
1846 1846
  * @return void
1847 1847
  **/
1848 1848
 function calculer_critere_DEFAUT_args($idb, &$boucles, $crit, $args) {
1849
-	list($arg, $op, $val, $col, $where_complement) = $args;
1850
-
1851
-	$where = array("'$op'", "'$arg'", $val[0]);
1852
-
1853
-	// inserer la negation (cf !...)
1854
-
1855
-	if ($crit->not) {
1856
-		$where = array("'NOT'", $where);
1857
-	}
1858
-	if ($crit->exclus) {
1859
-		if (!preg_match(",^L[0-9]+[.],", $arg)) {
1860
-			$where = array("'NOT'", $where);
1861
-		} else
1862
-			// un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete
1863
-			// c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent
1864
-		{
1865
-			$where = array(
1866
-				"'NOT'",
1867
-				array(
1868
-					"'IN'",
1869
-					"'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'",
1870
-					array("'SELF'", "'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'", $where)
1871
-				)
1872
-			);
1873
-		}
1874
-	}
1875
-
1876
-	// inserer la condition (cf {lang?})
1877
-	// traiter a part la date, elle est mise d'office par SPIP,
1878
-	if ($crit->cond) {
1879
-		$pred = calculer_argument_precedent($idb, $col, $boucles);
1880
-		if ($col == "date" or $col == "date_redac") {
1881
-			if ($pred == "\$Pile[0]['" . $col . "']") {
1882
-				$pred = "(\$Pile[0]['{$col}_default']?'':$pred)";
1883
-			}
1884
-		}
1885
-
1886
-		if ($op == '=' and !$crit->not) {
1887
-			$where = array(
1888
-				"'?'",
1889
-				"(is_array($pred))",
1890
-				critere_IN_cas($idb, $boucles, 'COND', $arg, $op, array($pred), $col),
1891
-				$where
1892
-			);
1893
-		}
1894
-		$where = array("'?'", "!(is_array($pred)?count($pred):strlen($pred))", "''", $where);
1895
-		if ($where_complement) // condition annexe du type "AND (objet='article')"
1896
-		{
1897
-			$where_complement = array("'?'", "!(is_array($pred)?count($pred):strlen($pred))", "''", $where_complement);
1898
-		}
1899
-	}
1900
-
1901
-	$boucles[$idb]->where[] = $where;
1902
-	if ($where_complement) // condition annexe du type "AND (objet='article')"
1903
-	{
1904
-		$boucles[$idb]->where[] = $where_complement;
1905
-	}
1849
+    list($arg, $op, $val, $col, $where_complement) = $args;
1850
+
1851
+    $where = array("'$op'", "'$arg'", $val[0]);
1852
+
1853
+    // inserer la negation (cf !...)
1854
+
1855
+    if ($crit->not) {
1856
+        $where = array("'NOT'", $where);
1857
+    }
1858
+    if ($crit->exclus) {
1859
+        if (!preg_match(",^L[0-9]+[.],", $arg)) {
1860
+            $where = array("'NOT'", $where);
1861
+        } else
1862
+            // un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete
1863
+            // c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent
1864
+        {
1865
+            $where = array(
1866
+                "'NOT'",
1867
+                array(
1868
+                    "'IN'",
1869
+                    "'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'",
1870
+                    array("'SELF'", "'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'", $where)
1871
+                )
1872
+            );
1873
+        }
1874
+    }
1875
+
1876
+    // inserer la condition (cf {lang?})
1877
+    // traiter a part la date, elle est mise d'office par SPIP,
1878
+    if ($crit->cond) {
1879
+        $pred = calculer_argument_precedent($idb, $col, $boucles);
1880
+        if ($col == "date" or $col == "date_redac") {
1881
+            if ($pred == "\$Pile[0]['" . $col . "']") {
1882
+                $pred = "(\$Pile[0]['{$col}_default']?'':$pred)";
1883
+            }
1884
+        }
1885
+
1886
+        if ($op == '=' and !$crit->not) {
1887
+            $where = array(
1888
+                "'?'",
1889
+                "(is_array($pred))",
1890
+                critere_IN_cas($idb, $boucles, 'COND', $arg, $op, array($pred), $col),
1891
+                $where
1892
+            );
1893
+        }
1894
+        $where = array("'?'", "!(is_array($pred)?count($pred):strlen($pred))", "''", $where);
1895
+        if ($where_complement) // condition annexe du type "AND (objet='article')"
1896
+        {
1897
+            $where_complement = array("'?'", "!(is_array($pred)?count($pred):strlen($pred))", "''", $where_complement);
1898
+        }
1899
+    }
1900
+
1901
+    $boucles[$idb]->where[] = $where;
1902
+    if ($where_complement) // condition annexe du type "AND (objet='article')"
1903
+    {
1904
+        $boucles[$idb]->where[] = $where_complement;
1905
+    }
1906 1906
 }
1907 1907
 
1908 1908
 
@@ -1943,167 +1943,167 @@  discard block
 block discarded – undo
1943 1943
  **/
1944 1944
 function calculer_critere_infixe($idb, &$boucles, $crit) {
1945 1945
 
1946
-	$boucle = &$boucles[$idb];
1947
-	$type = $boucle->type_requete;
1948
-	$table = $boucle->id_table;
1949
-	$desc = $boucle->show;
1950
-	$col_vraie = null;
1951
-
1952
-	list($fct, $col, $op, $val, $args_sql) =
1953
-		calculer_critere_infixe_ops($idb, $boucles, $crit);
1954
-
1955
-	$col_alias = $col;
1956
-	$where_complement = false;
1957
-
1958
-	// Cas particulier : id_enfant => utiliser la colonne id_objet
1959
-	if ($col == 'id_enfant') {
1960
-		$col = $boucle->primary;
1961
-	}
1962
-
1963
-	// Cas particulier : id_parent => verifier les exceptions de tables
1964
-	if ((in_array($col, array('id_parent', 'id_secteur')) and isset($GLOBALS['exceptions_des_tables'][$table][$col]))
1965
-		or (isset($GLOBALS['exceptions_des_tables'][$table][$col]) and is_string($GLOBALS['exceptions_des_tables'][$table][$col]))
1966
-	) {
1967
-		$col = $GLOBALS['exceptions_des_tables'][$table][$col];
1968
-	} // et possibilite de gerer un critere secteur sur des tables de plugins (ie forums)
1969
-	else {
1970
-		if (($col == 'id_secteur') and ($critere_secteur = charger_fonction("critere_secteur_$type", "public", true))) {
1971
-			$table = $critere_secteur($idb, $boucles, $val, $crit);
1972
-		}
1973
-
1974
-		// cas id_article=xx qui se mappe en id_objet=xx AND objet=article
1975
-		// sauf si exception declaree : sauter cette etape
1976
-		else {
1977
-			if (
1978
-				!isset($GLOBALS['exceptions_des_jointures'][table_objet_sql($table)][$col])
1979
-				and !isset($GLOBALS['exceptions_des_jointures'][$col])
1980
-				and count(trouver_champs_decomposes($col, $desc)) > 1
1981
-			) {
1982
-				$e = decompose_champ_id_objet($col);
1983
-				$col = array_shift($e);
1984
-				$where_complement = primary_doublee($e, $table);
1985
-			} // Cas particulier : expressions de date
1986
-			else {
1987
-				if ($c = calculer_critere_infixe_date($idb, $boucles, $col)) {
1988
-					list($col, $col_vraie) = $c;
1989
-					$table = '';
1990
-				} // table explicitée {mots.titre}
1991
-				else {
1992
-					if (preg_match('/^(.*)\.(.*)$/', $col, $r)) {
1993
-						list(, $table, $col) = $r;
1994
-						$col_alias = $col;
1995
-
1996
-						$trouver_table = charger_fonction('trouver_table', 'base');
1997
-						if ($desc = $trouver_table($table, $boucle->sql_serveur)
1998
-							and isset($desc['field'][$col])
1999
-							and $cle = array_search($desc['table'], $boucle->from)
2000
-						) {
2001
-							$table = $cle;
2002
-						} else {
2003
-							$table = trouver_jointure_champ($col, $boucle, array($table), ($crit->cond or $op != '='));
2004
-						}
2005
-						#$table = calculer_critere_externe_init($boucle, array($table), $col, $desc, ($crit->cond OR $op!='='), true);
2006
-						if (!$table) {
2007
-							return '';
2008
-						}
2009
-					}
2010
-					// si le champ n'est pas trouvé dans la table,
2011
-					// on cherche si une jointure peut l'obtenir
2012
-					elseif (@!array_key_exists($col, $desc['field'])) {
2013
-						// Champ joker * des iterateurs DATA qui accepte tout
2014
-						if (@array_key_exists('*', $desc['field'])) {
2015
-							$desc['field'][$col_vraie ? $col_vraie : $col] = ''; // on veut pas de cast INT par defaut car le type peut etre n'importe quoi dans les boucles DATA
2016
-						}
2017
-						else {
2018
-							$r = calculer_critere_infixe_externe($boucle, $crit, $op, $desc, $col, $col_alias, $table);
2019
-							if (!$r) {
2020
-								return '';
2021
-							}
2022
-							list($col, $col_alias, $table, $where_complement, $desc) = $r;
2023
-						}
2024
-					}
2025
-				}
2026
-			}
2027
-		}
2028
-	}
2029
-
2030
-	$col_vraie = ($col_vraie ? $col_vraie : $col);
2031
-	// Dans tous les cas,
2032
-	// virer les guillemets eventuels autour d'un int (qui sont refuses par certains SQL)
2033
-	// et passer dans sql_quote avec le type si connu
2034
-	// et int sinon si la valeur est numerique
2035
-	// sinon introduire le vrai type du champ si connu dans le sql_quote (ou int NOT NULL sinon)
2036
-	// Ne pas utiliser intval, PHP tronquant les Bigint de SQL
2037
-	if ($op == '=' or in_array($op, $GLOBALS['table_criteres_infixes'])) {
2038
-		$type_cast_quote = (isset($desc['field'][$col_vraie]) ? $desc['field'][$col_vraie] : 'int NOT NULL');
2039
-		// defaire le quote des int et les passer dans sql_quote avec le bon type de champ si on le connait, int sinon
2040
-		// prendre en compte le debug ou la valeur arrive avec un commentaire PHP en debut
2041
-		if (preg_match(",^\\A(\s*//.*?$\s*)?\"'(-?\d+)'\"\\z,ms", $val[0], $r)) {
2042
-			$val[0] = $r[1] . '"' . sql_quote($r[2], $boucle->sql_serveur, $type_cast_quote) . '"';
2043
-		}
2044
-		// sinon expliciter les
2045
-		// sql_quote(truc) en sql_quote(truc,'',type)
2046
-		// sql_quote(truc,serveur) en sql_quote(truc,serveur,type)
2047
-		// sql_quote(truc,serveur,'') en sql_quote(truc,serveur,type)
2048
-		// sans toucher aux
2049
-		// sql_quote(truc,'','varchar(10) DEFAULT \'oui\' COLLATE NOCASE')
2050
-		// sql_quote(truc,'','varchar')
2051
-		elseif (preg_match('/\Asql_quote[(](.*?)(,[^)]*?)?(,[^)]*(?:\(\d+\)[^)]*)?)?[)]\s*\z/ms', $val[0], $r)
2052
-			// si pas deja un type
2053
-			and (!isset($r[3]) or !$r[3] or !trim($r[3],", '"))
2054
-		) {
2055
-			$r = $r[1]
2056
-				. ((isset($r[2]) and $r[2]) ? $r[2] : ",''")
2057
-				. ",'" . addslashes($type_cast_quote) . "'";
2058
-			$val[0] = "sql_quote($r)";
2059
-		}
2060
-		elseif(strpos($val[0], '@@defaultcast@@') !== false
2061
-		  and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r)) {
2062
-			$val[0] = substr($val[0], 0, -strlen($r[0])) . "'" . addslashes($type_cast_quote) . "')";
2063
-		}
2064
-	}
2065
-
2066
-	if(strpos($val[0], '@@defaultcast@@') !== false
2067
-	  and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r)) {
2068
-		$val[0] = substr($val[0], 0, -strlen($r[0])) . "'char')";
2069
-	}
2070
-
2071
-	// Indicateur pour permettre aux fonctionx boucle_X de modifier
2072
-	// leurs requetes par defaut, notamment le champ statut
2073
-	// Ne pas confondre champs de la table principale et des jointures
2074
-	if ($table === $boucle->id_table) {
2075
-		$boucles[$idb]->modificateur['criteres'][$col_vraie] = true;
2076
-		if ($col_alias != $col_vraie) {
2077
-			$boucles[$idb]->modificateur['criteres'][$col_alias] = true;
2078
-		}
2079
-	}
2080
-
2081
-	// ajout pour le cas special d'une condition sur le champ statut:
2082
-	// il faut alors interdire a la fonction de boucle
2083
-	// de mettre ses propres criteres de statut
2084
-	// http://www.spip.net/@statut (a documenter)
2085
-	// garde pour compatibilite avec code des plugins anterieurs, mais redondant avec la ligne precedente
2086
-	if ($col == 'statut') {
2087
-		$boucles[$idb]->statut = true;
2088
-	}
2089
-
2090
-	// inserer le nom de la table SQL devant le nom du champ
2091
-	if ($table) {
2092
-		if ($col[0] == "`") {
2093
-			$arg = "$table." . substr($col, 1, -1);
2094
-		} else {
2095
-			$arg = "$table.$col";
2096
-		}
2097
-	} else {
2098
-		$arg = $col;
2099
-	}
2100
-
2101
-	// inserer la fonction SQL
2102
-	if ($fct) {
2103
-		$arg = "$fct($arg$args_sql)";
2104
-	}
2105
-
2106
-	return array($arg, $op, $val, $col_alias, $where_complement);
1946
+    $boucle = &$boucles[$idb];
1947
+    $type = $boucle->type_requete;
1948
+    $table = $boucle->id_table;
1949
+    $desc = $boucle->show;
1950
+    $col_vraie = null;
1951
+
1952
+    list($fct, $col, $op, $val, $args_sql) =
1953
+        calculer_critere_infixe_ops($idb, $boucles, $crit);
1954
+
1955
+    $col_alias = $col;
1956
+    $where_complement = false;
1957
+
1958
+    // Cas particulier : id_enfant => utiliser la colonne id_objet
1959
+    if ($col == 'id_enfant') {
1960
+        $col = $boucle->primary;
1961
+    }
1962
+
1963
+    // Cas particulier : id_parent => verifier les exceptions de tables
1964
+    if ((in_array($col, array('id_parent', 'id_secteur')) and isset($GLOBALS['exceptions_des_tables'][$table][$col]))
1965
+        or (isset($GLOBALS['exceptions_des_tables'][$table][$col]) and is_string($GLOBALS['exceptions_des_tables'][$table][$col]))
1966
+    ) {
1967
+        $col = $GLOBALS['exceptions_des_tables'][$table][$col];
1968
+    } // et possibilite de gerer un critere secteur sur des tables de plugins (ie forums)
1969
+    else {
1970
+        if (($col == 'id_secteur') and ($critere_secteur = charger_fonction("critere_secteur_$type", "public", true))) {
1971
+            $table = $critere_secteur($idb, $boucles, $val, $crit);
1972
+        }
1973
+
1974
+        // cas id_article=xx qui se mappe en id_objet=xx AND objet=article
1975
+        // sauf si exception declaree : sauter cette etape
1976
+        else {
1977
+            if (
1978
+                !isset($GLOBALS['exceptions_des_jointures'][table_objet_sql($table)][$col])
1979
+                and !isset($GLOBALS['exceptions_des_jointures'][$col])
1980
+                and count(trouver_champs_decomposes($col, $desc)) > 1
1981
+            ) {
1982
+                $e = decompose_champ_id_objet($col);
1983
+                $col = array_shift($e);
1984
+                $where_complement = primary_doublee($e, $table);
1985
+            } // Cas particulier : expressions de date
1986
+            else {
1987
+                if ($c = calculer_critere_infixe_date($idb, $boucles, $col)) {
1988
+                    list($col, $col_vraie) = $c;
1989
+                    $table = '';
1990
+                } // table explicitée {mots.titre}
1991
+                else {
1992
+                    if (preg_match('/^(.*)\.(.*)$/', $col, $r)) {
1993
+                        list(, $table, $col) = $r;
1994
+                        $col_alias = $col;
1995
+
1996
+                        $trouver_table = charger_fonction('trouver_table', 'base');
1997
+                        if ($desc = $trouver_table($table, $boucle->sql_serveur)
1998
+                            and isset($desc['field'][$col])
1999
+                            and $cle = array_search($desc['table'], $boucle->from)
2000
+                        ) {
2001
+                            $table = $cle;
2002
+                        } else {
2003
+                            $table = trouver_jointure_champ($col, $boucle, array($table), ($crit->cond or $op != '='));
2004
+                        }
2005
+                        #$table = calculer_critere_externe_init($boucle, array($table), $col, $desc, ($crit->cond OR $op!='='), true);
2006
+                        if (!$table) {
2007
+                            return '';
2008
+                        }
2009
+                    }
2010
+                    // si le champ n'est pas trouvé dans la table,
2011
+                    // on cherche si une jointure peut l'obtenir
2012
+                    elseif (@!array_key_exists($col, $desc['field'])) {
2013
+                        // Champ joker * des iterateurs DATA qui accepte tout
2014
+                        if (@array_key_exists('*', $desc['field'])) {
2015
+                            $desc['field'][$col_vraie ? $col_vraie : $col] = ''; // on veut pas de cast INT par defaut car le type peut etre n'importe quoi dans les boucles DATA
2016
+                        }
2017
+                        else {
2018
+                            $r = calculer_critere_infixe_externe($boucle, $crit, $op, $desc, $col, $col_alias, $table);
2019
+                            if (!$r) {
2020
+                                return '';
2021
+                            }
2022
+                            list($col, $col_alias, $table, $where_complement, $desc) = $r;
2023
+                        }
2024
+                    }
2025
+                }
2026
+            }
2027
+        }
2028
+    }
2029
+
2030
+    $col_vraie = ($col_vraie ? $col_vraie : $col);
2031
+    // Dans tous les cas,
2032
+    // virer les guillemets eventuels autour d'un int (qui sont refuses par certains SQL)
2033
+    // et passer dans sql_quote avec le type si connu
2034
+    // et int sinon si la valeur est numerique
2035
+    // sinon introduire le vrai type du champ si connu dans le sql_quote (ou int NOT NULL sinon)
2036
+    // Ne pas utiliser intval, PHP tronquant les Bigint de SQL
2037
+    if ($op == '=' or in_array($op, $GLOBALS['table_criteres_infixes'])) {
2038
+        $type_cast_quote = (isset($desc['field'][$col_vraie]) ? $desc['field'][$col_vraie] : 'int NOT NULL');
2039
+        // defaire le quote des int et les passer dans sql_quote avec le bon type de champ si on le connait, int sinon
2040
+        // prendre en compte le debug ou la valeur arrive avec un commentaire PHP en debut
2041
+        if (preg_match(",^\\A(\s*//.*?$\s*)?\"'(-?\d+)'\"\\z,ms", $val[0], $r)) {
2042
+            $val[0] = $r[1] . '"' . sql_quote($r[2], $boucle->sql_serveur, $type_cast_quote) . '"';
2043
+        }
2044
+        // sinon expliciter les
2045
+        // sql_quote(truc) en sql_quote(truc,'',type)
2046
+        // sql_quote(truc,serveur) en sql_quote(truc,serveur,type)
2047
+        // sql_quote(truc,serveur,'') en sql_quote(truc,serveur,type)
2048
+        // sans toucher aux
2049
+        // sql_quote(truc,'','varchar(10) DEFAULT \'oui\' COLLATE NOCASE')
2050
+        // sql_quote(truc,'','varchar')
2051
+        elseif (preg_match('/\Asql_quote[(](.*?)(,[^)]*?)?(,[^)]*(?:\(\d+\)[^)]*)?)?[)]\s*\z/ms', $val[0], $r)
2052
+            // si pas deja un type
2053
+            and (!isset($r[3]) or !$r[3] or !trim($r[3],", '"))
2054
+        ) {
2055
+            $r = $r[1]
2056
+                . ((isset($r[2]) and $r[2]) ? $r[2] : ",''")
2057
+                . ",'" . addslashes($type_cast_quote) . "'";
2058
+            $val[0] = "sql_quote($r)";
2059
+        }
2060
+        elseif(strpos($val[0], '@@defaultcast@@') !== false
2061
+          and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r)) {
2062
+            $val[0] = substr($val[0], 0, -strlen($r[0])) . "'" . addslashes($type_cast_quote) . "')";
2063
+        }
2064
+    }
2065
+
2066
+    if(strpos($val[0], '@@defaultcast@@') !== false
2067
+      and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r)) {
2068
+        $val[0] = substr($val[0], 0, -strlen($r[0])) . "'char')";
2069
+    }
2070
+
2071
+    // Indicateur pour permettre aux fonctionx boucle_X de modifier
2072
+    // leurs requetes par defaut, notamment le champ statut
2073
+    // Ne pas confondre champs de la table principale et des jointures
2074
+    if ($table === $boucle->id_table) {
2075
+        $boucles[$idb]->modificateur['criteres'][$col_vraie] = true;
2076
+        if ($col_alias != $col_vraie) {
2077
+            $boucles[$idb]->modificateur['criteres'][$col_alias] = true;
2078
+        }
2079
+    }
2080
+
2081
+    // ajout pour le cas special d'une condition sur le champ statut:
2082
+    // il faut alors interdire a la fonction de boucle
2083
+    // de mettre ses propres criteres de statut
2084
+    // http://www.spip.net/@statut (a documenter)
2085
+    // garde pour compatibilite avec code des plugins anterieurs, mais redondant avec la ligne precedente
2086
+    if ($col == 'statut') {
2087
+        $boucles[$idb]->statut = true;
2088
+    }
2089
+
2090
+    // inserer le nom de la table SQL devant le nom du champ
2091
+    if ($table) {
2092
+        if ($col[0] == "`") {
2093
+            $arg = "$table." . substr($col, 1, -1);
2094
+        } else {
2095
+            $arg = "$table.$col";
2096
+        }
2097
+    } else {
2098
+        $arg = $col;
2099
+    }
2100
+
2101
+    // inserer la fonction SQL
2102
+    if ($fct) {
2103
+        $arg = "$fct($arg$args_sql)";
2104
+    }
2105
+
2106
+    return array($arg, $op, $val, $col_alias, $where_complement);
2107 2107
 }
2108 2108
 
2109 2109
 
@@ -2132,77 +2132,77 @@  discard block
 block discarded – undo
2132 2132
  **/
2133 2133
 function calculer_critere_infixe_externe($boucle, $crit, $op, $desc, $col, $col_alias, $table) {
2134 2134
 
2135
-	$where = '';
2136
-
2137
-	$calculer_critere_externe = 'calculer_critere_externe_init';
2138
-	// gestion par les plugins des jointures tordues
2139
-	// pas automatiques mais necessaires
2140
-	$table_sql = table_objet_sql($table);
2141
-	if (isset($GLOBALS['exceptions_des_jointures'][$table_sql])
2142
-		and is_array($GLOBALS['exceptions_des_jointures'][$table_sql])
2143
-		and
2144
-		(
2145
-			isset($GLOBALS['exceptions_des_jointures'][$table_sql][$col])
2146
-			or
2147
-			isset($GLOBALS['exceptions_des_jointures'][$table_sql][''])
2148
-		)
2149
-	) {
2150
-		$t = $GLOBALS['exceptions_des_jointures'][$table_sql];
2151
-		$index = isset($t[$col])
2152
-			? $t[$col] : (isset($t['']) ? $t[''] : array());
2153
-
2154
-		if (count($index) == 3) {
2155
-			list($t, $col, $calculer_critere_externe) = $index;
2156
-		} elseif (count($index) == 2) {
2157
-			list($t, $col) = $t[$col];
2158
-		} elseif (count($index) == 1) {
2159
-			list($calculer_critere_externe) = $index;
2160
-			$t = $table;
2161
-		} else {
2162
-			$t = '';
2163
-		} // jointure non declaree. La trouver.
2164
-	} elseif (isset($GLOBALS['exceptions_des_jointures'][$col])) {
2165
-		list($t, $col) = $GLOBALS['exceptions_des_jointures'][$col];
2166
-	} else {
2167
-		$t = '';
2168
-	} // jointure non declaree. La trouver.
2169
-
2170
-	// ici on construit le from pour fournir $col en piochant dans les jointures
2171
-
2172
-	// si des jointures explicites sont fournies, on cherche d'abord dans celles ci
2173
-	// permet de forcer une table de lien quand il y a ambiguite
2174
-	// <BOUCLE_(DOCUMENTS documents_liens){id_mot}>
2175
-	// alors que <BOUCLE_(DOCUMENTS){id_mot}> produit la meme chose que <BOUCLE_(DOCUMENTS mots_liens){id_mot}>
2176
-	$table = "";
2177
-	if ($boucle->jointures_explicites) {
2178
-		$jointures_explicites = explode(' ', $boucle->jointures_explicites);
2179
-		$table = $calculer_critere_externe($boucle, $jointures_explicites, $col, $desc, ($crit->cond or $op != '='), $t);
2180
-	}
2181
-
2182
-	// et sinon on cherche parmi toutes les jointures declarees
2183
-	if (!$table) {
2184
-		$table = $calculer_critere_externe($boucle, $boucle->jointures, $col, $desc, ($crit->cond or $op != '='), $t);
2185
-	}
2186
-
2187
-	if (!$table) {
2188
-		return '';
2189
-	}
2190
-
2191
-	// il ne reste plus qu'a trouver le champ dans les from
2192
-	list($nom, $desc, $cle) = trouver_champ_exterieur($col, $boucle->from, $boucle);
2193
-
2194
-	if (count($cle) > 1 or reset($cle) !== $col) {
2195
-		$col_alias = $col; // id_article devient juste le nom d'origine
2196
-		if (count($cle) > 1 and reset($cle) == 'id_objet') {
2197
-			$e = decompose_champ_id_objet($col);
2198
-			$col = array_shift($e);
2199
-			$where = primary_doublee($e, $table);
2200
-		} else {
2201
-			$col = reset($cle);
2202
-		}
2203
-	}
2204
-
2205
-	return array($col, $col_alias, $table, $where, $desc);
2135
+    $where = '';
2136
+
2137
+    $calculer_critere_externe = 'calculer_critere_externe_init';
2138
+    // gestion par les plugins des jointures tordues
2139
+    // pas automatiques mais necessaires
2140
+    $table_sql = table_objet_sql($table);
2141
+    if (isset($GLOBALS['exceptions_des_jointures'][$table_sql])
2142
+        and is_array($GLOBALS['exceptions_des_jointures'][$table_sql])
2143
+        and
2144
+        (
2145
+            isset($GLOBALS['exceptions_des_jointures'][$table_sql][$col])
2146
+            or
2147
+            isset($GLOBALS['exceptions_des_jointures'][$table_sql][''])
2148
+        )
2149
+    ) {
2150
+        $t = $GLOBALS['exceptions_des_jointures'][$table_sql];
2151
+        $index = isset($t[$col])
2152
+            ? $t[$col] : (isset($t['']) ? $t[''] : array());
2153
+
2154
+        if (count($index) == 3) {
2155
+            list($t, $col, $calculer_critere_externe) = $index;
2156
+        } elseif (count($index) == 2) {
2157
+            list($t, $col) = $t[$col];
2158
+        } elseif (count($index) == 1) {
2159
+            list($calculer_critere_externe) = $index;
2160
+            $t = $table;
2161
+        } else {
2162
+            $t = '';
2163
+        } // jointure non declaree. La trouver.
2164
+    } elseif (isset($GLOBALS['exceptions_des_jointures'][$col])) {
2165
+        list($t, $col) = $GLOBALS['exceptions_des_jointures'][$col];
2166
+    } else {
2167
+        $t = '';
2168
+    } // jointure non declaree. La trouver.
2169
+
2170
+    // ici on construit le from pour fournir $col en piochant dans les jointures
2171
+
2172
+    // si des jointures explicites sont fournies, on cherche d'abord dans celles ci
2173
+    // permet de forcer une table de lien quand il y a ambiguite
2174
+    // <BOUCLE_(DOCUMENTS documents_liens){id_mot}>
2175
+    // alors que <BOUCLE_(DOCUMENTS){id_mot}> produit la meme chose que <BOUCLE_(DOCUMENTS mots_liens){id_mot}>
2176
+    $table = "";
2177
+    if ($boucle->jointures_explicites) {
2178
+        $jointures_explicites = explode(' ', $boucle->jointures_explicites);
2179
+        $table = $calculer_critere_externe($boucle, $jointures_explicites, $col, $desc, ($crit->cond or $op != '='), $t);
2180
+    }
2181
+
2182
+    // et sinon on cherche parmi toutes les jointures declarees
2183
+    if (!$table) {
2184
+        $table = $calculer_critere_externe($boucle, $boucle->jointures, $col, $desc, ($crit->cond or $op != '='), $t);
2185
+    }
2186
+
2187
+    if (!$table) {
2188
+        return '';
2189
+    }
2190
+
2191
+    // il ne reste plus qu'a trouver le champ dans les from
2192
+    list($nom, $desc, $cle) = trouver_champ_exterieur($col, $boucle->from, $boucle);
2193
+
2194
+    if (count($cle) > 1 or reset($cle) !== $col) {
2195
+        $col_alias = $col; // id_article devient juste le nom d'origine
2196
+        if (count($cle) > 1 and reset($cle) == 'id_objet') {
2197
+            $e = decompose_champ_id_objet($col);
2198
+            $col = array_shift($e);
2199
+            $where = primary_doublee($e, $table);
2200
+        } else {
2201
+            $col = reset($cle);
2202
+        }
2203
+    }
2204
+
2205
+    return array($col, $col_alias, $table, $where, $desc);
2206 2206
 }
2207 2207
 
2208 2208
 
@@ -2223,10 +2223,10 @@  discard block
 block discarded – undo
2223 2223
  *     - valeur
2224 2224
  **/
2225 2225
 function primary_doublee($decompose, $table) {
2226
-	$e1 = reset($decompose);
2227
-	$e2 = "sql_quote('" . end($decompose) . "')";
2226
+    $e1 = reset($decompose);
2227
+    $e2 = "sql_quote('" . end($decompose) . "')";
2228 2228
 
2229
-	return array("'='", "'$table." . $e1 . "'", $e2);
2229
+    return array("'='", "'$table." . $e1 . "'", $e2);
2230 2230
 }
2231 2231
 
2232 2232
 /**
@@ -2257,56 +2257,56 @@  discard block
 block discarded – undo
2257 2257
  *     Vide sinon.
2258 2258
  */
2259 2259
 function calculer_critere_externe_init(&$boucle, $joints, $col, $desc, $cond, $checkarrivee = false) {
2260
-	// si on demande un truc du genre spip_mots
2261
-	// avec aussi spip_mots_liens dans les jointures dispo
2262
-	// et qu'on est la
2263
-	// il faut privilegier la jointure directe en 2 etapes spip_mots_liens, spip_mots
2264
-	if ($checkarrivee
2265
-		and is_string($checkarrivee)
2266
-		and $a = table_objet($checkarrivee)
2267
-		and in_array($a . '_liens', $joints)
2268
-	) {
2269
-		if ($res = calculer_lien_externe_init($boucle, $joints, $col, $desc, $cond, $checkarrivee)) {
2270
-			return $res;
2271
-		}
2272
-	}
2273
-	foreach ($joints as $joint) {
2274
-		if ($arrivee = trouver_champ_exterieur($col, array($joint), $boucle, $checkarrivee)) {
2275
-			// alias de table dans le from
2276
-			$t = array_search($arrivee[0], $boucle->from);
2277
-			// recuperer la cle id_xx eventuellement decomposee en (id_objet,objet)
2278
-			$cols = $arrivee[2];
2279
-			// mais on ignore la 3eme cle si presente qui correspond alors au point de depart
2280
-			if (count($cols) > 2) {
2281
-				array_pop($cols);
2282
-			}
2283
-			if ($t) {
2284
-				// la table est déjà dans le FROM, on vérifie si le champ est utilisé.
2285
-				$joindre = false;
2286
-				foreach ($cols as $col) {
2287
-					$c = '/\b' . $t . ".$col" . '\b/';
2288
-					if (trouver_champ($c, $boucle->where)) {
2289
-						$joindre = true;
2290
-					} else {
2291
-						// mais ca peut etre dans le FIELD pour le Having
2292
-						$c = "/FIELD.$t" . ".$col,/";
2293
-						if (trouver_champ($c, $boucle->select)) {
2294
-							$joindre = true;
2295
-						}
2296
-					}
2297
-				}
2298
-				if (!$joindre) {
2299
-					return $t;
2300
-				}
2301
-			}
2302
-			array_pop($arrivee);
2303
-			if ($res = calculer_jointure($boucle, array($boucle->id_table, $desc), $arrivee, $cols, $cond, 1)) {
2304
-				return $res;
2305
-			}
2306
-		}
2307
-	}
2308
-
2309
-	return '';
2260
+    // si on demande un truc du genre spip_mots
2261
+    // avec aussi spip_mots_liens dans les jointures dispo
2262
+    // et qu'on est la
2263
+    // il faut privilegier la jointure directe en 2 etapes spip_mots_liens, spip_mots
2264
+    if ($checkarrivee
2265
+        and is_string($checkarrivee)
2266
+        and $a = table_objet($checkarrivee)
2267
+        and in_array($a . '_liens', $joints)
2268
+    ) {
2269
+        if ($res = calculer_lien_externe_init($boucle, $joints, $col, $desc, $cond, $checkarrivee)) {
2270
+            return $res;
2271
+        }
2272
+    }
2273
+    foreach ($joints as $joint) {
2274
+        if ($arrivee = trouver_champ_exterieur($col, array($joint), $boucle, $checkarrivee)) {
2275
+            // alias de table dans le from
2276
+            $t = array_search($arrivee[0], $boucle->from);
2277
+            // recuperer la cle id_xx eventuellement decomposee en (id_objet,objet)
2278
+            $cols = $arrivee[2];
2279
+            // mais on ignore la 3eme cle si presente qui correspond alors au point de depart
2280
+            if (count($cols) > 2) {
2281
+                array_pop($cols);
2282
+            }
2283
+            if ($t) {
2284
+                // la table est déjà dans le FROM, on vérifie si le champ est utilisé.
2285
+                $joindre = false;
2286
+                foreach ($cols as $col) {
2287
+                    $c = '/\b' . $t . ".$col" . '\b/';
2288
+                    if (trouver_champ($c, $boucle->where)) {
2289
+                        $joindre = true;
2290
+                    } else {
2291
+                        // mais ca peut etre dans le FIELD pour le Having
2292
+                        $c = "/FIELD.$t" . ".$col,/";
2293
+                        if (trouver_champ($c, $boucle->select)) {
2294
+                            $joindre = true;
2295
+                        }
2296
+                    }
2297
+                }
2298
+                if (!$joindre) {
2299
+                    return $t;
2300
+                }
2301
+            }
2302
+            array_pop($arrivee);
2303
+            if ($res = calculer_jointure($boucle, array($boucle->id_table, $desc), $arrivee, $cols, $cond, 1)) {
2304
+                return $res;
2305
+            }
2306
+        }
2307
+    }
2308
+
2309
+    return '';
2310 2310
 
2311 2311
 }
2312 2312
 
@@ -2333,29 +2333,29 @@  discard block
 block discarded – undo
2333 2333
  *     Alias de la table de jointure (Lx)
2334 2334
  */
2335 2335
 function calculer_lien_externe_init(&$boucle, $joints, $col, $desc, $cond, $checkarrivee = false) {
2336
-	$primary_arrivee = id_table_objet($checkarrivee);
2337
-
2338
-	// [FIXME] $checkarrivee peut-il arriver avec false ????
2339
-	$intermediaire = trouver_champ_exterieur($primary_arrivee, $joints, $boucle, $checkarrivee . "_liens");
2340
-	$arrivee = trouver_champ_exterieur($col, $joints, $boucle, $checkarrivee);
2341
-
2342
-	if (!$intermediaire or !$arrivee) {
2343
-		return '';
2344
-	}
2345
-	array_pop($intermediaire); // enlever la cle en 3eme argument
2346
-	array_pop($arrivee); // enlever la cle en 3eme argument
2347
-
2348
-	$res = fabrique_jointures($boucle,
2349
-		array(
2350
-			array(
2351
-				$boucle->id_table,
2352
-				$intermediaire,
2353
-				array(id_table_objet($desc['table_objet']), 'id_objet', 'objet', $desc['type'])
2354
-			),
2355
-			array(reset($intermediaire), $arrivee, $primary_arrivee)
2356
-		), $cond, $desc, $boucle->id_table, array($col));
2357
-
2358
-	return $res;
2336
+    $primary_arrivee = id_table_objet($checkarrivee);
2337
+
2338
+    // [FIXME] $checkarrivee peut-il arriver avec false ????
2339
+    $intermediaire = trouver_champ_exterieur($primary_arrivee, $joints, $boucle, $checkarrivee . "_liens");
2340
+    $arrivee = trouver_champ_exterieur($col, $joints, $boucle, $checkarrivee);
2341
+
2342
+    if (!$intermediaire or !$arrivee) {
2343
+        return '';
2344
+    }
2345
+    array_pop($intermediaire); // enlever la cle en 3eme argument
2346
+    array_pop($arrivee); // enlever la cle en 3eme argument
2347
+
2348
+    $res = fabrique_jointures($boucle,
2349
+        array(
2350
+            array(
2351
+                $boucle->id_table,
2352
+                $intermediaire,
2353
+                array(id_table_objet($desc['table_objet']), 'id_objet', 'objet', $desc['type'])
2354
+            ),
2355
+            array(reset($intermediaire), $arrivee, $primary_arrivee)
2356
+        ), $cond, $desc, $boucle->id_table, array($col));
2357
+
2358
+    return $res;
2359 2359
 }
2360 2360
 
2361 2361
 
@@ -2372,17 +2372,17 @@  discard block
 block discarded – undo
2372 2372
  *     false sinon.
2373 2373
  **/
2374 2374
 function trouver_champ($champ, $where) {
2375
-	if (!is_array($where)) {
2376
-		return preg_match($champ, $where);
2377
-	} else {
2378
-		foreach ($where as $clause) {
2379
-			if (trouver_champ($champ, $clause)) {
2380
-				return true;
2381
-			}
2382
-		}
2383
-
2384
-		return false;
2385
-	}
2375
+    if (!is_array($where)) {
2376
+        return preg_match($champ, $where);
2377
+    } else {
2378
+        foreach ($where as $clause) {
2379
+            if (trouver_champ($champ, $clause)) {
2380
+                return true;
2381
+            }
2382
+        }
2383
+
2384
+        return false;
2385
+    }
2386 2386
 }
2387 2387
 
2388 2388
 
@@ -2408,128 +2408,128 @@  discard block
 block discarded – undo
2408 2408
  *     - string $args_sql  Suite des arguments du critère. ?
2409 2409
  **/
2410 2410
 function calculer_critere_infixe_ops($idb, &$boucles, $crit) {
2411
-	// cas d'une valeur comparee a elle-meme ou son referent
2412
-	if (count($crit->param) == 0) {
2413
-		$op = '=';
2414
-		$col = $val = $crit->op;
2415
-		if (preg_match('/^(.*)\.(.*)$/', $col, $r)) {
2416
-			$val = $r[2];
2417
-		}
2418
-		// Cas special {lang} : aller chercher $GLOBALS['spip_lang']
2419
-		if ($val == 'lang') {
2420
-			$val = array(kwote('$GLOBALS[\'spip_lang\']'));
2421
-		} else {
2422
-			$defaut = null;
2423
-			if ($val == 'id_parent') {
2424
-				// Si id_parent, comparer l'id_parent avec l'id_objet
2425
-				// de la boucle superieure.... faudrait verifier qu'il existe
2426
-				// pour eviter l'erreur SQL
2427
-				$val = $boucles[$idb]->primary;
2428
-				// mais si pas de boucle superieure, prendre id_parent dans l'env
2429
-				$defaut = "@\$Pile[0]['id_parent']";
2430
-			} elseif ($val == 'id_enfant') {
2431
-				// Si id_enfant, comparer l'id_objet avec l'id_parent
2432
-				// de la boucle superieure
2433
-				$val = 'id_parent';
2434
-			} elseif ($crit->cond and ($col == "date" or $col == "date_redac")) {
2435
-				// un critere conditionnel sur date est traite a part
2436
-				// car la date est mise d'office par SPIP,
2437
-				$defaut = "(\$Pile[0]['{$col}_default']?'':\$Pile[0]['" . $col . "'])";
2438
-			}
2439
-
2440
-			$val = calculer_argument_precedent($idb, $val, $boucles, $defaut);
2441
-			$val = array(kwote($val));
2442
-		}
2443
-	} else {
2444
-		// comparaison explicite
2445
-		// le phraseur impose que le premier param soit du texte
2446
-		$params = $crit->param;
2447
-		$op = $crit->op;
2448
-		if ($op == '==') {
2449
-			$op = 'REGEXP';
2450
-		}
2451
-		$col = array_shift($params);
2452
-		$col = $col[0]->texte;
2453
-
2454
-		$val = array();
2455
-		$parent = $boucles[$idb]->id_parent;
2456
-
2457
-		// Dans le cas {x=='#DATE'} etc, defaire le travail du phraseur,
2458
-		// celui ne sachant pas ce qu'est un critere infixe
2459
-		// et a fortiori son 2e operande qu'entoure " ou '
2460
-		if (count($params) == 1
2461
-			and count($params[0]) == 3
2462
-			and $params[0][0]->type == 'texte'
2463
-			and $params[0][2]->type == 'texte'
2464
-			and ($p = $params[0][0]->texte) == $params[0][2]->texte
2465
-			and (($p == "'") or ($p == '"'))
2466
-			and $params[0][1]->type == 'champ'
2467
-		) {
2468
-			$val[] = "$p\\$p#" . $params[0][1]->nom_champ . "\\$p$p";
2469
-		} else {
2470
-			foreach ((($op != 'IN') ? $params : calculer_vieux_in($params)) as $p) {
2471
-				$a = calculer_liste($p, $idb, $boucles, $parent);
2472
-				if (strcasecmp($op, 'IN') == 0) {
2473
-					$val[] = $a;
2474
-				} else {
2475
-					$val[] = kwote($a, $boucles[$idb]->sql_serveur, '@@defaultcast@@');
2476
-				} // toujours quoter en char ici
2477
-			}
2478
-		}
2479
-	}
2480
-
2481
-	$fct = $args_sql = '';
2482
-	// fonction SQL ?
2483
-	// chercher FONCTION(champ) tel que CONCAT(titre,descriptif)
2484
-	if (preg_match('/^(.*)' . SQL_ARGS . '$/', $col, $m)) {
2485
-		$fct = $m[1];
2486
-		preg_match('/^\(([^,]*)(.*)\)$/', $m[2], $a);
2487
-		$col = $a[1];
2488
-		if (preg_match('/^(\S*)(\s+AS\s+.*)$/i', $col, $m)) {
2489
-			$col = $m[1];
2490
-			$args_sql = $m[2];
2491
-		}
2492
-		$args_sql .= $a[2];
2493
-	}
2494
-
2495
-	return array($fct, $col, $op, $val, $args_sql);
2411
+    // cas d'une valeur comparee a elle-meme ou son referent
2412
+    if (count($crit->param) == 0) {
2413
+        $op = '=';
2414
+        $col = $val = $crit->op;
2415
+        if (preg_match('/^(.*)\.(.*)$/', $col, $r)) {
2416
+            $val = $r[2];
2417
+        }
2418
+        // Cas special {lang} : aller chercher $GLOBALS['spip_lang']
2419
+        if ($val == 'lang') {
2420
+            $val = array(kwote('$GLOBALS[\'spip_lang\']'));
2421
+        } else {
2422
+            $defaut = null;
2423
+            if ($val == 'id_parent') {
2424
+                // Si id_parent, comparer l'id_parent avec l'id_objet
2425
+                // de la boucle superieure.... faudrait verifier qu'il existe
2426
+                // pour eviter l'erreur SQL
2427
+                $val = $boucles[$idb]->primary;
2428
+                // mais si pas de boucle superieure, prendre id_parent dans l'env
2429
+                $defaut = "@\$Pile[0]['id_parent']";
2430
+            } elseif ($val == 'id_enfant') {
2431
+                // Si id_enfant, comparer l'id_objet avec l'id_parent
2432
+                // de la boucle superieure
2433
+                $val = 'id_parent';
2434
+            } elseif ($crit->cond and ($col == "date" or $col == "date_redac")) {
2435
+                // un critere conditionnel sur date est traite a part
2436
+                // car la date est mise d'office par SPIP,
2437
+                $defaut = "(\$Pile[0]['{$col}_default']?'':\$Pile[0]['" . $col . "'])";
2438
+            }
2439
+
2440
+            $val = calculer_argument_precedent($idb, $val, $boucles, $defaut);
2441
+            $val = array(kwote($val));
2442
+        }
2443
+    } else {
2444
+        // comparaison explicite
2445
+        // le phraseur impose que le premier param soit du texte
2446
+        $params = $crit->param;
2447
+        $op = $crit->op;
2448
+        if ($op == '==') {
2449
+            $op = 'REGEXP';
2450
+        }
2451
+        $col = array_shift($params);
2452
+        $col = $col[0]->texte;
2453
+
2454
+        $val = array();
2455
+        $parent = $boucles[$idb]->id_parent;
2456
+
2457
+        // Dans le cas {x=='#DATE'} etc, defaire le travail du phraseur,
2458
+        // celui ne sachant pas ce qu'est un critere infixe
2459
+        // et a fortiori son 2e operande qu'entoure " ou '
2460
+        if (count($params) == 1
2461
+            and count($params[0]) == 3
2462
+            and $params[0][0]->type == 'texte'
2463
+            and $params[0][2]->type == 'texte'
2464
+            and ($p = $params[0][0]->texte) == $params[0][2]->texte
2465
+            and (($p == "'") or ($p == '"'))
2466
+            and $params[0][1]->type == 'champ'
2467
+        ) {
2468
+            $val[] = "$p\\$p#" . $params[0][1]->nom_champ . "\\$p$p";
2469
+        } else {
2470
+            foreach ((($op != 'IN') ? $params : calculer_vieux_in($params)) as $p) {
2471
+                $a = calculer_liste($p, $idb, $boucles, $parent);
2472
+                if (strcasecmp($op, 'IN') == 0) {
2473
+                    $val[] = $a;
2474
+                } else {
2475
+                    $val[] = kwote($a, $boucles[$idb]->sql_serveur, '@@defaultcast@@');
2476
+                } // toujours quoter en char ici
2477
+            }
2478
+        }
2479
+    }
2480
+
2481
+    $fct = $args_sql = '';
2482
+    // fonction SQL ?
2483
+    // chercher FONCTION(champ) tel que CONCAT(titre,descriptif)
2484
+    if (preg_match('/^(.*)' . SQL_ARGS . '$/', $col, $m)) {
2485
+        $fct = $m[1];
2486
+        preg_match('/^\(([^,]*)(.*)\)$/', $m[2], $a);
2487
+        $col = $a[1];
2488
+        if (preg_match('/^(\S*)(\s+AS\s+.*)$/i', $col, $m)) {
2489
+            $col = $m[1];
2490
+            $args_sql = $m[2];
2491
+        }
2492
+        $args_sql .= $a[2];
2493
+    }
2494
+
2495
+    return array($fct, $col, $op, $val, $args_sql);
2496 2496
 }
2497 2497
 
2498 2498
 // compatibilite ancienne version
2499 2499
 
2500 2500
 // http://code.spip.net/@calculer_vieux_in
2501 2501
 function calculer_vieux_in($params) {
2502
-	$deb = $params[0][0];
2503
-	$k = count($params) - 1;
2504
-	$last = $params[$k];
2505
-	$j = count($last) - 1;
2506
-	$last = $last[$j];
2507
-	$n = isset($last->texte) ? strlen($last->texte) : 0;
2508
-
2509
-	if (!((isset($deb->texte[0]) and $deb->texte[0] == '(')
2510
-		&& (isset($last->texte[$n - 1]) and $last->texte[$n - 1] == ')'))
2511
-	) {
2512
-		return $params;
2513
-	}
2514
-	$params[0][0]->texte = substr($deb->texte, 1);
2515
-	// attention, on peut avoir k=0,j=0 ==> recalculer
2516
-	$last = $params[$k][$j];
2517
-	$n = strlen($last->texte);
2518
-	$params[$k][$j]->texte = substr($last->texte, 0, $n - 1);
2519
-	$newp = array();
2520
-	foreach ($params as $v) {
2521
-		if ($v[0]->type != 'texte') {
2522
-			$newp[] = $v;
2523
-		} else {
2524
-			foreach (explode(',', $v[0]->texte) as $x) {
2525
-				$t = new Texte;
2526
-				$t->texte = $x;
2527
-				$newp[] = array($t);
2528
-			}
2529
-		}
2530
-	}
2531
-
2532
-	return $newp;
2502
+    $deb = $params[0][0];
2503
+    $k = count($params) - 1;
2504
+    $last = $params[$k];
2505
+    $j = count($last) - 1;
2506
+    $last = $last[$j];
2507
+    $n = isset($last->texte) ? strlen($last->texte) : 0;
2508
+
2509
+    if (!((isset($deb->texte[0]) and $deb->texte[0] == '(')
2510
+        && (isset($last->texte[$n - 1]) and $last->texte[$n - 1] == ')'))
2511
+    ) {
2512
+        return $params;
2513
+    }
2514
+    $params[0][0]->texte = substr($deb->texte, 1);
2515
+    // attention, on peut avoir k=0,j=0 ==> recalculer
2516
+    $last = $params[$k][$j];
2517
+    $n = strlen($last->texte);
2518
+    $params[$k][$j]->texte = substr($last->texte, 0, $n - 1);
2519
+    $newp = array();
2520
+    foreach ($params as $v) {
2521
+        if ($v[0]->type != 'texte') {
2522
+            $newp[] = $v;
2523
+        } else {
2524
+            foreach (explode(',', $v[0]->texte) as $x) {
2525
+                $t = new Texte;
2526
+                $t->texte = $x;
2527
+                $newp[] = array($t);
2528
+            }
2529
+        }
2530
+    }
2531
+
2532
+    return $newp;
2533 2533
 }
2534 2534
 
2535 2535
 /**
@@ -2548,89 +2548,89 @@  discard block
 block discarded – undo
2548 2548
  *     - nom de la colonne de date (si le calcul n'est pas relatif)
2549 2549
  **/
2550 2550
 function calculer_critere_infixe_date($idb, &$boucles, $col) {
2551
-	if (!preg_match(",^((age|jour|mois|annee)_relatif|date|mois|annee|jour|heure|age)(_[a-z]+)?$,", $col, $regs)) {
2552
-		return '';
2553
-	}
2554
-
2555
-	$boucle = $boucles[$idb];
2556
-	$table = $boucle->show;
2557
-
2558
-	// si c'est une colonne de la table, ne rien faire
2559
-	if (isset($table['field'][$col])) {
2560
-		return '';
2561
-	}
2562
-
2563
-	if (!$table['date'] && !isset($GLOBALS['table_date'][$table['id_table']])) {
2564
-		return '';
2565
-	}
2566
-	$pred = $date_orig = isset($GLOBALS['table_date'][$table['id_table']]) ? $GLOBALS['table_date'][$table['id_table']] : $table['date'];
2567
-
2568
-	$col = $regs[1];
2569
-	if (isset($regs[3]) and $suite = $regs[3]) {
2570
-		# Recherche de l'existence du champ date_xxxx,
2571
-		# si oui choisir ce champ, sinon choisir xxxx
2572
-
2573
-		if (isset($table['field']["date$suite"])) {
2574
-			$date_orig = 'date' . $suite;
2575
-		} else {
2576
-			$date_orig = substr($suite, 1);
2577
-		}
2578
-		$pred = $date_orig;
2579
-	} else {
2580
-		if (isset($regs[2]) and $rel = $regs[2]) {
2581
-			$pred = 'date';
2582
-		}
2583
-	}
2584
-
2585
-	$date_compare = "\"' . normaliser_date(" .
2586
-		calculer_argument_precedent($idb, $pred, $boucles) .
2587
-		") . '\"";
2588
-
2589
-	$col_vraie = $date_orig;
2590
-	$date_orig = $boucle->id_table . '.' . $date_orig;
2591
-
2592
-	switch ($col) {
2593
-		case 'date':
2594
-			$col = $date_orig;
2595
-			break;
2596
-		case 'jour':
2597
-			$col = "DAYOFMONTH($date_orig)";
2598
-			break;
2599
-		case 'mois':
2600
-			$col = "MONTH($date_orig)";
2601
-			break;
2602
-		case 'annee':
2603
-			$col = "YEAR($date_orig)";
2604
-			break;
2605
-		case 'heure':
2606
-			$col = "DATE_FORMAT($date_orig, \\'%H:%i\\')";
2607
-			break;
2608
-		case 'age':
2609
-			$col = calculer_param_date("NOW()", $date_orig);
2610
-			$col_vraie = "";// comparer a un int (par defaut)
2611
-			break;
2612
-		case 'age_relatif':
2613
-			$col = calculer_param_date($date_compare, $date_orig);
2614
-			$col_vraie = "";// comparer a un int (par defaut)
2615
-			break;
2616
-		case 'jour_relatif':
2617
-			$col = "(TO_DAYS(" . $date_compare . ")-TO_DAYS(" . $date_orig . "))";
2618
-			$col_vraie = "";// comparer a un int (par defaut)
2619
-			break;
2620
-		case 'mois_relatif':
2621
-			$col = "MONTH(" . $date_compare . ")-MONTH(" .
2622
-				$date_orig . ")+12*(YEAR(" . $date_compare .
2623
-				")-YEAR(" . $date_orig . "))";
2624
-			$col_vraie = "";// comparer a un int (par defaut)
2625
-			break;
2626
-		case 'annee_relatif':
2627
-			$col = "YEAR(" . $date_compare . ")-YEAR(" .
2628
-				$date_orig . ")";
2629
-			$col_vraie = "";// comparer a un int (par defaut)
2630
-			break;
2631
-	}
2632
-
2633
-	return array($col, $col_vraie);
2551
+    if (!preg_match(",^((age|jour|mois|annee)_relatif|date|mois|annee|jour|heure|age)(_[a-z]+)?$,", $col, $regs)) {
2552
+        return '';
2553
+    }
2554
+
2555
+    $boucle = $boucles[$idb];
2556
+    $table = $boucle->show;
2557
+
2558
+    // si c'est une colonne de la table, ne rien faire
2559
+    if (isset($table['field'][$col])) {
2560
+        return '';
2561
+    }
2562
+
2563
+    if (!$table['date'] && !isset($GLOBALS['table_date'][$table['id_table']])) {
2564
+        return '';
2565
+    }
2566
+    $pred = $date_orig = isset($GLOBALS['table_date'][$table['id_table']]) ? $GLOBALS['table_date'][$table['id_table']] : $table['date'];
2567
+
2568
+    $col = $regs[1];
2569
+    if (isset($regs[3]) and $suite = $regs[3]) {
2570
+        # Recherche de l'existence du champ date_xxxx,
2571
+        # si oui choisir ce champ, sinon choisir xxxx
2572
+
2573
+        if (isset($table['field']["date$suite"])) {
2574
+            $date_orig = 'date' . $suite;
2575
+        } else {
2576
+            $date_orig = substr($suite, 1);
2577
+        }
2578
+        $pred = $date_orig;
2579
+    } else {
2580
+        if (isset($regs[2]) and $rel = $regs[2]) {
2581
+            $pred = 'date';
2582
+        }
2583
+    }
2584
+
2585
+    $date_compare = "\"' . normaliser_date(" .
2586
+        calculer_argument_precedent($idb, $pred, $boucles) .
2587
+        ") . '\"";
2588
+
2589
+    $col_vraie = $date_orig;
2590
+    $date_orig = $boucle->id_table . '.' . $date_orig;
2591
+
2592
+    switch ($col) {
2593
+        case 'date':
2594
+            $col = $date_orig;
2595
+            break;
2596
+        case 'jour':
2597
+            $col = "DAYOFMONTH($date_orig)";
2598
+            break;
2599
+        case 'mois':
2600
+            $col = "MONTH($date_orig)";
2601
+            break;
2602
+        case 'annee':
2603
+            $col = "YEAR($date_orig)";
2604
+            break;
2605
+        case 'heure':
2606
+            $col = "DATE_FORMAT($date_orig, \\'%H:%i\\')";
2607
+            break;
2608
+        case 'age':
2609
+            $col = calculer_param_date("NOW()", $date_orig);
2610
+            $col_vraie = "";// comparer a un int (par defaut)
2611
+            break;
2612
+        case 'age_relatif':
2613
+            $col = calculer_param_date($date_compare, $date_orig);
2614
+            $col_vraie = "";// comparer a un int (par defaut)
2615
+            break;
2616
+        case 'jour_relatif':
2617
+            $col = "(TO_DAYS(" . $date_compare . ")-TO_DAYS(" . $date_orig . "))";
2618
+            $col_vraie = "";// comparer a un int (par defaut)
2619
+            break;
2620
+        case 'mois_relatif':
2621
+            $col = "MONTH(" . $date_compare . ")-MONTH(" .
2622
+                $date_orig . ")+12*(YEAR(" . $date_compare .
2623
+                ")-YEAR(" . $date_orig . "))";
2624
+            $col_vraie = "";// comparer a un int (par defaut)
2625
+            break;
2626
+        case 'annee_relatif':
2627
+            $col = "YEAR(" . $date_compare . ")-YEAR(" .
2628
+                $date_orig . ")";
2629
+            $col_vraie = "";// comparer a un int (par defaut)
2630
+            break;
2631
+    }
2632
+
2633
+    return array($col, $col_vraie);
2634 2634
 }
2635 2635
 
2636 2636
 /**
@@ -2649,16 +2649,16 @@  discard block
 block discarded – undo
2649 2649
  *     de colonne SQL et une date.
2650 2650
  **/
2651 2651
 function calculer_param_date($date_compare, $date_orig) {
2652
-	if (preg_match(",'\" *\.(.*)\. *\"',", $date_compare, $r)) {
2653
-		$init = "'\" . (\$x = $r[1]) . \"'";
2654
-		$date_compare = '\'$x\'';
2655
-	} else {
2656
-		$init = $date_compare;
2657
-	}
2658
-
2659
-	return
2660
-		// optimisation : mais prevoir le support SQLite avant
2661
-		"TIMESTAMPDIFF(HOUR,$date_orig,$init)/24";
2652
+    if (preg_match(",'\" *\.(.*)\. *\"',", $date_compare, $r)) {
2653
+        $init = "'\" . (\$x = $r[1]) . \"'";
2654
+        $date_compare = '\'$x\'';
2655
+    } else {
2656
+        $init = $date_compare;
2657
+    }
2658
+
2659
+    return
2660
+        // optimisation : mais prevoir le support SQLite avant
2661
+        "TIMESTAMPDIFF(HOUR,$date_orig,$init)/24";
2662 2662
 }
2663 2663
 
2664 2664
 /**
@@ -2676,18 +2676,18 @@  discard block
 block discarded – undo
2676 2676
  * @param Critere $crit Paramètres du critère dans cette boucle
2677 2677
  */
2678 2678
 function critere_DATA_source_dist($idb, &$boucles, $crit) {
2679
-	$boucle = &$boucles[$idb];
2679
+    $boucle = &$boucles[$idb];
2680 2680
 
2681
-	$args = array();
2682
-	foreach ($crit->param as &$param) {
2683
-		array_push($args,
2684
-			calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent));
2685
-	}
2681
+    $args = array();
2682
+    foreach ($crit->param as &$param) {
2683
+        array_push($args,
2684
+            calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent));
2685
+    }
2686 2686
 
2687
-	$boucle->hash .= '
2687
+    $boucle->hash .= '
2688 2688
 	$command[\'sourcemode\'] = ' . array_shift($args) . ";\n";
2689 2689
 
2690
-	$boucle->hash .= '
2690
+    $boucle->hash .= '
2691 2691
 	$command[\'source\'] = array(' . join(', ', $args) . ");\n";
2692 2692
 }
2693 2693
 
@@ -2704,8 +2704,8 @@  discard block
 block discarded – undo
2704 2704
  * @param Critere $crit Paramètres du critère dans cette boucle
2705 2705
  */
2706 2706
 function critere_DATA_datasource_dist($idb, &$boucles, $crit) {
2707
-	$boucle = &$boucles[$idb];
2708
-	$boucle->hash .= '
2707
+    $boucle = &$boucles[$idb];
2708
+    $boucle->hash .= '
2709 2709
 	$command[\'source\'] = array(' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent) . ');
2710 2710
 	$command[\'sourcemode\'] = ' . calculer_liste($crit->param[1], $idb, $boucles, $boucles[$idb]->id_parent) . ';';
2711 2711
 }
@@ -2725,8 +2725,8 @@  discard block
 block discarded – undo
2725 2725
  * @param Critere $crit Paramètres du critère dans cette boucle
2726 2726
  */
2727 2727
 function critere_DATA_datacache_dist($idb, &$boucles, $crit) {
2728
-	$boucle = &$boucles[$idb];
2729
-	$boucle->hash .= '
2728
+    $boucle = &$boucles[$idb];
2729
+    $boucle->hash .= '
2730 2730
 	$command[\'datacache\'] = ' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent) . ';';
2731 2731
 }
2732 2732
 
@@ -2742,12 +2742,12 @@  discard block
 block discarded – undo
2742 2742
  * @param Critere $crit Paramètres du critère dans cette boucle
2743 2743
  */
2744 2744
 function critere_php_args_dist($idb, &$boucles, $crit) {
2745
-	$boucle = &$boucles[$idb];
2746
-	$boucle->hash .= '$command[\'args\']=array();';
2747
-	foreach ($crit->param as $param) {
2748
-		$boucle->hash .= '
2745
+    $boucle = &$boucles[$idb];
2746
+    $boucle->hash .= '$command[\'args\']=array();';
2747
+    foreach ($crit->param as $param) {
2748
+        $boucle->hash .= '
2749 2749
 			$command[\'args\'][] = ' . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ';';
2750
-	}
2750
+    }
2751 2751
 }
2752 2752
 
2753 2753
 /**
@@ -2764,12 +2764,12 @@  discard block
 block discarded – undo
2764 2764
  * @param Critere $crit Paramètres du critère dans cette boucle
2765 2765
  */
2766 2766
 function critere_DATA_liste_dist($idb, &$boucles, $crit) {
2767
-	$boucle = &$boucles[$idb];
2768
-	$boucle->hash .= "\n\t" . '$command[\'liste\'] = array();' . "\n";
2769
-	foreach ($crit->param as $param) {
2770
-		$boucle->hash .= "\t" . '$command[\'liste\'][] = ' . calculer_liste($param, $idb, $boucles,
2771
-				$boucles[$idb]->id_parent) . ";\n";
2772
-	}
2767
+    $boucle = &$boucles[$idb];
2768
+    $boucle->hash .= "\n\t" . '$command[\'liste\'] = array();' . "\n";
2769
+    foreach ($crit->param as $param) {
2770
+        $boucle->hash .= "\t" . '$command[\'liste\'][] = ' . calculer_liste($param, $idb, $boucles,
2771
+                $boucles[$idb]->id_parent) . ";\n";
2772
+    }
2773 2773
 }
2774 2774
 
2775 2775
 /**
@@ -2794,12 +2794,12 @@  discard block
 block discarded – undo
2794 2794
  * @param Critere $crit Paramètres du critère dans cette boucle
2795 2795
  */
2796 2796
 function critere_DATA_enum_dist($idb, &$boucles, $crit) {
2797
-	$boucle = &$boucles[$idb];
2798
-	$boucle->hash .= "\n\t" . '$command[\'enum\'] = array();' . "\n";
2799
-	foreach ($crit->param as $param) {
2800
-		$boucle->hash .= "\t" . '$command[\'enum\'][] = ' . calculer_liste($param, $idb, $boucles,
2801
-				$boucles[$idb]->id_parent) . ";\n";
2802
-	}
2797
+    $boucle = &$boucles[$idb];
2798
+    $boucle->hash .= "\n\t" . '$command[\'enum\'] = array();' . "\n";
2799
+    foreach ($crit->param as $param) {
2800
+        $boucle->hash .= "\t" . '$command[\'enum\'][] = ' . calculer_liste($param, $idb, $boucles,
2801
+                $boucles[$idb]->id_parent) . ";\n";
2802
+    }
2803 2803
 }
2804 2804
 
2805 2805
 /**
@@ -2814,11 +2814,11 @@  discard block
 block discarded – undo
2814 2814
  * @param Critere $crit Paramètres du critère dans cette boucle
2815 2815
  */
2816 2816
 function critere_DATA_datapath_dist($idb, &$boucles, $crit) {
2817
-	$boucle = &$boucles[$idb];
2818
-	foreach ($crit->param as $param) {
2819
-		$boucle->hash .= '
2817
+    $boucle = &$boucles[$idb];
2818
+    foreach ($crit->param as $param) {
2819
+        $boucle->hash .= '
2820 2820
 			$command[\'datapath\'][] = ' . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ';';
2821
-	}
2821
+    }
2822 2822
 }
2823 2823
 
2824 2824
 
@@ -2850,20 +2850,20 @@  discard block
 block discarded – undo
2850 2850
  * @param Critere $crit Paramètres du critère dans cette boucle
2851 2851
  */
2852 2852
 function critere_si_dist($idb, &$boucles, $crit) {
2853
-	$boucle = &$boucles[$idb];
2854
-	// il faut initialiser 1 fois le tableau a chaque appel de la boucle
2855
-	// (par exemple lorsque notre boucle est appelee dans une autre boucle)
2856
-	// mais ne pas l'initialiser n fois si il y a n criteres {si } dans la boucle !
2857
-	$boucle->hash .= "\n\tif (!isset(\$si_init)) { \$command['si'] = array(); \$si_init = true; }\n";
2858
-	if ($crit->param) {
2859
-		foreach ($crit->param as $param) {
2860
-			$boucle->hash .= "\t\$command['si'][] = "
2861
-				. calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ";\n";
2862
-		}
2863
-		// interdire {si 0} aussi !
2864
-	} else {
2865
-		$boucle->hash .= '$command[\'si\'][] = 0;';
2866
-	}
2853
+    $boucle = &$boucles[$idb];
2854
+    // il faut initialiser 1 fois le tableau a chaque appel de la boucle
2855
+    // (par exemple lorsque notre boucle est appelee dans une autre boucle)
2856
+    // mais ne pas l'initialiser n fois si il y a n criteres {si } dans la boucle !
2857
+    $boucle->hash .= "\n\tif (!isset(\$si_init)) { \$command['si'] = array(); \$si_init = true; }\n";
2858
+    if ($crit->param) {
2859
+        foreach ($crit->param as $param) {
2860
+            $boucle->hash .= "\t\$command['si'][] = "
2861
+                . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ";\n";
2862
+        }
2863
+        // interdire {si 0} aussi !
2864
+    } else {
2865
+        $boucle->hash .= '$command[\'si\'][] = 0;';
2866
+    }
2867 2867
 }
2868 2868
 
2869 2869
 /**
@@ -2879,8 +2879,8 @@  discard block
 block discarded – undo
2879 2879
  * @param Critere $crit Paramètres du critère dans cette boucle
2880 2880
  */
2881 2881
 function critere_POUR_tableau_dist($idb, &$boucles, $crit) {
2882
-	$boucle = &$boucles[$idb];
2883
-	$boucle->hash .= '
2882
+    $boucle = &$boucles[$idb];
2883
+    $boucle->hash .= '
2884 2884
 	$command[\'source\'] = array(' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent) . ');
2885 2885
 	$command[\'sourcemode\'] = \'table\';';
2886 2886
 }
@@ -2901,29 +2901,29 @@  discard block
 block discarded – undo
2901 2901
  */
2902 2902
 function critere_noeud_dist($idb, &$boucles, $crit) {
2903 2903
 
2904
-	$not = $crit->not;
2905
-	$boucle = &$boucles[$idb];
2906
-	$primary = $boucle->primary;
2904
+    $not = $crit->not;
2905
+    $boucle = &$boucles[$idb];
2906
+    $primary = $boucle->primary;
2907 2907
 
2908
-	if (!$primary or strpos($primary, ',')) {
2909
-		erreur_squelette(_T('zbug_doublon_sur_table_sans_cle_primaire'), $boucle);
2908
+    if (!$primary or strpos($primary, ',')) {
2909
+        erreur_squelette(_T('zbug_doublon_sur_table_sans_cle_primaire'), $boucle);
2910 2910
 
2911
-		return;
2912
-	}
2913
-	$table = $boucle->type_requete;
2914
-	$table_sql = table_objet_sql(objet_type($table));
2911
+        return;
2912
+    }
2913
+    $table = $boucle->type_requete;
2914
+    $table_sql = table_objet_sql(objet_type($table));
2915 2915
 
2916
-	$id_parent = isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent']) ?
2917
-		$GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] :
2918
-		'id_parent';
2916
+    $id_parent = isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent']) ?
2917
+        $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] :
2918
+        'id_parent';
2919 2919
 
2920
-	$in = "IN";
2921
-	$where = array("'IN'", "'$boucle->id_table." . "$primary'", "'('.sql_get_select('$id_parent', '$table_sql').')'");
2922
-	if ($not) {
2923
-		$where = array("'NOT'", $where);
2924
-	}
2920
+    $in = "IN";
2921
+    $where = array("'IN'", "'$boucle->id_table." . "$primary'", "'('.sql_get_select('$id_parent', '$table_sql').')'");
2922
+    if ($not) {
2923
+        $where = array("'NOT'", $where);
2924
+    }
2925 2925
 
2926
-	$boucle->where[] = $where;
2926
+    $boucle->where[] = $where;
2927 2927
 }
2928 2928
 
2929 2929
 /**
@@ -2939,8 +2939,8 @@  discard block
 block discarded – undo
2939 2939
  * @param Critere $crit Paramètres du critère dans cette boucle
2940 2940
  */
2941 2941
 function critere_feuille_dist($idb, &$boucles, $crit) {
2942
-	$not = $crit->not;
2943
-	$crit->not = $not ? false : true;
2944
-	critere_noeud_dist($idb, $boucles, $crit);
2945
-	$crit->not = $not;
2942
+    $not = $crit->not;
2943
+    $crit->not = $not ? false : true;
2944
+    critere_noeud_dist($idb, $boucles, $crit);
2945
+    $crit->not = $not;
2946 2946
 }
Please login to merge, or discard this patch.
Spacing   +177 added lines, -185 removed lines patch added patch discarded remove patch
@@ -46,10 +46,9 @@  discard block
 block discarded – undo
46 46
 	$not = $crit->not;
47 47
 	$boucle = &$boucles[$idb];
48 48
 	$id_parent = isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent']) ?
49
-		$GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] :
50
-		'id_parent';
49
+		$GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] : 'id_parent';
51 50
 
52
-	$c = array("'='", "'$boucle->id_table." . "$id_parent'", 0);
51
+	$c = array("'='", "'$boucle->id_table."."$id_parent'", 0);
53 52
 	$boucle->where[] = ($crit->not ? array("'NOT'", $c) : $c);
54 53
 }
55 54
 
@@ -72,10 +71,10 @@  discard block
 block discarded – undo
72 71
 	$id = $boucle->primary;
73 72
 
74 73
 	if ($not or !$id) {
75
-		return (array('zbug_critere_inconnu', array('critere' => $not . $crit->op)));
74
+		return (array('zbug_critere_inconnu', array('critere' => $not.$crit->op)));
76 75
 	}
77 76
 	$arg = kwote(calculer_argument_precedent($idb, $id, $boucles));
78
-	$boucle->where[] = array("'!='", "'$boucle->id_table." . "$id'", $arg);
77
+	$boucle->where[] = array("'!='", "'$boucle->id_table."."$id'", $arg);
79 78
 }
80 79
 
81 80
 
@@ -106,12 +105,12 @@  discard block
 block discarded – undo
106 105
 	$not = ($crit->not ? '' : 'NOT');
107 106
 
108 107
 	// le doublon s'applique sur un type de boucle (article)
109
-	$nom = "'" . $boucle->type_requete . "'";
108
+	$nom = "'".$boucle->type_requete."'";
110 109
 
111 110
 	// compléter le nom avec un nom précisé {doublons nom}
112 111
 	// on obtient $nom = "'article' . 'nom'"
113 112
 	if (isset($crit->param[0])) {
114
-		$nom .= "." . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
113
+		$nom .= ".".calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
115 114
 	}
116 115
 
117 116
 	// code qui déclarera l'index du stockage de nos doublons (pour éviter une notice PHP)
@@ -123,13 +122,13 @@  discard block
 block discarded – undo
123 122
 	// $doublons et son index, ici $nom
124 123
 
125 124
 	// debut du code "sql_in('articles.id_article', "
126
-	$debut_in = "sql_in('" . $boucle->id_table . '.' . $primary . "', ";
125
+	$debut_in = "sql_in('".$boucle->id_table.'.'.$primary."', ";
127 126
 	// lecture des données du doublon "$doublons[$doublon_index[] = "
128 127
 	// Attention : boucle->doublons désigne une variable qu'on affecte
129
-	$debut_doub = '$doublons[' . (!$not ? '' : ($boucle->doublons . "[]= "));
128
+	$debut_doub = '$doublons['.(!$not ? '' : ($boucle->doublons."[]= "));
130 129
 
131 130
 	// le debut complet du code des doublons
132
-	$debut_doub = $debut_in . $debut_doub;
131
+	$debut_doub = $debut_in.$debut_doub;
133 132
 
134 133
 	// nom du doublon "('article' . 'nom')]"
135 134
 	$fin_doub = "($nom)]";
@@ -139,22 +138,22 @@  discard block
 block discarded – undo
139 138
 	foreach ($boucle->where as $k => $w) {
140 139
 		if (strpos($w[0], $debut_doub) === 0) {
141 140
 			// fusionner le sql_in (du where)
142
-			$boucle->where[$k][0] = $debut_doub . $fin_doub . ' . ' . substr($w[0], strlen($debut_in));
141
+			$boucle->where[$k][0] = $debut_doub.$fin_doub.' . '.substr($w[0], strlen($debut_in));
143 142
 			// fusionner l'initialisation (du hash) pour faire plus joli
144 143
 			$x = strpos($boucle->hash, $init_comment);
145 144
 			$len = strlen($init_comment);
146 145
 			$boucle->hash =
147
-				substr($boucle->hash, 0, $x + $len) . $init_code . substr($boucle->hash, $x + $len);
146
+				substr($boucle->hash, 0, $x + $len).$init_code.substr($boucle->hash, $x + $len);
148 147
 
149 148
 			return;
150 149
 		}
151 150
 	}
152 151
 
153 152
 	// mettre l'ensemble dans un tableau pour que ce ne soit pas vu comme une constante
154
-	$boucle->where[] = array($debut_doub . $fin_doub . ", '" . $not . "')");
153
+	$boucle->where[] = array($debut_doub.$fin_doub.", '".$not."')");
155 154
 
156 155
 	// déclarer le doublon s'il n'existe pas encore
157
-	$boucle->hash .= $init_comment . $init_code;
156
+	$boucle->hash .= $init_comment.$init_code;
158 157
 
159 158
 
160 159
 	# la ligne suivante avait l'intention d'eviter une collecte deja faite
@@ -215,10 +214,10 @@  discard block
 block discarded – undo
215 214
 	$un = $un[0]->texte;
216 215
 	$deux = $deux[0]->texte;
217 216
 	if ($deux) {
218
-		$boucles[$idb]->limit = 'intval($Pile[0]["debut' .
219
-			$un .
220
-			'"]) . ",' .
221
-			$deux .
217
+		$boucles[$idb]->limit = 'intval($Pile[0]["debut'.
218
+			$un.
219
+			'"]) . ",'.
220
+			$deux.
222 221
 			'"';
223 222
 	} else {
224 223
 		calculer_critere_DEFAUT_dist($idb, $boucles, $crit);
@@ -281,26 +280,26 @@  discard block
 block discarded – undo
281 280
 		$type = calculer_liste(array($crit->param[1][0]), $idb, $boucles, $boucle->id_parent);
282 281
 	}
283 282
 
284
-	$debut = ($type[0] !== "'") ? "'debut'.$type" : ("'debut" . substr($type, 1));
283
+	$debut = ($type[0] !== "'") ? "'debut'.$type" : ("'debut".substr($type, 1));
285 284
 	$boucle->modificateur['debut_nom'] = $type;
286 285
 	$partie =
287 286
 		// tester si le numero de page demande est de la forme '@yyy'
288
-		'isset($Pile[0][' . $debut . ']) ? $Pile[0][' . $debut . '] : _request(' . $debut . ");\n"
287
+		'isset($Pile[0]['.$debut.']) ? $Pile[0]['.$debut.'] : _request('.$debut.");\n"
289 288
 		. "\tif(substr(\$debut_boucle,0,1)=='@'){\n"
290
-		. "\t\t" . '$debut_boucle = $Pile[0][' . $debut . '] = quete_debut_pagination(\'' . $boucle->primary . '\',$Pile[0][\'@' . $boucle->primary . '\'] = substr($debut_boucle,1),' . $pas . ',$iter);' . "\n"
291
-		. "\t\t" . '$iter->seek(0);' . "\n"
289
+		. "\t\t".'$debut_boucle = $Pile[0]['.$debut.'] = quete_debut_pagination(\''.$boucle->primary.'\',$Pile[0][\'@'.$boucle->primary.'\'] = substr($debut_boucle,1),'.$pas.',$iter);'."\n"
290
+		. "\t\t".'$iter->seek(0);'."\n"
292 291
 		. "\t}\n"
293
-		. "\t" . '$debut_boucle = intval($debut_boucle)';
292
+		. "\t".'$debut_boucle = intval($debut_boucle)';
294 293
 
295 294
 	$boucle->hash .= '
296
-	$command[\'pagination\'] = array((isset($Pile[0][' . $debut . ']) ? $Pile[0][' . $debut . '] : null), ' . $pas . ');';
295
+	$command[\'pagination\'] = array((isset($Pile[0][' . $debut.']) ? $Pile[0]['.$debut.'] : null), '.$pas.');';
297 296
 
298 297
 	$boucle->total_parties = $pas;
299 298
 	calculer_parties($boucles, $idb, $partie, 'p+');
300 299
 	// ajouter la cle primaire dans le select pour pouvoir gerer la pagination referencee par @id
301 300
 	// sauf si pas de primaire, ou si primaire composee
302 301
 	// dans ce cas, on ne sait pas gerer une pagination indirecte
303
-	$t = $boucle->id_table . '.' . $boucle->primary;
302
+	$t = $boucle->id_table.'.'.$boucle->primary;
304 303
 	if ($boucle->primary
305 304
 		and !preg_match('/[,\s]/', $boucle->primary)
306 305
 		and !in_array($t, $boucle->select)
@@ -346,24 +345,24 @@  discard block
 block discarded – undo
346 345
 	$boucle->hash .= '
347 346
 	// RECHERCHE'
348 347
 		. ($crit->cond ? '
349
-	if (!strlen(' . $quoi . ')){
348
+	if (!strlen(' . $quoi.')){
350 349
 		list($rech_select, $rech_where) = array("0 as points","");
351
-	} else' : '') . '
350
+	} else' : '').'
352 351
 	{
353 352
 		$prepare_recherche = charger_fonction(\'prepare_recherche\', \'inc\');
354
-		list($rech_select, $rech_where) = $prepare_recherche(' . $quoi . ', "' . $boucle->id_table . '", "' . $crit->cond . '","' . $boucle->sql_serveur . '",' . $_modificateur . ',"' . $boucle->primary . '");
353
+		list($rech_select, $rech_where) = $prepare_recherche(' . $quoi.', "'.$boucle->id_table.'", "'.$crit->cond.'","'.$boucle->sql_serveur.'",'.$_modificateur.',"'.$boucle->primary.'");
355 354
 	}
356 355
 	';
357 356
 
358 357
 
359
-	$t = $boucle->id_table . '.' . $boucle->primary;
358
+	$t = $boucle->id_table.'.'.$boucle->primary;
360 359
 	if (!in_array($t, $boucles[$idb]->select)) {
361 360
 		$boucle->select[] = $t;
362 361
 	} # pour postgres, neuneu ici
363 362
 	// jointure uniquement sur le serveur principal
364 363
 	// (on ne peut joindre une table d'un serveur distant avec la table des resultats du serveur principal)
365 364
 	if (!$boucle->sql_serveur) {
366
-		$boucle->join['resultats'] = array("'" . $boucle->id_table . "'", "'id'", "'" . $boucle->primary . "'");
365
+		$boucle->join['resultats'] = array("'".$boucle->id_table."'", "'id'", "'".$boucle->primary."'");
367 366
 		$boucle->from['resultats'] = 'spip_resultats';
368 367
 	}
369 368
 	$boucle->select[] = '$rech_select';
@@ -430,7 +429,7 @@  discard block
 block discarded – undo
430 429
 	$c =
431 430
 		array(
432 431
 			"'OR'",
433
-			array("'='", "'$table." . "id_trad'", "'$table.$prim'"),
432
+			array("'='", "'$table."."id_trad'", "'$table.$prim'"),
434 433
 			array("'='", "'$table.id_trad'", "'0'")
435 434
 		);
436 435
 	$boucle->where[] = ($crit->not ? array("'NOT'", $c) : $c);
@@ -453,16 +452,15 @@  discard block
 block discarded – undo
453 452
 	$boucle = &$boucles[$idb];
454 453
 	$arg = kwote(calculer_argument_precedent($idb, 'id_parent', $boucles));
455 454
 	$id_parent = isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent']) ?
456
-		$GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] :
457
-		'id_parent';
458
-	$mparent = $boucle->id_table . '.' . $id_parent;
455
+		$GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] : 'id_parent';
456
+	$mparent = $boucle->id_table.'.'.$id_parent;
459 457
 
460 458
 	if ($boucle->type_requete == 'rubriques' or isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'])) {
461 459
 		$boucle->where[] = array("'='", "'$mparent'", $arg);
462 460
 
463 461
 	} // le cas FORUMS est gere dans le plugin forum, dans la fonction critere_FORUMS_meme_parent_dist()
464 462
 	else {
465
-		return (array('zbug_critere_inconnu', array('critere' => $crit->op . ' ' . $boucle->type_requete)));
463
+		return (array('zbug_critere_inconnu', array('critere' => $crit->op.' '.$boucle->type_requete)));
466 464
 	}
467 465
 }
468 466
 
@@ -515,16 +513,15 @@  discard block
 block discarded – undo
515 513
 		if (count(trouver_champs_decomposes($champ, $desc)) > 1) {
516 514
 			$decompose = decompose_champ_id_objet($champ);
517 515
 			$champ = array_shift($decompose);
518
-			$boucle->where[] = array("'='", _q($cle . "." . reset($decompose)), '"' . sql_quote(end($decompose)) . '"');
516
+			$boucle->where[] = array("'='", _q($cle.".".reset($decompose)), '"'.sql_quote(end($decompose)).'"');
519 517
 		}
520 518
 	} else {
521 519
 		$cle = $boucle->id_table;
522 520
 	}
523 521
 
524
-	$c = "sql_in('$cle" . ".$champ', calcul_branche_in($arg)"
525
-		. ($not ? ", 'NOT'" : '') . ")";
526
-	$boucle->where[] = !$crit->cond ? $c :
527
-		("($arg ? $c : " . ($not ? "'0=1'" : "'1=1'") . ')');
522
+	$c = "sql_in('$cle".".$champ', calcul_branche_in($arg)"
523
+		. ($not ? ", 'NOT'" : '').")";
524
+	$boucle->where[] = !$crit->cond ? $c : ("($arg ? $c : ".($not ? "'0=1'" : "'1=1'").')');
528 525
 }
529 526
 
530 527
 /**
@@ -544,9 +541,9 @@  discard block
 block discarded – undo
544 541
 	$not = ($crit->not ? 'NOT' : '');
545 542
 	$serveur = $boucle->sql_serveur;
546 543
 
547
-	$c = "sql_in('" .
548
-		$boucle->id_table . '.' . $boucle->primary
549
-		. "', lister_objets_avec_logos('" . $boucle->primary . "'), '$not', '$serveur')";
544
+	$c = "sql_in('".
545
+		$boucle->id_table.'.'.$boucle->primary
546
+		. "', lister_objets_avec_logos('".$boucle->primary."'), '$not', '$serveur')";
550 547
 
551 548
 	$boucle->where[] = $c;
552 549
 }
@@ -578,7 +575,7 @@  discard block
 block discarded – undo
578 575
 				$t = table_objet_sql($r[1]);
579 576
 				$t = array_search($t, $boucles[$idb]->from);
580 577
 				if ($t) {
581
-					$t .= '.' . $r[2];
578
+					$t .= '.'.$r[2];
582 579
 				}
583 580
 			}
584 581
 		} else {
@@ -593,7 +590,7 @@  discard block
 block discarded – undo
593 590
 			$boucles[$idb]->select[] = $t;
594 591
 		}
595 592
 	} else {
596
-		return (array('zbug_critere_inconnu', array('critere' => $crit->op . ' ?')));
593
+		return (array('zbug_critere_inconnu', array('critere' => $crit->op.' ?')));
597 594
 	}
598 595
 }
599 596
 
@@ -643,26 +640,26 @@  discard block
 block discarded – undo
643 640
 				(false !== $i = strpos($boucle->order[$n - 1], 'ASC'))
644 641
 				OR (false !== $i = strpos($boucle->order[$n - 1], 'DESC'))
645 642
 			) {
646
-				$boucle->order[$n - 1] = substr_replace($boucle->order[$n - 1], "' . " . $boucle->modificateur['collate'] . " . ' ", $i, 0);
643
+				$boucle->order[$n - 1] = substr_replace($boucle->order[$n - 1], "' . ".$boucle->modificateur['collate']." . ' ", $i, 0);
647 644
 			} else {
648
-				$boucle->order[$n - 1] .= " . " . $boucle->modificateur['collate'];
645
+				$boucle->order[$n - 1] .= " . ".$boucle->modificateur['collate'];
649 646
 			}
650 647
 		}
651 648
 	} else {
652
-		return (array('zbug_critere_inconnu', array('critere' => $crit->op . " " . count($boucles[$idb]->order))));
649
+		return (array('zbug_critere_inconnu', array('critere' => $crit->op." ".count($boucles[$idb]->order))));
653 650
 	}
654 651
 }
655 652
 
656 653
 // http://code.spip.net/@calculer_critere_arg_dynamique
657 654
 function calculer_critere_arg_dynamique($idb, &$boucles, $crit, $suffix = '') {
658 655
 	$boucle = $boucles[$idb];
659
-	$alt = "('" . $boucle->id_table . '.\' . $x' . $suffix . ')';
660
-	$var = '$champs_' . $idb;
656
+	$alt = "('".$boucle->id_table.'.\' . $x'.$suffix.')';
657
+	$var = '$champs_'.$idb;
661 658
 	$desc = (strpos($boucle->in, "static $var =") !== false);
662 659
 	if (!$desc) {
663 660
 		$desc = $boucle->show['field'];
664 661
 		$desc = implode(',', array_map('_q', array_keys($desc)));
665
-		$boucles[$idb]->in .= "\n\tstatic $var = array(" . $desc . ");";
662
+		$boucles[$idb]->in .= "\n\tstatic $var = array(".$desc.");";
666 663
 	}
667 664
 	if ($desc) {
668 665
 		$alt = "(in_array(\$x, $var)  ? $alt :(\$x$suffix))";
@@ -737,7 +734,7 @@  discard block
 block discarded – undo
737 734
 		$sens = " . ' DESC'";
738 735
 	}
739 736
 	if (isset($boucle->modificateur['collate'])) {
740
-		$collecte = ' . ' . $boucle->modificateur['collate'];
737
+		$collecte = ' . '.$boucle->modificateur['collate'];
741 738
 	}
742 739
 
743 740
 	// Pour chaque paramètre du critère
@@ -759,14 +756,14 @@  discard block
 block discarded – undo
759 756
 			if (preg_match(",^(\w+)[\s]+(.*)$,", $par, $m)) {
760 757
 				$expression = trim($m[1]);
761 758
 				$champ = trim($m[2]);
762
-				if (function_exists($f = 'calculer_critere_par_expression_' . $expression)) {
759
+				if (function_exists($f = 'calculer_critere_par_expression_'.$expression)) {
763 760
 					$order = $f($idb, $boucles, $crit, $tri, $champ);
764 761
 				} else {
765
-					return array('zbug_critere_inconnu', array('critere' => $crit->op . " $par"));
762
+					return array('zbug_critere_inconnu', array('critere' => $crit->op." $par"));
766 763
 				}
767 764
 
768 765
 			// tris de la forme {par champ} ou {par FONCTION(champ)}
769
-			} elseif (preg_match(",^" . CHAMP_SQL_PLUS_FONC . '$,is', $par, $match)) {
766
+			} elseif (preg_match(",^".CHAMP_SQL_PLUS_FONC.'$,is', $par, $match)) {
770 767
 				// {par FONCTION(champ)}
771 768
 				if (count($match) > 2) {
772 769
 					$par = substr($match[2], 1, -1);
@@ -776,7 +773,7 @@  discard block
 block discarded – undo
776 773
 				if ($par == 'hasard') {
777 774
 					$order = calculer_critere_par_hasard($idb, $boucles, $crit);
778 775
 				} elseif ($par == 'date' and !empty($boucle->show['date'])) {
779
-					$order = "'" . $boucle->id_table . "." . $boucle->show['date'] . "'";
776
+					$order = "'".$boucle->id_table.".".$boucle->show['date']."'";
780 777
 				} else {
781 778
 					// cas général {par champ}, {par table.champ}, ...
782 779
 					$order = calculer_critere_par_champ($idb, $boucles, $crit, $par);
@@ -785,7 +782,7 @@  discard block
 block discarded – undo
785 782
 
786 783
 			// on ne sait pas traiter…
787 784
 			else {
788
-				return array('zbug_critere_inconnu', array('critere' => $crit->op . " $par"));
785
+				return array('zbug_critere_inconnu', array('critere' => $crit->op." $par"));
789 786
 			}
790 787
 
791 788
 			// En cas d'erreur de squelette retournée par une fonction
@@ -805,14 +802,14 @@  discard block
 block discarded – undo
805 802
 
806 803
 		if ($fct) {
807 804
 			if (preg_match("/^\s*'(.*)'\s*$/", $order, $r)) {
808
-				$order = "'$fct(" . $r[1] . ")'";
805
+				$order = "'$fct(".$r[1].")'";
809 806
 			} else {
810 807
 				$order = "'$fct(' . $order . ')'";
811 808
 			}
812 809
 		}
813
-		$t = $order . $collecte . $sens;
810
+		$t = $order.$collecte.$sens;
814 811
 		if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
815
-			$t = $r[1] . $r[2];
812
+			$t = $r[1].$r[2];
816 813
 		}
817 814
 
818 815
 		$boucle->order[] = $t;
@@ -862,16 +859,16 @@  discard block
 block discarded – undo
862 859
 function calculer_critere_par_expression_num($idb, &$boucles, $crit, $tri, $champ) {
863 860
 	$_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
864 861
 	if (is_array($_champ)) {
865
-		return array('zbug_critere_inconnu', array('critere' => $crit->op . " num $champ"));
862
+		return array('zbug_critere_inconnu', array('critere' => $crit->op." num $champ"));
866 863
 	}
867 864
 	$boucle = &$boucles[$idb];
868
-	$texte = '0+' . $_champ;
865
+	$texte = '0+'.$_champ;
869 866
 	$suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent);
870 867
 	if ($suite !== "''") {
871
-		$texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . " . \"";
868
+		$texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')"." . \"";
872 869
 	}
873
-	$as = 'num' . ($boucle->order ? count($boucle->order) : "");
874
-	$boucle->select[] = $texte . " AS $as";
870
+	$as = 'num'.($boucle->order ? count($boucle->order) : "");
871
+	$boucle->select[] = $texte." AS $as";
875 872
 	$order = "'$as'";
876 873
 	return $order;
877 874
 }
@@ -896,16 +893,16 @@  discard block
 block discarded – undo
896 893
 function calculer_critere_par_expression_sinum($idb, &$boucles, $crit, $tri, $champ) {
897 894
 	$_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
898 895
 	if (is_array($_champ)) {
899
-		return array('zbug_critere_inconnu', array('critere' => $crit->op . " sinum $champ"));
896
+		return array('zbug_critere_inconnu', array('critere' => $crit->op." sinum $champ"));
900 897
 	}
901 898
 	$boucle = &$boucles[$idb];
902
-	$texte = '0+' . $_champ;
899
+	$texte = '0+'.$_champ;
903 900
 	$suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent);
904 901
 	if ($suite !== "''") {
905
-		$texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . " . \"";
902
+		$texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')"." . \"";
906 903
 	}
907
-	$as = 'sinum' . ($boucle->order ? count($boucle->order) : "");
908
-	$boucle->select[] = 'CASE (' . $texte . ') WHEN 0 THEN 1 ELSE 0 END AS ' . $as;
904
+	$as = 'sinum'.($boucle->order ? count($boucle->order) : "");
905
+	$boucle->select[] = 'CASE ('.$texte.') WHEN 0 THEN 1 ELSE 0 END AS '.$as;
909 906
 	$order = "'$as'";
910 907
 	return $order;
911 908
 }
@@ -929,10 +926,10 @@  discard block
 block discarded – undo
929 926
 function calculer_critere_par_expression_multi($idb, &$boucles, $crit, $tri, $champ) {
930 927
 	$_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
931 928
 	if (is_array($_champ)) {
932
-		return array('zbug_critere_inconnu', array('critere' => $crit->op . " multi $champ"));
929
+		return array('zbug_critere_inconnu', array('critere' => $crit->op." multi $champ"));
933 930
 	}
934 931
 	$boucle = &$boucles[$idb];
935
-	$boucle->select[] = "\".sql_multi('" . $_champ . "', \$GLOBALS['spip_lang']).\"";
932
+	$boucle->select[] = "\".sql_multi('".$_champ."', \$GLOBALS['spip_lang']).\"";
936 933
 	$order = "'multi'";
937 934
 	return $order;
938 935
 }
@@ -952,13 +949,13 @@  discard block
 block discarded – undo
952 949
  * @param bool $raw Retourne le champ pour le compilateur ("'alias.champ'") ou brut ('alias.champ')
953 950
  * @return array|string
954 951
  */
955
-function calculer_critere_par_champ($idb, &$boucles, $crit,  $par, $raw = false) {
952
+function calculer_critere_par_champ($idb, &$boucles, $crit, $par, $raw = false) {
956 953
 	$boucle = &$boucles[$idb];
957 954
 	$desc = $boucle->show;
958 955
 
959 956
 	// le champ existe dans la table, pas de souci (le plus commun)
960 957
 	if (isset($desc['field'][$par])) {
961
-		$par = $boucle->id_table . "." . $par;
958
+		$par = $boucle->id_table.".".$par;
962 959
 	}
963 960
 	// le champ est peut être une jointure
964 961
 	else {
@@ -979,24 +976,24 @@  discard block
 block discarded – undo
979 976
 		// Sinon on cherche le champ dans les tables possibles de jointures
980 977
 		// Si la table est déjà dans le from, on la réutilise.
981 978
 		if ($infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $table)) {
982
-			$par = $infos['alias'] . "." . $champ;
979
+			$par = $infos['alias'].".".$champ;
983 980
 		} elseif (
984 981
 			$boucle->jointures_explicites
985 982
 			and $alias = trouver_jointure_champ($champ, $boucle, explode(' ', $boucle->jointures_explicites), false, $table)
986 983
 		) {
987
-			$par = $alias . "." . $champ;
984
+			$par = $alias.".".$champ;
988 985
 		} elseif ($alias = trouver_jointure_champ($champ, $boucle, $boucle->jointures, false, $table)) {
989
-			$par = $alias . "." . $champ;
986
+			$par = $alias.".".$champ;
990 987
 		// en spécifiant directement l'alias {par L2.titre} (situation hasardeuse tout de même)
991 988
 		} elseif (
992 989
 			$table_alias
993 990
 			and isset($boucle->from[$table_alias])
994 991
 			and $infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $boucle->from[$table_alias])
995 992
 		) {
996
-			$par = $infos['alias'] . "." . $champ;
993
+			$par = $infos['alias'].".".$champ;
997 994
 		} elseif ($table) {
998 995
 			// On avait table + champ, mais on ne les a pas trouvés
999
-			return array('zbug_critere_inconnu', array('critere' => $crit->op . " $par"));
996
+			return array('zbug_critere_inconnu', array('critere' => $crit->op." $par"));
1000 997
 		} else {
1001 998
 			// Sinon tant pis, ca doit etre un champ synthetise (cf points)
1002 999
 		}
@@ -1020,7 +1017,7 @@  discard block
 block discarded – undo
1020 1017
 	if (!$t) {
1021 1018
 		$t = trouver_jointure_champ($champ, $boucle);
1022 1019
 	}
1023
-	return !$t ? '' : ("'" . $t . '.' . $champ . "'");
1020
+	return !$t ? '' : ("'".$t.'.'.$champ."'");
1024 1021
 }
1025 1022
 
1026 1023
 /**
@@ -1065,9 +1062,9 @@  discard block
 block discarded – undo
1065 1062
 				$boucle->default_order[] = ' DESC';
1066 1063
 			}
1067 1064
 		} else {
1068
-			$t = $boucle->order[$n - 1] . " . $order";
1065
+			$t = $boucle->order[$n - 1]." . $order";
1069 1066
 			if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
1070
-				$t = $r[1] . $r[2];
1067
+				$t = $r[1].$r[2];
1071 1068
 			}
1072 1069
 			$boucle->order[$n - 1] = $t;
1073 1070
 		}
@@ -1079,7 +1076,7 @@  discard block
 block discarded – undo
1079 1076
 	$params = $crit->param;
1080 1077
 
1081 1078
 	if (count($params) < 1) {
1082
-		return array('zbug_critere_inconnu', array('critere' => $crit->op . " ?"));
1079
+		return array('zbug_critere_inconnu', array('critere' => $crit->op." ?"));
1083 1080
 	}
1084 1081
 
1085 1082
 	$boucle = &$boucles[$idb];
@@ -1100,7 +1097,7 @@  discard block
 block discarded – undo
1100 1097
 	if ((count($date) == 1) and ($date[0]->type == 'texte')) {
1101 1098
 		$date = $date[0]->texte;
1102 1099
 		if (!isset($fields[$date])) {
1103
-			return array('zbug_critere_inconnu', array('critere' => $crit->op . " " . $date));
1100
+			return array('zbug_critere_inconnu', array('critere' => $crit->op." ".$date));
1104 1101
 		}
1105 1102
 	} else {
1106 1103
 		$a = calculer_liste($date, $idb, $boucles, $parent);
@@ -1112,38 +1109,38 @@  discard block
 block discarded – undo
1112 1109
 		$date = "'.(($cond)\n?\$a:\"$defaut\").'";
1113 1110
 	}
1114 1111
 	$annee = $params ? array_shift($params) : "";
1115
-	$annee = "\n" . 'sprintf("%04d", ($x = ' .
1116
-		calculer_liste($annee, $idb, $boucles, $parent) .
1112
+	$annee = "\n".'sprintf("%04d", ($x = '.
1113
+		calculer_liste($annee, $idb, $boucles, $parent).
1117 1114
 		') ? $x : date("Y"))';
1118 1115
 
1119 1116
 	$mois = $params ? array_shift($params) : "";
1120
-	$mois = "\n" . 'sprintf("%02d", ($x = ' .
1121
-		calculer_liste($mois, $idb, $boucles, $parent) .
1117
+	$mois = "\n".'sprintf("%02d", ($x = '.
1118
+		calculer_liste($mois, $idb, $boucles, $parent).
1122 1119
 		') ? $x : date("m"))';
1123 1120
 
1124 1121
 	$jour = $params ? array_shift($params) : "";
1125
-	$jour = "\n" . 'sprintf("%02d", ($x = ' .
1126
-		calculer_liste($jour, $idb, $boucles, $parent) .
1122
+	$jour = "\n".'sprintf("%02d", ($x = '.
1123
+		calculer_liste($jour, $idb, $boucles, $parent).
1127 1124
 		') ? $x : date("d"))';
1128 1125
 
1129 1126
 	$annee2 = $params ? array_shift($params) : "";
1130
-	$annee2 = "\n" . 'sprintf("%04d", ($x = ' .
1131
-		calculer_liste($annee2, $idb, $boucles, $parent) .
1127
+	$annee2 = "\n".'sprintf("%04d", ($x = '.
1128
+		calculer_liste($annee2, $idb, $boucles, $parent).
1132 1129
 		') ? $x : date("Y"))';
1133 1130
 
1134 1131
 	$mois2 = $params ? array_shift($params) : "";
1135
-	$mois2 = "\n" . 'sprintf("%02d", ($x = ' .
1136
-		calculer_liste($mois2, $idb, $boucles, $parent) .
1132
+	$mois2 = "\n".'sprintf("%02d", ($x = '.
1133
+		calculer_liste($mois2, $idb, $boucles, $parent).
1137 1134
 		') ? $x : date("m"))';
1138 1135
 
1139 1136
 	$jour2 = $params ? array_shift($params) : "";
1140
-	$jour2 = "\n" . 'sprintf("%02d", ($x = ' .
1141
-		calculer_liste($jour2, $idb, $boucles, $parent) .
1137
+	$jour2 = "\n".'sprintf("%02d", ($x = '.
1138
+		calculer_liste($jour2, $idb, $boucles, $parent).
1142 1139
 		') ? $x : date("d"))';
1143 1140
 
1144
-	$date = $boucle->id_table . ".$date";
1141
+	$date = $boucle->id_table.".$date";
1145 1142
 
1146
-	$quote_end = ",'" . $boucle->sql_serveur . "','text'";
1143
+	$quote_end = ",'".$boucle->sql_serveur."','text'";
1147 1144
 	if ($type == 'jour') {
1148 1145
 		$boucle->where[] = array(
1149 1146
 			"'='",
@@ -1215,14 +1212,13 @@  discard block
 block discarded – undo
1215 1212
 	list($a21, $a22) = calculer_critere_parties_aux($idb, $boucles, $a2);
1216 1213
 
1217 1214
 	if (($op == ',') && (is_numeric($a11) && (is_numeric($a21)))) {
1218
-		$boucle->limit = $a11 . ',' . $a21;
1215
+		$boucle->limit = $a11.','.$a21;
1219 1216
 	} else {
1220 1217
 		// 3 dans {1/3}, {2,3} ou {1,n-3}
1221 1218
 		$boucle->total_parties = ($a21 != 'n') ? $a21 : $a22;
1222 1219
 		// 2 dans {2/3}, {2,5}, {n-2,1}
1223 1220
 		$partie = ($a11 != 'n') ? $a11 : $a12;
1224
-		$mode = (($op == '/') ? '/' :
1225
-			(($a11 == 'n') ? '-' : '+') . (($a21 == 'n') ? '-' : '+'));
1221
+		$mode = (($op == '/') ? '/' : (($a11 == 'n') ? '-' : '+').(($a21 == 'n') ? '-' : '+'));
1226 1222
 		// cas simple {0,#ENV{truc}} compilons le en LIMIT :
1227 1223
 		if ($a11 !== 'n' and $a21 !== 'n' and $mode == "++" and $op == ',') {
1228 1224
 			$boucle->limit =
@@ -1268,8 +1264,7 @@  discard block
 block discarded – undo
1268 1264
 	// {1/3}
1269 1265
 	if ($op1 == '/') {
1270 1266
 		$pmoins1 = is_numeric($debut) ? ($debut - 1) : "($debut-1)";
1271
-		$totpos = is_numeric($total_parties) ? ($total_parties) :
1272
-			"($total_parties ? $total_parties : 1)";
1267
+		$totpos = is_numeric($total_parties) ? ($total_parties) : "($total_parties ? $total_parties : 1)";
1273 1268
 		$fin = "ceil(($nombre_boucle * $debut )/$totpos) - 1";
1274 1269
 		$debut = !$pmoins1 ? 0 : "ceil(($nombre_boucle * $pmoins1)/$totpos);";
1275 1270
 	} else {
@@ -1280,15 +1275,13 @@  discard block
 block discarded – undo
1280 1275
 
1281 1276
 		// cas {x,n-1}
1282 1277
 		if ($op2 == '-') {
1283
-			$fin = '$debut_boucle + ' . $nombre_boucle . ' - '
1284
-				. (is_numeric($total_parties) ? ($total_parties + 1) :
1285
-					($total_parties . ' - 1'));
1278
+			$fin = '$debut_boucle + '.$nombre_boucle.' - '
1279
+				. (is_numeric($total_parties) ? ($total_parties + 1) : ($total_parties.' - 1'));
1286 1280
 		} else {
1287 1281
 			// {x,1} ou {pagination}
1288 1282
 			$fin = '$debut_boucle'
1289 1283
 				. (is_numeric($total_parties) ?
1290
-					(($total_parties == 1) ? "" : (' + ' . ($total_parties - 1))) :
1291
-					('+' . $total_parties . ' - 1'));
1284
+					(($total_parties == 1) ? "" : (' + '.($total_parties - 1))) : ('+'.$total_parties.' - 1'));
1292 1285
 		}
1293 1286
 
1294 1287
 		// {pagination}, gerer le debut_xx=-1 pour tout voir
@@ -1306,11 +1299,11 @@  discard block
 block discarded – undo
1306 1299
 	// Utiliser min pour rabattre $fin_boucle sur total_boucle.
1307 1300
 
1308 1301
 	$boucles[$id_boucle]->mode_partie = "\n\t"
1309
-		. '$debut_boucle = ' . $debut . ";\n	"
1302
+		. '$debut_boucle = '.$debut.";\n	"
1310 1303
 		. "\$debut_boucle = intval(\$debut_boucle);\n	"
1311
-		. '$fin_boucle = min(' . $fin . ", \$Numrows['$id_boucle']['total'] - 1);\n	"
1312
-		. '$Numrows[\'' . $id_boucle . "']['grand_total'] = \$Numrows['$id_boucle']['total'];\n	"
1313
-		. '$Numrows[\'' . $id_boucle . '\']["total"] = max(0,$fin_boucle - $debut_boucle + 1);'
1304
+		. '$fin_boucle = min('.$fin.", \$Numrows['$id_boucle']['total'] - 1);\n	"
1305
+		. '$Numrows[\''.$id_boucle."']['grand_total'] = \$Numrows['$id_boucle']['total'];\n	"
1306
+		. '$Numrows[\''.$id_boucle.'\']["total"] = max(0,$fin_boucle - $debut_boucle + 1);'
1314 1307
 		. "\n\tif (\$debut_boucle>0"
1315 1308
 		. " AND \$debut_boucle < \$Numrows['$id_boucle']['grand_total']"
1316 1309
 		. " AND \$iter->seek(\$debut_boucle,'continue'))"
@@ -1395,16 +1388,16 @@  discard block
 block discarded – undo
1395 1388
 		// critere personnalise ?
1396 1389
 		if (
1397 1390
 			(!$serveur or
1398
-				((!function_exists($f = "critere_" . $serveur . "_" . $table . "_" . $critere))
1399
-					and (!function_exists($f = $f . "_dist"))
1400
-					and (!function_exists($f = "critere_" . $serveur . "_" . $critere))
1401
-					and (!function_exists($f = $f . "_dist"))
1391
+				((!function_exists($f = "critere_".$serveur."_".$table."_".$critere))
1392
+					and (!function_exists($f = $f."_dist"))
1393
+					and (!function_exists($f = "critere_".$serveur."_".$critere))
1394
+					and (!function_exists($f = $f."_dist"))
1402 1395
 				)
1403 1396
 			)
1404
-			and (!function_exists($f = "critere_" . $table . "_" . $critere))
1405
-			and (!function_exists($f = $f . "_dist"))
1406
-			and (!function_exists($f = "critere_" . $critere))
1407
-			and (!function_exists($f = $f . "_dist"))
1397
+			and (!function_exists($f = "critere_".$table."_".$critere))
1398
+			and (!function_exists($f = $f."_dist"))
1399
+			and (!function_exists($f = "critere_".$critere))
1400
+			and (!function_exists($f = $f."_dist"))
1408 1401
 		) {
1409 1402
 			// fonction critere standard
1410 1403
 			$f = $defaut;
@@ -1437,9 +1430,9 @@  discard block
 block discarded – undo
1437 1430
  */
1438 1431
 function kwote($lisp, $serveur = '', $type = '') {
1439 1432
 	if (preg_match(_CODE_QUOTE, $lisp, $r)) {
1440
-		return $r[1] . "\"" . sql_quote(str_replace(array("\\'", "\\\\"), array("'", "\\"), $r[2]), $serveur, $type) . "\"";
1433
+		return $r[1]."\"".sql_quote(str_replace(array("\\'", "\\\\"), array("'", "\\"), $r[2]), $serveur, $type)."\"";
1441 1434
 	} else {
1442
-		return "sql_quote($lisp, '$serveur', '" . str_replace("'", "\\'", $type) . "')";
1435
+		return "sql_quote($lisp, '$serveur', '".str_replace("'", "\\'", $type)."')";
1443 1436
 	}
1444 1437
 }
1445 1438
 
@@ -1461,7 +1454,7 @@  discard block
 block discarded – undo
1461 1454
 function critere_IN_dist($idb, &$boucles, $crit) {
1462 1455
 	$r = calculer_critere_infixe($idb, $boucles, $crit);
1463 1456
 	if (!$r) {
1464
-		return (array('zbug_critere_inconnu', array('critere' => $crit->op . " ?")));
1457
+		return (array('zbug_critere_inconnu', array('critere' => $crit->op." ?")));
1465 1458
 	}
1466 1459
 	list($arg, $op, $val, $col, $where_complement) = $r;
1467 1460
 
@@ -1488,8 +1481,8 @@  discard block
 block discarded – undo
1488 1481
 				"'NOT'",
1489 1482
 				array(
1490 1483
 					"'IN'",
1491
-					"'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'",
1492
-					array("'SELF'", "'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'", $where)
1484
+					"'".$boucles[$idb]->id_table.".".$boucles[$idb]->primary."'",
1485
+					array("'SELF'", "'".$boucles[$idb]->id_table.".".$boucles[$idb]->primary."'", $where)
1493 1486
 				)
1494 1487
 			);
1495 1488
 		}
@@ -1508,22 +1501,22 @@  discard block
 block discarded – undo
1508 1501
 	$descr = $boucles[$idb]->descr;
1509 1502
 	$cpt = &$num[$descr['nom']][$descr['gram']][$idb];
1510 1503
 
1511
-	$var = '$in' . $cpt++;
1504
+	$var = '$in'.$cpt++;
1512 1505
 	$x = "\n\t$var = array();";
1513 1506
 	foreach ($val as $k => $v) {
1514 1507
 		if (preg_match(",^(\n//.*\n)?'(.*)'$,", $v, $r)) {
1515 1508
 			// optimiser le traitement des constantes
1516 1509
 			if (is_numeric($r[2])) {
1517
-				$x .= "\n\t$var" . "[]= $r[2];";
1510
+				$x .= "\n\t$var"."[]= $r[2];";
1518 1511
 			} else {
1519
-				$x .= "\n\t$var" . "[]= " . sql_quote($r[2]) . ";";
1512
+				$x .= "\n\t$var"."[]= ".sql_quote($r[2]).";";
1520 1513
 			}
1521 1514
 		} else {
1522 1515
 			// Pour permettre de passer des tableaux de valeurs
1523 1516
 			// on repere l'utilisation brute de #ENV**{X},
1524 1517
 			// c'est-a-dire sa  traduction en ($PILE[0][X]).
1525 1518
 			// et on deballe mais en rajoutant l'anti XSS
1526
-			$x .= "\n\tif (!(is_array(\$a = ($v))))\n\t\t$var" . "[]= \$a;\n\telse $var = array_merge($var, \$a);";
1519
+			$x .= "\n\tif (!(is_array(\$a = ($v))))\n\t\t$var"."[]= \$a;\n\telse $var = array_merge($var, \$a);";
1527 1520
 		}
1528 1521
 	}
1529 1522
 
@@ -1537,7 +1530,7 @@  discard block
 block discarded – undo
1537 1530
 		$boucles[$idb]->default_order[] = "((!\$zqv=sql_quote($var) OR \$zqv===\"''\") ? 0 : ('FIELD($arg,' . \$zqv . ')'))";
1538 1531
 	}
1539 1532
 
1540
-	return "sql_in('$arg', $var" . ($crit2 == 'NOT' ? ",'NOT'" : "") . ")";
1533
+	return "sql_in('$arg', $var".($crit2 == 'NOT' ? ",'NOT'" : "").")";
1541 1534
 }
1542 1535
 
1543 1536
 /**
@@ -1610,7 +1603,7 @@  discard block
 block discarded – undo
1610 1603
 		$champs = array_diff($champs, array_keys($boucle->modificateur['criteres']));
1611 1604
 	}
1612 1605
 	// nous aider en mode debug.
1613
-	$boucle->debug[] = "id_ : " . implode(', ', $champs);
1606
+	$boucle->debug[] = "id_ : ".implode(', ', $champs);
1614 1607
 	$boucle->modificateur['id_'] = $champs;
1615 1608
 
1616 1609
 	// créer un critère {id_xxx?} de chaque champ retenu
@@ -1651,7 +1644,7 @@  discard block
 block discarded – undo
1651 1644
 	// Les champs id_xx de la table demandée
1652 1645
 	$champs = array_filter(
1653 1646
 		array_keys($desc['field']),
1654
-		function($champ){
1647
+		function($champ) {
1655 1648
 			return
1656 1649
 				strpos($champ, 'id_') === 0
1657 1650
 				or (in_array($champ, array('objet')));
@@ -1866,8 +1859,8 @@  discard block
 block discarded – undo
1866 1859
 				"'NOT'",
1867 1860
 				array(
1868 1861
 					"'IN'",
1869
-					"'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'",
1870
-					array("'SELF'", "'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'", $where)
1862
+					"'".$boucles[$idb]->id_table.".".$boucles[$idb]->primary."'",
1863
+					array("'SELF'", "'".$boucles[$idb]->id_table.".".$boucles[$idb]->primary."'", $where)
1871 1864
 				)
1872 1865
 			);
1873 1866
 		}
@@ -1878,7 +1871,7 @@  discard block
 block discarded – undo
1878 1871
 	if ($crit->cond) {
1879 1872
 		$pred = calculer_argument_precedent($idb, $col, $boucles);
1880 1873
 		if ($col == "date" or $col == "date_redac") {
1881
-			if ($pred == "\$Pile[0]['" . $col . "']") {
1874
+			if ($pred == "\$Pile[0]['".$col."']") {
1882 1875
 				$pred = "(\$Pile[0]['{$col}_default']?'':$pred)";
1883 1876
 			}
1884 1877
 		}
@@ -2039,7 +2032,7 @@  discard block
 block discarded – undo
2039 2032
 		// defaire le quote des int et les passer dans sql_quote avec le bon type de champ si on le connait, int sinon
2040 2033
 		// prendre en compte le debug ou la valeur arrive avec un commentaire PHP en debut
2041 2034
 		if (preg_match(",^\\A(\s*//.*?$\s*)?\"'(-?\d+)'\"\\z,ms", $val[0], $r)) {
2042
-			$val[0] = $r[1] . '"' . sql_quote($r[2], $boucle->sql_serveur, $type_cast_quote) . '"';
2035
+			$val[0] = $r[1].'"'.sql_quote($r[2], $boucle->sql_serveur, $type_cast_quote).'"';
2043 2036
 		}
2044 2037
 		// sinon expliciter les
2045 2038
 		// sql_quote(truc) en sql_quote(truc,'',type)
@@ -2050,22 +2043,22 @@  discard block
 block discarded – undo
2050 2043
 		// sql_quote(truc,'','varchar')
2051 2044
 		elseif (preg_match('/\Asql_quote[(](.*?)(,[^)]*?)?(,[^)]*(?:\(\d+\)[^)]*)?)?[)]\s*\z/ms', $val[0], $r)
2052 2045
 			// si pas deja un type
2053
-			and (!isset($r[3]) or !$r[3] or !trim($r[3],", '"))
2046
+			and (!isset($r[3]) or !$r[3] or !trim($r[3], ", '"))
2054 2047
 		) {
2055 2048
 			$r = $r[1]
2056 2049
 				. ((isset($r[2]) and $r[2]) ? $r[2] : ",''")
2057
-				. ",'" . addslashes($type_cast_quote) . "'";
2050
+				. ",'".addslashes($type_cast_quote)."'";
2058 2051
 			$val[0] = "sql_quote($r)";
2059 2052
 		}
2060
-		elseif(strpos($val[0], '@@defaultcast@@') !== false
2053
+		elseif (strpos($val[0], '@@defaultcast@@') !== false
2061 2054
 		  and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r)) {
2062
-			$val[0] = substr($val[0], 0, -strlen($r[0])) . "'" . addslashes($type_cast_quote) . "')";
2055
+			$val[0] = substr($val[0], 0, -strlen($r[0]))."'".addslashes($type_cast_quote)."')";
2063 2056
 		}
2064 2057
 	}
2065 2058
 
2066
-	if(strpos($val[0], '@@defaultcast@@') !== false
2059
+	if (strpos($val[0], '@@defaultcast@@') !== false
2067 2060
 	  and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r)) {
2068
-		$val[0] = substr($val[0], 0, -strlen($r[0])) . "'char')";
2061
+		$val[0] = substr($val[0], 0, -strlen($r[0]))."'char')";
2069 2062
 	}
2070 2063
 
2071 2064
 	// Indicateur pour permettre aux fonctionx boucle_X de modifier
@@ -2090,7 +2083,7 @@  discard block
 block discarded – undo
2090 2083
 	// inserer le nom de la table SQL devant le nom du champ
2091 2084
 	if ($table) {
2092 2085
 		if ($col[0] == "`") {
2093
-			$arg = "$table." . substr($col, 1, -1);
2086
+			$arg = "$table.".substr($col, 1, -1);
2094 2087
 		} else {
2095 2088
 			$arg = "$table.$col";
2096 2089
 		}
@@ -2224,9 +2217,9 @@  discard block
 block discarded – undo
2224 2217
  **/
2225 2218
 function primary_doublee($decompose, $table) {
2226 2219
 	$e1 = reset($decompose);
2227
-	$e2 = "sql_quote('" . end($decompose) . "')";
2220
+	$e2 = "sql_quote('".end($decompose)."')";
2228 2221
 
2229
-	return array("'='", "'$table." . $e1 . "'", $e2);
2222
+	return array("'='", "'$table.".$e1."'", $e2);
2230 2223
 }
2231 2224
 
2232 2225
 /**
@@ -2264,7 +2257,7 @@  discard block
 block discarded – undo
2264 2257
 	if ($checkarrivee
2265 2258
 		and is_string($checkarrivee)
2266 2259
 		and $a = table_objet($checkarrivee)
2267
-		and in_array($a . '_liens', $joints)
2260
+		and in_array($a.'_liens', $joints)
2268 2261
 	) {
2269 2262
 		if ($res = calculer_lien_externe_init($boucle, $joints, $col, $desc, $cond, $checkarrivee)) {
2270 2263
 			return $res;
@@ -2284,12 +2277,12 @@  discard block
 block discarded – undo
2284 2277
 				// la table est déjà dans le FROM, on vérifie si le champ est utilisé.
2285 2278
 				$joindre = false;
2286 2279
 				foreach ($cols as $col) {
2287
-					$c = '/\b' . $t . ".$col" . '\b/';
2280
+					$c = '/\b'.$t.".$col".'\b/';
2288 2281
 					if (trouver_champ($c, $boucle->where)) {
2289 2282
 						$joindre = true;
2290 2283
 					} else {
2291 2284
 						// mais ca peut etre dans le FIELD pour le Having
2292
-						$c = "/FIELD.$t" . ".$col,/";
2285
+						$c = "/FIELD.$t".".$col,/";
2293 2286
 						if (trouver_champ($c, $boucle->select)) {
2294 2287
 							$joindre = true;
2295 2288
 						}
@@ -2336,7 +2329,7 @@  discard block
 block discarded – undo
2336 2329
 	$primary_arrivee = id_table_objet($checkarrivee);
2337 2330
 
2338 2331
 	// [FIXME] $checkarrivee peut-il arriver avec false ????
2339
-	$intermediaire = trouver_champ_exterieur($primary_arrivee, $joints, $boucle, $checkarrivee . "_liens");
2332
+	$intermediaire = trouver_champ_exterieur($primary_arrivee, $joints, $boucle, $checkarrivee."_liens");
2340 2333
 	$arrivee = trouver_champ_exterieur($col, $joints, $boucle, $checkarrivee);
2341 2334
 
2342 2335
 	if (!$intermediaire or !$arrivee) {
@@ -2434,7 +2427,7 @@  discard block
 block discarded – undo
2434 2427
 			} elseif ($crit->cond and ($col == "date" or $col == "date_redac")) {
2435 2428
 				// un critere conditionnel sur date est traite a part
2436 2429
 				// car la date est mise d'office par SPIP,
2437
-				$defaut = "(\$Pile[0]['{$col}_default']?'':\$Pile[0]['" . $col . "'])";
2430
+				$defaut = "(\$Pile[0]['{$col}_default']?'':\$Pile[0]['".$col."'])";
2438 2431
 			}
2439 2432
 
2440 2433
 			$val = calculer_argument_precedent($idb, $val, $boucles, $defaut);
@@ -2465,7 +2458,7 @@  discard block
 block discarded – undo
2465 2458
 			and (($p == "'") or ($p == '"'))
2466 2459
 			and $params[0][1]->type == 'champ'
2467 2460
 		) {
2468
-			$val[] = "$p\\$p#" . $params[0][1]->nom_champ . "\\$p$p";
2461
+			$val[] = "$p\\$p#".$params[0][1]->nom_champ."\\$p$p";
2469 2462
 		} else {
2470 2463
 			foreach ((($op != 'IN') ? $params : calculer_vieux_in($params)) as $p) {
2471 2464
 				$a = calculer_liste($p, $idb, $boucles, $parent);
@@ -2481,7 +2474,7 @@  discard block
 block discarded – undo
2481 2474
 	$fct = $args_sql = '';
2482 2475
 	// fonction SQL ?
2483 2476
 	// chercher FONCTION(champ) tel que CONCAT(titre,descriptif)
2484
-	if (preg_match('/^(.*)' . SQL_ARGS . '$/', $col, $m)) {
2477
+	if (preg_match('/^(.*)'.SQL_ARGS.'$/', $col, $m)) {
2485 2478
 		$fct = $m[1];
2486 2479
 		preg_match('/^\(([^,]*)(.*)\)$/', $m[2], $a);
2487 2480
 		$col = $a[1];
@@ -2571,7 +2564,7 @@  discard block
 block discarded – undo
2571 2564
 		# si oui choisir ce champ, sinon choisir xxxx
2572 2565
 
2573 2566
 		if (isset($table['field']["date$suite"])) {
2574
-			$date_orig = 'date' . $suite;
2567
+			$date_orig = 'date'.$suite;
2575 2568
 		} else {
2576 2569
 			$date_orig = substr($suite, 1);
2577 2570
 		}
@@ -2582,12 +2575,12 @@  discard block
 block discarded – undo
2582 2575
 		}
2583 2576
 	}
2584 2577
 
2585
-	$date_compare = "\"' . normaliser_date(" .
2586
-		calculer_argument_precedent($idb, $pred, $boucles) .
2578
+	$date_compare = "\"' . normaliser_date(".
2579
+		calculer_argument_precedent($idb, $pred, $boucles).
2587 2580
 		") . '\"";
2588 2581
 
2589 2582
 	$col_vraie = $date_orig;
2590
-	$date_orig = $boucle->id_table . '.' . $date_orig;
2583
+	$date_orig = $boucle->id_table.'.'.$date_orig;
2591 2584
 
2592 2585
 	switch ($col) {
2593 2586
 		case 'date':
@@ -2607,26 +2600,26 @@  discard block
 block discarded – undo
2607 2600
 			break;
2608 2601
 		case 'age':
2609 2602
 			$col = calculer_param_date("NOW()", $date_orig);
2610
-			$col_vraie = "";// comparer a un int (par defaut)
2603
+			$col_vraie = ""; // comparer a un int (par defaut)
2611 2604
 			break;
2612 2605
 		case 'age_relatif':
2613 2606
 			$col = calculer_param_date($date_compare, $date_orig);
2614
-			$col_vraie = "";// comparer a un int (par defaut)
2607
+			$col_vraie = ""; // comparer a un int (par defaut)
2615 2608
 			break;
2616 2609
 		case 'jour_relatif':
2617
-			$col = "(TO_DAYS(" . $date_compare . ")-TO_DAYS(" . $date_orig . "))";
2618
-			$col_vraie = "";// comparer a un int (par defaut)
2610
+			$col = "(TO_DAYS(".$date_compare.")-TO_DAYS(".$date_orig."))";
2611
+			$col_vraie = ""; // comparer a un int (par defaut)
2619 2612
 			break;
2620 2613
 		case 'mois_relatif':
2621
-			$col = "MONTH(" . $date_compare . ")-MONTH(" .
2622
-				$date_orig . ")+12*(YEAR(" . $date_compare .
2623
-				")-YEAR(" . $date_orig . "))";
2624
-			$col_vraie = "";// comparer a un int (par defaut)
2614
+			$col = "MONTH(".$date_compare.")-MONTH(".
2615
+				$date_orig.")+12*(YEAR(".$date_compare.
2616
+				")-YEAR(".$date_orig."))";
2617
+			$col_vraie = ""; // comparer a un int (par defaut)
2625 2618
 			break;
2626 2619
 		case 'annee_relatif':
2627
-			$col = "YEAR(" . $date_compare . ")-YEAR(" .
2628
-				$date_orig . ")";
2629
-			$col_vraie = "";// comparer a un int (par defaut)
2620
+			$col = "YEAR(".$date_compare.")-YEAR(".
2621
+				$date_orig.")";
2622
+			$col_vraie = ""; // comparer a un int (par defaut)
2630 2623
 			break;
2631 2624
 	}
2632 2625
 
@@ -2685,10 +2678,10 @@  discard block
 block discarded – undo
2685 2678
 	}
2686 2679
 
2687 2680
 	$boucle->hash .= '
2688
-	$command[\'sourcemode\'] = ' . array_shift($args) . ";\n";
2681
+	$command[\'sourcemode\'] = ' . array_shift($args).";\n";
2689 2682
 
2690 2683
 	$boucle->hash .= '
2691
-	$command[\'source\'] = array(' . join(', ', $args) . ");\n";
2684
+	$command[\'source\'] = array(' . join(', ', $args).");\n";
2692 2685
 }
2693 2686
 
2694 2687
 
@@ -2706,8 +2699,8 @@  discard block
 block discarded – undo
2706 2699
 function critere_DATA_datasource_dist($idb, &$boucles, $crit) {
2707 2700
 	$boucle = &$boucles[$idb];
2708 2701
 	$boucle->hash .= '
2709
-	$command[\'source\'] = array(' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent) . ');
2710
-	$command[\'sourcemode\'] = ' . calculer_liste($crit->param[1], $idb, $boucles, $boucles[$idb]->id_parent) . ';';
2702
+	$command[\'source\'] = array(' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent).');
2703
+	$command[\'sourcemode\'] = ' . calculer_liste($crit->param[1], $idb, $boucles, $boucles[$idb]->id_parent).';';
2711 2704
 }
2712 2705
 
2713 2706
 
@@ -2727,7 +2720,7 @@  discard block
 block discarded – undo
2727 2720
 function critere_DATA_datacache_dist($idb, &$boucles, $crit) {
2728 2721
 	$boucle = &$boucles[$idb];
2729 2722
 	$boucle->hash .= '
2730
-	$command[\'datacache\'] = ' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent) . ';';
2723
+	$command[\'datacache\'] = ' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent).';';
2731 2724
 }
2732 2725
 
2733 2726
 
@@ -2746,7 +2739,7 @@  discard block
 block discarded – undo
2746 2739
 	$boucle->hash .= '$command[\'args\']=array();';
2747 2740
 	foreach ($crit->param as $param) {
2748 2741
 		$boucle->hash .= '
2749
-			$command[\'args\'][] = ' . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ';';
2742
+			$command[\'args\'][] = ' . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent).';';
2750 2743
 	}
2751 2744
 }
2752 2745
 
@@ -2765,10 +2758,10 @@  discard block
 block discarded – undo
2765 2758
  */
2766 2759
 function critere_DATA_liste_dist($idb, &$boucles, $crit) {
2767 2760
 	$boucle = &$boucles[$idb];
2768
-	$boucle->hash .= "\n\t" . '$command[\'liste\'] = array();' . "\n";
2761
+	$boucle->hash .= "\n\t".'$command[\'liste\'] = array();'."\n";
2769 2762
 	foreach ($crit->param as $param) {
2770
-		$boucle->hash .= "\t" . '$command[\'liste\'][] = ' . calculer_liste($param, $idb, $boucles,
2771
-				$boucles[$idb]->id_parent) . ";\n";
2763
+		$boucle->hash .= "\t".'$command[\'liste\'][] = '.calculer_liste($param, $idb, $boucles,
2764
+				$boucles[$idb]->id_parent).";\n";
2772 2765
 	}
2773 2766
 }
2774 2767
 
@@ -2795,10 +2788,10 @@  discard block
 block discarded – undo
2795 2788
  */
2796 2789
 function critere_DATA_enum_dist($idb, &$boucles, $crit) {
2797 2790
 	$boucle = &$boucles[$idb];
2798
-	$boucle->hash .= "\n\t" . '$command[\'enum\'] = array();' . "\n";
2791
+	$boucle->hash .= "\n\t".'$command[\'enum\'] = array();'."\n";
2799 2792
 	foreach ($crit->param as $param) {
2800
-		$boucle->hash .= "\t" . '$command[\'enum\'][] = ' . calculer_liste($param, $idb, $boucles,
2801
-				$boucles[$idb]->id_parent) . ";\n";
2793
+		$boucle->hash .= "\t".'$command[\'enum\'][] = '.calculer_liste($param, $idb, $boucles,
2794
+				$boucles[$idb]->id_parent).";\n";
2802 2795
 	}
2803 2796
 }
2804 2797
 
@@ -2817,7 +2810,7 @@  discard block
 block discarded – undo
2817 2810
 	$boucle = &$boucles[$idb];
2818 2811
 	foreach ($crit->param as $param) {
2819 2812
 		$boucle->hash .= '
2820
-			$command[\'datapath\'][] = ' . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ';';
2813
+			$command[\'datapath\'][] = ' . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent).';';
2821 2814
 	}
2822 2815
 }
2823 2816
 
@@ -2858,7 +2851,7 @@  discard block
 block discarded – undo
2858 2851
 	if ($crit->param) {
2859 2852
 		foreach ($crit->param as $param) {
2860 2853
 			$boucle->hash .= "\t\$command['si'][] = "
2861
-				. calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ";\n";
2854
+				. calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent).";\n";
2862 2855
 		}
2863 2856
 		// interdire {si 0} aussi !
2864 2857
 	} else {
@@ -2881,7 +2874,7 @@  discard block
 block discarded – undo
2881 2874
 function critere_POUR_tableau_dist($idb, &$boucles, $crit) {
2882 2875
 	$boucle = &$boucles[$idb];
2883 2876
 	$boucle->hash .= '
2884
-	$command[\'source\'] = array(' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent) . ');
2877
+	$command[\'source\'] = array(' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent).');
2885 2878
 	$command[\'sourcemode\'] = \'table\';';
2886 2879
 }
2887 2880
 
@@ -2914,11 +2907,10 @@  discard block
 block discarded – undo
2914 2907
 	$table_sql = table_objet_sql(objet_type($table));
2915 2908
 
2916 2909
 	$id_parent = isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent']) ?
2917
-		$GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] :
2918
-		'id_parent';
2910
+		$GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] : 'id_parent';
2919 2911
 
2920 2912
 	$in = "IN";
2921
-	$where = array("'IN'", "'$boucle->id_table." . "$primary'", "'('.sql_get_select('$id_parent', '$table_sql').')'");
2913
+	$where = array("'IN'", "'$boucle->id_table."."$primary'", "'('.sql_get_select('$id_parent', '$table_sql').')'");
2922 2914
 	if ($not) {
2923 2915
 		$where = array("'NOT'", $where);
2924 2916
 	}
Please login to merge, or discard this patch.
ecrire/public/compiler.php 2 patches
Indentation   +1136 added lines, -1136 removed lines patch added patch discarded remove patch
@@ -18,7 +18,7 @@  discard block
 block discarded – undo
18 18
  **/
19 19
 
20 20
 if (!defined('_ECRIRE_INC_VERSION')) {
21
-	return;
21
+    return;
22 22
 }
23 23
 
24 24
 /** Repérer un code ne calculant rien, meme avec commentaire */
@@ -60,91 +60,91 @@  discard block
 block discarded – undo
60 60
 
61 61
 // http://code.spip.net/@argumenter_inclure
62 62
 function argumenter_inclure(
63
-	$params,
64
-	$rejet_filtres,
65
-	$p,
66
-	&$boucles,
67
-	$id_boucle,
68
-	$echap = true,
69
-	$lang = '',
70
-	$fond1 = false
63
+    $params,
64
+    $rejet_filtres,
65
+    $p,
66
+    &$boucles,
67
+    $id_boucle,
68
+    $echap = true,
69
+    $lang = '',
70
+    $fond1 = false
71 71
 ) {
72
-	$l = array();
73
-	$erreur_p_i_i = '';
74
-	if (!is_array($params)) {
75
-		return $l;
76
-	}
77
-	foreach ($params as $k => $couple) {
78
-		// la liste d'arguments d'inclusion peut se terminer par un filtre
79
-		$filtre = array_shift($couple);
80
-		if ($filtre) {
81
-			break;
82
-		}
83
-		foreach ($couple as $n => $val) {
84
-			$var = $val[0];
85
-			if ($var->type != 'texte') {
86
-				if ($n or $k or $fond1) {
87
-					$erreur_p_i_i = array(
88
-						'zbug_parametres_inclus_incorrects',
89
-						array('param' => $var->nom_champ)
90
-					);
91
-					erreur_squelette($erreur_p_i_i, $p);
92
-					break;
93
-				} else {
94
-					$l[1] = calculer_liste($val, $p->descr, $boucles, $id_boucle);
95
-				}
96
-			} else {
97
-				preg_match(",^([^=]*)(=?)(.*)$,m", $var->texte, $m);
98
-				$m = array_pad($m, 3, null);
99
-				$var = $m[1];
100
-				$auto = false;;
101
-				if ($m[2]) {
102
-					$v = $m[3];
103
-					if (preg_match(',^[\'"](.*)[\'"]$,', $v, $m)) {
104
-						$v = $m[1];
105
-					}
106
-					$val[0] = new Texte;
107
-					$val[0]->texte = $v;
108
-				} elseif ($k or $n or $fond1) {
109
-					$auto = true;
110
-				} else {
111
-					$var = 1;
112
-				}
113
-
114
-				if ($var == 'lang') {
115
-					$lang = !$auto
116
-						? calculer_liste($val, $p->descr, $boucles, $id_boucle)
117
-						: '$GLOBALS["spip_lang"]';
118
-				} else {
119
-					$val = $auto
120
-						? index_pile($id_boucle, $var, $boucles)
121
-						: calculer_liste($val, $p->descr, $boucles, $id_boucle);
122
-					if ($var !== 1) {
123
-						$val = ($echap ? "\'$var\' => ' . argumenter_squelette(" : "'$var' => ")
124
-							. $val . ($echap ? ") . '" : " ");
125
-					} else {
126
-						$val = $echap ? "'.$val.'" : $val;
127
-					}
128
-					$l[$var] = $val;
129
-				}
130
-			}
131
-		}
132
-	}
133
-	if ($erreur_p_i_i) {
134
-		return false;
135
-	}
136
-	// Cas particulier de la langue : si {lang=xx} est definie, on
137
-	// la passe, sinon on passe la langue courante au moment du calcul
138
-	// sauf si on n'en veut pas 
139
-	if ($lang === false) {
140
-		return $l;
141
-	}
142
-	if (!$lang) {
143
-		$lang = '$GLOBALS["spip_lang"]';
144
-	}
145
-	$l['lang'] = ($echap ? "\'lang\' => ' . argumenter_squelette(" : "'lang' => ") . $lang . ($echap ? ") . '" : " ");
146
-
147
-	return $l;
72
+    $l = array();
73
+    $erreur_p_i_i = '';
74
+    if (!is_array($params)) {
75
+        return $l;
76
+    }
77
+    foreach ($params as $k => $couple) {
78
+        // la liste d'arguments d'inclusion peut se terminer par un filtre
79
+        $filtre = array_shift($couple);
80
+        if ($filtre) {
81
+            break;
82
+        }
83
+        foreach ($couple as $n => $val) {
84
+            $var = $val[0];
85
+            if ($var->type != 'texte') {
86
+                if ($n or $k or $fond1) {
87
+                    $erreur_p_i_i = array(
88
+                        'zbug_parametres_inclus_incorrects',
89
+                        array('param' => $var->nom_champ)
90
+                    );
91
+                    erreur_squelette($erreur_p_i_i, $p);
92
+                    break;
93
+                } else {
94
+                    $l[1] = calculer_liste($val, $p->descr, $boucles, $id_boucle);
95
+                }
96
+            } else {
97
+                preg_match(",^([^=]*)(=?)(.*)$,m", $var->texte, $m);
98
+                $m = array_pad($m, 3, null);
99
+                $var = $m[1];
100
+                $auto = false;;
101
+                if ($m[2]) {
102
+                    $v = $m[3];
103
+                    if (preg_match(',^[\'"](.*)[\'"]$,', $v, $m)) {
104
+                        $v = $m[1];
105
+                    }
106
+                    $val[0] = new Texte;
107
+                    $val[0]->texte = $v;
108
+                } elseif ($k or $n or $fond1) {
109
+                    $auto = true;
110
+                } else {
111
+                    $var = 1;
112
+                }
113
+
114
+                if ($var == 'lang') {
115
+                    $lang = !$auto
116
+                        ? calculer_liste($val, $p->descr, $boucles, $id_boucle)
117
+                        : '$GLOBALS["spip_lang"]';
118
+                } else {
119
+                    $val = $auto
120
+                        ? index_pile($id_boucle, $var, $boucles)
121
+                        : calculer_liste($val, $p->descr, $boucles, $id_boucle);
122
+                    if ($var !== 1) {
123
+                        $val = ($echap ? "\'$var\' => ' . argumenter_squelette(" : "'$var' => ")
124
+                            . $val . ($echap ? ") . '" : " ");
125
+                    } else {
126
+                        $val = $echap ? "'.$val.'" : $val;
127
+                    }
128
+                    $l[$var] = $val;
129
+                }
130
+            }
131
+        }
132
+    }
133
+    if ($erreur_p_i_i) {
134
+        return false;
135
+    }
136
+    // Cas particulier de la langue : si {lang=xx} est definie, on
137
+    // la passe, sinon on passe la langue courante au moment du calcul
138
+    // sauf si on n'en veut pas 
139
+    if ($lang === false) {
140
+        return $l;
141
+    }
142
+    if (!$lang) {
143
+        $lang = '$GLOBALS["spip_lang"]';
144
+    }
145
+    $l['lang'] = ($echap ? "\'lang\' => ' . argumenter_squelette(" : "'lang' => ") . $lang . ($echap ? ") . '" : " ");
146
+
147
+    return $l;
148 148
 }
149 149
 
150 150
 /**
@@ -168,71 +168,71 @@  discard block
 block discarded – undo
168 168
  **/
169 169
 function calculer_inclure($p, &$boucles, $id_boucle) {
170 170
 
171
-	$_contexte = argumenter_inclure($p->param, false, $p, $boucles, $id_boucle, true, '', true);
172
-	if (is_string($p->texte)) {
173
-		$fichier = $p->texte;
174
-		$code = "\"".str_replace('"','\"',$fichier)."\"";
175
-
176
-	} else {
177
-		$code = calculer_liste($p->texte, $p->descr, $boucles, $id_boucle);
178
-		if ($code and preg_match("/^'([^']*)'/s", $code, $r)) {
179
-			$fichier = $r[1];
180
-		} else {
181
-			$fichier = '';
182
-		}
183
-	}
184
-	if (!$code or $code === '""') {
185
-		$erreur_p_i_i = array(
186
-			'zbug_parametres_inclus_incorrects',
187
-			array('param' => $code)
188
-		);
189
-		erreur_squelette($erreur_p_i_i, $p);
190
-
191
-		return false;
192
-	}
193
-	$compil = texte_script(memoriser_contexte_compil($p));
194
-
195
-	if (is_array($_contexte)) {
196
-		// Critere d'inclusion {env} (et {self} pour compatibilite ascendante)
197
-		if ($env = (isset($_contexte['env']) || isset($_contexte['self']))) {
198
-			unset($_contexte['env']);
199
-		}
200
-
201
-		// noter les doublons dans l'appel a public.php
202
-		if (isset($_contexte['doublons'])) {
203
-			$_contexte['doublons'] = "\\'doublons\\' => '.var_export(\$doublons,true).'";
204
-		}
205
-
206
-		if ($ajax = isset($_contexte['ajax'])) {
207
-			$ajax = preg_replace(",=>(.*)$,ims", '=> ($v=(\\1))?$v:true', $_contexte['ajax']);
208
-			unset($_contexte['ajax']);
209
-		}
210
-
211
-		$_contexte = join(",\n\t", $_contexte);
212
-	} else {
213
-		return false;
214
-	} // j'aurais voulu toucher le fond ...
215
-
216
-	$contexte = 'array(' . $_contexte . ')';
217
-
218
-	if ($env) {
219
-		$contexte = "array_merge('.var_export(\$Pile[0],1).',$contexte)";
220
-	}
221
-
222
-	// s'il y a une extension .php, ce n'est pas un squelette
223
-	if ($fichier and preg_match('/^.+[.]php$/s', $fichier)) {
224
-		$code = sandbox_composer_inclure_php($fichier, $p, $contexte);
225
-	} else {
226
-		$_options[] = "\"compil\"=>array($compil)";
227
-		if ($ajax) {
228
-			$_options[] = $ajax;
229
-		}
230
-		$code = " ' . argumenter_squelette($code) . '";
231
-		$code = "echo " . sprintf(CODE_RECUPERER_FOND, $code, $contexte, implode(',', $_options),
232
-				"_request(\"connect\")") . ';';
233
-	}
234
-
235
-	return "\n'<'.'" . "?php " . $code . "\n?'." . "'>'";
171
+    $_contexte = argumenter_inclure($p->param, false, $p, $boucles, $id_boucle, true, '', true);
172
+    if (is_string($p->texte)) {
173
+        $fichier = $p->texte;
174
+        $code = "\"".str_replace('"','\"',$fichier)."\"";
175
+
176
+    } else {
177
+        $code = calculer_liste($p->texte, $p->descr, $boucles, $id_boucle);
178
+        if ($code and preg_match("/^'([^']*)'/s", $code, $r)) {
179
+            $fichier = $r[1];
180
+        } else {
181
+            $fichier = '';
182
+        }
183
+    }
184
+    if (!$code or $code === '""') {
185
+        $erreur_p_i_i = array(
186
+            'zbug_parametres_inclus_incorrects',
187
+            array('param' => $code)
188
+        );
189
+        erreur_squelette($erreur_p_i_i, $p);
190
+
191
+        return false;
192
+    }
193
+    $compil = texte_script(memoriser_contexte_compil($p));
194
+
195
+    if (is_array($_contexte)) {
196
+        // Critere d'inclusion {env} (et {self} pour compatibilite ascendante)
197
+        if ($env = (isset($_contexte['env']) || isset($_contexte['self']))) {
198
+            unset($_contexte['env']);
199
+        }
200
+
201
+        // noter les doublons dans l'appel a public.php
202
+        if (isset($_contexte['doublons'])) {
203
+            $_contexte['doublons'] = "\\'doublons\\' => '.var_export(\$doublons,true).'";
204
+        }
205
+
206
+        if ($ajax = isset($_contexte['ajax'])) {
207
+            $ajax = preg_replace(",=>(.*)$,ims", '=> ($v=(\\1))?$v:true', $_contexte['ajax']);
208
+            unset($_contexte['ajax']);
209
+        }
210
+
211
+        $_contexte = join(",\n\t", $_contexte);
212
+    } else {
213
+        return false;
214
+    } // j'aurais voulu toucher le fond ...
215
+
216
+    $contexte = 'array(' . $_contexte . ')';
217
+
218
+    if ($env) {
219
+        $contexte = "array_merge('.var_export(\$Pile[0],1).',$contexte)";
220
+    }
221
+
222
+    // s'il y a une extension .php, ce n'est pas un squelette
223
+    if ($fichier and preg_match('/^.+[.]php$/s', $fichier)) {
224
+        $code = sandbox_composer_inclure_php($fichier, $p, $contexte);
225
+    } else {
226
+        $_options[] = "\"compil\"=>array($compil)";
227
+        if ($ajax) {
228
+            $_options[] = $ajax;
229
+        }
230
+        $code = " ' . argumenter_squelette($code) . '";
231
+        $code = "echo " . sprintf(CODE_RECUPERER_FOND, $code, $contexte, implode(',', $_options),
232
+                "_request(\"connect\")") . ';';
233
+    }
234
+
235
+    return "\n'<'.'" . "?php " . $code . "\n?'." . "'>'";
236 236
 }
237 237
 
238 238
 
@@ -250,7 +250,7 @@  discard block
 block discarded – undo
250 250
  *     true pour ne tester que le cas publie et ignorer l'eventuel var_mode=preview de la page
251 251
  */
252 252
 function instituer_boucle(&$boucle, $echapper = true, $ignore_previsu = false) {
253
-	/*
253
+    /*
254 254
 	$show['statut'][] = array(
255 255
 		'champ'=>'statut',  // champ de la table sur lequel porte le filtrage par le statut
256 256
 		'publie'=>'publie', // valeur ou liste de valeurs, qui definissent l'objet comme publie.
@@ -274,71 +274,71 @@  discard block
 block discarded – undo
274 274
 	champstatut est alors le champ statut sur la tablen
275 275
 	dans les jointures, clen peut etre un tableau pour une jointure complexe : array('id_objet','id_article','objet','article')
276 276
 */
277
-	$id_table = $boucle->id_table;
278
-	$show = $boucle->show;
279
-	if (isset($show['statut']) and $show['statut']) {
280
-		foreach ($show['statut'] as $k => $s) {
281
-			// Restreindre aux elements publies si pas de {statut} ou autre dans les criteres
282
-			$filtrer = true;
283
-			if (isset($s['exception'])) {
284
-				foreach (is_array($s['exception']) ? $s['exception'] : array($s['exception']) as $m) {
285
-					if (isset($boucle->modificateur[$m]) or isset($boucle->modificateur['criteres'][$m])) {
286
-						$filtrer = false;
287
-						break;
288
-					}
289
-				}
290
-			}
291
-
292
-			if ($filtrer) {
293
-				if (is_array($s['champ'])) {
294
-					$statut = preg_replace(',\W,', '', array_pop($s['champ'])); // securite
295
-					$jointures = array();
296
-					// indiquer la description de chaque table dans le tableau de jointures,
297
-					// ce qui permet d'eviter certains GROUP BY inutiles.
298
-					$trouver_table = charger_fonction('trouver_table', 'base');
299
-					foreach ($s['champ'] as $j) {
300
-						$id = reset($j);
301
-						$def = $trouver_table($id);
302
-						$jointures[] = array('', array($id, $def), end($j));
303
-					}
304
-					$jointures[0][0] = $id_table;
305
-					if (!array_search($id, $boucle->from)) {
306
-						include_spip('public/jointures');
307
-						fabrique_jointures($boucle, $jointures, true, $boucle->show, $id_table, '', $echapper);
308
-					}
309
-					// trouver l'alias de la table d'arrivee qui porte le statut
310
-					$id = array_search($id, $boucle->from);
311
-				} else {
312
-					$id = $id_table;
313
-					$statut = preg_replace(',\W,', '', $s['champ']); // securite
314
-				}
315
-				$mstatut = $id . '.' . $statut;
316
-
317
-				$arg_ignore_previsu = ($ignore_previsu ? ",true" : '');
318
-				include_spip('public/quete');
319
-				if (isset($s['post_date']) and $s['post_date']
320
-					and $GLOBALS['meta']["post_dates"] == 'non'
321
-				) {
322
-					$date = $id . '.' . preg_replace(',\W,', '', $s['post_date']); // securite
323
-					array_unshift($boucle->where,
324
-						$echapper ?
325
-							"\nquete_condition_postdates('$date'," . _q($boucle->sql_serveur) . "$arg_ignore_previsu)"
326
-							:
327
-							quete_condition_postdates($date, $boucle->sql_serveur, $ignore_previsu)
328
-					);
329
-				}
330
-				array_unshift($boucle->where,
331
-					$echapper ?
332
-						"\nquete_condition_statut('$mstatut',"
333
-						. _q($s['previsu']) . ","
334
-						. _q($s['publie']) . ","
335
-						. _q($boucle->sql_serveur) . "$arg_ignore_previsu)"
336
-						:
337
-						quete_condition_statut($mstatut, $s['previsu'], $s['publie'], $boucle->sql_serveur, $ignore_previsu)
338
-				);
339
-			}
340
-		}
341
-	}
277
+    $id_table = $boucle->id_table;
278
+    $show = $boucle->show;
279
+    if (isset($show['statut']) and $show['statut']) {
280
+        foreach ($show['statut'] as $k => $s) {
281
+            // Restreindre aux elements publies si pas de {statut} ou autre dans les criteres
282
+            $filtrer = true;
283
+            if (isset($s['exception'])) {
284
+                foreach (is_array($s['exception']) ? $s['exception'] : array($s['exception']) as $m) {
285
+                    if (isset($boucle->modificateur[$m]) or isset($boucle->modificateur['criteres'][$m])) {
286
+                        $filtrer = false;
287
+                        break;
288
+                    }
289
+                }
290
+            }
291
+
292
+            if ($filtrer) {
293
+                if (is_array($s['champ'])) {
294
+                    $statut = preg_replace(',\W,', '', array_pop($s['champ'])); // securite
295
+                    $jointures = array();
296
+                    // indiquer la description de chaque table dans le tableau de jointures,
297
+                    // ce qui permet d'eviter certains GROUP BY inutiles.
298
+                    $trouver_table = charger_fonction('trouver_table', 'base');
299
+                    foreach ($s['champ'] as $j) {
300
+                        $id = reset($j);
301
+                        $def = $trouver_table($id);
302
+                        $jointures[] = array('', array($id, $def), end($j));
303
+                    }
304
+                    $jointures[0][0] = $id_table;
305
+                    if (!array_search($id, $boucle->from)) {
306
+                        include_spip('public/jointures');
307
+                        fabrique_jointures($boucle, $jointures, true, $boucle->show, $id_table, '', $echapper);
308
+                    }
309
+                    // trouver l'alias de la table d'arrivee qui porte le statut
310
+                    $id = array_search($id, $boucle->from);
311
+                } else {
312
+                    $id = $id_table;
313
+                    $statut = preg_replace(',\W,', '', $s['champ']); // securite
314
+                }
315
+                $mstatut = $id . '.' . $statut;
316
+
317
+                $arg_ignore_previsu = ($ignore_previsu ? ",true" : '');
318
+                include_spip('public/quete');
319
+                if (isset($s['post_date']) and $s['post_date']
320
+                    and $GLOBALS['meta']["post_dates"] == 'non'
321
+                ) {
322
+                    $date = $id . '.' . preg_replace(',\W,', '', $s['post_date']); // securite
323
+                    array_unshift($boucle->where,
324
+                        $echapper ?
325
+                            "\nquete_condition_postdates('$date'," . _q($boucle->sql_serveur) . "$arg_ignore_previsu)"
326
+                            :
327
+                            quete_condition_postdates($date, $boucle->sql_serveur, $ignore_previsu)
328
+                    );
329
+                }
330
+                array_unshift($boucle->where,
331
+                    $echapper ?
332
+                        "\nquete_condition_statut('$mstatut',"
333
+                        . _q($s['previsu']) . ","
334
+                        . _q($s['publie']) . ","
335
+                        . _q($boucle->sql_serveur) . "$arg_ignore_previsu)"
336
+                        :
337
+                        quete_condition_statut($mstatut, $s['previsu'], $s['publie'], $boucle->sql_serveur, $ignore_previsu)
338
+                );
339
+            }
340
+        }
341
+    }
342 342
 }
343 343
 
344 344
 /**
@@ -357,23 +357,23 @@  discard block
 block discarded – undo
357 357
  */
358 358
 function calculer_boucle($id_boucle, &$boucles) {
359 359
 
360
-	$boucle = &$boucles[$id_boucle];
361
-	instituer_boucle($boucle);
362
-	$boucles[$id_boucle] = pipeline('post_boucle', $boucles[$id_boucle]);
363
-
364
-	// en mode debug memoriser les premiers passages dans la boucle,
365
-	// mais pas tous, sinon ca pete.
366
-	if (_request('var_mode_affiche') != 'resultat') {
367
-		$trace = '';
368
-	} else {
369
-		$trace = $boucles[$id_boucle]->descr['nom'] . $id_boucle;
370
-		$trace = "if (count(@\$GLOBALS['debug_objets']['resultat']['$trace'])<3)
360
+    $boucle = &$boucles[$id_boucle];
361
+    instituer_boucle($boucle);
362
+    $boucles[$id_boucle] = pipeline('post_boucle', $boucles[$id_boucle]);
363
+
364
+    // en mode debug memoriser les premiers passages dans la boucle,
365
+    // mais pas tous, sinon ca pete.
366
+    if (_request('var_mode_affiche') != 'resultat') {
367
+        $trace = '';
368
+    } else {
369
+        $trace = $boucles[$id_boucle]->descr['nom'] . $id_boucle;
370
+        $trace = "if (count(@\$GLOBALS['debug_objets']['resultat']['$trace'])<3)
371 371
 	    \$GLOBALS['debug_objets']['resultat']['$trace'][] = \$t0;";
372
-	}
372
+    }
373 373
 
374
-	return ($boucles[$id_boucle]->type_requete == TYPE_RECURSIF)
375
-		? calculer_boucle_rec($id_boucle, $boucles, $trace)
376
-		: calculer_boucle_nonrec($id_boucle, $boucles, $trace);
374
+    return ($boucles[$id_boucle]->type_requete == TYPE_RECURSIF)
375
+        ? calculer_boucle_rec($id_boucle, $boucles, $trace)
376
+        : calculer_boucle_nonrec($id_boucle, $boucles, $trace);
377 377
 }
378 378
 
379 379
 
@@ -396,15 +396,15 @@  discard block
 block discarded – undo
396 396
  *    Code PHP compilé de la boucle récursive
397 397
  **/
398 398
 function calculer_boucle_rec($id_boucle, &$boucles, $trace) {
399
-	$nom = $boucles[$id_boucle]->param[0];
400
-
401
-	return
402
-		// Numrows[$nom] peut ne pas être encore defini
403
-		"\n\t\$save_numrows = (isset(\$Numrows['$nom']) ? \$Numrows['$nom'] : array());"
404
-		. "\n\t\$t0 = " . $boucles[$id_boucle]->return . ";"
405
-		. "\n\t\$Numrows['$nom'] = (\$save_numrows);"
406
-		. $trace
407
-		. "\n\treturn \$t0;";
399
+    $nom = $boucles[$id_boucle]->param[0];
400
+
401
+    return
402
+        // Numrows[$nom] peut ne pas être encore defini
403
+        "\n\t\$save_numrows = (isset(\$Numrows['$nom']) ? \$Numrows['$nom'] : array());"
404
+        . "\n\t\$t0 = " . $boucles[$id_boucle]->return . ";"
405
+        . "\n\t\$Numrows['$nom'] = (\$save_numrows);"
406
+        . $trace
407
+        . "\n\treturn \$t0;";
408 408
 }
409 409
 
410 410
 /**
@@ -458,169 +458,169 @@  discard block
 block discarded – undo
458 458
  **/
459 459
 function calculer_boucle_nonrec($id_boucle, &$boucles, $trace) {
460 460
 
461
-	$boucle = &$boucles[$id_boucle];
462
-	$return = $boucle->return;
463
-	$type_boucle = $boucle->type_requete;
464
-	$primary = $boucle->primary;
465
-	$constant = preg_match(CODE_MONOTONE, str_replace("\\'", '', $return));
466
-	$flag_cpt = $boucle->mode_partie || $boucle->cptrows;
467
-	$corps = '';
468
-
469
-	// faudrait expanser le foreach a la compil, car y en a souvent qu'un 
470
-	// et puis faire un [] plutot qu'un "','."
471
-	if ($boucle->doublons) {
472
-		$corps .= "\n\t\t\tforeach(" . $boucle->doublons . ' as $k) $doublons[$k] .= "," . ' .
473
-			index_pile($id_boucle, $primary, $boucles)
474
-			. "; // doublons\n";
475
-	}
476
-
477
-	// La boucle doit-elle selectionner la langue ?
478
-	// - par defaut, les boucles suivantes le font
479
-	//    (sauf si forcer_lang==true ou si le titre contient <multi>).
480
-	// - a moins d'une demande explicite via {!lang_select}
481
-	if (!$constant && $boucle->lang_select != 'non' &&
482
-		(($boucle->lang_select == 'oui') ||
483
-			in_array($type_boucle, array(
484
-				'articles',
485
-				'rubriques',
486
-				'hierarchie',
487
-				'breves'
488
-			)))
489
-	) {
490
-		// Memoriser la langue avant la boucle et la restituer apres
491
-		// afin que le corps de boucle affecte la globale directement
492
-		$init_lang = "lang_select(\$GLOBALS['spip_lang']);\n\t";
493
-		$fin_lang = "lang_select();\n\t";
494
-		$fin_lang_select_public = "\n\t\tlang_select();";
495
-
496
-		$corps .=
497
-			"\n\t\tlang_select_public("
498
-			. index_pile($id_boucle, 'lang', $boucles)
499
-			. ", '" . $boucle->lang_select . "'"
500
-			. (in_array($type_boucle, array(
501
-				'articles',
502
-				'rubriques',
503
-				'hierarchie',
504
-				'breves'
505
-			)) ? ', ' . index_pile($id_boucle, 'titre', $boucles) : '')
506
-			. ');';
507
-	} else {
508
-		$init_lang = '';
509
-		$fin_lang = '';
510
-		$fin_lang_select_public = '';
511
-		// sortir les appels au traducteur (invariants de boucle)
512
-		if (strpos($return, '?php') === false
513
-			and preg_match_all("/\W(_T[(]'[^']*'[)])/", $return, $r)
514
-		) {
515
-			$i = 1;
516
-			foreach ($r[1] as $t) {
517
-				$init_lang .= "\n\t\$l$i = $t;";
518
-				$return = str_replace($t, "\$l$i", $return);
519
-				$i++;
520
-			}
521
-		}
522
-	}
523
-
524
-	// gestion optimale des separateurs et des boucles constantes
525
-	if (count($boucle->separateur)) {
526
-		$code_sep = ("'" . str_replace("'", "\'", join('', $boucle->separateur)) . "'");
527
-	}
528
-
529
-	$corps .=
530
-		((!$boucle->separateur) ?
531
-			(($constant && !$corps && !$flag_cpt) ? $return :
532
-				(($return === "''") ? '' :
533
-					("\n\t\t" . '$t0 .= ' . $return . ";"))) :
534
-			("\n\t\t\$t1 " .
535
-				((strpos($return, '$t1.') === 0) ?
536
-					(".=" . substr($return, 4)) :
537
-					('= ' . $return)) .
538
-				";\n\t\t" .
539
-				'$t0 .= ((strlen($t1) && strlen($t0)) ? ' . $code_sep . " : '') . \$t1;"));
540
-
541
-	// Calculer les invalideurs si c'est une boucle non constante et si on
542
-	// souhaite invalider ces elements
543
-	if (!$constant and $primary) {
544
-		include_spip('inc/invalideur');
545
-		$corps = calcul_invalideurs($corps, $primary,$boucles, $id_boucle);
546
-	}
547
-
548
-	// gerer le compteur de boucle 
549
-	// avec ou sans son utilisation par les criteres {1/3} {1,4} {n-2,1}...
550
-
551
-	if ($boucle->partie or $boucle->cptrows) {
552
-		$corps = "\n\t\t\$Numrows['$id_boucle']['compteur_boucle']++;"
553
-			. $boucle->partie
554
-			. $corps;
555
-	}
556
-
557
-	// depiler la lang de la boucle si besoin
558
-	$corps .= $fin_lang_select_public;
559
-
560
-	// si le corps est une constante, ne pas appeler le serveur N fois!
561
-
562
-	if (preg_match(CODE_MONOTONE, str_replace("\\'", '', $corps), $r)) {
563
-		if (!isset($r[2]) or (!$r[2])) {
564
-			if (!$boucle->numrows) {
565
-				return "\n\t\$t0 = '';";
566
-			} else {
567
-				$corps = "";
568
-			}
569
-		} else {
570
-			$boucle->numrows = true;
571
-			$corps = "\n\t\$t0 = str_repeat($corps, \$Numrows['$id_boucle']['total']);";
572
-		}
573
-	} else {
574
-		$corps = "while (\$Pile[\$SP]=\$iter->fetch()) {\n$corps\n	}";
575
-	}
576
-
577
-	$count = '';
578
-	if (!$boucle->select) {
579
-		if (!$boucle->numrows or $boucle->limit or $boucle->mode_partie or $boucle->group) {
580
-			$count = '1';
581
-		} else {
582
-			$count = 'count(*)';
583
-		}
584
-		$boucles[$id_boucle]->select[] = $count;
585
-	}
586
-
587
-	if ($flag_cpt) {
588
-		$nums = "\n\t// COMPTEUR\n\t"
589
-			. "\$Numrows['$id_boucle']['compteur_boucle'] = 0;\n\t";
590
-	} else {
591
-		$nums = '';
592
-	}
593
-
594
-	if ($boucle->numrows or $boucle->mode_partie) {
595
-		$nums .= "\$Numrows['$id_boucle']['total'] = @intval(\$iter->count());"
596
-			. $boucle->mode_partie
597
-			. "\n\t";
598
-	}
599
-
600
-	// Ne calculer la requete que maintenant
601
-	// car ce qui precede appelle index_pile qui influe dessus
602
-
603
-	$init = (($init = $boucles[$id_boucle]->doublons)
604
-			? ("\n\t$init = array();") : '')
605
-		. calculer_requete_sql($boucles[$id_boucle]);
606
-
607
-	$contexte = memoriser_contexte_compil($boucle);
608
-
609
-	$a = sprintf(CODE_CORPS_BOUCLE,
610
-		$init,
611
-		$boucle->iterateur,
612
-		"\$command",
613
-		$contexte,
614
-		$nums,
615
-		$init_lang,
616
-		$corps,
617
-		$fin_lang,
618
-		$trace,
619
-		'BOUCLE' . $id_boucle . ' @ ' . ($boucle->descr['sourcefile'])
620
-	);
461
+    $boucle = &$boucles[$id_boucle];
462
+    $return = $boucle->return;
463
+    $type_boucle = $boucle->type_requete;
464
+    $primary = $boucle->primary;
465
+    $constant = preg_match(CODE_MONOTONE, str_replace("\\'", '', $return));
466
+    $flag_cpt = $boucle->mode_partie || $boucle->cptrows;
467
+    $corps = '';
468
+
469
+    // faudrait expanser le foreach a la compil, car y en a souvent qu'un 
470
+    // et puis faire un [] plutot qu'un "','."
471
+    if ($boucle->doublons) {
472
+        $corps .= "\n\t\t\tforeach(" . $boucle->doublons . ' as $k) $doublons[$k] .= "," . ' .
473
+            index_pile($id_boucle, $primary, $boucles)
474
+            . "; // doublons\n";
475
+    }
476
+
477
+    // La boucle doit-elle selectionner la langue ?
478
+    // - par defaut, les boucles suivantes le font
479
+    //    (sauf si forcer_lang==true ou si le titre contient <multi>).
480
+    // - a moins d'une demande explicite via {!lang_select}
481
+    if (!$constant && $boucle->lang_select != 'non' &&
482
+        (($boucle->lang_select == 'oui') ||
483
+            in_array($type_boucle, array(
484
+                'articles',
485
+                'rubriques',
486
+                'hierarchie',
487
+                'breves'
488
+            )))
489
+    ) {
490
+        // Memoriser la langue avant la boucle et la restituer apres
491
+        // afin que le corps de boucle affecte la globale directement
492
+        $init_lang = "lang_select(\$GLOBALS['spip_lang']);\n\t";
493
+        $fin_lang = "lang_select();\n\t";
494
+        $fin_lang_select_public = "\n\t\tlang_select();";
495
+
496
+        $corps .=
497
+            "\n\t\tlang_select_public("
498
+            . index_pile($id_boucle, 'lang', $boucles)
499
+            . ", '" . $boucle->lang_select . "'"
500
+            . (in_array($type_boucle, array(
501
+                'articles',
502
+                'rubriques',
503
+                'hierarchie',
504
+                'breves'
505
+            )) ? ', ' . index_pile($id_boucle, 'titre', $boucles) : '')
506
+            . ');';
507
+    } else {
508
+        $init_lang = '';
509
+        $fin_lang = '';
510
+        $fin_lang_select_public = '';
511
+        // sortir les appels au traducteur (invariants de boucle)
512
+        if (strpos($return, '?php') === false
513
+            and preg_match_all("/\W(_T[(]'[^']*'[)])/", $return, $r)
514
+        ) {
515
+            $i = 1;
516
+            foreach ($r[1] as $t) {
517
+                $init_lang .= "\n\t\$l$i = $t;";
518
+                $return = str_replace($t, "\$l$i", $return);
519
+                $i++;
520
+            }
521
+        }
522
+    }
523
+
524
+    // gestion optimale des separateurs et des boucles constantes
525
+    if (count($boucle->separateur)) {
526
+        $code_sep = ("'" . str_replace("'", "\'", join('', $boucle->separateur)) . "'");
527
+    }
528
+
529
+    $corps .=
530
+        ((!$boucle->separateur) ?
531
+            (($constant && !$corps && !$flag_cpt) ? $return :
532
+                (($return === "''") ? '' :
533
+                    ("\n\t\t" . '$t0 .= ' . $return . ";"))) :
534
+            ("\n\t\t\$t1 " .
535
+                ((strpos($return, '$t1.') === 0) ?
536
+                    (".=" . substr($return, 4)) :
537
+                    ('= ' . $return)) .
538
+                ";\n\t\t" .
539
+                '$t0 .= ((strlen($t1) && strlen($t0)) ? ' . $code_sep . " : '') . \$t1;"));
540
+
541
+    // Calculer les invalideurs si c'est une boucle non constante et si on
542
+    // souhaite invalider ces elements
543
+    if (!$constant and $primary) {
544
+        include_spip('inc/invalideur');
545
+        $corps = calcul_invalideurs($corps, $primary,$boucles, $id_boucle);
546
+    }
547
+
548
+    // gerer le compteur de boucle 
549
+    // avec ou sans son utilisation par les criteres {1/3} {1,4} {n-2,1}...
550
+
551
+    if ($boucle->partie or $boucle->cptrows) {
552
+        $corps = "\n\t\t\$Numrows['$id_boucle']['compteur_boucle']++;"
553
+            . $boucle->partie
554
+            . $corps;
555
+    }
556
+
557
+    // depiler la lang de la boucle si besoin
558
+    $corps .= $fin_lang_select_public;
559
+
560
+    // si le corps est une constante, ne pas appeler le serveur N fois!
561
+
562
+    if (preg_match(CODE_MONOTONE, str_replace("\\'", '', $corps), $r)) {
563
+        if (!isset($r[2]) or (!$r[2])) {
564
+            if (!$boucle->numrows) {
565
+                return "\n\t\$t0 = '';";
566
+            } else {
567
+                $corps = "";
568
+            }
569
+        } else {
570
+            $boucle->numrows = true;
571
+            $corps = "\n\t\$t0 = str_repeat($corps, \$Numrows['$id_boucle']['total']);";
572
+        }
573
+    } else {
574
+        $corps = "while (\$Pile[\$SP]=\$iter->fetch()) {\n$corps\n	}";
575
+    }
576
+
577
+    $count = '';
578
+    if (!$boucle->select) {
579
+        if (!$boucle->numrows or $boucle->limit or $boucle->mode_partie or $boucle->group) {
580
+            $count = '1';
581
+        } else {
582
+            $count = 'count(*)';
583
+        }
584
+        $boucles[$id_boucle]->select[] = $count;
585
+    }
586
+
587
+    if ($flag_cpt) {
588
+        $nums = "\n\t// COMPTEUR\n\t"
589
+            . "\$Numrows['$id_boucle']['compteur_boucle'] = 0;\n\t";
590
+    } else {
591
+        $nums = '';
592
+    }
593
+
594
+    if ($boucle->numrows or $boucle->mode_partie) {
595
+        $nums .= "\$Numrows['$id_boucle']['total'] = @intval(\$iter->count());"
596
+            . $boucle->mode_partie
597
+            . "\n\t";
598
+    }
599
+
600
+    // Ne calculer la requete que maintenant
601
+    // car ce qui precede appelle index_pile qui influe dessus
602
+
603
+    $init = (($init = $boucles[$id_boucle]->doublons)
604
+            ? ("\n\t$init = array();") : '')
605
+        . calculer_requete_sql($boucles[$id_boucle]);
606
+
607
+    $contexte = memoriser_contexte_compil($boucle);
608
+
609
+    $a = sprintf(CODE_CORPS_BOUCLE,
610
+        $init,
611
+        $boucle->iterateur,
612
+        "\$command",
613
+        $contexte,
614
+        $nums,
615
+        $init_lang,
616
+        $corps,
617
+        $fin_lang,
618
+        $trace,
619
+        'BOUCLE' . $id_boucle . ' @ ' . ($boucle->descr['sourcefile'])
620
+    );
621 621
 
622 622
 #	var_dump($a);exit;
623
-	return $a;
623
+    return $a;
624 624
 }
625 625
 
626 626
 
@@ -636,43 +636,43 @@  discard block
 block discarded – undo
636 636
  *     Code PHP compilé définissant les informations de requête
637 637
  **/
638 638
 function calculer_requete_sql($boucle) {
639
-	$init = array();
640
-	$init[] = calculer_dec('table', "'" . $boucle->id_table . "'");
641
-	$init[] = calculer_dec('id', "'" . $boucle->id_boucle . "'");
642
-	# En absence de champ c'est un decompte :
643
-	$init[] = calculer_dec('from', calculer_from($boucle));
644
-	$init[] = calculer_dec('type', calculer_from_type($boucle));
645
-	$init[] = calculer_dec('groupby',
646
-		'array(' . (($g = join("\",\n\t\t\"", $boucle->group)) ? '"' . $g . '"' : '') . ")");
647
-	$init[] = calculer_dec('select', 'array("' . join("\",\n\t\t\"", $boucle->select) . "\")");
648
-	$init[] = calculer_dec('orderby', 'array(' . calculer_order($boucle) . ")");
649
-	$init[] = calculer_dec('where', calculer_dump_array($boucle->where));
650
-	$init[] = calculer_dec('join', calculer_dump_join($boucle->join));
651
-	$init[] = calculer_dec('limit',
652
-		(strpos($boucle->limit, 'intval') === false ?
653
-			"'" . $boucle->limit . "'"
654
-			:
655
-			$boucle->limit));
656
-	$init[] = calculer_dec('having', calculer_dump_array($boucle->having));
657
-	$s = $d = "";
658
-	// l'index 0 de $i indique si l'affectation est statique (contenu)
659
-	// ou recalculée à chaque passage (vide)
660
-	foreach ($init as $i) {
661
-		if (reset($i)) {
662
-			$s .= "\n\t\t" . end($i);
663
-		} # statique
664
-		else {
665
-			$d .= "\n\t" . end($i);
666
-		} # dynamique
667
-	}
668
-
669
-	return ($boucle->hierarchie ? "\n\t$boucle->hierarchie" : '')
670
-	. $boucle->in
671
-	. $boucle->hash
672
-	. "\n\t" . 'if (!isset($command[\'table\'])) {'
673
-	. $s
674
-	. "\n\t}"
675
-	. $d;
639
+    $init = array();
640
+    $init[] = calculer_dec('table', "'" . $boucle->id_table . "'");
641
+    $init[] = calculer_dec('id', "'" . $boucle->id_boucle . "'");
642
+    # En absence de champ c'est un decompte :
643
+    $init[] = calculer_dec('from', calculer_from($boucle));
644
+    $init[] = calculer_dec('type', calculer_from_type($boucle));
645
+    $init[] = calculer_dec('groupby',
646
+        'array(' . (($g = join("\",\n\t\t\"", $boucle->group)) ? '"' . $g . '"' : '') . ")");
647
+    $init[] = calculer_dec('select', 'array("' . join("\",\n\t\t\"", $boucle->select) . "\")");
648
+    $init[] = calculer_dec('orderby', 'array(' . calculer_order($boucle) . ")");
649
+    $init[] = calculer_dec('where', calculer_dump_array($boucle->where));
650
+    $init[] = calculer_dec('join', calculer_dump_join($boucle->join));
651
+    $init[] = calculer_dec('limit',
652
+        (strpos($boucle->limit, 'intval') === false ?
653
+            "'" . $boucle->limit . "'"
654
+            :
655
+            $boucle->limit));
656
+    $init[] = calculer_dec('having', calculer_dump_array($boucle->having));
657
+    $s = $d = "";
658
+    // l'index 0 de $i indique si l'affectation est statique (contenu)
659
+    // ou recalculée à chaque passage (vide)
660
+    foreach ($init as $i) {
661
+        if (reset($i)) {
662
+            $s .= "\n\t\t" . end($i);
663
+        } # statique
664
+        else {
665
+            $d .= "\n\t" . end($i);
666
+        } # dynamique
667
+    }
668
+
669
+    return ($boucle->hierarchie ? "\n\t$boucle->hierarchie" : '')
670
+    . $boucle->in
671
+    . $boucle->hash
672
+    . "\n\t" . 'if (!isset($command[\'table\'])) {'
673
+    . $s
674
+    . "\n\t}"
675
+    . $d;
676 676
 }
677 677
 
678 678
 /**
@@ -690,13 +690,13 @@  discard block
 block discarded – undo
690 690
  *     qui peut être utilisé pour la production d'un tableau array()
691 691
  **/
692 692
 function memoriser_contexte_compil($p) {
693
-	return join(',', array(
694
-		_q(isset($p->descr['sourcefile']) ? $p->descr['sourcefile'] : ''),
695
-		_q(isset($p->descr['nom']) ? $p->descr['nom'] : ''),
696
-		_q(isset($p->id_boucle) ? $p->id_boucle : null),
697
-		intval($p->ligne),
698
-		'$GLOBALS[\'spip_lang\']'
699
-	));
693
+    return join(',', array(
694
+        _q(isset($p->descr['sourcefile']) ? $p->descr['sourcefile'] : ''),
695
+        _q(isset($p->descr['nom']) ? $p->descr['nom'] : ''),
696
+        _q(isset($p->id_boucle) ? $p->id_boucle : null),
697
+        intval($p->ligne),
698
+        '$GLOBALS[\'spip_lang\']'
699
+    ));
700 700
 }
701 701
 
702 702
 /**
@@ -714,19 +714,19 @@  discard block
 block discarded – undo
714 714
  *     Objet Contexte
715 715
  **/
716 716
 function reconstruire_contexte_compil($context_compil) {
717
-	if (!is_array($context_compil)) {
718
-		return $context_compil;
719
-	}
720
-	$p = new Contexte;
721
-	$p->descr = array(
722
-		'sourcefile' => $context_compil[0],
723
-		'nom' => $context_compil[1]
724
-	);
725
-	$p->id_boucle = $context_compil[2];
726
-	$p->ligne = $context_compil[3];
727
-	$p->lang = $context_compil[4];
728
-
729
-	return $p;
717
+    if (!is_array($context_compil)) {
718
+        return $context_compil;
719
+    }
720
+    $p = new Contexte;
721
+    $p->descr = array(
722
+        'sourcefile' => $context_compil[0],
723
+        'nom' => $context_compil[1]
724
+    );
725
+    $p->id_boucle = $context_compil[2];
726
+    $p->ligne = $context_compil[3];
727
+    $p->lang = $context_compil[4];
728
+
729
+    return $p;
730 730
 }
731 731
 
732 732
 /**
@@ -752,12 +752,12 @@  discard block
 block discarded – undo
752 752
  *    - index 1 : Code de l'affectation
753 753
  **/
754 754
 function calculer_dec($nom, $val) {
755
-	$static = 'if (!isset($command[\'' . $nom . '\'])) ';
756
-	// si une variable apparait dans le calcul de la clause
757
-	// il faut la re-evaluer a chaque passage
758
-	if (
759
-		strpos($val, '$') !== false
760
-		/*
755
+    $static = 'if (!isset($command[\'' . $nom . '\'])) ';
756
+    // si une variable apparait dans le calcul de la clause
757
+    // il faut la re-evaluer a chaque passage
758
+    if (
759
+        strpos($val, '$') !== false
760
+        /*
761 761
 		OR strpos($val, 'sql_') !== false
762 762
 		OR (
763 763
 			$test = str_replace(array("array(",'\"',"\'"),array("","",""),$val) // supprimer les array( et les echappements de guillemets
@@ -765,11 +765,11 @@  discard block
 block discarded – undo
765 765
 			AND $test = preg_replace(",'[^']*',UimsS","",$test) // supprimer les chaines qui peuvent contenir des fonctions SQL qui ne genent pas
766 766
 			AND preg_match(",\w+\s*\(,UimsS",$test,$regs) // tester la presence de fonctions restantes
767 767
 		)*/
768
-	) {
769
-		$static = "";
770
-	}
768
+    ) {
769
+        $static = "";
770
+    }
771 771
 
772
-	return array($static, '$command[\'' . $nom . '\'] = ' . $val . ';');
772
+    return array($static, '$command[\'' . $nom . '\'] = ' . $val . ';');
773 773
 }
774 774
 
775 775
 /**
@@ -789,32 +789,32 @@  discard block
 block discarded – undo
789 789
  *     Expression PHP décrivant un texte ou un tableau
790 790
  **/
791 791
 function calculer_dump_array($a) {
792
-	if (!is_array($a)) {
793
-		return $a;
794
-	}
795
-	$res = "";
796
-	if ($a and $a[0] == "'?'") {
797
-		return ("(" . calculer_dump_array($a[1]) .
798
-			" ? " . calculer_dump_array($a[2]) .
799
-			" : " . calculer_dump_array($a[3]) .
800
-			")");
801
-	} else {
802
-		foreach ($a as $v) {
803
-			$res .= ", " . calculer_dump_array($v);
804
-		}
805
-
806
-		return "\n\t\t\tarray(" . substr($res, 2) . ')';
807
-	}
792
+    if (!is_array($a)) {
793
+        return $a;
794
+    }
795
+    $res = "";
796
+    if ($a and $a[0] == "'?'") {
797
+        return ("(" . calculer_dump_array($a[1]) .
798
+            " ? " . calculer_dump_array($a[2]) .
799
+            " : " . calculer_dump_array($a[3]) .
800
+            ")");
801
+    } else {
802
+        foreach ($a as $v) {
803
+            $res .= ", " . calculer_dump_array($v);
804
+        }
805
+
806
+        return "\n\t\t\tarray(" . substr($res, 2) . ')';
807
+    }
808 808
 }
809 809
 
810 810
 // http://code.spip.net/@calculer_dump_join
811 811
 function calculer_dump_join($a) {
812
-	$res = "";
813
-	foreach ($a as $k => $v) {
814
-		$res .= ", '$k' => array(" . implode(',', $v) . ")";
815
-	}
812
+    $res = "";
813
+    foreach ($a as $k => $v) {
814
+        $res .= ", '$k' => array(" . implode(',', $v) . ")";
815
+    }
816 816
 
817
-	return 'array(' . substr($res, 2) . ')';
817
+    return 'array(' . substr($res, 2) . ')';
818 818
 }
819 819
 
820 820
 /**
@@ -826,12 +826,12 @@  discard block
 block discarded – undo
826 826
  *     Code PHP construisant un tableau des alias et noms des tables du FROM
827 827
  **/
828 828
 function calculer_from(&$boucle) {
829
-	$res = "";
830
-	foreach ($boucle->from as $k => $v) {
831
-		$res .= ",'$k' => '$v'";
832
-	}
829
+    $res = "";
830
+    foreach ($boucle->from as $k => $v) {
831
+        $res .= ",'$k' => '$v'";
832
+    }
833 833
 
834
-	return 'array(' . substr($res, 1) . ')';
834
+    return 'array(' . substr($res, 1) . ')';
835 835
 }
836 836
 
837 837
 /**
@@ -844,30 +844,30 @@  discard block
 block discarded – undo
844 844
  *     Code PHP construisant un tableau des alias et type de jointure du FROM
845 845
  **/
846 846
 function calculer_from_type(&$boucle) {
847
-	$res = "";
848
-	foreach ($boucle->from_type as $k => $v) {
849
-		$res .= ",'$k' => '$v'";
850
-	}
847
+    $res = "";
848
+    foreach ($boucle->from_type as $k => $v) {
849
+        $res .= ",'$k' => '$v'";
850
+    }
851 851
 
852
-	return 'array(' . substr($res, 1) . ')';
852
+    return 'array(' . substr($res, 1) . ')';
853 853
 }
854 854
 
855 855
 // http://code.spip.net/@calculer_order
856 856
 function calculer_order(&$boucle) {
857
-	if (!$order = $boucle->order
858
-		and !$order = $boucle->default_order
859
-	) {
860
-		$order = array();
861
-	}
857
+    if (!$order = $boucle->order
858
+        and !$order = $boucle->default_order
859
+    ) {
860
+        $order = array();
861
+    }
862 862
 
863
-	/*if (isset($boucle->modificateur['collate'])){
863
+    /*if (isset($boucle->modificateur['collate'])){
864 864
 		$col = "." . $boucle->modificateur['collate'];
865 865
 		foreach($order as $k=>$o)
866 866
 			if (strpos($order[$k],'COLLATE')===false)
867 867
 				$order[$k].= $col;
868 868
 	}*/
869 869
 
870
-	return join(', ', $order);
870
+    return join(', ', $order);
871 871
 }
872 872
 
873 873
 // Production du code PHP a partir de la sequence livree par le phraseur
@@ -877,59 +877,59 @@  discard block
 block discarded – undo
877 877
 
878 878
 // http://code.spip.net/@calculer_liste
879 879
 function calculer_liste($tableau, $descr, &$boucles, $id_boucle = '') {
880
-	if (!$tableau) {
881
-		return "''";
882
-	}
883
-	if (is_string($descr)) {
884
-		if (isset($boucles[$descr])) {
885
-			$idb = $descr;
886
-			$descr = [];
887
-			if (isset($boucles[$idb]->descr['id_mere_contexte'])) {
888
-				$descr['id_mere'] = $boucles[$idb]->descr['id_mere_contexte'];
889
-			}
890
-			if (isset($boucles[$idb]->descr['sourcefile'])) {
891
-				$descr['sourcefile'] = $boucles[$idb]->descr['sourcefile'];
892
-			}
893
-		}
894
-		else {
895
-			$descr = array();
896
-		}
897
-	}
898
-	if (!isset($descr['niv'])) {
899
-		$descr['niv'] = 0;
900
-	}
901
-	$codes = compile_cas($tableau, $descr, $boucles, $id_boucle);
902
-	if ($codes === false) {
903
-		return false;
904
-	}
905
-	$n = count($codes);
906
-	if (!$n) {
907
-		return "''";
908
-	}
909
-	$tab = str_repeat("\t", $descr['niv']);
910
-	if (_request('var_mode_affiche') != 'validation') {
911
-		if ($n == 1) {
912
-			return $codes[0];
913
-		} else {
914
-			$res = '';
915
-			foreach ($codes as $code) {
916
-				if (!preg_match("/^'[^']*'$/", $code)
917
-					or substr($res, -1, 1) !== "'"
918
-				) {
919
-					$res .= " .\n$tab$code";
920
-				} else {
921
-					$res = substr($res, 0, -1) . substr($code, 1);
922
-				}
923
-			}
924
-
925
-			return '(' . substr($res, 2 + $descr['niv']) . ')';
926
-		}
927
-	} else {
928
-		$nom = $descr['nom'] . $id_boucle . ($descr['niv'] ? $descr['niv'] : '');
929
-
930
-		return "join('', array_map('array_shift', \$GLOBALS['debug_objets']['sequence']['$nom'] = array(" . join(" ,\n$tab",
931
-			$codes) . ")))";
932
-	}
880
+    if (!$tableau) {
881
+        return "''";
882
+    }
883
+    if (is_string($descr)) {
884
+        if (isset($boucles[$descr])) {
885
+            $idb = $descr;
886
+            $descr = [];
887
+            if (isset($boucles[$idb]->descr['id_mere_contexte'])) {
888
+                $descr['id_mere'] = $boucles[$idb]->descr['id_mere_contexte'];
889
+            }
890
+            if (isset($boucles[$idb]->descr['sourcefile'])) {
891
+                $descr['sourcefile'] = $boucles[$idb]->descr['sourcefile'];
892
+            }
893
+        }
894
+        else {
895
+            $descr = array();
896
+        }
897
+    }
898
+    if (!isset($descr['niv'])) {
899
+        $descr['niv'] = 0;
900
+    }
901
+    $codes = compile_cas($tableau, $descr, $boucles, $id_boucle);
902
+    if ($codes === false) {
903
+        return false;
904
+    }
905
+    $n = count($codes);
906
+    if (!$n) {
907
+        return "''";
908
+    }
909
+    $tab = str_repeat("\t", $descr['niv']);
910
+    if (_request('var_mode_affiche') != 'validation') {
911
+        if ($n == 1) {
912
+            return $codes[0];
913
+        } else {
914
+            $res = '';
915
+            foreach ($codes as $code) {
916
+                if (!preg_match("/^'[^']*'$/", $code)
917
+                    or substr($res, -1, 1) !== "'"
918
+                ) {
919
+                    $res .= " .\n$tab$code";
920
+                } else {
921
+                    $res = substr($res, 0, -1) . substr($code, 1);
922
+                }
923
+            }
924
+
925
+            return '(' . substr($res, 2 + $descr['niv']) . ')';
926
+        }
927
+    } else {
928
+        $nom = $descr['nom'] . $id_boucle . ($descr['niv'] ? $descr['niv'] : '');
929
+
930
+        return "join('', array_map('array_shift', \$GLOBALS['debug_objets']['sequence']['$nom'] = array(" . join(" ,\n$tab",
931
+            $codes) . ")))";
932
+    }
933 933
 }
934 934
 
935 935
 define('_REGEXP_COND_VIDE_NONVIDE', "/^[(](.*)[?]\s*''\s*:\s*('[^']+')\s*[)]$/");
@@ -939,186 +939,186 @@  discard block
 block discarded – undo
939 939
 // http://code.spip.net/@compile_cas
940 940
 function compile_cas($tableau, $descr, &$boucles, $id_boucle) {
941 941
 
942
-	$codes = array();
943
-	// cas de la boucle recursive
944
-	if (is_array($id_boucle)) {
945
-		$id_boucle = $id_boucle[0];
946
-	}
947
-	$type = !$id_boucle ? '' : $boucles[$id_boucle]->type_requete;
948
-	$tab = str_repeat("\t", ++$descr['niv']);
949
-	$mode = _request('var_mode_affiche');
950
-	$err_e_c = '';
951
-	// chaque commentaire introduit dans le code doit commencer
952
-	// par un caractere distinguant le cas, pour exploitation par debug.
953
-	foreach ($tableau as $p) {
954
-
955
-		switch ($p->type) {
956
-			// texte seul
957
-			case 'texte':
958
-				$code = sandbox_composer_texte($p->texte, $p);
959
-				$commentaire = strlen($p->texte) . " signes";
960
-				$avant = '';
961
-				$apres = '';
962
-				$altern = "''";
963
-				break;
964
-
965
-			case 'polyglotte':
966
-				$code = "";
967
-				foreach ($p->traductions as $k => $v) {
968
-					$code .= ",'" .
969
-						str_replace(array("\\", "'"), array("\\\\", "\\'"), $k) .
970
-						"' => '" .
971
-						str_replace(array("\\", "'"), array("\\\\", "\\'"), $v) .
972
-						"'";
973
-				}
974
-				$code = "choisir_traduction(array(" .
975
-					substr($code, 1) .
976
-					"))";
977
-				$commentaire = '&';
978
-				$avant = '';
979
-				$apres = '';
980
-				$altern = "''";
981
-				break;
982
-
983
-			// inclure
984
-			case 'include':
985
-				$p->descr = $descr;
986
-				$code = calculer_inclure($p, $boucles, $id_boucle);
987
-				if ($code === false) {
988
-					$err_e_c = true;
989
-					$code = "''";
990
-				} else {
991
-					$commentaire = '<INCLURE ' . addslashes(str_replace("\n", ' ', $code)) . '>';
992
-					$avant = '';
993
-					$apres = '';
994
-					$altern = "''";
995
-				}
996
-				break;
997
-
998
-			// boucle
999
-			case TYPE_RECURSIF:
1000
-				$nom = $p->id_boucle;
1001
-				$newdescr = $descr;
1002
-				$newdescr['id_mere'] = $nom;
1003
-				$newdescr['niv']++;
1004
-				$avant = calculer_liste($p->avant,
1005
-					$newdescr, $boucles, $id_boucle);
1006
-				$apres = calculer_liste($p->apres,
1007
-					$newdescr, $boucles, $id_boucle);
1008
-				$newdescr['niv']--;
1009
-				$altern = calculer_liste($p->altern,
1010
-					$newdescr, $boucles, $id_boucle);
1011
-				if (($avant === false) or ($apres === false) or ($altern === false)) {
1012
-					$err_e_c = true;
1013
-					$code = "''";
1014
-				} else {
1015
-					$code = 'BOUCLE' .
1016
-						str_replace("-", "_", $nom) . $descr['nom'] .
1017
-						'($Cache, $Pile, $doublons, $Numrows, $SP)';
1018
-					$commentaire = "?$nom";
1019
-					if (!$boucles[$nom]->milieu
1020
-						and $boucles[$nom]->type_requete <> TYPE_RECURSIF
1021
-					) {
1022
-						if ($altern != "''") {
1023
-							$code .= "\n. $altern";
1024
-						}
1025
-						if ($avant <> "''" or $apres <> "''") {
1026
-							spip_log("boucle $nom toujours vide, code superflu dans $descr[sourcefile]");
1027
-						}
1028
-						$avant = $apres = $altern = "''";
1029
-					} else {
1030
-						if ($altern != "''") {
1031
-							$altern = "($altern)";
1032
-						}
1033
-					}
1034
-				}
1035
-				break;
1036
-
1037
-			case 'idiome':
1038
-				$l = array();
1039
-				$code = '';
1040
-				foreach ($p->arg as $k => $v) {
1041
-					$_v = calculer_liste($v, $descr, $boucles, $id_boucle);
1042
-					if ($k) {
1043
-						$l[] = _q($k) . ' => ' . $_v;
1044
-					} else {
1045
-						$code = $_v;
1046
-					}
1047
-				}
1048
-				// Si le module n'est pas fourni, l'expliciter sauf si calculé
1049
-				if ($p->module) {
1050
-					$m = $p->module . ':' . $p->nom_champ;
1051
-				} elseif ($p->nom_champ) {
1052
-					$m = MODULES_IDIOMES . ':' . $p->nom_champ;
1053
-				} else {
1054
-					$m = '';
1055
-				}
1056
-
1057
-				$code = (!$code ? "'$m'" :
1058
-						($m ? "'$m' . $code" :
1059
-							("(strpos(\$x=$code, ':') ? \$x : ('" . MODULES_IDIOMES . ":' . \$x))")))
1060
-					. (!$l ? '' : (", array(" . implode(",\n", $l) . ")"));
1061
-				$code = "_T($code)";
1062
-				if ($p->param) {
1063
-					$p->id_boucle = $id_boucle;
1064
-					$p->boucles = &$boucles;
1065
-					$code = compose_filtres($p, $code);
1066
-				}
1067
-				$commentaire = ":";
1068
-				$avant = '';
1069
-				$apres = '';
1070
-				$altern = "''";
1071
-				break;
1072
-
1073
-			case 'champ':
1074
-
1075
-				// cette structure pourrait etre completee des le phrase' (a faire)
1076
-				$p->id_boucle = $id_boucle;
1077
-				$p->boucles = &$boucles;
1078
-				$p->descr = $descr;
1079
-				#$p->interdire_scripts = true;
1080
-				$p->type_requete = $type;
1081
-
1082
-				$code = calculer_champ($p);
1083
-				$commentaire = '#' . $p->nom_champ . $p->etoile;
1084
-				$avant = calculer_liste($p->avant,
1085
-					$descr, $boucles, $id_boucle);
1086
-				$apres = calculer_liste($p->apres,
1087
-					$descr, $boucles, $id_boucle);
1088
-				$altern = "''";
1089
-				// Si la valeur est destinee a une comparaison a ''
1090
-				// forcer la conversion en une chaine par strval
1091
-				// si ca peut etre autre chose qu'une chaine
1092
-				if (($avant != "''" or $apres != "''")
1093
-					and $code[0] != "'"
942
+    $codes = array();
943
+    // cas de la boucle recursive
944
+    if (is_array($id_boucle)) {
945
+        $id_boucle = $id_boucle[0];
946
+    }
947
+    $type = !$id_boucle ? '' : $boucles[$id_boucle]->type_requete;
948
+    $tab = str_repeat("\t", ++$descr['niv']);
949
+    $mode = _request('var_mode_affiche');
950
+    $err_e_c = '';
951
+    // chaque commentaire introduit dans le code doit commencer
952
+    // par un caractere distinguant le cas, pour exploitation par debug.
953
+    foreach ($tableau as $p) {
954
+
955
+        switch ($p->type) {
956
+            // texte seul
957
+            case 'texte':
958
+                $code = sandbox_composer_texte($p->texte, $p);
959
+                $commentaire = strlen($p->texte) . " signes";
960
+                $avant = '';
961
+                $apres = '';
962
+                $altern = "''";
963
+                break;
964
+
965
+            case 'polyglotte':
966
+                $code = "";
967
+                foreach ($p->traductions as $k => $v) {
968
+                    $code .= ",'" .
969
+                        str_replace(array("\\", "'"), array("\\\\", "\\'"), $k) .
970
+                        "' => '" .
971
+                        str_replace(array("\\", "'"), array("\\\\", "\\'"), $v) .
972
+                        "'";
973
+                }
974
+                $code = "choisir_traduction(array(" .
975
+                    substr($code, 1) .
976
+                    "))";
977
+                $commentaire = '&';
978
+                $avant = '';
979
+                $apres = '';
980
+                $altern = "''";
981
+                break;
982
+
983
+            // inclure
984
+            case 'include':
985
+                $p->descr = $descr;
986
+                $code = calculer_inclure($p, $boucles, $id_boucle);
987
+                if ($code === false) {
988
+                    $err_e_c = true;
989
+                    $code = "''";
990
+                } else {
991
+                    $commentaire = '<INCLURE ' . addslashes(str_replace("\n", ' ', $code)) . '>';
992
+                    $avant = '';
993
+                    $apres = '';
994
+                    $altern = "''";
995
+                }
996
+                break;
997
+
998
+            // boucle
999
+            case TYPE_RECURSIF:
1000
+                $nom = $p->id_boucle;
1001
+                $newdescr = $descr;
1002
+                $newdescr['id_mere'] = $nom;
1003
+                $newdescr['niv']++;
1004
+                $avant = calculer_liste($p->avant,
1005
+                    $newdescr, $boucles, $id_boucle);
1006
+                $apres = calculer_liste($p->apres,
1007
+                    $newdescr, $boucles, $id_boucle);
1008
+                $newdescr['niv']--;
1009
+                $altern = calculer_liste($p->altern,
1010
+                    $newdescr, $boucles, $id_boucle);
1011
+                if (($avant === false) or ($apres === false) or ($altern === false)) {
1012
+                    $err_e_c = true;
1013
+                    $code = "''";
1014
+                } else {
1015
+                    $code = 'BOUCLE' .
1016
+                        str_replace("-", "_", $nom) . $descr['nom'] .
1017
+                        '($Cache, $Pile, $doublons, $Numrows, $SP)';
1018
+                    $commentaire = "?$nom";
1019
+                    if (!$boucles[$nom]->milieu
1020
+                        and $boucles[$nom]->type_requete <> TYPE_RECURSIF
1021
+                    ) {
1022
+                        if ($altern != "''") {
1023
+                            $code .= "\n. $altern";
1024
+                        }
1025
+                        if ($avant <> "''" or $apres <> "''") {
1026
+                            spip_log("boucle $nom toujours vide, code superflu dans $descr[sourcefile]");
1027
+                        }
1028
+                        $avant = $apres = $altern = "''";
1029
+                    } else {
1030
+                        if ($altern != "''") {
1031
+                            $altern = "($altern)";
1032
+                        }
1033
+                    }
1034
+                }
1035
+                break;
1036
+
1037
+            case 'idiome':
1038
+                $l = array();
1039
+                $code = '';
1040
+                foreach ($p->arg as $k => $v) {
1041
+                    $_v = calculer_liste($v, $descr, $boucles, $id_boucle);
1042
+                    if ($k) {
1043
+                        $l[] = _q($k) . ' => ' . $_v;
1044
+                    } else {
1045
+                        $code = $_v;
1046
+                    }
1047
+                }
1048
+                // Si le module n'est pas fourni, l'expliciter sauf si calculé
1049
+                if ($p->module) {
1050
+                    $m = $p->module . ':' . $p->nom_champ;
1051
+                } elseif ($p->nom_champ) {
1052
+                    $m = MODULES_IDIOMES . ':' . $p->nom_champ;
1053
+                } else {
1054
+                    $m = '';
1055
+                }
1056
+
1057
+                $code = (!$code ? "'$m'" :
1058
+                        ($m ? "'$m' . $code" :
1059
+                            ("(strpos(\$x=$code, ':') ? \$x : ('" . MODULES_IDIOMES . ":' . \$x))")))
1060
+                    . (!$l ? '' : (", array(" . implode(",\n", $l) . ")"));
1061
+                $code = "_T($code)";
1062
+                if ($p->param) {
1063
+                    $p->id_boucle = $id_boucle;
1064
+                    $p->boucles = &$boucles;
1065
+                    $code = compose_filtres($p, $code);
1066
+                }
1067
+                $commentaire = ":";
1068
+                $avant = '';
1069
+                $apres = '';
1070
+                $altern = "''";
1071
+                break;
1072
+
1073
+            case 'champ':
1074
+
1075
+                // cette structure pourrait etre completee des le phrase' (a faire)
1076
+                $p->id_boucle = $id_boucle;
1077
+                $p->boucles = &$boucles;
1078
+                $p->descr = $descr;
1079
+                #$p->interdire_scripts = true;
1080
+                $p->type_requete = $type;
1081
+
1082
+                $code = calculer_champ($p);
1083
+                $commentaire = '#' . $p->nom_champ . $p->etoile;
1084
+                $avant = calculer_liste($p->avant,
1085
+                    $descr, $boucles, $id_boucle);
1086
+                $apres = calculer_liste($p->apres,
1087
+                    $descr, $boucles, $id_boucle);
1088
+                $altern = "''";
1089
+                // Si la valeur est destinee a une comparaison a ''
1090
+                // forcer la conversion en une chaine par strval
1091
+                // si ca peut etre autre chose qu'une chaine
1092
+                if (($avant != "''" or $apres != "''")
1093
+                    and $code[0] != "'"
1094 1094
 #			AND (strpos($code,'interdire_scripts') !== 0)
1095
-					and !preg_match(_REGEXP_COND_VIDE_NONVIDE, $code)
1096
-					and !preg_match(_REGEXP_COND_NONVIDE_VIDE, $code)
1097
-					and !preg_match(_REGEXP_CONCAT_NON_VIDE, $code)
1098
-				) {
1099
-					$code = "strval($code)";
1100
-				}
1101
-				break;
1102
-
1103
-			default:
1104
-				// Erreur de construction de l'arbre de syntaxe abstraite
1105
-				$code = "''";
1106
-				$p->descr = $descr;
1107
-				$err_e_c = _T('zbug_erreur_compilation');
1108
-				erreur_squelette($err_e_c, $p);
1109
-		} // switch
1110
-
1111
-		if ($code != "''") {
1112
-			$code = compile_retour($code, $avant, $apres, $altern, $tab, $descr['niv']);
1113
-			$codes[] = (($mode == 'validation') ?
1114
-				"array($code, '$commentaire', " . $p->ligne . ")"
1115
-				: (($mode == 'code') ?
1116
-					"\n// $commentaire\n$code" :
1117
-					$code));
1118
-		}
1119
-	} // foreach
1120
-
1121
-	return $err_e_c ? false : $codes;
1095
+                    and !preg_match(_REGEXP_COND_VIDE_NONVIDE, $code)
1096
+                    and !preg_match(_REGEXP_COND_NONVIDE_VIDE, $code)
1097
+                    and !preg_match(_REGEXP_CONCAT_NON_VIDE, $code)
1098
+                ) {
1099
+                    $code = "strval($code)";
1100
+                }
1101
+                break;
1102
+
1103
+            default:
1104
+                // Erreur de construction de l'arbre de syntaxe abstraite
1105
+                $code = "''";
1106
+                $p->descr = $descr;
1107
+                $err_e_c = _T('zbug_erreur_compilation');
1108
+                erreur_squelette($err_e_c, $p);
1109
+        } // switch
1110
+
1111
+        if ($code != "''") {
1112
+            $code = compile_retour($code, $avant, $apres, $altern, $tab, $descr['niv']);
1113
+            $codes[] = (($mode == 'validation') ?
1114
+                "array($code, '$commentaire', " . $p->ligne . ")"
1115
+                : (($mode == 'code') ?
1116
+                    "\n// $commentaire\n$code" :
1117
+                    $code));
1118
+        }
1119
+    } // foreach
1120
+
1121
+    return $err_e_c ? false : $codes;
1122 1122
 }
1123 1123
 
1124 1124
 // production d'une expression conditionnelle ((v=EXP) ? (p . v .s) : a)
@@ -1127,56 +1127,56 @@  discard block
 block discarded – undo
1127 1127
 
1128 1128
 // http://code.spip.net/@compile_retour
1129 1129
 function compile_retour($code, $avant, $apres, $altern, $tab, $n) {
1130
-	if ($avant == "''") {
1131
-		$avant = '';
1132
-	}
1133
-	if ($apres == "''") {
1134
-		$apres = '';
1135
-	}
1136
-	if (!$avant and !$apres and ($altern === "''")) {
1137
-		return $code;
1138
-	}
1139
-
1140
-	if (preg_match(_REGEXP_CONCAT_NON_VIDE, $code)) {
1141
-		$t = $code;
1142
-		$cond = '';
1143
-	} elseif (preg_match(_REGEXP_COND_VIDE_NONVIDE, $code, $r)) {
1144
-		$t = $r[2];
1145
-		$cond = '!' . $r[1];
1146
-	} else {
1147
-		if (preg_match(_REGEXP_COND_NONVIDE_VIDE, $code, $r)) {
1148
-			$t = $r[2];
1149
-			$cond = $r[1];
1150
-		} else {
1151
-			$t = '$t' . $n;
1152
-			$cond = "($t = $code)!==''";
1153
-		}
1154
-	}
1155
-
1156
-	$res = (!$avant ? "" : "$avant . ") .
1157
-		$t .
1158
-		(!$apres ? "" : " . $apres");
1159
-
1160
-	if ($res !== $t) {
1161
-		$res = "($res)";
1162
-	}
1163
-
1164
-	return !$cond ? $res : "($cond ?\n\t$tab$res :\n\t$tab$altern)";
1130
+    if ($avant == "''") {
1131
+        $avant = '';
1132
+    }
1133
+    if ($apres == "''") {
1134
+        $apres = '';
1135
+    }
1136
+    if (!$avant and !$apres and ($altern === "''")) {
1137
+        return $code;
1138
+    }
1139
+
1140
+    if (preg_match(_REGEXP_CONCAT_NON_VIDE, $code)) {
1141
+        $t = $code;
1142
+        $cond = '';
1143
+    } elseif (preg_match(_REGEXP_COND_VIDE_NONVIDE, $code, $r)) {
1144
+        $t = $r[2];
1145
+        $cond = '!' . $r[1];
1146
+    } else {
1147
+        if (preg_match(_REGEXP_COND_NONVIDE_VIDE, $code, $r)) {
1148
+            $t = $r[2];
1149
+            $cond = $r[1];
1150
+        } else {
1151
+            $t = '$t' . $n;
1152
+            $cond = "($t = $code)!==''";
1153
+        }
1154
+    }
1155
+
1156
+    $res = (!$avant ? "" : "$avant . ") .
1157
+        $t .
1158
+        (!$apres ? "" : " . $apres");
1159
+
1160
+    if ($res !== $t) {
1161
+        $res = "($res)";
1162
+    }
1163
+
1164
+    return !$cond ? $res : "($cond ?\n\t$tab$res :\n\t$tab$altern)";
1165 1165
 }
1166 1166
 
1167 1167
 
1168 1168
 function compile_inclure_doublons($lexemes) {
1169
-	foreach ($lexemes as $v) {
1170
-		if ($v->type === 'include' and $v->param) {
1171
-			foreach ($v->param as $r) {
1172
-				if (trim($r[0]) === 'doublons') {
1173
-					return true;
1174
-				}
1175
-			}
1176
-		}
1177
-	}
1178
-
1179
-	return false;
1169
+    foreach ($lexemes as $v) {
1170
+        if ($v->type === 'include' and $v->param) {
1171
+            foreach ($v->param as $r) {
1172
+                if (trim($r[0]) === 'doublons') {
1173
+                    return true;
1174
+                }
1175
+            }
1176
+        }
1177
+    }
1178
+
1179
+    return false;
1180 1180
 }
1181 1181
 
1182 1182
 // Prend en argument le texte d'un squelette, le nom de son fichier d'origine,
@@ -1196,348 +1196,348 @@  discard block
 block discarded – undo
1196 1196
 
1197 1197
 // http://code.spip.net/@public_compiler_dist
1198 1198
 function public_compiler_dist($squelette, $nom, $gram, $sourcefile, $connect = '') {
1199
-	// Pre-traitement : reperer le charset du squelette, et le convertir
1200
-	// Bonus : supprime le BOM
1201
-	include_spip('inc/charsets');
1202
-	$squelette = transcoder_page($squelette);
1203
-
1204
-	// rendre inertes les echappements de #[](){}<>
1205
-	$i = 0;
1206
-	while (false !== strpos($squelette, $inerte = '-INERTE' . $i)) {
1207
-		$i++;
1208
-	}
1209
-	$squelette = preg_replace_callback(',\\\\([#[()\]{}<>]),',
1210
-		function($a) use ($inerte) {
1211
-			return "$inerte-" . ord($a[1]) . '-';
1212
-		},
1213
-		$squelette,
1214
-		-1,
1215
-		$esc
1216
-	);
1217
-
1218
-	$descr = array(
1219
-		'nom' => $nom,
1220
-		'gram' => $gram,
1221
-		'sourcefile' => $sourcefile,
1222
-		'squelette' => $squelette
1223
-	);
1224
-
1225
-	// Phraser le squelette, selon sa grammaire
1226
-
1227
-	$boucles = array();
1228
-	$f = charger_fonction('phraser_' . $gram, 'public');
1229
-
1230
-	$squelette = $f($squelette, '', $boucles, $descr);
1231
-
1232
-	$boucles = compiler_squelette($squelette, $boucles, $nom, $descr, $sourcefile, $connect);
1233
-
1234
-	// restituer les echappements
1235
-	if ($esc) {
1236
-		foreach ($boucles as $i => $boucle) {
1237
-			$boucles[$i]->return = preg_replace_callback(
1238
-				",$inerte-(\d+)-,",
1239
-				function($a) {
1240
-					return chr($a[1]);
1241
-				},
1242
-				$boucle->return
1243
-			);
1244
-			$boucles[$i]->descr['squelette'] = preg_replace_callback(
1245
-				",$inerte-(\d+)-,",
1246
-				function($a) {
1247
-					return "\\\\" . chr($a[1]);
1248
-				},
1249
-				$boucle->descr['squelette']
1250
-			);
1251
-		}
1252
-	}
1253
-
1254
-	$debug = ($boucles and defined('_VAR_MODE') and _VAR_MODE == 'debug');
1255
-	if ($debug) {
1256
-		include_spip('public/decompiler');
1257
-		foreach ($boucles as $id => $boucle) {
1258
-			if ($id) {
1259
-				$decomp = "\n/* BOUCLE " .
1260
-					$boucle->type_requete .
1261
-					" " .
1262
-					str_replace('*/', '* /', public_decompiler($boucle, $gram, 0, 'criteres')) .
1263
-					($boucle->debug ? "\n *\n * " . implode("\n * ", $boucle->debug) . "\n" : '') .
1264
-					" */\n";
1265
-			} else {
1266
-				$decomp = ("\n/*\n" .
1267
-					str_replace('*/', '* /', public_decompiler($squelette, $gram))
1268
-					. "\n*/");
1269
-			}
1270
-			$boucles[$id]->return = $decomp . $boucle->return;
1271
-			$GLOBALS['debug_objets']['code'][$nom . $id] = $boucle->return;
1272
-		}
1273
-	}
1274
-
1275
-	return $boucles;
1199
+    // Pre-traitement : reperer le charset du squelette, et le convertir
1200
+    // Bonus : supprime le BOM
1201
+    include_spip('inc/charsets');
1202
+    $squelette = transcoder_page($squelette);
1203
+
1204
+    // rendre inertes les echappements de #[](){}<>
1205
+    $i = 0;
1206
+    while (false !== strpos($squelette, $inerte = '-INERTE' . $i)) {
1207
+        $i++;
1208
+    }
1209
+    $squelette = preg_replace_callback(',\\\\([#[()\]{}<>]),',
1210
+        function($a) use ($inerte) {
1211
+            return "$inerte-" . ord($a[1]) . '-';
1212
+        },
1213
+        $squelette,
1214
+        -1,
1215
+        $esc
1216
+    );
1217
+
1218
+    $descr = array(
1219
+        'nom' => $nom,
1220
+        'gram' => $gram,
1221
+        'sourcefile' => $sourcefile,
1222
+        'squelette' => $squelette
1223
+    );
1224
+
1225
+    // Phraser le squelette, selon sa grammaire
1226
+
1227
+    $boucles = array();
1228
+    $f = charger_fonction('phraser_' . $gram, 'public');
1229
+
1230
+    $squelette = $f($squelette, '', $boucles, $descr);
1231
+
1232
+    $boucles = compiler_squelette($squelette, $boucles, $nom, $descr, $sourcefile, $connect);
1233
+
1234
+    // restituer les echappements
1235
+    if ($esc) {
1236
+        foreach ($boucles as $i => $boucle) {
1237
+            $boucles[$i]->return = preg_replace_callback(
1238
+                ",$inerte-(\d+)-,",
1239
+                function($a) {
1240
+                    return chr($a[1]);
1241
+                },
1242
+                $boucle->return
1243
+            );
1244
+            $boucles[$i]->descr['squelette'] = preg_replace_callback(
1245
+                ",$inerte-(\d+)-,",
1246
+                function($a) {
1247
+                    return "\\\\" . chr($a[1]);
1248
+                },
1249
+                $boucle->descr['squelette']
1250
+            );
1251
+        }
1252
+    }
1253
+
1254
+    $debug = ($boucles and defined('_VAR_MODE') and _VAR_MODE == 'debug');
1255
+    if ($debug) {
1256
+        include_spip('public/decompiler');
1257
+        foreach ($boucles as $id => $boucle) {
1258
+            if ($id) {
1259
+                $decomp = "\n/* BOUCLE " .
1260
+                    $boucle->type_requete .
1261
+                    " " .
1262
+                    str_replace('*/', '* /', public_decompiler($boucle, $gram, 0, 'criteres')) .
1263
+                    ($boucle->debug ? "\n *\n * " . implode("\n * ", $boucle->debug) . "\n" : '') .
1264
+                    " */\n";
1265
+            } else {
1266
+                $decomp = ("\n/*\n" .
1267
+                    str_replace('*/', '* /', public_decompiler($squelette, $gram))
1268
+                    . "\n*/");
1269
+            }
1270
+            $boucles[$id]->return = $decomp . $boucle->return;
1271
+            $GLOBALS['debug_objets']['code'][$nom . $id] = $boucle->return;
1272
+        }
1273
+    }
1274
+
1275
+    return $boucles;
1276 1276
 }
1277 1277
 
1278 1278
 // Point d'entree pour arbre de syntaxe abstraite fourni en premier argument
1279 1279
 // Autres specifications comme ci-dessus
1280 1280
 
1281 1281
 function compiler_squelette($squelette, $boucles, $nom, $descr, $sourcefile, $connect = '') {
1282
-	static $trouver_table;
1283
-	spip_timer('calcul_skel');
1284
-
1285
-	if (defined('_VAR_MODE') and _VAR_MODE == 'debug') {
1286
-		$GLOBALS['debug_objets']['squelette'][$nom] = $descr['squelette'];
1287
-		$GLOBALS['debug_objets']['sourcefile'][$nom] = $sourcefile;
1288
-
1289
-		if (!isset($GLOBALS['debug_objets']['principal'])) {
1290
-			$GLOBALS['debug_objets']['principal'] = $nom;
1291
-		}
1292
-	}
1293
-	foreach ($boucles as $id => $boucle) {
1294
-		$GLOBALS['debug_objets']['boucle'][$nom . $id] = $boucle;
1295
-	}
1296
-	$descr['documents'] = compile_inclure_doublons($squelette);
1297
-
1298
-	// Demander la description des tables une fois pour toutes
1299
-	if (!$trouver_table) {
1300
-		$trouver_table = charger_fonction('trouver_table', 'base');
1301
-	}
1302
-
1303
-	// reperer si les doublons sont demandes
1304
-	// pour un inclure ou une boucle document
1305
-	// c'est utile a la fonction champs_traitements
1306
-	foreach ($boucles as $id => $boucle) {
1307
-		if (!($type = $boucle->type_requete)) {
1308
-			continue;
1309
-		}
1310
-		if (!$descr['documents'] and (
1311
-				(($type == 'documents') and $boucle->doublons) or
1312
-				compile_inclure_doublons($boucle->avant) or
1313
-				compile_inclure_doublons($boucle->apres) or
1314
-				compile_inclure_doublons($boucle->milieu) or
1315
-				compile_inclure_doublons($boucle->altern))
1316
-		) {
1317
-			$descr['documents'] = true;
1318
-		}
1319
-		if ($type != TYPE_RECURSIF) {
1320
-			if (!$boucles[$id]->sql_serveur and $connect) {
1321
-				$boucles[$id]->sql_serveur = $connect;
1322
-			}
1323
-
1324
-			// chercher dans les iterateurs du repertoire iterateur/
1325
-			if ($g = charger_fonction(
1326
-				preg_replace('/\W/', '_', $boucle->type_requete), 'iterateur', true)
1327
-			) {
1328
-				$boucles[$id] = $g($boucle);
1329
-
1330
-				// sinon, en cas de requeteur d'un type predefini,
1331
-				// utiliser les informations donnees par le requeteur
1332
-				// cas "php:xx" et "data:xx".
1333
-			} else {
1334
-				if ($boucle->sql_serveur and $requeteur = charger_fonction($boucle->sql_serveur, 'requeteur', true)) {
1335
-					$requeteur($boucles, $boucle, $id);
1336
-
1337
-					// utiliser la description des champs transmis
1338
-				} else {
1339
-					$show = $trouver_table($type, $boucles[$id]->sql_serveur);
1340
-					// si la table n'existe pas avec le connecteur par defaut,
1341
-					// c'est peut etre une table qui necessite son connecteur dedie fourni
1342
-					// permet une ecriture allegee (GEO) -> (geo:GEO)
1343
-					if (!$show
1344
-						and $show = $trouver_table($type, strtolower($type))
1345
-					) {
1346
-						$boucles[$id]->sql_serveur = strtolower($type);
1347
-					}
1348
-					if ($show) {
1349
-						$boucles[$id]->show = $show;
1350
-						// recopie les infos les plus importantes
1351
-						$boucles[$id]->primary = isset($show['key']["PRIMARY KEY"]) ? $show['key']["PRIMARY KEY"] : '';
1352
-						$boucles[$id]->id_table = $x = preg_replace(",^spip_,", "", $show['id_table']);
1353
-						$boucles[$id]->from[$x] = $nom_table = $show['table'];
1354
-						$boucles[$id]->iterateur = 'SQL';
1355
-
1356
-						if (empty($boucles[$id]->descr)) {
1357
-							$boucles[$id]->descr = &$descr;
1358
-						}
1359
-						if ((!$boucles[$id]->jointures)
1360
-							and is_array($show['tables_jointures'])
1361
-							and count($x = $show['tables_jointures'])
1362
-						) {
1363
-							$boucles[$id]->jointures = $x;
1364
-						}
1365
-						if ($boucles[$id]->jointures_explicites) {
1366
-							$jointures = preg_split("/\s+/", $boucles[$id]->jointures_explicites);
1367
-							while ($j = array_pop($jointures)) {
1368
-								array_unshift($boucles[$id]->jointures, $j);
1369
-							}
1370
-						}
1371
-					} else {
1372
-						// Pas une erreur si la table est optionnelle
1373
-						if ($boucles[$id]->table_optionnelle) {
1374
-							$boucles[$id]->type_requete = '';
1375
-						} else {
1376
-							$boucles[$id]->type_requete = false;
1377
-							$boucle = $boucles[$id];
1378
-							$x = (!$boucle->sql_serveur ? '' :
1379
-									($boucle->sql_serveur . ":")) .
1380
-								$type;
1381
-							$msg = array(
1382
-								'zbug_table_inconnue',
1383
-								array('table' => $x)
1384
-							);
1385
-							erreur_squelette($msg, $boucle);
1386
-						}
1387
-					}
1388
-				}
1389
-			}
1390
-		}
1391
-	}
1392
-
1393
-	// Commencer par reperer les boucles appelees explicitement 
1394
-	// car elles indexent les arguments de maniere derogatoire
1395
-	foreach ($boucles as $id => $boucle) {
1396
-		if ($boucle->type_requete == TYPE_RECURSIF and $boucle->param) {
1397
-			$boucles[$id]->descr = &$descr;
1398
-			$rec = &$boucles[$boucle->param[0]];
1399
-			if (!$rec) {
1400
-				$msg = array(
1401
-					'zbug_boucle_recursive_undef',
1402
-					array('nom' => $boucle->param[0])
1403
-				);
1404
-				erreur_squelette($msg, $boucle);
1405
-				$boucles[$id]->type_requete = false;
1406
-			} else {
1407
-				$rec->externe = $id;
1408
-				$descr['id_mere'] = $id;
1409
-				$boucles[$id]->return =
1410
-					calculer_liste(array($rec),
1411
-						$descr,
1412
-						$boucles,
1413
-						$boucle->param);
1414
-			}
1415
-		}
1416
-	}
1417
-	foreach ($boucles as $id => $boucle) {
1418
-		$id = strval($id); // attention au type dans index_pile
1419
-		$type = $boucle->type_requete;
1420
-		if ($type and $type != TYPE_RECURSIF) {
1421
-			$res = '';
1422
-			if ($boucle->param) {
1423
-				// retourne un tableau en cas d'erreur
1424
-				$res = calculer_criteres($id, $boucles);
1425
-			}
1426
-			$descr['id_mere'] = $id;
1427
-			$boucles[$id]->return =
1428
-				calculer_liste($boucle->milieu,
1429
-					$descr,
1430
-					$boucles,
1431
-					$id);
1432
-			// Si les criteres se sont mal compiles
1433
-			// ne pas tenter d'assembler le code final
1434
-			// (mais compiler le corps pour detection d'erreurs)
1435
-			if (is_array($res)) {
1436
-				$boucles[$id]->type_requete = false;
1437
-			}
1438
-		}
1439
-	}
1440
-
1441
-	// idem pour la racine
1442
-	$descr['id_mere'] = '';
1443
-	$corps = calculer_liste($squelette, $descr, $boucles);
1444
-
1445
-
1446
-	// Calcul du corps de toutes les fonctions PHP,
1447
-	// en particulier les requetes SQL et TOTAL_BOUCLE
1448
-	// de'terminables seulement maintenant
1449
-
1450
-	foreach ($boucles as $id => $boucle) {
1451
-		$boucle = $boucles[$id] = pipeline('pre_boucle', $boucle);
1452
-		if ($boucle->return === false) {
1453
-			$corps = false;
1454
-			continue;
1455
-		}
1456
-		// appeler la fonction de definition de la boucle
1457
-
1458
-		if ($req = $boucle->type_requete) {
1459
-			// boucle personnalisée ?
1460
-			$table = strtoupper($boucle->type_requete);
1461
-			$serveur = strtolower($boucle->sql_serveur);
1462
-			if (
1463
-				// fonction de boucle avec serveur & table
1464
-				(!$serveur or
1465
-					((!function_exists($f = "boucle_" . $serveur . "_" . $table))
1466
-						and (!function_exists($f = $f . "_dist"))
1467
-					)
1468
-				)
1469
-				// fonction de boucle avec table
1470
-				and (!function_exists($f = "boucle_" . $table))
1471
-				and (!function_exists($f = $f . "_dist"))
1472
-			) {
1473
-				// fonction de boucle standard 
1474
-				if (!function_exists($f = 'boucle_DEFAUT')) {
1475
-					$f = 'boucle_DEFAUT_dist';
1476
-				}
1477
-			}
1478
-
1479
-			$req = "\n\n\tstatic \$command = array();\n\t" .
1480
-				"static \$connect;\n\t" .
1481
-				"\$command['connect'] = \$connect = " .
1482
-				_q($boucle->sql_serveur) .
1483
-				";" .
1484
-				$f($id, $boucles);
1485
-		} else {
1486
-			$req = ("\n\treturn '';");
1487
-		}
1488
-
1489
-		$boucles[$id]->return =
1490
-			"\n\nfunction BOUCLE" . strtr($id, "-", "_") . $nom .
1491
-			'(&$Cache, &$Pile, &$doublons, &$Numrows, $SP) {' .
1492
-			$req .
1493
-			"\n}\n";
1494
-	}
1495
-
1496
-	// Au final, si le corps ou un critere au moins s'est mal compile
1497
-	// retourner False, sinon inserer leur decompilation
1498
-	if (is_bool($corps)) {
1499
-		return false;
1500
-	}
1501
-
1502
-	$principal = "\nfunction " . $nom . '($Cache, $Pile, $doublons = array(), $Numrows = array(), $SP = 0) {
1282
+    static $trouver_table;
1283
+    spip_timer('calcul_skel');
1284
+
1285
+    if (defined('_VAR_MODE') and _VAR_MODE == 'debug') {
1286
+        $GLOBALS['debug_objets']['squelette'][$nom] = $descr['squelette'];
1287
+        $GLOBALS['debug_objets']['sourcefile'][$nom] = $sourcefile;
1288
+
1289
+        if (!isset($GLOBALS['debug_objets']['principal'])) {
1290
+            $GLOBALS['debug_objets']['principal'] = $nom;
1291
+        }
1292
+    }
1293
+    foreach ($boucles as $id => $boucle) {
1294
+        $GLOBALS['debug_objets']['boucle'][$nom . $id] = $boucle;
1295
+    }
1296
+    $descr['documents'] = compile_inclure_doublons($squelette);
1297
+
1298
+    // Demander la description des tables une fois pour toutes
1299
+    if (!$trouver_table) {
1300
+        $trouver_table = charger_fonction('trouver_table', 'base');
1301
+    }
1302
+
1303
+    // reperer si les doublons sont demandes
1304
+    // pour un inclure ou une boucle document
1305
+    // c'est utile a la fonction champs_traitements
1306
+    foreach ($boucles as $id => $boucle) {
1307
+        if (!($type = $boucle->type_requete)) {
1308
+            continue;
1309
+        }
1310
+        if (!$descr['documents'] and (
1311
+                (($type == 'documents') and $boucle->doublons) or
1312
+                compile_inclure_doublons($boucle->avant) or
1313
+                compile_inclure_doublons($boucle->apres) or
1314
+                compile_inclure_doublons($boucle->milieu) or
1315
+                compile_inclure_doublons($boucle->altern))
1316
+        ) {
1317
+            $descr['documents'] = true;
1318
+        }
1319
+        if ($type != TYPE_RECURSIF) {
1320
+            if (!$boucles[$id]->sql_serveur and $connect) {
1321
+                $boucles[$id]->sql_serveur = $connect;
1322
+            }
1323
+
1324
+            // chercher dans les iterateurs du repertoire iterateur/
1325
+            if ($g = charger_fonction(
1326
+                preg_replace('/\W/', '_', $boucle->type_requete), 'iterateur', true)
1327
+            ) {
1328
+                $boucles[$id] = $g($boucle);
1329
+
1330
+                // sinon, en cas de requeteur d'un type predefini,
1331
+                // utiliser les informations donnees par le requeteur
1332
+                // cas "php:xx" et "data:xx".
1333
+            } else {
1334
+                if ($boucle->sql_serveur and $requeteur = charger_fonction($boucle->sql_serveur, 'requeteur', true)) {
1335
+                    $requeteur($boucles, $boucle, $id);
1336
+
1337
+                    // utiliser la description des champs transmis
1338
+                } else {
1339
+                    $show = $trouver_table($type, $boucles[$id]->sql_serveur);
1340
+                    // si la table n'existe pas avec le connecteur par defaut,
1341
+                    // c'est peut etre une table qui necessite son connecteur dedie fourni
1342
+                    // permet une ecriture allegee (GEO) -> (geo:GEO)
1343
+                    if (!$show
1344
+                        and $show = $trouver_table($type, strtolower($type))
1345
+                    ) {
1346
+                        $boucles[$id]->sql_serveur = strtolower($type);
1347
+                    }
1348
+                    if ($show) {
1349
+                        $boucles[$id]->show = $show;
1350
+                        // recopie les infos les plus importantes
1351
+                        $boucles[$id]->primary = isset($show['key']["PRIMARY KEY"]) ? $show['key']["PRIMARY KEY"] : '';
1352
+                        $boucles[$id]->id_table = $x = preg_replace(",^spip_,", "", $show['id_table']);
1353
+                        $boucles[$id]->from[$x] = $nom_table = $show['table'];
1354
+                        $boucles[$id]->iterateur = 'SQL';
1355
+
1356
+                        if (empty($boucles[$id]->descr)) {
1357
+                            $boucles[$id]->descr = &$descr;
1358
+                        }
1359
+                        if ((!$boucles[$id]->jointures)
1360
+                            and is_array($show['tables_jointures'])
1361
+                            and count($x = $show['tables_jointures'])
1362
+                        ) {
1363
+                            $boucles[$id]->jointures = $x;
1364
+                        }
1365
+                        if ($boucles[$id]->jointures_explicites) {
1366
+                            $jointures = preg_split("/\s+/", $boucles[$id]->jointures_explicites);
1367
+                            while ($j = array_pop($jointures)) {
1368
+                                array_unshift($boucles[$id]->jointures, $j);
1369
+                            }
1370
+                        }
1371
+                    } else {
1372
+                        // Pas une erreur si la table est optionnelle
1373
+                        if ($boucles[$id]->table_optionnelle) {
1374
+                            $boucles[$id]->type_requete = '';
1375
+                        } else {
1376
+                            $boucles[$id]->type_requete = false;
1377
+                            $boucle = $boucles[$id];
1378
+                            $x = (!$boucle->sql_serveur ? '' :
1379
+                                    ($boucle->sql_serveur . ":")) .
1380
+                                $type;
1381
+                            $msg = array(
1382
+                                'zbug_table_inconnue',
1383
+                                array('table' => $x)
1384
+                            );
1385
+                            erreur_squelette($msg, $boucle);
1386
+                        }
1387
+                    }
1388
+                }
1389
+            }
1390
+        }
1391
+    }
1392
+
1393
+    // Commencer par reperer les boucles appelees explicitement 
1394
+    // car elles indexent les arguments de maniere derogatoire
1395
+    foreach ($boucles as $id => $boucle) {
1396
+        if ($boucle->type_requete == TYPE_RECURSIF and $boucle->param) {
1397
+            $boucles[$id]->descr = &$descr;
1398
+            $rec = &$boucles[$boucle->param[0]];
1399
+            if (!$rec) {
1400
+                $msg = array(
1401
+                    'zbug_boucle_recursive_undef',
1402
+                    array('nom' => $boucle->param[0])
1403
+                );
1404
+                erreur_squelette($msg, $boucle);
1405
+                $boucles[$id]->type_requete = false;
1406
+            } else {
1407
+                $rec->externe = $id;
1408
+                $descr['id_mere'] = $id;
1409
+                $boucles[$id]->return =
1410
+                    calculer_liste(array($rec),
1411
+                        $descr,
1412
+                        $boucles,
1413
+                        $boucle->param);
1414
+            }
1415
+        }
1416
+    }
1417
+    foreach ($boucles as $id => $boucle) {
1418
+        $id = strval($id); // attention au type dans index_pile
1419
+        $type = $boucle->type_requete;
1420
+        if ($type and $type != TYPE_RECURSIF) {
1421
+            $res = '';
1422
+            if ($boucle->param) {
1423
+                // retourne un tableau en cas d'erreur
1424
+                $res = calculer_criteres($id, $boucles);
1425
+            }
1426
+            $descr['id_mere'] = $id;
1427
+            $boucles[$id]->return =
1428
+                calculer_liste($boucle->milieu,
1429
+                    $descr,
1430
+                    $boucles,
1431
+                    $id);
1432
+            // Si les criteres se sont mal compiles
1433
+            // ne pas tenter d'assembler le code final
1434
+            // (mais compiler le corps pour detection d'erreurs)
1435
+            if (is_array($res)) {
1436
+                $boucles[$id]->type_requete = false;
1437
+            }
1438
+        }
1439
+    }
1440
+
1441
+    // idem pour la racine
1442
+    $descr['id_mere'] = '';
1443
+    $corps = calculer_liste($squelette, $descr, $boucles);
1444
+
1445
+
1446
+    // Calcul du corps de toutes les fonctions PHP,
1447
+    // en particulier les requetes SQL et TOTAL_BOUCLE
1448
+    // de'terminables seulement maintenant
1449
+
1450
+    foreach ($boucles as $id => $boucle) {
1451
+        $boucle = $boucles[$id] = pipeline('pre_boucle', $boucle);
1452
+        if ($boucle->return === false) {
1453
+            $corps = false;
1454
+            continue;
1455
+        }
1456
+        // appeler la fonction de definition de la boucle
1457
+
1458
+        if ($req = $boucle->type_requete) {
1459
+            // boucle personnalisée ?
1460
+            $table = strtoupper($boucle->type_requete);
1461
+            $serveur = strtolower($boucle->sql_serveur);
1462
+            if (
1463
+                // fonction de boucle avec serveur & table
1464
+                (!$serveur or
1465
+                    ((!function_exists($f = "boucle_" . $serveur . "_" . $table))
1466
+                        and (!function_exists($f = $f . "_dist"))
1467
+                    )
1468
+                )
1469
+                // fonction de boucle avec table
1470
+                and (!function_exists($f = "boucle_" . $table))
1471
+                and (!function_exists($f = $f . "_dist"))
1472
+            ) {
1473
+                // fonction de boucle standard 
1474
+                if (!function_exists($f = 'boucle_DEFAUT')) {
1475
+                    $f = 'boucle_DEFAUT_dist';
1476
+                }
1477
+            }
1478
+
1479
+            $req = "\n\n\tstatic \$command = array();\n\t" .
1480
+                "static \$connect;\n\t" .
1481
+                "\$command['connect'] = \$connect = " .
1482
+                _q($boucle->sql_serveur) .
1483
+                ";" .
1484
+                $f($id, $boucles);
1485
+        } else {
1486
+            $req = ("\n\treturn '';");
1487
+        }
1488
+
1489
+        $boucles[$id]->return =
1490
+            "\n\nfunction BOUCLE" . strtr($id, "-", "_") . $nom .
1491
+            '(&$Cache, &$Pile, &$doublons, &$Numrows, $SP) {' .
1492
+            $req .
1493
+            "\n}\n";
1494
+    }
1495
+
1496
+    // Au final, si le corps ou un critere au moins s'est mal compile
1497
+    // retourner False, sinon inserer leur decompilation
1498
+    if (is_bool($corps)) {
1499
+        return false;
1500
+    }
1501
+
1502
+    $principal = "\nfunction " . $nom . '($Cache, $Pile, $doublons = array(), $Numrows = array(), $SP = 0) {
1503 1503
 '
1504
-		// reporter de maniere securisee les doublons inclus
1505
-		. '
1504
+        // reporter de maniere securisee les doublons inclus
1505
+        . '
1506 1506
 	if (isset($Pile[0]["doublons"]) AND is_array($Pile[0]["doublons"]))
1507 1507
 		$doublons = nettoyer_env_doublons($Pile[0]["doublons"]);
1508 1508
 
1509 1509
 	$connect = ' .
1510
-		_q($connect) . ';
1510
+        _q($connect) . ';
1511 1511
 	$page = ' .
1512
-		// ATTENTION, le calcul de l'expression $corps affectera $Cache
1513
-		// c'est pourquoi on l'affecte a la variable auxiliaire $page.
1514
-		// avant de referencer $Cache
1515
-		$corps . ";
1512
+        // ATTENTION, le calcul de l'expression $corps affectera $Cache
1513
+        // c'est pourquoi on l'affecte a la variable auxiliaire $page.
1514
+        // avant de referencer $Cache
1515
+        $corps . ";
1516 1516
 
1517 1517
 	return analyse_resultat_skel(" . var_export($nom, true)
1518
-		. ", \$Cache, \$page, " . var_export($sourcefile, true) . ");
1518
+        . ", \$Cache, \$page, " . var_export($sourcefile, true) . ");
1519 1519
 }";
1520 1520
 
1521
-	$secondes = spip_timer('calcul_skel');
1522
-	spip_log("COMPIL ($secondes) [$sourcefile] $nom.php");
1523
-	// $connect n'est pas sûr : on nettoie
1524
-	$connect = preg_replace(',[^\w],', '', $connect);
1521
+    $secondes = spip_timer('calcul_skel');
1522
+    spip_log("COMPIL ($secondes) [$sourcefile] $nom.php");
1523
+    // $connect n'est pas sûr : on nettoie
1524
+    $connect = preg_replace(',[^\w],', '', $connect);
1525 1525
 
1526
-	// Assimiler la fct principale a une boucle anonyme, pour retourner un resultat simple
1527
-	$code = new Boucle;
1528
-	$code->descr = $descr;
1529
-	$code->return = '
1526
+    // Assimiler la fct principale a une boucle anonyme, pour retourner un resultat simple
1527
+    $code = new Boucle;
1528
+    $code->descr = $descr;
1529
+    $code->return = '
1530 1530
 //
1531 1531
 // Fonction principale du squelette ' .
1532
-		$sourcefile .
1533
-		($connect ? " pour $connect" : '') .
1534
-		(!CODE_COMMENTE ? '' : "\n// Temps de compilation total: $secondes") .
1535
-		"\n//\n" .
1536
-		$principal;
1532
+        $sourcefile .
1533
+        ($connect ? " pour $connect" : '') .
1534
+        (!CODE_COMMENTE ? '' : "\n// Temps de compilation total: $secondes") .
1535
+        "\n//\n" .
1536
+        $principal;
1537 1537
 
1538
-	$boucles[''] = $code;
1538
+    $boucles[''] = $code;
1539 1539
 
1540
-	return $boucles;
1540
+    return $boucles;
1541 1541
 }
1542 1542
 
1543 1543
 
@@ -1554,18 +1554,18 @@  discard block
 block discarded – undo
1554 1554
  *
1555 1555
  **/
1556 1556
 function requeteur_php_dist(&$boucles, &$boucle, &$id) {
1557
-	if (class_exists($boucle->type_requete)) {
1558
-		$g = charger_fonction('php', 'iterateur');
1559
-		$boucles[$id] = $g($boucle, $boucle->type_requete);
1560
-	} else {
1561
-		$x = $boucle->type_requete;
1562
-		$boucle->type_requete = false;
1563
-		$msg = array(
1564
-			'zbug_iterateur_inconnu',
1565
-			array('iterateur' => $x)
1566
-		);
1567
-		erreur_squelette($msg, $boucle);
1568
-	}
1557
+    if (class_exists($boucle->type_requete)) {
1558
+        $g = charger_fonction('php', 'iterateur');
1559
+        $boucles[$id] = $g($boucle, $boucle->type_requete);
1560
+    } else {
1561
+        $x = $boucle->type_requete;
1562
+        $boucle->type_requete = false;
1563
+        $msg = array(
1564
+            'zbug_iterateur_inconnu',
1565
+            array('iterateur' => $x)
1566
+        );
1567
+        erreur_squelette($msg, $boucle);
1568
+    }
1569 1569
 }
1570 1570
 
1571 1571
 
@@ -1583,23 +1583,23 @@  discard block
 block discarded – undo
1583 1583
  *
1584 1584
  **/
1585 1585
 function requeteur_data_dist(&$boucles, &$boucle, &$id) {
1586
-	include_spip('iterateur/data');
1587
-	if ($h = charger_fonction($boucle->type_requete . '_to_array', 'inc', true)) {
1588
-		$g = charger_fonction('data', 'iterateur');
1589
-		$boucles[$id] = $g($boucle);
1590
-		// from[0] stocke le type de data (rss, yql, ...)
1591
-		$boucles[$id]->from[] = $boucle->type_requete;
1592
-
1593
-	} else {
1594
-		$x = $boucle->type_requete;
1595
-		$boucle->type_requete = false;
1596
-		$msg = array(
1597
-			'zbug_requeteur_inconnu',
1598
-			array(
1599
-				'requeteur' => 'data',
1600
-				'type' => $x
1601
-			)
1602
-		);
1603
-		erreur_squelette($msg, $boucle);
1604
-	}
1586
+    include_spip('iterateur/data');
1587
+    if ($h = charger_fonction($boucle->type_requete . '_to_array', 'inc', true)) {
1588
+        $g = charger_fonction('data', 'iterateur');
1589
+        $boucles[$id] = $g($boucle);
1590
+        // from[0] stocke le type de data (rss, yql, ...)
1591
+        $boucles[$id]->from[] = $boucle->type_requete;
1592
+
1593
+    } else {
1594
+        $x = $boucle->type_requete;
1595
+        $boucle->type_requete = false;
1596
+        $msg = array(
1597
+            'zbug_requeteur_inconnu',
1598
+            array(
1599
+                'requeteur' => 'data',
1600
+                'type' => $x
1601
+            )
1602
+        );
1603
+        erreur_squelette($msg, $boucle);
1604
+    }
1605 1605
 }
Please login to merge, or discard this patch.
Braces   +1 added lines, -2 removed lines patch added patch discarded remove patch
@@ -890,8 +890,7 @@
 block discarded – undo
890 890
 			if (isset($boucles[$idb]->descr['sourcefile'])) {
891 891
 				$descr['sourcefile'] = $boucles[$idb]->descr['sourcefile'];
892 892
 			}
893
-		}
894
-		else {
893
+		} else {
895 894
 			$descr = array();
896 895
 		}
897 896
 	}
Please login to merge, or discard this patch.
ecrire/lang/spip_fr.php 1 patch
Indentation   +662 added lines, -662 removed lines patch added patch discarded remove patch
@@ -2,252 +2,252 @@  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
-	// 0
11
-	'0_URL' => 'http://listes.rezo.net/mailman/listinfo/spip-dev',
12
-	'0_langue' => 'Français [fr]',
13
-	'0_liste' => '[email protected]',
14
-	'0_mainteneur' => '[email protected]',
10
+    // 0
11
+    '0_URL' => 'http://listes.rezo.net/mailman/listinfo/spip-dev',
12
+    '0_langue' => 'Français [fr]',
13
+    '0_liste' => '[email protected]',
14
+    '0_mainteneur' => '[email protected]',
15 15
 
16
-	// A
17
-	'access_interface_graphique' => 'Retour à l’interface graphique complète',
18
-	'access_mode_texte' => 'Afficher l’interface textuelle simplifiée',
19
-	'admin_debug' => 'debug',
20
-	'admin_modifier_article' => 'Modifier cet article',
21
-	'admin_modifier_auteur' => 'Modifier cet auteur',
22
-	'admin_modifier_breve' => 'Modifier cette brève',
23
-	'admin_modifier_mot' => 'Modifier ce mot-clé',
24
-	'admin_modifier_rubrique' => 'Modifier cette rubrique',
25
-	'admin_recalculer' => 'Recalculer cette page',
26
-	'afficher_calendrier' => 'Afficher le calendrier',
27
-	'afficher_trad' => 'afficher les traductions',
28
-	'alerte_maj_impossible' => '<b>Alerte !</b> La mise à jour de la base SQL vers la version @version@ est impossible, peut-être à cause d’un problème de droit de modification sur la base de données. Veuillez contacter votre hébergeur.',
29
-	'alerte_modif_info_concourante' => 'ATTENTION : Cette information a été modifiée par ailleurs. La valeur actuelle est :',
30
-	'analyse_xml' => 'Analyse XML',
31
-	'annuler' => 'Annuler',
32
-	'antispam_champ_vide' => 'Veuillez laisser ce champ vide :',
33
-	'articles_recents' => 'Articles les plus récents',
34
-	'avis_1_erreur_saisie' => 'Il y a 1 erreur dans votre saisie, veuillez vérifier les informations.',
35
-	'avis_archive_incorrect' => 'le fichier archive n’est pas un fichier SPIP',
36
-	'avis_archive_invalide' => 'le fichier archive n’est pas valide',
37
-	'avis_attention' => 'ATTENTION !',
38
-	'avis_champ_incorrect_type_objet' => 'Nom de champ incorrect @name@ pour objet de type @type@',
39
-	'avis_colonne_inexistante' => 'La colonne @col@ n’existe pas',
40
-	'avis_erreur' => 'Erreur : voir ci-dessous',
41
-	'avis_erreur_connexion' => 'Erreur de connexion',
42
-	'avis_erreur_cookie' => 'problème de cookie',
43
-	'avis_erreur_fonction_contexte' => 'Erreur de programmation. Cette fonction ne doit pas être appelée dans ce contexte.',
44
-	'avis_erreur_mysql' => 'Erreur SQL',
45
-	'avis_erreur_sauvegarde' => 'Erreur dans la sauvegarde (@type@ @id_objet@) !',
46
-	'avis_erreur_visiteur' => 'Problème d’accès à l’espace privé',
47
-	'avis_nb_erreurs_saisie' => 'Il y a @nb@ erreurs dans votre saisie, veuillez vérifier les informations.',
16
+    // A
17
+    'access_interface_graphique' => 'Retour à l’interface graphique complète',
18
+    'access_mode_texte' => 'Afficher l’interface textuelle simplifiée',
19
+    'admin_debug' => 'debug',
20
+    'admin_modifier_article' => 'Modifier cet article',
21
+    'admin_modifier_auteur' => 'Modifier cet auteur',
22
+    'admin_modifier_breve' => 'Modifier cette brève',
23
+    'admin_modifier_mot' => 'Modifier ce mot-clé',
24
+    'admin_modifier_rubrique' => 'Modifier cette rubrique',
25
+    'admin_recalculer' => 'Recalculer cette page',
26
+    'afficher_calendrier' => 'Afficher le calendrier',
27
+    'afficher_trad' => 'afficher les traductions',
28
+    'alerte_maj_impossible' => '<b>Alerte !</b> La mise à jour de la base SQL vers la version @version@ est impossible, peut-être à cause d’un problème de droit de modification sur la base de données. Veuillez contacter votre hébergeur.',
29
+    'alerte_modif_info_concourante' => 'ATTENTION : Cette information a été modifiée par ailleurs. La valeur actuelle est :',
30
+    'analyse_xml' => 'Analyse XML',
31
+    'annuler' => 'Annuler',
32
+    'antispam_champ_vide' => 'Veuillez laisser ce champ vide :',
33
+    'articles_recents' => 'Articles les plus récents',
34
+    'avis_1_erreur_saisie' => 'Il y a 1 erreur dans votre saisie, veuillez vérifier les informations.',
35
+    'avis_archive_incorrect' => 'le fichier archive n’est pas un fichier SPIP',
36
+    'avis_archive_invalide' => 'le fichier archive n’est pas valide',
37
+    'avis_attention' => 'ATTENTION !',
38
+    'avis_champ_incorrect_type_objet' => 'Nom de champ incorrect @name@ pour objet de type @type@',
39
+    'avis_colonne_inexistante' => 'La colonne @col@ n’existe pas',
40
+    'avis_erreur' => 'Erreur : voir ci-dessous',
41
+    'avis_erreur_connexion' => 'Erreur de connexion',
42
+    'avis_erreur_cookie' => 'problème de cookie',
43
+    'avis_erreur_fonction_contexte' => 'Erreur de programmation. Cette fonction ne doit pas être appelée dans ce contexte.',
44
+    'avis_erreur_mysql' => 'Erreur SQL',
45
+    'avis_erreur_sauvegarde' => 'Erreur dans la sauvegarde (@type@ @id_objet@) !',
46
+    'avis_erreur_visiteur' => 'Problème d’accès à l’espace privé',
47
+    'avis_nb_erreurs_saisie' => 'Il y a @nb@ erreurs dans votre saisie, veuillez vérifier les informations.',
48 48
 
49
-	// B
50
-	'barre_a_accent_grave' => 'Insérer un A accent grave majuscule',
51
-	'barre_aide' => 'Utilisez les raccourcis typographiques pour enrichir votre mise en page',
52
-	'barre_e_accent_aigu' => 'Insérer un E accent aigu majuscule',
53
-	'barre_eo' => 'Insérer un E dans l’O',
54
-	'barre_eo_maj' => 'Insérer un E dans l’O majuscule',
55
-	'barre_euro' => 'Insérer le symbole €',
56
-	'barre_gras' => 'Mettre en {{gras}}',
57
-	'barre_guillemets' => 'Entourer de « guillemets »',
58
-	'barre_guillemets_simples' => 'Entourer de “guillemets de second niveau”',
59
-	'barre_intertitre' => 'Transformer en {{{intertitre}}}',
60
-	'barre_italic' => 'Mettre en {italique}',
61
-	'barre_lien' => 'Transformer en [lien hypertexte->http://...]',
62
-	'barre_lien_input' => 'Veuillez indiquer l’adresse de votre lien (vous pouvez indiquer une adresse Web sous la forme http://www.monsite/com ou simplement indiquer le numéro d’un article de ce site.',
63
-	'barre_note' => 'Transformer en [[Note de bas de page]]',
64
-	'barre_paragraphe' => 'Créer un paragraphe',
65
-	'barre_quote' => '<quote>Citer un message</quote>',
66
-	'bouton_changer' => 'Changer',
67
-	'bouton_chercher' => 'Chercher',
68
-	'bouton_choisir' => 'Choisir',
69
-	'bouton_deplacer' => 'Déplacer',
70
-	'bouton_download' => 'Télécharger',
71
-	'bouton_enregistrer' => 'Enregistrer',
72
-	'bouton_radio_desactiver_messagerie_interne' => 'Désactiver la messagerie interne',
73
-	'bouton_radio_envoi_annonces' => 'Envoyer les annonces éditoriales',
74
-	'bouton_radio_non_envoi_annonces' => 'Ne pas envoyer d’annonces',
75
-	'bouton_radio_non_envoi_liste_nouveautes' => 'Ne pas envoyer la liste des nouveautés',
76
-	'bouton_recharger_page' => 'recharger cette page',
77
-	'bouton_telecharger' => 'Télécharger',
78
-	'bouton_upload' => 'Téléverser',
79
-	'bouton_valider' => 'Valider',
49
+    // B
50
+    'barre_a_accent_grave' => 'Insérer un A accent grave majuscule',
51
+    'barre_aide' => 'Utilisez les raccourcis typographiques pour enrichir votre mise en page',
52
+    'barre_e_accent_aigu' => 'Insérer un E accent aigu majuscule',
53
+    'barre_eo' => 'Insérer un E dans l’O',
54
+    'barre_eo_maj' => 'Insérer un E dans l’O majuscule',
55
+    'barre_euro' => 'Insérer le symbole €',
56
+    'barre_gras' => 'Mettre en {{gras}}',
57
+    'barre_guillemets' => 'Entourer de « guillemets »',
58
+    'barre_guillemets_simples' => 'Entourer de “guillemets de second niveau”',
59
+    'barre_intertitre' => 'Transformer en {{{intertitre}}}',
60
+    'barre_italic' => 'Mettre en {italique}',
61
+    'barre_lien' => 'Transformer en [lien hypertexte->http://...]',
62
+    'barre_lien_input' => 'Veuillez indiquer l’adresse de votre lien (vous pouvez indiquer une adresse Web sous la forme http://www.monsite/com ou simplement indiquer le numéro d’un article de ce site.',
63
+    'barre_note' => 'Transformer en [[Note de bas de page]]',
64
+    'barre_paragraphe' => 'Créer un paragraphe',
65
+    'barre_quote' => '<quote>Citer un message</quote>',
66
+    'bouton_changer' => 'Changer',
67
+    'bouton_chercher' => 'Chercher',
68
+    'bouton_choisir' => 'Choisir',
69
+    'bouton_deplacer' => 'Déplacer',
70
+    'bouton_download' => 'Télécharger',
71
+    'bouton_enregistrer' => 'Enregistrer',
72
+    'bouton_radio_desactiver_messagerie_interne' => 'Désactiver la messagerie interne',
73
+    'bouton_radio_envoi_annonces' => 'Envoyer les annonces éditoriales',
74
+    'bouton_radio_non_envoi_annonces' => 'Ne pas envoyer d’annonces',
75
+    'bouton_radio_non_envoi_liste_nouveautes' => 'Ne pas envoyer la liste des nouveautés',
76
+    'bouton_recharger_page' => 'recharger cette page',
77
+    'bouton_telecharger' => 'Télécharger',
78
+    'bouton_upload' => 'Téléverser',
79
+    'bouton_valider' => 'Valider',
80 80
 
81
-	// C
82
-	'cal_apresmidi' => 'après-midi',
83
-	'cal_jour_entier' => 'jour entier',
84
-	'cal_matin' => 'matin',
85
-	'cal_par_jour' => 'calendrier par jour',
86
-	'cal_par_mois' => 'calendrier par mois',
87
-	'cal_par_semaine' => 'calendrier par semaine',
88
-	'choix_couleur_interface' => 'couleur ',
89
-	'choix_interface' => 'choix  de l’interface',
90
-	'colonne' => 'Colonne',
91
-	'confirm_changer_statut' => 'Attention, vous avez demandé à changer le statut de cet élément. Souhaitez-vous continuer ?',
92
-	'correcte' => 'correcte', # chaine utilisée dans le debugueur : "validation .. impossible" ou "validation .. correcte"
81
+    // C
82
+    'cal_apresmidi' => 'après-midi',
83
+    'cal_jour_entier' => 'jour entier',
84
+    'cal_matin' => 'matin',
85
+    'cal_par_jour' => 'calendrier par jour',
86
+    'cal_par_mois' => 'calendrier par mois',
87
+    'cal_par_semaine' => 'calendrier par semaine',
88
+    'choix_couleur_interface' => 'couleur ',
89
+    'choix_interface' => 'choix  de l’interface',
90
+    'colonne' => 'Colonne',
91
+    'confirm_changer_statut' => 'Attention, vous avez demandé à changer le statut de cet élément. Souhaitez-vous continuer ?',
92
+    'correcte' => 'correcte', # chaine utilisée dans le debugueur : "validation .. impossible" ou "validation .. correcte"
93 93
 
94
-	// D
95
-	'date_aujourdhui' => 'aujourd’hui',
96
-	'date_avant_jc' => 'av. J.C.',
97
-	'date_dans' => 'dans @delai@',
98
-	'date_de_mois_1' => '@j@ @nommois@',
99
-	'date_de_mois_10' => '@j@ @nommois@',
100
-	'date_de_mois_11' => '@j@ @nommois@',
101
-	'date_de_mois_12' => '@j@ @nommois@',
102
-	'date_de_mois_2' => '@j@ @nommois@',
103
-	'date_de_mois_3' => '@j@ @nommois@',
104
-	'date_de_mois_4' => '@j@ @nommois@',
105
-	'date_de_mois_5' => '@j@ @nommois@',
106
-	'date_de_mois_6' => '@j@ @nommois@',
107
-	'date_de_mois_7' => '@j@ @nommois@',
108
-	'date_de_mois_8' => '@j@ @nommois@',
109
-	'date_de_mois_9' => '@j@ @nommois@',
110
-	'date_demain' => 'demain',
111
-	'date_fmt_heures_minutes' => '@h@h@m@min',
112
-	'date_fmt_heures_minutes_court' => '@h@h@m@',
113
-	'date_fmt_jour' => '@nomjour@ @jour@',
114
-	'date_fmt_jour_heure' => '@jour@ à @heure@',
115
-	'date_fmt_jour_heure_debut_fin' => '@jour@ de @heure_debut@ à @heure_fin@',
116
-	'date_fmt_jour_heure_debut_fin_abbr' => '@dtstart@@jour@ de @heure_debut@@dtabbr@ à @dtend@@heure_fin@@dtabbr@',
117
-	'date_fmt_jour_mois' => '@jour@ @nommois@',
118
-	'date_fmt_jour_mois_annee' => '@jour@ @nommois@ @annee@',
119
-	'date_fmt_mois_annee' => '@nommois@ @annee@',
120
-	'date_fmt_nomjour' => '@nomjour@ @date@',
121
-	'date_fmt_nomjour_date' => 'le @nomjour@ @date@',
122
-	'date_fmt_periode' => 'Du @date_debut@ au @date_fin@',
123
-	'date_fmt_periode_abbr' => 'Du @dtart@@date_debut@@dtabbr@ au @dtend@@date_fin@@dtabbr@',
124
-	'date_fmt_periode_from' => 'Du',
125
-	'date_fmt_periode_to' => 'au',
126
-	'date_fmt_saison_annee' => '@saison@ @annee@',
127
-	'date_heures' => 'heures',
128
-	'date_hier' => 'hier',
129
-	'date_il_y_a' => 'il y a @delai@',
130
-	'date_jnum1' => '1er',
131
-	'date_jnum10' => '10',
132
-	'date_jnum11' => '11',
133
-	'date_jnum12' => '12',
134
-	'date_jnum13' => '13',
135
-	'date_jnum14' => '14',
136
-	'date_jnum15' => '15',
137
-	'date_jnum16' => '16',
138
-	'date_jnum17' => '17',
139
-	'date_jnum18' => '18',
140
-	'date_jnum19' => '19',
141
-	'date_jnum2' => '2',
142
-	'date_jnum20' => '20',
143
-	'date_jnum21' => '21',
144
-	'date_jnum22' => '22',
145
-	'date_jnum23' => '23',
146
-	'date_jnum24' => '24',
147
-	'date_jnum25' => '25',
148
-	'date_jnum26' => '26',
149
-	'date_jnum27' => '27',
150
-	'date_jnum28' => '28',
151
-	'date_jnum29' => '29',
152
-	'date_jnum3' => '3',
153
-	'date_jnum30' => '30',
154
-	'date_jnum31' => '31',
155
-	'date_jnum4' => '4',
156
-	'date_jnum5' => '5',
157
-	'date_jnum6' => '6',
158
-	'date_jnum7' => '7',
159
-	'date_jnum8' => '8',
160
-	'date_jnum9' => '9',
161
-	'date_jour_1' => 'dimanche',
162
-	'date_jour_1_abbr' => 'dim.',
163
-	'date_jour_1_initiale' => 'd.',
164
-	'date_jour_2' => 'lundi',
165
-	'date_jour_2_abbr' => 'lun.',
166
-	'date_jour_2_initiale' => 'l.',
167
-	'date_jour_3' => 'mardi',
168
-	'date_jour_3_abbr' => 'mar.',
169
-	'date_jour_3_initiale' => 'm.',
170
-	'date_jour_4' => 'mercredi',
171
-	'date_jour_4_abbr' => 'mer.',
172
-	'date_jour_4_initiale' => 'm.',
173
-	'date_jour_5' => 'jeudi',
174
-	'date_jour_5_abbr' => 'jeu.',
175
-	'date_jour_5_initiale' => 'j.',
176
-	'date_jour_6' => 'vendredi',
177
-	'date_jour_6_abbr' => 'ven.',
178
-	'date_jour_6_initiale' => 'v.',
179
-	'date_jour_7' => 'samedi',
180
-	'date_jour_7_abbr' => 'sam.',
181
-	'date_jour_7_initiale' => 's.',
182
-	'date_jours' => 'jours',
183
-	'date_minutes' => 'minutes',
184
-	'date_mois' => 'mois',
185
-	'date_mois_1' => 'janvier',
186
-	'date_mois_10' => 'octobre',
187
-	'date_mois_10_abbr' => 'oct.',
188
-	'date_mois_11' => 'novembre',
189
-	'date_mois_11_abbr' => 'nov.',
190
-	'date_mois_12' => 'décembre',
191
-	'date_mois_12_abbr' => 'déc.',
192
-	'date_mois_1_abbr' => 'janv.',
193
-	'date_mois_2' => 'février',
194
-	'date_mois_2_abbr' => 'févr.',
195
-	'date_mois_3' => 'mars',
196
-	'date_mois_3_abbr' => 'mars',
197
-	'date_mois_4' => 'avril',
198
-	'date_mois_4_abbr' => 'avr.',
199
-	'date_mois_5' => 'mai',
200
-	'date_mois_5_abbr' => 'mai',
201
-	'date_mois_6' => 'juin',
202
-	'date_mois_6_abbr' => 'juin',
203
-	'date_mois_7' => 'juillet',
204
-	'date_mois_7_abbr' => 'juil.',
205
-	'date_mois_8' => 'août',
206
-	'date_mois_8_abbr' => 'août',
207
-	'date_mois_9' => 'septembre',
208
-	'date_mois_9_abbr' => 'sept.',
209
-	'date_saison_1' => 'hiver',
210
-	'date_saison_2' => 'printemps',
211
-	'date_saison_3' => 'été',
212
-	'date_saison_4' => 'automne',
213
-	'date_secondes' => 'secondes',
214
-	'date_semaines' => 'semaines',
215
-	'date_un_mois' => 'mois',
216
-	'date_une_heure' => 'heure',
217
-	'date_une_minute' => 'minute',
218
-	'date_une_seconde' => 'seconde',
219
-	'date_une_semaine' => 'semaine',
220
-	'dirs_commencer' => ' afin de commencer réellement l’installation',
221
-	'dirs_preliminaire' => 'Préliminaire : <b>Régler les droits d’accès</b>',
222
-	'dirs_probleme_droits' => 'Problème de droits d’accès',
223
-	'dirs_repertoires_absents' => '<p><b>Les répertoires suivants n’ont pas été trouvés :</b></p><ul>@bad_dirs@</ul>
94
+    // D
95
+    'date_aujourdhui' => 'aujourd’hui',
96
+    'date_avant_jc' => 'av. J.C.',
97
+    'date_dans' => 'dans @delai@',
98
+    'date_de_mois_1' => '@j@ @nommois@',
99
+    'date_de_mois_10' => '@j@ @nommois@',
100
+    'date_de_mois_11' => '@j@ @nommois@',
101
+    'date_de_mois_12' => '@j@ @nommois@',
102
+    'date_de_mois_2' => '@j@ @nommois@',
103
+    'date_de_mois_3' => '@j@ @nommois@',
104
+    'date_de_mois_4' => '@j@ @nommois@',
105
+    'date_de_mois_5' => '@j@ @nommois@',
106
+    'date_de_mois_6' => '@j@ @nommois@',
107
+    'date_de_mois_7' => '@j@ @nommois@',
108
+    'date_de_mois_8' => '@j@ @nommois@',
109
+    'date_de_mois_9' => '@j@ @nommois@',
110
+    'date_demain' => 'demain',
111
+    'date_fmt_heures_minutes' => '@h@h@m@min',
112
+    'date_fmt_heures_minutes_court' => '@h@h@m@',
113
+    'date_fmt_jour' => '@nomjour@ @jour@',
114
+    'date_fmt_jour_heure' => '@jour@ à @heure@',
115
+    'date_fmt_jour_heure_debut_fin' => '@jour@ de @heure_debut@ à @heure_fin@',
116
+    'date_fmt_jour_heure_debut_fin_abbr' => '@dtstart@@jour@ de @heure_debut@@dtabbr@ à @dtend@@heure_fin@@dtabbr@',
117
+    'date_fmt_jour_mois' => '@jour@ @nommois@',
118
+    'date_fmt_jour_mois_annee' => '@jour@ @nommois@ @annee@',
119
+    'date_fmt_mois_annee' => '@nommois@ @annee@',
120
+    'date_fmt_nomjour' => '@nomjour@ @date@',
121
+    'date_fmt_nomjour_date' => 'le @nomjour@ @date@',
122
+    'date_fmt_periode' => 'Du @date_debut@ au @date_fin@',
123
+    'date_fmt_periode_abbr' => 'Du @dtart@@date_debut@@dtabbr@ au @dtend@@date_fin@@dtabbr@',
124
+    'date_fmt_periode_from' => 'Du',
125
+    'date_fmt_periode_to' => 'au',
126
+    'date_fmt_saison_annee' => '@saison@ @annee@',
127
+    'date_heures' => 'heures',
128
+    'date_hier' => 'hier',
129
+    'date_il_y_a' => 'il y a @delai@',
130
+    'date_jnum1' => '1er',
131
+    'date_jnum10' => '10',
132
+    'date_jnum11' => '11',
133
+    'date_jnum12' => '12',
134
+    'date_jnum13' => '13',
135
+    'date_jnum14' => '14',
136
+    'date_jnum15' => '15',
137
+    'date_jnum16' => '16',
138
+    'date_jnum17' => '17',
139
+    'date_jnum18' => '18',
140
+    'date_jnum19' => '19',
141
+    'date_jnum2' => '2',
142
+    'date_jnum20' => '20',
143
+    'date_jnum21' => '21',
144
+    'date_jnum22' => '22',
145
+    'date_jnum23' => '23',
146
+    'date_jnum24' => '24',
147
+    'date_jnum25' => '25',
148
+    'date_jnum26' => '26',
149
+    'date_jnum27' => '27',
150
+    'date_jnum28' => '28',
151
+    'date_jnum29' => '29',
152
+    'date_jnum3' => '3',
153
+    'date_jnum30' => '30',
154
+    'date_jnum31' => '31',
155
+    'date_jnum4' => '4',
156
+    'date_jnum5' => '5',
157
+    'date_jnum6' => '6',
158
+    'date_jnum7' => '7',
159
+    'date_jnum8' => '8',
160
+    'date_jnum9' => '9',
161
+    'date_jour_1' => 'dimanche',
162
+    'date_jour_1_abbr' => 'dim.',
163
+    'date_jour_1_initiale' => 'd.',
164
+    'date_jour_2' => 'lundi',
165
+    'date_jour_2_abbr' => 'lun.',
166
+    'date_jour_2_initiale' => 'l.',
167
+    'date_jour_3' => 'mardi',
168
+    'date_jour_3_abbr' => 'mar.',
169
+    'date_jour_3_initiale' => 'm.',
170
+    'date_jour_4' => 'mercredi',
171
+    'date_jour_4_abbr' => 'mer.',
172
+    'date_jour_4_initiale' => 'm.',
173
+    'date_jour_5' => 'jeudi',
174
+    'date_jour_5_abbr' => 'jeu.',
175
+    'date_jour_5_initiale' => 'j.',
176
+    'date_jour_6' => 'vendredi',
177
+    'date_jour_6_abbr' => 'ven.',
178
+    'date_jour_6_initiale' => 'v.',
179
+    'date_jour_7' => 'samedi',
180
+    'date_jour_7_abbr' => 'sam.',
181
+    'date_jour_7_initiale' => 's.',
182
+    'date_jours' => 'jours',
183
+    'date_minutes' => 'minutes',
184
+    'date_mois' => 'mois',
185
+    'date_mois_1' => 'janvier',
186
+    'date_mois_10' => 'octobre',
187
+    'date_mois_10_abbr' => 'oct.',
188
+    'date_mois_11' => 'novembre',
189
+    'date_mois_11_abbr' => 'nov.',
190
+    'date_mois_12' => 'décembre',
191
+    'date_mois_12_abbr' => 'déc.',
192
+    'date_mois_1_abbr' => 'janv.',
193
+    'date_mois_2' => 'février',
194
+    'date_mois_2_abbr' => 'févr.',
195
+    'date_mois_3' => 'mars',
196
+    'date_mois_3_abbr' => 'mars',
197
+    'date_mois_4' => 'avril',
198
+    'date_mois_4_abbr' => 'avr.',
199
+    'date_mois_5' => 'mai',
200
+    'date_mois_5_abbr' => 'mai',
201
+    'date_mois_6' => 'juin',
202
+    'date_mois_6_abbr' => 'juin',
203
+    'date_mois_7' => 'juillet',
204
+    'date_mois_7_abbr' => 'juil.',
205
+    'date_mois_8' => 'août',
206
+    'date_mois_8_abbr' => 'août',
207
+    'date_mois_9' => 'septembre',
208
+    'date_mois_9_abbr' => 'sept.',
209
+    'date_saison_1' => 'hiver',
210
+    'date_saison_2' => 'printemps',
211
+    'date_saison_3' => 'été',
212
+    'date_saison_4' => 'automne',
213
+    'date_secondes' => 'secondes',
214
+    'date_semaines' => 'semaines',
215
+    'date_un_mois' => 'mois',
216
+    'date_une_heure' => 'heure',
217
+    'date_une_minute' => 'minute',
218
+    'date_une_seconde' => 'seconde',
219
+    'date_une_semaine' => 'semaine',
220
+    'dirs_commencer' => ' afin de commencer réellement l’installation',
221
+    'dirs_preliminaire' => 'Préliminaire : <b>Régler les droits d’accès</b>',
222
+    'dirs_probleme_droits' => 'Problème de droits d’accès',
223
+    'dirs_repertoires_absents' => '<p><b>Les répertoires suivants n’ont pas été trouvés :</b></p><ul>@bad_dirs@</ul>
224 224
   <p>Il est probable que cela soit dû à un problème de mauvaise mise en majuscules ou minuscules.
225 225
   Vérifiez que les minuscules et majuscules de ces répertoires concordent bien avec ce qui est affiché
226 226
   ci-dessus ; si ce n’est pas le cas, renommez les répertoires avec votre logiciel FTP de façon à corriger l’erreur.</p>
227 227
   <p>Une fois cette manipulation effectuée, vous pourrez ',
228
-	'dirs_repertoires_suivants' => '<p><b>Les répertoires suivants ne sont pas accessibles en écriture :</b></p> <ul>@bad_dirs@</ul>
228
+    'dirs_repertoires_suivants' => '<p><b>Les répertoires suivants ne sont pas accessibles en écriture :</b></p> <ul>@bad_dirs@</ul>
229 229
   <p>Pour y remédier, utilisez votre client FTP afin de régler les droits d’accès de chacun
230 230
   de ces répertoires. La procédure est expliquée en détail dans le guide d’installation.</p>
231 231
   <p>Une fois cette manipulation effectuée, vous pourrez ',
232
-	'double_occurrence' => 'Double occurrence de @balise@',
232
+    'double_occurrence' => 'Double occurrence de @balise@',
233 233
 
234
-	// E
235
-	'en_cours' => 'en cours',
236
-	'envoi_via_le_site' => 'Envoi via le site',
237
-	'erreur' => 'Erreur',
238
-	'erreur_balise_non_fermee' => 'dernière balise non refermée :',
239
-	'erreur_technique_ajaxform' => 'Oups. Une erreur inattendue a empêché de soumettre le formulaire. Vous pouvez essayer à nouveau.',
240
-	'erreur_technique_enregistrement_champs' => 'Une erreur technique a empêché l’enregistrement correct du champ @champs@.',
241
-	'erreur_technique_enregistrement_impossible' => 'Une erreur technique a empêché l’enregistrement.',
242
-	'erreur_texte' => 'erreur(s)',
243
-	'etape' => 'Étape',
234
+    // E
235
+    'en_cours' => 'en cours',
236
+    'envoi_via_le_site' => 'Envoi via le site',
237
+    'erreur' => 'Erreur',
238
+    'erreur_balise_non_fermee' => 'dernière balise non refermée :',
239
+    'erreur_technique_ajaxform' => 'Oups. Une erreur inattendue a empêché de soumettre le formulaire. Vous pouvez essayer à nouveau.',
240
+    'erreur_technique_enregistrement_champs' => 'Une erreur technique a empêché l’enregistrement correct du champ @champs@.',
241
+    'erreur_technique_enregistrement_impossible' => 'Une erreur technique a empêché l’enregistrement.',
242
+    'erreur_texte' => 'erreur(s)',
243
+    'etape' => 'Étape',
244 244
 
245
-	// F
246
-	'fichier_introuvable' => 'Fichier @fichier@ introuvable',
247
-	'form_auteur_confirmation' => 'Confirmez votre adresse email',
248
-	'form_auteur_email_modifie' => 'Votre adresse email a été modifiée.',
249
-	'form_auteur_envoi_mail_confirmation' => 'Un courrier électronique de confirmation vient d’être envoyé à @email@. Vous devrez visiter l’adresse Web mentionnée dans ce courrier pour valider votre adresse mail.',
250
-	'form_auteur_mail_confirmation' => 'Bonjour,
245
+    // F
246
+    'fichier_introuvable' => 'Fichier @fichier@ introuvable',
247
+    'form_auteur_confirmation' => 'Confirmez votre adresse email',
248
+    'form_auteur_email_modifie' => 'Votre adresse email a été modifiée.',
249
+    'form_auteur_envoi_mail_confirmation' => 'Un courrier électronique de confirmation vient d’être envoyé à @email@. Vous devrez visiter l’adresse Web mentionnée dans ce courrier pour valider votre adresse mail.',
250
+    'form_auteur_mail_confirmation' => 'Bonjour,
251 251
 
252 252
 Vous avez demandé à changer votre adresse email.
253 253
 Pour confirmer votre nouvelle adresse, il suffit de vous connecter à
@@ -256,337 +256,337 @@  discard block
 block discarded – undo
256 256
 
257 257
     @url@
258 258
 ',
259
-	'form_deja_inscrit' => 'Vous êtes déjà inscrit.',
260
-	'form_email_non_valide' => 'Votre adresse email n’est pas valide.',
261
-	'form_forum_access_refuse' => 'Vous n’avez plus accès à ce site.',
262
-	'form_forum_bonjour' => 'Bonjour @nom@,',
263
-	'form_forum_confirmer_email' => 'Pour confirmer votre adresse email, rendez-vous à cette adresse : @url_confirm@',
264
-	'form_forum_email_deja_enregistre' => 'Cette adresse email est déjà enregistrée, vous pouvez donc utiliser votre mot de passe habituel.',
265
-	'form_forum_identifiant_mail' => 'Votre nouvel identifiant vient de vous être envoyé par email.',
266
-	'form_forum_identifiants' => 'Identifiants personnels',
267
-	'form_forum_indiquer_nom_email' => 'Indiquez ici votre nom et votre adresse email. Votre identifiant personnel vous parviendra rapidement, par courrier électronique.',
268
-	'form_forum_login' => 'login :',
269
-	'form_forum_message_auto' => '(ceci est un message automatique)',
270
-	'form_forum_pass' => 'mot de passe :',
271
-	'form_forum_probleme_mail' => 'Problème de mail : l’identifiant ne peut pas être envoyé.',
272
-	'form_forum_voici1' => 'Voici vos identifiants pour pouvoir participer à la vie du site "@nom_site_spip@" (@adresse_site@) :',
273
-	'form_forum_voici2' => 'Voici vos identifiants pour proposer des articles sur
259
+    'form_deja_inscrit' => 'Vous êtes déjà inscrit.',
260
+    'form_email_non_valide' => 'Votre adresse email n’est pas valide.',
261
+    'form_forum_access_refuse' => 'Vous n’avez plus accès à ce site.',
262
+    'form_forum_bonjour' => 'Bonjour @nom@,',
263
+    'form_forum_confirmer_email' => 'Pour confirmer votre adresse email, rendez-vous à cette adresse : @url_confirm@',
264
+    'form_forum_email_deja_enregistre' => 'Cette adresse email est déjà enregistrée, vous pouvez donc utiliser votre mot de passe habituel.',
265
+    'form_forum_identifiant_mail' => 'Votre nouvel identifiant vient de vous être envoyé par email.',
266
+    'form_forum_identifiants' => 'Identifiants personnels',
267
+    'form_forum_indiquer_nom_email' => 'Indiquez ici votre nom et votre adresse email. Votre identifiant personnel vous parviendra rapidement, par courrier électronique.',
268
+    'form_forum_login' => 'login :',
269
+    'form_forum_message_auto' => '(ceci est un message automatique)',
270
+    'form_forum_pass' => 'mot de passe :',
271
+    'form_forum_probleme_mail' => 'Problème de mail : l’identifiant ne peut pas être envoyé.',
272
+    'form_forum_voici1' => 'Voici vos identifiants pour pouvoir participer à la vie du site "@nom_site_spip@" (@adresse_site@) :',
273
+    'form_forum_voici2' => 'Voici vos identifiants pour proposer des articles sur
274 274
 le site "@nom_site_spip@" (@adresse_login@) :',
275
-	'form_indiquer_email' => 'Veuillez indiquer votre adresse email.',
276
-	'form_indiquer_nom' => 'Veuillez indiquer votre nom.',
277
-	'form_indiquer_nom_site' => 'Veuillez indiquer le nom de votre site.',
278
-	'form_pet_deja_enregistre' => 'Ce site est déjà enregistré',
279
-	'form_pet_signature_pasprise' => 'Votre signature n’est pas prise en compte.',
280
-	'form_prop_confirmer_envoi' => 'Confirmer l’envoi',
281
-	'form_prop_description' => 'Description/commentaire',
282
-	'form_prop_enregistre' => 'Votre proposition est enregistrée, elle apparaîtra en ligne après validation par les responsables de ce site.',
283
-	'form_prop_envoyer' => 'Envoyer un message',
284
-	'form_prop_indiquer_email' => 'Veuillez indiquer une adresse email valide',
285
-	'form_prop_indiquer_nom_site' => 'Veuillez indiquer le nom du site.',
286
-	'form_prop_indiquer_sujet' => 'Veuillez indiquer un sujet',
287
-	'form_prop_message_envoye' => 'Message envoyé',
288
-	'form_prop_non_enregistre' => 'Votre proposition n’a pas été enregistrée.',
289
-	'form_prop_sujet' => 'Sujet',
290
-	'form_prop_url_site' => 'Adresse URL du site',
291
-	'format_date_incorrecte' => 'La date ou son format est incorrect',
292
-	'format_heure_incorrecte' => 'L’heure ou son format est incorrect',
293
-	'forum_non_inscrit' => 'Vous n’êtes pas inscrit, ou l’adresse ou le mot de passe sont erronés.',
294
-	'forum_par_auteur' => 'par @auteur@',
295
-	'forum_titre_erreur' => 'Erreur...',
275
+    'form_indiquer_email' => 'Veuillez indiquer votre adresse email.',
276
+    'form_indiquer_nom' => 'Veuillez indiquer votre nom.',
277
+    'form_indiquer_nom_site' => 'Veuillez indiquer le nom de votre site.',
278
+    'form_pet_deja_enregistre' => 'Ce site est déjà enregistré',
279
+    'form_pet_signature_pasprise' => 'Votre signature n’est pas prise en compte.',
280
+    'form_prop_confirmer_envoi' => 'Confirmer l’envoi',
281
+    'form_prop_description' => 'Description/commentaire',
282
+    'form_prop_enregistre' => 'Votre proposition est enregistrée, elle apparaîtra en ligne après validation par les responsables de ce site.',
283
+    'form_prop_envoyer' => 'Envoyer un message',
284
+    'form_prop_indiquer_email' => 'Veuillez indiquer une adresse email valide',
285
+    'form_prop_indiquer_nom_site' => 'Veuillez indiquer le nom du site.',
286
+    'form_prop_indiquer_sujet' => 'Veuillez indiquer un sujet',
287
+    'form_prop_message_envoye' => 'Message envoyé',
288
+    'form_prop_non_enregistre' => 'Votre proposition n’a pas été enregistrée.',
289
+    'form_prop_sujet' => 'Sujet',
290
+    'form_prop_url_site' => 'Adresse URL du site',
291
+    'format_date_incorrecte' => 'La date ou son format est incorrect',
292
+    'format_heure_incorrecte' => 'L’heure ou son format est incorrect',
293
+    'forum_non_inscrit' => 'Vous n’êtes pas inscrit, ou l’adresse ou le mot de passe sont erronés.',
294
+    'forum_par_auteur' => 'par @auteur@',
295
+    'forum_titre_erreur' => 'Erreur...',
296 296
 
297
-	// I
298
-	'ical_texte_rss_articles' => 'Le fichier « backend » des articles de ce site se trouve à l’adresse :',
299
-	'ical_texte_rss_articles2' => 'Vous pouvez également obtenir des fichiers « backend » pour les articles de chaque rubrique du site :',
300
-	'ical_texte_rss_breves' => 'Il existe de plus un fichier contenant les brèves du site. En précisant un numéro de rubrique, vous obtiendrez uniquement les brèves de cette rubrique.',
301
-	'icone_a_suivre' => 'À suivre',
302
-	'icone_admin_site' => 'Administration du site',
303
-	'icone_agenda' => 'Agenda',
304
-	'icone_aide_ligne' => 'Aide',
305
-	'icone_articles' => 'Articles',
306
-	'icone_auteurs' => 'Auteurs',
307
-	'icone_brouteur' => 'Navigation rapide',
308
-	'icone_configuration_site' => 'Configuration',
309
-	'icone_configurer_site' => 'Configurer votre site',
310
-	'icone_creer_nouvel_auteur' => 'Créer un nouvel auteur',
311
-	'icone_creer_rubrique' => 'Créer une rubrique',
312
-	'icone_creer_sous_rubrique' => 'Créer une sous-rubrique',
313
-	'icone_deconnecter' => 'Se déconnecter',
314
-	'icone_discussions' => 'Discussions',
315
-	'icone_doc_rubrique' => 'Documents des rubriques',
316
-	'icone_ecrire_article' => 'Écrire un nouvel article',
317
-	'icone_edition_site' => 'Édition',
318
-	'icone_gestion_langues' => 'Gestion des langues',
319
-	'icone_informations_personnelles' => 'Informations personnelles',
320
-	'icone_interface_complet' => 'interface complète',
321
-	'icone_interface_simple' => 'Interface simplifiée',
322
-	'icone_maintenance_site' => 'Maintenance du site',
323
-	'icone_messagerie_personnelle' => 'Messagerie personnelle',
324
-	'icone_repartition_debut' => 'Afficher la répartition depuis le début',
325
-	'icone_rubriques' => 'Rubriques',
326
-	'icone_sauver_site' => 'Sauvegarde du site',
327
-	'icone_site_entier' => 'Tout le site',
328
-	'icone_sites_references' => 'Sites référencés',
329
-	'icone_statistiques' => 'Statistiques du site',
330
-	'icone_suivi_activite' => 'Suivre la vie du site',
331
-	'icone_suivi_actualite' => 'Évolution du site',
332
-	'icone_suivi_pettions' => 'Suivre/gérer les pétitions',
333
-	'icone_suivi_revisions' => 'Modifications des articles',
334
-	'icone_supprimer_document' => 'Supprimer ce document',
335
-	'icone_supprimer_image' => 'Supprimer cette image',
336
-	'icone_tous_articles' => 'Tous vos articles',
337
-	'icone_tous_auteur' => 'Tous les auteurs',
338
-	'icone_tous_visiteur' => 'Tous les visiteurs',
339
-	'icone_visiter_site' => 'Voir le site public',
340
-	'icone_voir_en_ligne' => 'Voir en ligne',
341
-	'img_indisponible' => 'image indisponible',
342
-	'impossible' => 'impossible',
343
-	'info_a_suivre' => 'À SUIVRE »',
344
-	'info_acces_interdit' => 'Accès interdit',
345
-	'info_acces_refuse' => 'Accès refusé',
346
-	'info_action' => 'Action : @action@',
347
-	'info_administrer_rubriques' => 'Vous pouvez administrer cette rubrique et ses sous-rubriques',
348
-	'info_adresse_non_indiquee' => 'Vous n’avez pas indiqué d’adresse à tester !',
349
-	'info_aide' => 'AIDE :',
350
-	'info_ajouter_mot' => 'Ajouter ce mot',
351
-	'info_annonce' => 'ANNONCE',
352
-	'info_annonces_generales' => 'Annonces générales :',
353
-	'info_article_propose' => 'Article proposé',
354
-	'info_article_publie' => 'Article publié',
355
-	'info_article_redaction' => 'Article en cours de rédaction',
356
-	'info_article_refuse' => 'Article refusé',
357
-	'info_article_supprime' => 'Article supprimé',
358
-	'info_articles' => 'Articles',
359
-	'info_articles_a_valider' => 'Les articles à valider',
360
-	'info_articles_nb' => '@nb@ articles',
361
-	'info_articles_proposes' => 'Articles proposés',
362
-	'info_articles_un' => '1 article',
363
-	'info_auteurs_nombre' => 'auteur(s) :',
364
-	'info_authentification_ftp' => 'Authentification (par FTP).',
365
-	'info_breves_2' => 'brèves',
366
-	'info_breves_nb' => '@nb@ brèves',
367
-	'info_breves_un' => '1 brève',
368
-	'info_connexion_refusee' => 'Connexion refusée',
369
-	'info_contact_developpeur' => 'Veuillez contacter un développeur.',
370
-	'info_contenance' => 'Ce site contient :',
371
-	'info_contribution' => 'contributions',
372
-	'info_copyright' => '@spip@ est un logiciel libre distribué @lien_gpl@.',
373
-	'info_copyright_doc' => 'Pour plus d’informations, voir le site <a href="@spipnet@">@spipnet_affiche@</a>.',
374
-	'info_copyright_gpl' => 'sous licence GPL',
375
-	'info_cours_edition' => 'En cours de rédaction',
376
-	'info_creer_repertoire' => 'Veuillez créer un fichier ou un répertoire nommé :',
377
-	'info_creer_repertoire_2' => 'à l’intérieur du sous-répertoire <b>@repertoire@</b>, puis :',
378
-	'info_creer_vignette' => 'création automatique de la vignette',
379
-	'info_creerdansrubrique_non_autorise' => 'Vous n’avez pas de droits suffisants pour créer un contenu dans cette rubrique',
380
-	'info_deplier' => 'Déplier',
381
-	'info_descriptif_nombre' => 'descriptif(s) :',
382
-	'info_description' => 'Description :',
383
-	'info_description_2' => 'Description :',
384
-	'info_dimension' => 'Dimensions :',
385
-	'info_documents_nb' => '@nb@ documents',
386
-	'info_documents_un' => '1 document',
387
-	'info_ecire_message_prive' => 'Écrire un message privé',
388
-	'info_email_invalide' => 'Adresse email invalide.',
389
-	'info_en_cours_validation' => 'Vos articles en cours de rédaction',
390
-	'info_en_ligne' => 'Actuellement en ligne :',
391
-	'info_envoyer_message_prive' => 'Envoyer un message privé à cet auteur',
392
-	'info_erreur_requete' => 'Erreur dans la requête :',
393
-	'info_erreur_squelette2' => 'Aucun squelette <b>@fichier@</b> n’est disponible...',
394
-	'info_erreur_systeme' => 'Erreur système (errno @errsys@)',
395
-	'info_erreur_systeme2' => 'Le disque dur est peut-être plein, ou la base de données endommagée.<br />
297
+    // I
298
+    'ical_texte_rss_articles' => 'Le fichier « backend » des articles de ce site se trouve à l’adresse :',
299
+    'ical_texte_rss_articles2' => 'Vous pouvez également obtenir des fichiers « backend » pour les articles de chaque rubrique du site :',
300
+    'ical_texte_rss_breves' => 'Il existe de plus un fichier contenant les brèves du site. En précisant un numéro de rubrique, vous obtiendrez uniquement les brèves de cette rubrique.',
301
+    'icone_a_suivre' => 'À suivre',
302
+    'icone_admin_site' => 'Administration du site',
303
+    'icone_agenda' => 'Agenda',
304
+    'icone_aide_ligne' => 'Aide',
305
+    'icone_articles' => 'Articles',
306
+    'icone_auteurs' => 'Auteurs',
307
+    'icone_brouteur' => 'Navigation rapide',
308
+    'icone_configuration_site' => 'Configuration',
309
+    'icone_configurer_site' => 'Configurer votre site',
310
+    'icone_creer_nouvel_auteur' => 'Créer un nouvel auteur',
311
+    'icone_creer_rubrique' => 'Créer une rubrique',
312
+    'icone_creer_sous_rubrique' => 'Créer une sous-rubrique',
313
+    'icone_deconnecter' => 'Se déconnecter',
314
+    'icone_discussions' => 'Discussions',
315
+    'icone_doc_rubrique' => 'Documents des rubriques',
316
+    'icone_ecrire_article' => 'Écrire un nouvel article',
317
+    'icone_edition_site' => 'Édition',
318
+    'icone_gestion_langues' => 'Gestion des langues',
319
+    'icone_informations_personnelles' => 'Informations personnelles',
320
+    'icone_interface_complet' => 'interface complète',
321
+    'icone_interface_simple' => 'Interface simplifiée',
322
+    'icone_maintenance_site' => 'Maintenance du site',
323
+    'icone_messagerie_personnelle' => 'Messagerie personnelle',
324
+    'icone_repartition_debut' => 'Afficher la répartition depuis le début',
325
+    'icone_rubriques' => 'Rubriques',
326
+    'icone_sauver_site' => 'Sauvegarde du site',
327
+    'icone_site_entier' => 'Tout le site',
328
+    'icone_sites_references' => 'Sites référencés',
329
+    'icone_statistiques' => 'Statistiques du site',
330
+    'icone_suivi_activite' => 'Suivre la vie du site',
331
+    'icone_suivi_actualite' => 'Évolution du site',
332
+    'icone_suivi_pettions' => 'Suivre/gérer les pétitions',
333
+    'icone_suivi_revisions' => 'Modifications des articles',
334
+    'icone_supprimer_document' => 'Supprimer ce document',
335
+    'icone_supprimer_image' => 'Supprimer cette image',
336
+    'icone_tous_articles' => 'Tous vos articles',
337
+    'icone_tous_auteur' => 'Tous les auteurs',
338
+    'icone_tous_visiteur' => 'Tous les visiteurs',
339
+    'icone_visiter_site' => 'Voir le site public',
340
+    'icone_voir_en_ligne' => 'Voir en ligne',
341
+    'img_indisponible' => 'image indisponible',
342
+    'impossible' => 'impossible',
343
+    'info_a_suivre' => 'À SUIVRE »',
344
+    'info_acces_interdit' => 'Accès interdit',
345
+    'info_acces_refuse' => 'Accès refusé',
346
+    'info_action' => 'Action : @action@',
347
+    'info_administrer_rubriques' => 'Vous pouvez administrer cette rubrique et ses sous-rubriques',
348
+    'info_adresse_non_indiquee' => 'Vous n’avez pas indiqué d’adresse à tester !',
349
+    'info_aide' => 'AIDE :',
350
+    'info_ajouter_mot' => 'Ajouter ce mot',
351
+    'info_annonce' => 'ANNONCE',
352
+    'info_annonces_generales' => 'Annonces générales :',
353
+    'info_article_propose' => 'Article proposé',
354
+    'info_article_publie' => 'Article publié',
355
+    'info_article_redaction' => 'Article en cours de rédaction',
356
+    'info_article_refuse' => 'Article refusé',
357
+    'info_article_supprime' => 'Article supprimé',
358
+    'info_articles' => 'Articles',
359
+    'info_articles_a_valider' => 'Les articles à valider',
360
+    'info_articles_nb' => '@nb@ articles',
361
+    'info_articles_proposes' => 'Articles proposés',
362
+    'info_articles_un' => '1 article',
363
+    'info_auteurs_nombre' => 'auteur(s) :',
364
+    'info_authentification_ftp' => 'Authentification (par FTP).',
365
+    'info_breves_2' => 'brèves',
366
+    'info_breves_nb' => '@nb@ brèves',
367
+    'info_breves_un' => '1 brève',
368
+    'info_connexion_refusee' => 'Connexion refusée',
369
+    'info_contact_developpeur' => 'Veuillez contacter un développeur.',
370
+    'info_contenance' => 'Ce site contient :',
371
+    'info_contribution' => 'contributions',
372
+    'info_copyright' => '@spip@ est un logiciel libre distribué @lien_gpl@.',
373
+    'info_copyright_doc' => 'Pour plus d’informations, voir le site <a href="@spipnet@">@spipnet_affiche@</a>.',
374
+    'info_copyright_gpl' => 'sous licence GPL',
375
+    'info_cours_edition' => 'En cours de rédaction',
376
+    'info_creer_repertoire' => 'Veuillez créer un fichier ou un répertoire nommé :',
377
+    'info_creer_repertoire_2' => 'à l’intérieur du sous-répertoire <b>@repertoire@</b>, puis :',
378
+    'info_creer_vignette' => 'création automatique de la vignette',
379
+    'info_creerdansrubrique_non_autorise' => 'Vous n’avez pas de droits suffisants pour créer un contenu dans cette rubrique',
380
+    'info_deplier' => 'Déplier',
381
+    'info_descriptif_nombre' => 'descriptif(s) :',
382
+    'info_description' => 'Description :',
383
+    'info_description_2' => 'Description :',
384
+    'info_dimension' => 'Dimensions :',
385
+    'info_documents_nb' => '@nb@ documents',
386
+    'info_documents_un' => '1 document',
387
+    'info_ecire_message_prive' => 'Écrire un message privé',
388
+    'info_email_invalide' => 'Adresse email invalide.',
389
+    'info_en_cours_validation' => 'Vos articles en cours de rédaction',
390
+    'info_en_ligne' => 'Actuellement en ligne :',
391
+    'info_envoyer_message_prive' => 'Envoyer un message privé à cet auteur',
392
+    'info_erreur_requete' => 'Erreur dans la requête :',
393
+    'info_erreur_squelette2' => 'Aucun squelette <b>@fichier@</b> n’est disponible...',
394
+    'info_erreur_systeme' => 'Erreur système (errno @errsys@)',
395
+    'info_erreur_systeme2' => 'Le disque dur est peut-être plein, ou la base de données endommagée.<br />
396 396
 <span style="color:red;">Essayez de <a href=\'@script@\'>réparer la base</a>, ou contactez votre hébergeur.</span>',
397
-	'info_fini' => 'C’est fini !',
398
-	'info_format_image' => 'Formats d’images pouvant être utilisées pour créer des vignettes : @gd_formats@.',
399
-	'info_format_non_defini' => 'format non défini',
400
-	'info_grand_ecran' => 'Grand écran',
401
-	'info_image_aide' => 'AIDE',
402
-	'info_image_process_titre' => 'Méthode de fabrication des vignettes',
403
-	'info_impossible_lire_page' => '<b>Erreur !</b> Impossible de lire la page <tt><html>@test_proxy@</html></tt> à travers le proxy ',
404
-	'info_installation_systeme_publication' => 'Installation du système de publication...',
405
-	'info_installer_documents' => 'Vous pouvez installer automatiquement tous les documents contenus dans le dossier @upload@.',
406
-	'info_installer_ftp' => 'En tant qu’administrateur, vous pouvez installer (par FTP) des fichiers dans le dossier @upload@ pour ensuite les sélectionner directement ici.',
407
-	'info_installer_images' => 'Vous pouvez installer des images aux formats JPEG, GIF et PNG.',
408
-	'info_installer_images_dossier' => 'Installer des images dans le dossier @upload@ pour pouvoir les sélectionner ici.',
409
-	'info_interface_complete' => 'interface complète',
410
-	'info_interface_simple' => 'Interface simplifiée',
411
-	'info_joindre_document_article' => 'Vous pouvez joindre à cet article des documents de type',
412
-	'info_joindre_document_rubrique' => 'Vous pouvez ajouter dans cette rubrique des documents de type',
413
-	'info_joindre_documents_article' => 'Vous pouvez joindre à votre article des documents de type :',
414
-	'info_l_article' => 'l’article',
415
-	'info_la_breve' => 'la brève',
416
-	'info_la_rubrique' => 'la rubrique',
417
-	'info_langue_principale' => 'Langue principale du site',
418
-	'info_largeur_vignette' => '@largeur_vignette@ × @hauteur_vignette@ pixels',
419
-	'info_les_auteurs_1' => 'par @les_auteurs@',
420
-	'info_logo_format_interdit' => 'Seuls les logos aux formats @formats@ sont autorisés.',
421
-	'info_logo_max_poids' => 'Les logos doivent obligatoirement faire moins de @maxi@ (ce fichier fait @actuel@).',
422
-	'info_mail_fournisseur' => '[email protected]',
423
-	'info_message_2' => 'MESSAGE',
424
-	'info_message_supprime' => 'MESSAGE SUPPRIMÉ',
425
-	'info_messages_nb' => '@nb@ messages',
426
-	'info_messages_un' => '1 message',
427
-	'info_mise_en_ligne' => 'Date de mise en ligne :',
428
-	'info_modification_parametres_securite' => 'modifications des paramètres de sécurité',
429
-	'info_mois_courant' => 'Dans le courant du mois :',
430
-	'info_mot_cle_ajoute' => 'Le mot-clé suivant a été ajouté à',
431
-	'info_multi_herit' => 'Langue par défaut',
432
-	'info_multi_langues_soulignees' => 'Les <u>langues soulignées</u> bénéficient d’une traduction totale ou partielle des textes de l’interface. Si vous sélectionnez ces langues, de nombreux éléments du site public (dates, formulaires) seront automatiquement traduits. Pour les langues non soulignées, ces éléments apparaîtront dans la langue principale du site.',
433
-	'info_multilinguisme' => 'Multilinguisme',
434
-	'info_nom_non_utilisateurs_connectes' => 'Votre nom n’apparaît pas dans la liste des utilisateurs connectés.',
435
-	'info_nom_utilisateurs_connectes' => 'Votre nom apparaît dans la liste des utilisateurs connectés.',
436
-	'info_nombre_en_ligne' => 'Actuellement en ligne :',
437
-	'info_non_resultat' => 'Aucun résultat pour "@cherche_mot@"',
438
-	'info_non_utilisation_messagerie' => 'Vous n’utilisez pas la messagerie interne de ce site.',
439
-	'info_nouveau_message' => 'VOUS AVEZ UN NOUVEAU MESSAGE',
440
-	'info_nouveaux_messages' => 'VOUS AVEZ @total_messages@ NOUVEAUX MESSAGES',
441
-	'info_numero_abbreviation' => 'N° ',
442
-	'info_obligatoire' => 'Cette information est obligatoire',
443
-	'info_pense_bete' => 'PENSE-BÊTE',
444
-	'info_petit_ecran' => 'Petit écran',
445
-	'info_petition_close' => 'Pétition close',
446
-	'info_pixels' => 'pixels',
447
-	'info_plusieurs_mots_trouves' => 'Plusieurs mots-clés trouvés pour "@cherche_mot@" :',
448
-	'info_portfolio_automatique' => 'Portfolio automatique :',
449
-	'info_premier_resultat' => '[@debut_limit@ premiers résultats sur @total@]',
450
-	'info_premier_resultat_sur' => '[@debut_limit@ premiers résultats sur @total@]',
451
-	'info_propose_1' => '[@nom_site_spip@] Propose : @titre@',
452
-	'info_propose_2' => 'Article proposé
397
+    'info_fini' => 'C’est fini !',
398
+    'info_format_image' => 'Formats d’images pouvant être utilisées pour créer des vignettes : @gd_formats@.',
399
+    'info_format_non_defini' => 'format non défini',
400
+    'info_grand_ecran' => 'Grand écran',
401
+    'info_image_aide' => 'AIDE',
402
+    'info_image_process_titre' => 'Méthode de fabrication des vignettes',
403
+    'info_impossible_lire_page' => '<b>Erreur !</b> Impossible de lire la page <tt><html>@test_proxy@</html></tt> à travers le proxy ',
404
+    'info_installation_systeme_publication' => 'Installation du système de publication...',
405
+    'info_installer_documents' => 'Vous pouvez installer automatiquement tous les documents contenus dans le dossier @upload@.',
406
+    'info_installer_ftp' => 'En tant qu’administrateur, vous pouvez installer (par FTP) des fichiers dans le dossier @upload@ pour ensuite les sélectionner directement ici.',
407
+    'info_installer_images' => 'Vous pouvez installer des images aux formats JPEG, GIF et PNG.',
408
+    'info_installer_images_dossier' => 'Installer des images dans le dossier @upload@ pour pouvoir les sélectionner ici.',
409
+    'info_interface_complete' => 'interface complète',
410
+    'info_interface_simple' => 'Interface simplifiée',
411
+    'info_joindre_document_article' => 'Vous pouvez joindre à cet article des documents de type',
412
+    'info_joindre_document_rubrique' => 'Vous pouvez ajouter dans cette rubrique des documents de type',
413
+    'info_joindre_documents_article' => 'Vous pouvez joindre à votre article des documents de type :',
414
+    'info_l_article' => 'l’article',
415
+    'info_la_breve' => 'la brève',
416
+    'info_la_rubrique' => 'la rubrique',
417
+    'info_langue_principale' => 'Langue principale du site',
418
+    'info_largeur_vignette' => '@largeur_vignette@ × @hauteur_vignette@ pixels',
419
+    'info_les_auteurs_1' => 'par @les_auteurs@',
420
+    'info_logo_format_interdit' => 'Seuls les logos aux formats @formats@ sont autorisés.',
421
+    'info_logo_max_poids' => 'Les logos doivent obligatoirement faire moins de @maxi@ (ce fichier fait @actuel@).',
422
+    'info_mail_fournisseur' => '[email protected]',
423
+    'info_message_2' => 'MESSAGE',
424
+    'info_message_supprime' => 'MESSAGE SUPPRIMÉ',
425
+    'info_messages_nb' => '@nb@ messages',
426
+    'info_messages_un' => '1 message',
427
+    'info_mise_en_ligne' => 'Date de mise en ligne :',
428
+    'info_modification_parametres_securite' => 'modifications des paramètres de sécurité',
429
+    'info_mois_courant' => 'Dans le courant du mois :',
430
+    'info_mot_cle_ajoute' => 'Le mot-clé suivant a été ajouté à',
431
+    'info_multi_herit' => 'Langue par défaut',
432
+    'info_multi_langues_soulignees' => 'Les <u>langues soulignées</u> bénéficient d’une traduction totale ou partielle des textes de l’interface. Si vous sélectionnez ces langues, de nombreux éléments du site public (dates, formulaires) seront automatiquement traduits. Pour les langues non soulignées, ces éléments apparaîtront dans la langue principale du site.',
433
+    'info_multilinguisme' => 'Multilinguisme',
434
+    'info_nom_non_utilisateurs_connectes' => 'Votre nom n’apparaît pas dans la liste des utilisateurs connectés.',
435
+    'info_nom_utilisateurs_connectes' => 'Votre nom apparaît dans la liste des utilisateurs connectés.',
436
+    'info_nombre_en_ligne' => 'Actuellement en ligne :',
437
+    'info_non_resultat' => 'Aucun résultat pour "@cherche_mot@"',
438
+    'info_non_utilisation_messagerie' => 'Vous n’utilisez pas la messagerie interne de ce site.',
439
+    'info_nouveau_message' => 'VOUS AVEZ UN NOUVEAU MESSAGE',
440
+    'info_nouveaux_messages' => 'VOUS AVEZ @total_messages@ NOUVEAUX MESSAGES',
441
+    'info_numero_abbreviation' => 'N° ',
442
+    'info_obligatoire' => 'Cette information est obligatoire',
443
+    'info_pense_bete' => 'PENSE-BÊTE',
444
+    'info_petit_ecran' => 'Petit écran',
445
+    'info_petition_close' => 'Pétition close',
446
+    'info_pixels' => 'pixels',
447
+    'info_plusieurs_mots_trouves' => 'Plusieurs mots-clés trouvés pour "@cherche_mot@" :',
448
+    'info_portfolio_automatique' => 'Portfolio automatique :',
449
+    'info_premier_resultat' => '[@debut_limit@ premiers résultats sur @total@]',
450
+    'info_premier_resultat_sur' => '[@debut_limit@ premiers résultats sur @total@]',
451
+    'info_propose_1' => '[@nom_site_spip@] Propose : @titre@',
452
+    'info_propose_2' => 'Article proposé
453 453
 ---------------',
454
-	'info_propose_3' => 'L’article "@titre@" est proposé à la publication.',
455
-	'info_propose_4' => 'Vous êtes invité à venir le consulter et à donner votre opinion',
456
-	'info_propose_5' => 'dans le forum qui lui est attaché. Il est disponible à l’adresse :',
457
-	'info_publie_01' => 'L’article "@titre@" a été validé par @connect_nom@.',
458
-	'info_publie_1' => '[@nom_site_spip@] PUBLIE : @titre@',
459
-	'info_publie_2' => 'Article publié
454
+    'info_propose_3' => 'L’article "@titre@" est proposé à la publication.',
455
+    'info_propose_4' => 'Vous êtes invité à venir le consulter et à donner votre opinion',
456
+    'info_propose_5' => 'dans le forum qui lui est attaché. Il est disponible à l’adresse :',
457
+    'info_publie_01' => 'L’article "@titre@" a été validé par @connect_nom@.',
458
+    'info_publie_1' => '[@nom_site_spip@] PUBLIE : @titre@',
459
+    'info_publie_2' => 'Article publié
460 460
 --------------',
461
-	'info_rechercher' => 'Rechercher',
462
-	'info_rechercher_02' => 'Rechercher :',
463
-	'info_remplacer_vignette' => 'Remplacer la vignette par défaut par un logo personnalisé :',
464
-	'info_rubriques_nb' => '@nb@ rubriques',
465
-	'info_rubriques_un' => '1 rubrique',
466
-	'info_sans_titre_2' => 'sans titre',
467
-	'info_selectionner_fichier' => 'Vous pouvez sélectionner un fichier du dossier @upload@',
468
-	'info_selectionner_fichier_2' => 'Sélectionner un fichier :',
469
-	'info_sites_nb' => '@nb@ sites',
470
-	'info_sites_un' => '1 site',
471
-	'info_supprimer_vignette' => 'supprimer la vignette',
472
-	'info_symbole_bleu' => 'Le symbole <b>bleu</b> indique un <b>pense-bête</b> : c’est-à-dire un message à votre usage personnel.',
473
-	'info_symbole_jaune' => 'Le symbole <b>jaune</b> indique une <b>annonce à tous les rédacteurs</b> : modifiable par tous les administrateurs, et visible par tous les rédacteurs.',
474
-	'info_symbole_vert' => 'Le symbole <b>vert</b> indique les <b>messages échangés avec d’autres utilisateurs</b> du site.',
475
-	'info_telecharger_nouveau_logo' => 'Télécharger un nouveau logo :',
476
-	'info_telecharger_ordinateur' => 'Télécharger depuis votre ordinateur :',
477
-	'info_tous_resultats_enregistres' => '[tous les résultats sont enregistrés]',
478
-	'info_tout_afficher' => 'Tout afficher',
479
-	'info_travaux_texte' => 'Ce site n’est pas encore configuré. Revenez plus tard...',
480
-	'info_travaux_titre' => 'Site en travaux',
481
-	'info_trop_resultat' => 'Trop de résultats pour "@cherche_mot@" ; veuillez affiner la recherche.',
482
-	'info_utilisation_messagerie_interne' => 'Vous utilisez la messagerie interne de ce site.',
483
-	'info_valider_lien' => 'valider ce lien',
484
-	'info_verifier_image' => ', veuillez vérifier que vos images ont été transférées correctement.',
485
-	'info_vignette_defaut' => 'Vignette par défaut',
486
-	'info_vignette_personnalisee' => 'Vignette personnalisée',
487
-	'info_visite' => 'visite :',
488
-	'info_vos_rendez_vous' => 'Vos rendez-vous à venir',
489
-	'infos_vos_pense_bete' => 'Vos pense-bêtes',
461
+    'info_rechercher' => 'Rechercher',
462
+    'info_rechercher_02' => 'Rechercher :',
463
+    'info_remplacer_vignette' => 'Remplacer la vignette par défaut par un logo personnalisé :',
464
+    'info_rubriques_nb' => '@nb@ rubriques',
465
+    'info_rubriques_un' => '1 rubrique',
466
+    'info_sans_titre_2' => 'sans titre',
467
+    'info_selectionner_fichier' => 'Vous pouvez sélectionner un fichier du dossier @upload@',
468
+    'info_selectionner_fichier_2' => 'Sélectionner un fichier :',
469
+    'info_sites_nb' => '@nb@ sites',
470
+    'info_sites_un' => '1 site',
471
+    'info_supprimer_vignette' => 'supprimer la vignette',
472
+    'info_symbole_bleu' => 'Le symbole <b>bleu</b> indique un <b>pense-bête</b> : c’est-à-dire un message à votre usage personnel.',
473
+    'info_symbole_jaune' => 'Le symbole <b>jaune</b> indique une <b>annonce à tous les rédacteurs</b> : modifiable par tous les administrateurs, et visible par tous les rédacteurs.',
474
+    'info_symbole_vert' => 'Le symbole <b>vert</b> indique les <b>messages échangés avec d’autres utilisateurs</b> du site.',
475
+    'info_telecharger_nouveau_logo' => 'Télécharger un nouveau logo :',
476
+    'info_telecharger_ordinateur' => 'Télécharger depuis votre ordinateur :',
477
+    'info_tous_resultats_enregistres' => '[tous les résultats sont enregistrés]',
478
+    'info_tout_afficher' => 'Tout afficher',
479
+    'info_travaux_texte' => 'Ce site n’est pas encore configuré. Revenez plus tard...',
480
+    'info_travaux_titre' => 'Site en travaux',
481
+    'info_trop_resultat' => 'Trop de résultats pour "@cherche_mot@" ; veuillez affiner la recherche.',
482
+    'info_utilisation_messagerie_interne' => 'Vous utilisez la messagerie interne de ce site.',
483
+    'info_valider_lien' => 'valider ce lien',
484
+    'info_verifier_image' => ', veuillez vérifier que vos images ont été transférées correctement.',
485
+    'info_vignette_defaut' => 'Vignette par défaut',
486
+    'info_vignette_personnalisee' => 'Vignette personnalisée',
487
+    'info_visite' => 'visite :',
488
+    'info_vos_rendez_vous' => 'Vos rendez-vous à venir',
489
+    'infos_vos_pense_bete' => 'Vos pense-bêtes',
490 490
 
491
-	// L
492
-	'label_ajout_id_rapide' => 'Ajout rapide',
493
-	'label_poids_fichier' => 'Taille',
494
-	'lien_afficher_icones_seuls' => 'Afficher uniquement les icones',
495
-	'lien_afficher_texte_icones' => 'Afficher les icones et le texte',
496
-	'lien_afficher_texte_seul' => 'Afficher uniquement le texte',
497
-	'lien_liberer' => 'libérer',
498
-	'lien_liberer_tous' => 'Tout libérer',
499
-	'lien_nouvea_pense_bete' => 'NOUVEAU PENSE-BÊTE',
500
-	'lien_nouveau_message' => 'NOUVEAU MESSAGE',
501
-	'lien_nouvelle_annonce' => 'NOUVELLE ANNONCE',
502
-	'lien_petitions' => 'PÉTITION',
503
-	'lien_popularite' => 'popularité : @popularite@%',
504
-	'lien_racine_site' => 'RACINE DU SITE',
505
-	'lien_reessayer' => 'réessayer',
506
-	'lien_repondre_message' => 'Répondre à ce message',
507
-	'lien_supprimer' => 'supprimer',
508
-	'lien_tout_afficher' => 'Tout afficher',
509
-	'lien_visite_site' => 'visiter ce site',
510
-	'lien_visites' => '@visites@ visites',
511
-	'lien_voir_auteur' => 'Voir cet auteur',
512
-	'ligne' => 'Ligne',
513
-	'login' => 'Connexion',
514
-	'login_acces_prive' => 'accès à l’espace privé',
515
-	'login_autre_identifiant' => 'se connecter sous un autre identifiant',
516
-	'login_cookie_accepte' => 'Veuillez régler votre navigateur pour qu’il les accepte (au moins pour ce site).',
517
-	'login_cookie_oblige' => 'Pour vous identifier de façon sûre sur ce site, vous devez accepter les cookies.',
518
-	'login_deconnexion_ok' => 'Déconnexion effectuée.',
519
-	'login_erreur_pass' => 'Erreur de mot de passe.',
520
-	'login_espace_prive' => 'espace privé',
521
-	'login_identifiant_inconnu' => 'L’identifiant « @login@ » est inconnu.',
522
-	'login_login' => 'Login :',
523
-	'login_login2' => 'Login ou adresse email :',
524
-	'login_login_pass_incorrect' => '(Login ou mot de passe incorrect.)',
525
-	'login_motpasseoublie' => 'mot de passe oublié ?',
526
-	'login_non_securise' => 'Attention, ce formulaire n’est pas sécurisé.
491
+    // L
492
+    'label_ajout_id_rapide' => 'Ajout rapide',
493
+    'label_poids_fichier' => 'Taille',
494
+    'lien_afficher_icones_seuls' => 'Afficher uniquement les icones',
495
+    'lien_afficher_texte_icones' => 'Afficher les icones et le texte',
496
+    'lien_afficher_texte_seul' => 'Afficher uniquement le texte',
497
+    'lien_liberer' => 'libérer',
498
+    'lien_liberer_tous' => 'Tout libérer',
499
+    'lien_nouvea_pense_bete' => 'NOUVEAU PENSE-BÊTE',
500
+    'lien_nouveau_message' => 'NOUVEAU MESSAGE',
501
+    'lien_nouvelle_annonce' => 'NOUVELLE ANNONCE',
502
+    'lien_petitions' => 'PÉTITION',
503
+    'lien_popularite' => 'popularité : @popularite@%',
504
+    'lien_racine_site' => 'RACINE DU SITE',
505
+    'lien_reessayer' => 'réessayer',
506
+    'lien_repondre_message' => 'Répondre à ce message',
507
+    'lien_supprimer' => 'supprimer',
508
+    'lien_tout_afficher' => 'Tout afficher',
509
+    'lien_visite_site' => 'visiter ce site',
510
+    'lien_visites' => '@visites@ visites',
511
+    'lien_voir_auteur' => 'Voir cet auteur',
512
+    'ligne' => 'Ligne',
513
+    'login' => 'Connexion',
514
+    'login_acces_prive' => 'accès à l’espace privé',
515
+    'login_autre_identifiant' => 'se connecter sous un autre identifiant',
516
+    'login_cookie_accepte' => 'Veuillez régler votre navigateur pour qu’il les accepte (au moins pour ce site).',
517
+    'login_cookie_oblige' => 'Pour vous identifier de façon sûre sur ce site, vous devez accepter les cookies.',
518
+    'login_deconnexion_ok' => 'Déconnexion effectuée.',
519
+    'login_erreur_pass' => 'Erreur de mot de passe.',
520
+    'login_espace_prive' => 'espace privé',
521
+    'login_identifiant_inconnu' => 'L’identifiant « @login@ » est inconnu.',
522
+    'login_login' => 'Login :',
523
+    'login_login2' => 'Login ou adresse email :',
524
+    'login_login_pass_incorrect' => '(Login ou mot de passe incorrect.)',
525
+    'login_motpasseoublie' => 'mot de passe oublié ?',
526
+    'login_non_securise' => 'Attention, ce formulaire n’est pas sécurisé.
527 527
 			Si vous ne voulez pas que votre mot de passe puisse être
528 528
 			intercepté sur le réseau, veuillez activer Javascript
529 529
 			dans votre navigateur et',
530
-	'login_nouvelle_tentative' => 'Nouvelle tentative',
531
-	'login_par_ici' => 'Vous êtes enregistré... par ici...',
532
-	'login_pass2' => 'Mot de passe :',
533
-	'login_preferez_refuser' => '<b>Si vous préférez refuser les cookies</b>, une autre méthode de connexion (moins sécurisée) est à votre disposition :',
534
-	'login_recharger' => 'recharger cette page',
535
-	'login_rester_identifie' => 'Rester identifié quelques jours',
536
-	'login_retour_public' => 'Retour au site public',
537
-	'login_retour_site' => 'Retour au site public',
538
-	'login_retoursitepublic' => 'retour au site public',
539
-	'login_sans_cookie' => 'Identification sans cookie',
540
-	'login_securise' => 'Login sécurisé',
541
-	'login_sinscrire' => 's’inscrire',
542
-	'login_test_navigateur' => 'test navigateur/reconnexion',
543
-	'login_verifiez_navigateur' => '(Vérifiez toutefois que votre navigateur n’a pas mémorisé votre mot de passe...)',
530
+    'login_nouvelle_tentative' => 'Nouvelle tentative',
531
+    'login_par_ici' => 'Vous êtes enregistré... par ici...',
532
+    'login_pass2' => 'Mot de passe :',
533
+    'login_preferez_refuser' => '<b>Si vous préférez refuser les cookies</b>, une autre méthode de connexion (moins sécurisée) est à votre disposition :',
534
+    'login_recharger' => 'recharger cette page',
535
+    'login_rester_identifie' => 'Rester identifié quelques jours',
536
+    'login_retour_public' => 'Retour au site public',
537
+    'login_retour_site' => 'Retour au site public',
538
+    'login_retoursitepublic' => 'retour au site public',
539
+    'login_sans_cookie' => 'Identification sans cookie',
540
+    'login_securise' => 'Login sécurisé',
541
+    'login_sinscrire' => 's’inscrire',
542
+    'login_test_navigateur' => 'test navigateur/reconnexion',
543
+    'login_verifiez_navigateur' => '(Vérifiez toutefois que votre navigateur n’a pas mémorisé votre mot de passe...)',
544 544
 
545
-	// M
546
-	'masquer_colonne' => 'Masquer cette colonne',
547
-	'masquer_trad' => 'masquer les traductions',
548
-	'message_nouveaux_identifiants_echec' => 'Impossible de générer de nouveaux identifiants.',
549
-	'message_nouveaux_identifiants_echec_envoi' => 'Les nouveaux identifiants de connexion n’ont pas pu être envoyés.',
550
-	'message_nouveaux_identifiants_ok' => 'Les nouveaux identifiants de connexion ont été envoyés à @email@.',
551
-	'module_fichiers_langues' => 'Fichiers de langue',
545
+    // M
546
+    'masquer_colonne' => 'Masquer cette colonne',
547
+    'masquer_trad' => 'masquer les traductions',
548
+    'message_nouveaux_identifiants_echec' => 'Impossible de générer de nouveaux identifiants.',
549
+    'message_nouveaux_identifiants_echec_envoi' => 'Les nouveaux identifiants de connexion n’ont pas pu être envoyés.',
550
+    'message_nouveaux_identifiants_ok' => 'Les nouveaux identifiants de connexion ont été envoyés à @email@.',
551
+    'module_fichiers_langues' => 'Fichiers de langue',
552 552
 
553
-	// N
554
-	'navigateur_pas_redirige' => 'Si votre navigateur n’est pas redirigé, cliquez ici pour continuer.',
555
-	'numero' => 'Numéro',
553
+    // N
554
+    'navigateur_pas_redirige' => 'Si votre navigateur n’est pas redirigé, cliquez ici pour continuer.',
555
+    'numero' => 'Numéro',
556 556
 
557
-	// O
558
-	'occurence' => 'Occurrence',
559
-	'onglet_affacer_base' => 'Effacer la base',
560
-	'onglet_auteur' => 'L’auteur',
561
-	'onglet_contenu_site' => 'Contenu du site',
562
-	'onglet_evolution_visite_mod' => 'Évolution',
563
-	'onglet_fonctions_avances' => 'Fonctions avancées',
564
-	'onglet_informations_personnelles' => 'Informations personnelles',
565
-	'onglet_interactivite' => 'Interactivité',
566
-	'onglet_messagerie' => 'Messagerie',
567
-	'onglet_repartition_rubrique' => 'Répartition par rubriques',
568
-	'onglet_save_restaur_base' => 'Sauvegarder/restaurer la base',
569
-	'onglet_vider_cache' => 'Vider le cache',
557
+    // O
558
+    'occurence' => 'Occurrence',
559
+    'onglet_affacer_base' => 'Effacer la base',
560
+    'onglet_auteur' => 'L’auteur',
561
+    'onglet_contenu_site' => 'Contenu du site',
562
+    'onglet_evolution_visite_mod' => 'Évolution',
563
+    'onglet_fonctions_avances' => 'Fonctions avancées',
564
+    'onglet_informations_personnelles' => 'Informations personnelles',
565
+    'onglet_interactivite' => 'Interactivité',
566
+    'onglet_messagerie' => 'Messagerie',
567
+    'onglet_repartition_rubrique' => 'Répartition par rubriques',
568
+    'onglet_save_restaur_base' => 'Sauvegarder/restaurer la base',
569
+    'onglet_vider_cache' => 'Vider le cache',
570 570
 
571
-	// P
572
-	'pass_choix_pass' => 'Veuillez choisir votre nouveau mot de passe :',
573
-	'pass_erreur' => 'Erreur',
574
-	'pass_erreur_acces_refuse' => '<b>Erreur :</b> vous n’avez plus accès à ce site.',
575
-	'pass_erreur_code_inconnu' => '<b>Erreur :</b> ce code ne correspond à aucun des visiteurs ayant accès à ce site.',
576
-	'pass_erreur_non_enregistre' => '<b>Erreur :</b> l’adresse <tt>@email_oubli@</tt> n’est pas enregistrée sur ce site.',
577
-	'pass_erreur_non_valide' => '<b>Erreur :</b> cet email <tt>@email_oubli@</tt> n’est pas valide !',
578
-	'pass_erreur_probleme_technique' => '<b>Erreur :</b> à cause d’un problème technique, l’email ne peut pas être envoyé.',
579
-	'pass_espace_prive_bla' => 'L’espace privé de ce site est ouvert aux
571
+    // P
572
+    'pass_choix_pass' => 'Veuillez choisir votre nouveau mot de passe :',
573
+    'pass_erreur' => 'Erreur',
574
+    'pass_erreur_acces_refuse' => '<b>Erreur :</b> vous n’avez plus accès à ce site.',
575
+    'pass_erreur_code_inconnu' => '<b>Erreur :</b> ce code ne correspond à aucun des visiteurs ayant accès à ce site.',
576
+    'pass_erreur_non_enregistre' => '<b>Erreur :</b> l’adresse <tt>@email_oubli@</tt> n’est pas enregistrée sur ce site.',
577
+    'pass_erreur_non_valide' => '<b>Erreur :</b> cet email <tt>@email_oubli@</tt> n’est pas valide !',
578
+    'pass_erreur_probleme_technique' => '<b>Erreur :</b> à cause d’un problème technique, l’email ne peut pas être envoyé.',
579
+    'pass_espace_prive_bla' => 'L’espace privé de ce site est ouvert aux
580 580
 		visiteurs, après inscription. Une fois enregistré,
581 581
 		vous pourrez consulter les articles en cours de rédaction,
582 582
 		proposer des articles et participer à tous les forums.',
583
-	'pass_forum_bla' => 'Vous avez demandé à intervenir sur un forum
583
+    'pass_forum_bla' => 'Vous avez demandé à intervenir sur un forum
584 584
 		réservé aux visiteurs enregistrés.',
585
-	'pass_indiquez_cidessous' => 'Indiquez ci-dessous l’adresse email sous laquelle vous
585
+    'pass_indiquez_cidessous' => 'Indiquez ci-dessous l’adresse email sous laquelle vous
586 586
 			vous êtes précédemment enregistré. Vous
587 587
 			recevrez un email vous indiquant la marche à suivre pour
588 588
 			récupérer votre accès.',
589
-	'pass_mail_passcookie' => '(ceci est un message automatique)
589
+    'pass_mail_passcookie' => '(ceci est un message automatique)
590 590
 Pour retrouver votre accès au site
591 591
 @nom_site_spip@ (@adresse_site@)
592 592
 
@@ -598,145 +598,145 @@  discard block
 block discarded – undo
598 598
 et vous reconnecter au site.
599 599
 
600 600
 ',
601
-	'pass_mot_oublie' => 'Mot de passe oublié',
602
-	'pass_nouveau_enregistre' => 'Votre nouveau mot de passe a été enregistré.',
603
-	'pass_nouveau_pass' => 'Nouveau mot de passe',
604
-	'pass_ok' => 'OK',
605
-	'pass_oubli_mot' => 'Oubli du mot de passe',
606
-	'pass_procedure_changer' => 'Pour modifier votre mot de passe, merci d’indiquer l’adresse email associée à votre compte.',
607
-	'pass_quitter_fenetre' => 'Quitter cette fenêtre',
608
-	'pass_rappel_login' => 'Rappel : votre identifiant (login) est « @login@ ».',
609
-	'pass_recevoir_mail' => 'Un lien de réinitialisation de votre mot de passe vous a été envoyé sur votre adresse email (si celle-ci est valide).',
610
-	'pass_retour_public' => 'Retour sur le site public',
611
-	'pass_rien_a_faire_ici' => 'Rien à faire ici.',
612
-	'pass_vousinscrire' => 'Vous inscrire sur ce site',
613
-	'precedent' => 'précédent',
614
-	'previsualisation' => 'Prévisualisation',
615
-	'previsualiser' => 'Prévisualiser',
601
+    'pass_mot_oublie' => 'Mot de passe oublié',
602
+    'pass_nouveau_enregistre' => 'Votre nouveau mot de passe a été enregistré.',
603
+    'pass_nouveau_pass' => 'Nouveau mot de passe',
604
+    'pass_ok' => 'OK',
605
+    'pass_oubli_mot' => 'Oubli du mot de passe',
606
+    'pass_procedure_changer' => 'Pour modifier votre mot de passe, merci d’indiquer l’adresse email associée à votre compte.',
607
+    'pass_quitter_fenetre' => 'Quitter cette fenêtre',
608
+    'pass_rappel_login' => 'Rappel : votre identifiant (login) est « @login@ ».',
609
+    'pass_recevoir_mail' => 'Un lien de réinitialisation de votre mot de passe vous a été envoyé sur votre adresse email (si celle-ci est valide).',
610
+    'pass_retour_public' => 'Retour sur le site public',
611
+    'pass_rien_a_faire_ici' => 'Rien à faire ici.',
612
+    'pass_vousinscrire' => 'Vous inscrire sur ce site',
613
+    'precedent' => 'précédent',
614
+    'previsualisation' => 'Prévisualisation',
615
+    'previsualiser' => 'Prévisualiser',
616 616
 
617
-	// R
618
-	'retour' => 'Retour',
617
+    // R
618
+    'retour' => 'Retour',
619 619
 
620
-	// S
621
-	'spip_conforme_dtd' => 'SPIP considère ce document comme conforme à son DOCTYPE :',
622
-	'squelette' => 'squelette',
623
-	'squelette_inclus_ligne' => 'squelette inclus, ligne',
624
-	'squelette_ligne' => 'squelette, ligne',
625
-	'stats_visites_et_popularite' => '@visites@ visites ; popularité : @popularite@',
626
-	'suivant' => 'suivant',
620
+    // S
621
+    'spip_conforme_dtd' => 'SPIP considère ce document comme conforme à son DOCTYPE :',
622
+    'squelette' => 'squelette',
623
+    'squelette_inclus_ligne' => 'squelette inclus, ligne',
624
+    'squelette_ligne' => 'squelette, ligne',
625
+    'stats_visites_et_popularite' => '@visites@ visites ; popularité : @popularite@',
626
+    'suivant' => 'suivant',
627 627
 
628
-	// T
629
-	'taille_go' => '@taille@ Go',
630
-	'taille_ko' => '@taille@ ko',
631
-	'taille_mo' => '@taille@ Mo',
632
-	'taille_octets' => '@taille@ octets',
633
-	'texte_actualite_site_1' => 'Quand vous serez familiarisé(e) avec l’interface, vous pourrez cliquer sur « ',
634
-	'texte_actualite_site_2' => 'interface complète',
635
-	'texte_actualite_site_3' => ' » pour ouvrir plus de possibilités.',
636
-	'texte_creation_automatique_vignette' => 'La création automatique de vignettes de prévisualisation est activée sur ce site. Si vous installez à partir de ce formulaire des images au(x) format(s) @gd_formats@, elles seront accompagnées d’une vignette d’une taille maximale de @taille_preview@ pixels.',
637
-	'texte_documents_associes' => 'Les documents suivants sont associés à l’article,
628
+    // T
629
+    'taille_go' => '@taille@ Go',
630
+    'taille_ko' => '@taille@ ko',
631
+    'taille_mo' => '@taille@ Mo',
632
+    'taille_octets' => '@taille@ octets',
633
+    'texte_actualite_site_1' => 'Quand vous serez familiarisé(e) avec l’interface, vous pourrez cliquer sur « ',
634
+    'texte_actualite_site_2' => 'interface complète',
635
+    'texte_actualite_site_3' => ' » pour ouvrir plus de possibilités.',
636
+    'texte_creation_automatique_vignette' => 'La création automatique de vignettes de prévisualisation est activée sur ce site. Si vous installez à partir de ce formulaire des images au(x) format(s) @gd_formats@, elles seront accompagnées d’une vignette d’une taille maximale de @taille_preview@ pixels.',
637
+    'texte_documents_associes' => 'Les documents suivants sont associés à l’article,
638 638
 				mais ils n’y ont pas été directement
639 639
 				insérés. Selon la mise en page du site public,
640 640
 				ils pourront apparaître sous forme de documents joints.',
641
-	'texte_erreur_mise_niveau_base' => 'Erreur de base de données lors de la mise à niveau.
641
+    'texte_erreur_mise_niveau_base' => 'Erreur de base de données lors de la mise à niveau.
642 642
 		L’image <b>@fichier@</b> n’est pas passée (article @id_article@).
643 643
 		Notez bien cette référence, réessayez la mise à
644 644
 		niveau, et enfin vérifiez que les images apparaissent
645 645
 		toujours dans les articles.',
646
-	'texte_erreur_visiteur' => 'Vous avez tenté d’accéder à l’espace privé avec un login qui ne le permet pas.',
647
-	'texte_inc_auth_1' => 'Vous êtes identifié sous le
646
+    'texte_erreur_visiteur' => 'Vous avez tenté d’accéder à l’espace privé avec un login qui ne le permet pas.',
647
+    'texte_inc_auth_1' => 'Vous êtes identifié sous le
648 648
 		login <b>@auth_login@</b>, mais celui-ci n’existe pas/plus dans la base.
649 649
 		Essayez de vous',
650
-	'texte_inc_auth_2' => 'reconnecter',
651
-	'texte_inc_auth_3' => ', après avoir éventuellement quitté puis
650
+    'texte_inc_auth_2' => 'reconnecter',
651
+    'texte_inc_auth_3' => ', après avoir éventuellement quitté puis
652 652
 		redémarré votre navigateur.',
653
-	'texte_inc_config' => 'Les modifications effectuées dans ces pages influent notablement sur le
653
+    'texte_inc_config' => 'Les modifications effectuées dans ces pages influent notablement sur le
654 654
  fonctionnement de votre site. Nous vous recommandons de ne pas y intervenir tant que vous n’êtes pas
655 655
  familier du fonctionnement du système SPIP. <br /><br /><b>Plus
656 656
  généralement, il est fortement conseillé
657 657
  de laisser la charge de ces pages au webmestre principal de votre site.</b>',
658
-	'texte_inc_meta_1' => 'Le système a rencontré une erreur lors de l’écriture du fichier <code>@fichier@</code>. Veuillez, en tant qu’administrateur du site,',
659
-	'texte_inc_meta_2' => 'vérifier les droits d’écriture',
660
-	'texte_inc_meta_3' => 'sur le répertoire <code>@repertoire@</code>.',
661
-	'texte_statut_en_cours_redaction' => 'en cours de rédaction',
662
-	'texte_statut_poubelle' => 'à la poubelle',
663
-	'texte_statut_propose_evaluation' => 'proposé à l’évaluation',
664
-	'texte_statut_publie' => 'publié en ligne',
665
-	'texte_statut_refuse' => 'refusé',
666
-	'titre_ajouter_mot_cle' => 'AJOUTER UN MOT-CLÉ :',
667
-	'titre_cadre_raccourcis' => 'RACCOURCIS :',
668
-	'titre_changer_couleur_interface' => 'Changer la couleur de l’interface',
669
-	'titre_image_admin_article' => 'Vous pouvez administrer cet article',
670
-	'titre_image_administrateur' => 'Administrateur',
671
-	'titre_image_aide' => 'De l’aide sur cet élément',
672
-	'titre_image_auteur_supprime' => 'Auteur supprimé',
673
-	'titre_image_redacteur' => 'Rédacteur sans accès',
674
-	'titre_image_redacteur_02' => 'Rédacteur',
675
-	'titre_image_selecteur' => 'Afficher la liste',
676
-	'titre_image_visiteur' => 'Visiteur',
677
-	'titre_joindre_document' => 'JOINDRE UN DOCUMENT',
678
-	'titre_mots_cles' => 'MOTS-CLÉS',
679
-	'titre_probleme_technique' => 'Attention : un problème technique (serveur SQL) empêche l’accès à cette partie du site. Merci de votre compréhension.',
680
-	'titre_publier_document' => 'PUBLIER UN DOCUMENT DANS CETTE RUBRIQUE',
681
-	'titre_signatures_attente' => 'Signatures en attente de validation',
682
-	'titre_signatures_confirmees' => 'Signatures confirmées',
683
-	'titre_statistiques' => 'Statistiques du site',
684
-	'titre_titre_document' => 'Titre du document :',
685
-	'todo' => 'à venir',
686
-	'trad_definir_reference' => 'Choisir "@titre@" comme référence des traductions',
687
-	'trad_reference' => '(référence des traductions)',
658
+    'texte_inc_meta_1' => 'Le système a rencontré une erreur lors de l’écriture du fichier <code>@fichier@</code>. Veuillez, en tant qu’administrateur du site,',
659
+    'texte_inc_meta_2' => 'vérifier les droits d’écriture',
660
+    'texte_inc_meta_3' => 'sur le répertoire <code>@repertoire@</code>.',
661
+    'texte_statut_en_cours_redaction' => 'en cours de rédaction',
662
+    'texte_statut_poubelle' => 'à la poubelle',
663
+    'texte_statut_propose_evaluation' => 'proposé à l’évaluation',
664
+    'texte_statut_publie' => 'publié en ligne',
665
+    'texte_statut_refuse' => 'refusé',
666
+    'titre_ajouter_mot_cle' => 'AJOUTER UN MOT-CLÉ :',
667
+    'titre_cadre_raccourcis' => 'RACCOURCIS :',
668
+    'titre_changer_couleur_interface' => 'Changer la couleur de l’interface',
669
+    'titre_image_admin_article' => 'Vous pouvez administrer cet article',
670
+    'titre_image_administrateur' => 'Administrateur',
671
+    'titre_image_aide' => 'De l’aide sur cet élément',
672
+    'titre_image_auteur_supprime' => 'Auteur supprimé',
673
+    'titre_image_redacteur' => 'Rédacteur sans accès',
674
+    'titre_image_redacteur_02' => 'Rédacteur',
675
+    'titre_image_selecteur' => 'Afficher la liste',
676
+    'titre_image_visiteur' => 'Visiteur',
677
+    'titre_joindre_document' => 'JOINDRE UN DOCUMENT',
678
+    'titre_mots_cles' => 'MOTS-CLÉS',
679
+    'titre_probleme_technique' => 'Attention : un problème technique (serveur SQL) empêche l’accès à cette partie du site. Merci de votre compréhension.',
680
+    'titre_publier_document' => 'PUBLIER UN DOCUMENT DANS CETTE RUBRIQUE',
681
+    'titre_signatures_attente' => 'Signatures en attente de validation',
682
+    'titre_signatures_confirmees' => 'Signatures confirmées',
683
+    'titre_statistiques' => 'Statistiques du site',
684
+    'titre_titre_document' => 'Titre du document :',
685
+    'todo' => 'à venir',
686
+    'trad_definir_reference' => 'Choisir "@titre@" comme référence des traductions',
687
+    'trad_reference' => '(référence des traductions)',
688 688
 
689
-	// U
690
-	'upload_limit' => 'Ce fichier est trop gros pour le serveur ; la taille maximum autorisée en <i>upload</i> est de @max@.',
689
+    // U
690
+    'upload_limit' => 'Ce fichier est trop gros pour le serveur ; la taille maximum autorisée en <i>upload</i> est de @max@.',
691 691
 
692
-	// Z
693
-	'zbug_balise_b_aval' => ' : balise B en aval',
694
-	'zbug_balise_inexistante' => 'Balise @balise@ mal déclarée pour @from@',
695
-	'zbug_balise_sans_argument' => 'Argument manquant dans la balise @balise@',
696
-	'zbug_boucle' => 'boucle',
697
-	'zbug_boucle_recursive_undef' => 'Boucle récursive non définie : @nom@',
698
-	'zbug_calcul' => 'calcul',
699
-	'zbug_champ_hors_boucle' => 'Champ @champ@ hors boucle',
700
-	'zbug_champ_hors_critere' => 'Champ @champ@ hors critère @critere@',
701
-	'zbug_champ_hors_motif' => 'Champ @champ@ hors d’un contexte @motif@',
702
-	'zbug_code' => 'code',
703
-	'zbug_critere_inconnu' => 'Critère inconnu @critere@',
704
-	'zbug_critere_sur_table_sans_cle_primaire' => '{@critere@} sur une table sans clef primaire atomique',
705
-	'zbug_distant_interdit' => 'Externe interdit', # Contexte : une base de données "externe", pas gérée par SPIP, mais que SPIP 1.8 sait utiliser dans ses boucles -- seul problèmes certaines manipulations sont interdites sur ces bases-là.
706
-	'zbug_doublon_table_sans_cle_primaire' => 'Doublons sur une table sans clef primaire atomique',
707
-	'zbug_doublon_table_sans_index' => 'Doublons sur une table sans index',
708
-	'zbug_erreur_boucle_double' => 'Double définition de la boucle @id@',
709
-	'zbug_erreur_boucle_fermant' => 'Boucle @id@ non fermée',
710
-	'zbug_erreur_boucle_syntaxe' => 'Syntaxe de la boucle @id@ incorrecte',
711
-	'zbug_erreur_compilation' => 'Erreur de compilation',
712
-	'zbug_erreur_execution_page' => 'Erreur d’exécution',
713
-	'zbug_erreur_filtre' => 'Filtre @filtre@ non défini',
714
-	'zbug_erreur_meme_parent' => 'Le critère {meme_parent} ne s’applique qu’aux boucles (FORUMS) ou (RUBRIQUES)',
715
-	'zbug_erreur_squelette' => 'Erreur(s) dans le squelette',
716
-	'zbug_hors_compilation' => 'Hors Compilation',
717
-	'zbug_info_erreur_squelette' => 'Erreur sur le site',
718
-	'zbug_inversion_ordre_inexistant' => 'Inversion d’un ordre inexistant',
719
-	'zbug_pagination_sans_critere' => 'Balise #PAGINATION sans critère {pagination} ou employé dans une boucle récursive',
720
-	'zbug_parametres_inclus_incorrects' => 'Paramètre d’inclusion incorrect : @param@',
721
-	'zbug_profile' => 'Temps de calcul : @time@',
722
-	'zbug_resultat' => 'résultat',
723
-	'zbug_serveur_indefini' => 'Serveur SQL indéfini',
724
-	'zbug_statistiques' => 'Statistiques des requêtes SQL classées par durée',
725
-	'zbug_table_inconnue' => 'Table SQL « @table@ » inconnue',
726
-	'zxml_connus_attributs' => 'attributs connus',
727
-	'zxml_de' => 'de',
728
-	'zxml_inconnu_attribut' => 'attribut inconnu',
729
-	'zxml_inconnu_balise' => 'balise inconnue',
730
-	'zxml_inconnu_entite' => 'entité inconnue',
731
-	'zxml_inconnu_id' => 'ID inconnu',
732
-	'zxml_mais_de' => 'mais de',
733
-	'zxml_non_conforme' => 'n’est pas conforme au motif',
734
-	'zxml_non_fils' => 'n’est pas un fils de',
735
-	'zxml_nonvide_balise' => 'balise non vide',
736
-	'zxml_obligatoire_attribut' => 'attribut obligatoire mais absent dans',
737
-	'zxml_succession_fils_incorrecte' => 'succession des fils incorrecte',
738
-	'zxml_survoler' => 'survoler pour voir les corrects',
739
-	'zxml_valeur_attribut' => 'valeur de l’attribut',
740
-	'zxml_vide_balise' => 'balise vide',
741
-	'zxml_vu' => 'vu auparavant'
692
+    // Z
693
+    'zbug_balise_b_aval' => ' : balise B en aval',
694
+    'zbug_balise_inexistante' => 'Balise @balise@ mal déclarée pour @from@',
695
+    'zbug_balise_sans_argument' => 'Argument manquant dans la balise @balise@',
696
+    'zbug_boucle' => 'boucle',
697
+    'zbug_boucle_recursive_undef' => 'Boucle récursive non définie : @nom@',
698
+    'zbug_calcul' => 'calcul',
699
+    'zbug_champ_hors_boucle' => 'Champ @champ@ hors boucle',
700
+    'zbug_champ_hors_critere' => 'Champ @champ@ hors critère @critere@',
701
+    'zbug_champ_hors_motif' => 'Champ @champ@ hors d’un contexte @motif@',
702
+    'zbug_code' => 'code',
703
+    'zbug_critere_inconnu' => 'Critère inconnu @critere@',
704
+    'zbug_critere_sur_table_sans_cle_primaire' => '{@critere@} sur une table sans clef primaire atomique',
705
+    'zbug_distant_interdit' => 'Externe interdit', # Contexte : une base de données "externe", pas gérée par SPIP, mais que SPIP 1.8 sait utiliser dans ses boucles -- seul problèmes certaines manipulations sont interdites sur ces bases-là.
706
+    'zbug_doublon_table_sans_cle_primaire' => 'Doublons sur une table sans clef primaire atomique',
707
+    'zbug_doublon_table_sans_index' => 'Doublons sur une table sans index',
708
+    'zbug_erreur_boucle_double' => 'Double définition de la boucle @id@',
709
+    'zbug_erreur_boucle_fermant' => 'Boucle @id@ non fermée',
710
+    'zbug_erreur_boucle_syntaxe' => 'Syntaxe de la boucle @id@ incorrecte',
711
+    'zbug_erreur_compilation' => 'Erreur de compilation',
712
+    'zbug_erreur_execution_page' => 'Erreur d’exécution',
713
+    'zbug_erreur_filtre' => 'Filtre @filtre@ non défini',
714
+    'zbug_erreur_meme_parent' => 'Le critère {meme_parent} ne s’applique qu’aux boucles (FORUMS) ou (RUBRIQUES)',
715
+    'zbug_erreur_squelette' => 'Erreur(s) dans le squelette',
716
+    'zbug_hors_compilation' => 'Hors Compilation',
717
+    'zbug_info_erreur_squelette' => 'Erreur sur le site',
718
+    'zbug_inversion_ordre_inexistant' => 'Inversion d’un ordre inexistant',
719
+    'zbug_pagination_sans_critere' => 'Balise #PAGINATION sans critère {pagination} ou employé dans une boucle récursive',
720
+    'zbug_parametres_inclus_incorrects' => 'Paramètre d’inclusion incorrect : @param@',
721
+    'zbug_profile' => 'Temps de calcul : @time@',
722
+    'zbug_resultat' => 'résultat',
723
+    'zbug_serveur_indefini' => 'Serveur SQL indéfini',
724
+    'zbug_statistiques' => 'Statistiques des requêtes SQL classées par durée',
725
+    'zbug_table_inconnue' => 'Table SQL « @table@ » inconnue',
726
+    'zxml_connus_attributs' => 'attributs connus',
727
+    'zxml_de' => 'de',
728
+    'zxml_inconnu_attribut' => 'attribut inconnu',
729
+    'zxml_inconnu_balise' => 'balise inconnue',
730
+    'zxml_inconnu_entite' => 'entité inconnue',
731
+    'zxml_inconnu_id' => 'ID inconnu',
732
+    'zxml_mais_de' => 'mais de',
733
+    'zxml_non_conforme' => 'n’est pas conforme au motif',
734
+    'zxml_non_fils' => 'n’est pas un fils de',
735
+    'zxml_nonvide_balise' => 'balise non vide',
736
+    'zxml_obligatoire_attribut' => 'attribut obligatoire mais absent dans',
737
+    'zxml_succession_fils_incorrecte' => 'succession des fils incorrecte',
738
+    'zxml_survoler' => 'survoler pour voir les corrects',
739
+    'zxml_valeur_attribut' => 'valeur de l’attribut',
740
+    'zxml_vide_balise' => 'balise vide',
741
+    'zxml_vu' => 'vu auparavant'
742 742
 );
Please login to merge, or discard this patch.