Completed
Push — master ( e522b2...6ebb44 )
by cam
15:40
created
ecrire/public/compiler.php 2 patches
Indentation   +1168 added lines, -1168 removed lines patch added patch discarded remove patch
@@ -18,7 +18,7 @@  discard block
 block discarded – undo
18 18
  **/
19 19
 
20 20
 if (!defined('_ECRIRE_INC_VERSION')) {
21
-	return;
21
+    return;
22 22
 }
23 23
 
24 24
 /** Repérer un code ne calculant rien, meme avec commentaire */
@@ -60,91 +60,91 @@  discard block
 block discarded – undo
60 60
 
61 61
 // https://code.spip.net/@argumenter_inclure
62 62
 function argumenter_inclure(
63
-	$params,
64
-	$rejet_filtres,
65
-	$p,
66
-	&$boucles,
67
-	$id_boucle,
68
-	$echap = true,
69
-	$lang = '',
70
-	$fond1 = false
63
+    $params,
64
+    $rejet_filtres,
65
+    $p,
66
+    &$boucles,
67
+    $id_boucle,
68
+    $echap = true,
69
+    $lang = '',
70
+    $fond1 = false
71 71
 ) {
72
-	$l = array();
73
-	$erreur_p_i_i = '';
74
-	if (!is_array($params)) {
75
-		return $l;
76
-	}
77
-	foreach ($params as $k => $couple) {
78
-		// la liste d'arguments d'inclusion peut se terminer par un filtre
79
-		$filtre = array_shift($couple);
80
-		if ($filtre) {
81
-			break;
82
-		}
83
-		foreach ($couple as $n => $val) {
84
-			$var = $val[0];
85
-			if ($var->type != 'texte') {
86
-				if ($n or $k or $fond1) {
87
-					$erreur_p_i_i = array(
88
-						'zbug_parametres_inclus_incorrects',
89
-						array('param' => $var->nom_champ)
90
-					);
91
-					erreur_squelette($erreur_p_i_i, $p);
92
-					break;
93
-				} else {
94
-					$l[1] = calculer_liste($val, $p->descr, $boucles, $id_boucle);
95
-				}
96
-			} else {
97
-				preg_match(",^([^=]*)(=?)(.*)$,m", $var->texte, $m);
98
-				$m = array_pad($m, 3, null);
99
-				$var = $m[1];
100
-				$auto = false;;
101
-				if ($m[2]) {
102
-					$v = $m[3];
103
-					if (preg_match(',^[\'"](.*)[\'"]$,', $v, $m)) {
104
-						$v = $m[1];
105
-					}
106
-					$val[0] = new Texte;
107
-					$val[0]->texte = $v;
108
-				} elseif ($k or $n or $fond1) {
109
-					$auto = true;
110
-				} else {
111
-					$var = 1;
112
-				}
113
-
114
-				if ($var == 'lang') {
115
-					$lang = !$auto
116
-						? calculer_liste($val, $p->descr, $boucles, $id_boucle)
117
-						: '$GLOBALS["spip_lang"]';
118
-				} else {
119
-					$val = $auto
120
-						? index_pile($id_boucle, $var, $boucles)
121
-						: calculer_liste($val, $p->descr, $boucles, $id_boucle);
122
-					if ($var !== 1) {
123
-						$val = ($echap ? "\'$var\' => ' . argumenter_squelette(" : "'$var' => ")
124
-							. $val . ($echap ? ") . '" : " ");
125
-					} else {
126
-						$val = $echap ? "'.$val.'" : $val;
127
-					}
128
-					$l[$var] = $val;
129
-				}
130
-			}
131
-		}
132
-	}
133
-	if ($erreur_p_i_i) {
134
-		return false;
135
-	}
136
-	// Cas particulier de la langue : si {lang=xx} est definie, on
137
-	// la passe, sinon on passe la langue courante au moment du calcul
138
-	// sauf si on n'en veut pas 
139
-	if ($lang === false) {
140
-		return $l;
141
-	}
142
-	if (!$lang) {
143
-		$lang = '$GLOBALS["spip_lang"]';
144
-	}
145
-	$l['lang'] = ($echap ? "\'lang\' => ' . argumenter_squelette(" : "'lang' => ") . $lang . ($echap ? ") . '" : " ");
146
-
147
-	return $l;
72
+    $l = array();
73
+    $erreur_p_i_i = '';
74
+    if (!is_array($params)) {
75
+        return $l;
76
+    }
77
+    foreach ($params as $k => $couple) {
78
+        // la liste d'arguments d'inclusion peut se terminer par un filtre
79
+        $filtre = array_shift($couple);
80
+        if ($filtre) {
81
+            break;
82
+        }
83
+        foreach ($couple as $n => $val) {
84
+            $var = $val[0];
85
+            if ($var->type != 'texte') {
86
+                if ($n or $k or $fond1) {
87
+                    $erreur_p_i_i = array(
88
+                        'zbug_parametres_inclus_incorrects',
89
+                        array('param' => $var->nom_champ)
90
+                    );
91
+                    erreur_squelette($erreur_p_i_i, $p);
92
+                    break;
93
+                } else {
94
+                    $l[1] = calculer_liste($val, $p->descr, $boucles, $id_boucle);
95
+                }
96
+            } else {
97
+                preg_match(",^([^=]*)(=?)(.*)$,m", $var->texte, $m);
98
+                $m = array_pad($m, 3, null);
99
+                $var = $m[1];
100
+                $auto = false;;
101
+                if ($m[2]) {
102
+                    $v = $m[3];
103
+                    if (preg_match(',^[\'"](.*)[\'"]$,', $v, $m)) {
104
+                        $v = $m[1];
105
+                    }
106
+                    $val[0] = new Texte;
107
+                    $val[0]->texte = $v;
108
+                } elseif ($k or $n or $fond1) {
109
+                    $auto = true;
110
+                } else {
111
+                    $var = 1;
112
+                }
113
+
114
+                if ($var == 'lang') {
115
+                    $lang = !$auto
116
+                        ? calculer_liste($val, $p->descr, $boucles, $id_boucle)
117
+                        : '$GLOBALS["spip_lang"]';
118
+                } else {
119
+                    $val = $auto
120
+                        ? index_pile($id_boucle, $var, $boucles)
121
+                        : calculer_liste($val, $p->descr, $boucles, $id_boucle);
122
+                    if ($var !== 1) {
123
+                        $val = ($echap ? "\'$var\' => ' . argumenter_squelette(" : "'$var' => ")
124
+                            . $val . ($echap ? ") . '" : " ");
125
+                    } else {
126
+                        $val = $echap ? "'.$val.'" : $val;
127
+                    }
128
+                    $l[$var] = $val;
129
+                }
130
+            }
131
+        }
132
+    }
133
+    if ($erreur_p_i_i) {
134
+        return false;
135
+    }
136
+    // Cas particulier de la langue : si {lang=xx} est definie, on
137
+    // la passe, sinon on passe la langue courante au moment du calcul
138
+    // sauf si on n'en veut pas 
139
+    if ($lang === false) {
140
+        return $l;
141
+    }
142
+    if (!$lang) {
143
+        $lang = '$GLOBALS["spip_lang"]';
144
+    }
145
+    $l['lang'] = ($echap ? "\'lang\' => ' . argumenter_squelette(" : "'lang' => ") . $lang . ($echap ? ") . '" : " ");
146
+
147
+    return $l;
148 148
 }
149 149
 
150 150
 /**
@@ -168,77 +168,77 @@  discard block
 block discarded – undo
168 168
  **/
169 169
 function calculer_inclure($p, &$boucles, $id_boucle) {
170 170
 
171
-	$_contexte = argumenter_inclure($p->param, false, $p, $boucles, $id_boucle, true, '', true);
172
-	if (is_string($p->texte)) {
173
-		$fichier = $p->texte;
174
-		$code = "\"".str_replace('"','\"',$fichier)."\"";
175
-
176
-	} else {
177
-		$code = calculer_liste($p->texte, $p->descr, $boucles, $id_boucle);
178
-		if ($code and preg_match("/^'([^']*)'/s", $code, $r)) {
179
-			$fichier = $r[1];
180
-		} else {
181
-			$fichier = '';
182
-		}
183
-	}
184
-	if (!$code or $code === '""' or $code === "''") {
185
-		$trace = $p->fonctions;
186
-		while (is_array($trace)
187
-		  and $trace = array_filter($trace)
188
-			and count($trace)==1) {
189
-			$trace = reset($trace);
190
-		}
191
-		$erreur_p_i_i = array(
192
-			'zbug_parametres_inclus_incorrects',
193
-			array('param' => print_r($trace, true))
194
-		);
195
-		erreur_squelette($erreur_p_i_i, $p);
196
-
197
-		return "''";
198
-	}
199
-	$compil = texte_script(memoriser_contexte_compil($p));
200
-
201
-	if (is_array($_contexte)) {
202
-		// Critere d'inclusion {env} (et {self} pour compatibilite ascendante)
203
-		if ($env = (isset($_contexte['env']) || isset($_contexte['self']))) {
204
-			unset($_contexte['env']);
205
-		}
206
-
207
-		// noter les doublons dans l'appel a public.php
208
-		if (isset($_contexte['doublons'])) {
209
-			$_contexte['doublons'] = "\\'doublons\\' => '.var_export(\$doublons,true).'";
210
-		}
211
-
212
-		if ($ajax = isset($_contexte['ajax'])) {
213
-			$ajax = preg_replace(",=>(.*)$,ims", '=> ($v=(\\1))?$v:true', $_contexte['ajax']);
214
-			unset($_contexte['ajax']);
215
-		}
216
-
217
-		$_contexte = join(",\n\t", $_contexte);
218
-	} else {
219
-		return false;
220
-	} // j'aurais voulu toucher le fond ...
221
-
222
-	$contexte = 'array(' . $_contexte . ')';
223
-
224
-	if ($env) {
225
-		$contexte = "array_merge('.var_export(\$Pile[0],1).',$contexte)";
226
-	}
227
-
228
-	// s'il y a une extension .php, ce n'est pas un squelette
229
-	if ($fichier and preg_match('/^.+[.]php$/s', $fichier)) {
230
-		$code = sandbox_composer_inclure_php($fichier, $p, $contexte);
231
-	} else {
232
-		$_options[] = "\"compil\"=>array($compil)";
233
-		if ($ajax) {
234
-			$_options[] = $ajax;
235
-		}
236
-		$code = " ' . argumenter_squelette($code) . '";
237
-		$code = "echo " . sprintf(CODE_RECUPERER_FOND, $code, $contexte, implode(',', $_options),
238
-				"_request(\"connect\")") . ';';
239
-	}
240
-
241
-	return "\n'<'.'" . "?php " . $code . "\n?'." . "'>'";
171
+    $_contexte = argumenter_inclure($p->param, false, $p, $boucles, $id_boucle, true, '', true);
172
+    if (is_string($p->texte)) {
173
+        $fichier = $p->texte;
174
+        $code = "\"".str_replace('"','\"',$fichier)."\"";
175
+
176
+    } else {
177
+        $code = calculer_liste($p->texte, $p->descr, $boucles, $id_boucle);
178
+        if ($code and preg_match("/^'([^']*)'/s", $code, $r)) {
179
+            $fichier = $r[1];
180
+        } else {
181
+            $fichier = '';
182
+        }
183
+    }
184
+    if (!$code or $code === '""' or $code === "''") {
185
+        $trace = $p->fonctions;
186
+        while (is_array($trace)
187
+          and $trace = array_filter($trace)
188
+            and count($trace)==1) {
189
+            $trace = reset($trace);
190
+        }
191
+        $erreur_p_i_i = array(
192
+            'zbug_parametres_inclus_incorrects',
193
+            array('param' => print_r($trace, true))
194
+        );
195
+        erreur_squelette($erreur_p_i_i, $p);
196
+
197
+        return "''";
198
+    }
199
+    $compil = texte_script(memoriser_contexte_compil($p));
200
+
201
+    if (is_array($_contexte)) {
202
+        // Critere d'inclusion {env} (et {self} pour compatibilite ascendante)
203
+        if ($env = (isset($_contexte['env']) || isset($_contexte['self']))) {
204
+            unset($_contexte['env']);
205
+        }
206
+
207
+        // noter les doublons dans l'appel a public.php
208
+        if (isset($_contexte['doublons'])) {
209
+            $_contexte['doublons'] = "\\'doublons\\' => '.var_export(\$doublons,true).'";
210
+        }
211
+
212
+        if ($ajax = isset($_contexte['ajax'])) {
213
+            $ajax = preg_replace(",=>(.*)$,ims", '=> ($v=(\\1))?$v:true', $_contexte['ajax']);
214
+            unset($_contexte['ajax']);
215
+        }
216
+
217
+        $_contexte = join(",\n\t", $_contexte);
218
+    } else {
219
+        return false;
220
+    } // j'aurais voulu toucher le fond ...
221
+
222
+    $contexte = 'array(' . $_contexte . ')';
223
+
224
+    if ($env) {
225
+        $contexte = "array_merge('.var_export(\$Pile[0],1).',$contexte)";
226
+    }
227
+
228
+    // s'il y a une extension .php, ce n'est pas un squelette
229
+    if ($fichier and preg_match('/^.+[.]php$/s', $fichier)) {
230
+        $code = sandbox_composer_inclure_php($fichier, $p, $contexte);
231
+    } else {
232
+        $_options[] = "\"compil\"=>array($compil)";
233
+        if ($ajax) {
234
+            $_options[] = $ajax;
235
+        }
236
+        $code = " ' . argumenter_squelette($code) . '";
237
+        $code = "echo " . sprintf(CODE_RECUPERER_FOND, $code, $contexte, implode(',', $_options),
238
+                "_request(\"connect\")") . ';';
239
+    }
240
+
241
+    return "\n'<'.'" . "?php " . $code . "\n?'." . "'>'";
242 242
 }
243 243
 
244 244
 
@@ -256,7 +256,7 @@  discard block
 block discarded – undo
256 256
  *     true pour ne tester que le cas publie et ignorer l'eventuel var_mode=preview de la page
257 257
  */
258 258
 function instituer_boucle(&$boucle, $echapper = true, $ignore_previsu = false) {
259
-	/*
259
+    /*
260 260
 	$show['statut'][] = array(
261 261
 		'champ'=>'statut',  // champ de la table sur lequel porte le filtrage par le statut
262 262
 		'publie'=>'publie', // valeur ou liste de valeurs, qui definissent l'objet comme publie.
@@ -280,71 +280,71 @@  discard block
 block discarded – undo
280 280
 	champstatut est alors le champ statut sur la tablen
281 281
 	dans les jointures, clen peut etre un tableau pour une jointure complexe : array('id_objet','id_article','objet','article')
282 282
 */
283
-	$id_table = $boucle->id_table;
284
-	$show = $boucle->show;
285
-	if (isset($show['statut']) and $show['statut']) {
286
-		foreach ($show['statut'] as $k => $s) {
287
-			// Restreindre aux elements publies si pas de {statut} ou autre dans les criteres
288
-			$filtrer = true;
289
-			if (isset($s['exception'])) {
290
-				foreach (is_array($s['exception']) ? $s['exception'] : array($s['exception']) as $m) {
291
-					if (isset($boucle->modificateur[$m]) or isset($boucle->modificateur['criteres'][$m])) {
292
-						$filtrer = false;
293
-						break;
294
-					}
295
-				}
296
-			}
297
-
298
-			if ($filtrer) {
299
-				if (is_array($s['champ'])) {
300
-					$statut = preg_replace(',\W,', '', array_pop($s['champ'])); // securite
301
-					$jointures = array();
302
-					// indiquer la description de chaque table dans le tableau de jointures,
303
-					// ce qui permet d'eviter certains GROUP BY inutiles.
304
-					$trouver_table = charger_fonction('trouver_table', 'base');
305
-					foreach ($s['champ'] as $j) {
306
-						$id = reset($j);
307
-						$def = $trouver_table($id);
308
-						$jointures[] = array('', array($id, $def), end($j));
309
-					}
310
-					$jointures[0][0] = $id_table;
311
-					if (!array_search($id, $boucle->from)) {
312
-						include_spip('public/jointures');
313
-						fabrique_jointures($boucle, $jointures, true, $boucle->show, $id_table, '', $echapper);
314
-					}
315
-					// trouver l'alias de la table d'arrivee qui porte le statut
316
-					$id = array_search($id, $boucle->from);
317
-				} else {
318
-					$id = $id_table;
319
-					$statut = preg_replace(',\W,', '', $s['champ']); // securite
320
-				}
321
-				$mstatut = $id . '.' . $statut;
322
-
323
-				$arg_ignore_previsu = ($ignore_previsu ? ",true" : '');
324
-				include_spip('public/quete');
325
-				if (isset($s['post_date']) and $s['post_date']
326
-					and $GLOBALS['meta']["post_dates"] == 'non'
327
-				) {
328
-					$date = $id . '.' . preg_replace(',\W,', '', $s['post_date']); // securite
329
-					array_unshift($boucle->where,
330
-						$echapper ?
331
-							"\nquete_condition_postdates('$date'," . _q($boucle->sql_serveur) . "$arg_ignore_previsu)"
332
-							:
333
-							quete_condition_postdates($date, $boucle->sql_serveur, $ignore_previsu)
334
-					);
335
-				}
336
-				array_unshift($boucle->where,
337
-					$echapper ?
338
-						"\nquete_condition_statut('$mstatut',"
339
-						. _q($s['previsu']) . ","
340
-						. _q($s['publie']) . ","
341
-						. _q($boucle->sql_serveur) . "$arg_ignore_previsu)"
342
-						:
343
-						quete_condition_statut($mstatut, $s['previsu'], $s['publie'], $boucle->sql_serveur, $ignore_previsu)
344
-				);
345
-			}
346
-		}
347
-	}
283
+    $id_table = $boucle->id_table;
284
+    $show = $boucle->show;
285
+    if (isset($show['statut']) and $show['statut']) {
286
+        foreach ($show['statut'] as $k => $s) {
287
+            // Restreindre aux elements publies si pas de {statut} ou autre dans les criteres
288
+            $filtrer = true;
289
+            if (isset($s['exception'])) {
290
+                foreach (is_array($s['exception']) ? $s['exception'] : array($s['exception']) as $m) {
291
+                    if (isset($boucle->modificateur[$m]) or isset($boucle->modificateur['criteres'][$m])) {
292
+                        $filtrer = false;
293
+                        break;
294
+                    }
295
+                }
296
+            }
297
+
298
+            if ($filtrer) {
299
+                if (is_array($s['champ'])) {
300
+                    $statut = preg_replace(',\W,', '', array_pop($s['champ'])); // securite
301
+                    $jointures = array();
302
+                    // indiquer la description de chaque table dans le tableau de jointures,
303
+                    // ce qui permet d'eviter certains GROUP BY inutiles.
304
+                    $trouver_table = charger_fonction('trouver_table', 'base');
305
+                    foreach ($s['champ'] as $j) {
306
+                        $id = reset($j);
307
+                        $def = $trouver_table($id);
308
+                        $jointures[] = array('', array($id, $def), end($j));
309
+                    }
310
+                    $jointures[0][0] = $id_table;
311
+                    if (!array_search($id, $boucle->from)) {
312
+                        include_spip('public/jointures');
313
+                        fabrique_jointures($boucle, $jointures, true, $boucle->show, $id_table, '', $echapper);
314
+                    }
315
+                    // trouver l'alias de la table d'arrivee qui porte le statut
316
+                    $id = array_search($id, $boucle->from);
317
+                } else {
318
+                    $id = $id_table;
319
+                    $statut = preg_replace(',\W,', '', $s['champ']); // securite
320
+                }
321
+                $mstatut = $id . '.' . $statut;
322
+
323
+                $arg_ignore_previsu = ($ignore_previsu ? ",true" : '');
324
+                include_spip('public/quete');
325
+                if (isset($s['post_date']) and $s['post_date']
326
+                    and $GLOBALS['meta']["post_dates"] == 'non'
327
+                ) {
328
+                    $date = $id . '.' . preg_replace(',\W,', '', $s['post_date']); // securite
329
+                    array_unshift($boucle->where,
330
+                        $echapper ?
331
+                            "\nquete_condition_postdates('$date'," . _q($boucle->sql_serveur) . "$arg_ignore_previsu)"
332
+                            :
333
+                            quete_condition_postdates($date, $boucle->sql_serveur, $ignore_previsu)
334
+                    );
335
+                }
336
+                array_unshift($boucle->where,
337
+                    $echapper ?
338
+                        "\nquete_condition_statut('$mstatut',"
339
+                        . _q($s['previsu']) . ","
340
+                        . _q($s['publie']) . ","
341
+                        . _q($boucle->sql_serveur) . "$arg_ignore_previsu)"
342
+                        :
343
+                        quete_condition_statut($mstatut, $s['previsu'], $s['publie'], $boucle->sql_serveur, $ignore_previsu)
344
+                );
345
+            }
346
+        }
347
+    }
348 348
 }
