Completed
Push — master ( f3ee10...82bbb1 )
by cam
01:11
created
ecrire/public/references.php 2 patches
Indentation   +512 added lines, -512 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,74 +115,74 @@  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
-	$idb_origine = $idb;
131
-	$nom_champ_origine = $nom_champ;
132
-
133
-	$i = 0;
134
-	if (strlen($explicite)) {
135
-		// Recherche d'un champ dans un etage superieur
136
-		while (($idb !== $explicite) && ($idb !== '')) {
137
-			#	spip_log("Cherchexpl: $nom_champ '$explicite' '$idb' '$i'");
138
-			$i++;
139
-			$idb = $boucles[$idb]->id_parent;
140
-		}
141
-	}
142
-
143
-	#	spip_log("Cherche: $nom_champ a partir de '$idb'");
144
-	$nom_champ = strtolower($nom_champ);
145
-	$conditionnel = array();
146
-	// attention: entre la boucle nommee 0, "" et le tableau vide,
147
-	// il y a incoherences qu'il vaut mieux eviter
148
-	while (isset($boucles[$idb])) {
149
-		$joker = true;
150
-		// modifie $joker si tous les champs sont autorisés.
151
-		// $t = le select pour le champ, si on l'a trouvé (ou si joker)
152
-		// $c = le nom du champ demandé
153
-		list($t, $c) = index_tables_en_pile($idb, $nom_champ, $boucles, $joker);
154
-		if ($t) {
155
-			if ($select and !in_array($t, $boucles[$idb]->select)) {
156
-				$boucles[$idb]->select[] = $t;
157
-			}
158
-			// renseigner la boucle source de ce champ pour les traitements
159
-			$boucles[$idb_origine]->index_champ[$nom_champ_origine] = $idb;
160
-			$champ = '$Pile[$SP' . ($i ? "-$i" : "") . '][\'' . $c . '\']';
161
-			if (!$joker) {
162
-				return index_compose($conditionnel, $champ);
163
-			}
164
-
165
-			// tant que l'on trouve des tables avec joker, on continue
166
-			// avec la boucle parente et on conditionne à l'exécution
167
-			// la présence du champ. Si le champ existe à l'exécution
168
-			// dans une boucle, il est pris, sinon on le cherche dans le parent...
169
-			$conditionnel[] = "isset($champ)?$champ";
170
-		}
171
-
172
-		if ($remonte_pile) {
173
-			#	spip_log("On remonte vers $i");
174
-			// Sinon on remonte d'un cran
175
-			$idb = $boucles[$idb]->id_parent;
176
-			$i++;
177
-		} else {
178
-			$idb = null;
179
-		}
180
-	}
181
-
182
-	#	spip_log("Pas vu $nom_champ");
183
-	// esperons qu'il y sera
184
-	// ou qu'on a fourni une valeur par "defaut" plus pertinent
185
-	return index_compose($conditionnel, $defaut);
126
+    if (!is_string($defaut)) {
127
+        $defaut = '@$Pile[0][\'' . strtolower($nom_champ) . '\']';
128
+    }
129
+
130
+    $idb_origine = $idb;
131
+    $nom_champ_origine = $nom_champ;
132
+
133
+    $i = 0;
134
+    if (strlen($explicite)) {
135
+        // Recherche d'un champ dans un etage superieur
136
+        while (($idb !== $explicite) && ($idb !== '')) {
137
+            #	spip_log("Cherchexpl: $nom_champ '$explicite' '$idb' '$i'");
138
+            $i++;
139
+            $idb = $boucles[$idb]->id_parent;
140
+        }
141
+    }
142
+
143
+    #	spip_log("Cherche: $nom_champ a partir de '$idb'");
144
+    $nom_champ = strtolower($nom_champ);
145
+    $conditionnel = array();
146
+    // attention: entre la boucle nommee 0, "" et le tableau vide,
147
+    // il y a incoherences qu'il vaut mieux eviter
148
+    while (isset($boucles[$idb])) {
149
+        $joker = true;
150
+        // modifie $joker si tous les champs sont autorisés.
151
+        // $t = le select pour le champ, si on l'a trouvé (ou si joker)
152
+        // $c = le nom du champ demandé
153
+        list($t, $c) = index_tables_en_pile($idb, $nom_champ, $boucles, $joker);
154
+        if ($t) {
155
+            if ($select and !in_array($t, $boucles[$idb]->select)) {
156
+                $boucles[$idb]->select[] = $t;
157
+            }
158
+            // renseigner la boucle source de ce champ pour les traitements
159
+            $boucles[$idb_origine]->index_champ[$nom_champ_origine] = $idb;
160
+            $champ = '$Pile[$SP' . ($i ? "-$i" : "") . '][\'' . $c . '\']';
161
+            if (!$joker) {
162
+                return index_compose($conditionnel, $champ);
163
+            }
164
+
165
+            // tant que l'on trouve des tables avec joker, on continue
166
+            // avec la boucle parente et on conditionne à l'exécution
167
+            // la présence du champ. Si le champ existe à l'exécution
168
+            // dans une boucle, il est pris, sinon on le cherche dans le parent...
169
+            $conditionnel[] = "isset($champ)?$champ";
170
+        }
171
+
172
+        if ($remonte_pile) {
173
+            #	spip_log("On remonte vers $i");
174
+            // Sinon on remonte d'un cran
175
+            $idb = $boucles[$idb]->id_parent;
176
+            $i++;
177
+        } else {
178
+            $idb = null;
179
+        }
180
+    }
181
+
182
+    #	spip_log("Pas vu $nom_champ");
183
+    // esperons qu'il y sera
184
+    // ou qu'on a fourni une valeur par "defaut" plus pertinent
185
+    return index_compose($conditionnel, $defaut);
186 186
 }
187 187
 
188 188
 /**
@@ -196,12 +196,12 @@  discard block
 block discarded – undo
196 196
  * @return string              Code PHP complet de recherche d'un champ
197 197
  */
198 198
 function index_compose($conditionnel, $defaut) {
199
-	while ($c = array_pop($conditionnel)) {
200
-		// si on passe defaut = '', ne pas générer d'erreur de compilation.
201
-		$defaut = "($c:(" . ($defaut ? $defaut : "''") . "))";
202
-	}
199
+    while ($c = array_pop($conditionnel)) {
200
+        // si on passe defaut = '', ne pas générer d'erreur de compilation.
201
+        $defaut = "($c:(" . ($defaut ? $defaut : "''") . "))";
202
+    }
203 203
 
204
-	return $defaut;
204
+    return $defaut;
205 205
 }
206 206
 
207 207
 /**
@@ -237,74 +237,74 @@  discard block
 block discarded – undo
237 237
  **/
238 238
 function index_tables_en_pile($idb, $nom_champ, &$boucles, &$joker) {
239 239
 
240
-	$r = $boucles[$idb]->type_requete;
241
-	// boucle recursive, c'est foutu...
242
-	if ($r == TYPE_RECURSIF) {
243
-		return array();
244
-	}
245
-	if (!$r) {
246
-		$joker = false; // indiquer a l'appelant
247
-		# continuer pour chercher l'erreur suivante
248
-		return array("'#" . $r . ':' . $nom_champ . "'", '');
249
-	}
250
-
251
-	$desc = $boucles[$idb]->show;
252
-	// le nom du champ est il une exception de la table ? un alias ?
253
-	$excep = isset($GLOBALS['exceptions_des_tables'][$r]) ? $GLOBALS['exceptions_des_tables'][$r] : '';
254
-	if ($excep) {
255
-		$excep = isset($excep[$nom_champ]) ? $excep[$nom_champ] : '';
256
-	}
257
-	if ($excep) {
258
-		$joker = false; // indiquer a l'appelant
259
-		return index_exception($boucles[$idb], $desc, $nom_champ, $excep);
260
-	} // pas d'alias. Le champ existe t'il ?
261
-	else {
262
-		// le champ est réellement présent, on le prend.
263
-		if (isset($desc['field'][$nom_champ])) {
264
-			$t = $boucles[$idb]->id_table;
265
-			$joker = false; // indiquer a l'appelant
266
-			return array("$t.$nom_champ", $nom_champ);
267
-		}
268
-		// Tous les champs sont-ils acceptés ?
269
-		// Si oui, on retourne le champ, et on lève le flag joker
270
-		// C'est le cas des itérateurs DATA qui acceptent tout
271
-		// et testent la présence du champ à l'exécution et non à la compilation
272
-		// car ils ne connaissent pas ici leurs contenus.
273
-		elseif (/*$joker AND */
274
-		isset($desc['field']['*'])
275
-		) {
276
-			$joker = true; // indiquer a l'appelant
277
-			return array($nom_champ, $nom_champ);
278
-		}
279
-		// pas d'alias, pas de champ, pas de joker...
280
-		// tenter via une jointure...
281
-		else {
282
-			$joker = false; // indiquer a l'appelant
283
-			// regarder si le champ est deja dans une jointure existante
284
-			// sinon, si il y a des joitures explicites, la construire
285
-			if (!$t = trouver_champ_exterieur($nom_champ, $boucles[$idb]->from, $boucles[$idb])) {
286
-				if ($boucles[$idb]->jointures_explicites) {
287
-					// [todo] Ne pas lancer que lorsque il y a des jointures explicites !!!!
288
-					// fonctionnel, il suffit d'utiliser $boucles[$idb]->jointures au lieu de jointures_explicites
289
-					// mais est-ce ce qu'on veut ?
290
-					$jointures = preg_split("/\s+/", $boucles[$idb]->jointures_explicites);
291
-					if ($cle = trouver_jointure_champ($nom_champ, $boucles[$idb], $jointures)) {
292
-						$t = trouver_champ_exterieur($nom_champ, $boucles[$idb]->from, $boucles[$idb]);
293
-					}
294
-				}
295
-			}
296
-			if ($t) {
297
-				// si on a trouvé une jointure possible, on fait comme
298
-				// si c'était une exception pour le champ demandé
299
-				return index_exception($boucles[$idb],
300
-					$desc,
301
-					$nom_champ,
302
-					array($t[1]['id_table'], reset($t[2])));
303
-			}
304
-
305
-			return array('', '');
306
-		}
307
-	}
240
+    $r = $boucles[$idb]->type_requete;
241
+    // boucle recursive, c'est foutu...
242
+    if ($r == TYPE_RECURSIF) {
243
+        return array();
244
+    }
245
+    if (!$r) {
246
+        $joker = false; // indiquer a l'appelant
247
+        # continuer pour chercher l'erreur suivante
248
+        return array("'#" . $r . ':' . $nom_champ . "'", '');
249
+    }
250
+
251
+    $desc = $boucles[$idb]->show;
252
+    // le nom du champ est il une exception de la table ? un alias ?
253
+    $excep = isset($GLOBALS['exceptions_des_tables'][$r]) ? $GLOBALS['exceptions_des_tables'][$r] : '';
254
+    if ($excep) {
255
+        $excep = isset($excep[$nom_champ]) ? $excep[$nom_champ] : '';
256
+    }
257
+    if ($excep) {
258
+        $joker = false; // indiquer a l'appelant
259
+        return index_exception($boucles[$idb], $desc, $nom_champ, $excep);
260
+    } // pas d'alias. Le champ existe t'il ?
261
+    else {
262
+        // le champ est réellement présent, on le prend.
263
+        if (isset($desc['field'][$nom_champ])) {
264
+            $t = $boucles[$idb]->id_table;
265
+            $joker = false; // indiquer a l'appelant
266
+            return array("$t.$nom_champ", $nom_champ);
267
+        }
268
+        // Tous les champs sont-ils acceptés ?
269
+        // Si oui, on retourne le champ, et on lève le flag joker
270
+        // C'est le cas des itérateurs DATA qui acceptent tout
271
+        // et testent la présence du champ à l'exécution et non à la compilation
272
+        // car ils ne connaissent pas ici leurs contenus.
273
+        elseif (/*$joker AND */
274
+        isset($desc['field']['*'])
275
+        ) {
276
+            $joker = true; // indiquer a l'appelant
277
+            return array($nom_champ, $nom_champ);
278
+        }
279
+        // pas d'alias, pas de champ, pas de joker...
280
+        // tenter via une jointure...
281
+        else {
282
+            $joker = false; // indiquer a l'appelant
283
+            // regarder si le champ est deja dans une jointure existante
284
+            // sinon, si il y a des joitures explicites, la construire
285
+            if (!$t = trouver_champ_exterieur($nom_champ, $boucles[$idb]->from, $boucles[$idb])) {
286
+                if ($boucles[$idb]->jointures_explicites) {
287
+                    // [todo] Ne pas lancer que lorsque il y a des jointures explicites !!!!
288
+                    // fonctionnel, il suffit d'utiliser $boucles[$idb]->jointures au lieu de jointures_explicites
289
+                    // mais est-ce ce qu'on veut ?
290
+                    $jointures = preg_split("/\s+/", $boucles[$idb]->jointures_explicites);
291
+                    if ($cle = trouver_jointure_champ($nom_champ, $boucles[$idb], $jointures)) {
292
+                        $t = trouver_champ_exterieur($nom_champ, $boucles[$idb]->from, $boucles[$idb]);
293
+                    }
294
+                }
295
+            }
296
+            if ($t) {
297
+                // si on a trouvé une jointure possible, on fait comme
298
+                // si c'était une exception pour le champ demandé
299
+                return index_exception($boucles[$idb],
300
+                    $desc,
301
+                    $nom_champ,
302
+                    array($t[1]['id_table'], reset($t[2])));
303
+            }
304
+
305
+            return array('', '');
306
+        }
307
+    }
308 308
 }
309 309
 
310 310
 
@@ -332,52 +332,52 @@  discard block
 block discarded – undo
332 332
  *     est une expression pour le SELECT de la boucle du style "mots.titre AS titre_mot"
333 333
  **/
