Completed
Push — master ( 1891d3...7fa313 )
by cam
01:19
created
ecrire/public/phraser_html.php 1 patch
Indentation   +1032 added lines, -1032 removed lines patch added patch discarded remove patch
@@ -20,7 +20,7 @@  discard block
 block discarded – undo
20 20
  **/
21 21
 
22 22
 if (!defined('_ECRIRE_INC_VERSION')) {
23
-	return;
23
+    return;
24 24
 }
25 25
 
26 26
 /** Début de la partie principale d'une boucle */
@@ -65,83 +65,83 @@  discard block
 block discarded – undo
65 65
 // https://code.spip.net/@phraser_inclure
66 66
 function phraser_inclure($texte, $ligne, $result) {
67 67
 
68
-	while (preg_match(BALISE_INCLURE, $texte, $match)) {
69
-		$match = array_pad($match, 3, null);
70
-		$p = strpos($texte, $match[0]);
71
-		$debut = substr($texte, 0, $p);
72
-		if ($p) {
73
-			$result = phraser_idiomes($debut, $ligne, $result);
74
-		}
75
-		$ligne += substr_count($debut, "\n");
76
-		$champ = new Inclure();
77
-		$champ->ligne = $ligne;
78
-		$ligne += substr_count($match[0], "\n");
79
-		$fichier = $match[2];
80
-		# assurer ici la migration .php3 => .php
81
-		# et de l'ancienne syntaxe INCLURE(page.php3) devenue surperflue
82
-		if ($fichier and preg_match(',^(.*[.]php)3$,', $fichier, $r)) {
83
-			$fichier = $r[1];
84
-		}
85
-		$champ->texte = ($fichier !== 'page.php') ? $fichier : '';
86
-		$texte = substr($texte, $p + strlen($match[0]));
87
-		// on assimile {var=val} a une liste de un argument sans fonction
88
-		$pos_apres = 0;
89
-		phraser_args($texte, '/>', '', $result, $champ, $pos_apres);
90
-		if (!$champ->texte or count($champ->param) > 1) {
91
-			if (!function_exists('normaliser_inclure')) {
92
-				include_spip('public/normaliser');
93
-			}
94
-			normaliser_inclure($champ);
95
-		}
96
-		$texte = substr($texte, strpos($texte, '>', $pos_apres) + 1);
97
-		$texte = preg_replace(',^</INCLU[DR]E>,', '', $texte);
98
-		$result[] = $champ;
99
-	}
100
-
101
-	return (($texte === '') ? $result : phraser_idiomes($texte, $ligne, $result));
68
+    while (preg_match(BALISE_INCLURE, $texte, $match)) {
69
+        $match = array_pad($match, 3, null);
70
+        $p = strpos($texte, $match[0]);
71
+        $debut = substr($texte, 0, $p);
72
+        if ($p) {
73
+            $result = phraser_idiomes($debut, $ligne, $result);
74
+        }
75
+        $ligne += substr_count($debut, "\n");
76
+        $champ = new Inclure();
77
+        $champ->ligne = $ligne;
78
+        $ligne += substr_count($match[0], "\n");
79
+        $fichier = $match[2];
80
+        # assurer ici la migration .php3 => .php
81
+        # et de l'ancienne syntaxe INCLURE(page.php3) devenue surperflue
82
+        if ($fichier and preg_match(',^(.*[.]php)3$,', $fichier, $r)) {
83
+            $fichier = $r[1];
84
+        }
85
+        $champ->texte = ($fichier !== 'page.php') ? $fichier : '';
86
+        $texte = substr($texte, $p + strlen($match[0]));
87
+        // on assimile {var=val} a une liste de un argument sans fonction
88
+        $pos_apres = 0;
89
+        phraser_args($texte, '/>', '', $result, $champ, $pos_apres);
90
+        if (!$champ->texte or count($champ->param) > 1) {
91
+            if (!function_exists('normaliser_inclure')) {
92
+                include_spip('public/normaliser');
93
+            }
94
+            normaliser_inclure($champ);
95
+        }
96
+        $texte = substr($texte, strpos($texte, '>', $pos_apres) + 1);
97
+        $texte = preg_replace(',^</INCLU[DR]E>,', '', $texte);
98
+        $result[] = $champ;
99
+    }
100
+
101
+    return (($texte === '') ? $result : phraser_idiomes($texte, $ligne, $result));
102 102
 }
103 103
 
104 104
 // https://code.spip.net/@phraser_polyglotte
105 105
 function phraser_polyglotte($texte, $ligne, $result) {
106 106
 
107
-	if (preg_match_all(BALISE_POLYGLOTTE, $texte, $m, PREG_SET_ORDER)) {
108
-		foreach ($m as $match) {
109
-			$p = strpos($texte, $match[0]);
110
-			$debut = substr($texte, 0, $p);
111
-			if ($p) {
112
-				$champ = new Texte();
113
-				$champ->texte = $debut;
114
-				$champ->ligne = $ligne;
115
-				$result[] = $champ;
116
-				$ligne += substr_count($champ->texte, "\n");
117
-			}
118
-
119
-			$champ = new Polyglotte();
120
-			$champ->ligne = $ligne;
121
-			$ligne += substr_count($match[0], "\n");
122
-			$lang = '';
123
-			$bloc = $match[1];
124
-			$texte = substr($texte, $p + strlen($match[0]));
125
-			while (preg_match('/^[[:space:]]*([^[{]*)[[:space:]]*[[{]([a-z_]+)[]}](.*)$/si', $bloc, $regs)) {
126
-				$trad = $regs[1];
127
-				if ($trad or $lang) {
128
-					$champ->traductions[$lang] = $trad;
129
-				}
130
-				$lang = $regs[2];
131
-				$bloc = $regs[3];
132
-			}
133
-			$champ->traductions[$lang] = $bloc;
134
-			$result[] = $champ;
135
-		}
136
-	}
137
-	if ($texte !== '') {
138
-		$champ = new Texte();
139
-		$champ->texte = $texte;
140
-		$champ->ligne = $ligne;
141
-		$result[] = $champ;
142
-	}
143
-
144
-	return $result;
107
+    if (preg_match_all(BALISE_POLYGLOTTE, $texte, $m, PREG_SET_ORDER)) {
108
+        foreach ($m as $match) {
109
+            $p = strpos($texte, $match[0]);
110
+            $debut = substr($texte, 0, $p);
111
+            if ($p) {
112
+                $champ = new Texte();
113
+                $champ->texte = $debut;
114
+                $champ->ligne = $ligne;
115
+                $result[] = $champ;
116
+                $ligne += substr_count($champ->texte, "\n");
117
+            }
118
+
119
+            $champ = new Polyglotte();
120
+            $champ->ligne = $ligne;
121
+            $ligne += substr_count($match[0], "\n");
122
+            $lang = '';
123
+            $bloc = $match[1];
124
+            $texte = substr($texte, $p + strlen($match[0]));
125
+            while (preg_match('/^[[:space:]]*([^[{]*)[[:space:]]*[[{]([a-z_]+)[]}](.*)$/si', $bloc, $regs)) {
126
+                $trad = $regs[1];
127
+                if ($trad or $lang) {
128
+                    $champ->traductions[$lang] = $trad;
129
+                }
130
+                $lang = $regs[2];
131
+                $bloc = $regs[3];
132
+            }
133
+            $champ->traductions[$lang] = $bloc;
134
+            $result[] = $champ;
135
+        }
136
+    }
137
+    if ($texte !== '') {
138
+        $champ = new Texte();
139
+        $champ->texte = $texte;
140
+        $champ->ligne = $ligne;
141
+        $result[] = $champ;
142
+    }
143
+
144
+    return $result;
145 145
 }
146 146
 
147 147
 
@@ -163,43 +163,43 @@  discard block
 block discarded – undo
163 163
  * @return array
164 164
  **/
165 165
 function phraser_idiomes($texte, $ligne, $result) {
166
-	while (preg_match(BALISE_IDIOMES, $texte, $match)) {
167
-		$match = array_pad($match, 8, null);
168
-		$p = strpos($texte, $match[0]);
169
-		$ko = (!$match[3] && ($match[5][0] !== '='));
170
-		$debut = substr($texte, 0, $p + ($ko ? strlen($match[0]) : 0));
171
-		if ($debut) {
172
-			$result = phraser_champs($debut, $ligne, $result);
173
-		}
174
-		$texte = substr($texte, $p + strlen($match[0]));
175
-		$ligne += substr_count($debut, "\n");
176
-		if ($ko) {
177
-			continue;
178
-		} // faux idiome
179
-		$champ = new Idiome();
180
-		$champ->ligne = $ligne;
181
-		$ligne += substr_count($match[0], "\n");
182
-		// Stocker les arguments de la balise de traduction
183
-		$args = [];
184
-		$largs = $match[5];
185
-		while (preg_match(BALISE_IDIOMES_ARGS, $largs, $r)) {
186
-			$args[$r[1]] = phraser_champs($r[2], 0, []);
187
-			$largs = substr($largs, strlen($r[0]));
188
-		}
189
-		$champ->arg = $args;
190
-		$champ->nom_champ = strtolower($match[3]);
191
-		$champ->module = $match[2];
192
-		// pas d'imbrication pour les filtres sur langue
193
-		$pos_apres = 0;
194
-		phraser_args($match[7], ':', '', [], $champ, $pos_apres);
195
-		$champ->apres = substr($match[7], $pos_apres);
196
-		$result[] = $champ;
197
-	}
198
-	if ($texte !== '') {
199
-		$result = phraser_champs($texte, $ligne, $result);
200
-	}
201
-
202
-	return $result;
166
+    while (preg_match(BALISE_IDIOMES, $texte, $match)) {
167
+        $match = array_pad($match, 8, null);
168
+        $p = strpos($texte, $match[0]);
169
+        $ko = (!$match[3] && ($match[5][0] !== '='));
170
+        $debut = substr($texte, 0, $p + ($ko ? strlen($match[0]) : 0));
171
+        if ($debut) {
172
+            $result = phraser_champs($debut, $ligne, $result);
173
+        }
174
+        $texte = substr($texte, $p + strlen($match[0]));
175
+        $ligne += substr_count($debut, "\n");
176
+        if ($ko) {
177
+            continue;
178
+        } // faux idiome
179
+        $champ = new Idiome();
180
+        $champ->ligne = $ligne;
181
+        $ligne += substr_count($match[0], "\n");
182
+        // Stocker les arguments de la balise de traduction
183
+        $args = [];
184
+        $largs = $match[5];
185
+        while (preg_match(BALISE_IDIOMES_ARGS, $largs, $r)) {
186
+            $args[$r[1]] = phraser_champs($r[2], 0, []);
187
+            $largs = substr($largs, strlen($r[0]));
188
+        }
189
+        $champ->arg = $args;
190
+        $champ->nom_champ = strtolower($match[3]);
191
+        $champ->module = $match[2];
192
+        // pas d'imbrication pour les filtres sur langue
193
+        $pos_apres = 0;
194
+        phraser_args($match[7], ':', '', [], $champ, $pos_apres);
195
+        $champ->apres = substr($match[7], $pos_apres);
196
+        $result[] = $champ;
197
+    }
198
+    if ($texte !== '') {
199
+        $result = phraser_champs($texte, $ligne, $result);
200
+    }
201
+
202
+    return $result;
203 203
 }
204 204
 
205 205
 /**
@@ -217,47 +217,47 @@  discard block
 block discarded – undo
217 217
  * @return array
218 218
  **/
219 219
 function phraser_champs($texte, $ligne, $result) {
220
-	while (preg_match('/' . NOM_DE_CHAMP . '/S', $texte, $match)) {
221
-		$p = strpos($texte, $match[0]);
222
-		// texte après la balise
223
-		$suite = substr($texte, $p + strlen($match[0]));
224
-
225
-		$debut = substr($texte, 0, $p);
226
-		if ($p) {
227
-			$result = phraser_polyglotte($debut, $ligne, $result);
228
-		}
229
-		$ligne += substr_count($debut, "\n");
230
-		$champ = new Champ();
231
-		$champ->ligne = $ligne;
232
-		$ligne += substr_count($match[0], "\n");
233
-		$champ->nom_boucle = $match[2];
234
-		$champ->nom_champ = $match[3];
235
-		$champ->etoile = $match[5];
236
-
237
-		if ($suite and $suite[0] == '{') {
238
-			phraser_arg($suite, '', [], $champ);
239
-			// ce ltrim est une ereur de conception
240
-			// mais on le conserve par souci de compatibilite
241
-			$texte = ltrim($suite);
242
-			// Il faudrait le normaliser dans l'arbre de syntaxe abstraite
243
-			// pour faire sauter ce cas particulier a la decompilation.
244
-			/* Ce qui suit est malheureusement incomplet pour cela:
220
+    while (preg_match('/' . NOM_DE_CHAMP . '/S', $texte, $match)) {
221
+        $p = strpos($texte, $match[0]);
222
+        // texte après la balise
223
+        $suite = substr($texte, $p + strlen($match[0]));
224
+
225
+        $debut = substr($texte, 0, $p);
226
+        if ($p) {
227
+            $result = phraser_polyglotte($debut, $ligne, $result);
228
+        }
229
+        $ligne += substr_count($debut, "\n");
230
+        $champ = new Champ();
231
+        $champ->ligne = $ligne;
232
+        $ligne += substr_count($match[0], "\n");
233
+        $champ->nom_boucle = $match[2];
234
+        $champ->nom_champ = $match[3];
235
+        $champ->etoile = $match[5];
236
+
237
+        if ($suite and $suite[0] == '{') {
238
+            phraser_arg($suite, '', [], $champ);
239
+            // ce ltrim est une ereur de conception
240
+            // mais on le conserve par souci de compatibilite
241
+            $texte = ltrim($suite);
242
+            // Il faudrait le normaliser dans l'arbre de syntaxe abstraite
243
+            // pour faire sauter ce cas particulier a la decompilation.
244
+            /* Ce qui suit est malheureusement incomplet pour cela:
245 245
 			if ($n = (strlen($suite) - strlen($texte))) {
246 246
 				$champ->apres = array(new Texte);
247 247
 				$champ->apres[0]->texte = substr($suite,0,$n);
248 248
 			}
249 249
 			*/
250
-		} else {
251
-			$texte = $suite;
252
-		}
253
-		phraser_vieux($champ);
254
-		$result[] = $champ;
255
-	}
256
-	if ($texte !== '') {
257
-		$result = phraser_polyglotte($texte, $ligne, $result);
258
-	}
259
-
260
-	return $result;
250
+        } else {
251
+            $texte = $suite;
252
+        }
253
+        phraser_vieux($champ);
254
+        $result[] = $champ;
255
+    }
256
+    if ($texte !== '') {
257
+        $result = phraser_polyglotte($texte, $ligne, $result);
258
+    }
259
+
260
+    return $result;
261 261
 }
262 262
 
263 263
 // Gestion des imbrications:
@@ -267,15 +267,15 @@  discard block
 block discarded – undo
267 267
 
268 268
 // https://code.spip.net/@phraser_champs_etendus
269 269
 function phraser_champs_etendus($texte, $ligne, $result) {
270
-	if ($texte === '') {
271
-		return $result;
272
-	}
273
-	$sep = '##';
274
-	while (strpos($texte, $sep) !== false) {
275
-		$sep .= '#';
276
-	}
277
-
278
-	return array_merge($result, phraser_champs_interieurs($texte, $ligne, $sep, []));
270
+    if ($texte === '') {
271
+        return $result;
272
+    }
273
+    $sep = '##';
274
+    while (strpos($texte, $sep) !== false) {
275
+        $sep .= '#';
276
+    }
277
+
278
+    return array_merge($result, phraser_champs_interieurs($texte, $ligne, $sep, []));
279 279
 }
280 280
 
281 281
 /**
@@ -296,278 +296,278 @@  discard block
 block discarded – undo
296 296
  * @return array
297 297
  */
298 298
 function phraser_args($texte, $fin, $sep, $result, &$pointeur_champ, &$pos_debut) {
299
-	$length = strlen($texte);
300
-	while ($pos_debut < $length and trim($texte[$pos_debut]) === '') {
301
-		$pos_debut++;
302
-	}
303
-	while (($pos_debut < $length) && strpos($fin, $texte[$pos_debut]) === false) {
304
-		// phraser_arg modifie directement le $texte, on fait donc avec ici en passant par une sous chaine
305
-		$st = substr($texte, $pos_debut);
306
-		$result = phraser_arg($st, $sep, $result, $pointeur_champ);
307
-		$pos_debut = $length - strlen($st);
308
-		while ($pos_debut < $length and trim($texte[$pos_debut]) === '') {
309
-			$pos_debut++;
310
-		}
311
-	}
312
-
313
-	return $result;
299
+    $length = strlen($texte);
300
+    while ($pos_debut < $length and trim($texte[$pos_debut]) === '') {
301
+        $pos_debut++;
302
+    }
303
+    while (($pos_debut < $length) && strpos($fin, $texte[$pos_debut]) === false) {
304
+        // phraser_arg modifie directement le $texte, on fait donc avec ici en passant par une sous chaine
305
+        $st = substr($texte, $pos_debut);
306
+        $result = phraser_arg($st, $sep, $result, $pointeur_champ);
307
+        $pos_debut = $length - strlen($st);
308
+        while ($pos_debut < $length and trim($texte[$pos_debut]) === '') {
309
+            $pos_debut++;
310
+        }
311
+    }
312
+
313
+    return $result;
314 314
 }
315 315
 
316 316
 // https://code.spip.net/@phraser_arg
317 317
 function phraser_arg(&$texte, $sep, $result, &$pointeur_champ) {
318
-	preg_match(',^(\|?[^}{)|]*)(.*)$,ms', $texte, $match);
319
-	$suite = ltrim($match[2]);
320
-	$fonc = trim($match[1]);
321
-	if ($fonc && $fonc[0] == '|') {
322
-		$fonc = ltrim(substr($fonc, 1));
323
-	}
324
-	$res = [$fonc];
325
-	$err_f = '';
326
-	// cas du filtre sans argument ou du critere /
327
-	if (($suite && ($suite[0] != '{')) || ($fonc && $fonc[0] == '/')) {
328
-		// si pas d'argument, alors il faut une fonction ou un double |
329
-		if (!$match[1]) {
330
-			$err_f = ['zbug_erreur_filtre', ['filtre' => $texte]];
331
-			erreur_squelette($err_f, $pointeur_champ);
332
-			$texte = '';
333
-		} else {
334
-			$texte = $suite;
335
-		}
336
-		if ($err_f) {
337
-			$pointeur_champ->param = false;
338
-		} elseif ($fonc !== '') {
339
-			$pointeur_champ->param[] = $res;
340
-		}
341
-		// pour les balises avec faux filtres qui boudent ce dur larbeur
342
-		$pointeur_champ->fonctions[] = [$fonc, ''];
343
-
344
-		return $result;
345
-	}
346
-	$args = ltrim(substr($suite, 1)); // virer le '(' initial
347
-	$collecte = [];
348
-	while ($args && $args[0] != '}') {
349
-		if ($args[0] == '"') {
350
-			preg_match('/^(")([^"]*)(")(.*)$/ms', $args, $regs);
351
-		} elseif ($args[0] == "'") {
352
-			preg_match("/^(')([^']*)(')(.*)$/ms", $args, $regs);
353
-		} else {
354
-			preg_match('/^([[:space:]]*)([^,([{}]*([(\[{][^])}]*[])}])?[^,}]*)([,}].*)$/ms', $args, $regs);
355
-			if (!isset($regs[2]) or !strlen($regs[2])) {
356
-				$err_f = ['zbug_erreur_filtre', ['filtre' => $args]];
357
-				erreur_squelette($err_f, $pointeur_champ);
358
-				$champ = new Texte();
359
-				$champ->apres = $champ->avant = $args = '';
360
-				break;
361
-			}
362
-		}
363
-		$arg = $regs[2];
364
-		if (trim($regs[1])) {
365
-			$champ = new Texte();
366
-			$champ->texte = $arg;
367
-			$champ->apres = $champ->avant = $regs[1];
368
-			$result[] = $champ;
369
-			$collecte[] = $champ;
370
-			$args = ltrim($regs[count($regs) - 1]);
371
-		} else {
372
-			if (!preg_match('/' . NOM_DE_CHAMP . '([{|])/', $arg, $r)) {
373
-				// 0 est un aveu d'impuissance. A completer
374
-				$arg = phraser_champs_exterieurs($arg, 0, $sep, $result);
375
-
376
-				$args = ltrim($regs[count($regs) - 1]);
377
-				$collecte = array_merge($collecte, $arg);
378
-				$result = array_merge($result, $arg);
379
-			} else {
380
-				$n = strpos($args, $r[0]);
381
-				$pred = substr($args, 0, $n);
382
-				$par = ',}';
383
-				if (preg_match('/^(.*)\($/', $pred, $m)) {
384
-					$pred = $m[1];
385
-					$par = ')';
386
-				}
387
-				if ($pred) {
388
-					$champ = new Texte();
389
-					$champ->texte = $pred;
390
-					$champ->apres = $champ->avant = '';
391
-					$result[] = $champ;
392
-					$collecte[] = $champ;
393
-				}
394
-				$rec = substr($args, $n + strlen($r[0]) - 1);
395
-				$champ = new Champ();
396
-				$champ->nom_boucle = $r[2];
397
-				$champ->nom_champ = $r[3];
398
-				$champ->etoile = $r[5];
399
-				$next = $r[6];
400
-				while ($next == '{') {
401
-					phraser_arg($rec, $sep, [], $champ);
402
-					$args = ltrim($rec);
403
-					$next = isset($args[0]) ? $args[0] : '';
404
-				}
405
-				while ($next == '|') {
406
-					$pos_apres = 0;
407
-					phraser_args($rec, $par, $sep, [], $champ, $pos_apres);
408
-					$args = substr($rec, $pos_apres);
409
-					$next = isset($args[0]) ? $args[0] : '';
410
-				}
411
-				// Si erreur de syntaxe dans un sous-argument, propager.
412
-				if ($champ->param === false) {
413
-					$err_f = true;
414
-				} else {
415
-					phraser_vieux($champ);
416
-				}
417
-				if ($par == ')') {
418
-					$args = substr($args, 1);
419
-				}
420
-				$collecte[] = $champ;
421
-				$result[] = $champ;
422
-			}
423
-		}
424
-		if (isset($args[0]) and $args[0] == ',') {
425
-			$args = ltrim(substr($args, 1));
426
-			if ($collecte) {
427
-				$res[] = $collecte;
428
-				$collecte = [];
429
-			}
430
-		}
431
-	}
432
-	if ($collecte) {
433
-		$res[] = $collecte;
434
-		$collecte = [];
435
-	}
436
-	$texte = substr($args, 1);
437
-	$source = substr($suite, 0, strlen($suite) - strlen($texte));
438
-	// propager les erreurs, et ignorer les param vides
439
-	if ($pointeur_champ->param !== false) {
440
-		if ($err_f) {
441
-			$pointeur_champ->param = false;
442
-		} elseif ($fonc !== '' || count($res) > 1) {
443
-			$pointeur_champ->param[] = $res;
444
-		}
445
-	}
446
-	// pour les balises avec faux filtres qui boudent ce dur larbeur
447
-	$pointeur_champ->fonctions[] = [$fonc, $source];
448
-
449
-	return $result;
318
+    preg_match(',^(\|?[^}{)|]*)(.*)$,ms', $texte, $match);
319
+    $suite = ltrim($match[2]);
320
+    $fonc = trim($match[1]);
321
+    if ($fonc && $fonc[0] == '|') {
322
+        $fonc = ltrim(substr($fonc, 1));
323
+    }
324
+    $res = [$fonc];
325
+    $err_f = '';
326
+    // cas du filtre sans argument ou du critere /
327
+    if (($suite && ($suite[0] != '{')) || ($fonc && $fonc[0] == '/')) {
328
+        // si pas d'argument, alors il faut une fonction ou un double |
329
+        if (!$match[1]) {
330
+            $err_f = ['zbug_erreur_filtre', ['filtre' => $texte]];
331
+            erreur_squelette($err_f, $pointeur_champ);
332
+            $texte = '';
333
+        } else {
334
+            $texte = $suite;
335
+        }
336
+        if ($err_f) {
337
+            $pointeur_champ->param = false;
338
+        } elseif ($fonc !== '') {
339
+            $pointeur_champ->param[] = $res;
340
+        }
341
+        // pour les balises avec faux filtres qui boudent ce dur larbeur
342
+        $pointeur_champ->fonctions[] = [$fonc, ''];
343
+
344
+        return $result;
345
+    }
346
+    $args = ltrim(substr($suite, 1)); // virer le '(' initial
347
+    $collecte = [];
348
+    while ($args && $args[0] != '}') {
349
+        if ($args[0] == '"') {
350
+            preg_match('/^(")([^"]*)(")(.*)$/ms', $args, $regs);
351
+        } elseif ($args[0] == "'") {
352
+            preg_match("/^(')([^']*)(')(.*)$/ms", $args, $regs);
353
+        } else {
354
+            preg_match('/^([[:space:]]*)([^,([{}]*([(\[{][^])}]*[])}])?[^,}]*)([,}].*)$/ms', $args, $regs);
355
+            if (!isset($regs[2]) or !strlen($regs[2])) {
356
+                $err_f = ['zbug_erreur_filtre', ['filtre' => $args]];
357
+                erreur_squelette($err_f, $pointeur_champ);
358
+                $champ = new Texte();
359
+                $champ->apres = $champ->avant = $args = '';
360
+                break;
361
+            }
362
+        }
363
+        $arg = $regs[2];
364
+        if (trim($regs[1])) {
365
+            $champ = new Texte();
366
+            $champ->texte = $arg;
367
+            $champ->apres = $champ->avant = $regs[1];
368
+            $result[] = $champ;
369
+            $collecte[] = $champ;
370
+            $args = ltrim($regs[count($regs) - 1]);
371
+        } else {
372
+            if (!preg_match('/' . NOM_DE_CHAMP . '([{|])/', $arg, $r)) {
373
+                // 0 est un aveu d'impuissance. A completer
374
+                $arg = phraser_champs_exterieurs($arg, 0, $sep, $result);
375
+
376
+                $args = ltrim($regs[count($regs) - 1]);
377
+                $collecte = array_merge($collecte, $arg);
378
+                $result = array_merge($result, $arg);
379
+            } else {
380
+                $n = strpos($args, $r[0]);
381
+                $pred = substr($args, 0, $n);
382
+                $par = ',}';
383
+                if (preg_match('/^(.*)\($/', $pred, $m)) {
384
+                    $pred = $m[1];
385
+                    $par = ')';
386
+                }
387
+                if ($pred) {
388
+                    $champ = new Texte();
389
+                    $champ->texte = $pred;
390
+                    $champ->apres = $champ->avant = '';
391
+                    $result[] = $champ;
392
+                    $collecte[] = $champ;
393
+                }
394
+                $rec = substr($args, $n + strlen($r[0]) - 1);
395
+                $champ = new Champ();
396
+                $champ->nom_boucle = $r[2];
397
+                $champ->nom_champ = $r[3];
398
+                $champ->etoile = $r[5];
399
+                $next = $r[6];
400
+                while ($next == '{') {
401
+                    phraser_arg($rec, $sep, [], $champ);
402
+                    $args = ltrim($rec);
403
+                    $next = isset($args[0]) ? $args[0] : '';
404
+                }
405
+                while ($next == '|') {
406
+                    $pos_apres = 0;
407
+                    phraser_args($rec, $par, $sep, [], $champ, $pos_apres);
408
+                    $args = substr($rec, $pos_apres);
409
+                    $next = isset($args[0]) ? $args[0] : '';
410
+                }
411
+                // Si erreur de syntaxe dans un sous-argument, propager.
412
+                if ($champ->param === false) {
413
+                    $err_f = true;
414
+                } else {
415
+                    phraser_vieux($champ);
416
+                }
417
+                if ($par == ')') {
418
+                    $args = substr($args, 1);
419
+                }
420
+                $collecte[] = $champ;
421
+                $result[] = $champ;
422
+            }
423
+        }
424
+        if (isset($args[0]) and $args[0] == ',') {
425
+            $args = ltrim(substr($args, 1));
426
+            if ($collecte) {
427
+                $res[] = $collecte;
428
+                $collecte = [];
429
+            }
430
+        }
431
+    }
432
+    if ($collecte) {
433
+        $res[] = $collecte;
434
+        $collecte = [];
435
+    }
436
+    $texte = substr($args, 1);
437
+    $source = substr($suite, 0, strlen($suite) - strlen($texte));
438
+    // propager les erreurs, et ignorer les param vides
439
+    if ($pointeur_champ->param !== false) {
440
+        if ($err_f) {
441
+            $pointeur_champ->param = false;
442
+        } elseif ($fonc !== '' || count($res) > 1) {
443
+            $pointeur_champ->param[] = $res;
444
+        }
445
+    }
446
+    // pour les balises avec faux filtres qui boudent ce dur larbeur
447
+    $pointeur_champ->fonctions[] = [$fonc, $source];
448
+
449
+    return $result;
450 450
 }
451 451
 
452 452
 
453 453
 // https://code.spip.net/@phraser_champs_exterieurs
454 454
 function phraser_champs_exterieurs($texte, $ligne, $sep, $nested) {
455
-	$res = [];
456
-	while (($p = strpos($texte, "%$sep")) !== false) {
457
-		if (!preg_match(',^%' . preg_quote($sep) . '([0-9]+)@,', substr($texte, $p), $m)) {
458
-			break;
459
-		}
460
-		$debut = substr($texte, 0, $p);
461
-		$texte = substr($texte, $p + strlen($m[0]));
462
-		if ($p) {
463
-			$res = phraser_inclure($debut, $ligne, $res);
464
-		}
465
-		$ligne += substr_count($debut, "\n");
466
-		$res[] = $nested[$m[1]];
467
-	}
468
-
469
-	return (($texte === '') ? $res : phraser_inclure($texte, $ligne, $res));
455
+    $res = [];
456
+    while (($p = strpos($texte, "%$sep")) !== false) {
457
+        if (!preg_match(',^%' . preg_quote($sep) . '([0-9]+)@,', substr($texte, $p), $m)) {
458
+            break;
459
+        }
460
+        $debut = substr($texte, 0, $p);
461
+        $texte = substr($texte, $p + strlen($m[0]));
462
+        if ($p) {
463
+            $res = phraser_inclure($debut, $ligne, $res);
464
+        }
465
+        $ligne += substr_count($debut, "\n");
466
+        $res[] = $nested[$m[1]];
467
+    }
468
+
469
+    return (($texte === '') ? $res : phraser_inclure($texte, $ligne, $res));
470 470
 }
471 471
 
472 472
 // https://code.spip.net/@phraser_champs_interieurs
473 473
 function phraser_champs_interieurs($texte, $ligne, $sep, $result) {
474
-	$i = 0; // en fait count($result)
475
-	$x = '';
476
-
477
-	while (true) {
478
-		$j = $i;
479
-		$n = $ligne;
480
-		while (preg_match(CHAMP_ETENDU, $texte, $match)) {
481
-			$p = strpos($texte, $match[0]);
482
-			$debut = substr($texte, 0, $p);
483
-			if ($p) {
484
-				$result[$i] = $debut;
485
-				$i++;
486
-			}
487
-			$nom = $match[4];
488
-			$champ = new Champ();
489
-			// ca ne marche pas encore en cas de champ imbrique
490
-			$champ->ligne = $x ? 0 : ($n + substr_count($debut, "\n"));
491
-			$champ->nom_boucle = $match[3];
492
-			$champ->nom_champ = $nom;
493
-			$champ->etoile = $match[6];
494
-			// phraser_args indiquera ou commence apres
495
-			$pos_apres = 0;
496
-			$result = phraser_args($match[7], ')', $sep, $result, $champ, $pos_apres);
497
-			phraser_vieux($champ);
498
-			$champ->avant =	phraser_champs_exterieurs($match[1], $n, $sep, $result);
499
-			$debut = substr($match[7], $pos_apres + 1);
500
-			if (!empty($debut)) {
501
-				$n += substr_count(substr($texte, 0, strpos($texte, $debut)), "\n");
502
-			}
503
-			$champ->apres = phraser_champs_exterieurs($debut, $n, $sep, $result);
504
-
505
-			// reinjecter la boucle si c'en est une
506
-			phraser_boucle_placeholder($champ);
507
-
508
-			$result[$i] = $champ;
509
-			$i++;
510
-			$texte = substr($texte, $p + strlen($match[0]));
511
-		}
512
-		if ($texte !== '') {
513
-			$result[$i] = $texte;
514
-			$i++;
515
-		}
516
-		$x = '';
517
-
518
-		while ($j < $i) {
519
-			$z = $result[$j];
520
-			// j'aurais besoin de connaitre le nombre de lignes...
521
-			if (is_object($z)) {
522
-				$x .= "%$sep$j@";
523
-			} else {
524
-				$x .= $z;
525
-			}
526
-			$j++;
527
-		}
528
-		if (preg_match(CHAMP_ETENDU, $x)) {
529
-			$texte = $x;
530
-		} else {
531
-			return phraser_champs_exterieurs($x, $ligne, $sep, $result);
532
-		}
533
-	}
474
+    $i = 0; // en fait count($result)
475
+    $x = '';
476
+
477
+    while (true) {
478
+        $j = $i;
479
+        $n = $ligne;
480
+        while (preg_match(CHAMP_ETENDU, $texte, $match)) {
481
+            $p = strpos($texte, $match[0]);
482
+            $debut = substr($texte, 0, $p);
483
+            if ($p) {
484
+                $result[$i] = $debut;
485
+                $i++;
486
+            }
487
+            $nom = $match[4];
488
+            $champ = new Champ();
489
+            // ca ne marche pas encore en cas de champ imbrique
490
+            $champ->ligne = $x ? 0 : ($n + substr_count($debut, "\n"));
491
+            $champ->nom_boucle = $match[3];
492
+            $champ->nom_champ = $nom;
493
+            $champ->etoile = $match[6];
494
+            // phraser_args indiquera ou commence apres
495
+            $pos_apres = 0;
496
+            $result = phraser_args($match[7], ')', $sep, $result, $champ, $pos_apres);
497
+            phraser_vieux($champ);
498
+            $champ->avant =	phraser_champs_exterieurs($match[1], $n, $sep, $result);
499
+            $debut = substr($match[7], $pos_apres + 1);
500
+            if (!empty($debut)) {
501
+                $n += substr_count(substr($texte, 0, strpos($texte, $debut)), "\n");
502
+            }
503
+            $champ->apres = phraser_champs_exterieurs($debut, $n, $sep, $result);
504
+
505
+            // reinjecter la boucle si c'en est une
506
+            phraser_boucle_placeholder($champ);
507
+
508
+            $result[$i] = $champ;
509
+            $i++;
510
+            $texte = substr($texte, $p + strlen($match[0]));
511
+        }
512
+        if ($texte !== '') {
513
+            $result[$i] = $texte;
514
+            $i++;
515
+        }
516
+        $x = '';
517
+
518
+        while ($j < $i) {
519
+            $z = $result[$j];
520
+            // j'aurais besoin de connaitre le nombre de lignes...
521
+            if (is_object($z)) {
522
+                $x .= "%$sep$j@";
523
+            } else {
524
+                $x .= $z;
525
+            }
526
+            $j++;
527
+        }
528
+        if (preg_match(CHAMP_ETENDU, $x)) {
529
+            $texte = $x;
530
+        } else {
531
+            return phraser_champs_exterieurs($x, $ligne, $sep, $result);
532
+        }
533
+    }
534 534
 }
535 535
 
536 536
 function phraser_vieux(&$champ) {
537
-	$nom = $champ->nom_champ;
538
-	if ($nom == 'EMBED_DOCUMENT') {
539
-		if (!function_exists('phraser_vieux_emb')) {
540
-			include_spip('public/normaliser');
541
-		}
542
-		phraser_vieux_emb($champ);
543
-	} elseif ($nom == 'EXPOSER') {
544
-		if (!function_exists('phraser_vieux_exposer')) {
545
-			include_spip('public/normaliser');
546
-		}
547
-		phraser_vieux_exposer($champ);
548
-	} elseif ($champ->param) {
549
-		if ($nom == 'FORMULAIRE_RECHERCHE') {
550
-			if (!function_exists('phraser_vieux_recherche')) {
551
-				include_spip('public/normaliser');
552
-			}
553
-			phraser_vieux_recherche($champ);
554
-		} elseif (preg_match(',^LOGO_[A-Z]+,', $nom)) {
555
-			if (!function_exists('phraser_vieux_logos')) {
556
-				include_spip('public/normaliser');
557
-			}
558
-			phraser_vieux_logos($champ);
559
-		} elseif ($nom == 'MODELE') {
560
-			if (!function_exists('phraser_vieux_modele')) {
561
-				include_spip('public/normaliser');
562
-			}
563
-			phraser_vieux_modele($champ);
564
-		} elseif ($nom == 'INCLURE' or $nom == 'INCLUDE') {
565
-			if (!function_exists('phraser_vieux_inclu')) {
566
-				include_spip('public/normaliser');
567
-			}
568
-			phraser_vieux_inclu($champ);
569
-		}
570
-	}
537
+    $nom = $champ->nom_champ;
538
+    if ($nom == 'EMBED_DOCUMENT') {
539
+        if (!function_exists('phraser_vieux_emb')) {
540
+            include_spip('public/normaliser');
541
+        }
542
+        phraser_vieux_emb($champ);
543
+    } elseif ($nom == 'EXPOSER') {
544
+        if (!function_exists('phraser_vieux_exposer')) {
545
+            include_spip('public/normaliser');
546
+        }
547
+        phraser_vieux_exposer($champ);
548
+    } elseif ($champ->param) {
549
+        if ($nom == 'FORMULAIRE_RECHERCHE') {
550
+            if (!function_exists('phraser_vieux_recherche')) {
551
+                include_spip('public/normaliser');
552
+            }
553
+            phraser_vieux_recherche($champ);
554
+        } elseif (preg_match(',^LOGO_[A-Z]+,', $nom)) {
555
+            if (!function_exists('phraser_vieux_logos')) {
556
+                include_spip('public/normaliser');
557
+            }
558
+            phraser_vieux_logos($champ);
559
+        } elseif ($nom == 'MODELE') {
560
+            if (!function_exists('phraser_vieux_modele')) {
561
+                include_spip('public/normaliser');
562
+            }
563
+            phraser_vieux_modele($champ);
564
+        } elseif ($nom == 'INCLURE' or $nom == 'INCLUDE') {
565
+            if (!function_exists('phraser_vieux_inclu')) {
566
+                include_spip('public/normaliser');
567
+            }
568
+            phraser_vieux_inclu($champ);
569
+        }
570
+    }
571 571
 }
572 572
 
573 573
 
@@ -595,201 +595,201 @@  discard block
 block discarded – undo
595 595
  **/
596 596
 function phraser_criteres($params, &$result) {
597 597
 
598
-	$err_ci = ''; // indiquera s'il y a eu une erreur
599
-	$args = [];
600
-	$type = $result->type_requete;
601
-	$doublons = [];
602
-	foreach ($params as $v) {
603
-		$var = $v[1][0];
604
-		$param = ($var->type != 'texte') ? '' : $var->texte;
605
-		if ((count($v) > 2) && (!preg_match(',[^A-Za-z]IN[^A-Za-z],i', $param))) {
606
-			// plus d'un argument et pas le critere IN:
607
-			// detecter comme on peut si c'est le critere implicite LIMIT debut, fin
608
-			if (
609
-				$var->type != 'texte'
610
-				or preg_match('/^(n|n-|(n-)?\d+)$/S', $param)
611
-			) {
612
-				$op = ',';
613
-				$not = '';
614
-				$cond = false;
615
-			} else {
616
-				// Le debut du premier argument est l'operateur
617
-				preg_match('/^([!]?)([a-zA-Z][a-zA-Z0-9_]*)[[:space:]]*(\??)[[:space:]]*(.*)$/ms', $param, $m);
618
-				$op = $m[2];
619
-				$not = $m[1];
620
-				$cond = $m[3];
621
-				// virer le premier argument,
622
-				// et mettre son reliquat eventuel
623
-				// Recopier pour ne pas alterer le texte source
624
-				// utile au debusqueur
625
-				if ($m[4]) {
626
-					// une maniere tres sale de supprimer les "' autour de {critere "xxx","yyy"}
627
-					if (preg_match(',^(["\'])(.*)\1$,', $m[4])) {
628
-						$c = null;
629
-						eval('$c = ' . $m[4] . ';');
630
-						if (isset($c)) {
631
-							$m[4] = $c;
632
-						}
633
-					}
634
-					$texte = new Texte();
635
-					$texte->texte = $m[4];
636
-					$v[1][0] = $texte;
637
-				} else {
638
-					array_shift($v[1]);
639
-				}
640
-			}
641
-			array_shift($v); // $v[O] est vide
642
-			$crit = new Critere();
643
-			$crit->op = $op;
644
-			$crit->not = $not;
645
-			$crit->cond = $cond;
646
-			$crit->exclus = '';
647
-			$crit->param = $v;
648
-			$args[] = $crit;
649
-		} else {
650
-			if ($var->type != 'texte') {
651
-				// cas 1 seul arg ne commencant pas par du texte brut:
652
-				// erreur ou critere infixe "/"
653
-				if (($v[1][1]->type != 'texte') || (trim($v[1][1]->texte) != '/')) {
654
-					$err_ci = [
655
-						'zbug_critere_inconnu',
656
-						['critere' => $var->nom_champ]
657
-					];
658
-					erreur_squelette($err_ci, $result);
659
-				} else {
660
-					$crit = new Critere();
661
-					$crit->op = '/';
662
-					$crit->not = '';
663
-					$crit->exclus = '';
664
-					$crit->param = [[$v[1][0]], [$v[1][2]]];
665
-					$args[] = $crit;
666
-				}
667
-			} else {
668
-				// traiter qq lexemes particuliers pour faciliter la suite
669
-				// les separateurs
670
-				if ($var->apres) {
671
-					$result->separateur[] = $param;
672
-				} elseif (($param == 'tout') or ($param == 'tous')) {
673
-					$result->modificateur['tout'] = true;
674
-				} elseif ($param == 'plat') {
675
-					$result->modificateur['plat'] = true;
676
-				}
677
-
678
-				// Boucle hierarchie, analyser le critere id_rubrique
679
-				// et les autres critères {id_x} pour forcer {tout} sur
680
-				// ceux-ci pour avoir la rubrique mere...
681
-				// Les autres critères de la boucle hierarchie doivent être
682
-				// traités normalement.
683
-				elseif (
684
-					strcasecmp($type, 'hierarchie') == 0
685
-					and !preg_match(",^id_rubrique\b,", $param)
686
-					and preg_match(',^id_\w+\s*$,', $param)
687
-				) {
688
-					$result->modificateur['tout'] = true;
689
-				} elseif (strcasecmp($type, 'hierarchie') == 0 and $param == 'id_rubrique') {
690
-					// rien a faire sur {id_rubrique} tout seul
691
-				} else {
692
-					// pas d'emplacement statique, faut un dynamique
693
-					// mais il y a 2 cas qui ont les 2 !
694
-					if (($param == 'unique') || (preg_match(',^!?doublons *,', $param))) {
695
-						// cette variable sera inseree dans le code
696
-						// et son nom sert d'indicateur des maintenant
697
-						$result->doublons = '$doublons_index';
698
-						if ($param == 'unique') {
699
-							$param = 'doublons';
700
-						}
701
-					} elseif ($param == 'recherche') {
702
-						// meme chose (a cause de #nom_de_boucle:URL_*)
703
-						$result->hash = ' ';
704
-					}
705
-
706
-					if (preg_match(',^ *([0-9-]+) *(/) *(.+) *$,', $param, $m)) {
707
-						$crit = phraser_critere_infixe($m[1], $m[3], $v, '/', '', '');
708
-					} elseif (
709
-						preg_match(',^([!]?)(' . CHAMP_SQL_PLUS_FONC .
710
-						')[[:space:]]*(\??)(!?)(<=?|>=?|==?|\b(?:IN|LIKE)\b)(.*)$,is', $param, $m)
711
-					) {
712
-						$a2 = trim($m[8]);
713
-						if ($a2 and ($a2[0] == "'" or $a2[0] == '"') and ($a2[0] == substr($a2, -1))) {
714
-							$a2 = substr($a2, 1, -1);
715
-						}
716
-						$crit = phraser_critere_infixe(
717
-							$m[2],
718
-							$a2,
719
-							$v,
720
-							(($m[2] == 'lang_select') ? $m[2] : $m[7]),
721
-							$m[6],
722
-							$m[5]
723
-						);
724
-						$crit->exclus = $m[1];
725
-					} elseif (
726
-						preg_match('/^([!]?)\s*(' .
727
-						CHAMP_SQL_PLUS_FONC .
728
-						')\s*(\??)(.*)$/is', $param, $m)
729
-					) {
730
-						// contient aussi les comparaisons implicites !
731
-						// Comme ci-dessus:
732
-						// le premier arg contient l'operateur
733
-						array_shift($v);
734
-						if ($m[6]) {
735
-							$v[0][0] = new Texte();
736
-							$v[0][0]->texte = $m[6];
737
-						} else {
738
-							array_shift($v[0]);
739
-							if (!$v[0]) {
740
-								array_shift($v);
741
-							}
742
-						}
743
-						$crit = new Critere();
744
-						$crit->op = $m[2];
745
-						$crit->param = $v;
746
-						$crit->not = $m[1];
747
-						$crit->cond = $m[5];
748
-					} else {
749
-						$err_ci = [
750
-							'zbug_critere_inconnu',
751
-							['critere' => $param]
752
-						];
753
-						erreur_squelette($err_ci, $result);
754
-					}
755
-
756
-					if ((!preg_match(',^!?doublons *,', $param)) || $crit->not) {
757
-						$args[] = $crit;
758
-					} else {
759
-						$doublons[] = $crit;
760
-					}
761
-				}
762
-			}
763
-		}
764
-	}
765
-
766
-	// les doublons non nies doivent etre le dernier critere
767
-	// pour que la variable $doublon_index ait la bonne valeur
768
-	// cf critere_doublon
769
-	if ($doublons) {
770
-		$args = array_merge($args, $doublons);
771
-	}
772
-
773
-	// Si erreur, laisser la chaine dans ce champ pour le HTTP 503
774
-	if (!$err_ci) {
775
-		$result->criteres = $args;
776
-	}
598
+    $err_ci = ''; // indiquera s'il y a eu une erreur
599
+    $args = [];
600
+    $type = $result->type_requete;
601
+    $doublons = [];
602
+    foreach ($params as $v) {
603
+        $var = $v[1][0];
604
+        $param = ($var->type != 'texte') ? '' : $var->texte;
605
+        if ((count($v) > 2) && (!preg_match(',[^A-Za-z]IN[^A-Za-z],i', $param))) {
606
+            // plus d'un argument et pas le critere IN:
607
+            // detecter comme on peut si c'est le critere implicite LIMIT debut, fin
608
+            if (
609
+                $var->type != 'texte'
610
+                or preg_match('/^(n|n-|(n-)?\d+)$/S', $param)
611
+            ) {
612
+                $op = ',';
613
+                $not = '';
614
+                $cond = false;
615
+            } else {
616
+                // Le debut du premier argument est l'operateur
617
+                preg_match('/^([!]?)([a-zA-Z][a-zA-Z0-9_]*)[[:space:]]*(\??)[[:space:]]*(.*)$/ms', $param, $m);
618
+                $op = $m[2];
619
+                $not = $m[1];
620
+                $cond = $m[3];
621
+                // virer le premier argument,
622
+                // et mettre son reliquat eventuel
623
+                // Recopier pour ne pas alterer le texte source
624
+                // utile au debusqueur
625
+                if ($m[4]) {
626
+                    // une maniere tres sale de supprimer les "' autour de {critere "xxx","yyy"}
627
+                    if (preg_match(',^(["\'])(.*)\1$,', $m[4])) {
628
+                        $c = null;
629
+                        eval('$c = ' . $m[4] . ';');
630
+                        if (isset($c)) {
631
+                            $m[4] = $c;
632
+                        }
633
+                    }
634
+                    $texte = new Texte();
635
+                    $texte->texte = $m[4];
636
+                    $v[1][0] = $texte;
637
+                } else {
638
+                    array_shift($v[1]);
639
+                }
640
+            }
641
+            array_shift($v); // $v[O] est vide
642
+            $crit = new Critere();
643
+            $crit->op = $op;
644
+            $crit->not = $not;
645
+            $crit->cond = $cond;
646
+            $crit->exclus = '';
647
+            $crit->param = $v;
648
+            $args[] = $crit;
649
+        } else {
650
+            if ($var->type != 'texte') {
651
+                // cas 1 seul arg ne commencant pas par du texte brut:
652
+                // erreur ou critere infixe "/"
653
+                if (($v[1][1]->type != 'texte') || (trim($v[1][1]->texte) != '/')) {
654
+                    $err_ci = [
655
+                        'zbug_critere_inconnu',
656
+                        ['critere' => $var->nom_champ]
657
+                    ];
658
+                    erreur_squelette($err_ci, $result);
659
+                } else {
660
+                    $crit = new Critere();
661
+                    $crit->op = '/';
662
+                    $crit->not = '';
663
+                    $crit->exclus = '';
664
+                    $crit->param = [[$v[1][0]], [$v[1][2]]];
665
+                    $args[] = $crit;
666
+                }
667
+            } else {
668
+                // traiter qq lexemes particuliers pour faciliter la suite
669
+                // les separateurs
670
+                if ($var->apres) {
671
+                    $result->separateur[] = $param;
672
+                } elseif (($param == 'tout') or ($param == 'tous')) {
673
+                    $result->modificateur['tout'] = true;
674
+                } elseif ($param == 'plat') {
675
+                    $result->modificateur['plat'] = true;
676
+                }
677
+
678
+                // Boucle hierarchie, analyser le critere id_rubrique
679
+                // et les autres critères {id_x} pour forcer {tout} sur
680
+                // ceux-ci pour avoir la rubrique mere...
681
+                // Les autres critères de la boucle hierarchie doivent être
682
+                // traités normalement.
683
+                elseif (
684
+                    strcasecmp($type, 'hierarchie') == 0
685
+                    and !preg_match(",^id_rubrique\b,", $param)
686
+                    and preg_match(',^id_\w+\s*$,', $param)
687
+                ) {
688
+                    $result->modificateur['tout'] = true;
689
+                } elseif (strcasecmp($type, 'hierarchie') == 0 and $param == 'id_rubrique') {
690
+                    // rien a faire sur {id_rubrique} tout seul
691
+                } else {
692
+                    // pas d'emplacement statique, faut un dynamique
693
+                    // mais il y a 2 cas qui ont les 2 !
694
+                    if (($param == 'unique') || (preg_match(',^!?doublons *,', $param))) {
695
+                        // cette variable sera inseree dans le code
696
+                        // et son nom sert d'indicateur des maintenant
697
+                        $result->doublons = '$doublons_index';
698
+                        if ($param == 'unique') {
699
+                            $param = 'doublons';
700
+                        }
701
+                    } elseif ($param == 'recherche') {
702
+                        // meme chose (a cause de #nom_de_boucle:URL_*)
703
+                        $result->hash = ' ';
704
+                    }
705
+
706
+                    if (preg_match(',^ *([0-9-]+) *(/) *(.+) *$,', $param, $m)) {
707
+                        $crit = phraser_critere_infixe($m[1], $m[3], $v, '/', '', '');
708
+                    } elseif (
709
+                        preg_match(',^([!]?)(' . CHAMP_SQL_PLUS_FONC .
710
+                        ')[[:space:]]*(\??)(!?)(<=?|>=?|==?|\b(?:IN|LIKE)\b)(.*)$,is', $param, $m)
711
+                    ) {
712
+                        $a2 = trim($m[8]);
713
+                        if ($a2 and ($a2[0] == "'" or $a2[0] == '"') and ($a2[0] == substr($a2, -1))) {
714
+                            $a2 = substr($a2, 1, -1);
715
+                        }
716
+                        $crit = phraser_critere_infixe(
717
+                            $m[2],
718
+                            $a2,
719
+                            $v,
720
+                            (($m[2] == 'lang_select') ? $m[2] : $m[7]),
721
+                            $m[6],
722
+                            $m[5]
723
+                        );
724
+                        $crit->exclus = $m[1];
725
+                    } elseif (
726
+                        preg_match('/^([!]?)\s*(' .
727
+                        CHAMP_SQL_PLUS_FONC .
728
+                        ')\s*(\??)(.*)$/is', $param, $m)
729
+                    ) {
730
+                        // contient aussi les comparaisons implicites !
731
+                        // Comme ci-dessus:
732
+                        // le premier arg contient l'operateur
733
+                        array_shift($v);
734
+                        if ($m[6]) {
735
+                            $v[0][0] = new Texte();
736
+                            $v[0][0]->texte = $m[6];
737
+                        } else {
738
+                            array_shift($v[0]);
739
+                            if (!$v[0]) {
740
+                                array_shift($v);
741
+                            }
742
+                        }
743
+                        $crit = new Critere();
744
+                        $crit->op = $m[2];
745
+                        $crit->param = $v;
746
+                        $crit->not = $m[1];
747
+                        $crit->cond = $m[5];
748
+                    } else {
749
+                        $err_ci = [
750
+                            'zbug_critere_inconnu',
751
+                            ['critere' => $param]
752
+                        ];
753
+                        erreur_squelette($err_ci, $result);
754
+                    }
755
+
756
+                    if ((!preg_match(',^!?doublons *,', $param)) || $crit->not) {
757
+                        $args[] = $crit;
758
+                    } else {
759
+                        $doublons[] = $crit;
760
+                    }
761
+                }
762
+            }
763
+        }
764
+    }
765
+
766
+    // les doublons non nies doivent etre le dernier critere
767
+    // pour que la variable $doublon_index ait la bonne valeur
768
+    // cf critere_doublon
769
+    if ($doublons) {
770
+        $args = array_merge($args, $doublons);
771
+    }
772
+
773
+    // Si erreur, laisser la chaine dans ce champ pour le HTTP 503
774
+    if (!$err_ci) {
775
+        $result->criteres = $args;
776
+    }
777 777
 }
778 778
 
779 779
 // https://code.spip.net/@phraser_critere_infixe
780 780
 function phraser_critere_infixe($arg1, $arg2, $args, $op, $not, $cond) {
781
-	$args[0] = new Texte();
782
-	$args[0]->texte = $arg1;
783
-	$args[0] = [$args[0]];
784
-	$args[1][0] = new Texte();
785
-	$args[1][0]->texte = $arg2;
786
-	$crit = new Critere();
787
-	$crit->op = $op;
788
-	$crit->not = $not;
789
-	$crit->cond = $cond;
790
-	$crit->param = $args;
791
-
792
-	return $crit;
781
+    $args[0] = new Texte();
782
+    $args[0]->texte = $arg1;
783
+    $args[0] = [$args[0]];
784
+    $args[1][0] = new Texte();
785
+    $args[1][0]->texte = $arg2;
786
+    $crit = new Critere();
787
+    $crit->op = $op;
788
+    $crit->not = $not;
789
+    $crit->cond = $cond;
790
+    $crit->param = $args;
791
+
792
+    return $crit;
793 793
 }
794 794
 
795 795
 /**
@@ -800,12 +800,12 @@  discard block
 block discarded – undo
800 800
  * @return int
801 801
  */
802 802
 function public_compte_ligne($texte, $debut = 0, $fin = null) {
803
-	if (is_null($fin)) {
804
-		return substr_count($texte, "\n", $debut);
805
-	}
806
-	else {
807
-		return substr_count($texte, "\n", $debut, $fin - $debut);
808
-	}
803
+    if (is_null($fin)) {
804
+        return substr_count($texte, "\n", $debut);
805
+    }
806
+    else {
807
+        return substr_count($texte, "\n", $debut, $fin - $debut);
808
+    }
809 809
 }
810 810
 
811 811
 
@@ -821,87 +821,87 @@  discard block
 block discarded – undo
821 821
  * @return array|null
822 822
  */
823 823
 function public_trouver_premiere_boucle($texte, $id_parent, $descr, $pos_debut_texte = 0) {
824
-	$premiere_boucle = null;
825
-	$pos_derniere_boucle_anonyme = $pos_debut_texte;
826
-
827
-	$current_pos = $pos_debut_texte;
828
-	while (($pos_boucle = strpos($texte, BALISE_BOUCLE, $current_pos)) !== false) {
829
-		$current_pos = $pos_boucle + 1;
830
-		$pos_parent = strpos($texte, '(', $pos_boucle);
831
-
832
-		$id_boucle = '';
833
-		if ($pos_parent !== false) {
834
-			$id_boucle = trim(substr($texte, $pos_boucle + strlen(BALISE_BOUCLE), $pos_parent - $pos_boucle - strlen(BALISE_BOUCLE)));
835
-		}
836
-		if (
837
-			$pos_parent === false
838
-			or (strlen($id_boucle) and !(is_numeric($id_boucle) or strpos($id_boucle, '_') === 0))
839
-		) {
840
-			$result = new Boucle();
841
-			$result->id_parent = $id_parent;
842
-			$result->descr = $descr;
843
-
844
-			// un id_boucle pour l'affichage de l'erreur
845
-			if (!strlen($id_boucle)) {
846
-				$id_boucle = substr($texte, $pos_boucle + strlen(BALISE_BOUCLE), 15);
847
-			}
848
-			$result->id_boucle = $id_boucle;
849
-			$err_b = ['zbug_erreur_boucle_syntaxe', ['id' => $id_boucle]];
850
-			erreur_squelette($err_b, $result);
851
-
852
-			continue;
853
-		}
854
-		else {
855
-			$boucle = [
856
-				'id_boucle' => $id_boucle,
857
-				'id_boucle_err' => $id_boucle,
858
-				'debut_boucle' => $pos_boucle,
859
-				'pos_boucle' => $pos_boucle,
860
-				'pos_parent' => $pos_parent,
861
-				'pos_precond' => false,
862
-				'pos_precond_inside' => false,
863
-				'pos_preaff' => false,
864
-				'pos_preaff_inside' => false,
865
-			];
866
-
867
-			// un id_boucle pour l'affichage de l'erreur sur les boucle anonymes
868
-			if (!strlen($id_boucle)) {
869
-				$boucle['id_boucle_err'] = substr($texte, $pos_boucle + strlen(BALISE_BOUCLE), 15);
870
-			}
871
-
872
-			// trouver sa position de depart reelle : au <Bxx> ou au <BBxx>
873
-			$precond_boucle = BALISE_PRECOND_BOUCLE . $id_boucle . '>';
874
-			$pos_precond = strpos($texte, $precond_boucle, $id_boucle ? $pos_debut_texte : $pos_derniere_boucle_anonyme);
875
-			if (
876
-				$pos_precond !== false
877
-				and $pos_precond < $boucle['debut_boucle']
878
-			) {
879
-				$boucle['debut_boucle'] = $pos_precond;
880
-				$boucle['pos_precond'] = $pos_precond;
881
-				$boucle['pos_precond_inside'] = $pos_precond + strlen($precond_boucle);
882
-			}
883
-
884
-			$preaff_boucle = BALISE_PREAFF_BOUCLE . $id_boucle . '>';
885
-			$pos_preaff = strpos($texte, $preaff_boucle, $id_boucle ? $pos_debut_texte : $pos_derniere_boucle_anonyme);
886
-			if (
887
-				$pos_preaff !== false
888
-				and $pos_preaff < $boucle['debut_boucle']
889
-			) {
890
-				$boucle['debut_boucle'] = $pos_preaff;
891
-				$boucle['pos_preaff'] = $pos_preaff;
892
-				$boucle['pos_preaff_inside'] = $pos_preaff + strlen($preaff_boucle);
893
-			}
894
-			if (!strlen($id_boucle)) {
895
-				$pos_derniere_boucle_anonyme = $pos_boucle;
896
-			}
897
-
898
-			if (is_null($premiere_boucle) or $premiere_boucle['debut_boucle'] > $boucle['debut_boucle']) {
899
-				$premiere_boucle = $boucle;
900
-			}
901
-		}
902
-	}
903
-
904
-	return $premiere_boucle;
824
+    $premiere_boucle = null;
825
+    $pos_derniere_boucle_anonyme = $pos_debut_texte;
826
+
827
+    $current_pos = $pos_debut_texte;
828
+    while (($pos_boucle = strpos($texte, BALISE_BOUCLE, $current_pos)) !== false) {
829
+        $current_pos = $pos_boucle + 1;
830
+        $pos_parent = strpos($texte, '(', $pos_boucle);
831
+
832
+        $id_boucle = '';
833
+        if ($pos_parent !== false) {
834
+            $id_boucle = trim(substr($texte, $pos_boucle + strlen(BALISE_BOUCLE), $pos_parent - $pos_boucle - strlen(BALISE_BOUCLE)));
835
+        }
836
+        if (
837
+            $pos_parent === false
838
+            or (strlen($id_boucle) and !(is_numeric($id_boucle) or strpos($id_boucle, '_') === 0))
839
+        ) {
840
+            $result = new Boucle();
841
+            $result->id_parent = $id_parent;
842
+            $result->descr = $descr;
843
+
844
+            // un id_boucle pour l'affichage de l'erreur
845
+            if (!strlen($id_boucle)) {
846
+                $id_boucle = substr($texte, $pos_boucle + strlen(BALISE_BOUCLE), 15);
847
+            }
848
+            $result->id_boucle = $id_boucle;
849
+            $err_b = ['zbug_erreur_boucle_syntaxe', ['id' => $id_boucle]];
850
+            erreur_squelette($err_b, $result);
851
+
852
+            continue;
853
+        }
854
+        else {
855
+            $boucle = [
856
+                'id_boucle' => $id_boucle,
857
+                'id_boucle_err' => $id_boucle,
858
+                'debut_boucle' => $pos_boucle,
859
+                'pos_boucle' => $pos_boucle,
860
+                'pos_parent' => $pos_parent,
861
+                'pos_precond' => false,
862
+                'pos_precond_inside' => false,
863
+                'pos_preaff' => false,
864
+                'pos_preaff_inside' => false,
865
+            ];
866
+
867
+            // un id_boucle pour l'affichage de l'erreur sur les boucle anonymes
868
+            if (!strlen($id_boucle)) {
869
+                $boucle['id_boucle_err'] = substr($texte, $pos_boucle + strlen(BALISE_BOUCLE), 15);
870
+            }
871
+
872
+            // trouver sa position de depart reelle : au <Bxx> ou au <BBxx>
873
+            $precond_boucle = BALISE_PRECOND_BOUCLE . $id_boucle . '>';
874
+            $pos_precond = strpos($texte, $precond_boucle, $id_boucle ? $pos_debut_texte : $pos_derniere_boucle_anonyme);
875
+            if (
876
+                $pos_precond !== false
877
+                and $pos_precond < $boucle['debut_boucle']
878
+            ) {
879
+                $boucle['debut_boucle'] = $pos_precond;
880
+                $boucle['pos_precond'] = $pos_precond;
881
+                $boucle['pos_precond_inside'] = $pos_precond + strlen($precond_boucle);
882
+            }
883
+
884
+            $preaff_boucle = BALISE_PREAFF_BOUCLE . $id_boucle . '>';
885
+            $pos_preaff = strpos($texte, $preaff_boucle, $id_boucle ? $pos_debut_texte : $pos_derniere_boucle_anonyme);
886
+            if (
887
+                $pos_preaff !== false
888
+                and $pos_preaff < $boucle['debut_boucle']
889
+            ) {
890
+                $boucle['debut_boucle'] = $pos_preaff;
891
+                $boucle['pos_preaff'] = $pos_preaff;
892
+                $boucle['pos_preaff_inside'] = $pos_preaff + strlen($preaff_boucle);
893
+            }
894
+            if (!strlen($id_boucle)) {
895
+                $pos_derniere_boucle_anonyme = $pos_boucle;
896
+            }
897
+
898
+            if (is_null($premiere_boucle) or $premiere_boucle['debut_boucle'] > $boucle['debut_boucle']) {
899
+                $premiere_boucle = $boucle;
900
+            }
901
+        }
902
+    }
903
+
904
+    return $premiere_boucle;
905 905
 }
906 906
 
907 907
 /**
@@ -916,68 +916,68 @@  discard block
 block discarded – undo
916 916
  * @return mixed
917 917
  */
918 918
 function public_trouver_fin_boucle($texte, $id_parent, $boucle, $pos_debut_texte, $result) {
919
-	$id_boucle = $boucle['id_boucle'];
920
-	$pos_courante = $pos_debut_texte;
921
-
922
-	$boucle['pos_postcond'] = false;
923
-	$boucle['pos_postcond_inside'] = false;
924
-	$boucle['pos_altern'] = false;
925
-	$boucle['pos_altern_inside'] = false;
926
-	$boucle['pos_postaff'] = false;
927
-	$boucle['pos_postaff_inside'] = false;
928
-
929
-	$pos_anonyme_next = null;
930
-	// si c'est une boucle anonyme, chercher la position de la prochaine boucle anonyme
931
-	if (!strlen($id_boucle)) {
932
-		$pos_anonyme_next = strpos($texte, BALISE_BOUCLE . '(', $pos_courante);
933
-	}
934
-
935
-	//
936
-	// 1. Recuperer la partie conditionnelle apres
937
-	//
938
-	$apres_boucle = BALISE_POSTCOND_BOUCLE . $id_boucle . '>';
939
-	$pos_apres = strpos($texte, $apres_boucle, $pos_courante);
940
-	if (
941
-		$pos_apres !== false
942
-		and (!$pos_anonyme_next or $pos_apres < $pos_anonyme_next)
943
-	) {
944
-		$boucle['pos_postcond'] = $pos_apres;
945
-		$pos_apres += strlen($apres_boucle);
946
-		$boucle['pos_postcond_inside'] = $pos_apres;
947
-		$pos_courante = $pos_apres ;
948
-	}
949
-
950
-	//
951
-	// 2. Récuperer la partie alternative apres
952
-	//
953
-	$altern_boucle = BALISE_ALT_BOUCLE . $id_boucle . '>';
954
-	$pos_altern = strpos($texte, $altern_boucle, $pos_courante);
955
-	if (
956
-		$pos_altern !== false
957
-		and (!$pos_anonyme_next or $pos_altern < $pos_anonyme_next)
958
-	) {
959
-		$boucle['pos_altern'] = $pos_altern;
960
-		$pos_altern += strlen($altern_boucle);
961
-		$boucle['pos_altern_inside'] = $pos_altern;
962
-		$pos_courante = $pos_altern;
963
-	}
964
-
965
-	//
966
-	// 3. Recuperer la partie footer non alternative
967
-	//
968
-	$postaff_boucle = BALISE_POSTAFF_BOUCLE . $id_boucle . '>';
969
-	$pos_postaff = strpos($texte, $postaff_boucle, $pos_courante);
970
-	if (
971
-		$pos_postaff !== false
972
-		and (!$pos_anonyme_next or $pos_postaff < $pos_anonyme_next)
973
-	) {
974
-		$boucle['pos_postaff'] = $pos_postaff;
975
-		$pos_postaff += strlen($postaff_boucle);
976
-		$boucle['pos_postaff_inside'] = $pos_postaff;
977
-		$pos_courante = $pos_postaff ;
978
-	}
979
-
980
-	return $boucle;
919
+    $id_boucle = $boucle['id_boucle'];
920
+    $pos_courante = $pos_debut_texte;
921
+
922
+    $boucle['pos_postcond'] = false;
923
+    $boucle['pos_postcond_inside'] = false;
924
+    $boucle['pos_altern'] = false;
925
+    $boucle['pos_altern_inside'] = false;
926
+    $boucle['pos_postaff'] = false;
927
+    $boucle['pos_postaff_inside'] = false;
928
+
929
+    $pos_anonyme_next = null;
930
+    // si c'est une boucle anonyme, chercher la position de la prochaine boucle anonyme
931
+    if (!strlen($id_boucle)) {
932
+        $pos_anonyme_next = strpos($texte, BALISE_BOUCLE . '(', $pos_courante);
933
+    }
934
+
935
+    //
936
+    // 1. Recuperer la partie conditionnelle apres
937
+    //
938
+    $apres_boucle = BALISE_POSTCOND_BOUCLE . $id_boucle . '>';
939
+    $pos_apres = strpos($texte, $apres_boucle, $pos_courante);
940
+    if (
941
+        $pos_apres !== false
942
+        and (!$pos_anonyme_next or $pos_apres < $pos_anonyme_next)
943
+    ) {
944
+        $boucle['pos_postcond'] = $pos_apres;
945
+        $pos_apres += strlen($apres_boucle);
946
+        $boucle['pos_postcond_inside'] = $pos_apres;
947
+        $pos_courante = $pos_apres ;
948
+    }
949
+
950
+    //
951
+    // 2. Récuperer la partie alternative apres
952
+    //
953
+    $altern_boucle = BALISE_ALT_BOUCLE . $id_boucle . '>';
954
+    $pos_altern = strpos($texte, $altern_boucle, $pos_courante);
955
+    if (
956
+        $pos_altern !== false
957
+        and (!$pos_anonyme_next or $pos_altern < $pos_anonyme_next)
958
+    ) {
959
+        $boucle['pos_altern'] = $pos_altern;
960
+        $pos_altern += strlen($altern_boucle);
961
+        $boucle['pos_altern_inside'] = $pos_altern;
962
+        $pos_courante = $pos_altern;
963
+    }
964
+
965
+    //
966
+    // 3. Recuperer la partie footer non alternative
967
+    //
968
+    $postaff_boucle = BALISE_POSTAFF_BOUCLE . $id_boucle . '>';
969
+    $pos_postaff = strpos($texte, $postaff_boucle, $pos_courante);
970
+    if (
971
+        $pos_postaff !== false
972
+        and (!$pos_anonyme_next or $pos_postaff < $pos_anonyme_next)
973
+    ) {
974
+        $boucle['pos_postaff'] = $pos_postaff;
975
+        $pos_postaff += strlen($postaff_boucle);
976
+        $boucle['pos_postaff_inside'] = $pos_postaff;
977
+        $pos_courante = $pos_postaff ;
978
+    }
979
+
980
+    return $boucle;
981 981
 }
982 982
 
983 983
 
@@ -987,21 +987,21 @@  discard block
 block discarded – undo
987 987
  * @param null|object $boucle
988 988
  */
989 989
 function phraser_boucle_placeholder(&$champ, $boucle_placeholder = null, $boucle = null) {
990
-	static $boucles_connues = [];
991
-	// si c'est un appel pour memoriser une boucle, memorisons la
992
-	if (is_string($champ) and !empty($boucle_placeholder) and !empty($boucle)) {
993
-		$boucles_connues[$boucle_placeholder][$champ] = &$boucle;
994
-	}
995
-	else {
996
-		if (!empty($champ->nom_champ) and !empty($boucles_connues[$champ->nom_champ])) {
997
-			$placeholder = $champ->nom_champ;
998
-			$id = reset($champ->param[0][1]);
999
-			$id = $id->texte;
1000
-			if (!empty($boucles_connues[$placeholder][$id])) {
1001
-				$champ = $boucles_connues[$placeholder][$id];
1002
-			}
1003
-		}
1004
-	}
990
+    static $boucles_connues = [];
991
+    // si c'est un appel pour memoriser une boucle, memorisons la
992
+    if (is_string($champ) and !empty($boucle_placeholder) and !empty($boucle)) {
993
+        $boucles_connues[$boucle_placeholder][$champ] = &$boucle;
994
+    }
995
+    else {
996
+        if (!empty($champ->nom_champ) and !empty($boucles_connues[$champ->nom_champ])) {
997
+            $placeholder = $champ->nom_champ;
998
+            $id = reset($champ->param[0][1]);
999
+            $id = $id->texte;
1000
+            if (!empty($boucles_connues[$placeholder][$id])) {
1001
+                $champ = $boucles_connues[$placeholder][$id];
1002
+            }
1003
+        }
1004
+    }
1005 1005
 }
1006 1006
 
1007 1007
 
@@ -1014,274 +1014,274 @@  discard block
 block discarded – undo
1014 1014
  * @return string
1015 1015
  */
1016 1016
 function public_generer_boucle_placeholder($id_boucle, &$boucle, $boucle_placeholder, $nb_lignes) {
1017
-	$placeholder = "[(#{$boucle_placeholder}{" . $id_boucle . '})' . str_pad('', $nb_lignes, "\n") . ']';
1018
-	//memoriser la boucle a reinjecter
1019
-	$id_boucle = "$id_boucle";
1020
-	phraser_boucle_placeholder($id_boucle, $boucle_placeholder, $boucle);
1021
-	return $placeholder;
1017
+    $placeholder = "[(#{$boucle_placeholder}{" . $id_boucle . '})' . str_pad('', $nb_lignes, "\n") . ']';
1018
+    //memoriser la boucle a reinjecter
1019
+    $id_boucle = "$id_boucle";
1020
+    phraser_boucle_placeholder($id_boucle, $boucle_placeholder, $boucle);
1021
+    return $placeholder;
1022 1022
 }
1023 1023
 
1024 1024
 function public_phraser_html_dist($texte, $id_parent, &$boucles, $descr, $ligne_debut_texte = 1, $boucle_placeholder = null) {
1025 1025
 
1026
-	$all_res = [];
1027
-	// definir un placholder pour les boucles dont on est sur d'avoir aucune occurence dans le squelette
1028
-	if (is_null($boucle_placeholder)) {
1029
-		do {
1030
-			$boucle_placeholder = 'BOUCLE_PLACEHOLDER_' . strtoupper(md5(uniqid()));
1031
-		} while (strpos($texte, $boucle_placeholder) !== false);
1032
-	}
1033
-
1034
-	$ligne_debut_initial = $ligne_debut_texte;
1035
-	$pos_debut_texte = 0;
1036
-	while ($boucle = public_trouver_premiere_boucle($texte, $id_parent, $descr, $pos_debut_texte)) {
1037
-		$err_b = ''; // indiquera s'il y a eu une erreur
1038
-		$result = new Boucle();
1039
-		$result->id_parent = $id_parent;
1040
-		$result->descr = $descr;
1041
-
1042
-		$pos_courante = $boucle['pos_boucle'];
1043
-		$pos_parent = $boucle['pos_parent'];
1044
-		$id_boucle_search = $id_boucle = $boucle['id_boucle'];
1045
-
1046
-		$ligne_preaff = $ligne_avant = $ligne_milieu = $ligne_debut_texte + public_compte_ligne($texte, $pos_debut_texte, $pos_parent);
1047
-
1048
-		// boucle anonyme ?
1049
-		if (!strlen($id_boucle)) {
1050
-			$id_boucle = '_anon_L' . $ligne_milieu . '_' . substr(md5('anonyme:' . $id_parent . ':' . json_encode($boucle)), 0, 8);
1051
-		}
1052
-
1053
-		$pos_debut_boucle = $pos_courante;
1054
-
1055
-		$pos_milieu = $pos_parent;
1056
-
1057
-		// Regarder si on a une partie conditionnelle avant <B_xxx>
1058
-		if ($boucle['pos_precond'] !== false) {
1059
-			$pos_debut_boucle = $boucle['pos_precond'];
1060
-
1061
-			$pos_avant = $boucle['pos_precond_inside'];
1062
-			$result->avant = substr($texte, $pos_avant, $pos_courante - $pos_avant);
1063
-			$ligne_avant = $ligne_debut_texte +  public_compte_ligne($texte, $pos_debut_texte, $pos_avant);
1064
-		}
1065
-
1066
-		// Regarder si on a une partie inconditionnelle avant <BB_xxx>
1067
-		if ($boucle['pos_preaff'] !== false) {
1068
-			$end_preaff = $pos_debut_boucle;
1069
-
1070
-			$pos_preaff = $boucle['pos_preaff_inside'];
1071
-			$result->preaff = substr($texte, $pos_preaff, $end_preaff - $pos_preaff);
1072
-			$ligne_preaff = $ligne_debut_texte +  public_compte_ligne($texte, $pos_debut_texte, $pos_preaff);
1073
-		}
1074
-
1075
-		$result->id_boucle = $id_boucle;
1076
-
1077
-		if (
1078
-			!preg_match(SPEC_BOUCLE, $texte, $match, 0, $pos_milieu)
1079
-			or ($pos_match = strpos($texte, $match[0], $pos_milieu)) === false
1080
-			or $pos_match > $pos_milieu
1081
-		) {
1082
-			$err_b = ['zbug_erreur_boucle_syntaxe', ['id' => $id_boucle]];
1083
-			erreur_squelette($err_b, $result);
1084
-
1085
-			$ligne_debut_texte += public_compte_ligne($texte, $pos_debut_texte, $pos_courante + 1);
1086
-			$pos_debut_texte = $pos_courante + 1;
1087
-			continue;
1088
-		}
1089
-
1090
-		$result->type_requete = $match[0];
1091
-		$pos_milieu += strlen($match[0]);
1092
-		$pos_courante = $pos_milieu; // on s'en sert pour compter les lignes plus precisemment
1093
-
1094
-		$type = $match[1];
1095
-		$jointures = trim($match[2]);
1096
-		$table_optionnelle = ($match[3]);
1097
-		if ($jointures) {
1098
-			// on affecte pas ici les jointures explicites, mais dans la compilation
1099
-			// ou elles seront completees des jointures declarees
1100
-			$result->jointures_explicites = $jointures;
1101
-		}
1102
-
1103
-		if ($table_optionnelle) {
1104
-			$result->table_optionnelle = $type;
1105
-		}
1106
-
1107
-		// 1ere passe sur les criteres, vu comme des arguments sans fct
1108
-		// Resultat mis dans result->param
1109
-		$pos_fin_criteres = $pos_milieu;
1110
-		phraser_args($texte, '/>', '', $all_res, $result, $pos_fin_criteres);
1111
-
1112
-		// En 2e passe result->criteres contiendra un tableau
1113
-		// pour l'instant on met le source (chaine) :
1114
-		// si elle reste ici au final, c'est qu'elle contient une erreur
1115
-		$pos_courante = $pos_fin_criteres; // on s'en sert pour compter les lignes plus precisemment
1116
-		$result->criteres = substr($texte, $pos_milieu, $pos_fin_criteres - $pos_milieu);
1117
-		$pos_milieu = $pos_fin_criteres;
1118
-
1119
-		//
1120
-		// Recuperer la fin :
1121
-		//
1122
-		if ($texte[$pos_milieu] === '/') {
1123
-			// boucle autofermante : pas de partie conditionnelle apres
1124
-			$pos_courante += 2;
1125
-			$result->milieu = '';
1126
-		} else {
1127
-			$pos_milieu += 1;
1128
-
1129
-			$fin_boucle = BALISE_FIN_BOUCLE . $id_boucle_search . '>';
1130
-			$pos_fin = strpos($texte, $fin_boucle, $pos_milieu);
1131
-			if ($pos_fin === false) {
1132
-				$err_b = [
1133
-					'zbug_erreur_boucle_fermant',
1134
-					['id' => $id_boucle]
1135
-				];
1136
-				erreur_squelette($err_b, $result);
1137
-				$pos_courante += strlen($fin_boucle);
1138
-			}
1139
-			else {
1140
-				// verifier une eventuelle imbrication d'une boucle homonyme
1141
-				// (interdite, generera une erreur plus loin, mais permet de signaler la bonne erreur)
1142
-				$search_debut_boucle = BALISE_BOUCLE . $id_boucle_search . '(';
1143
-				$search_from = $pos_milieu;
1144
-				$nb_open = 1;
1145
-				$nb_close = 1;
1146
-				$maxiter = 0;
1147
-				do {
1148
-					while (
1149
-						$nb_close < $nb_open
1150
-						and $p = strpos($texte, $fin_boucle, $pos_fin + 1)
1151
-					) {
1152
-						$nb_close++;
1153
-						$pos_fin = $p;
1154
-					}
1155
-					// si on a pas trouve assez de boucles fermantes, sortir de la, on a fait de notre mieux
1156
-					if ($nb_close < $nb_open) {
1157
-						break;
1158
-					}
1159
-					while (
1160
-						$p = strpos($texte, $search_debut_boucle, $search_from)
1161
-						and $p < $pos_fin
1162
-					) {
1163
-						$nb_open++;
1164
-						$search_from = $p + 1;
1165
-					}
1166
-				} while ($nb_close < $nb_open and $maxiter++ < 5);
1167
-
1168
-				$pos_courante = $pos_fin + strlen($fin_boucle);
1169
-			}
1170
-			$result->milieu = substr($texte, $pos_milieu, $pos_fin - $pos_milieu);
1171
-		}
1172
-
1173
-		$ligne_suite = $ligne_apres = $ligne_debut_texte + public_compte_ligne($texte, $pos_debut_texte, $pos_courante);
1174
-		$boucle = public_trouver_fin_boucle($texte, $id_parent, $boucle, $pos_courante, $result);
1175
-
1176
-		//
1177
-		// 1. Partie conditionnelle apres ?
1178
-		//
1179
-		if ($boucle['pos_postcond']) {
1180
-			$result->apres = substr($texte, $pos_courante, $boucle['pos_postcond'] - $pos_courante);
1181
-			$ligne_suite += public_compte_ligne($texte, $pos_courante, $boucle['pos_postcond_inside']);
1182
-			$pos_courante = $boucle['pos_postcond_inside'] ;
1183
-		}
1184
-
1185
-
1186
-		//
1187
-		// 2. Partie alternative apres ?
1188
-		//
1189
-		$ligne_altern = $ligne_suite;
1190
-		if ($boucle['pos_altern']) {
1191
-			$result->altern = substr($texte, $pos_courante, $boucle['pos_altern'] - $pos_courante);
1192
-			$ligne_suite += public_compte_ligne($texte, $pos_courante, $boucle['pos_altern_inside']);
1193
-			$pos_courante = $boucle['pos_altern_inside'];
1194
-		}
1195
-
1196
-		//
1197
-		// 3. Partie footer non alternative ?
1198
-		//
1199
-		$ligne_postaff = $ligne_suite;
1200
-		if ($boucle['pos_postaff']) {
1201
-			$result->postaff = substr($texte, $pos_courante, $boucle['pos_postaff'] - $pos_courante);
1202
-			$ligne_suite += public_compte_ligne($texte, $pos_courante, $boucle['pos_postaff_inside']);
1203
-			$pos_courante = $boucle['pos_postaff_inside'];
1204
-		}
1205
-
1206
-		$result->ligne = $ligne_preaff;
1207
-
1208
-		if ($p = strpos($type, ':')) {
1209
-			$result->sql_serveur = substr($type, 0, $p);
1210
-			$type = substr($type, $p + 1);
1211
-		}
1212
-		$soustype = strtolower($type);
1213
-
1214
-		if (!isset($GLOBALS['table_des_tables'][$soustype])) {
1215
-			$soustype = $type;
1216
-		}
1217
-
1218
-		$result->type_requete = $soustype;
1219
-		// Lancer la 2e passe sur les criteres si la 1ere etait bonne
1220
-		if (!is_array($result->param)) {
1221
-			$err_b = true;
1222
-		} else {
1223
-			phraser_criteres($result->param, $result);
1224
-			if (strncasecmp($soustype, TYPE_RECURSIF, strlen(TYPE_RECURSIF)) == 0) {
1225
-				$result->type_requete = TYPE_RECURSIF;
1226
-				$args = $result->param;
1227
-				array_unshift(
1228
-					$args,
1229
-					substr($type, strlen(TYPE_RECURSIF))
1230
-				);
1231
-				$result->param = $args;
1232
-			}
1233
-		}
1234
-
1235
-		$descr['id_mere_contexte'] = $id_boucle;
1236
-		$result->milieu = public_phraser_html_dist($result->milieu, $id_boucle, $boucles, $descr, $ligne_milieu, $boucle_placeholder);
1237
-		// reserver la place dans la pile des boucles pour compiler ensuite dans le bon ordre
1238
-		// ie les boucles qui apparaissent dans les partie conditionnelles doivent etre compilees apres cette boucle
1239
-		// si il y a deja une boucle de ce nom, cela declenchera une erreur ensuite
1240
-		if (empty($boucles[$id_boucle])) {
1241
-			$boucles[$id_boucle] = null;
1242
-		}
1243
-		$result->preaff = public_phraser_html_dist($result->preaff, $id_parent, $boucles, $descr, $ligne_preaff, $boucle_placeholder);
1244
-		$result->avant = public_phraser_html_dist($result->avant, $id_parent, $boucles, $descr, $ligne_avant, $boucle_placeholder);
1245
-		$result->apres = public_phraser_html_dist($result->apres, $id_parent, $boucles, $descr, $ligne_apres, $boucle_placeholder);
1246
-		$result->altern = public_phraser_html_dist($result->altern, $id_parent, $boucles, $descr, $ligne_altern, $boucle_placeholder);
1247
-		$result->postaff = public_phraser_html_dist($result->postaff, $id_parent, $boucles, $descr, $ligne_postaff, $boucle_placeholder);
1248
-
1249
-		// Prevenir le generateur de code que le squelette est faux
1250
-		if ($err_b) {
1251
-			$result->type_requete = false;
1252
-		}
1253
-
1254
-		// Verifier qu'il n'y a pas double definition
1255
-		// apres analyse des sous-parties (pas avant).
1256
-		if (!empty($boucles[$id_boucle])) {
1257
-			if ($boucles[$id_boucle]->type_requete !== false) {
1258
-				$err_b_d = [
1259
-					'zbug_erreur_boucle_double',
1260
-					['id' => $id_boucle]
1261
-				];
1262
-				erreur_squelette($err_b_d, $result);
1263
-				// Prevenir le generateur de code que le squelette est faux
1264
-				$boucles[$id_boucle]->type_requete = false;
1265
-			}
1266
-		} else {
1267
-			$boucles[$id_boucle] = $result;
1268
-		}
1269
-
1270
-		// remplacer la boucle par un placeholder qui compte le meme nombre de lignes
1271
-		$placeholder = public_generer_boucle_placeholder($id_boucle, $boucles[$id_boucle], $boucle_placeholder, $ligne_suite - $ligne_debut_texte);
1272
-		$longueur_boucle = $pos_courante - $boucle['debut_boucle'];
1273
-		$texte = substr_replace($texte, $placeholder, $boucle['debut_boucle'], $longueur_boucle);
1274
-		$pos_courante = $pos_courante - $longueur_boucle + strlen($placeholder);
1275
-
1276
-		// phraser la partie avant le debut de la boucle
1277
-		#$all_res = phraser_champs_etendus(substr($texte, $pos_debut_texte, $boucle['debut_boucle'] - $pos_debut_texte), $ligne_debut_texte, $all_res);
1278
-		#$all_res[] = &$boucles[$id_boucle];
1279
-
1280
-		$ligne_debut_texte = $ligne_suite;
1281
-		$pos_debut_texte = $pos_courante;
1282
-	}
1283
-
1284
-	$all_res = phraser_champs_etendus($texte, $ligne_debut_initial, $all_res);
1285
-
1286
-	return $all_res;
1026
+    $all_res = [];
1027
+    // definir un placholder pour les boucles dont on est sur d'avoir aucune occurence dans le squelette
1028
+    if (is_null($boucle_placeholder)) {
1029
+        do {
1030
+            $boucle_placeholder = 'BOUCLE_PLACEHOLDER_' . strtoupper(md5(uniqid()));
1031
+        } while (strpos($texte, $boucle_placeholder) !== false);
1032
+    }
1033
+
1034
+    $ligne_debut_initial = $ligne_debut_texte;
1035
+    $pos_debut_texte = 0;
1036
+    while ($boucle = public_trouver_premiere_boucle($texte, $id_parent, $descr, $pos_debut_texte)) {
1037
+        $err_b = ''; // indiquera s'il y a eu une erreur
1038
+        $result = new Boucle();
1039
+        $result->id_parent = $id_parent;
1040
+        $result->descr = $descr;
1041
+
1042
+        $pos_courante = $boucle['pos_boucle'];
1043
+        $pos_parent = $boucle['pos_parent'];
1044
+        $id_boucle_search = $id_boucle = $boucle['id_boucle'];
1045
+
1046
+        $ligne_preaff = $ligne_avant = $ligne_milieu = $ligne_debut_texte + public_compte_ligne($texte, $pos_debut_texte, $pos_parent);
1047
+
1048
+        // boucle anonyme ?
1049
+        if (!strlen($id_boucle)) {
1050
+            $id_boucle = '_anon_L' . $ligne_milieu . '_' . substr(md5('anonyme:' . $id_parent . ':' . json_encode($boucle)), 0, 8);
1051
+        }
1052
+
1053
+        $pos_debut_boucle = $pos_courante;
1054
+
1055
+        $pos_milieu = $pos_parent;
1056
+
1057
+        // Regarder si on a une partie conditionnelle avant <B_xxx>
1058
+        if ($boucle['pos_precond'] !== false) {
1059
+            $pos_debut_boucle = $boucle['pos_precond'];
1060
+
1061
+            $pos_avant = $boucle['pos_precond_inside'];
1062
+            $result->avant = substr($texte, $pos_avant, $pos_courante - $pos_avant);
1063
+            $ligne_avant = $ligne_debut_texte +  public_compte_ligne($texte, $pos_debut_texte, $pos_avant);
1064
+        }
1065
+
1066
+        // Regarder si on a une partie inconditionnelle avant <BB_xxx>
1067
+        if ($boucle['pos_preaff'] !== false) {
1068
+            $end_preaff = $pos_debut_boucle;
1069
+
1070
+            $pos_preaff = $boucle['pos_preaff_inside'];
1071
+            $result->preaff = substr($texte, $pos_preaff, $end_preaff - $pos_preaff);
1072
+            $ligne_preaff = $ligne_debut_texte +  public_compte_ligne($texte, $pos_debut_texte, $pos_preaff);
1073
+        }
1074
+
1075
+        $result->id_boucle = $id_boucle;
1076
+
1077
+        if (
1078
+            !preg_match(SPEC_BOUCLE, $texte, $match, 0, $pos_milieu)
1079
+            or ($pos_match = strpos($texte, $match[0], $pos_milieu)) === false
1080
+            or $pos_match > $pos_milieu
1081
+        ) {
1082
+            $err_b = ['zbug_erreur_boucle_syntaxe', ['id' => $id_boucle]];
1083
+            erreur_squelette($err_b, $result);
1084
+
1085
+            $ligne_debut_texte += public_compte_ligne($texte, $pos_debut_texte, $pos_courante + 1);
1086
+            $pos_debut_texte = $pos_courante + 1;
1087
+            continue;
1088
+        }
1089
+
1090
+        $result->type_requete = $match[0];
1091
+        $pos_milieu += strlen($match[0]);
1092
+        $pos_courante = $pos_milieu; // on s'en sert pour compter les lignes plus precisemment
1093
+
1094
+        $type = $match[1];
1095
+        $jointures = trim($match[2]);
1096
+        $table_optionnelle = ($match[3]);
1097
+        if ($jointures) {
1098
+            // on affecte pas ici les jointures explicites, mais dans la compilation
1099
+            // ou elles seront completees des jointures declarees
1100
+            $result->jointures_explicites = $jointures;
1101
+        }
1102
+
1103
+        if ($table_optionnelle) {
1104
+            $result->table_optionnelle = $type;
1105
+        }
1106
+
1107
+        // 1ere passe sur les criteres, vu comme des arguments sans fct
1108
+        // Resultat mis dans result->param
1109
+        $pos_fin_criteres = $pos_milieu;
1110
+        phraser_args($texte, '/>', '', $all_res, $result, $pos_fin_criteres);
1111
+
1112
+        // En 2e passe result->criteres contiendra un tableau
1113
+        // pour l'instant on met le source (chaine) :
1114
+        // si elle reste ici au final, c'est qu'elle contient une erreur
1115
+        $pos_courante = $pos_fin_criteres; // on s'en sert pour compter les lignes plus precisemment
1116
+        $result->criteres = substr($texte, $pos_milieu, $pos_fin_criteres - $pos_milieu);
1117
+        $pos_milieu = $pos_fin_criteres;
1118
+
1119
+        //
1120
+        // Recuperer la fin :
1121
+        //
1122
+        if ($texte[$pos_milieu] === '/') {
1123
+            // boucle autofermante : pas de partie conditionnelle apres
1124
+            $pos_courante += 2;
1125
+            $result->milieu = '';
1126
+        } else {
1127
+            $pos_milieu += 1;
1128
+
1129
+            $fin_boucle = BALISE_FIN_BOUCLE . $id_boucle_search . '>';
1130
+            $pos_fin = strpos($texte, $fin_boucle, $pos_milieu);
1131
+            if ($pos_fin === false) {
1132
+                $err_b = [
1133
+                    'zbug_erreur_boucle_fermant',
1134
+                    ['id' => $id_boucle]
1135
+                ];
1136
+                erreur_squelette($err_b, $result);
1137
+                $pos_courante += strlen($fin_boucle);
1138
+            }
1139
+            else {
1140
+                // verifier une eventuelle imbrication d'une boucle homonyme
1141
+                // (interdite, generera une erreur plus loin, mais permet de signaler la bonne erreur)
1142
+                $search_debut_boucle = BALISE_BOUCLE . $id_boucle_search . '(';
1143
+                $search_from = $pos_milieu;
1144
+                $nb_open = 1;
1145
+                $nb_close = 1;
1146
+                $maxiter = 0;
1147
+                do {
1148
+                    while (
1149
+                        $nb_close < $nb_open
1150
+                        and $p = strpos($texte, $fin_boucle, $pos_fin + 1)
1151
+                    ) {
1152
+                        $nb_close++;
1153
+                        $pos_fin = $p;
1154
+                    }
1155
+                    // si on a pas trouve assez de boucles fermantes, sortir de la, on a fait de notre mieux
1156
+                    if ($nb_close < $nb_open) {
1157
+                        break;
1158
+                    }
1159
+                    while (
1160
+                        $p = strpos($texte, $search_debut_boucle, $search_from)
1161
+                        and $p < $pos_fin
1162
+                    ) {
1163
+                        $nb_open++;
1164
+                        $search_from = $p + 1;
1165
+                    }
1166
+                } while ($nb_close < $nb_open and $maxiter++ < 5);
1167
+
1168
+                $pos_courante = $pos_fin + strlen($fin_boucle);
1169
+            }
1170
+            $result->milieu = substr($texte, $pos_milieu, $pos_fin - $pos_milieu);
1171
+        }
1172
+
1173
+        $ligne_suite = $ligne_apres = $ligne_debut_texte + public_compte_ligne($texte, $pos_debut_texte, $pos_courante);
1174
+        $boucle = public_trouver_fin_boucle($texte, $id_parent, $boucle, $pos_courante, $result);
1175
+
1176
+        //
1177
+        // 1. Partie conditionnelle apres ?
1178
+        //
1179
+        if ($boucle['pos_postcond']) {
1180
+            $result->apres = substr($texte, $pos_courante, $boucle['pos_postcond'] - $pos_courante);
1181
+            $ligne_suite += public_compte_ligne($texte, $pos_courante, $boucle['pos_postcond_inside']);
1182
+            $pos_courante = $boucle['pos_postcond_inside'] ;
1183
+        }
1184
+
1185
+
1186
+        //
1187
+        // 2. Partie alternative apres ?
1188
+        //
1189
+        $ligne_altern = $ligne_suite;
1190
+        if ($boucle['pos_altern']) {
1191
+            $result->altern = substr($texte, $pos_courante, $boucle['pos_altern'] - $pos_courante);
1192
+            $ligne_suite += public_compte_ligne($texte, $pos_courante, $boucle['pos_altern_inside']);
1193
+            $pos_courante = $boucle['pos_altern_inside'];
1194
+        }
1195
+
1196
+        //
1197
+        // 3. Partie footer non alternative ?
1198
+        //
1199
+        $ligne_postaff = $ligne_suite;
1200
+        if ($boucle['pos_postaff']) {
1201
+            $result->postaff = substr($texte, $pos_courante, $boucle['pos_postaff'] - $pos_courante);
1202
+            $ligne_suite += public_compte_ligne($texte, $pos_courante, $boucle['pos_postaff_inside']);
1203
+            $pos_courante = $boucle['pos_postaff_inside'];
1204
+        }
1205
+
1206
+        $result->ligne = $ligne_preaff;
1207
+
1208
+        if ($p = strpos($type, ':')) {
1209
+            $result->sql_serveur = substr($type, 0, $p);
1210
+            $type = substr($type, $p + 1);
1211
+        }
1212
+        $soustype = strtolower($type);
1213
+
1214
+        if (!isset($GLOBALS['table_des_tables'][$soustype])) {
1215
+            $soustype = $type;
1216
+        }
1217
+
1218
+        $result->type_requete = $soustype;
1219
+        // Lancer la 2e passe sur les criteres si la 1ere etait bonne
1220
+        if (!is_array($result->param)) {
1221
+            $err_b = true;
1222
+        } else {
1223
+            phraser_criteres($result->param, $result);
1224
+            if (strncasecmp($soustype, TYPE_RECURSIF, strlen(TYPE_RECURSIF)) == 0) {
1225
+                $result->type_requete = TYPE_RECURSIF;
1226
+                $args = $result->param;
1227
+                array_unshift(
1228
+                    $args,
1229
+                    substr($type, strlen(TYPE_RECURSIF))
1230
+                );
1231
+                $result->param = $args;
1232
+            }
1233
+        }
1234
+
1235
+        $descr['id_mere_contexte'] = $id_boucle;
1236
+        $result->milieu = public_phraser_html_dist($result->milieu, $id_boucle, $boucles, $descr, $ligne_milieu, $boucle_placeholder);
1237
+        // reserver la place dans la pile des boucles pour compiler ensuite dans le bon ordre
1238
+        // ie les boucles qui apparaissent dans les partie conditionnelles doivent etre compilees apres cette boucle
1239
+        // si il y a deja une boucle de ce nom, cela declenchera une erreur ensuite
1240
+        if (empty($boucles[$id_boucle])) {
1241
+            $boucles[$id_boucle] = null;
1242
+        }
1243
+        $result->preaff = public_phraser_html_dist($result->preaff, $id_parent, $boucles, $descr, $ligne_preaff, $boucle_placeholder);
1244
+        $result->avant = public_phraser_html_dist($result->avant, $id_parent, $boucles, $descr, $ligne_avant, $boucle_placeholder);
1245
+        $result->apres = public_phraser_html_dist($result->apres, $id_parent, $boucles, $descr, $ligne_apres, $boucle_placeholder);
1246
+        $result->altern = public_phraser_html_dist($result->altern, $id_parent, $boucles, $descr, $ligne_altern, $boucle_placeholder);
1247
+        $result->postaff = public_phraser_html_dist($result->postaff, $id_parent, $boucles, $descr, $ligne_postaff, $boucle_placeholder);
1248
+
1249
+        // Prevenir le generateur de code que le squelette est faux
1250
+        if ($err_b) {
1251
+            $result->type_requete = false;
1252
+        }
1253
+
1254
+        // Verifier qu'il n'y a pas double definition
1255
+        // apres analyse des sous-parties (pas avant).
1256
+        if (!empty($boucles[$id_boucle])) {
1257
+            if ($boucles[$id_boucle]->type_requete !== false) {
1258
+                $err_b_d = [
1259
+                    'zbug_erreur_boucle_double',
1260
+                    ['id' => $id_boucle]
1261
+                ];
1262
+                erreur_squelette($err_b_d, $result);
1263
+                // Prevenir le generateur de code que le squelette est faux
1264
+                $boucles[$id_boucle]->type_requete = false;
1265
+            }
1266
+        } else {
1267
+            $boucles[$id_boucle] = $result;
1268
+        }
1269
+
1270
+        // remplacer la boucle par un placeholder qui compte le meme nombre de lignes
1271
+        $placeholder = public_generer_boucle_placeholder($id_boucle, $boucles[$id_boucle], $boucle_placeholder, $ligne_suite - $ligne_debut_texte);
1272
+        $longueur_boucle = $pos_courante - $boucle['debut_boucle'];
1273
+        $texte = substr_replace($texte, $placeholder, $boucle['debut_boucle'], $longueur_boucle);
1274
+        $pos_courante = $pos_courante - $longueur_boucle + strlen($placeholder);
1275
+
1276
+        // phraser la partie avant le debut de la boucle
1277
+        #$all_res = phraser_champs_etendus(substr($texte, $pos_debut_texte, $boucle['debut_boucle'] - $pos_debut_texte), $ligne_debut_texte, $all_res);
1278
+        #$all_res[] = &$boucles[$id_boucle];
1279
+
1280
+        $ligne_debut_texte = $ligne_suite;
1281
+        $pos_debut_texte = $pos_courante;
1282
+    }
1283
+
1284
+    $all_res = phraser_champs_etendus($texte, $ligne_debut_initial, $all_res);
1285
+
1286
+    return $all_res;
1287 1287
 }
Please login to merge, or discard this patch.
ecrire/public/criteres.php 1 patch
Indentation   +1721 added lines, -1721 removed lines patch added patch discarded remove patch
@@ -17,7 +17,7 @@  discard block
 block discarded – undo
17 17
  **/
18 18
 
19 19
 if (!defined('_ECRIRE_INC_VERSION')) {
20
-	return;
20
+    return;
21 21
 }
22 22
 
23 23
 /**
@@ -43,14 +43,14 @@  discard block
 block discarded – undo
43 43
  **/
44 44
 function critere_racine_dist($idb, &$boucles, $crit) {
45 45
 
46
-	$not = $crit->not;
47
-	$boucle = &$boucles[$idb];
48
-	$id_parent = isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent']) ?
49
-		$GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] :
50
-		'id_parent';
46
+    $not = $crit->not;
47
+    $boucle = &$boucles[$idb];
48
+    $id_parent = isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent']) ?
49
+        $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] :
50
+        'id_parent';
51 51
 
52
-	$c = ["'='", "'$boucle->id_table." . "$id_parent'", 0];
53
-	$boucle->where[] = ($crit->not ? ["'NOT'", $c] : $c);
52
+    $c = ["'='", "'$boucle->id_table." . "$id_parent'", 0];
53
+    $boucle->where[] = ($crit->not ? ["'NOT'", $c] : $c);
54 54
 }
55 55
 
56 56
 
@@ -67,15 +67,15 @@  discard block
 block discarded – undo
67 67
  * @return void
68 68
  **/
69 69
 function critere_exclus_dist($idb, &$boucles, $crit) {
70
-	$not = $crit->not;
71
-	$boucle = &$boucles[$idb];
72
-	$id = $boucle->primary;
73
-
74
-	if ($not or !$id) {
75
-		return (['zbug_critere_inconnu', ['critere' => $not . $crit->op]]);
76
-	}
77
-	$arg = kwote(calculer_argument_precedent($idb, $id, $boucles));
78
-	$boucle->where[] = ["'!='", "'$boucle->id_table." . "$id'", $arg];
70
+    $not = $crit->not;
71
+    $boucle = &$boucles[$idb];
72
+    $id = $boucle->primary;
73
+
74
+    if ($not or !$id) {
75
+        return (['zbug_critere_inconnu', ['critere' => $not . $crit->op]]);
76
+    }
77
+    $arg = kwote(calculer_argument_precedent($idb, $id, $boucles));
78
+    $boucle->where[] = ["'!='", "'$boucle->id_table." . "$id'", $arg];
79 79
 }
80 80
 
81 81
 
@@ -95,73 +95,73 @@  discard block
 block discarded – undo
95 95
  * @return void
96 96
  **/
97 97
 function critere_doublons_dist($idb, &$boucles, $crit) {
98
-	$boucle = &$boucles[$idb];
99
-	$primary = $boucle->primary;
100
-
101
-	// la table nécessite une clé primaire, non composée
102
-	if (!$primary or strpos($primary, ',')) {
103
-		return (['zbug_doublon_sur_table_sans_cle_primaire']);
104
-	}
105
-
106
-	$not = ($crit->not ? '' : 'NOT');
107
-
108
-	// le doublon s'applique sur un type de boucle (article)
109
-	$nom = "'" . $boucle->type_requete . "'";
110
-
111
-	// compléter le nom avec un nom précisé {doublons nom}
112
-	// on obtient $nom = "'article' . 'nom'"
113
-	if (isset($crit->param[0])) {
114
-		$nom .= '.' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
115
-	}
116
-
117
-	// code qui déclarera l'index du stockage de nos doublons (pour éviter une notice PHP)
118
-	$init_comment = "\n\n\t// Initialise le(s) critère(s) doublons\n";
119
-	$init_code = "\tif (!isset(\$doublons[\$d = $nom])) { \$doublons[\$d] = ''; }\n";
120
-
121
-	// on crée un sql_in avec la clé primaire de la table
122
-	// et la collection des doublons déjà emmagasinés dans le tableau
123
-	// $doublons et son index, ici $nom
124
-
125
-	// debut du code "sql_in('articles.id_article', "
126
-	$debut_in = "sql_in('" . $boucle->id_table . '.' . $primary . "', ";
127
-	// lecture des données du doublon "$doublons[$doublon_index[] = "
128
-	// Attention : boucle->doublons désigne une variable qu'on affecte
129
-	$debut_doub = '$doublons[' . (!$not ? '' : ($boucle->doublons . '[]= '));
130
-
131
-	// le debut complet du code des doublons
132
-	$debut_doub = $debut_in . $debut_doub;
133
-
134
-	// nom du doublon "('article' . 'nom')]"
135
-	$fin_doub = "($nom)]";
136
-
137
-	// si on trouve un autre critère doublon,
138
-	// on fusionne pour avoir un seul IN, et on s'en va !
139
-	foreach ($boucle->where as $k => $w) {
140
-		if (strpos($w[0], $debut_doub) === 0) {
141
-			// fusionner le sql_in (du where)
142
-			$boucle->where[$k][0] = $debut_doub . $fin_doub . ' . ' . substr($w[0], strlen($debut_in));
143
-			// fusionner l'initialisation (du hash) pour faire plus joli
144
-			$x = strpos($boucle->hash, $init_comment);
145
-			$len = strlen($init_comment);
146
-			$boucle->hash =
147
-				substr($boucle->hash, 0, $x + $len) . $init_code . substr($boucle->hash, $x + $len);
148
-
149
-			return;
150
-		}
151
-	}
152
-
153
-	// mettre l'ensemble dans un tableau pour que ce ne soit pas vu comme une constante
154
-	$boucle->where[] = [$debut_doub . $fin_doub . ", '" . $not . "')"];
155
-
156
-	// déclarer le doublon s'il n'existe pas encore
157
-	$boucle->hash .= $init_comment . $init_code;
158
-
159
-
160
-	# la ligne suivante avait l'intention d'eviter une collecte deja faite
161
-	# mais elle fait planter une boucle a 2 critere doublons:
162
-	# {!doublons A}{doublons B}
163
-	# (de http://article.gmane.org/gmane.comp.web.spip.devel/31034)
164
-	#	if ($crit->not) $boucle->doublons = "";
98
+    $boucle = &$boucles[$idb];
99
+    $primary = $boucle->primary;
100
+
101
+    // la table nécessite une clé primaire, non composée
102
+    if (!$primary or strpos($primary, ',')) {
103
+        return (['zbug_doublon_sur_table_sans_cle_primaire']);
104
+    }
105
+
106
+    $not = ($crit->not ? '' : 'NOT');
107
+
108
+    // le doublon s'applique sur un type de boucle (article)
109
+    $nom = "'" . $boucle->type_requete . "'";
110
+
111
+    // compléter le nom avec un nom précisé {doublons nom}
112
+    // on obtient $nom = "'article' . 'nom'"
113
+    if (isset($crit->param[0])) {
114
+        $nom .= '.' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
115
+    }
116
+
117
+    // code qui déclarera l'index du stockage de nos doublons (pour éviter une notice PHP)
118
+    $init_comment = "\n\n\t// Initialise le(s) critère(s) doublons\n";
119
+    $init_code = "\tif (!isset(\$doublons[\$d = $nom])) { \$doublons[\$d] = ''; }\n";
120
+
121
+    // on crée un sql_in avec la clé primaire de la table
122
+    // et la collection des doublons déjà emmagasinés dans le tableau
123
+    // $doublons et son index, ici $nom
124
+
125
+    // debut du code "sql_in('articles.id_article', "
126
+    $debut_in = "sql_in('" . $boucle->id_table . '.' . $primary . "', ";
127
+    // lecture des données du doublon "$doublons[$doublon_index[] = "
128
+    // Attention : boucle->doublons désigne une variable qu'on affecte
129
+    $debut_doub = '$doublons[' . (!$not ? '' : ($boucle->doublons . '[]= '));
130
+
131
+    // le debut complet du code des doublons
132
+    $debut_doub = $debut_in . $debut_doub;
133
+
134
+    // nom du doublon "('article' . 'nom')]"
135
+    $fin_doub = "($nom)]";
136
+
137
+    // si on trouve un autre critère doublon,
138
+    // on fusionne pour avoir un seul IN, et on s'en va !
139
+    foreach ($boucle->where as $k => $w) {
140
+        if (strpos($w[0], $debut_doub) === 0) {
141
+            // fusionner le sql_in (du where)
142
+            $boucle->where[$k][0] = $debut_doub . $fin_doub . ' . ' . substr($w[0], strlen($debut_in));
143
+            // fusionner l'initialisation (du hash) pour faire plus joli
144
+            $x = strpos($boucle->hash, $init_comment);
145
+            $len = strlen($init_comment);
146
+            $boucle->hash =
147
+                substr($boucle->hash, 0, $x + $len) . $init_code . substr($boucle->hash, $x + $len);
148
+
149
+            return;
150
+        }
151
+    }
152
+
153
+    // mettre l'ensemble dans un tableau pour que ce ne soit pas vu comme une constante
154
+    $boucle->where[] = [$debut_doub . $fin_doub . ", '" . $not . "')"];
155
+
156
+    // déclarer le doublon s'il n'existe pas encore
157
+    $boucle->hash .= $init_comment . $init_code;
158
+
159
+
160
+    # la ligne suivante avait l'intention d'eviter une collecte deja faite
161
+    # mais elle fait planter une boucle a 2 critere doublons:
162
+    # {!doublons A}{doublons B}
163
+    # (de http://article.gmane.org/gmane.comp.web.spip.devel/31034)
164
+    #	if ($crit->not) $boucle->doublons = "";
165 165
 }
166 166
 
167 167
 
@@ -182,14 +182,14 @@  discard block
 block discarded – undo
182 182
  * @return void
183 183
  **/
184 184
 function critere_lang_select_dist($idb, &$boucles, $crit) {
185
-	if (!isset($crit->param[1][0]) or !($param = $crit->param[1][0]->texte)) {
186
-		$param = 'oui';
187
-	}
188
-	if ($crit->not) {
189
-		$param = ($param == 'oui') ? 'non' : 'oui';
190
-	}
191
-	$boucle = &$boucles[$idb];
192
-	$boucle->lang_select = $param;
185
+    if (!isset($crit->param[1][0]) or !($param = $crit->param[1][0]->texte)) {
186
+        $param = 'oui';
187
+    }
188
+    if ($crit->not) {
189
+        $param = ($param == 'oui') ? 'non' : 'oui';
190
+    }
191
+    $boucle = &$boucles[$idb];
192
+    $boucle->lang_select = $param;
193 193
 }
194 194
 
195 195
 
@@ -211,18 +211,18 @@  discard block
 block discarded – undo
211 211
  * @return void
212 212
  **/
213 213
 function critere_debut_dist($idb, &$boucles, $crit) {
214
-	list($un, $deux) = $crit->param;
215
-	$un = $un[0]->texte;
216
-	$deux = $deux[0]->texte;
217
-	if ($deux) {
218
-		$boucles[$idb]->limit = 'intval($Pile[0]["debut' .
219
-			$un .
220
-			'"]) . ",' .
221
-			$deux .
222
-			'"';
223
-	} else {
224
-		calculer_critere_DEFAUT_dist($idb, $boucles, $crit);
225
-	}
214
+    list($un, $deux) = $crit->param;
215
+    $un = $un[0]->texte;
216
+    $deux = $deux[0]->texte;
217
+    if ($deux) {
218
+        $boucles[$idb]->limit = 'intval($Pile[0]["debut' .
219
+            $un .
220
+            '"]) . ",' .
221
+            $deux .
222
+            '"';
223
+    } else {
224
+        calculer_critere_DEFAUT_dist($idb, $boucles, $crit);
225
+    }
226 226
 }
227 227
 
228 228
 
@@ -256,58 +256,58 @@  discard block
 block discarded – undo
256 256
  **/
257 257
 function critere_pagination_dist($idb, &$boucles, $crit) {
258 258
 
259
-	$boucle = &$boucles[$idb];
260
-	// definition de la taille de la page
261
-	$pas = !isset($crit->param[0][0]) ? "''"
262
-		: calculer_liste([$crit->param[0][0]], $idb, $boucles, $boucle->id_parent);
263
-
264
-	if (!preg_match(_CODE_QUOTE, $pas, $r)) {
265
-		$pas = "((\$a = intval($pas)) ? \$a : 10)";
266
-	} else {
267
-		$r = intval($r[2]);
268
-		$pas = strval($r ? $r : 10);
269
-	}
270
-
271
-	// Calcul du nommage de la pagination si il existe.
272
-	// La nouvelle syntaxe {pagination 20, nom} est prise en compte et privilégiée mais on reste
273
-	// compatible avec l'ancienne car certains cas fonctionnent correctement
274
-	$type = "'$idb'";
275
-	// Calcul d'un nommage spécifique de la pagination si précisé.
276
-	// Syntaxe {pagination 20, nom}
277
-	if (isset($crit->param[0][1])) {
278
-		$type = calculer_liste([$crit->param[0][1]], $idb, $boucles, $boucle->id_parent);
279
-	} // Ancienne syntaxe {pagination 20 nom} pour compatibilité
280
-	elseif (isset($crit->param[1][0])) {
281
-		$type = calculer_liste([$crit->param[1][0]], $idb, $boucles, $boucle->id_parent);
282
-	}
283
-
284
-	$debut = ($type[0] !== "'") ? "'debut'.$type" : ("'debut" . substr($type, 1));
285
-	$boucle->modificateur['debut_nom'] = $type;
286
-	$partie =
287
-		// tester si le numero de page demande est de la forme '@yyy'
288
-		'isset($Pile[0][' . $debut . ']) ? $Pile[0][' . $debut . '] : _request(' . $debut . ");\n"
289
-		. "\tif(substr(\$debut_boucle,0,1)=='@'){\n"
290
-		. "\t\t" . '$debut_boucle = $Pile[0][' . $debut . '] = quete_debut_pagination(\'' . $boucle->primary . '\',$Pile[0][\'@' . $boucle->primary . '\'] = substr($debut_boucle,1),' . $pas . ',$iter);' . "\n"
291
-		. "\t\t" . '$iter->seek(0);' . "\n"
292
-		. "\t}\n"
293
-		. "\t" . '$debut_boucle = intval($debut_boucle)';
294
-
295
-	$boucle->hash .= '
259
+    $boucle = &$boucles[$idb];
260
+    // definition de la taille de la page
261
+    $pas = !isset($crit->param[0][0]) ? "''"
262
+        : calculer_liste([$crit->param[0][0]], $idb, $boucles, $boucle->id_parent);
263
+
264
+    if (!preg_match(_CODE_QUOTE, $pas, $r)) {
265
+        $pas = "((\$a = intval($pas)) ? \$a : 10)";
266
+    } else {
267
+        $r = intval($r[2]);
268
+        $pas = strval($r ? $r : 10);
269
+    }
270
+
271
+    // Calcul du nommage de la pagination si il existe.
272
+    // La nouvelle syntaxe {pagination 20, nom} est prise en compte et privilégiée mais on reste
273
+    // compatible avec l'ancienne car certains cas fonctionnent correctement
274
+    $type = "'$idb'";
275
+    // Calcul d'un nommage spécifique de la pagination si précisé.
276
+    // Syntaxe {pagination 20, nom}
277
+    if (isset($crit->param[0][1])) {
278
+        $type = calculer_liste([$crit->param[0][1]], $idb, $boucles, $boucle->id_parent);
279
+    } // Ancienne syntaxe {pagination 20 nom} pour compatibilité
280
+    elseif (isset($crit->param[1][0])) {
281
+        $type = calculer_liste([$crit->param[1][0]], $idb, $boucles, $boucle->id_parent);
282
+    }
283
+
284
+    $debut = ($type[0] !== "'") ? "'debut'.$type" : ("'debut" . substr($type, 1));
285
+    $boucle->modificateur['debut_nom'] = $type;
286
+    $partie =
287
+        // tester si le numero de page demande est de la forme '@yyy'
288
+        'isset($Pile[0][' . $debut . ']) ? $Pile[0][' . $debut . '] : _request(' . $debut . ");\n"
289
+        . "\tif(substr(\$debut_boucle,0,1)=='@'){\n"
290
+        . "\t\t" . '$debut_boucle = $Pile[0][' . $debut . '] = quete_debut_pagination(\'' . $boucle->primary . '\',$Pile[0][\'@' . $boucle->primary . '\'] = substr($debut_boucle,1),' . $pas . ',$iter);' . "\n"
291
+        . "\t\t" . '$iter->seek(0);' . "\n"
292
+        . "\t}\n"
293
+        . "\t" . '$debut_boucle = intval($debut_boucle)';
294
+
295
+    $boucle->hash .= '
296 296
 	$command[\'pagination\'] = array((isset($Pile[0][' . $debut . ']) ? $Pile[0][' . $debut . '] : null), ' . $pas . ');';
297 297
 
298
-	$boucle->total_parties = $pas;
299
-	calculer_parties($boucles, $idb, $partie, 'p+');
300
-	// ajouter la cle primaire dans le select pour pouvoir gerer la pagination referencee par @id
301
-	// sauf si pas de primaire, ou si primaire composee
302
-	// dans ce cas, on ne sait pas gerer une pagination indirecte
303
-	$t = $boucle->id_table . '.' . $boucle->primary;
304
-	if (
305
-		$boucle->primary
306
-		and !preg_match('/[,\s]/', $boucle->primary)
307
-		and !in_array($t, $boucle->select)
308
-	) {
309
-		$boucle->select[] = $t;
310
-	}
298
+    $boucle->total_parties = $pas;
299
+    calculer_parties($boucles, $idb, $partie, 'p+');
300
+    // ajouter la cle primaire dans le select pour pouvoir gerer la pagination referencee par @id
301
+    // sauf si pas de primaire, ou si primaire composee
302
+    // dans ce cas, on ne sait pas gerer une pagination indirecte
303
+    $t = $boucle->id_table . '.' . $boucle->primary;
304
+    if (
305
+        $boucle->primary
306
+        and !preg_match('/[,\s]/', $boucle->primary)
307
+        and !in_array($t, $boucle->select)
308
+    ) {
309
+        $boucle->select[] = $t;
310
+    }
311 311
 }
312 312
 
313 313
 
@@ -329,24 +329,24 @@  discard block
 block discarded – undo
329 329
  **/
330 330
 function critere_recherche_dist($idb, &$boucles, $crit) {
331 331
 
332
-	$boucle = &$boucles[$idb];
332
+    $boucle = &$boucles[$idb];
333 333
 
334
-	if (!$boucle->primary or strpos($boucle->primary, ',')) {
335
-		erreur_squelette(_T('zbug_critere_sur_table_sans_cle_primaire', ['critere' => 'recherche']), $boucle);
334
+    if (!$boucle->primary or strpos($boucle->primary, ',')) {
335
+        erreur_squelette(_T('zbug_critere_sur_table_sans_cle_primaire', ['critere' => 'recherche']), $boucle);
336 336
 
337
-		return;
338
-	}
337
+        return;
338
+    }
339 339
 
340
-	if (isset($crit->param[0])) {
341
-		$quoi = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
342
-	} else {
343
-		$quoi = '(isset($Pile[0]["recherche"])?$Pile[0]["recherche"]:(isset($GLOBALS["recherche"])?$GLOBALS["recherche"]:""))';
344
-	}
340
+    if (isset($crit->param[0])) {
341
+        $quoi = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
342
+    } else {
343
+        $quoi = '(isset($Pile[0]["recherche"])?$Pile[0]["recherche"]:(isset($GLOBALS["recherche"])?$GLOBALS["recherche"]:""))';
344
+    }
345 345
 
346
-	$_modificateur = var_export($boucle->modificateur, true);
347
-	$boucle->hash .= '
346
+    $_modificateur = var_export($boucle->modificateur, true);
347
+    $boucle->hash .= '
348 348
 	// RECHERCHE'
349
-		. ($crit->cond ? '
349
+        . ($crit->cond ? '
350 350
 	if (!strlen(' . $quoi . ')){
351 351
 		list($rech_select, $rech_where) = array("0 as points","");
352 352
 	} else' : '') . '
@@ -357,21 +357,21 @@  discard block
 block discarded – undo
357 357
 	';
358 358
 
359 359
 
360
-	$t = $boucle->id_table . '.' . $boucle->primary;
361
-	if (!in_array($t, $boucles[$idb]->select)) {
362
-		$boucle->select[] = $t;
363
-	} # pour postgres, neuneu ici
364
-	// jointure uniquement sur le serveur principal
365
-	// (on ne peut joindre une table d'un serveur distant avec la table des resultats du serveur principal)
366
-	if (!$boucle->sql_serveur) {
367
-		$boucle->join['resultats'] = ["'" . $boucle->id_table . "'", "'id'", "'" . $boucle->primary . "'"];
368
-		$boucle->from['resultats'] = 'spip_resultats';
369
-	}
370
-	$boucle->select[] = '$rech_select';
371
-	//$boucle->where[]= "\$rech_where?'resultats.id=".$boucle->id_table.".".$boucle->primary."':''";
372
-
373
-	// et la recherche trouve
374
-	$boucle->where[] = '$rech_where?$rech_where:\'\'';
360
+    $t = $boucle->id_table . '.' . $boucle->primary;
361
+    if (!in_array($t, $boucles[$idb]->select)) {
362
+        $boucle->select[] = $t;
363
+    } # pour postgres, neuneu ici
364
+    // jointure uniquement sur le serveur principal
365
+    // (on ne peut joindre une table d'un serveur distant avec la table des resultats du serveur principal)
366
+    if (!$boucle->sql_serveur) {
367
+        $boucle->join['resultats'] = ["'" . $boucle->id_table . "'", "'id'", "'" . $boucle->primary . "'"];
368
+        $boucle->from['resultats'] = 'spip_resultats';
369
+    }
370
+    $boucle->select[] = '$rech_select';
371
+    //$boucle->where[]= "\$rech_where?'resultats.id=".$boucle->id_table.".".$boucle->primary."':''";
372
+
373
+    // et la recherche trouve
374
+    $boucle->where[] = '$rech_where?$rech_where:\'\'';
375 375
 }
376 376
 
377 377
 /**
@@ -388,25 +388,25 @@  discard block
 block discarded – undo
388 388
  * @return void
389 389
  **/
390 390
 function critere_traduction_dist($idb, &$boucles, $crit) {
391
-	$boucle = &$boucles[$idb];
392
-	$prim = $boucle->primary;
393
-	$table = $boucle->id_table;
394
-	$arg = kwote(calculer_argument_precedent($idb, 'id_trad', $boucles));
395
-	$dprim = kwote(calculer_argument_precedent($idb, $prim, $boucles));
396
-	$boucle->where[] =
397
-		[
398
-			"'OR'",
399
-			[
400
-				"'AND'",
401
-				["'='", "'$table.id_trad'", 0],
402
-				["'='", "'$table.$prim'", $dprim]
403
-			],
404
-			[
405
-				"'AND'",
406
-				["'>'", "'$table.id_trad'", 0],
407
-				["'='", "'$table.id_trad'", $arg]
408
-			]
409
-		];
391
+    $boucle = &$boucles[$idb];
392
+    $prim = $boucle->primary;
393
+    $table = $boucle->id_table;
394
+    $arg = kwote(calculer_argument_precedent($idb, 'id_trad', $boucles));
395
+    $dprim = kwote(calculer_argument_precedent($idb, $prim, $boucles));
396
+    $boucle->where[] =
397
+        [
398
+            "'OR'",
399
+            [
400
+                "'AND'",
401
+                ["'='", "'$table.id_trad'", 0],
402
+                ["'='", "'$table.$prim'", $dprim]
403
+            ],
404
+            [
405
+                "'AND'",
406
+                ["'>'", "'$table.id_trad'", 0],
407
+                ["'='", "'$table.id_trad'", $arg]
408
+            ]
409
+        ];
410 410
 }
411 411
 
412 412
 
@@ -424,17 +424,17 @@  discard block
 block discarded – undo
424 424
  * @return void
425 425
  **/
426 426
 function critere_origine_traduction_dist($idb, &$boucles, $crit) {
427
-	$boucle = &$boucles[$idb];
428
-	$prim = $boucle->primary;
429
-	$table = $boucle->id_table;
430
-
431
-	$c =
432
-		[
433
-			"'OR'",
434
-			["'='", "'$table." . "id_trad'", "'$table.$prim'"],
435
-			["'='", "'$table.id_trad'", "'0'"]
436
-		];
437
-	$boucle->where[] = ($crit->not ? ["'NOT'", $c] : $c);
427
+    $boucle = &$boucles[$idb];
428
+    $prim = $boucle->primary;
429
+    $table = $boucle->id_table;
430
+
431
+    $c =
432
+        [
433
+            "'OR'",
434
+            ["'='", "'$table." . "id_trad'", "'$table.$prim'"],
435
+            ["'='", "'$table.id_trad'", "'0'"]
436
+        ];
437
+    $boucle->where[] = ($crit->not ? ["'NOT'", $c] : $c);
438 438
 }
439 439
 
440 440
 
@@ -451,19 +451,19 @@  discard block
 block discarded – undo
451 451
  **/
452 452
 function critere_meme_parent_dist($idb, &$boucles, $crit) {
453 453
 
454
-	$boucle = &$boucles[$idb];
455
-	$arg = kwote(calculer_argument_precedent($idb, 'id_parent', $boucles));
456
-	$id_parent = isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent']) ?
457
-		$GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] :
458
-		'id_parent';
459
-	$mparent = $boucle->id_table . '.' . $id_parent;
460
-
461
-	if ($boucle->type_requete == 'rubriques' or isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'])) {
462
-		$boucle->where[] = ["'='", "'$mparent'", $arg];
463
-	} // le cas FORUMS est gere dans le plugin forum, dans la fonction critere_FORUMS_meme_parent_dist()
464
-	else {
465
-		return (['zbug_critere_inconnu', ['critere' => $crit->op . ' ' . $boucle->type_requete]]);
466
-	}
454
+    $boucle = &$boucles[$idb];
455
+    $arg = kwote(calculer_argument_precedent($idb, 'id_parent', $boucles));
456
+    $id_parent = isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent']) ?
457
+        $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] :
458
+        'id_parent';
459
+    $mparent = $boucle->id_table . '.' . $id_parent;
460
+
461
+    if ($boucle->type_requete == 'rubriques' or isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'])) {
462
+        $boucle->where[] = ["'='", "'$mparent'", $arg];
463
+    } // le cas FORUMS est gere dans le plugin forum, dans la fonction critere_FORUMS_meme_parent_dist()
464
+    else {
465
+        return (['zbug_critere_inconnu', ['critere' => $crit->op . ' ' . $boucle->type_requete]]);
466
+    }
467 467
 }
468 468
 
469 469
 
@@ -494,37 +494,37 @@  discard block
 block discarded – undo
494 494
  **/
495 495
 function critere_branche_dist($idb, &$boucles, $crit) {
496 496
 
497
-	$not = $crit->not;
498
-	$boucle = &$boucles[$idb];
499
-	// prendre en priorite un identifiant en parametre {branche XX}
500
-	if (isset($crit->param[0])) {
501
-		$arg = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
502
-		// sinon on le prend chez une boucle parente
503
-	} else {
504
-		$arg = kwote(calculer_argument_precedent($idb, 'id_rubrique', $boucles), $boucle->sql_serveur, 'int NOT NULL');
505
-	}
506
-
507
-	//Trouver une jointure
508
-	$champ = 'id_rubrique';
509
-	$desc = $boucle->show;
510
-	//Seulement si necessaire
511
-	if (!array_key_exists($champ, $desc['field'])) {
512
-		$cle = trouver_jointure_champ($champ, $boucle);
513
-		$trouver_table = charger_fonction('trouver_table', 'base');
514
-		$desc = $trouver_table($boucle->from[$cle]);
515
-		if (count(trouver_champs_decomposes($champ, $desc)) > 1) {
516
-			$decompose = decompose_champ_id_objet($champ);
517
-			$champ = array_shift($decompose);
518
-			$boucle->where[] = ["'='", _q($cle . '.' . reset($decompose)), '"' . sql_quote(end($decompose)) . '"'];
519
-		}
520
-	} else {
521
-		$cle = $boucle->id_table;
522
-	}
523
-
524
-	$c = "sql_in('$cle" . ".$champ', calcul_branche_in($arg)"
525
-		. ($not ? ", 'NOT'" : '') . ')';
526
-	$boucle->where[] = !$crit->cond ? $c :
527
-		("($arg ? $c : " . ($not ? "'0=1'" : "'1=1'") . ')');
497
+    $not = $crit->not;
498
+    $boucle = &$boucles[$idb];
499
+    // prendre en priorite un identifiant en parametre {branche XX}
500
+    if (isset($crit->param[0])) {
501
+        $arg = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
502
+        // sinon on le prend chez une boucle parente
503
+    } else {
504
+        $arg = kwote(calculer_argument_precedent($idb, 'id_rubrique', $boucles), $boucle->sql_serveur, 'int NOT NULL');
505
+    }
506
+
507
+    //Trouver une jointure
508
+    $champ = 'id_rubrique';
509
+    $desc = $boucle->show;
510
+    //Seulement si necessaire
511
+    if (!array_key_exists($champ, $desc['field'])) {
512
+        $cle = trouver_jointure_champ($champ, $boucle);
513
+        $trouver_table = charger_fonction('trouver_table', 'base');
514
+        $desc = $trouver_table($boucle->from[$cle]);
515
+        if (count(trouver_champs_decomposes($champ, $desc)) > 1) {
516
+            $decompose = decompose_champ_id_objet($champ);
517
+            $champ = array_shift($decompose);
518
+            $boucle->where[] = ["'='", _q($cle . '.' . reset($decompose)), '"' . sql_quote(end($decompose)) . '"'];
519
+        }
520
+    } else {
521
+        $cle = $boucle->id_table;
522
+    }
523
+
524
+    $c = "sql_in('$cle" . ".$champ', calcul_branche_in($arg)"
525
+        . ($not ? ", 'NOT'" : '') . ')';
526
+    $boucle->where[] = !$crit->cond ? $c :
527
+        ("($arg ? $c : " . ($not ? "'0=1'" : "'1=1'") . ')');
528 528
 }
529 529
 
530 530
 /**
@@ -540,15 +540,15 @@  discard block
 block discarded – undo
540 540
  **/
541 541
 function critere_logo_dist($idb, &$boucles, $crit) {
542 542
 
543
-	$boucle = &$boucles[$idb];
544
-	$not = ($crit->not ? 'NOT' : '');
545
-	$serveur = $boucle->sql_serveur;
543
+    $boucle = &$boucles[$idb];
544
+    $not = ($crit->not ? 'NOT' : '');
545
+    $serveur = $boucle->sql_serveur;
546 546
 
547
-	$c = "sql_in('" .
548
-		$boucle->id_table . '.' . $boucle->primary
549
-		. "', lister_objets_avec_logos('" . $boucle->primary . "'), '$not', '$serveur')";
547
+    $c = "sql_in('" .
548
+        $boucle->id_table . '.' . $boucle->primary
549
+        . "', lister_objets_avec_logos('" . $boucle->primary . "'), '$not', '$serveur')";
550 550
 
551
-	$boucle->where[] = $c;
551
+    $boucle->where[] = $c;
552 552
 }
553 553
 
554 554
 
@@ -570,31 +570,31 @@  discard block
 block discarded – undo
570 570
  * @return void
571 571
  **/
572 572
 function critere_fusion_dist($idb, &$boucles, $crit) {
573
-	if ($t = isset($crit->param[0])) {
574
-		$t = $crit->param[0];
575
-		if ($t[0]->type == 'texte') {
576
-			$t = $t[0]->texte;
577
-			if (preg_match('/^(.*)\.(.*)$/', $t, $r)) {
578
-				$t = table_objet_sql($r[1]);
579
-				$t = array_search($t, $boucles[$idb]->from);
580
-				if ($t) {
581
-					$t .= '.' . $r[2];
582
-				}
583
-			}
584
-		} else {
585
-			$t = '".'
586
-				. calculer_critere_arg_dynamique($idb, $boucles, $t)
587
-				. '."';
588
-		}
589
-	}
590
-	if ($t) {
591
-		$boucles[$idb]->group[] = $t;
592
-		if (!in_array($t, $boucles[$idb]->select)) {
593
-			$boucles[$idb]->select[] = $t;
594
-		}
595
-	} else {
596
-		return (['zbug_critere_inconnu', ['critere' => $crit->op . ' ?']]);
597
-	}
573
+    if ($t = isset($crit->param[0])) {
574
+        $t = $crit->param[0];
575
+        if ($t[0]->type == 'texte') {
576
+            $t = $t[0]->texte;
577
+            if (preg_match('/^(.*)\.(.*)$/', $t, $r)) {
578
+                $t = table_objet_sql($r[1]);
579
+                $t = array_search($t, $boucles[$idb]->from);
580
+                if ($t) {
581
+                    $t .= '.' . $r[2];
582
+                }
583
+            }
584
+        } else {
585
+            $t = '".'
586
+                . calculer_critere_arg_dynamique($idb, $boucles, $t)
587
+                . '."';
588
+        }
589
+    }
590
+    if ($t) {
591
+        $boucles[$idb]->group[] = $t;
592
+        if (!in_array($t, $boucles[$idb]->select)) {
593
+            $boucles[$idb]->select[] = $t;
594
+        }
595
+    } else {
596
+        return (['zbug_critere_inconnu', ['critere' => $crit->op . ' ?']]);
597
+    }
598 598
 }
599 599
 
600 600
 /**
@@ -614,7 +614,7 @@  discard block
 block discarded – undo
614 614
  * @return void
615 615
  **/
616 616
 function critere_fusion_supprimer_dist($idb, &$boucles, $crit) {
617
-	$boucles[$idb]->group = [];
617
+    $boucles[$idb]->group = [];
618 618
 }
619 619
 
620 620
 /**
@@ -651,45 +651,45 @@  discard block
 block discarded – undo
651 651
  * @param Critere $crit Paramètres du critère dans cette boucle
652 652
  */
653 653
 function critere_collecte_dist($idb, &$boucles, $crit) {
654
-	if (isset($crit->param[0])) {
655
-		$_coll = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
656
-		$boucle = $boucles[$idb];
657
-		$boucle->modificateur['collate'] = "($_coll ?' COLLATE '.$_coll:'')";
658
-		$n = count($boucle->order);
659
-		if ($n && (strpos($boucle->order[$n - 1], 'COLLATE') === false)) {
660
-			// l'instruction COLLATE doit être placée avant ASC ou DESC
661
-			// notamment lors de l'utilisation `{!par xxx}{collate yyy}`
662
-			if (
663
-				(false !== $i = strpos($boucle->order[$n - 1], 'ASC'))
664
-				or (false !== $i = strpos($boucle->order[$n - 1], 'DESC'))
665
-			) {
666
-				$boucle->order[$n - 1] = substr_replace($boucle->order[$n - 1], "' . " . $boucle->modificateur['collate'] . " . ' ", $i, 0);
667
-			} else {
668
-				$boucle->order[$n - 1] .= ' . ' . $boucle->modificateur['collate'];
669
-			}
670
-		}
671
-	} else {
672
-		return (['zbug_critere_inconnu', ['critere' => $crit->op . ' ' . count($boucles[$idb]->order)]]);
673
-	}
654
+    if (isset($crit->param[0])) {
655
+        $_coll = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
656
+        $boucle = $boucles[$idb];
657
+        $boucle->modificateur['collate'] = "($_coll ?' COLLATE '.$_coll:'')";
658
+        $n = count($boucle->order);
659
+        if ($n && (strpos($boucle->order[$n - 1], 'COLLATE') === false)) {
660
+            // l'instruction COLLATE doit être placée avant ASC ou DESC
661
+            // notamment lors de l'utilisation `{!par xxx}{collate yyy}`
662
+            if (
663
+                (false !== $i = strpos($boucle->order[$n - 1], 'ASC'))
664
+                or (false !== $i = strpos($boucle->order[$n - 1], 'DESC'))
665
+            ) {
666
+                $boucle->order[$n - 1] = substr_replace($boucle->order[$n - 1], "' . " . $boucle->modificateur['collate'] . " . ' ", $i, 0);
667
+            } else {
668
+                $boucle->order[$n - 1] .= ' . ' . $boucle->modificateur['collate'];
669
+            }
670
+        }
671
+    } else {
672
+        return (['zbug_critere_inconnu', ['critere' => $crit->op . ' ' . count($boucles[$idb]->order)]]);
673
+    }
674 674
 }
675 675
 
676 676
 // https://code.spip.net/@calculer_critere_arg_dynamique
677 677
 function calculer_critere_arg_dynamique($idb, &$boucles, $crit, $suffix = '') {
678
-	$boucle = $boucles[$idb];
679
-	$alt = "('" . $boucle->id_table . '.\' . $x' . $suffix . ')';
680
-	$var = '$champs_' . $idb;
681
-	$desc = (strpos($boucle->in, "static $var =") !== false);
682
-	if (!$desc) {
683
-		$desc = $boucle->show['field'];
684
-		$desc = implode(',', array_map('_q', array_keys($desc)));
685
-		$boucles[$idb]->in .= "\n\tstatic $var = array(" . $desc . ');';
686
-	}
687
-	if ($desc) {
688
-		$alt = "(in_array(\$x, $var)  ? $alt :(\$x$suffix))";
689
-	}
690
-	$arg = calculer_liste($crit, $idb, $boucles, $boucle->id_parent);
691
-
692
-	return "((\$x = preg_replace(\"/\\W/\",'', $arg)) ? $alt : '')";
678
+    $boucle = $boucles[$idb];
679
+    $alt = "('" . $boucle->id_table . '.\' . $x' . $suffix . ')';
680
+    $var = '$champs_' . $idb;
681
+    $desc = (strpos($boucle->in, "static $var =") !== false);
682
+    if (!$desc) {
683
+        $desc = $boucle->show['field'];
684
+        $desc = implode(',', array_map('_q', array_keys($desc)));
685
+        $boucles[$idb]->in .= "\n\tstatic $var = array(" . $desc . ');';
686
+    }
687
+    if ($desc) {
688
+        $alt = "(in_array(\$x, $var)  ? $alt :(\$x$suffix))";
689
+    }
690
+    $arg = calculer_liste($crit, $idb, $boucles, $boucle->id_parent);
691
+
692
+    return "((\$x = preg_replace(\"/\\W/\",'', $arg)) ? $alt : '')";
693 693
 }
694 694
 
695 695
 /**
@@ -728,7 +728,7 @@  discard block
 block discarded – undo
728 728
  * @param Critere $crit Paramètres du critère dans cette boucle
729 729
  */
730 730
 function critere_par_dist($idb, &$boucles, $crit) {
731
-	return critere_parinverse($idb, $boucles, $crit);
731
+    return critere_parinverse($idb, $boucles, $crit);
732 732
 }
733 733
 
734 734
 /**
@@ -750,93 +750,93 @@  discard block
 block discarded – undo
750 750
  * @param Critere $crit Paramètres du critère dans cette boucle
751 751
  */
752 752
 function critere_parinverse($idb, &$boucles, $crit) {
753
-	$boucle = &$boucles[$idb];
754
-
755
-	$sens = $collecte = '';
756
-	if ($crit->not) {
757
-		$sens = " . ' DESC'";
758
-	}
759
-	if (isset($boucle->modificateur['collate'])) {
760
-		$collecte = ' . ' . $boucle->modificateur['collate'];
761
-	}
762
-
763
-	// Pour chaque paramètre du critère
764
-	foreach ($crit->param as $tri) {
765
-		$order = $fct = '';
766
-		// tris specifiés dynamiquement {par #ENV{tri}}
767
-		if ($tri[0]->type != 'texte') {
768
-			// calculer le order dynamique qui verifie les champs
769
-			$order = calculer_critere_arg_dynamique($idb, $boucles, $tri, $sens);
770
-			// ajouter 'hasard' comme possibilité de tri dynamique
771
-			calculer_critere_par_hasard($idb, $boucles, $crit);
772
-		}
773
-		// tris textuels {par titre}
774
-		else {
775
-			$par = array_shift($tri);
776
-			$par = $par->texte;
777
-
778
-			// tris de la forme {par expression champ} tel que {par num titre} ou {par multi titre}
779
-			if (preg_match(',^(\w+)[\s]+(.*)$,', $par, $m)) {
780
-				$expression = trim($m[1]);
781
-				$champ = trim($m[2]);
782
-				if (function_exists($f = 'calculer_critere_par_expression_' . $expression)) {
783
-					$order = $f($idb, $boucles, $crit, $tri, $champ);
784
-				} else {
785
-					return ['zbug_critere_inconnu', ['critere' => $crit->op . " $par"]];
786
-				}
787
-
788
-			// tris de la forme {par champ} ou {par FONCTION(champ)}
789
-			} elseif (preg_match(',^' . CHAMP_SQL_PLUS_FONC . '$,is', $par, $match)) {
790
-				// {par FONCTION(champ)}
791
-				if (count($match) > 2) {
792
-					$par = substr($match[2], 1, -1);
793
-					$fct = $match[1];
794
-				}
795
-				// quelques cas spécifiques {par hasard}, {par date}
796
-				if ($par == 'hasard') {
797
-					$order = calculer_critere_par_hasard($idb, $boucles, $crit);
798
-				} elseif ($par == 'date' and !empty($boucle->show['date'])) {
799
-					$order = "'" . $boucle->id_table . '.' . $boucle->show['date'] . "'";
800
-				} else {
801
-					// cas général {par champ}, {par table.champ}, ...
802
-					$order = calculer_critere_par_champ($idb, $boucles, $crit, $par);
803
-				}
804
-			}
805
-
806
-			// on ne sait pas traiter…
807
-			else {
808
-				return ['zbug_critere_inconnu', ['critere' => $crit->op . " $par"]];
809
-			}
810
-
811
-			// En cas d'erreur de squelette retournée par une fonction
812
-			if (is_array($order)) {
813
-				return $order;
814
-			}
815
-		}
816
-
817
-		if (preg_match('/^\'([^"]*)\'$/', $order, $m)) {
818
-			$t = $m[1];
819
-			if (strpos($t, '.') and !in_array($t, $boucle->select)) {
820
-				$boucle->select[] = $t;
821
-			}
822
-		} else {
823
-			$sens = '';
824
-		}
825
-
826
-		if ($fct) {
827
-			if (preg_match("/^\s*'(.*)'\s*$/", $order, $r)) {
828
-				$order = "'$fct(" . $r[1] . ")'";
829
-			} else {
830
-				$order = "'$fct(' . $order . ')'";
831
-			}
832
-		}
833
-		$t = $order . $collecte . $sens;
834
-		if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
835
-			$t = $r[1] . $r[2];
836
-		}
837
-
838
-		$boucle->order[] = $t;
839
-	}
753
+    $boucle = &$boucles[$idb];
754
+
755
+    $sens = $collecte = '';
756
+    if ($crit->not) {
757
+        $sens = " . ' DESC'";
758
+    }
759
+    if (isset($boucle->modificateur['collate'])) {
760
+        $collecte = ' . ' . $boucle->modificateur['collate'];
761
+    }
762
+
763
+    // Pour chaque paramètre du critère
764
+    foreach ($crit->param as $tri) {
765
+        $order = $fct = '';
766
+        // tris specifiés dynamiquement {par #ENV{tri}}
767
+        if ($tri[0]->type != 'texte') {
768
+            // calculer le order dynamique qui verifie les champs
769
+            $order = calculer_critere_arg_dynamique($idb, $boucles, $tri, $sens);
770
+            // ajouter 'hasard' comme possibilité de tri dynamique
771
+            calculer_critere_par_hasard($idb, $boucles, $crit);
772
+        }
773
+        // tris textuels {par titre}
774
+        else {
775
+            $par = array_shift($tri);
776
+            $par = $par->texte;
777
+
778
+            // tris de la forme {par expression champ} tel que {par num titre} ou {par multi titre}
779
+            if (preg_match(',^(\w+)[\s]+(.*)$,', $par, $m)) {
780
+                $expression = trim($m[1]);
781
+                $champ = trim($m[2]);
782
+                if (function_exists($f = 'calculer_critere_par_expression_' . $expression)) {
783
+                    $order = $f($idb, $boucles, $crit, $tri, $champ);
784
+                } else {
785
+                    return ['zbug_critere_inconnu', ['critere' => $crit->op . " $par"]];
786
+                }
787
+
788
+            // tris de la forme {par champ} ou {par FONCTION(champ)}
789
+            } elseif (preg_match(',^' . CHAMP_SQL_PLUS_FONC . '$,is', $par, $match)) {
790
+                // {par FONCTION(champ)}
791
+                if (count($match) > 2) {
792
+                    $par = substr($match[2], 1, -1);
793
+                    $fct = $match[1];
794
+                }
795
+                // quelques cas spécifiques {par hasard}, {par date}
796
+                if ($par == 'hasard') {
797
+                    $order = calculer_critere_par_hasard($idb, $boucles, $crit);
798
+                } elseif ($par == 'date' and !empty($boucle->show['date'])) {
799
+                    $order = "'" . $boucle->id_table . '.' . $boucle->show['date'] . "'";
800
+                } else {
801
+                    // cas général {par champ}, {par table.champ}, ...
802
+                    $order = calculer_critere_par_champ($idb, $boucles, $crit, $par);
803
+                }
804
+            }
805
+
806
+            // on ne sait pas traiter…
807
+            else {
808
+                return ['zbug_critere_inconnu', ['critere' => $crit->op . " $par"]];
809
+            }
810
+
811
+            // En cas d'erreur de squelette retournée par une fonction
812
+            if (is_array($order)) {
813
+                return $order;
814
+            }
815
+        }
816
+
817
+        if (preg_match('/^\'([^"]*)\'$/', $order, $m)) {
818
+            $t = $m[1];
819
+            if (strpos($t, '.') and !in_array($t, $boucle->select)) {
820
+                $boucle->select[] = $t;
821
+            }
822
+        } else {
823
+            $sens = '';
824
+        }
825
+
826
+        if ($fct) {
827
+            if (preg_match("/^\s*'(.*)'\s*$/", $order, $r)) {
828
+                $order = "'$fct(" . $r[1] . ")'";
829
+            } else {
830
+                $order = "'$fct(' . $order . ')'";
831
+            }
832
+        }
833
+        $t = $order . $collecte . $sens;
834
+        if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
835
+            $t = $r[1] . $r[2];
836
+        }
837
+
838
+        $boucle->order[] = $t;
839
+    }
840 840
 }
841 841
 
842 842
 /**
@@ -850,13 +850,13 @@  discard block
 block discarded – undo
850 850
  * @return string Clause pour le Order by
851 851
  */
852 852
 function calculer_critere_par_hasard($idb, &$boucles, $crit) {
853
-	$boucle = &$boucles[$idb];
854
-	// Si ce n'est fait, ajouter un champ 'hasard' dans le select
855
-	$parha = 'rand() AS hasard';
856
-	if (!in_array($parha, $boucle->select)) {
857
-		$boucle->select[] = $parha;
858
-	}
859
-	return "'hasard'";
853
+    $boucle = &$boucles[$idb];
854
+    // Si ce n'est fait, ajouter un champ 'hasard' dans le select
855
+    $parha = 'rand() AS hasard';
856
+    if (!in_array($parha, $boucle->select)) {
857
+        $boucle->select[] = $parha;
858
+    }
859
+    return "'hasard'";
860 860
 }
861 861
 
862 862
 /**
@@ -880,24 +880,24 @@  discard block
 block discarded – undo
880 880
  * @return string Clause pour le Order by
881 881
  */
882 882
 function calculer_critere_par_expression_num($idb, &$boucles, $crit, $tri, $champ) {
883
-	$_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
884
-	if (is_array($_champ)) {
885
-		return ['zbug_critere_inconnu', ['critere' => $crit->op . " num $champ"]];
886
-	}
887
-	$boucle = &$boucles[$idb];
888
-	$texte = '0+' . $_champ;
889
-	$suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent);
890
-	if ($suite !== "''") {
891
-		$texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . ' . "';
892
-	}
893
-	$asnum = 'num' . ($boucle->order ? count($boucle->order) : '');
894
-	$boucle->select[] = $texte . " AS $asnum";
895
-
896
-	$orderassinum = calculer_critere_par_expression_sinum($idb, $boucles, $crit, $tri, $champ);
897
-	$orderassinum = trim($orderassinum, "'");
898
-
899
-	$order = "'$orderassinum, $asnum'";
900
-	return $order;
883
+    $_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
884
+    if (is_array($_champ)) {
885
+        return ['zbug_critere_inconnu', ['critere' => $crit->op . " num $champ"]];
886
+    }
887
+    $boucle = &$boucles[$idb];
888
+    $texte = '0+' . $_champ;
889
+    $suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent);
890
+    if ($suite !== "''") {
891
+        $texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . ' . "';
892
+    }
893
+    $asnum = 'num' . ($boucle->order ? count($boucle->order) : '');
894
+    $boucle->select[] = $texte . " AS $asnum";
895
+
896
+    $orderassinum = calculer_critere_par_expression_sinum($idb, $boucles, $crit, $tri, $champ);
897
+    $orderassinum = trim($orderassinum, "'");
898
+
899
+    $order = "'$orderassinum, $asnum'";
900
+    return $order;
901 901
 }
902 902
 
903 903
 /**
@@ -918,35 +918,35 @@  discard block
 block discarded – undo
918 918
  * @return string Clause pour le Order by
919 919
  */
920 920
 function calculer_critere_par_expression_sinum($idb, &$boucles, $crit, $tri, $champ) {
921
-	$_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
922
-	if (is_array($_champ)) {
923
-		return ['zbug_critere_inconnu', ['critere' => $crit->op . " sinum $champ"]];
924
-	}
925
-	$boucle = &$boucles[$idb];
926
-	$texte = '0+' . $_champ;
927
-	$suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent);
928
-	if ($suite !== "''") {
929
-		$texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . ' . "';
930
-	}
931
-
932
-	$as = false;
933
-	$select = "CASE ( $texte ) WHEN 0 THEN 1 ELSE 0 END AS ";
934
-	foreach ($boucle->select as $s) {
935
-		if (strpos($s, $select) === 0) {
936
-			$as = trim(substr($s, strlen($select)));
937
-			if (!preg_match(',\W,', $as)) {
938
-				break;
939
-			}
940
-			$as = false;
941
-		}
942
-	}
943
-
944
-	if (!$as) {
945
-		$as = 'sinum' . ($boucle->order ? count($boucle->order) : '');
946
-		$boucle->select[] = $select . $as;
947
-	}
948
-	$order = "'$as'";
949
-	return $order;
921
+    $_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
922
+    if (is_array($_champ)) {
923
+        return ['zbug_critere_inconnu', ['critere' => $crit->op . " sinum $champ"]];
924
+    }
925
+    $boucle = &$boucles[$idb];
926
+    $texte = '0+' . $_champ;
927
+    $suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent);
928
+    if ($suite !== "''") {
929
+        $texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . ' . "';
930
+    }
931
+
932
+    $as = false;
933
+    $select = "CASE ( $texte ) WHEN 0 THEN 1 ELSE 0 END AS ";
934
+    foreach ($boucle->select as $s) {
935
+        if (strpos($s, $select) === 0) {
936
+            $as = trim(substr($s, strlen($select)));
937
+            if (!preg_match(',\W,', $as)) {
938
+                break;
939
+            }
940
+            $as = false;
941
+        }
942
+    }
943
+
944
+    if (!$as) {
945
+        $as = 'sinum' . ($boucle->order ? count($boucle->order) : '');
946
+        $boucle->select[] = $select . $as;
947
+    }
948
+    $order = "'$as'";
949
+    return $order;
950 950
 }
951 951
 
952 952
 
@@ -966,14 +966,14 @@  discard block
 block discarded – undo
966 966
  * @return string Clause pour le Order by
967 967
  */
968 968
 function calculer_critere_par_expression_multi($idb, &$boucles, $crit, $tri, $champ) {
969
-	$_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
970
-	if (is_array($_champ)) {
971
-		return ['zbug_critere_inconnu', ['critere' => $crit->op . " multi $champ"]];
972
-	}
973
-	$boucle = &$boucles[$idb];
974
-	$boucle->select[] = "\".sql_multi('" . $_champ . "', \$GLOBALS['spip_lang']).\"";
975
-	$order = "'multi'";
976
-	return $order;
969
+    $_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
970
+    if (is_array($_champ)) {
971
+        return ['zbug_critere_inconnu', ['critere' => $crit->op . " multi $champ"]];
972
+    }
973
+    $boucle = &$boucles[$idb];
974
+    $boucle->select[] = "\".sql_multi('" . $_champ . "', \$GLOBALS['spip_lang']).\"";
975
+    $order = "'multi'";
976
+    return $order;
977 977
 }
978 978
 
979 979
 /**
@@ -992,56 +992,56 @@  discard block
 block discarded – undo
992 992
  * @return array|string
993 993
  */
994 994
 function calculer_critere_par_champ($idb, &$boucles, $crit, $par, $raw = false) {
995
-	$boucle = &$boucles[$idb];
996
-	$desc = $boucle->show;
997
-
998
-	// le champ existe dans la table, pas de souci (le plus commun)
999
-	if (isset($desc['field'][$par])) {
1000
-		$par = $boucle->id_table . '.' . $par;
1001
-	}
1002
-	// le champ est peut être une jointure
1003
-	else {
1004
-		$table = $table_alias = false; // toutes les tables de jointure possibles
1005
-		$champ = $par;
1006
-
1007
-		// le champ demandé est une exception de jointure {par titre_mot}
1008
-		if (isset($GLOBALS['exceptions_des_jointures'][$par])) {
1009
-			list($table, $champ) = $GLOBALS['exceptions_des_jointures'][$par];
1010
-		} // la table de jointure est explicitement indiquée {par truc.muche}
1011
-		elseif (preg_match('/^([^,]*)\.(.*)$/', $par, $r)) {
1012
-			list(, $table, $champ) = $r;
1013
-			$table_alias = $table; // c'est peut-être un alias de table {par L1.titre}
1014
-			$table = table_objet_sql($table);
1015
-		}
1016
-
1017
-		// Si on connait la table d'arrivée, on la demande donc explicitement
1018
-		// Sinon on cherche le champ dans les tables possibles de jointures
1019
-		// Si la table est déjà dans le from, on la réutilise.
1020
-		if ($infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $table)) {
1021
-			$par = $infos['alias'] . '.' . $champ;
1022
-		} elseif (
1023
-			$boucle->jointures_explicites
1024
-			and $alias = trouver_jointure_champ($champ, $boucle, explode(' ', $boucle->jointures_explicites), false, $table)
1025
-		) {
1026
-			$par = $alias . '.' . $champ;
1027
-		} elseif ($alias = trouver_jointure_champ($champ, $boucle, $boucle->jointures, false, $table)) {
1028
-			$par = $alias . '.' . $champ;
1029
-		// en spécifiant directement l'alias {par L2.titre} (situation hasardeuse tout de même)
1030
-		} elseif (
1031
-			$table_alias
1032
-			and isset($boucle->from[$table_alias])
1033
-			and $infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $boucle->from[$table_alias])
1034
-		) {
1035
-			$par = $infos['alias'] . '.' . $champ;
1036
-		} elseif ($table) {
1037
-			// On avait table + champ, mais on ne les a pas trouvés
1038
-			return ['zbug_critere_inconnu', ['critere' => $crit->op . " $par"]];
1039
-		} else {
1040
-			// Sinon tant pis, ca doit etre un champ synthetise (cf points)
1041
-		}
1042
-	}
1043
-
1044
-	return $raw ? $par : "'$par'";
995
+    $boucle = &$boucles[$idb];
996
+    $desc = $boucle->show;
997
+
998
+    // le champ existe dans la table, pas de souci (le plus commun)
999
+    if (isset($desc['field'][$par])) {
1000
+        $par = $boucle->id_table . '.' . $par;
1001
+    }
1002
+    // le champ est peut être une jointure
1003
+    else {
1004
+        $table = $table_alias = false; // toutes les tables de jointure possibles
1005
+        $champ = $par;
1006
+
1007
+        // le champ demandé est une exception de jointure {par titre_mot}
1008
+        if (isset($GLOBALS['exceptions_des_jointures'][$par])) {
1009
+            list($table, $champ) = $GLOBALS['exceptions_des_jointures'][$par];
1010
+        } // la table de jointure est explicitement indiquée {par truc.muche}
1011
+        elseif (preg_match('/^([^,]*)\.(.*)$/', $par, $r)) {
1012
+            list(, $table, $champ) = $r;
1013
+            $table_alias = $table; // c'est peut-être un alias de table {par L1.titre}
1014
+            $table = table_objet_sql($table);
1015
+        }
1016
+
1017
+        // Si on connait la table d'arrivée, on la demande donc explicitement
1018
+        // Sinon on cherche le champ dans les tables possibles de jointures
1019
+        // Si la table est déjà dans le from, on la réutilise.
1020
+        if ($infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $table)) {
1021
+            $par = $infos['alias'] . '.' . $champ;
1022
+        } elseif (
1023
+            $boucle->jointures_explicites
1024
+            and $alias = trouver_jointure_champ($champ, $boucle, explode(' ', $boucle->jointures_explicites), false, $table)
1025
+        ) {
1026
+            $par = $alias . '.' . $champ;
1027
+        } elseif ($alias = trouver_jointure_champ($champ, $boucle, $boucle->jointures, false, $table)) {
1028
+            $par = $alias . '.' . $champ;
1029
+        // en spécifiant directement l'alias {par L2.titre} (situation hasardeuse tout de même)
1030
+        } elseif (
1031
+            $table_alias
1032
+            and isset($boucle->from[$table_alias])
1033
+            and $infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $boucle->from[$table_alias])
1034
+        ) {
1035
+            $par = $infos['alias'] . '.' . $champ;
1036
+        } elseif ($table) {
1037
+            // On avait table + champ, mais on ne les a pas trouvés
1038
+            return ['zbug_critere_inconnu', ['critere' => $crit->op . " $par"]];
1039
+        } else {
1040
+            // Sinon tant pis, ca doit etre un champ synthetise (cf points)
1041
+        }
1042
+    }
1043
+
1044
+    return $raw ? $par : "'$par'";
1045 1045
 }
1046 1046
 
1047 1047
 /**
@@ -1055,11 +1055,11 @@  discard block
 block discarded – undo
1055 1055
  * @return string Champ pour le compilateur si trouvé, tel que "'alias.champ'", sinon vide.
1056 1056
  */
1057 1057
 function critere_par_joint($table, $champ, &$boucle) {
1058
-	$t = array_search($table, $boucle->from);
1059
-	if (!$t) {
1060
-		$t = trouver_jointure_champ($champ, $boucle);
1061
-	}
1062
-	return !$t ? '' : ("'" . $t . '.' . $champ . "'");
1058
+    $t = array_search($table, $boucle->from);
1059
+    if (!$t) {
1060
+        $t = trouver_jointure_champ($champ, $boucle);
1061
+    }
1062
+    return !$t ? '' : ("'" . $t . '.' . $champ . "'");
1063 1063
 }
1064 1064
 
1065 1065
 /**
@@ -1084,33 +1084,33 @@  discard block
 block discarded – undo
1084 1084
  */
1085 1085
 function critere_inverse_dist($idb, &$boucles, $crit) {
1086 1086
 
1087
-	$boucle = &$boucles[$idb];
1088
-	// Classement par ordre inverse
1089
-	if ($crit->not) {
1090
-		critere_parinverse($idb, $boucles, $crit);
1091
-	} else {
1092
-		$order = "' DESC'";
1093
-		// Classement par ordre inverse fonction eventuelle de #ENV{...}
1094
-		if (isset($crit->param[0])) {
1095
-			$critere = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
1096
-			$order = "(($critere)?' DESC':'')";
1097
-		}
1098
-
1099
-		$n = count($boucle->order);
1100
-		if (!$n) {
1101
-			if (isset($boucle->default_order[0])) {
1102
-				$boucle->default_order[0] .= ' . " DESC"';
1103
-			} else {
1104
-				$boucle->default_order[] = ' DESC';
1105
-			}
1106
-		} else {
1107
-			$t = $boucle->order[$n - 1] . " . $order";
1108
-			if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
1109
-				$t = $r[1] . $r[2];
1110
-			}
1111
-			$boucle->order[$n - 1] = $t;
1112
-		}
1113
-	}
1087
+    $boucle = &$boucles[$idb];
1088
+    // Classement par ordre inverse
1089
+    if ($crit->not) {
1090
+        critere_parinverse($idb, $boucles, $crit);
1091
+    } else {
1092
+        $order = "' DESC'";
1093
+        // Classement par ordre inverse fonction eventuelle de #ENV{...}
1094
+        if (isset($crit->param[0])) {
1095
+            $critere = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
1096
+            $order = "(($critere)?' DESC':'')";
1097
+        }
1098
+
1099
+        $n = count($boucle->order);
1100
+        if (!$n) {
1101
+            if (isset($boucle->default_order[0])) {
1102
+                $boucle->default_order[0] .= ' . " DESC"';
1103
+            } else {
1104
+                $boucle->default_order[] = ' DESC';
1105
+            }
1106
+        } else {
1107
+            $t = $boucle->order[$n - 1] . " . $order";
1108
+            if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
1109
+                $t = $r[1] . $r[2];
1110
+            }
1111
+            $boucle->order[$n - 1] = $t;
1112
+        }
1113
+    }
1114 1114
 }
1115 1115
 
1116 1116
 /**
@@ -1121,138 +1121,138 @@  discard block
 block discarded – undo
1121 1121
  * @return array|string
1122 1122
  */
1123 1123
 function critere_par_ordre_liste_dist($idb, &$boucles, $crit) {
1124
-	$boucle = &$boucles[$idb];
1124
+    $boucle = &$boucles[$idb];
1125 1125
 
1126
-	$sens = $collecte = '';
1127
-	if ($crit->not) {
1128
-		$sens = " . ' DESC'";
1129
-	}
1126
+    $sens = $collecte = '';
1127
+    if ($crit->not) {
1128
+        $sens = " . ' DESC'";
1129
+    }
1130 1130
 
1131
-	$crit2 = clone $crit;
1132
-	$crit2->not = false;
1133
-	$crit2->param = [reset($crit->param)];
1134
-	$res = critere_parinverse($idb, $boucles, $crit2);
1131
+    $crit2 = clone $crit;
1132
+    $crit2->not = false;
1133
+    $crit2->param = [reset($crit->param)];
1134
+    $res = critere_parinverse($idb, $boucles, $crit2);
1135 1135
 
1136
-	// erreur ?
1137
-	if (is_array($res)) {
1138
-		return $res;
1139
-	}
1136
+    // erreur ?
1137
+    if (is_array($res)) {
1138
+        return $res;
1139
+    }
1140 1140
 
1141
-	$_order = array_pop($boucle->order);
1141
+    $_order = array_pop($boucle->order);
1142 1142
 
1143
-	$_liste = calculer_liste($crit->param[1], [], $boucles, $boucles[$idb]->id_parent);
1144
-	$boucle->order[] = "'FIELD(' . $_order . ',' . ((\$zl=formate_liste_critere_par_ordre_liste($_liste,'" . $boucle->sql_serveur . "')) ? \$zl : '0').')'$sens";
1143
+    $_liste = calculer_liste($crit->param[1], [], $boucles, $boucles[$idb]->id_parent);
1144
+    $boucle->order[] = "'FIELD(' . $_order . ',' . ((\$zl=formate_liste_critere_par_ordre_liste($_liste,'" . $boucle->sql_serveur . "')) ? \$zl : '0').')'$sens";
1145 1145
 }
1146 1146
 
1147 1147
 
1148 1148
 // https://code.spip.net/@critere_agenda_dist
1149 1149
 function critere_agenda_dist($idb, &$boucles, $crit) {
1150
-	$params = $crit->param;
1151
-
1152
-	if (count($params) < 1) {
1153
-		return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ?']];
1154
-	}
1155
-
1156
-	$boucle = &$boucles[$idb];
1157
-	$parent = $boucle->id_parent;
1158
-	$fields = $boucle->show['field'];
1159
-
1160
-	$date = array_shift($params);
1161
-	$type = array_shift($params);
1162
-
1163
-	// la valeur $type doit etre connue a la compilation
1164
-	// donc etre forcement reduite a un litteral unique dans le source
1165
-	$type = is_object($type[0]) ? $type[0]->texte : null;
1166
-
1167
-	// La valeur date doit designer un champ de la table SQL.
1168
-	// Si c'est un litteral unique dans le source, verifier a la compil,
1169
-	// sinon synthetiser le test de verif pour execution ulterieure
1170
-	// On prendra arbitrairement le premier champ si test negatif.
1171
-	if ((count($date) == 1) and ($date[0]->type == 'texte')) {
1172
-		$date = $date[0]->texte;
1173
-		if (!isset($fields[$date])) {
1174
-			return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ' . $date]];
1175
-		}
1176
-	} else {
1177
-		$a = calculer_liste($date, $idb, $boucles, $parent);
1178
-		$noms = array_keys($fields);
1179
-		$defaut = $noms[0];
1180
-		$noms = join(' ', $noms);
1181
-		# bien laisser 2 espaces avant $nom pour que strpos<>0
1182
-		$cond = "(\$a=strval($a))AND\nstrpos(\"  $noms \",\" \$a \")";
1183
-		$date = "'.(($cond)\n?\$a:\"$defaut\").'";
1184
-	}
1185
-	$annee = $params ? array_shift($params) : '';
1186
-	$annee = "\n" . 'sprintf("%04d", ($x = ' .
1187
-		calculer_liste($annee, $idb, $boucles, $parent) .
1188
-		') ? $x : date("Y"))';
1189
-
1190
-	$mois = $params ? array_shift($params) : '';
1191
-	$mois = "\n" . 'sprintf("%02d", ($x = ' .
1192
-		calculer_liste($mois, $idb, $boucles, $parent) .
1193
-		') ? $x : date("m"))';
1194
-
1195
-	$jour = $params ? array_shift($params) : '';
1196
-	$jour = "\n" . 'sprintf("%02d", ($x = ' .
1197
-		calculer_liste($jour, $idb, $boucles, $parent) .
1198
-		') ? $x : date("d"))';
1199
-
1200
-	$annee2 = $params ? array_shift($params) : '';
1201
-	$annee2 = "\n" . 'sprintf("%04d", ($x = ' .
1202
-		calculer_liste($annee2, $idb, $boucles, $parent) .
1203
-		') ? $x : date("Y"))';
1204
-
1205
-	$mois2 = $params ? array_shift($params) : '';
1206
-	$mois2 = "\n" . 'sprintf("%02d", ($x = ' .
1207
-		calculer_liste($mois2, $idb, $boucles, $parent) .
1208
-		') ? $x : date("m"))';
1209
-
1210
-	$jour2 = $params ? array_shift($params) : '';
1211
-	$jour2 = "\n" . 'sprintf("%02d", ($x = ' .
1212
-		calculer_liste($jour2, $idb, $boucles, $parent) .
1213
-		') ? $x : date("d"))';
1214
-
1215
-	$date = $boucle->id_table . ".$date";
1216
-
1217
-	$quote_end = ",'" . $boucle->sql_serveur . "','text'";
1218
-	if ($type == 'jour') {
1219
-		$boucle->where[] = [
1220
-			"'='",
1221
-			"'DATE_FORMAT($date, \'%Y%m%d\')'",
1222
-			("sql_quote($annee . $mois . $jour$quote_end)")
1223
-		];
1224
-	} elseif ($type == 'mois') {
1225
-		$boucle->where[] = [
1226
-			"'='",
1227
-			"'DATE_FORMAT($date, \'%Y%m\')'",
1228
-			("sql_quote($annee . $mois$quote_end)")
1229
-		];
1230
-	} elseif ($type == 'semaine') {
1231
-		$boucle->where[] = [
1232
-			"'AND'",
1233
-			[
1234
-				"'>='",
1235
-				"'DATE_FORMAT($date, \'%Y%m%d\')'",
1236
-				("date_debut_semaine($annee, $mois, $jour)")
1237
-			],
1238
-			[
1239
-				"'<='",
1240
-				"'DATE_FORMAT($date, \'%Y%m%d\')'",
1241
-				("date_fin_semaine($annee, $mois, $jour)")
1242
-			]
1243
-		];
1244
-	} elseif (count($crit->param) > 2) {
1245
-		$boucle->where[] = [
1246
-			"'AND'",
1247
-			[
1248
-				"'>='",
1249
-				"'DATE_FORMAT($date, \'%Y%m%d\')'",
1250
-				("sql_quote($annee . $mois . $jour$quote_end)")
1251
-			],
1252
-			["'<='", "'DATE_FORMAT($date, \'%Y%m%d\')'", ("sql_quote($annee2 . $mois2 . $jour2$quote_end)")]
1253
-		];
1254
-	}
1255
-	// sinon on prend tout
1150
+    $params = $crit->param;
1151
+
1152
+    if (count($params) < 1) {
1153
+        return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ?']];
1154
+    }
1155
+
1156
+    $boucle = &$boucles[$idb];
1157
+    $parent = $boucle->id_parent;
1158
+    $fields = $boucle->show['field'];
1159
+
1160
+    $date = array_shift($params);
1161
+    $type = array_shift($params);
1162
+
1163
+    // la valeur $type doit etre connue a la compilation
1164
+    // donc etre forcement reduite a un litteral unique dans le source
1165
+    $type = is_object($type[0]) ? $type[0]->texte : null;
1166
+
1167
+    // La valeur date doit designer un champ de la table SQL.
1168
+    // Si c'est un litteral unique dans le source, verifier a la compil,
1169
+    // sinon synthetiser le test de verif pour execution ulterieure
1170
+    // On prendra arbitrairement le premier champ si test negatif.
1171
+    if ((count($date) == 1) and ($date[0]->type == 'texte')) {
1172
+        $date = $date[0]->texte;
1173
+        if (!isset($fields[$date])) {
1174
+            return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ' . $date]];
1175
+        }
1176
+    } else {
1177
+        $a = calculer_liste($date, $idb, $boucles, $parent);
1178
+        $noms = array_keys($fields);
1179
+        $defaut = $noms[0];
1180
+        $noms = join(' ', $noms);
1181
+        # bien laisser 2 espaces avant $nom pour que strpos<>0
1182
+        $cond = "(\$a=strval($a))AND\nstrpos(\"  $noms \",\" \$a \")";
1183
+        $date = "'.(($cond)\n?\$a:\"$defaut\").'";
1184
+    }
1185
+    $annee = $params ? array_shift($params) : '';
1186
+    $annee = "\n" . 'sprintf("%04d", ($x = ' .
1187
+        calculer_liste($annee, $idb, $boucles, $parent) .
1188
+        ') ? $x : date("Y"))';
1189
+
1190
+    $mois = $params ? array_shift($params) : '';
1191
+    $mois = "\n" . 'sprintf("%02d", ($x = ' .
1192
+        calculer_liste($mois, $idb, $boucles, $parent) .
1193
+        ') ? $x : date("m"))';
1194
+
1195
+    $jour = $params ? array_shift($params) : '';
1196
+    $jour = "\n" . 'sprintf("%02d", ($x = ' .
1197
+        calculer_liste($jour, $idb, $boucles, $parent) .
1198
+        ') ? $x : date("d"))';
1199
+
1200
+    $annee2 = $params ? array_shift($params) : '';
1201
+    $annee2 = "\n" . 'sprintf("%04d", ($x = ' .
1202
+        calculer_liste($annee2, $idb, $boucles, $parent) .
1203
+        ') ? $x : date("Y"))';
1204
+
1205
+    $mois2 = $params ? array_shift($params) : '';
1206
+    $mois2 = "\n" . 'sprintf("%02d", ($x = ' .
1207
+        calculer_liste($mois2, $idb, $boucles, $parent) .
1208
+        ') ? $x : date("m"))';
1209
+
1210
+    $jour2 = $params ? array_shift($params) : '';
1211
+    $jour2 = "\n" . 'sprintf("%02d", ($x = ' .
1212
+        calculer_liste($jour2, $idb, $boucles, $parent) .
1213
+        ') ? $x : date("d"))';
1214
+
1215
+    $date = $boucle->id_table . ".$date";
1216
+
1217
+    $quote_end = ",'" . $boucle->sql_serveur . "','text'";
1218
+    if ($type == 'jour') {
1219
+        $boucle->where[] = [
1220
+            "'='",
1221
+            "'DATE_FORMAT($date, \'%Y%m%d\')'",
1222
+            ("sql_quote($annee . $mois . $jour$quote_end)")
1223
+        ];
1224
+    } elseif ($type == 'mois') {
1225
+        $boucle->where[] = [
1226
+            "'='",
1227
+            "'DATE_FORMAT($date, \'%Y%m\')'",
1228
+            ("sql_quote($annee . $mois$quote_end)")
1229
+        ];
1230
+    } elseif ($type == 'semaine') {
1231
+        $boucle->where[] = [
1232
+            "'AND'",
1233
+            [
1234
+                "'>='",
1235
+                "'DATE_FORMAT($date, \'%Y%m%d\')'",
1236
+                ("date_debut_semaine($annee, $mois, $jour)")
1237
+            ],
1238
+            [
1239
+                "'<='",
1240
+                "'DATE_FORMAT($date, \'%Y%m%d\')'",
1241
+                ("date_fin_semaine($annee, $mois, $jour)")
1242
+            ]
1243
+        ];
1244
+    } elseif (count($crit->param) > 2) {
1245
+        $boucle->where[] = [
1246
+            "'AND'",
1247
+            [
1248
+                "'>='",
1249
+                "'DATE_FORMAT($date, \'%Y%m%d\')'",
1250
+                ("sql_quote($annee . $mois . $jour$quote_end)")
1251
+            ],
1252
+            ["'<='", "'DATE_FORMAT($date, \'%Y%m%d\')'", ("sql_quote($annee2 . $mois2 . $jour2$quote_end)")]
1253
+        ];
1254
+    }
1255
+    // sinon on prend tout
1256 1256
 }
1257 1257
 
1258 1258
 
@@ -1277,33 +1277,33 @@  discard block
 block discarded – undo
1277 1277
  * @return void
1278 1278
  **/
1279 1279
 function calculer_critere_parties($idb, &$boucles, $crit) {
1280
-	$boucle = &$boucles[$idb];
1281
-	$a1 = $crit->param[0];
1282
-	$a2 = $crit->param[1];
1283
-	$op = $crit->op;
1284
-
1285
-	list($a11, $a12) = calculer_critere_parties_aux($idb, $boucles, $a1);
1286
-	list($a21, $a22) = calculer_critere_parties_aux($idb, $boucles, $a2);
1287
-
1288
-	if (($op == ',') && (is_numeric($a11) && (is_numeric($a21)))) {
1289
-		$boucle->limit = $a11 . ',' . $a21;
1290
-	} else {
1291
-		// 3 dans {1/3}, {2,3} ou {1,n-3}
1292
-		$boucle->total_parties = ($a21 != 'n') ? $a21 : $a22;
1293
-		// 2 dans {2/3}, {2,5}, {n-2,1}
1294
-		$partie = ($a11 != 'n') ? $a11 : $a12;
1295
-		$mode = (($op == '/') ? '/' :
1296
-			(($a11 == 'n') ? '-' : '+') . (($a21 == 'n') ? '-' : '+'));
1297
-		// cas simple {0,#ENV{truc}} compilons le en LIMIT :
1298
-		if ($a11 !== 'n' and $a21 !== 'n' and $mode == '++' and $op == ',') {
1299
-			$boucle->limit =
1300
-				(is_numeric($a11) ? "'$a11'" : $a11)
1301
-				. ".','."
1302
-				. (is_numeric($a21) ? "'$a21'" : $a21);
1303
-		} else {
1304
-			calculer_parties($boucles, $idb, $partie, $mode);
1305
-		}
1306
-	}
1280
+    $boucle = &$boucles[$idb];
1281
+    $a1 = $crit->param[0];
1282
+    $a2 = $crit->param[1];
1283
+    $op = $crit->op;
1284
+
1285
+    list($a11, $a12) = calculer_critere_parties_aux($idb, $boucles, $a1);
1286
+    list($a21, $a22) = calculer_critere_parties_aux($idb, $boucles, $a2);
1287
+
1288
+    if (($op == ',') && (is_numeric($a11) && (is_numeric($a21)))) {
1289
+        $boucle->limit = $a11 . ',' . $a21;
1290
+    } else {
1291
+        // 3 dans {1/3}, {2,3} ou {1,n-3}
1292
+        $boucle->total_parties = ($a21 != 'n') ? $a21 : $a22;
1293
+        // 2 dans {2/3}, {2,5}, {n-2,1}
1294
+        $partie = ($a11 != 'n') ? $a11 : $a12;
1295
+        $mode = (($op == '/') ? '/' :
1296
+            (($a11 == 'n') ? '-' : '+') . (($a21 == 'n') ? '-' : '+'));
1297
+        // cas simple {0,#ENV{truc}} compilons le en LIMIT :
1298
+        if ($a11 !== 'n' and $a21 !== 'n' and $mode == '++' and $op == ',') {
1299
+            $boucle->limit =
1300
+                (is_numeric($a11) ? "'$a11'" : $a11)
1301
+                . ".','."
1302
+                . (is_numeric($a21) ? "'$a21'" : $a21);
1303
+        } else {
1304
+            calculer_parties($boucles, $idb, $partie, $mode);
1305
+        }
1306
+    }
1307 1307
 }
1308 1308
 
1309 1309
 /**
@@ -1331,63 +1331,63 @@  discard block
 block discarded – undo
1331 1331
  * @return void
1332 1332
  **/
1333 1333
 function calculer_parties(&$boucles, $id_boucle, $debut, $mode) {
1334
-	$total_parties = $boucles[$id_boucle]->total_parties;
1335
-
1336
-	preg_match(',([+-/p])([+-/])?,', $mode, $regs);
1337
-	list(, $op1, $op2) = array_pad($regs, 3, null);
1338
-	$nombre_boucle = "\$Numrows['$id_boucle']['total']";
1339
-	// {1/3}
1340
-	if ($op1 == '/') {
1341
-		$pmoins1 = is_numeric($debut) ? ($debut - 1) : "($debut-1)";
1342
-		$totpos = is_numeric($total_parties) ? ($total_parties) :
1343
-			"($total_parties ? $total_parties : 1)";
1344
-		$fin = "ceil(($nombre_boucle * $debut )/$totpos) - 1";
1345
-		$debut = !$pmoins1 ? 0 : "ceil(($nombre_boucle * $pmoins1)/$totpos);";
1346
-	} else {
1347
-		// cas {n-1,x}
1348
-		if ($op1 == '-') {
1349
-			$debut = "$nombre_boucle - $debut;";
1350
-		}
1351
-
1352
-		// cas {x,n-1}
1353
-		if ($op2 == '-') {
1354
-			$fin = '$debut_boucle + ' . $nombre_boucle . ' - '
1355
-				. (is_numeric($total_parties) ? ($total_parties + 1) :
1356
-					($total_parties . ' - 1'));
1357
-		} else {
1358
-			// {x,1} ou {pagination}
1359
-			$fin = '$debut_boucle'
1360
-				. (is_numeric($total_parties) ?
1361
-					(($total_parties == 1) ? '' : (' + ' . ($total_parties - 1))) :
1362
-					('+' . $total_parties . ' - 1'));
1363
-		}
1364
-
1365
-		// {pagination}, gerer le debut_xx=-1 pour tout voir
1366
-		if ($op1 == 'p') {
1367
-			$debut .= ";\n	\$debut_boucle = ((\$tout=(\$debut_boucle == -1))?0:(\$debut_boucle))";
1368
-			$debut .= ";\n	\$debut_boucle = max(0,min(\$debut_boucle,floor(($nombre_boucle-1)/($total_parties))*($total_parties)))";
1369
-			$fin = "(\$tout ? $nombre_boucle : $fin)";
1370
-		}
1371
-	}
1372
-
1373
-	// Notes :
1374
-	// $debut_boucle et $fin_boucle sont les indices SQL du premier
1375
-	// et du dernier demandes dans la boucle : 0 pour le premier,
1376
-	// n-1 pour le dernier ; donc total_boucle = 1 + debut - fin
1377
-	// Utiliser min pour rabattre $fin_boucle sur total_boucle.
1378
-
1379
-	$boucles[$id_boucle]->mode_partie = "\n\t"
1380
-		. '$debut_boucle = ' . $debut . ";\n	"
1381
-		. "\$debut_boucle = intval(\$debut_boucle);\n	"
1382
-		. '$fin_boucle = min(' . $fin . ", \$Numrows['$id_boucle']['total'] - 1);\n	"
1383
-		. '$Numrows[\'' . $id_boucle . "']['grand_total'] = \$Numrows['$id_boucle']['total'];\n	"
1384
-		. '$Numrows[\'' . $id_boucle . '\']["total"] = max(0,$fin_boucle - $debut_boucle + 1);'
1385
-		. "\n\tif (\$debut_boucle>0"
1386
-		. " AND \$debut_boucle < \$Numrows['$id_boucle']['grand_total']"
1387
-		. " AND \$iter->seek(\$debut_boucle,'continue'))"
1388
-		. "\n\t\t\$Numrows['$id_boucle']['compteur_boucle'] = \$debut_boucle;\n\t";
1389
-
1390
-	$boucles[$id_boucle]->partie = "
1334
+    $total_parties = $boucles[$id_boucle]->total_parties;
1335
+
1336
+    preg_match(',([+-/p])([+-/])?,', $mode, $regs);
1337
+    list(, $op1, $op2) = array_pad($regs, 3, null);
1338
+    $nombre_boucle = "\$Numrows['$id_boucle']['total']";
1339
+    // {1/3}
1340
+    if ($op1 == '/') {
1341
+        $pmoins1 = is_numeric($debut) ? ($debut - 1) : "($debut-1)";
1342
+        $totpos = is_numeric($total_parties) ? ($total_parties) :
1343
+            "($total_parties ? $total_parties : 1)";
1344
+        $fin = "ceil(($nombre_boucle * $debut )/$totpos) - 1";
1345
+        $debut = !$pmoins1 ? 0 : "ceil(($nombre_boucle * $pmoins1)/$totpos);";
1346
+    } else {
1347
+        // cas {n-1,x}
1348
+        if ($op1 == '-') {
1349
+            $debut = "$nombre_boucle - $debut;";
1350
+        }
1351
+
1352
+        // cas {x,n-1}
1353
+        if ($op2 == '-') {
1354
+            $fin = '$debut_boucle + ' . $nombre_boucle . ' - '
1355
+                . (is_numeric($total_parties) ? ($total_parties + 1) :
1356
+                    ($total_parties . ' - 1'));
1357
+        } else {
1358
+            // {x,1} ou {pagination}
1359
+            $fin = '$debut_boucle'
1360
+                . (is_numeric($total_parties) ?
1361
+                    (($total_parties == 1) ? '' : (' + ' . ($total_parties - 1))) :
1362
+                    ('+' . $total_parties . ' - 1'));
1363
+        }
1364
+
1365
+        // {pagination}, gerer le debut_xx=-1 pour tout voir
1366
+        if ($op1 == 'p') {
1367
+            $debut .= ";\n	\$debut_boucle = ((\$tout=(\$debut_boucle == -1))?0:(\$debut_boucle))";
1368
+            $debut .= ";\n	\$debut_boucle = max(0,min(\$debut_boucle,floor(($nombre_boucle-1)/($total_parties))*($total_parties)))";
1369
+            $fin = "(\$tout ? $nombre_boucle : $fin)";
1370
+        }
1371
+    }
1372
+
1373
+    // Notes :
1374
+    // $debut_boucle et $fin_boucle sont les indices SQL du premier
1375
+    // et du dernier demandes dans la boucle : 0 pour le premier,
1376
+    // n-1 pour le dernier ; donc total_boucle = 1 + debut - fin
1377
+    // Utiliser min pour rabattre $fin_boucle sur total_boucle.
1378
+
1379
+    $boucles[$id_boucle]->mode_partie = "\n\t"
1380
+        . '$debut_boucle = ' . $debut . ";\n	"
1381
+        . "\$debut_boucle = intval(\$debut_boucle);\n	"
1382
+        . '$fin_boucle = min(' . $fin . ", \$Numrows['$id_boucle']['total'] - 1);\n	"
1383
+        . '$Numrows[\'' . $id_boucle . "']['grand_total'] = \$Numrows['$id_boucle']['total'];\n	"
1384
+        . '$Numrows[\'' . $id_boucle . '\']["total"] = max(0,$fin_boucle - $debut_boucle + 1);'
1385
+        . "\n\tif (\$debut_boucle>0"
1386
+        . " AND \$debut_boucle < \$Numrows['$id_boucle']['grand_total']"
1387
+        . " AND \$iter->seek(\$debut_boucle,'continue'))"
1388
+        . "\n\t\t\$Numrows['$id_boucle']['compteur_boucle'] = \$debut_boucle;\n\t";
1389
+
1390
+    $boucles[$id_boucle]->partie = "
1391 1391
 		if (\$Numrows['$id_boucle']['compteur_boucle'] <= \$debut_boucle) continue;
1392 1392
 		if (\$Numrows['$id_boucle']['compteur_boucle']-1 > \$fin_boucle) break;";
1393 1393
 }
@@ -1404,26 +1404,26 @@  discard block
 block discarded – undo
1404 1404
  * @return array          Valeur de l'élément (peut être une expression PHP), Nombre soustrait
1405 1405
  **/
1406 1406
 function calculer_critere_parties_aux($idb, &$boucles, $param) {
1407
-	if ($param[0]->type != 'texte') {
1408
-		$a1 = calculer_liste([$param[0]], $idb, $boucles, $boucles[$idb]->id_parent);
1409
-		if (isset($param[1]->texte)) {
1410
-			preg_match(',^ *(-([0-9]+))? *$,', $param[1]->texte, $m);
1411
-
1412
-			return ["intval($a1)", ((isset($m[2]) and $m[2]) ? $m[2] : 0)];
1413
-		} else {
1414
-			return ["intval($a1)", 0];
1415
-		}
1416
-	} else {
1417
-		preg_match(',^ *(([0-9]+)|n) *(- *([0-9]+)? *)?$,', $param[0]->texte, $m);
1418
-		$a1 = $m[1];
1419
-		if (empty($m[3])) {
1420
-			return [$a1, 0];
1421
-		} elseif (!empty($m[4])) {
1422
-			return [$a1, $m[4]];
1423
-		} else {
1424
-			return [$a1, calculer_liste([$param[1]], $idb, $boucles, $boucles[$idb]->id_parent)];
1425
-		}
1426
-	}
1407
+    if ($param[0]->type != 'texte') {
1408
+        $a1 = calculer_liste([$param[0]], $idb, $boucles, $boucles[$idb]->id_parent);
1409
+        if (isset($param[1]->texte)) {
1410
+            preg_match(',^ *(-([0-9]+))? *$,', $param[1]->texte, $m);
1411
+
1412
+            return ["intval($a1)", ((isset($m[2]) and $m[2]) ? $m[2] : 0)];
1413
+        } else {
1414
+            return ["intval($a1)", 0];
1415
+        }
1416
+    } else {
1417
+        preg_match(',^ *(([0-9]+)|n) *(- *([0-9]+)? *)?$,', $param[0]->texte, $m);
1418
+        $a1 = $m[1];
1419
+        if (empty($m[3])) {
1420
+            return [$a1, 0];
1421
+        } elseif (!empty($m[4])) {
1422
+            return [$a1, $m[4]];
1423
+        } else {
1424
+            return [$a1, calculer_liste([$param[1]], $idb, $boucles, $boucles[$idb]->id_parent)];
1425
+        }
1426
+    }
1427 1427
 }
1428 1428
 
1429 1429
 
@@ -1450,47 +1450,47 @@  discard block
 block discarded – undo
1450 1450
  *     array : Erreur sur un des critères
1451 1451
  **/
1452 1452
 function calculer_criteres($idb, &$boucles) {
1453
-	$msg = '';
1454
-	$boucle = $boucles[$idb];
1455
-	$table = strtoupper($boucle->type_requete);
1456
-	$serveur = strtolower($boucle->sql_serveur);
1457
-
1458
-	$defaut = charger_fonction('DEFAUT', 'calculer_critere');
1459
-	// s'il y avait une erreur de syntaxe, propager cette info
1460
-	if (!is_array($boucle->criteres)) {
1461
-		return [];
1462
-	}
1463
-
1464
-	foreach ($boucle->criteres as $crit) {
1465
-		$critere = $crit->op;
1466
-		// critere personnalise ?
1467
-		if (
1468
-			(!$serveur or
1469
-				((!function_exists($f = 'critere_' . $serveur . '_' . $table . '_' . $critere))
1470
-					and (!function_exists($f = $f . '_dist'))
1471
-					and (!function_exists($f = 'critere_' . $serveur . '_' . $critere))
1472
-					and (!function_exists($f = $f . '_dist'))
1473
-				)
1474
-			)
1475
-			and (!function_exists($f = 'critere_' . $table . '_' . $critere))
1476
-			and (!function_exists($f = $f . '_dist'))
1477
-			and (!function_exists($f = 'critere_' . $critere))
1478
-			and (!function_exists($f = $f . '_dist'))
1479
-		) {
1480
-			// fonction critere standard
1481
-			$f = $defaut;
1482
-		}
1483
-		// compile le critere
1484
-		$res = $f($idb, $boucles, $crit);
1485
-
1486
-		// Gestion centralisee des erreurs pour pouvoir propager
1487
-		if (is_array($res)) {
1488
-			$msg = $res;
1489
-			erreur_squelette($msg, $boucle);
1490
-		}
1491
-	}
1492
-
1493
-	return $msg;
1453
+    $msg = '';
1454
+    $boucle = $boucles[$idb];
1455
+    $table = strtoupper($boucle->type_requete);
1456
+    $serveur = strtolower($boucle->sql_serveur);
1457
+
1458
+    $defaut = charger_fonction('DEFAUT', 'calculer_critere');
1459
+    // s'il y avait une erreur de syntaxe, propager cette info
1460
+    if (!is_array($boucle->criteres)) {
1461
+        return [];
1462
+    }
1463
+
1464
+    foreach ($boucle->criteres as $crit) {
1465
+        $critere = $crit->op;
1466
+        // critere personnalise ?
1467
+        if (
1468
+            (!$serveur or
1469
+                ((!function_exists($f = 'critere_' . $serveur . '_' . $table . '_' . $critere))
1470
+                    and (!function_exists($f = $f . '_dist'))
1471
+                    and (!function_exists($f = 'critere_' . $serveur . '_' . $critere))
1472
+                    and (!function_exists($f = $f . '_dist'))
1473
+                )
1474
+            )
1475
+            and (!function_exists($f = 'critere_' . $table . '_' . $critere))
1476
+            and (!function_exists($f = $f . '_dist'))
1477
+            and (!function_exists($f = 'critere_' . $critere))
1478
+            and (!function_exists($f = $f . '_dist'))
1479
+        ) {
1480
+            // fonction critere standard
1481
+            $f = $defaut;
1482
+        }
1483
+        // compile le critere
1484
+        $res = $f($idb, $boucles, $crit);
1485
+
1486
+        // Gestion centralisee des erreurs pour pouvoir propager
1487
+        if (is_array($res)) {
1488
+            $msg = $res;
1489
+            erreur_squelette($msg, $boucle);
1490
+        }
1491
+    }
1492
+
1493
+    return $msg;
1494 1494
 }
1495 1495
 
1496 1496
 /**
@@ -1507,11 +1507,11 @@  discard block
 block discarded – undo
1507 1507
  * @return string         Code compilé rééchappé
1508 1508
  */
1509 1509
 function kwote($lisp, $serveur = '', $type = '') {
1510
-	if (preg_match(_CODE_QUOTE, $lisp, $r)) {
1511
-		return $r[1] . '"' . sql_quote(str_replace(["\\'", '\\\\'], ["'", '\\'], $r[2]), $serveur, $type) . '"';
1512
-	} else {
1513
-		return "sql_quote($lisp, '$serveur', '" . str_replace("'", "\\'", $type) . "')";
1514
-	}
1510
+    if (preg_match(_CODE_QUOTE, $lisp, $r)) {
1511
+        return $r[1] . '"' . sql_quote(str_replace(["\\'", '\\\\'], ["'", '\\'], $r[2]), $serveur, $type) . '"';
1512
+    } else {
1513
+        return "sql_quote($lisp, '$serveur', '" . str_replace("'", "\\'", $type) . "')";
1514
+    }
1515 1515
 }
1516 1516
 
1517 1517
 
@@ -1530,82 +1530,82 @@  discard block
 block discarded – undo
1530 1530
  * @return void
1531 1531
  **/
1532 1532
 function critere_IN_dist($idb, &$boucles, $crit) {
1533
-	$r = calculer_critere_infixe($idb, $boucles, $crit);
1534
-	if (!$r) {
1535
-		return (['zbug_critere_inconnu', ['critere' => $crit->op . ' ?']]);
1536
-	}
1537
-	list($arg, $op, $val, $col, $where_complement) = $r;
1538
-
1539
-	$in = critere_IN_cas($idb, $boucles, $crit->not ? 'NOT' : ($crit->exclus ? 'exclus' : ''), $arg, $op, $val, $col);
1540
-
1541
-	//	inserer la condition; exemple: {id_mot ?IN (66, 62, 64)}
1542
-	$where = $in;
1543
-	if ($crit->cond) {
1544
-		$pred = calculer_argument_precedent($idb, $col, $boucles);
1545
-		$where = ["'?'", $pred, $where, "''"];
1546
-		if ($where_complement) { // condition annexe du type "AND (objet='article')"
1547
-		$where_complement = ["'?'", $pred, $where_complement, "''"];
1548
-		}
1549
-	}
1550
-	if ($crit->exclus) {
1551
-		if (!preg_match(',^L[0-9]+[.],', $arg)) {
1552
-			$where = ["'NOT'", $where];
1553
-		} else // un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete
1554
-			// c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent
1555
-		{
1556
-			$where = [
1557
-				"'NOT'",
1558
-				[
1559
-					"'IN'",
1560
-					"'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'",
1561
-					["'SELF'", "'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'", $where]
1562
-				]
1563
-			];
1564
-		}
1565
-	}
1566
-
1567
-	$boucles[$idb]->where[] = $where;
1568
-	if ($where_complement) { // condition annexe du type "AND (objet='article')"
1569
-	$boucles[$idb]->where[] = $where_complement;
1570
-	}
1533
+    $r = calculer_critere_infixe($idb, $boucles, $crit);
1534
+    if (!$r) {
1535
+        return (['zbug_critere_inconnu', ['critere' => $crit->op . ' ?']]);
1536
+    }
1537
+    list($arg, $op, $val, $col, $where_complement) = $r;
1538
+
1539
+    $in = critere_IN_cas($idb, $boucles, $crit->not ? 'NOT' : ($crit->exclus ? 'exclus' : ''), $arg, $op, $val, $col);
1540
+
1541
+    //	inserer la condition; exemple: {id_mot ?IN (66, 62, 64)}
1542
+    $where = $in;
1543
+    if ($crit->cond) {
1544
+        $pred = calculer_argument_precedent($idb, $col, $boucles);
1545
+        $where = ["'?'", $pred, $where, "''"];
1546
+        if ($where_complement) { // condition annexe du type "AND (objet='article')"
1547
+        $where_complement = ["'?'", $pred, $where_complement, "''"];
1548
+        }
1549
+    }
1550
+    if ($crit->exclus) {
1551
+        if (!preg_match(',^L[0-9]+[.],', $arg)) {
1552
+            $where = ["'NOT'", $where];
1553
+        } else // un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete
1554
+            // c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent
1555
+        {
1556
+            $where = [
1557
+                "'NOT'",
1558
+                [
1559
+                    "'IN'",
1560
+                    "'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'",
1561
+                    ["'SELF'", "'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'", $where]
1562
+                ]
1563
+            ];
1564
+        }
1565
+    }
1566
+
1567
+    $boucles[$idb]->where[] = $where;
1568
+    if ($where_complement) { // condition annexe du type "AND (objet='article')"
1569
+    $boucles[$idb]->where[] = $where_complement;
1570
+    }
1571 1571
 }
1572 1572
 
1573 1573
 // https://code.spip.net/@critere_IN_cas
1574 1574
 function critere_IN_cas($idb, &$boucles, $crit2, $arg, $op, $val, $col) {
1575
-	static $num = [];
1576
-	$descr = $boucles[$idb]->descr;
1577
-	$cpt = &$num[$descr['nom']][$descr['gram']][$idb];
1578
-
1579
-	$var = '$in' . $cpt++;
1580
-	$x = "\n\t$var = array();";
1581
-	foreach ($val as $k => $v) {
1582
-		if (preg_match(",^(\n//.*\n)?'(.*)'$,", $v, $r)) {
1583
-			// optimiser le traitement des constantes
1584
-			if (is_numeric($r[2])) {
1585
-				$x .= "\n\t$var" . "[]= $r[2];";
1586
-			} else {
1587
-				$x .= "\n\t$var" . '[]= ' . sql_quote($r[2]) . ';';
1588
-			}
1589
-		} else {
1590
-			// Pour permettre de passer des tableaux de valeurs
1591
-			// on repere l'utilisation brute de #ENV**{X},
1592
-			// c'est-a-dire sa  traduction en ($PILE[0][X]).
1593
-			// et on deballe mais en rajoutant l'anti XSS
1594
-			$x .= "\n\tif (!(is_array(\$a = ($v))))\n\t\t$var" . "[]= \$a;\n\telse $var = array_merge($var, \$a);";
1595
-		}
1596
-	}
1597
-
1598
-	$boucles[$idb]->in .= $x;
1599
-
1600
-	// inserer le tri par defaut selon les ordres du IN ...
1601
-	// avec une ecriture de type FIELD qui degrade les performances (du meme ordre qu'un regexp)
1602
-	// et que l'on limite donc strictement aux cas necessaires :
1603
-	// si ce n'est pas un !IN, et si il n'y a pas d'autre order dans la boucle
1604
-	if (!$crit2) {
1605
-		$boucles[$idb]->default_order[] = "((!\$zqv=sql_quote($var) OR \$zqv===\"''\") ? 0 : ('FIELD($arg,' . \$zqv . ')'))";
1606
-	}
1607
-
1608
-	return "sql_in('$arg', $var" . ($crit2 == 'NOT' ? ",'NOT'" : '') . ')';
1575
+    static $num = [];
1576
+    $descr = $boucles[$idb]->descr;
1577
+    $cpt = &$num[$descr['nom']][$descr['gram']][$idb];
1578
+
1579
+    $var = '$in' . $cpt++;
1580
+    $x = "\n\t$var = array();";
1581
+    foreach ($val as $k => $v) {
1582
+        if (preg_match(",^(\n//.*\n)?'(.*)'$,", $v, $r)) {
1583
+            // optimiser le traitement des constantes
1584
+            if (is_numeric($r[2])) {
1585
+                $x .= "\n\t$var" . "[]= $r[2];";
1586
+            } else {
1587
+                $x .= "\n\t$var" . '[]= ' . sql_quote($r[2]) . ';';
1588
+            }
1589
+        } else {
1590
+            // Pour permettre de passer des tableaux de valeurs
1591
+            // on repere l'utilisation brute de #ENV**{X},
1592
+            // c'est-a-dire sa  traduction en ($PILE[0][X]).
1593
+            // et on deballe mais en rajoutant l'anti XSS
1594
+            $x .= "\n\tif (!(is_array(\$a = ($v))))\n\t\t$var" . "[]= \$a;\n\telse $var = array_merge($var, \$a);";
1595
+        }
1596
+    }
1597
+
1598
+    $boucles[$idb]->in .= $x;
1599
+
1600
+    // inserer le tri par defaut selon les ordres du IN ...
1601
+    // avec une ecriture de type FIELD qui degrade les performances (du meme ordre qu'un regexp)
1602
+    // et que l'on limite donc strictement aux cas necessaires :
1603
+    // si ce n'est pas un !IN, et si il n'y a pas d'autre order dans la boucle
1604
+    if (!$crit2) {
1605
+        $boucles[$idb]->default_order[] = "((!\$zqv=sql_quote($var) OR \$zqv===\"''\") ? 0 : ('FIELD($arg,' . \$zqv . ')'))";
1606
+    }
1607
+
1608
+    return "sql_in('$arg', $var" . ($crit2 == 'NOT' ? ",'NOT'" : '') . ')';
1609 1609
 }
1610 1610
 
1611 1611
 /**
@@ -1621,22 +1621,22 @@  discard block
 block discarded – undo
1621 1621
  * @return void
1622 1622
  */
1623 1623
 function critere_where_dist($idb, &$boucles, $crit) {
1624
-	$boucle = &$boucles[$idb];
1625
-	if (isset($crit->param[0])) {
1626
-		$_where = calculer_liste($crit->param[0], $idb, $boucles, $boucle->id_parent);
1627
-	} else {
1628
-		$_where = 'spip_sanitize_from_request(@$Pile[0]["where"],"where","vide")';
1629
-	}
1630
-
1631
-	if ($crit->cond) {
1632
-		$_where = "((\$zzw = $_where) ? \$zzw : '')";
1633
-	}
1634
-
1635
-	if ($crit->not) {
1636
-		$_where = "array('NOT',$_where)";
1637
-	}
1638
-
1639
-	$boucle->where[] = $_where;
1624
+    $boucle = &$boucles[$idb];
1625
+    if (isset($crit->param[0])) {
1626
+        $_where = calculer_liste($crit->param[0], $idb, $boucles, $boucle->id_parent);
1627
+    } else {
1628
+        $_where = 'spip_sanitize_from_request(@$Pile[0]["where"],"where","vide")';
1629
+    }
1630
+
1631
+    if ($crit->cond) {
1632
+        $_where = "((\$zzw = $_where) ? \$zzw : '')";
1633
+    }
1634
+
1635
+    if ($crit->not) {
1636
+        $_where = "array('NOT',$_where)";
1637
+    }
1638
+
1639
+    $boucle->where[] = $_where;
1640 1640
 }
1641 1641
 
1642 1642
 /**
@@ -1664,31 +1664,31 @@  discard block
 block discarded – undo
1664 1664
  * @return void
1665 1665
  */
1666 1666
 function critere_id__dist($idb, &$boucles, $crit) {
1667
-	/** @var Boucle $boucle */
1668
-	$boucle = $boucles[$idb];
1669
-
1670
-	$champs = lister_champs_id_conditionnel(
1671
-		$boucle->show['table'],
1672
-		$boucle->show,
1673
-		$boucle->sql_serveur
1674
-	);
1675
-
1676
-	// ne pas tenir compte des critères identiques déjà présents.
1677
-	if (!empty($boucle->modificateur['criteres'])) {
1678
-		$champs = array_diff($champs, array_keys($boucle->modificateur['criteres']));
1679
-	}
1680
-	// nous aider en mode debug.
1681
-	$boucle->debug[] = 'id_ : ' . implode(', ', $champs);
1682
-	$boucle->modificateur['id_'] = $champs;
1683
-
1684
-	// créer un critère {id_xxx?} de chaque champ retenu
1685
-	foreach ($champs as $champ) {
1686
-		$critere_id_table = new Critere();
1687
-		$critere_id_table->op = $champ;
1688
-		$critere_id_table->cond = '?';
1689
-		$critere_id_table->ligne = $crit->ligne;
1690
-		calculer_critere_DEFAUT_dist($idb, $boucles, $critere_id_table);
1691
-	}
1667
+    /** @var Boucle $boucle */
1668
+    $boucle = $boucles[$idb];
1669
+
1670
+    $champs = lister_champs_id_conditionnel(
1671
+        $boucle->show['table'],
1672
+        $boucle->show,
1673
+        $boucle->sql_serveur
1674
+    );
1675
+
1676
+    // ne pas tenir compte des critères identiques déjà présents.
1677
+    if (!empty($boucle->modificateur['criteres'])) {
1678
+        $champs = array_diff($champs, array_keys($boucle->modificateur['criteres']));
1679
+    }
1680
+    // nous aider en mode debug.
1681
+    $boucle->debug[] = 'id_ : ' . implode(', ', $champs);
1682
+    $boucle->modificateur['id_'] = $champs;
1683
+
1684
+    // créer un critère {id_xxx?} de chaque champ retenu
1685
+    foreach ($champs as $champ) {
1686
+        $critere_id_table = new Critere();
1687
+        $critere_id_table->op = $champ;
1688
+        $critere_id_table->cond = '?';
1689
+        $critere_id_table->ligne = $crit->ligne;
1690
+        calculer_critere_DEFAUT_dist($idb, $boucles, $critere_id_table);
1691
+    }
1692 1692
 }
1693 1693
 
1694 1694
 /**
@@ -1708,79 +1708,79 @@  discard block
 block discarded – undo
1708 1708
  * @return array Liste de nom de champs (tel que id_article, id_mot, id_parent ...)
1709 1709
  */
1710 1710
 function lister_champs_id_conditionnel($table, $desc = null, $serveur = '') {
1711
-	// calculer la description de la table
1712
-	if (!is_array($desc)) {
1713
-		$desc = description_table($table, $serveur);
1714
-	}
1715
-	if (!$desc) {
1716
-		return [];
1717
-	}
1718
-
1719
-	// Les champs id_xx de la table demandée
1720
-	$champs = array_filter(
1721
-		array_keys($desc['field']),
1722
-		function ($champ) {
1723
-			return
1724
-				strpos($champ, 'id_') === 0
1725
-				or (in_array($champ, ['objet']));
1726
-		}
1727
-	);
1728
-
1729
-	// Si le champ id_rubrique appartient à la liste et si id_secteur n'est pas inclus on le rajoute.
1730
-	if (
1731
-		in_array('id_rubrique', $champs)
1732
-		and !in_array('id_secteur', $champs)
1733
-	) {
1734
-		$champs[] = 'id_secteur';
1735
-	}
1736
-
1737
-	// On ne fera pas mieux pour les tables d’un autre serveur
1738
-	if ($serveur) {
1739
-		return $champs;
1740
-	}
1741
-
1742
-	$primary = false;
1743
-	$associable = false;
1744
-	include_spip('action/editer_liens');
1745
-
1746
-	if (isset($desc['type'])) {
1747
-		$primary = id_table_objet($desc['type']);
1748
-		$associable = objet_associable($desc['type']);
1749
-	}
1750
-	if (isset($desc['field']['id_objet']) and isset($desc['field']['objet'])) {
1751
-		$associable = true;
1752
-	}
1753
-
1754
-	// liste de toutes les tables principales, sauf la notre
1755
-	$tables = lister_tables_objets_sql();
1756
-	unset($tables[$table]);
1757
-
1758
-	foreach ($tables as $_table => $_desc) {
1759
-		if (
1760
-			$associable
1761
-			or ($primary and in_array($primary, array_keys($_desc['field'])))
1762
-			or objet_associable($_desc['type'])
1763
-		) {
1764
-			$champs[] = id_table_objet($_table);
1765
-		}
1766
-	}
1767
-	$champs = array_values(array_unique($champs));
1768
-
1769
-	// Exclusions de certains id
1770
-	$exclusions = pipeline(
1771
-		'exclure_id_conditionnel',
1772
-		[
1773
-			'args' => [
1774
-				'table' => $table,
1775
-				'id_table_objet' => $primary,
1776
-				'associable' => $associable,
1777
-			],
1778
-			'data' => [],
1779
-		]
1780
-	);
1781
-	$champs = array_diff($champs, $exclusions);
1782
-
1783
-	return $champs;
1711
+    // calculer la description de la table
1712
+    if (!is_array($desc)) {
1713
+        $desc = description_table($table, $serveur);
1714
+    }
1715
+    if (!$desc) {
1716
+        return [];
1717
+    }
1718
+
1719
+    // Les champs id_xx de la table demandée
1720
+    $champs = array_filter(
1721
+        array_keys($desc['field']),
1722
+        function ($champ) {
1723
+            return
1724
+                strpos($champ, 'id_') === 0
1725
+                or (in_array($champ, ['objet']));
1726
+        }
1727
+    );
1728
+
1729
+    // Si le champ id_rubrique appartient à la liste et si id_secteur n'est pas inclus on le rajoute.
1730
+    if (
1731
+        in_array('id_rubrique', $champs)
1732
+        and !in_array('id_secteur', $champs)
1733
+    ) {
1734
+        $champs[] = 'id_secteur';
1735
+    }
1736
+
1737
+    // On ne fera pas mieux pour les tables d’un autre serveur
1738
+    if ($serveur) {
1739
+        return $champs;
1740
+    }
1741
+
1742
+    $primary = false;
1743
+    $associable = false;
1744
+    include_spip('action/editer_liens');
1745
+
1746
+    if (isset($desc['type'])) {
1747
+        $primary = id_table_objet($desc['type']);
1748
+        $associable = objet_associable($desc['type']);
1749
+    }
1750
+    if (isset($desc['field']['id_objet']) and isset($desc['field']['objet'])) {
1751
+        $associable = true;
1752
+    }
1753
+
1754
+    // liste de toutes les tables principales, sauf la notre
1755
+    $tables = lister_tables_objets_sql();
1756
+    unset($tables[$table]);
1757
+
1758
+    foreach ($tables as $_table => $_desc) {
1759
+        if (
1760
+            $associable
1761
+            or ($primary and in_array($primary, array_keys($_desc['field'])))
1762
+            or objet_associable($_desc['type'])
1763
+        ) {
1764
+            $champs[] = id_table_objet($_table);
1765
+        }
1766
+    }
1767
+    $champs = array_values(array_unique($champs));
1768
+
1769
+    // Exclusions de certains id
1770
+    $exclusions = pipeline(
1771
+        'exclure_id_conditionnel',
1772
+        [
1773
+            'args' => [
1774
+                'table' => $table,
1775
+                'id_table_objet' => $primary,
1776
+                'associable' => $associable,
1777
+            ],
1778
+            'data' => [],
1779
+        ]
1780
+    );
1781
+    $champs = array_diff($champs, $exclusions);
1782
+
1783
+    return $champs;
1784 1784
 }
1785 1785
 
1786 1786
 /**
@@ -1835,27 +1835,27 @@  discard block
 block discarded – undo
1835 1835
  * @return void
1836 1836
  */
1837 1837
 function critere_tri_dist($idb, &$boucles, $crit) {
1838
-	$boucle = &$boucles[$idb];
1839
-
1840
-	// definition du champ par defaut
1841
-	$_champ_defaut = !isset($crit->param[0][0]) ? "''"
1842
-		: calculer_liste([$crit->param[0][0]], $idb, $boucles, $boucle->id_parent);
1843
-	$_sens_defaut = !isset($crit->param[1][0]) ? '1'
1844
-		: calculer_liste([$crit->param[1][0]], $idb, $boucles, $boucle->id_parent);
1845
-	$_variable = !isset($crit->param[2][0]) ? "'$idb'"
1846
-		: calculer_liste([$crit->param[2][0]], $idb, $boucles, $boucle->id_parent);
1847
-
1848
-	$_tri = "((\$t=(isset(\$Pile[0]['tri'.$_variable]))?\$Pile[0]['tri'.$_variable]:((strncmp($_variable,'session',7)==0 AND session_get('tri'.$_variable))?session_get('tri'.$_variable):$_champ_defaut))?tri_protege_champ(\$t):'')";
1849
-
1850
-	$_sens_defaut = "(is_array(\$s=$_sens_defaut)?(isset(\$s[\$st=$_tri])?\$s[\$st]:reset(\$s)):\$s)";
1851
-	$_sens = "((intval(\$t=(isset(\$Pile[0]['sens'.$_variable]))?\$Pile[0]['sens'.$_variable]:((strncmp($_variable,'session',7)==0 AND session_get('sens'.$_variable))?session_get('sens'.$_variable):$_sens_defaut))==-1 OR \$t=='inverse')?-1:1)";
1852
-
1853
-	$boucle->modificateur['tri_champ'] = $_tri;
1854
-	$boucle->modificateur['tri_sens'] = $_sens;
1855
-	$boucle->modificateur['tri_nom'] = $_variable;
1856
-	// faut il inserer un test sur l'existence de $tri parmi les champs de la table ?
1857
-	// evite des erreurs sql, mais peut empecher des tri sur jointure ...
1858
-	$boucle->hash .= "
1838
+    $boucle = &$boucles[$idb];
1839
+
1840
+    // definition du champ par defaut
1841
+    $_champ_defaut = !isset($crit->param[0][0]) ? "''"
1842
+        : calculer_liste([$crit->param[0][0]], $idb, $boucles, $boucle->id_parent);
1843
+    $_sens_defaut = !isset($crit->param[1][0]) ? '1'
1844
+        : calculer_liste([$crit->param[1][0]], $idb, $boucles, $boucle->id_parent);
1845
+    $_variable = !isset($crit->param[2][0]) ? "'$idb'"
1846
+        : calculer_liste([$crit->param[2][0]], $idb, $boucles, $boucle->id_parent);
1847
+
1848
+    $_tri = "((\$t=(isset(\$Pile[0]['tri'.$_variable]))?\$Pile[0]['tri'.$_variable]:((strncmp($_variable,'session',7)==0 AND session_get('tri'.$_variable))?session_get('tri'.$_variable):$_champ_defaut))?tri_protege_champ(\$t):'')";
1849
+
1850
+    $_sens_defaut = "(is_array(\$s=$_sens_defaut)?(isset(\$s[\$st=$_tri])?\$s[\$st]:reset(\$s)):\$s)";
1851
+    $_sens = "((intval(\$t=(isset(\$Pile[0]['sens'.$_variable]))?\$Pile[0]['sens'.$_variable]:((strncmp($_variable,'session',7)==0 AND session_get('sens'.$_variable))?session_get('sens'.$_variable):$_sens_defaut))==-1 OR \$t=='inverse')?-1:1)";
1852
+
1853
+    $boucle->modificateur['tri_champ'] = $_tri;
1854
+    $boucle->modificateur['tri_sens'] = $_sens;
1855
+    $boucle->modificateur['tri_nom'] = $_variable;
1856
+    // faut il inserer un test sur l'existence de $tri parmi les champs de la table ?
1857
+    // evite des erreurs sql, mais peut empecher des tri sur jointure ...
1858
+    $boucle->hash .= "
1859 1859
 	\$senstri = '';
1860 1860
 	\$tri = $_tri;
1861 1861
 	if (\$tri){
@@ -1863,8 +1863,8 @@  discard block
 block discarded – undo
1863 1863
 		\$senstri = (\$senstri<0)?' DESC':'';
1864 1864
 	};
1865 1865
 	";
1866
-	$boucle->select[] = '".tri_champ_select($tri)."';
1867
-	$boucle->order[] = "tri_champ_order(\$tri,\$command['from'],\$senstri)";
1866
+    $boucle->select[] = '".tri_champ_select($tri)."';
1867
+    $boucle->order[] = "tri_champ_order(\$tri,\$command['from'],\$senstri)";
1868 1868
 }
1869 1869
 
1870 1870
 # Criteres de comparaison
@@ -1881,20 +1881,20 @@  discard block
 block discarded – undo
1881 1881
  * @return void
1882 1882
  **/
1883 1883
 function calculer_critere_DEFAUT_dist($idb, &$boucles, $crit) {
1884
-	// double cas particulier {0,1} et {1/2} repere a l'analyse lexicale
1885
-	if (($crit->op == ',') or ($crit->op == '/')) {
1886
-		return calculer_critere_parties($idb, $boucles, $crit);
1887
-	}
1888
-
1889
-	$r = calculer_critere_infixe($idb, $boucles, $crit);
1890
-	if (!$r) {
1891
-		#	// on produit une erreur seulement si le critere n'a pas de '?'
1892
-		#	if (!$crit->cond) {
1893
-		return (['zbug_critere_inconnu', ['critere' => $crit->op]]);
1894
-		#	}
1895
-	} else {
1896
-		calculer_critere_DEFAUT_args($idb, $boucles, $crit, $r);
1897
-	}
1884
+    // double cas particulier {0,1} et {1/2} repere a l'analyse lexicale
1885
+    if (($crit->op == ',') or ($crit->op == '/')) {
1886
+        return calculer_critere_parties($idb, $boucles, $crit);
1887
+    }
1888
+
1889
+    $r = calculer_critere_infixe($idb, $boucles, $crit);
1890
+    if (!$r) {
1891
+        #	// on produit une erreur seulement si le critere n'a pas de '?'
1892
+        #	if (!$crit->cond) {
1893
+        return (['zbug_critere_inconnu', ['critere' => $crit->op]]);
1894
+        #	}
1895
+    } else {
1896
+        calculer_critere_DEFAUT_args($idb, $boucles, $crit, $r);
1897
+    }
1898 1898
 }
1899 1899
 
1900 1900
 
@@ -1914,60 +1914,60 @@  discard block
 block discarded – undo
1914 1914
  * @return void
1915 1915
  **/
1916 1916
 function calculer_critere_DEFAUT_args($idb, &$boucles, $crit, $args) {
1917
-	list($arg, $op, $val, $col, $where_complement) = $args;
1918
-
1919
-	$where = ["'$op'", "'$arg'", $val[0]];
1920
-
1921
-	// inserer la negation (cf !...)
1922
-
1923
-	if ($crit->not) {
1924
-		$where = ["'NOT'", $where];
1925
-	}
1926
-	if ($crit->exclus) {
1927
-		if (!preg_match(',^L[0-9]+[.],', $arg)) {
1928
-			$where = ["'NOT'", $where];
1929
-		} else // un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete
1930
-			// c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent
1931
-		{
1932
-			$where = [
1933
-				"'NOT'",
1934
-				[
1935
-					"'IN'",
1936
-					"'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'",
1937
-					["'SELF'", "'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'", $where]
1938
-				]
1939
-			];
1940
-		}
1941
-	}
1942
-
1943
-	// inserer la condition (cf {lang?})
1944
-	// traiter a part la date, elle est mise d'office par SPIP,
1945
-	if ($crit->cond) {
1946
-		$pred = calculer_argument_precedent($idb, $col, $boucles);
1947
-		if ($col == 'date' or $col == 'date_redac') {
1948
-			if ($pred == "\$Pile[0]['" . $col . "']") {
1949
-				$pred = "(\$Pile[0]['{$col}_default']?'':$pred)";
1950
-			}
1951
-		}
1952
-
1953
-		if ($op == '=' and !$crit->not) {
1954
-			$where = [
1955
-				"'?'",
1956
-				"(is_array($pred))",
1957
-				critere_IN_cas($idb, $boucles, 'COND', $arg, $op, [$pred], $col),
1958
-				$where
1959
-			];
1960
-		}
1961
-		$where = ["'?'", "!(is_array($pred)?count($pred):strlen($pred))", "''", $where];
1962
-		if ($where_complement) { // condition annexe du type "AND (objet='article')"
1963
-		$where_complement = ["'?'", "!(is_array($pred)?count($pred):strlen($pred))", "''", $where_complement];
1964
-		}
1965
-	}
1966
-
1967
-	$boucles[$idb]->where[] = $where;
1968
-	if ($where_complement) { // condition annexe du type "AND (objet='article')"
1969
-	$boucles[$idb]->where[] = $where_complement;
1970
-	}
1917
+    list($arg, $op, $val, $col, $where_complement) = $args;
1918
+
1919
+    $where = ["'$op'", "'$arg'", $val[0]];
1920
+
1921
+    // inserer la negation (cf !...)
1922
+
1923
+    if ($crit->not) {
1924
+        $where = ["'NOT'", $where];
1925
+    }
1926
+    if ($crit->exclus) {
1927
+        if (!preg_match(',^L[0-9]+[.],', $arg)) {
1928
+            $where = ["'NOT'", $where];
1929
+        } else // un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete
1930
+            // c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent
1931
+        {
1932
+            $where = [
1933
+                "'NOT'",
1934
+                [
1935
+                    "'IN'",
1936
+                    "'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'",
1937
+                    ["'SELF'", "'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'", $where]
1938
+                ]
1939
+            ];
1940
+        }
1941
+    }
1942
+
1943
+    // inserer la condition (cf {lang?})
1944
+    // traiter a part la date, elle est mise d'office par SPIP,
1945
+    if ($crit->cond) {
1946
+        $pred = calculer_argument_precedent($idb, $col, $boucles);
1947
+        if ($col == 'date' or $col == 'date_redac') {
1948
+            if ($pred == "\$Pile[0]['" . $col . "']") {
1949
+                $pred = "(\$Pile[0]['{$col}_default']?'':$pred)";
1950
+            }
1951
+        }
1952
+
1953
+        if ($op == '=' and !$crit->not) {
1954
+            $where = [
1955
+                "'?'",
1956
+                "(is_array($pred))",
1957
+                critere_IN_cas($idb, $boucles, 'COND', $arg, $op, [$pred], $col),
1958
+                $where
1959
+            ];
1960
+        }
1961
+        $where = ["'?'", "!(is_array($pred)?count($pred):strlen($pred))", "''", $where];
1962
+        if ($where_complement) { // condition annexe du type "AND (objet='article')"
1963
+        $where_complement = ["'?'", "!(is_array($pred)?count($pred):strlen($pred))", "''", $where_complement];
1964
+        }
1965
+    }
1966
+
1967
+    $boucles[$idb]->where[] = $where;
1968
+    if ($where_complement) { // condition annexe du type "AND (objet='article')"
1969
+    $boucles[$idb]->where[] = $where_complement;
1970
+    }
1971 1971
 }
1972 1972
 
1973 1973
 
@@ -2008,165 +2008,165 @@  discard block
 block discarded – undo
2008 2008
  **/
2009 2009
 function calculer_critere_infixe($idb, &$boucles, $crit) {
2010 2010
 
2011
-	$boucle = &$boucles[$idb];
2012
-	$type = $boucle->type_requete;
2013
-	$table = $boucle->id_table;
2014
-	$desc = $boucle->show;
2015
-	$col_vraie = null;
2016
-
2017
-	list($fct, $col, $op, $val, $args_sql) =
2018
-		calculer_critere_infixe_ops($idb, $boucles, $crit);
2019
-
2020
-	$col_alias = $col;
2021
-	$where_complement = false;
2022
-
2023
-	// Cas particulier : id_enfant => utiliser la colonne id_objet
2024
-	if ($col == 'id_enfant') {
2025
-		$col = $boucle->primary;
2026
-	}
2027
-
2028
-	// Cas particulier : id_parent => verifier les exceptions de tables
2029
-	if (
2030
-		(in_array($col, ['id_parent', 'id_secteur']) and isset($GLOBALS['exceptions_des_tables'][$table][$col]))
2031
-		or (isset($GLOBALS['exceptions_des_tables'][$table][$col]) and is_string($GLOBALS['exceptions_des_tables'][$table][$col]))
2032
-	) {
2033
-		$col = $GLOBALS['exceptions_des_tables'][$table][$col];
2034
-	} // et possibilite de gerer un critere secteur sur des tables de plugins (ie forums)
2035
-	else {
2036
-		if (($col == 'id_secteur') and ($critere_secteur = charger_fonction("critere_secteur_$type", 'public', true))) {
2037
-			$table = $critere_secteur($idb, $boucles, $val, $crit);
2038
-		}
2039
-
2040
-		// cas id_article=xx qui se mappe en id_objet=xx AND objet=article
2041
-		// sauf si exception declaree : sauter cette etape
2042
-		else {
2043
-			if (
2044
-				!isset($GLOBALS['exceptions_des_jointures'][table_objet_sql($table)][$col])
2045
-				and !isset($GLOBALS['exceptions_des_jointures'][$col])
2046
-				and count(trouver_champs_decomposes($col, $desc)) > 1
2047
-			) {
2048
-				$e = decompose_champ_id_objet($col);
2049
-				$col = array_shift($e);
2050
-				$where_complement = primary_doublee($e, $table);
2051
-			} // Cas particulier : expressions de date
2052
-			else {
2053
-				if ($c = calculer_critere_infixe_date($idb, $boucles, $col)) {
2054
-					list($col, $col_vraie) = $c;
2055
-					$table = '';
2056
-				} // table explicitée {mots.titre}
2057
-				else {
2058
-					if (preg_match('/^(.*)\.(.*)$/', $col, $r)) {
2059
-						list(, $table, $col) = $r;
2060
-						$col_alias = $col;
2061
-
2062
-						$trouver_table = charger_fonction('trouver_table', 'base');
2063
-						if (
2064
-							$desc = $trouver_table($table, $boucle->sql_serveur)
2065
-							and isset($desc['field'][$col])
2066
-							and $cle = array_search($desc['table'], $boucle->from)
2067
-						) {
2068
-							$table = $cle;
2069
-						} else {
2070
-							$table = trouver_jointure_champ($col, $boucle, [$table], ($crit->cond or $op != '='));
2071
-						}
2072
-						#$table = calculer_critere_externe_init($boucle, array($table), $col, $desc, ($crit->cond OR $op!='='), true);
2073
-						if (!$table) {
2074
-							return '';
2075
-						}
2076
-					}
2077
-					// si le champ n'est pas trouvé dans la table,
2078
-					// on cherche si une jointure peut l'obtenir
2079
-					elseif (@!array_key_exists($col, $desc['field'])) {
2080
-						// Champ joker * des iterateurs DATA qui accepte tout
2081
-						if (@array_key_exists('*', $desc['field'])) {
2082
-							$desc['field'][$col_vraie ? $col_vraie : $col] = ''; // on veut pas de cast INT par defaut car le type peut etre n'importe quoi dans les boucles DATA
2083
-						}
2084
-						else {
2085
-							$r = calculer_critere_infixe_externe($boucle, $crit, $op, $desc, $col, $col_alias, $table);
2086
-							if (!$r) {
2087
-								return '';
2088
-							}
2089
-							list($col, $col_alias, $table, $where_complement, $desc) = $r;
2090
-						}
2091
-					}
2092
-				}
2093
-			}
2094
-		}
2095
-	}
2096
-
2097
-	$col_vraie = ($col_vraie ? $col_vraie : $col);
2098
-	// Dans tous les cas,
2099
-	// virer les guillemets eventuels autour d'un int (qui sont refuses par certains SQL)
2100
-	// et passer dans sql_quote avec le type si connu
2101
-	// et int sinon si la valeur est numerique
2102
-	// sinon introduire le vrai type du champ si connu dans le sql_quote (ou int NOT NULL sinon)
2103
-	// Ne pas utiliser intval, PHP tronquant les Bigint de SQL
2104
-	if ($op == '=' or in_array($op, $GLOBALS['table_criteres_infixes'])) {
2105
-		$type_cast_quote = (isset($desc['field'][$col_vraie]) ? $desc['field'][$col_vraie] : 'int NOT NULL');
2106
-		// defaire le quote des int et les passer dans sql_quote avec le bon type de champ si on le connait, int sinon
2107
-		// prendre en compte le debug ou la valeur arrive avec un commentaire PHP en debut
2108
-		if (preg_match(",^\\A(\s*//.*?$\s*)?\"'(-?\d+)'\"\\z,ms", $val[0], $r)) {
2109
-			$val[0] = $r[1] . '"' . sql_quote($r[2], $boucle->sql_serveur, $type_cast_quote) . '"';
2110
-		}
2111
-		// sinon expliciter les
2112
-		// sql_quote(truc) en sql_quote(truc,'',type)
2113
-		// sql_quote(truc,serveur) en sql_quote(truc,serveur,type)
2114
-		// sql_quote(truc,serveur,'') en sql_quote(truc,serveur,type)
2115
-		// sans toucher aux
2116
-		// sql_quote(truc,'','varchar(10) DEFAULT \'oui\' COLLATE NOCASE')
2117
-		// sql_quote(truc,'','varchar')
2118
-		elseif (
2119
-			preg_match('/\Asql_quote[(](.*?)(,[^)]*?)?(,[^)]*(?:\(\d+\)[^)]*)?)?[)]\s*\z/ms', $val[0], $r)
2120
-			// si pas deja un type
2121
-			and (!isset($r[3]) or !$r[3] or !trim($r[3], ", '"))
2122
-		) {
2123
-			$r = $r[1]
2124
-				. ((isset($r[2]) and $r[2]) ? $r[2] : ",''")
2125
-				. ",'" . addslashes($type_cast_quote) . "'";
2126
-			$val[0] = "sql_quote($r)";
2127
-		}
2128
-		elseif (
2129
-			strpos($val[0], '@@defaultcast@@') !== false
2130
-			and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r)
2131
-		) {
2132
-			$val[0] = substr($val[0], 0, -strlen($r[0])) . "'" . addslashes($type_cast_quote) . "')";
2133
-		}
2134
-	}
2135
-
2136
-	if (
2137
-		strpos($val[0], '@@defaultcast@@') !== false
2138
-		and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r)
2139
-	) {
2140
-		$val[0] = substr($val[0], 0, -strlen($r[0])) . "'char')";
2141
-	}
2142
-
2143
-	// Indicateur pour permettre aux fonctionx boucle_X de modifier
2144
-	// leurs requetes par defaut, notamment le champ statut
2145
-	// Ne pas confondre champs de la table principale et des jointures
2146
-	if ($table === $boucle->id_table) {
2147
-		$boucles[$idb]->modificateur['criteres'][$col_vraie] = true;
2148
-		if ($col_alias != $col_vraie) {
2149
-			$boucles[$idb]->modificateur['criteres'][$col_alias] = true;
2150
-		}
2151
-	}
2152
-
2153
-	// inserer le nom de la table SQL devant le nom du champ
2154
-	if ($table) {
2155
-		if ($col[0] == '`') {
2156
-			$arg = "$table." . substr($col, 1, -1);
2157
-		} else {
2158
-			$arg = "$table.$col";
2159
-		}
2160
-	} else {
2161
-		$arg = $col;
2162
-	}
2163
-
2164
-	// inserer la fonction SQL
2165
-	if ($fct) {
2166
-		$arg = "$fct($arg$args_sql)";
2167
-	}
2168
-
2169
-	return [$arg, $op, $val, $col_alias, $where_complement];
2011
+    $boucle = &$boucles[$idb];
2012
+    $type = $boucle->type_requete;
2013
+    $table = $boucle->id_table;
2014
+    $desc = $boucle->show;
2015
+    $col_vraie = null;
2016
+
2017
+    list($fct, $col, $op, $val, $args_sql) =
2018
+        calculer_critere_infixe_ops($idb, $boucles, $crit);
2019
+
2020
+    $col_alias = $col;
2021
+    $where_complement = false;
2022
+
2023
+    // Cas particulier : id_enfant => utiliser la colonne id_objet
2024
+    if ($col == 'id_enfant') {
2025
+        $col = $boucle->primary;
2026
+    }
2027
+
2028
+    // Cas particulier : id_parent => verifier les exceptions de tables
2029
+    if (
2030
+        (in_array($col, ['id_parent', 'id_secteur']) and isset($GLOBALS['exceptions_des_tables'][$table][$col]))
2031
+        or (isset($GLOBALS['exceptions_des_tables'][$table][$col]) and is_string($GLOBALS['exceptions_des_tables'][$table][$col]))
2032
+    ) {
2033
+        $col = $GLOBALS['exceptions_des_tables'][$table][$col];
2034
+    } // et possibilite de gerer un critere secteur sur des tables de plugins (ie forums)
2035
+    else {
2036
+        if (($col == 'id_secteur') and ($critere_secteur = charger_fonction("critere_secteur_$type", 'public', true))) {
2037
+            $table = $critere_secteur($idb, $boucles, $val, $crit);
2038
+        }
2039
+
2040
+        // cas id_article=xx qui se mappe en id_objet=xx AND objet=article
2041
+        // sauf si exception declaree : sauter cette etape
2042
+        else {
2043
+            if (
2044
+                !isset($GLOBALS['exceptions_des_jointures'][table_objet_sql($table)][$col])
2045
+                and !isset($GLOBALS['exceptions_des_jointures'][$col])
2046
+                and count(trouver_champs_decomposes($col, $desc)) > 1
2047
+            ) {
2048
+                $e = decompose_champ_id_objet($col);
2049
+                $col = array_shift($e);
2050
+                $where_complement = primary_doublee($e, $table);
2051
+            } // Cas particulier : expressions de date
2052
+            else {
2053
+                if ($c = calculer_critere_infixe_date($idb, $boucles, $col)) {
2054
+                    list($col, $col_vraie) = $c;
2055
+                    $table = '';
2056
+                } // table explicitée {mots.titre}
2057
+                else {
2058
+                    if (preg_match('/^(.*)\.(.*)$/', $col, $r)) {
2059
+                        list(, $table, $col) = $r;
2060
+                        $col_alias = $col;
2061
+
2062
+                        $trouver_table = charger_fonction('trouver_table', 'base');
2063
+                        if (
2064
+                            $desc = $trouver_table($table, $boucle->sql_serveur)
2065
+                            and isset($desc['field'][$col])
2066
+                            and $cle = array_search($desc['table'], $boucle->from)
2067
+                        ) {
2068
+                            $table = $cle;
2069
+                        } else {
2070
+                            $table = trouver_jointure_champ($col, $boucle, [$table], ($crit->cond or $op != '='));
2071
+                        }
2072
+                        #$table = calculer_critere_externe_init($boucle, array($table), $col, $desc, ($crit->cond OR $op!='='), true);
2073
+                        if (!$table) {
2074
+                            return '';
2075
+                        }
2076
+                    }
2077
+                    // si le champ n'est pas trouvé dans la table,
2078
+                    // on cherche si une jointure peut l'obtenir
2079
+                    elseif (@!array_key_exists($col, $desc['field'])) {
2080
+                        // Champ joker * des iterateurs DATA qui accepte tout
2081
+                        if (@array_key_exists('*', $desc['field'])) {
2082
+                            $desc['field'][$col_vraie ? $col_vraie : $col] = ''; // on veut pas de cast INT par defaut car le type peut etre n'importe quoi dans les boucles DATA
2083
+                        }
2084
+                        else {
2085
+                            $r = calculer_critere_infixe_externe($boucle, $crit, $op, $desc, $col, $col_alias, $table);
2086
+                            if (!$r) {
2087
+                                return '';
2088
+                            }
2089
+                            list($col, $col_alias, $table, $where_complement, $desc) = $r;
2090
+                        }
2091
+                    }
2092
+                }
2093
+            }
2094
+        }
2095
+    }
2096
+
2097
+    $col_vraie = ($col_vraie ? $col_vraie : $col);
2098
+    // Dans tous les cas,
2099
+    // virer les guillemets eventuels autour d'un int (qui sont refuses par certains SQL)
2100
+    // et passer dans sql_quote avec le type si connu
2101
+    // et int sinon si la valeur est numerique
2102
+    // sinon introduire le vrai type du champ si connu dans le sql_quote (ou int NOT NULL sinon)
2103
+    // Ne pas utiliser intval, PHP tronquant les Bigint de SQL
2104
+    if ($op == '=' or in_array($op, $GLOBALS['table_criteres_infixes'])) {
2105
+        $type_cast_quote = (isset($desc['field'][$col_vraie]) ? $desc['field'][$col_vraie] : 'int NOT NULL');
2106
+        // defaire le quote des int et les passer dans sql_quote avec le bon type de champ si on le connait, int sinon
2107
+        // prendre en compte le debug ou la valeur arrive avec un commentaire PHP en debut
2108
+        if (preg_match(",^\\A(\s*//.*?$\s*)?\"'(-?\d+)'\"\\z,ms", $val[0], $r)) {
2109
+            $val[0] = $r[1] . '"' . sql_quote($r[2], $boucle->sql_serveur, $type_cast_quote) . '"';
2110
+        }
2111
+        // sinon expliciter les
2112
+        // sql_quote(truc) en sql_quote(truc,'',type)
2113
+        // sql_quote(truc,serveur) en sql_quote(truc,serveur,type)
2114
+        // sql_quote(truc,serveur,'') en sql_quote(truc,serveur,type)
2115
+        // sans toucher aux
2116
+        // sql_quote(truc,'','varchar(10) DEFAULT \'oui\' COLLATE NOCASE')
2117
+        // sql_quote(truc,'','varchar')
2118
+        elseif (
2119
+            preg_match('/\Asql_quote[(](.*?)(,[^)]*?)?(,[^)]*(?:\(\d+\)[^)]*)?)?[)]\s*\z/ms', $val[0], $r)
2120
+            // si pas deja un type
2121
+            and (!isset($r[3]) or !$r[3] or !trim($r[3], ", '"))
2122
+        ) {
2123
+            $r = $r[1]
2124
+                . ((isset($r[2]) and $r[2]) ? $r[2] : ",''")
2125
+                . ",'" . addslashes($type_cast_quote) . "'";
2126
+            $val[0] = "sql_quote($r)";
2127
+        }
2128
+        elseif (
2129
+            strpos($val[0], '@@defaultcast@@') !== false
2130
+            and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r)
2131
+        ) {
2132
+            $val[0] = substr($val[0], 0, -strlen($r[0])) . "'" . addslashes($type_cast_quote) . "')";
2133
+        }
2134
+    }
2135
+
2136
+    if (
2137
+        strpos($val[0], '@@defaultcast@@') !== false
2138
+        and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r)
2139
+    ) {
2140
+        $val[0] = substr($val[0], 0, -strlen($r[0])) . "'char')";
2141
+    }
2142
+
2143
+    // Indicateur pour permettre aux fonctionx boucle_X de modifier
2144
+    // leurs requetes par defaut, notamment le champ statut
2145
+    // Ne pas confondre champs de la table principale et des jointures
2146
+    if ($table === $boucle->id_table) {
2147
+        $boucles[$idb]->modificateur['criteres'][$col_vraie] = true;
2148
+        if ($col_alias != $col_vraie) {
2149
+            $boucles[$idb]->modificateur['criteres'][$col_alias] = true;
2150
+        }
2151
+    }
2152
+
2153
+    // inserer le nom de la table SQL devant le nom du champ
2154
+    if ($table) {
2155
+        if ($col[0] == '`') {
2156
+            $arg = "$table." . substr($col, 1, -1);
2157
+        } else {
2158
+            $arg = "$table.$col";
2159
+        }
2160
+    } else {
2161
+        $arg = $col;
2162
+    }
2163
+
2164
+    // inserer la fonction SQL
2165
+    if ($fct) {
2166
+        $arg = "$fct($arg$args_sql)";
2167
+    }
2168
+
2169
+    return [$arg, $op, $val, $col_alias, $where_complement];
2170 2170
 }
2171 2171
 
2172 2172
 
@@ -2195,78 +2195,78 @@  discard block
 block discarded – undo
2195 2195
  **/
2196 2196
 function calculer_critere_infixe_externe($boucle, $crit, $op, $desc, $col, $col_alias, $table) {
2197 2197
 
2198
-	$where = '';
2199
-
2200
-	$calculer_critere_externe = 'calculer_critere_externe_init';
2201
-	// gestion par les plugins des jointures tordues
2202
-	// pas automatiques mais necessaires
2203
-	$table_sql = table_objet_sql($table);
2204
-	if (
2205
-		isset($GLOBALS['exceptions_des_jointures'][$table_sql])
2206
-		and is_array($GLOBALS['exceptions_des_jointures'][$table_sql])
2207
-		and
2208
-		(
2209
-			isset($GLOBALS['exceptions_des_jointures'][$table_sql][$col])
2210
-			or
2211
-			isset($GLOBALS['exceptions_des_jointures'][$table_sql][''])
2212
-		)
2213
-	) {
2214
-		$t = $GLOBALS['exceptions_des_jointures'][$table_sql];
2215
-		$index = isset($t[$col])
2216
-			? $t[$col] : (isset($t['']) ? $t[''] : []);
2217
-
2218
-		if (count($index) == 3) {
2219
-			list($t, $col, $calculer_critere_externe) = $index;
2220
-		} elseif (count($index) == 2) {
2221
-			list($t, $col) = $t[$col];
2222
-		} elseif (count($index) == 1) {
2223
-			list($calculer_critere_externe) = $index;
2224
-			$t = $table;
2225
-		} else {
2226
-			$t = '';
2227
-		} // jointure non declaree. La trouver.
2228
-	} elseif (isset($GLOBALS['exceptions_des_jointures'][$col])) {
2229
-		list($t, $col) = $GLOBALS['exceptions_des_jointures'][$col];
2230
-	} else {
2231
-		$t = '';
2232
-	} // jointure non declaree. La trouver.
2233
-
2234
-	// ici on construit le from pour fournir $col en piochant dans les jointures
2235
-
2236
-	// si des jointures explicites sont fournies, on cherche d'abord dans celles ci
2237
-	// permet de forcer une table de lien quand il y a ambiguite
2238
-	// <BOUCLE_(DOCUMENTS documents_liens){id_mot}>
2239
-	// alors que <BOUCLE_(DOCUMENTS){id_mot}> produit la meme chose que <BOUCLE_(DOCUMENTS mots_liens){id_mot}>
2240
-	$table = '';
2241
-	if ($boucle->jointures_explicites) {
2242
-		$jointures_explicites = explode(' ', $boucle->jointures_explicites);
2243
-		$table = $calculer_critere_externe($boucle, $jointures_explicites, $col, $desc, ($crit->cond or $op != '='), $t);
2244
-	}
2245
-
2246
-	// et sinon on cherche parmi toutes les jointures declarees
2247
-	if (!$table) {
2248
-		$table = $calculer_critere_externe($boucle, $boucle->jointures, $col, $desc, ($crit->cond or $op != '='), $t);
2249
-	}
2250
-
2251
-	if (!$table) {
2252
-		return '';
2253
-	}
2254
-
2255
-	// il ne reste plus qu'a trouver le champ dans les from
2256
-	list($nom, $desc, $cle) = trouver_champ_exterieur($col, $boucle->from, $boucle);
2257
-
2258
-	if (count($cle) > 1 or reset($cle) !== $col) {
2259
-		$col_alias = $col; // id_article devient juste le nom d'origine
2260
-		if (count($cle) > 1 and reset($cle) == 'id_objet') {
2261
-			$e = decompose_champ_id_objet($col);
2262
-			$col = array_shift($e);
2263
-			$where = primary_doublee($e, $table);
2264
-		} else {
2265
-			$col = reset($cle);
2266
-		}
2267
-	}
2268
-
2269
-	return [$col, $col_alias, $table, $where, $desc];
2198
+    $where = '';
2199
+
2200
+    $calculer_critere_externe = 'calculer_critere_externe_init';
2201
+    // gestion par les plugins des jointures tordues
2202
+    // pas automatiques mais necessaires
2203
+    $table_sql = table_objet_sql($table);
2204
+    if (
2205
+        isset($GLOBALS['exceptions_des_jointures'][$table_sql])
2206
+        and is_array($GLOBALS['exceptions_des_jointures'][$table_sql])
2207
+        and
2208
+        (
2209
+            isset($GLOBALS['exceptions_des_jointures'][$table_sql][$col])
2210
+            or
2211
+            isset($GLOBALS['exceptions_des_jointures'][$table_sql][''])
2212
+        )
2213
+    ) {
2214
+        $t = $GLOBALS['exceptions_des_jointures'][$table_sql];
2215
+        $index = isset($t[$col])
2216
+            ? $t[$col] : (isset($t['']) ? $t[''] : []);
2217
+
2218
+        if (count($index) == 3) {
2219
+            list($t, $col, $calculer_critere_externe) = $index;
2220
+        } elseif (count($index) == 2) {
2221
+            list($t, $col) = $t[$col];
2222
+        } elseif (count($index) == 1) {
2223
+            list($calculer_critere_externe) = $index;
2224
+            $t = $table;
2225
+        } else {
2226
+            $t = '';
2227
+        } // jointure non declaree. La trouver.
2228
+    } elseif (isset($GLOBALS['exceptions_des_jointures'][$col])) {
2229
+        list($t, $col) = $GLOBALS['exceptions_des_jointures'][$col];
2230
+    } else {
2231
+        $t = '';
2232
+    } // jointure non declaree. La trouver.
2233
+
2234
+    // ici on construit le from pour fournir $col en piochant dans les jointures
2235
+
2236
+    // si des jointures explicites sont fournies, on cherche d'abord dans celles ci
2237
+    // permet de forcer une table de lien quand il y a ambiguite
2238
+    // <BOUCLE_(DOCUMENTS documents_liens){id_mot}>
2239
+    // alors que <BOUCLE_(DOCUMENTS){id_mot}> produit la meme chose que <BOUCLE_(DOCUMENTS mots_liens){id_mot}>
2240
+    $table = '';
2241
+    if ($boucle->jointures_explicites) {
2242
+        $jointures_explicites = explode(' ', $boucle->jointures_explicites);
2243
+        $table = $calculer_critere_externe($boucle, $jointures_explicites, $col, $desc, ($crit->cond or $op != '='), $t);
2244
+    }
2245
+
2246
+    // et sinon on cherche parmi toutes les jointures declarees
2247
+    if (!$table) {
2248
+        $table = $calculer_critere_externe($boucle, $boucle->jointures, $col, $desc, ($crit->cond or $op != '='), $t);
2249
+    }
2250
+
2251
+    if (!$table) {
2252
+        return '';
2253
+    }
2254
+
2255
+    // il ne reste plus qu'a trouver le champ dans les from
2256
+    list($nom, $desc, $cle) = trouver_champ_exterieur($col, $boucle->from, $boucle);
2257
+
2258
+    if (count($cle) > 1 or reset($cle) !== $col) {
2259
+        $col_alias = $col; // id_article devient juste le nom d'origine
2260
+        if (count($cle) > 1 and reset($cle) == 'id_objet') {
2261
+            $e = decompose_champ_id_objet($col);
2262
+            $col = array_shift($e);
2263
+            $where = primary_doublee($e, $table);
2264
+        } else {
2265
+            $col = reset($cle);
2266
+        }
2267
+    }
2268
+
2269
+    return [$col, $col_alias, $table, $where, $desc];
2270 2270
 }
2271 2271
 
2272 2272
 
@@ -2287,10 +2287,10 @@  discard block
 block discarded – undo
2287 2287
  *     - valeur
2288 2288
  **/
2289 2289
 function primary_doublee($decompose, $table) {
2290
-	$e1 = reset($decompose);
2291
-	$e2 = "sql_quote('" . end($decompose) . "')";
2290
+    $e1 = reset($decompose);
2291
+    $e2 = "sql_quote('" . end($decompose) . "')";
2292 2292
 
2293
-	return ["'='", "'$table." . $e1 . "'", $e2];
2293
+    return ["'='", "'$table." . $e1 . "'", $e2];
2294 2294
 }
2295 2295
 
2296 2296
 /**
@@ -2321,57 +2321,57 @@  discard block
 block discarded – undo
2321 2321
  *     Vide sinon.
2322 2322
  */
2323 2323
 function calculer_critere_externe_init(&$boucle, $joints, $col, $desc, $cond, $checkarrivee = false) {
2324
-	// si on demande un truc du genre spip_mots
2325
-	// avec aussi spip_mots_liens dans les jointures dispo
2326
-	// et qu'on est la
2327
-	// il faut privilegier la jointure directe en 2 etapes spip_mots_liens, spip_mots
2328
-	if (
2329
-		$checkarrivee
2330
-		and is_string($checkarrivee)
2331
-		and $a = table_objet($checkarrivee)
2332
-		and in_array($a . '_liens', $joints)
2333
-	) {
2334
-		if ($res = calculer_lien_externe_init($boucle, $joints, $col, $desc, $cond, $checkarrivee)) {
2335
-			return $res;
2336
-		}
2337
-	}
2338
-	foreach ($joints as $joint) {
2339
-		if ($arrivee = trouver_champ_exterieur($col, [$joint], $boucle, $checkarrivee)) {
2340
-			// alias de table dans le from
2341
-			$t = array_search($arrivee[0], $boucle->from);
2342
-			// recuperer la cle id_xx eventuellement decomposee en (id_objet,objet)
2343
-			$cols = $arrivee[2];
2344
-			// mais on ignore la 3eme cle si presente qui correspond alors au point de depart
2345
-			if (count($cols) > 2) {
2346
-				array_pop($cols);
2347
-			}
2348
-			if ($t) {
2349
-				// la table est déjà dans le FROM, on vérifie si le champ est utilisé.
2350
-				$joindre = false;
2351
-				foreach ($cols as $col) {
2352
-					$c = '/\b' . $t . ".$col" . '\b/';
2353
-					if (trouver_champ($c, $boucle->where)) {
2354
-						$joindre = true;
2355
-					} else {
2356
-						// mais ca peut etre dans le FIELD pour le Having
2357
-						$c = "/FIELD.$t" . ".$col,/";
2358
-						if (trouver_champ($c, $boucle->select)) {
2359
-							$joindre = true;
2360
-						}
2361
-					}
2362
-				}
2363
-				if (!$joindre) {
2364
-					return $t;
2365
-				}
2366
-			}
2367
-			array_pop($arrivee);
2368
-			if ($res = calculer_jointure($boucle, [$boucle->id_table, $desc], $arrivee, $cols, $cond, 1)) {
2369
-				return $res;
2370
-			}
2371
-		}
2372
-	}
2373
-
2374
-	return '';
2324
+    // si on demande un truc du genre spip_mots
2325
+    // avec aussi spip_mots_liens dans les jointures dispo
2326
+    // et qu'on est la
2327
+    // il faut privilegier la jointure directe en 2 etapes spip_mots_liens, spip_mots
2328
+    if (
2329
+        $checkarrivee
2330
+        and is_string($checkarrivee)
2331
+        and $a = table_objet($checkarrivee)
2332
+        and in_array($a . '_liens', $joints)
2333
+    ) {
2334
+        if ($res = calculer_lien_externe_init($boucle, $joints, $col, $desc, $cond, $checkarrivee)) {
2335
+            return $res;
2336
+        }
2337
+    }
2338
+    foreach ($joints as $joint) {
2339
+        if ($arrivee = trouver_champ_exterieur($col, [$joint], $boucle, $checkarrivee)) {
2340
+            // alias de table dans le from
2341
+            $t = array_search($arrivee[0], $boucle->from);
2342
+            // recuperer la cle id_xx eventuellement decomposee en (id_objet,objet)
2343
+            $cols = $arrivee[2];
2344
+            // mais on ignore la 3eme cle si presente qui correspond alors au point de depart
2345
+            if (count($cols) > 2) {
2346
+                array_pop($cols);
2347
+            }
2348
+            if ($t) {
2349
+                // la table est déjà dans le FROM, on vérifie si le champ est utilisé.
2350
+                $joindre = false;
2351
+                foreach ($cols as $col) {
2352
+                    $c = '/\b' . $t . ".$col" . '\b/';
2353
+                    if (trouver_champ($c, $boucle->where)) {
2354
+                        $joindre = true;
2355
+                    } else {
2356
+                        // mais ca peut etre dans le FIELD pour le Having
2357
+                        $c = "/FIELD.$t" . ".$col,/";
2358
+                        if (trouver_champ($c, $boucle->select)) {
2359
+                            $joindre = true;
2360
+                        }
2361
+                    }
2362
+                }
2363
+                if (!$joindre) {
2364
+                    return $t;
2365
+                }
2366
+            }
2367
+            array_pop($arrivee);
2368
+            if ($res = calculer_jointure($boucle, [$boucle->id_table, $desc], $arrivee, $cols, $cond, 1)) {
2369
+                return $res;
2370
+            }
2371
+        }
2372
+    }
2373
+
2374
+    return '';
2375 2375
 }
2376 2376
 
2377 2377
 /**
@@ -2397,35 +2397,35 @@  discard block
 block discarded – undo
2397 2397
  *     Alias de la table de jointure (Lx)
2398 2398
  */
2399 2399
 function calculer_lien_externe_init(&$boucle, $joints, $col, $desc, $cond, $checkarrivee = false) {
2400
-	$primary_arrivee = id_table_objet($checkarrivee);
2401
-
2402
-	// [FIXME] $checkarrivee peut-il arriver avec false ????
2403
-	$intermediaire = trouver_champ_exterieur($primary_arrivee, $joints, $boucle, $checkarrivee . '_liens');
2404
-	$arrivee = trouver_champ_exterieur($col, $joints, $boucle, $checkarrivee);
2405
-
2406
-	if (!$intermediaire or !$arrivee) {
2407
-		return '';
2408
-	}
2409
-	array_pop($intermediaire); // enlever la cle en 3eme argument
2410
-	array_pop($arrivee); // enlever la cle en 3eme argument
2411
-
2412
-	$res = fabrique_jointures(
2413
-		$boucle,
2414
-		[
2415
-			[
2416
-				$boucle->id_table,
2417
-				$intermediaire,
2418
-				[id_table_objet($desc['table_objet']), 'id_objet', 'objet', $desc['type']]
2419
-			],
2420
-			[reset($intermediaire), $arrivee, $primary_arrivee]
2421
-		],
2422
-		$cond,
2423
-		$desc,
2424
-		$boucle->id_table,
2425
-		[$col]
2426
-	);
2427
-
2428
-	return $res;
2400
+    $primary_arrivee = id_table_objet($checkarrivee);
2401
+
2402
+    // [FIXME] $checkarrivee peut-il arriver avec false ????
2403
+    $intermediaire = trouver_champ_exterieur($primary_arrivee, $joints, $boucle, $checkarrivee . '_liens');
2404
+    $arrivee = trouver_champ_exterieur($col, $joints, $boucle, $checkarrivee);
2405
+
2406
+    if (!$intermediaire or !$arrivee) {
2407
+        return '';
2408
+    }
2409
+    array_pop($intermediaire); // enlever la cle en 3eme argument
2410
+    array_pop($arrivee); // enlever la cle en 3eme argument
2411
+
2412
+    $res = fabrique_jointures(
2413
+        $boucle,
2414
+        [
2415
+            [
2416
+                $boucle->id_table,
2417
+                $intermediaire,
2418
+                [id_table_objet($desc['table_objet']), 'id_objet', 'objet', $desc['type']]
2419
+            ],
2420
+            [reset($intermediaire), $arrivee, $primary_arrivee]
2421
+        ],
2422
+        $cond,
2423
+        $desc,
2424
+        $boucle->id_table,
2425
+        [$col]
2426
+    );
2427
+
2428
+    return $res;
2429 2429
 }
2430 2430
 
2431 2431
 
@@ -2442,17 +2442,17 @@  discard block
 block discarded – undo
2442 2442
  *     false sinon.
2443 2443
  **/
2444 2444
 function trouver_champ($champ, $where) {
2445
-	if (!is_array($where)) {
2446
-		return preg_match($champ, $where);
2447
-	} else {
2448
-		foreach ($where as $clause) {
2449
-			if (trouver_champ($champ, $clause)) {
2450
-				return true;
2451
-			}
2452
-		}
2453
-
2454
-		return false;
2455
-	}
2445
+    if (!is_array($where)) {
2446
+        return preg_match($champ, $where);
2447
+    } else {
2448
+        foreach ($where as $clause) {
2449
+            if (trouver_champ($champ, $clause)) {
2450
+                return true;
2451
+            }
2452
+        }
2453
+
2454
+        return false;
2455
+    }
2456 2456
 }
2457 2457
 
2458 2458
 
@@ -2478,130 +2478,130 @@  discard block
 block discarded – undo
2478 2478
  *     - string $args_sql  Suite des arguments du critère. ?
2479 2479
  **/
2480 2480
 function calculer_critere_infixe_ops($idb, &$boucles, $crit) {
2481
-	// cas d'une valeur comparee a elle-meme ou son referent
2482
-	if (count($crit->param) == 0) {
2483
-		$op = '=';
2484
-		$col = $val = $crit->op;
2485
-		if (preg_match('/^(.*)\.(.*)$/', $col, $r)) {
2486
-			$val = $r[2];
2487
-		}
2488
-		// Cas special {lang} : aller chercher $GLOBALS['spip_lang']
2489
-		if ($val == 'lang') {
2490
-			$val = [kwote('$GLOBALS[\'spip_lang\']')];
2491
-		} else {
2492
-			$defaut = null;
2493
-			if ($val == 'id_parent') {
2494
-				// Si id_parent, comparer l'id_parent avec l'id_objet
2495
-				// de la boucle superieure.... faudrait verifier qu'il existe
2496
-				// pour eviter l'erreur SQL
2497
-				$val = $boucles[$idb]->primary;
2498
-				// mais si pas de boucle superieure, prendre id_parent dans l'env
2499
-				$defaut = "@\$Pile[0]['id_parent']";
2500
-			} elseif ($val == 'id_enfant') {
2501
-				// Si id_enfant, comparer l'id_objet avec l'id_parent
2502
-				// de la boucle superieure
2503
-				$val = 'id_parent';
2504
-			} elseif ($crit->cond and ($col == 'date' or $col == 'date_redac')) {
2505
-				// un critere conditionnel sur date est traite a part
2506
-				// car la date est mise d'office par SPIP,
2507
-				$defaut = "(\$Pile[0]['{$col}_default']?'':\$Pile[0]['" . $col . "'])";
2508
-			}
2509
-
2510
-			$val = calculer_argument_precedent($idb, $val, $boucles, $defaut);
2511
-			$val = [kwote($val)];
2512
-		}
2513
-	} else {
2514
-		// comparaison explicite
2515
-		// le phraseur impose que le premier param soit du texte
2516
-		$params = $crit->param;
2517
-		$op = $crit->op;
2518
-		if ($op == '==') {
2519
-			$op = 'REGEXP';
2520
-		}
2521
-		$col = array_shift($params);
2522
-		$col = $col[0]->texte;
2523
-
2524
-		$val = [];
2525
-		$parent = $boucles[$idb]->id_parent;
2526
-
2527
-		// Dans le cas {x=='#DATE'} etc, defaire le travail du phraseur,
2528
-		// celui ne sachant pas ce qu'est un critere infixe
2529
-		// et a fortiori son 2e operande qu'entoure " ou '
2530
-		if (
2531
-			count($params) == 1
2532
-			and count($params[0]) == 3
2533
-			and $params[0][0]->type == 'texte'
2534
-			and $params[0][2]->type == 'texte'
2535
-			and ($p = $params[0][0]->texte) == $params[0][2]->texte
2536
-			and (($p == "'") or ($p == '"'))
2537
-			and $params[0][1]->type == 'champ'
2538
-		) {
2539
-			$val[] = "$p\\$p#" . $params[0][1]->nom_champ . "\\$p$p";
2540
-		} else {
2541
-			foreach ((($op != 'IN') ? $params : calculer_vieux_in($params)) as $p) {
2542
-				$a = calculer_liste($p, $idb, $boucles, $parent);
2543
-				if (strcasecmp($op, 'IN') == 0) {
2544
-					$val[] = $a;
2545
-				} else {
2546
-					$val[] = kwote($a, $boucles[$idb]->sql_serveur, '@@defaultcast@@');
2547
-				} // toujours quoter en char ici
2548
-			}
2549
-		}
2550
-	}
2551
-
2552
-	$fct = $args_sql = '';
2553
-	// fonction SQL ?
2554
-	// chercher FONCTION(champ) tel que CONCAT(titre,descriptif)
2555
-	if (preg_match('/^(.*)' . SQL_ARGS . '$/', $col, $m)) {
2556
-		$fct = $m[1];
2557
-		preg_match('/^\(([^,]*)(.*)\)$/', $m[2], $a);
2558
-		$col = $a[1];
2559
-		if (preg_match('/^(\S*)(\s+AS\s+.*)$/i', $col, $m)) {
2560
-			$col = $m[1];
2561
-			$args_sql = $m[2];
2562
-		}
2563
-		$args_sql .= $a[2];
2564
-	}
2565
-
2566
-	return [$fct, $col, $op, $val, $args_sql];
2481
+    // cas d'une valeur comparee a elle-meme ou son referent
2482
+    if (count($crit->param) == 0) {
2483
+        $op = '=';
2484
+        $col = $val = $crit->op;
2485
+        if (preg_match('/^(.*)\.(.*)$/', $col, $r)) {
2486
+            $val = $r[2];
2487
+        }
2488
+        // Cas special {lang} : aller chercher $GLOBALS['spip_lang']
2489
+        if ($val == 'lang') {
2490
+            $val = [kwote('$GLOBALS[\'spip_lang\']')];
2491
+        } else {
2492
+            $defaut = null;
2493
+            if ($val == 'id_parent') {
2494
+                // Si id_parent, comparer l'id_parent avec l'id_objet
2495
+                // de la boucle superieure.... faudrait verifier qu'il existe
2496
+                // pour eviter l'erreur SQL
2497
+                $val = $boucles[$idb]->primary;
2498
+                // mais si pas de boucle superieure, prendre id_parent dans l'env
2499
+                $defaut = "@\$Pile[0]['id_parent']";
2500
+            } elseif ($val == 'id_enfant') {
2501
+                // Si id_enfant, comparer l'id_objet avec l'id_parent
2502
+                // de la boucle superieure
2503
+                $val = 'id_parent';
2504
+            } elseif ($crit->cond and ($col == 'date' or $col == 'date_redac')) {
2505
+                // un critere conditionnel sur date est traite a part
2506
+                // car la date est mise d'office par SPIP,
2507
+                $defaut = "(\$Pile[0]['{$col}_default']?'':\$Pile[0]['" . $col . "'])";
2508
+            }
2509
+
2510
+            $val = calculer_argument_precedent($idb, $val, $boucles, $defaut);
2511
+            $val = [kwote($val)];
2512
+        }
2513
+    } else {
2514
+        // comparaison explicite
2515
+        // le phraseur impose que le premier param soit du texte
2516
+        $params = $crit->param;
2517
+        $op = $crit->op;
2518
+        if ($op == '==') {
2519
+            $op = 'REGEXP';
2520
+        }
2521
+        $col = array_shift($params);
2522
+        $col = $col[0]->texte;
2523
+
2524
+        $val = [];
2525
+        $parent = $boucles[$idb]->id_parent;
2526
+
2527
+        // Dans le cas {x=='#DATE'} etc, defaire le travail du phraseur,
2528
+        // celui ne sachant pas ce qu'est un critere infixe
2529
+        // et a fortiori son 2e operande qu'entoure " ou '
2530
+        if (
2531
+            count($params) == 1
2532
+            and count($params[0]) == 3
2533
+            and $params[0][0]->type == 'texte'
2534
+            and $params[0][2]->type == 'texte'
2535
+            and ($p = $params[0][0]->texte) == $params[0][2]->texte
2536
+            and (($p == "'") or ($p == '"'))
2537
+            and $params[0][1]->type == 'champ'
2538
+        ) {
2539
+            $val[] = "$p\\$p#" . $params[0][1]->nom_champ . "\\$p$p";
2540
+        } else {
2541
+            foreach ((($op != 'IN') ? $params : calculer_vieux_in($params)) as $p) {
2542
+                $a = calculer_liste($p, $idb, $boucles, $parent);
2543
+                if (strcasecmp($op, 'IN') == 0) {
2544
+                    $val[] = $a;
2545
+                } else {
2546
+                    $val[] = kwote($a, $boucles[$idb]->sql_serveur, '@@defaultcast@@');
2547
+                } // toujours quoter en char ici
2548
+            }
2549
+        }
2550
+    }
2551
+
2552
+    $fct = $args_sql = '';
2553
+    // fonction SQL ?
2554
+    // chercher FONCTION(champ) tel que CONCAT(titre,descriptif)
2555
+    if (preg_match('/^(.*)' . SQL_ARGS . '$/', $col, $m)) {
2556
+        $fct = $m[1];
2557
+        preg_match('/^\(([^,]*)(.*)\)$/', $m[2], $a);
2558
+        $col = $a[1];
2559
+        if (preg_match('/^(\S*)(\s+AS\s+.*)$/i', $col, $m)) {
2560
+            $col = $m[1];
2561
+            $args_sql = $m[2];
2562
+        }
2563
+        $args_sql .= $a[2];
2564
+    }
2565
+
2566
+    return [$fct, $col, $op, $val, $args_sql];
2567 2567
 }
2568 2568
 
2569 2569
 // compatibilite ancienne version
2570 2570
 
2571 2571
 // https://code.spip.net/@calculer_vieux_in
2572 2572
 function calculer_vieux_in($params) {
2573
-	$deb = $params[0][0];
2574
-	$k = count($params) - 1;
2575
-	$last = $params[$k];
2576
-	$j = count($last) - 1;
2577
-	$last = $last[$j];
2578
-	$n = isset($last->texte) ? strlen($last->texte) : 0;
2579
-
2580
-	if (
2581
-		!((isset($deb->texte[0]) and $deb->texte[0] == '(')
2582
-		&& (isset($last->texte[$n - 1]) and $last->texte[$n - 1] == ')'))
2583
-	) {
2584
-		return $params;
2585
-	}
2586
-	$params[0][0]->texte = substr($deb->texte, 1);
2587
-	// attention, on peut avoir k=0,j=0 ==> recalculer
2588
-	$last = $params[$k][$j];
2589
-	$n = strlen($last->texte);
2590
-	$params[$k][$j]->texte = substr($last->texte, 0, $n - 1);
2591
-	$newp = [];
2592
-	foreach ($params as $v) {
2593
-		if ($v[0]->type != 'texte') {
2594
-			$newp[] = $v;
2595
-		} else {
2596
-			foreach (explode(',', $v[0]->texte) as $x) {
2597
-				$t = new Texte();
2598
-				$t->texte = $x;
2599
-				$newp[] = [$t];
2600
-			}
2601
-		}
2602
-	}
2603
-
2604
-	return $newp;
2573
+    $deb = $params[0][0];
2574
+    $k = count($params) - 1;
2575
+    $last = $params[$k];
2576
+    $j = count($last) - 1;
2577
+    $last = $last[$j];
2578
+    $n = isset($last->texte) ? strlen($last->texte) : 0;
2579
+
2580
+    if (
2581
+        !((isset($deb->texte[0]) and $deb->texte[0] == '(')
2582
+        && (isset($last->texte[$n - 1]) and $last->texte[$n - 1] == ')'))
2583
+    ) {
2584
+        return $params;
2585
+    }
2586
+    $params[0][0]->texte = substr($deb->texte, 1);
2587
+    // attention, on peut avoir k=0,j=0 ==> recalculer
2588
+    $last = $params[$k][$j];
2589
+    $n = strlen($last->texte);
2590
+    $params[$k][$j]->texte = substr($last->texte, 0, $n - 1);
2591
+    $newp = [];
2592
+    foreach ($params as $v) {
2593
+        if ($v[0]->type != 'texte') {
2594
+            $newp[] = $v;
2595
+        } else {
2596
+            foreach (explode(',', $v[0]->texte) as $x) {
2597
+                $t = new Texte();
2598
+                $t->texte = $x;
2599
+                $newp[] = [$t];
2600
+            }
2601
+        }
2602
+    }
2603
+
2604
+    return $newp;
2605 2605
 }
2606 2606
 
2607 2607
 /**
@@ -2620,89 +2620,89 @@  discard block
 block discarded – undo
2620 2620
  *     - nom de la colonne de date (si le calcul n'est pas relatif)
2621 2621
  **/
2622 2622
 function calculer_critere_infixe_date($idb, &$boucles, $col) {
2623
-	if (!preg_match(',^((age|jour|mois|annee)_relatif|date|mois|annee|jour|heure|age)(_[a-z_]+)?$,', $col, $regs)) {
2624
-		return '';
2625
-	}
2626
-
2627
-	$boucle = $boucles[$idb];
2628
-	$table = $boucle->show;
2629
-
2630
-	// si c'est une colonne de la table, ne rien faire
2631
-	if (isset($table['field'][$col])) {
2632
-		return '';
2633
-	}
2634
-
2635
-	if (!$table['date'] && !isset($GLOBALS['table_date'][$table['id_table']])) {
2636
-		return '';
2637
-	}
2638
-	$pred = $date_orig = isset($GLOBALS['table_date'][$table['id_table']]) ? $GLOBALS['table_date'][$table['id_table']] : $table['date'];
2639
-
2640
-	$col = $regs[1];
2641
-	if (isset($regs[3]) and $suite = $regs[3]) {
2642
-		# Recherche de l'existence du champ date_xxxx,
2643
-		# si oui choisir ce champ, sinon choisir xxxx
2644
-
2645
-		if (isset($table['field']["date$suite"])) {
2646
-			$date_orig = 'date' . $suite;
2647
-		} else {
2648
-			$date_orig = substr($suite, 1);
2649
-		}
2650
-		$pred = $date_orig;
2651
-	} else {
2652
-		if (isset($regs[2]) and $rel = $regs[2]) {
2653
-			$pred = 'date';
2654
-		}
2655
-	}
2656
-
2657
-	$date_compare = "\"' . normaliser_date(" .
2658
-		calculer_argument_precedent($idb, $pred, $boucles) .
2659
-		") . '\"";
2660
-
2661
-	$col_vraie = $date_orig;
2662
-	$date_orig = $boucle->id_table . '.' . $date_orig;
2663
-
2664
-	switch ($col) {
2665
-		case 'date':
2666
-			$col = $date_orig;
2667
-			break;
2668
-		case 'jour':
2669
-			$col = "DAYOFMONTH($date_orig)";
2670
-			break;
2671
-		case 'mois':
2672
-			$col = "MONTH($date_orig)";
2673
-			break;
2674
-		case 'annee':
2675
-			$col = "YEAR($date_orig)";
2676
-			break;
2677
-		case 'heure':
2678
-			$col = "DATE_FORMAT($date_orig, \\'%H:%i\\')";
2679
-			break;
2680
-		case 'age':
2681
-			$col = calculer_param_date("\'' . date('Y-m-d H:i:00') . '\'", $date_orig);
2682
-			$col_vraie = '';// comparer a un int (par defaut)
2683
-			break;
2684
-		case 'age_relatif':
2685
-			$col = calculer_param_date($date_compare, $date_orig);
2686
-			$col_vraie = '';// comparer a un int (par defaut)
2687
-			break;
2688
-		case 'jour_relatif':
2689
-			$col = '(TO_DAYS(' . $date_compare . ')-TO_DAYS(' . $date_orig . '))';
2690
-			$col_vraie = '';// comparer a un int (par defaut)
2691
-			break;
2692
-		case 'mois_relatif':
2693
-			$col = 'MONTH(' . $date_compare . ')-MONTH(' .
2694
-				$date_orig . ')+12*(YEAR(' . $date_compare .
2695
-				')-YEAR(' . $date_orig . '))';
2696
-			$col_vraie = '';// comparer a un int (par defaut)
2697
-			break;
2698
-		case 'annee_relatif':
2699
-			$col = 'YEAR(' . $date_compare . ')-YEAR(' .
2700
-				$date_orig . ')';
2701
-			$col_vraie = '';// comparer a un int (par defaut)
2702
-			break;
2703
-	}
2704
-
2705
-	return [$col, $col_vraie];
2623
+    if (!preg_match(',^((age|jour|mois|annee)_relatif|date|mois|annee|jour|heure|age)(_[a-z_]+)?$,', $col, $regs)) {
2624
+        return '';
2625
+    }
2626
+
2627
+    $boucle = $boucles[$idb];
2628
+    $table = $boucle->show;
2629
+
2630
+    // si c'est une colonne de la table, ne rien faire
2631
+    if (isset($table['field'][$col])) {
2632
+        return '';
2633
+    }
2634
+
2635
+    if (!$table['date'] && !isset($GLOBALS['table_date'][$table['id_table']])) {
2636
+        return '';
2637
+    }
2638
+    $pred = $date_orig = isset($GLOBALS['table_date'][$table['id_table']]) ? $GLOBALS['table_date'][$table['id_table']] : $table['date'];
2639
+
2640
+    $col = $regs[1];
2641
+    if (isset($regs[3]) and $suite = $regs[3]) {
2642
+        # Recherche de l'existence du champ date_xxxx,
2643
+        # si oui choisir ce champ, sinon choisir xxxx
2644
+
2645
+        if (isset($table['field']["date$suite"])) {
2646
+            $date_orig = 'date' . $suite;
2647
+        } else {
2648
+            $date_orig = substr($suite, 1);
2649
+        }
2650
+        $pred = $date_orig;
2651
+    } else {
2652
+        if (isset($regs[2]) and $rel = $regs[2]) {
2653
+            $pred = 'date';
2654
+        }
2655
+    }
2656
+
2657
+    $date_compare = "\"' . normaliser_date(" .
2658
+        calculer_argument_precedent($idb, $pred, $boucles) .
2659
+        ") . '\"";
2660
+
2661
+    $col_vraie = $date_orig;
2662
+    $date_orig = $boucle->id_table . '.' . $date_orig;
2663
+
2664
+    switch ($col) {
2665
+        case 'date':
2666
+            $col = $date_orig;
2667
+            break;
2668
+        case 'jour':
2669
+            $col = "DAYOFMONTH($date_orig)";
2670
+            break;
2671
+        case 'mois':
2672
+            $col = "MONTH($date_orig)";
2673
+            break;
2674
+        case 'annee':
2675
+            $col = "YEAR($date_orig)";
2676
+            break;
2677
+        case 'heure':
2678
+            $col = "DATE_FORMAT($date_orig, \\'%H:%i\\')";
2679
+            break;
2680
+        case 'age':
2681
+            $col = calculer_param_date("\'' . date('Y-m-d H:i:00') . '\'", $date_orig);
2682
+            $col_vraie = '';// comparer a un int (par defaut)
2683
+            break;
2684
+        case 'age_relatif':
2685
+            $col = calculer_param_date($date_compare, $date_orig);
2686
+            $col_vraie = '';// comparer a un int (par defaut)
2687
+            break;
2688
+        case 'jour_relatif':
2689
+            $col = '(TO_DAYS(' . $date_compare . ')-TO_DAYS(' . $date_orig . '))';
2690
+            $col_vraie = '';// comparer a un int (par defaut)
2691
+            break;
2692
+        case 'mois_relatif':
2693
+            $col = 'MONTH(' . $date_compare . ')-MONTH(' .
2694
+                $date_orig . ')+12*(YEAR(' . $date_compare .
2695
+                ')-YEAR(' . $date_orig . '))';
2696
+            $col_vraie = '';// comparer a un int (par defaut)
2697
+            break;
2698
+        case 'annee_relatif':
2699
+            $col = 'YEAR(' . $date_compare . ')-YEAR(' .
2700
+                $date_orig . ')';
2701
+            $col_vraie = '';// comparer a un int (par defaut)
2702
+            break;
2703
+    }
2704
+
2705
+    return [$col, $col_vraie];
2706 2706
 }
2707 2707
 
2708 2708
 /**
@@ -2721,16 +2721,16 @@  discard block
 block discarded – undo
2721 2721
  *     de colonne SQL et une date.
2722 2722
  **/
2723 2723
 function calculer_param_date($date_compare, $date_orig) {
2724
-	if (preg_match(",'\" *\.(.*)\. *\"',", $date_compare, $r)) {
2725
-		$init = "'\" . (\$x = $r[1]) . \"'";
2726
-		$date_compare = '\'$x\'';
2727
-	} else {
2728
-		$init = $date_compare;
2729
-	}
2730
-
2731
-	return
2732
-		// optimisation : mais prevoir le support SQLite avant
2733
-		"TIMESTAMPDIFF(HOUR,$date_orig,$init)/24";
2724
+    if (preg_match(",'\" *\.(.*)\. *\"',", $date_compare, $r)) {
2725
+        $init = "'\" . (\$x = $r[1]) . \"'";
2726
+        $date_compare = '\'$x\'';
2727
+    } else {
2728
+        $init = $date_compare;
2729
+    }
2730
+
2731
+    return
2732
+        // optimisation : mais prevoir le support SQLite avant
2733
+        "TIMESTAMPDIFF(HOUR,$date_orig,$init)/24";
2734 2734
 }
2735 2735
 
2736 2736
 /**
@@ -2748,20 +2748,20 @@  discard block
 block discarded – undo
2748 2748
  * @param Critere $crit Paramètres du critère dans cette boucle
2749 2749
  */
2750 2750
 function critere_DATA_source_dist($idb, &$boucles, $crit) {
2751
-	$boucle = &$boucles[$idb];
2752
-
2753
-	$args = [];
2754
-	foreach ($crit->param as &$param) {
2755
-		array_push(
2756
-			$args,
2757
-			calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent)
2758
-		);
2759
-	}
2751
+    $boucle = &$boucles[$idb];
2760 2752
 
2761
-	$boucle->hash .= '
2753
+    $args = [];
2754
+    foreach ($crit->param as &$param) {
2755
+        array_push(
2756
+            $args,
2757
+            calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent)
2758
+        );
2759
+    }
2760
+
2761
+    $boucle->hash .= '
2762 2762
 	$command[\'sourcemode\'] = ' . array_shift($args) . ";\n";
2763 2763
 
2764
-	$boucle->hash .= '
2764
+    $boucle->hash .= '
2765 2765
 	$command[\'source\'] = array(' . join(', ', $args) . ");\n";
2766 2766
 }
2767 2767
 
@@ -2779,8 +2779,8 @@  discard block
 block discarded – undo
2779 2779
  * @param Critere $crit Paramètres du critère dans cette boucle
2780 2780
  */
2781 2781
 function critere_DATA_datacache_dist($idb, &$boucles, $crit) {
2782
-	$boucle = &$boucles[$idb];
2783
-	$boucle->hash .= '
2782
+    $boucle = &$boucles[$idb];
2783
+    $boucle->hash .= '
2784 2784
 	$command[\'datacache\'] = ' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent) . ';';
2785 2785
 }
2786 2786
 
@@ -2796,12 +2796,12 @@  discard block
 block discarded – undo
2796 2796
  * @param Critere $crit Paramètres du critère dans cette boucle
2797 2797
  */
2798 2798
 function critere_php_args_dist($idb, &$boucles, $crit) {
2799
-	$boucle = &$boucles[$idb];
2800
-	$boucle->hash .= '$command[\'args\']=array();';
2801
-	foreach ($crit->param as $param) {
2802
-		$boucle->hash .= '
2799
+    $boucle = &$boucles[$idb];
2800
+    $boucle->hash .= '$command[\'args\']=array();';
2801
+    foreach ($crit->param as $param) {
2802
+        $boucle->hash .= '
2803 2803
 			$command[\'args\'][] = ' . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ';';
2804
-	}
2804
+    }
2805 2805
 }
2806 2806
 
2807 2807
 /**
@@ -2818,16 +2818,16 @@  discard block
 block discarded – undo
2818 2818
  * @param Critere $crit Paramètres du critère dans cette boucle
2819 2819
  */
2820 2820
 function critere_DATA_liste_dist($idb, &$boucles, $crit) {
2821
-	$boucle = &$boucles[$idb];
2822
-	$boucle->hash .= "\n\t" . '$command[\'liste\'] = array();' . "\n";
2823
-	foreach ($crit->param as $param) {
2824
-		$boucle->hash .= "\t" . '$command[\'liste\'][] = ' . calculer_liste(
2825
-			$param,
2826
-			$idb,
2827
-			$boucles,
2828
-			$boucles[$idb]->id_parent
2829
-		) . ";\n";
2830
-	}
2821
+    $boucle = &$boucles[$idb];
2822
+    $boucle->hash .= "\n\t" . '$command[\'liste\'] = array();' . "\n";
2823
+    foreach ($crit->param as $param) {
2824
+        $boucle->hash .= "\t" . '$command[\'liste\'][] = ' . calculer_liste(
2825
+            $param,
2826
+            $idb,
2827
+            $boucles,
2828
+            $boucles[$idb]->id_parent
2829
+        ) . ";\n";
2830
+    }
2831 2831
 }
2832 2832
 
2833 2833
 /**
@@ -2852,16 +2852,16 @@  discard block
 block discarded – undo
2852 2852
  * @param Critere $crit Paramètres du critère dans cette boucle
2853 2853
  */
2854 2854
 function critere_DATA_enum_dist($idb, &$boucles, $crit) {
2855
-	$boucle = &$boucles[$idb];
2856
-	$boucle->hash .= "\n\t" . '$command[\'enum\'] = array();' . "\n";
2857
-	foreach ($crit->param as $param) {
2858
-		$boucle->hash .= "\t" . '$command[\'enum\'][] = ' . calculer_liste(
2859
-			$param,
2860
-			$idb,
2861
-			$boucles,
2862
-			$boucles[$idb]->id_parent
2863
-		) . ";\n";
2864
-	}
2855
+    $boucle = &$boucles[$idb];
2856
+    $boucle->hash .= "\n\t" . '$command[\'enum\'] = array();' . "\n";
2857
+    foreach ($crit->param as $param) {
2858
+        $boucle->hash .= "\t" . '$command[\'enum\'][] = ' . calculer_liste(
2859
+            $param,
2860
+            $idb,
2861
+            $boucles,
2862
+            $boucles[$idb]->id_parent
2863
+        ) . ";\n";
2864
+    }
2865 2865
 }
2866 2866
 
2867 2867
 /**
@@ -2876,11 +2876,11 @@  discard block
 block discarded – undo
2876 2876
  * @param Critere $crit Paramètres du critère dans cette boucle
2877 2877
  */
2878 2878
 function critere_DATA_datapath_dist($idb, &$boucles, $crit) {
2879
-	$boucle = &$boucles[$idb];
2880
-	foreach ($crit->param as $param) {
2881
-		$boucle->hash .= '
2879
+    $boucle = &$boucles[$idb];
2880
+    foreach ($crit->param as $param) {
2881
+        $boucle->hash .= '
2882 2882
 			$command[\'datapath\'][] = ' . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ';';
2883
-	}
2883
+    }
2884 2884
 }
2885 2885
 
2886 2886
 
@@ -2912,20 +2912,20 @@  discard block
 block discarded – undo
2912 2912
  * @param Critere $crit Paramètres du critère dans cette boucle
2913 2913
  */
2914 2914
 function critere_si_dist($idb, &$boucles, $crit) {
2915
-	$boucle = &$boucles[$idb];
2916
-	// il faut initialiser 1 fois le tableau a chaque appel de la boucle
2917
-	// (par exemple lorsque notre boucle est appelee dans une autre boucle)
2918
-	// mais ne pas l'initialiser n fois si il y a n criteres {si } dans la boucle !
2919
-	$boucle->hash .= "\n\tif (!isset(\$si_init)) { \$command['si'] = array(); \$si_init = true; }\n";
2920
-	if ($crit->param) {
2921
-		foreach ($crit->param as $param) {
2922
-			$boucle->hash .= "\t\$command['si'][] = "
2923
-				. calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ";\n";
2924
-		}
2925
-		// interdire {si 0} aussi !
2926
-	} else {
2927
-		$boucle->hash .= '$command[\'si\'][] = 0;';
2928
-	}
2915
+    $boucle = &$boucles[$idb];
2916
+    // il faut initialiser 1 fois le tableau a chaque appel de la boucle
2917
+    // (par exemple lorsque notre boucle est appelee dans une autre boucle)
2918
+    // mais ne pas l'initialiser n fois si il y a n criteres {si } dans la boucle !
2919
+    $boucle->hash .= "\n\tif (!isset(\$si_init)) { \$command['si'] = array(); \$si_init = true; }\n";
2920
+    if ($crit->param) {
2921
+        foreach ($crit->param as $param) {
2922
+            $boucle->hash .= "\t\$command['si'][] = "
2923
+                . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ";\n";
2924
+        }
2925
+        // interdire {si 0} aussi !
2926
+    } else {
2927
+        $boucle->hash .= '$command[\'si\'][] = 0;';
2928
+    }
2929 2929
 }
2930 2930
 
2931 2931
 /**
@@ -2942,8 +2942,8 @@  discard block
 block discarded – undo
2942 2942
  * @param Critere $crit Paramètres du critère dans cette boucle
2943 2943
  */
2944 2944
 function critere_POUR_tableau_dist($idb, &$boucles, $crit) {
2945
-	$boucle = &$boucles[$idb];
2946
-	$boucle->hash .= '
2945
+    $boucle = &$boucles[$idb];
2946
+    $boucle->hash .= '
2947 2947
 	$command[\'source\'] = array(' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent) . ');
2948 2948
 	$command[\'sourcemode\'] = \'table\';';
2949 2949
 }
@@ -2964,29 +2964,29 @@  discard block
 block discarded – undo
2964 2964
  */
2965 2965
 function critere_noeud_dist($idb, &$boucles, $crit) {
2966 2966
 
2967
-	$not = $crit->not;
2968
-	$boucle = &$boucles[$idb];
2969
-	$primary = $boucle->primary;
2967
+    $not = $crit->not;
2968
+    $boucle = &$boucles[$idb];
2969
+    $primary = $boucle->primary;
2970 2970
 
2971
-	if (!$primary or strpos($primary, ',')) {
2972
-		erreur_squelette(_T('zbug_doublon_sur_table_sans_cle_primaire'), $boucle);
2971
+    if (!$primary or strpos($primary, ',')) {
2972
+        erreur_squelette(_T('zbug_doublon_sur_table_sans_cle_primaire'), $boucle);
2973 2973
 
2974
-		return;
2975
-	}
2976
-	$table = $boucle->type_requete;
2977
-	$table_sql = table_objet_sql(objet_type($table));
2974
+        return;
2975
+    }
2976
+    $table = $boucle->type_requete;
2977
+    $table_sql = table_objet_sql(objet_type($table));
2978 2978
 
2979
-	$id_parent = isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent']) ?
2980
-		$GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] :
2981
-		'id_parent';
2979
+    $id_parent = isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent']) ?
2980
+        $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] :
2981
+        'id_parent';
2982 2982
 
2983
-	$in = 'IN';
2984
-	$where = ["'IN'", "'$boucle->id_table." . "$primary'", "'('.sql_get_select('$id_parent', '$table_sql').')'"];
2985
-	if ($not) {
2986
-		$where = ["'NOT'", $where];
2987
-	}
2983
+    $in = 'IN';
2984
+    $where = ["'IN'", "'$boucle->id_table." . "$primary'", "'('.sql_get_select('$id_parent', '$table_sql').')'"];
2985
+    if ($not) {
2986
+        $where = ["'NOT'", $where];
2987
+    }
2988 2988
 
2989
-	$boucle->where[] = $where;
2989
+    $boucle->where[] = $where;
2990 2990
 }
2991 2991
 
2992 2992
 /**
@@ -3002,8 +3002,8 @@  discard block
 block discarded – undo
3002 3002
  * @param Critere $crit Paramètres du critère dans cette boucle
3003 3003
  */
3004 3004
 function critere_feuille_dist($idb, &$boucles, $crit) {
3005
-	$not = $crit->not;
3006
-	$crit->not = $not ? false : true;
3007
-	critere_noeud_dist($idb, $boucles, $crit);
3008
-	$crit->not = $not;
3005
+    $not = $crit->not;
3006
+    $crit->not = $not ? false : true;
3007
+    critere_noeud_dist($idb, $boucles, $crit);
3008
+    $crit->not = $not;
3009 3009
 }
Please login to merge, or discard this patch.
ecrire/public/admin.php 1 patch
Indentation   +23 added lines, -23 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,33 +34,33 @@  discard block
 block discarded – undo
34 34
  *     Contenu HTML, avec boutons d'administrations et sa CSS
35 35
  **/
36 36
 function affiche_boutons_admin($contenu) {
37
-	include_spip('inc/filtres');
37
+    include_spip('inc/filtres');
38 38
 
39
-	// Inserer le css d'admin
40
-	$css = "<link rel='stylesheet' href='" . url_absolue(direction_css(find_in_path('spip_admin.css')))
41
-		. "' type='text/css' />\n";
42
-	if ($f = find_in_path('spip_admin_perso.css')) {
43
-		$css .= "<link rel='stylesheet' href='"
44
-			. url_absolue(direction_css($f)) . "' type='text/css' />\n";
45
-	}
39
+    // Inserer le css d'admin
40
+    $css = "<link rel='stylesheet' href='" . url_absolue(direction_css(find_in_path('spip_admin.css')))
41
+        . "' type='text/css' />\n";
42
+    if ($f = find_in_path('spip_admin_perso.css')) {
43
+        $css .= "<link rel='stylesheet' href='"
44
+            . url_absolue(direction_css($f)) . "' type='text/css' />\n";
45
+    }
46 46
 
47
-	($pos = stripos($contenu, '</head>'))
48
-	|| ($pos = stripos($contenu, '<body>'))
49
-	|| ($pos = 0);
50
-	$contenu = substr_replace($contenu, $css, $pos, 0);
47
+    ($pos = stripos($contenu, '</head>'))
48
+    || ($pos = stripos($contenu, '<body>'))
49
+    || ($pos = 0);
50
+    $contenu = substr_replace($contenu, $css, $pos, 0);
51 51
 
52 52
 
53
-	// Inserer la balise #FORMULAIRE_ADMIN, en float
54
-	$boutons_admin = inclure_balise_dynamique(
55
-		balise_FORMULAIRE_ADMIN_dyn('spip-admin-float'),
56
-		false
57
-	);
53
+    // Inserer la balise #FORMULAIRE_ADMIN, en float
54
+    $boutons_admin = inclure_balise_dynamique(
55
+        balise_FORMULAIRE_ADMIN_dyn('spip-admin-float'),
56
+        false
57
+    );
58 58
 
59
-	($pos = strripos($contenu, '</body>'))
60
-	|| ($pos = strripos($contenu, '</html>'))
61
-	|| ($pos = strlen($contenu));
62
-	$contenu = substr_replace($contenu, $boutons_admin, $pos, 0);
59
+    ($pos = strripos($contenu, '</body>'))
60
+    || ($pos = strripos($contenu, '</html>'))
61
+    || ($pos = strlen($contenu));
62
+    $contenu = substr_replace($contenu, $boutons_admin, $pos, 0);
63 63
 
64 64
 
65
-	return $contenu;
65
+    return $contenu;
66 66
 }
Please login to merge, or discard this patch.
ecrire/public/normaliser.php 1 patch
Indentation   +159 added lines, -159 removed lines patch added patch discarded remove patch
@@ -11,7 +11,7 @@  discard block
 block discarded – undo
11 11
 \***************************************************************************/
12 12
 
13 13
 if (!defined('_ECRIRE_INC_VERSION')) {
14
-	return;
14
+    return;
15 15
 }
16 16
 
17 17
 // Les fonctions de ce fichier sont appelees en certains points
@@ -25,193 +25,193 @@  discard block
 block discarded – undo
25 25
 // -> https://www.spip.net/fr_article901.html
26 26
 
27 27
 function phraser_vieux_logos(&$p) {
28
-	if ($p->param[0][0]) {
29
-		$args = [''];
30
-	} else {
31
-		$args = array_shift($p->param);
32
-	}
33
-
34
-	foreach ($p->param as $couple) {
35
-		$nom = trim($couple[0]);
36
-		if ($nom == '') {
37
-			array_shift($p->param);
38
-			break;
39
-		}
40
-		$r = phraser_logo_faux_filtres($nom);
41
-		if ($r === 0) {
42
-			$c = new Texte();
43
-			$c->texte = $nom;
44
-			$args[] = [$c];
45
-			array_shift($p->param);
46
-			spip_log("filtre de logo obsolete $nom", 'vieilles_defs');
47
-		} elseif ($r === 2) {
48
-			$p->etoile = '**';
49
-			array_shift($p->param);
50
-			spip_log("filtre de logo obsolete $nom", 'vieilles_defs');
51
-		} elseif ($r === 1) {
52
-			array_shift($p->param);
53
-			$p->etoile = '*';
54
-			spip_log("filtre de logo obsolete $nom", 'vieilles_defs');
55
-		} elseif (preg_match('/^' . NOM_DE_CHAMP . '(.*)$/sS', $nom, $m)) {
56
-			$champ = new Champ();
57
-			$champ->nom_boucle = $m[2];
58
-			$champ->nom_champ = $m[3];
59
-			$champ->etoile = $m[5];
60
-			$champ = [$champ];
61
-			if ($m[6]) {
62
-				$r = new Texte();
63
-				$r->texte = $m[6];
64
-				$champ[] = $r;
65
-			}
66
-			$args[] = $champ;
67
-			array_shift($p->param);
68
-			spip_log("filtre de logo obsolete $nom", 'vieilles_defs');
69
-		} // le cas else est la seule incompatibilite
70
-	}
71
-	array_unshift($p->param, $args);
28
+    if ($p->param[0][0]) {
29
+        $args = [''];
30
+    } else {
31
+        $args = array_shift($p->param);
32
+    }
33
+
34
+    foreach ($p->param as $couple) {
35
+        $nom = trim($couple[0]);
36
+        if ($nom == '') {
37
+            array_shift($p->param);
38
+            break;
39
+        }
40
+        $r = phraser_logo_faux_filtres($nom);
41
+        if ($r === 0) {
42
+            $c = new Texte();
43
+            $c->texte = $nom;
44
+            $args[] = [$c];
45
+            array_shift($p->param);
46
+            spip_log("filtre de logo obsolete $nom", 'vieilles_defs');
47
+        } elseif ($r === 2) {
48
+            $p->etoile = '**';
49
+            array_shift($p->param);
50
+            spip_log("filtre de logo obsolete $nom", 'vieilles_defs');
51
+        } elseif ($r === 1) {
52
+            array_shift($p->param);
53
+            $p->etoile = '*';
54
+            spip_log("filtre de logo obsolete $nom", 'vieilles_defs');
55
+        } elseif (preg_match('/^' . NOM_DE_CHAMP . '(.*)$/sS', $nom, $m)) {
56
+            $champ = new Champ();
57
+            $champ->nom_boucle = $m[2];
58
+            $champ->nom_champ = $m[3];
59
+            $champ->etoile = $m[5];
60
+            $champ = [$champ];
61
+            if ($m[6]) {
62
+                $r = new Texte();
63
+                $r->texte = $m[6];
64
+                $champ[] = $r;
65
+            }
66
+            $args[] = $champ;
67
+            array_shift($p->param);
68
+            spip_log("filtre de logo obsolete $nom", 'vieilles_defs');
69
+        } // le cas else est la seule incompatibilite
70
+    }
71
+    array_unshift($p->param, $args);
72 72
 }
73 73
 
74 74
 
75 75
 function phraser_logo_faux_filtres($nom) {
76
-	switch ($nom) {
77
-		case 'top':
78
-		case 'left':
79
-		case 'right':
80
-		case 'center':
81
-		case 'bottom':
82
-			return 0;
83
-		case 'lien':
84
-			return 1;
85
-		case 'fichier':
86
-			return 2;
87
-		default:
88
-			return $nom;
89
-	}
76
+    switch ($nom) {
77
+        case 'top':
78
+        case 'left':
79
+        case 'right':
80
+        case 'center':
81
+        case 'bottom':
82
+            return 0;
83
+        case 'lien':
84
+            return 1;
85
+        case 'fichier':
86
+            return 2;
87
+        default:
88
+            return $nom;
89
+    }
90 90
 }
91 91
 
92 92
 
93 93
 // La balise embed_document est a present le modele emb
94 94
 
95 95
 function phraser_vieux_emb(&$p) {
96
-	if (!is_array($p->param)) {
97
-		$p->param = [];
98
-	}
99
-
100
-	// Produire le premier argument {emb}
101
-	$texte = new Texte();
102
-	$texte->texte = 'emb';
103
-	$param = ['', [$texte]];
104
-
105
-	// Transformer les filtres en arguments
106
-	for ($i = 0; $i < count($p->param); $i++) {
107
-		if ($p->param[$i][0]) {
108
-			if (!strstr($p->param[$i][0], '=')) {
109
-				break;
110
-			}# on a rencontre un vrai filtre, c'est fini
111
-			$texte = new Texte();
112
-			$texte->texte = $p->param[$i][0];
113
-			$param[] = [$texte];
114
-		}
115
-		array_shift($p->param);
116
-	}
117
-	array_unshift($p->param, $param);
118
-	spip_log('balise EMBED_DOCUMENT obsolete', 'vieilles_defs');
119
-	$p->nom_champ = 'MODELE';
96
+    if (!is_array($p->param)) {
97
+        $p->param = [];
98
+    }
99
+
100
+    // Produire le premier argument {emb}
101
+    $texte = new Texte();
102
+    $texte->texte = 'emb';
103
+    $param = ['', [$texte]];
104
+
105
+    // Transformer les filtres en arguments
106
+    for ($i = 0; $i < count($p->param); $i++) {
107
+        if ($p->param[$i][0]) {
108
+            if (!strstr($p->param[$i][0], '=')) {
109
+                break;
110
+            }# on a rencontre un vrai filtre, c'est fini
111
+            $texte = new Texte();
112
+            $texte->texte = $p->param[$i][0];
113
+            $param[] = [$texte];
114
+        }
115
+        array_shift($p->param);
116
+    }
117
+    array_unshift($p->param, $param);
118
+    spip_log('balise EMBED_DOCUMENT obsolete', 'vieilles_defs');
119
+    $p->nom_champ = 'MODELE';
120 120
 }
121 121
 
122 122
 // Vieux formulaire de recherch
123 123
 
124 124
 function phraser_vieux_recherche($p) {
125
-	if ($p->param[0][0]) {
126
-		$c = new Texte();
127
-		$c->texte = $p->param[0][0];
128
-		$p->param[0][1] = [$c];
129
-		$p->param[0][0] = '';
130
-		$p->fonctions = [];
131
-		spip_log('FORMULAIRE_RECHERCHE avec filtre ' . $c->texte, 'vieilles_defs');
132
-	}
125
+    if ($p->param[0][0]) {
126
+        $c = new Texte();
127
+        $c->texte = $p->param[0][0];
128
+        $p->param[0][1] = [$c];
129
+        $p->param[0][0] = '';
130
+        $p->fonctions = [];
131
+        spip_log('FORMULAIRE_RECHERCHE avec filtre ' . $c->texte, 'vieilles_defs');
132
+    }
133 133
 }
134 134
 
135 135
 // Gerer la notation [(#EXPOSER|on,off)]
136 136
 function phraser_vieux_exposer($p) {
137
-	if ($a = $p->fonctions) {
138
-		preg_match('#([^,]*)(,(.*))?#', $a[0][0], $regs);
139
-		$args = [];
140
-		if ($regs[1]) {
141
-			$a = new Texte();
142
-			$a->texte = $regs[1];
143
-			$args = ['', [$a]];
144
-			if ($regs[3]) {
145
-				$a = new Texte();
146
-				$a->texte = $regs[3];
147
-				$args[] = [$a];
148
-			}
149
-		}
150
-		$p->param[0] = $args;
151
-		$p->fonctions = [];
152
-		$p->nom_champ = 'EXPOSE';
153
-	}
137
+    if ($a = $p->fonctions) {
138
+        preg_match('#([^,]*)(,(.*))?#', $a[0][0], $regs);
139
+        $args = [];
140
+        if ($regs[1]) {
141
+            $a = new Texte();
142
+            $a->texte = $regs[1];
143
+            $args = ['', [$a]];
144
+            if ($regs[3]) {
145
+                $a = new Texte();
146
+                $a->texte = $regs[3];
147
+                $args[] = [$a];
148
+            }
149
+        }
150
+        $p->param[0] = $args;
151
+        $p->fonctions = [];
152
+        $p->nom_champ = 'EXPOSE';
153
+    }
154 154
 }
155 155
 
156 156
 function phraser_vieux_modele($p) {
157
- normaliser_args_inclumodel($p);
157
+    normaliser_args_inclumodel($p);
158 158
 }
159 159
 
160 160
 function phraser_vieux_inclu($p) {
161
- normaliser_args_inclumodel($p);
161
+    normaliser_args_inclumodel($p);
162 162
 }
163 163
 
164 164
 function normaliser_args_inclumodel($p) {
165
-	$params = $p->param;
166
-	if (!$params) {
167
-		return;
168
-	}
169
-	$args = $params[0];
170
-	if ($args[0]) {
171
-		return;
172
-	} // filtre immediat
173
-	array_shift($p->param);
174
-	foreach ($p->param as $l) {
175
-		if (!array_shift($l)) {
176
-			$args = array_merge($args, $l);
177
-			array_shift($p->param);
178
-		} else {
179
-			break;
180
-		} // filtre
181
-	}
182
-	array_unshift($p->param, $args);
165
+    $params = $p->param;
166
+    if (!$params) {
167
+        return;
168
+    }
169
+    $args = $params[0];
170
+    if ($args[0]) {
171
+        return;
172
+    } // filtre immediat
173
+    array_shift($p->param);
174
+    foreach ($p->param as $l) {
175
+        if (!array_shift($l)) {
176
+            $args = array_merge($args, $l);
177
+            array_shift($p->param);
178
+        } else {
179
+            break;
180
+        } // filtre
181
+    }
182
+    array_unshift($p->param, $args);
183 183
 }
184 184
 
185 185
 function normaliser_inclure($champ) {
186
-	normaliser_args_inclumodel($champ);
187
-	$l = $champ->param[0];
188
-	if (is_array($l) and !$l[0]) {
189
-		foreach ($l as $k => $p) {
190
-			if ($p and $p[0]->type == 'texte' and !strpos($p[0]->texte, '=')) {
191
-				$p[0]->texte = trim($p[0]->texte);
192
-			}
193
-		}
194
-		foreach ($l as $k => $p) {
195
-			if (
196
-				!$p or $p[0]->type != 'texte' or
197
-				!preg_match('/^fond\s*=\s*(.*)$/', $p[0]->texte, $r)
198
-			) {
199
-				continue;
200
-			}
201
-
202
-			if ($r[1]) {
203
-				$p[0]->texte = $r[1];
204
-			} else {
205
-				unset($p[0]);
206
-			}
207
-			$champ->texte = $p;
208
-			unset($champ->param[0][$k]);
209
-			if (count($champ->param[0]) == 1) {
210
-				array_shift($champ->param);
211
-			}
212
-
213
-			return;
214
-		}
215
-	}
216
-	spip_log('inclure sans fond ni fichier');
186
+    normaliser_args_inclumodel($champ);
187
+    $l = $champ->param[0];
188
+    if (is_array($l) and !$l[0]) {
189
+        foreach ($l as $k => $p) {
190
+            if ($p and $p[0]->type == 'texte' and !strpos($p[0]->texte, '=')) {
191
+                $p[0]->texte = trim($p[0]->texte);
192
+            }
193
+        }
194
+        foreach ($l as $k => $p) {
195
+            if (
196
+                !$p or $p[0]->type != 'texte' or
197
+                !preg_match('/^fond\s*=\s*(.*)$/', $p[0]->texte, $r)
198
+            ) {
199
+                continue;
200
+            }
201
+
202
+            if ($r[1]) {
203
+                $p[0]->texte = $r[1];
204
+            } else {
205
+                unset($p[0]);
206
+            }
207
+            $champ->texte = $p;
208
+            unset($champ->param[0][$k]);
209
+            if (count($champ->param[0]) == 1) {
210
+                array_shift($champ->param);
211
+            }
212
+
213
+            return;
214
+        }
215
+    }
216
+    spip_log('inclure sans fond ni fichier');
217 217
 }
Please login to merge, or discard this patch.
ecrire/public/sandbox.php 1 patch
Indentation   +99 added lines, -99 removed lines patch added patch discarded remove patch
@@ -23,7 +23,7 @@  discard block
 block discarded – undo
23 23
  **/
24 24
 
25 25
 if (!defined('_ECRIRE_INC_VERSION')) {
26
-	return;
26
+    return;
27 27
 }
28 28
 
29 29
 /**
@@ -41,9 +41,9 @@  discard block
 block discarded – undo
41 41
  *     Texte
42 42
  */
43 43
 function sandbox_composer_texte($texte, &$p) {
44
-	$code = "'" . str_replace(['\\', "'"], ['\\\\', "\\'"], $texte) . "'";
44
+    $code = "'" . str_replace(['\\', "'"], ['\\\\', "\\'"], $texte) . "'";
45 45
 
46
-	return $code;
46
+    return $code;
47 47
 }
48 48
 
49 49
 
@@ -59,42 +59,42 @@  discard block
 block discarded – undo
59 59
  * @return string
60 60
  */
61 61
 function sandbox_composer_filtre($fonc, $code, $arglist, &$p, $nb_arg_droite = 1000): string {
62
-	if (isset($GLOBALS['spip_matrice'][$fonc])) {
63
-		$code = "filtrer('$fonc',$code$arglist)";
64
-	}
65
-
66
-	// le filtre est defini sous forme de fonction ou de methode
67
-	// par ex. dans inc_texte, inc_filtres ou mes_fonctions
68
-	elseif ($f = chercher_filtre($fonc)) {
69
-		// cas particulier : le filtre |set doit acceder a la $Pile
70
-		// proto: filtre_set(&$Pile, $val, $args...)
71
-		if (strpbrk($f, ':')) { // Class::method
72
-			$refl = new ReflectionMethod($f);
73
-		} else {
74
-			$refl = new ReflectionFunction($f);
75
-		}
76
-		$refs = $refl->getParameters();
77
-		if (isset($refs[0]) and $refs[0]->name == 'Pile') {
78
-			$code = "$f(\$Pile,$code$arglist)";
79
-			$nb_arg_gauche = 2; // la balise à laquelle s'applique le filtre + $Pile
80
-		} else {
81
-			$code = "$f($code$arglist)";
82
-			$nb_arg_gauche = 1; // la balise à laquelle s'applique le filtre
83
-		}
84
-		$nb_args_f = $nb_arg_gauche + $nb_arg_droite;
85
-		$min_f = $refl->getNumberOfRequiredParameters();
86
-		if (($nb_args_f < $min_f)) {
87
-			$msg_args = ['filtre' => texte_script($fonc), 'nb' => $min_f - $nb_args_f];
88
-			erreur_squelette([ 'zbug_erreur_filtre_nbarg_min', $msg_args], $p);
89
-		}
90
-	}
91
-	// le filtre n'existe pas,
92
-	// on le notifie
93
-	else {
94
-		erreur_squelette(['zbug_erreur_filtre', ['filtre' => texte_script($fonc)]], $p);
95
-	}
96
-
97
-	return $code;
62
+    if (isset($GLOBALS['spip_matrice'][$fonc])) {
63
+        $code = "filtrer('$fonc',$code$arglist)";
64
+    }
65
+
66
+    // le filtre est defini sous forme de fonction ou de methode
67
+    // par ex. dans inc_texte, inc_filtres ou mes_fonctions
68
+    elseif ($f = chercher_filtre($fonc)) {
69
+        // cas particulier : le filtre |set doit acceder a la $Pile
70
+        // proto: filtre_set(&$Pile, $val, $args...)
71
+        if (strpbrk($f, ':')) { // Class::method
72
+            $refl = new ReflectionMethod($f);
73
+        } else {
74
+            $refl = new ReflectionFunction($f);
75
+        }
76
+        $refs = $refl->getParameters();
77
+        if (isset($refs[0]) and $refs[0]->name == 'Pile') {
78
+            $code = "$f(\$Pile,$code$arglist)";
79
+            $nb_arg_gauche = 2; // la balise à laquelle s'applique le filtre + $Pile
80
+        } else {
81
+            $code = "$f($code$arglist)";
82
+            $nb_arg_gauche = 1; // la balise à laquelle s'applique le filtre
83
+        }
84
+        $nb_args_f = $nb_arg_gauche + $nb_arg_droite;
85
+        $min_f = $refl->getNumberOfRequiredParameters();
86
+        if (($nb_args_f < $min_f)) {
87
+            $msg_args = ['filtre' => texte_script($fonc), 'nb' => $min_f - $nb_args_f];
88
+            erreur_squelette([ 'zbug_erreur_filtre_nbarg_min', $msg_args], $p);
89
+        }
90
+    }
91
+    // le filtre n'existe pas,
92
+    // on le notifie
93
+    else {
94
+        erreur_squelette(['zbug_erreur_filtre', ['filtre' => texte_script($fonc)]], $p);
95
+    }
96
+
97
+    return $code;
98 98
 }
99 99
 
100 100
 // Calculer un <INCLURE(xx.php)>
@@ -117,15 +117,15 @@  discard block
 block discarded – undo
117 117
  * @return string
118 118
  */
119 119
 function sandbox_composer_inclure_php($fichier, &$p, $_contexte) {
120
-	$compil = texte_script(memoriser_contexte_compil($p));
121
-	// si inexistant, on essaiera a l'execution
122
-	if ($path = find_in_path($fichier)) {
123
-		$path = "\"$path\"";
124
-	} else {
125
-		$path = "find_in_path(\"$fichier\")";
126
-	}
127
-
128
-	return sprintf(CODE_INCLURE_SCRIPT, $path, $fichier, $compil, $_contexte);
120
+    $compil = texte_script(memoriser_contexte_compil($p));
121
+    // si inexistant, on essaiera a l'execution
122
+    if ($path = find_in_path($fichier)) {
123
+        $path = "\"$path\"";
124
+    } else {
125
+        $path = "find_in_path(\"$fichier\")";
126
+    }
127
+
128
+    return sprintf(CODE_INCLURE_SCRIPT, $path, $fichier, $compil, $_contexte);
129 129
 }
130 130
 
131 131
 /**
@@ -137,20 +137,20 @@  discard block
 block discarded – undo
137 137
  * @return string
138 138
  */
139 139
 function sandbox_composer_interdire_scripts($code, &$p) {
140
-	// Securite
141
-	if (
142
-		$p->interdire_scripts
143
-		and $p->etoile != '**'
144
-	) {
145
-		if (!preg_match("/^sinon[(](.*),'([^']*)'[)]$/", $code, $r)) {
146
-			$code = "interdire_scripts($code)";
147
-		} else {
148
-			$code = interdire_scripts($r[2]);
149
-			$code = "sinon(interdire_scripts($r[1]),'$code')";
150
-		}
151
-	}
152
-
153
-	return $code;
140
+    // Securite
141
+    if (
142
+        $p->interdire_scripts
143
+        and $p->etoile != '**'
144
+    ) {
145
+        if (!preg_match("/^sinon[(](.*),'([^']*)'[)]$/", $code, $r)) {
146
+            $code = "interdire_scripts($code)";
147
+        } else {
148
+            $code = interdire_scripts($r[2]);
149
+            $code = "sinon(interdire_scripts($r[1]),'$code')";
150
+        }
151
+    }
152
+
153
+    return $code;
154 154
 }
155 155
 
156 156
 
@@ -169,30 +169,30 @@  discard block
 block discarded – undo
169 169
  * @return mixed|string
170 170
  */
171 171
 function sandbox_filtrer_squelette($skel, $corps, $filtres) {
172
-	$series_filtres = func_get_args();
173
-	array_shift($series_filtres);// skel
174
-	array_shift($series_filtres);// corps
175
-
176
-	// proteger les <INCLUDE> et tous les morceaux de php licites
177
-	if ($skel['process_ins'] == 'php') {
178
-		$corps = preg_replace_callback(',<[?](\s|php|=).*[?]>,UimsS', 'echapper_php_callback', $corps);
179
-	}
180
-
181
-	// recuperer les couples de remplacement
182
-	$replace = echapper_php_callback();
183
-
184
-	foreach ($series_filtres as $filtres) {
185
-		if (count($filtres)) {
186
-			foreach ($filtres as $filtre) {
187
-				if ($filtre and $f = chercher_filtre($filtre)) {
188
-					$corps = $f($corps);
189
-				}
190
-			}
191
-		}
192
-	}
193
-
194
-	// restaurer les echappements
195
-	return str_replace($replace[0], $replace[1], $corps);
172
+    $series_filtres = func_get_args();
173
+    array_shift($series_filtres);// skel
174
+    array_shift($series_filtres);// corps
175
+
176
+    // proteger les <INCLUDE> et tous les morceaux de php licites
177
+    if ($skel['process_ins'] == 'php') {
178
+        $corps = preg_replace_callback(',<[?](\s|php|=).*[?]>,UimsS', 'echapper_php_callback', $corps);
179
+    }
180
+
181
+    // recuperer les couples de remplacement
182
+    $replace = echapper_php_callback();
183
+
184
+    foreach ($series_filtres as $filtres) {
185
+        if (count($filtres)) {
186
+            foreach ($filtres as $filtre) {
187
+                if ($filtre and $f = chercher_filtre($filtre)) {
188
+                    $corps = $f($corps);
189
+                }
190
+            }
191
+        }
192
+    }
193
+
194
+    // restaurer les echappements
195
+    return str_replace($replace[0], $replace[1], $corps);
196 196
 }
197 197
 
198 198
 
@@ -211,21 +211,21 @@  discard block
 block discarded – undo
211 211
  *     - array : Liste( liste des codes PHP, liste des substitutions )
212 212
  **/
213 213
 function echapper_php_callback($r = null) {
214
-	static $src = [];
215
-	static $dst = [];
214
+    static $src = [];
215
+    static $dst = [];
216 216
 
217
-	// si on recoit un tableau, on est en mode echappement
218
-	// on enregistre le code a echapper dans dst, et le code echappe dans src
219
-	if (is_array($r)) {
220
-		$dst[] = $r[0];
217
+    // si on recoit un tableau, on est en mode echappement
218
+    // on enregistre le code a echapper dans dst, et le code echappe dans src
219
+    if (is_array($r)) {
220
+        $dst[] = $r[0];
221 221
 
222
-		return $src[] = '___' . md5($r[0]) . '___';
223
-	}
222
+        return $src[] = '___' . md5($r[0]) . '___';
223
+    }
224 224
 
225
-	// si on recoit pas un tableau, on renvoit les couples de substitution
226
-	// et on RAZ les remplacements
227
-	$r = [$src, $dst];
228
-	$src = $dst = [];
225
+    // si on recoit pas un tableau, on renvoit les couples de substitution
226
+    // et on RAZ les remplacements
227
+    $r = [$src, $dst];
228
+    $src = $dst = [];
229 229
 
230
-	return $r;
230
+    return $r;
231 231
 }
Please login to merge, or discard this patch.
ecrire/public/format_html.php 1 patch
Indentation   +92 added lines, -92 removed lines patch added patch discarded remove patch
@@ -11,129 +11,129 @@
 block discarded – undo
11 11
 \***************************************************************************/
12 12
 
13 13
 if (!defined('_ECRIRE_INC_VERSION')) {
14
-	return;
14
+    return;
15 15
 }
16 16
 
17 17
 function format_boucle_html($preaff, $avant, $nom, $type, $crit, $corps, $apres, $altern, $postaff, $prof) {
18
-	$preaff = $preaff ? "<BB$nom>$preaff" : '';
19
-	$avant = $avant ? "<B$nom>$avant" : '';
20
-	$apres = $apres ? "$apres</B$nom>" : '';
21
-	$altern = $altern ? "$altern<//B$nom>" : '';
22
-	$postaff = $postaff ? "$postaff</BB$nom>" : '';
23
-	if (!$corps) {
24
-		$corps = ' />';
25
-	} else {
26
-		$corps = ">$corps</BOUCLE$nom>";
27
-	}
28
-
29
-	return "$preaff$avant<BOUCLE$nom($type)$crit$corps$apres$altern$postaff";
18
+    $preaff = $preaff ? "<BB$nom>$preaff" : '';
19
+    $avant = $avant ? "<B$nom>$avant" : '';
20
+    $apres = $apres ? "$apres</B$nom>" : '';
21
+    $altern = $altern ? "$altern<//B$nom>" : '';
22
+    $postaff = $postaff ? "$postaff</BB$nom>" : '';
23
+    if (!$corps) {
24
+        $corps = ' />';
25
+    } else {
26
+        $corps = ">$corps</BOUCLE$nom>";
27
+    }
28
+
29
+    return "$preaff$avant<BOUCLE$nom($type)$crit$corps$apres$altern$postaff";
30 30
 }
31 31
 
32 32
 function format_inclure_html($file, $args, $prof) {
33
-	if (strpos($file, '#') === false) {
34
-		$t = $file ? ('(' . $file . ')') : '';
35
-	} else {
36
-		$t = '{fond=' . $file . '}';
37
-	}
38
-	$args = !$args ? '' : ('{' . join(', ', $args) . '}');
39
-
40
-	return ('<INCLURE' . $t . $args . '>');
33
+    if (strpos($file, '#') === false) {
34
+        $t = $file ? ('(' . $file . ')') : '';
35
+    } else {
36
+        $t = '{fond=' . $file . '}';
37
+    }
38
+    $args = !$args ? '' : ('{' . join(', ', $args) . '}');
39
+
40
+    return ('<INCLURE' . $t . $args . '>');
41 41
 }
42 42
 
43 43
 function format_polyglotte_html($args, $prof) {
44
-	$contenu = [];
45
-	foreach ($args as $l => $t) {
46
-		$contenu[] = ($l ? "[$l]" : '') . $t;
47
-	}
44
+    $contenu = [];
45
+    foreach ($args as $l => $t) {
46
+        $contenu[] = ($l ? "[$l]" : '') . $t;
47
+    }
48 48
 
49
-	return ('<multi>' . join(' ', $contenu) . '</multi>');
49
+    return ('<multi>' . join(' ', $contenu) . '</multi>');
50 50
 }
51 51
 
52 52
 function format_idiome_html($nom, $module, $args, $filtres, $prof) {
53
-	foreach ($args as $k => $v) {
54
-		$args[$k] = "$k=$v";
55
-	}
56
-	$args = (!$args ? '' : ('{' . join(',', $args) . '}'));
53
+    foreach ($args as $k => $v) {
54
+        $args[$k] = "$k=$v";
55
+    }
56
+    $args = (!$args ? '' : ('{' . join(',', $args) . '}'));
57 57
 
58
-	return ('<:' . ($module ? "$module:" : '') . $nom . $args . $filtres . ':>');
58
+    return ('<:' . ($module ? "$module:" : '') . $nom . $args . $filtres . ':>');
59 59
 }
60 60
 
61 61
 function format_champ_html($nom, $boucle, $etoile, $avant, $apres, $args, $filtres, $prof) {
62
-	$nom = '#'
63
-		. ($boucle ? ($boucle . ':') : '')
64
-		. $nom
65
-		. $etoile
66
-		. $args
67
-		. $filtres;
62
+    $nom = '#'
63
+        . ($boucle ? ($boucle . ':') : '')
64
+        . $nom
65
+        . $etoile
66
+        . $args
67
+        . $filtres;
68 68
 
69
-	// Determiner si c'est un champ etendu,
69
+    // Determiner si c'est un champ etendu,
70 70
 
71
-	$s = ($avant or $apres or $filtres
72
-		or (strpos($args, '(#') !== false));
71
+    $s = ($avant or $apres or $filtres
72
+        or (strpos($args, '(#') !== false));
73 73
 
74
-	return ($s ? "[$avant($nom)$apres]" : $nom);
74
+    return ($s ? "[$avant($nom)$apres]" : $nom);
75 75
 }
76 76
 
77 77
 function format_critere_html($critere) {
78
-	foreach ($critere as $k => $crit) {
79
-		$crit_s = '';
80
-		foreach ($crit as $operande) {
81
-			list($type, $valeur) = $operande;
82
-			if ($type == 'champ' and $valeur[0] == '[') {
83
-				$valeur = substr($valeur, 1, -1);
84
-				if (preg_match(',^[(](#[^|]*)[)]$,sS', $valeur)) {
85
-					$valeur = substr($valeur, 1, -1);
86
-				}
87
-			}
88
-			$crit_s .= $valeur;
89
-		}
90
-		$critere[$k] = $crit_s;
91
-	}
92
-
93
-	return (!$critere ? '' : ('{' . join(',', $critere) . '}'));
78
+    foreach ($critere as $k => $crit) {
79
+        $crit_s = '';
80
+        foreach ($crit as $operande) {
81
+            list($type, $valeur) = $operande;
82
+            if ($type == 'champ' and $valeur[0] == '[') {
83
+                $valeur = substr($valeur, 1, -1);
84
+                if (preg_match(',^[(](#[^|]*)[)]$,sS', $valeur)) {
85
+                    $valeur = substr($valeur, 1, -1);
86
+                }
87
+            }
88
+            $crit_s .= $valeur;
89
+        }
90
+        $critere[$k] = $crit_s;
91
+    }
92
+
93
+    return (!$critere ? '' : ('{' . join(',', $critere) . '}'));
94 94
 }
95 95
 
96 96
 function format_liste_html($fonc, $args, $prof) {
97
-	return ((($fonc !== '') ? "|$fonc" : $fonc)
98
-		. (!$args ? '' : ('{' . join(',', $args) . '}')));
97
+    return ((($fonc !== '') ? "|$fonc" : $fonc)
98
+        . (!$args ? '' : ('{' . join(',', $args) . '}')));
99 99
 }
100 100
 
101 101
 // Concatenation sans separateur: verifier qu'on ne cree pas de faux lexemes
102 102
 function format_suite_html($args) {
103
-	for ($i = 0; $i < count($args) - 1; $i++) {
104
-		list($texte, $type) = $args[$i];
105
-		list($texte2, $type2) = $args[$i + 1];
106
-		if (!$texte or !$texte2) {
107
-			continue;
108
-		}
109
-		$c1 = substr($texte, -1);
110
-		if ($type2 !== 'texte') {
111
-			// si un texte se termine par ( et est suivi d'un champ
112
-			// ou assimiles, forcer la notation pleine
113
-			if ($c1 == '(' and substr($texte2, 0, 1) == '#') {
114
-				$args[$i + 1][0] = '[(' . $texte2 . ')]';
115
-			}
116
-		} else {
117
-			if ($type == 'texte') {
118
-				continue;
119
-			}
120
-			// si un champ ou assimiles est suivi d'un texte
121
-			// et si celui-ci commence par un caractere de champ
122
-			// forcer la notation pleine
123
-			if (
124
-				($c1 == '}' and substr(ltrim($texte2), 0, 1) == '|')
125
-				or (preg_match('/[\w\d_*]/', $c1) and preg_match('/^[\w\d_*{|]/', $texte2))
126
-			) {
127
-				$args[$i][0] = '[(' . $texte . ')]';
128
-			}
129
-		}
130
-	}
131
-
132
-	return join('', array_map(function ($arg) {
133
- return reset($arg);
134
-	}, $args));
103
+    for ($i = 0; $i < count($args) - 1; $i++) {
104
+        list($texte, $type) = $args[$i];
105
+        list($texte2, $type2) = $args[$i + 1];
106
+        if (!$texte or !$texte2) {
107
+            continue;
108
+        }
109
+        $c1 = substr($texte, -1);
110
+        if ($type2 !== 'texte') {
111
+            // si un texte se termine par ( et est suivi d'un champ
112
+            // ou assimiles, forcer la notation pleine
113
+            if ($c1 == '(' and substr($texte2, 0, 1) == '#') {
114
+                $args[$i + 1][0] = '[(' . $texte2 . ')]';
115
+            }
116
+        } else {
117
+            if ($type == 'texte') {
118
+                continue;
119
+            }
120
+            // si un champ ou assimiles est suivi d'un texte
121
+            // et si celui-ci commence par un caractere de champ
122
+            // forcer la notation pleine
123
+            if (
124
+                ($c1 == '}' and substr(ltrim($texte2), 0, 1) == '|')
125
+                or (preg_match('/[\w\d_*]/', $c1) and preg_match('/^[\w\d_*{|]/', $texte2))
126
+            ) {
127
+                $args[$i][0] = '[(' . $texte . ')]';
128
+            }
129
+        }
130
+    }
131
+
132
+    return join('', array_map(function ($arg) {
133
+    return reset($arg);
134
+    }, $args));
135 135
 }
136 136
 
137 137
 function format_texte_html($texte) {
138
-	return $texte;
138
+    return $texte;
139 139
 }
Please login to merge, or discard this patch.
ecrire/public/styliser_par_z.php 1 patch
Indentation   +319 added lines, -319 removed lines patch added patch discarded remove patch
@@ -19,7 +19,7 @@  discard block
 block discarded – undo
19 19
  * @package SPIP\Core\Public\Styliser
20 20
  **/
21 21
 if (!defined('_ECRIRE_INC_VERSION')) {
22
-	return;
22
+    return;
23 23
 }
24 24
 
25 25
 /**
@@ -29,193 +29,193 @@  discard block
 block discarded – undo
29 29
  * @return array Données modifiées du pipeline
30 30
  */
31 31
 function public_styliser_par_z_dist($flux) {
32
-	static $prefix_path = null;
33
-	static $prefix_length;
34
-	static $z_blocs;
35
-	static $apl_constant;
36
-	static $page;
37
-	static $disponible = [];
38
-	static $echafauder;
39
-	static $prepend = '';
40
-
41
-	if (!isset($prefix_path)) {
42
-		$z_blocs = z_blocs(test_espace_prive());
43
-		if (test_espace_prive()) {
44
-			$prefix_path = 'prive/squelettes/';
45
-			$prefix_length = strlen($prefix_path);
46
-			$apl_constant = '_ECRIRE_AJAX_PARALLEL_LOAD';
47
-			$page = 'exec';
48
-			$echafauder = charger_fonction('echafauder', 'prive', true);
49
-			define('_ZCORE_EXCLURE_PATH', '');
50
-		} else {
51
-			$prefix_path = '';
52
-			$prefix_length = 0;
53
-			$apl_constant = '_Z_AJAX_PARALLEL_LOAD';
54
-			$page = _SPIP_PAGE;
55
-			$echafauder = charger_fonction('echafauder', 'public', true);
56
-			define('_ZCORE_EXCLURE_PATH', '\bprive|\bsquelettes-dist' . (defined('_DIR_PLUGIN_DIST') ? '|\b' . rtrim(
57
-				_DIR_PLUGIN_DIST,
58
-				'/'
59
-			) : ''));
60
-		}
61
-		$prepend = (defined('_Z_PREPEND_PATH') ? _Z_PREPEND_PATH : '');
62
-	}
63
-	$z_contenu = reset($z_blocs); // contenu par defaut
64
-
65
-	$fond = $flux['args']['fond'];
66
-
67
-	if ($prepend or strncmp($fond, $prefix_path, $prefix_length) == 0) {
68
-		$fond = substr($fond, $prefix_length);
69
-		$squelette = $flux['data'];
70
-		$ext = $flux['args']['ext'];
71
-		// Ajax Parallel loading : ne pas calculer le bloc, mais renvoyer un js qui le loadera en ajax
72
-		if (
73
-			defined('_Z_AJAX_PARALLEL_LOAD_OK')
74
-			and $dir = explode('/', $fond)
75
-			and count($dir) == 2 // pas un sous repertoire
76
-			and $dir = reset($dir)
77
-			and in_array($dir, $z_blocs) // verifier deja qu'on est dans un bloc Z
78
-			and defined($apl_constant)
79
-			and in_array($dir, explode(',', constant($apl_constant))) // et dans un demande en APL
80
-			and $pipe = z_trouver_bloc($prefix_path . $prepend, $dir, 'z_apl', $ext) // et qui contient le squelette APL
81
-		) {
82
-			$flux['data'] = $pipe;
83
-
84
-			return $flux;
85
-		}
86
-
87
-		// surcharger aussi les squelettes venant de squelettes-dist/
88
-		if ($squelette and !z_fond_valide($squelette)) {
89
-			$squelette = '';
90
-			$echafauder = '';
91
-		}
92
-		if ($prepend) {
93
-			$squelette = substr(find_in_path($prefix_path . $prepend . "$fond.$ext"), 0, -strlen(".$ext"));
94
-			if ($squelette) {
95
-				$flux['data'] = $squelette;
96
-			}
97
-		}
98
-
99
-		// gerer les squelettes non trouves
100
-		// -> router vers les /dist.html
101
-		// ou scaffolding ou page automatique les contenus
102
-		if (!$squelette) {
103
-			// si on est sur un ?page=XX non trouve
104
-			if (
105
-				(isset($flux['args']['contexte'][$page])
106
-					and $flux['args']['contexte'][$page] == $fond)
107
-				or (isset($flux['args']['contexte']['type-page'])
108
-					and $flux['args']['contexte']['type-page'] == $fond)
109
-				or ($fond == 'sommaire'
110
-					and (!isset($flux['args']['contexte'][$page]) or !$flux['args']['contexte'][$page]))
111
-			) {
112
-				// si on est sur un ?page=XX non trouve
113
-				// se brancher sur contenu/xx si il existe
114
-				// ou si c'est un objet spip, associe a une table, utiliser le fond homonyme
115
-				if (!isset($disponible[$fond])) {
116
-					$disponible[$fond] = z_contenu_disponible($prefix_path . $prepend, $z_contenu, $fond, $ext, $echafauder);
117
-				}
118
-
119
-				if ($disponible[$fond]) {
120
-					$flux['data'] = substr(find_in_path($prefix_path . "page.$ext"), 0, -strlen(".$ext"));
121
-				}
122
-			}
123
-
124
-			// echafaudage :
125
-			// si c'est un fond de contenu d'un objet en base
126
-			// generer un fond automatique a la volee pour les webmestres
127
-			elseif (strncmp($fond, "$z_contenu/", strlen($z_contenu) + 1) == 0) {
128
-				$type = substr($fond, strlen($z_contenu) + 1);
129
-				if (($type == 'page') and isset($flux['args']['contexte'][$page])) {
130
-					$type = $flux['args']['contexte'][$page];
131
-				}
132
-				if (!isset($disponible[$type])) {
133
-					$disponible[$type] = z_contenu_disponible($prefix_path . $prepend, $z_contenu, $type, $ext, $echafauder);
134
-				}
135
-				if (is_string($disponible[$type])) {
136
-					$flux['data'] = $disponible[$type];
137
-				} elseif (
138
-					$echafauder
139
-					and include_spip('inc/autoriser')
140
-					and isset($GLOBALS['visiteur_session']['statut']) // performance
141
-					and autoriser('echafauder', $type)
142
-					and $is = $disponible[$type]
143
-					and is_array($is)
144
-				) {
145
-					$flux['data'] = $echafauder($type, $is[0], $is[1], $is[2], $ext);
146
-				} else {
147
-					$flux['data'] = ($disponible['404'] = z_contenu_disponible(
148
-						$prefix_path . $prepend,
149
-						$z_contenu,
150
-						'404',
151
-						$ext,
152
-						$echafauder
153
-					));
154
-				}
155
-			}
156
-
157
-			// sinon, si on demande un fond non trouve dans un des autres blocs
158
-			// et si il y a bien un contenu correspondant ou echafaudable
159
-			// se rabbatre sur le dist.html du bloc concerne
160
-			else {
161
-				if (
162
-					$dir = explode('/', $fond)
163
-					and $dir = reset($dir)
164
-					and $dir !== $z_contenu
165
-					and in_array($dir, $z_blocs)
166
-				) {
167
-					$type = substr($fond, strlen("$dir/"));
168
-					if (($type == 'page') and isset($flux['args']['contexte'][$page])) {
169
-						$type = $flux['args']['contexte'][$page];
170
-					}
171
-					if ($type !== 'page' and !isset($disponible[$type])) {
172
-						$disponible[$type] = z_contenu_disponible($prefix_path . $prepend, $z_contenu, $type, $ext, $echafauder);
173
-					}
174
-					if ($type == 'page' or $disponible[$type]) {
175
-						$flux['data'] = z_trouver_bloc($prefix_path . $prepend, $dir, 'dist', $ext);
176
-					}
177
-				}
178
-			}
179
-			$squelette = $flux['data'];
180
-		}
181
-		// layout specifiques par type et compositions :
182
-		// body-article.html
183
-		// body-sommaire.html
184
-		// pour des raisons de perfo, les declinaisons doivent etre dans le
185
-		// meme dossier que body.html
186
-		if ($fond == 'body' and substr($squelette, -strlen($fond)) == $fond) {
187
-			if (
188
-				isset($flux['args']['contexte']['type-page'])
189
-				and (
190
-					(isset($flux['args']['contexte']['composition'])
191
-						and file_exists(($f = $squelette . '-' . $flux['args']['contexte']['type-page'] . '-' . $flux['args']['contexte']['composition']) . ".$ext"))
192
-					or
193
-					file_exists(($f = $squelette . '-' . $flux['args']['contexte']['type-page']) . ".$ext")
194
-				)
195
-			) {
196
-				$flux['data'] = $f;
197
-			}
198
-		} elseif (
199
-			$fond == 'structure'
200
-			and z_sanitize_var_zajax()
201
-			and $f = find_in_path($prefix_path . $prepend . 'ajax' . ".$ext")
202
-		) {
203
-			$flux['data'] = substr($f, 0, -strlen(".$ext"));
204
-		} // chercher le fond correspondant a la composition
205
-		elseif (
206
-			isset($flux['args']['contexte']['composition'])
207
-			and (basename($fond) == 'page' or ($squelette and substr($squelette, -strlen($fond)) == $fond))
208
-			and $dir = substr($fond, $prefix_length)
209
-			and $dir = explode('/', $dir)
210
-			and $dir = reset($dir)
211
-			and in_array($dir, $z_blocs)
212
-			and $f = find_in_path($prefix_path . $prepend . $fond . '-' . $flux['args']['contexte']['composition'] . ".$ext")
213
-		) {
214
-			$flux['data'] = substr($f, 0, -strlen(".$ext"));
215
-		}
216
-	}
217
-
218
-	return $flux;
32
+    static $prefix_path = null;
33
+    static $prefix_length;
34
+    static $z_blocs;
35
+    static $apl_constant;
36
+    static $page;
37
+    static $disponible = [];
38
+    static $echafauder;
39
+    static $prepend = '';
40
+
41
+    if (!isset($prefix_path)) {
42
+        $z_blocs = z_blocs(test_espace_prive());
43
+        if (test_espace_prive()) {
44
+            $prefix_path = 'prive/squelettes/';
45
+            $prefix_length = strlen($prefix_path);
46
+            $apl_constant = '_ECRIRE_AJAX_PARALLEL_LOAD';
47
+            $page = 'exec';
48
+            $echafauder = charger_fonction('echafauder', 'prive', true);
49
+            define('_ZCORE_EXCLURE_PATH', '');
50
+        } else {
51
+            $prefix_path = '';
52
+            $prefix_length = 0;
53
+            $apl_constant = '_Z_AJAX_PARALLEL_LOAD';
54
+            $page = _SPIP_PAGE;
55
+            $echafauder = charger_fonction('echafauder', 'public', true);
56
+            define('_ZCORE_EXCLURE_PATH', '\bprive|\bsquelettes-dist' . (defined('_DIR_PLUGIN_DIST') ? '|\b' . rtrim(
57
+                _DIR_PLUGIN_DIST,
58
+                '/'
59
+            ) : ''));
60
+        }
61
+        $prepend = (defined('_Z_PREPEND_PATH') ? _Z_PREPEND_PATH : '');
62
+    }
63
+    $z_contenu = reset($z_blocs); // contenu par defaut
64
+
65
+    $fond = $flux['args']['fond'];
66
+
67
+    if ($prepend or strncmp($fond, $prefix_path, $prefix_length) == 0) {
68
+        $fond = substr($fond, $prefix_length);
69
+        $squelette = $flux['data'];
70
+        $ext = $flux['args']['ext'];
71
+        // Ajax Parallel loading : ne pas calculer le bloc, mais renvoyer un js qui le loadera en ajax
72
+        if (
73
+            defined('_Z_AJAX_PARALLEL_LOAD_OK')
74
+            and $dir = explode('/', $fond)
75
+            and count($dir) == 2 // pas un sous repertoire
76
+            and $dir = reset($dir)
77
+            and in_array($dir, $z_blocs) // verifier deja qu'on est dans un bloc Z
78
+            and defined($apl_constant)
79
+            and in_array($dir, explode(',', constant($apl_constant))) // et dans un demande en APL
80
+            and $pipe = z_trouver_bloc($prefix_path . $prepend, $dir, 'z_apl', $ext) // et qui contient le squelette APL
81
+        ) {
82
+            $flux['data'] = $pipe;
83
+
84
+            return $flux;
85
+        }
86
+
87
+        // surcharger aussi les squelettes venant de squelettes-dist/
88
+        if ($squelette and !z_fond_valide($squelette)) {
89
+            $squelette = '';
90
+            $echafauder = '';
91
+        }
92
+        if ($prepend) {
93
+            $squelette = substr(find_in_path($prefix_path . $prepend . "$fond.$ext"), 0, -strlen(".$ext"));
94
+            if ($squelette) {
95
+                $flux['data'] = $squelette;
96
+            }
97
+        }
98
+
99
+        // gerer les squelettes non trouves
100
+        // -> router vers les /dist.html
101
+        // ou scaffolding ou page automatique les contenus
102
+        if (!$squelette) {
103
+            // si on est sur un ?page=XX non trouve
104
+            if (
105
+                (isset($flux['args']['contexte'][$page])
106
+                    and $flux['args']['contexte'][$page] == $fond)
107
+                or (isset($flux['args']['contexte']['type-page'])
108
+                    and $flux['args']['contexte']['type-page'] == $fond)
109
+                or ($fond == 'sommaire'
110
+                    and (!isset($flux['args']['contexte'][$page]) or !$flux['args']['contexte'][$page]))
111
+            ) {
112
+                // si on est sur un ?page=XX non trouve
113
+                // se brancher sur contenu/xx si il existe
114
+                // ou si c'est un objet spip, associe a une table, utiliser le fond homonyme
115
+                if (!isset($disponible[$fond])) {
116
+                    $disponible[$fond] = z_contenu_disponible($prefix_path . $prepend, $z_contenu, $fond, $ext, $echafauder);
117
+                }
118
+
119
+                if ($disponible[$fond]) {
120
+                    $flux['data'] = substr(find_in_path($prefix_path . "page.$ext"), 0, -strlen(".$ext"));
121
+                }
122
+            }
123
+
124
+            // echafaudage :
125
+            // si c'est un fond de contenu d'un objet en base
126
+            // generer un fond automatique a la volee pour les webmestres
127
+            elseif (strncmp($fond, "$z_contenu/", strlen($z_contenu) + 1) == 0) {
128
+                $type = substr($fond, strlen($z_contenu) + 1);
129
+                if (($type == 'page') and isset($flux['args']['contexte'][$page])) {
130
+                    $type = $flux['args']['contexte'][$page];
131
+                }
132
+                if (!isset($disponible[$type])) {
133
+                    $disponible[$type] = z_contenu_disponible($prefix_path . $prepend, $z_contenu, $type, $ext, $echafauder);
134
+                }
135
+                if (is_string($disponible[$type])) {
136
+                    $flux['data'] = $disponible[$type];
137
+                } elseif (
138
+                    $echafauder
139
+                    and include_spip('inc/autoriser')
140
+                    and isset($GLOBALS['visiteur_session']['statut']) // performance
141
+                    and autoriser('echafauder', $type)
142
+                    and $is = $disponible[$type]
143
+                    and is_array($is)
144
+                ) {
145
+                    $flux['data'] = $echafauder($type, $is[0], $is[1], $is[2], $ext);
146
+                } else {
147
+                    $flux['data'] = ($disponible['404'] = z_contenu_disponible(
148
+                        $prefix_path . $prepend,
149
+                        $z_contenu,
150
+                        '404',
151
+                        $ext,
152
+                        $echafauder
153
+                    ));
154
+                }
155
+            }
156
+
157
+            // sinon, si on demande un fond non trouve dans un des autres blocs
158
+            // et si il y a bien un contenu correspondant ou echafaudable
159
+            // se rabbatre sur le dist.html du bloc concerne
160
+            else {
161
+                if (
162
+                    $dir = explode('/', $fond)
163
+                    and $dir = reset($dir)
164
+                    and $dir !== $z_contenu
165
+                    and in_array($dir, $z_blocs)
166
+                ) {
167
+                    $type = substr($fond, strlen("$dir/"));
168
+                    if (($type == 'page') and isset($flux['args']['contexte'][$page])) {
169
+                        $type = $flux['args']['contexte'][$page];
170
+                    }
171
+                    if ($type !== 'page' and !isset($disponible[$type])) {
172
+                        $disponible[$type] = z_contenu_disponible($prefix_path . $prepend, $z_contenu, $type, $ext, $echafauder);
173
+                    }
174
+                    if ($type == 'page' or $disponible[$type]) {
175
+                        $flux['data'] = z_trouver_bloc($prefix_path . $prepend, $dir, 'dist', $ext);
176
+                    }
177
+                }
178
+            }
179
+            $squelette = $flux['data'];
180
+        }
181
+        // layout specifiques par type et compositions :
182
+        // body-article.html
183
+        // body-sommaire.html
184
+        // pour des raisons de perfo, les declinaisons doivent etre dans le
185
+        // meme dossier que body.html
186
+        if ($fond == 'body' and substr($squelette, -strlen($fond)) == $fond) {
187
+            if (
188
+                isset($flux['args']['contexte']['type-page'])
189
+                and (
190
+                    (isset($flux['args']['contexte']['composition'])
191
+                        and file_exists(($f = $squelette . '-' . $flux['args']['contexte']['type-page'] . '-' . $flux['args']['contexte']['composition']) . ".$ext"))
192
+                    or
193
+                    file_exists(($f = $squelette . '-' . $flux['args']['contexte']['type-page']) . ".$ext")
194
+                )
195
+            ) {
196
+                $flux['data'] = $f;
197
+            }
198
+        } elseif (
199
+            $fond == 'structure'
200
+            and z_sanitize_var_zajax()
201
+            and $f = find_in_path($prefix_path . $prepend . 'ajax' . ".$ext")
202
+        ) {
203
+            $flux['data'] = substr($f, 0, -strlen(".$ext"));
204
+        } // chercher le fond correspondant a la composition
205
+        elseif (
206
+            isset($flux['args']['contexte']['composition'])
207
+            and (basename($fond) == 'page' or ($squelette and substr($squelette, -strlen($fond)) == $fond))
208
+            and $dir = substr($fond, $prefix_length)
209
+            and $dir = explode('/', $dir)
210
+            and $dir = reset($dir)
211
+            and in_array($dir, $z_blocs)
212
+            and $f = find_in_path($prefix_path . $prepend . $fond . '-' . $flux['args']['contexte']['composition'] . ".$ext")
213
+        ) {
214
+            $flux['data'] = substr($f, 0, -strlen(".$ext"));
215
+        }
216
+    }
217
+
218
+    return $flux;
219 219
 }
220 220
 
221 221
 /**
@@ -225,18 +225,18 @@  discard block
 block discarded – undo
225 225
  * @return array
226 226
  */
227 227
 function z_blocs($espace_prive = false) {
228
-	if ($espace_prive) {
229
-		return (isset($GLOBALS['z_blocs_ecrire']) ? $GLOBALS['z_blocs_ecrire'] : [
230
-			'contenu',
231
-			'navigation',
232
-			'extra',
233
-			'head',
234
-			'hierarchie',
235
-			'top'
236
-		]);
237
-	}
238
-
239
-	return (isset($GLOBALS['z_blocs']) ? $GLOBALS['z_blocs'] : ['contenu']);
228
+    if ($espace_prive) {
229
+        return (isset($GLOBALS['z_blocs_ecrire']) ? $GLOBALS['z_blocs_ecrire'] : [
230
+            'contenu',
231
+            'navigation',
232
+            'extra',
233
+            'head',
234
+            'hierarchie',
235
+            'top'
236
+        ]);
237
+    }
238
+
239
+    return (isset($GLOBALS['z_blocs']) ? $GLOBALS['z_blocs'] : ['contenu']);
240 240
 }
241 241
 
242 242
 /**
@@ -251,11 +251,11 @@  discard block
 block discarded – undo
251 251
  * @return mixed
252 252
  */
253 253
 function z_contenu_disponible($prefix_path, $z_contenu, $type, $ext, $echafauder = true) {
254
-	if ($d = z_trouver_bloc($prefix_path, $z_contenu, $type, $ext)) {
255
-		return $d;
256
-	}
254
+    if ($d = z_trouver_bloc($prefix_path, $z_contenu, $type, $ext)) {
255
+        return $d;
256
+    }
257 257
 
258
-	return $echafauder ? z_echafaudable($type) : false;
258
+    return $echafauder ? z_echafaudable($type) : false;
259 259
 }
260 260
 
261 261
 /**
@@ -269,14 +269,14 @@  discard block
 block discarded – undo
269 269
  *   `true` si on peut l'utiliser, `false` sinon.
270 270
  **/
271 271
 function z_fond_valide($squelette) {
272
-	if (
273
-		!_ZCORE_EXCLURE_PATH
274
-		or !preg_match(',(' . _ZCORE_EXCLURE_PATH . ')/,', $squelette)
275
-	) {
276
-		return true;
277
-	}
278
-
279
-	return false;
272
+    if (
273
+        !_ZCORE_EXCLURE_PATH
274
+        or !preg_match(',(' . _ZCORE_EXCLURE_PATH . ')/,', $squelette)
275
+    ) {
276
+        return true;
277
+    }
278
+
279
+    return false;
280 280
 }
281 281
 
282 282
 /**
@@ -294,14 +294,14 @@  discard block
 block discarded – undo
294 294
  * @return string
295 295
  */
296 296
 function z_trouver_bloc($prefix_path, $bloc, $fond, $ext) {
297
-	if (
298
-		(defined('_ZCORE_BLOC_PREFIX_SKEL') and $f = find_in_path("$prefix_path$bloc/$bloc.$fond.$ext") and z_fond_valide($f))
299
-		or ($f = find_in_path("$prefix_path$bloc/$fond.$ext") and z_fond_valide($f))
300
-	) {
301
-		return substr($f, 0, -strlen(".$ext"));
302
-	}
303
-
304
-	return '';
297
+    if (
298
+        (defined('_ZCORE_BLOC_PREFIX_SKEL') and $f = find_in_path("$prefix_path$bloc/$bloc.$fond.$ext") and z_fond_valide($f))
299
+        or ($f = find_in_path("$prefix_path$bloc/$fond.$ext") and z_fond_valide($f))
300
+    ) {
301
+        return substr($f, 0, -strlen(".$ext"));
302
+    }
303
+
304
+    return '';
305 305
 }
306 306
 
307 307
 /**
@@ -313,52 +313,52 @@  discard block
 block discarded – undo
313 313
  * @return bool
314 314
  */
315 315
 function z_echafaudable($type) {
316
-	static $pages = null;
317
-	static $echafaudable = [];
318
-	if (isset($echafaudable[$type])) {
319
-		return $echafaudable[$type];
320
-	}
321
-	if (preg_match(',[^\w],', $type)) {
322
-		return $echafaudable[$type] = false;
323
-	}
324
-
325
-	if (test_espace_prive()) {
326
-		if (!function_exists('trouver_objet_exec')) {
327
-			include_spip('inc/pipelines_ecrire');
328
-		}
329
-		if ($e = trouver_objet_exec($type)) {
330
-			return $echafaudable[$type] = [$e['table'], $e['table_objet_sql'], $e];
331
-		} else {
332
-			// peut etre c'est un exec=types qui liste tous les objets "type"
333
-			if (
334
-				($t = objet_type($type, false)) !== $type
335
-				and $e = trouver_objet_exec($t)
336
-			) {
337
-				return $echafaudable[$type] = [$e['table'], $e['table_objet_sql'], $t];
338
-			}
339
-		}
340
-	} else {
341
-		if (is_null($pages)) {
342
-			$pages = [];
343
-			$liste = lister_tables_objets_sql();
344
-			foreach ($liste as $t => $d) {
345
-				if ($d['page']) {
346
-					$pages[$d['page']] = [$d['table_objet'], $t];
347
-				}
348
-			}
349
-		}
350
-		if (!isset($pages[$type])) {
351
-			return $echafaudable[$type] = false;
352
-		}
353
-		if (count($pages[$type]) == 2) {
354
-			$trouver_table = charger_fonction('trouver_table', 'base');
355
-			$pages[$type][] = $trouver_table(reset($pages[$type]));
356
-		}
357
-
358
-		return $echafaudable[$type] = $pages[$type];
359
-	}
360
-
361
-	return $echafaudable[$type] = false;
316
+    static $pages = null;
317
+    static $echafaudable = [];
318
+    if (isset($echafaudable[$type])) {
319
+        return $echafaudable[$type];
320
+    }
321
+    if (preg_match(',[^\w],', $type)) {
322
+        return $echafaudable[$type] = false;
323
+    }
324
+
325
+    if (test_espace_prive()) {
326
+        if (!function_exists('trouver_objet_exec')) {
327
+            include_spip('inc/pipelines_ecrire');
328
+        }
329
+        if ($e = trouver_objet_exec($type)) {
330
+            return $echafaudable[$type] = [$e['table'], $e['table_objet_sql'], $e];
331
+        } else {
332
+            // peut etre c'est un exec=types qui liste tous les objets "type"
333
+            if (
334
+                ($t = objet_type($type, false)) !== $type
335
+                and $e = trouver_objet_exec($t)
336
+            ) {
337
+                return $echafaudable[$type] = [$e['table'], $e['table_objet_sql'], $t];
338
+            }
339
+        }
340
+    } else {
341
+        if (is_null($pages)) {
342
+            $pages = [];
343
+            $liste = lister_tables_objets_sql();
344
+            foreach ($liste as $t => $d) {
345
+                if ($d['page']) {
346
+                    $pages[$d['page']] = [$d['table_objet'], $t];
347
+                }
348
+            }
349
+        }
350
+        if (!isset($pages[$type])) {
351
+            return $echafaudable[$type] = false;
352
+        }
353
+        if (count($pages[$type]) == 2) {
354
+            $trouver_table = charger_fonction('trouver_table', 'base');
355
+            $pages[$type][] = $trouver_table(reset($pages[$type]));
356
+        }
357
+
358
+        return $echafaudable[$type] = $pages[$type];
359
+    }
360
+
361
+    return $echafaudable[$type] = false;
362 362
 }
363 363
 
364 364
 
@@ -375,46 +375,46 @@  discard block
 block discarded – undo
375 375
  * @return string
376 376
  */
377 377
 function prive_echafauder_dist($exec, $table, $table_sql, $desc_exec, $ext) {
378
-	$scaffold = '';
379
-
380
-	// page objet ou objet_edit
381
-	if (is_array($desc_exec)) {
382
-		$type = $desc_exec['type'];
383
-		$primary = $desc_exec['id_table_objet'];
384
-
385
-		if ($desc_exec['edition'] === false) {
386
-			$fond = 'objet';
387
-		} else {
388
-			$trouver_table = charger_fonction('trouver_table', 'base');
389
-			$desc = $trouver_table($table_sql);
390
-			if (isset($desc['field']['id_rubrique'])) {
391
-				$fond = 'objet_edit';
392
-			} else {
393
-				$fond = 'objet_edit.sans_rubrique';
394
-			}
395
-		}
396
-		$dir = z_blocs(test_espace_prive());
397
-		$dir = reset($dir);
398
-		$scaffold = "<INCLURE{fond=prive/echafaudage/$dir/" . $fond . ',objet=' . $type . ',id_objet=#' . strtoupper($primary) . ',env}>';
399
-	} // page objets
400
-	elseif ($type = $desc_exec and strpos($type, '/') === false) {
401
-		$dir = z_blocs(test_espace_prive());
402
-		$dir = reset($dir);
403
-		$scaffold = "<INCLURE{fond=prive/echafaudage/$dir/objets,objet=" . $type . ',env} />';
404
-	}
405
-	// morceau d'objet : on fournit le fond de sibstitution dans $desc_exec
406
-	// et objet et tire de $table
407
-	elseif ($fond = $desc_exec) {
408
-		$dir = md5(dirname($fond));
409
-		$scaffold = "<INCLURE{fond=$fond,objet=" . objet_type($table) . ',env} />';
410
-	}
411
-
412
-	$base_dir = sous_repertoire(_DIR_CACHE, 'scaffold', false);
413
-	$base_dir = sous_repertoire($base_dir, $dir, false);
414
-	$f = $base_dir . "$exec";
415
-	ecrire_fichier("$f.$ext", $scaffold);
416
-
417
-	return $f;
378
+    $scaffold = '';
379
+
380
+    // page objet ou objet_edit
381
+    if (is_array($desc_exec)) {
382
+        $type = $desc_exec['type'];
383
+        $primary = $desc_exec['id_table_objet'];
384
+
385
+        if ($desc_exec['edition'] === false) {
386
+            $fond = 'objet';
387
+        } else {
388
+            $trouver_table = charger_fonction('trouver_table', 'base');
389
+            $desc = $trouver_table($table_sql);
390
+            if (isset($desc['field']['id_rubrique'])) {
391
+                $fond = 'objet_edit';
392
+            } else {
393
+                $fond = 'objet_edit.sans_rubrique';
394
+            }
395
+        }
396
+        $dir = z_blocs(test_espace_prive());
397
+        $dir = reset($dir);
398
+        $scaffold = "<INCLURE{fond=prive/echafaudage/$dir/" . $fond . ',objet=' . $type . ',id_objet=#' . strtoupper($primary) . ',env}>';
399
+    } // page objets
400
+    elseif ($type = $desc_exec and strpos($type, '/') === false) {
401
+        $dir = z_blocs(test_espace_prive());
402
+        $dir = reset($dir);
403
+        $scaffold = "<INCLURE{fond=prive/echafaudage/$dir/objets,objet=" . $type . ',env} />';
404
+    }
405
+    // morceau d'objet : on fournit le fond de sibstitution dans $desc_exec
406
+    // et objet et tire de $table
407
+    elseif ($fond = $desc_exec) {
408
+        $dir = md5(dirname($fond));
409
+        $scaffold = "<INCLURE{fond=$fond,objet=" . objet_type($table) . ',env} />';
410
+    }
411
+
412
+    $base_dir = sous_repertoire(_DIR_CACHE, 'scaffold', false);
413
+    $base_dir = sous_repertoire($base_dir, $dir, false);
414
+    $f = $base_dir . "$exec";
415
+    ecrire_fichier("$f.$ext", $scaffold);
416
+
417
+    return $f;
418 418
 }
419 419
 
420 420
 /**
@@ -423,17 +423,17 @@  discard block
 block discarded – undo
423 423
  * @return bool|string
424 424
  */
425 425
 function z_sanitize_var_zajax() {
426
-	$z_ajax = _request('var_zajax');
427
-	if (!$z_ajax) {
428
-		return false;
429
-	}
430
-	if (
431
-		!$z_blocs = z_blocs(test_espace_prive())
432
-		or !in_array($z_ajax, $z_blocs)
433
-	) {
434
-		set_request('var_zajax'); // enlever cette demande incongrue
435
-		$z_ajax = false;
436
-	}
437
-
438
-	return $z_ajax;
426
+    $z_ajax = _request('var_zajax');
427
+    if (!$z_ajax) {
428
+        return false;
429
+    }
430
+    if (
431
+        !$z_blocs = z_blocs(test_espace_prive())
432
+        or !in_array($z_ajax, $z_blocs)
433
+    ) {
434
+        set_request('var_zajax'); // enlever cette demande incongrue
435
+        $z_ajax = false;
436
+    }
437
+
438
+    return $z_ajax;
439 439
 }
Please login to merge, or discard this patch.
ecrire/public/evaluer_page.php 1 patch
Indentation   +58 added lines, -58 removed lines patch added patch discarded remove patch
@@ -11,7 +11,7 @@  discard block
 block discarded – undo
11 11
 \***************************************************************************/
12 12
 
13 13
 if (!defined('_ECRIRE_INC_VERSION')) {
14
-	return;
14
+    return;
15 15
 }
16 16
 
17 17
 /**
@@ -32,67 +32,67 @@  discard block
 block discarded – undo
32 32
 
33 33
 // Cas d'une page contenant du PHP :
34 34
 if (empty($page['process_ins']) or $page['process_ins'] != 'html') {
35
-	include_spip('inc/lang');
35
+    include_spip('inc/lang');
36 36
 
37
-	// restaurer l'etat des notes avant calcul
38
-	if (
39
-		isset($page['notes'])
40
-		and $page['notes']
41
-		and $notes = charger_fonction('notes', 'inc', true)
42
-	) {
43
-		$notes($page['notes'], 'restaurer_etat');
44
-	}
45
-	ob_start();
46
-	if (strpos($page['texte'], '?xml') !== false) {
47
-		$page['texte'] = str_replace('<' . '?xml', "<\1?xml", $page['texte']);
48
-	}
37
+    // restaurer l'etat des notes avant calcul
38
+    if (
39
+        isset($page['notes'])
40
+        and $page['notes']
41
+        and $notes = charger_fonction('notes', 'inc', true)
42
+    ) {
43
+        $notes($page['notes'], 'restaurer_etat');
44
+    }
45
+    ob_start();
46
+    if (strpos($page['texte'], '?xml') !== false) {
47
+        $page['texte'] = str_replace('<' . '?xml', "<\1?xml", $page['texte']);
48
+    }
49 49
 
50
-	try {
51
-		$res = eval('?' . '>' . $page['texte']);
52
-		// error catching 5.2<=PHP<7
53
-		if (
54
-			$res === false
55
-			and function_exists('error_get_last')
56
-			and ($erreur = error_get_last())
57
-		) {
58
-			$code = $page['texte'];
59
-			$GLOBALS['numero_ligne_php'] = 1;
60
-			if (!function_exists('numerote_ligne_php')) {
61
-				function numerote_ligne_php($match) {
62
-					$GLOBALS['numero_ligne_php']++;
63
-					return "\n/*" . str_pad($GLOBALS['numero_ligne_php'], 3, '0', STR_PAD_LEFT) . '*/';
64
-				}
65
-			}
66
-			$code = '/*001*/' . preg_replace_callback(",\n,", 'numerote_ligne_php', $code);
67
-			$code = trim(highlight_string($code, true));
68
-			erreur_squelette('L' . $erreur['line'] . ': ' . $erreur['message'] . '<br />' . $code, [$page['source'],'',$erreur['file'],'',$GLOBALS['spip_lang']]);
69
-			$page['texte'] = '<!-- Erreur -->';
70
-		}
71
-		else {
72
-			$page['texte'] = ob_get_contents();
73
-		}
74
-	}
75
-	catch (Exception $e) {
76
-		$code = $page['texte'];
77
-		$GLOBALS['numero_ligne_php'] = 1;
78
-		if (!function_exists('numerote_ligne_php')) {
79
-			function numerote_ligne_php($match) {
80
-				$GLOBALS['numero_ligne_php']++;
81
-				return "\n/*" . str_pad($GLOBALS['numero_ligne_php'], 3, '0', STR_PAD_LEFT) . '*/';
82
-			}
83
-		}
84
-		$code = '/*001*/' . preg_replace_callback(",\n,", 'numerote_ligne_php', $code);
85
-		$code = trim(highlight_string($code, true));
86
-		erreur_squelette('L' . $e->getLine() . ': ' . $e->getMessage() . '<br />' . $code, [$page['source'],'',$e->getFile(),'',$GLOBALS['spip_lang']]);
87
-		$page['texte'] = '<!-- Erreur -->';
88
-	}
89
-	ob_end_clean();
50
+    try {
51
+        $res = eval('?' . '>' . $page['texte']);
52
+        // error catching 5.2<=PHP<7
53
+        if (
54
+            $res === false
55
+            and function_exists('error_get_last')
56
+            and ($erreur = error_get_last())
57
+        ) {
58
+            $code = $page['texte'];
59
+            $GLOBALS['numero_ligne_php'] = 1;
60
+            if (!function_exists('numerote_ligne_php')) {
61
+                function numerote_ligne_php($match) {
62
+                    $GLOBALS['numero_ligne_php']++;
63
+                    return "\n/*" . str_pad($GLOBALS['numero_ligne_php'], 3, '0', STR_PAD_LEFT) . '*/';
64
+                }
65
+            }
66
+            $code = '/*001*/' . preg_replace_callback(",\n,", 'numerote_ligne_php', $code);
67
+            $code = trim(highlight_string($code, true));
68
+            erreur_squelette('L' . $erreur['line'] . ': ' . $erreur['message'] . '<br />' . $code, [$page['source'],'',$erreur['file'],'',$GLOBALS['spip_lang']]);
69
+            $page['texte'] = '<!-- Erreur -->';
70
+        }
71
+        else {
72
+            $page['texte'] = ob_get_contents();
73
+        }
74
+    }
75
+    catch (Exception $e) {
76
+        $code = $page['texte'];
77
+        $GLOBALS['numero_ligne_php'] = 1;
78
+        if (!function_exists('numerote_ligne_php')) {
79
+            function numerote_ligne_php($match) {
80
+                $GLOBALS['numero_ligne_php']++;
81
+                return "\n/*" . str_pad($GLOBALS['numero_ligne_php'], 3, '0', STR_PAD_LEFT) . '*/';
82
+            }
83
+        }
84
+        $code = '/*001*/' . preg_replace_callback(",\n,", 'numerote_ligne_php', $code);
85
+        $code = trim(highlight_string($code, true));
86
+        erreur_squelette('L' . $e->getLine() . ': ' . $e->getMessage() . '<br />' . $code, [$page['source'],'',$e->getFile(),'',$GLOBALS['spip_lang']]);
87
+        $page['texte'] = '<!-- Erreur -->';
88
+    }
89
+    ob_end_clean();
90 90
 
91
-	$page['process_ins'] = 'html';
91
+    $page['process_ins'] = 'html';
92 92
 
93
-	if (strpos($page['texte'], '?xml') !== false) {
94
-		$page['texte'] = str_replace("<\1?xml", '<' . '?xml', $page['texte']);
95
-	}
93
+    if (strpos($page['texte'], '?xml') !== false) {
94
+        $page['texte'] = str_replace("<\1?xml", '<' . '?xml', $page['texte']);
95
+    }
96 96
 }
97 97
 
98 98
 page_base_href($page['texte']);
Please login to merge, or discard this patch.
ecrire/public/balises.php 1 patch
Indentation   +951 added lines, -951 removed lines patch added patch discarded remove patch
@@ -26,7 +26,7 @@  discard block
 block discarded – undo
26 26
  **/
27 27
 
28 28
 if (!defined('_ECRIRE_INC_VERSION')) {
29
-	return;
29
+    return;
30 30
 }
31 31
 
32 32
 /**
@@ -48,16 +48,16 @@  discard block
 block discarded – undo
48 48
  *     Code PHP si cet argument est présent, sinon null
49 49
  **/
50 50
 function interprete_argument_balise($n, $p) {
51
-	if (($p->param) && (!$p->param[0][0]) && (count($p->param[0]) > $n)) {
52
-		return calculer_liste(
53
-			$p->param[0][$n],
54
-			$p->descr,
55
-			$p->boucles,
56
-			$p->id_boucle
57
-		);
58
-	} else {
59
-		return null;
60
-	}
51
+    if (($p->param) && (!$p->param[0][0]) && (count($p->param[0]) > $n)) {
52
+        return calculer_liste(
53
+            $p->param[0][$n],
54
+            $p->descr,
55
+            $p->boucles,
56
+            $p->id_boucle
57
+        );
58
+    } else {
59
+        return null;
60
+    }
61 61
 }
62 62
 
63 63
 
@@ -77,10 +77,10 @@  discard block
 block discarded – undo
77 77
  *     Pile complétée par le code à générer
78 78
  **/
79 79
 function balise_NOM_SITE_SPIP_dist($p) {
80
-	$p->code = "\$GLOBALS['meta']['nom_site']";
80
+    $p->code = "\$GLOBALS['meta']['nom_site']";
81 81
 
82
-	#$p->interdire_scripts = true;
83
-	return $p;
82
+    #$p->interdire_scripts = true;
83
+    return $p;
84 84
 }
85 85
 
86 86
 /**
@@ -96,10 +96,10 @@  discard block
 block discarded – undo
96 96
  *     Pile complétée par le code à générer
97 97
  **/
98 98
 function balise_EMAIL_WEBMASTER_dist($p) {
99
-	$p->code = "\$GLOBALS['meta']['email_webmaster']";
99
+    $p->code = "\$GLOBALS['meta']['email_webmaster']";
100 100
 
101
-	#$p->interdire_scripts = true;
102
-	return $p;
101
+    #$p->interdire_scripts = true;
102
+    return $p;
103 103
 }
104 104
 
105 105
 /**
@@ -115,10 +115,10 @@  discard block
 block discarded – undo
115 115
  *     Pile complétée par le code à générer
116 116
  **/
117 117
 function balise_DESCRIPTIF_SITE_SPIP_dist($p) {
118
-	$p->code = "\$GLOBALS['meta']['descriptif_site']";
118
+    $p->code = "\$GLOBALS['meta']['descriptif_site']";
119 119
 
120
-	#$p->interdire_scripts = true;
121
-	return $p;
120
+    #$p->interdire_scripts = true;
121
+    return $p;
122 122
 }
123 123
 
124 124
 
@@ -139,10 +139,10 @@  discard block
 block discarded – undo
139 139
  *     Pile complétée par le code à générer
140 140
  **/
141 141
 function balise_CHARSET_dist($p) {
142
-	$p->code = "\$GLOBALS['meta']['charset']";
142
+    $p->code = "\$GLOBALS['meta']['charset']";
143 143
 
144
-	#$p->interdire_scripts = true;
145
-	return $p;
144
+    #$p->interdire_scripts = true;
145
+    return $p;
146 146
 }
147 147
 
148 148
 /**
@@ -167,11 +167,11 @@  discard block
 block discarded – undo
167 167
  *     Pile complétée par le code à générer
168 168
  **/
169 169
 function balise_LANG_LEFT_dist($p) {
170
-	$_lang = champ_sql('lang', $p);
171
-	$p->code = "lang_dir($_lang, 'left','right')";
172
-	$p->interdire_scripts = false;
170
+    $_lang = champ_sql('lang', $p);
171
+    $p->code = "lang_dir($_lang, 'left','right')";
172
+    $p->interdire_scripts = false;
173 173
 
174
-	return $p;
174
+    return $p;
175 175
 }
176 176
 
177 177
 /**
@@ -191,11 +191,11 @@  discard block
 block discarded – undo
191 191
  *     Pile complétée par le code à générer
192 192
  **/
193 193
 function balise_LANG_RIGHT_dist($p) {
194
-	$_lang = champ_sql('lang', $p);
195
-	$p->code = "lang_dir($_lang, 'right','left')";
196
-	$p->interdire_scripts = false;
194
+    $_lang = champ_sql('lang', $p);
195
+    $p->code = "lang_dir($_lang, 'right','left')";
196
+    $p->interdire_scripts = false;
197 197
 
198
-	return $p;
198
+    return $p;
199 199
 }
200 200
 
201 201
 /**
@@ -220,11 +220,11 @@  discard block
 block discarded – undo
220 220
  *     Pile complétée par le code à générer
221 221
  **/
222 222
 function balise_LANG_DIR_dist($p) {
223
-	$_lang = champ_sql('lang', $p);
224
-	$p->code = "lang_dir($_lang, 'ltr','rtl')";
225
-	$p->interdire_scripts = false;
223
+    $_lang = champ_sql('lang', $p);
224
+    $p->code = "lang_dir($_lang, 'ltr','rtl')";
225
+    $p->interdire_scripts = false;
226 226
 
227
-	return $p;
227
+    return $p;
228 228
 }
229 229
 
230 230
 
@@ -241,10 +241,10 @@  discard block
 block discarded – undo
241 241
  *     Pile complétée par le code à générer
242 242
  **/
243 243
 function balise_PUCE_dist($p) {
244
-	$p->code = 'definir_puce()';
245
-	$p->interdire_scripts = false;
244
+    $p->code = 'definir_puce()';
245
+    $p->interdire_scripts = false;
246 246
 
247
-	return $p;
247
+    return $p;
248 248
 }
249 249
 
250 250
 
@@ -268,12 +268,12 @@  discard block
 block discarded – undo
268 268
  *     Pile completée du code PHP d'exécution de la balise
269 269
  */
270 270
 function balise_DATE_dist($p) {
271
-	$d = champ_sql('date', $p);
271
+    $d = champ_sql('date', $p);
272 272
 #	if ($d === "@\$Pile[0]['date']")
273 273
 #		$d = "isset(\$Pile[0]['date']) ? $d : time()";
274
-	$p->code = $d;
274
+    $p->code = $d;
275 275
 
276
-	return $p;
276
+    return $p;
277 277
 }
278 278
 
279 279
 
@@ -293,13 +293,13 @@  discard block
 block discarded – undo
293 293
  *     Pile completée du code PHP d'exécution de la balise
294 294
  */
295 295
 function balise_DATE_REDAC_dist($p) {
296
-	$d = champ_sql('date_redac', $p);
296
+    $d = champ_sql('date_redac', $p);
297 297
 #	if ($d === "@\$Pile[0]['date_redac']")
298 298
 #		$d = "isset(\$Pile[0]['date_redac']) ? $d : time()";
299
-	$p->code = $d;
300
-	$p->interdire_scripts = false;
299
+    $p->code = $d;
300
+    $p->interdire_scripts = false;
301 301
 
302
-	return $p;
302
+    return $p;
303 303
 }
304 304
 
305 305
 /**
@@ -318,10 +318,10 @@  discard block
 block discarded – undo
318 318
  *     Pile completée du code PHP d'exécution de la balise
319 319
  */
320 320
 function balise_DATE_MODIF_dist($p) {
321
-	$p->code = champ_sql('date_modif', $p);
322
-	$p->interdire_scripts = false;
321
+    $p->code = champ_sql('date_modif', $p);
322
+    $p->interdire_scripts = false;
323 323
 
324
-	return $p;
324
+    return $p;
325 325
 }
326 326
 
327 327
 /**
@@ -339,13 +339,13 @@  discard block
 block discarded – undo
339 339
  *     Pile completée du code PHP d'exécution de la balise
340 340
  */
341 341
 function balise_DATE_NOUVEAUTES_dist($p) {
342
-	$p->code = "((\$GLOBALS['meta']['quoi_de_neuf'] == 'oui'
342
+    $p->code = "((\$GLOBALS['meta']['quoi_de_neuf'] == 'oui'
343 343
 	AND isset(\$GLOBALS['meta']['dernier_envoi_neuf'])) ?
344 344
 	\$GLOBALS['meta']['dernier_envoi_neuf'] :
345 345
 	\"'0000-00-00'\")";
346
-	$p->interdire_scripts = false;
346
+    $p->interdire_scripts = false;
347 347
 
348
-	return $p;
348
+    return $p;
349 349
 }
350 350
 
351 351
 
@@ -363,11 +363,11 @@  discard block
 block discarded – undo
363 363
  *     Pile completée du code PHP d'exécution de la balise
364 364
  */
365 365
 function balise_DOSSIER_SQUELETTE_dist($p) {
366
-	$code = substr(addslashes(dirname($p->descr['sourcefile'])), strlen(_DIR_RACINE));
367
-	$p->code = "_DIR_RACINE . '$code'" .
368
-		$p->interdire_scripts = false;
366
+    $code = substr(addslashes(dirname($p->descr['sourcefile'])), strlen(_DIR_RACINE));
367
+    $p->code = "_DIR_RACINE . '$code'" .
368
+        $p->interdire_scripts = false;
369 369
 
370
-	return $p;
370
+    return $p;
371 371
 }
372 372
 
373 373
 /**
@@ -382,11 +382,11 @@  discard block
 block discarded – undo
382 382
  *     Pile completée du code PHP d'exécution de la balise
383 383
  */
384 384
 function balise_SQUELETTE_dist($p) {
385
-	$code = addslashes($p->descr['sourcefile']);
386
-	$p->code = "'$code'" .
387
-		$p->interdire_scripts = false;
385
+    $code = addslashes($p->descr['sourcefile']);
386
+    $p->code = "'$code'" .
387
+        $p->interdire_scripts = false;
388 388
 
389
-	return $p;
389
+    return $p;
390 390
 }
391 391
 
392 392
 /**
@@ -405,10 +405,10 @@  discard block
 block discarded – undo
405 405
  *     Pile completée du code PHP d'exécution de la balise
406 406
  */
407 407
 function balise_SPIP_VERSION_dist($p) {
408
-	$p->code = 'spip_version()';
409
-	$p->interdire_scripts = false;
408
+    $p->code = 'spip_version()';
409
+    $p->interdire_scripts = false;
410 410
 
411
-	return $p;
411
+    return $p;
412 412
 }
413 413
 
414 414
 
@@ -434,18 +434,18 @@  discard block
 block discarded – undo
434 434
  *     Pile complétée par le code à générer
435 435
  **/
436 436
 function balise_NOM_SITE_dist($p) {
437
-	if (!$p->etoile) {
438
-		$p->code = 'supprimer_numero(calculer_url(' .
439
-			champ_sql('url_site', $p) . ',' .
440
-			champ_sql('nom_site', $p) .
441
-			", 'titre', \$connect, false))";
442
-	} else {
443
-		$p->code = champ_sql('nom_site', $p);
444
-	}
437
+    if (!$p->etoile) {
438
+        $p->code = 'supprimer_numero(calculer_url(' .
439
+            champ_sql('url_site', $p) . ',' .
440
+            champ_sql('nom_site', $p) .
441
+            ", 'titre', \$connect, false))";
442
+    } else {
443
+        $p->code = champ_sql('nom_site', $p);
444
+    }
445 445
 
446
-	$p->interdire_scripts = true;
446
+    $p->interdire_scripts = true;
447 447
 
448
-	return $p;
448
+    return $p;
449 449
 }
450 450
 
451 451
 
@@ -462,11 +462,11 @@  discard block
 block discarded – undo
462 462
  *     Pile complétée par le code à générer
463 463
  **/
464 464
 function balise_NOTES_dist($p) {
465
-	// Recuperer les notes
466
-	$p->code = 'calculer_notes()';
465
+    // Recuperer les notes
466
+    $p->code = 'calculer_notes()';
467 467
 
468
-	#$p->interdire_scripts = true;
469
-	return $p;
468
+    #$p->interdire_scripts = true;
469
+    return $p;
470 470
 }
471 471
 
472 472
 
@@ -488,10 +488,10 @@  discard block
 block discarded – undo
488 488
  *     Pile complétée par le code à générer
489 489
  **/
490 490
 function balise_RECHERCHE_dist($p) {
491
-	$p->code = 'entites_html(_request("recherche"))';
492
-	$p->interdire_scripts = false;
491
+    $p->code = 'entites_html(_request("recherche"))';
492
+    $p->interdire_scripts = false;
493 493
 
494
-	return $p;
494
+    return $p;
495 495
 }
496 496
 
497 497
 
@@ -509,17 +509,17 @@  discard block
 block discarded – undo
509 509
  *     Pile complétée par le code à générer
510 510
  **/
511 511
 function balise_COMPTEUR_BOUCLE_dist($p) {
512
-	$b = index_boucle_mere($p);
513
-	if ($b === '') {
514
-		$msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
515
-		erreur_squelette($msg, $p);
516
-	} else {
517
-		$p->code = "\$Numrows['$b']['compteur_boucle']";
518
-		$p->boucles[$b]->cptrows = true;
519
-		$p->interdire_scripts = false;
512
+    $b = index_boucle_mere($p);
513
+    if ($b === '') {
514
+        $msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
515
+        erreur_squelette($msg, $p);
516
+    } else {
517
+        $p->code = "\$Numrows['$b']['compteur_boucle']";
518
+        $p->boucles[$b]->cptrows = true;
519
+        $p->interdire_scripts = false;
520 520
 
521
-		return $p;
522
-	}
521
+        return $p;
522
+    }
523 523
 }
524 524
 
525 525
 /**
@@ -537,17 +537,17 @@  discard block
 block discarded – undo
537 537
  *     Pile complétée par le code à générer
538 538
  **/
539 539
 function balise_TOTAL_BOUCLE_dist($p) {
540
-	$b = index_boucle_mere($p);
541
-	if ($b === '') {
542
-		$msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
543
-		erreur_squelette($msg, $p);
544
-	} else {
545
-		$p->code = "\$Numrows['$b']['total']";
546
-		$p->boucles[$b]->numrows = true;
547
-		$p->interdire_scripts = false;
548
-	}
540
+    $b = index_boucle_mere($p);
541
+    if ($b === '') {
542
+        $msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
543
+        erreur_squelette($msg, $p);
544
+    } else {
545
+        $p->code = "\$Numrows['$b']['total']";
546
+        $p->boucles[$b]->numrows = true;
547
+        $p->interdire_scripts = false;
548
+    }
549 549
 
550
-	return $p;
550
+    return $p;
551 551
 }
552 552
 
553 553
 
@@ -567,7 +567,7 @@  discard block
 block discarded – undo
567 567
  *     Pile complétée par le code à générer
568 568
  **/
569 569
 function balise_POINTS_dist($p) {
570
-	return rindex_pile($p, 'points', 'recherche');
570
+    return rindex_pile($p, 'points', 'recherche');
571 571
 }
572 572
 
573 573
 
@@ -588,12 +588,12 @@  discard block
 block discarded – undo
588 588
  *     Pile complétée par le code à générer
589 589
  **/
590 590
 function balise_POPULARITE_ABSOLUE_dist($p) {
591
-	$p->code = 'ceil(' .
592
-		champ_sql('popularite', $p) .
593
-		')';
594
-	$p->interdire_scripts = false;
591
+    $p->code = 'ceil(' .
592
+        champ_sql('popularite', $p) .
593
+        ')';
594
+    $p->interdire_scripts = false;
595 595
 
596
-	return $p;
596
+    return $p;
597 597
 }
598 598
 
599 599
 /**
@@ -613,10 +613,10 @@  discard block
 block discarded – undo
613 613
  *     Pile complétée par le code à générer
614 614
  **/
615 615
 function balise_POPULARITE_SITE_dist($p) {
616
-	$p->code = 'ceil($GLOBALS["meta"][\'popularite_total\'])';
617
-	$p->interdire_scripts = false;
616
+    $p->code = 'ceil($GLOBALS["meta"][\'popularite_total\'])';
617
+    $p->interdire_scripts = false;
618 618
 
619
-	return $p;
619
+    return $p;
620 620
 }
621 621
 
622 622
 /**
@@ -637,10 +637,10 @@  discard block
 block discarded – undo
637 637
  *     Pile complétée par le code à générer
638 638
  **/
639 639
 function balise_POPULARITE_MAX_dist($p) {
640
-	$p->code = 'ceil($GLOBALS["meta"][\'popularite_max\'])';
641
-	$p->interdire_scripts = false;
640
+    $p->code = 'ceil($GLOBALS["meta"][\'popularite_max\'])';
641
+    $p->interdire_scripts = false;
642 642
 
643
-	return $p;
643
+    return $p;
644 644
 }
645 645
 
646 646
 
@@ -666,15 +666,15 @@  discard block
 block discarded – undo
666 666
  *     Pile complétée par le code à générer
667 667
  **/
668 668
 function balise_VALEUR_dist($p) {
669
-	$b = $p->nom_boucle ? $p->nom_boucle : $p->id_boucle;
670
-	$p->code = index_pile($p->id_boucle, 'valeur', $p->boucles, $b);
669
+    $b = $p->nom_boucle ? $p->nom_boucle : $p->id_boucle;
670
+    $p->code = index_pile($p->id_boucle, 'valeur', $p->boucles, $b);
671 671
 ;
672
-	if (($v = interprete_argument_balise(1, $p)) !== null) {
673
-		$p->code = 'table_valeur(' . $p->code . ', ' . $v . ')';
674
-	}
675
-	$p->interdire_scripts = true;
672
+    if (($v = interprete_argument_balise(1, $p)) !== null) {
673
+        $p->code = 'table_valeur(' . $p->code . ', ' . $v . ')';
674
+    }
675
+    $p->interdire_scripts = true;
676 676
 
677
-	return $p;
677
+    return $p;
678 678
 }
679 679
 
680 680
 /**
@@ -703,16 +703,16 @@  discard block
 block discarded – undo
703 703
  *     Pile complétée par le code à générer
704 704
  **/
705 705
 function balise_EXPOSE_dist($p) {
706
-	$on = "'on'";
707
-	$off = "''";
708
-	if (($v = interprete_argument_balise(1, $p)) !== null) {
709
-		$on = $v;
710
-		if (($v = interprete_argument_balise(2, $p)) !== null) {
711
-			$off = $v;
712
-		}
713
-	}
706
+    $on = "'on'";
707
+    $off = "''";
708
+    if (($v = interprete_argument_balise(1, $p)) !== null) {
709
+        $on = $v;
710
+        if (($v = interprete_argument_balise(2, $p)) !== null) {
711
+            $off = $v;
712
+        }
713
+    }
714 714
 
715
-	return calculer_balise_expose($p, $on, $off);
715
+    return calculer_balise_expose($p, $on, $off);
716 716
 }
717 717
 
718 718
 /**
@@ -730,35 +730,35 @@  discard block
 block discarded – undo
730 730
  *     Pile complétée par le code à générer
731 731
  **/
732 732
 function calculer_balise_expose($p, $on, $off) {
733
-	$b = index_boucle($p);
734
-	if (empty($p->boucles[$b]->primary)) {
735
-		$msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
736
-		erreur_squelette($msg, $p);
737
-	} else {
738
-		$key = $p->boucles[$b]->primary;
739
-		$type = $p->boucles[$p->id_boucle]->primary;
740
-		$desc = $p->boucles[$b]->show;
741
-		$connect = sql_quote($p->boucles[$b]->sql_serveur);
733
+    $b = index_boucle($p);
734
+    if (empty($p->boucles[$b]->primary)) {
735
+        $msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
736
+        erreur_squelette($msg, $p);
737
+    } else {
738
+        $key = $p->boucles[$b]->primary;
739
+        $type = $p->boucles[$p->id_boucle]->primary;
740
+        $desc = $p->boucles[$b]->show;
741
+        $connect = sql_quote($p->boucles[$b]->sql_serveur);
742 742
 
743
-		// Ne pas utiliser champ_sql, on jongle avec le nom boucle explicite
744
-		$c = index_pile($p->id_boucle, $type, $p->boucles);
743
+        // Ne pas utiliser champ_sql, on jongle avec le nom boucle explicite
744
+        $c = index_pile($p->id_boucle, $type, $p->boucles);
745 745
 
746
-		if (isset($desc['field']['id_parent'])) {
747
-			$parent = 0; // pour if (!$parent) dans calculer_expose
748
-		} elseif (isset($desc['field']['id_rubrique'])) {
749
-			$parent = index_pile($p->id_boucle, 'id_rubrique', $p->boucles, $b);
750
-		} elseif (isset($desc['field']['id_groupe'])) {
751
-			$parent = index_pile($p->id_boucle, 'id_groupe', $p->boucles, $b);
752
-		} else {
753
-			$parent = "''";
754
-		}
746
+        if (isset($desc['field']['id_parent'])) {
747
+            $parent = 0; // pour if (!$parent) dans calculer_expose
748
+        } elseif (isset($desc['field']['id_rubrique'])) {
749
+            $parent = index_pile($p->id_boucle, 'id_rubrique', $p->boucles, $b);
750
+        } elseif (isset($desc['field']['id_groupe'])) {
751
+            $parent = index_pile($p->id_boucle, 'id_groupe', $p->boucles, $b);
752
+        } else {
753
+            $parent = "''";
754
+        }
755 755
 
756
-		$p->code = "(calcul_exposer($c, '$type', \$Pile[0], $parent, '$key', $connect) ? $on : $off)";
757
-	}
756
+        $p->code = "(calcul_exposer($c, '$type', \$Pile[0], $parent, '$key', $connect) ? $on : $off)";
757
+    }
758 758
 
759
-	$p->interdire_scripts = false;
759
+    $p->interdire_scripts = false;
760 760
 
761
-	return $p;
761
+    return $p;
762 762
 }
763 763
 
764 764
 
@@ -798,46 +798,46 @@  discard block
 block discarded – undo
798 798
  **/
799 799
 function balise_INTRODUCTION_dist($p) {
800 800
 
801
-	$type_objet = $p->type_requete;
802
-	$cle_objet = id_table_objet($type_objet);
803
-	$_id_objet = champ_sql($cle_objet, $p);
804
-
805
-	// Récupérer les valeurs sql nécessaires : descriptif, texte et chapo
806
-	// ainsi que le longueur d'introduction donnée dans la description de l'objet.
807
-	$_introduction_longueur = 'null';
808
-	$_ligne = 'array(';
809
-	$trouver_table = charger_fonction('trouver_table', 'base');
810
-	if ($desc = $trouver_table(table_objet_sql($type_objet))) {
811
-		if (isset($desc['field']['descriptif'])) {
812
-			$_ligne .= "'descriptif' => " . champ_sql('descriptif', $p) . ',';
813
-		}
814
-		if (isset($desc['field']['texte'])) {
815
-			$_ligne .= "'texte' => " . champ_sql('texte', $p) . ',';
816
-		}
817
-		if (isset($desc['field']['chapo'])) {
818
-			$_ligne .= "'chapo' => " . champ_sql('chapo', $p) . ',';
819
-		}
820
-		if (isset($desc['introduction_longueur'])) {
821
-			$_introduction_longueur = "'" . $desc['introduction_longueur'] . "'";
822
-		}
823
-	}
824
-	$_ligne .= ')';
825
-
826
-	// Récupérer la longueur et la suite passés en paramètres
827
-	$_longueur_ou_suite = 'null';
828
-	if (($v1 = interprete_argument_balise(1, $p)) !== null) {
829
-		$_longueur_ou_suite = $v1;
830
-	}
831
-	$_suite = 'null';
832
-	if (($v2 = interprete_argument_balise(2, $p)) !== null) {
833
-		$_suite = $v2;
834
-	}
835
-
836
-	$p->code = "generer_introduction_entite($_id_objet, '$type_objet', $_ligne, $_introduction_longueur, $_longueur_ou_suite, $_suite, \$connect)";
837
-
838
-	#$p->interdire_scripts = true;
839
-	$p->etoile = '*'; // propre est deja fait dans le calcul de l'intro
840
-	return $p;
801
+    $type_objet = $p->type_requete;
802
+    $cle_objet = id_table_objet($type_objet);
803
+    $_id_objet = champ_sql($cle_objet, $p);
804
+
805
+    // Récupérer les valeurs sql nécessaires : descriptif, texte et chapo
806
+    // ainsi que le longueur d'introduction donnée dans la description de l'objet.
807
+    $_introduction_longueur = 'null';
808
+    $_ligne = 'array(';
809
+    $trouver_table = charger_fonction('trouver_table', 'base');
810
+    if ($desc = $trouver_table(table_objet_sql($type_objet))) {
811
+        if (isset($desc['field']['descriptif'])) {
812
+            $_ligne .= "'descriptif' => " . champ_sql('descriptif', $p) . ',';
813
+        }
814
+        if (isset($desc['field']['texte'])) {
815
+            $_ligne .= "'texte' => " . champ_sql('texte', $p) . ',';
816
+        }
817
+        if (isset($desc['field']['chapo'])) {
818
+            $_ligne .= "'chapo' => " . champ_sql('chapo', $p) . ',';
819
+        }
820
+        if (isset($desc['introduction_longueur'])) {
821
+            $_introduction_longueur = "'" . $desc['introduction_longueur'] . "'";
822
+        }
823
+    }
824
+    $_ligne .= ')';
825
+
826
+    // Récupérer la longueur et la suite passés en paramètres
827
+    $_longueur_ou_suite = 'null';
828
+    if (($v1 = interprete_argument_balise(1, $p)) !== null) {
829
+        $_longueur_ou_suite = $v1;
830
+    }
831
+    $_suite = 'null';
832
+    if (($v2 = interprete_argument_balise(2, $p)) !== null) {
833
+        $_suite = $v2;
834
+    }
835
+
836
+    $p->code = "generer_introduction_entite($_id_objet, '$type_objet', $_ligne, $_introduction_longueur, $_longueur_ou_suite, $_suite, \$connect)";
837
+
838
+    #$p->interdire_scripts = true;
839
+    $p->etoile = '*'; // propre est deja fait dans le calcul de l'intro
840
+    return $p;
841 841
 }
842 842
 
843 843
 
@@ -857,15 +857,15 @@  discard block
 block discarded – undo
857 857
  *     Pile complétée par le code à générer
858 858
  **/
859 859
 function balise_LANG_dist($p) {
860
-	$_lang = champ_sql('lang', $p);
861
-	if (!$p->etoile) {
862
-		$p->code = "spip_htmlentities($_lang ? $_lang : \$GLOBALS['spip_lang'])";
863
-	} else {
864
-		$p->code = "spip_htmlentities($_lang)";
865
-	}
866
-	$p->interdire_scripts = false;
860
+    $_lang = champ_sql('lang', $p);
861
+    if (!$p->etoile) {
862
+        $p->code = "spip_htmlentities($_lang ? $_lang : \$GLOBALS['spip_lang'])";
863
+    } else {
864
+        $p->code = "spip_htmlentities($_lang)";
865
+    }
866
+    $p->interdire_scripts = false;
867 867
 
868
-	return $p;
868
+    return $p;
869 869
 }
870 870
 
871 871
 /**
@@ -887,48 +887,48 @@  discard block
 block discarded – undo
887 887
  *     Pile complétée par le code à générer
888 888
  */
889 889
 function balise_LESAUTEURS_dist($p) {
890
-	// Cherche le champ 'lesauteurs' dans la pile
891
-	$_lesauteurs = champ_sql('lesauteurs', $p, false);
892
-
893
-	// Si le champ n'existe pas (cas de spip_articles), on applique
894
-	// le modele lesauteurs.html en passant id_article dans le contexte;
895
-	// dans le cas contraire on prend le champ 'lesauteurs'
896
-	// (cf extension sites/)
897
-	if (
898
-		$_lesauteurs
899
-		and $_lesauteurs != '@$Pile[0][\'lesauteurs\']'
900
-	) {
901
-		$p->code = "safehtml($_lesauteurs)";
902
-		// $p->interdire_scripts = true;
903
-	} else {
904
-		if (!$p->id_boucle) {
905
-			$connect = '';
906
-			$objet = 'article';
907
-			$id_table_objet = 'id_article';
908
-		} else {
909
-			$b = $p->nom_boucle ? $p->nom_boucle : $p->id_boucle;
910
-			$connect = $p->boucles[$b]->sql_serveur;
911
-			$type_boucle = $p->boucles[$b]->type_requete;
912
-			$objet = objet_type($type_boucle);
913
-			$id_table_objet = id_table_objet($type_boucle);
914
-		}
915
-		$c = memoriser_contexte_compil($p);
916
-
917
-		$p->code = sprintf(
918
-			CODE_RECUPERER_FOND,
919
-			"'modeles/lesauteurs'",
920
-			"array('objet'=>'" . $objet .
921
-			"','id_objet' => " . champ_sql($id_table_objet, $p) .
922
-			",'$id_table_objet' => " . champ_sql($id_table_objet, $p) .
923
-			($objet == 'article' ? '' : ",'id_article' => " . champ_sql('id_article', $p)) .
924
-			')',
925
-			"'trim'=>true, 'compil'=>array($c)",
926
-			_q($connect)
927
-		);
928
-		$p->interdire_scripts = false; // securite apposee par recuperer_fond()
929
-	}
930
-
931
-	return $p;
890
+    // Cherche le champ 'lesauteurs' dans la pile
891
+    $_lesauteurs = champ_sql('lesauteurs', $p, false);
892
+
893
+    // Si le champ n'existe pas (cas de spip_articles), on applique
894
+    // le modele lesauteurs.html en passant id_article dans le contexte;
895
+    // dans le cas contraire on prend le champ 'lesauteurs'
896
+    // (cf extension sites/)
897
+    if (
898
+        $_lesauteurs
899
+        and $_lesauteurs != '@$Pile[0][\'lesauteurs\']'
900
+    ) {
901
+        $p->code = "safehtml($_lesauteurs)";
902
+        // $p->interdire_scripts = true;
903
+    } else {
904
+        if (!$p->id_boucle) {
905
+            $connect = '';
906
+            $objet = 'article';
907
+            $id_table_objet = 'id_article';
908
+        } else {
909
+            $b = $p->nom_boucle ? $p->nom_boucle : $p->id_boucle;
910
+            $connect = $p->boucles[$b]->sql_serveur;
911
+            $type_boucle = $p->boucles[$b]->type_requete;
912
+            $objet = objet_type($type_boucle);
913
+            $id_table_objet = id_table_objet($type_boucle);
914
+        }
915
+        $c = memoriser_contexte_compil($p);
916
+
917
+        $p->code = sprintf(
918
+            CODE_RECUPERER_FOND,
919
+            "'modeles/lesauteurs'",
920
+            "array('objet'=>'" . $objet .
921
+            "','id_objet' => " . champ_sql($id_table_objet, $p) .
922
+            ",'$id_table_objet' => " . champ_sql($id_table_objet, $p) .
923
+            ($objet == 'article' ? '' : ",'id_article' => " . champ_sql('id_article', $p)) .
924
+            ')',
925
+            "'trim'=>true, 'compil'=>array($c)",
926
+            _q($connect)
927
+        );
928
+        $p->interdire_scripts = false; // securite apposee par recuperer_fond()
929
+    }
930
+
931
+    return $p;
932 932
 }
933 933
 
934 934
 
@@ -955,76 +955,76 @@  discard block
 block discarded – undo
955 955
  *     Pile complétée par le code à générer
956 956
  */
957 957
 function balise_RANG_dist($p) {
958
-	$b = index_boucle($p);
959
-	if ($b === '') {
960
-		$msg = [
961
-			'zbug_champ_hors_boucle',
962
-			['champ' => '#RANG']
963
-		];
964
-		erreur_squelette($msg, $p);
965
-	} else {
966
-		// chercher d'abord un champ sql rang (mais pas dans le env : defaut '' si on trouve pas de champ sql)
967
-		// dans la boucle immediatement englobante uniquement
968
-		// sinon on compose le champ calcule
969
-		$_rang = champ_sql('rang', $p, '', false);
970
-
971
-		// si pas trouve de champ sql rang :
972
-		if (!$_rang or $_rang == "''") {
973
-			$boucle = &$p->boucles[$b];
974
-
975
-			// on gere le cas ou #RANG est une extraction du numero dans le titre
976
-			$trouver_table = charger_fonction('trouver_table', 'base');
977
-			$desc = $trouver_table($boucle->id_table);
978
-			$_titre = ''; # où extraire le numero ?
979
-
980
-			if (isset($desc['titre'])) {
981
-				$t = $desc['titre'];
982
-				if (
983
-					// Soit on trouve avec la déclaration de la lang AVANT
984
-					preg_match(';(?:lang\s*,)\s*(.*?titre)\s*(,|$);', $t, $m)
985
-					// Soit on prend depuis le début
986
-					or preg_match(';^(.*?titre)\s*(,|$);', $t, $m)
987
-				) {
988
-					$m = preg_replace(',as\s+titre$,i', '', $m[1]);
989
-					$m = trim($m);
990
-					if ($m != "''") {
991
-						if (!preg_match(',\W,', $m)) {
992
-							$m = $boucle->id_table . ".$m";
993
-						}
994
-
995
-						$m .= ' AS titre_rang';
996
-
997
-						$boucle->select[] = $m;
998
-						$_titre = '$Pile[$SP][\'titre_rang\']';
999
-					}
1000
-				}
1001
-			}
1002
-
1003
-			// si on n'a rien trouvé, on utilise le champ titre classique
1004
-			if (!$_titre) {
1005
-				$_titre = champ_sql('titre', $p);
1006
-			}
1007
-
1008
-			// et on recupere aussi les infos de liaison si on est en train d'editer les liens justement
1009
-			// cas des formulaires xxx_lies utilises par #FORMULAIRE_EDITER_LIENS
1010
-			$type_boucle = $boucle->type_requete;
1011
-			$objet = objet_type($type_boucle);
1012
-			$id_table_objet = id_table_objet($type_boucle);
1013
-			$_primary = champ_sql($id_table_objet, $p, '', false);
1014
-			$_env = '$Pile[0]';
1015
-
1016
-			if (!$_titre) {$_titre = "''";
1017
-			}
1018
-			if (!$_primary) {$_primary = "''";
1019
-			}
1020
-			$_rang = "calculer_rang_smart($_titre, '$objet', $_primary, $_env)";
1021
-		}
1022
-
1023
-		$p->code = $_rang;
1024
-		$p->interdire_scripts = false;
1025
-	}
1026
-
1027
-	return $p;
958
+    $b = index_boucle($p);
959
+    if ($b === '') {
960
+        $msg = [
961
+            'zbug_champ_hors_boucle',
962
+            ['champ' => '#RANG']
963
+        ];
964
+        erreur_squelette($msg, $p);
965
+    } else {
966
+        // chercher d'abord un champ sql rang (mais pas dans le env : defaut '' si on trouve pas de champ sql)
967
+        // dans la boucle immediatement englobante uniquement
968
+        // sinon on compose le champ calcule
969
+        $_rang = champ_sql('rang', $p, '', false);
970
+
971
+        // si pas trouve de champ sql rang :
972
+        if (!$_rang or $_rang == "''") {
973
+            $boucle = &$p->boucles[$b];
974
+
975
+            // on gere le cas ou #RANG est une extraction du numero dans le titre
976
+            $trouver_table = charger_fonction('trouver_table', 'base');
977
+            $desc = $trouver_table($boucle->id_table);
978
+            $_titre = ''; # où extraire le numero ?
979
+
980
+            if (isset($desc['titre'])) {
981
+                $t = $desc['titre'];
982
+                if (
983
+                    // Soit on trouve avec la déclaration de la lang AVANT
984
+                    preg_match(';(?:lang\s*,)\s*(.*?titre)\s*(,|$);', $t, $m)
985
+                    // Soit on prend depuis le début
986
+                    or preg_match(';^(.*?titre)\s*(,|$);', $t, $m)
987
+                ) {
988
+                    $m = preg_replace(',as\s+titre$,i', '', $m[1]);
989
+                    $m = trim($m);
990
+                    if ($m != "''") {
991
+                        if (!preg_match(',\W,', $m)) {
992
+                            $m = $boucle->id_table . ".$m";
993
+                        }
994
+
995
+                        $m .= ' AS titre_rang';
996
+
997
+                        $boucle->select[] = $m;
998
+                        $_titre = '$Pile[$SP][\'titre_rang\']';
999
+                    }
1000
+                }
1001
+            }
1002
+
1003
+            // si on n'a rien trouvé, on utilise le champ titre classique
1004
+            if (!$_titre) {
1005
+                $_titre = champ_sql('titre', $p);
1006
+            }
1007
+
1008
+            // et on recupere aussi les infos de liaison si on est en train d'editer les liens justement
1009
+            // cas des formulaires xxx_lies utilises par #FORMULAIRE_EDITER_LIENS
1010
+            $type_boucle = $boucle->type_requete;
1011
+            $objet = objet_type($type_boucle);
1012
+            $id_table_objet = id_table_objet($type_boucle);
1013
+            $_primary = champ_sql($id_table_objet, $p, '', false);
1014
+            $_env = '$Pile[0]';
1015
+
1016
+            if (!$_titre) {$_titre = "''";
1017
+            }
1018
+            if (!$_primary) {$_primary = "''";
1019
+            }
1020
+            $_rang = "calculer_rang_smart($_titre, '$objet', $_primary, $_env)";
1021
+        }
1022
+
1023
+        $p->code = $_rang;
1024
+        $p->interdire_scripts = false;
1025
+    }
1026
+
1027
+    return $p;
1028 1028
 }
1029 1029
 
1030 1030
 
@@ -1046,12 +1046,12 @@  discard block
 block discarded – undo
1046 1046
  *     Pile complétée par le code à générer
1047 1047
  **/
1048 1048
 function balise_POPULARITE_dist($p) {
1049
-	$_popularite = champ_sql('popularite', $p);
1050
-	$p->code = "(ceil(min(100, 100 * $_popularite
1049
+    $_popularite = champ_sql('popularite', $p);
1050
+    $p->code = "(ceil(min(100, 100 * $_popularite
1051 1051
 	/ max(1 , 0 + \$GLOBALS['meta']['popularite_max']))))";
1052
-	$p->interdire_scripts = false;
1052
+    $p->interdire_scripts = false;
1053 1053
 
1054
-	return $p;
1054
+    return $p;
1055 1055
 }
1056 1056
 
1057 1057
 /**
@@ -1062,8 +1062,8 @@  discard block
 block discarded – undo
1062 1062
  * l'absence peut-être due à une faute de frappe dans le contexte inclus.
1063 1063
  */
1064 1064
 define(
1065
-	'CODE_PAGINATION',
1066
-	'%s($Numrows["%s"]["grand_total"],
1065
+    'CODE_PAGINATION',
1066
+    '%s($Numrows["%s"]["grand_total"],
1067 1067
  		%s,
1068 1068
 		isset($Pile[0][%4$s])?$Pile[0][%4$s]:intval(_request(%4$s)),
1069 1069
 		%5$s, %6$s, %7$s, %8$s, array(%9$s))'
@@ -1100,75 +1100,75 @@  discard block
 block discarded – undo
1100 1100
  *     Pile complétée par le code à générer
1101 1101
  */
1102 1102
 function balise_PAGINATION_dist($p, $liste = 'true') {
1103
-	$b = index_boucle_mere($p);
1104
-
1105
-	// s'il n'y a pas de nom de boucle, on ne peut pas paginer
1106
-	if ($b === '') {
1107
-		$msg = [
1108
-			'zbug_champ_hors_boucle',
1109
-			['champ' => $liste ? 'PAGINATION' : 'ANCRE_PAGINATION']
1110
-		];
1111
-		erreur_squelette($msg, $p);
1112
-
1113
-		return $p;
1114
-	}
1115
-
1116
-	// s'il n'y a pas de mode_partie, c'est qu'on se trouve
1117
-	// dans un boucle recursive ou qu'on a oublie le critere {pagination}
1118
-	if (!$p->boucles[$b]->mode_partie) {
1119
-		if (!$p->boucles[$b]->table_optionnelle) {
1120
-			$msg = [
1121
-				'zbug_pagination_sans_critere',
1122
-				['champ' => '#PAGINATION']
1123
-			];
1124
-			erreur_squelette($msg, $p);
1125
-		}
1126
-
1127
-		return $p;
1128
-	}
1129
-
1130
-	// a priori true
1131
-	// si false, le compilo va bloquer sur des syntaxes avec un filtre sans argument qui suit la balise
1132
-	// si true, les arguments simples (sans truc=chose) vont degager
1133
-	$_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $p->id_boucle, false, false);
1134
-	if (count($_contexte)) {
1135
-		$key = key($_contexte);
1136
-		if (is_numeric($key)) {
1137
-			array_shift($_contexte);
1138
-			$__modele = interprete_argument_balise(1, $p);
1139
-		}
1140
-	}
1141
-
1142
-	if (count($_contexte)) {
1143
-		$code_contexte = implode(',', $_contexte);
1144
-	} else {
1145
-		$code_contexte = '';
1146
-	}
1147
-
1148
-	$connect = $p->boucles[$b]->sql_serveur;
1149
-	$pas = $p->boucles[$b]->total_parties;
1150
-	$f_pagination = chercher_filtre('pagination');
1151
-	$type = $p->boucles[$b]->modificateur['debut_nom'];
1152
-	$modif = ($type[0] !== "'") ? "'debut'.$type"
1153
-		: ("'debut" . substr($type, 1));
1154
-
1155
-	$p->code = sprintf(
1156
-		CODE_PAGINATION,
1157
-		$f_pagination,
1158
-		$b,
1159
-		$type,
1160
-		$modif,
1161
-		$pas,
1162
-		$liste,
1163
-		((isset($__modele) and $__modele) ? $__modele : "''"),
1164
-		_q($connect),
1165
-		$code_contexte
1166
-	);
1167
-
1168
-	$p->boucles[$b]->numrows = true;
1169
-	$p->interdire_scripts = false;
1170
-
1171
-	return $p;
1103
+    $b = index_boucle_mere($p);
1104
+
1105
+    // s'il n'y a pas de nom de boucle, on ne peut pas paginer
1106
+    if ($b === '') {
1107
+        $msg = [
1108
+            'zbug_champ_hors_boucle',
1109
+            ['champ' => $liste ? 'PAGINATION' : 'ANCRE_PAGINATION']
1110
+        ];
1111
+        erreur_squelette($msg, $p);
1112
+
1113
+        return $p;
1114
+    }
1115
+
1116
+    // s'il n'y a pas de mode_partie, c'est qu'on se trouve
1117
+    // dans un boucle recursive ou qu'on a oublie le critere {pagination}
1118
+    if (!$p->boucles[$b]->mode_partie) {
1119
+        if (!$p->boucles[$b]->table_optionnelle) {
1120
+            $msg = [
1121
+                'zbug_pagination_sans_critere',
1122
+                ['champ' => '#PAGINATION']
1123
+            ];
1124
+            erreur_squelette($msg, $p);
1125
+        }
1126
+
1127
+        return $p;
1128
+    }
1129
+
1130
+    // a priori true
1131
+    // si false, le compilo va bloquer sur des syntaxes avec un filtre sans argument qui suit la balise
1132
+    // si true, les arguments simples (sans truc=chose) vont degager
1133
+    $_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $p->id_boucle, false, false);
1134
+    if (count($_contexte)) {
1135
+        $key = key($_contexte);
1136
+        if (is_numeric($key)) {
1137
+            array_shift($_contexte);
1138
+            $__modele = interprete_argument_balise(1, $p);
1139
+        }
1140
+    }
1141
+
1142
+    if (count($_contexte)) {
1143
+        $code_contexte = implode(',', $_contexte);
1144
+    } else {
1145
+        $code_contexte = '';
1146
+    }
1147
+
1148
+    $connect = $p->boucles[$b]->sql_serveur;
1149
+    $pas = $p->boucles[$b]->total_parties;
1150
+    $f_pagination = chercher_filtre('pagination');
1151
+    $type = $p->boucles[$b]->modificateur['debut_nom'];
1152
+    $modif = ($type[0] !== "'") ? "'debut'.$type"
1153
+        : ("'debut" . substr($type, 1));
1154
+
1155
+    $p->code = sprintf(
1156
+        CODE_PAGINATION,
1157
+        $f_pagination,
1158
+        $b,
1159
+        $type,
1160
+        $modif,
1161
+        $pas,
1162
+        $liste,
1163
+        ((isset($__modele) and $__modele) ? $__modele : "''"),
1164
+        _q($connect),
1165
+        $code_contexte
1166
+    );
1167
+
1168
+    $p->boucles[$b]->numrows = true;
1169
+    $p->interdire_scripts = false;
1170
+
1171
+    return $p;
1172 1172
 }
1173 1173
 
1174 1174
 
@@ -1195,11 +1195,11 @@  discard block
 block discarded – undo
1195 1195
  *     Pile complétée par le code à générer
1196 1196
  **/
1197 1197
 function balise_ANCRE_PAGINATION_dist($p) {
1198
-	if ($f = charger_fonction('PAGINATION', 'balise', true)) {
1199
-		return $f($p, $liste = 'false');
1200
-	} else {
1201
-		return null;
1202
-	} // ou une erreur ?
1198
+    if ($f = charger_fonction('PAGINATION', 'balise', true)) {
1199
+        return $f($p, $liste = 'false');
1200
+    } else {
1201
+        return null;
1202
+    } // ou une erreur ?
1203 1203
 }
1204 1204
 
1205 1205
 
@@ -1220,18 +1220,18 @@  discard block
 block discarded – undo
1220 1220
  *     Pile complétée par le code à générer
1221 1221
  **/
1222 1222
 function balise_GRAND_TOTAL_dist($p) {
1223
-	$b = index_boucle_mere($p);
1224
-	if ($b === '') {
1225
-		$msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
1226
-		erreur_squelette($msg, $p);
1227
-	} else {
1228
-		$p->code = "(isset(\$Numrows['$b']['grand_total'])
1223
+    $b = index_boucle_mere($p);
1224
+    if ($b === '') {
1225
+        $msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
1226
+        erreur_squelette($msg, $p);
1227
+    } else {
1228
+        $p->code = "(isset(\$Numrows['$b']['grand_total'])
1229 1229
 			? \$Numrows['$b']['grand_total'] : \$Numrows['$b']['total'])";
1230
-		$p->boucles[$b]->numrows = true;
1231
-		$p->interdire_scripts = false;
1232
-	}
1230
+        $p->boucles[$b]->numrows = true;
1231
+        $p->interdire_scripts = false;
1232
+    }
1233 1233
 
1234
-	return $p;
1234
+    return $p;
1235 1235
 }
1236 1236
 
1237 1237
 
@@ -1259,10 +1259,10 @@  discard block
 block discarded – undo
1259 1259
  *     Pile complétée par le code à générer
1260 1260
  **/
1261 1261
 function balise_SELF_dist($p) {
1262
-	$p->code = 'self()';
1263
-	$p->interdire_scripts = false;
1262
+    $p->code = 'self()';
1263
+    $p->interdire_scripts = false;
1264 1264
 
1265
-	return $p;
1265
+    return $p;
1266 1266
 }
1267 1267
 
1268 1268
 
@@ -1289,17 +1289,17 @@  discard block
 block discarded – undo
1289 1289
  *     Pile complétée par le code à générer
1290 1290
  **/
1291 1291
 function balise_CHEMIN_dist($p) {
1292
-	$arg = interprete_argument_balise(1, $p);
1293
-	if (!$arg) {
1294
-		$msg = ['zbug_balise_sans_argument', ['balise' => ' CHEMIN']];
1295
-		erreur_squelette($msg, $p);
1296
-	} else {
1297
-		$p->code = 'find_in_path(' . $arg . ')';
1298
-	}
1292
+    $arg = interprete_argument_balise(1, $p);
1293
+    if (!$arg) {
1294
+        $msg = ['zbug_balise_sans_argument', ['balise' => ' CHEMIN']];
1295
+        erreur_squelette($msg, $p);
1296
+    } else {
1297
+        $p->code = 'find_in_path(' . $arg . ')';
1298
+    }
1299 1299
 
1300
-	$p->interdire_scripts = false;
1300
+    $p->interdire_scripts = false;
1301 1301
 
1302
-	return $p;
1302
+    return $p;
1303 1303
 }
1304 1304
 
1305 1305
 /**
@@ -1324,16 +1324,16 @@  discard block
 block discarded – undo
1324 1324
  *     Pile complétée par le code à générer
1325 1325
  **/
1326 1326
 function balise_CHEMIN_IMAGE_dist($p) {
1327
-	$arg = interprete_argument_balise(1, $p);
1328
-	if (!$arg) {
1329
-		$msg = ['zbug_balise_sans_argument', ['balise' => ' CHEMIN_IMAGE']];
1330
-		erreur_squelette($msg, $p);
1331
-	} else {
1332
-		$p->code = 'chemin_image(' . $arg . ')';
1333
-	}
1327
+    $arg = interprete_argument_balise(1, $p);
1328
+    if (!$arg) {
1329
+        $msg = ['zbug_balise_sans_argument', ['balise' => ' CHEMIN_IMAGE']];
1330
+        erreur_squelette($msg, $p);
1331
+    } else {
1332
+        $p->code = 'chemin_image(' . $arg . ')';
1333
+    }
1334 1334
 
1335
-	$p->interdire_scripts = false;
1336
-	return $p;
1335
+    $p->interdire_scripts = false;
1336
+    return $p;
1337 1337
 }
1338 1338
 
1339 1339
 
@@ -1371,36 +1371,36 @@  discard block
 block discarded – undo
1371 1371
  **/
1372 1372
 function balise_ENV_dist($p, $src = null) {
1373 1373
 
1374
-	// cle du tableau desiree
1375
-	$_nom = interprete_argument_balise(1, $p);
1376
-	// valeur par defaut
1377
-	$_sinon = interprete_argument_balise(2, $p);
1374
+    // cle du tableau desiree
1375
+    $_nom = interprete_argument_balise(1, $p);
1376
+    // valeur par defaut
1377
+    $_sinon = interprete_argument_balise(2, $p);
1378 1378
 
1379
-	// $src est un tableau de donnees sources eventuellement transmis
1380
-	// en absence, on utilise l'environnement du squelette $Pile[0]
1379
+    // $src est un tableau de donnees sources eventuellement transmis
1380
+    // en absence, on utilise l'environnement du squelette $Pile[0]
1381 1381
 
1382
-	if (!$_nom) {
1383
-		// cas de #ENV sans argument : on retourne le serialize() du tableau
1384
-		// une belle fonction [(#ENV|affiche_env)] serait pratique
1385
-		if ($src) {
1386
-			$p->code = '(is_array($a = (' . $src . ')) ? serialize($a) : "")';
1387
-		} else {
1388
-			$p->code = 'serialize($Pile[0]??[])';
1389
-		}
1390
-	} else {
1391
-		if (!$src) {
1392
-			$src = '$Pile[0]??[]';
1393
-		}
1394
-		if ($_sinon) {
1395
-			$p->code = "sinon(table_valeur($src, (string)$_nom, null), $_sinon)";
1396
-		} else {
1397
-			$p->code = "table_valeur($src, (string)$_nom, null)";
1398
-		}
1399
-	}
1382
+    if (!$_nom) {
1383
+        // cas de #ENV sans argument : on retourne le serialize() du tableau
1384
+        // une belle fonction [(#ENV|affiche_env)] serait pratique
1385
+        if ($src) {
1386
+            $p->code = '(is_array($a = (' . $src . ')) ? serialize($a) : "")';
1387
+        } else {
1388
+            $p->code = 'serialize($Pile[0]??[])';
1389
+        }
1390
+    } else {
1391
+        if (!$src) {
1392
+            $src = '$Pile[0]??[]';
1393
+        }
1394
+        if ($_sinon) {
1395
+            $p->code = "sinon(table_valeur($src, (string)$_nom, null), $_sinon)";
1396
+        } else {
1397
+            $p->code = "table_valeur($src, (string)$_nom, null)";
1398
+        }
1399
+    }
1400 1400
 
1401
-	#$p->interdire_scripts = true;
1401
+    #$p->interdire_scripts = true;
1402 1402
 
1403
-	return $p;
1403
+    return $p;
1404 1404
 }
1405 1405
 
1406 1406
 /**
@@ -1430,16 +1430,16 @@  discard block
 block discarded – undo
1430 1430
  *     Pile completée du code PHP d'exécution de la balise
1431 1431
  */
1432 1432
 function balise_CONFIG_dist($p) {
1433
-	if (!$arg = interprete_argument_balise(1, $p)) {
1434
-		$arg = "''";
1435
-	}
1436
-	$_sinon = interprete_argument_balise(2, $p);
1437
-	$_unserialize = sinon(interprete_argument_balise(3, $p), 'false');
1433
+    if (!$arg = interprete_argument_balise(1, $p)) {
1434
+        $arg = "''";
1435
+    }
1436
+    $_sinon = interprete_argument_balise(2, $p);
1437
+    $_unserialize = sinon(interprete_argument_balise(3, $p), 'false');
1438 1438
 
1439
-	$p->code = '(include_spip(\'inc/config\')?lire_config(' . $arg . ',' .
1440
-		($_sinon && $_sinon != "''" ? $_sinon : 'null') . ',' . $_unserialize . "):'')";
1439
+    $p->code = '(include_spip(\'inc/config\')?lire_config(' . $arg . ',' .
1440
+        ($_sinon && $_sinon != "''" ? $_sinon : 'null') . ',' . $_unserialize . "):'')";
1441 1441
 
1442
-	return $p;
1442
+    return $p;
1443 1443
 }
1444 1444
 
1445 1445
 
@@ -1462,10 +1462,10 @@  discard block
 block discarded – undo
1462 1462
  *     Pile completée du code PHP d'exécution de la balise
1463 1463
  */
1464 1464
 function balise_CONNECT_dist($p) {
1465
-	$p->code = '($connect ? $connect : NULL)';
1466
-	$p->interdire_scripts = false;
1465
+    $p->code = '($connect ? $connect : NULL)';
1466
+    $p->interdire_scripts = false;
1467 1467
 
1468
-	return $p;
1468
+    return $p;
1469 1469
 }
1470 1470
 
1471 1471
 
@@ -1493,15 +1493,15 @@  discard block
 block discarded – undo
1493 1493
  *     Pile completée du code PHP d'exécution de la balise
1494 1494
  **/
1495 1495
 function balise_SESSION_dist($p) {
1496
-	$p->descr['session'] = true;
1496
+    $p->descr['session'] = true;
1497 1497
 
1498
-	$f = function_exists('balise_ENV')
1499
-		? 'balise_ENV'
1500
-		: 'balise_ENV_dist';
1498
+    $f = function_exists('balise_ENV')
1499
+        ? 'balise_ENV'
1500
+        : 'balise_ENV_dist';
1501 1501
 
1502
-	$p = $f($p, '$GLOBALS["visiteur_session"]??[]');
1502
+    $p = $f($p, '$GLOBALS["visiteur_session"]??[]');
1503 1503
 
1504
-	return $p;
1504
+    return $p;
1505 1505
 }
1506 1506
 
1507 1507
 
@@ -1524,18 +1524,18 @@  discard block
 block discarded – undo
1524 1524
  *     Pile completée du code PHP d'exécution de la balise
1525 1525
  **/
1526 1526
 function balise_SESSION_SET_dist($p) {
1527
-	$_nom = interprete_argument_balise(1, $p);
1528
-	$_val = interprete_argument_balise(2, $p);
1529
-	if (!$_nom or !$_val) {
1530
-		$err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'SESSION_SET']];
1531
-		erreur_squelette($err_b_s_a, $p);
1532
-	} else {
1533
-		$p->code = '(include_spip("inc/session") AND session_set(' . $_nom . ',' . $_val . '))';
1534
-	}
1527
+    $_nom = interprete_argument_balise(1, $p);
1528
+    $_val = interprete_argument_balise(2, $p);
1529
+    if (!$_nom or !$_val) {
1530
+        $err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'SESSION_SET']];
1531
+        erreur_squelette($err_b_s_a, $p);
1532
+    } else {
1533
+        $p->code = '(include_spip("inc/session") AND session_set(' . $_nom . ',' . $_val . '))';
1534
+    }
1535 1535
 
1536
-	$p->interdire_scripts = false;
1536
+    $p->interdire_scripts = false;
1537 1537
 
1538
-	return $p;
1538
+    return $p;
1539 1539
 }
1540 1540
 
1541 1541
 
@@ -1566,30 +1566,30 @@  discard block
 block discarded – undo
1566 1566
  *     Pile completée du code PHP d'exécution de la balise
1567 1567
  **/
1568 1568
 function balise_EVAL_dist($p) {
1569
-	$php = interprete_argument_balise(1, $p);
1570
-	if ($php) {
1571
-		# optimisation sur les #EVAL{une expression sans #BALISE}
1572
-		# attention au commentaire "// x signes" qui precede
1573
-		if (
1574
-			preg_match(
1575
-				",^([[:space:]]*//[^\n]*\n)'([^']+)'$,ms",
1576
-				$php,
1577
-				$r
1578
-			)
1579
-		) {
1580
-			$p->code = /* $r[1]. */
1581
-				'(' . $r[2] . ')';
1582
-		} else {
1583
-			$p->code = "eval('return '.$php.';')";
1584
-		}
1585
-	} else {
1586
-		$msg = ['zbug_balise_sans_argument', ['balise' => ' EVAL']];
1587
-		erreur_squelette($msg, $p);
1588
-	}
1589
-
1590
-	#$p->interdire_scripts = true;
1591
-
1592
-	return $p;
1569
+    $php = interprete_argument_balise(1, $p);
1570
+    if ($php) {
1571
+        # optimisation sur les #EVAL{une expression sans #BALISE}
1572
+        # attention au commentaire "// x signes" qui precede
1573
+        if (
1574
+            preg_match(
1575
+                ",^([[:space:]]*//[^\n]*\n)'([^']+)'$,ms",
1576
+                $php,
1577
+                $r
1578
+            )
1579
+        ) {
1580
+            $p->code = /* $r[1]. */
1581
+                '(' . $r[2] . ')';
1582
+        } else {
1583
+            $p->code = "eval('return '.$php.';')";
1584
+        }
1585
+    } else {
1586
+        $msg = ['zbug_balise_sans_argument', ['balise' => ' EVAL']];
1587
+        erreur_squelette($msg, $p);
1588
+    }
1589
+
1590
+    #$p->interdire_scripts = true;
1591
+
1592
+    return $p;
1593 1593
 }
1594 1594
 
1595 1595
 
@@ -1619,19 +1619,19 @@  discard block
 block discarded – undo
1619 1619
  **/
1620 1620
 function balise_CHAMP_SQL_dist($p) {
1621 1621
 
1622
-	if (
1623
-		$p->param
1624
-		and isset($p->param[0][1][0])
1625
-		and $champ = ($p->param[0][1][0]->texte)
1626
-	) {
1627
-		$p->code = champ_sql($champ, $p);
1628
-	} else {
1629
-		$err_b_s_a = ['zbug_balise_sans_argument', ['balise' => ' CHAMP_SQL']];
1630
-		erreur_squelette($err_b_s_a, $p);
1631
-	}
1622
+    if (
1623
+        $p->param
1624
+        and isset($p->param[0][1][0])
1625
+        and $champ = ($p->param[0][1][0]->texte)
1626
+    ) {
1627
+        $p->code = champ_sql($champ, $p);
1628
+    } else {
1629
+        $err_b_s_a = ['zbug_balise_sans_argument', ['balise' => ' CHAMP_SQL']];
1630
+        erreur_squelette($err_b_s_a, $p);
1631
+    }
1632 1632
 
1633
-	#$p->interdire_scripts = true;
1634
-	return $p;
1633
+    #$p->interdire_scripts = true;
1634
+    return $p;
1635 1635
 }
1636 1636
 
1637 1637
 /**
@@ -1657,13 +1657,13 @@  discard block
 block discarded – undo
1657 1657
  *     Pile complétée par le code à générer
1658 1658
  **/
1659 1659
 function balise_VAL_dist($p) {
1660
-	$p->code = interprete_argument_balise(1, $p);
1661
-	if (!strlen($p->code)) {
1662
-		$p->code = "''";
1663
-	}
1664
-	$p->interdire_scripts = false;
1660
+    $p->code = interprete_argument_balise(1, $p);
1661
+    if (!strlen($p->code)) {
1662
+        $p->code = "''";
1663
+    }
1664
+    $p->interdire_scripts = false;
1665 1665
 
1666
-	return $p;
1666
+    return $p;
1667 1667
 }
1668 1668
 
1669 1669
 /**
@@ -1692,10 +1692,10 @@  discard block
 block discarded – undo
1692 1692
  *     Pile complétée par le code à générer
1693 1693
  **/
1694 1694
 function balise_REM_dist($p) {
1695
-	$p->code = "''";
1696
-	$p->interdire_scripts = false;
1695
+    $p->code = "''";
1696
+    $p->interdire_scripts = false;
1697 1697
 
1698
-	return $p;
1698
+    return $p;
1699 1699
 }
1700 1700
 
1701 1701
 /**
@@ -1705,10 +1705,10 @@  discard block
 block discarded – undo
1705 1705
  * @return mixed
1706 1706
  */
1707 1707
 function balise_NULL_dist($p) {
1708
-	$p->code = 'null';
1709
-	$p->interdire_scripts = false;
1708
+    $p->code = 'null';
1709
+    $p->interdire_scripts = false;
1710 1710
 
1711
-	return $p;
1711
+    return $p;
1712 1712
 }
1713 1713
 
1714 1714
 
@@ -1732,18 +1732,18 @@  discard block
 block discarded – undo
1732 1732
  **/
1733 1733
 function balise_HTTP_HEADER_dist($p) {
1734 1734
 
1735
-	$header = interprete_argument_balise(1, $p);
1736
-	if (!$header) {
1737
-		$err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'HTTP_HEADER']];
1738
-		erreur_squelette($err_b_s_a, $p);
1739
-	} else {
1740
-		$p->code = "'<'.'?php header(' . _q("
1741
-			. $header
1742
-			. ") . '); ?'.'>'";
1743
-	}
1744
-	$p->interdire_scripts = false;
1735
+    $header = interprete_argument_balise(1, $p);
1736
+    if (!$header) {
1737
+        $err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'HTTP_HEADER']];
1738
+        erreur_squelette($err_b_s_a, $p);
1739
+    } else {
1740
+        $p->code = "'<'.'?php header(' . _q("
1741
+            . $header
1742
+            . ") . '); ?'.'>'";
1743
+    }
1744
+    $p->interdire_scripts = false;
1745 1745
 
1746
-	return $p;
1746
+    return $p;
1747 1747
 }
1748 1748
 
1749 1749
 
@@ -1768,20 +1768,20 @@  discard block
 block discarded – undo
1768 1768
  *     Pile complétée par le code à générer
1769 1769
  **/
1770 1770
 function balise_FILTRE_dist($p) {
1771
-	if ($p->param) {
1772
-		$args = [];
1773
-		foreach ($p->param as $i => $ignore) {
1774
-			$args[] = interprete_argument_balise($i + 1, $p);
1775
-		}
1776
-		$p->code = "'<' . '"
1777
-			. '?php header("X-Spip-Filtre: \'.'
1778
-			. join('.\'|\'.', $args)
1779
-			. " . '\"); ?'.'>'";
1771
+    if ($p->param) {
1772
+        $args = [];
1773
+        foreach ($p->param as $i => $ignore) {
1774
+            $args[] = interprete_argument_balise($i + 1, $p);
1775
+        }
1776
+        $p->code = "'<' . '"
1777
+            . '?php header("X-Spip-Filtre: \'.'
1778
+            . join('.\'|\'.', $args)
1779
+            . " . '\"); ?'.'>'";
1780 1780
 
1781
-		$p->interdire_scripts = false;
1781
+        $p->interdire_scripts = false;
1782 1782
 
1783
-		return $p;
1784
-	}
1783
+        return $p;
1784
+    }
1785 1785
 }
1786 1786
 
1787 1787
 
@@ -1817,55 +1817,55 @@  discard block
 block discarded – undo
1817 1817
  **/
1818 1818
 function balise_CACHE_dist($p) {
1819 1819
 
1820
-	if ($p->param) {
1821
-		$duree = valeur_numerique($p->param[0][1][0]->texte);
1822
-
1823
-		// noter la duree du cache dans un entete proprietaire
1824
-
1825
-		$code = "'<'.'" . '?php header("X-Spip-Cache: '
1826
-			. $duree
1827
-			. '"); ?' . "'.'>'";
1828
-
1829
-		// Remplir le header Cache-Control
1830
-		// cas #CACHE{0}
1831
-		if ($duree == 0) {
1832
-			$code .= ".'<'.'"
1833
-				. '?php header("Cache-Control: no-cache, must-revalidate"); ?'
1834
-				. "'.'><'.'"
1835
-				. '?php header("Pragma: no-cache"); ?'
1836
-				. "'.'>'";
1837
-		}
1838
-
1839
-		// recuperer les parametres suivants
1840
-		$i = 1;
1841
-		while (isset($p->param[0][++$i])) {
1842
-			$pa = ($p->param[0][$i][0]->texte);
1843
-
1844
-			if (
1845
-				$pa == 'cache-client'
1846
-				and $duree > 0
1847
-			) {
1848
-				$code .= ".'<'.'" . '?php header("Cache-Control: max-age='
1849
-					. $duree
1850
-					. '"); ?' . "'.'>'";
1851
-				// il semble logique, si on cache-client, de ne pas invalider
1852
-				$pa = 'statique';
1853
-			}
1854
-
1855
-			if (
1856
-				$pa == 'statique'
1857
-				and $duree > 0
1858
-			) {
1859
-				$code .= ".'<'.'" . '?php header("X-Spip-Statique: oui"); ?' . "'.'>'";
1860
-			}
1861
-		}
1862
-	} else {
1863
-		$code = "''";
1864
-	}
1865
-	$p->code = $code;
1866
-	$p->interdire_scripts = false;
1867
-
1868
-	return $p;
1820
+    if ($p->param) {
1821
+        $duree = valeur_numerique($p->param[0][1][0]->texte);
1822
+
1823
+        // noter la duree du cache dans un entete proprietaire
1824
+
1825
+        $code = "'<'.'" . '?php header("X-Spip-Cache: '
1826
+            . $duree
1827
+            . '"); ?' . "'.'>'";
1828
+
1829
+        // Remplir le header Cache-Control
1830
+        // cas #CACHE{0}
1831
+        if ($duree == 0) {
1832
+            $code .= ".'<'.'"
1833
+                . '?php header("Cache-Control: no-cache, must-revalidate"); ?'
1834
+                . "'.'><'.'"
1835
+                . '?php header("Pragma: no-cache"); ?'
1836
+                . "'.'>'";
1837
+        }
1838
+
1839
+        // recuperer les parametres suivants
1840
+        $i = 1;
1841
+        while (isset($p->param[0][++$i])) {
1842
+            $pa = ($p->param[0][$i][0]->texte);
1843
+
1844
+            if (
1845
+                $pa == 'cache-client'
1846
+                and $duree > 0
1847
+            ) {
1848
+                $code .= ".'<'.'" . '?php header("Cache-Control: max-age='
1849
+                    . $duree
1850
+                    . '"); ?' . "'.'>'";
1851
+                // il semble logique, si on cache-client, de ne pas invalider
1852
+                $pa = 'statique';
1853
+            }
1854
+
1855
+            if (
1856
+                $pa == 'statique'
1857
+                and $duree > 0
1858
+            ) {
1859
+                $code .= ".'<'.'" . '?php header("X-Spip-Statique: oui"); ?' . "'.'>'";
1860
+            }
1861
+        }
1862
+    } else {
1863
+        $code = "''";
1864
+    }
1865
+    $p->code = $code;
1866
+    $p->interdire_scripts = false;
1867
+
1868
+    return $p;
1869 1869
 }
1870 1870
 
1871 1871
 
@@ -1897,13 +1897,13 @@  discard block
 block discarded – undo
1897 1897
  *     Pile complétée par le code à générer
1898 1898
  */
1899 1899
 function balise_INSERT_HEAD_dist($p) {
1900
-	$p->code = "'<'.'"
1901
-		. '?php header("X-Spip-Filtre: insert_head_css_conditionnel"); ?'
1902
-		. "'.'>'";
1903
-	$p->code .= ". pipeline('insert_head','<!-- insert_head -->')";
1904
-	$p->interdire_scripts = false;
1900
+    $p->code = "'<'.'"
1901
+        . '?php header("X-Spip-Filtre: insert_head_css_conditionnel"); ?'
1902
+        . "'.'>'";
1903
+    $p->code .= ". pipeline('insert_head','<!-- insert_head -->')";
1904
+    $p->interdire_scripts = false;
1905 1905
 
1906
-	return $p;
1906
+    return $p;
1907 1907
 }
1908 1908
 
1909 1909
 /**
@@ -1921,10 +1921,10 @@  discard block
 block discarded – undo
1921 1921
  *     Pile complétée par le code à générer
1922 1922
  */
1923 1923
 function balise_INSERT_HEAD_CSS_dist($p) {
1924
-	$p->code = "pipeline('insert_head_css','<!-- insert_head_css -->')";
1925
-	$p->interdire_scripts = false;
1924
+    $p->code = "pipeline('insert_head_css','<!-- insert_head_css -->')";
1925
+    $p->interdire_scripts = false;
1926 1926
 
1927
-	return $p;
1927
+    return $p;
1928 1928
 }
1929 1929
 
1930 1930
 /**
@@ -1939,11 +1939,11 @@  discard block
 block discarded – undo
1939 1939
  *     Pile complétée par le code à générer
1940 1940
  **/
1941 1941
 function balise_INCLUDE_dist($p) {
1942
-	if (function_exists('balise_INCLURE')) {
1943
-		return balise_INCLURE($p);
1944
-	} else {
1945
-		return balise_INCLURE_dist($p);
1946
-	}
1942
+    if (function_exists('balise_INCLURE')) {
1943
+        return balise_INCLURE($p);
1944
+    } else {
1945
+        return balise_INCLURE_dist($p);
1946
+    }
1947 1947
 }
1948 1948
 
1949 1949
 /**
@@ -1977,66 +1977,66 @@  discard block
 block discarded – undo
1977 1977
  *     Pile complétée par le code à générer
1978 1978
  **/
1979 1979
 function balise_INCLURE_dist($p) {
1980
-	$id_boucle = $p->id_boucle;
1981
-	// la lang n'est pas passe de facon automatique par argumenter
1982
-	// mais le sera pas recuperer_fond, sauf si etoile=>true est passe
1983
-	// en option
1984
-
1985
-	$_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $id_boucle, false, false);
1986
-
1987
-	// erreur de syntaxe = fond absent
1988
-	// (2 messages d'erreur SPIP pour le prix d'un, mais pas d'erreur PHP
1989
-	if (!$_contexte) {
1990
-		$contexte = [];
1991
-	}
1992
-
1993
-	if (isset($_contexte['fond'])) {
1994
-		$f = $_contexte['fond'];
1995
-		// toujours vrai :
1996
-		if (preg_match('/^.fond.\s*=>(.*)$/s', $f, $r)) {
1997
-			$f = $r[1];
1998
-			unset($_contexte['fond']);
1999
-		} else {
2000
-			spip_log('compilation de #INCLURE a revoir');
2001
-		}
2002
-
2003
-		// #INCLURE{doublons}
2004
-		if (isset($_contexte['doublons'])) {
2005
-			$_contexte['doublons'] = "'doublons' => \$doublons";
2006
-		}
2007
-
2008
-		// Critere d'inclusion {env} (et {self} pour compatibilite ascendante)
2009
-		$flag_env = false;
2010
-		if (isset($_contexte['env']) or isset($_contexte['self'])) {
2011
-			$flag_env = true;
2012
-			unset($_contexte['env']);
2013
-		}
2014
-
2015
-		$_options = [];
2016
-		if (isset($_contexte['ajax'])) {
2017
-			$_options[] = preg_replace(',=>(.*)$,ims', '=> ($v=(\\1))?$v:true', $_contexte['ajax']);
2018
-			unset($_contexte['ajax']);
2019
-		}
2020
-		if ($p->etoile) {
2021
-			$_options[] = "'etoile'=>true";
2022
-		}
2023
-		$_options[] = "'compil'=>array(" . memoriser_contexte_compil($p) . ')';
2024
-
2025
-		$_l = 'array(' . join(",\n\t", $_contexte) . ')';
2026
-		if ($flag_env) {
2027
-			$_l = "array_merge(\$Pile[0],$_l)";
2028
-		}
2029
-
2030
-		$p->code = sprintf(CODE_RECUPERER_FOND, $f, $_l, join(',', $_options), "_request('connect')");
2031
-	} elseif (!isset($_contexte[1])) {
2032
-		$msg = ['zbug_balise_sans_argument', ['balise' => ' INCLURE']];
2033
-		erreur_squelette($msg, $p);
2034
-	} else {
2035
-		$p->code = 'charge_scripts(' . $_contexte[1] . ',false)';
2036
-	}
2037
-
2038
-	$p->interdire_scripts = false; // la securite est assuree par recuperer_fond
2039
-	return $p;
1980
+    $id_boucle = $p->id_boucle;
1981
+    // la lang n'est pas passe de facon automatique par argumenter
1982
+    // mais le sera pas recuperer_fond, sauf si etoile=>true est passe
1983
+    // en option
1984
+
1985
+    $_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $id_boucle, false, false);
1986
+
1987
+    // erreur de syntaxe = fond absent
1988
+    // (2 messages d'erreur SPIP pour le prix d'un, mais pas d'erreur PHP
1989
+    if (!$_contexte) {
1990
+        $contexte = [];
1991
+    }
1992
+
1993
+    if (isset($_contexte['fond'])) {
1994
+        $f = $_contexte['fond'];
1995
+        // toujours vrai :
1996
+        if (preg_match('/^.fond.\s*=>(.*)$/s', $f, $r)) {
1997
+            $f = $r[1];
1998
+            unset($_contexte['fond']);
1999
+        } else {
2000
+            spip_log('compilation de #INCLURE a revoir');
2001
+        }
2002
+
2003
+        // #INCLURE{doublons}
2004
+        if (isset($_contexte['doublons'])) {
2005
+            $_contexte['doublons'] = "'doublons' => \$doublons";
2006
+        }
2007
+
2008
+        // Critere d'inclusion {env} (et {self} pour compatibilite ascendante)
2009
+        $flag_env = false;
2010
+        if (isset($_contexte['env']) or isset($_contexte['self'])) {
2011
+            $flag_env = true;
2012
+            unset($_contexte['env']);
2013
+        }
2014
+
2015
+        $_options = [];
2016
+        if (isset($_contexte['ajax'])) {
2017
+            $_options[] = preg_replace(',=>(.*)$,ims', '=> ($v=(\\1))?$v:true', $_contexte['ajax']);
2018
+            unset($_contexte['ajax']);
2019
+        }
2020
+        if ($p->etoile) {
2021
+            $_options[] = "'etoile'=>true";
2022
+        }
2023
+        $_options[] = "'compil'=>array(" . memoriser_contexte_compil($p) . ')';
2024
+
2025
+        $_l = 'array(' . join(",\n\t", $_contexte) . ')';
2026
+        if ($flag_env) {
2027
+            $_l = "array_merge(\$Pile[0],$_l)";
2028
+        }
2029
+
2030
+        $p->code = sprintf(CODE_RECUPERER_FOND, $f, $_l, join(',', $_options), "_request('connect')");
2031
+    } elseif (!isset($_contexte[1])) {
2032
+        $msg = ['zbug_balise_sans_argument', ['balise' => ' INCLURE']];
2033
+        erreur_squelette($msg, $p);
2034
+    } else {
2035
+        $p->code = 'charge_scripts(' . $_contexte[1] . ',false)';
2036
+    }
2037
+
2038
+    $p->interdire_scripts = false; // la securite est assuree par recuperer_fond
2039
+    return $p;
2040 2040
 }
2041 2041
 
2042 2042
 
@@ -2064,69 +2064,69 @@  discard block
 block discarded – undo
2064 2064
  **/
2065 2065
 function balise_MODELE_dist($p) {
2066 2066
 
2067
-	$_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $p->id_boucle, false);
2068
-
2069
-	// erreur de syntaxe = fond absent
2070
-	// (2 messages d'erreur SPIP pour le prix d'un, mais pas d'erreur PHP
2071
-	if (!$_contexte) {
2072
-		$_contexte = [];
2073
-	}
2074
-
2075
-	if (!isset($_contexte[1])) {
2076
-		$msg = ['zbug_balise_sans_argument', ['balise' => ' MODELE']];
2077
-		erreur_squelette($msg, $p);
2078
-	} else {
2079
-		$nom = $_contexte[1];
2080
-		unset($_contexte[1]);
2081
-
2082
-		if (preg_match("/^\s*'[^']*'/s", $nom)) {
2083
-			$nom = "'modeles/" . substr($nom, 1);
2084
-		} else {
2085
-			$nom = "'modeles/' . $nom";
2086
-		}
2087
-
2088
-		$flag_env = false;
2089
-		if (isset($_contexte['env'])) {
2090
-			$flag_env = true;
2091
-			unset($_contexte['env']);
2092
-		}
2093
-
2094
-		// Incoherence dans la syntaxe du contexte. A revoir.
2095
-		// Reserver la cle primaire de la boucle courante si elle existe
2096
-		if (isset($p->boucles[$p->id_boucle]->primary)) {
2097
-			$primary = $p->boucles[$p->id_boucle]->primary;
2098
-			if (!strpos($primary, ',')) {
2099
-				$id = champ_sql($primary, $p);
2100
-				$_contexte[] = "'$primary'=>" . $id;
2101
-				$_contexte[] = "'id'=>" . $id;
2102
-			}
2103
-		}
2104
-		$_contexte[] = "'recurs'=>(++\$recurs)";
2105
-		$connect = '';
2106
-		if (isset($p->boucles[$p->id_boucle])) {
2107
-			$connect = $p->boucles[$p->id_boucle]->sql_serveur;
2108
-		}
2109
-
2110
-		$_options = memoriser_contexte_compil($p);
2111
-		$_options = "'compil'=>array($_options), 'trim'=>true";
2112
-		if (isset($_contexte['ajax'])) {
2113
-			$_options .= ', ' . preg_replace(',=>(.*)$,ims', '=> ($v=(\\1))?$v:true', $_contexte['ajax']);
2114
-			unset($_contexte['ajax']);
2115
-		}
2116
-
2117
-		$_l = 'array(' . join(",\n\t", $_contexte) . ')';
2118
-		if ($flag_env) {
2119
-			$_l = "array_merge(\$Pile[0],$_l)";
2120
-		}
2121
-
2122
-		$page = sprintf(CODE_RECUPERER_FOND, $nom, $_l, $_options, _q($connect));
2123
-
2124
-		$p->code = "\n\t(((\$recurs=(isset(\$Pile[0]['recurs'])?\$Pile[0]['recurs']:0))>=5)? '' :\n\t$page)\n";
2125
-
2126
-		$p->interdire_scripts = false; // securite assuree par le squelette
2127
-	}
2128
-
2129
-	return $p;
2067
+    $_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $p->id_boucle, false);
2068
+
2069
+    // erreur de syntaxe = fond absent
2070
+    // (2 messages d'erreur SPIP pour le prix d'un, mais pas d'erreur PHP
2071
+    if (!$_contexte) {
2072
+        $_contexte = [];
2073
+    }
2074
+
2075
+    if (!isset($_contexte[1])) {
2076
+        $msg = ['zbug_balise_sans_argument', ['balise' => ' MODELE']];
2077
+        erreur_squelette($msg, $p);
2078
+    } else {
2079
+        $nom = $_contexte[1];
2080
+        unset($_contexte[1]);
2081
+
2082
+        if (preg_match("/^\s*'[^']*'/s", $nom)) {
2083
+            $nom = "'modeles/" . substr($nom, 1);
2084
+        } else {
2085
+            $nom = "'modeles/' . $nom";
2086
+        }
2087
+
2088
+        $flag_env = false;
2089
+        if (isset($_contexte['env'])) {
2090
+            $flag_env = true;
2091
+            unset($_contexte['env']);
2092
+        }
2093
+
2094
+        // Incoherence dans la syntaxe du contexte. A revoir.
2095
+        // Reserver la cle primaire de la boucle courante si elle existe
2096
+        if (isset($p->boucles[$p->id_boucle]->primary)) {
2097
+            $primary = $p->boucles[$p->id_boucle]->primary;
2098
+            if (!strpos($primary, ',')) {
2099
+                $id = champ_sql($primary, $p);
2100
+                $_contexte[] = "'$primary'=>" . $id;
2101
+                $_contexte[] = "'id'=>" . $id;
2102
+            }
2103
+        }
2104
+        $_contexte[] = "'recurs'=>(++\$recurs)";
2105
+        $connect = '';
2106
+        if (isset($p->boucles[$p->id_boucle])) {
2107
+            $connect = $p->boucles[$p->id_boucle]->sql_serveur;
2108
+        }
2109
+
2110
+        $_options = memoriser_contexte_compil($p);
2111
+        $_options = "'compil'=>array($_options), 'trim'=>true";
2112
+        if (isset($_contexte['ajax'])) {
2113
+            $_options .= ', ' . preg_replace(',=>(.*)$,ims', '=> ($v=(\\1))?$v:true', $_contexte['ajax']);
2114
+            unset($_contexte['ajax']);
2115
+        }
2116
+
2117
+        $_l = 'array(' . join(",\n\t", $_contexte) . ')';
2118
+        if ($flag_env) {
2119
+            $_l = "array_merge(\$Pile[0],$_l)";
2120
+        }
2121
+
2122
+        $page = sprintf(CODE_RECUPERER_FOND, $nom, $_l, $_options, _q($connect));
2123
+
2124
+        $p->code = "\n\t(((\$recurs=(isset(\$Pile[0]['recurs'])?\$Pile[0]['recurs']:0))>=5)? '' :\n\t$page)\n";
2125
+
2126
+        $p->interdire_scripts = false; // securite assuree par le squelette
2127
+    }
2128
+
2129
+    return $p;
2130 2130
 }
2131 2131
 
2132 2132
 
@@ -2150,21 +2150,21 @@  discard block
 block discarded – undo
2150 2150
  *     Pile complétée par le code à générer
2151 2151
  **/
2152 2152
 function balise_SET_dist($p) {
2153
-	$_nom = interprete_argument_balise(1, $p);
2154
-	$_val = interprete_argument_balise(2, $p);
2153
+    $_nom = interprete_argument_balise(1, $p);
2154
+    $_val = interprete_argument_balise(2, $p);
2155 2155
 
2156
-	if (!$_nom or !$_val) {
2157
-		$err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'SET']];
2158
-		erreur_squelette($err_b_s_a, $p);
2159
-	}
2160
-	// affectation $_zzz inutile, mais permet de contourner un bug OpCode cache sous PHP 5.5.4
2161
-	// cf https://bugs.php.net/bug.php?id=65845
2162
-	else {
2163
-		$p->code = "vide(\$Pile['vars'][\$_zzz=(string)$_nom] = $_val)";
2164
-	}
2156
+    if (!$_nom or !$_val) {
2157
+        $err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'SET']];
2158
+        erreur_squelette($err_b_s_a, $p);
2159
+    }
2160
+    // affectation $_zzz inutile, mais permet de contourner un bug OpCode cache sous PHP 5.5.4
2161
+    // cf https://bugs.php.net/bug.php?id=65845
2162
+    else {
2163
+        $p->code = "vide(\$Pile['vars'][\$_zzz=(string)$_nom] = $_val)";
2164
+    }
2165 2165
 
2166
-	$p->interdire_scripts = false; // la balise ne renvoie rien
2167
-	return $p;
2166
+    $p->interdire_scripts = false; // la balise ne renvoie rien
2167
+    return $p;
2168 2168
 }
2169 2169
 
2170 2170
 
@@ -2194,12 +2194,12 @@  discard block
 block discarded – undo
2194 2194
  *     Pile complétée par le code à générer
2195 2195
  **/
2196 2196
 function balise_GET_dist($p) {
2197
-	$p->interdire_scripts = false; // le contenu vient de #SET, donc il est de confiance
2198
-	if (function_exists('balise_ENV')) {
2199
-		return balise_ENV($p, '$Pile["vars"]??[]');
2200
-	} else {
2201
-		return balise_ENV_dist($p, '$Pile["vars"]??[]');
2202
-	}
2197
+    $p->interdire_scripts = false; // le contenu vient de #SET, donc il est de confiance
2198
+    if (function_exists('balise_ENV')) {
2199
+        return balise_ENV($p, '$Pile["vars"]??[]');
2200
+    } else {
2201
+        return balise_ENV_dist($p, '$Pile["vars"]??[]');
2202
+    }
2203 2203
 }
2204 2204
 
2205 2205
 
@@ -2222,22 +2222,22 @@  discard block
 block discarded – undo
2222 2222
  *     Pile complétée par le code à générer
2223 2223
  **/
2224 2224
 function balise_DOUBLONS_dist($p) {
2225
-	if ($type = interprete_argument_balise(1, $p)) {
2226
-		if ($famille = interprete_argument_balise(2, $p)) {
2227
-			$type .= '.' . $famille;
2228
-		}
2229
-		$p->code = '(isset($doublons[' . $type . ']) ? $doublons[' . $type . '] : "")';
2230
-		if (!$p->etoile) {
2231
-			$p->code = 'array_filter(array_map("intval",explode(",",'
2232
-				. $p->code . ')))';
2233
-		}
2234
-	} else {
2235
-		$p->code = '$doublons';
2236
-	}
2225
+    if ($type = interprete_argument_balise(1, $p)) {
2226
+        if ($famille = interprete_argument_balise(2, $p)) {
2227
+            $type .= '.' . $famille;
2228
+        }
2229
+        $p->code = '(isset($doublons[' . $type . ']) ? $doublons[' . $type . '] : "")';
2230
+        if (!$p->etoile) {
2231
+            $p->code = 'array_filter(array_map("intval",explode(",",'
2232
+                . $p->code . ')))';
2233
+        }
2234
+    } else {
2235
+        $p->code = '$doublons';
2236
+    }
2237 2237
 
2238
-	$p->interdire_scripts = false;
2238
+    $p->interdire_scripts = false;
2239 2239
 
2240
-	return $p;
2240
+    return $p;
2241 2241
 }
2242 2242
 
2243 2243
 
@@ -2260,18 +2260,18 @@  discard block
 block discarded – undo
2260 2260
  *     Pile complétée par le code à générer
2261 2261
  **/
2262 2262
 function balise_PIPELINE_dist($p) {
2263
-	$_pipe = interprete_argument_balise(1, $p);
2264
-	if (!$_pipe) {
2265
-		$err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'PIPELINE']];
2266
-		erreur_squelette($err_b_s_a, $p);
2267
-	} else {
2268
-		$_flux = interprete_argument_balise(2, $p);
2269
-		$_flux = $_flux ? $_flux : "''";
2270
-		$p->code = "pipeline( $_pipe , $_flux )";
2271
-		$p->interdire_scripts = false;
2272
-	}
2263
+    $_pipe = interprete_argument_balise(1, $p);
2264
+    if (!$_pipe) {
2265
+        $err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'PIPELINE']];
2266
+        erreur_squelette($err_b_s_a, $p);
2267
+    } else {
2268
+        $_flux = interprete_argument_balise(2, $p);
2269
+        $_flux = $_flux ? $_flux : "''";
2270
+        $p->code = "pipeline( $_pipe , $_flux )";
2271
+        $p->interdire_scripts = false;
2272
+    }
2273 2273
 
2274
-	return $p;
2274
+    return $p;
2275 2275
 }
2276 2276
 
2277 2277
 
@@ -2296,10 +2296,10 @@  discard block
 block discarded – undo
2296 2296
  *     Pile complétée par le code à générer
2297 2297
  **/
2298 2298
 function balise_EDIT_dist($p) {
2299
-	$p->code = "''";
2300
-	$p->interdire_scripts = false;
2299
+    $p->code = "''";
2300
+    $p->interdire_scripts = false;
2301 2301
 
2302
-	return $p;
2302
+    return $p;
2303 2303
 }
2304 2304
 
2305 2305
 
@@ -2322,11 +2322,11 @@  discard block
 block discarded – undo
2322 2322
  *     Pile complétée par le code à générer
2323 2323
  **/
2324 2324
 function balise_TOTAL_UNIQUE_dist($p) {
2325
-	$_famille = interprete_argument_balise(1, $p);
2326
-	$_famille = $_famille ? $_famille : "''";
2327
-	$p->code = "unique('', $_famille, true)";
2325
+    $_famille = interprete_argument_balise(1, $p);
2326
+    $_famille = $_famille ? $_famille : "''";
2327
+    $p->code = "unique('', $_famille, true)";
2328 2328
 
2329
-	return $p;
2329
+    return $p;
2330 2330
 }
2331 2331
 
2332 2332
 /**
@@ -2349,19 +2349,19 @@  discard block
 block discarded – undo
2349 2349
  *     Pile complétée par le code à générer
2350 2350
  **/
2351 2351
 function balise_ARRAY_dist($p) {
2352
-	$_code = [];
2353
-	$n = 1;
2354
-	do {
2355
-		$_key = interprete_argument_balise($n++, $p);
2356
-		$_val = interprete_argument_balise($n++, $p);
2357
-		if ($_key and $_val) {
2358
-			$_code[] = "$_key => $_val";
2359
-		}
2360
-	} while ($_key && $_val);
2361
-	$p->code = 'array(' . join(', ', $_code) . ')';
2362
-	$p->interdire_scripts = false;
2352
+    $_code = [];
2353
+    $n = 1;
2354
+    do {
2355
+        $_key = interprete_argument_balise($n++, $p);
2356
+        $_val = interprete_argument_balise($n++, $p);
2357
+        if ($_key and $_val) {
2358
+            $_code[] = "$_key => $_val";
2359
+        }
2360
+    } while ($_key && $_val);
2361
+    $p->code = 'array(' . join(', ', $_code) . ')';
2362
+    $p->interdire_scripts = false;
2363 2363
 
2364
-	return $p;
2364
+    return $p;
2365 2365
 }
2366 2366
 
2367 2367
 /**
@@ -2380,15 +2380,15 @@  discard block
 block discarded – undo
2380 2380
  *     Pile complétée par le code à générer
2381 2381
  */
2382 2382
 function balise_LISTE_dist($p) {
2383
-	$_code = [];
2384
-	$n = 1;
2385
-	while ($_val = interprete_argument_balise($n++, $p)) {
2386
-		$_code[] = $_val;
2387
-	}
2388
-	$p->code = 'array(' . join(', ', $_code) . ')';
2389
-	$p->interdire_scripts = false;
2383
+    $_code = [];
2384
+    $n = 1;
2385
+    while ($_val = interprete_argument_balise($n++, $p)) {
2386
+        $_code[] = $_val;
2387
+    }
2388
+    $p->code = 'array(' . join(', ', $_code) . ')';
2389
+    $p->interdire_scripts = false;
2390 2390
 
2391
-	return $p;
2391
+    return $p;
2392 2392
 }
2393 2393
 
2394 2394
 
@@ -2422,21 +2422,21 @@  discard block
 block discarded – undo
2422 2422
  *     Pile complétée par le code à générer
2423 2423
  **/
2424 2424
 function balise_AUTORISER_dist($p) {
2425
-	$_code = [];
2426
-	$p->descr['session'] = true; // faire un cache par session
2425
+    $_code = [];
2426
+    $p->descr['session'] = true; // faire un cache par session
2427 2427
 
2428
-	$n = 1;
2429
-	while ($_v = interprete_argument_balise($n++, $p)) {
2430
-		$_code[] = $_v;
2431
-	}
2428
+    $n = 1;
2429
+    while ($_v = interprete_argument_balise($n++, $p)) {
2430
+        $_code[] = $_v;
2431
+    }
2432 2432
 
2433
-	$p->code = '((function_exists("autoriser")||include_spip("inc/autoriser"))&&autoriser(' . join(
2434
-		', ',
2435
-		$_code
2436
-	) . ')?" ":"")';
2437
-	$p->interdire_scripts = false;
2433
+    $p->code = '((function_exists("autoriser")||include_spip("inc/autoriser"))&&autoriser(' . join(
2434
+        ', ',
2435
+        $_code
2436
+    ) . ')?" ":"")';
2437
+    $p->interdire_scripts = false;
2438 2438
 
2439
-	return $p;
2439
+    return $p;
2440 2440
 }
2441 2441
 
2442 2442
 
@@ -2460,15 +2460,15 @@  discard block
 block discarded – undo
2460 2460
  *     Pile complétée par le code à générer
2461 2461
  **/
2462 2462
 function balise_PLUGIN_dist($p) {
2463
-	$plugin = interprete_argument_balise(1, $p);
2464
-	$plugin = isset($plugin) ? str_replace('\'', '"', $plugin) : '""';
2465
-	$type_info = interprete_argument_balise(2, $p);
2466
-	$type_info = isset($type_info) ? str_replace('\'', '"', $type_info) : '"est_actif"';
2463
+    $plugin = interprete_argument_balise(1, $p);
2464
+    $plugin = isset($plugin) ? str_replace('\'', '"', $plugin) : '""';
2465
+    $type_info = interprete_argument_balise(2, $p);
2466
+    $type_info = isset($type_info) ? str_replace('\'', '"', $type_info) : '"est_actif"';
2467 2467
 
2468
-	$f = chercher_filtre('info_plugin');
2469
-	$p->code = $f . '(' . $plugin . ', ' . $type_info . ')';
2468
+    $f = chercher_filtre('info_plugin');
2469
+    $p->code = $f . '(' . $plugin . ', ' . $type_info . ')';
2470 2470
 
2471
-	return $p;
2471
+    return $p;
2472 2472
 }
2473 2473
 
2474 2474
 /**
@@ -2489,9 +2489,9 @@  discard block
 block discarded – undo
2489 2489
  *     Pile complétée par le code à générer
2490 2490
  **/
2491 2491
 function balise_AIDER_dist($p) {
2492
-	$_motif = interprete_argument_balise(1, $p);
2493
-	$p->code = "((\$aider=charger_fonction('aide','inc',true))?\$aider($_motif):'')";
2494
-	return $p;
2492
+    $_motif = interprete_argument_balise(1, $p);
2493
+    $p->code = "((\$aider=charger_fonction('aide','inc',true))?\$aider($_motif):'')";
2494
+    return $p;
2495 2495
 }
2496 2496
 
2497 2497
 /**
@@ -2517,16 +2517,16 @@  discard block
 block discarded – undo
2517 2517
  *     Pile complétée par le code à générer
2518 2518
  **/
2519 2519
 function balise_ACTION_FORMULAIRE($p) {
2520
-	if (!$_url = interprete_argument_balise(1, $p)) {
2521
-		$_url = "@\$Pile[0]['action']";
2522
-	}
2523
-	if (!$_form = interprete_argument_balise(2, $p)) {
2524
-		$_form = "@\$Pile[0]['form']";
2525
-	}
2526
-
2527
-	// envoyer le nom du formulaire que l'on traite
2528
-	// transmettre les eventuels args de la balise formulaire
2529
-	$p->code = "	'<span class=\"form-hidden\">' .
2520
+    if (!$_url = interprete_argument_balise(1, $p)) {
2521
+        $_url = "@\$Pile[0]['action']";
2522
+    }
2523
+    if (!$_form = interprete_argument_balise(2, $p)) {
2524
+        $_form = "@\$Pile[0]['form']";
2525
+    }
2526
+
2527
+    // envoyer le nom du formulaire que l'on traite
2528
+    // transmettre les eventuels args de la balise formulaire
2529
+    $p->code = "	'<span class=\"form-hidden\">' .
2530 2530
 	form_hidden($_url) .
2531 2531
 	'<input name=\'formulaire_action\' type=\'hidden\'
2532 2532
 		value=\'' . $_form . '\' />' .
@@ -2535,9 +2535,9 @@  discard block
 block discarded – undo
2535 2535
 	(!empty(\$Pile[0]['_hidden']) ? @\$Pile[0]['_hidden'] : '') .
2536 2536
 	'</span>'";
2537 2537
 
2538
-	$p->interdire_scripts = false;
2538
+    $p->interdire_scripts = false;
2539 2539
 
2540
-	return $p;
2540
+    return $p;
2541 2541
 }
2542 2542
 
2543 2543
 
@@ -2578,25 +2578,25 @@  discard block
 block discarded – undo
2578 2578
  */
2579 2579
 function balise_BOUTON_ACTION_dist($p) {
2580 2580
 
2581
-	$args = [];
2582
-	for ($k = 1; $k <= 6; $k++) {
2583
-		$_a = interprete_argument_balise($k, $p);
2584
-		if (!$_a) {
2585
-			$_a = "''";
2586
-		}
2587
-		$args[] = $_a;
2588
-	}
2589
-	// supprimer les args vides
2590
-	while (end($args) == "''" and count($args) > 2) {
2591
-		array_pop($args);
2592
-	}
2593
-	$args = implode(',', $args);
2581
+    $args = [];
2582
+    for ($k = 1; $k <= 6; $k++) {
2583
+        $_a = interprete_argument_balise($k, $p);
2584
+        if (!$_a) {
2585
+            $_a = "''";
2586
+        }
2587
+        $args[] = $_a;
2588
+    }
2589
+    // supprimer les args vides
2590
+    while (end($args) == "''" and count($args) > 2) {
2591
+        array_pop($args);
2592
+    }
2593
+    $args = implode(',', $args);
2594 2594
 
2595
-	$bouton_action = chercher_filtre('bouton_action');
2596
-	$p->code = "$bouton_action($args)";
2597
-	$p->interdire_scripts = false;
2595
+    $bouton_action = chercher_filtre('bouton_action');
2596
+    $p->code = "$bouton_action($args)";
2597
+    $p->interdire_scripts = false;
2598 2598
 
2599
-	return $p;
2599
+    return $p;
2600 2600
 }
2601 2601
 
2602 2602
 
@@ -2615,10 +2615,10 @@  discard block
 block discarded – undo
2615 2615
  *     Pile complétée par le code à générer
2616 2616
  */
2617 2617
 function balise_SLOGAN_SITE_SPIP_dist($p) {
2618
-	$p->code = "\$GLOBALS['meta']['slogan_site']";
2618
+    $p->code = "\$GLOBALS['meta']['slogan_site']";
2619 2619
 
2620
-	#$p->interdire_scripts = true;
2621
-	return $p;
2620
+    #$p->interdire_scripts = true;
2621
+    return $p;
2622 2622
 }
2623 2623
 
2624 2624
 
@@ -2642,10 +2642,10 @@  discard block
 block discarded – undo
2642 2642
  *     Pile complétée par le code à générer
2643 2643
  */
2644 2644
 function balise_HTML5_dist($p) {
2645
-	$p->code = html5_permis() ? "' '" : "''";
2646
-	$p->interdire_scripts = false;
2645
+    $p->code = html5_permis() ? "' '" : "''";
2646
+    $p->interdire_scripts = false;
2647 2647
 
2648
-	return $p;
2648
+    return $p;
2649 2649
 }
2650 2650
 
2651 2651
 
@@ -2671,61 +2671,61 @@  discard block
 block discarded – undo
2671 2671
  *     Pile complétée par le code à générer
2672 2672
  */
2673 2673
 function balise_TRI_dist($p, $liste = 'true') {
2674
-	$b = index_boucle_mere($p);
2675
-	// s'il n'y a pas de nom de boucle, on ne peut pas trier
2676
-	if ($b === '') {
2677
-		$msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
2678
-		erreur_squelette($msg, $p);
2679
-		$p->code = "''";
2674
+    $b = index_boucle_mere($p);
2675
+    // s'il n'y a pas de nom de boucle, on ne peut pas trier
2676
+    if ($b === '') {
2677
+        $msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
2678
+        erreur_squelette($msg, $p);
2679
+        $p->code = "''";
2680 2680
 
2681
-		return $p;
2682
-	}
2683
-	$boucle = $p->boucles[$b];
2681
+        return $p;
2682
+    }
2683
+    $boucle = $p->boucles[$b];
2684 2684
 
2685
-	// s'il n'y a pas de tri_champ, c'est qu'on se trouve
2686
-	// dans un boucle recursive ou qu'on a oublie le critere {tri}
2687
-	if (!isset($boucle->modificateur['tri_champ'])) {
2688
-		$msg = ['zbug_champ_hors_critere', [
2689
-			'champ' => zbug_presenter_champ($p),
2690
-			'critere' => 'tri'
2691
-		]];
2692
-		erreur_squelette($msg, $p);
2693
-		$p->code = "''";
2685
+    // s'il n'y a pas de tri_champ, c'est qu'on se trouve
2686
+    // dans un boucle recursive ou qu'on a oublie le critere {tri}
2687
+    if (!isset($boucle->modificateur['tri_champ'])) {
2688
+        $msg = ['zbug_champ_hors_critere', [
2689
+            'champ' => zbug_presenter_champ($p),
2690
+            'critere' => 'tri'
2691
+        ]];
2692
+        erreur_squelette($msg, $p);
2693
+        $p->code = "''";
2694 2694
 
2695
-		return $p;
2696
-	}
2695
+        return $p;
2696
+    }
2697 2697
 
2698
-	$_champ = interprete_argument_balise(1, $p);
2699
-	// si pas de champ, renvoyer le critere de tri utilise
2700
-	if (!$_champ) {
2701
-		$p->code = $boucle->modificateur['tri_champ'];
2698
+    $_champ = interprete_argument_balise(1, $p);
2699
+    // si pas de champ, renvoyer le critere de tri utilise
2700
+    if (!$_champ) {
2701
+        $p->code = $boucle->modificateur['tri_champ'];
2702 2702
 
2703
-		return $p;
2704
-	}
2705
-	// forcer la jointure si besoin, et si le champ est statique
2706
-	if (preg_match(",^'([\w.]+)'$,i", $_champ, $m)) {
2707
-		index_pile($b, $m[1], $p->boucles, '', null, true, false);
2708
-	}
2703
+        return $p;
2704
+    }
2705
+    // forcer la jointure si besoin, et si le champ est statique
2706
+    if (preg_match(",^'([\w.]+)'$,i", $_champ, $m)) {
2707
+        index_pile($b, $m[1], $p->boucles, '', null, true, false);
2708
+    }
2709 2709
 
2710
-	$_libelle = interprete_argument_balise(2, $p);
2711
-	$_libelle = $_libelle ? $_libelle : $_champ;
2710
+    $_libelle = interprete_argument_balise(2, $p);
2711
+    $_libelle = $_libelle ? $_libelle : $_champ;
2712 2712
 
2713
-	$_class = interprete_argument_balise(3, $p);
2714
-	// si champ = ">" c'est un lien vers le tri croissant : de gauche a droite ==> 1
2715
-	// si champ = "<" c'est un lien vers le tri decroissant : (sens inverse) == -1
2716
-	$_issens = "in_array($_champ,array('>','<'))";
2717
-	$_sens = "(strpos('< >',$_champ)-1)";
2713
+    $_class = interprete_argument_balise(3, $p);
2714
+    // si champ = ">" c'est un lien vers le tri croissant : de gauche a droite ==> 1
2715
+    // si champ = "<" c'est un lien vers le tri decroissant : (sens inverse) == -1
2716
+    $_issens = "in_array($_champ,array('>','<'))";
2717
+    $_sens = "(strpos('< >',$_champ)-1)";
2718 2718
 
2719
-	$_variable = "((\$s=$_issens)?'sens':'tri')." . $boucle->modificateur['tri_nom'];
2720
-	$_url = "parametre_url(self(),$_variable,\$s?$_sens:$_champ)";
2721
-	$_url = "parametre_url($_url,'var_memotri',strncmp(" . $boucle->modificateur['tri_nom'] . ",'session',7)==0?$_variable:'')";
2722
-	$_on = '$s?(' . $boucle->modificateur['tri_sens'] . "==$_sens" . '):(' . $boucle->modificateur['tri_champ'] . "==$_champ)";
2719
+    $_variable = "((\$s=$_issens)?'sens':'tri')." . $boucle->modificateur['tri_nom'];
2720
+    $_url = "parametre_url(self(),$_variable,\$s?$_sens:$_champ)";
2721
+    $_url = "parametre_url($_url,'var_memotri',strncmp(" . $boucle->modificateur['tri_nom'] . ",'session',7)==0?$_variable:'')";
2722
+    $_on = '$s?(' . $boucle->modificateur['tri_sens'] . "==$_sens" . '):(' . $boucle->modificateur['tri_champ'] . "==$_champ)";
2723 2723
 
2724
-	$p->code = "lien_ou_expose($_url,$_libelle,$_on" . ($_class ? ",$_class" : '') . ')';
2725
-	//$p->code = "''";
2726
-	$p->interdire_scripts = false;
2724
+    $p->code = "lien_ou_expose($_url,$_libelle,$_on" . ($_class ? ",$_class" : '') . ')';
2725
+    //$p->code = "''";
2726
+    $p->interdire_scripts = false;
2727 2727
 
2728
-	return $p;
2728
+    return $p;
2729 2729
 }
2730 2730
 
2731 2731
 
@@ -2746,22 +2746,22 @@  discard block
 block discarded – undo
2746 2746
  *     Pile complétée par le code à générer
2747 2747
  */
2748 2748
 function balise_SAUTER_dist($p) {
2749
-	$id_boucle = $p->id_boucle;
2749
+    $id_boucle = $p->id_boucle;
2750 2750
 
2751
-	if (empty($p->boucles[$id_boucle])) {
2752
-		$msg = ['zbug_champ_hors_boucle', ['champ' => '#SAUTER']];
2753
-		erreur_squelette($msg, $p);
2754
-	} else {
2755
-		$boucle = $p->boucles[$id_boucle];
2756
-		$_saut = interprete_argument_balise(1, $p);
2757
-		$_compteur = "\$Numrows['$id_boucle']['compteur_boucle']";
2758
-		$_total = "\$Numrows['$id_boucle']['total']";
2751
+    if (empty($p->boucles[$id_boucle])) {
2752
+        $msg = ['zbug_champ_hors_boucle', ['champ' => '#SAUTER']];
2753
+        erreur_squelette($msg, $p);
2754
+    } else {
2755
+        $boucle = $p->boucles[$id_boucle];
2756
+        $_saut = interprete_argument_balise(1, $p);
2757
+        $_compteur = "\$Numrows['$id_boucle']['compteur_boucle']";
2758
+        $_total = "\$Numrows['$id_boucle']['total']";
2759 2759
 
2760
-		$p->code = "vide($_compteur=\$iter->skip($_saut,$_total))";
2761
-	}
2762
-	$p->interdire_scripts = false;
2760
+        $p->code = "vide($_compteur=\$iter->skip($_saut,$_total))";
2761
+    }
2762
+    $p->interdire_scripts = false;
2763 2763
 
2764
-	return $p;
2764
+    return $p;
2765 2765
 }
2766 2766
 
2767 2767
 
@@ -2783,22 +2783,22 @@  discard block
 block discarded – undo
2783 2783
  *     Pile complétée par le code à générer
2784 2784
  */
2785 2785
 function balise_PUBLIE_dist($p) {
2786
-	if (!$_type = interprete_argument_balise(1, $p)) {
2787
-		$_type = _q($p->type_requete);
2788
-		$_id = champ_sql($p->boucles[$p->id_boucle]->primary, $p);
2789
-	} else {
2790
-		$_id = interprete_argument_balise(2, $p);
2791
-	}
2786
+    if (!$_type = interprete_argument_balise(1, $p)) {
2787
+        $_type = _q($p->type_requete);
2788
+        $_id = champ_sql($p->boucles[$p->id_boucle]->primary, $p);
2789
+    } else {
2790
+        $_id = interprete_argument_balise(2, $p);
2791
+    }
2792 2792
 
2793
-	$connect = '';
2794
-	if (isset($p->boucles[$p->id_boucle])) {
2795
-		$connect = $p->boucles[$p->id_boucle]->sql_serveur;
2796
-	}
2793
+    $connect = '';
2794
+    if (isset($p->boucles[$p->id_boucle])) {
2795
+        $connect = $p->boucles[$p->id_boucle]->sql_serveur;
2796
+    }
2797 2797
 
2798
-	$p->code = '(objet_test_si_publie(' . $_type . ',intval(' . $_id . '),' . _q($connect) . ")?' ':'')";
2799
-	$p->interdire_scripts = false;
2798
+    $p->code = '(objet_test_si_publie(' . $_type . ',intval(' . $_id . '),' . _q($connect) . ")?' ':'')";
2799
+    $p->interdire_scripts = false;
2800 2800
 
2801
-	return $p;
2801
+    return $p;
2802 2802
 }
2803 2803
 
2804 2804
 /**
@@ -2827,12 +2827,12 @@  discard block
 block discarded – undo
2827 2827
  *     Pile complétée par le code à générer
2828 2828
  */
2829 2829
 function balise_PRODUIRE_dist($p) {
2830
-	$balise_inclure = charger_fonction('INCLURE', 'balise');
2831
-	$p = $balise_inclure($p);
2830
+    $balise_inclure = charger_fonction('INCLURE', 'balise');
2831
+    $p = $balise_inclure($p);
2832 2832
 
2833
-	$p->code = str_replace('recuperer_fond(', 'produire_fond_statique(', $p->code);
2833
+    $p->code = str_replace('recuperer_fond(', 'produire_fond_statique(', $p->code);
2834 2834
 
2835
-	return $p;
2835
+    return $p;
2836 2836
 }
2837 2837
 
2838 2838
 /**
@@ -2851,13 +2851,13 @@  discard block
 block discarded – undo
2851 2851
  *     Pile complétée par le code à générer
2852 2852
  */
2853 2853
 function balise_LARGEUR_ECRAN_dist($p) {
2854
-	$_class = interprete_argument_balise(1, $p);
2855
-	if (!$_class) {
2856
-		$_class = 'null';
2857
-	}
2858
-	$p->code = "(is_string($_class)?vide(\$GLOBALS['largeur_ecran']=$_class):(isset(\$GLOBALS['largeur_ecran'])?\$GLOBALS['largeur_ecran']:''))";
2854
+    $_class = interprete_argument_balise(1, $p);
2855
+    if (!$_class) {
2856
+        $_class = 'null';
2857
+    }
2858
+    $p->code = "(is_string($_class)?vide(\$GLOBALS['largeur_ecran']=$_class):(isset(\$GLOBALS['largeur_ecran'])?\$GLOBALS['largeur_ecran']:''))";
2859 2859
 
2860
-	return $p;
2860
+    return $p;
2861 2861
 }
2862 2862
 
2863 2863
 
@@ -2873,14 +2873,14 @@  discard block
 block discarded – undo
2873 2873
  *     Pile complétée par le code à générer
2874 2874
  **/
2875 2875
 function balise_CONST_dist($p) {
2876
-	$_const = interprete_argument_balise(1, $p);
2877
-	if (!strlen($_const)) {
2878
-		$p->code = "''";
2879
-	}
2880
-	else {
2881
-		$p->code = "(defined($_const)?constant($_const):'')";
2882
-	}
2883
-	$p->interdire_scripts = false;
2884
-
2885
-	return $p;
2876
+    $_const = interprete_argument_balise(1, $p);
2877
+    if (!strlen($_const)) {
2878
+        $p->code = "''";
2879
+    }
2880
+    else {
2881
+        $p->code = "(defined($_const)?constant($_const):'')";
2882
+    }
2883
+    $p->interdire_scripts = false;
2884
+
2885
+    return $p;
2886 2886
 }
Please login to merge, or discard this patch.