349 349
 
350 350
 /**
@@ -363,29 +363,29 @@  discard block
 block discarded – undo
363 363
  */
364 364
 function calculer_boucle($id_boucle, &$boucles) {
365 365
 
366
-	$boucle = &$boucles[$id_boucle];
367
-	instituer_boucle($boucle);
368
-	$boucles[$id_boucle] = pipeline('post_boucle', $boucles[$id_boucle]);
369
-
370
-	// en mode debug memoriser les premiers passages dans la boucle,
371
-	// mais pas tous, sinon ca pete.
372
-	if (_request('var_mode_affiche') != 'resultat') {
373
-		$trace = '';
374
-	} else {
375
-		$_trace = $boucles[$id_boucle]->descr['nom'] . $id_boucle;
376
-		$_trace = "\$GLOBALS['debug_objets']['resultat']['$_trace']";
377
-		$trace = "
366
+    $boucle = &$boucles[$id_boucle];
367
+    instituer_boucle($boucle);
368
+    $boucles[$id_boucle] = pipeline('post_boucle', $boucles[$id_boucle]);
369
+
370
+    // en mode debug memoriser les premiers passages dans la boucle,
371
+    // mais pas tous, sinon ca pete.
372
+    if (_request('var_mode_affiche') != 'resultat') {
373
+        $trace = '';
374
+    } else {
375
+        $_trace = $boucles[$id_boucle]->descr['nom'] . $id_boucle;
376
+        $_trace = "\$GLOBALS['debug_objets']['resultat']['$_trace']";
377
+        $trace = "
378 378
 		if (empty($_trace)) { 
379 379
 			$_trace = []; 
380 380
 		}
381 381
 		if (count($_trace) < 3) { 
382 382
 			$_trace" . "[] = \$t0; 
383 383
 		}";
384
-	}
384
+    }
385 385
 
386
-	return ($boucles[$id_boucle]->type_requete == TYPE_RECURSIF)
387
-		? calculer_boucle_rec($id_boucle, $boucles, $trace)
388
-		: calculer_boucle_nonrec($id_boucle, $boucles, $trace);
386
+    return ($boucles[$id_boucle]->type_requete == TYPE_RECURSIF)
387
+        ? calculer_boucle_rec($id_boucle, $boucles, $trace)
388
+        : calculer_boucle_nonrec($id_boucle, $boucles, $trace);
389 389
 }
390 390
 
391 391
 
@@ -408,15 +408,15 @@  discard block
 block discarded – undo
408 408
  *    Code PHP compilé de la boucle récursive
409 409
  **/
410 410
 function calculer_boucle_rec($id_boucle, &$boucles, $trace) {
411
-	$nom = $boucles[$id_boucle]->param[0];
412
-
413
-	return
414
-		// Numrows[$nom] peut ne pas être encore defini
415
-		"\n\t\$save_numrows = (isset(\$Numrows['$nom']) ? \$Numrows['$nom'] : array());"
416
-		. "\n\t\$t0 = " . $boucles[$id_boucle]->return . ";"
417
-		. "\n\t\$Numrows['$nom'] = (\$save_numrows);"
418
-		. $trace
419
-		. "\n\treturn \$t0;";
411
+    $nom = $boucles[$id_boucle]->param[0];
412
+
413
+    return
414
+        // Numrows[$nom] peut ne pas être encore defini
415
+        "\n\t\$save_numrows = (isset(\$Numrows['$nom']) ? \$Numrows['$nom'] : array());"
416
+        . "\n\t\$t0 = " . $boucles[$id_boucle]->return . ";"
417
+        . "\n\t\$Numrows['$nom'] = (\$save_numrows);"
418
+        . $trace
419
+        . "\n\treturn \$t0;";
420 420
 }
421 421
 
422 422
 /**
@@ -470,170 +470,170 @@  discard block
 block discarded – undo
470 470
  **/
471 471
 function calculer_boucle_nonrec($id_boucle, &$boucles, $trace) {
472 472
 
473
-	$boucle = &$boucles[$id_boucle];
474
-	$return = $boucle->return;
475
-	$type_boucle = $boucle->type_requete;
476
-	$primary = $boucle->primary;
477
-	$constant = preg_match(CODE_MONOTONE, str_replace("\\'", '', $return));
478
-	$flag_cpt = $boucle->mode_partie || $boucle->cptrows;
479
-	$corps = '';
480
-
481
-	// faudrait expanser le foreach a la compil, car y en a souvent qu'un 
482
-	// et puis faire un [] plutot qu'un "','."
483
-	if ($boucle->doublons) {
484
-		$corps .= "\n\t\t\tforeach(" . $boucle->doublons . ' as $k) $doublons[$k] .= "," . ' .
485
-			index_pile($id_boucle, $primary, $boucles)
486
-			. "; // doublons\n";
487
-	}
488
-
489
-	// La boucle doit-elle selectionner la langue ?
490
-	// - par defaut, les boucles suivantes le font
491
-	//    (sauf si forcer_lang==true ou si le titre contient <multi>).
492
-	// - a moins d'une demande explicite via {!lang_select}
493
-	if (!$constant && $boucle->lang_select != 'non' &&
494
-		(($boucle->lang_select == 'oui') ||
495
-			in_array($type_boucle, array(
496
-				'articles',
497
-				'rubriques',
498
-				'hierarchie',
499
-				'breves'
500
-			)))
501
-	) {
502
-		// Memoriser la langue avant la boucle et la restituer apres
503
-		// afin que le corps de boucle affecte la globale directement
504
-		$init_lang = "lang_select(\$GLOBALS['spip_lang']);\n\t";
505
-		$fin_lang = "lang_select();\n\t";
506
-		$fin_lang_select_public = "\n\t\tlang_select();";
507
-
508
-		$corps .=
509
-			"\n\t\tlang_select_public("
510
-			. index_pile($id_boucle, 'lang', $boucles)
511
-			. ", '" . $boucle->lang_select . "'"
512
-			. (in_array($type_boucle, array(
513
-				'articles',
514
-				'rubriques',
515
-				'hierarchie',
516
-				'breves'
517
-			)) ? ', ' . index_pile($id_boucle, 'titre', $boucles) : '')
518
-			. ');';
519
-	} else {
520
-		$init_lang = '';
521
-		$fin_lang = '';
522
-		$fin_lang_select_public = '';
523
-		// sortir les appels au traducteur (invariants de boucle)
524
-		if (strpos($return, '?php') === false
525
-			and preg_match_all("/\W(_T[(]'[^']*'[)])/", $return, $r)
526
-		) {
527
-			$i = 1;
528
-			foreach ($r[1] as $t) {
529
-				$init_lang .= "\n\t\$l$i = $t;";
530
-				$return = str_replace($t, "\$l$i", $return);
531
-				$i++;
532
-			}
533
-		}
534
-	}
535
-
536
-	// gestion optimale des separateurs et des boucles constantes
537
-	if (count($boucle->separateur)) {
538
-		$code_sep = ("'" . str_replace("'", "\'", join('', $boucle->separateur)) . "'");
539
-	}
540
-
541
-	$corps .=
542
-		((!$boucle->separateur) ?
543
-			(($constant && !$corps && !$flag_cpt) ? $return :
544
-				(($return === "''") ? '' :
545
-					("\n\t\t" . '$t0 .= ' . $return . ";"))) :
546
-			("\n\t\t\$t1 " .
547
-				((strpos($return, '$t1.') === 0) ?
548
-					(".=" . substr($return, 4)) :
549
-					('= ' . $return)) .
550
-				";\n\t\t" .
551
-				'$t0 .= ((strlen($t1) && strlen($t0)) ? ' . $code_sep . " : '') . \$t1;"));
552
-
553
-	// Calculer les invalideurs si c'est une boucle non constante et si on
554
-	// souhaite invalider ces elements
555
-	if (!$constant and $primary) {
556
-		include_spip('inc/invalideur');
557
-		$corps = calcul_invalideurs($corps, $primary,$boucles, $id_boucle);
558
-	}
559
-
560
-	// gerer le compteur de boucle 
561
-	// avec ou sans son utilisation par les criteres {1/3} {1,4} {n-2,1}...
562
-
563
-	if ($boucle->partie or $boucle->cptrows) {
564
-		$corps = "\n\t\t\$Numrows['$id_boucle']['compteur_boucle']++;"
565
-			. $boucle->partie
566
-			. $corps;
567
-	}
568
-
569
-	// depiler la lang de la boucle si besoin
570
-	$corps .= $fin_lang_select_public;
571
-
572
-	// si le corps est une constante, ne pas appeler le serveur N fois!
573
-
574
-	if (preg_match(CODE_MONOTONE, str_replace("\\'", '', $corps), $r)) {
575
-		if (!isset($r[2]) or (!$r[2])) {
576
-			if (!$boucle->numrows) {
577
-				return "\n\t\$t0 = '';";
578
-			} else {
579
-				$corps = "";
580
-			}
581
-		} else {
582
-			$boucle->numrows = true;
583
-			$corps = "\n\t\$t0 = str_repeat($corps, \$Numrows['$id_boucle']['total']);";
584
-		}
585
-	} else {
586
-		$corps = "while (\$Pile[\$SP]=\$iter->fetch()) {\n$corps\n	}";
587
-	}
588
-
589
-	$count = '';
590
-	if (!$boucle->select) {
591
-		if (!$boucle->numrows or $boucle->limit or $boucle->mode_partie or $boucle->group) {
592
-			$count = '1';
593
-		} else {
594
-			$count = 'count(*)';
595
-		}
596
-		$boucles[$id_boucle]->select[] = $count;
597
-	}
598
-
599
-	if ($flag_cpt) {
600
-		$nums = "\n\t// COMPTEUR\n\t"
601
-			. "\$Numrows['$id_boucle']['compteur_boucle'] = 0;\n\t";
602
-	} else {
603
-		$nums = '';
604
-	}
605
-
606
-	if ($boucle->numrows or $boucle->mode_partie) {
607
-		$nums .= "\$Numrows['$id_boucle']['command'] = \$command;\n\t"
608
-			. "\$Numrows['$id_boucle']['total'] = @intval(\$iter->count());"
609
-			. $boucle->mode_partie
610
-			. "\n\t";
611
-	}
612
-
613
-	// Ne calculer la requete que maintenant
614
-	// car ce qui precede appelle index_pile qui influe dessus
615
-
616
-	$init = (($init = $boucles[$id_boucle]->doublons)
617
-			? ("\n\t$init = array();") : '')
618
-		. calculer_requete_sql($boucles[$id_boucle]);
619
-
620
-	$contexte = memoriser_contexte_compil($boucle);
621
-
622
-	$a = sprintf(CODE_CORPS_BOUCLE,
623
-		$init,
624
-		$boucle->iterateur,
625
-		"\$command",
626
-		$contexte,
627
-		$nums,
628
-		$init_lang,
629
-		$corps,
630
-		$fin_lang,
631
-		$trace,
632
-		'BOUCLE' . $id_boucle . ' @ ' . ($boucle->descr['sourcefile'])
633
-	);
473
+    $boucle = &$boucles[$id_boucle];
474
+    $return = $boucle->return;
475
+    $type_boucle = $boucle->type_requete;
476
+    $primary = $boucle->primary;
477
+    $constant = preg_match(CODE_MONOTONE, str_replace("\\'", '', $return));
478
+    $flag_cpt = $boucle->mode_partie || $boucle->cptrows;
479
+    $corps = '';
480
+
481
+    // faudrait expanser le foreach a la compil, car y en a souvent qu'un 
482
+    // et puis faire un [] plutot qu'un "','."
483
+    if ($boucle->doublons) {
484
+        $corps .= "\n\t\t\tforeach(" . $boucle->doublons . ' as $k) $doublons[$k] .= "," . ' .
485
+            index_pile($id_boucle, $primary, $boucles)
486
+            . "; // doublons\n";
487
+    }
488
+
489
+    // La boucle doit-elle selectionner la langue ?
490
+    // - par defaut, les boucles suivantes le font
491
+    //    (sauf si forcer_lang==true ou si le titre contient <multi>).
492
+    // - a moins d'une demande explicite via {!lang_select}
493
+    if (!$constant && $boucle->lang_select != 'non' &&
494
+        (($boucle->lang_select == 'oui') ||
495
+            in_array($type_boucle, array(
496
+                'articles',
497
+                'rubriques',
498
+                'hierarchie',
499
+                'breves'
500
+            )))
501
+    ) {
502
+        // Memoriser la langue avant la boucle et la restituer apres
503
+        // afin que le corps de boucle affecte la globale directement
504
+        $init_lang = "lang_select(\$GLOBALS['spip_lang']);\n\t";
505
+        $fin_lang = "lang_select();\n\t";
506
+        $fin_lang_select_public = "\n\t\tlang_select();";
507
+
508
+        $corps .=
509
+            "\n\t\tlang_select_public("
510
+            . index_pile($id_boucle, 'lang', $boucles)
511
+            . ", '" . $boucle->lang_select . "'"
512
+            . (in_array($type_boucle, array(
513
+                'articles',
514
+                'rubriques',
515
+                'hierarchie',
516
+                'breves'
517
+            )) ? ', ' . index_pile($id_boucle, 'titre', $boucles) : '')
518
+            . ');';
519
+    } else {
520
+        $init_lang = '';
521
+        $fin_lang = '';
522
+        $fin_lang_select_public = '';
523
+        // sortir les appels au traducteur (invariants de boucle)
524
+        if (strpos($return, '?php') === false
525
+            and preg_match_all("/\W(_T[(]'[^']*'[)])/", $return, $r)
526
+        ) {
527
+            $i = 1;
528
+            foreach ($r[1] as $t) {
529
+                $init_lang .= "\n\t\$l$i = $t;";
530
+                $return = str_replace($t, "\$l$i", $return);
531
+                $i++;
532
+            }
533
+        }
534
+    }
535
+
536
+    // gestion optimale des separateurs et des boucles constantes
537
+    if (count($boucle->separateur)) {
538
+        $code_sep = ("'" . str_replace("'", "\'", join('', $boucle->separateur)) . "'");
539
+    }
540
+
541
+    $corps .=
542
+        ((!$boucle->separateur) ?
543
+            (($constant && !$corps && !$flag_cpt) ? $return :
544
+                (($return === "''") ? '' :
545
+                    ("\n\t\t" . '$t0 .= ' . $return . ";"))) :
546
+            ("\n\t\t\$t1 " .
547
+                ((strpos($return, '$t1.') === 0) ?
548
+                    (".=" . substr($return, 4)) :
549
+                    ('= ' . $return)) .
550
+                ";\n\t\t" .
551
+                '$t0 .= ((strlen($t1) && strlen($t0)) ? ' . $code_sep . " : '') . \$t1;"));
552
+
553
+    // Calculer les invalideurs si c'est une boucle non constante et si on
554
+    // souhaite invalider ces elements
555
+    if (!$constant and $primary) {
556
+        include_spip('inc/invalideur');
557
+        $corps = calcul_invalideurs($corps, $primary,$boucles, $id_boucle);
558
+    }
559
+
560
+    // gerer le compteur de boucle 
561
+    // avec ou sans son utilisation par les criteres {1/3} {1,4} {n-2,1}...
562
+
563
+    if ($boucle->partie or $boucle->cptrows) {
564
+        $corps = "\n\t\t\$Numrows['$id_boucle']['compteur_boucle']++;"
565
+            . $boucle->partie
566
+            . $corps;
567
+    }
568
+
569
+    // depiler la lang de la boucle si besoin
570
+    $corps .= $fin_lang_select_public;
571
+
572
+    // si le corps est une constante, ne pas appeler le serveur N fois!
573
+
574
+    if (preg_match(CODE_MONOTONE, str_replace("\\'", '', $corps), $r)) {
575
+        if (!isset($r[2]) or (!$r[2])) {
576
+            if (!$boucle->numrows) {
577
+                return "\n\t\$t0 = '';";
578
+            } else {
579
+                $corps = "";
580
+            }
581
+        } else {
582
+            $boucle->numrows = true;
583
+            $corps = "\n\t\$t0 = str_repeat($corps, \$Numrows['$id_boucle']['total']);";
584
+        }
585
+    } else {
586
+        $corps = "while (\$Pile[\$SP]=\$iter->fetch()) {\n$corps\n	}";
587
+    }
588
+
589
+    $count = '';
590
+    if (!$boucle->select) {
591
+        if (!$boucle->numrows or $boucle->limit or $boucle->mode_partie or $boucle->group) {
592
+            $count = '1';
593
+        } else {
594
+            $count = 'count(*)';
595
+        }
596
+        $boucles[$id_boucle]->select[] = $count;
597
+    }
598
+
599
+    if ($flag_cpt) {
600
+        $nums = "\n\t// COMPTEUR\n\t"
601
+            . "\$Numrows['$id_boucle']['compteur_boucle'] = 0;\n\t";
602
+    } else {
603
+        $nums = '';
604
+    }
605
+
606
+    if ($boucle->numrows or $boucle->mode_partie) {
607
+        $nums .= "\$Numrows['$id_boucle']['command'] = \$command;\n\t"
608
+            . "\$Numrows['$id_boucle']['total'] = @intval(\$iter->count());"
609
+            . $boucle->mode_partie
610
+            . "\n\t";
611
+    }
612
+
613
+    // Ne calculer la requete que maintenant
614
+    // car ce qui precede appelle index_pile qui influe dessus
615
+
616
+    $init = (($init = $boucles[$id_boucle]->doublons)
617
+            ? ("\n\t$init = array();") : '')
618
+        . calculer_requete_sql($boucles[$id_boucle]);
619
+
620
+    $contexte = memoriser_contexte_compil($boucle);
621
+
622
+    $a = sprintf(CODE_CORPS_BOUCLE,
623
+        $init,
624
+        $boucle->iterateur,
625
+        "\$command",
626
+        $contexte,
627
+        $nums,
628
+        $init_lang,
629
+        $corps,
630
+        $fin_lang,
631
+        $trace,
632
+        'BOUCLE' . $id_boucle . ' @ ' . ($boucle->descr['sourcefile'])
633
+    );
634 634
 
635 635
 #	var_dump($a);exit;
636
-	return $a;
636
+    return $a;
637 637
 }