334 334
 function index_exception(&$boucle, $desc, $nom_champ, $excep) {
335
-	static $trouver_table;
336
-	if (!$trouver_table) {
337
-		$trouver_table = charger_fonction('trouver_table', 'base');
338
-	}
339
-
340
-	if (is_array($excep)) {
341
-		// permettre aux plugins de gerer eux meme des jointures derogatoire ingerables
342
-		$t = null;
343
-		if (count($excep) == 3) {
344
-			$index_exception_derogatoire = array_pop($excep);
345
-			$t = $index_exception_derogatoire($boucle, $desc, $nom_champ, $excep);
346
-		}
347
-		if ($t == null) {
348
-			list($e, $x) = $excep;  #PHP4 affecte de gauche a droite
349
-			$excep = $x;    #PHP5 de droite a gauche !
350
-			$j = $trouver_table($e, $boucle->sql_serveur);
351
-			if (!$j) {
352
-				return array('', '');
353
-			}
354
-			$e = $j['table'];
355
-			if (!$t = array_search($e, $boucle->from)) {
356
-				$k = $j['key']['PRIMARY KEY'];
357
-				if (strpos($k, ',')) {
358
-					$l = (preg_split('/\s*,\s*/', $k));
359
-					$k = $desc['key']['PRIMARY KEY'];
360
-					if (!in_array($k, $l)) {
361
-						spip_log("jointure impossible $e " . join(',', $l));
362
-
363
-						return array('', '');
364
-					}
365
-				}
366
-				$k = array($boucle->id_table, array($e), $k);
367
-				fabrique_jointures($boucle, array($k));
368
-				$t = array_search($e, $boucle->from);
369
-			}
370
-		}
371
-	} else {
372
-		$t = $boucle->id_table;
373
-	}
374
-	// demander a SQL de gerer le synonyme
375
-	// ca permet que excep soit dynamique (Cedric, 2/3/06)
376
-	if ($excep != $nom_champ) {
377
-		$excep .= ' AS ' . $nom_champ;
378
-	}
379
-
380
-	return array("$t.$excep", $nom_champ);
335
+    static $trouver_table;
336
+    if (!$trouver_table) {
337
+        $trouver_table = charger_fonction('trouver_table', 'base');
338
+    }
339
+
340
+    if (is_array($excep)) {
341
+        // permettre aux plugins de gerer eux meme des jointures derogatoire ingerables
342
+        $t = null;
343
+        if (count($excep) == 3) {
344
+            $index_exception_derogatoire = array_pop($excep);
345
+            $t = $index_exception_derogatoire($boucle, $desc, $nom_champ, $excep);
346
+        }
347
+        if ($t == null) {
348
+            list($e, $x) = $excep;  #PHP4 affecte de gauche a droite
349
+            $excep = $x;    #PHP5 de droite a gauche !
350
+            $j = $trouver_table($e, $boucle->sql_serveur);
351
+            if (!$j) {
352
+                return array('', '');
353
+            }
354
+            $e = $j['table'];
355
+            if (!$t = array_search($e, $boucle->from)) {
356
+                $k = $j['key']['PRIMARY KEY'];
357
+                if (strpos($k, ',')) {
358
+                    $l = (preg_split('/\s*,\s*/', $k));
359
+                    $k = $desc['key']['PRIMARY KEY'];
360
+                    if (!in_array($k, $l)) {
361
+                        spip_log("jointure impossible $e " . join(',', $l));
362
+
363
+                        return array('', '');
364
+                    }
365
+                }
366
+                $k = array($boucle->id_table, array($e), $k);
367
+                fabrique_jointures($boucle, array($k));
368
+                $t = array_search($e, $boucle->from);
369
+            }
370
+        }
371
+    } else {
372
+        $t = $boucle->id_table;
373
+    }
374
+    // demander a SQL de gerer le synonyme
375
+    // ca permet que excep soit dynamique (Cedric, 2/3/06)
376
+    if ($excep != $nom_champ) {
377
+        $excep .= ' AS ' . $nom_champ;
378
+    }
379
+
380
+    return array("$t.$excep", $nom_champ);
381 381
 }
382 382
 
383 383
 /**
@@ -402,7 +402,7 @@  discard block
 block discarded – undo
402 402
  *     Code PHP pour retrouver le champ
403 403
  */
404 404
 function champ_sql($champ, $p, $defaut = null, $remonte_pile = true) {
405
-	return index_pile($p->id_boucle, $champ, $p->boucles, $p->nom_boucle, $defaut, $remonte_pile);
405
+    return index_pile($p->id_boucle, $champ, $p->boucles, $p->nom_boucle, $defaut, $remonte_pile);
406 406
 }
407 407
 
408 408
 
@@ -422,9 +422,9 @@  discard block
 block discarded – undo
422 422
  *     Code PHP pour d'exécution de la balise et de ses filtres
423 423
  **/
424 424
 function calculer_champ($p) {
425
-	$p = calculer_balise($p->nom_champ, $p);
425
+    $p = calculer_balise($p->nom_champ, $p);
426 426
 
427
-	return applique_filtres($p);
427
+    return applique_filtres($p);
428 428
 }
429 429
 
430 430
 
@@ -461,26 +461,26 @@  discard block
 block discarded – undo
461 461
  **/
462 462
 function calculer_balise($nom, $p) {
463 463
 
464
-	// S'agit-t-il d'une balise_XXXX[_dist]() ?
465
-	if ($f = charger_fonction($nom, 'balise', true)) {
466
-		$p->balise_calculee = true;
467
-		$res = $f($p);
468
-		if ($res !== null and is_object($res)) {
469
-			return $res;
470
-		}
471
-	}
472
-
473
-	// Certaines des balises comportant un _ sont generiques
474
-	if ($balise_generique = chercher_balise_generique($nom)) {
475
-		$res = $balise_generique['fonction_generique']($p);
476
-		if ($res !== null and is_object($res)) {
477
-			return $res;
478
-		}
479
-	}
480
-
481
-	$f = charger_fonction('DEFAUT', 'calculer_balise');
482
-
483
-	return $f($nom, $p);
464
+    // S'agit-t-il d'une balise_XXXX[_dist]() ?
465
+    if ($f = charger_fonction($nom, 'balise', true)) {
466
+        $p->balise_calculee = true;
467
+        $res = $f($p);
468
+        if ($res !== null and is_object($res)) {
469
+            return $res;
470
+        }
471
+    }
472
+
473
+    // Certaines des balises comportant un _ sont generiques
474
+    if ($balise_generique = chercher_balise_generique($nom)) {
475
+        $res = $balise_generique['fonction_generique']($p);
476
+        if ($res !== null and is_object($res)) {
477
+            return $res;
478
+        }
479
+    }
480
+
481
+    $f = charger_fonction('DEFAUT', 'calculer_balise');
482
+
483
+    return $f($nom, $p);
484 484
 }
485 485
 
486 486
 
@@ -508,36 +508,36 @@  discard block
 block discarded – undo
508 508
  **/
509 509
 function calculer_balise_DEFAUT_dist($nom, $p) {
510 510
 
511
-	// ca pourrait etre un champ SQL homonyme,
512
-	$p->code = index_pile($p->id_boucle, $nom, $p->boucles, $p->nom_boucle);
513
-
514
-	// compatibilite: depuis qu'on accepte #BALISE{ses_args} sans [(...)] autour
515
-	// il faut recracher {...} quand ce n'est finalement pas des args
516
-	if ($p->fonctions and (!$p->fonctions[0][0]) and $p->fonctions[0][1]) {
517
-		$code = addslashes($p->fonctions[0][1]);
518
-		$p->code .= " . '$code'";
519
-	}
520
-
521
-	// ne pas passer le filtre securite sur les id_xxx
522
-	if (strpos($nom, 'ID_') === 0) {
523
-		$p->interdire_scripts = false;
524
-	}
525
-
526
-	// Compatibilite ascendante avec les couleurs html (#FEFEFE) :
527
-	// SI le champ SQL n'est pas trouve
528
-	// ET si la balise a une forme de couleur
529
-	// ET s'il n'y a ni filtre ni etoile
530
-	// ALORS retourner la couleur.
531
-	// Ca permet si l'on veut vraiment de recuperer [(#ACCEDE*)]
532
-	if (preg_match("/^[A-F]{1,6}$/i", $nom)
533
-		and !$p->etoile
534
-		and !$p->fonctions
535
-	) {
536
-		$p->code = "'#$nom'";
537
-		$p->interdire_scripts = false;
538
-	}
539
-
540
-	return $p;
511
+    // ca pourrait etre un champ SQL homonyme,
512
+    $p->code = index_pile($p->id_boucle, $nom, $p->boucles, $p->nom_boucle);
513
+
514
+    // compatibilite: depuis qu'on accepte #BALISE{ses_args} sans [(...)] autour
515
+    // il faut recracher {...} quand ce n'est finalement pas des args
516
+    if ($p->fonctions and (!$p->fonctions[0][0]) and $p->fonctions[0][1]) {
517
+        $code = addslashes($p->fonctions[0][1]);
518
+        $p->code .= " . '$code'";
519
+    }
520
+
521
+    // ne pas passer le filtre securite sur les id_xxx
522
+    if (strpos($nom, 'ID_') === 0) {
523
+        $p->interdire_scripts = false;
524
+    }
525
+
526
+    // Compatibilite ascendante avec les couleurs html (#FEFEFE) :
527
+    // SI le champ SQL n'est pas trouve
528
+    // ET si la balise a une forme de couleur
529
+    // ET s'il n'y a ni filtre ni etoile
530
+    // ALORS retourner la couleur.
531
+    // Ca permet si l'on veut vraiment de recuperer [(#ACCEDE*)]
532
+    if (preg_match("/^[A-F]{1,6}$/i", $nom)
533
+        and !$p->etoile
534
+        and !$p->fonctions
535
+    ) {
536
+        $p->code = "'#$nom'";
537
+        $p->interdire_scripts = false;
538
+    }
539
+
540
+    return $p;
541 541
 }
542 542
 
543 543
 
@@ -580,36 +580,36 @@  discard block
 block discarded – undo
580 580
  **/
581 581
 function calculer_balise_dynamique($p, $nom, $l, $supp = array()) {
582 582
 
583
-	if (!balise_distante_interdite($p)) {
584
-		$p->code = "''";
585
-
586
-		return $p;
587
-	}
588
-	// compatibilite: depuis qu'on accepte #BALISE{ses_args} sans [(...)] autour
589
-	// il faut recracher {...} quand ce n'est finalement pas des args
590
-	if ($p->fonctions and (!$p->fonctions[0][0]) and $p->fonctions[0][1]) {
591
-		$p->fonctions = null;
592
-	}
593
-
594
-	if ($p->param and ($c = $p->param[0])) {
595
-		// liste d'arguments commence toujours par la chaine vide
596
-		array_shift($c);
597
-		// construire la liste d'arguments comme pour un filtre
598
-		$param = compose_filtres_args($p, $c, ',');
599
-	} else {
600
-		$param = "";
601
-	}
602
-	$collecte = collecter_balise_dynamique($l, $p, $nom);
603
-
604
-	$p->code = sprintf(CODE_EXECUTER_BALISE, $nom,
605
-		join(',', $collecte),
606
-		($collecte ? $param : substr($param, 1)), # virer la virgule
607
-		memoriser_contexte_compil($p),
608
-		(!$supp ? '' : (', ' . join(',', $supp))));
609
-
610
-	$p->interdire_scripts = false;
611
-
612
-	return $p;
583
+    if (!balise_distante_interdite($p)) {
584
+        $p->code = "''";
585
+
586
+        return $p;
587
+    }
588
+    // compatibilite: depuis qu'on accepte #BALISE{ses_args} sans [(...)] autour
589
+    // il faut recracher {...} quand ce n'est finalement pas des args
590
+    if ($p->fonctions and (!$p->fonctions[0][0]) and $p->fonctions[0][1]) {
591
+        $p->fonctions = null;
592
+    }
593
+
594
+    if ($p->param and ($c = $p->param[0])) {
595
+        // liste d'arguments commence toujours par la chaine vide
596
+        array_shift($c);
597
+        // construire la liste d'arguments comme pour un filtre
598
+        $param = compose_filtres_args($p, $c, ',');
599
+    } else {
600
+        $param = "";
601
+    }
602
+    $collecte = collecter_balise_dynamique($l, $p, $nom);
603
+
604
+    $p->code = sprintf(CODE_EXECUTER_BALISE, $nom,
605
+        join(',', $collecte),
606
+        ($collecte ? $param : substr($param, 1)), # virer la virgule
607
+        memoriser_contexte_compil($p),
608
+        (!$supp ? '' : (', ' . join(',', $supp))));
609
+
610
+    $p->interdire_scripts = false;
611
+
612
+    return $p;
613 613
 }
614 614
 
615 615
 
@@ -639,13 +639,13 @@  discard block
 block discarded – undo
639 639
  *     Liste des codes PHP d'éxecution des balises collectées
640 640
  **/
641 641
 function collecter_balise_dynamique($l, &$p, $nom) {
642
-	$args = array();
643
-	foreach ($l as $c) {
644
-		$x = calculer_balise($c, $p);
645
-		$args[] = $x->code;
646
-	}
642
+    $args = array();
643
+    foreach ($l as $c) {
644
+        $x = calculer_balise($c, $p);
645
+        $args[] = $x->code;
646
+    }
647 647
 
648
-	return $args;
648
+    return $args;
649 649
 }
650 650
 
651 651
 
@@ -660,20 +660,20 @@  discard block
 block discarded – undo
660 660
  *     Nom de la connexion
661 661
  **/
662 662
 function trouver_nom_serveur_distant($p) {
663
-	$nom = $p->id_boucle;
664
-	if ($nom
665
-		and isset($p->boucles[$nom])
666
-	) {
667
-		$s = $p->boucles[$nom]->sql_serveur;
668
-		if (strlen($s)
669
-			and strlen($serveur = strtolower($s))
670
-			and !in_array($serveur, $GLOBALS['exception_des_connect'])
671
-		) {
672
-			return $serveur;
673
-		}
674
-	}
675
-
676
-	return "";
663
+    $nom = $p->id_boucle;
664
+    if ($nom
665
+        and isset($p->boucles[$nom])
666
+    ) {
667
+        $s = $p->boucles[$nom]->sql_serveur;
668
+        if (strlen($s)
669
+            and strlen($serveur = strtolower($s))
670
+            and !in_array($serveur, $GLOBALS['exception_des_connect'])
671
+        ) {
672
+            return $serveur;
673
+        }
674
+    }
675
+
676
+    return "";
677 677
 }
678 678
 
679 679
 
@@ -697,15 +697,15 @@  discard block
 block discarded – undo
697 697
  *     - false : La balise est interdite car le serveur est distant
698 698
  **/
699 699
 function balise_distante_interdite($p) {
700
-	$nom = $p->id_boucle;
700
+    $nom = $p->id_boucle;
701 701
 
702
-	if ($nom and trouver_nom_serveur_distant($p)) {
703
-		spip_log($nom . ':' . $p->nom_champ . ' ' . _T('zbug_distant_interdit'));
702
+    if ($nom and trouver_nom_serveur_distant($p)) {
703
+        spip_log($nom . ':' . $p->nom_champ . ' ' . _T('zbug_distant_interdit'));
704 704
 
705
-		return false;
706
-	}
705
+        return false;
706
+    }
707 707
 
708
-	return true;
708
+    return true;
709 709
 }
710 710
 
711 711
 
@@ -716,83 +716,83 @@  discard block
 block discarded – undo
716 716
 // https://code.spip.net/@champs_traitements
717 717
 function champs_traitements($p) {
718 718
 
719
-	if (isset($GLOBALS['table_des_traitements'][$p->nom_champ])) {
720
-		$ps = $GLOBALS['table_des_traitements'][$p->nom_champ];
721
-	} else {
722
-		// quand on utilise un traitement catch-all *
723
-		// celui-ci ne s'applique pas sur les balises calculees qui peuvent gerer
724
-		// leur propre securite
725
-		if (!$p->balise_calculee) {
726
-			$ps = $GLOBALS['table_des_traitements']['*'];
727
-		} else {
728
-			$ps = false;
729
-		}
730
-	}
731
-
732
-	if (is_array($ps)) {
733
-		// Recuperer le type de boucle (articles, DATA) et la table SQL sur laquelle elle porte
734
-		$idb = index_boucle($p);
735
-		// si le champ a ete trouve dans une boucle parente sa source est renseignee ici
736
-		if (!empty($p->boucles[$idb]->index_champ[$p->nom_champ])) {
737
-			$idb = $p->boucles[$idb]->index_champ[$p->nom_champ];
738
-		}
739
-
740
-		// mais on peut aussi etre hors boucle. Se mefier.
741
-		$type_requete = isset($p->boucles[$idb]->type_requete) ? $p->boucles[$idb]->type_requete : false;
742
-		$table_sql = isset($p->boucles[$idb]->show['table_sql']) ? $p->boucles[$idb]->show['table_sql'] : false;
743
-
744
-		// bien prendre en compte les alias de boucles (hierarchie => rubrique, syndication => syncdic, etc.)
745
-		if ($type_requete and isset($GLOBALS['table_des_tables'][$type_requete])) {
746
-			$type_alias = $type_requete;
747
-			$type_requete = $GLOBALS['table_des_tables'][$type_requete];
748
-		} else {
749
-			$type_alias = false;
750
-		}
751
-
752
-		// le traitement peut n'etre defini que pour une table en particulier "spip_articles"
753
-		if ($table_sql and isset($ps[$table_sql])) {
754
-			$ps = $ps[$table_sql];
755
-		} // ou pour une boucle en particulier "DATA","articles"
756
-		elseif ($type_requete and isset($ps[$type_requete])) {
757
-			$ps = $ps[$type_requete];
758
-		} // ou pour une boucle utilisant un alias ("hierarchie")
759
-		elseif ($type_alias and isset($ps[$type_alias])) {
760
-			$ps = $ps[$type_alias];
761
-		} // ou pour indifféremment quelle que soit la boucle
762
-		elseif (isset($ps[0])) {
763
-			$ps = $ps[0];
764
-		} else {
765
-			$ps = false;
766
-		}
767
-	}
768
-
769
-	if (!$ps) {
770
-		return $p->code;
771
-	}
772
-
773
-	// Si une boucle DOCUMENTS{doublons} est presente dans le squelette,
774
-	// ou si in INCLURE contient {doublons}
775
-	// on insere une fonction de remplissage du tableau des doublons 
776
-	// dans les filtres propre() ou typo()
777
-	// (qui traitent les raccourcis <docXX> referencant les docs)
778
-
779
-	if (isset($p->descr['documents'])
780
-		and
781
-		$p->descr['documents']
782
-		and (
783
-			(strpos($ps, 'propre') !== false)
784
-			or
785
-			(strpos($ps, 'typo') !== false)
786
-		)
787
-	) {
788
-		$ps = 'traiter_doublons_documents($doublons, ' . $ps . ')';
789
-	}
790
-
791
-	// La protection des champs par |safehtml est assuree par les extensions
792
-	// dans la declaration des traitements des champs sensibles
793
-
794
-	// Remplacer enfin le placeholder %s par le vrai code de la balise
795
-	return str_replace('%s', $p->code, $ps);
719
+    if (isset($GLOBALS['table_des_traitements'][$p->nom_champ])) {
720
+        $ps = $GLOBALS['table_des_traitements'][$p->nom_champ];
721
+    } else {
722
+        // quand on utilise un traitement catch-all *
723
+        // celui-ci ne s'applique pas sur les balises calculees qui peuvent gerer
724
+        // leur propre securite
725
+        if (!$p->balise_calculee) {
726
+            $ps = $GLOBALS['table_des_traitements']['*'];
727
+        } else {
728
+            $ps = false;
729
+        }
730
+    }
731
+
732
+    if (is_array($ps)) {
733
+        // Recuperer le type de boucle (articles, DATA) et la table SQL sur laquelle elle porte
734
+        $idb = index_boucle($p);
735
+        // si le champ a ete trouve dans une boucle parente sa source est renseignee ici
736
+        if (!empty($p->boucles[$idb]->index_champ[$p->nom_champ])) {
737
+            $idb = $p->boucles[$idb]->index_champ[$p->nom_champ];
738
+        }
739
+
740
+        // mais on peut aussi etre hors boucle. Se mefier.
741
+        $type_requete = isset($p->boucles[$idb]->type_requete) ? $p->boucles[$idb]->type_requete : false;
742
+        $table_sql = isset($p->boucles[$idb]->show['table_sql']) ? $p->boucles[$idb]->show['table_sql'] : false;
743
+
744
+        // bien prendre en compte les alias de boucles (hierarchie => rubrique, syndication => syncdic, etc.)
745
+        if ($type_requete and isset($GLOBALS['table_des_tables'][$type_requete])) {
746
+            $type_alias = $type_requete;
747
+            $type_requete = $GLOBALS['table_des_tables'][$type_requete];
748
+        } else {
749
+            $type_alias = false;
750
+        }
751
+
752
+        // le traitement peut n'etre defini que pour une table en particulier "spip_articles"
753
+        if ($table_sql and isset($ps[$table_sql])) {
754
+            $ps = $ps[$table_sql];
755
+        } // ou pour une boucle en particulier "DATA","articles"
756
+        elseif ($type_requete and isset($ps[$type_requete])) {
757
+            $ps = $ps[$type_requete];
758
+        } // ou pour une boucle utilisant un alias ("hierarchie")
759
+        elseif ($type_alias and isset($ps[$type_alias])) {
760
+            $ps = $ps[$type_alias];
761
+        } // ou pour indifféremment quelle que soit la boucle
762
+        elseif (isset($ps[0])) {
763
+            $ps = $ps[0];
764
+        } else {
765
+            $ps = false;
766
+        }
767
+    }
768
+
769
+    if (!$ps) {
770
+        return $p->code;
771
+    }
772
+
773
+    // Si une boucle DOCUMENTS{doublons} est presente dans le squelette,
774
+    // ou si in INCLURE contient {doublons}
775
+    // on insere une fonction de remplissage du tableau des doublons 
776
+    // dans les filtres propre() ou typo()
777
+    // (qui traitent les raccourcis <docXX> referencant les docs)
778
+
779
+    if (isset($p->descr['documents'])
780
+        and
781
+        $p->descr['documents']
782
+        and (
783
+            (strpos($ps, 'propre') !== false)
784
+            or
785
+            (strpos($ps, 'typo') !== false)
786
+        )
787
+    ) {
788
+        $ps = 'traiter_doublons_documents($doublons, ' . $ps . ')';
789
+    }
790
+
791
+    // La protection des champs par |safehtml est assuree par les extensions
792
+    // dans la declaration des traitements des champs sensibles
793
+
794
+    // Remplacer enfin le placeholder %s par le vrai code de la balise
795
+    return str_replace('%s', $p->code, $ps);
796 796
 }
797 797
 
798 798
 
@@ -805,112 +805,112 @@  discard block
 block discarded – undo
805 805
 // https://code.spip.net/@applique_filtres
806 806
 function applique_filtres($p) {
807 807
 
808
-	// Traitements standards (cf. supra)
809
-	if ($p->etoile == '') {
810
-		$code = champs_traitements($p);
811
-	} else {
812
-		$code = $p->code;
813
-	}
808
+    // Traitements standards (cf. supra)
809
+    if ($p->etoile == '') {
810
+        $code = champs_traitements($p);
811
+    } else {
812
+        $code = $p->code;
813
+    }
814 814
 
815
-	// Appliquer les filtres perso
816
-	if ($p->param) {
817
-		$code = compose_filtres($p, $code);
818
-	}
815
+    // Appliquer les filtres perso
816
+    if ($p->param) {
817
+        $code = compose_filtres($p, $code);
818
+    }
819 819
 
820
-	// S'il y a un lien avec la session, ajouter un code qui levera
821
-	// un drapeau dans la structure d'invalidation $Cache
822
-	if (isset($p->descr['session'])) {
823
-		$code = "invalideur_session(\$Cache, $code)";
824
-	}
820
+    // S'il y a un lien avec la session, ajouter un code qui levera
821
+    // un drapeau dans la structure d'invalidation $Cache
822
+    if (isset($p->descr['session'])) {
823
+        $code = "invalideur_session(\$Cache, $code)";
824
+    }
825 825
 
826
-	$code = sandbox_composer_interdire_scripts($code, $p);
826
+    $code = sandbox_composer_interdire_scripts($code, $p);
827 827
 
828
-	return $code;
828
+    return $code;
829 829
 }
830 830
 
831 831
 // Cf. function pipeline dans ecrire/inc_utils.php
832 832
 // https://code.spip.net/@compose_filtres
833 833
 function compose_filtres(&$p, $code) {
834 834
 
835
-	$image_miette = false;
836
-	foreach ($p->param as $filtre) {
837
-		$fonc = array_shift($filtre);
838
-		if (!$fonc) {
839
-			continue;
840
-		} // normalement qu'au premier tour.
841
-		$is_filtre_image = ((substr($fonc, 0, 6) == 'image_') and $fonc != 'image_graver');
842
-		if ($image_miette and !$is_filtre_image) {
843
-			// il faut graver maintenant car apres le filtre en cours
844
-			// on est pas sur d'avoir encore le nom du fichier dans le pipe
845
-			$code = "filtrer('image_graver', $code)";
846
-			$image_miette = false;
847
-		}
848
-
849
-		// recuperer les arguments du filtre, 
850
-		// a separer par "," ou ":" dans le cas du filtre "?{a,b}"
851
-		$countfiltre = count($filtre);
852
-		if ($fonc !== '?') {
853
-			$sep = ',';
854
-		} else {
855
-			$sep = ':';
856
-			// |?{a,b} *doit* avoir exactement 2 arguments ; on les force
857
-			if ($countfiltre != 2) {
858
-				$filtre = array($filtre[0] ?? '', $filtre[1] ?? '');
859
-				$countfiltre = 2;
860
-			}
861
-		}
862
-		$arglist = compose_filtres_args($p, $filtre, $sep);
863
-		$logique = filtre_logique($fonc, $code, substr($arglist, 1));
864
-		if ($logique) {
865
-			$code = $logique;
866
-		} else {
867
-			$code = sandbox_composer_filtre($fonc, $code, $arglist, $p, $countfiltre);
868
-			if ($is_filtre_image) {
869
-				$image_miette = true;
870
-			}
871
-		}
872
-	}
873
-	// ramasser les images intermediaires inutiles et graver l'image finale
874
-	if ($image_miette) {
875
-		$code = "filtrer('image_graver',$code)";
876
-	}
877
-
878
-	return $code;
835
+    $image_miette = false;
836
+    foreach ($p->param as $filtre) {
837
+        $fonc = array_shift($filtre);
838
+        if (!$fonc) {
839
+            continue;
840
+        } // normalement qu'au premier tour.
841
+        $is_filtre_image = ((substr($fonc, 0, 6) == 'image_') and $fonc != 'image_graver');
842
+        if ($image_miette and !$is_filtre_image) {
843
+            // il faut graver maintenant car apres le filtre en cours
844
+            // on est pas sur d'avoir encore le nom du fichier dans le pipe
845
+            $code = "filtrer('image_graver', $code)";
846
+            $image_miette = false;
847
+        }
848
+
849
+        // recuperer les arguments du filtre, 
850
+        // a separer par "," ou ":" dans le cas du filtre "?{a,b}"
851
+        $countfiltre = count($filtre);
852
+        if ($fonc !== '?') {
853
+            $sep = ',';
854
+        } else {
855
+            $sep = ':';
856
+            // |?{a,b} *doit* avoir exactement 2 arguments ; on les force
857
+            if ($countfiltre != 2) {
858
+                $filtre = array($filtre[0] ?? '', $filtre[1] ?? '');
859
+                $countfiltre = 2;
860
+            }
861
+        }
862
+        $arglist = compose_filtres_args($p, $filtre, $sep);
863
+        $logique = filtre_logique($fonc, $code, substr($arglist, 1));
864
+        if ($logique) {
865
+            $code = $logique;
866
+        } else {
867
+            $code = sandbox_composer_filtre($fonc, $code, $arglist, $p, $countfiltre);
868
+            if ($is_filtre_image) {
869
+                $image_miette = true;
870
+            }
871
+        }
872
+    }
873
+    // ramasser les images intermediaires inutiles et graver l'image finale
874
+    if ($image_miette) {
875
+        $code = "filtrer('image_graver',$code)";
876
+    }
877
+
878
+    return $code;
879 879
 }
880 880
 
881 881
 // Filtres et,ou,oui,non,sinon,xou,xor,and,or,not,yes
882 882
 // et comparateurs
883 883
 function filtre_logique($fonc, $code, $arg) {
884 884
 
885
-	switch (true) {
886
-		case in_array($fonc, $GLOBALS['table_criteres_infixes']):
887
-			return "($code $fonc $arg)";
888
-		case ($fonc == 'and') or ($fonc == 'et'):
889
-			return "((($code) AND ($arg)) ?' ' :'')";
890
-		case ($fonc == 'or') or ($fonc == 'ou'):
891
-			return "((($code) OR ($arg)) ?' ' :'')";
892
-		case ($fonc == 'xor') or ($fonc == 'xou'):
893
-			return "((($code) XOR ($arg)) ?' ' :'')";
894
-		case ($fonc == 'sinon'):
895
-			return "(((\$a = $code) OR (is_string(\$a) AND strlen(\$a))) ? \$a : $arg)";
896
-		case ($fonc == 'not') or ($fonc == 'non'):
897
-			return "(($code) ?'' :' ')";
898
-		case ($fonc == 'yes') or ($fonc == 'oui'):
899
-			return "(($code) ?' ' :'')";
900
-	}
901
-
902
-	return '';
885
+    switch (true) {
886
+        case in_array($fonc, $GLOBALS['table_criteres_infixes']):
887
+            return "($code $fonc $arg)";
888
+        case ($fonc == 'and') or ($fonc == 'et'):
889
+            return "((($code) AND ($arg)) ?' ' :'')";
890
+        case ($fonc == 'or') or ($fonc == 'ou'):
891
+            return "((($code) OR ($arg)) ?' ' :'')";
892
+        case ($fonc == 'xor') or ($fonc == 'xou'):
893
+            return "((($code) XOR ($arg)) ?' ' :'')";
894
+        case ($fonc == 'sinon'):
895
+            return "(((\$a = $code) OR (is_string(\$a) AND strlen(\$a))) ? \$a : $arg)";
896
+        case ($fonc == 'not') or ($fonc == 'non'):
897
+            return "(($code) ?'' :' ')";
898
+        case ($fonc == 'yes') or ($fonc == 'oui'):
899
+            return "(($code) ?' ' :'')";
900
+    }
901
+
902
+    return '';
903 903
 }
904 904
 
905 905
 // https://code.spip.net/@compose_filtres_args