638 638
 
639 639
 
@@ -649,43 +649,43 @@  discard block
 block discarded – undo
649 649
  *     Code PHP compilé définissant les informations de requête
650 650
  **/
651 651
 function calculer_requete_sql($boucle) {
652
-	$init = array();
653
-	$init[] = calculer_dec('table', "'" . $boucle->id_table . "'");
654
-	$init[] = calculer_dec('id', "'" . $boucle->id_boucle . "'");
655
-	# En absence de champ c'est un decompte :
656
-	$init[] = calculer_dec('from', calculer_from($boucle));
657
-	$init[] = calculer_dec('type', calculer_from_type($boucle));
658
-	$init[] = calculer_dec('groupby',
659
-		'array(' . (($g = join("\",\n\t\t\"", $boucle->group)) ? '"' . $g . '"' : '') . ")");
660
-	$init[] = calculer_dec('select', 'array("' . join("\",\n\t\t\"", $boucle->select) . "\")");
661
-	$init[] = calculer_dec('orderby', 'array(' . calculer_order($boucle) . ")");
662
-	$init[] = calculer_dec('where', calculer_dump_array($boucle->where));
663
-	$init[] = calculer_dec('join', calculer_dump_join($boucle->join));
664
-	$init[] = calculer_dec('limit',
665
-		(strpos($boucle->limit, 'intval') === false ?
666
-			"'" . $boucle->limit . "'"
667
-			:
668
-			$boucle->limit));
669
-	$init[] = calculer_dec('having', calculer_dump_array($boucle->having));
670
-	$s = $d = "";
671
-	// l'index 0 de $i indique si l'affectation est statique (contenu)
672
-	// ou recalculée à chaque passage (vide)
673
-	foreach ($init as $i) {
674
-		if (reset($i)) {
675
-			$s .= "\n\t\t" . end($i);
676
-		} # statique
677
-		else {
678
-			$d .= "\n\t" . end($i);
679
-		} # dynamique
680
-	}
681
-
682
-	return ($boucle->hierarchie ? "\n\t$boucle->hierarchie" : '')
683
-	. $boucle->in
684
-	. $boucle->hash
685
-	. "\n\t" . 'if (!isset($command[\'table\'])) {'
686
-	. $s
687
-	. "\n\t}"
688
-	. $d;
652
+    $init = array();
653
+    $init[] = calculer_dec('table', "'" . $boucle->id_table . "'");
654
+    $init[] = calculer_dec('id', "'" . $boucle->id_boucle . "'");
655
+    # En absence de champ c'est un decompte :
656
+    $init[] = calculer_dec('from', calculer_from($boucle));
657
+    $init[] = calculer_dec('type', calculer_from_type($boucle));
658
+    $init[] = calculer_dec('groupby',
659
+        'array(' . (($g = join("\",\n\t\t\"", $boucle->group)) ? '"' . $g . '"' : '') . ")");
660
+    $init[] = calculer_dec('select', 'array("' . join("\",\n\t\t\"", $boucle->select) . "\")");
661
+    $init[] = calculer_dec('orderby', 'array(' . calculer_order($boucle) . ")");
662
+    $init[] = calculer_dec('where', calculer_dump_array($boucle->where));
663
+    $init[] = calculer_dec('join', calculer_dump_join($boucle->join));
664
+    $init[] = calculer_dec('limit',
665
+        (strpos($boucle->limit, 'intval') === false ?
666
+            "'" . $boucle->limit . "'"
667
+            :
668
+            $boucle->limit));
669
+    $init[] = calculer_dec('having', calculer_dump_array($boucle->having));
670
+    $s = $d = "";
671
+    // l'index 0 de $i indique si l'affectation est statique (contenu)
672
+    // ou recalculée à chaque passage (vide)
673
+    foreach ($init as $i) {
674
+        if (reset($i)) {
675
+            $s .= "\n\t\t" . end($i);
676
+        } # statique
677
+        else {
678
+            $d .= "\n\t" . end($i);
679
+        } # dynamique
680
+    }
681
+
682
+    return ($boucle->hierarchie ? "\n\t$boucle->hierarchie" : '')
683
+    . $boucle->in
684
+    . $boucle->hash
685
+    . "\n\t" . 'if (!isset($command[\'table\'])) {'
686
+    . $s
687
+    . "\n\t}"
688
+    . $d;
689 689
 }
690 690
 
691 691
 /**
@@ -703,13 +703,13 @@  discard block
 block discarded – undo
703 703
  *     qui peut être utilisé pour la production d'un tableau array()
704 704
  **/
705 705
 function memoriser_contexte_compil($p) {
706
-	return join(',', array(
707
-		_q(isset($p->descr['sourcefile']) ? $p->descr['sourcefile'] : ''),
708
-		_q(isset($p->descr['nom']) ? $p->descr['nom'] : ''),
709
-		_q(isset($p->id_boucle) ? $p->id_boucle : null),
710
-		intval($p->ligne),
711
-		'$GLOBALS[\'spip_lang\']'
712
-	));
706
+    return join(',', array(
707
+        _q(isset($p->descr['sourcefile']) ? $p->descr['sourcefile'] : ''),
708
+        _q(isset($p->descr['nom']) ? $p->descr['nom'] : ''),
709
+        _q(isset($p->id_boucle) ? $p->id_boucle : null),
710
+        intval($p->ligne),
711
+        '$GLOBALS[\'spip_lang\']'
712
+    ));
713 713
 }
714 714
 
715 715
 /**
@@ -727,19 +727,19 @@  discard block
 block discarded – undo
727 727
  *     Objet Contexte
728 728
  **/
729 729
 function reconstruire_contexte_compil($context_compil) {
730
-	if (!is_array($context_compil)) {
731
-		return $context_compil;
732
-	}
733
-	$p = new Contexte;
734
-	$p->descr = array(
735
-		'sourcefile' => $context_compil[0],
736
-		'nom' => $context_compil[1]
737
-	);
738
-	$p->id_boucle = $context_compil[2];
739
-	$p->ligne = $context_compil[3];
740
-	$p->lang = $context_compil[4];
741
-
742
-	return $p;
730
+    if (!is_array($context_compil)) {
731
+        return $context_compil;
732
+    }
733
+    $p = new Contexte;
734
+    $p->descr = array(
735
+        'sourcefile' => $context_compil[0],
736
+        'nom' => $context_compil[1]
737
+    );
738
+    $p->id_boucle = $context_compil[2];
739
+    $p->ligne = $context_compil[3];
740
+    $p->lang = $context_compil[4];
741
+
742
+    return $p;
743 743
 }
744 744
 
745 745
 /**
@@ -765,12 +765,12 @@  discard block
 block discarded – undo
765 765
  *    - index 1 : Code de l'affectation
766 766
  **/
767 767
 function calculer_dec($nom, $val) {
768
-	$static = 'if (!isset($command[\'' . $nom . '\'])) ';
769
-	// si une variable apparait dans le calcul de la clause
770
-	// il faut la re-evaluer a chaque passage
771
-	if (
772
-		strpos($val, '$') !== false
773
-		/*
768
+    $static = 'if (!isset($command[\'' . $nom . '\'])) ';
769
+    // si une variable apparait dans le calcul de la clause
770
+    // il faut la re-evaluer a chaque passage
771
+    if (
772
+        strpos($val, '$') !== false
773
+        /*
774 774
 		OR strpos($val, 'sql_') !== false
775 775
 		OR (
776 776
 			$test = str_replace(array("array(",'\"',"\'"),array("","",""),$val) // supprimer les array( et les echappements de guillemets
@@ -778,11 +778,11 @@  discard block
 block discarded – undo
778 778
 			AND $test = preg_replace(",'[^']*',UimsS","",$test) // supprimer les chaines qui peuvent contenir des fonctions SQL qui ne genent pas
779 779
 			AND preg_match(",\w+\s*\(,UimsS",$test,$regs) // tester la presence de fonctions restantes
780 780
 		)*/
781
-	) {
782
-		$static = "";
783
-	}
781
+    ) {
782
+        $static = "";
783
+    }
784 784
 
785
-	return array($static, '$command[\'' . $nom . '\'] = ' . $val . ';');
785
+    return array($static, '$command[\'' . $nom . '\'] = ' . $val . ';');
786 786
 }
787 787
 
788 788
 /**
@@ -802,32 +802,32 @@  discard block
 block discarded – undo
802 802
  *     Expression PHP décrivant un texte ou un tableau
803 803
  **/
804 804
 function calculer_dump_array($a) {
805
-	if (!is_array($a)) {
806
-		return $a;
807
-	}
808
-	$res = "";
809
-	if ($a and $a[0] == "'?'") {
810
-		return ("(" . calculer_dump_array($a[1]) .
811
-			" ? " . calculer_dump_array($a[2]) .
812
-			" : " . calculer_dump_array($a[3]) .
813
-			")");
814
-	} else {
815
-		foreach ($a as $v) {
816
-			$res .= ", " . calculer_dump_array($v);
817
-		}
818
-
819
-		return "\n\t\t\tarray(" . substr($res, 2) . ')';
820
-	}
805
+    if (!is_array($a)) {
806
+        return $a;
807
+    }
808
+    $res = "";
809
+    if ($a and $a[0] == "'?'") {
810
+        return ("(" . calculer_dump_array($a[1]) .
811
+            " ? " . calculer_dump_array($a[2]) .
812
+            " : " . calculer_dump_array($a[3]) .
813
+            ")");
814
+    } else {
815
+        foreach ($a as $v) {
816
+            $res .= ", " . calculer_dump_array($v);
817
+        }
818
+
819
+        return "\n\t\t\tarray(" . substr($res, 2) . ')';
820
+    }
821 821
 }
822 822
 
823 823
 // https://code.spip.net/@calculer_dump_join
824 824
 function calculer_dump_join($a) {
825
-	$res = "";
826
-	foreach ($a as $k => $v) {
827
-		$res .= ", '$k' => array(" . implode(',', $v) . ")";
828
-	}
825
+    $res = "";
826
+    foreach ($a as $k => $v) {
827
+        $res .= ", '$k' => array(" . implode(',', $v) . ")";
828
+    }
829 829
 
830
-	return 'array(' . substr($res, 2) . ')';
830
+    return 'array(' . substr($res, 2) . ')';
831 831
 }
832 832
 
833 833
 /**
@@ -839,12 +839,12 @@  discard block
 block discarded – undo
839 839
  *     Code PHP construisant un tableau des alias et noms des tables du FROM
840 840
  **/
841 841
 function calculer_from(&$boucle) {
842
-	$res = "";
843
-	foreach ($boucle->from as $k => $v) {
844
-		$res .= ",'$k' => '$v'";
845
-	}
842
+    $res = "";
843
+    foreach ($boucle->from as $k => $v) {
844
+        $res .= ",'$k' => '$v'";
845
+    }
846 846
 
847
-	return 'array(' . substr($res, 1) . ')';
847
+    return 'array(' . substr($res, 1) . ')';
848 848
 }
849 849
 
850 850
 /**
@@ -857,30 +857,30 @@  discard block
 block discarded – undo
857 857
  *     Code PHP construisant un tableau des alias et type de jointure du FROM
858 858
  **/
859 859
 function calculer_from_type(&$boucle) {
860
-	$res = "";
861
-	foreach ($boucle->from_type as $k => $v) {
862
-		$res .= ",'$k' => '$v'";
863
-	}
860
+    $res = "";
861
+    foreach ($boucle->from_type as $k => $v) {
862
+        $res .= ",'$k' => '$v'";
863
+    }
864 864
 
865
-	return 'array(' . substr($res, 1) . ')';
865
+    return 'array(' . substr($res, 1) . ')';
866 866
 }
867 867
 
868 868
 // https://code.spip.net/@calculer_order
869 869
 function calculer_order(&$boucle) {
870
-	if (!$order = $boucle->order
871
-		and !$order = $boucle->default_order
872
-	) {
873
-		$order = array();
874
-	}
870
+    if (!$order = $boucle->order
871
+        and !$order = $boucle->default_order
872
+    ) {
873
+        $order = array();
874
+    }
875 875
 
876
-	/*if (isset($boucle->modificateur['collate'])){
876
+    /*if (isset($boucle->modificateur['collate'])){
877 877
 		$col = "." . $boucle->modificateur['collate'];
878 878
 		foreach($order as $k=>$o)
879 879
 			if (strpos($order[$k],'COLLATE')===false)
880 880
 				$order[$k].= $col;
881 881
 	}*/
882 882
 
883
-	return join(', ', $order);
883
+    return join(', ', $order);
884 884
 }
885 885
 
886 886
 // Production du code PHP a partir de la sequence livree par le phraseur
@@ -890,59 +890,59 @@  discard block
 block discarded – undo
890 890
 
891 891
 // https://code.spip.net/@calculer_liste
892 892
 function calculer_liste($tableau, $descr, &$boucles, $id_boucle = '') {
893
-	if (!$tableau) {
894
-		return "''";
895
-	}
896
-	if (is_string($descr)) {
897
-		if (isset($boucles[$descr])) {
898
-			$idb = $descr;
899
-			$descr = [];
900
-			if (isset($boucles[$idb]->descr['id_mere_contexte'])) {
901
-				$descr['id_mere'] = $boucles[$idb]->descr['id_mere_contexte'];
902
-			}
903
-			if (isset($boucles[$idb]->descr['sourcefile'])) {
904
-				$descr['sourcefile'] = $boucles[$idb]->descr['sourcefile'];
905
-			}
906
-		}
907
-		else {
908
-			$descr = array();
909
-		}
910
-	}
911
-	if (!isset($descr['niv'])) {
912
-		$descr['niv'] = 0;
913
-	}
914
-	$codes = compile_cas($tableau, $descr, $boucles, $id_boucle);
915
-	if ($codes === false) {
916
-		return false;
917
-	}
918
-	$n = count($codes);
919
-	if (!$n) {
920
-		return "''";
921
-	}
922
-	$tab = str_repeat("\t", $descr['niv']);
923
-	if (_request('var_mode_affiche') != 'validation') {
924
-		if ($n == 1) {
925
-			return $codes[0];
926
-		} else {
927
-			$res = '';
928
-			foreach ($codes as $code) {
929
-				if (!preg_match("/^'[^']*'$/", $code)
930
-					or substr($res, -1, 1) !== "'"
931
-				) {
932
-					$res .= " .\n$tab$code";
933
-				} else {
934
-					$res = substr($res, 0, -1) . substr($code, 1);
935
-				}
936
-			}
937
-
938
-			return '(' . substr($res, 2 + $descr['niv']) . ')';
939
-		}
940
-	} else {
941
-		$nom = $descr['nom'] . $id_boucle . ($descr['niv'] ? $descr['niv'] : '');
942
-
943
-		return "join('', array_map('array_shift', \$GLOBALS['debug_objets']['sequence']['$nom'] = array(" . join(" ,\n$tab",
944
-			$codes) . ")))";
945
-	}
893
+    if (!$tableau) {
894
+        return "''";
895
+    }
896
+    if (is_string($descr)) {
897
+        if (isset($boucles[$descr])) {
898
+            $idb = $descr;
899
+            $descr = [];
900
+            if (isset($boucles[$idb]->descr['id_mere_contexte'])) {
901
+                $descr['id_mere'] = $boucles[$idb]->descr['id_mere_contexte'];
902
+            }
903
+            if (isset($boucles[$idb]->descr['sourcefile'])) {
904
+                $descr['sourcefile'] = $boucles[$idb]->descr['sourcefile'];
905
+            }
906
+        }
907
+        else {
908
+            $descr = array();
909
+        }
910
+    }
911
+    if (!isset($descr['niv'])) {
912
+        $descr['niv'] = 0;
913
+    }
914
+    $codes = compile_cas($tableau, $descr, $boucles, $id_boucle);
915
+    if ($codes === false) {
916
+        return false;
917
+    }
918
+    $n = count($codes);
919
+    if (!$n) {
920
+        return "''";
921
+    }
922
+    $tab = str_repeat("\t", $descr['niv']);
923
+    if (_request('var_mode_affiche') != 'validation') {
924
+        if ($n == 1) {
925
+            return $codes[0];
926
+        } else {
927
+            $res = '';
928
+            foreach ($codes as $code) {
929
+                if (!preg_match("/^'[^']*'$/", $code)
930
+                    or substr($res, -1, 1) !== "'"
931
+                ) {
932
+                    $res .= " .\n$tab$code";
933
+                } else {
934
+                    $res = substr($res, 0, -1) . substr($code, 1);
935
+                }
936
+            }
937
+
938
+            return '(' . substr($res, 2 + $descr['niv']) . ')';
939
+        }
940
+    } else {
941
+        $nom = $descr['nom'] . $id_boucle . ($descr['niv'] ? $descr['niv'] : '');
942
+
943
+        return "join('', array_map('array_shift', \$GLOBALS['debug_objets']['sequence']['$nom'] = array(" . join(" ,\n$tab",
944
+            $codes) . ")))";
945
+    }
946 946
 }
947 947
 
948 948
 
@@ -953,203 +953,203 @@  discard block
 block discarded – undo
953 953
 // https://code.spip.net/@compile_cas
954 954
 function compile_cas($tableau, $descr, &$boucles, $id_boucle) {
955 955
 
956
-	$codes = array();
957
-	// cas de la boucle recursive
958
-	if (is_array($id_boucle)) {
959
-		$id_boucle = $id_boucle[0];
960
-	}
961
-	$type = !$id_boucle ? '' : $boucles[$id_boucle]->type_requete;
962
-	$tab = str_repeat("\t", ++$descr['niv']);
963
-	$mode = _request('var_mode_affiche');
964
-	$err_e_c = '';
965
-	// chaque commentaire introduit dans le code doit commencer
966
-	// par un caractere distinguant le cas, pour exploitation par debug.
967
-	foreach ($tableau as $p) {
968
-
969
-		switch ($p->type) {
970
-			// texte seul
971
-			case 'texte':
972
-				$code = sandbox_composer_texte($p->texte, $p);
973
-				$commentaire = strlen($p->texte) . " signes";
974
-				$avant = '';
975
-				$apres = '';
976
-				$altern = "''";
977
-				break;
978
-
979
-			case 'polyglotte':
980
-				$code = "";
981
-				foreach ($p->traductions as $k => $v) {
982
-					$code .= ",'" .
983
-						str_replace(array("\\", "'"), array("\\\\", "\\'"), $k) .
984
-						"' => '" .
985
-						str_replace(array("\\", "'"), array("\\\\", "\\'"), $v) .
986
-						"'";
987
-				}
988
-				$code = "choisir_traduction(array(" .
989
-					substr($code, 1) .
990
-					"))";
991
-				$commentaire = '&';
992
-				$avant = '';
993
-				$apres = '';
994
-				$altern = "''";
995
-				break;
996
-
997
-			// inclure
998
-			case 'include':
999
-				$p->descr = $descr;
1000
-				$code = calculer_inclure($p, $boucles, $id_boucle);
1001
-				if ($code === false) {
1002
-					$err_e_c = true;
1003
-					$code = "''";
1004
-				} else {
1005
-					$commentaire = '<INCLURE ' . addslashes(str_replace("\n", ' ', $code)) . '>';
1006
-					$avant = '';
1007
-					$apres = '';
1008
-					$altern = "''";
1009
-				}
1010
-				break;
1011
-
1012
-			// boucle
1013
-			case TYPE_RECURSIF:
1014
-				$nom = $p->id_boucle;
1015
-				$newdescr = $descr;
1016
-				$newdescr['id_mere'] = $nom;
1017
-				$newdescr['niv']++;
1018
-				$preaff = calculer_liste($p->preaff, $newdescr, $boucles, $id_boucle);
1019
-				$avant = calculer_liste($p->avant, $newdescr, $boucles, $id_boucle);
1020
-				$apres = calculer_liste($p->apres, $newdescr, $boucles, $id_boucle);
1021
-				$postaff = calculer_liste($p->postaff, $newdescr, $boucles, $id_boucle);
1022
-				$newdescr['niv']--;
1023
-				$altern = calculer_liste($p->altern, $newdescr, $boucles, $id_boucle);
1024
-				if ($preaff === false
1025
-					or $avant === false
1026
-					or $apres === false
1027
-					or $altern === false
1028
-					or $postaff === false) {
1029
-					$err_e_c = true;
1030
-					$code = "''";
1031
-				} else {
1032
-					$code = 'BOUCLE' .
1033
-						str_replace("-", "_", $nom) . $descr['nom'] .
1034
-						'($Cache, $Pile, $doublons, $Numrows, $SP)';
1035
-					$commentaire = "?$nom";
1036
-					if (!$boucles[$nom]->milieu
1037
-						and $boucles[$nom]->type_requete <> TYPE_RECURSIF
1038
-					) {
1039
-						if ($preaff != "''") {
1040
-							$code .= "\n. $preaff";
1041
-						}
1042
-						if ($altern != "''") {
1043
-							$code .= "\n. $altern";
1044
-						}
1045
-						if ($postaff != "''") {
1046
-							$code .= "\n. $postaff";
1047
-						}
1048
-						if ($avant <> "''" or $apres <> "''") {
1049
-							spip_log("boucle $nom toujours vide, code superflu dans $descr[sourcefile]");
1050
-						}
1051
-						$avant = $apres = $altern = "''";
1052
-					} else {
1053
-						if ($preaff != "''") {
1054
-							$avant = compile_concatene_parties_codes($preaff, $avant);
1055
-							$altern = compile_concatene_parties_codes($preaff, $altern);
1056
-						}
1057
-						if ($postaff != "''") {
1058
-							$apres = compile_concatene_parties_codes($apres, $postaff);
1059
-							$altern = compile_concatene_parties_codes($altern, $postaff);
1060
-						}
1061
-						if ($altern != "''") {
1062
-							$altern = "($altern)";
1063
-						}
1064
-					}
1065
-				}
1066
-				break;
1067
-
1068
-			case 'idiome':
1069
-				$l = array();
1070
-				$code = '';
1071
-				foreach ($p->arg as $k => $v) {
1072
-					$_v = calculer_liste($v, $descr, $boucles, $id_boucle);
1073
-					if ($k) {
1074
-						$l[] = _q($k) . ' => ' . $_v;
1075
-					} else {
1076
-						$code = $_v;
1077
-					}
1078
-				}
1079
-				// Si le module n'est pas fourni, l'expliciter sauf si calculé
1080
-				if ($p->module) {
1081
-					$m = $p->module . ':' . $p->nom_champ;
1082
-				} elseif ($p->nom_champ) {
1083
-					$m = MODULES_IDIOMES . ':' . $p->nom_champ;
1084
-				} else {
1085
-					$m = '';
1086
-				}
1087
-
1088
-				$code = (!$code ? "'$m'" :
1089
-						($m ? "'$m' . $code" :
1090
-							("(strpos(\$x=$code, ':') ? \$x : ('" . MODULES_IDIOMES . ":' . \$x))")))
1091
-					. (!$l ? '' : (", array(" . implode(",\n", $l) . ")"));
1092
-				$code = "_T($code)";
1093
-				if ($p->param) {
1094
-					$p->id_boucle = $id_boucle;
1095
-					$p->boucles = &$boucles;
1096
-					$code = compose_filtres($p, $code);
1097
-				}
1098
-				$commentaire = ":";
1099
-				$avant = '';
1100
-				$apres = '';
1101
-				$altern = "''";
1102
-				break;
1103
-
1104
-			case 'champ':
1105
-
1106
-				// cette structure pourrait etre completee des le phrase' (a faire)
1107
-				$p->id_boucle = $id_boucle;
1108
-				$p->boucles = &$boucles;
1109
-				$p->descr = $descr;
1110
-				#$p->interdire_scripts = true;
1111
-				$p->type_requete = $type;
1112
-
1113
-				$code = calculer_champ($p);
1114
-				$commentaire = '#' . $p->nom_champ . $p->etoile;
1115
-				$avant = calculer_liste($p->avant,
1116
-					$descr, $boucles, $id_boucle);
1117
-				$apres = calculer_liste($p->apres,
1118
-					$descr, $boucles, $id_boucle);
1119
-				$altern = "''";
1120
-				// Si la valeur est destinee a une comparaison a ''
1121
-				// forcer la conversion en une chaine par strval
1122
-				// si ca peut etre autre chose qu'une chaine
1123
-				if (($avant != "''" or $apres != "''")
1124
-					and $code[0] != "'"
956
+    $codes = array();
957
+    // cas de la boucle recursive
958
+    if (is_array($id_boucle)) {
959
+        $id_boucle = $id_boucle[0];
960
+    }
961
+    $type = !$id_boucle ? '' : $boucles[$id_boucle]->type_requete;
962
+    $tab = str_repeat("\t", ++$descr['niv']);
963
+    $mode = _request('var_mode_affiche');
964
+    $err_e_c = '';
965
+    // chaque commentaire introduit dans le code doit commencer
966
+    // par un caractere distinguant le cas, pour exploitation par debug.
967
+    foreach ($tableau as $p) {
968
+
969
+        switch ($p->type) {
970
+            // texte seul
971
+            case 'texte':
972
+                $code = sandbox_composer_texte($p->texte, $p);
973
+                $commentaire = strlen($p->texte) . " signes";
974
+                $avant = '';
975
+                $apres = '';
976
+                $altern = "''";
977
+                break;
978
+
979
+            case 'polyglotte':
980
+                $code = "";
981
+                foreach ($p->traductions as $k => $v) {
982
+                    $code .= ",'" .
983
+                        str_replace(array("\\", "'"), array("\\\\", "\\'"), $k) .
984
+                        "' => '" .
985
+                        str_replace(array("\\", "'"), array("\\\\", "\\'"), $v) .
986
+                        "'";
987
+                }
988
+                $code = "choisir_traduction(array(" .
989
+                    substr($code, 1) .
990
+                    "))";
991
+                $commentaire = '&';
992
+                $avant = '';
993
+                $apres = '';
994
+                $altern = "''";
995
+                break;
996
+
997
+            // inclure
998
+            case 'include':
999
+                $p->descr = $descr;
1000
+                $code = calculer_inclure($p, $boucles, $id_boucle);
1001
+                if ($code === false) {
1002
+                    $err_e_c = true;
1003
+                    $code = "''";
1004
+                } else {
1005
+                    $commentaire = '<INCLURE ' . addslashes(str_replace("\n", ' ', $code)) . '>';
1006
+                    $avant = '';
1007
+                    $apres = '';
1008
+                    $altern = "''";
1009
+                }
1010
+                break;
1011
+
1012
+            // boucle
1013
+            case TYPE_RECURSIF:
1014
+                $nom = $p->id_boucle;
1015
+                $newdescr = $descr;
1016
+                $newdescr['id_mere'] = $nom;
1017
+                $newdescr['niv']++;
1018
+                $preaff = calculer_liste($p->preaff, $newdescr, $boucles, $id_boucle);
1019
+                $avant = calculer_liste($p->avant, $newdescr, $boucles, $id_boucle);
1020
+                $apres = calculer_liste($p->apres, $newdescr, $boucles, $id_boucle);
1021
+                $postaff = calculer_liste($p->postaff, $newdescr, $boucles, $id_boucle);
1022
+                $newdescr['niv']--;
1023
+                $altern = calculer_liste($p->altern, $newdescr, $boucles, $id_boucle);
1024
+                if ($preaff === false
1025
+                    or $avant === false
1026
+                    or $apres === false
1027
+                    or $altern === false
1028
+                    or $postaff === false) {
1029
+                    $err_e_c = true;
1030
+                    $code = "''";
1031
+                } else {
1032
+                    $code = 'BOUCLE' .
1033
+                        str_replace("-", "_", $nom) . $descr['nom'] .
1034
+                        '($Cache, $Pile, $doublons, $Numrows, $SP)';
1035
+                    $commentaire = "?$nom";
1036
+                    if (!$boucles[$nom]->milieu
1037
+                        and $boucles[$nom]->type_requete <> TYPE_RECURSIF
1038
+                    ) {
1039
+                        if ($preaff != "''") {
1040
+                            $code .= "\n. $preaff";
1041
+                        }
1042
+                        if ($altern != "''") {
1043
+                            $code .= "\n. $altern";
1044
+                        }
1045
+                        if ($postaff != "''") {
1046
+                            $code .= "\n. $postaff";
1047
+                        }
1048
+                        if ($avant <> "''" or $apres <> "''") {
1049
+                            spip_log("boucle $nom toujours vide, code superflu dans $descr[sourcefile]");
1050
+                        }
1051
+                        $avant = $apres = $altern = "''";
1052
+                    } else {
1053
+                        if ($preaff != "''") {
1054
+                            $avant = compile_concatene_parties_codes($preaff, $avant);
1055
+                            $altern = compile_concatene_parties_codes($preaff, $altern);
1056
+                        }
1057
+                        if ($postaff != "''") {
1058
+                            $apres = compile_concatene_parties_codes($apres, $postaff);
1059
+                            $altern = compile_concatene_parties_codes($altern, $postaff);
1060
+                        }
1061
+                        if ($altern != "''") {
1062
+                            $altern = "($altern)";
1063
+                        }
1064
+                    }
1065
+                }
1066
+                break;
1067
+
1068
+            case 'idiome':
1069
+                $l = array();
1070
+                $code = '';
1071
+                foreach ($p->arg as $k => $v) {
1072
+                    $_v = calculer_liste($v, $descr, $boucles, $id_boucle);
1073
+                    if ($k) {
1074
+                        $l[] = _q($k) . ' => ' . $_v;
1075
+                    } else {
1076
+                        $code = $_v;
1077
+                    }
1078
+                }
1079
+                // Si le module n'est pas fourni, l'expliciter sauf si calculé
1080
+                if ($p->module) {
1081
+                    $m = $p->module . ':' . $p->nom_champ;
1082
+                } elseif ($p->nom_champ) {
1083
+                    $m = MODULES_IDIOMES . ':' . $p->nom_champ;
1084
+                } else {
1085
+                    $m = '';
1086
+                }
1087
+
1088
+                $code = (!$code ? "'$m'" :
1089
+                        ($m ? "'$m' . $code" :
1090
+                            ("(strpos(\$x=$code, ':') ? \$x : ('" . MODULES_IDIOMES . ":' . \$x))")))
1091
+                    . (!$l ? '' : (", array(" . implode(",\n", $l) . ")"));
1092
+                $code = "_T($code)";
1093
+                if ($p->param) {
1094
+                    $p->id_boucle = $id_boucle;
1095
+                    $p->boucles = &$boucles;
1096
+                    $code = compose_filtres($p, $code);
1097
+                }
1098
+                $commentaire = ":";
1099
+                $avant = '';
1100
+                $apres = '';
1101
+                $altern = "''";
1102
+                break;
1103
+
1104
+            case 'champ':
1105
+
1106
+                // cette structure pourrait etre completee des le phrase' (a faire)
1107
+                $p->id_boucle = $id_boucle;
1108
+                $p->boucles = &$boucles;
1109
+                $p->descr = $descr;
1110
+                #$p->interdire_scripts = true;
1111
+                $p->type_requete = $type;
1112
+
1113
+                $code = calculer_champ($p);
1114
+                $commentaire = '#' . $p->nom_champ . $p->etoile;
1115
+                $avant = calculer_liste($p->avant,
1116
+                    $descr, $boucles, $id_boucle);
1117
+                $apres = calculer_liste($p->apres,
1118
+                    $descr, $boucles, $id_boucle);
1119
+                $altern = "''";
1120
+                // Si la valeur est destinee a une comparaison a ''
1121
+                // forcer la conversion en une chaine par strval
1122
+                // si ca peut etre autre chose qu'une chaine
1123
+                if (($avant != "''" or $apres != "''")
1124
+                    and $code[0] != "'"
1125 1125
 #			AND (strpos($code,'interdire_scripts') !== 0)
1126
-					and !preg_match(_REGEXP_COND_VIDE_NONVIDE, $code)
1127
-					and !preg_match(_REGEXP_COND_NONVIDE_VIDE, $code)
1128
-					and !preg_match(_REGEXP_CONCAT_NON_VIDE, $code)
1129
-				) {
1130
-					$code = "strval($code)";
1131
-				}
1132
-				break;
1133
-
1134
-			default:
1135
-				// Erreur de construction de l'arbre de syntaxe abstraite
1136
-				$code = "''";
1137
-				$p->descr = $descr;
1138
-				$err_e_c = _T('zbug_erreur_compilation');
1139
-				erreur_squelette($err_e_c, $p);
1140
-		} // switch
1141
-
1142
-		if ($code != "''") {
1143
-			$code = compile_retour($code, $avant, $apres, $altern, $tab, $descr['niv']);
1144
-			$codes[] = (($mode == 'validation') ?
1145
-				"array($code, '$commentaire', " . $p->ligne . ")"
1146
-				: (($mode == 'code') ?
1147
-					"\n// $commentaire\n$code" :
1148
-					$code));
1149
-		}
1150
-	} // foreach
1151
-
1152
-	return $err_e_c ? false : $codes;
1126
+                    and !preg_match(_REGEXP_COND_VIDE_NONVIDE, $code)
1127
+                    and !preg_match(_REGEXP_COND_NONVIDE_VIDE, $code)
1128
+                    and !preg_match(_REGEXP_CONCAT_NON_VIDE, $code)
1129
+                ) {
1130
+                    $code = "strval($code)";
1131
+                }
1132
+                break;
1133
+
1134
+            default:
1135
+                // Erreur de construction de l'arbre de syntaxe abstraite
1136
+                $code = "''";
1137
+                $p->descr = $descr;
1138
+                $err_e_c = _T('zbug_erreur_compilation');
1139
+                erreur_squelette($err_e_c, $p);
1140
+        } // switch
1141
+
1142
+        if ($code != "''") {
1143
+            $code = compile_retour($code, $avant, $apres, $altern, $tab, $descr['niv']);
1144
+            $codes[] = (($mode == 'validation') ?
1145
+                "array($code, '$commentaire', " . $p->ligne . ")"
1146
+                : (($mode == 'code') ?
1147
+                    "\n// $commentaire\n$code" :
1148
+                    $code));
1149
+        }
1150
+    } // foreach
1151
+
1152
+    return $err_e_c ? false : $codes;
1153 1153
 }
1154 1154
 