906 906
 function compose_filtres_args($p, $args, $sep) {
907
-	$arglist = "";
908
-	foreach ($args as $arg) {
909
-		$arglist .= $sep .
910
-			calculer_liste($arg, $p->descr, $p->boucles, $p->id_boucle);
911
-	}
907
+    $arglist = "";
908
+    foreach ($args as $arg) {
909
+        $arglist .= $sep .
910
+            calculer_liste($arg, $p->descr, $p->boucles, $p->id_boucle);
911
+    }
912 912
 
913
-	return $arglist;
913
+    return $arglist;
914 914
 }
915 915
 
916 916
 
@@ -928,15 +928,15 @@  discard block
 block discarded – undo
928 928
  **/
929 929
 function calculer_argument_precedent($idb, $nom_champ, &$boucles, $defaut = null) {
930 930
 
931
-	// si recursif, forcer l'extraction du champ SQL mais ignorer le code
932
-	if ($boucles[$idb]->externe) {
933
-		index_pile($idb, $nom_champ, $boucles, '', $defaut);
934
-		// retourner $Pile[$SP] et pas $Pile[0] si recursion en 1ere boucle
935
-		// on ignore le defaut fourni dans ce cas
936
-		$defaut = "@\$Pile[\$SP]['$nom_champ']";
937
-	}
931
+    // si recursif, forcer l'extraction du champ SQL mais ignorer le code
932
+    if ($boucles[$idb]->externe) {
933
+        index_pile($idb, $nom_champ, $boucles, '', $defaut);
934
+        // retourner $Pile[$SP] et pas $Pile[0] si recursion en 1ere boucle
935
+        // on ignore le defaut fourni dans ce cas
936
+        $defaut = "@\$Pile[\$SP]['$nom_champ']";
937
+    }
938 938
 
939
-	return index_pile($boucles[$idb]->id_parent, $nom_champ, $boucles, '', $defaut);
939
+    return index_pile($boucles[$idb]->id_parent, $nom_champ, $boucles, '', $defaut);
940 940
 }
941 941
 
942 942
 //
@@ -951,30 +951,30 @@  discard block
 block discarded – undo
951 951
 
952 952
 // https://code.spip.net/@rindex_pile
953 953
 function rindex_pile($p, $champ, $motif) {
954
-	$n = 0;
955
-	$b = $p->id_boucle;
956
-	$p->code = '';
957
-	while ($b != '') {
958
-		foreach ($p->boucles[$b]->criteres as $critere) {
959
-			if ($critere->op == $motif) {
960
-				$p->code = '$Pile[$SP' . (($n == 0) ? "" : "-$n") .
961
-					"]['$champ']";
962
-				$b = '';
963
-				break 2;
964
-			}
965
-		}
966
-		$n++;
967
-		$b = $p->boucles[$b]->id_parent;
968
-	}
969
-
970
-	// si on est hors d'une boucle de {recherche}, cette balise est vide
971
-	if (!$p->code) {
972
-		$p->code = "''";
973
-	}
974
-
975
-	$p->interdire_scripts = false;
976
-
977
-	return $p;
954
+    $n = 0;
955
+    $b = $p->id_boucle;
956
+    $p->code = '';
957
+    while ($b != '') {
958
+        foreach ($p->boucles[$b]->criteres as $critere) {
959
+            if ($critere->op == $motif) {
960
+                $p->code = '$Pile[$SP' . (($n == 0) ? "" : "-$n") .
961
+                    "]['$champ']";
962
+                $b = '';
963
+                break 2;
964
+            }
965
+        }
966
+        $n++;
967
+        $b = $p->boucles[$b]->id_parent;
968
+    }
969
+
970
+    // si on est hors d'une boucle de {recherche}, cette balise est vide
971
+    if (!$p->code) {
972
+        $p->code = "''";
973
+    }
974
+
975
+    $p->interdire_scripts = false;
976
+
977
+    return $p;
978 978
 }
979 979
 
980 980
 /** 
@@ -984,7 +984,7 @@  discard block
 block discarded – undo
984 984
  * @return string Nom de la balise, avec indication de boucle explicite si présent.
985 985
  */
986 986
 function zbug_presenter_champ($p, $champ = "") {
987
-	$balise = $champ ? $champ : $p->nom_champ;
988
-	$explicite = $explicite = $p->nom_boucle ? $p->nom_boucle . ':' : '';
989
-	return "#{$explicite}{$balise}";
987
+    $balise = $champ ? $champ : $p->nom_champ;
988
+    $explicite = $explicite = $p->nom_boucle ? $p->nom_boucle . ':' : '';
989
+    return "#{$explicite}{$balise}";
990 990
 }
991 991
\ 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
 	$idb_origine = $idb;
@@ -157,7 +157,7 @@  discard block
 block discarded – undo
157 157
 			}
158 158
 			// renseigner la boucle source de ce champ pour les traitements
159 159
 			$boucles[$idb_origine]->index_champ[$nom_champ_origine] = $idb;
160
-			$champ = '$Pile[$SP' . ($i ? "-$i" : "") . '][\'' . $c . '\']';
160
+			$champ = '$Pile[$SP'.($i ? "-$i" : "").'][\''.$c.'\']';
161 161
 			if (!$joker) {
162 162
 				return index_compose($conditionnel, $champ);
163 163
 			}
@@ -198,7 +198,7 @@  discard block
 block discarded – undo
198 198
 function index_compose($conditionnel, $defaut) {
199 199
 	while ($c = array_pop($conditionnel)) {
200 200
 		// si on passe defaut = '', ne pas générer d'erreur de compilation.
201
-		$defaut = "($c:(" . ($defaut ? $defaut : "''") . "))";
201
+		$defaut = "($c:(".($defaut ? $defaut : "''")."))";
202 202
 	}
203 203
 
204 204
 	return $defaut;
@@ -245,7 +245,7 @@  discard block
 block discarded – undo
245 245
 	if (!$r) {
246 246
 		$joker = false; // indiquer a l'appelant
247 247
 		# continuer pour chercher l'erreur suivante
248
-		return array("'#" . $r . ':' . $nom_champ . "'", '');
248
+		return array("'#".$r.':'.$nom_champ."'", '');
249 249
 	}
250 250
 
251 251
 	$desc = $boucles[$idb]->show;
@@ -345,8 +345,8 @@  discard block
 block discarded – undo
345 345
 			$t = $index_exception_derogatoire($boucle, $desc, $nom_champ, $excep);
346 346
 		}
347 347
 		if ($t == null) {
348
-			list($e, $x) = $excep;  #PHP4 affecte de gauche a droite
349
-			$excep = $x;    #PHP5 de droite a gauche !
348
+			list($e, $x) = $excep; #PHP4 affecte de gauche a droite
349
+			$excep = $x; #PHP5 de droite a gauche !
350 350
 			$j = $trouver_table($e, $boucle->sql_serveur);
351 351
 			if (!$j) {
352 352
 				return array('', '');
@@ -358,7 +358,7 @@  discard block
 block discarded – undo
358 358
 					$l = (preg_split('/\s*,\s*/', $k));
359 359
 					$k = $desc['key']['PRIMARY KEY'];
360 360
 					if (!in_array($k, $l)) {
361
-						spip_log("jointure impossible $e " . join(',', $l));
361
+						spip_log("jointure impossible $e ".join(',', $l));
362 362
 
363 363
 						return array('', '');
364 364
 					}
@@ -374,7 +374,7 @@  discard block
 block discarded – undo
374 374
 	// demander a SQL de gerer le synonyme
375 375
 	// ca permet que excep soit dynamique (Cedric, 2/3/06)
376 376
 	if ($excep != $nom_champ) {
377
-		$excep .= ' AS ' . $nom_champ;
377
+		$excep .= ' AS '.$nom_champ;
378 378
 	}
379 379
 
380 380
 	return array("$t.$excep", $nom_champ);
@@ -605,7 +605,7 @@  discard block
 block discarded – undo
605 605
 		join(',', $collecte),
606 606
 		($collecte ? $param : substr($param, 1)), # virer la virgule
607 607
 		memoriser_contexte_compil($p),
608
-		(!$supp ? '' : (', ' . join(',', $supp))));
608
+		(!$supp ? '' : (', '.join(',', $supp))));
609 609
 
610 610
 	$p->interdire_scripts = false;
611 611
 
@@ -700,7 +700,7 @@  discard block
 block discarded – undo
700 700
 	$nom = $p->id_boucle;
701 701
 
702 702
 	if ($nom and trouver_nom_serveur_distant($p)) {
703
-		spip_log($nom . ':' . $p->nom_champ . ' ' . _T('zbug_distant_interdit'));
703
+		spip_log($nom.':'.$p->nom_champ.' '._T('zbug_distant_interdit'));
704 704
 
705 705
 		return false;
706 706
 	}
@@ -785,7 +785,7 @@  discard block
 block discarded – undo
785 785
 			(strpos($ps, 'typo') !== false)
786 786
 		)
787 787
 	) {
788
-		$ps = 'traiter_doublons_documents($doublons, ' . $ps . ')';
788
+		$ps = 'traiter_doublons_documents($doublons, '.$ps.')';
789 789
 	}
790 790
 
791 791
 	// La protection des champs par |safehtml est assuree par les extensions
@@ -906,7 +906,7 @@  discard block
 block discarded – undo
906 906
 function compose_filtres_args($p, $args, $sep) {
907 907
 	$arglist = "";
908 908
 	foreach ($args as $arg) {
909
-		$arglist .= $sep .
909
+		$arglist .= $sep.
910 910
 			calculer_liste($arg, $p->descr, $p->boucles, $p->id_boucle);
911 911
 	}
912 912
 
@@ -957,7 +957,7 @@  discard block
 block discarded – undo
957 957
 	while ($b != '') {
958 958
 		foreach ($p->boucles[$b]->criteres as $critere) {
959 959
 			if ($critere->op == $motif) {
960
-				$p->code = '$Pile[$SP' . (($n == 0) ? "" : "-$n") .
960
+				$p->code = '$Pile[$SP'.(($n == 0) ? "" : "-$n").
961 961
 					"]['$champ']";
962 962
 				$b = '';
963 963
 				break 2;
@@ -985,6 +985,6 @@  discard block
 block discarded – undo
985 985
  */
986 986
 function zbug_presenter_champ($p, $champ = "") {
987 987
 	$balise = $champ ? $champ : $p->nom_champ;
988
-	$explicite = $explicite = $p->nom_boucle ? $p->nom_boucle . ':' : '';
988
+	$explicite = $explicite = $p->nom_boucle ? $p->nom_boucle.':' : '';
989 989
 	return "#{$explicite}{$balise}";
990 990
 }
991 991
\ No newline at end of file
Please login to merge, or discard this patch.
ecrire/public/interfaces.php 1 patch
Indentation   +912 added lines, -912 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
 
@@ -34,53 +34,53 @@  discard block
 block discarded – undo
34 34
  * @package SPIP\Core\Compilateur\AST
35 35
  */
36 36
 class Contexte {
37
-	/**
38
-	 * Description du squelette
39
-	 *
40
-	 * Sert pour la gestion d'erreur et la production de code dependant du contexte
41
-	 *
42
-	 * Peut contenir les index :
43
-	 *
44
-	 * - nom : Nom du fichier de cache
45
-	 * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
46
-	 * - sourcefile : Chemin du squelette
47
-	 * - squelette : Code du squelette
48
-	 * - id_mere : Identifiant de la boucle parente
49
-	 * - documents : Pour embed et img dans les textes
50
-	 * - session : Pour un cache sessionné par auteur
51
-	 * - niv : Niveau de tabulation
52
-	 *
53
-	 * @var array
54
-	 */
55
-	public $descr = array();
56
-
57
-	/**
58
-	 * Identifiant de la boucle
59
-	 *
60
-	 * @var string
61
-	 */
62
-	public $id_boucle = '';
63
-
64
-	/**
65
-	 * Numéro de ligne dans le code source du squelette
66
-	 *
67
-	 * @var int
68
-	 */
69
-	public $ligne = 0;
70
-
71
-	/**
72
-	 * Langue d'exécution
73
-	 *
74
-	 * @var string
75
-	 */
76
-	public $lang = '';
77
-
78
-	/**
79
-	 * Résultat de la compilation: toujours une expression PHP
80
-	 *
81
-	 * @var string
82
-	 */
83
-	public $code = '';
37
+    /**
38
+     * Description du squelette
39
+     *
40
+     * Sert pour la gestion d'erreur et la production de code dependant du contexte
41
+     *
42
+     * Peut contenir les index :
43
+     *
44
+     * - nom : Nom du fichier de cache
45
+     * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
46
+     * - sourcefile : Chemin du squelette
47
+     * - squelette : Code du squelette
48
+     * - id_mere : Identifiant de la boucle parente
49
+     * - documents : Pour embed et img dans les textes
50
+     * - session : Pour un cache sessionné par auteur
51
+     * - niv : Niveau de tabulation
52
+     *
53
+     * @var array
54
+     */
55
+    public $descr = array();
56
+
57
+    /**
58
+     * Identifiant de la boucle
59
+     *
60
+     * @var string
61
+     */
62
+    public $id_boucle = '';
63
+
64
+    /**
65
+     * Numéro de ligne dans le code source du squelette
66
+     *
67
+     * @var int
68
+     */
69
+    public $ligne = 0;
70
+
71
+    /**
72
+     * Langue d'exécution
73
+     *
74
+     * @var string
75
+     */
76
+    public $lang = '';
77
+
78
+    /**
79
+     * Résultat de la compilation: toujours une expression PHP
80
+     *
81
+     * @var string
82
+     */
83
+    public $code = '';
84 84
 }
85 85
 
86 86
 
@@ -90,44 +90,44 @@  discard block
 block discarded – undo
90 90
  * @package SPIP\Core\Compilateur\AST
91 91
  **/
92 92
 class Texte {
93
-	/**
94
-	 * Type de noeud
95
-	 *
96
-	 * @var string
97
-	 */
98
-	public $type = 'texte';
99
-
100
-	/**
101
-	 * Le texte
102
-	 *
103
-	 * @var string
104
-	 */
105
-	public $texte;
106
-
107
-	/**
108
-	 * Contenu avant le texte.
109
-	 *
110
-	 * Vide ou apostrophe simple ou double si le texte en était entouré
111
-	 *
112
-	 * @var string|array
113
-	 */
114
-	public $avant = "";
115
-
116
-	/**
117
-	 * Contenu après le texte.
118
-	 *
119
-	 * Vide ou apostrophe simple ou double si le texte en était entouré
120
-	 *
121
-	 * @var string|array
122
-	 */
123
-	public $apres = "";
124
-
125
-	/**
126
-	 * Numéro de ligne dans le code source du squelette
127
-	 *
128
-	 * @var int
129
-	 */
130
-	public $ligne = 0;
93
+    /**
94
+     * Type de noeud
95
+     *
96
+     * @var string
97
+     */
98
+    public $type = 'texte';
99
+
100
+    /**
101
+     * Le texte
102
+     *
103
+     * @var string
104
+     */
105
+    public $texte;
106
+
107
+    /**
108
+     * Contenu avant le texte.
109
+     *
110
+     * Vide ou apostrophe simple ou double si le texte en était entouré
111
+     *
112
+     * @var string|array
113
+     */
114
+    public $avant = "";
115
+
116
+    /**
117
+     * Contenu après le texte.
118
+     *
119
+     * Vide ou apostrophe simple ou double si le texte en était entouré
120
+     *
121
+     * @var string|array
122
+     */
123
+    public $apres = "";
124
+
125
+    /**
126
+     * Numéro de ligne dans le code source du squelette
127
+     *
128
+     * @var int
129
+     */
130
+    public $ligne = 0;
131 131
 }
132 132
 
133 133
 /**
@@ -136,50 +136,50 @@  discard block
 block discarded – undo
136 136
  * @package SPIP\Core\Compilateur\AST
137 137
  **/
138 138
 class Inclure {
139
-	/**
140
-	 * Type de noeud
141
-	 *
142
-	 * @var string
143
-	 */
144
-	public $type = 'include';
145
-
146
-	/**
147
-	 * Nom d'un fichier inclu
148
-	 *
149
-	 * - Objet Texte si inclusion d'un autre squelette
150
-	 * - chaîne si inclusion d'un fichier PHP directement
151
-	 *
152
-	 * @var string|Texte
153
-	 */
154
-	public $texte;
155
-
156
-	/**
157
-	 * Inutilisé, propriété générique de l'AST
158
-	 *
159
-	 * @var string|array
160
-	 */
161
-	public $avant = '';
162
-
163
-	/**
164
-	 * Inutilisé, propriété générique de l'AST
165
-	 *
166
-	 * @var string|array
167
-	 */
168
-	public $apres = '';
169
-
170
-	/**
171
-	 * Numéro de ligne dans le code source du squelette
172
-	 *
173
-	 * @var int
174
-	 */
175
-	public $ligne = 0;
176
-
177
-	/**
178
-	 * Valeurs des paramètres
179
-	 *
180
-	 * @var array
181
-	 */
182
-	public $param = array();
139
+    /**
140
+     * Type de noeud
141
+     *
142
+     * @var string
143
+     */
144
+    public $type = 'include';
145
+
146
+    /**
147
+     * Nom d'un fichier inclu
148
+     *
149
+     * - Objet Texte si inclusion d'un autre squelette
150
+     * - chaîne si inclusion d'un fichier PHP directement
151
+     *
152
+     * @var string|Texte
153
+     */
154
+    public $texte;
155
+
156
+    /**
157
+     * Inutilisé, propriété générique de l'AST
158
+     *
159
+     * @var string|array
160
+     */
161
+    public $avant = '';
162
+
163
+    /**
164
+     * Inutilisé, propriété générique de l'AST
165
+     *
166
+     * @var string|array
167
+     */
168
+    public $apres = '';
169
+
170
+    /**
171
+     * Numéro de ligne dans le code source du squelette
172
+     *
173
+     * @var int
174
+     */
175
+    public $ligne = 0;
176
+
177
+    /**
178
+     * Valeurs des paramètres
179
+     *
180
+     * @var array
181
+     */
182
+    public $param = array();
183 183
 }
184 184
 
185 185
 
@@ -189,386 +189,386 @@  discard block
 block discarded – undo
189 189
  * @package SPIP\Core\Compilateur\AST
190 190
  **/
191 191
 class Boucle {
192
-	/**
193
-	 * Type de noeud
194
-	 *
195
-	 * @var string
196
-	 */
197
-	public $type = 'boucle';
198
-
199
-	/**
200
-	 * Identifiant de la boucle
201
-	 *
202
-	 * @var string
203
-	 */
204
-	public $id_boucle;
205
-
206
-	/**
207
-	 * Identifiant de la boucle parente
208
-	 *
209
-	 * @var string
210
-	 */
211
-	public $id_parent = '';
212
-
213
-	/**
214
-	 * Partie avant toujours affichee
215
-	 *
216
-	 * @var string|array
217
-	 */
218
-	public $preaff = '';
219
-
220
-	/**
221
-	 * Partie optionnelle avant
222
-	 *
223
-	 * @var string|array
224
-	 */
225
-	public $avant = '';
226
-
227
-	/**
228
-	 * Pour chaque élément
229
-	 *
230
-	 * @var string|array
231
-	 */
232
-	public $milieu = '';
233
-
234
-	/**
235
-	 * Partie optionnelle après
236
-	 *
237
-	 * @var string|array
238
-	 */
239
-	public $apres = '';
240
-
241
-	/**
242
-	 * Partie alternative, si pas de résultat dans la boucle
243
-	 *
244
-	 * @var string|array
245
-	 */
246
-	public $altern = '';
247
-
248
-	/**
249
-	 * Partie apres toujours affichee
250
-	 *
251
-	 * @var string|array
252
-	 */
253
-	public $postaff = '';
254
-
255
-
256
-	/**
257
-	 * La boucle doit-elle sélectionner la langue ?
258
-	 *
259
-	 * @var string|null
260
-	 */
261
-	public $lang_select;
262
-
263
-	/**
264
-	 * Alias de table d'application de la requête ou nom complet de la table SQL
265
-	 *
266
-	 * @var string|null
267
-	 */
268
-	public $type_requete;
269
-
270
-	/**
271
-	 * La table est elle optionnelle ?
272
-	 *
273
-	 * Si oui, aucune erreur ne sera générée si la table demandée n'est pas présente
274
-	 *
275
-	 * @var bool
276
-	 */
277
-	public $table_optionnelle = false;
278
-
279
-	/**
280
-	 * Nom du fichier de connexion
281
-	 *
282
-	 * @var string
283
-	 */
284
-	public $sql_serveur = '';
285
-
286
-	/**
287
-	 * Paramètres de la boucle
288
-	 *
289
-	 * Description des paramètres passés à la boucle, qui servent ensuite
290
-	 * au calcul des critères
291
-	 *
292
-	 * @var array
293
-	 */
294
-	public $param = array();
295
-
296
-	/**
297
-	 * Critères de la boucle
298
-	 *
299
-	 * @var Critere[]
300
-	 */
301
-	public $criteres = array();
302
-
303
-	/**
304
-	 * Textes insérés entre 2 éléments de boucle (critère inter)
305
-	 *
306
-	 * @var string[]
307
-	 */
308
-	public $separateur = array();
309
-
310
-	/**
311
-	 * Liste des jointures possibles avec cette table
312
-	 *
313
-	 * Les jointures par défaut de la table sont complétées en priorité
314
-	 * des jointures déclarées explicitement sur la boucle
315
-	 *
316
-	 * @see base_trouver_table_dist()
317
-	 * @var array
318
-	 */
319
-	public $jointures = array();
320
-
321
-	/**
322
-	 * Jointures explicites avec cette table
323
-	 *
324
-	 * Ces jointures sont utilisées en priorité par rapport aux jointures
325
-	 * normales possibles pour retrouver les colonnes demandées extérieures
326
-	 * à la boucle.
327
-	 *
328
-	 * @var string|bool
329
-	 */
330
-	public $jointures_explicites = false;
331
-
332
-	/**
333
-	 * Nom de la variable PHP stockant le noms de doublons utilisés "$doublons_index"
334
-	 *
335
-	 * @var string|null
336
-	 */
337
-	public $doublons;
338
-
339
-	/**
340
-	 * Code PHP ajouté au début de chaque itération de boucle.
341
-	 *
342
-	 * Utilisé entre autre par les critères {pagination}, {n-a,b}, {a/b}...
343
-	 *
344
-	 * @var string
345
-	 */
346
-	public $partie = "";
347
-
348
-	/**
349
-	 * Nombre de divisions de la boucle, d'éléments à afficher,
350
-	 * ou de soustractions d'éléments à faire
351
-	 *
352
-	 * Dans les critères limitant le nombre d'éléments affichés
353
-	 * {a,b}, {a,n-b}, {a/b}, {pagination b}, b est affecté à total_parties.
354
-	 *
355
-	 * @var string
356
-	 */
357
-	public $total_parties = "";
358
-
359
-	/**
360
-	 * Code PHP ajouté avant l'itération de boucle.
361
-	 *
362
-	 * Utilisé entre autre par les critères {pagination}, {a,b}, {a/b}
363
-	 * pour initialiser les variables de début et de fin d'itération.
364
-	 *
365
-	 * @var string
366
-	 */
367
-	public $mode_partie = '';
368
-
369
-	/**
370
-	 * Identifiant d'une boucle qui appelle celle-ci de manière récursive
371
-	 *
372
-	 * Si une boucle est appelée de manière récursive quelque part par
373
-	 * une autre boucle comme <BOUCLE_rec(boucle_identifiant) />, cette
374
-	 * boucle (identifiant) reçoit dans cette propriété l'identifiant
375
-	 * de l'appelant (rec)
376
-	 *
377
-	 * @var string
378
-	 */
379
-	public $externe = '';
380
-
381
-	// champs pour la construction de la requete SQL
382
-
383
-	/**
384
-	 * Liste des champs à récupérer par la boucle
385
-	 *
386
-	 * Expression 'table.nom_champ' ou calculée 'nom_champ AS x'
387
-	 *
388
-	 * @var string[]
389
-	 */
390
-	public $select = array();
391
-
392
-	/**
393
-	 * Liste des alias / tables SQL utilisées dans la boucle
394
-	 *
395
-	 * L'index est un identifiant (xx dans spip_xx assez souvent) qui servira
396
-	 * d'alias au nom de la table ; la valeur est le nom de la table SQL désirée.
397
-	 *
398
-	 * L'index 0 peut définir le type de sources de données de l'itérateur DATA
399
-	 *
400
-	 * @var string[]
401
-	 */
402
-	public $from = array();
403
-
404
-	/**
405
-	 * Liste des alias / type de jointures utilisées dans la boucle
406
-	 *
407
-	 * L'index est le nom d'alias (comme pour la propriété $from), et la valeur
408
-	 * un type de jointure parmi 'INNER', 'LEFT', 'RIGHT', 'OUTER'.
409
-	 *
410
-	 * Lorsque le type n'est pas déclaré pour un alias, c'est 'INNER'
411
-	 * qui sera utilisé par défaut (créant donc un INNER JOIN).
412
-	 *
413
-	 * @var string[]
414
-	 */
415
-	public $from_type = array();
416
-
417
-	/**
418
-	 * Liste des conditions WHERE de la boucle
419
-	 *
420
-	 * Permet de restreindre les éléments retournés par une boucle
421
-	 * en fonctions des conditions transmises dans ce tableau.
422
-	 *
423
-	 * Ce tableau peut avoir plusieurs niveaux de profondeur.
424
-	 *
425
-	 * Les éléments du premier niveau sont reliés par des AND, donc
426
-	 * chaque élément ajouté directement au where par
427
-	 * $boucle->where[] = array(...) ou $boucle->where[] = "'expression'"
428
-	 * est une condition AND en plus.
429
-	 *
430
-	 * Par contre, lorsqu'on indique un tableau, il peut décrire des relations
431
-	 * internes différentes. Soit $expr un tableau d'expressions quelconques de 3 valeurs :
432
-	 * $expr = array(operateur, val1, val2)
433
-	 *
434
-	 * Ces 3 valeurs sont des expressions PHP. L'index 0 désigne l'opérateur
435
-	 * à réaliser tel que :
436
-	 *
437
-	 * - "'='" , "'>='", "'<'", "'IN'", "'REGEXP'", "'LIKE'", ... :
438
-	 *    val1 et val2 sont des champs et valeurs à utiliser dans la comparaison
439
-	 *    suivant cet ordre : "val1 operateur val2".
440
-	 *    Exemple : $boucle->where[] = array("'='", "'articles.statut'", "'\"publie\"'");
441
-	 * - "'AND'", "'OR'", "'NOT'" :
442
-	 *    dans ce cas val1 et val2 sont également des expressions
443
-	 *    de comparaison complètes, et peuvent être eux-même des tableaux comme $expr
444
-	 *    Exemples :
445
-	 *    $boucle->where[] = array("'OR'", $expr1, $expr2);
446
-	 *    $boucle->where[] = array("'NOT'", $expr); // val2 n'existe pas avec NOT
447
-	 *
448
-	 * D'autres noms sont possibles pour l'opérateur (le nombre de valeurs diffère) :
449
-	 * - "'SELF'", "'SUBSELECT'" : indiquent des sous requêtes
450
-	 * - "'?'" : indique une condition à faire évaluer (val1 ? val2 : val3)
451
-	 *
452
-	 * @var array
453
-	 */
454
-	public $where = array();
455
-
456
-	public $join = array();
457
-	public $having = array();
458
-	public $limit;
459
-	public $group = array();
460
-	public $order = array();
461
-	public $default_order = array();
462
-	public $date = 'date';
463
-	public $hash = "";
464
-	public $in = "";
465
-	public $sous_requete = false;
466
-
467
-	/**
468
-	 * Code PHP qui sera ajouté en tout début de la fonction de boucle
469
-	 *
470
-	 * Il sert à insérer le code calculant une hierarchie
471
-	 *
472
-	 * @var string
473
-	 */
474
-	public $hierarchie = '';
475
-
476
-	// champs pour la construction du corps PHP
477
-
478
-	/**
479
-	 * Description des sources de données de la boucle
480
-	 *
481
-	 * Description des données de la boucle issu de trouver_table
482
-	 * dans le cadre de l'itérateur SQL et contenant au moins l'index 'field'.
483
-	 *
484
-	 * @see base_trouver_table_dist()
485
-	 * @var array
486
-	 */
487
-	public $show = array();
488
-
489
-	/**
490
-	 * Nom de la table SQL principale de la boucle, sans son préfixe
491
-	 *
492
-	 * @var string
493
-	 */
494
-	public $id_table;
495
-
496
-	/**
497
-	 * Nom de la clé primaire de la table SQL principale de la boucle
498
-	 *
499
-	 * @var string
500
-	 */
501
-	public $primary;
502
-
503
-	/**
504
-	 * Code PHP compilé de la boucle
505
-	 *
506
-	 * @var string
507
-	 */
508
-	public $return;
509
-
510
-	public $numrows = false;
511
-	public $cptrows = false;
512
-
513
-	/**
514
-	 * Description du squelette
515
-	 *
516
-	 * Sert pour la gestion d'erreur et la production de code dependant du contexte
517
-	 *
518
-	 * Peut contenir les index :
519
-	 *
520
-	 * - nom : Nom du fichier de cache
521
-	 * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
522
-	 * - sourcefile : Chemin du squelette
523
-	 * - squelette : Code du squelette
524
-	 * - id_mere : Identifiant de la boucle parente
525
-	 * - documents : Pour embed et img dans les textes
526
-	 * - session : Pour un cache sessionné par auteur
527
-	 * - niv : Niveau de tabulation
528
-	 *
529
-	 * @var array
530
-	 */
531
-	public $descr = array();
532
-
533
-	/**
534
-	 * Numéro de ligne dans le code source du squelette
535
-	 *
536
-	 * @var int
537
-	 */
538
-	public $ligne = 0;
539
-
540
-
541
-	public $modificateur = array(); // table pour stocker les modificateurs de boucle tels que tout, plat ..., utilisable par les plugins egalement
542
-
543
-	/**
544
-	 * Type d'itérateur utilisé pour cette boucle
545
-	 *
546
-	 * - 'SQL' dans le cadre d'une boucle sur une table SQL
547
-	 * - 'DATA' pour l'itérateur DATA, ...
548
-	 *
549
-	 * @var string
550
-	 */
551
-	public $iterateur = ''; // type d'iterateur
552
-
553
-	/**
554
-	 * @var array $debug Textes qui seront insérés dans l’entête de boucle du mode debug
555
-	 */
556
-	public $debug = [];
557
-
558
-	/** 
559
-	 * Index de la boucle dont le champ présent dans cette boucle est originaire,
560
-	 * notamment si le champ a été trouve dans une boucle parente
561
-	 * 
562
-	 * Tableau nom du champ => index de boucle
563
-	 * 
564
-	 * @var array $index_champ 
565
-	*/
566
-	public $index_champ = [];
567
-
568
-	// obsoletes, conserves provisoirement pour compatibilite
569
-	public $tout = false;
570
-	public $plat = false;
571
-	public $lien = false;
192
+    /**
193
+     * Type de noeud
194
+     *
195
+     * @var string
196
+     */
197
+    public $type = 'boucle';
198
+
199
+    /**
200
+     * Identifiant de la boucle
201
+     *
202
+     * @var string
203
+     */
204
+    public $id_boucle;
205
+
206
+    /**
207
+     * Identifiant de la boucle parente
208
+     *
209
+     * @var string
210
+     */
211
+    public $id_parent = '';
212
+
213
+    /**
214
+     * Partie avant toujours affichee
215
+     *
216
+     * @var string|array
217
+     */
218
+    public $preaff = '';
219
+
220
+    /**
221
+     * Partie optionnelle avant
222
+     *
223
+     * @var string|array
224
+     */
225
+    public $avant = '';
226
+
227
+    /**
228
+     * Pour chaque élément
229
+     *
230
+     * @var string|array
231
+     */
232
+    public $milieu = '';
233
+
234
+    /**
235
+     * Partie optionnelle après
236
+     *
237
+     * @var string|array
238
+     */
239
+    public $apres = '';
240
+
241
+    /**
242
+     * Partie alternative, si pas de résultat dans la boucle
243
+     *
244
+     * @var string|array
245
+     */
246
+    public $altern = '';
247
+
248
+    /**
249
+     * Partie apres toujours affichee
250
+     *
251
+     * @var string|array
252
+     */
253
+    public $postaff = '';
254
+
255
+
256
+    /**
257
+     * La boucle doit-elle sélectionner la langue ?
258
+     *
259
+     * @var string|null
260
+     */
261
+    public $lang_select;
262
+
263
+    /**
264
+     * Alias de table d'application de la requête ou nom complet de la table SQL
265
+     *
266
+     * @var string|null
267
+     */
268
+    public $type_requete;
269
+
270
+    /**
271
+     * La table est elle optionnelle ?
272
+     *
273
+     * Si oui, aucune erreur ne sera générée si la table demandée n'est pas présente
274
+     *
275
+     * @var bool
276
+     */
277
+    public $table_optionnelle = false;
278
+
279
+    /**
280
+     * Nom du fichier de connexion
281
+     *
282
+     * @var string
283
+     */
284
+    public $sql_serveur = '';
285
+
286
+    /**
287
+     * Paramètres de la boucle
288
+     *
289
+     * Description des paramètres passés à la boucle, qui servent ensuite
290
+     * au calcul des critères
291
+     *
292
+     * @var array
293
+     */
294
+    public $param = array();
295
+
296
+    /**
297
+     * Critères de la boucle
298
+     *
299
+     * @var Critere[]
300
+     */
301
+    public $criteres = array();
302
+
303
+    /**
304
+     * Textes insérés entre 2 éléments de boucle (critère inter)
305
+     *
306
+     * @var string[]
307
+     */
308
+    public $separateur = array();
309
+
310
+    /**
311
+     * Liste des jointures possibles avec cette table
312
+     *
313
+     * Les jointures par défaut de la table sont complétées en priorité
314
+     * des jointures déclarées explicitement sur la boucle
315
+     *
316
+     * @see base_trouver_table_dist()
317
+     * @var array
318
+     */
319
+    public $jointures = array();
320
+
321
+    /**
322
+     * Jointures explicites avec cette table
323
+     *
324
+     * Ces jointures sont utilisées en priorité par rapport aux jointures
325
+     * normales possibles pour retrouver les colonnes demandées extérieures
326
+     * à la boucle.
327
+     *
328
+     * @var string|bool
329
+     */
330
+    public $jointures_explicites = false;
331
+
332
+    /**
333
+     * Nom de la variable PHP stockant le noms de doublons utilisés "$doublons_index"
334
+     *
335
+     * @var string|null
336
+     */
337
+    public $doublons;
338
+
339
+    /**
340
+     * Code PHP ajouté au début de chaque itération de boucle.
341
+     *
342
+     * Utilisé entre autre par les critères {pagination}, {n-a,b}, {a/b}...
343
+     *
344
+     * @var string
345
+     */
346
+    public $partie = "";
347
+
348
+    /**
349
+     * Nombre de divisions de la boucle, d'éléments à afficher,
350
+     * ou de soustractions d'éléments à faire
351
+     *
352
+     * Dans les critères limitant le nombre d'éléments affichés
353
+     * {a,b}, {a,n-b}, {a/b}, {pagination b}, b est affecté à total_parties.
354
+     *
355
+     * @var string
356
+     */
357
+    public $total_parties = "";
358
+
359
+    /**
360
+     * Code PHP ajouté avant l'itération de boucle.
361
+     *
362
+     * Utilisé entre autre par les critères {pagination}, {a,b}, {a/b}
363
+     * pour initialiser les variables de début et de fin d'itération.
364
+     *
365
+     * @var string
366
+     */
367
+    public $mode_partie = '';
368
+
369
+    /**
370
+     * Identifiant d'une boucle qui appelle celle-ci de manière récursive
371
+     *
372
+     * Si une boucle est appelée de manière récursive quelque part par
373
+     * une autre boucle comme <BOUCLE_rec(boucle_identifiant) />, cette
374
+     * boucle (identifiant) reçoit dans cette propriété l'identifiant
375
+     * de l'appelant (rec)
376
+     *
377
+     * @var string
378
+     */
379
+    public $externe = '';
380
+
381
+    // champs pour la construction de la requete SQL
382
+
383
+    /**
384
+     * Liste des champs à récupérer par la boucle
385
+     *
386
+     * Expression 'table.nom_champ' ou calculée 'nom_champ AS x'
387
+     *
388
+     * @var string[]
389
+     */
390
+    public $select = array();
391
+
392
+    /**
393
+     * Liste des alias / tables SQL utilisées dans la boucle
394
+     *
395
+     * L'index est un identifiant (xx dans spip_xx assez souvent) qui servira
396
+     * d'alias au nom de la table ; la valeur est le nom de la table SQL désirée.
397
+     *
398
+     * L'index 0 peut définir le type de sources de données de l'itérateur DATA
399
+     *
400
+     * @var string[]
401
+     */
402
+    public $from = array();
403
+
404
+    /**
405
+     * Liste des alias / type de jointures utilisées dans la boucle
406
+     *
407
+     * L'index est le nom d'alias (comme pour la propriété $from), et la valeur
408
+     * un type de jointure parmi 'INNER', 'LEFT', 'RIGHT', 'OUTER'.
409
+     *
410
+     * Lorsque le type n'est pas déclaré pour un alias, c'est 'INNER'
411
+     * qui sera utilisé par défaut (créant donc un INNER JOIN).
412
+     *
413
+     * @var string[]
414
+     */
415
+    public $from_type = array();
416
+
417
+    /**
418
+     * Liste des conditions WHERE de la boucle
419
+     *
420
+     * Permet de restreindre les éléments retournés par une boucle
421
+     * en fonctions des conditions transmises dans ce tableau.
422
+     *
423
+     * Ce tableau peut avoir plusieurs niveaux de profondeur.
424
+     *
425
+     * Les éléments du premier niveau sont reliés par des AND, donc
426
+     * chaque élément ajouté directement au where par
427
+     * $boucle->where[] = array(...) ou $boucle->where[] = "'expression'"
428
+     * est une condition AND en plus.
429
+     *
430
+     * Par contre, lorsqu'on indique un tableau, il peut décrire des relations
431
+     * internes différentes. Soit $expr un tableau d'expressions quelconques de 3 valeurs :
432
+     * $expr = array(operateur, val1, val2)
433
+     *
434
+     * Ces 3 valeurs sont des expressions PHP. L'index 0 désigne l'opérateur
435
+     * à réaliser tel que :
436
+     *
437
+     * - "'='" , "'>='", "'<'", "'IN'", "'REGEXP'", "'LIKE'", ... :
438
+     *    val1 et val2 sont des champs et valeurs à utiliser dans la comparaison
439
+     *    suivant cet ordre : "val1 operateur val2".
440
+     *    Exemple : $boucle->where[] = array("'='", "'articles.statut'", "'\"publie\"'");
441
+     * - "'AND'", "'OR'", "'NOT'" :
442
+     *    dans ce cas val1 et val2 sont également des expressions
443
+     *    de comparaison complètes, et peuvent être eux-même des tableaux comme $expr
444
+     *    Exemples :
445
+     *    $boucle->where[] = array("'OR'", $expr1, $expr2);
446
+     *    $boucle->where[] = array("'NOT'", $expr); // val2 n'existe pas avec NOT
447
+     *
448
+     * D'autres noms sont possibles pour l'opérateur (le nombre de valeurs diffère) :
449
+     * - "'SELF'", "'SUBSELECT'" : indiquent des sous requêtes
450
+     * - "'?'" : indique une condition à faire évaluer (val1 ? val2 : val3)
451
+     *
452
+     * @var array
453
+     */
454
+    public $where = array();
455
+
456
+    public $join = array();
457
+    public $having = array();
458
+    public $limit;
459
+    public $group = array();
460
+    public $order = array();
461
+    public $default_order = array();
462
+    public $date = 'date';
463
+    public $hash = "";
464
+    public $in = "";
465
+    public $sous_requete = false;
466
+
467
+    /**
468
+     * Code PHP qui sera ajouté en tout début de la fonction de boucle
469
+     *
470
+     * Il sert à insérer le code calculant une hierarchie
471
+     *
472
+     * @var string
473
+     */
474
+    public $hierarchie = '';
475
+
476
+    // champs pour la construction du corps PHP
477
+
478
+    /**
479
+     * Description des sources de données de la boucle
480
+     *
481
+     * Description des données de la boucle issu de trouver_table
482
+     * dans le cadre de l'itérateur SQL et contenant au moins l'index 'field'.
483
+     *
484
+     * @see base_trouver_table_dist()
485
+     * @var array
486
+     */
487
+    public $show = array();
488
+
489
+    /**
490
+     * Nom de la table SQL principale de la boucle, sans son préfixe
491
+     *
492
+     * @var string
493
+     */
494
+    public $id_table;
495
+
496
+    /**
497
+     * Nom de la clé primaire de la table SQL principale de la boucle
498
+     *
499
+     * @var string
500
+     */
501
+    public $primary;
502
+
503
+    /**
504
+     * Code PHP compilé de la boucle
505
+     *
506
+     * @var string
507
+     */
508
+    public $return;
509
+
510
+    public $numrows = false;
511
+    public $cptrows = false;
512
+
513
+    /**
514
+     * Description du squelette
515
+     *
516
+     * Sert pour la gestion d'erreur et la production de code dependant du contexte
517
+     *
518
+     * Peut contenir les index :
519
+     *
520
+     * - nom : Nom du fichier de cache
521
+     * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
522
+     * - sourcefile : Chemin du squelette
523
+     * - squelette : Code du squelette
524
+     * - id_mere : Identifiant de la boucle parente
525
+     * - documents : Pour embed et img dans les textes
526
+     * - session : Pour un cache sessionné par auteur
527
+     * - niv : Niveau de tabulation
528
+     *
529
+     * @var array
530
+     */
531
+    public $descr = array();
532
+
533
+    /**
534
+     * Numéro de ligne dans le code source du squelette
535
+     *
536
+     * @var int
537
+     */
538
+    public $ligne = 0;
539
+
540
+
541
+    public $modificateur = array(); // table pour stocker les modificateurs de boucle tels que tout, plat ..., utilisable par les plugins egalement
542
+
543
+    /**
544
+     * Type d'itérateur utilisé pour cette boucle
545
+     *
546
+     * - 'SQL' dans le cadre d'une boucle sur une table SQL
547
+     * - 'DATA' pour l'itérateur DATA, ...
548
+     *
549
+     * @var string
550
+     */
551
+    public $iterateur = ''; // type d'iterateur
552
+
553
+    /**
554
+     * @var array $debug Textes qui seront insérés dans l’entête de boucle du mode debug
555
+     */
556
+    public $debug = [];
557
+
558
+    /** 
559
+     * Index de la boucle dont le champ présent dans cette boucle est originaire,
560
+     * notamment si le champ a été trouve dans une boucle parente
561
+     * 
562
+     * Tableau nom du champ => index de boucle
563
+     * 
564
+     * @var array $index_champ 
565
+     */
566
+    public $index_champ = [];
567
+
568
+    // obsoletes, conserves provisoirement pour compatibilite
569
+    public $tout = false;
570
+    public $plat = false;
571
+    public $lien = false;
572 572
 }
573 573
 
574 574
 /**
@@ -579,56 +579,56 @@  discard block
 block discarded – undo
579 579
  * @package SPIP\Core\Compilateur\AST
580 580
  **/
581 581
 class Critere {
582
-	/**
583
-	 * Type de noeud
584
-	 *
585
-	 * @var string
586
-	 */
587
-	public $type = 'critere';
588
-
589
-	/**
590
-	 * Opérateur (>, <, >=, IN, ...)
591
-	 *
592
-	 * @var null|string
593
-	 */
594
-	public $op;
595
-
596
-	/**
597
-	 * Présence d'une négation (truc !op valeur)
598
-	 *
599
-	 * @var null|string
600
-	 */
601
-	public $not;
602
-
603
-	/**
604
-	 * Présence d'une exclusion (!truc op valeur)
605
-	 *
606
-	 * @var null|string
607
-	 */
608
-	public $exclus;
609
-
610
-	/**
611
-	 * Présence d'une condition dans le critère (truc ?)
612
-	 *
613
-	 * @var bool
614
-	 */
615
-	public $cond = false;
616
-
617
-	/**
618
-	 * Paramètres du critère
619
-	 * - $param[0] : élément avant l'opérateur
620
-	 * - $param[1..n] : éléments après l'opérateur
621
-	 *
622
-	 * @var array
623
-	 */
624
-	public $param = array();
625
-
626
-	/**
627
-	 * Numéro de ligne dans le code source du squelette
628
-	 *
629
-	 * @var int
630
-	 */
631
-	public $ligne = 0;
582
+    /**
583
+     * Type de noeud
584
+     *
585
+     * @var string
586
+     */
587
+    public $type = 'critere';
588
+
589
+    /**
590
+     * Opérateur (>, <, >=, IN, ...)
591
+     *
592
+     * @var null|string
593
+     */
594
+    public $op;
595
+
596
+    /**
597
+     * Présence d'une négation (truc !op valeur)
598
+     *
599
+     * @var null|string
600
+     */
601
+    public $not;
602
+
603
+    /**
604
+     * Présence d'une exclusion (!truc op valeur)
605
+     *
606
+     * @var null|string
607
+     */
608
+    public $exclus;
609
+
610
+    /**
611
+     * Présence d'une condition dans le critère (truc ?)
612
+     *
613
+     * @var bool
614
+     */
615
+    public $cond = false;
616
+
617
+    /**
618
+     * Paramètres du critère
619
+     * - $param[0] : élément avant l'opérateur
620
+     * - $param[1..n] : éléments après l'opérateur
621
+     *
622
+     * @var array
623
+     */
624
+    public $param = array();
625
+
626
+    /**
627
+     * Numéro de ligne dans le code source du squelette
628
+     *
629
+     * @var int
630
+     */
631
+    public $ligne = 0;
632 632
 }
633 633
 
634 634
 /**
@@ -637,139 +637,139 @@  discard block
 block discarded – undo
637 637
  * @package SPIP\Core\Compilateur\AST
638 638
  **/
639 639
 class Champ {
640
-	/**
641
-	 * Type de noeud
642
-	 *
643
-	 * @var string
644
-	 */
645
-	public $type = 'champ';
646
-
647
-	/**
648
-	 * Nom du champ demandé. Exemple 'ID_ARTICLE'
649
-	 *
650
-	 * @var string|null
651
-	 */
652
-	public $nom_champ;
653
-
654
-	/**
655
-	 * Identifiant de la boucle parente si explicité
656
-	 *
657
-	 * @var string|null
658
-	 */
659
-	public $nom_boucle = '';
660
-
661
-	/**
662
-	 * Partie optionnelle avant
663
-	 *
664
-	 * @var null|string|array
665
-	 */
666
-	public $avant;
667
-
668
-	/**
669
-	 * Partie optionnelle après
670
-	 *
671
-	 * @var null|string|array
672
-	 */
673
-	public $apres;
674
-
675
-	/**
676
-	 * Étoiles : annuler des automatismes
677
-	 *
678
-	 * - '*' annule les filtres automatiques
679
-	 * - '**' annule en plus les protections de scripts
680
-	 *
681
-	 * @var null|string
682
-	 */
683
-	public $etoile;
684
-
685
-	/**
686
-	 * Arguments et filtres explicites sur la balise
687
-	 *
688
-	 * - $param[0] contient les arguments de la balise
689
-	 * - $param[1..n] contient les filtres à appliquer à la balise
690
-	 *
691
-	 * @var array
692
-	 */
693
-	public $param = array();
694
-
695
-	/**
696
-	 * Source des filtres  (compatibilité) (?)
697
-	 *
698
-	 * @var array|null
699
-	 */
700
-	public $fonctions = array();
701
-
702
-	/**
703
-	 * Identifiant de la boucle
704
-	 *
705
-	 * @var string
706
-	 */
707
-	public $id_boucle = '';
708
-
709
-	/**
710
-	 * AST du squelette, liste de toutes les boucles
711
-	 *
712
-	 * @var Boucles[]
713
-	 */
714
-	public $boucles;
715
-
716
-	/**
717
-	 * Alias de table d'application de la requête ou nom complet de la table SQL
718
-	 *
719
-	 * @var string|null
720
-	 */
721
-	public $type_requete;
722
-
723
-	/**
724
-	 * Résultat de la compilation: toujours une expression PHP
725
-	 *
726
-	 * @var string
727
-	 */
728
-	public $code = '';
729
-
730
-	/**
731
-	 * Interdire les scripts
732
-	 *
733
-	 * false si on est sûr de cette balise
734
-	 *
735
-	 * @see interdire_scripts()
736
-	 * @var bool
737
-	 */
738
-	public $interdire_scripts = true;
739
-
740
-	/**
741
-	 * Description du squelette
742
-	 *
743
-	 * Sert pour la gestion d'erreur et la production de code dependant du contexte
744
-	 *
745
-	 * Peut contenir les index :
746
-	 *
747
-	 * - nom : Nom du fichier de cache
748
-	 * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
749
-	 * - sourcefile : Chemin du squelette
750
-	 * - squelette : Code du squelette
751
-	 * - id_mere : Identifiant de la boucle parente
752
-	 * - documents : Pour embed et img dans les textes
753
-	 * - session : Pour un cache sessionné par auteur
754
-	 * - niv : Niveau de tabulation
755
-	 *
756
-	 * @var array
757
-	 */
758
-	public $descr = array();
759
-
760
-	/**
761
-	 * Numéro de ligne dans le code source du squelette
762
-	 *
763
-	 * @var int
764
-	 */
765
-	public $ligne = 0;
766
-
767
-	/**
768
-	 * Drapeau pour reperer les balises calculées par une fonction explicite
769
-	 *
770
-	 * @var bool
771
-	 */
772
-	public $balise_calculee = false;
640
+    /**
641
+     * Type de noeud
642
+     *
643
+     * @var string
644
+     */
645
+    public $type = 'champ';
646
+
647
+    /**
648
+     * Nom du champ demandé. Exemple 'ID_ARTICLE'
649
+     *
650
+     * @var string|null
651
+     */
652
+    public $nom_champ;
653
+
654
+    /**
655
+     * Identifiant de la boucle parente si explicité
656
+     *
657
+     * @var string|null
658
+     */
659
+    public $nom_boucle = '';
660
+
661
+    /**
662
+     * Partie optionnelle avant
663
+     *
664
+     * @var null|string|array
665
+     */
666
+    public $avant;
667
+
668
+    /**
669
+     * Partie optionnelle après
670
+     *
671
+     * @var null|string|array
672
+     */
673
+    public $apres;
674
+
675
+    /**
676
+     * Étoiles : annuler des automatismes
677
+     *
678
+     * - '*' annule les filtres automatiques
679
+     * - '**' annule en plus les protections de scripts
680
+     *
681
+     * @var null|string
682
+     */
683
+    public $etoile;
684
+
685
+    /**
686
+     * Arguments et filtres explicites sur la balise
687
+     *
688
+     * - $param[0] contient les arguments de la balise
689
+     * - $param[1..n] contient les filtres à appliquer à la balise
690
+     *
691
+     * @var array
692
+     */
693
+    public $param = array();
694
+
695
+    /**
696
+     * Source des filtres  (compatibilité) (?)
697
+     *
698
+     * @var array|null
699
+     */
700
+    public $fonctions = array();
701
+
702
+    /**
703
+     * Identifiant de la boucle
704
+     *
705
+     * @var string
706
+     */
707
+    public $id_boucle = '';
708
+
709
+    /**
710
+     * AST du squelette, liste de toutes les boucles
711
+     *
712
+     * @var Boucles[]
713
+     */
714
+    public $boucles;
715
+
716
+    /**
717
+     * Alias de table d'application de la requête ou nom complet de la table SQL
718
+     *
719
+     * @var string|null
720
+     */
721
+    public $type_requete;
722
+
723
+    /**
724
+     * Résultat de la compilation: toujours une expression PHP
725
+     *
726
+     * @var string
727
+     */
728
+    public $code = '';
729
+
730
+    /**
731
+     * Interdire les scripts
732
+     *
733
+     * false si on est sûr de cette balise
734
+     *
735
+     * @see interdire_scripts()
736
+     * @var bool
737
+     */
738
+    public $interdire_scripts = true;
739
+
740
+    /**
741
+     * Description du squelette
742
+     *
743
+     * Sert pour la gestion d'erreur et la production de code dependant du contexte
744
+     *
745
+     * Peut contenir les index :
746
+     *
747
+     * - nom : Nom du fichier de cache
748
+     * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
749
+     * - sourcefile : Chemin du squelette
750
+     * - squelette : Code du squelette
751
+     * - id_mere : Identifiant de la boucle parente
752
+     * - documents : Pour embed et img dans les textes
753
+     * - session : Pour un cache sessionné par auteur
754
+     * - niv : Niveau de tabulation
755
+     *
756
+     * @var array
757
+     */
758
+    public $descr = array();
759
+
760
+    /**
761
+     * Numéro de ligne dans le code source du squelette
762
+     *
763
+     * @var int
764
+     */
765
+    public $ligne = 0;
766
+
767
+    /**
768
+     * Drapeau pour reperer les balises calculées par une fonction explicite
769
+     *
770
+     * @var bool
771
+     */
772
+    public $balise_calculee = false;
773 773
 }
774 774
 
775 775
 
@@ -777,123 +777,123 @@  discard block
 block discarded – undo
777 777
  * Description d'une chaîne de langue
778 778
  **/
779 779
 class Idiome {
780
-	/**
781
-	 * Type de noeud
782
-	 *
783
-	 * @var string
784
-	 */
785
-	public $type = 'idiome';
786
-
787
-	/**
788
-	 * Clé de traduction demandée. Exemple 'item_oui'
789
-	 *
790
-	 * @var string
791
-	 */
792
-	public $nom_champ = "";
793
-
794
-	/**
795
-	 * Module de langue où chercher la clé de traduction. Exemple 'medias'
796
-	 *
797
-	 * @var string
798
-	 */
799
-	public $module = "";
800
-
801
-	/**
802
-	 * Arguments à passer à la chaîne
803
-	 *
804
-	 * @var array
805
-	 */
806
-	public $arg = array();
807
-
808
-	/**
809
-	 * Filtres à appliquer au résultat
810
-	 *
811
-	 * @var array
812
-	 */
813
-	public $param = array();
814
-
815
-	/**
816
-	 * Source des filtres  (compatibilité) (?)
817
-	 *
818
-	 * @var array|null
819
-	 */
820
-	public $fonctions = array();
821
-
822
-	/**
823
-	 * Inutilisé, propriété générique de l'AST
824
-	 *
825
-	 * @var string|array
826
-	 */
827
-	public $avant = '';
828
-
829
-	/**
830
-	 * Inutilisé, propriété générique de l'AST
831
-	 *
832
-	 * @var string|array
833
-	 */
834
-	public $apres = '';
835
-
836
-	/**
837
-	 * Identifiant de la boucle
838
-	 *
839
-	 * @var string
840
-	 */
841
-	public $id_boucle = '';
842
-
843
-	/**
844
-	 * AST du squelette, liste de toutes les boucles
845
-	 *
846
-	 * @var Boucles[]
847
-	 */
848
-	public $boucles;
849
-
850
-	/**
851
-	 * Alias de table d'application de la requête ou nom complet de la table SQL
852
-	 *
853
-	 * @var string|null
854
-	 */
855
-	public $type_requete;
856
-
857
-	/**
858
-	 * Résultat de la compilation: toujours une expression PHP
859
-	 *
860
-	 * @var string
861
-	 */
862
-	public $code = '';
863
-
864
-	/**
865
-	 * Interdire les scripts
866
-	 *
867
-	 * @see interdire_scripts()
868
-	 * @var bool
869
-	 */
870
-	public $interdire_scripts = false;
871
-
872
-	/**
873
-	 * Description du squelette
874
-	 *
875
-	 * Sert pour la gestion d'erreur et la production de code dependant du contexte
876
-	 *
877
-	 * Peut contenir les index :
878
-	 * - nom : Nom du fichier de cache
879
-	 * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
880
-	 * - sourcefile : Chemin du squelette
881
-	 * - squelette : Code du squelette
882
-	 * - id_mere : Identifiant de la boucle parente
883
-	 * - documents : Pour embed et img dans les textes
884
-	 * - session : Pour un cache sessionné par auteur
885
-	 * - niv : Niveau de tabulation
886
-	 *
887
-	 * @var array
888
-	 */
889
-	public $descr = array();
890
-
891
-	/**
892
-	 * Numéro de ligne dans le code source du squelette
893
-	 *
894
-	 * @var int
895
-	 */
896
-	public $ligne = 0;
780
+    /**
781
+     * Type de noeud
782
+     *
783
+     * @var string
784
+     */
785
+    public $type = 'idiome';
786
+
787
+    /**
788
+     * Clé de traduction demandée. Exemple 'item_oui'
789
+     *
790
+     * @var string
791
+     */
792
+    public $nom_champ = "";
793
+
794
+    /**
795
+     * Module de langue où chercher la clé de traduction. Exemple 'medias'
796
+     *
797
+     * @var string
798
+     */
799
+    public $module = "";
800
+
801
+    /**
802
+     * Arguments à passer à la chaîne
803
+     *
804
+     * @var array
805
+     */
806
+    public $arg = array();
807
+
808
+    /**
809
+     * Filtres à appliquer au résultat
810
+     *
811
+     * @var array
812
+     */
813
+    public $param = array();
814
+
815
+    /**
816
+     * Source des filtres  (compatibilité) (?)
817
+     *
818
+     * @var array|null
819
+     */
820
+    public $fonctions = array();
821
+
822
+    /**
823
+     * Inutilisé, propriété générique de l'AST
824
+     *
825
+     * @var string|array
826
+     */
827
+    public $avant = '';
828
+
829
+    /**
830
+     * Inutilisé, propriété générique de l'AST
831
+     *
832
+     * @var string|array
833
+     */
834
+    public $apres = '';
835
+
836
+    /**
837
+     * Identifiant de la boucle
838
+     *
839
+     * @var string
840
+     */
841
+    public $id_boucle = '';
842
+
843
+    /**
844
+     * AST du squelette, liste de toutes les boucles
845
+     *
846
+     * @var Boucles[]
847
+     */
848
+    public $boucles;
849
+
850
+    /**
851
+     * Alias de table d'application de la requête ou nom complet de la table SQL
852
+     *
853
+     * @var string|null
854
+     */
855
+    public $type_requete;
856
+
857
+    /**
858
+     * Résultat de la compilation: toujours une expression PHP
859
+     *
860
+     * @var string
861
+     */
862
+    public $code = '';
863
+
864
+    /**
865
+     * Interdire les scripts
866
+     *
867
+     * @see interdire_scripts()
868
+     * @var bool
869
+     */
870
+    public $interdire_scripts = false;
871
+
872
+    /**
873
+     * Description du squelette
874
+     *
875
+     * Sert pour la gestion d'erreur et la production de code dependant du contexte
876
+     *
877
+     * Peut contenir les index :
878
+     * - nom : Nom du fichier de cache
879
+     * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
880
+     * - sourcefile : Chemin du squelette
881
+     * - squelette : Code du squelette
882
+     * - id_mere : Identifiant de la boucle parente
883
+     * - documents : Pour embed et img dans les textes
884
+     * - session : Pour un cache sessionné par auteur
885
+     * - niv : Niveau de tabulation
886
+     *
887
+     * @var array
888
+     */
889
+    public $descr = array();
890
+
891
+    /**
892
+     * Numéro de ligne dans le code source du squelette
893
+     *
894
+     * @var int
895
+     */
896
+    public $ligne = 0;
897 897
 }
898 898
 
899 899
 /**
@@ -902,28 +902,28 @@  discard block
 block discarded – undo
902 902
  * @package SPIP\Core\Compilateur\AST
903 903
  **/
904 904
 class Polyglotte {
905
-	/**
906
-	 * Type de noeud
907
-	 *
908
-	 * @var string
909
-	 */
910
-	public $type = 'polyglotte';
911
-
912
-	/**
913
-	 * Tableau des traductions possibles classées par langue
914
-	 *
915
-	 * Tableau code de langue => texte
916
-	 *
917
-	 * @var array
918
-	 */
919
-	public $traductions = array();
920
-
921
-	/**
922
-	 * Numéro de ligne dans le code source du squelette
923
-	 *
924
-	 * @var int
925
-	 */
926
-	public $ligne = 0;
905
+    /**
906
+     * Type de noeud
907
+     *
908
+     * @var string
909
+     */
910
+    public $type = 'polyglotte';
911
+
912
+    /**
913
+     * Tableau des traductions possibles classées par langue
914
+     *
915
+     * Tableau code de langue => texte
916
+     *
917
+     * @var array
918
+     */
919
+    public $traductions = array();
920
+
921
+    /**
922
+     * Numéro de ligne dans le code source du squelette
923
+     *
924
+     * @var int
925
+     */
926
+    public $ligne = 0;
927 927
 }
928 928
 
929 929
 
@@ -948,86 +948,86 @@  discard block
 block discarded – undo
948 948
  */
949 949
 function declarer_interfaces() {
950 950
 
951
-	$GLOBALS['table_des_tables']['articles'] = 'articles';
952
-	$GLOBALS['table_des_tables']['auteurs'] = 'auteurs';
953
-	$GLOBALS['table_des_tables']['rubriques'] = 'rubriques';
954
-	$GLOBALS['table_des_tables']['hierarchie'] = 'rubriques';
955
-
956
-	// definition des statuts de publication
957
-	$GLOBALS['table_statut'] = array();
958
-
959
-	//
960
-	// tableau des tables de jointures
961
-	// Ex: gestion du critere {id_mot} dans la boucle(ARTICLES)
962
-	$GLOBALS['tables_jointures'] = array();
963
-	$GLOBALS['tables_jointures']['spip_jobs'][] = 'jobs_liens';
964
-
965
-	// $GLOBALS['exceptions_des_jointures']['titre_mot'] = array('spip_mots', 'titre'); // pour exemple
966
-	$GLOBALS['exceptions_des_jointures']['profondeur'] = array('spip_rubriques', 'profondeur');
967
-
968
-
969
-	if (!defined('_TRAITEMENT_TYPO')) {
970
-		define('_TRAITEMENT_TYPO', 'typo(%s, "TYPO", $connect, $Pile[0])');
971
-	}
972
-	if (!defined('_TRAITEMENT_RACCOURCIS')) {
973
-		define('_TRAITEMENT_RACCOURCIS', 'propre(%s, $connect, $Pile[0])');
974
-	}
975
-	if (!defined('_TRAITEMENT_TYPO_SANS_NUMERO')) {
976
-		define('_TRAITEMENT_TYPO_SANS_NUMERO', 'supprimer_numero(typo(%s, "TYPO", $connect, $Pile[0]))');
977
-	}
978
-	$GLOBALS['table_des_traitements']['BIO'][] = _TRAITEMENT_RACCOURCIS;
979
-	$GLOBALS['table_des_traitements']['CHAPO'][] = _TRAITEMENT_RACCOURCIS;
980
-	$GLOBALS['table_des_traitements']['DATE'][] = 'normaliser_date(%s)';
981
-	$GLOBALS['table_des_traitements']['DATE_REDAC'][] = 'normaliser_date(%s)';
982
-	$GLOBALS['table_des_traitements']['DATE_MODIF'][] = 'normaliser_date(%s)';
983
-	$GLOBALS['table_des_traitements']['DATE_NOUVEAUTES'][] = 'normaliser_date(%s)';
984
-	$GLOBALS['table_des_traitements']['DESCRIPTIF'][] = _TRAITEMENT_RACCOURCIS;
985
-	$GLOBALS['table_des_traitements']['INTRODUCTION'][] = _TRAITEMENT_RACCOURCIS;
986
-	$GLOBALS['table_des_traitements']['NOM_SITE_SPIP'][] = _TRAITEMENT_TYPO;
987
-	$GLOBALS['table_des_traitements']['NOM'][] = _TRAITEMENT_TYPO_SANS_NUMERO;
988
-	$GLOBALS['table_des_traitements']['AUTEUR'][] = _TRAITEMENT_TYPO;
989
-	$GLOBALS['table_des_traitements']['PS'][] = _TRAITEMENT_RACCOURCIS;
990
-	$GLOBALS['table_des_traitements']['SOURCE'][] = _TRAITEMENT_TYPO;
991
-	$GLOBALS['table_des_traitements']['SOUSTITRE'][] = _TRAITEMENT_TYPO;
992
-	$GLOBALS['table_des_traitements']['SURTITRE'][] = _TRAITEMENT_TYPO;
993
-	$GLOBALS['table_des_traitements']['TAGS'][] = '%s';
994
-	$GLOBALS['table_des_traitements']['TEXTE'][] = _TRAITEMENT_RACCOURCIS;
995
-	$GLOBALS['table_des_traitements']['TITRE'][] = _TRAITEMENT_TYPO_SANS_NUMERO;
996
-	$GLOBALS['table_des_traitements']['TYPE'][] = _TRAITEMENT_TYPO;
997
-	$GLOBALS['table_des_traitements']['DESCRIPTIF_SITE_SPIP'][] = _TRAITEMENT_RACCOURCIS;
998
-	$GLOBALS['table_des_traitements']['SLOGAN_SITE_SPIP'][] = _TRAITEMENT_TYPO;
999
-	$GLOBALS['table_des_traitements']['ENV'][] = 'entites_html(%s,true)';
1000
-
1001
-	// valeur par defaut pour les balises non listees ci-dessus
1002
-	$GLOBALS['table_des_traitements']['*'][] = false; // pas de traitement, mais permet au compilo de trouver la declaration suivante
1003
-	// toujours securiser les DATA
1004
-	$GLOBALS['table_des_traitements']['*']['DATA'] = 'safehtml(%s)';
1005
-	// expliciter pour VALEUR qui est un champ calcule et ne sera pas protege par le catch-all *
1006
-	$GLOBALS['table_des_traitements']['VALEUR']['DATA'] = 'safehtml(%s)';
1007
-
1008
-
1009
-	// gerer l'affectation en 2 temps car si le pipe n'est pas encore declare, on ecrase les globales
1010
-	$interfaces = pipeline('declarer_tables_interfaces',
1011
-		array(
1012
-			'table_des_tables' => $GLOBALS['table_des_tables'],
1013
-			'exceptions_des_tables' => $GLOBALS['exceptions_des_tables'],
1014
-			'table_date' => $GLOBALS['table_date'],
1015
-			'table_titre' => $GLOBALS['table_titre'],
1016
-			'tables_jointures' => $GLOBALS['tables_jointures'],
1017
-			'exceptions_des_jointures' => $GLOBALS['exceptions_des_jointures'],
1018
-			'table_des_traitements' => $GLOBALS['table_des_traitements'],
1019
-			'table_statut' => $GLOBALS['table_statut'],
1020
-		));
1021
-	if ($interfaces) {
1022
-		$GLOBALS['table_des_tables'] = $interfaces['table_des_tables'];
1023
-		$GLOBALS['exceptions_des_tables'] = $interfaces['exceptions_des_tables'];
1024
-		$GLOBALS['table_date'] = $interfaces['table_date'];
1025
-		$GLOBALS['table_titre'] = $interfaces['table_titre'];
1026
-		$GLOBALS['tables_jointures'] = $interfaces['tables_jointures'];
1027
-		$GLOBALS['exceptions_des_jointures'] = $interfaces['exceptions_des_jointures'];
1028
-		$GLOBALS['table_des_traitements'] = $interfaces['table_des_traitements'];
1029
-		$GLOBALS['table_statut'] = $interfaces['table_statut'];
1030
-	}
951
+    $GLOBALS['table_des_tables']['articles'] = 'articles';
952
+    $GLOBALS['table_des_tables']['auteurs'] = 'auteurs';
953
+    $GLOBALS['table_des_tables']['rubriques'] = 'rubriques';
954
+    $GLOBALS['table_des_tables']['hierarchie'] = 'rubriques';
955
+
956
+    // definition des statuts de publication
957
+    $GLOBALS['table_statut'] = array();
958
+
959
+    //
960
+    // tableau des tables de jointures
961
+    // Ex: gestion du critere {id_mot} dans la boucle(ARTICLES)
962
+    $GLOBALS['tables_jointures'] = array();
963
+    $GLOBALS['tables_jointures']['spip_jobs'][] = 'jobs_liens';
964
+
965
+    // $GLOBALS['exceptions_des_jointures']['titre_mot'] = array('spip_mots', 'titre'); // pour exemple
966
+    $GLOBALS['exceptions_des_jointures']['profondeur'] = array('spip_rubriques', 'profondeur');
967
+
968
+
969
+    if (!defined('_TRAITEMENT_TYPO')) {
970
+        define('_TRAITEMENT_TYPO', 'typo(%s, "TYPO", $connect, $Pile[0])');
971
+    }
972
+    if (!defined('_TRAITEMENT_RACCOURCIS')) {
973
+        define('_TRAITEMENT_RACCOURCIS', 'propre(%s, $connect, $Pile[0])');
974
+    }
975
+    if (!defined('_TRAITEMENT_TYPO_SANS_NUMERO')) {
976
+        define('_TRAITEMENT_TYPO_SANS_NUMERO', 'supprimer_numero(typo(%s, "TYPO", $connect, $Pile[0]))');
977
+    }
978
+    $GLOBALS['table_des_traitements']['BIO'][] = _TRAITEMENT_RACCOURCIS;
979
+    $GLOBALS['table_des_traitements']['CHAPO'][] = _TRAITEMENT_RACCOURCIS;
980
+    $GLOBALS['table_des_traitements']['DATE'][] = 'normaliser_date(%s)';
981
+    $GLOBALS['table_des_traitements']['DATE_REDAC'][] = 'normaliser_date(%s)';
982
+    $GLOBALS['table_des_traitements']['DATE_MODIF'][] = 'normaliser_date(%s)';
983
+    $GLOBALS['table_des_traitements']['DATE_NOUVEAUTES'][] = 'normaliser_date(%s)';
984
+    $GLOBALS['table_des_traitements']['DESCRIPTIF'][] = _TRAITEMENT_RACCOURCIS;
985
+    $GLOBALS['table_des_traitements']['INTRODUCTION'][] = _TRAITEMENT_RACCOURCIS;
986
+    $GLOBALS['table_des_traitements']['NOM_SITE_SPIP'][] = _TRAITEMENT_TYPO;
987
+    $GLOBALS['table_des_traitements']['NOM'][] = _TRAITEMENT_TYPO_SANS_NUMERO;
988
+    $GLOBALS['table_des_traitements']['AUTEUR'][] = _TRAITEMENT_TYPO;
989
+    $GLOBALS['table_des_traitements']['PS'][] = _TRAITEMENT_RACCOURCIS;
990
+    $GLOBALS['table_des_traitements']['SOURCE'][] = _TRAITEMENT_TYPO;
991
+    $GLOBALS['table_des_traitements']['SOUSTITRE'][] = _TRAITEMENT_TYPO;
992
+    $GLOBALS['table_des_traitements']['SURTITRE'][] = _TRAITEMENT_TYPO;
993
+    $GLOBALS['table_des_traitements']['TAGS'][] = '%s';
994
+    $GLOBALS['table_des_traitements']['TEXTE'][] = _TRAITEMENT_RACCOURCIS;
995
+    $GLOBALS['table_des_traitements']['TITRE'][] = _TRAITEMENT_TYPO_SANS_NUMERO;
996
+    $GLOBALS['table_des_traitements']['TYPE'][] = _TRAITEMENT_TYPO;
997
+    $GLOBALS['table_des_traitements']['DESCRIPTIF_SITE_SPIP'][] = _TRAITEMENT_RACCOURCIS;
998
+    $GLOBALS['table_des_traitements']['SLOGAN_SITE_SPIP'][] = _TRAITEMENT_TYPO;
999
+    $GLOBALS['table_des_traitements']['ENV'][] = 'entites_html(%s,true)';
1000
+
1001
+    // valeur par defaut pour les balises non listees ci-dessus
1002
+    $GLOBALS['table_des_traitements']['*'][] = false; // pas de traitement, mais permet au compilo de trouver la declaration suivante
1003
+    // toujours securiser les DATA
1004
+    $GLOBALS['table_des_traitements']['*']['DATA'] = 'safehtml(%s)';
1005
+    // expliciter pour VALEUR qui est un champ calcule et ne sera pas protege par le catch-all *
1006
+    $GLOBALS['table_des_traitements']['VALEUR']['DATA'] = 'safehtml(%s)';
1007
+
1008
+
1009
+    // gerer l'affectation en 2 temps car si le pipe n'est pas encore declare, on ecrase les globales
1010
+    $interfaces = pipeline('declarer_tables_interfaces',
1011
+        array(
1012
+            'table_des_tables' => $GLOBALS['table_des_tables'],
1013
+            'exceptions_des_tables' => $GLOBALS['exceptions_des_tables'],
1014
+            'table_date' => $GLOBALS['table_date'],
1015
+            'table_titre' => $GLOBALS['table_titre'],
1016
+            'tables_jointures' => $GLOBALS['tables_jointures'],
1017
+            'exceptions_des_jointures' => $GLOBALS['exceptions_des_jointures'],
1018
+            'table_des_traitements' => $GLOBALS['table_des_traitements'],
1019
+            'table_statut' => $GLOBALS['table_statut'],
1020
+        ));
1021
+    if ($interfaces) {
1022
+        $GLOBALS['table_des_tables'] = $interfaces['table_des_tables'];
1023
+        $GLOBALS['exceptions_des_tables'] = $interfaces['exceptions_des_tables'];
1024
+        $GLOBALS['table_date'] = $interfaces['table_date'];
1025
+        $GLOBALS['table_titre'] = $interfaces['table_titre'];
1026
+        $GLOBALS['tables_jointures'] = $interfaces['tables_jointures'];
1027
+        $GLOBALS['exceptions_des_jointures'] = $interfaces['exceptions_des_jointures'];
1028
+        $GLOBALS['table_des_traitements'] = $interfaces['table_des_traitements'];
1029
+        $GLOBALS['table_statut'] = $interfaces['table_statut'];
1030
+    }
1031 1031
 }
1032 1032
 
1033 1033
 declarer_interfaces();
Please login to merge, or discard this patch.