1155 1155
 /**
@@ -1159,13 +1159,13 @@  discard block
 block discarded – undo
1159 1159
  * @return string
1160 1160
  */
1161 1161
 function compile_concatene_parties_codes($partie1, $partie2) {
1162
-	if ($partie1 === "''") {
1163
-		return $partie2;
1164
-	}
1165
-	if ($partie2 === "''") {
1166
-		return $partie1;
1167
-	}
1168
-	return "$partie1\n. $partie2";
1162
+    if ($partie1 === "''") {
1163
+        return $partie2;
1164
+    }
1165
+    if ($partie2 === "''") {
1166
+        return $partie1;
1167
+    }
1168
+    return "$partie1\n. $partie2";
1169 1169
 }
1170 1170
 
1171 1171
 
@@ -1190,57 +1190,57 @@  discard block
 block discarded – undo
1190 1190
  * @return mixed|string
1191 1191
  */
1192 1192
 function compile_retour($code, $avant, $apres, $altern, $tab, $n) {
1193
-	if ($avant === "''") {
1194
-		$avant = '';
1195
-	}
1196
-	if ($apres === "''") {
1197
-		$apres = '';
1198
-	}
1199
-	if ($avant or $apres or ($altern !== "''")){
1200
-		if (preg_match(_REGEXP_CONCAT_NON_VIDE, $code)){
1201
-			$t = $code;
1202
-			$cond = '';
1203
-		} elseif (preg_match(_REGEXP_COND_VIDE_NONVIDE, $code, $r)) {
1204
-			$t = $r[2];
1205
-			$cond = '!' . $r[1];
1206
-		} else {
1207
-			if (preg_match(_REGEXP_COND_NONVIDE_VIDE, $code, $r)){
1208
-				$t = $r[2];
1209
-				$cond = $r[1];
1210
-			} else {
1211
-				$t = '$t' . $n;
1212
-				$cond = "($t = $code)!==''";
1213
-			}
1214
-		}
1215
-
1216
-		$res = (!$avant ? "" : "$avant . ") .
1217
-			$t .
1218
-			(!$apres ? "" : " . $apres");
1219
-
1220
-		if ($res!==$t){
1221
-			$res = "($res)";
1222
-		}
1223
-
1224
-		$code = (!$cond ? $res : "($cond ?\n\t$tab$res :\n\t$tab$altern)");
1225
-	}
1226
-
1227
-	return $code;
1193
+    if ($avant === "''") {
1194
+        $avant = '';
1195
+    }
1196
+    if ($apres === "''") {
1197
+        $apres = '';
1198
+    }
1199
+    if ($avant or $apres or ($altern !== "''")){
1200
+        if (preg_match(_REGEXP_CONCAT_NON_VIDE, $code)){
1201
+            $t = $code;
1202
+            $cond = '';
1203
+        } elseif (preg_match(_REGEXP_COND_VIDE_NONVIDE, $code, $r)) {
1204
+            $t = $r[2];
1205
+            $cond = '!' . $r[1];
1206
+        } else {
1207
+            if (preg_match(_REGEXP_COND_NONVIDE_VIDE, $code, $r)){
1208
+                $t = $r[2];
1209
+                $cond = $r[1];
1210
+            } else {
1211
+                $t = '$t' . $n;
1212
+                $cond = "($t = $code)!==''";
1213
+            }
1214
+        }
1215
+
1216
+        $res = (!$avant ? "" : "$avant . ") .
1217
+            $t .
1218
+            (!$apres ? "" : " . $apres");
1219
+
1220
+        if ($res!==$t){
1221
+            $res = "($res)";
1222
+        }
1223
+
1224
+        $code = (!$cond ? $res : "($cond ?\n\t$tab$res :\n\t$tab$altern)");
1225
+    }
1226
+
1227
+    return $code;
1228 1228
 
1229 1229
 }
1230 1230
 
1231 1231
 
1232 1232
 function compile_inclure_doublons($lexemes) {
1233
-	foreach ($lexemes as $v) {
1234
-		if ($v->type === 'include' and $v->param) {
1235
-			foreach ($v->param as $r) {
1236
-				if (trim($r[0]) === 'doublons') {
1237
-					return true;
1238
-				}
1239
-			}
1240
-		}
1241
-	}
1242
-
1243
-	return false;
1233
+    foreach ($lexemes as $v) {
1234
+        if ($v->type === 'include' and $v->param) {
1235
+            foreach ($v->param as $r) {
1236
+                if (trim($r[0]) === 'doublons') {
1237
+                    return true;
1238
+                }
1239
+            }
1240
+        }
1241
+    }
1242
+
1243
+    return false;
1244 1244
 }
1245 1245
 
1246 1246
 // Prend en argument le texte d'un squelette, le nom de son fichier d'origine,
@@ -1260,348 +1260,348 @@  discard block
 block discarded – undo
1260 1260
 
1261 1261
 // https://code.spip.net/@public_compiler_dist
1262 1262
 function public_compiler_dist($squelette, $nom, $gram, $sourcefile, $connect = '') {
1263
-	// Pre-traitement : reperer le charset du squelette, et le convertir
1264
-	// Bonus : supprime le BOM
1265
-	include_spip('inc/charsets');
1266
-	$squelette = transcoder_page($squelette);
1267
-
1268
-	// rendre inertes les echappements de #[](){}<>
1269
-	$i = 0;
1270
-	while (false !== strpos($squelette, $inerte = '-INERTE' . $i)) {
1271
-		$i++;
1272
-	}
1273
-	$squelette = preg_replace_callback(',\\\\([#[()\]{}<>]),',
1274
-		function($a) use ($inerte) {
1275
-			return "$inerte-" . ord($a[1]) . '-';
1276
-		},
1277
-		$squelette,
1278
-		-1,
1279
-		$esc
1280
-	);
1281
-
1282
-	$descr = array(
1283
-		'nom' => $nom,
1284
-		'gram' => $gram,
1285
-		'sourcefile' => $sourcefile,
1286
-		'squelette' => $squelette
1287
-	);
1288
-
1289
-	// Phraser le squelette, selon sa grammaire
1290
-
1291
-	$boucles = array();
1292
-	$f = charger_fonction('phraser_' . $gram, 'public');
1293
-
1294
-	$squelette = $f($squelette, '', $boucles, $descr);
1295
-
1296
-	$boucles = compiler_squelette($squelette, $boucles, $nom, $descr, $sourcefile, $connect);
1297
-
1298
-	// restituer les echappements
1299
-	if ($esc) {
1300
-		foreach ($boucles as $i => $boucle) {
1301
-			$boucles[$i]->return = preg_replace_callback(
1302
-				",$inerte-(\d+)-,",
1303
-				function($a) {
1304
-					return chr($a[1]);
1305
-				},
1306
-				$boucle->return
1307
-			);
1308
-			$boucles[$i]->descr['squelette'] = preg_replace_callback(
1309
-				",$inerte-(\d+)-,",
1310
-				function($a) {
1311
-					return "\\\\" . chr($a[1]);
1312
-				},
1313
-				$boucle->descr['squelette']
1314
-			);
1315
-		}
1316
-	}
1317
-
1318
-	$debug = ($boucles and defined('_VAR_MODE') and _VAR_MODE == 'debug');
1319
-	if ($debug) {
1320
-		include_spip('public/decompiler');
1321
-		foreach ($boucles as $id => $boucle) {
1322
-			if ($id) {
1323
-				$decomp = "\n/* BOUCLE " .
1324
-					$boucle->type_requete .
1325
-					" " .
1326
-					str_replace('*/', '* /', public_decompiler($boucle, $gram, 0, 'criteres')) .
1327
-					($boucle->debug ? "\n *\n * " . implode("\n * ", $boucle->debug) . "\n" : '') .
1328
-					" */\n";
1329
-			} else {
1330
-				$decomp = ("\n/*\n" .
1331
-					str_replace('*/', '* /', public_decompiler($squelette, $gram))
1332
-					. "\n*/");
1333
-			}
1334
-			$boucles[$id]->return = $decomp . $boucle->return;
1335
-			$GLOBALS['debug_objets']['code'][$nom . $id] = $boucle->return;
1336
-		}
1337
-	}
1338
-
1339
-	return $boucles;
1263
+    // Pre-traitement : reperer le charset du squelette, et le convertir
1264
+    // Bonus : supprime le BOM
1265
+    include_spip('inc/charsets');
1266
+    $squelette = transcoder_page($squelette);
1267
+
1268
+    // rendre inertes les echappements de #[](){}<>
1269
+    $i = 0;
1270
+    while (false !== strpos($squelette, $inerte = '-INERTE' . $i)) {
1271
+        $i++;
1272
+    }
1273
+    $squelette = preg_replace_callback(',\\\\([#[()\]{}<>]),',
1274
+        function($a) use ($inerte) {
1275
+            return "$inerte-" . ord($a[1]) . '-';
1276
+        },
1277
+        $squelette,
1278
+        -1,
1279
+        $esc
1280
+    );
1281
+
1282
+    $descr = array(
1283
+        'nom' => $nom,
1284
+        'gram' => $gram,
1285
+        'sourcefile' => $sourcefile,
1286
+        'squelette' => $squelette
1287
+    );
1288
+
1289
+    // Phraser le squelette, selon sa grammaire
1290
+
1291
+    $boucles = array();
1292
+    $f = charger_fonction('phraser_' . $gram, 'public');
1293
+
1294
+    $squelette = $f($squelette, '', $boucles, $descr);
1295
+
1296
+    $boucles = compiler_squelette($squelette, $boucles, $nom, $descr, $sourcefile, $connect);
1297
+
1298
+    // restituer les echappements
1299
+    if ($esc) {
1300
+        foreach ($boucles as $i => $boucle) {
1301
+            $boucles[$i]->return = preg_replace_callback(
1302
+                ",$inerte-(\d+)-,",
1303
+                function($a) {
1304
+                    return chr($a[1]);
1305
+                },
1306
+                $boucle->return
1307
+            );
1308
+            $boucles[$i]->descr['squelette'] = preg_replace_callback(
1309
+                ",$inerte-(\d+)-,",
1310
+                function($a) {
1311
+                    return "\\\\" . chr($a[1]);
1312
+                },
1313
+                $boucle->descr['squelette']
1314
+            );
1315
+        }
1316
+    }
1317
+
1318
+    $debug = ($boucles and defined('_VAR_MODE') and _VAR_MODE == 'debug');
1319
+    if ($debug) {
1320
+        include_spip('public/decompiler');
1321
+        foreach ($boucles as $id => $boucle) {
1322
+            if ($id) {
1323
+                $decomp = "\n/* BOUCLE " .
1324
+                    $boucle->type_requete .
1325
+                    " " .
1326
+                    str_replace('*/', '* /', public_decompiler($boucle, $gram, 0, 'criteres')) .
1327
+                    ($boucle->debug ? "\n *\n * " . implode("\n * ", $boucle->debug) . "\n" : '') .
1328
+                    " */\n";
1329
+            } else {
1330
+                $decomp = ("\n/*\n" .
1331
+                    str_replace('*/', '* /', public_decompiler($squelette, $gram))
1332
+                    . "\n*/");
1333
+            }
1334
+            $boucles[$id]->return = $decomp . $boucle->return;
1335
+            $GLOBALS['debug_objets']['code'][$nom . $id] = $boucle->return;
1336
+        }
1337
+    }
1338
+
1339
+    return $boucles;
1340 1340
 }
1341 1341
 
1342 1342
 // Point d'entree pour arbre de syntaxe abstraite fourni en premier argument
1343 1343
 // Autres specifications comme ci-dessus
1344 1344
 
1345 1345
 function compiler_squelette($squelette, $boucles, $nom, $descr, $sourcefile, $connect = '') {
1346
-	static $trouver_table;
1347
-	spip_timer('calcul_skel');
1348
-
1349
-	if (defined('_VAR_MODE') and _VAR_MODE == 'debug') {
1350
-		$GLOBALS['debug_objets']['squelette'][$nom] = $descr['squelette'];
1351
-		$GLOBALS['debug_objets']['sourcefile'][$nom] = $sourcefile;
1352
-
1353
-		if (!isset($GLOBALS['debug_objets']['principal'])) {
1354
-			$GLOBALS['debug_objets']['principal'] = $nom;
1355
-		}
1356
-	}
1357
-	foreach ($boucles as $id => $boucle) {
1358
-		$GLOBALS['debug_objets']['boucle'][$nom . $id] = $boucle;
1359
-	}
1360
-	$descr['documents'] = compile_inclure_doublons($squelette);
1361
-
1362
-	// Demander la description des tables une fois pour toutes
1363
-	if (!$trouver_table) {
1364
-		$trouver_table = charger_fonction('trouver_table', 'base');
1365
-	}
1366
-
1367
-	// reperer si les doublons sont demandes
1368
-	// pour un inclure ou une boucle document
1369
-	// c'est utile a la fonction champs_traitements
1370
-	foreach ($boucles as $id => $boucle) {
1371
-		if (!($type = $boucle->type_requete)) {
1372
-			continue;
1373
-		}
1374
-		if (!$descr['documents'] and (
1375
-				(($type == 'documents') and $boucle->doublons) or
1376
-				compile_inclure_doublons($boucle->avant) or
1377
-				compile_inclure_doublons($boucle->apres) or
1378
-				compile_inclure_doublons($boucle->milieu) or
1379
-				compile_inclure_doublons($boucle->altern))
1380
-		) {
1381
-			$descr['documents'] = true;
1382
-		}
1383
-		if ($type != TYPE_RECURSIF) {
1384
-			if (!$boucles[$id]->sql_serveur and $connect) {
1385
-				$boucles[$id]->sql_serveur = $connect;
1386
-			}
1387
-
1388
-			// chercher dans les iterateurs du repertoire iterateur/
1389
-			if ($g = charger_fonction(
1390
-				preg_replace('/\W/', '_', $boucle->type_requete), 'iterateur', true)
1391
-			) {
1392
-				$boucles[$id] = $g($boucle);
1393
-
1394
-				// sinon, en cas de requeteur d'un type predefini,
1395
-				// utiliser les informations donnees par le requeteur
1396
-				// cas "php:xx" et "data:xx".
1397
-			} else {
1398
-				if ($boucle->sql_serveur and $requeteur = charger_fonction($boucle->sql_serveur, 'requeteur', true)) {
1399
-					$requeteur($boucles, $boucle, $id);
1400
-
1401
-					// utiliser la description des champs transmis
1402
-				} else {
1403
-					$show = $trouver_table($type, $boucles[$id]->sql_serveur);
1404
-					// si la table n'existe pas avec le connecteur par defaut,
1405
-					// c'est peut etre une table qui necessite son connecteur dedie fourni
1406
-					// permet une ecriture allegee (GEO) -> (geo:GEO)
1407
-					if (!$show
1408
-						and $show = $trouver_table($type, strtolower($type))
1409
-					) {
1410
-						$boucles[$id]->sql_serveur = strtolower($type);
1411
-					}
1412
-					if ($show) {
1413
-						$boucles[$id]->show = $show;
1414
-						// recopie les infos les plus importantes
1415
-						$boucles[$id]->primary = isset($show['key']["PRIMARY KEY"]) ? $show['key']["PRIMARY KEY"] : '';
1416
-						$boucles[$id]->id_table = $x = preg_replace(",^spip_,", "", $show['id_table']);
1417
-						$boucles[$id]->from[$x] = $nom_table = $show['table'];
1418
-						$boucles[$id]->iterateur = 'SQL';
1419
-
1420
-						if (empty($boucles[$id]->descr)) {
1421
-							$boucles[$id]->descr = &$descr;
1422
-						}
1423
-						if ((!$boucles[$id]->jointures)
1424
-							and is_array($show['tables_jointures'])
1425
-							and count($x = $show['tables_jointures'])
1426
-						) {
1427
-							$boucles[$id]->jointures = $x;
1428
-						}
1429
-						if ($boucles[$id]->jointures_explicites) {
1430
-							$jointures = preg_split("/\s+/", $boucles[$id]->jointures_explicites);
1431
-							while ($j = array_pop($jointures)) {
1432
-								array_unshift($boucles[$id]->jointures, $j);
1433
-							}
1434
-						}
1435
-					} else {
1436
-						// Pas une erreur si la table est optionnelle
1437
-						if ($boucles[$id]->table_optionnelle) {
1438
-							$boucles[$id]->type_requete = '';
1439
-						} else {
1440
-							$boucles[$id]->type_requete = false;
1441
-							$boucle = $boucles[$id];
1442
-							$x = (!$boucle->sql_serveur ? '' :
1443
-									($boucle->sql_serveur . ":")) .
1444
-								$type;
1445
-							$msg = array(
1446
-								'zbug_table_inconnue',
1447
-								array('table' => $x)
1448
-							);
1449
-							erreur_squelette($msg, $boucle);
1450
-						}
1451
-					}
1452
-				}
1453
-			}
1454
-		}
1455
-	}
1456
-
1457
-	// Commencer par reperer les boucles appelees explicitement 
1458
-	// car elles indexent les arguments de maniere derogatoire
1459
-	foreach ($boucles as $id => $boucle) {
1460
-		if ($boucle->type_requete == TYPE_RECURSIF and $boucle->param) {
1461
-			$boucles[$id]->descr = &$descr;
1462
-			$rec = &$boucles[$boucle->param[0]];
1463
-			if (!$rec) {
1464
-				$msg = array(
1465
-					'zbug_boucle_recursive_undef',
1466
-					array('nom' => $boucle->param[0])
1467
-				);
1468
-				erreur_squelette($msg, $boucle);
1469
-				$boucles[$id]->type_requete = false;
1470
-			} else {
1471
-				$rec->externe = $id;
1472
-				$descr['id_mere'] = $id;
1473
-				$boucles[$id]->return =
1474
-					calculer_liste(array($rec),
1475
-						$descr,
1476
-						$boucles,
1477
-						$boucle->param);
1478
-			}
1479
-		}
1480
-	}
1481
-	foreach ($boucles as $id => $boucle) {
1482
-		$id = strval($id); // attention au type dans index_pile
1483
-		$type = $boucle->type_requete;
1484
-		if ($type and $type != TYPE_RECURSIF) {
1485
-			$res = '';
1486
-			if ($boucle->param) {
1487
-				// retourne un tableau en cas d'erreur
1488
-				$res = calculer_criteres($id, $boucles);
1489
-			}
1490
-			$descr['id_mere'] = $id;
1491
-			$boucles[$id]->return =
1492
-				calculer_liste($boucle->milieu,
1493
-					$descr,
1494
-					$boucles,
1495
-					$id);
1496
-			// Si les criteres se sont mal compiles
1497
-			// ne pas tenter d'assembler le code final
1498
-			// (mais compiler le corps pour detection d'erreurs)
1499
-			if (is_array($res)) {
1500
-				$boucles[$id]->type_requete = false;
1501
-			}
1502
-		}
1503
-	}
1504
-
1505
-	// idem pour la racine
1506
-	$descr['id_mere'] = '';
1507
-	$corps = calculer_liste($squelette, $descr, $boucles);
1508
-
1509
-
1510
-	// Calcul du corps de toutes les fonctions PHP,
1511
-	// en particulier les requetes SQL et TOTAL_BOUCLE
1512
-	// de'terminables seulement maintenant
1513
-
1514
-	foreach ($boucles as $id => $boucle) {
1515
-		$boucle = $boucles[$id] = pipeline('pre_boucle', $boucle);
1516
-		if ($boucle->return === false) {
1517
-			$corps = false;
1518
-			continue;
1519
-		}
1520
-		// appeler la fonction de definition de la boucle
1521
-
1522
-		if ($req = $boucle->type_requete) {
1523
-			// boucle personnalisée ?
1524
-			$table = strtoupper($boucle->type_requete);
1525
-			$serveur = strtolower($boucle->sql_serveur);
1526
-			if (
1527
-				// fonction de boucle avec serveur & table
1528
-				(!$serveur or
1529
-					((!function_exists($f = "boucle_" . $serveur . "_" . $table))
1530
-						and (!function_exists($f = $f . "_dist"))
1531
-					)
1532
-				)
1533
-				// fonction de boucle avec table
1534
-				and (!function_exists($f = "boucle_" . $table))
1535
-				and (!function_exists($f = $f . "_dist"))
1536
-			) {
1537
-				// fonction de boucle standard 
1538
-				if (!function_exists($f = 'boucle_DEFAUT')) {
1539
-					$f = 'boucle_DEFAUT_dist';
1540
-				}
1541
-			}
1542
-
1543
-			$req = "\n\n\tstatic \$command = array();\n\t" .
1544
-				"static \$connect;\n\t" .
1545
-				"\$command['connect'] = \$connect = " .
1546
-				_q($boucle->sql_serveur) .
1547
-				";" .
1548
-				$f($id, $boucles);
1549
-		} else {
1550
-			$req = ("\n\treturn '';");
1551
-		}
1552
-
1553
-		$boucles[$id]->return =
1554
-			"\n\nfunction BOUCLE" . strtr($id, "-", "_") . $nom .
1555
-			'(&$Cache, &$Pile, &$doublons, &$Numrows, $SP) {' .
1556
-			$req .
1557
-			"\n}\n";
1558
-	}
1559
-
1560
-	// Au final, si le corps ou un critere au moins s'est mal compile
1561
-	// retourner False, sinon inserer leur decompilation
1562
-	if (is_bool($corps)) {
1563
-		return false;
1564
-	}
1565
-
1566
-	$principal = "\nfunction " . $nom . '($Cache, $Pile, $doublons = array(), $Numrows = array(), $SP = 0) {
1346
+    static $trouver_table;
1347
+    spip_timer('calcul_skel');
1348
+
1349
+    if (defined('_VAR_MODE') and _VAR_MODE == 'debug') {
1350
+        $GLOBALS['debug_objets']['squelette'][$nom] = $descr['squelette'];
1351
+        $GLOBALS['debug_objets']['sourcefile'][$nom] = $sourcefile;
1352
+
1353
+        if (!isset($GLOBALS['debug_objets']['principal'])) {
1354
+            $GLOBALS['debug_objets']['principal'] = $nom;
1355
+        }
1356
+    }
1357
+    foreach ($boucles as $id => $boucle) {
1358
+        $GLOBALS['debug_objets']['boucle'][$nom . $id] = $boucle;
1359
+    }
1360
+    $descr['documents'] = compile_inclure_doublons($squelette);
1361
+
1362
+    // Demander la description des tables une fois pour toutes
1363
+    if (!$trouver_table) {
1364
+        $trouver_table = charger_fonction('trouver_table', 'base');
1365
+    }
1366
+
1367
+    // reperer si les doublons sont demandes
1368
+    // pour un inclure ou une boucle document
1369
+    // c'est utile a la fonction champs_traitements
1370
+    foreach ($boucles as $id => $boucle) {
1371
+        if (!($type = $boucle->type_requete)) {
1372
+            continue;
1373
+        }
1374
+        if (!$descr['documents'] and (
1375
+                (($type == 'documents') and $boucle->doublons) or
1376
+                compile_inclure_doublons($boucle->avant) or
1377
+                compile_inclure_doublons($boucle->apres) or
1378
+                compile_inclure_doublons($boucle->milieu) or
1379
+                compile_inclure_doublons($boucle->altern))
1380
+        ) {
1381
+            $descr['documents'] = true;
1382
+        }
1383
+        if ($type != TYPE_RECURSIF) {
1384
+            if (!$boucles[$id]->sql_serveur and $connect) {
1385
+                $boucles[$id]->sql_serveur = $connect;
1386
+            }
1387
+
1388
+            // chercher dans les iterateurs du repertoire iterateur/
1389
+            if ($g = charger_fonction(
1390
+                preg_replace('/\W/', '_', $boucle->type_requete), 'iterateur', true)
1391
+            ) {
1392
+                $boucles[$id] = $g($boucle);
1393
+
1394
+                // sinon, en cas de requeteur d'un type predefini,
1395
+                // utiliser les informations donnees par le requeteur
1396
+                // cas "php:xx" et "data:xx".
1397
+            } else {
1398
+                if ($boucle->sql_serveur and $requeteur = charger_fonction($boucle->sql_serveur, 'requeteur', true)) {
1399
+                    $requeteur($boucles, $boucle, $id);
1400
+
1401
+                    // utiliser la description des champs transmis
1402
+                } else {
1403
+                    $show = $trouver_table($type, $boucles[$id]->sql_serveur);
1404
+                    // si la table n'existe pas avec le connecteur par defaut,
1405
+                    // c'est peut etre une table qui necessite son connecteur dedie fourni
1406
+                    // permet une ecriture allegee (GEO) -> (geo:GEO)
1407
+                    if (!$show
1408
+                        and $show = $trouver_table($type, strtolower($type))
1409
+                    ) {
1410
+                        $boucles[$id]->sql_serveur = strtolower($type);
1411
+                    }
1412
+                    if ($show) {
1413
+                        $boucles[$id]->show = $show;
1414
+                        // recopie les infos les plus importantes
1415
+                        $boucles[$id]->primary = isset($show['key']["PRIMARY KEY"]) ? $show['key']["PRIMARY KEY"] : '';
1416
+                        $boucles[$id]->id_table = $x = preg_replace(",^spip_,", "", $show['id_table']);
1417
+                        $boucles[$id]->from[$x] = $nom_table = $show['table'];
1418
+                        $boucles[$id]->iterateur = 'SQL';
1419
+
1420
+                        if (empty($boucles[$id]->descr)) {
1421
+                            $boucles[$id]->descr = &$descr;
1422
+                        }
1423
+                        if ((!$boucles[$id]->jointures)
1424
+                            and is_array($show['tables_jointures'])
1425
+                            and count($x = $show['tables_jointures'])
1426
+                        ) {
1427
+                            $boucles[$id]->jointures = $x;
1428
+                        }
1429
+                        if ($boucles[$id]->jointures_explicites) {
1430
+                            $jointures = preg_split("/\s+/", $boucles[$id]->jointures_explicites);
1431
+                            while ($j = array_pop($jointures)) {
1432
+                                array_unshift($boucles[$id]->jointures, $j);
1433
+                            }
1434
+                        }
1435
+                    } else {
1436
+                        // Pas une erreur si la table est optionnelle
1437
+                        if ($boucles[$id]->table_optionnelle) {
1438
+                            $boucles[$id]->type_requete = '';
1439
+                        } else {
1440
+                            $boucles[$id]->type_requete = false;
1441
+                            $boucle = $boucles[$id];
1442
+                            $x = (!$boucle->sql_serveur ? '' :
1443
+                                    ($boucle->sql_serveur . ":")) .
1444
+                                $type;
1445
+                            $msg = array(
1446
+                                'zbug_table_inconnue',
1447
+                                array('table' => $x)
1448
+                            );
1449
+                            erreur_squelette($msg, $boucle);
1450
+                        }
1451
+                    }
1452
+                }
1453
+            }
1454
+        }
1455
+    }
1456
+
1457
+    // Commencer par reperer les boucles appelees explicitement 
1458
+    // car elles indexent les arguments de maniere derogatoire
1459
+    foreach ($boucles as $id => $boucle) {
1460
+        if ($boucle->type_requete == TYPE_RECURSIF and $boucle->param) {
1461
+            $boucles[$id]->descr = &$descr;
1462
+            $rec = &$boucles[$boucle->param[0]];
1463
+            if (!$rec) {
1464
+                $msg = array(
1465
+                    'zbug_boucle_recursive_undef',
1466
+                    array('nom' => $boucle->param[0])
1467
+                );
1468
+                erreur_squelette($msg, $boucle);
1469
+                $boucles[$id]->type_requete = false;
1470
+            } else {
1471
+                $rec->externe = $id;
1472
+                $descr['id_mere'] = $id;
1473
+                $boucles[$id]->return =
1474
+                    calculer_liste(array($rec),
1475
+                        $descr,
1476
+                        $boucles,
1477
+                        $boucle->param);
1478
+            }
1479
+        }
1480
+    }
1481
+    foreach ($boucles as $id => $boucle) {
1482
+        $id = strval($id); // attention au type dans index_pile
1483
+        $type = $boucle->type_requete;
1484
+        if ($type and $type != TYPE_RECURSIF) {
1485
+            $res = '';
1486
+            if ($boucle->param) {
1487
+                // retourne un tableau en cas d'erreur
1488
+                $res = calculer_criteres($id, $boucles);
1489
+            }
1490
+            $descr['id_mere'] = $id;
1491
+            $boucles[$id]->return =
1492
+                calculer_liste($boucle->milieu,
1493
+                    $descr,
1494
+                    $boucles,
1495
+                    $id);
1496
+            // Si les criteres se sont mal compiles
1497
+            // ne pas tenter d'assembler le code final
1498
+            // (mais compiler le corps pour detection d'erreurs)
1499
+            if (is_array($res)) {
1500
+                $boucles[$id]->type_requete = false;
1501
+            }
1502
+        }
1503
+    }
1504
+
1505
+    // idem pour la racine
1506
+    $descr['id_mere'] = '';
1507
+    $corps = calculer_liste($squelette, $descr, $boucles);
1508
+
1509
+
1510
+    // Calcul du corps de toutes les fonctions PHP,
1511
+    // en particulier les requetes SQL et TOTAL_BOUCLE
1512
+    // de'terminables seulement maintenant
1513
+
1514
+    foreach ($boucles as $id => $boucle) {
1515
+        $boucle = $boucles[$id] = pipeline('pre_boucle', $boucle);
1516
+        if ($boucle->return === false) {
1517
+            $corps = false;
1518
+            continue;
1519
+        }
1520
+        // appeler la fonction de definition de la boucle
1521
+
1522
+        if ($req = $boucle->type_requete) {
1523
+            // boucle personnalisée ?
1524
+            $table = strtoupper($boucle->type_requete);
1525
+            $serveur = strtolower($boucle->sql_serveur);
1526
+            if (
1527
+                // fonction de boucle avec serveur & table
1528
+                (!$serveur or
1529
+                    ((!function_exists($f = "boucle_" . $serveur . "_" . $table))
1530
+                        and (!function_exists($f = $f . "_dist"))
1531
+                    )
1532
+                )
1533
+                // fonction de boucle avec table
1534
+                and (!function_exists($f = "boucle_" . $table))
1535
+                and (!function_exists($f = $f . "_dist"))
1536
+            ) {
1537
+                // fonction de boucle standard 
1538
+                if (!function_exists($f = 'boucle_DEFAUT')) {
1539
+                    $f = 'boucle_DEFAUT_dist';
1540
+                }
1541
+            }
1542
+
1543
+            $req = "\n\n\tstatic \$command = array();\n\t" .
1544
+                "static \$connect;\n\t" .
1545
+                "\$command['connect'] = \$connect = " .
1546
+                _q($boucle->sql_serveur) .
1547
+                ";" .
1548
+                $f($id, $boucles);
1549
+        } else {
1550
+            $req = ("\n\treturn '';");
1551
+        }
1552
+
1553
+        $boucles[$id]->return =
1554
+            "\n\nfunction BOUCLE" . strtr($id, "-", "_") . $nom .
1555
+            '(&$Cache, &$Pile, &$doublons, &$Numrows, $SP) {' .
1556
+            $req .
1557
+            "\n}\n";
1558
+    }
1559
+
1560
+    // Au final, si le corps ou un critere au moins s'est mal compile
1561
+    // retourner False, sinon inserer leur decompilation
1562
+    if (is_bool($corps)) {
1563
+        return false;
1564
+    }
1565
+
1566
+    $principal = "\nfunction " . $nom . '($Cache, $Pile, $doublons = array(), $Numrows = array(), $SP = 0) {
1567 1567
 '
1568
-		// reporter de maniere securisee les doublons inclus
1569
-		. '
1568
+        // reporter de maniere securisee les doublons inclus
1569
+        . '
1570 1570
 	if (isset($Pile[0]["doublons"]) AND is_array($Pile[0]["doublons"]))
1571 1571
 		$doublons = nettoyer_env_doublons($Pile[0]["doublons"]);
1572 1572
 
1573 1573
 	$connect = ' .
1574
-		_q($connect) . ';
1574
+        _q($connect) . ';
1575 1575
 	$page = ' .
1576
-		// ATTENTION, le calcul de l'expression $corps affectera $Cache
1577
-		// c'est pourquoi on l'affecte a la variable auxiliaire $page.
1578
-		// avant de referencer $Cache
1579
-		$corps . ";
1576
+        // ATTENTION, le calcul de l'expression $corps affectera $Cache
1577
+        // c'est pourquoi on l'affecte a la variable auxiliaire $page.
1578
+        // avant de referencer $Cache
1579
+        $corps . ";
1580 1580
 
1581 1581
 	return analyse_resultat_skel(" . var_export($nom, true)
1582
-		. ", \$Cache, \$page, " . var_export($sourcefile, true) . ");
1582
+        . ", \$Cache, \$page, " . var_export($sourcefile, true) . ");
1583 1583
 }";
1584 1584
 
1585
-	$secondes = spip_timer('calcul_skel');
1586
-	spip_log("COMPIL ($secondes) [$sourcefile] $nom.php");
1587
-	// $connect n'est pas sûr : on nettoie
1588
-	$connect = preg_replace(',[^\w],', '', $connect);
1585
+    $secondes = spip_timer('calcul_skel');
1586
+    spip_log("COMPIL ($secondes) [$sourcefile] $nom.php");
1587
+    // $connect n'est pas sûr : on nettoie
1588
+    $connect = preg_replace(',[^\w],', '', $connect);
1589 1589
 
1590
-	// Assimiler la fct principale a une boucle anonyme, pour retourner un resultat simple
1591
-	$code = new Boucle;
1592
-	$code->descr = $descr;
1593
-	$code->return = '
1590
+    // Assimiler la fct principale a une boucle anonyme, pour retourner un resultat simple
1591
+    $code = new Boucle;
1592
+    $code->descr = $descr;
1593
+    $code->return = '
1594 1594
 //
1595 1595
 // Fonction principale du squelette ' .
1596
-		$sourcefile .
1597
-		($connect ? " pour $connect" : '') .
1598
-		(!CODE_COMMENTE ? '' : "\n// Temps de compilation total: $secondes") .
1599
-		"\n//\n" .
1600
-		$principal;
1596
+        $sourcefile .
1597
+        ($connect ? " pour $connect" : '') .
1598
+        (!CODE_COMMENTE ? '' : "\n// Temps de compilation total: $secondes") .
1599
+        "\n//\n" .
1600
+        $principal;
1601 1601
 
1602
-	$boucles[''] = $code;
1602
+    $boucles[''] = $code;
1603 1603
 
1604
-	return $boucles;
1604
+    return $boucles;
1605 1605
 }
1606 1606
 
1607 1607
 
@@ -1618,18 +1618,18 @@  discard block
 block discarded – undo
1618 1618
  *
1619 1619
  **/
1620 1620
 function requeteur_php_dist(&$boucles, &$boucle, &$id) {
1621
-	if (class_exists($boucle->type_requete)) {
1622
-		$g = charger_fonction('php', 'iterateur');
1623
-		$boucles[$id] = $g($boucle, $boucle->type_requete);
1624
-	} else {
1625
-		$x = $boucle->type_requete;
1626
-		$boucle->type_requete = false;
1627
-		$msg = array(
1628
-			'zbug_iterateur_inconnu',
1629
-			array('iterateur' => $x)
1630
-		);
1631
-		erreur_squelette($msg, $boucle);
1632
-	}
1621
+    if (class_exists($boucle->type_requete)) {
1622
+        $g = charger_fonction('php', 'iterateur');
1623
+        $boucles[$id] = $g($boucle, $boucle->type_requete);
1624
+    } else {
1625
+        $x = $boucle->type_requete;
1626
+        $boucle->type_requete = false;
1627
+        $msg = array(
1628
+            'zbug_iterateur_inconnu',
1629
+            array('iterateur' => $x)
1630
+        );
1631
+        erreur_squelette($msg, $boucle);
1632
+    }
1633 1633
 }
1634 1634
 
1635 1635
 
@@ -1647,23 +1647,23 @@  discard block
 block discarded – undo
1647 1647
  *
1648 1648
  **/
1649 1649
 function requeteur_data_dist(&$boucles, &$boucle, &$id) {
1650
-	include_spip('iterateur/data');
1651
-	if ($h = charger_fonction($boucle->type_requete . '_to_array', 'inc', true)) {
1652
-		$g = charger_fonction('data', 'iterateur');
1653
-		$boucles[$id] = $g($boucle);
1654
-		// from[0] stocke le type de data (rss, yql, ...)
1655
-		$boucles[$id]->from[] = $boucle->type_requete;
1656
-
1657
-	} else {
1658
-		$x = $boucle->type_requete;
1659
-		$boucle->type_requete = false;
1660
-		$msg = array(
1661
-			'zbug_requeteur_inconnu',
1662
-			array(
1663
-				'requeteur' => 'data',
1664
-				'type' => $x
1665
-			)
1666
-		);
1667
-		erreur_squelette($msg, $boucle);
1668
-	}
1650
+    include_spip('iterateur/data');
1651
+    if ($h = charger_fonction($boucle->type_requete . '_to_array', 'inc', true)) {
1652
+        $g = charger_fonction('data', 'iterateur');
1653
+        $boucles[$id] = $g($boucle);
1654
+        // from[0] stocke le type de data (rss, yql, ...)
1655
+        $boucles[$id]->from[] = $boucle->type_requete;
1656
+
1657
+    } else {
1658
+        $x = $boucle->type_requete;
1659
+        $boucle->type_requete = false;
1660
+        $msg = array(
1661
+            'zbug_requeteur_inconnu',
1662
+            array(
1663
+                'requeteur' => 'data',
1664
+                'type' => $x
1665
+            )
1666
+        );
1667
+        erreur_squelette($msg, $boucle);
1668
+    }
1669 1669
 }
Please login to merge, or discard this patch.
Spacing   +114 added lines, -122 removed lines patch added patch discarded remove patch
@@ -97,7 +97,7 @@  discard block
 block discarded – undo
97 97
 				preg_match(",^([^=]*)(=?)(.*)$,m", $var->texte, $m);
98 98
 				$m = array_pad($m, 3, null);
99 99
 				$var = $m[1];
100
-				$auto = false;;
100
+				$auto = false; ;
101 101
 				if ($m[2]) {
102 102
 					$v = $m[3];
103 103
 					if (preg_match(',^[\'"](.*)[\'"]$,', $v, $m)) {
@@ -121,7 +121,7 @@  discard block
 block discarded – undo
121 121
 						: calculer_liste($val, $p->descr, $boucles, $id_boucle);
122 122
 					if ($var !== 1) {
123 123
 						$val = ($echap ? "\'$var\' => ' . argumenter_squelette(" : "'$var' => ")
124
-							. $val . ($echap ? ") . '" : " ");
124
+							. $val.($echap ? ") . '" : " ");
125 125
 					} else {
126 126
 						$val = $echap ? "'.$val.'" : $val;
127 127
 					}
@@ -142,7 +142,7 @@  discard block
 block discarded – undo
142 142
 	if (!$lang) {
143 143
 		$lang = '$GLOBALS["spip_lang"]';
144 144
 	}
145
-	$l['lang'] = ($echap ? "\'lang\' => ' . argumenter_squelette(" : "'lang' => ") . $lang . ($echap ? ") . '" : " ");
145
+	$l['lang'] = ($echap ? "\'lang\' => ' . argumenter_squelette(" : "'lang' => ").$lang.($echap ? ") . '" : " ");
146 146
 
147 147
 	return $l;
148 148
 }
@@ -171,7 +171,7 @@  discard block
 block discarded – undo
171 171
 	$_contexte = argumenter_inclure($p->param, false, $p, $boucles, $id_boucle, true, '', true);
172 172
 	if (is_string($p->texte)) {
173 173
 		$fichier = $p->texte;
174
-		$code = "\"".str_replace('"','\"',$fichier)."\"";
174
+		$code = "\"".str_replace('"', '\"', $fichier)."\"";
175 175
 
176 176
 	} else {
177 177
 		$code = calculer_liste($p->texte, $p->descr, $boucles, $id_boucle);
@@ -185,7 +185,7 @@  discard block
 block discarded – undo
185 185
 		$trace = $p->fonctions;
186 186
 		while (is_array($trace)
187 187
 		  and $trace = array_filter($trace)
188
-			and count($trace)==1) {
188
+			and count($trace) == 1) {
189 189
 			$trace = reset($trace);
190 190
 		}
191 191
 		$erreur_p_i_i = array(
@@ -219,7 +219,7 @@  discard block
 block discarded – undo
219 219
 		return false;
220 220
 	} // j'aurais voulu toucher le fond ...
221 221
 
222
-	$contexte = 'array(' . $_contexte . ')';
222
+	$contexte = 'array('.$_contexte.')';
223 223
 
224 224
 	if ($env) {
225 225
 		$contexte = "array_merge('.var_export(\$Pile[0],1).',$contexte)";
@@ -234,11 +234,11 @@  discard block
 block discarded – undo
234 234
 			$_options[] = $ajax;
235 235
 		}
236 236
 		$code = " ' . argumenter_squelette($code) . '";
237
-		$code = "echo " . sprintf(CODE_RECUPERER_FOND, $code, $contexte, implode(',', $_options),
238
-				"_request(\"connect\")") . ';';
237
+		$code = "echo ".sprintf(CODE_RECUPERER_FOND, $code, $contexte, implode(',', $_options),
238
+				"_request(\"connect\")").';';
239 239
 	}
240 240
 
241
-	return "\n'<'.'" . "?php " . $code . "\n?'." . "'>'";
241
+	return "\n'<'.'"."?php ".$code."\n?'."."'>'";
242 242
 }
243 243
 
244 244
 
@@ -318,17 +318,17 @@  discard block
 block discarded – undo
318 318
 					$id = $id_table;
319 319
 					$statut = preg_replace(',\W,', '', $s['champ']); // securite
320 320
 				}
321
-				$mstatut = $id . '.' . $statut;
321
+				$mstatut = $id.'.'.$statut;
322 322
 
323 323
 				$arg_ignore_previsu = ($ignore_previsu ? ",true" : '');
324 324
 				include_spip('public/quete');
325 325
 				if (isset($s['post_date']) and $s['post_date']
326 326
 					and $GLOBALS['meta']["post_dates"] == 'non'
327 327
 				) {
328
-					$date = $id . '.' . preg_replace(',\W,', '', $s['post_date']); // securite
328
+					$date = $id.'.'.preg_replace(',\W,', '', $s['post_date']); // securite
329 329
 					array_unshift($boucle->where,
330 330
 						$echapper ?
331
-							"\nquete_condition_postdates('$date'," . _q($boucle->sql_serveur) . "$arg_ignore_previsu)"
331
+							"\nquete_condition_postdates('$date',"._q($boucle->sql_serveur)."$arg_ignore_previsu)"
332 332
 							:
333 333
 							quete_condition_postdates($date, $boucle->sql_serveur, $ignore_previsu)
334 334
 					);
@@ -336,9 +336,9 @@  discard block
 block discarded – undo
336 336
 				array_unshift($boucle->where,
337 337
 					$echapper ?
338 338
 						"\nquete_condition_statut('$mstatut',"
339
-						. _q($s['previsu']) . ","
340
-						. _q($s['publie']) . ","
341
-						. _q($boucle->sql_serveur) . "$arg_ignore_previsu)"
339
+						. _q($s['previsu']).","
340
+						. _q($s['publie']).","
341
+						. _q($boucle->sql_serveur)."$arg_ignore_previsu)"
342 342
 						:
343 343
 						quete_condition_statut($mstatut, $s['previsu'], $s['publie'], $boucle->sql_serveur, $ignore_previsu)
344 344
 				);
@@ -372,14 +372,14 @@  discard block
 block discarded – undo
372 372
 	if (_request('var_mode_affiche') != 'resultat') {
373 373
 		$trace = '';
374 374
 	} else {
375
-		$_trace = $boucles[$id_boucle]->descr['nom'] . $id_boucle;
375
+		$_trace = $boucles[$id_boucle]->descr['nom'].$id_boucle;
376 376
 		$_trace = "\$GLOBALS['debug_objets']['resultat']['$_trace']";
377 377
 		$trace = "
378 378
 		if (empty($_trace)) { 
379 379
 			$_trace = []; 
380 380
 		}
381 381
 		if (count($_trace) < 3) { 
382
-			$_trace" . "[] = \$t0; 
382
+			$_trace"."[] = \$t0; 
383 383
 		}";
384 384
 	}
385 385
 
@@ -413,7 +413,7 @@  discard block
 block discarded – undo
413 413
 	return
414 414
 		// Numrows[$nom] peut ne pas être encore defini
415 415
 		"\n\t\$save_numrows = (isset(\$Numrows['$nom']) ? \$Numrows['$nom'] : array());"
416
-		. "\n\t\$t0 = " . $boucles[$id_boucle]->return . ";"
416
+		. "\n\t\$t0 = ".$boucles[$id_boucle]->return.";"
417 417
 		. "\n\t\$Numrows['$nom'] = (\$save_numrows);"
418 418
 		. $trace
419 419
 		. "\n\treturn \$t0;";
@@ -481,7 +481,7 @@  discard block
 block discarded – undo
481 481
 	// faudrait expanser le foreach a la compil, car y en a souvent qu'un 
482 482
 	// et puis faire un [] plutot qu'un "','."
483 483
 	if ($boucle->doublons) {
484
-		$corps .= "\n\t\t\tforeach(" . $boucle->doublons . ' as $k) $doublons[$k] .= "," . ' .
484
+		$corps .= "\n\t\t\tforeach(".$boucle->doublons.' as $k) $doublons[$k] .= "," . '.
485 485
 			index_pile($id_boucle, $primary, $boucles)
486 486
 			. "; // doublons\n";
487 487
 	}
@@ -508,13 +508,13 @@  discard block
 block discarded – undo
508 508
 		$corps .=
509 509
 			"\n\t\tlang_select_public("
510 510
 			. index_pile($id_boucle, 'lang', $boucles)
511
-			. ", '" . $boucle->lang_select . "'"
511
+			. ", '".$boucle->lang_select."'"
512 512
 			. (in_array($type_boucle, array(
513 513
 				'articles',
514 514
 				'rubriques',
515 515
 				'hierarchie',
516 516
 				'breves'
517
-			)) ? ', ' . index_pile($id_boucle, 'titre', $boucles) : '')
517
+			)) ? ', '.index_pile($id_boucle, 'titre', $boucles) : '')
518 518
 			. ');';
519 519
 	} else {
520 520
 		$init_lang = '';
@@ -535,26 +535,22 @@  discard block
 block discarded – undo
535 535
 
536 536
 	// gestion optimale des separateurs et des boucles constantes
537 537
 	if (count($boucle->separateur)) {
538
-		$code_sep = ("'" . str_replace("'", "\'", join('', $boucle->separateur)) . "'");
538
+		$code_sep = ("'".str_replace("'", "\'", join('', $boucle->separateur))."'");
539 539
 	}
540 540
 
541 541
 	$corps .=
542 542
 		((!$boucle->separateur) ?
543
-			(($constant && !$corps && !$flag_cpt) ? $return :
544
-				(($return === "''") ? '' :
545
-					("\n\t\t" . '$t0 .= ' . $return . ";"))) :
546
-			("\n\t\t\$t1 " .
543
+			(($constant && !$corps && !$flag_cpt) ? $return : (($return === "''") ? '' : ("\n\t\t".'$t0 .= '.$return.";"))) : ("\n\t\t\$t1 ".
547 544
 				((strpos($return, '$t1.') === 0) ?
548
-					(".=" . substr($return, 4)) :
549
-					('= ' . $return)) .
550
-				";\n\t\t" .
551
-				'$t0 .= ((strlen($t1) && strlen($t0)) ? ' . $code_sep . " : '') . \$t1;"));
545
+					(".=".substr($return, 4)) : ('= '.$return)).
546
+				";\n\t\t".
547
+				'$t0 .= ((strlen($t1) && strlen($t0)) ? '.$code_sep." : '') . \$t1;"));
552 548
 
553 549
 	// Calculer les invalideurs si c'est une boucle non constante et si on
554 550
 	// souhaite invalider ces elements
555 551
 	if (!$constant and $primary) {
556 552
 		include_spip('inc/invalideur');
557
-		$corps = calcul_invalideurs($corps, $primary,$boucles, $id_boucle);
553
+		$corps = calcul_invalideurs($corps, $primary, $boucles, $id_boucle);
558 554
 	}
559 555
 
560 556
 	// gerer le compteur de boucle 
@@ -629,7 +625,7 @@  discard block
 block discarded – undo
629 625
 		$corps,
630 626
 		$fin_lang,
631 627
 		$trace,
632
-		'BOUCLE' . $id_boucle . ' @ ' . ($boucle->descr['sourcefile'])
628
+		'BOUCLE'.$id_boucle.' @ '.($boucle->descr['sourcefile'])
633 629
 	);
634 630
 
635 631
 #	var_dump($a);exit;
@@ -650,20 +646,20 @@  discard block
 block discarded – undo
650 646
  **/
651 647
 function calculer_requete_sql($boucle) {
652 648
 	$init = array();
653
-	$init[] = calculer_dec('table', "'" . $boucle->id_table . "'");
654
-	$init[] = calculer_dec('id', "'" . $boucle->id_boucle . "'");
649
+	$init[] = calculer_dec('table', "'".$boucle->id_table."'");
650
+	$init[] = calculer_dec('id', "'".$boucle->id_boucle."'");
655 651
 	# En absence de champ c'est un decompte :
656 652
 	$init[] = calculer_dec('from', calculer_from($boucle));
657 653
 	$init[] = calculer_dec('type', calculer_from_type($boucle));
658 654
 	$init[] = calculer_dec('groupby',
659
-		'array(' . (($g = join("\",\n\t\t\"", $boucle->group)) ? '"' . $g . '"' : '') . ")");
660
-	$init[] = calculer_dec('select', 'array("' . join("\",\n\t\t\"", $boucle->select) . "\")");
661
-	$init[] = calculer_dec('orderby', 'array(' . calculer_order($boucle) . ")");
655
+		'array('.(($g = join("\",\n\t\t\"", $boucle->group)) ? '"'.$g.'"' : '').")");
656
+	$init[] = calculer_dec('select', 'array("'.join("\",\n\t\t\"", $boucle->select)."\")");
657
+	$init[] = calculer_dec('orderby', 'array('.calculer_order($boucle).")");
662 658
 	$init[] = calculer_dec('where', calculer_dump_array($boucle->where));
663 659
 	$init[] = calculer_dec('join', calculer_dump_join($boucle->join));
664 660
 	$init[] = calculer_dec('limit',
665 661
 		(strpos($boucle->limit, 'intval') === false ?
666
-			"'" . $boucle->limit . "'"
662
+			"'".$boucle->limit."'"
667 663
 			:
668 664
 			$boucle->limit));
669 665
 	$init[] = calculer_dec('having', calculer_dump_array($boucle->having));
@@ -672,17 +668,17 @@  discard block
 block discarded – undo
672 668
 	// ou recalculée à chaque passage (vide)
673 669
 	foreach ($init as $i) {
674 670
 		if (reset($i)) {
675
-			$s .= "\n\t\t" . end($i);
671
+			$s .= "\n\t\t".end($i);
676 672
 		} # statique
677 673
 		else {
678
-			$d .= "\n\t" . end($i);
674
+			$d .= "\n\t".end($i);
679 675
 		} # dynamique
680 676
 	}
681 677
 
682 678
 	return ($boucle->hierarchie ? "\n\t$boucle->hierarchie" : '')
683 679
 	. $boucle->in
684 680
 	. $boucle->hash
685
-	. "\n\t" . 'if (!isset($command[\'table\'])) {'
681
+	. "\n\t".'if (!isset($command[\'table\'])) {'
686 682
 	. $s
687 683
 	. "\n\t}"
688 684
 	. $d;
@@ -765,7 +761,7 @@  discard block
 block discarded – undo
765 761
  *    - index 1 : Code de l'affectation
766 762
  **/
767 763
 function calculer_dec($nom, $val) {
768
-	$static = 'if (!isset($command[\'' . $nom . '\'])) ';
764
+	$static = 'if (!isset($command[\''.$nom.'\'])) ';
769 765
 	// si une variable apparait dans le calcul de la clause
770 766
 	// il faut la re-evaluer a chaque passage
771 767
 	if (
@@ -782,7 +778,7 @@  discard block
 block discarded – undo
782 778
 		$static = "";
783 779
 	}
784 780
 
785
-	return array($static, '$command[\'' . $nom . '\'] = ' . $val . ';');
781
+	return array($static, '$command[\''.$nom.'\'] = '.$val.';');
786 782
 }
787 783
 
788 784
 /**
@@ -807,16 +803,16 @@  discard block
 block discarded – undo
807 803
 	}
808 804
 	$res = "";
809 805
 	if ($a and $a[0] == "'?'") {
810
-		return ("(" . calculer_dump_array($a[1]) .
811
-			" ? " . calculer_dump_array($a[2]) .
812
-			" : " . calculer_dump_array($a[3]) .
806
+		return ("(".calculer_dump_array($a[1]).
807
+			" ? ".calculer_dump_array($a[2]).
808
+			" : ".calculer_dump_array($a[3]).
813 809
 			")");
814 810
 	} else {
815 811
 		foreach ($a as $v) {
816
-			$res .= ", " . calculer_dump_array($v);
812
+			$res .= ", ".calculer_dump_array($v);
817 813
 		}
818 814
 
819
-		return "\n\t\t\tarray(" . substr($res, 2) . ')';
815
+		return "\n\t\t\tarray(".substr($res, 2).')';
820 816
 	}
821 817
 }
822 818
 
@@ -824,10 +820,10 @@  discard block
 block discarded – undo
824 820
 function calculer_dump_join($a) {
825 821
 	$res = "";
826 822
 	foreach ($a as $k => $v) {
827
-		$res .= ", '$k' => array(" . implode(',', $v) . ")";
823
+		$res .= ", '$k' => array(".implode(',', $v).")";
828 824
 	}
829 825
 
830
-	return 'array(' . substr($res, 2) . ')';
826
+	return 'array('.substr($res, 2).')';
831 827
 }
832 828
 
833 829
 /**
@@ -844,7 +840,7 @@  discard block
 block discarded – undo
844 840
 		$res .= ",'$k' => '$v'";
845 841
 	}
846 842
 
847
-	return 'array(' . substr($res, 1) . ')';
843
+	return 'array('.substr($res, 1).')';
848 844
 }
849 845
 
850 846
 /**
@@ -862,7 +858,7 @@  discard block
 block discarded – undo
862 858
 		$res .= ",'$k' => '$v'";
863 859
 	}
864 860
 
865
-	return 'array(' . substr($res, 1) . ')';
861
+	return 'array('.substr($res, 1).')';
866 862
 }
867 863
 
868 864
 // https://code.spip.net/@calculer_order
@@ -931,17 +927,17 @@  discard block
 block discarded – undo
931 927
 				) {
932 928
 					$res .= " .\n$tab$code";
933 929
 				} else {
934
-					$res = substr($res, 0, -1) . substr($code, 1);
930
+					$res = substr($res, 0, -1).substr($code, 1);
935 931
 				}
936 932
 			}
937 933
 
938
-			return '(' . substr($res, 2 + $descr['niv']) . ')';
934
+			return '('.substr($res, 2 + $descr['niv']).')';
939 935
 		}
940 936
 	} else {
941
-		$nom = $descr['nom'] . $id_boucle . ($descr['niv'] ? $descr['niv'] : '');
937
+		$nom = $descr['nom'].$id_boucle.($descr['niv'] ? $descr['niv'] : '');
942 938
 
943
-		return "join('', array_map('array_shift', \$GLOBALS['debug_objets']['sequence']['$nom'] = array(" . join(" ,\n$tab",
944
-			$codes) . ")))";
939
+		return "join('', array_map('array_shift', \$GLOBALS['debug_objets']['sequence']['$nom'] = array(".join(" ,\n$tab",
940
+			$codes).")))";
945 941
 	}
946 942
 }
947 943
 
@@ -970,7 +966,7 @@  discard block
 block discarded – undo
970 966
 			// texte seul
971 967
 			case 'texte':
972 968
 				$code = sandbox_composer_texte($p->texte, $p);
973
-				$commentaire = strlen($p->texte) . " signes";
969
+				$commentaire = strlen($p->texte)." signes";
974 970
 				$avant = '';
975 971
 				$apres = '';
976 972
 				$altern = "''";
@@ -979,14 +975,14 @@  discard block
 block discarded – undo
979 975
 			case 'polyglotte':
980 976
 				$code = "";
981 977
 				foreach ($p->traductions as $k => $v) {
982
-					$code .= ",'" .
983
-						str_replace(array("\\", "'"), array("\\\\", "\\'"), $k) .
984
-						"' => '" .
985
-						str_replace(array("\\", "'"), array("\\\\", "\\'"), $v) .
978
+					$code .= ",'".
979
+						str_replace(array("\\", "'"), array("\\\\", "\\'"), $k).
980
+						"' => '".
981
+						str_replace(array("\\", "'"), array("\\\\", "\\'"), $v).
986 982
 						"'";
987 983
 				}
988
-				$code = "choisir_traduction(array(" .
989
-					substr($code, 1) .
984
+				$code = "choisir_traduction(array(".
985
+					substr($code, 1).
990 986
 					"))";
991 987
 				$commentaire = '&';
992 988
 				$avant = '';
@@ -1002,7 +998,7 @@  discard block
 block discarded – undo
1002 998
 					$err_e_c = true;
1003 999
 					$code = "''";
1004 1000
 				} else {
1005
-					$commentaire = '<INCLURE ' . addslashes(str_replace("\n", ' ', $code)) . '>';
1001
+					$commentaire = '<INCLURE '.addslashes(str_replace("\n", ' ', $code)).'>';
1006 1002
 					$avant = '';
1007 1003
 					$apres = '';
1008 1004
 					$altern = "''";
@@ -1029,8 +1025,8 @@  discard block
 block discarded – undo
1029 1025
 					$err_e_c = true;
1030 1026
 					$code = "''";
1031 1027
 				} else {
1032
-					$code = 'BOUCLE' .
1033
-						str_replace("-", "_", $nom) . $descr['nom'] .
1028
+					$code = 'BOUCLE'.
1029
+						str_replace("-", "_", $nom).$descr['nom'].
1034 1030
 						'($Cache, $Pile, $doublons, $Numrows, $SP)';
1035 1031
 					$commentaire = "?$nom";
1036 1032
 					if (!$boucles[$nom]->milieu
@@ -1071,24 +1067,22 @@  discard block
 block discarded – undo
1071 1067
 				foreach ($p->arg as $k => $v) {
1072 1068
 					$_v = calculer_liste($v, $descr, $boucles, $id_boucle);
1073 1069
 					if ($k) {
1074
-						$l[] = _q($k) . ' => ' . $_v;
1070
+						$l[] = _q($k).' => '.$_v;
1075 1071
 					} else {
1076 1072
 						$code = $_v;
1077 1073
 					}
1078 1074
 				}
1079 1075
 				// Si le module n'est pas fourni, l'expliciter sauf si calculé
1080 1076
 				if ($p->module) {
1081
-					$m = $p->module . ':' . $p->nom_champ;
1077
+					$m = $p->module.':'.$p->nom_champ;
1082 1078
 				} elseif ($p->nom_champ) {
1083
-					$m = MODULES_IDIOMES . ':' . $p->nom_champ;
1079
+					$m = MODULES_IDIOMES.':'.$p->nom_champ;
1084 1080
 				} else {
1085 1081
 					$m = '';
1086 1082
 				}
1087 1083
 
1088
-				$code = (!$code ? "'$m'" :
1089
-						($m ? "'$m' . $code" :
1090
-							("(strpos(\$x=$code, ':') ? \$x : ('" . MODULES_IDIOMES . ":' . \$x))")))
1091
-					. (!$l ? '' : (", array(" . implode(",\n", $l) . ")"));
1084
+				$code = (!$code ? "'$m'" : ($m ? "'$m' . $code" : ("(strpos(\$x=$code, ':') ? \$x : ('".MODULES_IDIOMES.":' . \$x))")))
1085
+					. (!$l ? '' : (", array(".implode(",\n", $l).")"));
1092 1086
 				$code = "_T($code)";
1093 1087
 				if ($p->param) {
1094 1088
 					$p->id_boucle = $id_boucle;
@@ -1111,7 +1105,7 @@  discard block
 block discarded – undo
1111 1105
 				$p->type_requete = $type;
1112 1106
 
1113 1107
 				$code = calculer_champ($p);
1114
-				$commentaire = '#' . $p->nom_champ . $p->etoile;
1108
+				$commentaire = '#'.$p->nom_champ.$p->etoile;
1115 1109
 				$avant = calculer_liste($p->avant,
1116 1110
 					$descr, $boucles, $id_boucle);
1117 1111
 				$apres = calculer_liste($p->apres,
@@ -1142,10 +1136,9 @@  discard block
 block discarded – undo
1142 1136
 		if ($code != "''") {
1143 1137
 			$code = compile_retour($code, $avant, $apres, $altern, $tab, $descr['niv']);
1144 1138
 			$codes[] = (($mode == 'validation') ?
1145
-				"array($code, '$commentaire', " . $p->ligne . ")"
1139
+				"array($code, '$commentaire', ".$p->ligne.")"
1146 1140
 				: (($mode == 'code') ?
1147
-					"\n// $commentaire\n$code" :
1148
-					$code));
1141
+					"\n// $commentaire\n$code" : $code));
1149 1142
 		}
1150 1143
 	} // foreach
1151 1144
 
@@ -1196,28 +1189,28 @@  discard block
 block discarded – undo
1196 1189
 	if ($apres === "''") {
1197 1190
 		$apres = '';
1198 1191
 	}
1199
-	if ($avant or $apres or ($altern !== "''")){
1200
-		if (preg_match(_REGEXP_CONCAT_NON_VIDE, $code)){
1192
+	if ($avant or $apres or ($altern !== "''")) {
1193
+		if (preg_match(_REGEXP_CONCAT_NON_VIDE, $code)) {
1201 1194
 			$t = $code;
1202 1195
 			$cond = '';
1203 1196
 		} elseif (preg_match(_REGEXP_COND_VIDE_NONVIDE, $code, $r)) {
1204 1197
 			$t = $r[2];
1205
-			$cond = '!' . $r[1];
1198
+			$cond = '!'.$r[1];
1206 1199
 		} else {
1207
-			if (preg_match(_REGEXP_COND_NONVIDE_VIDE, $code, $r)){
1200
+			if (preg_match(_REGEXP_COND_NONVIDE_VIDE, $code, $r)) {
1208 1201
 				$t = $r[2];
1209 1202
 				$cond = $r[1];
1210 1203
 			} else {
1211
-				$t = '$t' . $n;
1204
+				$t = '$t'.$n;
1212 1205
 				$cond = "($t = $code)!==''";
1213 1206
 			}
1214 1207
 		}
1215 1208
 
1216
-		$res = (!$avant ? "" : "$avant . ") .
1217
-			$t .
1209
+		$res = (!$avant ? "" : "$avant . ").
1210
+			$t.
1218 1211
 			(!$apres ? "" : " . $apres");
1219 1212
 
1220
-		if ($res!==$t){
1213
+		if ($res !== $t) {
1221 1214
 			$res = "($res)";
1222 1215
 		}
1223 1216
 
@@ -1267,12 +1260,12 @@  discard block
 block discarded – undo
1267 1260
 
1268 1261
 	// rendre inertes les echappements de #[](){}<>
1269 1262
 	$i = 0;
1270
-	while (false !== strpos($squelette, $inerte = '-INERTE' . $i)) {
1263
+	while (false !== strpos($squelette, $inerte = '-INERTE'.$i)) {
1271 1264
 		$i++;
1272 1265
 	}
1273 1266
 	$squelette = preg_replace_callback(',\\\\([#[()\]{}<>]),',
1274 1267
 		function($a) use ($inerte) {
1275
-			return "$inerte-" . ord($a[1]) . '-';
1268
+			return "$inerte-".ord($a[1]).'-';
1276 1269
 		},
1277 1270
 		$squelette,
1278 1271
 		-1,
@@ -1289,7 +1282,7 @@  discard block
 block discarded – undo
1289 1282
 	// Phraser le squelette, selon sa grammaire
1290 1283
 
1291 1284
 	$boucles = array();
1292
-	$f = charger_fonction('phraser_' . $gram, 'public');
1285
+	$f = charger_fonction('phraser_'.$gram, 'public');
1293 1286
 
1294 1287
 	$squelette = $f($squelette, '', $boucles, $descr);
1295 1288
 
@@ -1308,7 +1301,7 @@  discard block
 block discarded – undo
1308 1301
 			$boucles[$i]->descr['squelette'] = preg_replace_callback(
1309 1302
 				",$inerte-(\d+)-,",
1310 1303
 				function($a) {
1311
-					return "\\\\" . chr($a[1]);
1304
+					return "\\\\".chr($a[1]);
1312 1305
 				},
1313 1306
 				$boucle->descr['squelette']
1314 1307
 			);
@@ -1320,19 +1313,19 @@  discard block
 block discarded – undo
1320 1313
 		include_spip('public/decompiler');
1321 1314
 		foreach ($boucles as $id => $boucle) {
1322 1315
 			if ($id) {
1323
-				$decomp = "\n/* BOUCLE " .
1324
-					$boucle->type_requete .
1325
-					" " .
1326
-					str_replace('*/', '* /', public_decompiler($boucle, $gram, 0, 'criteres')) .
1327
-					($boucle->debug ? "\n *\n * " . implode("\n * ", $boucle->debug) . "\n" : '') .
1316
+				$decomp = "\n/* BOUCLE ".
1317
+					$boucle->type_requete.
1318
+					" ".
1319
+					str_replace('*/', '* /', public_decompiler($boucle, $gram, 0, 'criteres')).
1320
+					($boucle->debug ? "\n *\n * ".implode("\n * ", $boucle->debug)."\n" : '').
1328 1321
 					" */\n";
1329 1322
 			} else {
1330
-				$decomp = ("\n/*\n" .
1323
+				$decomp = ("\n/*\n".
1331 1324
 					str_replace('*/', '* /', public_decompiler($squelette, $gram))
1332 1325
 					. "\n*/");
1333 1326
 			}
1334
-			$boucles[$id]->return = $decomp . $boucle->return;
1335
-			$GLOBALS['debug_objets']['code'][$nom . $id] = $boucle->return;
1327
+			$boucles[$id]->return = $decomp.$boucle->return;
1328
+			$GLOBALS['debug_objets']['code'][$nom.$id] = $boucle->return;
1336 1329
 		}
1337 1330
 	}
1338 1331
 
@@ -1355,7 +1348,7 @@  discard block
 block discarded – undo
1355 1348
 		}
1356 1349
 	}
1357 1350
 	foreach ($boucles as $id => $boucle) {
1358
-		$GLOBALS['debug_objets']['boucle'][$nom . $id] = $boucle;
1351
+		$GLOBALS['debug_objets']['boucle'][$nom.$id] = $boucle;
1359 1352
 	}
1360 1353
 	$descr['documents'] = compile_inclure_doublons($squelette);
1361 1354
 
@@ -1439,8 +1432,7 @@  discard block
 block discarded – undo
1439 1432
 						} else {
1440 1433
 							$boucles[$id]->type_requete = false;
1441 1434
 							$boucle = $boucles[$id];
1442
-							$x = (!$boucle->sql_serveur ? '' :
1443
-									($boucle->sql_serveur . ":")) .
1435
+							$x = (!$boucle->sql_serveur ? '' : ($boucle->sql_serveur.":")).
1444 1436
 								$type;
1445 1437
 							$msg = array(
1446 1438
 								'zbug_table_inconnue',
@@ -1526,13 +1518,13 @@  discard block
 block discarded – undo
1526 1518
 			if (
1527 1519
 				// fonction de boucle avec serveur & table
1528 1520
 				(!$serveur or
1529
-					((!function_exists($f = "boucle_" . $serveur . "_" . $table))
1530
-						and (!function_exists($f = $f . "_dist"))
1521
+					((!function_exists($f = "boucle_".$serveur."_".$table))
1522
+						and (!function_exists($f = $f."_dist"))
1531 1523
 					)
1532 1524
 				)
1533 1525
 				// fonction de boucle avec table
1534
-				and (!function_exists($f = "boucle_" . $table))
1535
-				and (!function_exists($f = $f . "_dist"))
1526
+				and (!function_exists($f = "boucle_".$table))
1527
+				and (!function_exists($f = $f."_dist"))
1536 1528
 			) {
1537 1529
 				// fonction de boucle standard 
1538 1530
 				if (!function_exists($f = 'boucle_DEFAUT')) {
@@ -1540,20 +1532,20 @@  discard block
 block discarded – undo
1540 1532
 				}
1541 1533
 			}
1542 1534
 
1543
-			$req = "\n\n\tstatic \$command = array();\n\t" .
1544
-				"static \$connect;\n\t" .
1545
-				"\$command['connect'] = \$connect = " .
1546
-				_q($boucle->sql_serveur) .
1547
-				";" .
1535
+			$req = "\n\n\tstatic \$command = array();\n\t".
1536
+				"static \$connect;\n\t".
1537
+				"\$command['connect'] = \$connect = ".
1538
+				_q($boucle->sql_serveur).
1539
+				";".
1548 1540
 				$f($id, $boucles);
1549 1541
 		} else {
1550 1542
 			$req = ("\n\treturn '';");
1551 1543
 		}
1552 1544
 
1553 1545
 		$boucles[$id]->return =
1554
-			"\n\nfunction BOUCLE" . strtr($id, "-", "_") . $nom .
1555
-			'(&$Cache, &$Pile, &$doublons, &$Numrows, $SP) {' .
1556
-			$req .
1546
+			"\n\nfunction BOUCLE".strtr($id, "-", "_").$nom.
1547
+			'(&$Cache, &$Pile, &$doublons, &$Numrows, $SP) {'.
1548
+			$req.
1557 1549
 			"\n}\n";
1558 1550
 	}
1559 1551
 
@@ -1563,7 +1555,7 @@  discard block
 block discarded – undo
1563 1555
 		return false;
1564 1556
 	}
1565 1557
 
1566
-	$principal = "\nfunction " . $nom . '($Cache, $Pile, $doublons = array(), $Numrows = array(), $SP = 0) {
1558
+	$principal = "\nfunction ".$nom.'($Cache, $Pile, $doublons = array(), $Numrows = array(), $SP = 0) {
1567 1559
 '
1568 1560
 		// reporter de maniere securisee les doublons inclus
1569 1561
 		. '
@@ -1571,15 +1563,15 @@  discard block
 block discarded – undo
1571 1563
 		$doublons = nettoyer_env_doublons($Pile[0]["doublons"]);
1572 1564
 
1573 1565
 	$connect = ' .
1574
-		_q($connect) . ';
1566
+		_q($connect).';
1575 1567
 	$page = ' .
1576 1568
 		// ATTENTION, le calcul de l'expression $corps affectera $Cache
1577 1569
 		// c'est pourquoi on l'affecte a la variable auxiliaire $page.
1578 1570
 		// avant de referencer $Cache
1579
-		$corps . ";
1571
+		$corps.";
1580 1572
 
1581 1573
 	return analyse_resultat_skel(" . var_export($nom, true)
1582
-		. ", \$Cache, \$page, " . var_export($sourcefile, true) . ");
1574
+		. ", \$Cache, \$page, ".var_export($sourcefile, true).");
1583 1575
 }";
1584 1576
 
1585 1577
 	$secondes = spip_timer('calcul_skel');
@@ -1593,10 +1585,10 @@  discard block
 block discarded – undo
1593 1585
 	$code->return = '
1594 1586
 //
1595 1587
 // Fonction principale du squelette ' .
1596
-		$sourcefile .
1597
-		($connect ? " pour $connect" : '') .
1598
-		(!CODE_COMMENTE ? '' : "\n// Temps de compilation total: $secondes") .
1599
-		"\n//\n" .
1588
+		$sourcefile.
1589
+		($connect ? " pour $connect" : '').
1590
+		(!CODE_COMMENTE ? '' : "\n// Temps de compilation total: $secondes").
1591
+		"\n//\n".
1600 1592
 		$principal;
1601 1593
 
1602 1594
 	$boucles[''] = $code;
@@ -1648,7 +1640,7 @@  discard block
 block discarded – undo
1648 1640
  **/
1649 1641
 function requeteur_data_dist(&$boucles, &$boucle, &$id) {
1650 1642
 	include_spip('iterateur/data');
1651
-	if ($h = charger_fonction($boucle->type_requete . '_to_array', 'inc', true)) {
1643
+	if ($h = charger_fonction($boucle->type_requete.'_to_array', 'inc', true)) {
1652 1644
 		$g = charger_fonction('data', 'iterateur');
1653 1645
 		$boucles[$id] = $g($boucle);
1654 1646
 		// from[0] stocke le type de data (rss, yql, ...)
Please login to merge, or discard this patch.